From aec462b16249806a9c71c1f7a65436d9e57270ca Mon Sep 17 00:00:00 2001 From: Kirill Kuvshinov Date: Thu, 23 Feb 2023 18:54:40 +0300 Subject: [PATCH 001/153] test: add simulations for swapping the debt --- script/hardhat/fork/vip-99.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/script/hardhat/fork/vip-99.ts b/script/hardhat/fork/vip-99.ts index c4c3fc47f..56f8737c4 100644 --- a/script/hardhat/fork/vip-99.ts +++ b/script/hardhat/fork/vip-99.ts @@ -91,8 +91,10 @@ forking(25918391, () => { forking(25918391, () => { let comptroller: Comptroller; let busd: IERC20Upgradeable; + let usdc: IERC20Upgradeable; let usdt: IERC20Upgradeable; let btc: IERC20Upgradeable; + let eth: IERC20Upgradeable; let vBUSD: VBep20Delegate; let vUSDC: VBep20Delegate; let vUSDT: VBep20Delegate; @@ -108,7 +110,7 @@ forking(25918391, () => { return ethers.getContractAt("VBep20Delegate", address); }), ); - [busd, , usdt, btc] = await Promise.all( + [busd, usdc, usdt, btc, eth] = await Promise.all( [vBUSD, vUSDC, vUSDT, vBTC, vETH].map(async (vToken: VBep20) => { const underlying = await vToken.underlying(); return ethers.getContractAt("IERC20Upgradeable", underlying); From 202f6724c990d6f9b8689da1566c63ecb31a6bf8 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Fri, 3 Mar 2023 11:58:31 +0530 Subject: [PATCH 002/153] Added diamond proxy structure --- contracts/Diamond/ComptrollerDiamond.sol | 63 ++++++++++++++++++++ contracts/Diamond/facets/DiamondCutFacet.sol | 30 ++++++++++ contracts/Diamond/interfaces/IDiamondCut.sol | 32 ++++++++++ 3 files changed, 125 insertions(+) create mode 100644 contracts/Diamond/ComptrollerDiamond.sol create mode 100644 contracts/Diamond/facets/DiamondCutFacet.sol create mode 100644 contracts/Diamond/interfaces/IDiamondCut.sol diff --git a/contracts/Diamond/ComptrollerDiamond.sol b/contracts/Diamond/ComptrollerDiamond.sol new file mode 100644 index 000000000..cf37ea950 --- /dev/null +++ b/contracts/Diamond/ComptrollerDiamond.sol @@ -0,0 +1,63 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/******************************************************************************\ +* Author: Nick Mudge (https://twitter.com/mudgen) +* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535 +* +* Implementation of a diamond. +/******************************************************************************/ + +import { LibDiamond } from "./libraries/LibDiamond.sol"; +import { IDiamondCut } from "./interfaces/IDiamondCut.sol"; + +contract Diamond { + + constructor(address _contractOwner, address _diamondCutFacet) payable { + LibDiamond.setContractOwner(_contractOwner); + + // Add the diamondCut external function from the diamondCutFacet + IDiamondCut.FacetCut[] memory cut = new IDiamondCut.FacetCut[](1); + bytes4[] memory functionSelectors = new bytes4[](1); + functionSelectors[0] = IDiamondCut.diamondCut.selector; + cut[0] = IDiamondCut.FacetCut({ + facetAddress: _diamondCutFacet, + action: IDiamondCut.FacetCutAction.Add, + functionSelectors: functionSelectors + }); + LibDiamond.diamondCut(cut, address(0), ""); + } + + // Find facet for function that is called and execute the + // function if a facet is found and return any value. + fallback() external payable { + LibDiamond.DiamondStorage storage ds; + bytes32 position = LibDiamond.DIAMOND_STORAGE_POSITION; + // get diamond storage + assembly { + ds.slot := position + } + // get facet from function selector + address facet = ds.selectorToFacetAndPosition[msg.sig].facetAddress; + require(facet != address(0), "Diamond: Function does not exist"); + // Execute external function from facet using delegatecall and return any value. + assembly { + // copy function selector and any arguments + calldatacopy(0, 0, calldatasize()) + // execute function call using the facet + let result := delegatecall(gas(), facet, 0, calldatasize(), 0, 0) + // get any return value + returndatacopy(0, 0, returndatasize()) + // return any return value or error back to the caller + switch result + case 0 { + revert(0, returndatasize()) + } + default { + return(0, returndatasize()) + } + } + } + + receive() external payable {} +} diff --git a/contracts/Diamond/facets/DiamondCutFacet.sol b/contracts/Diamond/facets/DiamondCutFacet.sol new file mode 100644 index 000000000..89c360067 --- /dev/null +++ b/contracts/Diamond/facets/DiamondCutFacet.sol @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/******************************************************************************\ +* Author: Nick Mudge (https://twitter.com/mudgen) +* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535 +/******************************************************************************/ + +import { IDiamondCut } from "../interfaces/IDiamondCut.sol"; +import { LibDiamond } from "../libraries/LibDiamond.sol"; + +// Remember to add the loupe functions from DiamondLoupeFacet to the diamond. +// The loupe functions are required by the EIP2535 Diamonds standard + +contract DiamondCutFacet is IDiamondCut { + /// @notice Add/replace/remove any number of functions and optionally execute + /// a function with delegatecall + /// @param _diamondCut Contains the facet addresses and function selectors + /// @param _init The address of the contract or facet to execute _calldata + /// @param _calldata A function call, including function selector and arguments + /// _calldata is executed with delegatecall on _init + function diamondCut( + FacetCut[] calldata _diamondCut, + address _init, + bytes calldata _calldata + ) external override { + LibDiamond.enforceIsContractOwner(); + LibDiamond.diamondCut(_diamondCut, _init, _calldata); + } +} diff --git a/contracts/Diamond/interfaces/IDiamondCut.sol b/contracts/Diamond/interfaces/IDiamondCut.sol new file mode 100644 index 000000000..2972f6954 --- /dev/null +++ b/contracts/Diamond/interfaces/IDiamondCut.sol @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/******************************************************************************\ +* Author: Nick Mudge (https://twitter.com/mudgen) +* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535 +/******************************************************************************/ + +interface IDiamondCut { + enum FacetCutAction {Add, Replace, Remove} + // Add=0, Replace=1, Remove=2 + + struct FacetCut { + address facetAddress; + FacetCutAction action; + bytes4[] functionSelectors; + } + + /// @notice Add/replace/remove any number of functions and optionally execute + /// a function with delegatecall + /// @param _diamondCut Contains the facet addresses and function selectors + /// @param _init The address of the contract or facet to execute _calldata + /// @param _calldata A function call, including function selector and arguments + /// _calldata is executed with delegatecall on _init + function diamondCut( + FacetCut[] calldata _diamondCut, + address _init, + bytes calldata _calldata + ) external; + + event DiamondCut(FacetCut[] _diamondCut, address _init, bytes _calldata); +} From fd87920c39574f653a11284c6117462b255bd7dd Mon Sep 17 00:00:00 2001 From: defcon022 Date: Fri, 3 Mar 2023 11:59:59 +0530 Subject: [PATCH 003/153] Added reward and setter Facet --- contracts/Diamond/facets/RewardFacet.sol | 233 ++++++++++++ contracts/Diamond/facets/SetterFacet.sol | 447 +++++++++++++++++++++++ 2 files changed, 680 insertions(+) create mode 100644 contracts/Diamond/facets/RewardFacet.sol create mode 100644 contracts/Diamond/facets/SetterFacet.sol diff --git a/contracts/Diamond/facets/RewardFacet.sol b/contracts/Diamond/facets/RewardFacet.sol new file mode 100644 index 000000000..bf79e85cb --- /dev/null +++ b/contracts/Diamond/facets/RewardFacet.sol @@ -0,0 +1,233 @@ +pragma solidity ^0.5.16; + +import "../Oracle/PriceOracle.sol"; +import "../Tokens/VTokens/VToken.sol"; +import "../Utils/ErrorReporter.sol"; +import "../Tokens/XVS/XVS.sol"; +import "../Tokens/VAI/VAI.sol"; +import "../Governance/IAccessControlManager.sol"; + +contract RewardFacet is ComptrollerErrorReporter, ExponentialNoError { + AppStorage internal s; + /// @notice Emitted when Venus is granted by admin + event VenusGranted(address recipient, uint amount); + + /// @notice Emitted when XVS is distributed to VAI Vault + event DistributedVAIVaultVenus(uint amount); + + /** + * @notice Claim all the xvs accrued by holder in all markets and VAI + * @param holder The address to claim XVS for + */ + function claimVenus(address holder) public { + return claimVenus(holder, allMarkets); + } + + /** + * @notice Claim all the xvs accrued by holder in the specified markets + * @param holder The address to claim XVS for + * @param vTokens The list of markets to claim XVS in + */ + function claimVenus(address holder, VToken[] memory vTokens) public { + address[] memory holders = new address[](1); + holders[0] = holder; + claimVenus(holders, vTokens, true, true); + } + + /** + * @notice Claim all xvs accrued by the holders + * @param holders The addresses to claim XVS for + * @param vTokens The list of markets to claim XVS in + * @param borrowers Whether or not to claim XVS earned by borrowing + * @param suppliers Whether or not to claim XVS earned by supplying + */ + function claimVenus(address[] memory holders, VToken[] memory vTokens, bool borrowers, bool suppliers) public { + claimVenus(holders, vTokens, borrowers, suppliers, false); + } + + /** + * @notice Claim all the xvs accrued by holder in all markets, a shorthand for `claimVenus` with collateral set to `true` + * @param holder The address to claim XVS for + */ + function claimVenusAsCollateral(address holder) external { + address[] memory holders = new address[](1); + holders[0] = holder; + claimVenus(holders, allMarkets, true, true, true); + } + + /** + * @notice Transfer XVS to the user with user's shortfall considered + * @dev Note: If there is not enough XVS, we do not perform the transfer all. + * @param user The address of the user to transfer XVS to + * @param amount The amount of XVS to (possibly) transfer + * @param shortfall The shortfall of the user + * @param collateral Whether or not we will use user's venus reward as collateral to pay off the debt + * @return The amount of XVS which was NOT transferred to the user + */ + function grantXVSInternal(address user, uint amount, uint shortfall, bool collateral) internal returns (uint) { + // If the user is blacklisted, they can't get XVS rewards + require( + user != 0xEF044206Db68E40520BfA82D45419d498b4bc7Bf && + user != 0x7589dD3355DAE848FDbF75044A3495351655cB1A && + user != 0x33df7a7F6D44307E1e5F3B15975b47515e5524c0 && + user != 0x24e77E5b74B30b026E9996e4bc3329c881e24968, + "Blacklisted" + ); + + XVS xvs = XVS(getXVSAddress()); + + if (amount == 0 || amount > xvs.balanceOf(address(this))) { + return amount; + } + + if (shortfall == 0) { + xvs.transfer(user, amount); + return 0; + } + // If user's bankrupt and doesn't use pending xvs as collateral, don't grant + // anything, otherwise, we will transfer the pending xvs as collateral to + // vXVS token and mint vXVS for the user. + // + // If mintBehalf failed, don't grant any xvs + require(collateral, "bankrupt accounts can only collateralize their pending xvs rewards"); + + xvs.approve(getXVSVTokenAddress(), amount); + require( + VBep20Interface(getXVSVTokenAddress()).mintBehalf(user, amount) == uint(Error.NO_ERROR), + "mint behalf error during collateralize xvs" + ); + + // set venusAccrue[user] to 0 + return 0; + } + + /*** Venus Distribution Admin ***/ + + /** + * @notice Transfer XVS to the recipient + * @dev Note: If there is not enough XVS, we do not perform the transfer all. + * @param recipient The address of the recipient to transfer XVS to + * @param amount The amount of XVS to (possibly) transfer + */ + function _grantXVS(address recipient, uint amount) external { + ensureAdminOr(comptrollerImplementation); + uint amountLeft = grantXVSInternal(recipient, amount, 0, false); + require(amountLeft == 0, "insufficient xvs for grant"); + emit VenusGranted(recipient, amount); + } + + function getBlockNumber() public view returns (uint) { + return block.number; + } + + /** + * @notice Return the address of the XVS token + * @return The address of XVS + */ + function getXVSAddress() public view returns (address) { + return 0xcF6BB5389c92Bdda8a3747Ddb454cB7a64626C63; + } + + /** + * @notice Return the address of the XVS vToken + * @return The address of XVS vToken + */ + function getXVSVTokenAddress() public view returns (address) { + return 0x151B1e2635A717bcDc836ECd6FbB62B674FE3E1D; + } + + /** + * @notice Checks if a certain action is paused on a market + * @param action Action id + * @param market vToken address + */ + function actionPaused(address market, Action action) public view returns (bool) { + return _actionPaused[market][uint(action)]; + } + + /*** VAI functions ***/ + + /** + * @notice Transfer XVS to VAI Vault + */ + function releaseToVault() public { + if (releaseStartBlock == 0 || getBlockNumber() < releaseStartBlock) { + return; + } + + XVS xvs = XVS(getXVSAddress()); + + uint256 xvsBalance = xvs.balanceOf(address(this)); + if (xvsBalance == 0) { + return; + } + + uint256 actualAmount; + uint256 deltaBlocks = sub_(getBlockNumber(), releaseStartBlock); + // releaseAmount = venusVAIVaultRate * deltaBlocks + uint256 _releaseAmount = mul_(venusVAIVaultRate, deltaBlocks); + + if (xvsBalance >= _releaseAmount) { + actualAmount = _releaseAmount; + } else { + actualAmount = xvsBalance; + } + + if (actualAmount < minReleaseAmount) { + return; + } + + s.releaseStartBlock = getBlockNumber(); + + xvs.transfer(vaiVaultAddress, actualAmount); + emit DistributedVAIVaultVenus(actualAmount); + + IVAIVault(vaiVaultAddress).updatePendingRewards(); + } + + /** + * @notice Claim all xvs accrued by the holders + * @param holders The addresses to claim XVS for + * @param vTokens The list of markets to claim XVS in + * @param borrowers Whether or not to claim XVS earned by borrowing + * @param suppliers Whether or not to claim XVS earned by supplying + * @param collateral Whether or not to use XVS earned as collateral, only takes effect when the holder has a shortfall + */ + function claimVenus( + address[] memory holders, + VToken[] memory vTokens, + bool borrowers, + bool suppliers, + bool collateral + ) public { + uint j; + uint256 holdersLength = holders.length; + for (uint i; i < vTokens.length; ++i) { + VToken vToken = vTokens[i]; + ensureListed(markets[address(vToken)]); + if (borrowers) { + Exp memory borrowIndex = Exp({ mantissa: vToken.borrowIndex() }); + updateVenusBorrowIndex(address(vToken), borrowIndex); + for (j = 0; j < holdersLength; ++j) { + distributeBorrowerVenus(address(vToken), holders[j], borrowIndex); + } + } + if (suppliers) { + updateVenusSupplyIndex(address(vToken)); + for (j = 0; j < holdersLength; ++j) { + distributeSupplierVenus(address(vToken), holders[j]); + } + } + } + + for (j = 0; j < holdersLength; ++j) { + address holder = holders[j]; + // If there is a positive shortfall, the XVS reward is accrued, + // but won't be granted to this holder + (, , uint shortfall) = getHypotheticalAccountLiquidityInternal(holder, VToken(0), 0, 0); + venusAccrued[holder] = grantXVSInternal(holder, venusAccrued[holder], shortfall, collateral); + } + } + +} + \ No newline at end of file diff --git a/contracts/Diamond/facets/SetterFacet.sol b/contracts/Diamond/facets/SetterFacet.sol new file mode 100644 index 000000000..26f9cf96e --- /dev/null +++ b/contracts/Diamond/facets/SetterFacet.sol @@ -0,0 +1,447 @@ +pragma solidity ^0.5.16; + +import "../Oracle/PriceOracle.sol"; +import "../Tokens/VTokens/VToken.sol"; +import "../Utils/ErrorReporter.sol"; +import "../Tokens/XVS/XVS.sol"; +import "../Tokens/VAI/VAI.sol"; +import "../Governance/IAccessControlManager.sol"; +import "../libraries/libAccessCheck.sol"; + +contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError{ + AppStorage internal s; + /// @notice Emitted when close factor is changed by admin + event NewCloseFactor(uint oldCloseFactorMantissa, uint newCloseFactorMantissa); + + /// @notice Emitted when a collateral factor is changed by admin + event NewCollateralFactor(VToken vToken, uint oldCollateralFactorMantissa, uint newCollateralFactorMantissa); + + /// @notice Emitted when liquidation incentive is changed by admin + event NewLiquidationIncentive(uint oldLiquidationIncentiveMantissa, uint newLiquidationIncentiveMantissa); + + /// @notice Emitted when price oracle is changed + event NewPriceOracle(PriceOracle oldPriceOracle, PriceOracle newPriceOracle); + + /// @notice Emitted when borrow cap for a vToken is changed + event NewBorrowCap(VToken indexed vToken, uint newBorrowCap); + + /// @notice Emitted when VAIController is changed + event NewVAIController(VAIControllerInterface oldVAIController, VAIControllerInterface newVAIController); + + /// @notice Emitted when VAI mint rate is changed by admin + event NewVAIMintRate(uint oldVAIMintRate, uint newVAIMintRate); + + /// @notice Emitted when protocol state is changed by admin + event ActionProtocolPaused(bool state); + + /// @notice Emitted when treasury guardian is changed + event NewTreasuryGuardian(address oldTreasuryGuardian, address newTreasuryGuardian); + + /// @notice Emitted when treasury address is changed + event NewTreasuryAddress(address oldTreasuryAddress, address newTreasuryAddress); + + /// @notice Emitted when treasury percent is changed + event NewTreasuryPercent(uint oldTreasuryPercent, uint newTreasuryPercent); + + /// @notice Emitted when liquidator adress is changed + event NewLiquidatorContract(address oldLiquidatorContract, address newLiquidatorContract); + + /// @notice Emitted whe ComptrollerLens address is changed + event NewComptrollerLens(address oldComptrollerLens, address newComptrollerLens); + + /// @notice Emitted when supply cap for a vToken is changed + event NewSupplyCap(VToken indexed vToken, uint newSupplyCap); + + /// @notice Emitted when access control address is changed by admin + event NewAccessControl(address oldAccessControlAddress, address newAccessControlAddress); + + /// @notice Emitted when pause guardian is changed + event NewPauseGuardian(address oldPauseGuardian, address newPauseGuardian); + + /// @notice Emitted when an action is paused on a market + event ActionPausedMarket(VToken indexed vToken, Action indexed action, bool pauseState); + + /// @notice Emitted when prime token contract address is changed + event NewPrimeToken(IPrime oldPrimeToken, IPrime newPrimeToken); + + /// @notice Emitted when VAI Vault info is changed + event NewVAIVaultInfo(address vault_, uint releaseStartBlock_, uint releaseInterval_); + + /// @notice Emitted when Venus VAI Vault rate is changed + event NewVenusVAIVaultRate(uint oldVenusVAIVaultRate, uint newVenusVAIVaultRate); + + /** + * @notice Sets a new price oracle for the comptroller + * @dev Admin function to set a new price oracle + * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) + */ + function _setPriceOracle(PriceOracle newOracle) external returns (uint) { + // Check caller is admin + LibAccessCheck.ensureAdmin(); + LibAccessCheck.ensureNonzeroAddress(address(newOracle)); + + // Track the old oracle for the comptroller + PriceOracle oldOracle = oracle; + + // Set comptroller's oracle to newOracle + s.oracle = newOracle; + + // Emit NewPriceOracle(oldOracle, newOracle) + emit NewPriceOracle(oldOracle, newOracle); + + return uint(Error.NO_ERROR); + } + + /** + * @notice Sets the closeFactor used when liquidating borrows + * @dev Admin function to set closeFactor + * @param newCloseFactorMantissa New close factor, scaled by 1e18 + * @return uint 0=success, otherwise will revert + */ + function _setCloseFactor(uint newCloseFactorMantissa) external returns (uint) { + // Check caller is admin + ensureAdmin(); + + uint oldCloseFactorMantissa = closeFactorMantissa; + s.closeFactorMantissa = newCloseFactorMantissa; + emit NewCloseFactor(oldCloseFactorMantissa, newCloseFactorMantissa); + + return uint(Error.NO_ERROR); + } + + /** + * @notice Sets the address of the access control of this contract + * @dev Admin function to set the access control address + * @param newAccessControlAddress New address for the access control + * @return uint 0=success, otherwise will revert + */ + function _setAccessControl(address newAccessControlAddress) external returns (uint) { + // Check caller is admin + ensureAdmin(); + ensureNonzeroAddress(newAccessControlAddress); + + address oldAccessControlAddress = accessControl; + s.accessControl = newAccessControlAddress; + emit NewAccessControl(oldAccessControlAddress, accessControl); + + return uint(Error.NO_ERROR); + } + + /** + * @notice Sets the collateralFactor for a market + * @dev Restricted function to set per-market collateralFactor + * @param vToken The market to set the factor on + * @param newCollateralFactorMantissa The new collateral factor, scaled by 1e18 + * @return uint 0=success, otherwise a failure. (See ErrorReporter for details) + */ + function _setCollateralFactor(VToken vToken, uint newCollateralFactorMantissa) external returns (uint) { + // Check caller is allowed by access control manager + ensureAllowed("_setCollateralFactor(address,uint256)"); + ensureNonzeroAddress(address(vToken)); + + // Verify market is listed + Market storage market = markets[address(vToken)]; + ensureListed(market); + + Exp memory newCollateralFactorExp = Exp({ mantissa: newCollateralFactorMantissa }); + + // Check collateral factor <= 0.9 + Exp memory highLimit = Exp({ mantissa: collateralFactorMaxMantissa }); + if (lessThanExp(highLimit, newCollateralFactorExp)) { + return fail(Error.INVALID_COLLATERAL_FACTOR, FailureInfo.SET_COLLATERAL_FACTOR_VALIDATION); + } + + // If collateral factor != 0, fail if price == 0 + if (newCollateralFactorMantissa != 0 && oracle.getUnderlyingPrice(vToken) == 0) { + return fail(Error.PRICE_ERROR, FailureInfo.SET_COLLATERAL_FACTOR_WITHOUT_PRICE); + } + + // Set market's collateral factor to new collateral factor, remember old value + uint oldCollateralFactorMantissa = market.collateralFactorMantissa; + market.collateralFactorMantissa = newCollateralFactorMantissa; + + // Emit event with asset, old collateral factor, and new collateral factor + emit NewCollateralFactor(vToken, oldCollateralFactorMantissa, newCollateralFactorMantissa); + + return uint(Error.NO_ERROR); + } + + /** + * @notice Sets liquidationIncentive + * @dev Admin function to set liquidationIncentive + * @param newLiquidationIncentiveMantissa New liquidationIncentive scaled by 1e18 + * @return uint 0=success, otherwise a failure. (See ErrorReporter for details) + */ + function _setLiquidationIncentive(uint newLiquidationIncentiveMantissa) external returns (uint) { + ensureAllowed("_setLiquidationIncentive(uint256)"); + + require(newLiquidationIncentiveMantissa >= 1e18, "incentive must be over 1e18"); + + // Save current value for use in log + uint oldLiquidationIncentiveMantissa = liquidationIncentiveMantissa; + + // Set liquidation incentive to new incentive + liquidationIncentiveMantissa = newLiquidationIncentiveMantissa; + + // Emit event with old incentive, new incentive + emit NewLiquidationIncentive(oldLiquidationIncentiveMantissa, newLiquidationIncentiveMantissa); + + return uint(Error.NO_ERROR); + } + + function _setLiquidatorContract(address newLiquidatorContract_) external { + // Check caller is admin + ensureAdmin(); + address oldLiquidatorContract = liquidatorContract; + liquidatorContract = newLiquidatorContract_; + emit NewLiquidatorContract(oldLiquidatorContract, newLiquidatorContract_); + } + + /** + * @notice Admin function to change the Pause Guardian + * @param newPauseGuardian The address of the new Pause Guardian + * @return uint 0=success, otherwise a failure. (See enum Error for details) + */ + function _setPauseGuardian(address newPauseGuardian) external returns (uint) { + ensureAdmin(); + ensureNonzeroAddress(newPauseGuardian); + + // Save current value for inclusion in log + address oldPauseGuardian = pauseGuardian; + + // Store pauseGuardian with value newPauseGuardian + s.pauseGuardian = newPauseGuardian; + + // Emit NewPauseGuardian(OldPauseGuardian, NewPauseGuardian) + emit NewPauseGuardian(oldPauseGuardian, newPauseGuardian); + + return uint(Error.NO_ERROR); + } + + /** + * @notice Set the given borrow caps for the given vToken markets. Borrowing that brings total borrows to or above borrow cap will revert. + * @dev Access is controled by ACM. A borrow cap of 0 corresponds to unlimited borrowing. + * @param vTokens The addresses of the markets (tokens) to change the borrow caps for + * @param newBorrowCaps The new borrow cap values in underlying to be set. A value of 0 corresponds to unlimited borrowing. + */ + function _setMarketBorrowCaps(VToken[] calldata vTokens, uint[] calldata newBorrowCaps) external { + ensureAllowed("_setMarketBorrowCaps(address[],uint256[])"); + + uint numMarkets = vTokens.length; + uint numBorrowCaps = newBorrowCaps.length; + + require(numMarkets != 0 && numMarkets == numBorrowCaps, "invalid input"); + + for (uint i; i < numMarkets; ++i) { + borrowCaps[address(vTokens[i])] = newBorrowCaps[i]; + emit NewBorrowCap(vTokens[i], newBorrowCaps[i]); + } + } + + /** + * @notice Set the given supply caps for the given vToken markets. Supply that brings total Supply to or above supply cap will revert. + * @dev Admin function to set the supply caps. A supply cap of 0 corresponds to Minting NotAllowed. + * @param vTokens The addresses of the markets (tokens) to change the supply caps for + * @param newSupplyCaps The new supply cap values in underlying to be set. A value of 0 corresponds to Minting NotAllowed. + */ + function _setMarketSupplyCaps(VToken[] calldata vTokens, uint256[] calldata newSupplyCaps) external { + ensureAllowed("_setMarketSupplyCaps(address[],uint256[])"); + + uint numMarkets = vTokens.length; + uint numSupplyCaps = newSupplyCaps.length; + + require(numMarkets != 0 && numMarkets == numSupplyCaps, "invalid input"); + + for (uint i; i < numMarkets; ++i) { + supplyCaps[address(vTokens[i])] = newSupplyCaps[i]; + emit NewSupplyCap(vTokens[i], newSupplyCaps[i]); + } + } + + /** + * @notice Set whole protocol pause/unpause state + */ + function _setProtocolPaused(bool state) external returns (bool) { + ensureAllowed("_setProtocolPaused(bool)"); + + protocolPaused = state; + emit ActionProtocolPaused(state); + return state; + } + + /** + * @notice Pause/unpause certain actions + * @param markets Markets to pause/unpause the actions on + * @param actions List of action ids to pause/unpause + * @param paused The new paused state (true=paused, false=unpaused) + */ + function _setActionsPaused(address[] calldata markets, Action[] calldata actions, bool paused) external { + ensureAllowed("_setActionsPaused(address[],uint256[],bool)"); + + uint256 numMarkets = markets.length; + uint256 numActions = actions.length; + for (uint marketIdx; marketIdx < numMarkets; ++marketIdx) { + for (uint actionIdx; actionIdx < numActions; ++actionIdx) { + setActionPausedInternal(markets[marketIdx], actions[actionIdx], paused); + } + } + } + + /** + * @dev Pause/unpause an action on a market + * @param market Market to pause/unpause the action on + * @param action Action id to pause/unpause + * @param paused The new paused state (true=paused, false=unpaused) + */ + function setActionPausedInternal(address market, Action action, bool paused) internal { + ensureListed(markets[market]); + _actionPaused[market][uint(action)] = paused; + emit ActionPausedMarket(VToken(market), action, paused); + } + + /** + * @notice Sets a new VAI controller + * @dev Admin function to set a new VAI controller + * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) + */ + function _setVAIController(VAIControllerInterface vaiController_) external returns (uint) { + // Check caller is admin + ensureAdmin(); + ensureNonzeroAddress(address(vaiController_)); + + VAIControllerInterface oldVaiController = vaiController; + vaiController = vaiController_; + emit NewVAIController(oldVaiController, vaiController_); + + return uint(Error.NO_ERROR); + } + + function _setVAIMintRate(uint newVAIMintRate) external returns (uint) { + // Check caller is admin + ensureAdmin(); + uint oldVAIMintRate = vaiMintRate; + vaiMintRate = newVAIMintRate; + emit NewVAIMintRate(oldVAIMintRate, newVAIMintRate); + + return uint(Error.NO_ERROR); + } + + /** + * @notice Set the minted VAI amount of the `owner` + * @param owner The address of the account to set + * @param amount The amount of VAI to set to the account + * @return The number of minted VAI by `owner` + */ + function setMintedVAIOf(address owner, uint amount) external returns (uint) { + checkProtocolPauseState(); + + // Pausing is a very serious situation - we revert to sound the alarms + require(!mintVAIGuardianPaused && !repayVAIGuardianPaused, "VAI is paused"); + // Check caller is vaiController + if (msg.sender != address(vaiController)) { + return fail(Error.REJECTION, FailureInfo.SET_MINTED_VAI_REJECTION); + } + mintedVAIs[owner] = amount; + + return uint(Error.NO_ERROR); + } + + + function _setTreasuryData( + address newTreasuryGuardian, + address newTreasuryAddress, + uint newTreasuryPercent + ) external returns (uint) { + // Check caller is admin + ensureAdminOr(treasuryGuardian); + + require(newTreasuryPercent < 1e18, "treasury percent cap overflow"); + ensureNonzeroAddress(newTreasuryGuardian); + ensureNonzeroAddress(newTreasuryAddress); + + address oldTreasuryGuardian = treasuryGuardian; + address oldTreasuryAddress = treasuryAddress; + uint oldTreasuryPercent = treasuryPercent; + + treasuryGuardian = newTreasuryGuardian; + treasuryAddress = newTreasuryAddress; + treasuryPercent = newTreasuryPercent; + + emit NewTreasuryGuardian(oldTreasuryGuardian, newTreasuryGuardian); + emit NewTreasuryAddress(oldTreasuryAddress, newTreasuryAddress); + emit NewTreasuryPercent(oldTreasuryPercent, newTreasuryPercent); + + return uint(Error.NO_ERROR); + } + + function _become(Unitroller unitroller) external { + require(msg.sender == unitroller.admin(), "only unitroller admin can"); + require(unitroller._acceptImplementation() == 0, "not authorized"); + } + + /*** Venus Distribution ***/ + + /** + * @dev Set ComptrollerLens contract address + */ + function _setComptrollerLens(ComptrollerLensInterface comptrollerLens_) external returns (uint) { + ensureAdmin(); + ensureNonzeroAddress(address(comptrollerLens_)); + address oldComptrollerLens = address(comptrollerLens); + comptrollerLens = comptrollerLens_; + emit NewComptrollerLens(oldComptrollerLens, address(comptrollerLens)); + + return uint(Error.NO_ERROR); + } + + /** + * @notice Set the amount of XVS distributed per block to VAI Vault + * @param venusVAIVaultRate_ The amount of XVS wei per block to distribute to VAI Vault + */ + function _setVenusVAIVaultRate(uint venusVAIVaultRate_) external { + ensureAdmin(); + + uint oldVenusVAIVaultRate = venusVAIVaultRate; + venusVAIVaultRate = venusVAIVaultRate_; + emit NewVenusVAIVaultRate(oldVenusVAIVaultRate, venusVAIVaultRate_); + } + + /** + * @notice Set the VAI Vault infos + * @param vault_ The address of the VAI Vault + * @param releaseStartBlock_ The start block of release to VAI Vault + * @param minReleaseAmount_ The minimum release amount to VAI Vault + */ + function _setVAIVaultInfo(address vault_, uint256 releaseStartBlock_, uint256 minReleaseAmount_) external { + ensureAdmin(); + ensureNonzeroAddress(vault_); + + vaiVaultAddress = vault_; + releaseStartBlock = releaseStartBlock_; + minReleaseAmount = minReleaseAmount_; + emit NewVAIVaultInfo(vault_, releaseStartBlock_, minReleaseAmount_); + } + + /** + * @notice Sets the prime token contract for the comptroller + * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) + */ + function _setPrimeToken(IPrime _prime) external returns (uint) { + // Check caller is admin + ensureAdmin(); + ensureNonzeroAddress(address(_prime)); + + // Track the old prime token for the comptroller + IPrime oldPrime = prime; + + // Set comptroller's prime token to new prime token + prime = _prime; + + // Emit NewPrimeToken(oldPrime, newPrime) + emit NewPrimeToken(oldPrime, prime); + + return uint(Error.NO_ERROR); + } + + +} \ No newline at end of file From 6c5c7ef739854d39e00c5498e0ce2c317db26943 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Fri, 3 Mar 2023 12:28:23 +0530 Subject: [PATCH 004/153] Added Helper libraries --- .../Diamond/libraries/LibAccessCheck.sol | 59 +++++ contracts/Diamond/libraries/LibDiamond.sol | 212 +++++++++++++++++ contracts/Diamond/libraries/LibHelper.sol | 153 ++++++++++++ contracts/Diamond/libraries/appStorage.sol | 217 ++++++++++++++++++ 4 files changed, 641 insertions(+) create mode 100644 contracts/Diamond/libraries/LibAccessCheck.sol create mode 100644 contracts/Diamond/libraries/LibDiamond.sol create mode 100644 contracts/Diamond/libraries/LibHelper.sol create mode 100644 contracts/Diamond/libraries/appStorage.sol diff --git a/contracts/Diamond/libraries/LibAccessCheck.sol b/contracts/Diamond/libraries/LibAccessCheck.sol new file mode 100644 index 000000000..96b8b041d --- /dev/null +++ b/contracts/Diamond/libraries/LibAccessCheck.sol @@ -0,0 +1,59 @@ +pragma solidity ^0.5.16; + +import "../Governance/IAccessControlManager.sol"; +import "./ComptrollerStorage.sol"; + +library LibAccessCheck { + /// @notice Reverts if the protocol is paused + function checkProtocolPauseState() internal view { + require(!protocolPaused, "protocol is paused"); + } + + /// @notice Reverts if a certain action is paused on a market + function checkActionPauseState(address market, Action action) internal view { + require(!actionPaused(market, action), "action is paused"); + } + + /// @notice Reverts if the caller is not admin + function ensureAdmin() internal view { + require(msg.sender == admin, "only admin can"); + } + + /// @notice Checks the passed address is nonzero + function ensureNonzeroAddress(address someone) internal pure { + require(someone != address(0), "can't be zero address"); + } + + /// @notice Reverts if the market is not listed + function ensureListed(Market storage market) internal view { + require(market.isListed, "market not listed"); + } + + /// @notice Reverts if the caller is neither admin nor the passed address + function ensureAdminOr(address privilegedAddress) internal view { + require(msg.sender == admin || msg.sender == privilegedAddress, "access denied"); + } + + function ensureAllowed(string memory functionSig) internal view { + require(IAccessControlManager(accessControl).isAllowedToCall(msg.sender, functionSig), "access denied"); + } + + /** + * @notice Returns whether the given account is entered in the given asset + * @param account The address of the account to check + * @param vToken The vToken to check + * @return True if the account is in the asset, otherwise false. + */ + function checkMembership(address account, VToken vToken) external view returns (bool) { + return markets[address(vToken)].accountMembership[account]; + } + + /** + * @notice Checks if a certain action is paused on a market + * @param action Action id + * @param market vToken address + */ + function actionPaused(address market, Action action) public view returns (bool) { + return _actionPaused[market][uint(action)]; + } +} \ No newline at end of file diff --git a/contracts/Diamond/libraries/LibDiamond.sol b/contracts/Diamond/libraries/LibDiamond.sol new file mode 100644 index 000000000..e8d4463ba --- /dev/null +++ b/contracts/Diamond/libraries/LibDiamond.sol @@ -0,0 +1,212 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/******************************************************************************\ +* Author: Nick Mudge (https://twitter.com/mudgen) +* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535 +/******************************************************************************/ +import { IDiamondCut } from "../interfaces/IDiamondCut.sol"; + +// Remember to add the loupe functions from DiamondLoupeFacet to the diamond. +// The loupe functions are required by the EIP2535 Diamonds standard + +error InitializationFunctionReverted(address _initializationContractAddress, bytes _calldata); + +library LibDiamond { + bytes32 constant DIAMOND_STORAGE_POSITION = keccak256("diamond.standard.diamond.storage"); + + struct FacetAddressAndPosition { + address facetAddress; + uint96 functionSelectorPosition; // position in facetFunctionSelectors.functionSelectors array + } + + struct FacetFunctionSelectors { + bytes4[] functionSelectors; + uint256 facetAddressPosition; // position of facetAddress in facetAddresses array + } + + struct DiamondStorage { + // maps function selector to the facet address and + // the position of the selector in the facetFunctionSelectors.selectors array + mapping(bytes4 => FacetAddressAndPosition) selectorToFacetAndPosition; + // maps facet addresses to function selectors + mapping(address => FacetFunctionSelectors) facetFunctionSelectors; + // facet addresses + address[] facetAddresses; + // Used to query if a contract implements an interface. + // Used to implement ERC-165. + mapping(bytes4 => bool) supportedInterfaces; + // owner of the contract + address contractOwner; + } + + function diamondStorage() internal pure returns (DiamondStorage storage ds) { + bytes32 position = DIAMOND_STORAGE_POSITION; + assembly { + ds.slot := position + } + } + + event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); + + function setContractOwner(address _newOwner) internal { + DiamondStorage storage ds = diamondStorage(); + address previousOwner = ds.contractOwner; + ds.contractOwner = _newOwner; + emit OwnershipTransferred(previousOwner, _newOwner); + } + + function contractOwner() internal view returns (address contractOwner_) { + contractOwner_ = diamondStorage().contractOwner; + } + + function enforceIsContractOwner() internal view { + require(msg.sender == diamondStorage().contractOwner, "LibDiamond: Must be contract owner"); + } + + event DiamondCut(IDiamondCut.FacetCut[] _diamondCut, address _init, bytes _calldata); + + // Internal function version of diamondCut + function diamondCut( + IDiamondCut.FacetCut[] memory _diamondCut, + address _init, + bytes memory _calldata + ) internal { + for (uint256 facetIndex; facetIndex < _diamondCut.length; facetIndex++) { + IDiamondCut.FacetCutAction action = _diamondCut[facetIndex].action; + if (action == IDiamondCut.FacetCutAction.Add) { + addFunctions(_diamondCut[facetIndex].facetAddress, _diamondCut[facetIndex].functionSelectors); + } else if (action == IDiamondCut.FacetCutAction.Replace) { + replaceFunctions(_diamondCut[facetIndex].facetAddress, _diamondCut[facetIndex].functionSelectors); + } else if (action == IDiamondCut.FacetCutAction.Remove) { + removeFunctions(_diamondCut[facetIndex].facetAddress, _diamondCut[facetIndex].functionSelectors); + } else { + revert("LibDiamondCut: Incorrect FacetCutAction"); + } + } + emit DiamondCut(_diamondCut, _init, _calldata); + initializeDiamondCut(_init, _calldata); + } + + function addFunctions(address _facetAddress, bytes4[] memory _functionSelectors) internal { + require(_functionSelectors.length > 0, "LibDiamondCut: No selectors in facet to cut"); + DiamondStorage storage ds = diamondStorage(); + require(_facetAddress != address(0), "LibDiamondCut: Add facet can't be address(0)"); + uint96 selectorPosition = uint96(ds.facetFunctionSelectors[_facetAddress].functionSelectors.length); + // add new facet address if it does not exist + if (selectorPosition == 0) { + addFacet(ds, _facetAddress); + } + for (uint256 selectorIndex; selectorIndex < _functionSelectors.length; selectorIndex++) { + bytes4 selector = _functionSelectors[selectorIndex]; + address oldFacetAddress = ds.selectorToFacetAndPosition[selector].facetAddress; + require(oldFacetAddress == address(0), "LibDiamondCut: Can't add function that already exists"); + addFunction(ds, selector, selectorPosition, _facetAddress); + selectorPosition++; + } + } + + function replaceFunctions(address _facetAddress, bytes4[] memory _functionSelectors) internal { + require(_functionSelectors.length > 0, "LibDiamondCut: No selectors in facet to cut"); + DiamondStorage storage ds = diamondStorage(); + require(_facetAddress != address(0), "LibDiamondCut: Add facet can't be address(0)"); + uint96 selectorPosition = uint96(ds.facetFunctionSelectors[_facetAddress].functionSelectors.length); + // add new facet address if it does not exist + if (selectorPosition == 0) { + addFacet(ds, _facetAddress); + } + for (uint256 selectorIndex; selectorIndex < _functionSelectors.length; selectorIndex++) { + bytes4 selector = _functionSelectors[selectorIndex]; + address oldFacetAddress = ds.selectorToFacetAndPosition[selector].facetAddress; + require(oldFacetAddress != _facetAddress, "LibDiamondCut: Can't replace function with same function"); + removeFunction(ds, oldFacetAddress, selector); + addFunction(ds, selector, selectorPosition, _facetAddress); + selectorPosition++; + } + } + + function removeFunctions(address _facetAddress, bytes4[] memory _functionSelectors) internal { + require(_functionSelectors.length > 0, "LibDiamondCut: No selectors in facet to cut"); + DiamondStorage storage ds = diamondStorage(); + // if function does not exist then do nothing and return + require(_facetAddress == address(0), "LibDiamondCut: Remove facet address must be address(0)"); + for (uint256 selectorIndex; selectorIndex < _functionSelectors.length; selectorIndex++) { + bytes4 selector = _functionSelectors[selectorIndex]; + address oldFacetAddress = ds.selectorToFacetAndPosition[selector].facetAddress; + removeFunction(ds, oldFacetAddress, selector); + } + } + + function addFacet(DiamondStorage storage ds, address _facetAddress) internal { + enforceHasContractCode(_facetAddress, "LibDiamondCut: New facet has no code"); + ds.facetFunctionSelectors[_facetAddress].facetAddressPosition = ds.facetAddresses.length; + ds.facetAddresses.push(_facetAddress); + } + + + function addFunction(DiamondStorage storage ds, bytes4 _selector, uint96 _selectorPosition, address _facetAddress) internal { + ds.selectorToFacetAndPosition[_selector].functionSelectorPosition = _selectorPosition; + ds.facetFunctionSelectors[_facetAddress].functionSelectors.push(_selector); + ds.selectorToFacetAndPosition[_selector].facetAddress = _facetAddress; + } + + function removeFunction(DiamondStorage storage ds, address _facetAddress, bytes4 _selector) internal { + require(_facetAddress != address(0), "LibDiamondCut: Can't remove function that doesn't exist"); + // an immutable function is a function defined directly in a diamond + require(_facetAddress != address(this), "LibDiamondCut: Can't remove immutable function"); + // replace selector with last selector, then delete last selector + uint256 selectorPosition = ds.selectorToFacetAndPosition[_selector].functionSelectorPosition; + uint256 lastSelectorPosition = ds.facetFunctionSelectors[_facetAddress].functionSelectors.length - 1; + // if not the same then replace _selector with lastSelector + if (selectorPosition != lastSelectorPosition) { + bytes4 lastSelector = ds.facetFunctionSelectors[_facetAddress].functionSelectors[lastSelectorPosition]; + ds.facetFunctionSelectors[_facetAddress].functionSelectors[selectorPosition] = lastSelector; + ds.selectorToFacetAndPosition[lastSelector].functionSelectorPosition = uint96(selectorPosition); + } + // delete the last selector + ds.facetFunctionSelectors[_facetAddress].functionSelectors.pop(); + delete ds.selectorToFacetAndPosition[_selector]; + + // if no more selectors for facet address then delete the facet address + if (lastSelectorPosition == 0) { + // replace facet address with last facet address and delete last facet address + uint256 lastFacetAddressPosition = ds.facetAddresses.length - 1; + uint256 facetAddressPosition = ds.facetFunctionSelectors[_facetAddress].facetAddressPosition; + if (facetAddressPosition != lastFacetAddressPosition) { + address lastFacetAddress = ds.facetAddresses[lastFacetAddressPosition]; + ds.facetAddresses[facetAddressPosition] = lastFacetAddress; + ds.facetFunctionSelectors[lastFacetAddress].facetAddressPosition = facetAddressPosition; + } + ds.facetAddresses.pop(); + delete ds.facetFunctionSelectors[_facetAddress].facetAddressPosition; + } + } + + function initializeDiamondCut(address _init, bytes memory _calldata) internal { + if (_init == address(0)) { + return; + } + enforceHasContractCode(_init, "LibDiamondCut: _init address has no code"); + (bool success, bytes memory error) = _init.delegatecall(_calldata); + if (!success) { + if (error.length > 0) { + // bubble up error + /// @solidity memory-safe-assembly + assembly { + let returndata_size := mload(error) + revert(add(32, error), returndata_size) + } + } else { + revert InitializationFunctionReverted(_init, _calldata); + } + } + } + + function enforceHasContractCode(address _contract, string memory _errorMessage) internal view { + uint256 contractSize; + assembly { + contractSize := extcodesize(_contract) + } + require(contractSize > 0, _errorMessage); + } +} diff --git a/contracts/Diamond/libraries/LibHelper.sol b/contracts/Diamond/libraries/LibHelper.sol new file mode 100644 index 000000000..dd3ae51f6 --- /dev/null +++ b/contracts/Diamond/libraries/LibHelper.sol @@ -0,0 +1,153 @@ +pragma solidity ^0.5.16 +import "../../Tokens/VTokens/VToken.sol"; +import "../../Comptroller/ComptrollerStorage.sol"; + +library LibComptrollerHelper { + + + /** + * @notice Determine what the account liquidity would be if the given amounts were redeemed/borrowed + * @param vTokenModify The market to hypothetically redeem/borrow in + * @param account The account to determine liquidity for + * @param redeemTokens The number of tokens to hypothetically redeem + * @param borrowAmount The amount of underlying to hypothetically borrow + * @dev Note that we calculate the exchangeRateStored for each collateral vToken using stored data, + * without calculating accumulated interest. + * @return (possible error code, + hypothetical account liquidity in excess of collateral requirements, + * hypothetical account shortfall below collateral requirements) + */ + function getHypotheticalAccountLiquidityInternal( + address account, + VToken vTokenModify, + uint redeemTokens, + uint borrowAmount + ) internal view returns (Error, uint, uint) { + (uint err, uint liquidity, uint shortfall) = comptrollerLens.getHypotheticalAccountLiquidity( + address(this), + account, + vTokenModify, + redeemTokens, + borrowAmount + ); + return (Error(err), liquidity, shortfall); + } + + /** + * @notice Accrue XVS to the market by updating the supply index + * @param vToken The market whose supply index to update + */ + function updateVenusSupplyIndex(address vToken) internal { + VenusMarketState storage supplyState = venusSupplyState[vToken]; + uint supplySpeed = venusSupplySpeeds[vToken]; + uint32 blockNumber = safe32(getBlockNumber(), "block number exceeds 32 bits"); + uint deltaBlocks = sub_(uint(blockNumber), uint(supplyState.block)); + if (deltaBlocks > 0 && supplySpeed > 0) { + uint supplyTokens = VToken(vToken).totalSupply(); + uint venusAccrued = mul_(deltaBlocks, supplySpeed); + Double memory ratio = supplyTokens > 0 ? fraction(venusAccrued, supplyTokens) : Double({ mantissa: 0 }); + supplyState.index = safe224( + add_(Double({ mantissa: supplyState.index }), ratio).mantissa, + "new index exceeds 224 bits" + ); + supplyState.block = blockNumber; + } else if (deltaBlocks > 0) { + supplyState.block = blockNumber; + } + } + + /** + * @notice Accrue XVS to the market by updating the borrow index + * @param vToken The market whose borrow index to update + */ + function updateVenusBorrowIndex(address vToken, Exp memory marketBorrowIndex) internal { + VenusMarketState storage borrowState = venusBorrowState[vToken]; + uint borrowSpeed = venusBorrowSpeeds[vToken]; + uint32 blockNumber = safe32(getBlockNumber(), "block number exceeds 32 bits"); + uint deltaBlocks = sub_(uint(blockNumber), uint(borrowState.block)); + if (deltaBlocks > 0 && borrowSpeed > 0) { + uint borrowAmount = div_(VToken(vToken).totalBorrows(), marketBorrowIndex); + uint venusAccrued = mul_(deltaBlocks, borrowSpeed); + Double memory ratio = borrowAmount > 0 ? fraction(venusAccrued, borrowAmount) : Double({ mantissa: 0 }); + borrowState.index = safe224( + add_(Double({ mantissa: borrowState.index }), ratio).mantissa, + "new index exceeds 224 bits" + ); + borrowState.block = blockNumber; + } else if (deltaBlocks > 0) { + borrowState.block = blockNumber; + } + } + + /** + * @notice Calculate XVS accrued by a supplier and possibly transfer it to them + * @param vToken The market in which the supplier is interacting + * @param supplier The address of the supplier to distribute XVS to + */ + function distributeSupplierVenus(address vToken, address supplier) internal { + if (address(vaiVaultAddress) != address(0)) { + releaseToVault(); + } + + uint supplyIndex = venusSupplyState[vToken].index; + uint supplierIndex = venusSupplierIndex[vToken][supplier]; + + // Update supplier's index to the current index since we are distributing accrued XVS + venusSupplierIndex[vToken][supplier] = supplyIndex; + + if (supplierIndex == 0 && supplyIndex >= venusInitialIndex) { + // Covers the case where users supplied tokens before the market's supply state index was set. + // Rewards the user with XVS accrued from the start of when supplier rewards were first + // set for the market. + supplierIndex = venusInitialIndex; + } + + // Calculate change in the cumulative sum of the XVS per vToken accrued + Double memory deltaIndex = Double({ mantissa: sub_(supplyIndex, supplierIndex) }); + + // Multiply of supplierTokens and supplierDelta + uint supplierDelta = mul_(VToken(vToken).balanceOf(supplier), deltaIndex); + + // Addition of supplierAccrued and supplierDelta + venusAccrued[supplier] = add_(venusAccrued[supplier], supplierDelta); + + emit DistributedSupplierVenus(VToken(vToken), supplier, supplierDelta, supplyIndex); + } + + /** + * @notice Calculate XVS accrued by a borrower and possibly transfer it to them + * @dev Borrowers will not begin to accrue until after the first interaction with the protocol. + * @param vToken The market in which the borrower is interacting + * @param borrower The address of the borrower to distribute XVS to + */ + function distributeBorrowerVenus(address vToken, address borrower, Exp memory marketBorrowIndex) internal { + if (address(vaiVaultAddress) != address(0)) { + releaseToVault(); + } + + uint borrowIndex = venusBorrowState[vToken].index; + uint borrowerIndex = venusBorrowerIndex[vToken][borrower]; + + // Update borrowers's index to the current index since we are distributing accrued XVS + venusBorrowerIndex[vToken][borrower] = borrowIndex; + + if (borrowerIndex == 0 && borrowIndex >= venusInitialIndex) { + // Covers the case where users borrowed tokens before the market's borrow state index was set. + // Rewards the user with XVS accrued from the start of when borrower rewards were first + // set for the market. + borrowerIndex = venusInitialIndex; + } + + // Calculate change in the cumulative sum of the XVS per borrowed unit accrued + Double memory deltaIndex = Double({ mantissa: sub_(borrowIndex, borrowerIndex) }); + + uint borrowerDelta = mul_(div_(VToken(vToken).borrowBalanceStored(borrower), marketBorrowIndex), deltaIndex); + + venusAccrued[borrower] = add_(venusAccrued[borrower], borrowerDelta); + + emit DistributedBorrowerVenus(VToken(vToken), borrower, borrowerDelta, borrowIndex); + } + + + +} \ No newline at end of file diff --git a/contracts/Diamond/libraries/appStorage.sol b/contracts/Diamond/libraries/appStorage.sol new file mode 100644 index 000000000..166b2e956 --- /dev/null +++ b/contracts/Diamond/libraries/appStorage.sol @@ -0,0 +1,217 @@ +pragma solidity ^0.5.16; + +import "../Tokens/VTokens/VToken.sol"; +import "../Oracle/PriceOracle.sol"; +import "../Tokens/VAI/VAIControllerInterface.sol"; +import "./ComptrollerLensInterface.sol"; +import "../Tokens/Prime/IPrime.sol"; + +struct Market { + /// @notice Whether or not this market is listed + bool isListed; + /** + * @notice Multiplier representing the most one can borrow against their collateral in this market. + * For instance, 0.9 to allow borrowing 90% of collateral value. + * Must be between 0 and 1, and stored as a mantissa. + */ + uint collateralFactorMantissa; + /// @notice Per-market mapping of "accounts in this asset" + mapping(address => bool) accountMembership; + /// @notice Whether or not this market receives XVS + bool isVenus; + } + + struct VenusMarketState { + /// @notice The market's last updated venusBorrowIndex or venusSupplyIndex + uint224 index; + /// @notice The block number the index was last updated at + uint32 block; + } + +struct AppStorage { + + /** + * @notice Administrator for this contract + */ + address admin; + + /** + * @notice Pending administrator for this contract + */ + address pendingAdmin; + + /** + * @notice Active brains of Unitroller + */ + address comptrollerImplementation; + + /** + * @notice Pending brains of Unitroller + */ + address pendingComptrollerImplementation; + + /** + * @notice Oracle which gives the price of any given asset + */ + PriceOracle oracle; + + /** + * @notice Multiplier used to calculate the maximum repayAmount when liquidating a borrow + */ + uint closeFactorMantissa; + + /** + * @notice Multiplier representing the discount on collateral that a liquidator receives + */ + uint liquidationIncentiveMantissa; + + /** + * @notice Max number of assets a single account can participate in (borrow or use as collateral) + */ + uint maxAssets; + + /** + * @notice Per-account mapping of "assets you are in", capped by maxAssets + */ + mapping(address => VToken[]) accountAssets; + + + /** + * @notice Official mapping of vTokens -> Market metadata + * @dev Used e.g. to determine if a market is supported + */ + mapping(address => Market) markets; + + /** + * @notice The Pause Guardian can pause certain actions as a safety mechanism. + */ + address pauseGuardian; + + /// @notice Whether minting is paused (deprecated, superseded by actionPaused) + bool _mintGuardianPaused; + /// @notice Whether borrowing is paused (deprecated, superseded by actionPaused) + bool _borrowGuardianPaused; + /// @notice Whether borrowing is paused (deprecated, superseded by actionPaused) + bool transferGuardianPaused; + /// @notice Whether borrowing is paused (deprecated, superseded by actionPaused) + bool seizeGuardianPaused; + /// @notice Whether borrowing is paused (deprecated, superseded by actionPaused) + mapping(address => bool) mintGuardianPaused; + /// @notice Whether borrowing is paused (deprecated, superseded by actionPaused) + mapping(address => bool) borrowGuardianPaused; + + /// @notice A list of all markets + VToken[] allMarkets; + + /// @notice The rate at which the flywheel distributes XVS, per block + uint venusRate; + + /// @notice The portion of venusRate that each market currently receives + mapping(address => uint) venusSpeeds; + + /// @notice The Venus market supply state for each market + mapping(address => VenusMarketState) venusSupplyState; + + /// @notice The Venus market borrow state for each market + mapping(address => VenusMarketState) venusBorrowState; + + /// @notice The Venus supply index for each market for each supplier as of the last time they accrued XVS + mapping(address => mapping(address => uint)) venusSupplierIndex; + + /// @notice The Venus borrow index for each market for each borrower as of the last time they accrued XVS + mapping(address => mapping(address => uint)) venusBorrowerIndex; + + /// @notice The XVS accrued but not yet transferred to each user + mapping(address => uint) venusAccrued; + + /// @notice The Address of VAIController + VAIControllerInterface vaiController; + + /// @notice The minted VAI amount to each user + mapping(address => uint) mintedVAIs; + + /// @notice VAI Mint Rate as a percentage + uint vaiMintRate; + + /** + * @notice The Pause Guardian can pause certain actions as a safety mechanism. + */ + bool mintVAIGuardianPaused; + bool repayVAIGuardianPaused; + + /** + * @notice Pause/Unpause whole protocol actions + */ + bool protocolPaused; + + /// @notice The rate at which the flywheel distributes XVS to VAI Minters, per block (deprecated) + uint venusVAIRate; + + /// @notice The rate at which the flywheel distributes XVS to VAI Vault, per block + uint venusVAIVaultRate; + + // address of VAI Vault + address vaiVaultAddress; + + // start block of release to VAI Vault + uint256 releaseStartBlock; + + // minimum release amount to VAI Vault + uint256 minReleaseAmount; + + /// @notice The borrowCapGuardian can set borrowCaps to any number for any market. Lowering the borrow cap could disable borrowing on the given market. + address borrowCapGuardian; + + /// @notice Borrow caps enforced by borrowAllowed for each vToken address. Defaults to zero which corresponds to unlimited borrowing. + mapping(address => uint) borrowCaps; + + /// @notice Treasury Guardian address + address treasuryGuardian; + + /// @notice Treasury address + address treasuryAddress; + + /// @notice Fee percent of accrued interest with decimal 18 + uint256 treasuryPercent; + + /// @notice The portion of XVS that each contributor receives per block (deprecated) + mapping(address => uint) venusContributorSpeeds; + + /// @notice Last block at which a contributor's XVS rewards have been allocated (deprecated) + mapping(address => uint) lastContributorBlock; + + address liquidatorContract; + + ComptrollerLensInterface comptrollerLens; + + /// @notice Supply caps enforced by mintAllowed for each vToken address. Defaults to zero which corresponds to minting notAllowed + mapping(address => uint256) supplyCaps; + + /// @notice AccessControlManager address + address accessControl; + + /// @notice True if a certain action is paused on a certain market + mapping(address => mapping(uint => bool)) _actionPaused; + + /// @notice The rate at which venus is distributed to the corresponding borrow market (per block) + mapping(address => uint) venusBorrowSpeeds; + + /// @notice The rate at which venus is distributed to the corresponding supply market (per block) + mapping(address => uint) venusSupplySpeeds; + + /// @notice Prime token address + IPrime prime; + +} + +library LibAppStorage { + function diamondStorage() internal pure returns (AppStorage storage ds) { + assembly { + ds.slot := 0 + } + } + + function abs(int256 x) internal pure returns (uint256) { + return uint256(x >= 0 ? x : -x); + } +} \ No newline at end of file From 19122892199521350ee3d7208047e1751e529c81 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Mon, 6 Mar 2023 15:16:51 +0530 Subject: [PATCH 005/153] Update stroage access and fix Lint --- contracts/Diamond/ComptrollerDiamond.sol | 23 ++-- contracts/Diamond/facets/DiamondCutFacet.sol | 6 +- contracts/Diamond/facets/RewardFacet.sol | 39 +++---- contracts/Diamond/facets/SetterFacet.sol | 109 +++++++----------- contracts/Diamond/interfaces/IDiamondCut.sol | 12 +- .../Diamond/libraries/LibAccessCheck.sol | 7 +- contracts/Diamond/libraries/LibDiamond.sol | 24 ++-- contracts/Diamond/libraries/LibHelper.sol | 58 +++++++++- contracts/Diamond/libraries/appStorage.sol | 102 +++++----------- 9 files changed, 176 insertions(+), 204 deletions(-) diff --git a/contracts/Diamond/ComptrollerDiamond.sol b/contracts/Diamond/ComptrollerDiamond.sol index cf37ea950..55f007629 100644 --- a/contracts/Diamond/ComptrollerDiamond.sol +++ b/contracts/Diamond/ComptrollerDiamond.sol @@ -11,9 +11,8 @@ pragma solidity ^0.8.0; import { LibDiamond } from "./libraries/LibDiamond.sol"; import { IDiamondCut } from "./interfaces/IDiamondCut.sol"; -contract Diamond { - - constructor(address _contractOwner, address _diamondCutFacet) payable { +contract Diamond { + constructor(address _contractOwner, address _diamondCutFacet) payable { LibDiamond.setContractOwner(_contractOwner); // Add the diamondCut external function from the diamondCutFacet @@ -21,11 +20,11 @@ contract Diamond { bytes4[] memory functionSelectors = new bytes4[](1); functionSelectors[0] = IDiamondCut.diamondCut.selector; cut[0] = IDiamondCut.FacetCut({ - facetAddress: _diamondCutFacet, - action: IDiamondCut.FacetCutAction.Add, + facetAddress: _diamondCutFacet, + action: IDiamondCut.FacetCutAction.Add, functionSelectors: functionSelectors }); - LibDiamond.diamondCut(cut, address(0), ""); + LibDiamond.diamondCut(cut, address(0), ""); } // Find facet for function that is called and execute the @@ -50,12 +49,12 @@ contract Diamond { returndatacopy(0, 0, returndatasize()) // return any return value or error back to the caller switch result - case 0 { - revert(0, returndatasize()) - } - default { - return(0, returndatasize()) - } + case 0 { + revert(0, returndatasize()) + } + default { + return(0, returndatasize()) + } } } diff --git a/contracts/Diamond/facets/DiamondCutFacet.sol b/contracts/Diamond/facets/DiamondCutFacet.sol index 89c360067..e8ceb4fc3 100644 --- a/contracts/Diamond/facets/DiamondCutFacet.sol +++ b/contracts/Diamond/facets/DiamondCutFacet.sol @@ -19,11 +19,7 @@ contract DiamondCutFacet is IDiamondCut { /// @param _init The address of the contract or facet to execute _calldata /// @param _calldata A function call, including function selector and arguments /// _calldata is executed with delegatecall on _init - function diamondCut( - FacetCut[] calldata _diamondCut, - address _init, - bytes calldata _calldata - ) external override { + function diamondCut(FacetCut[] calldata _diamondCut, address _init, bytes calldata _calldata) external override { LibDiamond.enforceIsContractOwner(); LibDiamond.diamondCut(_diamondCut, _init, _calldata); } diff --git a/contracts/Diamond/facets/RewardFacet.sol b/contracts/Diamond/facets/RewardFacet.sol index bf79e85cb..ca9b50bf0 100644 --- a/contracts/Diamond/facets/RewardFacet.sol +++ b/contracts/Diamond/facets/RewardFacet.sol @@ -1,20 +1,21 @@ pragma solidity ^0.5.16; -import "../Oracle/PriceOracle.sol"; -import "../Tokens/VTokens/VToken.sol"; -import "../Utils/ErrorReporter.sol"; -import "../Tokens/XVS/XVS.sol"; -import "../Tokens/VAI/VAI.sol"; -import "../Governance/IAccessControlManager.sol"; - -contract RewardFacet is ComptrollerErrorReporter, ExponentialNoError { +import "../../Oracle/PriceOracle.sol"; +import "../../Tokens/VTokens/VToken.sol"; +import "../../Utils/ErrorReporter.sol"; +import "../../Tokens/XVS/XVS.sol"; +import "../../Tokens/VAI/VAI.sol"; +import "../libraries/appStorage.sol"; +import "../../Governance/IAccessControlManager.sol"; + +contract RewardFacet is ComptrollerErrorReporter, ExponentialNoError { AppStorage internal s; /// @notice Emitted when Venus is granted by admin event VenusGranted(address recipient, uint amount); /// @notice Emitted when XVS is distributed to VAI Vault event DistributedVAIVaultVenus(uint amount); - + /** * @notice Claim all the xvs accrued by holder in all markets and VAI * @param holder The address to claim XVS for @@ -110,7 +111,7 @@ contract RewardFacet is ComptrollerErrorReporter, ExponentialNoError { * @param amount The amount of XVS to (possibly) transfer */ function _grantXVS(address recipient, uint amount) external { - ensureAdminOr(comptrollerImplementation); + ensureAdminOr(s.comptrollerImplementation); uint amountLeft = grantXVSInternal(recipient, amount, 0, false); require(amountLeft == 0, "insufficient xvs for grant"); emit VenusGranted(recipient, amount); @@ -142,7 +143,7 @@ contract RewardFacet is ComptrollerErrorReporter, ExponentialNoError { * @param market vToken address */ function actionPaused(address market, Action action) public view returns (bool) { - return _actionPaused[market][uint(action)]; + return s._actionPaused[market][uint(action)]; } /*** VAI functions ***/ @@ -151,7 +152,7 @@ contract RewardFacet is ComptrollerErrorReporter, ExponentialNoError { * @notice Transfer XVS to VAI Vault */ function releaseToVault() public { - if (releaseStartBlock == 0 || getBlockNumber() < releaseStartBlock) { + if (s.releaseStartBlock == 0 || getBlockNumber() < s.releaseStartBlock) { return; } @@ -163,9 +164,9 @@ contract RewardFacet is ComptrollerErrorReporter, ExponentialNoError { } uint256 actualAmount; - uint256 deltaBlocks = sub_(getBlockNumber(), releaseStartBlock); + uint256 deltaBlocks = sub_(getBlockNumber(), s.releaseStartBlock); // releaseAmount = venusVAIVaultRate * deltaBlocks - uint256 _releaseAmount = mul_(venusVAIVaultRate, deltaBlocks); + uint256 _releaseAmount = mul_(s.venusVAIVaultRate, deltaBlocks); if (xvsBalance >= _releaseAmount) { actualAmount = _releaseAmount; @@ -173,16 +174,16 @@ contract RewardFacet is ComptrollerErrorReporter, ExponentialNoError { actualAmount = xvsBalance; } - if (actualAmount < minReleaseAmount) { + if (actualAmount < s.minReleaseAmount) { return; } s.releaseStartBlock = getBlockNumber(); - xvs.transfer(vaiVaultAddress, actualAmount); + xvs.transfer(s.vaiVaultAddress, actualAmount); emit DistributedVAIVaultVenus(actualAmount); - IVAIVault(vaiVaultAddress).updatePendingRewards(); + IVAIVault(s.vaiVaultAddress).updatePendingRewards(); } /** @@ -225,9 +226,7 @@ contract RewardFacet is ComptrollerErrorReporter, ExponentialNoError { // If there is a positive shortfall, the XVS reward is accrued, // but won't be granted to this holder (, , uint shortfall) = getHypotheticalAccountLiquidityInternal(holder, VToken(0), 0, 0); - venusAccrued[holder] = grantXVSInternal(holder, venusAccrued[holder], shortfall, collateral); + s.venusAccrued[holder] = grantXVSInternal(holder, venusAccrued[holder], shortfall, collateral); } } - } - \ No newline at end of file diff --git a/contracts/Diamond/facets/SetterFacet.sol b/contracts/Diamond/facets/SetterFacet.sol index 26f9cf96e..a6ca0fce3 100644 --- a/contracts/Diamond/facets/SetterFacet.sol +++ b/contracts/Diamond/facets/SetterFacet.sol @@ -1,16 +1,15 @@ pragma solidity ^0.5.16; -import "../Oracle/PriceOracle.sol"; -import "../Tokens/VTokens/VToken.sol"; -import "../Utils/ErrorReporter.sol"; -import "../Tokens/XVS/XVS.sol"; -import "../Tokens/VAI/VAI.sol"; -import "../Governance/IAccessControlManager.sol"; -import "../libraries/libAccessCheck.sol"; - -contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError{ - AppStorage internal s; - /// @notice Emitted when close factor is changed by admin +import "../../Oracle/PriceOracle.sol"; +import "../../Tokens/VTokens/VToken.sol"; +import "../../Utils/ErrorReporter.sol"; +import "../../Tokens/XVS/XVS.sol"; +import "../../Tokens/VAI/VAI.sol"; +import "../../Governance/IAccessControlManager.sol"; +import "../libraries/LibAccessCheck.sol"; + +contract SetterFacet is AppStorage, ComptrollerErrorReporter, ExponentialNoError { + /// @notice Emitted when close factor is changed by admin event NewCloseFactor(uint oldCloseFactorMantissa, uint newCloseFactorMantissa); /// @notice Emitted when a collateral factor is changed by admin @@ -84,7 +83,7 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError{ PriceOracle oldOracle = oracle; // Set comptroller's oracle to newOracle - s.oracle = newOracle; + oracle = newOracle; // Emit NewPriceOracle(oldOracle, newOracle) emit NewPriceOracle(oldOracle, newOracle); @@ -102,7 +101,7 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError{ // Check caller is admin ensureAdmin(); - uint oldCloseFactorMantissa = closeFactorMantissa; + uint oldCloseFactorMantissa = s.closeFactorMantissa; s.closeFactorMantissa = newCloseFactorMantissa; emit NewCloseFactor(oldCloseFactorMantissa, newCloseFactorMantissa); @@ -120,7 +119,7 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError{ ensureAdmin(); ensureNonzeroAddress(newAccessControlAddress); - address oldAccessControlAddress = accessControl; + address oldAccessControlAddress = s.accessControl; s.accessControl = newAccessControlAddress; emit NewAccessControl(oldAccessControlAddress, accessControl); @@ -178,10 +177,10 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError{ require(newLiquidationIncentiveMantissa >= 1e18, "incentive must be over 1e18"); // Save current value for use in log - uint oldLiquidationIncentiveMantissa = liquidationIncentiveMantissa; + uint oldLiquidationIncentiveMantissa = s.liquidationIncentiveMantissa; // Set liquidation incentive to new incentive - liquidationIncentiveMantissa = newLiquidationIncentiveMantissa; + s.liquidationIncentiveMantissa = newLiquidationIncentiveMantissa; // Emit event with old incentive, new incentive emit NewLiquidationIncentive(oldLiquidationIncentiveMantissa, newLiquidationIncentiveMantissa); @@ -192,8 +191,8 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError{ function _setLiquidatorContract(address newLiquidatorContract_) external { // Check caller is admin ensureAdmin(); - address oldLiquidatorContract = liquidatorContract; - liquidatorContract = newLiquidatorContract_; + address oldLiquidatorContract = s.liquidatorContract; + s.liquidatorContract = newLiquidatorContract_; emit NewLiquidatorContract(oldLiquidatorContract, newLiquidatorContract_); } @@ -207,7 +206,7 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError{ ensureNonzeroAddress(newPauseGuardian); // Save current value for inclusion in log - address oldPauseGuardian = pauseGuardian; + address oldPauseGuardian = s.pauseGuardian; // Store pauseGuardian with value newPauseGuardian s.pauseGuardian = newPauseGuardian; @@ -233,7 +232,7 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError{ require(numMarkets != 0 && numMarkets == numBorrowCaps, "invalid input"); for (uint i; i < numMarkets; ++i) { - borrowCaps[address(vTokens[i])] = newBorrowCaps[i]; + s.borrowCaps[address(vTokens[i])] = newBorrowCaps[i]; emit NewBorrowCap(vTokens[i], newBorrowCaps[i]); } } @@ -253,7 +252,7 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError{ require(numMarkets != 0 && numMarkets == numSupplyCaps, "invalid input"); for (uint i; i < numMarkets; ++i) { - supplyCaps[address(vTokens[i])] = newSupplyCaps[i]; + s.supplyCaps[address(vTokens[i])] = newSupplyCaps[i]; emit NewSupplyCap(vTokens[i], newSupplyCaps[i]); } } @@ -264,7 +263,7 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError{ function _setProtocolPaused(bool state) external returns (bool) { ensureAllowed("_setProtocolPaused(bool)"); - protocolPaused = state; + s.protocolPaused = state; emit ActionProtocolPaused(state); return state; } @@ -295,7 +294,7 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError{ */ function setActionPausedInternal(address market, Action action, bool paused) internal { ensureListed(markets[market]); - _actionPaused[market][uint(action)] = paused; + s._actionPaused[market][uint(action)] = paused; emit ActionPausedMarket(VToken(market), action, paused); } @@ -309,8 +308,8 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError{ ensureAdmin(); ensureNonzeroAddress(address(vaiController_)); - VAIControllerInterface oldVaiController = vaiController; - vaiController = vaiController_; + VAIControllerInterface oldVaiController = s.vaiController; + s.vaiController = vaiController_; emit NewVAIController(oldVaiController, vaiController_); return uint(Error.NO_ERROR); @@ -319,8 +318,8 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError{ function _setVAIMintRate(uint newVAIMintRate) external returns (uint) { // Check caller is admin ensureAdmin(); - uint oldVAIMintRate = vaiMintRate; - vaiMintRate = newVAIMintRate; + uint oldVAIMintRate = s.vaiMintRate; + s.vaiMintRate = newVAIMintRate; emit NewVAIMintRate(oldVAIMintRate, newVAIMintRate); return uint(Error.NO_ERROR); @@ -341,12 +340,11 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError{ if (msg.sender != address(vaiController)) { return fail(Error.REJECTION, FailureInfo.SET_MINTED_VAI_REJECTION); } - mintedVAIs[owner] = amount; + s.mintedVAIs[owner] = amount; return uint(Error.NO_ERROR); } - function _setTreasuryData( address newTreasuryGuardian, address newTreasuryAddress, @@ -359,13 +357,13 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError{ ensureNonzeroAddress(newTreasuryGuardian); ensureNonzeroAddress(newTreasuryAddress); - address oldTreasuryGuardian = treasuryGuardian; - address oldTreasuryAddress = treasuryAddress; - uint oldTreasuryPercent = treasuryPercent; + address oldTreasuryGuardian = s.treasuryGuardian; + address oldTreasuryAddress = s.treasuryAddress; + uint oldTreasuryPercent = s.treasuryPercent; - treasuryGuardian = newTreasuryGuardian; - treasuryAddress = newTreasuryAddress; - treasuryPercent = newTreasuryPercent; + s.treasuryGuardian = newTreasuryGuardian; + s.treasuryAddress = newTreasuryAddress; + s.treasuryPercent = newTreasuryPercent; emit NewTreasuryGuardian(oldTreasuryGuardian, newTreasuryGuardian); emit NewTreasuryAddress(oldTreasuryAddress, newTreasuryAddress); @@ -387,22 +385,22 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError{ function _setComptrollerLens(ComptrollerLensInterface comptrollerLens_) external returns (uint) { ensureAdmin(); ensureNonzeroAddress(address(comptrollerLens_)); - address oldComptrollerLens = address(comptrollerLens); - comptrollerLens = comptrollerLens_; + address oldComptrollerLens = address(s.comptrollerLens); + s.comptrollerLens = comptrollerLens_; emit NewComptrollerLens(oldComptrollerLens, address(comptrollerLens)); return uint(Error.NO_ERROR); } - /** + /** * @notice Set the amount of XVS distributed per block to VAI Vault * @param venusVAIVaultRate_ The amount of XVS wei per block to distribute to VAI Vault */ function _setVenusVAIVaultRate(uint venusVAIVaultRate_) external { ensureAdmin(); - uint oldVenusVAIVaultRate = venusVAIVaultRate; - venusVAIVaultRate = venusVAIVaultRate_; + uint oldVenusVAIVaultRate = s.venusVAIVaultRate; + s.venusVAIVaultRate = venusVAIVaultRate_; emit NewVenusVAIVaultRate(oldVenusVAIVaultRate, venusVAIVaultRate_); } @@ -416,32 +414,9 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError{ ensureAdmin(); ensureNonzeroAddress(vault_); - vaiVaultAddress = vault_; - releaseStartBlock = releaseStartBlock_; - minReleaseAmount = minReleaseAmount_; + s.vaiVaultAddress = vault_; + s.releaseStartBlock = releaseStartBlock_; + s.minReleaseAmount = minReleaseAmount_; emit NewVAIVaultInfo(vault_, releaseStartBlock_, minReleaseAmount_); } - - /** - * @notice Sets the prime token contract for the comptroller - * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) - */ - function _setPrimeToken(IPrime _prime) external returns (uint) { - // Check caller is admin - ensureAdmin(); - ensureNonzeroAddress(address(_prime)); - - // Track the old prime token for the comptroller - IPrime oldPrime = prime; - - // Set comptroller's prime token to new prime token - prime = _prime; - - // Emit NewPrimeToken(oldPrime, newPrime) - emit NewPrimeToken(oldPrime, prime); - - return uint(Error.NO_ERROR); - } - - -} \ No newline at end of file +} diff --git a/contracts/Diamond/interfaces/IDiamondCut.sol b/contracts/Diamond/interfaces/IDiamondCut.sol index 2972f6954..beff9a16c 100644 --- a/contracts/Diamond/interfaces/IDiamondCut.sol +++ b/contracts/Diamond/interfaces/IDiamondCut.sol @@ -7,7 +7,11 @@ pragma solidity ^0.8.0; /******************************************************************************/ interface IDiamondCut { - enum FacetCutAction {Add, Replace, Remove} + enum FacetCutAction { + Add, + Replace, + Remove + } // Add=0, Replace=1, Remove=2 struct FacetCut { @@ -22,11 +26,7 @@ interface IDiamondCut { /// @param _init The address of the contract or facet to execute _calldata /// @param _calldata A function call, including function selector and arguments /// _calldata is executed with delegatecall on _init - function diamondCut( - FacetCut[] calldata _diamondCut, - address _init, - bytes calldata _calldata - ) external; + function diamondCut(FacetCut[] calldata _diamondCut, address _init, bytes calldata _calldata) external; event DiamondCut(FacetCut[] _diamondCut, address _init, bytes _calldata); } diff --git a/contracts/Diamond/libraries/LibAccessCheck.sol b/contracts/Diamond/libraries/LibAccessCheck.sol index 96b8b041d..91b52f2c2 100644 --- a/contracts/Diamond/libraries/LibAccessCheck.sol +++ b/contracts/Diamond/libraries/LibAccessCheck.sol @@ -1,9 +1,8 @@ pragma solidity ^0.5.16; -import "../Governance/IAccessControlManager.sol"; -import "./ComptrollerStorage.sol"; +import "../../Governance/IAccessControlManager.sol"; -library LibAccessCheck { +library LibAccessCheck { /// @notice Reverts if the protocol is paused function checkProtocolPauseState() internal view { require(!protocolPaused, "protocol is paused"); @@ -56,4 +55,4 @@ library LibAccessCheck { function actionPaused(address market, Action action) public view returns (bool) { return _actionPaused[market][uint(action)]; } -} \ No newline at end of file +} diff --git a/contracts/Diamond/libraries/LibDiamond.sol b/contracts/Diamond/libraries/LibDiamond.sol index e8d4463ba..5b08b1316 100644 --- a/contracts/Diamond/libraries/LibDiamond.sol +++ b/contracts/Diamond/libraries/LibDiamond.sol @@ -67,11 +67,7 @@ library LibDiamond { event DiamondCut(IDiamondCut.FacetCut[] _diamondCut, address _init, bytes _calldata); // Internal function version of diamondCut - function diamondCut( - IDiamondCut.FacetCut[] memory _diamondCut, - address _init, - bytes memory _calldata - ) internal { + function diamondCut(IDiamondCut.FacetCut[] memory _diamondCut, address _init, bytes memory _calldata) internal { for (uint256 facetIndex; facetIndex < _diamondCut.length; facetIndex++) { IDiamondCut.FacetCutAction action = _diamondCut[facetIndex].action; if (action == IDiamondCut.FacetCutAction.Add) { @@ -90,12 +86,12 @@ library LibDiamond { function addFunctions(address _facetAddress, bytes4[] memory _functionSelectors) internal { require(_functionSelectors.length > 0, "LibDiamondCut: No selectors in facet to cut"); - DiamondStorage storage ds = diamondStorage(); + DiamondStorage storage ds = diamondStorage(); require(_facetAddress != address(0), "LibDiamondCut: Add facet can't be address(0)"); uint96 selectorPosition = uint96(ds.facetFunctionSelectors[_facetAddress].functionSelectors.length); // add new facet address if it does not exist if (selectorPosition == 0) { - addFacet(ds, _facetAddress); + addFacet(ds, _facetAddress); } for (uint256 selectorIndex; selectorIndex < _functionSelectors.length; selectorIndex++) { bytes4 selector = _functionSelectors[selectorIndex]; @@ -141,16 +137,20 @@ library LibDiamond { enforceHasContractCode(_facetAddress, "LibDiamondCut: New facet has no code"); ds.facetFunctionSelectors[_facetAddress].facetAddressPosition = ds.facetAddresses.length; ds.facetAddresses.push(_facetAddress); - } - + } - function addFunction(DiamondStorage storage ds, bytes4 _selector, uint96 _selectorPosition, address _facetAddress) internal { + function addFunction( + DiamondStorage storage ds, + bytes4 _selector, + uint96 _selectorPosition, + address _facetAddress + ) internal { ds.selectorToFacetAndPosition[_selector].functionSelectorPosition = _selectorPosition; ds.facetFunctionSelectors[_facetAddress].functionSelectors.push(_selector); ds.selectorToFacetAndPosition[_selector].facetAddress = _facetAddress; } - function removeFunction(DiamondStorage storage ds, address _facetAddress, bytes4 _selector) internal { + function removeFunction(DiamondStorage storage ds, address _facetAddress, bytes4 _selector) internal { require(_facetAddress != address(0), "LibDiamondCut: Can't remove function that doesn't exist"); // an immutable function is a function defined directly in a diamond require(_facetAddress != address(this), "LibDiamondCut: Can't remove immutable function"); @@ -186,7 +186,7 @@ library LibDiamond { if (_init == address(0)) { return; } - enforceHasContractCode(_init, "LibDiamondCut: _init address has no code"); + enforceHasContractCode(_init, "LibDiamondCut: _init address has no code"); (bool success, bytes memory error) = _init.delegatecall(_calldata); if (!success) { if (error.length > 0) { diff --git a/contracts/Diamond/libraries/LibHelper.sol b/contracts/Diamond/libraries/LibHelper.sol index dd3ae51f6..9a93b3313 100644 --- a/contracts/Diamond/libraries/LibHelper.sol +++ b/contracts/Diamond/libraries/LibHelper.sol @@ -1,8 +1,7 @@ pragma solidity ^0.5.16 import "../../Tokens/VTokens/VToken.sol"; -import "../../Comptroller/ComptrollerStorage.sol"; -library LibComptrollerHelper { +library LibHelper { /** @@ -148,6 +147,59 @@ library LibComptrollerHelper { emit DistributedBorrowerVenus(VToken(vToken), borrower, borrowerDelta, borrowIndex); } - + /** + * @notice Add the market to the borrower's "assets in" for liquidity calculations + * @param vToken The market to enter + * @param borrower The address of the account to modify + * @return Success indicator for whether the market was entered + */ + function addToMarketInternal(VToken vToken, address borrower) internal returns (Error) { + checkActionPauseState(address(vToken), Action.ENTER_MARKET); + + Market storage marketToJoin = markets[address(vToken)]; + ensureListed(marketToJoin); + + if (marketToJoin.accountMembership[borrower]) { + // already joined + return Error.NO_ERROR; + } + + // survived the gauntlet, add to list + // NOTE: we store these somewhat redundantly as a significant optimization + // this avoids having to iterate through the list for the most common use cases + // that is, only when we need to perform liquidity checks + // and not whenever we want to check if an account is in a particular market + marketToJoin.accountMembership[borrower] = true; + accountAssets[borrower].push(vToken); + + emit MarketEntered(vToken, borrower); + + return Error.NO_ERROR; + } + + function redeemAllowedInternal(address vToken, address redeemer, uint redeemTokens) internal view returns (uint) { + ensureListed(markets[vToken]); + + /* If the redeemer is not 'in' the market, then we can bypass the liquidity check */ + if (!markets[vToken].accountMembership[redeemer]) { + return uint(Error.NO_ERROR); + } + + /* Otherwise, perform a hypothetical liquidity check to guard against shortfall */ + (Error err, , uint shortfall) = getHypotheticalAccountLiquidityInternal( + redeemer, + VToken(vToken), + redeemTokens, + 0 + ); + if (err != Error.NO_ERROR) { + return uint(err); + } + if (shortfall != 0) { + return uint(Error.INSUFFICIENT_LIQUIDITY); + } + + return uint(Error.NO_ERROR); + } } \ No newline at end of file diff --git a/contracts/Diamond/libraries/appStorage.sol b/contracts/Diamond/libraries/appStorage.sol index 166b2e956..4d5065487 100644 --- a/contracts/Diamond/libraries/appStorage.sol +++ b/contracts/Diamond/libraries/appStorage.sol @@ -1,92 +1,78 @@ -pragma solidity ^0.5.16; +pragma solidity ^0.8.0; -import "../Tokens/VTokens/VToken.sol"; -import "../Oracle/PriceOracle.sol"; -import "../Tokens/VAI/VAIControllerInterface.sol"; -import "./ComptrollerLensInterface.sol"; -import "../Tokens/Prime/IPrime.sol"; +import "../../Tokens/VTokens/VToken.sol"; +import "../../Oracle/PriceOracle.sol"; +import "../../Tokens/VAI/VAIControllerInterface.sol"; +import "../../Comptroller/ComptrollerLensInterface.sol"; struct Market { - /// @notice Whether or not this market is listed - bool isListed; - /** - * @notice Multiplier representing the most one can borrow against their collateral in this market. - * For instance, 0.9 to allow borrowing 90% of collateral value. - * Must be between 0 and 1, and stored as a mantissa. - */ - uint collateralFactorMantissa; - /// @notice Per-market mapping of "accounts in this asset" - mapping(address => bool) accountMembership; - /// @notice Whether or not this market receives XVS - bool isVenus; - } + /// @notice Whether or not this market is listed + bool isListed; + /** + * @notice Multiplier representing the most one can borrow against their collateral in this market. + * For instance, 0.9 to allow borrowing 90% of collateral value. + * Must be between 0 and 1, and stored as a mantissa. + */ + uint collateralFactorMantissa; + /// @notice Per-market mapping of "accounts in this asset" + mapping(address => bool) accountMembership; + /// @notice Whether or not this market receives XVS + bool isVenus; +} - struct VenusMarketState { - /// @notice The market's last updated venusBorrowIndex or venusSupplyIndex - uint224 index; - /// @notice The block number the index was last updated at - uint32 block; - } +struct VenusMarketState { + /// @notice The market's last updated venusBorrowIndex or venusSupplyIndex + uint224 index; + /// @notice The block number the index was last updated at + uint32 block; +} struct AppStorage { - /** * @notice Administrator for this contract */ address admin; - /** * @notice Pending administrator for this contract */ address pendingAdmin; - /** * @notice Active brains of Unitroller */ address comptrollerImplementation; - /** * @notice Pending brains of Unitroller */ address pendingComptrollerImplementation; - /** * @notice Oracle which gives the price of any given asset */ PriceOracle oracle; - /** * @notice Multiplier used to calculate the maximum repayAmount when liquidating a borrow */ uint closeFactorMantissa; - /** * @notice Multiplier representing the discount on collateral that a liquidator receives */ uint liquidationIncentiveMantissa; - /** * @notice Max number of assets a single account can participate in (borrow or use as collateral) */ uint maxAssets; - /** * @notice Per-account mapping of "assets you are in", capped by maxAssets */ mapping(address => VToken[]) accountAssets; - - /** * @notice Official mapping of vTokens -> Market metadata * @dev Used e.g. to determine if a market is supported */ mapping(address => Market) markets; - /** * @notice The Pause Guardian can pause certain actions as a safety mechanism. */ address pauseGuardian; - /// @notice Whether minting is paused (deprecated, superseded by actionPaused) bool _mintGuardianPaused; /// @notice Whether borrowing is paused (deprecated, superseded by actionPaused) @@ -99,109 +85,75 @@ struct AppStorage { mapping(address => bool) mintGuardianPaused; /// @notice Whether borrowing is paused (deprecated, superseded by actionPaused) mapping(address => bool) borrowGuardianPaused; - /// @notice A list of all markets VToken[] allMarkets; - /// @notice The rate at which the flywheel distributes XVS, per block uint venusRate; - /// @notice The portion of venusRate that each market currently receives mapping(address => uint) venusSpeeds; - /// @notice The Venus market supply state for each market mapping(address => VenusMarketState) venusSupplyState; - /// @notice The Venus market borrow state for each market mapping(address => VenusMarketState) venusBorrowState; - /// @notice The Venus supply index for each market for each supplier as of the last time they accrued XVS mapping(address => mapping(address => uint)) venusSupplierIndex; - /// @notice The Venus borrow index for each market for each borrower as of the last time they accrued XVS mapping(address => mapping(address => uint)) venusBorrowerIndex; - /// @notice The XVS accrued but not yet transferred to each user mapping(address => uint) venusAccrued; - /// @notice The Address of VAIController VAIControllerInterface vaiController; - /// @notice The minted VAI amount to each user mapping(address => uint) mintedVAIs; - /// @notice VAI Mint Rate as a percentage uint vaiMintRate; - /** * @notice The Pause Guardian can pause certain actions as a safety mechanism. */ bool mintVAIGuardianPaused; bool repayVAIGuardianPaused; - /** * @notice Pause/Unpause whole protocol actions */ bool protocolPaused; - /// @notice The rate at which the flywheel distributes XVS to VAI Minters, per block (deprecated) uint venusVAIRate; - - /// @notice The rate at which the flywheel distributes XVS to VAI Vault, per block + /// @notice The rate at which the flywheel distributes XVS to VAI Vault, per block uint venusVAIVaultRate; - // address of VAI Vault address vaiVaultAddress; - // start block of release to VAI Vault uint256 releaseStartBlock; - // minimum release amount to VAI Vault uint256 minReleaseAmount; - /// @notice The borrowCapGuardian can set borrowCaps to any number for any market. Lowering the borrow cap could disable borrowing on the given market. address borrowCapGuardian; - /// @notice Borrow caps enforced by borrowAllowed for each vToken address. Defaults to zero which corresponds to unlimited borrowing. mapping(address => uint) borrowCaps; - /// @notice Treasury Guardian address address treasuryGuardian; - /// @notice Treasury address address treasuryAddress; - /// @notice Fee percent of accrued interest with decimal 18 uint256 treasuryPercent; - /// @notice The portion of XVS that each contributor receives per block (deprecated) mapping(address => uint) venusContributorSpeeds; - /// @notice Last block at which a contributor's XVS rewards have been allocated (deprecated) mapping(address => uint) lastContributorBlock; - address liquidatorContract; - ComptrollerLensInterface comptrollerLens; - /// @notice Supply caps enforced by mintAllowed for each vToken address. Defaults to zero which corresponds to minting notAllowed mapping(address => uint256) supplyCaps; - /// @notice AccessControlManager address address accessControl; - /// @notice True if a certain action is paused on a certain market mapping(address => mapping(uint => bool)) _actionPaused; - - /// @notice The rate at which venus is distributed to the corresponding borrow market (per block) + /// @notice The rate at which venus is distributed to the corresponding borrow market (per block) mapping(address => uint) venusBorrowSpeeds; - /// @notice The rate at which venus is distributed to the corresponding supply market (per block) mapping(address => uint) venusSupplySpeeds; - /// @notice Prime token address IPrime prime; - } library LibAppStorage { @@ -214,4 +166,4 @@ library LibAppStorage { function abs(int256 x) internal pure returns (uint256) { return uint256(x >= 0 ? x : -x); } -} \ No newline at end of file +} From 1e4c3214e422b398b55ed2440963d57a35388c1a Mon Sep 17 00:00:00 2001 From: defcon022 Date: Mon, 6 Mar 2023 11:50:47 +0530 Subject: [PATCH 006/153] Update imports --- contracts/Diamond/facets/SetterFacet.sol | 30 ++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/contracts/Diamond/facets/SetterFacet.sol b/contracts/Diamond/facets/SetterFacet.sol index a6ca0fce3..62bf3d598 100644 --- a/contracts/Diamond/facets/SetterFacet.sol +++ b/contracts/Diamond/facets/SetterFacet.sol @@ -84,6 +84,7 @@ contract SetterFacet is AppStorage, ComptrollerErrorReporter, ExponentialNoError // Set comptroller's oracle to newOracle oracle = newOracle; + oracle = newOracle; // Emit NewPriceOracle(oldOracle, newOracle) emit NewPriceOracle(oldOracle, newOracle); @@ -101,6 +102,7 @@ contract SetterFacet is AppStorage, ComptrollerErrorReporter, ExponentialNoError // Check caller is admin ensureAdmin(); + uint oldCloseFactorMantissa = s.closeFactorMantissa; uint oldCloseFactorMantissa = s.closeFactorMantissa; s.closeFactorMantissa = newCloseFactorMantissa; emit NewCloseFactor(oldCloseFactorMantissa, newCloseFactorMantissa); @@ -119,6 +121,7 @@ contract SetterFacet is AppStorage, ComptrollerErrorReporter, ExponentialNoError ensureAdmin(); ensureNonzeroAddress(newAccessControlAddress); + address oldAccessControlAddress = s.accessControl; address oldAccessControlAddress = s.accessControl; s.accessControl = newAccessControlAddress; emit NewAccessControl(oldAccessControlAddress, accessControl); @@ -178,9 +181,11 @@ contract SetterFacet is AppStorage, ComptrollerErrorReporter, ExponentialNoError // Save current value for use in log uint oldLiquidationIncentiveMantissa = s.liquidationIncentiveMantissa; + uint oldLiquidationIncentiveMantissa = s.liquidationIncentiveMantissa; // Set liquidation incentive to new incentive s.liquidationIncentiveMantissa = newLiquidationIncentiveMantissa; + s.liquidationIncentiveMantissa = newLiquidationIncentiveMantissa; // Emit event with old incentive, new incentive emit NewLiquidationIncentive(oldLiquidationIncentiveMantissa, newLiquidationIncentiveMantissa); @@ -193,6 +198,8 @@ contract SetterFacet is AppStorage, ComptrollerErrorReporter, ExponentialNoError ensureAdmin(); address oldLiquidatorContract = s.liquidatorContract; s.liquidatorContract = newLiquidatorContract_; + address oldLiquidatorContract = s.liquidatorContract; + s.liquidatorContract = newLiquidatorContract_; emit NewLiquidatorContract(oldLiquidatorContract, newLiquidatorContract_); } @@ -207,6 +214,7 @@ contract SetterFacet is AppStorage, ComptrollerErrorReporter, ExponentialNoError // Save current value for inclusion in log address oldPauseGuardian = s.pauseGuardian; + address oldPauseGuardian = s.pauseGuardian; // Store pauseGuardian with value newPauseGuardian s.pauseGuardian = newPauseGuardian; @@ -232,6 +240,7 @@ contract SetterFacet is AppStorage, ComptrollerErrorReporter, ExponentialNoError require(numMarkets != 0 && numMarkets == numBorrowCaps, "invalid input"); for (uint i; i < numMarkets; ++i) { + s.borrowCaps[address(vTokens[i])] = newBorrowCaps[i]; s.borrowCaps[address(vTokens[i])] = newBorrowCaps[i]; emit NewBorrowCap(vTokens[i], newBorrowCaps[i]); } @@ -252,6 +261,7 @@ contract SetterFacet is AppStorage, ComptrollerErrorReporter, ExponentialNoError require(numMarkets != 0 && numMarkets == numSupplyCaps, "invalid input"); for (uint i; i < numMarkets; ++i) { + s.supplyCaps[address(vTokens[i])] = newSupplyCaps[i]; s.supplyCaps[address(vTokens[i])] = newSupplyCaps[i]; emit NewSupplyCap(vTokens[i], newSupplyCaps[i]); } @@ -263,6 +273,7 @@ contract SetterFacet is AppStorage, ComptrollerErrorReporter, ExponentialNoError function _setProtocolPaused(bool state) external returns (bool) { ensureAllowed("_setProtocolPaused(bool)"); + s.protocolPaused = state; s.protocolPaused = state; emit ActionProtocolPaused(state); return state; @@ -295,6 +306,7 @@ contract SetterFacet is AppStorage, ComptrollerErrorReporter, ExponentialNoError function setActionPausedInternal(address market, Action action, bool paused) internal { ensureListed(markets[market]); s._actionPaused[market][uint(action)] = paused; + s._actionPaused[market][uint(action)] = paused; emit ActionPausedMarket(VToken(market), action, paused); } @@ -308,6 +320,8 @@ contract SetterFacet is AppStorage, ComptrollerErrorReporter, ExponentialNoError ensureAdmin(); ensureNonzeroAddress(address(vaiController_)); + VAIControllerInterface oldVaiController = s.vaiController; + s.vaiController = vaiController_; VAIControllerInterface oldVaiController = s.vaiController; s.vaiController = vaiController_; emit NewVAIController(oldVaiController, vaiController_); @@ -320,6 +334,8 @@ contract SetterFacet is AppStorage, ComptrollerErrorReporter, ExponentialNoError ensureAdmin(); uint oldVAIMintRate = s.vaiMintRate; s.vaiMintRate = newVAIMintRate; + uint oldVAIMintRate = s.vaiMintRate; + s.vaiMintRate = newVAIMintRate; emit NewVAIMintRate(oldVAIMintRate, newVAIMintRate); return uint(Error.NO_ERROR); @@ -341,6 +357,7 @@ contract SetterFacet is AppStorage, ComptrollerErrorReporter, ExponentialNoError return fail(Error.REJECTION, FailureInfo.SET_MINTED_VAI_REJECTION); } s.mintedVAIs[owner] = amount; + s.mintedVAIs[owner] = amount; return uint(Error.NO_ERROR); } @@ -357,10 +374,16 @@ contract SetterFacet is AppStorage, ComptrollerErrorReporter, ExponentialNoError ensureNonzeroAddress(newTreasuryGuardian); ensureNonzeroAddress(newTreasuryAddress); + address oldTreasuryGuardian = s.treasuryGuardian; + address oldTreasuryAddress = s.treasuryAddress; + uint oldTreasuryPercent = s.treasuryPercent; address oldTreasuryGuardian = s.treasuryGuardian; address oldTreasuryAddress = s.treasuryAddress; uint oldTreasuryPercent = s.treasuryPercent; + s.treasuryGuardian = newTreasuryGuardian; + s.treasuryAddress = newTreasuryAddress; + s.treasuryPercent = newTreasuryPercent; s.treasuryGuardian = newTreasuryGuardian; s.treasuryAddress = newTreasuryAddress; s.treasuryPercent = newTreasuryPercent; @@ -387,6 +410,8 @@ contract SetterFacet is AppStorage, ComptrollerErrorReporter, ExponentialNoError ensureNonzeroAddress(address(comptrollerLens_)); address oldComptrollerLens = address(s.comptrollerLens); s.comptrollerLens = comptrollerLens_; + address oldComptrollerLens = address(s.comptrollerLens); + s.comptrollerLens = comptrollerLens_; emit NewComptrollerLens(oldComptrollerLens, address(comptrollerLens)); return uint(Error.NO_ERROR); @@ -399,6 +424,8 @@ contract SetterFacet is AppStorage, ComptrollerErrorReporter, ExponentialNoError function _setVenusVAIVaultRate(uint venusVAIVaultRate_) external { ensureAdmin(); + uint oldVenusVAIVaultRate = s.venusVAIVaultRate; + s.venusVAIVaultRate = venusVAIVaultRate_; uint oldVenusVAIVaultRate = s.venusVAIVaultRate; s.venusVAIVaultRate = venusVAIVaultRate_; emit NewVenusVAIVaultRate(oldVenusVAIVaultRate, venusVAIVaultRate_); @@ -414,6 +441,9 @@ contract SetterFacet is AppStorage, ComptrollerErrorReporter, ExponentialNoError ensureAdmin(); ensureNonzeroAddress(vault_); + s.vaiVaultAddress = vault_; + s.releaseStartBlock = releaseStartBlock_; + s.minReleaseAmount = minReleaseAmount_; s.vaiVaultAddress = vault_; s.releaseStartBlock = releaseStartBlock_; s.minReleaseAmount = minReleaseAmount_; From 981c62d7e1324455111d30f2641a0b1805d454a2 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Tue, 7 Mar 2023 15:33:49 +0530 Subject: [PATCH 007/153] Added Policy and Market Facet --- contracts/Diamond/ComptrollerDiamond.sol | 10 +- contracts/Diamond/facets/DiamondCutFacet.sol | 8 +- .../Diamond/facets/DiamondLoupeFacet.sol | 57 +++ contracts/Diamond/facets/MarketFacet.sol | 164 +++++++ contracts/Diamond/facets/PolicyFacet.sol | 431 ++++++++++++++++++ contracts/Diamond/facets/RewardFacet.sol | 28 +- contracts/Diamond/facets/SetterFacet.sol | 74 +-- contracts/Diamond/interfaces/IDiamondCut.sol | 8 +- .../Diamond/interfaces/IDiamondLoupe.sol | 30 ++ .../Diamond/libraries/LibAccessCheck.sol | 27 +- contracts/Diamond/libraries/LibDiamond.sol | 8 +- contracts/Diamond/libraries/LibHelper.sol | 2 +- contracts/Diamond/libraries/appStorage.sol | 26 +- 13 files changed, 794 insertions(+), 79 deletions(-) create mode 100644 contracts/Diamond/facets/DiamondLoupeFacet.sol create mode 100644 contracts/Diamond/facets/MarketFacet.sol create mode 100644 contracts/Diamond/facets/PolicyFacet.sol create mode 100644 contracts/Diamond/interfaces/IDiamondLoupe.sol diff --git a/contracts/Diamond/ComptrollerDiamond.sol b/contracts/Diamond/ComptrollerDiamond.sol index 55f007629..b5cf83dc9 100644 --- a/contracts/Diamond/ComptrollerDiamond.sol +++ b/contracts/Diamond/ComptrollerDiamond.sol @@ -1,12 +1,4 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/******************************************************************************\ -* Author: Nick Mudge (https://twitter.com/mudgen) -* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535 -* -* Implementation of a diamond. -/******************************************************************************/ +pragma solidity 0.8.13; import { LibDiamond } from "./libraries/LibDiamond.sol"; import { IDiamondCut } from "./interfaces/IDiamondCut.sol"; diff --git a/contracts/Diamond/facets/DiamondCutFacet.sol b/contracts/Diamond/facets/DiamondCutFacet.sol index e8ceb4fc3..83dd9a99e 100644 --- a/contracts/Diamond/facets/DiamondCutFacet.sol +++ b/contracts/Diamond/facets/DiamondCutFacet.sol @@ -1,10 +1,4 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/******************************************************************************\ -* Author: Nick Mudge (https://twitter.com/mudgen) -* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535 -/******************************************************************************/ +pragma solidity 0.8.13; import { IDiamondCut } from "../interfaces/IDiamondCut.sol"; import { LibDiamond } from "../libraries/LibDiamond.sol"; diff --git a/contracts/Diamond/facets/DiamondLoupeFacet.sol b/contracts/Diamond/facets/DiamondLoupeFacet.sol new file mode 100644 index 000000000..77e08a3af --- /dev/null +++ b/contracts/Diamond/facets/DiamondLoupeFacet.sol @@ -0,0 +1,57 @@ +pragma solidity 0.8.13; + +import { LibDiamond } from "../libraries/LibDiamond.sol"; +import { IDiamondLoupe } from "../interfaces/IDiamondLoupe.sol"; + +// The functions in DiamondLoupeFacet MUST be added to a diamond. +// The EIP-2535 Diamond standard requires these functions. + +contract DiamondLoupeFacet is IDiamondLoupe { + // Diamond Loupe Functions + //////////////////////////////////////////////////////////////////// + /// These functions are expected to be called frequently by tools. + // + // struct Facet { + // address facetAddress; + // bytes4[] functionSelectors; + // } + + /// @notice Gets all facets and their selectors. + /// @return facets_ Facet + function facets() external view override returns (Facet[] memory facets_) { + LibDiamond.DiamondStorage storage ds = LibDiamond.diamondStorage(); + uint256 numFacets = ds.facetAddresses.length; + facets_ = new Facet[](numFacets); + for (uint256 i; i < numFacets; i++) { + address facetAddress_ = ds.facetAddresses[i]; + facets_[i].facetAddress = facetAddress_; + facets_[i].functionSelectors = ds.facetFunctionSelectors[facetAddress_].functionSelectors; + } + } + + /// @notice Gets all the function selectors provided by a facet. + /// @param _facet The facet address. + /// @return facetFunctionSelectors_ + function facetFunctionSelectors( + address _facet + ) external view override returns (bytes4[] memory facetFunctionSelectors_) { + LibDiamond.DiamondStorage storage ds = LibDiamond.diamondStorage(); + facetFunctionSelectors_ = ds.facetFunctionSelectors[_facet].functionSelectors; + } + + /// @notice Get all the facet addresses used by a diamond. + /// @return facetAddresses_ + function facetAddresses() external view override returns (address[] memory facetAddresses_) { + LibDiamond.DiamondStorage storage ds = LibDiamond.diamondStorage(); + facetAddresses_ = ds.facetAddresses; + } + + /// @notice Gets the facet that supports the given selector. + /// @dev If facet is not found return address(0). + /// @param _functionSelector The function selector. + /// @return facetAddress_ The facet address. + function facetAddress(bytes4 _functionSelector) external view override returns (address facetAddress_) { + LibDiamond.DiamondStorage storage ds = LibDiamond.diamondStorage(); + facetAddress_ = ds.selectorToFacetAndPosition[_functionSelector].facetAddress; + } +} diff --git a/contracts/Diamond/facets/MarketFacet.sol b/contracts/Diamond/facets/MarketFacet.sol new file mode 100644 index 000000000..4404f3b91 --- /dev/null +++ b/contracts/Diamond/facets/MarketFacet.sol @@ -0,0 +1,164 @@ +pragma solidity 0.8.13; + +import "../libraries/appStorage.sol"; +import "../libraries/LibHelper.sol"; +import "../libraries/LibAccessCheck.sol"; +import "../../Tokens/VTokens/VToken.sol"; + +contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError { + AppStorage internal s; + + /// @notice Emitted when an account enters a market + event MarketEntered(VToken vToken, address account); + + /// @notice Emitted when an account exits a market + event MarketExited(VToken vToken, address account); + + /** + * @notice Returns the assets an account has entered + * @param account The address of the account to pull assets for + * @return A dynamic list with the assets the account has entered + */ + function getAssetsIn(address account) external view returns (VToken[] memory) { + return s.accountAssets[account]; + } + + /** + * @notice Returns whether the given account is entered in the given asset + * @param account The address of the account to check + * @param vToken The vToken to check + * @return True if the account is in the asset, otherwise false. + */ + function checkMembership(address account, VToken vToken) external view returns (bool) { + return s.markets[address(vToken)].accountMembership[account]; + } + + /** + * @notice Add assets to be included in account liquidity calculation + * @param vTokens The list of addresses of the vToken markets to be enabled + * @return Success indicator for whether each corresponding market was entered + */ + function enterMarkets(address[] calldata vTokens) external returns (uint[] memory) { + uint len = vTokens.length; + + uint[] memory results = new uint[](len); + for (uint i; i < len; ++i) { + results[i] = uint(LibHelper.addToMarketInternal(VToken(vTokens[i]), msg.sender)); + } + + return results; + } + + /** + * @notice Removes asset from sender's account liquidity calculation + * @dev Sender must not have an outstanding borrow balance in the asset, + * or be providing necessary collateral for an outstanding borrow. + * @param vTokenAddress The address of the asset to be removed + * @return Whether or not the account successfully exited the market + */ + function exitMarket(address vTokenAddress) external returns (uint) { + LibAccessCheck.checkActionPauseState(vTokenAddress, Action.EXIT_MARKET); + + VToken vToken = VToken(vTokenAddress); + /* Get sender tokensHeld and amountOwed underlying from the vToken */ + (uint oErr, uint tokensHeld, uint amountOwed, ) = vToken.getAccountSnapshot(msg.sender); + require(oErr == 0, "getAccountSnapshot failed"); // semi-opaque error code + + /* Fail if the sender has a borrow balance */ + if (amountOwed != 0) { + return fail(Error.NONZERO_BORROW_BALANCE, FailureInfo.EXIT_MARKET_BALANCE_OWED); + } + + /* Fail if the sender is not permitted to redeem all of their tokens */ + uint allowed = LibHelper.redeemAllowedInternal(vTokenAddress, msg.sender, tokensHeld); + if (allowed != 0) { + return failOpaque(Error.REJECTION, FailureInfo.EXIT_MARKET_REJECTION, allowed); + } + + Market storage marketToExit = s.markets[address(vToken)]; + + /* Return true if the sender is not already ‘in’ the market */ + if (!marketToExit.accountMembership[msg.sender]) { + return uint(Error.NO_ERROR); + } + + /* Set vToken account membership to false */ + delete marketToExit.accountMembership[msg.sender]; + + /* Delete vToken from the account’s list of assets */ + // In order to delete vToken, copy last item in list to location of item to be removed, reduce length by 1 + VToken[] storage userAssetList = s.accountAssets[msg.sender]; + uint len = userAssetList.length; + uint i; + for (; i < len; ++i) { + if (userAssetList[i] == vToken) { + userAssetList[i] = userAssetList[len - 1]; + userAssetList.length--; + break; + } + } + + // We *must* have found the asset in the list or our redundant data structure is broken + assert(i < len); + + emit MarketExited(vToken, msg.sender); + + return uint(Error.NO_ERROR); + } + + /** + * @notice Add the market to the markets mapping and set it as listed + * @dev Admin function to set isListed and add support for the market + * @param vToken The address of the market (token) to list + * @return uint 0=success, otherwise a failure. (See enum Error for details) + */ + function _supportMarket(VToken vToken) external returns (uint) { + LibAccessCheck.ensureAllowed("_supportMarket(address)"); + + if (s.markets[address(vToken)].isListed) { + return fail(Error.MARKET_ALREADY_LISTED, FailureInfo.SUPPORT_MARKET_EXISTS); + } + + // Note that isVenus is not in active use anymore + s.markets[address(vToken)] = Market({ isListed: true, isVenus: false, collateralFactorMantissa: 0 }); + + _addMarketInternal(vToken); + _initializeMarket(address(vToken)); + + emit MarketListed(vToken); + + return uint(Error.NO_ERROR); + } + + function _addMarketInternal(VToken vToken) internal { + for (uint i; i < s.allMarkets.length; ++i) { + require(s.allMarkets[i] != vToken, "market already added"); + } + s.allMarkets.push(vToken); + } + + function _initializeMarket(address vToken) internal { + uint32 blockNumber = safe32(LibAccessCheck.getBlockNumber(), "block number exceeds 32 bits"); + + VenusMarketState storage supplyState = s.venusSupplyState[vToken]; + VenusMarketState storage borrowState = s.venusBorrowState[vToken]; + + /* + * Update market state indices + */ + if (supplyState.index == 0) { + // Initialize supply state index with default value + supplyState.index = venusInitialIndex; + } + + if (borrowState.index == 0) { + // Initialize borrow state index with default value + borrowState.index = venusInitialIndex; + } + + /* + * Update market state block numbers + */ + supplyState.block = borrowState.block = blockNumber; + } +} diff --git a/contracts/Diamond/facets/PolicyFacet.sol b/contracts/Diamond/facets/PolicyFacet.sol new file mode 100644 index 000000000..fb8fc2047 --- /dev/null +++ b/contracts/Diamond/facets/PolicyFacet.sol @@ -0,0 +1,431 @@ +pragma solidity 0.8.13; + +import "../../Utils/ErrorReporter.sol"; +import "../libraries/LibAccessCheck.sol"; +import "../libraries/LibHelper.sol"; +import "../libraries/appStorage.sol"; +import "../../Tokens/VTokens/VToken.sol"; + +contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError { + AppStorage internal s; + /// @notice Emitted when a new borrow-side XVS speed is calculated for a market + event VenusBorrowSpeedUpdated(VToken indexed vToken, uint newSpeed); + + /// @notice Emitted when a new supply-side XVS speed is calculated for a market + event VenusSupplySpeedUpdated(VToken indexed vToken, uint newSpeed); + + /** + * @notice Checks if the account should be allowed to mint tokens in the given market + * @param vToken The market to verify the mint against + * @param minter The account which would get the minted tokens + * @param mintAmount The amount of underlying being supplied to the market in exchange for tokens + * @return 0 if the mint is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) + */ + function mintAllowed(address vToken, address minter, uint mintAmount) external returns (uint) { + // Pausing is a very serious situation - we revert to sound the alarms + LibAccessCheck.checkProtocolPauseState(); + LibAccessCheck.checkActionPauseState(vToken, Action.MINT); + LibAccessCheck.ensureListed(s.markets[vToken]); + + uint256 supplyCap = supplyCaps[vToken]; + require(supplyCap != 0, "market supply cap is 0"); + + uint256 vTokenSupply = VToken(vToken).totalSupply(); + Exp memory exchangeRate = Exp({ mantissa: VToken(vToken).exchangeRateStored() }); + uint256 nextTotalSupply = mul_ScalarTruncateAddUInt(exchangeRate, vTokenSupply, mintAmount); + require(nextTotalSupply <= supplyCap, "market supply cap reached"); + + // Keep the flywheel moving + LibHelper.updateVenusSupplyIndex(vToken); + LibHelper.distributeSupplierVenus(vToken, minter); + + return uint(Error.NO_ERROR); + } + + function mintVerify(address vToken, address minter, uint actualMintAmount, uint mintTokens) external {} + + /** + * @notice Checks if the account should be allowed to redeem tokens in the given market + * @param vToken The market to verify the redeem against + * @param redeemer The account which would redeem the tokens + * @param redeemTokens The number of vTokens to exchange for the underlying asset in the market + * @return 0 if the redeem is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) + */ + function redeemAllowed(address vToken, address redeemer, uint redeemTokens) external returns (uint) { + LibAccessCheck.checkProtocolPauseState(); + LibAccessCheck.checkActionPauseState(vToken, Action.REDEEM); + + uint allowed = LibHelper.redeemAllowedInternal(vToken, redeemer, redeemTokens); + if (allowed != uint(Error.NO_ERROR)) { + return allowed; + } + + // Keep the flywheel moving + LibHelper.updateVenusSupplyIndex(vToken); + LibHelper.distributeSupplierVenus(vToken, redeemer); + + return uint(Error.NO_ERROR); + } + + /** + * @notice Validates redeem and reverts on rejection. May emit logs. + * @param vToken Asset being redeemed + * @param redeemer The address redeeming the tokens + * @param redeemAmount The amount of the underlying asset being redeemed + * @param redeemTokens The number of tokens being redeemed + */ + // solhint-disable-next-line no-unused-vars + function redeemVerify(address vToken, address redeemer, uint redeemAmount, uint redeemTokens) external { + require(redeemTokens != 0 || redeemAmount == 0, "redeemTokens zero"); + } + + /** + * @notice Checks if the account should be allowed to borrow the underlying asset of the given market + * @param vToken The market to verify the borrow against + * @param borrower The account which would borrow the asset + * @param borrowAmount The amount of underlying the account would borrow + * @return 0 if the borrow is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) + */ + function borrowAllowed(address vToken, address borrower, uint borrowAmount) external returns (uint) { + // Pausing is a very serious situation - we revert to sound the alarms + LibAccessCheck.checkProtocolPauseState(); + LibAccessCheck.checkActionPauseState(vToken, Action.BORROW); + + LibAccessCheck.ensureListed(s.markets[vToken]); + + if (!s.markets[vToken].accountMembership[borrower]) { + // only vTokens may call borrowAllowed if borrower not in market + require(msg.sender == vToken, "sender must be vToken"); + + // attempt to add borrower to the market + Error err = LibHelper.addToMarketInternal(VToken(vToken), borrower); + if (err != Error.NO_ERROR) { + return uint(err); + } + } + + if (oracle.getUnderlyingPrice(VToken(vToken)) == 0) { + return uint(Error.PRICE_ERROR); + } + + uint borrowCap = borrowCaps[vToken]; + // Borrow cap of 0 corresponds to unlimited borrowing + if (borrowCap != 0) { + uint nextTotalBorrows = add_(VToken(vToken).totalBorrows(), borrowAmount); + require(nextTotalBorrows < borrowCap, "market borrow cap reached"); + } + + (Error err, , uint shortfall) = LibHelper.getHypotheticalAccountLiquidityInternal( + borrower, + VToken(vToken), + 0, + borrowAmount + ); + if (err != Error.NO_ERROR) { + return uint(err); + } + if (shortfall != 0) { + return uint(Error.INSUFFICIENT_LIQUIDITY); + } + + // Keep the flywheel moving + Exp memory borrowIndex = Exp({ mantissa: VToken(vToken).borrowIndex() }); + LibHelper.updateVenusBorrowIndex(vToken, borrowIndex); + LibHelper.distributeBorrowerVenus(vToken, borrower, borrowIndex); + + return uint(Error.NO_ERROR); + } + + /** + * @notice Validates borrow and reverts on rejection. May emit logs. + * @param vToken Asset whose underlying is being borrowed + * @param borrower The address borrowing the underlying + * @param borrowAmount The amount of the underlying asset requested to borrow + */ + // solhint-disable-next-line no-unused-vars + function borrowVerify(address vToken, address borrower, uint borrowAmount) external {} + + /** + * @notice Checks if the account should be allowed to repay a borrow in the given market + * @param vToken The market to verify the repay against + * @param payer The account which would repay the asset + * @param borrower The account which borrowed the asset + * @param repayAmount The amount of the underlying asset the account would repay + * @return 0 if the repay is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) + */ + function repayBorrowAllowed( + address vToken, + // solhint-disable-next-line no-unused-vars + address payer, + address borrower, + // solhint-disable-next-line no-unused-vars + uint repayAmount + ) external returns (uint) { + LibAccessCheck.checkProtocolPauseState(); + LibAccessCheck.checkActionPauseState(vToken, Action.REPAY); + LibAccessCheck.ensureListed(s.markets[vToken]); + + // Keep the flywheel moving + Exp memory borrowIndex = Exp({ mantissa: VToken(vToken).borrowIndex() }); + LibHelper.updateVenusBorrowIndex(vToken, borrowIndex); + LibHelper.distributeBorrowerVenus(vToken, borrower, borrowIndex); + + return uint(Error.NO_ERROR); + } + + /** + * @notice Validates repayBorrow and reverts on rejection. May emit logs. + * @param vToken Asset being repaid + * @param payer The address repaying the borrow + * @param borrower The address of the borrower + * @param actualRepayAmount The amount of underlying being repaid + */ + function repayBorrowVerify( + address vToken, + address payer, + address borrower, + uint actualRepayAmount, + uint borrowerIndex + ) external {} + + /** + * @notice Checks if the liquidation should be allowed to occur + * @param vTokenBorrowed Asset which was borrowed by the borrower + * @param vTokenCollateral Asset which was used as collateral and will be seized + * @param liquidator The address repaying the borrow and seizing the collateral + * @param borrower The address of the borrower + * @param repayAmount The amount of underlying being repaid + */ + function liquidateBorrowAllowed( + address vTokenBorrowed, + address vTokenCollateral, + address liquidator, + address borrower, + uint repayAmount + ) external returns (uint) { + LibAccessCheck.checkProtocolPauseState(); + + // if we want to pause liquidating to vTokenCollateral, we should pause seizing + LibAccessCheck.checkActionPauseState(vTokenBorrowed, Action.LIQUIDATE); + + if (s.liquidatorContract != address(0) && liquidator != s.liquidatorContract) { + return uint(Error.UNAUTHORIZED); + } + + LibAccessCheck.ensureListed(s.markets[vTokenCollateral]); + if (address(vTokenBorrowed) != address(vaiController)) { + LibAccessCheck.ensureListed(s.markets[vTokenBorrowed]); + } + + /* The borrower must have shortfall in order to be liquidatable */ + (Error err, , uint shortfall) = LibHelper.getHypotheticalAccountLiquidityInternal(borrower, VToken(0), 0, 0); + if (err != Error.NO_ERROR) { + return uint(err); + } + if (shortfall == 0) { + return uint(Error.INSUFFICIENT_SHORTFALL); + } + + /* The liquidator may not repay more than what is allowed by the closeFactor */ + uint borrowBalance; + if (address(vTokenBorrowed) != address(vaiController)) { + borrowBalance = VToken(vTokenBorrowed).borrowBalanceStored(borrower); + } else { + borrowBalance = vaiController.getVAIRepayAmount(borrower); + } + //-- maxClose = multipy of closeFactorMantissa and borrowBalance + if (repayAmount > mul_ScalarTruncate(Exp({ mantissa: closeFactorMantissa }), borrowBalance)) { + return uint(Error.TOO_MUCH_REPAY); + } + + return uint(Error.NO_ERROR); + } + + function liquidateBorrowVerify( + address vTokenBorrowed, + address vTokenCollateral, + address liquidator, + address borrower, + uint actualRepayAmount, + uint seizeTokens + ) external {} + + /** + * @notice Checks if the seizing of assets should be allowed to occur + * @param vTokenCollateral Asset which was used as collateral and will be seized + * @param vTokenBorrowed Asset which was borrowed by the borrower + * @param liquidator The address repaying the borrow and seizing the collateral + * @param borrower The address of the borrower + * @param seizeTokens The number of collateral tokens to seize + */ + function seizeAllowed( + address vTokenCollateral, + address vTokenBorrowed, + address liquidator, + address borrower, + uint seizeTokens // solhint-disable-line no-unused-vars + ) external returns (uint) { + // Pausing is a very serious situation - we revert to sound the alarms + LibAccessCheck.checkProtocolPauseState(); + LibAccessCheck.checkActionPauseState(vTokenCollateral, Action.SEIZE); + + // We've added VAIController as a borrowed token list check for seize + LibAccessCheck.ensureListed(s.markets[vTokenCollateral]); + if (address(vTokenBorrowed) != address(vaiController)) { + LibAccessCheck.ensureListed(s.markets[vTokenBorrowed]); + } + + if (VToken(vTokenCollateral).comptroller() != VToken(vTokenBorrowed).comptroller()) { + return uint(Error.COMPTROLLER_MISMATCH); + } + + // Keep the flywheel moving + LibHelper.updateVenusSupplyIndex(vTokenCollateral); + LibHelper.distributeSupplierVenus(vTokenCollateral, borrower); + LibHelper.distributeSupplierVenus(vTokenCollateral, liquidator); + + return uint(Error.NO_ERROR); + } + + /** + * @notice Validates seize and reverts on rejection. May emit logs. + * @param vTokenCollateral Asset which was used as collateral and will be seized + * @param vTokenBorrowed Asset which was borrowed by the borrower + * @param liquidator The address repaying the borrow and seizing the collateral + * @param borrower The address of the borrower + * @param seizeTokens The number of collateral tokens to seize + */ + // solhint-disable-next-line no-unused-vars + function seizeVerify( + address vTokenCollateral, + address vTokenBorrowed, + address liquidator, + address borrower, + uint seizeTokens + ) external {} + + /** + * @notice Checks if the account should be allowed to transfer tokens in the given market + * @param vToken The market to verify the transfer against + * @param src The account which sources the tokens + * @param dst The account which receives the tokens + * @param transferTokens The number of vTokens to transfer + * @return 0 if the transfer is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) + */ + function transferAllowed(address vToken, address src, address dst, uint transferTokens) external returns (uint) { + // Pausing is a very serious situation - we revert to sound the alarms + LibAccessCheck.checkProtocolPauseState(); + LibAccessCheck.checkActionPauseState(vToken, Action.TRANSFER); + + // Currently the only consideration is whether or not + // the src is allowed to redeem this many tokens + uint allowed = LibHelper.redeemAllowedInternal(vToken, src, transferTokens); + if (allowed != uint(Error.NO_ERROR)) { + return allowed; + } + + // Keep the flywheel moving + LibHelper.updateVenusSupplyIndex(vToken); + LibHelper.distributeSupplierVenus(vToken, src); + LibHelper.distributeSupplierVenus(vToken, dst); + + return uint(Error.NO_ERROR); + } + + /** + * @notice Validates transfer and reverts on rejection. May emit logs. + * @param vToken Asset being transferred + * @param src The account which sources the tokens + * @param dst The account which receives the tokens + * @param transferTokens The number of vTokens to transfer + */ + // solhint-disable-next-line no-unused-vars + function transferVerify(address vToken, address src, address dst, uint transferTokens) external {} + + /** + * @notice Determine the current account liquidity wrt collateral requirements + * @return (possible error code (semi-opaque), + account liquidity in excess of collateral requirements, + * account shortfall below collateral requirements) + */ + function getAccountLiquidity(address account) external view returns (uint, uint, uint) { + (Error err, uint liquidity, uint shortfall) = LibHelper.getHypotheticalAccountLiquidityInternal( + account, + VToken(0), + 0, + 0 + ); + + return (uint(err), liquidity, shortfall); + } + + /** + * @notice Determine the current account liquidity wrt collateral requirements + * @return (possible error code (semi-opaque), + account liquidity in excess of collateral requirements, + * account shortfall below collateral requirements) + */ + function getAccountLiquidity(address account) external view returns (uint, uint, uint) { + (Error err, uint liquidity, uint shortfall) = LibHelper.getHypotheticalAccountLiquidityInternal( + account, + VToken(0), + 0, + 0 + ); + + return (uint(err), liquidity, shortfall); + } + + // setter functionality + /** + * @notice Set XVS speed for a single market + * @param vTokens The market whose XVS speed to update + * @param supplySpeeds New XVS speed for supply + * @param borrowSpeeds New XVS speed for borrow + */ + function _setVenusSpeeds( + VToken[] calldata vTokens, + uint[] calldata supplySpeeds, + uint[] calldata borrowSpeeds + ) external { + LibAccessCheck.ensureAdminOr(comptrollerImplementation); + + uint numTokens = vTokens.length; + require( + numTokens == supplySpeeds.length && numTokens == borrowSpeeds.length, + "Comptroller::_setVenusSpeeds invalid input" + ); + + for (uint i; i < numTokens; ++i) { + LibAccessCheck.ensureNonzeroAddress(address(vTokens[i])); + setVenusSpeedInternal(vTokens[i], supplySpeeds[i], borrowSpeeds[i]); + } + } + + function setVenusSpeedInternal(VToken vToken, uint supplySpeed, uint borrowSpeed) internal { + LibAccessCheck.ensureListed(s.markets[address(vToken)]); + + if (venusSupplySpeeds[address(vToken)] != supplySpeed) { + // Supply speed updated so let's update supply state to ensure that + // 1. XVS accrued properly for the old speed, and + // 2. XVS accrued at the new speed starts after this block. + + LibHelper.updateVenusSupplyIndex(address(vToken)); + // Update speed and emit event + LibHelper.venusSupplySpeeds[address(vToken)] = supplySpeed; + emit VenusSupplySpeedUpdated(vToken, supplySpeed); + } + + if (LibHelper.venusBorrowSpeeds[address(vToken)] != borrowSpeed) { + // Borrow speed updated so let's update borrow state to ensure that + // 1. XVS accrued properly for the old speed, and + // 2. XVS accrued at the new speed starts after this block. + Exp memory borrowIndex = Exp({ mantissa: vToken.borrowIndex() }); + updateVenusBorrowIndex(address(vToken), borrowIndex); + + // Update speed and emit event + LibHelper.venusBorrowSpeeds[address(vToken)] = borrowSpeed; + emit VenusBorrowSpeedUpdated(vToken, borrowSpeed); + } + } +} diff --git a/contracts/Diamond/facets/RewardFacet.sol b/contracts/Diamond/facets/RewardFacet.sol index ca9b50bf0..1daa13eb3 100644 --- a/contracts/Diamond/facets/RewardFacet.sol +++ b/contracts/Diamond/facets/RewardFacet.sol @@ -1,10 +1,12 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../../Oracle/PriceOracle.sol"; import "../../Tokens/VTokens/VToken.sol"; import "../../Utils/ErrorReporter.sol"; import "../../Tokens/XVS/XVS.sol"; import "../../Tokens/VAI/VAI.sol"; +import "../libraries/LibAccessCheck.sol"; +import "../libraries/LibHelper.sol"; import "../libraries/appStorage.sol"; import "../../Governance/IAccessControlManager.sol"; @@ -53,7 +55,7 @@ contract RewardFacet is ComptrollerErrorReporter, ExponentialNoError { function claimVenusAsCollateral(address holder) external { address[] memory holders = new address[](1); holders[0] = holder; - claimVenus(holders, allMarkets, true, true, true); + claimVenus(holders, s.allMarkets, true, true, true); } /** @@ -111,7 +113,7 @@ contract RewardFacet is ComptrollerErrorReporter, ExponentialNoError { * @param amount The amount of XVS to (possibly) transfer */ function _grantXVS(address recipient, uint amount) external { - ensureAdminOr(s.comptrollerImplementation); + LibAccessCheck.ensureAdminOr(comptrollerImplementation); uint amountLeft = grantXVSInternal(recipient, amount, 0, false); require(amountLeft == 0, "insufficient xvs for grant"); emit VenusGranted(recipient, amount); @@ -164,9 +166,9 @@ contract RewardFacet is ComptrollerErrorReporter, ExponentialNoError { } uint256 actualAmount; - uint256 deltaBlocks = sub_(getBlockNumber(), s.releaseStartBlock); + uint256 deltaBlocks = sub_(getBlockNumber(), releaseStartBlock); // releaseAmount = venusVAIVaultRate * deltaBlocks - uint256 _releaseAmount = mul_(s.venusVAIVaultRate, deltaBlocks); + uint256 _releaseAmount = mul_(venusVAIVaultRate, deltaBlocks); if (xvsBalance >= _releaseAmount) { actualAmount = _releaseAmount; @@ -174,7 +176,7 @@ contract RewardFacet is ComptrollerErrorReporter, ExponentialNoError { actualAmount = xvsBalance; } - if (actualAmount < s.minReleaseAmount) { + if (actualAmount < minReleaseAmount) { return; } @@ -205,18 +207,18 @@ contract RewardFacet is ComptrollerErrorReporter, ExponentialNoError { uint256 holdersLength = holders.length; for (uint i; i < vTokens.length; ++i) { VToken vToken = vTokens[i]; - ensureListed(markets[address(vToken)]); + LibAccessCheck.ensureListed(markets[address(vToken)]); if (borrowers) { Exp memory borrowIndex = Exp({ mantissa: vToken.borrowIndex() }); - updateVenusBorrowIndex(address(vToken), borrowIndex); + LibHelper.updateVenusBorrowIndex(address(vToken), borrowIndex); for (j = 0; j < holdersLength; ++j) { - distributeBorrowerVenus(address(vToken), holders[j], borrowIndex); + LibHelper.distributeBorrowerVenus(address(vToken), holders[j], borrowIndex); } } if (suppliers) { - updateVenusSupplyIndex(address(vToken)); + LibHelper.updateVenusSupplyIndex(address(vToken)); for (j = 0; j < holdersLength; ++j) { - distributeSupplierVenus(address(vToken), holders[j]); + LibHelper.distributeSupplierVenus(address(vToken), holders[j]); } } } @@ -225,8 +227,8 @@ contract RewardFacet is ComptrollerErrorReporter, ExponentialNoError { address holder = holders[j]; // If there is a positive shortfall, the XVS reward is accrued, // but won't be granted to this holder - (, , uint shortfall) = getHypotheticalAccountLiquidityInternal(holder, VToken(0), 0, 0); - s.venusAccrued[holder] = grantXVSInternal(holder, venusAccrued[holder], shortfall, collateral); + (, , uint shortfall) = LibHelper.getHypotheticalAccountLiquidityInternal(holder, VToken(0), 0, 0); + s.venusAccrued[holder] = grantXVSInternal(holder, s.venusAccrued[holder], shortfall, collateral); } } } diff --git a/contracts/Diamond/facets/SetterFacet.sol b/contracts/Diamond/facets/SetterFacet.sol index 62bf3d598..1d479ff2a 100644 --- a/contracts/Diamond/facets/SetterFacet.sol +++ b/contracts/Diamond/facets/SetterFacet.sol @@ -1,14 +1,17 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../../Oracle/PriceOracle.sol"; import "../../Tokens/VTokens/VToken.sol"; import "../../Utils/ErrorReporter.sol"; import "../../Tokens/XVS/XVS.sol"; import "../../Tokens/VAI/VAI.sol"; +import "../libraries/appStorage.sol"; import "../../Governance/IAccessControlManager.sol"; import "../libraries/LibAccessCheck.sol"; contract SetterFacet is AppStorage, ComptrollerErrorReporter, ExponentialNoError { +contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError { + AppStorage internal s; /// @notice Emitted when close factor is changed by admin event NewCloseFactor(uint oldCloseFactorMantissa, uint newCloseFactorMantissa); @@ -60,9 +63,6 @@ contract SetterFacet is AppStorage, ComptrollerErrorReporter, ExponentialNoError /// @notice Emitted when an action is paused on a market event ActionPausedMarket(VToken indexed vToken, Action indexed action, bool pauseState); - /// @notice Emitted when prime token contract address is changed - event NewPrimeToken(IPrime oldPrimeToken, IPrime newPrimeToken); - /// @notice Emitted when VAI Vault info is changed event NewVAIVaultInfo(address vault_, uint releaseStartBlock_, uint releaseInterval_); @@ -80,11 +80,12 @@ contract SetterFacet is AppStorage, ComptrollerErrorReporter, ExponentialNoError LibAccessCheck.ensureNonzeroAddress(address(newOracle)); // Track the old oracle for the comptroller - PriceOracle oldOracle = oracle; + PriceOracle oldOracle = s.oracle; // Set comptroller's oracle to newOracle oracle = newOracle; oracle = newOracle; + s.oracle = newOracle; // Emit NewPriceOracle(oldOracle, newOracle) emit NewPriceOracle(oldOracle, newOracle); @@ -100,7 +101,7 @@ contract SetterFacet is AppStorage, ComptrollerErrorReporter, ExponentialNoError */ function _setCloseFactor(uint newCloseFactorMantissa) external returns (uint) { // Check caller is admin - ensureAdmin(); + LibAccessCheck.ensureAdmin(); uint oldCloseFactorMantissa = s.closeFactorMantissa; uint oldCloseFactorMantissa = s.closeFactorMantissa; @@ -118,8 +119,8 @@ contract SetterFacet is AppStorage, ComptrollerErrorReporter, ExponentialNoError */ function _setAccessControl(address newAccessControlAddress) external returns (uint) { // Check caller is admin - ensureAdmin(); - ensureNonzeroAddress(newAccessControlAddress); + LibAccessCheck.ensureAdmin(); + LibAccessCheck.ensureNonzeroAddress(newAccessControlAddress); address oldAccessControlAddress = s.accessControl; address oldAccessControlAddress = s.accessControl; @@ -138,16 +139,16 @@ contract SetterFacet is AppStorage, ComptrollerErrorReporter, ExponentialNoError */ function _setCollateralFactor(VToken vToken, uint newCollateralFactorMantissa) external returns (uint) { // Check caller is allowed by access control manager - ensureAllowed("_setCollateralFactor(address,uint256)"); - ensureNonzeroAddress(address(vToken)); + LibAccessCheck.ensureAllowed("_setCollateralFactor(address,uint256)"); + LibAccessCheck.ensureNonzeroAddress(address(vToken)); // Verify market is listed - Market storage market = markets[address(vToken)]; - ensureListed(market); + Market storage market = s.markets[address(vToken)]; + LibAccessCheck.ensureListed(market); Exp memory newCollateralFactorExp = Exp({ mantissa: newCollateralFactorMantissa }); - // Check collateral factor <= 0.9 + //-- Check collateral factor <= 0.9 Exp memory highLimit = Exp({ mantissa: collateralFactorMaxMantissa }); if (lessThanExp(highLimit, newCollateralFactorExp)) { return fail(Error.INVALID_COLLATERAL_FACTOR, FailureInfo.SET_COLLATERAL_FACTOR_VALIDATION); @@ -175,7 +176,7 @@ contract SetterFacet is AppStorage, ComptrollerErrorReporter, ExponentialNoError * @return uint 0=success, otherwise a failure. (See ErrorReporter for details) */ function _setLiquidationIncentive(uint newLiquidationIncentiveMantissa) external returns (uint) { - ensureAllowed("_setLiquidationIncentive(uint256)"); + LibAccessCheck.ensureAllowed("_setLiquidationIncentive(uint256)"); require(newLiquidationIncentiveMantissa >= 1e18, "incentive must be over 1e18"); @@ -209,8 +210,8 @@ contract SetterFacet is AppStorage, ComptrollerErrorReporter, ExponentialNoError * @return uint 0=success, otherwise a failure. (See enum Error for details) */ function _setPauseGuardian(address newPauseGuardian) external returns (uint) { - ensureAdmin(); - ensureNonzeroAddress(newPauseGuardian); + LibAccessCheck.ensureAdmin(); + LibAccessCheck.ensureNonzeroAddress(newPauseGuardian); // Save current value for inclusion in log address oldPauseGuardian = s.pauseGuardian; @@ -232,7 +233,7 @@ contract SetterFacet is AppStorage, ComptrollerErrorReporter, ExponentialNoError * @param newBorrowCaps The new borrow cap values in underlying to be set. A value of 0 corresponds to unlimited borrowing. */ function _setMarketBorrowCaps(VToken[] calldata vTokens, uint[] calldata newBorrowCaps) external { - ensureAllowed("_setMarketBorrowCaps(address[],uint256[])"); + LibAccessCheck.ensureAllowed("_setMarketBorrowCaps(address[],uint256[])"); uint numMarkets = vTokens.length; uint numBorrowCaps = newBorrowCaps.length; @@ -253,7 +254,7 @@ contract SetterFacet is AppStorage, ComptrollerErrorReporter, ExponentialNoError * @param newSupplyCaps The new supply cap values in underlying to be set. A value of 0 corresponds to Minting NotAllowed. */ function _setMarketSupplyCaps(VToken[] calldata vTokens, uint256[] calldata newSupplyCaps) external { - ensureAllowed("_setMarketSupplyCaps(address[],uint256[])"); + LibAccessCheck.ensureAllowed("_setMarketSupplyCaps(address[],uint256[])"); uint numMarkets = vTokens.length; uint numSupplyCaps = newSupplyCaps.length; @@ -271,7 +272,7 @@ contract SetterFacet is AppStorage, ComptrollerErrorReporter, ExponentialNoError * @notice Set whole protocol pause/unpause state */ function _setProtocolPaused(bool state) external returns (bool) { - ensureAllowed("_setProtocolPaused(bool)"); + LibAccessCheck.ensureAllowed("_setProtocolPaused(bool)"); s.protocolPaused = state; s.protocolPaused = state; @@ -286,13 +287,13 @@ contract SetterFacet is AppStorage, ComptrollerErrorReporter, ExponentialNoError * @param paused The new paused state (true=paused, false=unpaused) */ function _setActionsPaused(address[] calldata markets, Action[] calldata actions, bool paused) external { - ensureAllowed("_setActionsPaused(address[],uint256[],bool)"); + LibAccessCheck.ensureAllowed("_setActionsPaused(address[],uint256[],bool)"); - uint256 numMarkets = markets.length; + uint256 numMarkets = s.markets.length; uint256 numActions = actions.length; for (uint marketIdx; marketIdx < numMarkets; ++marketIdx) { for (uint actionIdx; actionIdx < numActions; ++actionIdx) { - setActionPausedInternal(markets[marketIdx], actions[actionIdx], paused); + setActionPausedInternal(s.markets[marketIdx], actions[actionIdx], paused); } } } @@ -306,6 +307,7 @@ contract SetterFacet is AppStorage, ComptrollerErrorReporter, ExponentialNoError function setActionPausedInternal(address market, Action action, bool paused) internal { ensureListed(markets[market]); s._actionPaused[market][uint(action)] = paused; + LibAccessCheck.ensureListed(markets[market]); s._actionPaused[market][uint(action)] = paused; emit ActionPausedMarket(VToken(market), action, paused); } @@ -317,13 +319,15 @@ contract SetterFacet is AppStorage, ComptrollerErrorReporter, ExponentialNoError */ function _setVAIController(VAIControllerInterface vaiController_) external returns (uint) { // Check caller is admin - ensureAdmin(); - ensureNonzeroAddress(address(vaiController_)); + LibAccessCheck.ensureAdmin(); + LibAccessCheck.ensureNonzeroAddress(address(vaiController_)); VAIControllerInterface oldVaiController = s.vaiController; s.vaiController = vaiController_; VAIControllerInterface oldVaiController = s.vaiController; s.vaiController = vaiController_; + VAIControllerInterface oldVaiController = s.vaiController; + vaiController = vaiController_; emit NewVAIController(oldVaiController, vaiController_); return uint(Error.NO_ERROR); @@ -335,6 +339,8 @@ contract SetterFacet is AppStorage, ComptrollerErrorReporter, ExponentialNoError uint oldVAIMintRate = s.vaiMintRate; s.vaiMintRate = newVAIMintRate; uint oldVAIMintRate = s.vaiMintRate; + LibAccessCheck.ensureAdmin(); + uint oldVAIMintRate = vaiMintRate; s.vaiMintRate = newVAIMintRate; emit NewVAIMintRate(oldVAIMintRate, newVAIMintRate); @@ -348,7 +354,7 @@ contract SetterFacet is AppStorage, ComptrollerErrorReporter, ExponentialNoError * @return The number of minted VAI by `owner` */ function setMintedVAIOf(address owner, uint amount) external returns (uint) { - checkProtocolPauseState(); + LibAccessCheck.checkProtocolPauseState(); // Pausing is a very serious situation - we revert to sound the alarms require(!mintVAIGuardianPaused && !repayVAIGuardianPaused, "VAI is paused"); @@ -368,11 +374,11 @@ contract SetterFacet is AppStorage, ComptrollerErrorReporter, ExponentialNoError uint newTreasuryPercent ) external returns (uint) { // Check caller is admin - ensureAdminOr(treasuryGuardian); + LibAccessCheck.ensureAdminOr(treasuryGuardian); require(newTreasuryPercent < 1e18, "treasury percent cap overflow"); - ensureNonzeroAddress(newTreasuryGuardian); - ensureNonzeroAddress(newTreasuryAddress); + LibAccessCheck.ensureNonzeroAddress(newTreasuryGuardian); + LibAccessCheck.ensureNonzeroAddress(newTreasuryAddress); address oldTreasuryGuardian = s.treasuryGuardian; address oldTreasuryAddress = s.treasuryAddress; @@ -410,19 +416,22 @@ contract SetterFacet is AppStorage, ComptrollerErrorReporter, ExponentialNoError ensureNonzeroAddress(address(comptrollerLens_)); address oldComptrollerLens = address(s.comptrollerLens); s.comptrollerLens = comptrollerLens_; + LibAccessCheck.ensureAdmin(); + LibAccessCheck.ensureNonzeroAddress(address(comptrollerLens_)); address oldComptrollerLens = address(s.comptrollerLens); s.comptrollerLens = comptrollerLens_; - emit NewComptrollerLens(oldComptrollerLens, address(comptrollerLens)); + emit NewComptrollerLens(oldComptrollerLens, address(s.comptrollerLens)); return uint(Error.NO_ERROR); } + /** /** * @notice Set the amount of XVS distributed per block to VAI Vault * @param venusVAIVaultRate_ The amount of XVS wei per block to distribute to VAI Vault */ function _setVenusVAIVaultRate(uint venusVAIVaultRate_) external { - ensureAdmin(); + LibAccessCheck.ensureAdmin(); uint oldVenusVAIVaultRate = s.venusVAIVaultRate; s.venusVAIVaultRate = venusVAIVaultRate_; @@ -438,8 +447,8 @@ contract SetterFacet is AppStorage, ComptrollerErrorReporter, ExponentialNoError * @param minReleaseAmount_ The minimum release amount to VAI Vault */ function _setVAIVaultInfo(address vault_, uint256 releaseStartBlock_, uint256 minReleaseAmount_) external { - ensureAdmin(); - ensureNonzeroAddress(vault_); + LibAccessCheck.ensureAdmin(); + LibAccessCheck.ensureNonzeroAddress(vault_); s.vaiVaultAddress = vault_; s.releaseStartBlock = releaseStartBlock_; @@ -450,3 +459,4 @@ contract SetterFacet is AppStorage, ComptrollerErrorReporter, ExponentialNoError emit NewVAIVaultInfo(vault_, releaseStartBlock_, minReleaseAmount_); } } +} diff --git a/contracts/Diamond/interfaces/IDiamondCut.sol b/contracts/Diamond/interfaces/IDiamondCut.sol index beff9a16c..7869ea4d0 100644 --- a/contracts/Diamond/interfaces/IDiamondCut.sol +++ b/contracts/Diamond/interfaces/IDiamondCut.sol @@ -1,10 +1,4 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/******************************************************************************\ -* Author: Nick Mudge (https://twitter.com/mudgen) -* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535 -/******************************************************************************/ +pragma solidity 0.8.13; interface IDiamondCut { enum FacetCutAction { diff --git a/contracts/Diamond/interfaces/IDiamondLoupe.sol b/contracts/Diamond/interfaces/IDiamondLoupe.sol new file mode 100644 index 000000000..36e8aadf1 --- /dev/null +++ b/contracts/Diamond/interfaces/IDiamondLoupe.sol @@ -0,0 +1,30 @@ +pragma solidity 0.8.13; + +interface IDiamondLoupe { + /// These functions are expected to be called frequently + /// by tools. + + struct Facet { + address facetAddress; + bytes4[] functionSelectors; + } + + /// @notice Gets all facet addresses and their four byte function selectors. + /// @return facets_ Facet + function facets() external view returns (Facet[] memory facets_); + + /// @notice Gets all the function selectors supported by a specific facet. + /// @param _facet The facet address. + /// @return facetFunctionSelectors_ + function facetFunctionSelectors(address _facet) external view returns (bytes4[] memory facetFunctionSelectors_); + + /// @notice Get all the facet addresses used by a diamond. + /// @return facetAddresses_ + function facetAddresses() external view returns (address[] memory facetAddresses_); + + /// @notice Gets the facet that supports the given selector. + /// @dev If facet is not found return address(0). + /// @param _functionSelector The function selector. + /// @return facetAddress_ The facet address. + function facetAddress(bytes4 _functionSelector) external view returns (address facetAddress_); +} diff --git a/contracts/Diamond/libraries/LibAccessCheck.sol b/contracts/Diamond/libraries/LibAccessCheck.sol index 91b52f2c2..7c097dc74 100644 --- a/contracts/Diamond/libraries/LibAccessCheck.sol +++ b/contracts/Diamond/libraries/LibAccessCheck.sol @@ -1,8 +1,25 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../../Governance/IAccessControlManager.sol"; +import "../../Tokens/VTokens/VToken.sol"; library LibAccessCheck { + enum Action { + MINT, + REDEEM, + BORROW, + REPAY, + SEIZE, + LIQUIDATE, + TRANSFER, + ENTER_MARKET, + EXIT_MARKET + } + +<<<<<<< HEAD +library LibAccessCheck { +======= +>>>>>>> cdc8bda (Added Policy and Market Facet) /// @notice Reverts if the protocol is paused function checkProtocolPauseState() internal view { require(!protocolPaused, "protocol is paused"); @@ -55,4 +72,12 @@ library LibAccessCheck { function actionPaused(address market, Action action) public view returns (bool) { return _actionPaused[market][uint(action)]; } +<<<<<<< HEAD +======= + + function getBlockNumber() public view returns (uint) { + return block.number; + } +>>>>>>> cdc8bda (Added Policy and Market Facet) } + diff --git a/contracts/Diamond/libraries/LibDiamond.sol b/contracts/Diamond/libraries/LibDiamond.sol index 5b08b1316..d079beed7 100644 --- a/contracts/Diamond/libraries/LibDiamond.sol +++ b/contracts/Diamond/libraries/LibDiamond.sol @@ -1,10 +1,6 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; +pragma solidity 0.8.13; + -/******************************************************************************\ -* Author: Nick Mudge (https://twitter.com/mudgen) -* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535 -/******************************************************************************/ import { IDiamondCut } from "../interfaces/IDiamondCut.sol"; // Remember to add the loupe functions from DiamondLoupeFacet to the diamond. diff --git a/contracts/Diamond/libraries/LibHelper.sol b/contracts/Diamond/libraries/LibHelper.sol index 9a93b3313..29972ae6f 100644 --- a/contracts/Diamond/libraries/LibHelper.sol +++ b/contracts/Diamond/libraries/LibHelper.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16 +pragma solidity 0.8.13; import "../../Tokens/VTokens/VToken.sol"; library LibHelper { diff --git a/contracts/Diamond/libraries/appStorage.sol b/contracts/Diamond/libraries/appStorage.sol index 4d5065487..1899bd408 100644 --- a/contracts/Diamond/libraries/appStorage.sol +++ b/contracts/Diamond/libraries/appStorage.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.8.0; +pragma solidity 0.8.13; import "../../Tokens/VTokens/VToken.sol"; import "../../Oracle/PriceOracle.sol"; @@ -19,7 +19,26 @@ struct Market { /// @notice Whether or not this market receives XVS bool isVenus; } + /// @notice Whether or not this market is listed + bool isListed; + /** + * @notice Multiplier representing the most one can borrow against their collateral in this market. + * For instance, 0.9 to allow borrowing 90% of collateral value. + * Must be between 0 and 1, and stored as a mantissa. + */ + uint collateralFactorMantissa; + /// @notice Per-market mapping of "accounts in this asset" + mapping(address => bool) accountMembership; + /// @notice Whether or not this market receives XVS + bool isVenus; +} +struct VenusMarketState { + /// @notice The market's last updated venusBorrowIndex or venusSupplyIndex + uint224 index; + /// @notice The block number the index was last updated at + uint32 block; +} struct VenusMarketState { /// @notice The market's last updated venusBorrowIndex or venusSupplyIndex uint224 index; @@ -119,6 +138,7 @@ struct AppStorage { /// @notice The rate at which the flywheel distributes XVS to VAI Minters, per block (deprecated) uint venusVAIRate; /// @notice The rate at which the flywheel distributes XVS to VAI Vault, per block + /// @notice The rate at which the flywheel distributes XVS to VAI Vault, per block uint venusVAIVaultRate; // address of VAI Vault address vaiVaultAddress; @@ -149,11 +169,10 @@ struct AppStorage { /// @notice True if a certain action is paused on a certain market mapping(address => mapping(uint => bool)) _actionPaused; /// @notice The rate at which venus is distributed to the corresponding borrow market (per block) + /// @notice The rate at which venus is distributed to the corresponding borrow market (per block) mapping(address => uint) venusBorrowSpeeds; /// @notice The rate at which venus is distributed to the corresponding supply market (per block) mapping(address => uint) venusSupplySpeeds; - /// @notice Prime token address - IPrime prime; } library LibAppStorage { @@ -167,3 +186,4 @@ library LibAppStorage { return uint256(x >= 0 ? x : -x); } } + From 8f865617c08bf0023b3698c8be66de127073e23e Mon Sep 17 00:00:00 2001 From: defcon022 Date: Tue, 7 Mar 2023 17:24:52 +0530 Subject: [PATCH 008/153] lint fix. --- contracts/Diamond/libraries/LibAccessCheck.sol | 7 +------ contracts/Diamond/libraries/LibDiamond.sol | 1 - contracts/Diamond/libraries/LibHelper.sol | 7 ++----- 3 files changed, 3 insertions(+), 12 deletions(-) diff --git a/contracts/Diamond/libraries/LibAccessCheck.sol b/contracts/Diamond/libraries/LibAccessCheck.sol index 7c097dc74..41b5ce68b 100644 --- a/contracts/Diamond/libraries/LibAccessCheck.sol +++ b/contracts/Diamond/libraries/LibAccessCheck.sol @@ -16,10 +16,7 @@ library LibAccessCheck { EXIT_MARKET } -<<<<<<< HEAD library LibAccessCheck { -======= ->>>>>>> cdc8bda (Added Policy and Market Facet) /// @notice Reverts if the protocol is paused function checkProtocolPauseState() internal view { require(!protocolPaused, "protocol is paused"); @@ -72,12 +69,10 @@ library LibAccessCheck { function actionPaused(address market, Action action) public view returns (bool) { return _actionPaused[market][uint(action)]; } -<<<<<<< HEAD -======= function getBlockNumber() public view returns (uint) { return block.number; } ->>>>>>> cdc8bda (Added Policy and Market Facet) + } diff --git a/contracts/Diamond/libraries/LibDiamond.sol b/contracts/Diamond/libraries/LibDiamond.sol index d079beed7..46d6e0e85 100644 --- a/contracts/Diamond/libraries/LibDiamond.sol +++ b/contracts/Diamond/libraries/LibDiamond.sol @@ -1,6 +1,5 @@ pragma solidity 0.8.13; - import { IDiamondCut } from "../interfaces/IDiamondCut.sol"; // Remember to add the loupe functions from DiamondLoupeFacet to the diamond. diff --git a/contracts/Diamond/libraries/LibHelper.sol b/contracts/Diamond/libraries/LibHelper.sol index 29972ae6f..93fef0c5d 100644 --- a/contracts/Diamond/libraries/LibHelper.sol +++ b/contracts/Diamond/libraries/LibHelper.sol @@ -2,8 +2,6 @@ pragma solidity 0.8.13; import "../../Tokens/VTokens/VToken.sol"; library LibHelper { - - /** * @notice Determine what the account liquidity would be if the given amounts were redeemed/borrowed * @param vTokenModify The market to hypothetically redeem/borrow in @@ -32,7 +30,7 @@ library LibHelper { return (Error(err), liquidity, shortfall); } - /** + /** * @notice Accrue XVS to the market by updating the supply index * @param vToken The market whose supply index to update */ @@ -201,5 +199,4 @@ library LibHelper { return uint(Error.NO_ERROR); } - -} \ No newline at end of file +} From 6cef23b8069fec8eb6f9d6f30264c3033f0d6207 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Tue, 7 Mar 2023 18:17:45 +0530 Subject: [PATCH 009/153] Added facet interface --- contracts/Diamond/facets/SetterFacet.sol | 1 - contracts/Diamond/interfaces/IMarketFacet.sol | 7 ++ contracts/Diamond/interfaces/IPloicyFacet.sol | 67 +++++++++++++++++++ .../Diamond/libraries/LibAccessCheck.sol | 1 - contracts/Diamond/libraries/LibHelper.sol | 67 +++++++++++++------ contracts/Diamond/libraries/appStorage.sol | 19 ------ 6 files changed, 119 insertions(+), 43 deletions(-) create mode 100644 contracts/Diamond/interfaces/IMarketFacet.sol create mode 100644 contracts/Diamond/interfaces/IPloicyFacet.sol diff --git a/contracts/Diamond/facets/SetterFacet.sol b/contracts/Diamond/facets/SetterFacet.sol index 1d479ff2a..323c0b646 100644 --- a/contracts/Diamond/facets/SetterFacet.sol +++ b/contracts/Diamond/facets/SetterFacet.sol @@ -9,7 +9,6 @@ import "../libraries/appStorage.sol"; import "../../Governance/IAccessControlManager.sol"; import "../libraries/LibAccessCheck.sol"; -contract SetterFacet is AppStorage, ComptrollerErrorReporter, ExponentialNoError { contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError { AppStorage internal s; /// @notice Emitted when close factor is changed by admin diff --git a/contracts/Diamond/interfaces/IMarketFacet.sol b/contracts/Diamond/interfaces/IMarketFacet.sol new file mode 100644 index 000000000..e821d11e5 --- /dev/null +++ b/contracts/Diamond/interfaces/IMarketFacet.sol @@ -0,0 +1,7 @@ +pragma solidity ^0.8.13; + +interface IMarketFacet { + function enterMarkets(address[] calldata vTokens) external returns (uint[] memory); + + function exitMarket(address vToken) external returns (uint); +} \ No newline at end of file diff --git a/contracts/Diamond/interfaces/IPloicyFacet.sol b/contracts/Diamond/interfaces/IPloicyFacet.sol new file mode 100644 index 000000000..593a2318d --- /dev/null +++ b/contracts/Diamond/interfaces/IPloicyFacet.sol @@ -0,0 +1,67 @@ +pragma solidity ^0.8.13; + +interface IPolicyFacet { + function mintAllowed(address vToken, address minter, uint mintAmount) external returns (uint); + + function mintVerify(address vToken, address minter, uint mintAmount, uint mintTokens) external; + + function redeemAllowed(address vToken, address redeemer, uint redeemTokens) external returns (uint); + + function redeemVerify(address vToken, address redeemer, uint redeemAmount, uint redeemTokens) external; + + function borrowAllowed(address vToken, address borrower, uint borrowAmount) external returns (uint); + + function borrowVerify(address vToken, address borrower, uint borrowAmount) external; + + function repayBorrowAllowed( + address vToken, + address payer, + address borrower, + uint repayAmount + ) external returns (uint); + + function repayBorrowVerify( + address vToken, + address payer, + address borrower, + uint repayAmount, + uint borrowerIndex + ) external; + + function liquidateBorrowAllowed( + address vTokenBorrowed, + address vTokenCollateral, + address liquidator, + address borrower, + uint repayAmount + ) external returns (uint); + + function liquidateBorrowVerify( + address vTokenBorrowed, + address vTokenCollateral, + address liquidator, + address borrower, + uint repayAmount, + uint seizeTokens + ) external; + + function seizeAllowed( + address vTokenCollateral, + address vTokenBorrowed, + address liquidator, + address borrower, + uint seizeTokens + ) external returns (uint); + + function seizeVerify( + address vTokenCollateral, + address vTokenBorrowed, + address liquidator, + address borrower, + uint seizeTokens + ) external; + + function transferAllowed(address vToken, address src, address dst, uint transferTokens) external returns (uint); + + function transferVerify(address vToken, address src, address dst, uint transferTokens) external; +} \ No newline at end of file diff --git a/contracts/Diamond/libraries/LibAccessCheck.sol b/contracts/Diamond/libraries/LibAccessCheck.sol index 41b5ce68b..a70c83bba 100644 --- a/contracts/Diamond/libraries/LibAccessCheck.sol +++ b/contracts/Diamond/libraries/LibAccessCheck.sol @@ -16,7 +16,6 @@ library LibAccessCheck { EXIT_MARKET } -library LibAccessCheck { /// @notice Reverts if the protocol is paused function checkProtocolPauseState() internal view { require(!protocolPaused, "protocol is paused"); diff --git a/contracts/Diamond/libraries/LibHelper.sol b/contracts/Diamond/libraries/LibHelper.sol index 93fef0c5d..ca0dc37e6 100644 --- a/contracts/Diamond/libraries/LibHelper.sol +++ b/contracts/Diamond/libraries/LibHelper.sol @@ -1,7 +1,23 @@ pragma solidity 0.8.13; import "../../Tokens/VTokens/VToken.sol"; +import "./appStorage.sol"; +import "./LibAccessCheck.sol"; +import "../../Utils/ExponentialNoError.sol"; library LibHelper { + + /// @notice The initial Venus index for a market + uint224 public constant venusInitialIndex = 1e36; + + // closeFactorMantissa must be strictly greater than this value + uint internal constant closeFactorMinMantissa = 0.05e18; // 0.05 + + // closeFactorMantissa must not exceed this value + uint internal constant closeFactorMaxMantissa = 0.9e18; // 0.9 + + // No collateralFactorMantissa may exceed this value + uint internal constant collateralFactorMaxMantissa = 0.9e18; // 0.9 + /** * @notice Determine what the account liquidity would be if the given amounts were redeemed/borrowed * @param vTokenModify The market to hypothetically redeem/borrow in @@ -20,7 +36,8 @@ library LibHelper { uint redeemTokens, uint borrowAmount ) internal view returns (Error, uint, uint) { - (uint err, uint liquidity, uint shortfall) = comptrollerLens.getHypotheticalAccountLiquidity( + AppStorage storage s = LibAppStorage.diamondStorage(); + (uint err, uint liquidity, uint shortfall) = s.comptrollerLens.getHypotheticalAccountLiquidity( address(this), account, vTokenModify, @@ -35,9 +52,10 @@ library LibHelper { * @param vToken The market whose supply index to update */ function updateVenusSupplyIndex(address vToken) internal { - VenusMarketState storage supplyState = venusSupplyState[vToken]; - uint supplySpeed = venusSupplySpeeds[vToken]; - uint32 blockNumber = safe32(getBlockNumber(), "block number exceeds 32 bits"); + AppStorage storage s = LibAppStorage.diamondStorage(); + VenusMarketState storage supplyState = s.venusSupplyState[vToken]; + uint supplySpeed = s.venusSupplySpeeds[vToken]; + uint32 blockNumber = safe32(LibAccessCheck.getBlockNumber(), "block number exceeds 32 bits"); uint deltaBlocks = sub_(uint(blockNumber), uint(supplyState.block)); if (deltaBlocks > 0 && supplySpeed > 0) { uint supplyTokens = VToken(vToken).totalSupply(); @@ -58,9 +76,10 @@ library LibHelper { * @param vToken The market whose borrow index to update */ function updateVenusBorrowIndex(address vToken, Exp memory marketBorrowIndex) internal { - VenusMarketState storage borrowState = venusBorrowState[vToken]; - uint borrowSpeed = venusBorrowSpeeds[vToken]; - uint32 blockNumber = safe32(getBlockNumber(), "block number exceeds 32 bits"); + AppStorage storage s = LibAppStorage.diamondStorage(); + VenusMarketState storage borrowState = s.venusBorrowState[vToken]; + uint borrowSpeed = s.venusBorrowSpeeds[vToken]; + uint32 blockNumber = safe32(LibAccessCheck.getBlockNumber(), "block number exceeds 32 bits"); uint deltaBlocks = sub_(uint(blockNumber), uint(borrowState.block)); if (deltaBlocks > 0 && borrowSpeed > 0) { uint borrowAmount = div_(VToken(vToken).totalBorrows(), marketBorrowIndex); @@ -82,15 +101,16 @@ library LibHelper { * @param supplier The address of the supplier to distribute XVS to */ function distributeSupplierVenus(address vToken, address supplier) internal { + AppStorage storage s = LibAppStorage.diamondStorage() if (address(vaiVaultAddress) != address(0)) { releaseToVault(); } - uint supplyIndex = venusSupplyState[vToken].index; - uint supplierIndex = venusSupplierIndex[vToken][supplier]; + uint supplyIndex = s.venusSupplyState[vToken].index; + uint supplierIndex = s.venusSupplierIndex[vToken][supplier]; // Update supplier's index to the current index since we are distributing accrued XVS - venusSupplierIndex[vToken][supplier] = supplyIndex; + s.venusSupplierIndex[vToken][supplier] = supplyIndex; if (supplierIndex == 0 && supplyIndex >= venusInitialIndex) { // Covers the case where users supplied tokens before the market's supply state index was set. @@ -106,7 +126,7 @@ library LibHelper { uint supplierDelta = mul_(VToken(vToken).balanceOf(supplier), deltaIndex); // Addition of supplierAccrued and supplierDelta - venusAccrued[supplier] = add_(venusAccrued[supplier], supplierDelta); + s.venusAccrued[supplier] = add_(s.venusAccrued[supplier], supplierDelta); emit DistributedSupplierVenus(VToken(vToken), supplier, supplierDelta, supplyIndex); } @@ -118,15 +138,16 @@ library LibHelper { * @param borrower The address of the borrower to distribute XVS to */ function distributeBorrowerVenus(address vToken, address borrower, Exp memory marketBorrowIndex) internal { - if (address(vaiVaultAddress) != address(0)) { + AppStorage storage s = LibAppStorage.diamondStorage(); + if (address(s.vaiVaultAddress) != address(0)) { releaseToVault(); } - uint borrowIndex = venusBorrowState[vToken].index; - uint borrowerIndex = venusBorrowerIndex[vToken][borrower]; + uint borrowIndex = s.venusBorrowState[vToken].index; + uint borrowerIndex = s.venusBorrowerIndex[vToken][borrower]; // Update borrowers's index to the current index since we are distributing accrued XVS - venusBorrowerIndex[vToken][borrower] = borrowIndex; + s.venusBorrowerIndex[vToken][borrower] = borrowIndex; if (borrowerIndex == 0 && borrowIndex >= venusInitialIndex) { // Covers the case where users borrowed tokens before the market's borrow state index was set. @@ -140,7 +161,7 @@ library LibHelper { uint borrowerDelta = mul_(div_(VToken(vToken).borrowBalanceStored(borrower), marketBorrowIndex), deltaIndex); - venusAccrued[borrower] = add_(venusAccrued[borrower], borrowerDelta); + s.venusAccrued[borrower] = add_(s.venusAccrued[borrower], borrowerDelta); emit DistributedBorrowerVenus(VToken(vToken), borrower, borrowerDelta, borrowIndex); } @@ -152,10 +173,11 @@ library LibHelper { * @return Success indicator for whether the market was entered */ function addToMarketInternal(VToken vToken, address borrower) internal returns (Error) { - checkActionPauseState(address(vToken), Action.ENTER_MARKET); + AppStorage storage s = LibAppStorage.diamondStorage(); + LibAccessCheck.checkActionPauseState(address(vToken), Action.ENTER_MARKET); - Market storage marketToJoin = markets[address(vToken)]; - ensureListed(marketToJoin); + Market storage marketToJoin = s.markets[address(vToken)]; + LibAccessCheck.ensureListed(marketToJoin); if (marketToJoin.accountMembership[borrower]) { // already joined @@ -168,7 +190,7 @@ library LibHelper { // that is, only when we need to perform liquidity checks // and not whenever we want to check if an account is in a particular market marketToJoin.accountMembership[borrower] = true; - accountAssets[borrower].push(vToken); + s.accountAssets[borrower].push(vToken); emit MarketEntered(vToken, borrower); @@ -176,10 +198,11 @@ library LibHelper { } function redeemAllowedInternal(address vToken, address redeemer, uint redeemTokens) internal view returns (uint) { - ensureListed(markets[vToken]); + AppStorage storage s = LibAppStorage.diamondStorage(); + LibAccessCheck.ensureListed(s.markets[vToken]); /* If the redeemer is not 'in' the market, then we can bypass the liquidity check */ - if (!markets[vToken].accountMembership[redeemer]) { + if (!s.markets[vToken].accountMembership[redeemer]) { return uint(Error.NO_ERROR); } diff --git a/contracts/Diamond/libraries/appStorage.sol b/contracts/Diamond/libraries/appStorage.sol index 1899bd408..14f997cb6 100644 --- a/contracts/Diamond/libraries/appStorage.sol +++ b/contracts/Diamond/libraries/appStorage.sol @@ -19,26 +19,7 @@ struct Market { /// @notice Whether or not this market receives XVS bool isVenus; } - /// @notice Whether or not this market is listed - bool isListed; - /** - * @notice Multiplier representing the most one can borrow against their collateral in this market. - * For instance, 0.9 to allow borrowing 90% of collateral value. - * Must be between 0 and 1, and stored as a mantissa. - */ - uint collateralFactorMantissa; - /// @notice Per-market mapping of "accounts in this asset" - mapping(address => bool) accountMembership; - /// @notice Whether or not this market receives XVS - bool isVenus; -} -struct VenusMarketState { - /// @notice The market's last updated venusBorrowIndex or venusSupplyIndex - uint224 index; - /// @notice The block number the index was last updated at - uint32 block; -} struct VenusMarketState { /// @notice The market's last updated venusBorrowIndex or venusSupplyIndex uint224 index; From 53860a365a7e4b11288396def2dab9d88c637a52 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Tue, 7 Mar 2023 18:22:05 +0530 Subject: [PATCH 010/153] Update storage access in library --- .../Diamond/libraries/LibAccessCheck.sol | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/contracts/Diamond/libraries/LibAccessCheck.sol b/contracts/Diamond/libraries/LibAccessCheck.sol index a70c83bba..94edfefce 100644 --- a/contracts/Diamond/libraries/LibAccessCheck.sol +++ b/contracts/Diamond/libraries/LibAccessCheck.sol @@ -2,6 +2,7 @@ pragma solidity 0.8.13; import "../../Governance/IAccessControlManager.sol"; import "../../Tokens/VTokens/VToken.sol"; +import "../libraries/appStorage.sol"; library LibAccessCheck { enum Action { @@ -18,7 +19,8 @@ library LibAccessCheck { /// @notice Reverts if the protocol is paused function checkProtocolPauseState() internal view { - require(!protocolPaused, "protocol is paused"); + AppStorage storage s = LibAppStorage.diamondStorage(); + require(!s.protocolPaused, "protocol is paused"); } /// @notice Reverts if a certain action is paused on a market @@ -28,7 +30,8 @@ library LibAccessCheck { /// @notice Reverts if the caller is not admin function ensureAdmin() internal view { - require(msg.sender == admin, "only admin can"); + AppStorage storage s = LibAppStorage.diamondStorage(); + require(msg.sender == s.admin, "only admin can"); } /// @notice Checks the passed address is nonzero @@ -43,11 +46,13 @@ library LibAccessCheck { /// @notice Reverts if the caller is neither admin nor the passed address function ensureAdminOr(address privilegedAddress) internal view { - require(msg.sender == admin || msg.sender == privilegedAddress, "access denied"); + AppStorage storage s = LibAppStorage.diamondStorage(); + require(msg.sender == s.admin || msg.sender == privilegedAddress, "access denied"); } function ensureAllowed(string memory functionSig) internal view { - require(IAccessControlManager(accessControl).isAllowedToCall(msg.sender, functionSig), "access denied"); + AppStorage storage s = LibAppStorage.diamondStorage(); + require(IAccessControlManager(s.accessControl).isAllowedToCall(msg.sender, functionSig), "access denied"); } /** @@ -57,7 +62,8 @@ library LibAccessCheck { * @return True if the account is in the asset, otherwise false. */ function checkMembership(address account, VToken vToken) external view returns (bool) { - return markets[address(vToken)].accountMembership[account]; + AppStorage storage s = LibAppStorage.diamondStorage(); + return s.markets[address(vToken)].accountMembership[account]; } /** @@ -66,7 +72,8 @@ library LibAccessCheck { * @param market vToken address */ function actionPaused(address market, Action action) public view returns (bool) { - return _actionPaused[market][uint(action)]; + AppStorage storage s = LibAppStorage.diamondStorage(); + return s._actionPaused[market][uint(action)]; } function getBlockNumber() public view returns (uint) { From 0f31c2abaee04d9eab1bcd0bc0878afdd0c4ff1a Mon Sep 17 00:00:00 2001 From: defcon022 Date: Tue, 7 Mar 2023 18:24:56 +0530 Subject: [PATCH 011/153] Fix: lint fix --- contracts/Diamond/interfaces/IMarketFacet.sol | 6 +++--- contracts/Diamond/interfaces/IPloicyFacet.sol | 2 +- contracts/Diamond/libraries/LibAccessCheck.sol | 2 -- contracts/Diamond/libraries/appStorage.sol | 1 - 4 files changed, 4 insertions(+), 7 deletions(-) diff --git a/contracts/Diamond/interfaces/IMarketFacet.sol b/contracts/Diamond/interfaces/IMarketFacet.sol index e821d11e5..78e8b6569 100644 --- a/contracts/Diamond/interfaces/IMarketFacet.sol +++ b/contracts/Diamond/interfaces/IMarketFacet.sol @@ -1,7 +1,7 @@ pragma solidity ^0.8.13; interface IMarketFacet { - function enterMarkets(address[] calldata vTokens) external returns (uint[] memory); + function enterMarkets(address[] calldata vTokens) external returns (uint[] memory); - function exitMarket(address vToken) external returns (uint); -} \ No newline at end of file + function exitMarket(address vToken) external returns (uint); +} diff --git a/contracts/Diamond/interfaces/IPloicyFacet.sol b/contracts/Diamond/interfaces/IPloicyFacet.sol index 593a2318d..7f2dd5113 100644 --- a/contracts/Diamond/interfaces/IPloicyFacet.sol +++ b/contracts/Diamond/interfaces/IPloicyFacet.sol @@ -64,4 +64,4 @@ interface IPolicyFacet { function transferAllowed(address vToken, address src, address dst, uint transferTokens) external returns (uint); function transferVerify(address vToken, address src, address dst, uint transferTokens) external; -} \ No newline at end of file +} diff --git a/contracts/Diamond/libraries/LibAccessCheck.sol b/contracts/Diamond/libraries/LibAccessCheck.sol index 94edfefce..f67af7933 100644 --- a/contracts/Diamond/libraries/LibAccessCheck.sol +++ b/contracts/Diamond/libraries/LibAccessCheck.sol @@ -79,6 +79,4 @@ library LibAccessCheck { function getBlockNumber() public view returns (uint) { return block.number; } - } - diff --git a/contracts/Diamond/libraries/appStorage.sol b/contracts/Diamond/libraries/appStorage.sol index 14f997cb6..e4c647867 100644 --- a/contracts/Diamond/libraries/appStorage.sol +++ b/contracts/Diamond/libraries/appStorage.sol @@ -167,4 +167,3 @@ library LibAppStorage { return uint256(x >= 0 ? x : -x); } } - From a41278cbd7ede42f382e5f2bfb8632e0ac7df1ca Mon Sep 17 00:00:00 2001 From: defcon022 Date: Tue, 7 Mar 2023 18:32:46 +0530 Subject: [PATCH 012/153] Fix: lint fix --- contracts/Diamond/facets/SetterFacet.sol | 1 - contracts/Diamond/libraries/LibHelper.sol | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/contracts/Diamond/facets/SetterFacet.sol b/contracts/Diamond/facets/SetterFacet.sol index 323c0b646..d9af91e3b 100644 --- a/contracts/Diamond/facets/SetterFacet.sol +++ b/contracts/Diamond/facets/SetterFacet.sol @@ -458,4 +458,3 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError { emit NewVAIVaultInfo(vault_, releaseStartBlock_, minReleaseAmount_); } } -} diff --git a/contracts/Diamond/libraries/LibHelper.sol b/contracts/Diamond/libraries/LibHelper.sol index ca0dc37e6..ce4fe0246 100644 --- a/contracts/Diamond/libraries/LibHelper.sol +++ b/contracts/Diamond/libraries/LibHelper.sol @@ -5,7 +5,6 @@ import "./LibAccessCheck.sol"; import "../../Utils/ExponentialNoError.sol"; library LibHelper { - /// @notice The initial Venus index for a market uint224 public constant venusInitialIndex = 1e36; @@ -101,7 +100,7 @@ library LibHelper { * @param supplier The address of the supplier to distribute XVS to */ function distributeSupplierVenus(address vToken, address supplier) internal { - AppStorage storage s = LibAppStorage.diamondStorage() + AppStorage storage s = LibAppStorage.diamondStorage(); if (address(vaiVaultAddress) != address(0)) { releaseToVault(); } From 5756e61202f2b88a54c6bde1233ecb4fa2435588 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Fri, 10 Mar 2023 18:39:14 +0530 Subject: [PATCH 013/153] Added library and refactored diamond facets. --- contracts/Diamond/facets/MarketFacet.sol | 16 +- contracts/Diamond/facets/PolicyFacet.sol | 66 +++--- contracts/Diamond/facets/RewardFacet.sol | 16 +- contracts/Diamond/facets/SetterFacet.sol | 73 ++----- .../libraries/LibExponentialNoError.sol | 195 ++++++++++++++++++ contracts/Diamond/libraries/LibHelper.sol | 129 ++++++------ 6 files changed, 323 insertions(+), 172 deletions(-) create mode 100644 contracts/Diamond/libraries/LibExponentialNoError.sol diff --git a/contracts/Diamond/facets/MarketFacet.sol b/contracts/Diamond/facets/MarketFacet.sol index 4404f3b91..ceeff6b28 100644 --- a/contracts/Diamond/facets/MarketFacet.sol +++ b/contracts/Diamond/facets/MarketFacet.sol @@ -57,7 +57,7 @@ contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError { * @return Whether or not the account successfully exited the market */ function exitMarket(address vTokenAddress) external returns (uint) { - LibAccessCheck.checkActionPauseState(vTokenAddress, Action.EXIT_MARKET); + LibAccessCheck.checkActionPauseState(vTokenAddress, LibAccessCheck.Action.EXIT_MARKET); VToken vToken = VToken(vTokenAddress); /* Get sender tokensHeld and amountOwed underlying from the vToken */ @@ -93,7 +93,7 @@ contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError { for (; i < len; ++i) { if (userAssetList[i] == vToken) { userAssetList[i] = userAssetList[len - 1]; - userAssetList.length--; + userAssetList.pop(); break; } } @@ -120,12 +120,14 @@ contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError { } // Note that isVenus is not in active use anymore - s.markets[address(vToken)] = Market({ isListed: true, isVenus: false, collateralFactorMantissa: 0 }); - + Market storage newMarket = s.markets[address(vToken)]; + newMarket.isListed = true; + newMarket.isVenus = false; + newMarket.collateralFactorMantissa = 0; _addMarketInternal(vToken); _initializeMarket(address(vToken)); - emit MarketListed(vToken); + //emit MarketListed(vToken); return uint(Error.NO_ERROR); } @@ -148,12 +150,12 @@ contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError { */ if (supplyState.index == 0) { // Initialize supply state index with default value - supplyState.index = venusInitialIndex; + supplyState.index = LibHelper.venusInitialIndex; } if (borrowState.index == 0) { // Initialize borrow state index with default value - borrowState.index = venusInitialIndex; + borrowState.index = LibHelper.venusInitialIndex; } /* diff --git a/contracts/Diamond/facets/PolicyFacet.sol b/contracts/Diamond/facets/PolicyFacet.sol index fb8fc2047..d87300a03 100644 --- a/contracts/Diamond/facets/PolicyFacet.sol +++ b/contracts/Diamond/facets/PolicyFacet.sol @@ -24,10 +24,10 @@ contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError { function mintAllowed(address vToken, address minter, uint mintAmount) external returns (uint) { // Pausing is a very serious situation - we revert to sound the alarms LibAccessCheck.checkProtocolPauseState(); - LibAccessCheck.checkActionPauseState(vToken, Action.MINT); + LibAccessCheck.checkActionPauseState(vToken, LibAccessCheck.Action.MINT); LibAccessCheck.ensureListed(s.markets[vToken]); - uint256 supplyCap = supplyCaps[vToken]; + uint256 supplyCap = s.supplyCaps[vToken]; require(supplyCap != 0, "market supply cap is 0"); uint256 vTokenSupply = VToken(vToken).totalSupply(); @@ -53,7 +53,7 @@ contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError { */ function redeemAllowed(address vToken, address redeemer, uint redeemTokens) external returns (uint) { LibAccessCheck.checkProtocolPauseState(); - LibAccessCheck.checkActionPauseState(vToken, Action.REDEEM); + LibAccessCheck.checkActionPauseState(vToken, LibAccessCheck.Action.REDEEM); uint allowed = LibHelper.redeemAllowedInternal(vToken, redeemer, redeemTokens); if (allowed != uint(Error.NO_ERROR)) { @@ -89,7 +89,7 @@ contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError { function borrowAllowed(address vToken, address borrower, uint borrowAmount) external returns (uint) { // Pausing is a very serious situation - we revert to sound the alarms LibAccessCheck.checkProtocolPauseState(); - LibAccessCheck.checkActionPauseState(vToken, Action.BORROW); + LibAccessCheck.checkActionPauseState(vToken, LibAccessCheck.Action.BORROW); LibAccessCheck.ensureListed(s.markets[vToken]); @@ -104,11 +104,11 @@ contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError { } } - if (oracle.getUnderlyingPrice(VToken(vToken)) == 0) { + if (s.oracle.getUnderlyingPrice(VToken(vToken)) == 0) { return uint(Error.PRICE_ERROR); } - uint borrowCap = borrowCaps[vToken]; + uint borrowCap = s.borrowCaps[vToken]; // Borrow cap of 0 corresponds to unlimited borrowing if (borrowCap != 0) { uint nextTotalBorrows = add_(VToken(vToken).totalBorrows(), borrowAmount); @@ -162,7 +162,7 @@ contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError { uint repayAmount ) external returns (uint) { LibAccessCheck.checkProtocolPauseState(); - LibAccessCheck.checkActionPauseState(vToken, Action.REPAY); + LibAccessCheck.checkActionPauseState(vToken, LibAccessCheck.Action.REPAY); LibAccessCheck.ensureListed(s.markets[vToken]); // Keep the flywheel moving @@ -206,19 +206,24 @@ contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError { LibAccessCheck.checkProtocolPauseState(); // if we want to pause liquidating to vTokenCollateral, we should pause seizing - LibAccessCheck.checkActionPauseState(vTokenBorrowed, Action.LIQUIDATE); + LibAccessCheck.checkActionPauseState(vTokenBorrowed, LibAccessCheck.Action.LIQUIDATE); if (s.liquidatorContract != address(0) && liquidator != s.liquidatorContract) { return uint(Error.UNAUTHORIZED); } LibAccessCheck.ensureListed(s.markets[vTokenCollateral]); - if (address(vTokenBorrowed) != address(vaiController)) { + if (address(vTokenBorrowed) != address(s.vaiController)) { LibAccessCheck.ensureListed(s.markets[vTokenBorrowed]); } /* The borrower must have shortfall in order to be liquidatable */ - (Error err, , uint shortfall) = LibHelper.getHypotheticalAccountLiquidityInternal(borrower, VToken(0), 0, 0); + (Error err, , uint shortfall) = LibHelper.getHypotheticalAccountLiquidityInternal( + borrower, + VToken(address(0)), + 0, + 0 + ); if (err != Error.NO_ERROR) { return uint(err); } @@ -228,13 +233,13 @@ contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError { /* The liquidator may not repay more than what is allowed by the closeFactor */ uint borrowBalance; - if (address(vTokenBorrowed) != address(vaiController)) { + if (address(vTokenBorrowed) != address(s.vaiController)) { borrowBalance = VToken(vTokenBorrowed).borrowBalanceStored(borrower); } else { - borrowBalance = vaiController.getVAIRepayAmount(borrower); + borrowBalance = s.vaiController.getVAIRepayAmount(borrower); } //-- maxClose = multipy of closeFactorMantissa and borrowBalance - if (repayAmount > mul_ScalarTruncate(Exp({ mantissa: closeFactorMantissa }), borrowBalance)) { + if (repayAmount > mul_ScalarTruncate(Exp({ mantissa: s.closeFactorMantissa }), borrowBalance)) { return uint(Error.TOO_MUCH_REPAY); } @@ -267,11 +272,11 @@ contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError { ) external returns (uint) { // Pausing is a very serious situation - we revert to sound the alarms LibAccessCheck.checkProtocolPauseState(); - LibAccessCheck.checkActionPauseState(vTokenCollateral, Action.SEIZE); + LibAccessCheck.checkActionPauseState(vTokenCollateral, LibAccessCheck.Action.SEIZE); // We've added VAIController as a borrowed token list check for seize LibAccessCheck.ensureListed(s.markets[vTokenCollateral]); - if (address(vTokenBorrowed) != address(vaiController)) { + if (address(vTokenBorrowed) != address(s.vaiController)) { LibAccessCheck.ensureListed(s.markets[vTokenBorrowed]); } @@ -315,7 +320,7 @@ contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError { function transferAllowed(address vToken, address src, address dst, uint transferTokens) external returns (uint) { // Pausing is a very serious situation - we revert to sound the alarms LibAccessCheck.checkProtocolPauseState(); - LibAccessCheck.checkActionPauseState(vToken, Action.TRANSFER); + LibAccessCheck.checkActionPauseState(vToken, LibAccessCheck.Action.TRANSFER); // Currently the only consideration is whether or not // the src is allowed to redeem this many tokens @@ -359,23 +364,6 @@ contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError { return (uint(err), liquidity, shortfall); } - /** - * @notice Determine the current account liquidity wrt collateral requirements - * @return (possible error code (semi-opaque), - account liquidity in excess of collateral requirements, - * account shortfall below collateral requirements) - */ - function getAccountLiquidity(address account) external view returns (uint, uint, uint) { - (Error err, uint liquidity, uint shortfall) = LibHelper.getHypotheticalAccountLiquidityInternal( - account, - VToken(0), - 0, - 0 - ); - - return (uint(err), liquidity, shortfall); - } - // setter functionality /** * @notice Set XVS speed for a single market @@ -388,7 +376,7 @@ contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError { uint[] calldata supplySpeeds, uint[] calldata borrowSpeeds ) external { - LibAccessCheck.ensureAdminOr(comptrollerImplementation); + LibAccessCheck.ensureAdminOr(s.comptrollerImplementation); uint numTokens = vTokens.length; require( @@ -405,26 +393,26 @@ contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError { function setVenusSpeedInternal(VToken vToken, uint supplySpeed, uint borrowSpeed) internal { LibAccessCheck.ensureListed(s.markets[address(vToken)]); - if (venusSupplySpeeds[address(vToken)] != supplySpeed) { + if (s.venusSupplySpeeds[address(vToken)] != supplySpeed) { // Supply speed updated so let's update supply state to ensure that // 1. XVS accrued properly for the old speed, and // 2. XVS accrued at the new speed starts after this block. LibHelper.updateVenusSupplyIndex(address(vToken)); // Update speed and emit event - LibHelper.venusSupplySpeeds[address(vToken)] = supplySpeed; + s.venusSupplySpeeds[address(vToken)] = supplySpeed; emit VenusSupplySpeedUpdated(vToken, supplySpeed); } - if (LibHelper.venusBorrowSpeeds[address(vToken)] != borrowSpeed) { + if (s.venusBorrowSpeeds[address(vToken)] != borrowSpeed) { // Borrow speed updated so let's update borrow state to ensure that // 1. XVS accrued properly for the old speed, and // 2. XVS accrued at the new speed starts after this block. Exp memory borrowIndex = Exp({ mantissa: vToken.borrowIndex() }); - updateVenusBorrowIndex(address(vToken), borrowIndex); + LibHelper.updateVenusBorrowIndex(address(vToken), borrowIndex); // Update speed and emit event - LibHelper.venusBorrowSpeeds[address(vToken)] = borrowSpeed; + s.venusBorrowSpeeds[address(vToken)] = borrowSpeed; emit VenusBorrowSpeedUpdated(vToken, borrowSpeed); } } diff --git a/contracts/Diamond/facets/RewardFacet.sol b/contracts/Diamond/facets/RewardFacet.sol index 1daa13eb3..799bb6a19 100644 --- a/contracts/Diamond/facets/RewardFacet.sol +++ b/contracts/Diamond/facets/RewardFacet.sol @@ -23,7 +23,7 @@ contract RewardFacet is ComptrollerErrorReporter, ExponentialNoError { * @param holder The address to claim XVS for */ function claimVenus(address holder) public { - return claimVenus(holder, allMarkets); + return claimVenus(holder, s.allMarkets); } /** @@ -113,7 +113,7 @@ contract RewardFacet is ComptrollerErrorReporter, ExponentialNoError { * @param amount The amount of XVS to (possibly) transfer */ function _grantXVS(address recipient, uint amount) external { - LibAccessCheck.ensureAdminOr(comptrollerImplementation); + LibAccessCheck.ensureAdminOr(s.comptrollerImplementation); uint amountLeft = grantXVSInternal(recipient, amount, 0, false); require(amountLeft == 0, "insufficient xvs for grant"); emit VenusGranted(recipient, amount); @@ -144,7 +144,7 @@ contract RewardFacet is ComptrollerErrorReporter, ExponentialNoError { * @param action Action id * @param market vToken address */ - function actionPaused(address market, Action action) public view returns (bool) { + function actionPaused(address market, LibAccessCheck.Action action) public view returns (bool) { return s._actionPaused[market][uint(action)]; } @@ -166,9 +166,9 @@ contract RewardFacet is ComptrollerErrorReporter, ExponentialNoError { } uint256 actualAmount; - uint256 deltaBlocks = sub_(getBlockNumber(), releaseStartBlock); + uint256 deltaBlocks = sub_(getBlockNumber(), s.releaseStartBlock); // releaseAmount = venusVAIVaultRate * deltaBlocks - uint256 _releaseAmount = mul_(venusVAIVaultRate, deltaBlocks); + uint256 _releaseAmount = mul_(s.venusVAIVaultRate, deltaBlocks); if (xvsBalance >= _releaseAmount) { actualAmount = _releaseAmount; @@ -176,7 +176,7 @@ contract RewardFacet is ComptrollerErrorReporter, ExponentialNoError { actualAmount = xvsBalance; } - if (actualAmount < minReleaseAmount) { + if (actualAmount < s.minReleaseAmount) { return; } @@ -207,7 +207,7 @@ contract RewardFacet is ComptrollerErrorReporter, ExponentialNoError { uint256 holdersLength = holders.length; for (uint i; i < vTokens.length; ++i) { VToken vToken = vTokens[i]; - LibAccessCheck.ensureListed(markets[address(vToken)]); + LibAccessCheck.ensureListed(s.markets[address(vToken)]); if (borrowers) { Exp memory borrowIndex = Exp({ mantissa: vToken.borrowIndex() }); LibHelper.updateVenusBorrowIndex(address(vToken), borrowIndex); @@ -227,7 +227,7 @@ contract RewardFacet is ComptrollerErrorReporter, ExponentialNoError { address holder = holders[j]; // If there is a positive shortfall, the XVS reward is accrued, // but won't be granted to this holder - (, , uint shortfall) = LibHelper.getHypotheticalAccountLiquidityInternal(holder, VToken(0), 0, 0); + (, , uint shortfall) = LibHelper.getHypotheticalAccountLiquidityInternal(holder, VToken(address(0)), 0, 0); s.venusAccrued[holder] = grantXVSInternal(holder, s.venusAccrued[holder], shortfall, collateral); } } diff --git a/contracts/Diamond/facets/SetterFacet.sol b/contracts/Diamond/facets/SetterFacet.sol index d9af91e3b..479c1de57 100644 --- a/contracts/Diamond/facets/SetterFacet.sol +++ b/contracts/Diamond/facets/SetterFacet.sol @@ -8,6 +8,8 @@ import "../../Tokens/VAI/VAI.sol"; import "../libraries/appStorage.sol"; import "../../Governance/IAccessControlManager.sol"; import "../libraries/LibAccessCheck.sol"; +import "../libraries/LibHelper.sol"; +import "../../Comptroller/Unitroller.sol"; contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError { AppStorage internal s; @@ -60,7 +62,7 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError { event NewPauseGuardian(address oldPauseGuardian, address newPauseGuardian); /// @notice Emitted when an action is paused on a market - event ActionPausedMarket(VToken indexed vToken, Action indexed action, bool pauseState); + event ActionPausedMarket(VToken indexed vToken, LibAccessCheck.Action indexed action, bool pauseState); /// @notice Emitted when VAI Vault info is changed event NewVAIVaultInfo(address vault_, uint releaseStartBlock_, uint releaseInterval_); @@ -82,8 +84,6 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError { PriceOracle oldOracle = s.oracle; // Set comptroller's oracle to newOracle - oracle = newOracle; - oracle = newOracle; s.oracle = newOracle; // Emit NewPriceOracle(oldOracle, newOracle) @@ -102,7 +102,6 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError { // Check caller is admin LibAccessCheck.ensureAdmin(); - uint oldCloseFactorMantissa = s.closeFactorMantissa; uint oldCloseFactorMantissa = s.closeFactorMantissa; s.closeFactorMantissa = newCloseFactorMantissa; emit NewCloseFactor(oldCloseFactorMantissa, newCloseFactorMantissa); @@ -121,10 +120,9 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError { LibAccessCheck.ensureAdmin(); LibAccessCheck.ensureNonzeroAddress(newAccessControlAddress); - address oldAccessControlAddress = s.accessControl; address oldAccessControlAddress = s.accessControl; s.accessControl = newAccessControlAddress; - emit NewAccessControl(oldAccessControlAddress, accessControl); + emit NewAccessControl(oldAccessControlAddress, newAccessControlAddress); return uint(Error.NO_ERROR); } @@ -148,13 +146,13 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError { Exp memory newCollateralFactorExp = Exp({ mantissa: newCollateralFactorMantissa }); //-- Check collateral factor <= 0.9 - Exp memory highLimit = Exp({ mantissa: collateralFactorMaxMantissa }); + Exp memory highLimit = Exp({ mantissa: LibHelper.collateralFactorMaxMantissa }); if (lessThanExp(highLimit, newCollateralFactorExp)) { return fail(Error.INVALID_COLLATERAL_FACTOR, FailureInfo.SET_COLLATERAL_FACTOR_VALIDATION); } // If collateral factor != 0, fail if price == 0 - if (newCollateralFactorMantissa != 0 && oracle.getUnderlyingPrice(vToken) == 0) { + if (newCollateralFactorMantissa != 0 && s.oracle.getUnderlyingPrice(vToken) == 0) { return fail(Error.PRICE_ERROR, FailureInfo.SET_COLLATERAL_FACTOR_WITHOUT_PRICE); } @@ -181,11 +179,8 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError { // Save current value for use in log uint oldLiquidationIncentiveMantissa = s.liquidationIncentiveMantissa; - uint oldLiquidationIncentiveMantissa = s.liquidationIncentiveMantissa; - // Set liquidation incentive to new incentive s.liquidationIncentiveMantissa = newLiquidationIncentiveMantissa; - s.liquidationIncentiveMantissa = newLiquidationIncentiveMantissa; // Emit event with old incentive, new incentive emit NewLiquidationIncentive(oldLiquidationIncentiveMantissa, newLiquidationIncentiveMantissa); @@ -195,9 +190,7 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError { function _setLiquidatorContract(address newLiquidatorContract_) external { // Check caller is admin - ensureAdmin(); - address oldLiquidatorContract = s.liquidatorContract; - s.liquidatorContract = newLiquidatorContract_; + LibAccessCheck.ensureAdmin(); address oldLiquidatorContract = s.liquidatorContract; s.liquidatorContract = newLiquidatorContract_; emit NewLiquidatorContract(oldLiquidatorContract, newLiquidatorContract_); @@ -214,8 +207,6 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError { // Save current value for inclusion in log address oldPauseGuardian = s.pauseGuardian; - address oldPauseGuardian = s.pauseGuardian; - // Store pauseGuardian with value newPauseGuardian s.pauseGuardian = newPauseGuardian; @@ -240,7 +231,6 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError { require(numMarkets != 0 && numMarkets == numBorrowCaps, "invalid input"); for (uint i; i < numMarkets; ++i) { - s.borrowCaps[address(vTokens[i])] = newBorrowCaps[i]; s.borrowCaps[address(vTokens[i])] = newBorrowCaps[i]; emit NewBorrowCap(vTokens[i], newBorrowCaps[i]); } @@ -261,7 +251,6 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError { require(numMarkets != 0 && numMarkets == numSupplyCaps, "invalid input"); for (uint i; i < numMarkets; ++i) { - s.supplyCaps[address(vTokens[i])] = newSupplyCaps[i]; s.supplyCaps[address(vTokens[i])] = newSupplyCaps[i]; emit NewSupplyCap(vTokens[i], newSupplyCaps[i]); } @@ -273,7 +262,6 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError { function _setProtocolPaused(bool state) external returns (bool) { LibAccessCheck.ensureAllowed("_setProtocolPaused(bool)"); - s.protocolPaused = state; s.protocolPaused = state; emit ActionProtocolPaused(state); return state; @@ -285,7 +273,11 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError { * @param actions List of action ids to pause/unpause * @param paused The new paused state (true=paused, false=unpaused) */ - function _setActionsPaused(address[] calldata markets, Action[] calldata actions, bool paused) external { + function _setActionsPaused( + address[] calldata markets, + LibAccessCheck.Action[] calldata actions, + bool paused + ) external { LibAccessCheck.ensureAllowed("_setActionsPaused(address[],uint256[],bool)"); uint256 numMarkets = s.markets.length; @@ -303,10 +295,8 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError { * @param action Action id to pause/unpause * @param paused The new paused state (true=paused, false=unpaused) */ - function setActionPausedInternal(address market, Action action, bool paused) internal { - ensureListed(markets[market]); - s._actionPaused[market][uint(action)] = paused; - LibAccessCheck.ensureListed(markets[market]); + function setActionPausedInternal(address market, LibAccessCheck.Action action, bool paused) internal { + LibAccessCheck.ensureListed(s.markets[market]); s._actionPaused[market][uint(action)] = paused; emit ActionPausedMarket(VToken(market), action, paused); } @@ -323,10 +313,6 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError { VAIControllerInterface oldVaiController = s.vaiController; s.vaiController = vaiController_; - VAIControllerInterface oldVaiController = s.vaiController; - s.vaiController = vaiController_; - VAIControllerInterface oldVaiController = s.vaiController; - vaiController = vaiController_; emit NewVAIController(oldVaiController, vaiController_); return uint(Error.NO_ERROR); @@ -334,12 +320,8 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError { function _setVAIMintRate(uint newVAIMintRate) external returns (uint) { // Check caller is admin - ensureAdmin(); - uint oldVAIMintRate = s.vaiMintRate; - s.vaiMintRate = newVAIMintRate; - uint oldVAIMintRate = s.vaiMintRate; LibAccessCheck.ensureAdmin(); - uint oldVAIMintRate = vaiMintRate; + uint oldVAIMintRate = s.vaiMintRate; s.vaiMintRate = newVAIMintRate; emit NewVAIMintRate(oldVAIMintRate, newVAIMintRate); @@ -356,14 +338,12 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError { LibAccessCheck.checkProtocolPauseState(); // Pausing is a very serious situation - we revert to sound the alarms - require(!mintVAIGuardianPaused && !repayVAIGuardianPaused, "VAI is paused"); + require(!s.mintVAIGuardianPaused && !s.repayVAIGuardianPaused, "VAI is paused"); // Check caller is vaiController - if (msg.sender != address(vaiController)) { + if (msg.sender != address(s.vaiController)) { return fail(Error.REJECTION, FailureInfo.SET_MINTED_VAI_REJECTION); } s.mintedVAIs[owner] = amount; - s.mintedVAIs[owner] = amount; - return uint(Error.NO_ERROR); } @@ -373,22 +353,15 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError { uint newTreasuryPercent ) external returns (uint) { // Check caller is admin - LibAccessCheck.ensureAdminOr(treasuryGuardian); + LibAccessCheck.ensureAdminOr(s.treasuryGuardian); require(newTreasuryPercent < 1e18, "treasury percent cap overflow"); LibAccessCheck.ensureNonzeroAddress(newTreasuryGuardian); - LibAccessCheck.ensureNonzeroAddress(newTreasuryAddress); - address oldTreasuryGuardian = s.treasuryGuardian; - address oldTreasuryAddress = s.treasuryAddress; - uint oldTreasuryPercent = s.treasuryPercent; address oldTreasuryGuardian = s.treasuryGuardian; address oldTreasuryAddress = s.treasuryAddress; uint oldTreasuryPercent = s.treasuryPercent; - s.treasuryGuardian = newTreasuryGuardian; - s.treasuryAddress = newTreasuryAddress; - s.treasuryPercent = newTreasuryPercent; s.treasuryGuardian = newTreasuryGuardian; s.treasuryAddress = newTreasuryAddress; s.treasuryPercent = newTreasuryPercent; @@ -411,10 +384,6 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError { * @dev Set ComptrollerLens contract address */ function _setComptrollerLens(ComptrollerLensInterface comptrollerLens_) external returns (uint) { - ensureAdmin(); - ensureNonzeroAddress(address(comptrollerLens_)); - address oldComptrollerLens = address(s.comptrollerLens); - s.comptrollerLens = comptrollerLens_; LibAccessCheck.ensureAdmin(); LibAccessCheck.ensureNonzeroAddress(address(comptrollerLens_)); address oldComptrollerLens = address(s.comptrollerLens); @@ -431,9 +400,6 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError { */ function _setVenusVAIVaultRate(uint venusVAIVaultRate_) external { LibAccessCheck.ensureAdmin(); - - uint oldVenusVAIVaultRate = s.venusVAIVaultRate; - s.venusVAIVaultRate = venusVAIVaultRate_; uint oldVenusVAIVaultRate = s.venusVAIVaultRate; s.venusVAIVaultRate = venusVAIVaultRate_; emit NewVenusVAIVaultRate(oldVenusVAIVaultRate, venusVAIVaultRate_); @@ -449,9 +415,6 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError { LibAccessCheck.ensureAdmin(); LibAccessCheck.ensureNonzeroAddress(vault_); - s.vaiVaultAddress = vault_; - s.releaseStartBlock = releaseStartBlock_; - s.minReleaseAmount = minReleaseAmount_; s.vaiVaultAddress = vault_; s.releaseStartBlock = releaseStartBlock_; s.minReleaseAmount = minReleaseAmount_; diff --git a/contracts/Diamond/libraries/LibExponentialNoError.sol b/contracts/Diamond/libraries/LibExponentialNoError.sol new file mode 100644 index 000000000..d4a7e8588 --- /dev/null +++ b/contracts/Diamond/libraries/LibExponentialNoError.sol @@ -0,0 +1,195 @@ +pragma solidity 0.8.13; + +/** + * @title Exponential module for storing fixed-precision decimals + * @author Compound + * @notice Exp is a struct which stores decimals with a fixed precision of 18 decimal places. + * Thus, if we wanted to store the 5.1, mantissa would store 5.1e18. That is: + * `Exp({mantissa: 5100000000000000000})`. + */ +library LibExponentialNoError { + uint internal constant expScale = 1e18; + uint internal constant doubleScale = 1e36; + uint internal constant halfExpScale = expScale / 2; + uint internal constant mantissaOne = expScale; + + struct Exp { + uint mantissa; + } + + struct Double { + uint mantissa; + } + + /** + * @dev Truncates the given exp to a whole number value. + * For example, truncate(Exp{mantissa: 15 * expScale}) = 15 + */ + function truncate(Exp memory exp) internal pure returns (uint) { + // Note: We are not using careful math here as we're performing a division that cannot fail + return exp.mantissa / expScale; + } + + /** + * @dev Multiply an Exp by a scalar, then truncate to return an unsigned integer. + */ + function mul_ScalarTruncate(Exp memory a, uint scalar) internal pure returns (uint) { + Exp memory product = mul_(a, scalar); + return truncate(product); + } + + /** + * @dev Multiply an Exp by a scalar, truncate, then add an to an unsigned integer, returning an unsigned integer. + */ + function mul_ScalarTruncateAddUInt(Exp memory a, uint scalar, uint addend) internal pure returns (uint) { + Exp memory product = mul_(a, scalar); + return add_(truncate(product), addend); + } + + /** + * @dev Checks if first Exp is less than second Exp. + */ + function lessThanExp(Exp memory left, Exp memory right) internal pure returns (bool) { + return left.mantissa < right.mantissa; + } + + /** + * @dev Checks if left Exp <= right Exp. + */ + function lessThanOrEqualExp(Exp memory left, Exp memory right) internal pure returns (bool) { + return left.mantissa <= right.mantissa; + } + + /** + * @dev Checks if left Exp > right Exp. + */ + function greaterThanExp(Exp memory left, Exp memory right) internal pure returns (bool) { + return left.mantissa > right.mantissa; + } + + /** + * @dev returns true if Exp is exactly zero + */ + function isZeroExp(Exp memory value) internal pure returns (bool) { + return value.mantissa == 0; + } + + function safe224(uint n, string memory errorMessage) internal pure returns (uint224) { + require(n < 2 ** 224, errorMessage); + return uint224(n); + } + + function safe32(uint n, string memory errorMessage) internal pure returns (uint32) { + require(n < 2 ** 32, errorMessage); + return uint32(n); + } + + function add_(Exp memory a, Exp memory b) internal pure returns (Exp memory) { + return Exp({ mantissa: add_(a.mantissa, b.mantissa) }); + } + + function add_(Double memory a, Double memory b) internal pure returns (Double memory) { + return Double({ mantissa: add_(a.mantissa, b.mantissa) }); + } + + function add_(uint a, uint b) internal pure returns (uint) { + return add_(a, b, "addition overflow"); + } + + function add_(uint a, uint b, string memory errorMessage) internal pure returns (uint) { + uint c = a + b; + require(c >= a, errorMessage); + return c; + } + + function sub_(Exp memory a, Exp memory b) internal pure returns (Exp memory) { + return Exp({ mantissa: sub_(a.mantissa, b.mantissa) }); + } + + function sub_(Double memory a, Double memory b) internal pure returns (Double memory) { + return Double({ mantissa: sub_(a.mantissa, b.mantissa) }); + } + + function sub_(uint a, uint b) internal pure returns (uint) { + return sub_(a, b, "subtraction underflow"); + } + + function sub_(uint a, uint b, string memory errorMessage) internal pure returns (uint) { + require(b <= a, errorMessage); + return a - b; + } + + function mul_(Exp memory a, Exp memory b) internal pure returns (Exp memory) { + return Exp({ mantissa: mul_(a.mantissa, b.mantissa) / expScale }); + } + + function mul_(Exp memory a, uint b) internal pure returns (Exp memory) { + return Exp({ mantissa: mul_(a.mantissa, b) }); + } + + function mul_(uint a, Exp memory b) internal pure returns (uint) { + return mul_(a, b.mantissa) / expScale; + } + + function mul_(Double memory a, Double memory b) internal pure returns (Double memory) { + return Double({ mantissa: mul_(a.mantissa, b.mantissa) / doubleScale }); + } + + function mul_(Double memory a, uint b) internal pure returns (Double memory) { + return Double({ mantissa: mul_(a.mantissa, b) }); + } + + function mul_(uint a, Double memory b) internal pure returns (uint) { + return mul_(a, b.mantissa) / doubleScale; + } + + function mul_(uint a, uint b) internal pure returns (uint) { + return mul_(a, b, "multiplication overflow"); + } + + function mul_(uint a, uint b, string memory errorMessage) internal pure returns (uint) { + if (a == 0 || b == 0) { + return 0; + } + uint c = a * b; + require(c / a == b, errorMessage); + return c; + } + + function div_(Exp memory a, Exp memory b) internal pure returns (Exp memory) { + return Exp({ mantissa: div_(mul_(a.mantissa, expScale), b.mantissa) }); + } + + function div_(Exp memory a, uint b) internal pure returns (Exp memory) { + return Exp({ mantissa: div_(a.mantissa, b) }); + } + + function div_(uint a, Exp memory b) internal pure returns (uint) { + return div_(mul_(a, expScale), b.mantissa); + } + + function div_(Double memory a, Double memory b) internal pure returns (Double memory) { + return Double({ mantissa: div_(mul_(a.mantissa, doubleScale), b.mantissa) }); + } + + function div_(Double memory a, uint b) internal pure returns (Double memory) { + return Double({ mantissa: div_(a.mantissa, b) }); + } + + function div_(uint a, Double memory b) internal pure returns (uint) { + return div_(mul_(a, doubleScale), b.mantissa); + } + + function div_(uint a, uint b) internal pure returns (uint) { + return div_(a, b, "divide by zero"); + } + + function div_(uint a, uint b, string memory errorMessage) internal pure returns (uint) { + require(b > 0, errorMessage); + return a / b; + } + + function fraction(uint a, uint b) internal pure returns (Double memory) { + return Double({ mantissa: div_(mul_(a, doubleScale), b) }); + } +} diff --git a/contracts/Diamond/libraries/LibHelper.sol b/contracts/Diamond/libraries/LibHelper.sol index ce4fe0246..62afb28aa 100644 --- a/contracts/Diamond/libraries/LibHelper.sol +++ b/contracts/Diamond/libraries/LibHelper.sol @@ -2,18 +2,18 @@ pragma solidity 0.8.13; import "../../Tokens/VTokens/VToken.sol"; import "./appStorage.sol"; import "./LibAccessCheck.sol"; +import "../../Utils/ErrorReporter.sol"; +import "./LibExponentialNoError.sol"; + import "../../Utils/ExponentialNoError.sol"; library LibHelper { /// @notice The initial Venus index for a market uint224 public constant venusInitialIndex = 1e36; - // closeFactorMantissa must be strictly greater than this value uint internal constant closeFactorMinMantissa = 0.05e18; // 0.05 - // closeFactorMantissa must not exceed this value uint internal constant closeFactorMaxMantissa = 0.9e18; // 0.9 - // No collateralFactorMantissa may exceed this value uint internal constant collateralFactorMaxMantissa = 0.9e18; // 0.9 @@ -34,7 +34,7 @@ library LibHelper { VToken vTokenModify, uint redeemTokens, uint borrowAmount - ) internal view returns (Error, uint, uint) { + ) internal view returns (ComptrollerErrorReporter.Error, uint, uint) { AppStorage storage s = LibAppStorage.diamondStorage(); (uint err, uint liquidity, uint shortfall) = s.comptrollerLens.getHypotheticalAccountLiquidity( address(this), @@ -43,7 +43,7 @@ library LibHelper { redeemTokens, borrowAmount ); - return (Error(err), liquidity, shortfall); + return (ComptrollerErrorReporter.Error(err), liquidity, shortfall); } /** @@ -54,14 +54,21 @@ library LibHelper { AppStorage storage s = LibAppStorage.diamondStorage(); VenusMarketState storage supplyState = s.venusSupplyState[vToken]; uint supplySpeed = s.venusSupplySpeeds[vToken]; - uint32 blockNumber = safe32(LibAccessCheck.getBlockNumber(), "block number exceeds 32 bits"); - uint deltaBlocks = sub_(uint(blockNumber), uint(supplyState.block)); + uint32 blockNumber = LibExponentialNoError.safe32( + LibAccessCheck.getBlockNumber(), + "block number exceeds 32 bits" + ); + uint deltaBlocks = LibExponentialNoError.sub_(uint(blockNumber), uint(supplyState.block)); if (deltaBlocks > 0 && supplySpeed > 0) { uint supplyTokens = VToken(vToken).totalSupply(); - uint venusAccrued = mul_(deltaBlocks, supplySpeed); - Double memory ratio = supplyTokens > 0 ? fraction(venusAccrued, supplyTokens) : Double({ mantissa: 0 }); - supplyState.index = safe224( - add_(Double({ mantissa: supplyState.index }), ratio).mantissa, + uint venusAccrued = LibExponentialNoError.mul_(deltaBlocks, supplySpeed); + LibExponentialNoError.Double memory ratio = supplyTokens > 0 + ? LibExponentialNoError.fraction(venusAccrued, supplyTokens) + : LibExponentialNoError.Double({ mantissa: 0 }); + supplyState.index = LibExponentialNoError.safe224( + LibExponentialNoError + .add_(LibExponentialNoError.Double({ mantissa: supplyState.index }), ratio) + .mantissa, "new index exceeds 224 bits" ); supplyState.block = blockNumber; @@ -74,18 +81,25 @@ library LibHelper { * @notice Accrue XVS to the market by updating the borrow index * @param vToken The market whose borrow index to update */ - function updateVenusBorrowIndex(address vToken, Exp memory marketBorrowIndex) internal { + function updateVenusBorrowIndex(address vToken, ExponentialNoError.Exp memory marketBorrowIndex) internal { AppStorage storage s = LibAppStorage.diamondStorage(); VenusMarketState storage borrowState = s.venusBorrowState[vToken]; uint borrowSpeed = s.venusBorrowSpeeds[vToken]; - uint32 blockNumber = safe32(LibAccessCheck.getBlockNumber(), "block number exceeds 32 bits"); - uint deltaBlocks = sub_(uint(blockNumber), uint(borrowState.block)); + uint32 blockNumber = LibExponentialNoError.safe32( + LibAccessCheck.getBlockNumber(), + "block number exceeds 32 bits" + ); + uint deltaBlocks = LibExponentialNoError.sub_(uint(blockNumber), uint(borrowState.block)); if (deltaBlocks > 0 && borrowSpeed > 0) { - uint borrowAmount = div_(VToken(vToken).totalBorrows(), marketBorrowIndex); - uint venusAccrued = mul_(deltaBlocks, borrowSpeed); - Double memory ratio = borrowAmount > 0 ? fraction(venusAccrued, borrowAmount) : Double({ mantissa: 0 }); - borrowState.index = safe224( - add_(Double({ mantissa: borrowState.index }), ratio).mantissa, + uint borrowAmount = LibExponentialNoError.div_(VToken(vToken).totalBorrows(), marketBorrowIndex); + uint venusAccrued = LibExponentialNoError.mul_(deltaBlocks, borrowSpeed); + LibExponentialNoError.Double memory ratio = borrowAmount > 0 + ? LibExponentialNoError.fraction(venusAccrued, borrowAmount) + : LibExponentialNoError.Double({ mantissa: 0 }); + borrowState.index = LibExponentialNoError.safe224( + LibExponentialNoError + .add_(LibExponentialNoError.Double({ mantissa: borrowState.index }), ratio) + .mantissa, "new index exceeds 224 bits" ); borrowState.block = blockNumber; @@ -101,33 +115,28 @@ library LibHelper { */ function distributeSupplierVenus(address vToken, address supplier) internal { AppStorage storage s = LibAppStorage.diamondStorage(); - if (address(vaiVaultAddress) != address(0)) { - releaseToVault(); + if (address(s.vaiVaultAddress) != address(0)) { + // releaseToVault(); } - uint supplyIndex = s.venusSupplyState[vToken].index; uint supplierIndex = s.venusSupplierIndex[vToken][supplier]; - // Update supplier's index to the current index since we are distributing accrued XVS s.venusSupplierIndex[vToken][supplier] = supplyIndex; - if (supplierIndex == 0 && supplyIndex >= venusInitialIndex) { // Covers the case where users supplied tokens before the market's supply state index was set. // Rewards the user with XVS accrued from the start of when supplier rewards were first // set for the market. supplierIndex = venusInitialIndex; } - // Calculate change in the cumulative sum of the XVS per vToken accrued - Double memory deltaIndex = Double({ mantissa: sub_(supplyIndex, supplierIndex) }); - + LibExponentialNoError.Double memory deltaIndex = LibExponentialNoError.Double({ + mantissa: LibExponentialNoError.sub_(supplyIndex, supplierIndex) + }); // Multiply of supplierTokens and supplierDelta - uint supplierDelta = mul_(VToken(vToken).balanceOf(supplier), deltaIndex); - + uint supplierDelta = LibExponentialNoError.mul_(VToken(vToken).balanceOf(supplier), deltaIndex); // Addition of supplierAccrued and supplierDelta - s.venusAccrued[supplier] = add_(s.venusAccrued[supplier], supplierDelta); - - emit DistributedSupplierVenus(VToken(vToken), supplier, supplierDelta, supplyIndex); + s.venusAccrued[supplier] = LibExponentialNoError.add_(s.venusAccrued[supplier], supplierDelta); + // emit DistributedSupplierVenus(VToken(vToken), supplier, supplierDelta, supplyIndex); } /** @@ -136,33 +145,35 @@ library LibHelper { * @param vToken The market in which the borrower is interacting * @param borrower The address of the borrower to distribute XVS to */ - function distributeBorrowerVenus(address vToken, address borrower, Exp memory marketBorrowIndex) internal { + function distributeBorrowerVenus( + address vToken, + address borrower, + ExponentialNoError.Exp memory marketBorrowIndex + ) internal { AppStorage storage s = LibAppStorage.diamondStorage(); if (address(s.vaiVaultAddress) != address(0)) { - releaseToVault(); + // releaseToVault(); } - uint borrowIndex = s.venusBorrowState[vToken].index; uint borrowerIndex = s.venusBorrowerIndex[vToken][borrower]; - // Update borrowers's index to the current index since we are distributing accrued XVS s.venusBorrowerIndex[vToken][borrower] = borrowIndex; - if (borrowerIndex == 0 && borrowIndex >= venusInitialIndex) { // Covers the case where users borrowed tokens before the market's borrow state index was set. // Rewards the user with XVS accrued from the start of when borrower rewards were first // set for the market. borrowerIndex = venusInitialIndex; } - // Calculate change in the cumulative sum of the XVS per borrowed unit accrued - Double memory deltaIndex = Double({ mantissa: sub_(borrowIndex, borrowerIndex) }); - - uint borrowerDelta = mul_(div_(VToken(vToken).borrowBalanceStored(borrower), marketBorrowIndex), deltaIndex); - - s.venusAccrued[borrower] = add_(s.venusAccrued[borrower], borrowerDelta); - - emit DistributedBorrowerVenus(VToken(vToken), borrower, borrowerDelta, borrowIndex); + LibExponentialNoError.Double memory deltaIndex = LibExponentialNoError.Double({ + mantissa: LibExponentialNoError.sub_(borrowIndex, borrowerIndex) + }); + uint borrowerDelta = LibExponentialNoError.mul_( + LibExponentialNoError.div_(VToken(vToken).borrowBalanceStored(borrower), marketBorrowIndex), + deltaIndex + ); + s.venusAccrued[borrower] = LibExponentialNoError.add_(s.venusAccrued[borrower], borrowerDelta); + // emit DistributedBorrowerVenus(VToken(vToken), borrower, borrowerDelta, borrowIndex); } /** @@ -171,18 +182,15 @@ library LibHelper { * @param borrower The address of the account to modify * @return Success indicator for whether the market was entered */ - function addToMarketInternal(VToken vToken, address borrower) internal returns (Error) { + function addToMarketInternal(VToken vToken, address borrower) internal returns (ComptrollerErrorReporter.Error) { AppStorage storage s = LibAppStorage.diamondStorage(); - LibAccessCheck.checkActionPauseState(address(vToken), Action.ENTER_MARKET); - + LibAccessCheck.checkActionPauseState(address(vToken), LibAccessCheck.Action.ENTER_MARKET); Market storage marketToJoin = s.markets[address(vToken)]; LibAccessCheck.ensureListed(marketToJoin); - if (marketToJoin.accountMembership[borrower]) { // already joined - return Error.NO_ERROR; + return ComptrollerErrorReporter.Error.NO_ERROR; } - // survived the gauntlet, add to list // NOTE: we store these somewhat redundantly as a significant optimization // this avoids having to iterate through the list for the most common use cases @@ -190,35 +198,30 @@ library LibHelper { // and not whenever we want to check if an account is in a particular market marketToJoin.accountMembership[borrower] = true; s.accountAssets[borrower].push(vToken); - - emit MarketEntered(vToken, borrower); - - return Error.NO_ERROR; + // emit MarketEntered(vToken, borrower); + return ComptrollerErrorReporter.Error.NO_ERROR; } function redeemAllowedInternal(address vToken, address redeemer, uint redeemTokens) internal view returns (uint) { AppStorage storage s = LibAppStorage.diamondStorage(); LibAccessCheck.ensureListed(s.markets[vToken]); - /* If the redeemer is not 'in' the market, then we can bypass the liquidity check */ if (!s.markets[vToken].accountMembership[redeemer]) { - return uint(Error.NO_ERROR); + return uint(ComptrollerErrorReporter.Error.NO_ERROR); } - /* Otherwise, perform a hypothetical liquidity check to guard against shortfall */ - (Error err, , uint shortfall) = getHypotheticalAccountLiquidityInternal( + (ComptrollerErrorReporter.Error err, , uint shortfall) = getHypotheticalAccountLiquidityInternal( redeemer, VToken(vToken), redeemTokens, 0 ); - if (err != Error.NO_ERROR) { + if (err != ComptrollerErrorReporter.Error.NO_ERROR) { return uint(err); } if (shortfall != 0) { - return uint(Error.INSUFFICIENT_LIQUIDITY); + return uint(ComptrollerErrorReporter.Error.INSUFFICIENT_LIQUIDITY); } - - return uint(Error.NO_ERROR); + return uint(ComptrollerErrorReporter.Error.NO_ERROR); } } From b46f80d543895a50446467124e25ae7cab7302f6 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Fri, 10 Mar 2023 18:50:32 +0530 Subject: [PATCH 014/153] Upgraded solidity version from 0.5.16 to 0.8.13. --- contracts/Comptroller/ComptrollerLensInterface.sol | 2 +- contracts/Governance/GovernorAlpha.sol | 4 ++-- contracts/Governance/GovernorBravoDelegate.sol | 4 ++-- contracts/Governance/GovernorBravoDelegator.sol | 12 ++++++------ contracts/Governance/GovernorBravoInterfaces.sol | 2 +- contracts/Governance/IAccessControlManager.sol | 2 +- contracts/Lens/InterestRateModelLens.sol | 2 +- contracts/Lens/SnapshotLens.sol | 2 +- contracts/Lens/VenusLens.sol | 2 +- contracts/Lens/XVSStakingLens.sol | 2 +- contracts/Oracle/VenusChainlinkOracle.sol | 4 ++-- contracts/Tokens/BEP20Interface.sol | 2 +- contracts/Tokens/EIP20Interface.sol | 2 +- contracts/Tokens/EIP20NonStandardInterface.sol | 2 +- contracts/Tokens/VAI/VAIControllerStorage.sol | 2 +- contracts/Tokens/VAI/lib.sol | 2 +- contracts/Tokens/VRT/VRTConverter.sol | 2 +- contracts/Tokens/VRT/VRTConverterStorage.sol | 2 +- contracts/Tokens/VTokens/VBNB.sol.archive | 14 +++++++------- contracts/Tokens/VTokens/VBep20Immutable.sol | 4 ++-- contracts/Tokens/XVS/IXVSVesting.sol | 2 +- contracts/Tokens/XVS/XVS.sol | 12 ++++++------ contracts/Tokens/XVS/XVSVesting.sol | 2 +- contracts/Tokens/XVS/XVSVestingStorage.sol | 2 +- contracts/Utils/Address.sol | 6 +++--- contracts/Utils/CarefulMath.sol | 2 +- contracts/Utils/ECDSA.sol | 2 +- contracts/Utils/ErrorReporter.sol | 2 +- contracts/Utils/Exponential.sol | 2 +- contracts/Utils/ExponentialNoError.sol | 2 +- contracts/Utils/IBEP20.sol | 2 +- contracts/Utils/Ownable.sol | 4 ++-- contracts/Utils/Owned.sol | 2 +- contracts/Utils/SafeBEP20.sol | 2 +- contracts/Utils/SafeMath.sol | 2 +- contracts/Utils/Tokenlock.sol | 2 +- contracts/VRTVault/VRTVault.sol | 4 ++-- contracts/VRTVault/VRTVaultStorage.sol | 2 +- contracts/Vault/VAIVault.sol | 2 +- contracts/Vault/VAIVaultErrorReporter.sol | 2 +- contracts/Vault/VAIVaultProxy.sol | 10 +++++----- contracts/Vault/VAIVaultStorage.sol | 2 +- contracts/XVSVault/XVSStore.sol | 2 +- contracts/XVSVault/XVSVault.sol | 4 ++-- contracts/XVSVault/XVSVaultErrorReporter.sol | 2 +- contracts/XVSVault/XVSVaultStorage.sol | 2 +- 46 files changed, 75 insertions(+), 75 deletions(-) diff --git a/contracts/Comptroller/ComptrollerLensInterface.sol b/contracts/Comptroller/ComptrollerLensInterface.sol index 2f56b52c3..40eb14ffe 100644 --- a/contracts/Comptroller/ComptrollerLensInterface.sol +++ b/contracts/Comptroller/ComptrollerLensInterface.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; pragma experimental ABIEncoderV2; import "../Tokens/VTokens/VToken.sol"; diff --git a/contracts/Governance/GovernorAlpha.sol b/contracts/Governance/GovernorAlpha.sol index fca535056..cdbd43414 100644 --- a/contracts/Governance/GovernorAlpha.sol +++ b/contracts/Governance/GovernorAlpha.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; pragma experimental ABIEncoderV2; contract GovernorAlpha { @@ -26,7 +26,7 @@ contract GovernorAlpha { } // 1 block /// @notice The duration of voting on a proposal, in blocks - function votingPeriod() public pure returns (uint) { + function votingPeriod() public pure virtual returns (uint) { return (60 * 60 * 24 * 3) / 3; } // ~3 days in blocks (assuming 3s blocks) diff --git a/contracts/Governance/GovernorBravoDelegate.sol b/contracts/Governance/GovernorBravoDelegate.sol index c291a8e59..7e9fc7f11 100644 --- a/contracts/Governance/GovernorBravoDelegate.sol +++ b/contracts/Governance/GovernorBravoDelegate.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; pragma experimental ABIEncoderV2; import "./GovernorBravoInterfaces.sol"; @@ -286,7 +286,7 @@ contract GovernorBravoDelegate is GovernorBravoDelegateStorageV2, GovernorBravoE /** * @notice Gets actions of a proposal * @param proposalId the id of the proposal - * @return targets, values, signatures, and calldatas of the proposal actions + * return targets, values, signatures, and calldatas of the proposal actions */ function getActions( uint proposalId diff --git a/contracts/Governance/GovernorBravoDelegator.sol b/contracts/Governance/GovernorBravoDelegator.sol index 93381fd7e..75be37133 100644 --- a/contracts/Governance/GovernorBravoDelegator.sol +++ b/contracts/Governance/GovernorBravoDelegator.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; pragma experimental ABIEncoderV2; import "./GovernorBravoInterfaces.sol"; @@ -62,7 +62,7 @@ contract GovernorBravoDelegator is GovernorBravoDelegatorStorage, GovernorBravoE (bool success, bytes memory returnData) = callee.delegatecall(data); assembly { if eq(success, 0) { - revert(add(returnData, 0x20), returndatasize) + revert(add(returnData, 0x20), returndatasize()) } } } @@ -72,20 +72,20 @@ contract GovernorBravoDelegator is GovernorBravoDelegatorStorage, GovernorBravoE * It returns to the external caller whatever the implementation returns * or forwards reverts. */ - function() external payable { + fallback() external payable { // delegate all other functions to current implementation (bool success, ) = implementation.delegatecall(msg.data); assembly { let free_mem_ptr := mload(0x40) - returndatacopy(free_mem_ptr, 0, returndatasize) + returndatacopy(free_mem_ptr, 0, returndatasize()) switch success case 0 { - revert(free_mem_ptr, returndatasize) + revert(free_mem_ptr, returndatasize()) } default { - return(free_mem_ptr, returndatasize) + return(free_mem_ptr, returndatasize()) } } } diff --git a/contracts/Governance/GovernorBravoInterfaces.sol b/contracts/Governance/GovernorBravoInterfaces.sol index 9a8c02301..094d51955 100644 --- a/contracts/Governance/GovernorBravoInterfaces.sol +++ b/contracts/Governance/GovernorBravoInterfaces.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; pragma experimental ABIEncoderV2; contract GovernorBravoEvents { diff --git a/contracts/Governance/IAccessControlManager.sol b/contracts/Governance/IAccessControlManager.sol index 10f27e79e..7f66c4430 100644 --- a/contracts/Governance/IAccessControlManager.sol +++ b/contracts/Governance/IAccessControlManager.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; interface IAccessControlManager { /** diff --git a/contracts/Lens/InterestRateModelLens.sol b/contracts/Lens/InterestRateModelLens.sol index 813a1780f..dbc90cd59 100644 --- a/contracts/Lens/InterestRateModelLens.sol +++ b/contracts/Lens/InterestRateModelLens.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; pragma experimental ABIEncoderV2; import "../InterestRateModels/InterestRateModel.sol"; diff --git a/contracts/Lens/SnapshotLens.sol b/contracts/Lens/SnapshotLens.sol index d44d94a02..50da11a47 100644 --- a/contracts/Lens/SnapshotLens.sol +++ b/contracts/Lens/SnapshotLens.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; pragma experimental ABIEncoderV2; import "../Tokens/VTokens/VToken.sol"; diff --git a/contracts/Lens/VenusLens.sol b/contracts/Lens/VenusLens.sol index 234ca822f..d0e0bf7b9 100644 --- a/contracts/Lens/VenusLens.sol +++ b/contracts/Lens/VenusLens.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; pragma experimental ABIEncoderV2; import "../Tokens/VTokens/VBep20.sol"; diff --git a/contracts/Lens/XVSStakingLens.sol b/contracts/Lens/XVSStakingLens.sol index ca00bcd06..7d85a2d51 100644 --- a/contracts/Lens/XVSStakingLens.sol +++ b/contracts/Lens/XVSStakingLens.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../XVSVault/XVSVault.sol"; import "../Utils/IBEP20.sol"; diff --git a/contracts/Oracle/VenusChainlinkOracle.sol b/contracts/Oracle/VenusChainlinkOracle.sol index 5ad946aaa..38da1dfca 100644 --- a/contracts/Oracle/VenusChainlinkOracle.sol +++ b/contracts/Oracle/VenusChainlinkOracle.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../Tokens/VTokens/VBep20.sol"; import "../Tokens/BEP20Interface.sol"; @@ -32,7 +32,7 @@ contract VenusChainlinkOracle is PriceOracle { emit MaxStalePeriodUpdated(oldMaxStalePeriod, newMaxStalePeriod); } - function getUnderlyingPrice(VToken vToken) public view returns (uint) { + function getUnderlyingPrice(VToken vToken) public view override returns (uint) { string memory symbol = vToken.symbol(); if (compareStrings(symbol, "vBNB")) { return getChainlinkPrice(getFeed(symbol)); diff --git a/contracts/Tokens/BEP20Interface.sol b/contracts/Tokens/BEP20Interface.sol index da811fb64..13a3e988e 100644 --- a/contracts/Tokens/BEP20Interface.sol +++ b/contracts/Tokens/BEP20Interface.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; interface BEP20Interface { /** diff --git a/contracts/Tokens/EIP20Interface.sol b/contracts/Tokens/EIP20Interface.sol index 5784c15e1..27d5a8e91 100644 --- a/contracts/Tokens/EIP20Interface.sol +++ b/contracts/Tokens/EIP20Interface.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; /** * @title BEP 20 Token Standard Interface diff --git a/contracts/Tokens/EIP20NonStandardInterface.sol b/contracts/Tokens/EIP20NonStandardInterface.sol index d907fb83b..0df30bc79 100644 --- a/contracts/Tokens/EIP20NonStandardInterface.sol +++ b/contracts/Tokens/EIP20NonStandardInterface.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; /** * @title EIP20NonStandardInterface diff --git a/contracts/Tokens/VAI/VAIControllerStorage.sol b/contracts/Tokens/VAI/VAIControllerStorage.sol index 71a5bfaa5..2a3008b0c 100644 --- a/contracts/Tokens/VAI/VAIControllerStorage.sol +++ b/contracts/Tokens/VAI/VAIControllerStorage.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../../Comptroller/ComptrollerInterface.sol"; diff --git a/contracts/Tokens/VAI/lib.sol b/contracts/Tokens/VAI/lib.sol index e0038882f..9eef24883 100644 --- a/contracts/Tokens/VAI/lib.sol +++ b/contracts/Tokens/VAI/lib.sol @@ -13,7 +13,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -pragma solidity ^0.5.16; +pragma solidity 0.8.13; contract LibNote { event LogNote( diff --git a/contracts/Tokens/VRT/VRTConverter.sol b/contracts/Tokens/VRT/VRTConverter.sol index 2a34f9c2d..4fe4e83b1 100644 --- a/contracts/Tokens/VRT/VRTConverter.sol +++ b/contracts/Tokens/VRT/VRTConverter.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../../Utils/IBEP20.sol"; import "../../Utils/SafeBEP20.sol"; diff --git a/contracts/Tokens/VRT/VRTConverterStorage.sol b/contracts/Tokens/VRT/VRTConverterStorage.sol index a0925db71..15ffee15d 100644 --- a/contracts/Tokens/VRT/VRTConverterStorage.sol +++ b/contracts/Tokens/VRT/VRTConverterStorage.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../../Utils/SafeMath.sol"; import "../../Utils/IBEP20.sol"; diff --git a/contracts/Tokens/VTokens/VBNB.sol.archive b/contracts/Tokens/VTokens/VBNB.sol.archive index 3fa173ee8..da6f4efeb 100644 --- a/contracts/Tokens/VTokens/VBNB.sol.archive +++ b/contracts/Tokens/VTokens/VBNB.sol.archive @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "./VToken.sol"; @@ -26,9 +26,9 @@ contract VBNB is VToken { string memory symbol_, uint8 decimals_, address payable admin_ - ) public { + ) { // Creator of the contract is admin during initialization - admin = msg.sender; + admin = payable(msg.sender); initialize(comptroller_, interestRateModel_, initialExchangeRateMantissa_, name_, symbol_, decimals_); @@ -39,7 +39,7 @@ contract VBNB is VToken { /** * @notice Send BNB to VBNB to mint */ - function() external payable { + fallback() external payable { (uint err, ) = mintInternal(msg.value); requireNoError(err, "mint failed"); } @@ -135,14 +135,14 @@ contract VBNB is VToken { * @param amount Amount of BNB being sent * @return The actual amount of BNB transferred */ - function doTransferIn(address from, uint amount) internal returns (uint) { + function doTransferIn(address from, uint amount) internal override returns (uint) { // Sanity checks require(msg.sender == from, "sender mismatch"); require(msg.value == amount, "value mismatch"); return amount; } - function doTransferOut(address payable to, uint amount) internal { + function doTransferOut(address payable to, uint amount) internal virtual override { /* Send the BNB, with minimal gas and revert on failure */ to.transfer(amount); } @@ -152,7 +152,7 @@ contract VBNB is VToken { * @dev This excludes the value of the current message, if any * @return The quantity of BNB owned by this contract */ - function getCashPrior() internal view returns (uint) { + function getCashPrior() internal view override returns (uint) { (MathError err, uint startingBalance) = subUInt(address(this).balance, msg.value); require(err == MathError.NO_ERROR, "cash prior math error"); return startingBalance; diff --git a/contracts/Tokens/VTokens/VBep20Immutable.sol b/contracts/Tokens/VTokens/VBep20Immutable.sol index 18a1c5f64..0616cb208 100644 --- a/contracts/Tokens/VTokens/VBep20Immutable.sol +++ b/contracts/Tokens/VTokens/VBep20Immutable.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "./VBep20.sol"; @@ -30,7 +30,7 @@ contract VBep20Immutable is VBep20 { address payable admin_ ) public { // Creator of the contract is admin during initialization - admin = msg.sender; + admin = payable(msg.sender); // Initialize the market initialize( diff --git a/contracts/Tokens/XVS/IXVSVesting.sol b/contracts/Tokens/XVS/IXVSVesting.sol index 9e176d465..12fbd578d 100644 --- a/contracts/Tokens/XVS/IXVSVesting.sol +++ b/contracts/Tokens/XVS/IXVSVesting.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; interface IXVSVesting { /// @param _recipient Address of the Vesting. recipient entitled to claim the vested funds diff --git a/contracts/Tokens/XVS/XVS.sol b/contracts/Tokens/XVS/XVS.sol index ad269af1c..5396b1e9f 100644 --- a/contracts/Tokens/XVS/XVS.sol +++ b/contracts/Tokens/XVS/XVS.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../../Utils/Tokenlock.sol"; @@ -87,8 +87,8 @@ contract XVS is Tokenlock { */ function approve(address spender, uint rawAmount) external validLock returns (bool) { uint96 amount; - if (rawAmount == uint(-1)) { - amount = uint96(-1); + if (rawAmount == type(uint).max) { + amount = type(uint96).max; } else { amount = safe96(rawAmount, "XVS::approve: amount exceeds 96 bits"); } @@ -132,7 +132,7 @@ contract XVS is Tokenlock { uint96 spenderAllowance = allowances[src][spender]; uint96 amount = safe96(rawAmount, "XVS::approve: amount exceeds 96 bits"); - if (spender != src && spenderAllowance != uint96(-1)) { + if (spender != src && spenderAllowance != type(uint96).max) { uint96 newAllowance = sub96( spenderAllowance, amount, @@ -173,7 +173,7 @@ contract XVS is Tokenlock { address signatory = ecrecover(digest, v, r, s); require(signatory != address(0), "XVS::delegateBySig: invalid signature"); require(nonce == nonces[signatory]++, "XVS::delegateBySig: invalid nonce"); - require(now <= expiry, "XVS::delegateBySig: signature expired"); + require(block.timestamp <= expiry, "XVS::delegateBySig: signature expired"); return _delegate(signatory, delegatee); } @@ -301,7 +301,7 @@ contract XVS is Tokenlock { return a - b; } - function getChainId() internal pure returns (uint) { + function getChainId() internal view returns (uint) { uint256 chainId; assembly { chainId := chainid() diff --git a/contracts/Tokens/XVS/XVSVesting.sol b/contracts/Tokens/XVS/XVSVesting.sol index ac8102865..7caf8f086 100644 --- a/contracts/Tokens/XVS/XVSVesting.sol +++ b/contracts/Tokens/XVS/XVSVesting.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../../Utils/IBEP20.sol"; import "../../Utils/SafeBEP20.sol"; diff --git a/contracts/Tokens/XVS/XVSVestingStorage.sol b/contracts/Tokens/XVS/XVSVestingStorage.sol index ee39eb46f..93d7c50bc 100644 --- a/contracts/Tokens/XVS/XVSVestingStorage.sol +++ b/contracts/Tokens/XVS/XVSVestingStorage.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../../Utils/SafeMath.sol"; import "../../Utils/IBEP20.sol"; diff --git a/contracts/Utils/Address.sol b/contracts/Utils/Address.sol index 3f12648cc..a1ed9ae9d 100644 --- a/contracts/Utils/Address.sol +++ b/contracts/Utils/Address.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.5; +pragma solidity 0.8.13; /** * @dev Collection of functions related to the address type @@ -41,7 +41,7 @@ library Address { * _Available since v2.4.0._ */ function toPayable(address account) internal pure returns (address payable) { - return address(uint160(account)); + return payable(address(uint160(account))); } /** @@ -67,7 +67,7 @@ library Address { // solhint-disable-next-line avoid-call-value // solium-disable-next-line security/no-call-value - (bool success, ) = recipient.call.value(amount)(""); + (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } } diff --git a/contracts/Utils/CarefulMath.sol b/contracts/Utils/CarefulMath.sol index 63b1a8bc6..baa99372b 100644 --- a/contracts/Utils/CarefulMath.sol +++ b/contracts/Utils/CarefulMath.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; /** * @title Careful Math diff --git a/contracts/Utils/ECDSA.sol b/contracts/Utils/ECDSA.sol index 9ca72ba71..f919fe4ff 100644 --- a/contracts/Utils/ECDSA.sol +++ b/contracts/Utils/ECDSA.sol @@ -4,7 +4,7 @@ // SPDX-Copyright-Text: OpenZeppelin, 2021 // SPDX-Copyright-Text: Venus, 2021 -pragma solidity ^0.5.16; +pragma solidity 0.8.13; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. diff --git a/contracts/Utils/ErrorReporter.sol b/contracts/Utils/ErrorReporter.sol index 9a3191e8f..e4b555c88 100644 --- a/contracts/Utils/ErrorReporter.sol +++ b/contracts/Utils/ErrorReporter.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; contract ComptrollerErrorReporter { enum Error { diff --git a/contracts/Utils/Exponential.sol b/contracts/Utils/Exponential.sol index 70c317628..304a7e870 100644 --- a/contracts/Utils/Exponential.sol +++ b/contracts/Utils/Exponential.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "./CarefulMath.sol"; import "./ExponentialNoError.sol"; diff --git a/contracts/Utils/ExponentialNoError.sol b/contracts/Utils/ExponentialNoError.sol index 016e2614f..9036400b6 100644 --- a/contracts/Utils/ExponentialNoError.sol +++ b/contracts/Utils/ExponentialNoError.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; /** * @title Exponential module for storing fixed-precision decimals diff --git a/contracts/Utils/IBEP20.sol b/contracts/Utils/IBEP20.sol index 025c6deac..4e990eb34 100644 --- a/contracts/Utils/IBEP20.sol +++ b/contracts/Utils/IBEP20.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.0; +pragma solidity 0.8.13; /** * @dev Interface of the BEP20 standard as defined in the EIP. Does not include diff --git a/contracts/Utils/Ownable.sol b/contracts/Utils/Ownable.sol index d041f72f0..49d9f17ef 100644 --- a/contracts/Utils/Ownable.sol +++ b/contracts/Utils/Ownable.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "./Context.sol"; @@ -14,7 +14,7 @@ import "./Context.sol"; * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ -contract Ownable is Context { +abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); diff --git a/contracts/Utils/Owned.sol b/contracts/Utils/Owned.sol index 3ad6dabfc..aef4726dd 100644 --- a/contracts/Utils/Owned.sol +++ b/contracts/Utils/Owned.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; contract Owned { address public owner; diff --git a/contracts/Utils/SafeBEP20.sol b/contracts/Utils/SafeBEP20.sol index 18f68ea34..41ccd3808 100644 --- a/contracts/Utils/SafeBEP20.sol +++ b/contracts/Utils/SafeBEP20.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.0; +pragma solidity 0.8.13; import "./SafeMath.sol"; import "./IBEP20.sol"; diff --git a/contracts/Utils/SafeMath.sol b/contracts/Utils/SafeMath.sol index 283120088..2225efbd9 100644 --- a/contracts/Utils/SafeMath.sol +++ b/contracts/Utils/SafeMath.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow diff --git a/contracts/Utils/Tokenlock.sol b/contracts/Utils/Tokenlock.sol index abcf8e354..de3c0d267 100644 --- a/contracts/Utils/Tokenlock.sol +++ b/contracts/Utils/Tokenlock.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "./Owned.sol"; diff --git a/contracts/VRTVault/VRTVault.sol b/contracts/VRTVault/VRTVault.sol index 4c5a98c90..96f6b5bd5 100644 --- a/contracts/VRTVault/VRTVault.sol +++ b/contracts/VRTVault/VRTVault.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../Utils/SafeBEP20.sol"; import "../Utils/IBEP20.sol"; @@ -242,7 +242,7 @@ contract VRTVault is VRTVaultStorage { token.safeTransfer(receiver, amount); } - function getBlockNumber() public view returns (uint256) { + function getBlockNumber() public view virtual returns (uint256) { return block.number; } diff --git a/contracts/VRTVault/VRTVaultStorage.sol b/contracts/VRTVault/VRTVaultStorage.sol index 38d2aa5d2..efae1ecaa 100644 --- a/contracts/VRTVault/VRTVaultStorage.sol +++ b/contracts/VRTVault/VRTVaultStorage.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../Utils/SafeMath.sol"; import "../Utils/IBEP20.sol"; diff --git a/contracts/Vault/VAIVault.sol b/contracts/Vault/VAIVault.sol index 1ad9a9802..e6575d8e7 100644 --- a/contracts/Vault/VAIVault.sol +++ b/contracts/Vault/VAIVault.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../Utils/SafeBEP20.sol"; import "../Utils/IBEP20.sol"; import "./VAIVaultProxy.sol"; diff --git a/contracts/Vault/VAIVaultErrorReporter.sol b/contracts/Vault/VAIVaultErrorReporter.sol index 1e6c8cee4..45504d880 100644 --- a/contracts/Vault/VAIVaultErrorReporter.sol +++ b/contracts/Vault/VAIVaultErrorReporter.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; contract VAIVaultErrorReporter { enum Error { diff --git a/contracts/Vault/VAIVaultProxy.sol b/contracts/Vault/VAIVaultProxy.sol index e7d3f430d..8f138e08e 100644 --- a/contracts/Vault/VAIVaultProxy.sol +++ b/contracts/Vault/VAIVaultProxy.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "./VAIVaultStorage.sol"; import "./VAIVaultErrorReporter.sol"; @@ -125,20 +125,20 @@ contract VAIVaultProxy is VAIVaultAdminStorage, VAIVaultErrorReporter { * It returns to the external caller whatever the implementation returns * or forwards reverts. */ - function() external payable { + fallback() external payable { // delegate all other functions to current implementation (bool success, ) = vaiVaultImplementation.delegatecall(msg.data); assembly { let free_mem_ptr := mload(0x40) - returndatacopy(free_mem_ptr, 0, returndatasize) + returndatacopy(free_mem_ptr, 0, returndatasize()) switch success case 0 { - revert(free_mem_ptr, returndatasize) + revert(free_mem_ptr, returndatasize()) } default { - return(free_mem_ptr, returndatasize) + return(free_mem_ptr, returndatasize()) } } } diff --git a/contracts/Vault/VAIVaultStorage.sol b/contracts/Vault/VAIVaultStorage.sol index f5a9419f4..779911fdc 100644 --- a/contracts/Vault/VAIVaultStorage.sol +++ b/contracts/Vault/VAIVaultStorage.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../Utils/SafeMath.sol"; import "../Utils/IBEP20.sol"; diff --git a/contracts/XVSVault/XVSStore.sol b/contracts/XVSVault/XVSStore.sol index e356e8594..2cd7e057c 100644 --- a/contracts/XVSVault/XVSStore.sol +++ b/contracts/XVSVault/XVSStore.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../Utils/SafeBEP20.sol"; import "../Utils/IBEP20.sol"; diff --git a/contracts/XVSVault/XVSVault.sol b/contracts/XVSVault/XVSVault.sol index 88d602e18..7116796fa 100644 --- a/contracts/XVSVault/XVSVault.sol +++ b/contracts/XVSVault/XVSVault.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; pragma experimental ABIEncoderV2; import "../Utils/ECDSA.sol"; @@ -648,7 +648,7 @@ contract XVSVault is XVSVaultStorage, ECDSA { return a - b; } - function getChainId() internal pure returns (uint) { + function getChainId() internal view returns (uint) { uint256 chainId; assembly { chainId := chainid() diff --git a/contracts/XVSVault/XVSVaultErrorReporter.sol b/contracts/XVSVault/XVSVaultErrorReporter.sol index 286384652..82fb306d9 100644 --- a/contracts/XVSVault/XVSVaultErrorReporter.sol +++ b/contracts/XVSVault/XVSVaultErrorReporter.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; contract XVSVaultErrorReporter { enum Error { diff --git a/contracts/XVSVault/XVSVaultStorage.sol b/contracts/XVSVault/XVSVaultStorage.sol index 9bfd775a6..8ed2ec0b1 100644 --- a/contracts/XVSVault/XVSVaultStorage.sol +++ b/contracts/XVSVault/XVSVaultStorage.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../Utils/SafeMath.sol"; import "../Utils/IBEP20.sol"; From ad098d499f2d5ec0f277b32d3daf9993ce855fc5 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Fri, 10 Mar 2023 18:52:43 +0530 Subject: [PATCH 015/153] Upgraded solidity version and refactor comptroller contracts. --- contracts/Comptroller/Comptroller.sol | 69 ++++++++------ contracts/Comptroller/ComptrollerG1.sol | 63 +++++++------ contracts/Comptroller/ComptrollerG2.sol | 59 +++++++----- contracts/Comptroller/ComptrollerG3.sol | 59 +++++++----- contracts/Comptroller/ComptrollerG4.sol | 61 +++++++------ contracts/Comptroller/ComptrollerG5.sol | 61 +++++++------ .../Comptroller/ComptrollerInterface.sol | 89 ++++++++++--------- contracts/Comptroller/ComptrollerStorage.sol | 2 +- contracts/Comptroller/Unitroller.sol | 10 +-- contracts/Comptroller/UpdatedComptroller.sol | 50 +++++++---- .../UpdatedComptrollerInterface.sol | 63 +++++++------ 11 files changed, 338 insertions(+), 248 deletions(-) diff --git a/contracts/Comptroller/Comptroller.sol b/contracts/Comptroller/Comptroller.sol index 6a15067ba..3c4bcbbfe 100644 --- a/contracts/Comptroller/Comptroller.sol +++ b/contracts/Comptroller/Comptroller.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../Oracle/PriceOracle.sol"; import "../Tokens/VTokens/VToken.sol"; @@ -189,7 +189,7 @@ contract Comptroller is ComptrollerV11Storage, ComptrollerInterfaceG2, Comptroll * @param vTokens The list of addresses of the vToken markets to be enabled * @return Success indicator for whether each corresponding market was entered */ - function enterMarkets(address[] calldata vTokens) external returns (uint[] memory) { + function enterMarkets(address[] calldata vTokens) external override returns (uint[] memory) { uint len = vTokens.length; uint[] memory results = new uint[](len); @@ -237,7 +237,7 @@ contract Comptroller is ComptrollerV11Storage, ComptrollerInterfaceG2, Comptroll * @param vTokenAddress The address of the asset to be removed * @return Whether or not the account successfully exited the market */ - function exitMarket(address vTokenAddress) external returns (uint) { + function exitMarket(address vTokenAddress) external override returns (uint) { checkActionPauseState(vTokenAddress, Action.EXIT_MARKET); VToken vToken = VToken(vTokenAddress); @@ -274,7 +274,7 @@ contract Comptroller is ComptrollerV11Storage, ComptrollerInterfaceG2, Comptroll for (; i < len; ++i) { if (userAssetList[i] == vToken) { userAssetList[i] = userAssetList[len - 1]; - userAssetList.length--; + userAssetList.pop(); break; } } @@ -313,7 +313,7 @@ contract Comptroller is ComptrollerV11Storage, ComptrollerInterfaceG2, Comptroll * @param mintAmount The amount of underlying being supplied to the market in exchange for tokens * @return 0 if the mint is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) */ - function mintAllowed(address vToken, address minter, uint mintAmount) external returns (uint) { + function mintAllowed(address vToken, address minter, uint mintAmount) external override returns (uint) { // Pausing is a very serious situation - we revert to sound the alarms checkProtocolPauseState(); checkActionPauseState(vToken, Action.MINT); @@ -341,7 +341,7 @@ contract Comptroller is ComptrollerV11Storage, ComptrollerInterfaceG2, Comptroll * @param actualMintAmount The amount of the underlying asset being minted * @param mintTokens The number of tokens being minted */ - function mintVerify(address vToken, address minter, uint actualMintAmount, uint mintTokens) external {} + function mintVerify(address vToken, address minter, uint actualMintAmount, uint mintTokens) external override {} /** * @notice Checks if the account should be allowed to redeem tokens in the given market @@ -350,7 +350,7 @@ contract Comptroller is ComptrollerV11Storage, ComptrollerInterfaceG2, Comptroll * @param redeemTokens The number of vTokens to exchange for the underlying asset in the market * @return 0 if the redeem is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) */ - function redeemAllowed(address vToken, address redeemer, uint redeemTokens) external returns (uint) { + function redeemAllowed(address vToken, address redeemer, uint redeemTokens) external override returns (uint) { checkProtocolPauseState(); checkActionPauseState(vToken, Action.REDEEM); @@ -399,7 +399,7 @@ contract Comptroller is ComptrollerV11Storage, ComptrollerInterfaceG2, Comptroll * @param redeemTokens The number of tokens being redeemed */ // solhint-disable-next-line no-unused-vars - function redeemVerify(address vToken, address redeemer, uint redeemAmount, uint redeemTokens) external { + function redeemVerify(address vToken, address redeemer, uint redeemAmount, uint redeemTokens) external override { require(redeemTokens != 0 || redeemAmount == 0, "redeemTokens zero"); } @@ -410,7 +410,7 @@ contract Comptroller is ComptrollerV11Storage, ComptrollerInterfaceG2, Comptroll * @param borrowAmount The amount of underlying the account would borrow * @return 0 if the borrow is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) */ - function borrowAllowed(address vToken, address borrower, uint borrowAmount) external returns (uint) { + function borrowAllowed(address vToken, address borrower, uint borrowAmount) external override returns (uint) { // Pausing is a very serious situation - we revert to sound the alarms checkProtocolPauseState(); checkActionPauseState(vToken, Action.BORROW); @@ -466,7 +466,7 @@ contract Comptroller is ComptrollerV11Storage, ComptrollerInterfaceG2, Comptroll * @param borrower The address borrowing the underlying * @param borrowAmount The amount of the underlying asset requested to borrow */ - function borrowVerify(address vToken, address borrower, uint borrowAmount) external {} + function borrowVerify(address vToken, address borrower, uint borrowAmount) external override {} /** * @notice Checks if the account should be allowed to repay a borrow in the given market @@ -483,7 +483,7 @@ contract Comptroller is ComptrollerV11Storage, ComptrollerInterfaceG2, Comptroll address borrower, // solhint-disable-next-line no-unused-vars uint repayAmount - ) external returns (uint) { + ) external override returns (uint) { checkProtocolPauseState(); checkActionPauseState(vToken, Action.REPAY); ensureListed(markets[vToken]); @@ -509,7 +509,7 @@ contract Comptroller is ComptrollerV11Storage, ComptrollerInterfaceG2, Comptroll address borrower, uint actualRepayAmount, uint borrowerIndex - ) external {} + ) external override {} /** * @notice Checks if the liquidation should be allowed to occur @@ -525,7 +525,7 @@ contract Comptroller is ComptrollerV11Storage, ComptrollerInterfaceG2, Comptroll address liquidator, address borrower, uint repayAmount - ) external returns (uint) { + ) external override returns (uint) { checkProtocolPauseState(); // if we want to pause liquidating to vTokenCollateral, we should pause seizing @@ -541,7 +541,7 @@ contract Comptroller is ComptrollerV11Storage, ComptrollerInterfaceG2, Comptroll } /* The borrower must have shortfall in order to be liquidatable */ - (Error err, , uint shortfall) = getHypotheticalAccountLiquidityInternal(borrower, VToken(0), 0, 0); + (Error err, , uint shortfall) = getHypotheticalAccountLiquidityInternal(borrower, VToken(address(0)), 0, 0); if (err != Error.NO_ERROR) { return uint(err); } @@ -580,7 +580,7 @@ contract Comptroller is ComptrollerV11Storage, ComptrollerInterfaceG2, Comptroll address borrower, uint actualRepayAmount, uint seizeTokens - ) external {} + ) external override {} /** * @notice Checks if the seizing of assets should be allowed to occur @@ -596,7 +596,7 @@ contract Comptroller is ComptrollerV11Storage, ComptrollerInterfaceG2, Comptroll address liquidator, address borrower, uint seizeTokens // solhint-disable-line no-unused-vars - ) external returns (uint) { + ) external override returns (uint) { // Pausing is a very serious situation - we revert to sound the alarms checkProtocolPauseState(); checkActionPauseState(vTokenCollateral, Action.SEIZE); @@ -633,7 +633,7 @@ contract Comptroller is ComptrollerV11Storage, ComptrollerInterfaceG2, Comptroll address liquidator, address borrower, uint seizeTokens - ) external {} + ) external override {} /** * @notice Checks if the account should be allowed to transfer tokens in the given market @@ -643,7 +643,12 @@ contract Comptroller is ComptrollerV11Storage, ComptrollerInterfaceG2, Comptroll * @param transferTokens The number of vTokens to transfer * @return 0 if the transfer is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) */ - function transferAllowed(address vToken, address src, address dst, uint transferTokens) external returns (uint) { + function transferAllowed( + address vToken, + address src, + address dst, + uint transferTokens + ) external override returns (uint) { // Pausing is a very serious situation - we revert to sound the alarms checkProtocolPauseState(); checkActionPauseState(vToken, Action.TRANSFER); @@ -670,7 +675,7 @@ contract Comptroller is ComptrollerV11Storage, ComptrollerInterfaceG2, Comptroll * @param dst The account which receives the tokens * @param transferTokens The number of vTokens to transfer */ - function transferVerify(address vToken, address src, address dst, uint transferTokens) external {} + function transferVerify(address vToken, address src, address dst, uint transferTokens) external override {} /** * @notice Determine the current account liquidity wrt collateral requirements @@ -679,7 +684,12 @@ contract Comptroller is ComptrollerV11Storage, ComptrollerInterfaceG2, Comptroll * account shortfall below collateral requirements) */ function getAccountLiquidity(address account) external view returns (uint, uint, uint) { - (Error err, uint liquidity, uint shortfall) = getHypotheticalAccountLiquidityInternal(account, VToken(0), 0, 0); + (Error err, uint liquidity, uint shortfall) = getHypotheticalAccountLiquidityInternal( + account, + VToken(address(0)), + 0, + 0 + ); return (uint(err), liquidity, shortfall); } @@ -749,7 +759,7 @@ contract Comptroller is ComptrollerV11Storage, ComptrollerInterfaceG2, Comptroll address vTokenBorrowed, address vTokenCollateral, uint actualRepayAmount - ) external view returns (uint, uint) { + ) external view override returns (uint, uint) { (uint err, uint seizeTokens) = comptrollerLens.liquidateCalculateSeizeTokens( address(this), vTokenBorrowed, @@ -769,7 +779,7 @@ contract Comptroller is ComptrollerV11Storage, ComptrollerInterfaceG2, Comptroll function liquidateVAICalculateSeizeTokens( address vTokenCollateral, uint actualRepayAmount - ) external view returns (uint, uint) { + ) external view override returns (uint, uint) { (uint err, uint seizeTokens) = comptrollerLens.liquidateVAICalculateSeizeTokens( address(this), vTokenCollateral, @@ -923,7 +933,10 @@ contract Comptroller is ComptrollerV11Storage, ComptrollerInterfaceG2, Comptroll vToken.isVToken(); // Sanity check to make sure its really a VToken // Note that isVenus is not in active use anymore - markets[address(vToken)] = Market({ isListed: true, isVenus: false, collateralFactorMantissa: 0 }); + Market storage newMarket = markets[address(vToken)]; + newMarket.isListed = true; + newMarket.isVenus = false; + newMarket.collateralFactorMantissa = 0; _addMarketInternal(vToken); _initializeMarket(address(vToken)); @@ -1352,7 +1365,7 @@ contract Comptroller is ComptrollerV11Storage, ComptrollerInterfaceG2, Comptroll address holder = holders[j]; // If there is a positive shortfall, the XVS reward is accrued, // but won't be granted to this holder - (, , uint shortfall) = getHypotheticalAccountLiquidityInternal(holder, VToken(0), 0, 0); + (, , uint shortfall) = getHypotheticalAccountLiquidityInternal(holder, VToken(address(0)), 0, 0); venusAccrued[holder] = grantXVSInternal(holder, venusAccrued[holder], shortfall, collateral); } } @@ -1490,7 +1503,7 @@ contract Comptroller is ComptrollerV11Storage, ComptrollerInterfaceG2, Comptroll return allMarkets; } - function getBlockNumber() public view returns (uint) { + function getBlockNumber() public view virtual returns (uint) { return block.number; } @@ -1498,7 +1511,7 @@ contract Comptroller is ComptrollerV11Storage, ComptrollerInterfaceG2, Comptroll * @notice Return the address of the XVS token * @return The address of XVS */ - function getXVSAddress() public view returns (address) { + function getXVSAddress() public view virtual returns (address) { return 0xcF6BB5389c92Bdda8a3747Ddb454cB7a64626C63; } @@ -1506,7 +1519,7 @@ contract Comptroller is ComptrollerV11Storage, ComptrollerInterfaceG2, Comptroll * @notice Return the address of the XVS vToken * @return The address of XVS vToken */ - function getXVSVTokenAddress() public view returns (address) { + function getXVSVTokenAddress() public view virtual returns (address) { return 0x151B1e2635A717bcDc836ECd6FbB62B674FE3E1D; } @@ -1527,7 +1540,7 @@ contract Comptroller is ComptrollerV11Storage, ComptrollerInterfaceG2, Comptroll * @param amount The amount of VAI to set to the account * @return The number of minted VAI by `owner` */ - function setMintedVAIOf(address owner, uint amount) external returns (uint) { + function setMintedVAIOf(address owner, uint amount) external override returns (uint) { checkProtocolPauseState(); // Pausing is a very serious situation - we revert to sound the alarms diff --git a/contracts/Comptroller/ComptrollerG1.sol b/contracts/Comptroller/ComptrollerG1.sol index 69cbee4a1..8bfb83128 100644 --- a/contracts/Comptroller/ComptrollerG1.sol +++ b/contracts/Comptroller/ComptrollerG1.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../Oracle/PriceOracle.sol"; import "../Tokens/VTokens/VToken.sol"; @@ -157,7 +157,7 @@ contract ComptrollerG1 is ComptrollerV1Storage, ComptrollerInterfaceG1, Comptrol * @param vTokens The list of addresses of the vToken markets to be enabled * @return Success indicator for whether each corresponding market was entered */ - function enterMarkets(address[] calldata vTokens) external returns (uint[] memory) { + function enterMarkets(address[] calldata vTokens) external override returns (uint[] memory) { uint len = vTokens.length; uint[] memory results = new uint[](len); @@ -212,7 +212,7 @@ contract ComptrollerG1 is ComptrollerV1Storage, ComptrollerInterfaceG1, Comptrol * @param vTokenAddress The address of the asset to be removed * @return Whether or not the account successfully exited the market */ - function exitMarket(address vTokenAddress) external returns (uint) { + function exitMarket(address vTokenAddress) external override returns (uint) { VToken vToken = VToken(vTokenAddress); /* Get sender tokensHeld and amountOwed underlying from the vToken */ (uint oErr, uint tokensHeld, uint amountOwed, ) = vToken.getAccountSnapshot(msg.sender); @@ -247,7 +247,7 @@ contract ComptrollerG1 is ComptrollerV1Storage, ComptrollerInterfaceG1, Comptrol for (; i < len; i++) { if (userAssetList[i] == vToken) { userAssetList[i] = userAssetList[len - 1]; - userAssetList.length--; + userAssetList.pop(); break; } } @@ -269,7 +269,11 @@ contract ComptrollerG1 is ComptrollerV1Storage, ComptrollerInterfaceG1, Comptrol * @param mintAmount The amount of underlying being supplied to the market in exchange for tokens * @return 0 if the mint is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) */ - function mintAllowed(address vToken, address minter, uint mintAmount) external onlyProtocolAllowed returns (uint) { + function mintAllowed( + address vToken, + address minter, + uint mintAmount + ) external override onlyProtocolAllowed returns (uint) { // Pausing is a very serious situation - we revert to sound the alarms require(!mintGuardianPaused[vToken], "mint is paused"); @@ -294,7 +298,7 @@ contract ComptrollerG1 is ComptrollerV1Storage, ComptrollerInterfaceG1, Comptrol * @param actualMintAmount The amount of the underlying asset being minted * @param mintTokens The number of tokens being minted */ - function mintVerify(address vToken, address minter, uint actualMintAmount, uint mintTokens) external { + function mintVerify(address vToken, address minter, uint actualMintAmount, uint mintTokens) external override { // Shh - currently unused vToken; minter; @@ -313,7 +317,7 @@ contract ComptrollerG1 is ComptrollerV1Storage, ComptrollerInterfaceG1, Comptrol address vToken, address redeemer, uint redeemTokens - ) external onlyProtocolAllowed returns (uint) { + ) external override onlyProtocolAllowed returns (uint) { uint allowed = redeemAllowedInternal(vToken, redeemer, redeemTokens); if (allowed != uint(Error.NO_ERROR)) { return allowed; @@ -360,7 +364,7 @@ contract ComptrollerG1 is ComptrollerV1Storage, ComptrollerInterfaceG1, Comptrol * @param redeemAmount The amount of the underlying asset being redeemed * @param redeemTokens The number of tokens being redeemed */ - function redeemVerify(address vToken, address redeemer, uint redeemAmount, uint redeemTokens) external { + function redeemVerify(address vToken, address redeemer, uint redeemAmount, uint redeemTokens) external override { // Shh - currently unused vToken; redeemer; @@ -380,7 +384,7 @@ contract ComptrollerG1 is ComptrollerV1Storage, ComptrollerInterfaceG1, Comptrol address vToken, address borrower, uint borrowAmount - ) external onlyProtocolAllowed returns (uint) { + ) external override onlyProtocolAllowed returns (uint) { // Pausing is a very serious situation - we revert to sound the alarms require(!borrowGuardianPaused[vToken], "borrow is paused"); @@ -430,7 +434,7 @@ contract ComptrollerG1 is ComptrollerV1Storage, ComptrollerInterfaceG1, Comptrol * @param borrower The address borrowing the underlying * @param borrowAmount The amount of the underlying asset requested to borrow */ - function borrowVerify(address vToken, address borrower, uint borrowAmount) external { + function borrowVerify(address vToken, address borrower, uint borrowAmount) external override { // Shh - currently unused vToken; borrower; @@ -455,7 +459,7 @@ contract ComptrollerG1 is ComptrollerV1Storage, ComptrollerInterfaceG1, Comptrol address payer, address borrower, uint repayAmount - ) external onlyProtocolAllowed returns (uint) { + ) external override onlyProtocolAllowed returns (uint) { // Shh - currently unused payer; borrower; @@ -486,7 +490,7 @@ contract ComptrollerG1 is ComptrollerV1Storage, ComptrollerInterfaceG1, Comptrol address borrower, uint actualRepayAmount, uint borrowerIndex - ) external { + ) external override { // Shh - currently unused vToken; payer; @@ -514,7 +518,7 @@ contract ComptrollerG1 is ComptrollerV1Storage, ComptrollerInterfaceG1, Comptrol address liquidator, address borrower, uint repayAmount - ) external onlyProtocolAllowed returns (uint) { + ) external override onlyProtocolAllowed returns (uint) { // Shh - currently unused liquidator; @@ -523,7 +527,7 @@ contract ComptrollerG1 is ComptrollerV1Storage, ComptrollerInterfaceG1, Comptrol } /* The borrower must have shortfall in order to be liquidatable */ - (Error err, , uint shortfall) = getHypotheticalAccountLiquidityInternal(borrower, VToken(0), 0, 0); + (Error err, , uint shortfall) = getHypotheticalAccountLiquidityInternal(borrower, VToken(address(0)), 0, 0); if (err != Error.NO_ERROR) { return uint(err); } @@ -559,7 +563,7 @@ contract ComptrollerG1 is ComptrollerV1Storage, ComptrollerInterfaceG1, Comptrol address borrower, uint actualRepayAmount, uint seizeTokens - ) external { + ) external override { // Shh - currently unused vTokenBorrowed; vTokenCollateral; @@ -588,7 +592,7 @@ contract ComptrollerG1 is ComptrollerV1Storage, ComptrollerInterfaceG1, Comptrol address liquidator, address borrower, uint seizeTokens - ) external onlyProtocolAllowed returns (uint) { + ) external override onlyProtocolAllowed returns (uint) { // Pausing is a very serious situation - we revert to sound the alarms require(!seizeGuardianPaused, "seize is paused"); @@ -625,7 +629,7 @@ contract ComptrollerG1 is ComptrollerV1Storage, ComptrollerInterfaceG1, Comptrol address liquidator, address borrower, uint seizeTokens - ) external { + ) external override { // Shh - currently unused vTokenCollateral; vTokenBorrowed; @@ -652,7 +656,7 @@ contract ComptrollerG1 is ComptrollerV1Storage, ComptrollerInterfaceG1, Comptrol address src, address dst, uint transferTokens - ) external onlyProtocolAllowed returns (uint) { + ) external override onlyProtocolAllowed returns (uint) { // Pausing is a very serious situation - we revert to sound the alarms require(!transferGuardianPaused, "transfer is paused"); @@ -678,7 +682,7 @@ contract ComptrollerG1 is ComptrollerV1Storage, ComptrollerInterfaceG1, Comptrol * @param dst The account which receives the tokens * @param transferTokens The number of vTokens to transfer */ - function transferVerify(address vToken, address src, address dst, uint transferTokens) external { + function transferVerify(address vToken, address src, address dst, uint transferTokens) external override { // Shh - currently unused vToken; src; @@ -718,7 +722,12 @@ contract ComptrollerG1 is ComptrollerV1Storage, ComptrollerInterfaceG1, Comptrol * account shortfall below collateral requirements) */ function getAccountLiquidity(address account) public view returns (uint, uint, uint) { - (Error err, uint liquidity, uint shortfall) = getHypotheticalAccountLiquidityInternal(account, VToken(0), 0, 0); + (Error err, uint liquidity, uint shortfall) = getHypotheticalAccountLiquidityInternal( + account, + VToken(address(0)), + 0, + 0 + ); return (uint(err), liquidity, shortfall); } @@ -873,7 +882,7 @@ contract ComptrollerG1 is ComptrollerV1Storage, ComptrollerInterfaceG1, Comptrol address vTokenBorrowed, address vTokenCollateral, uint actualRepayAmount - ) external view returns (uint, uint) { + ) external view override returns (uint, uint) { /* Read oracle prices for borrowed and collateral markets */ uint priceBorrowedMantissa = oracle.getUnderlyingPrice(VToken(vTokenBorrowed)); uint priceCollateralMantissa = oracle.getUnderlyingPrice(VToken(vTokenCollateral)); @@ -1086,8 +1095,10 @@ contract ComptrollerG1 is ComptrollerV1Storage, ComptrollerInterfaceG1, Comptrol vToken.isVToken(); // Sanity check to make sure its really a VToken - markets[address(vToken)] = Market({ isListed: true, isVenus: false, collateralFactorMantissa: 0 }); - + Market storage newMarket = markets[address(vToken)]; + newMarket.isListed = true; + newMarket.isVenus = false; + newMarket.collateralFactorMantissa = 0; _addMarketInternal(vToken); emit MarketListed(vToken); @@ -1529,7 +1540,7 @@ contract ComptrollerG1 is ComptrollerV1Storage, ComptrollerInterfaceG1, Comptrol return allMarkets; } - function getBlockNumber() public view returns (uint) { + function getBlockNumber() public view virtual returns (uint) { return block.number; } @@ -1537,7 +1548,7 @@ contract ComptrollerG1 is ComptrollerV1Storage, ComptrollerInterfaceG1, Comptrol * @notice Return the address of the XVS token * @return The address of XVS */ - function getXVSAddress() public view returns (address) { + function getXVSAddress() public view virtual returns (address) { return 0xcF6BB5389c92Bdda8a3747Ddb454cB7a64626C63; } @@ -1549,7 +1560,7 @@ contract ComptrollerG1 is ComptrollerV1Storage, ComptrollerInterfaceG1, Comptrol * @param amount The amount of VAI to set to the account * @return The number of minted VAI by `owner` */ - function setMintedVAIOf(address owner, uint amount) external onlyProtocolAllowed returns (uint) { + function setMintedVAIOf(address owner, uint amount) external override onlyProtocolAllowed returns (uint) { // Pausing is a very serious situation - we revert to sound the alarms require(!mintVAIGuardianPaused && !repayVAIGuardianPaused, "VAI is paused"); // Check caller is vaiController diff --git a/contracts/Comptroller/ComptrollerG2.sol b/contracts/Comptroller/ComptrollerG2.sol index c2ad5be63..276e63ffa 100644 --- a/contracts/Comptroller/ComptrollerG2.sol +++ b/contracts/Comptroller/ComptrollerG2.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../Oracle/PriceOracle.sol"; import "../Tokens/VTokens/VToken.sol"; @@ -157,7 +157,7 @@ contract ComptrollerG2 is ComptrollerV1Storage, ComptrollerInterfaceG1, Comptrol * @param vTokens The list of addresses of the vToken markets to be enabled * @return Success indicator for whether each corresponding market was entered */ - function enterMarkets(address[] calldata vTokens) external returns (uint[] memory) { + function enterMarkets(address[] calldata vTokens) external override returns (uint[] memory) { uint len = vTokens.length; uint[] memory results = new uint[](len); @@ -212,7 +212,7 @@ contract ComptrollerG2 is ComptrollerV1Storage, ComptrollerInterfaceG1, Comptrol * @param vTokenAddress The address of the asset to be removed * @return Whether or not the account successfully exited the market */ - function exitMarket(address vTokenAddress) external returns (uint) { + function exitMarket(address vTokenAddress) external override returns (uint) { VToken vToken = VToken(vTokenAddress); /* Get sender tokensHeld and amountOwed underlying from the vToken */ (uint oErr, uint tokensHeld, uint amountOwed, ) = vToken.getAccountSnapshot(msg.sender); @@ -247,7 +247,7 @@ contract ComptrollerG2 is ComptrollerV1Storage, ComptrollerInterfaceG1, Comptrol for (; i < len; i++) { if (userAssetList[i] == vToken) { userAssetList[i] = userAssetList[len - 1]; - userAssetList.length--; + userAssetList.pop(); break; } } @@ -269,7 +269,11 @@ contract ComptrollerG2 is ComptrollerV1Storage, ComptrollerInterfaceG1, Comptrol * @param mintAmount The amount of underlying being supplied to the market in exchange for tokens * @return 0 if the mint is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) */ - function mintAllowed(address vToken, address minter, uint mintAmount) external onlyProtocolAllowed returns (uint) { + function mintAllowed( + address vToken, + address minter, + uint mintAmount + ) external override onlyProtocolAllowed returns (uint) { // Pausing is a very serious situation - we revert to sound the alarms require(!mintGuardianPaused[vToken], "mint is paused"); @@ -294,7 +298,7 @@ contract ComptrollerG2 is ComptrollerV1Storage, ComptrollerInterfaceG1, Comptrol * @param actualMintAmount The amount of the underlying asset being minted * @param mintTokens The number of tokens being minted */ - function mintVerify(address vToken, address minter, uint actualMintAmount, uint mintTokens) external { + function mintVerify(address vToken, address minter, uint actualMintAmount, uint mintTokens) external override { // Shh - currently unused vToken; minter; @@ -313,7 +317,7 @@ contract ComptrollerG2 is ComptrollerV1Storage, ComptrollerInterfaceG1, Comptrol address vToken, address redeemer, uint redeemTokens - ) external onlyProtocolAllowed returns (uint) { + ) external override onlyProtocolAllowed returns (uint) { uint allowed = redeemAllowedInternal(vToken, redeemer, redeemTokens); if (allowed != uint(Error.NO_ERROR)) { return allowed; @@ -360,7 +364,7 @@ contract ComptrollerG2 is ComptrollerV1Storage, ComptrollerInterfaceG1, Comptrol * @param redeemAmount The amount of the underlying asset being redeemed * @param redeemTokens The number of tokens being redeemed */ - function redeemVerify(address vToken, address redeemer, uint redeemAmount, uint redeemTokens) external { + function redeemVerify(address vToken, address redeemer, uint redeemAmount, uint redeemTokens) external override { // Shh - currently unused vToken; redeemer; @@ -380,7 +384,7 @@ contract ComptrollerG2 is ComptrollerV1Storage, ComptrollerInterfaceG1, Comptrol address vToken, address borrower, uint borrowAmount - ) external onlyProtocolAllowed returns (uint) { + ) external override onlyProtocolAllowed returns (uint) { // Pausing is a very serious situation - we revert to sound the alarms require(!borrowGuardianPaused[vToken], "borrow is paused"); @@ -430,7 +434,7 @@ contract ComptrollerG2 is ComptrollerV1Storage, ComptrollerInterfaceG1, Comptrol * @param borrower The address borrowing the underlying * @param borrowAmount The amount of the underlying asset requested to borrow */ - function borrowVerify(address vToken, address borrower, uint borrowAmount) external { + function borrowVerify(address vToken, address borrower, uint borrowAmount) external override { // Shh - currently unused vToken; borrower; @@ -455,7 +459,7 @@ contract ComptrollerG2 is ComptrollerV1Storage, ComptrollerInterfaceG1, Comptrol address payer, address borrower, uint repayAmount - ) external onlyProtocolAllowed returns (uint) { + ) external override onlyProtocolAllowed returns (uint) { // Shh - currently unused payer; borrower; @@ -486,7 +490,7 @@ contract ComptrollerG2 is ComptrollerV1Storage, ComptrollerInterfaceG1, Comptrol address borrower, uint actualRepayAmount, uint borrowerIndex - ) external { + ) external override { // Shh - currently unused vToken; payer; @@ -514,7 +518,7 @@ contract ComptrollerG2 is ComptrollerV1Storage, ComptrollerInterfaceG1, Comptrol address liquidator, address borrower, uint repayAmount - ) external onlyProtocolAllowed returns (uint) { + ) external override onlyProtocolAllowed returns (uint) { // Shh - currently unused liquidator; @@ -523,7 +527,7 @@ contract ComptrollerG2 is ComptrollerV1Storage, ComptrollerInterfaceG1, Comptrol } /* The borrower must have shortfall in order to be liquidatable */ - (Error err, , uint shortfall) = getHypotheticalAccountLiquidityInternal(borrower, VToken(0), 0, 0); + (Error err, , uint shortfall) = getHypotheticalAccountLiquidityInternal(borrower, VToken(address(0)), 0, 0); if (err != Error.NO_ERROR) { return uint(err); } @@ -559,7 +563,7 @@ contract ComptrollerG2 is ComptrollerV1Storage, ComptrollerInterfaceG1, Comptrol address borrower, uint actualRepayAmount, uint seizeTokens - ) external { + ) external override { // Shh - currently unused vTokenBorrowed; vTokenCollateral; @@ -588,7 +592,7 @@ contract ComptrollerG2 is ComptrollerV1Storage, ComptrollerInterfaceG1, Comptrol address liquidator, address borrower, uint seizeTokens - ) external onlyProtocolAllowed returns (uint) { + ) external override onlyProtocolAllowed returns (uint) { // Pausing is a very serious situation - we revert to sound the alarms require(!seizeGuardianPaused, "seize is paused"); @@ -625,7 +629,7 @@ contract ComptrollerG2 is ComptrollerV1Storage, ComptrollerInterfaceG1, Comptrol address liquidator, address borrower, uint seizeTokens - ) external { + ) external override { // Shh - currently unused vTokenCollateral; vTokenBorrowed; @@ -652,7 +656,7 @@ contract ComptrollerG2 is ComptrollerV1Storage, ComptrollerInterfaceG1, Comptrol address src, address dst, uint transferTokens - ) external onlyProtocolAllowed returns (uint) { + ) external override onlyProtocolAllowed returns (uint) { // Pausing is a very serious situation - we revert to sound the alarms require(!transferGuardianPaused, "transfer is paused"); @@ -678,7 +682,7 @@ contract ComptrollerG2 is ComptrollerV1Storage, ComptrollerInterfaceG1, Comptrol * @param dst The account which receives the tokens * @param transferTokens The number of vTokens to transfer */ - function transferVerify(address vToken, address src, address dst, uint transferTokens) external { + function transferVerify(address vToken, address src, address dst, uint transferTokens) external override { // Shh - currently unused vToken; src; @@ -718,7 +722,12 @@ contract ComptrollerG2 is ComptrollerV1Storage, ComptrollerInterfaceG1, Comptrol * account shortfall below collateral requirements) */ function getAccountLiquidity(address account) public view returns (uint, uint, uint) { - (Error err, uint liquidity, uint shortfall) = getHypotheticalAccountLiquidityInternal(account, VToken(0), 0, 0); + (Error err, uint liquidity, uint shortfall) = getHypotheticalAccountLiquidityInternal( + account, + VToken(address(0)), + 0, + 0 + ); return (uint(err), liquidity, shortfall); } @@ -873,7 +882,7 @@ contract ComptrollerG2 is ComptrollerV1Storage, ComptrollerInterfaceG1, Comptrol address vTokenBorrowed, address vTokenCollateral, uint actualRepayAmount - ) external view returns (uint, uint) { + ) external view override returns (uint, uint) { /* Read oracle prices for borrowed and collateral markets */ uint priceBorrowedMantissa = oracle.getUnderlyingPrice(VToken(vTokenBorrowed)); uint priceCollateralMantissa = oracle.getUnderlyingPrice(VToken(vTokenCollateral)); @@ -1086,8 +1095,10 @@ contract ComptrollerG2 is ComptrollerV1Storage, ComptrollerInterfaceG1, Comptrol vToken.isVToken(); // Sanity check to make sure its really a VToken - markets[address(vToken)] = Market({ isListed: true, isVenus: false, collateralFactorMantissa: 0 }); - + Market storage newMarket = markets[address(vToken)]; + newMarket.isListed = true; + newMarket.isVenus = false; + newMarket.collateralFactorMantissa = 0; _addMarketInternal(vToken); emit MarketListed(vToken); @@ -1549,7 +1560,7 @@ contract ComptrollerG2 is ComptrollerV1Storage, ComptrollerInterfaceG1, Comptrol * @param amount The amount of VAI to set to the account * @return The number of minted VAI by `owner` */ - function setMintedVAIOf(address owner, uint amount) external onlyProtocolAllowed returns (uint) { + function setMintedVAIOf(address owner, uint amount) external override onlyProtocolAllowed returns (uint) { // Pausing is a very serious situation - we revert to sound the alarms require(!mintVAIGuardianPaused && !repayVAIGuardianPaused, "VAI is paused"); // Check caller is vaiController diff --git a/contracts/Comptroller/ComptrollerG3.sol b/contracts/Comptroller/ComptrollerG3.sol index bb00a9d11..c71490c13 100644 --- a/contracts/Comptroller/ComptrollerG3.sol +++ b/contracts/Comptroller/ComptrollerG3.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../Oracle/PriceOracle.sol"; import "../Tokens/VTokens/VToken.sol"; @@ -163,7 +163,7 @@ contract ComptrollerG3 is ComptrollerV3Storage, ComptrollerInterfaceG1, Comptrol * @param vTokens The list of addresses of the vToken markets to be enabled * @return Success indicator for whether each corresponding market was entered */ - function enterMarkets(address[] calldata vTokens) external returns (uint[] memory) { + function enterMarkets(address[] calldata vTokens) external override returns (uint[] memory) { uint len = vTokens.length; uint[] memory results = new uint[](len); @@ -218,7 +218,7 @@ contract ComptrollerG3 is ComptrollerV3Storage, ComptrollerInterfaceG1, Comptrol * @param vTokenAddress The address of the asset to be removed * @return Whether or not the account successfully exited the market */ - function exitMarket(address vTokenAddress) external returns (uint) { + function exitMarket(address vTokenAddress) external override returns (uint) { VToken vToken = VToken(vTokenAddress); /* Get sender tokensHeld and amountOwed underlying from the vToken */ (uint oErr, uint tokensHeld, uint amountOwed, ) = vToken.getAccountSnapshot(msg.sender); @@ -253,7 +253,7 @@ contract ComptrollerG3 is ComptrollerV3Storage, ComptrollerInterfaceG1, Comptrol for (; i < len; i++) { if (userAssetList[i] == vToken) { userAssetList[i] = userAssetList[len - 1]; - userAssetList.length--; + userAssetList.pop(); break; } } @@ -275,7 +275,11 @@ contract ComptrollerG3 is ComptrollerV3Storage, ComptrollerInterfaceG1, Comptrol * @param mintAmount The amount of underlying being supplied to the market in exchange for tokens * @return 0 if the mint is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) */ - function mintAllowed(address vToken, address minter, uint mintAmount) external onlyProtocolAllowed returns (uint) { + function mintAllowed( + address vToken, + address minter, + uint mintAmount + ) external override onlyProtocolAllowed returns (uint) { // Pausing is a very serious situation - we revert to sound the alarms require(!mintGuardianPaused[vToken], "mint is paused"); @@ -300,7 +304,7 @@ contract ComptrollerG3 is ComptrollerV3Storage, ComptrollerInterfaceG1, Comptrol * @param actualMintAmount The amount of the underlying asset being minted * @param mintTokens The number of tokens being minted */ - function mintVerify(address vToken, address minter, uint actualMintAmount, uint mintTokens) external { + function mintVerify(address vToken, address minter, uint actualMintAmount, uint mintTokens) external override { // Shh - currently unused vToken; minter; @@ -319,7 +323,7 @@ contract ComptrollerG3 is ComptrollerV3Storage, ComptrollerInterfaceG1, Comptrol address vToken, address redeemer, uint redeemTokens - ) external onlyProtocolAllowed returns (uint) { + ) external override onlyProtocolAllowed returns (uint) { uint allowed = redeemAllowedInternal(vToken, redeemer, redeemTokens); if (allowed != uint(Error.NO_ERROR)) { return allowed; @@ -366,7 +370,7 @@ contract ComptrollerG3 is ComptrollerV3Storage, ComptrollerInterfaceG1, Comptrol * @param redeemAmount The amount of the underlying asset being redeemed * @param redeemTokens The number of tokens being redeemed */ - function redeemVerify(address vToken, address redeemer, uint redeemAmount, uint redeemTokens) external { + function redeemVerify(address vToken, address redeemer, uint redeemAmount, uint redeemTokens) external override { // Shh - currently unused vToken; redeemer; @@ -386,7 +390,7 @@ contract ComptrollerG3 is ComptrollerV3Storage, ComptrollerInterfaceG1, Comptrol address vToken, address borrower, uint borrowAmount - ) external onlyProtocolAllowed returns (uint) { + ) external override onlyProtocolAllowed returns (uint) { // Pausing is a very serious situation - we revert to sound the alarms require(!borrowGuardianPaused[vToken], "borrow is paused"); @@ -445,7 +449,7 @@ contract ComptrollerG3 is ComptrollerV3Storage, ComptrollerInterfaceG1, Comptrol * @param borrower The address borrowing the underlying * @param borrowAmount The amount of the underlying asset requested to borrow */ - function borrowVerify(address vToken, address borrower, uint borrowAmount) external { + function borrowVerify(address vToken, address borrower, uint borrowAmount) external override { // Shh - currently unused vToken; borrower; @@ -470,7 +474,7 @@ contract ComptrollerG3 is ComptrollerV3Storage, ComptrollerInterfaceG1, Comptrol address payer, address borrower, uint repayAmount - ) external onlyProtocolAllowed returns (uint) { + ) external override onlyProtocolAllowed returns (uint) { // Shh - currently unused payer; borrower; @@ -501,7 +505,7 @@ contract ComptrollerG3 is ComptrollerV3Storage, ComptrollerInterfaceG1, Comptrol address borrower, uint actualRepayAmount, uint borrowerIndex - ) external { + ) external override { // Shh - currently unused vToken; payer; @@ -529,7 +533,7 @@ contract ComptrollerG3 is ComptrollerV3Storage, ComptrollerInterfaceG1, Comptrol address liquidator, address borrower, uint repayAmount - ) external onlyProtocolAllowed returns (uint) { + ) external override onlyProtocolAllowed returns (uint) { // Shh - currently unused liquidator; @@ -538,7 +542,7 @@ contract ComptrollerG3 is ComptrollerV3Storage, ComptrollerInterfaceG1, Comptrol } /* The borrower must have shortfall in order to be liquidatable */ - (Error err, , uint shortfall) = getHypotheticalAccountLiquidityInternal(borrower, VToken(0), 0, 0); + (Error err, , uint shortfall) = getHypotheticalAccountLiquidityInternal(borrower, VToken(address(0)), 0, 0); if (err != Error.NO_ERROR) { return uint(err); } @@ -574,7 +578,7 @@ contract ComptrollerG3 is ComptrollerV3Storage, ComptrollerInterfaceG1, Comptrol address borrower, uint actualRepayAmount, uint seizeTokens - ) external { + ) external override { // Shh - currently unused vTokenBorrowed; vTokenCollateral; @@ -603,7 +607,7 @@ contract ComptrollerG3 is ComptrollerV3Storage, ComptrollerInterfaceG1, Comptrol address liquidator, address borrower, uint seizeTokens - ) external onlyProtocolAllowed returns (uint) { + ) external override onlyProtocolAllowed returns (uint) { // Pausing is a very serious situation - we revert to sound the alarms require(!seizeGuardianPaused, "seize is paused"); @@ -640,7 +644,7 @@ contract ComptrollerG3 is ComptrollerV3Storage, ComptrollerInterfaceG1, Comptrol address liquidator, address borrower, uint seizeTokens - ) external { + ) external override { // Shh - currently unused vTokenCollateral; vTokenBorrowed; @@ -667,7 +671,7 @@ contract ComptrollerG3 is ComptrollerV3Storage, ComptrollerInterfaceG1, Comptrol address src, address dst, uint transferTokens - ) external onlyProtocolAllowed returns (uint) { + ) external override onlyProtocolAllowed returns (uint) { // Pausing is a very serious situation - we revert to sound the alarms require(!transferGuardianPaused, "transfer is paused"); @@ -693,7 +697,7 @@ contract ComptrollerG3 is ComptrollerV3Storage, ComptrollerInterfaceG1, Comptrol * @param dst The account which receives the tokens * @param transferTokens The number of vTokens to transfer */ - function transferVerify(address vToken, address src, address dst, uint transferTokens) external { + function transferVerify(address vToken, address src, address dst, uint transferTokens) external override { // Shh - currently unused vToken; src; @@ -733,7 +737,12 @@ contract ComptrollerG3 is ComptrollerV3Storage, ComptrollerInterfaceG1, Comptrol * account shortfall below collateral requirements) */ function getAccountLiquidity(address account) public view returns (uint, uint, uint) { - (Error err, uint liquidity, uint shortfall) = getHypotheticalAccountLiquidityInternal(account, VToken(0), 0, 0); + (Error err, uint liquidity, uint shortfall) = getHypotheticalAccountLiquidityInternal( + account, + VToken(address(0)), + 0, + 0 + ); return (uint(err), liquidity, shortfall); } @@ -888,7 +897,7 @@ contract ComptrollerG3 is ComptrollerV3Storage, ComptrollerInterfaceG1, Comptrol address vTokenBorrowed, address vTokenCollateral, uint actualRepayAmount - ) external view returns (uint, uint) { + ) external view override returns (uint, uint) { /* Read oracle prices for borrowed and collateral markets */ uint priceBorrowedMantissa = oracle.getUnderlyingPrice(VToken(vTokenBorrowed)); uint priceCollateralMantissa = oracle.getUnderlyingPrice(VToken(vTokenCollateral)); @@ -1102,8 +1111,10 @@ contract ComptrollerG3 is ComptrollerV3Storage, ComptrollerInterfaceG1, Comptrol vToken.isVToken(); // Sanity check to make sure its really a VToken // Note that isVenus is not in active use anymore - markets[address(vToken)] = Market({ isListed: true, isVenus: false, collateralFactorMantissa: 0 }); - + Market storage newMarket = markets[address(vToken)]; + newMarket.isListed = true; + newMarket.isVenus = false; + newMarket.collateralFactorMantissa = 0; _addMarketInternal(vToken); emit MarketListed(vToken); @@ -1509,7 +1520,7 @@ contract ComptrollerG3 is ComptrollerV3Storage, ComptrollerInterfaceG1, Comptrol * @param amount The amount of VAI to set to the account * @return The number of minted VAI by `owner` */ - function setMintedVAIOf(address owner, uint amount) external onlyProtocolAllowed returns (uint) { + function setMintedVAIOf(address owner, uint amount) external override onlyProtocolAllowed returns (uint) { // Pausing is a very serious situation - we revert to sound the alarms require(!mintVAIGuardianPaused && !repayVAIGuardianPaused, "VAI is paused"); // Check caller is vaiController diff --git a/contracts/Comptroller/ComptrollerG4.sol b/contracts/Comptroller/ComptrollerG4.sol index aa478da38..cae9a12d1 100644 --- a/contracts/Comptroller/ComptrollerG4.sol +++ b/contracts/Comptroller/ComptrollerG4.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../Oracle/PriceOracle.sol"; import "../Tokens/VTokens/VToken.sol"; @@ -162,7 +162,7 @@ contract ComptrollerG4 is ComptrollerV4Storage, ComptrollerInterfaceG2, Comptrol * @param vTokens The list of addresses of the vToken markets to be enabled * @return Success indicator for whether each corresponding market was entered */ - function enterMarkets(address[] calldata vTokens) external returns (uint[] memory) { + function enterMarkets(address[] calldata vTokens) external override returns (uint[] memory) { uint len = vTokens.length; uint[] memory results = new uint[](len); @@ -212,7 +212,7 @@ contract ComptrollerG4 is ComptrollerV4Storage, ComptrollerInterfaceG2, Comptrol * @param vTokenAddress The address of the asset to be removed * @return Whether or not the account successfully exited the market */ - function exitMarket(address vTokenAddress) external returns (uint) { + function exitMarket(address vTokenAddress) external override returns (uint) { VToken vToken = VToken(vTokenAddress); /* Get sender tokensHeld and amountOwed underlying from the vToken */ (uint oErr, uint tokensHeld, uint amountOwed, ) = vToken.getAccountSnapshot(msg.sender); @@ -247,7 +247,7 @@ contract ComptrollerG4 is ComptrollerV4Storage, ComptrollerInterfaceG2, Comptrol for (; i < len; i++) { if (userAssetList[i] == vToken) { userAssetList[i] = userAssetList[len - 1]; - userAssetList.length--; + userAssetList.pop(); break; } } @@ -269,7 +269,11 @@ contract ComptrollerG4 is ComptrollerV4Storage, ComptrollerInterfaceG2, Comptrol * @param mintAmount The amount of underlying being supplied to the market in exchange for tokens * @return 0 if the mint is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) */ - function mintAllowed(address vToken, address minter, uint mintAmount) external onlyProtocolAllowed returns (uint) { + function mintAllowed( + address vToken, + address minter, + uint mintAmount + ) external override onlyProtocolAllowed returns (uint) { // Pausing is a very serious situation - we revert to sound the alarms require(!mintGuardianPaused[vToken], "mint is paused"); @@ -294,7 +298,7 @@ contract ComptrollerG4 is ComptrollerV4Storage, ComptrollerInterfaceG2, Comptrol * @param actualMintAmount The amount of the underlying asset being minted * @param mintTokens The number of tokens being minted */ - function mintVerify(address vToken, address minter, uint actualMintAmount, uint mintTokens) external { + function mintVerify(address vToken, address minter, uint actualMintAmount, uint mintTokens) external override { // Shh - currently unused vToken; minter; @@ -313,7 +317,7 @@ contract ComptrollerG4 is ComptrollerV4Storage, ComptrollerInterfaceG2, Comptrol address vToken, address redeemer, uint redeemTokens - ) external onlyProtocolAllowed returns (uint) { + ) external override onlyProtocolAllowed returns (uint) { uint allowed = redeemAllowedInternal(vToken, redeemer, redeemTokens); if (allowed != uint(Error.NO_ERROR)) { return allowed; @@ -360,7 +364,7 @@ contract ComptrollerG4 is ComptrollerV4Storage, ComptrollerInterfaceG2, Comptrol * @param redeemAmount The amount of the underlying asset being redeemed * @param redeemTokens The number of tokens being redeemed */ - function redeemVerify(address vToken, address redeemer, uint redeemAmount, uint redeemTokens) external { + function redeemVerify(address vToken, address redeemer, uint redeemAmount, uint redeemTokens) external override { // Shh - currently unused vToken; redeemer; @@ -380,7 +384,7 @@ contract ComptrollerG4 is ComptrollerV4Storage, ComptrollerInterfaceG2, Comptrol address vToken, address borrower, uint borrowAmount - ) external onlyProtocolAllowed returns (uint) { + ) external override onlyProtocolAllowed returns (uint) { // Pausing is a very serious situation - we revert to sound the alarms require(!borrowGuardianPaused[vToken], "borrow is paused"); @@ -438,7 +442,7 @@ contract ComptrollerG4 is ComptrollerV4Storage, ComptrollerInterfaceG2, Comptrol * @param borrower The address borrowing the underlying * @param borrowAmount The amount of the underlying asset requested to borrow */ - function borrowVerify(address vToken, address borrower, uint borrowAmount) external { + function borrowVerify(address vToken, address borrower, uint borrowAmount) external override { // Shh - currently unused vToken; borrower; @@ -463,7 +467,7 @@ contract ComptrollerG4 is ComptrollerV4Storage, ComptrollerInterfaceG2, Comptrol address payer, address borrower, uint repayAmount - ) external onlyProtocolAllowed returns (uint) { + ) external override onlyProtocolAllowed returns (uint) { // Shh - currently unused payer; borrower; @@ -494,7 +498,7 @@ contract ComptrollerG4 is ComptrollerV4Storage, ComptrollerInterfaceG2, Comptrol address borrower, uint actualRepayAmount, uint borrowerIndex - ) external { + ) external override { // Shh - currently unused vToken; payer; @@ -522,7 +526,7 @@ contract ComptrollerG4 is ComptrollerV4Storage, ComptrollerInterfaceG2, Comptrol address liquidator, address borrower, uint repayAmount - ) external onlyProtocolAllowed returns (uint) { + ) external override onlyProtocolAllowed returns (uint) { // Shh - currently unused liquidator; @@ -534,7 +538,7 @@ contract ComptrollerG4 is ComptrollerV4Storage, ComptrollerInterfaceG2, Comptrol } /* The borrower must have shortfall in order to be liquidatable */ - (Error err, , uint shortfall) = getHypotheticalAccountLiquidityInternal(borrower, VToken(0), 0, 0); + (Error err, , uint shortfall) = getHypotheticalAccountLiquidityInternal(borrower, VToken(address(0)), 0, 0); if (err != Error.NO_ERROR) { return uint(err); } @@ -573,7 +577,7 @@ contract ComptrollerG4 is ComptrollerV4Storage, ComptrollerInterfaceG2, Comptrol address borrower, uint actualRepayAmount, uint seizeTokens - ) external { + ) external override { // Shh - currently unused vTokenBorrowed; vTokenCollateral; @@ -602,7 +606,7 @@ contract ComptrollerG4 is ComptrollerV4Storage, ComptrollerInterfaceG2, Comptrol address liquidator, address borrower, uint seizeTokens - ) external onlyProtocolAllowed returns (uint) { + ) external override onlyProtocolAllowed returns (uint) { // Pausing is a very serious situation - we revert to sound the alarms require(!seizeGuardianPaused, "seize is paused"); @@ -643,7 +647,7 @@ contract ComptrollerG4 is ComptrollerV4Storage, ComptrollerInterfaceG2, Comptrol address liquidator, address borrower, uint seizeTokens - ) external { + ) external override { // Shh - currently unused vTokenCollateral; vTokenBorrowed; @@ -670,7 +674,7 @@ contract ComptrollerG4 is ComptrollerV4Storage, ComptrollerInterfaceG2, Comptrol address src, address dst, uint transferTokens - ) external onlyProtocolAllowed returns (uint) { + ) external override onlyProtocolAllowed returns (uint) { // Pausing is a very serious situation - we revert to sound the alarms require(!transferGuardianPaused, "transfer is paused"); @@ -696,7 +700,7 @@ contract ComptrollerG4 is ComptrollerV4Storage, ComptrollerInterfaceG2, Comptrol * @param dst The account which receives the tokens * @param transferTokens The number of vTokens to transfer */ - function transferVerify(address vToken, address src, address dst, uint transferTokens) external { + function transferVerify(address vToken, address src, address dst, uint transferTokens) external override { // Shh - currently unused vToken; src; @@ -736,7 +740,12 @@ contract ComptrollerG4 is ComptrollerV4Storage, ComptrollerInterfaceG2, Comptrol * account shortfall below collateral requirements) */ function getAccountLiquidity(address account) public view returns (uint, uint, uint) { - (Error err, uint liquidity, uint shortfall) = getHypotheticalAccountLiquidityInternal(account, VToken(0), 0, 0); + (Error err, uint liquidity, uint shortfall) = getHypotheticalAccountLiquidityInternal( + account, + VToken(address(0)), + 0, + 0 + ); return (uint(err), liquidity, shortfall); } @@ -865,7 +874,7 @@ contract ComptrollerG4 is ComptrollerV4Storage, ComptrollerInterfaceG2, Comptrol address vTokenBorrowed, address vTokenCollateral, uint actualRepayAmount - ) external view returns (uint, uint) { + ) external view override returns (uint, uint) { /* Read oracle prices for borrowed and collateral markets */ uint priceBorrowedMantissa = oracle.getUnderlyingPrice(VToken(vTokenBorrowed)); uint priceCollateralMantissa = oracle.getUnderlyingPrice(VToken(vTokenCollateral)); @@ -904,7 +913,7 @@ contract ComptrollerG4 is ComptrollerV4Storage, ComptrollerInterfaceG2, Comptrol function liquidateVAICalculateSeizeTokens( address vTokenCollateral, uint actualRepayAmount - ) external view returns (uint, uint) { + ) external view override returns (uint, uint) { /* Read oracle prices for borrowed and collateral markets */ uint priceBorrowedMantissa = 1e18; // Note: this is VAI uint priceCollateralMantissa = oracle.getUnderlyingPrice(VToken(vTokenCollateral)); @@ -1059,8 +1068,10 @@ contract ComptrollerG4 is ComptrollerV4Storage, ComptrollerInterfaceG2, Comptrol vToken.isVToken(); // Sanity check to make sure its really a VToken // Note that isVenus is not in active use anymore - markets[address(vToken)] = Market({ isListed: true, isVenus: false, collateralFactorMantissa: 0 }); - + Market storage newMarket = markets[address(vToken)]; + newMarket.isListed = true; + newMarket.isVenus = false; + newMarket.collateralFactorMantissa = 0; _addMarketInternal(vToken); emit MarketListed(vToken); @@ -1508,7 +1519,7 @@ contract ComptrollerG4 is ComptrollerV4Storage, ComptrollerInterfaceG2, Comptrol * @param amount The amount of VAI to set to the account * @return The number of minted VAI by `owner` */ - function setMintedVAIOf(address owner, uint amount) external onlyProtocolAllowed returns (uint) { + function setMintedVAIOf(address owner, uint amount) external override onlyProtocolAllowed returns (uint) { // Pausing is a very serious situation - we revert to sound the alarms require(!mintVAIGuardianPaused && !repayVAIGuardianPaused, "VAI is paused"); // Check caller is vaiController diff --git a/contracts/Comptroller/ComptrollerG5.sol b/contracts/Comptroller/ComptrollerG5.sol index e1c447f27..c93a4c013 100644 --- a/contracts/Comptroller/ComptrollerG5.sol +++ b/contracts/Comptroller/ComptrollerG5.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../Oracle/PriceOracle.sol"; import "../Tokens/VTokens/VToken.sol"; @@ -165,7 +165,7 @@ contract ComptrollerG5 is ComptrollerV5Storage, ComptrollerInterfaceG2, Comptrol * @param vTokens The list of addresses of the vToken markets to be enabled * @return Success indicator for whether each corresponding market was entered */ - function enterMarkets(address[] calldata vTokens) external returns (uint[] memory) { + function enterMarkets(address[] calldata vTokens) external override returns (uint[] memory) { uint len = vTokens.length; uint[] memory results = new uint[](len); @@ -215,7 +215,7 @@ contract ComptrollerG5 is ComptrollerV5Storage, ComptrollerInterfaceG2, Comptrol * @param vTokenAddress The address of the asset to be removed * @return Whether or not the account successfully exited the market */ - function exitMarket(address vTokenAddress) external returns (uint) { + function exitMarket(address vTokenAddress) external override returns (uint) { VToken vToken = VToken(vTokenAddress); /* Get sender tokensHeld and amountOwed underlying from the vToken */ (uint oErr, uint tokensHeld, uint amountOwed, ) = vToken.getAccountSnapshot(msg.sender); @@ -250,7 +250,7 @@ contract ComptrollerG5 is ComptrollerV5Storage, ComptrollerInterfaceG2, Comptrol for (; i < len; i++) { if (userAssetList[i] == vToken) { userAssetList[i] = userAssetList[len - 1]; - userAssetList.length--; + userAssetList.pop(); break; } } @@ -272,7 +272,11 @@ contract ComptrollerG5 is ComptrollerV5Storage, ComptrollerInterfaceG2, Comptrol * @param mintAmount The amount of underlying being supplied to the market in exchange for tokens * @return 0 if the mint is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) */ - function mintAllowed(address vToken, address minter, uint mintAmount) external onlyProtocolAllowed returns (uint) { + function mintAllowed( + address vToken, + address minter, + uint mintAmount + ) external override onlyProtocolAllowed returns (uint) { // Pausing is a very serious situation - we revert to sound the alarms require(!mintGuardianPaused[vToken], "mint is paused"); @@ -297,7 +301,7 @@ contract ComptrollerG5 is ComptrollerV5Storage, ComptrollerInterfaceG2, Comptrol * @param actualMintAmount The amount of the underlying asset being minted * @param mintTokens The number of tokens being minted */ - function mintVerify(address vToken, address minter, uint actualMintAmount, uint mintTokens) external { + function mintVerify(address vToken, address minter, uint actualMintAmount, uint mintTokens) external override { // Shh - currently unused vToken; minter; @@ -316,7 +320,7 @@ contract ComptrollerG5 is ComptrollerV5Storage, ComptrollerInterfaceG2, Comptrol address vToken, address redeemer, uint redeemTokens - ) external onlyProtocolAllowed returns (uint) { + ) external override onlyProtocolAllowed returns (uint) { uint allowed = redeemAllowedInternal(vToken, redeemer, redeemTokens); if (allowed != uint(Error.NO_ERROR)) { return allowed; @@ -363,7 +367,7 @@ contract ComptrollerG5 is ComptrollerV5Storage, ComptrollerInterfaceG2, Comptrol * @param redeemAmount The amount of the underlying asset being redeemed * @param redeemTokens The number of tokens being redeemed */ - function redeemVerify(address vToken, address redeemer, uint redeemAmount, uint redeemTokens) external { + function redeemVerify(address vToken, address redeemer, uint redeemAmount, uint redeemTokens) external override { // Shh - currently unused vToken; redeemer; @@ -383,7 +387,7 @@ contract ComptrollerG5 is ComptrollerV5Storage, ComptrollerInterfaceG2, Comptrol address vToken, address borrower, uint borrowAmount - ) external onlyProtocolAllowed returns (uint) { + ) external override onlyProtocolAllowed returns (uint) { // Pausing is a very serious situation - we revert to sound the alarms require(!borrowGuardianPaused[vToken], "borrow is paused"); @@ -441,7 +445,7 @@ contract ComptrollerG5 is ComptrollerV5Storage, ComptrollerInterfaceG2, Comptrol * @param borrower The address borrowing the underlying * @param borrowAmount The amount of the underlying asset requested to borrow */ - function borrowVerify(address vToken, address borrower, uint borrowAmount) external { + function borrowVerify(address vToken, address borrower, uint borrowAmount) external override { // Shh - currently unused vToken; borrower; @@ -466,7 +470,7 @@ contract ComptrollerG5 is ComptrollerV5Storage, ComptrollerInterfaceG2, Comptrol address payer, address borrower, uint repayAmount - ) external onlyProtocolAllowed returns (uint) { + ) external override onlyProtocolAllowed returns (uint) { // Shh - currently unused payer; borrower; @@ -497,7 +501,7 @@ contract ComptrollerG5 is ComptrollerV5Storage, ComptrollerInterfaceG2, Comptrol address borrower, uint actualRepayAmount, uint borrowerIndex - ) external { + ) external override { // Shh - currently unused vToken; payer; @@ -525,7 +529,7 @@ contract ComptrollerG5 is ComptrollerV5Storage, ComptrollerInterfaceG2, Comptrol address liquidator, address borrower, uint repayAmount - ) external onlyProtocolAllowed returns (uint) { + ) external override onlyProtocolAllowed returns (uint) { // Shh - currently unused liquidator; @@ -537,7 +541,7 @@ contract ComptrollerG5 is ComptrollerV5Storage, ComptrollerInterfaceG2, Comptrol } /* The borrower must have shortfall in order to be liquidatable */ - (Error err, , uint shortfall) = getHypotheticalAccountLiquidityInternal(borrower, VToken(0), 0, 0); + (Error err, , uint shortfall) = getHypotheticalAccountLiquidityInternal(borrower, VToken(address(0)), 0, 0); if (err != Error.NO_ERROR) { return uint(err); } @@ -576,7 +580,7 @@ contract ComptrollerG5 is ComptrollerV5Storage, ComptrollerInterfaceG2, Comptrol address borrower, uint actualRepayAmount, uint seizeTokens - ) external { + ) external override { // Shh - currently unused vTokenBorrowed; vTokenCollateral; @@ -605,7 +609,7 @@ contract ComptrollerG5 is ComptrollerV5Storage, ComptrollerInterfaceG2, Comptrol address liquidator, address borrower, uint seizeTokens - ) external onlyProtocolAllowed returns (uint) { + ) external override onlyProtocolAllowed returns (uint) { // Pausing is a very serious situation - we revert to sound the alarms require(!seizeGuardianPaused, "seize is paused"); @@ -646,7 +650,7 @@ contract ComptrollerG5 is ComptrollerV5Storage, ComptrollerInterfaceG2, Comptrol address liquidator, address borrower, uint seizeTokens - ) external { + ) external override { // Shh - currently unused vTokenCollateral; vTokenBorrowed; @@ -673,7 +677,7 @@ contract ComptrollerG5 is ComptrollerV5Storage, ComptrollerInterfaceG2, Comptrol address src, address dst, uint transferTokens - ) external onlyProtocolAllowed returns (uint) { + ) external override onlyProtocolAllowed returns (uint) { // Pausing is a very serious situation - we revert to sound the alarms require(!transferGuardianPaused, "transfer is paused"); @@ -699,7 +703,7 @@ contract ComptrollerG5 is ComptrollerV5Storage, ComptrollerInterfaceG2, Comptrol * @param dst The account which receives the tokens * @param transferTokens The number of vTokens to transfer */ - function transferVerify(address vToken, address src, address dst, uint transferTokens) external { + function transferVerify(address vToken, address src, address dst, uint transferTokens) external override { // Shh - currently unused vToken; src; @@ -739,7 +743,12 @@ contract ComptrollerG5 is ComptrollerV5Storage, ComptrollerInterfaceG2, Comptrol * account shortfall below collateral requirements) */ function getAccountLiquidity(address account) public view returns (uint, uint, uint) { - (Error err, uint liquidity, uint shortfall) = getHypotheticalAccountLiquidityInternal(account, VToken(0), 0, 0); + (Error err, uint liquidity, uint shortfall) = getHypotheticalAccountLiquidityInternal( + account, + VToken(address(0)), + 0, + 0 + ); return (uint(err), liquidity, shortfall); } @@ -868,7 +877,7 @@ contract ComptrollerG5 is ComptrollerV5Storage, ComptrollerInterfaceG2, Comptrol address vTokenBorrowed, address vTokenCollateral, uint actualRepayAmount - ) external view returns (uint, uint) { + ) external view override returns (uint, uint) { /* Read oracle prices for borrowed and collateral markets */ uint priceBorrowedMantissa = oracle.getUnderlyingPrice(VToken(vTokenBorrowed)); uint priceCollateralMantissa = oracle.getUnderlyingPrice(VToken(vTokenCollateral)); @@ -907,7 +916,7 @@ contract ComptrollerG5 is ComptrollerV5Storage, ComptrollerInterfaceG2, Comptrol function liquidateVAICalculateSeizeTokens( address vTokenCollateral, uint actualRepayAmount - ) external view returns (uint, uint) { + ) external view override returns (uint, uint) { /* Read oracle prices for borrowed and collateral markets */ uint priceBorrowedMantissa = 1e18; // Note: this is VAI uint priceCollateralMantissa = oracle.getUnderlyingPrice(VToken(vTokenCollateral)); @@ -1062,8 +1071,10 @@ contract ComptrollerG5 is ComptrollerV5Storage, ComptrollerInterfaceG2, Comptrol vToken.isVToken(); // Sanity check to make sure its really a VToken // Note that isVenus is not in active use anymore - markets[address(vToken)] = Market({ isListed: true, isVenus: false, collateralFactorMantissa: 0 }); - + Market storage newMarket = markets[address(vToken)]; + newMarket.isListed = true; + newMarket.isVenus = false; + newMarket.collateralFactorMantissa = 0; _addMarketInternal(vToken); emit MarketListed(vToken); @@ -1524,7 +1535,7 @@ contract ComptrollerG5 is ComptrollerV5Storage, ComptrollerInterfaceG2, Comptrol * @param amount The amount of VAI to set to the account * @return The number of minted VAI by `owner` */ - function setMintedVAIOf(address owner, uint amount) external onlyProtocolAllowed returns (uint) { + function setMintedVAIOf(address owner, uint amount) external override onlyProtocolAllowed returns (uint) { // Pausing is a very serious situation - we revert to sound the alarms require(!mintVAIGuardianPaused && !repayVAIGuardianPaused, "VAI is paused"); // Check caller is vaiController diff --git a/contracts/Comptroller/ComptrollerInterface.sol b/contracts/Comptroller/ComptrollerInterface.sol index c8695bc86..e539b50c0 100644 --- a/contracts/Comptroller/ComptrollerInterface.sol +++ b/contracts/Comptroller/ComptrollerInterface.sol @@ -1,38 +1,38 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../Tokens/VTokens/VToken.sol"; import "../Oracle/PriceOracle.sol"; -contract ComptrollerInterfaceG1 { +abstract contract ComptrollerInterfaceG1 { /// @notice Indicator that this is a Comptroller contract (for inspection) bool public constant isComptroller = true; /*** Assets You Are In ***/ - function enterMarkets(address[] calldata vTokens) external returns (uint[] memory); + function enterMarkets(address[] calldata vTokens) external virtual returns (uint[] memory); - function exitMarket(address vToken) external returns (uint); + function exitMarket(address vToken) external virtual returns (uint); /*** Policy Hooks ***/ - function mintAllowed(address vToken, address minter, uint mintAmount) external returns (uint); + function mintAllowed(address vToken, address minter, uint mintAmount) external virtual returns (uint); - function mintVerify(address vToken, address minter, uint mintAmount, uint mintTokens) external; + function mintVerify(address vToken, address minter, uint mintAmount, uint mintTokens) external virtual; - function redeemAllowed(address vToken, address redeemer, uint redeemTokens) external returns (uint); + function redeemAllowed(address vToken, address redeemer, uint redeemTokens) external virtual returns (uint); - function redeemVerify(address vToken, address redeemer, uint redeemAmount, uint redeemTokens) external; + function redeemVerify(address vToken, address redeemer, uint redeemAmount, uint redeemTokens) external virtual; - function borrowAllowed(address vToken, address borrower, uint borrowAmount) external returns (uint); + function borrowAllowed(address vToken, address borrower, uint borrowAmount) external virtual returns (uint); - function borrowVerify(address vToken, address borrower, uint borrowAmount) external; + function borrowVerify(address vToken, address borrower, uint borrowAmount) external virtual {} function repayBorrowAllowed( address vToken, address payer, address borrower, uint repayAmount - ) external returns (uint); + ) external virtual returns (uint); function repayBorrowVerify( address vToken, @@ -40,7 +40,7 @@ contract ComptrollerInterfaceG1 { address borrower, uint repayAmount, uint borrowerIndex - ) external; + ) external virtual; function liquidateBorrowAllowed( address vTokenBorrowed, @@ -48,7 +48,7 @@ contract ComptrollerInterfaceG1 { address liquidator, address borrower, uint repayAmount - ) external returns (uint); + ) external virtual returns (uint); function liquidateBorrowVerify( address vTokenBorrowed, @@ -57,7 +57,7 @@ contract ComptrollerInterfaceG1 { address borrower, uint repayAmount, uint seizeTokens - ) external; + ) external virtual; function seizeAllowed( address vTokenCollateral, @@ -65,7 +65,7 @@ contract ComptrollerInterfaceG1 { address liquidator, address borrower, uint seizeTokens - ) external returns (uint); + ) external virtual returns (uint); function seizeVerify( address vTokenCollateral, @@ -73,11 +73,16 @@ contract ComptrollerInterfaceG1 { address liquidator, address borrower, uint seizeTokens - ) external; + ) external virtual; - function transferAllowed(address vToken, address src, address dst, uint transferTokens) external returns (uint); + function transferAllowed( + address vToken, + address src, + address dst, + uint transferTokens + ) external virtual returns (uint); - function transferVerify(address vToken, address src, address dst, uint transferTokens) external; + function transferVerify(address vToken, address src, address dst, uint transferTokens) external virtual; /*** Liquidity/Liquidation Calculations ***/ @@ -85,59 +90,59 @@ contract ComptrollerInterfaceG1 { address vTokenBorrowed, address vTokenCollateral, uint repayAmount - ) external view returns (uint, uint); + ) external view virtual returns (uint, uint); - function setMintedVAIOf(address owner, uint amount) external returns (uint); + function setMintedVAIOf(address owner, uint amount) external virtual returns (uint); } -contract ComptrollerInterfaceG2 is ComptrollerInterfaceG1 { +abstract contract ComptrollerInterfaceG2 is ComptrollerInterfaceG1 { function liquidateVAICalculateSeizeTokens( address vTokenCollateral, uint repayAmount - ) external view returns (uint, uint); + ) external view virtual returns (uint, uint); } -contract ComptrollerInterfaceG3 is ComptrollerInterfaceG2 { +abstract contract ComptrollerInterfaceG3 is ComptrollerInterfaceG2 { function liquidateVAICalculateSeizeTokens( address vTokenCollateral, uint repayAmount - ) external view returns (uint, uint); + ) external view virtual override returns (uint, uint) {} } -contract ComptrollerInterfaceG4 is ComptrollerInterfaceG3 { - function getXVSAddress() public view returns (address); +abstract contract ComptrollerInterfaceG4 is ComptrollerInterfaceG3 { + function getXVSAddress() public view virtual returns (address); } -contract ComptrollerInterface is ComptrollerInterfaceG4 { - function markets(address) external view returns (bool, uint); +abstract contract ComptrollerInterface is ComptrollerInterfaceG4 { + function markets(address) external view virtual returns (bool, uint); - function oracle() external view returns (PriceOracle); + function oracle() external view virtual returns (PriceOracle); - function getAccountLiquidity(address) external view returns (uint, uint, uint); + function getAccountLiquidity(address) external view virtual returns (uint, uint, uint); - function getAssetsIn(address) external view returns (VToken[] memory); + function getAssetsIn(address) external view virtual returns (VToken[] memory); - function claimVenus(address) external; + function claimVenus(address) external virtual; - function venusAccrued(address) external view returns (uint); + function venusAccrued(address) external view virtual returns (uint); - function venusSupplySpeeds(address) external view returns (uint); + function venusSupplySpeeds(address) external view virtual returns (uint); - function venusBorrowSpeeds(address) external view returns (uint); + function venusBorrowSpeeds(address) external view virtual returns (uint); - function getAllMarkets() external view returns (VToken[] memory); + function getAllMarkets() external view virtual returns (VToken[] memory); - function venusSupplierIndex(address, address) external view returns (uint); + function venusSupplierIndex(address, address) external view virtual returns (uint); - function venusInitialIndex() external view returns (uint224); + function venusInitialIndex() external view virtual returns (uint224); - function venusBorrowerIndex(address, address) external view returns (uint); + function venusBorrowerIndex(address, address) external view virtual returns (uint); - function venusBorrowState(address) external view returns (uint224, uint32); + function venusBorrowState(address) external view virtual returns (uint224, uint32); - function venusSupplyState(address) external view returns (uint224, uint32); + function venusSupplyState(address) external view virtual returns (uint224, uint32); - function approvedDelegates(address borrower, address delegate) external view returns (bool); + function approvedDelegates(address borrower, address delegate) external view virtual returns (bool); } interface IVAIVault { diff --git a/contracts/Comptroller/ComptrollerStorage.sol b/contracts/Comptroller/ComptrollerStorage.sol index 491ba8615..8024688e2 100644 --- a/contracts/Comptroller/ComptrollerStorage.sol +++ b/contracts/Comptroller/ComptrollerStorage.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../Tokens/VTokens/VToken.sol"; import "../Oracle/PriceOracle.sol"; diff --git a/contracts/Comptroller/Unitroller.sol b/contracts/Comptroller/Unitroller.sol index 58aeb366a..034cd3ac0 100644 --- a/contracts/Comptroller/Unitroller.sol +++ b/contracts/Comptroller/Unitroller.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "./ComptrollerStorage.sol"; import "../Utils/ErrorReporter.sol"; @@ -130,20 +130,20 @@ contract Unitroller is UnitrollerAdminStorage, ComptrollerErrorReporter { * It returns to the external caller whatever the implementation returns * or forwards reverts. */ - function() external payable { + fallback() external payable { // delegate all other functions to current implementation (bool success, ) = comptrollerImplementation.delegatecall(msg.data); assembly { let free_mem_ptr := mload(0x40) - returndatacopy(free_mem_ptr, 0, returndatasize) + returndatacopy(free_mem_ptr, 0, returndatasize()) switch success case 0 { - revert(free_mem_ptr, returndatasize) + revert(free_mem_ptr, returndatasize()) } default { - return(free_mem_ptr, returndatasize) + return(free_mem_ptr, returndatasize()) } } } diff --git a/contracts/Comptroller/UpdatedComptroller.sol b/contracts/Comptroller/UpdatedComptroller.sol index 68c1ff938..da55d3ced 100644 --- a/contracts/Comptroller/UpdatedComptroller.sol +++ b/contracts/Comptroller/UpdatedComptroller.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../Oracle/PriceOracle.sol"; import "../Tokens/VTokens/VToken.sol"; @@ -195,7 +195,7 @@ contract UpdatedComptroller is * @param vTokens The list of addresses of the vToken markets to be enabled * @return Success indicator for whether each corresponding market was entered */ - function enterMarkets(address[] calldata vTokens) external returns (uint[] memory) { + function enterMarkets(address[] calldata vTokens) external override returns (uint[] memory) { uint len = vTokens.length; uint[] memory results = new uint[](len); @@ -243,7 +243,7 @@ contract UpdatedComptroller is * @param vTokenAddress The address of the asset to be removed * @return Whether or not the account successfully exited the market */ - function exitMarket(address vTokenAddress) external returns (uint) { + function exitMarket(address vTokenAddress) external override returns (uint) { checkActionPauseState(vTokenAddress, Action.EXIT_MARKET); VToken vToken = VToken(vTokenAddress); @@ -280,7 +280,7 @@ contract UpdatedComptroller is for (; i < len; ++i) { if (userAssetList[i] == vToken) { userAssetList[i] = userAssetList[len - 1]; - userAssetList.length--; + userAssetList.pop(); break; } } @@ -302,7 +302,7 @@ contract UpdatedComptroller is * @param mintAmount The amount of underlying being supplied to the market in exchange for tokens * @return 0 if the mint is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) */ - function mintAllowed(address vToken, address minter, uint mintAmount) external returns (uint) { + function mintAllowed(address vToken, address minter, uint mintAmount) external override returns (uint) { // Pausing is a very serious situation - we revert to sound the alarms checkProtocolPauseState(); checkActionPauseState(vToken, Action.MINT); @@ -330,7 +330,7 @@ contract UpdatedComptroller is * @param redeemTokens The number of vTokens to exchange for the underlying asset in the market * @return 0 if the redeem is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) */ - function redeemAllowed(address vToken, address redeemer, uint redeemTokens) external returns (uint) { + function redeemAllowed(address vToken, address redeemer, uint redeemTokens) external override returns (uint) { checkProtocolPauseState(); checkActionPauseState(vToken, Action.REDEEM); @@ -378,7 +378,7 @@ contract UpdatedComptroller is * @param borrowAmount The amount of underlying the account would borrow * @return 0 if the borrow is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) */ - function borrowAllowed(address vToken, address borrower, uint borrowAmount) external returns (uint) { + function borrowAllowed(address vToken, address borrower, uint borrowAmount) external override returns (uint) { // Pausing is a very serious situation - we revert to sound the alarms checkProtocolPauseState(); checkActionPauseState(vToken, Action.BORROW); @@ -441,7 +441,7 @@ contract UpdatedComptroller is address payer, // solhint-disable-line no-unused-vars address borrower, uint repayAmount // solhint-disable-line no-unused-vars - ) external returns (uint) { + ) external override returns (uint) { checkProtocolPauseState(); checkActionPauseState(vToken, Action.REPAY); ensureListed(markets[vToken]); @@ -468,7 +468,7 @@ contract UpdatedComptroller is address liquidator, address borrower, uint repayAmount - ) external returns (uint) { + ) external override returns (uint) { checkProtocolPauseState(); // if we want to pause liquidating to vTokenCollateral, we should pause seizing @@ -484,7 +484,7 @@ contract UpdatedComptroller is } /* The borrower must have shortfall in order to be liquidatable */ - (Error err, , uint shortfall) = getHypotheticalAccountLiquidityInternal(borrower, VToken(0), 0, 0); + (Error err, , uint shortfall) = getHypotheticalAccountLiquidityInternal(borrower, VToken(address(0)), 0, 0); if (err != Error.NO_ERROR) { return uint(err); } @@ -521,7 +521,7 @@ contract UpdatedComptroller is address liquidator, address borrower, uint seizeTokens // solhint-disable-line no-unused-vars - ) external returns (uint) { + ) external override returns (uint) { // Pausing is a very serious situation - we revert to sound the alarms checkProtocolPauseState(); checkActionPauseState(vTokenCollateral, Action.SEIZE); @@ -552,7 +552,12 @@ contract UpdatedComptroller is * @param transferTokens The number of vTokens to transfer * @return 0 if the transfer is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) */ - function transferAllowed(address vToken, address src, address dst, uint transferTokens) external returns (uint) { + function transferAllowed( + address vToken, + address src, + address dst, + uint transferTokens + ) external override returns (uint) { // Pausing is a very serious situation - we revert to sound the alarms checkProtocolPauseState(); checkActionPauseState(vToken, Action.TRANSFER); @@ -579,7 +584,12 @@ contract UpdatedComptroller is * account shortfall below collateral requirements) */ function getAccountLiquidity(address account) external view returns (uint, uint, uint) { - (Error err, uint liquidity, uint shortfall) = getHypotheticalAccountLiquidityInternal(account, VToken(0), 0, 0); + (Error err, uint liquidity, uint shortfall) = getHypotheticalAccountLiquidityInternal( + account, + VToken(address(0)), + 0, + 0 + ); return (uint(err), liquidity, shortfall); } @@ -649,7 +659,7 @@ contract UpdatedComptroller is address vTokenBorrowed, address vTokenCollateral, uint actualRepayAmount - ) external view returns (uint, uint) { + ) external view override returns (uint, uint) { (uint err, uint seizeTokens) = comptrollerLens.liquidateCalculateSeizeTokens( address(this), vTokenBorrowed, @@ -669,7 +679,7 @@ contract UpdatedComptroller is function liquidateVAICalculateSeizeTokens( address vTokenCollateral, uint actualRepayAmount - ) external view returns (uint, uint) { + ) external view override returns (uint, uint) { (uint err, uint seizeTokens) = comptrollerLens.liquidateVAICalculateSeizeTokens( address(this), vTokenCollateral, @@ -823,8 +833,10 @@ contract UpdatedComptroller is vToken.isVToken(); // Sanity check to make sure its really a VToken // Note that isVenus is not in active use anymore - markets[address(vToken)] = Market({ isListed: true, isVenus: false, collateralFactorMantissa: 0 }); - + Market storage newMarket = markets[address(vToken)]; + newMarket.isListed = true; + newMarket.isVenus = false; + newMarket.collateralFactorMantissa = 0; _addMarketInternal(vToken); _initializeMarket(address(vToken)); @@ -1288,7 +1300,7 @@ contract UpdatedComptroller is address holder = holders[j]; // If there is a positive shortfall, the XVS reward is accrued, // but won't be granted to this holder - (, , uint shortfall) = getHypotheticalAccountLiquidityInternal(holder, VToken(0), 0, 0); + (, , uint shortfall) = getHypotheticalAccountLiquidityInternal(holder, VToken(address(0)), 0, 0); venusAccrued[holder] = grantXVSInternal(holder, venusAccrued[holder], shortfall, collateral); } } @@ -1463,7 +1475,7 @@ contract UpdatedComptroller is * @param amount The amount of VAI to set to the account * @return The number of minted VAI by `owner` */ - function setMintedVAIOf(address owner, uint amount) external returns (uint) { + function setMintedVAIOf(address owner, uint amount) external override returns (uint) { checkProtocolPauseState(); // Pausing is a very serious situation - we revert to sound the alarms diff --git a/contracts/Comptroller/UpdatedComptrollerInterface.sol b/contracts/Comptroller/UpdatedComptrollerInterface.sol index 3e476c32e..a632f2e17 100644 --- a/contracts/Comptroller/UpdatedComptrollerInterface.sol +++ b/contracts/Comptroller/UpdatedComptrollerInterface.sol @@ -1,32 +1,32 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../Tokens/VTokens/VToken.sol"; import "../Oracle/PriceOracle.sol"; -contract UpdatedComptrollerInterfaceG1 { +abstract contract UpdatedComptrollerInterfaceG1 { /// @notice Indicator that this is a Comptroller contract (for inspection) bool public constant isComptroller = true; /*** Assets You Are In ***/ - function enterMarkets(address[] calldata vTokens) external returns (uint[] memory); + function enterMarkets(address[] calldata vTokens) external virtual returns (uint[] memory); - function exitMarket(address vToken) external returns (uint); + function exitMarket(address vToken) external virtual returns (uint); /*** Policy Hooks ***/ - function mintAllowed(address vToken, address minter, uint mintAmount) external returns (uint); + function mintAllowed(address vToken, address minter, uint mintAmount) external virtual returns (uint); - function redeemAllowed(address vToken, address redeemer, uint redeemTokens) external returns (uint); + function redeemAllowed(address vToken, address redeemer, uint redeemTokens) external virtual returns (uint); - function borrowAllowed(address vToken, address borrower, uint borrowAmount) external returns (uint); + function borrowAllowed(address vToken, address borrower, uint borrowAmount) external virtual returns (uint); function repayBorrowAllowed( address vToken, address payer, address borrower, uint repayAmount - ) external returns (uint); + ) external virtual returns (uint); function liquidateBorrowAllowed( address vTokenBorrowed, @@ -34,7 +34,7 @@ contract UpdatedComptrollerInterfaceG1 { address liquidator, address borrower, uint repayAmount - ) external returns (uint); + ) external virtual returns (uint); function seizeAllowed( address vTokenCollateral, @@ -42,9 +42,14 @@ contract UpdatedComptrollerInterfaceG1 { address liquidator, address borrower, uint seizeTokens - ) external returns (uint); + ) external virtual returns (uint); - function transferAllowed(address vToken, address src, address dst, uint transferTokens) external returns (uint); + function transferAllowed( + address vToken, + address src, + address dst, + uint transferTokens + ) external virtual returns (uint); /*** Liquidity/Liquidation Calculations ***/ @@ -52,42 +57,42 @@ contract UpdatedComptrollerInterfaceG1 { address vTokenBorrowed, address vTokenCollateral, uint repayAmount - ) external view returns (uint, uint); + ) external view virtual returns (uint, uint); - function setMintedVAIOf(address owner, uint amount) external returns (uint); + function setMintedVAIOf(address owner, uint amount) external virtual returns (uint); } -contract UpdatedComptrollerInterfaceG2 is UpdatedComptrollerInterfaceG1 { +abstract contract UpdatedComptrollerInterfaceG2 is UpdatedComptrollerInterfaceG1 { function liquidateVAICalculateSeizeTokens( address vTokenCollateral, uint repayAmount - ) external view returns (uint, uint); + ) external view virtual returns (uint, uint); } -contract UpdatedComptrollerInterface is UpdatedComptrollerInterfaceG2 { - function markets(address) external view returns (bool, uint); +abstract contract UpdatedComptrollerInterface is UpdatedComptrollerInterfaceG2 { + function markets(address) external view virtual returns (bool, uint); - function oracle() external view returns (PriceOracle); + function oracle() external view virtual returns (PriceOracle); - function getAccountLiquidity(address) external view returns (uint, uint, uint); + function getAccountLiquidity(address) external view virtual returns (uint, uint, uint); - function getAssetsIn(address) external view returns (VToken[] memory); + function getAssetsIn(address) external view virtual returns (VToken[] memory); - function claimVenus(address) external; + function claimVenus(address) external virtual; - function venusAccrued(address) external view returns (uint); + function venusAccrued(address) external view virtual returns (uint); - function venusSpeeds(address) external view returns (uint); + function venusSpeeds(address) external view virtual returns (uint); - function getAllMarkets() external view returns (VToken[] memory); + function getAllMarkets() external view virtual returns (VToken[] memory); - function venusSupplierIndex(address, address) external view returns (uint); + function venusSupplierIndex(address, address) external view virtual returns (uint); - function venusInitialIndex() external view returns (uint224); + function venusInitialIndex() external view virtual returns (uint224); - function venusBorrowerIndex(address, address) external view returns (uint); + function venusBorrowerIndex(address, address) external view virtual returns (uint); - function venusBorrowState(address) external view returns (uint224, uint32); + function venusBorrowState(address) external view virtual returns (uint224, uint32); - function venusSupplyState(address) external view returns (uint224, uint32); + function venusSupplyState(address) external view virtual returns (uint224, uint32); } From 12bf2f5a8e8659bc46e80a3672f3499a6242670d Mon Sep 17 00:00:00 2001 From: defcon022 Date: Fri, 10 Mar 2023 18:55:02 +0530 Subject: [PATCH 016/153] Upgraded solidity version and refactor vToken contracts. --- contracts/Tokens/Maximillion.sol.archive | 8 +- contracts/Tokens/VAI/VAI.sol | 10 +- contracts/Tokens/VAI/VAIController.sol | 8 +- .../Tokens/VAI/VAIControllerInterface.sol | 22 ++--- contracts/Tokens/VAI/VAIUnitroller.sol | 10 +- contracts/Tokens/VRT/VRT.sol | 12 +-- contracts/Tokens/VRT/VRTConverterProxy.sol | 12 +-- contracts/Tokens/VTokens/VBep20.sol | 30 +++--- contracts/Tokens/VTokens/VBep20Delegate.sol | 6 +- contracts/Tokens/VTokens/VBep20Delegator.sol | 82 ++++++++-------- contracts/Tokens/VTokens/VToken.sol | 93 +++++++++++-------- contracts/Tokens/VTokens/VTokenInterfaces.sol | 82 ++++++++-------- contracts/Tokens/XVS/XVSVestingProxy.sol | 12 +-- 13 files changed, 201 insertions(+), 186 deletions(-) diff --git a/contracts/Tokens/Maximillion.sol.archive b/contracts/Tokens/Maximillion.sol.archive index a6936a655..87cda66f7 100644 --- a/contracts/Tokens/Maximillion.sol.archive +++ b/contracts/Tokens/Maximillion.sol.archive @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "./VTokens/VBNB.sol"; @@ -38,10 +38,10 @@ contract Maximillion { uint received = msg.value; uint borrows = vBnb_.borrowBalanceCurrent(borrower); if (received > borrows) { - vBnb_.repayBorrowBehalf.value(borrows)(borrower); - msg.sender.transfer(received - borrows); + vBnb_.repayBorrowBehalf{ value: borrows }(borrower); + payable(msg.sender).transfer(received - borrows); } else { - vBnb_.repayBorrowBehalf.value(received)(borrower); + vBnb_.repayBorrowBehalf{ value: received }(borrower); } } } diff --git a/contracts/Tokens/VAI/VAI.sol b/contracts/Tokens/VAI/VAI.sol index d6320b0b3..e52e28235 100644 --- a/contracts/Tokens/VAI/VAI.sol +++ b/contracts/Tokens/VAI/VAI.sol @@ -15,7 +15,7 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "./lib.sol"; @@ -84,7 +84,7 @@ contract VAI is LibNote { function transferFrom(address src, address dst, uint wad) public returns (bool) { require(balanceOf[src] >= wad, "VAI/insufficient-balance"); - if (src != msg.sender && allowance[src][msg.sender] != uint(-1)) { + if (src != msg.sender && allowance[src][msg.sender] != type(uint).max) { require(allowance[src][msg.sender] >= wad, "VAI/insufficient-allowance"); allowance[src][msg.sender] = sub(allowance[src][msg.sender], wad); } @@ -102,7 +102,7 @@ contract VAI is LibNote { function burn(address usr, uint wad) external { require(balanceOf[usr] >= wad, "VAI/insufficient-balance"); - if (usr != msg.sender && allowance[usr][msg.sender] != uint(-1)) { + if (usr != msg.sender && allowance[usr][msg.sender] != type(uint).max) { require(allowance[usr][msg.sender] >= wad, "VAI/insufficient-allowance"); allowance[usr][msg.sender] = sub(allowance[usr][msg.sender], wad); } @@ -151,9 +151,9 @@ contract VAI is LibNote { require(holder != address(0), "VAI/invalid-address-0"); require(holder == ecrecover(digest, v, r, s), "VAI/invalid-permit"); - require(expiry == 0 || now <= expiry, "VAI/permit-expired"); + require(expiry == 0 || block.timestamp <= expiry, "VAI/permit-expired"); require(nonce == nonces[holder]++, "VAI/invalid-nonce"); - uint wad = allowed ? uint(-1) : 0; + uint wad = allowed ? type(uint).max : 0; allowance[holder][spender] = wad; emit Approval(holder, spender, wad); } diff --git a/contracts/Tokens/VAI/VAIController.sol b/contracts/Tokens/VAI/VAIController.sol index 2f472d884..bde5a013c 100644 --- a/contracts/Tokens/VAI/VAIController.sol +++ b/contracts/Tokens/VAI/VAIController.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../../Oracle/PriceOracle.sol"; import "../../Utils/ErrorReporter.sol"; @@ -764,11 +764,11 @@ contract VAIController is VAIControllerStorageG2, VAIControllerErrorReporter, Ex emit NewVAIMintCap(old, _mintCap); } - function getBlockNumber() public view returns (uint) { + function getBlockNumber() public view virtual returns (uint) { return block.number; } - function getBlocksPerYear() public view returns (uint) { + function getBlocksPerYear() public view virtual returns (uint) { return 10512000; //(24 * 60 * 60 * 365) / 3; } @@ -776,7 +776,7 @@ contract VAIController is VAIControllerStorageG2, VAIControllerErrorReporter, Ex * @notice Return the address of the VAI token * @return The address of VAI */ - function getVAIAddress() public view returns (address) { + function getVAIAddress() public view virtual returns (address) { return 0x4BD17003473389A42DAF6a0a729f6Fdb328BbBd7; } diff --git a/contracts/Tokens/VAI/VAIControllerInterface.sol b/contracts/Tokens/VAI/VAIControllerInterface.sol index 9a305f3f8..a993e6167 100644 --- a/contracts/Tokens/VAI/VAIControllerInterface.sol +++ b/contracts/Tokens/VAI/VAIControllerInterface.sol @@ -1,27 +1,27 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../VTokens/VToken.sol"; -contract VAIControllerInterface { - function getVAIAddress() public view returns (address); +abstract contract VAIControllerInterface { + function getVAIAddress() public view virtual returns (address); - function getMintableVAI(address minter) public view returns (uint, uint); + function getMintableVAI(address minter) public view virtual returns (uint, uint); - function mintVAI(address minter, uint mintVAIAmount) external returns (uint); + function mintVAI(address minter, uint mintVAIAmount) external virtual returns (uint); - function repayVAI(address repayer, uint repayVAIAmount) external returns (uint); + function repayVAI(address repayer, uint repayVAIAmount) external virtual returns (uint); function liquidateVAI( address borrower, uint repayAmount, VTokenInterface vTokenCollateral - ) external returns (uint, uint); + ) external virtual returns (uint, uint); - function _initializeVenusVAIState(uint blockNumber) external returns (uint); + function _initializeVenusVAIState(uint blockNumber) external virtual returns (uint); - function updateVenusVAIMintIndex() external returns (uint); + function updateVenusVAIMintIndex() external virtual returns (uint); - function calcDistributeVAIMinterVenus(address vaiMinter) external returns (uint, uint, uint, uint); + function calcDistributeVAIMinterVenus(address vaiMinter) external virtual returns (uint, uint, uint, uint); - function getVAIRepayAmount(address account) public view returns (uint); + function getVAIRepayAmount(address account) public view virtual returns (uint); } diff --git a/contracts/Tokens/VAI/VAIUnitroller.sol b/contracts/Tokens/VAI/VAIUnitroller.sol index feca9f888..3ee159568 100644 --- a/contracts/Tokens/VAI/VAIUnitroller.sol +++ b/contracts/Tokens/VAI/VAIUnitroller.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../../Utils/ErrorReporter.sol"; import "./VAIControllerStorage.sol"; @@ -125,20 +125,20 @@ contract VAIUnitroller is VAIUnitrollerAdminStorage, VAIControllerErrorReporter * It returns to the external caller whatever the implementation returns * or forwards reverts. */ - function() external payable { + fallback() external payable { // delegate all other functions to current implementation (bool success, ) = vaiControllerImplementation.delegatecall(msg.data); assembly { let free_mem_ptr := mload(0x40) - returndatacopy(free_mem_ptr, 0, returndatasize) + returndatacopy(free_mem_ptr, 0, returndatasize()) switch success case 0 { - revert(free_mem_ptr, returndatasize) + revert(free_mem_ptr, returndatasize()) } default { - return(free_mem_ptr, returndatasize) + return(free_mem_ptr, returndatasize()) } } } diff --git a/contracts/Tokens/VRT/VRT.sol b/contracts/Tokens/VRT/VRT.sol index 15d0b8380..6f25bdde3 100644 --- a/contracts/Tokens/VRT/VRT.sol +++ b/contracts/Tokens/VRT/VRT.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../../Utils/Tokenlock.sol"; @@ -87,8 +87,8 @@ contract VRT is Tokenlock { */ function approve(address spender, uint rawAmount) external validLock returns (bool) { uint96 amount; - if (rawAmount == uint(-1)) { - amount = uint96(-1); + if (rawAmount == type(uint).max) { + amount = type(uint96).max; } else { amount = safe96(rawAmount, "VRT::approve: amount exceeds 96 bits"); } @@ -132,7 +132,7 @@ contract VRT is Tokenlock { uint96 spenderAllowance = allowances[src][spender]; uint96 amount = safe96(rawAmount, "VRT::approve: amount exceeds 96 bits"); - if (spender != src && spenderAllowance != uint96(-1)) { + if (spender != src && spenderAllowance != type(uint96).max) { uint96 newAllowance = sub96( spenderAllowance, amount, @@ -173,7 +173,7 @@ contract VRT is Tokenlock { address signatory = ecrecover(digest, v, r, s); require(signatory != address(0), "VRT::delegateBySig: invalid signature"); require(nonce == nonces[signatory]++, "VRT::delegateBySig: invalid nonce"); - require(now <= expiry, "VRT::delegateBySig: signature expired"); + require(block.timestamp <= expiry, "VRT::delegateBySig: signature expired"); return _delegate(signatory, delegatee); } @@ -301,7 +301,7 @@ contract VRT is Tokenlock { return a - b; } - function getChainId() internal pure returns (uint) { + function getChainId() internal view returns (uint) { uint256 chainId; assembly { chainId := chainid() diff --git a/contracts/Tokens/VRT/VRTConverterProxy.sol b/contracts/Tokens/VRT/VRTConverterProxy.sol index b019155c2..38d8531be 100644 --- a/contracts/Tokens/VRT/VRTConverterProxy.sol +++ b/contracts/Tokens/VRT/VRTConverterProxy.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "./VRTConverterStorage.sol"; @@ -81,7 +81,7 @@ contract VRTConverterProxy is VRTConverterAdminStorage { (bool success, bytes memory returnData) = callee.delegatecall(data); assembly { if eq(success, 0) { - revert(add(returnData, 0x20), returndatasize) + revert(add(returnData, 0x20), returndatasize()) } } return returnData; @@ -173,20 +173,20 @@ contract VRTConverterProxy is VRTConverterAdminStorage { * It returns to the external caller whatever the implementation returns * or forwards reverts. */ - function() external payable { + fallback() external payable { // delegate all other functions to current implementation (bool success, ) = implementation.delegatecall(msg.data); assembly { let free_mem_ptr := mload(0x40) - returndatacopy(free_mem_ptr, 0, returndatasize) + returndatacopy(free_mem_ptr, 0, returndatasize()) switch success case 0 { - revert(free_mem_ptr, returndatasize) + revert(free_mem_ptr, returndatasize()) } default { - return(free_mem_ptr, returndatasize) + return(free_mem_ptr, returndatasize()) } } } diff --git a/contracts/Tokens/VTokens/VBep20.sol b/contracts/Tokens/VTokens/VBep20.sol index dbdae2329..5e921e79a 100644 --- a/contracts/Tokens/VTokens/VBep20.sol +++ b/contracts/Tokens/VTokens/VBep20.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "./VToken.sol"; @@ -18,7 +18,7 @@ contract VBep20 is VToken, VBep20Interface { */ // @custom:event Emits Transfer event // @custom:event Emits Mint event - function mint(uint mintAmount) external returns (uint) { + function mint(uint mintAmount) external override returns (uint) { (uint err, ) = mintInternal(mintAmount); return err; } @@ -32,7 +32,7 @@ contract VBep20 is VToken, VBep20Interface { */ // @custom:event Emits Transfer event // @custom:event Emits MintBehalf event - function mintBehalf(address receiver, uint mintAmount) external returns (uint) { + function mintBehalf(address receiver, uint mintAmount) external override returns (uint) { (uint err, ) = mintBehalfInternal(receiver, mintAmount); return err; } @@ -46,7 +46,7 @@ contract VBep20 is VToken, VBep20Interface { // @custom:event Emits Redeem event on success // @custom:event Emits Transfer event on success // @custom:event Emits RedeemFee when fee is charged by the treasury - function redeem(uint redeemTokens) external returns (uint) { + function redeem(uint redeemTokens) external override returns (uint) { return redeemInternal(redeemTokens); } @@ -59,7 +59,7 @@ contract VBep20 is VToken, VBep20Interface { // @custom:event Emits Redeem event on success // @custom:event Emits Transfer event on success // @custom:event Emits RedeemFee when fee is charged by the treasury - function redeemUnderlying(uint redeemAmount) external returns (uint) { + function redeemUnderlying(uint redeemAmount) external override returns (uint) { return redeemUnderlyingInternal(redeemAmount); } @@ -69,9 +69,9 @@ contract VBep20 is VToken, VBep20Interface { * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). */ // @custom:event Emits Borrow event on success - function borrow(uint borrowAmount) external returns (uint) { + function borrow(uint borrowAmount) external override returns (uint) { address borrower = msg.sender; - address payable receiver = msg.sender; + address payable receiver = payable(msg.sender); return borrowInternal(borrower, receiver, borrowAmount); } @@ -85,7 +85,7 @@ contract VBep20 is VToken, VBep20Interface { // @custom:event Emits Borrow event on success function borrowBehalf(address borrower, uint borrowAmount) external returns (uint) { require(comptroller.approvedDelegates(borrower, msg.sender), "not an approved delegate"); - address payable receiver = msg.sender; + address payable receiver = payable(msg.sender); return borrowInternal(borrower, receiver, borrowAmount); } @@ -95,7 +95,7 @@ contract VBep20 is VToken, VBep20Interface { * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). */ // @custom:event Emits RepayBorrow event on success - function repayBorrow(uint repayAmount) external returns (uint) { + function repayBorrow(uint repayAmount) external override returns (uint) { (uint err, ) = repayBorrowInternal(repayAmount); return err; } @@ -107,7 +107,7 @@ contract VBep20 is VToken, VBep20Interface { * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). */ // @custom:event Emits RepayBorrow event on success - function repayBorrowBehalf(address borrower, uint repayAmount) external returns (uint) { + function repayBorrowBehalf(address borrower, uint repayAmount) external override returns (uint) { (uint err, ) = repayBorrowBehalfInternal(borrower, repayAmount); return err; } @@ -125,7 +125,7 @@ contract VBep20 is VToken, VBep20Interface { address borrower, uint repayAmount, VTokenInterface vTokenCollateral - ) external returns (uint) { + ) external override returns (uint) { (uint err, ) = liquidateBorrowInternal(borrower, repayAmount, vTokenCollateral); return err; } @@ -136,7 +136,7 @@ contract VBep20 is VToken, VBep20Interface { * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). */ // @custom:event Emits ReservesAdded event - function _addReserves(uint addAmount) external returns (uint) { + function _addReserves(uint addAmount) external override returns (uint) { return _addReservesInternal(addAmount); } @@ -178,7 +178,7 @@ contract VBep20 is VToken, VBep20Interface { * Note: This wrapper safely handles non-standard BEP-20 tokens that do not return a value. * See here: https://medium.com/coinmonks/missing-return-value-bug-at-least-130-tokens-affected-d67bf08521ca */ - function doTransferIn(address from, uint amount) internal returns (uint) { + function doTransferIn(address from, uint amount) internal override returns (uint) { EIP20NonStandardInterface token = EIP20NonStandardInterface(underlying); uint balanceBefore = EIP20Interface(underlying).balanceOf(address(this)); token.transferFrom(from, address(this), amount); @@ -217,7 +217,7 @@ contract VBep20 is VToken, VBep20Interface { * Note: This wrapper safely handles non-standard BEP-20 tokens that do not return a value. * See here: https://medium.com/coinmonks/missing-return-value-bug-at-least-130-tokens-affected-d67bf08521ca */ - function doTransferOut(address payable to, uint amount) internal { + function doTransferOut(address payable to, uint amount) internal virtual override { EIP20NonStandardInterface token = EIP20NonStandardInterface(underlying); token.transfer(to, amount); @@ -246,7 +246,7 @@ contract VBep20 is VToken, VBep20Interface { * @dev This excludes the value of the current message, if any * @return The quantity of underlying tokens owned by this contract */ - function getCashPrior() internal view returns (uint) { + function getCashPrior() internal view override returns (uint) { EIP20Interface token = EIP20Interface(underlying); return token.balanceOf(address(this)); } diff --git a/contracts/Tokens/VTokens/VBep20Delegate.sol b/contracts/Tokens/VTokens/VBep20Delegate.sol index e93817fb7..ce2ff916d 100644 --- a/contracts/Tokens/VTokens/VBep20Delegate.sol +++ b/contracts/Tokens/VTokens/VBep20Delegate.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "./VBep20.sol"; @@ -17,7 +17,7 @@ contract VBep20Delegate is VBep20, VDelegateInterface { * @notice Called by the delegator on a delegate to initialize it for duty * @param data The encoded bytes data for any initialization */ - function _becomeImplementation(bytes memory data) public { + function _becomeImplementation(bytes memory data) public override { // Shh -- currently unused data; @@ -32,7 +32,7 @@ contract VBep20Delegate is VBep20, VDelegateInterface { /** * @notice Called by the delegator on a delegate to forfeit its responsibility */ - function _resignImplementation() public { + function _resignImplementation() public override { // Shh -- we don't ever want this hook to be marked pure if (false) { implementation = address(0); diff --git a/contracts/Tokens/VTokens/VBep20Delegator.sol b/contracts/Tokens/VTokens/VBep20Delegator.sol index 967b1f749..61865075c 100644 --- a/contracts/Tokens/VTokens/VBep20Delegator.sol +++ b/contracts/Tokens/VTokens/VBep20Delegator.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "./VTokenInterfaces.sol"; @@ -34,7 +34,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac bytes memory becomeImplementationData ) public { // Creator of the contract is admin during initialization - admin = msg.sender; + admin = payable(msg.sender); // First delegate gets to initialize the delegator (i.e. storage contract) delegateTo( @@ -62,7 +62,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @notice Delegates execution to an implementation contract * @dev It returns to the external caller whatever the implementation returns or forwards reverts */ - function() external payable { + fallback() external payable { require(msg.value == 0, "VBep20Delegator:fallback: cannot send value to fallback"); // delegate all other functions to current implementation @@ -70,14 +70,14 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac assembly { let free_mem_ptr := mload(0x40) - returndatacopy(free_mem_ptr, 0, returndatasize) + returndatacopy(free_mem_ptr, 0, returndatasize()) switch success case 0 { - revert(free_mem_ptr, returndatasize) + revert(free_mem_ptr, returndatasize()) } default { - return(free_mem_ptr, returndatasize) + return(free_mem_ptr, returndatasize()) } } } @@ -88,7 +88,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @param mintAmount The amount of the underlying asset to supply * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). */ - function mint(uint mintAmount) external returns (uint) { + function mint(uint mintAmount) external override returns (uint) { bytes memory data = delegateToImplementation(abi.encodeWithSignature("mint(uint256)", mintAmount)); return abi.decode(data, (uint)); } @@ -99,7 +99,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @param mintAmount The amount of the underlying asset to supply * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). */ - function mintBehalf(address receiver, uint mintAmount) external returns (uint) { + function mintBehalf(address receiver, uint mintAmount) external override returns (uint) { bytes memory data = delegateToImplementation( abi.encodeWithSignature("mintBehalf(address,uint256)", receiver, mintAmount) ); @@ -112,7 +112,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @param redeemTokens The number of vTokens to redeem into underlying asset * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). */ - function redeem(uint redeemTokens) external returns (uint) { + function redeem(uint redeemTokens) external override returns (uint) { bytes memory data = delegateToImplementation(abi.encodeWithSignature("redeem(uint256)", redeemTokens)); return abi.decode(data, (uint)); } @@ -123,7 +123,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @param redeemAmount The amount of underlying to redeem * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). */ - function redeemUnderlying(uint redeemAmount) external returns (uint) { + function redeemUnderlying(uint redeemAmount) external override returns (uint) { bytes memory data = delegateToImplementation( abi.encodeWithSignature("redeemUnderlying(uint256)", redeemAmount) ); @@ -135,7 +135,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @param borrowAmount The amount of the underlying asset to borrow * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). */ - function borrow(uint borrowAmount) external returns (uint) { + function borrow(uint borrowAmount) external override returns (uint) { bytes memory data = delegateToImplementation(abi.encodeWithSignature("borrow(uint256)", borrowAmount)); return abi.decode(data, (uint)); } @@ -145,7 +145,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @param repayAmount The amount to repay * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). */ - function repayBorrow(uint repayAmount) external returns (uint) { + function repayBorrow(uint repayAmount) external override returns (uint) { bytes memory data = delegateToImplementation(abi.encodeWithSignature("repayBorrow(uint256)", repayAmount)); return abi.decode(data, (uint)); } @@ -156,7 +156,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @param repayAmount The amount to repay * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). */ - function repayBorrowBehalf(address borrower, uint repayAmount) external returns (uint) { + function repayBorrowBehalf(address borrower, uint repayAmount) external override returns (uint) { bytes memory data = delegateToImplementation( abi.encodeWithSignature("repayBorrowBehalf(address,uint256)", borrower, repayAmount) ); @@ -175,7 +175,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac address borrower, uint repayAmount, VTokenInterface vTokenCollateral - ) external returns (uint) { + ) external override returns (uint) { bytes memory data = delegateToImplementation( abi.encodeWithSignature("liquidateBorrow(address,uint256,address)", borrower, repayAmount, vTokenCollateral) ); @@ -188,7 +188,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @param amount The number of tokens to transfer * @return Whether or not the transfer succeeded */ - function transfer(address dst, uint amount) external returns (bool) { + function transfer(address dst, uint amount) external override returns (bool) { bytes memory data = delegateToImplementation(abi.encodeWithSignature("transfer(address,uint256)", dst, amount)); return abi.decode(data, (bool)); } @@ -200,7 +200,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @param amount The number of tokens to transfer * @return Whether or not the transfer succeeded */ - function transferFrom(address src, address dst, uint256 amount) external returns (bool) { + function transferFrom(address src, address dst, uint256 amount) external override returns (bool) { bytes memory data = delegateToImplementation( abi.encodeWithSignature("transferFrom(address,address,uint256)", src, dst, amount) ); @@ -215,7 +215,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @param amount The number of tokens that are approved (-1 means infinite) * @return Whether or not the approval succeeded */ - function approve(address spender, uint256 amount) external returns (bool) { + function approve(address spender, uint256 amount) external override returns (bool) { bytes memory data = delegateToImplementation( abi.encodeWithSignature("approve(address,uint256)", spender, amount) ); @@ -228,7 +228,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @param owner The address of the account to query * @return The amount of underlying owned by `owner` */ - function balanceOfUnderlying(address owner) external returns (uint) { + function balanceOfUnderlying(address owner) external override returns (uint) { bytes memory data = delegateToImplementation(abi.encodeWithSignature("balanceOfUnderlying(address)", owner)); return abi.decode(data, (uint)); } @@ -237,7 +237,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @notice Returns the current total borrows plus accrued interest * @return The total borrows with interest */ - function totalBorrowsCurrent() external returns (uint) { + function totalBorrowsCurrent() external override returns (uint) { bytes memory data = delegateToImplementation(abi.encodeWithSignature("totalBorrowsCurrent()")); return abi.decode(data, (uint)); } @@ -247,7 +247,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @param account The address whose balance should be calculated after updating borrowIndex * @return The calculated balance */ - function borrowBalanceCurrent(address account) external returns (uint) { + function borrowBalanceCurrent(address account) external override returns (uint) { bytes memory data = delegateToImplementation(abi.encodeWithSignature("borrowBalanceCurrent(address)", account)); return abi.decode(data, (uint)); } @@ -261,7 +261,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @param seizeTokens The number of vTokens to seize * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). */ - function seize(address liquidator, address borrower, uint seizeTokens) external returns (uint) { + function seize(address liquidator, address borrower, uint seizeTokens) external override returns (uint) { bytes memory data = delegateToImplementation( abi.encodeWithSignature("seize(address,address,uint256)", liquidator, borrower, seizeTokens) ); @@ -276,7 +276,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @param newPendingAdmin New pending admin. * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). */ - function _setPendingAdmin(address payable newPendingAdmin) external returns (uint) { + function _setPendingAdmin(address payable newPendingAdmin) external override returns (uint) { bytes memory data = delegateToImplementation( abi.encodeWithSignature("_setPendingAdmin(address)", newPendingAdmin) ); @@ -288,7 +288,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @dev Admin function to accrue interest and set a new reserve factor * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). */ - function _setReserveFactor(uint newReserveFactorMantissa) external returns (uint) { + function _setReserveFactor(uint newReserveFactorMantissa) external override returns (uint) { bytes memory data = delegateToImplementation( abi.encodeWithSignature("_setReserveFactor(uint256)", newReserveFactorMantissa) ); @@ -300,7 +300,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @dev Admin function for pending admin to accept role and update admin * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). */ - function _acceptAdmin() external returns (uint) { + function _acceptAdmin() external override returns (uint) { bytes memory data = delegateToImplementation(abi.encodeWithSignature("_acceptAdmin()")); return abi.decode(data, (uint)); } @@ -310,7 +310,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @param addAmount Amount of reserves to add * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). */ - function _addReserves(uint addAmount) external returns (uint) { + function _addReserves(uint addAmount) external override returns (uint) { bytes memory data = delegateToImplementation(abi.encodeWithSignature("_addReserves(uint256)", addAmount)); return abi.decode(data, (uint)); } @@ -320,7 +320,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @param reduceAmount Amount of reduction to reserves * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). */ - function _reduceReserves(uint reduceAmount) external returns (uint) { + function _reduceReserves(uint reduceAmount) external override returns (uint) { bytes memory data = delegateToImplementation(abi.encodeWithSignature("_reduceReserves(uint256)", reduceAmount)); return abi.decode(data, (uint)); } @@ -329,7 +329,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @notice Get cash balance of this vToken in the underlying asset * @return The quantity of underlying asset owned by this contract */ - function getCash() external view returns (uint) { + function getCash() external view override returns (uint) { bytes memory data = delegateToViewImplementation(abi.encodeWithSignature("getCash()")); return abi.decode(data, (uint)); } @@ -340,7 +340,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @param spender The address of the account which may transfer tokens * @return The number of tokens allowed to be spent (-1 means infinite) */ - function allowance(address owner, address spender) external view returns (uint) { + function allowance(address owner, address spender) external view override returns (uint) { bytes memory data = delegateToViewImplementation( abi.encodeWithSignature("allowance(address,address)", owner, spender) ); @@ -352,7 +352,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @param owner The address of the account to query * @return The number of tokens owned by `owner` */ - function balanceOf(address owner) external view returns (uint) { + function balanceOf(address owner) external view override returns (uint) { bytes memory data = delegateToViewImplementation(abi.encodeWithSignature("balanceOf(address)", owner)); return abi.decode(data, (uint)); } @@ -363,7 +363,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @param account Address of the account to snapshot * @return (possible error, token balance, borrow balance, exchange rate mantissa) */ - function getAccountSnapshot(address account) external view returns (uint, uint, uint, uint) { + function getAccountSnapshot(address account) external view override returns (uint, uint, uint, uint) { bytes memory data = delegateToViewImplementation( abi.encodeWithSignature("getAccountSnapshot(address)", account) ); @@ -374,7 +374,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @notice Returns the current per-block borrow interest rate for this vToken * @return The borrow interest rate per block, scaled by 1e18 */ - function borrowRatePerBlock() external view returns (uint) { + function borrowRatePerBlock() external view override returns (uint) { bytes memory data = delegateToViewImplementation(abi.encodeWithSignature("borrowRatePerBlock()")); return abi.decode(data, (uint)); } @@ -383,7 +383,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @notice Returns the current per-block supply interest rate for this vToken * @return The supply interest rate per block, scaled by 1e18 */ - function supplyRatePerBlock() external view returns (uint) { + function supplyRatePerBlock() external view override returns (uint) { bytes memory data = delegateToViewImplementation(abi.encodeWithSignature("supplyRatePerBlock()")); return abi.decode(data, (uint)); } @@ -399,7 +399,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac address implementation_, bool allowResign, bytes memory becomeImplementationData - ) public { + ) public override { require(msg.sender == admin, "VBep20Delegator::_setImplementation: Caller must be admin"); if (allowResign) { @@ -418,7 +418,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @notice Accrue interest then return the up-to-date exchange rate * @return Calculated exchange rate scaled by 1e18 */ - function exchangeRateCurrent() public returns (uint) { + function exchangeRateCurrent() public override returns (uint) { bytes memory data = delegateToImplementation(abi.encodeWithSignature("exchangeRateCurrent()")); return abi.decode(data, (uint)); } @@ -428,7 +428,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @dev This calculates interest accrued from the last checkpointed block * up to the current block and writes new checkpoint to storage. */ - function accrueInterest() public returns (uint) { + function accrueInterest() public override returns (uint) { bytes memory data = delegateToImplementation(abi.encodeWithSignature("accrueInterest()")); return abi.decode(data, (uint)); } @@ -438,7 +438,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @dev Admin function to set a new comptroller * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). */ - function _setComptroller(ComptrollerInterface newComptroller) public returns (uint) { + function _setComptroller(ComptrollerInterface newComptroller) public override returns (uint) { bytes memory data = delegateToImplementation( abi.encodeWithSignature("_setComptroller(address)", newComptroller) ); @@ -451,7 +451,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @param newInterestRateModel The new interest rate model to use * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). */ - function _setInterestRateModel(InterestRateModel newInterestRateModel) public returns (uint) { + function _setInterestRateModel(InterestRateModel newInterestRateModel) public override returns (uint) { bytes memory data = delegateToImplementation( abi.encodeWithSignature("_setInterestRateModel(address)", newInterestRateModel) ); @@ -481,7 +481,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac ); assembly { if eq(success, 0) { - revert(add(returnData, 0x20), returndatasize) + revert(add(returnData, 0x20), returndatasize()) } } return abi.decode(returnData, (bytes)); @@ -492,7 +492,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @param account The address whose balance should be calculated * @return The calculated balance */ - function borrowBalanceStored(address account) public view returns (uint) { + function borrowBalanceStored(address account) public view override returns (uint) { bytes memory data = delegateToViewImplementation( abi.encodeWithSignature("borrowBalanceStored(address)", account) ); @@ -504,7 +504,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @dev This function does not accrue interest before calculating the exchange rate * @return Calculated exchange rate scaled by 1e18 */ - function exchangeRateStored() public view returns (uint) { + function exchangeRateStored() public view override returns (uint) { bytes memory data = delegateToViewImplementation(abi.encodeWithSignature("exchangeRateStored()")); return abi.decode(data, (uint)); } @@ -520,7 +520,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac (bool success, bytes memory returnData) = callee.delegatecall(data); assembly { if eq(success, 0) { - revert(add(returnData, 0x20), returndatasize) + revert(add(returnData, 0x20), returndatasize()) } } return returnData; diff --git a/contracts/Tokens/VTokens/VToken.sol b/contracts/Tokens/VTokens/VToken.sol index d103c02a4..46267672b 100644 --- a/contracts/Tokens/VTokens/VToken.sol +++ b/contracts/Tokens/VTokens/VToken.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity ^0.8.13; import "../../Comptroller/ComptrollerInterface.sol"; import "../../Utils/ErrorReporter.sol"; @@ -69,7 +69,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { * @return Whether or not the transfer succeeded */ // @custom:event Emits Transfer event - function transfer(address dst, uint256 amount) external nonReentrant returns (bool) { + function transfer(address dst, uint256 amount) external override nonReentrant returns (bool) { return transferTokens(msg.sender, msg.sender, dst, amount) == uint(Error.NO_ERROR); } @@ -81,7 +81,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { * @return Whether or not the transfer succeeded */ // @custom:event Emits Transfer event - function transferFrom(address src, address dst, uint256 amount) external nonReentrant returns (bool) { + function transferFrom(address src, address dst, uint256 amount) external override nonReentrant returns (bool) { return transferTokens(msg.sender, src, dst, amount) == uint(Error.NO_ERROR); } @@ -94,7 +94,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { * @return Whether or not the approval succeeded */ // @custom:event Emits Approval event on successful approve - function approve(address spender, uint256 amount) external returns (bool) { + function approve(address spender, uint256 amount) external override returns (bool) { address src = msg.sender; transferAllowances[src][spender] = amount; emit Approval(src, spender, amount); @@ -107,7 +107,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { * @param owner The address of the account to query * @return The amount of underlying owned by `owner` */ - function balanceOfUnderlying(address owner) external returns (uint) { + function balanceOfUnderlying(address owner) external override returns (uint) { Exp memory exchangeRate = Exp({ mantissa: exchangeRateCurrent() }); (MathError mErr, uint balance) = mulScalarTruncate(exchangeRate, accountTokens[owner]); require(mErr == MathError.NO_ERROR, "balance could not be calculated"); @@ -118,7 +118,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { * @notice Returns the current total borrows plus accrued interest * @return The total borrows with interest */ - function totalBorrowsCurrent() external nonReentrant returns (uint) { + function totalBorrowsCurrent() external override nonReentrant returns (uint) { require(accrueInterest() == uint(Error.NO_ERROR), "accrue interest failed"); return totalBorrows; } @@ -128,7 +128,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { * @param account The address whose balance should be calculated after updating borrowIndex * @return The calculated balance */ - function borrowBalanceCurrent(address account) external nonReentrant returns (uint) { + function borrowBalanceCurrent(address account) external override nonReentrant returns (uint) { require(accrueInterest() == uint(Error.NO_ERROR), "accrue interest failed"); return borrowBalanceStored(account); } @@ -143,7 +143,11 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). */ // @custom:event Emits Transfer event - function seize(address liquidator, address borrower, uint seizeTokens) external nonReentrant returns (uint) { + function seize( + address liquidator, + address borrower, + uint seizeTokens + ) external override nonReentrant returns (uint) { return seizeInternal(msg.sender, liquidator, borrower, seizeTokens); } @@ -154,7 +158,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). */ // @custom:event Emits NewPendingAdmin event with old and new admin addresses - function _setPendingAdmin(address payable newPendingAdmin) external returns (uint) { + function _setPendingAdmin(address payable newPendingAdmin) external override returns (uint) { // Check caller = admin if (msg.sender != admin) { return fail(Error.UNAUTHORIZED, FailureInfo.SET_PENDING_ADMIN_OWNER_CHECK); @@ -179,7 +183,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { */ // @custom:event Emits NewAdmin event on successful acceptance // @custom:event Emits NewPendingAdmin event with null new pending admin - function _acceptAdmin() external returns (uint) { + function _acceptAdmin() external override returns (uint) { // Check caller is pendingAdmin if (msg.sender != pendingAdmin) { return fail(Error.UNAUTHORIZED, FailureInfo.ACCEPT_ADMIN_PENDING_ADMIN_CHECK); @@ -193,7 +197,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { admin = pendingAdmin; // Clear the pending value - pendingAdmin = address(0); + pendingAdmin = payable(address(0)); emit NewAdmin(oldAdmin, admin); emit NewPendingAdmin(oldPendingAdmin, pendingAdmin); @@ -207,7 +211,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). */ // @custom:event Emits NewReserveFactor event - function _setReserveFactor(uint newReserveFactorMantissa) external nonReentrant returns (uint) { + function _setReserveFactor(uint newReserveFactorMantissa) external override nonReentrant returns (uint) { uint error = accrueInterest(); if (error != uint(Error.NO_ERROR)) { // accrueInterest emits logs on errors, but on top of that we want to log the fact that an attempted reserve factor change failed. @@ -223,7 +227,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). */ // @custom:event Emits ReservesReduced event - function _reduceReserves(uint reduceAmount) external nonReentrant returns (uint) { + function _reduceReserves(uint reduceAmount) external override nonReentrant returns (uint) { uint error = accrueInterest(); if (error != uint(Error.NO_ERROR)) { // accrueInterest emits logs on errors, but on top of that we want to log the fact that an attempted reduce reserves failed. @@ -239,7 +243,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { * @param spender The address of the account which may transfer tokens * @return The number of tokens allowed to be spent (-1 means infinite) */ - function allowance(address owner, address spender) external view returns (uint256) { + function allowance(address owner, address spender) external view override returns (uint256) { return transferAllowances[owner][spender]; } @@ -248,7 +252,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { * @param owner The address of the account to query * @return The number of tokens owned by `owner` */ - function balanceOf(address owner) external view returns (uint256) { + function balanceOf(address owner) external view override returns (uint256) { return accountTokens[owner]; } @@ -258,7 +262,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { * @param account Address of the account to snapshot * @return (possible error, token balance, borrow balance, exchange rate mantissa) */ - function getAccountSnapshot(address account) external view returns (uint, uint, uint, uint) { + function getAccountSnapshot(address account) external view override returns (uint, uint, uint, uint) { uint vTokenBalance = accountTokens[account]; uint borrowBalance; uint exchangeRateMantissa; @@ -282,7 +286,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { * @notice Returns the current per-block supply interest rate for this vToken * @return The supply interest rate per block, scaled by 1e18 */ - function supplyRatePerBlock() external view returns (uint) { + function supplyRatePerBlock() external view override returns (uint) { return interestRateModel.getSupplyRate(getCashPrior(), totalBorrows, totalReserves, reserveFactorMantissa); } @@ -290,7 +294,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { * @notice Returns the current per-block borrow interest rate for this vToken * @return The borrow interest rate per block, scaled by 1e18 */ - function borrowRatePerBlock() external view returns (uint) { + function borrowRatePerBlock() external view override returns (uint) { return interestRateModel.getBorrowRate(getCashPrior(), totalBorrows, totalReserves); } @@ -298,7 +302,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { * @notice Get cash balance of this vToken in the underlying asset * @return The quantity of underlying asset owned by this contract */ - function getCash() external view returns (uint) { + function getCash() external view override returns (uint) { return getCashPrior(); } @@ -350,7 +354,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { * @notice Accrue interest then return the up-to-date exchange rate * @return Calculated exchange rate scaled by 1e18 */ - function exchangeRateCurrent() public nonReentrant returns (uint) { + function exchangeRateCurrent() public override nonReentrant returns (uint) { require(accrueInterest() == uint(Error.NO_ERROR), "accrue interest failed"); return exchangeRateStored(); } @@ -361,7 +365,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { * up to the current block and writes new checkpoint to storage. */ // @custom:event Emits AccrueInterest event - function accrueInterest() public returns (uint) { + function accrueInterest() public override returns (uint) { /* Remember the initial block number */ uint currentBlockNumber = getBlockNumber(); uint accrualBlockNumberPrior = accrualBlockNumber; @@ -476,7 +480,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). */ // @custom:event Emits NewComptroller event - function _setComptroller(ComptrollerInterface newComptroller) public returns (uint) { + function _setComptroller(ComptrollerInterface newComptroller) public override returns (uint) { // Check caller is admin if (msg.sender != admin) { return fail(Error.UNAUTHORIZED, FailureInfo.SET_COMPTROLLER_OWNER_CHECK); @@ -501,7 +505,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { * @param newInterestRateModel The new interest rate model to use * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). */ - function _setInterestRateModel(InterestRateModel newInterestRateModel) public returns (uint) { + function _setInterestRateModel(InterestRateModel newInterestRateModel) public override returns (uint) { uint error = accrueInterest(); if (error != uint(Error.NO_ERROR)) { // accrueInterest emits logs on errors, but on top of that we want to log the fact that an attempted change of interest rate model failed @@ -516,7 +520,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { * @dev This function does not accrue interest before calculating the exchange rate * @return Calculated exchange rate scaled by 1e18 */ - function exchangeRateStored() public view returns (uint) { + function exchangeRateStored() public view override returns (uint) { (MathError err, uint result) = exchangeRateStoredInternal(); require(err == MathError.NO_ERROR, "exchangeRateStored: exchangeRateStoredInternal failed"); return result; @@ -527,7 +531,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { * @param account The address whose balance should be calculated * @return The calculated balance */ - function borrowBalanceStored(address account) public view returns (uint) { + function borrowBalanceStored(address account) public view override returns (uint) { (MathError err, uint result) = borrowBalanceStoredInternal(account); require(err == MathError.NO_ERROR, "borrowBalanceStored: borrowBalanceStoredInternal failed"); return result; @@ -557,7 +561,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { /* Get the allowance, infinite for the account owner */ uint startingAllowance = 0; if (spender == src) { - startingAllowance = uint(-1); + startingAllowance = type(uint).max; } else { startingAllowance = transferAllowances[src][spender]; } @@ -591,7 +595,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { accountTokens[dst] = dstTokensNew; /* Eat some of the allowance (if necessary) */ - if (startingAllowance != uint(-1)) { + if (startingAllowance != type(uint).max) { transferAllowances[src][spender] = allowanceNew; } @@ -803,7 +807,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { return fail(Error(error), FailureInfo.REDEEM_ACCRUE_INTEREST_FAILED); } // redeemFresh emits redeem-specific logs on errors, so we don't need to - return redeemFresh(msg.sender, redeemTokens, 0); + return redeemFresh(payable(msg.sender), redeemTokens, 0); } /** @@ -819,7 +823,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { return fail(Error(error), FailureInfo.REDEEM_ACCRUE_INTEREST_FAILED); } // redeemFresh emits redeem-specific logs on errors, so we don't need to - return redeemFresh(msg.sender, 0, redeemAmount); + return redeemFresh(payable(msg.sender), 0, redeemAmount); } /** @@ -943,7 +947,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { revert("math error"); } - doTransferOut(address(uint160(IComptroller(address(comptroller)).treasuryAddress())), feeAmount); + doTransferOut(payable(address(uint160(IComptroller(address(comptroller)).treasuryAddress()))), feeAmount); emit RedeemFee(redeemer, feeAmount, vars.redeemTokens); } else { @@ -962,6 +966,17 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { return uint(Error.NO_ERROR); } + /** + * @notice Sender borrows assets from the protocol to their own address + * @param borrowAmount The amount of the underlying asset to borrow + * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). + */ + function borrowInternal(uint borrowAmount) internal nonReentrant returns (uint) { + address borrower = msg.sender; + address payable receiver = payable(msg.sender); + return borrowInternal(borrower, receiver, borrowAmount); + } + /** * @notice Receiver gets the borrow on behalf of the borrower address * @param borrower The borrower, on behalf of whom to borrow @@ -1128,7 +1143,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { } /* If repayAmount == -1, repayAmount = accountBorrows */ - if (repayAmount == uint(-1)) { + if (repayAmount == type(uint).max) { vars.repayAmount = vars.accountBorrows; } else { vars.repayAmount = repayAmount; @@ -1198,7 +1213,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { } // liquidateBorrowFresh emits borrow-specific logs on errors, so we don't need to - return liquidateBorrowFresh(msg.sender, borrower, repayAmount, vTokenCollateral); + return liquidateBorrowFresh(payable(msg.sender), borrower, repayAmount, vTokenCollateral); } /** @@ -1250,7 +1265,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { } /* Fail if repayAmount = -1 */ - if (repayAmount == uint(-1)) { + if (repayAmount == type(uint).max) { return (fail(Error.INVALID_CLOSE_AMOUNT_REQUESTED, FailureInfo.LIQUIDATE_CLOSE_AMOUNT_IS_UINT_MAX), 0); } @@ -1275,7 +1290,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { /* Revert if borrower collateral token balance < seizeTokens */ require(vTokenCollateral.balanceOf(borrower) >= seizeTokens, "LIQUIDATE_SEIZE_TOO_MUCH"); - // If this is also the collateral, run seizeInternal to avoid re-entrancy, otherwise make an external call + // If this is also the collateral, run seizeInternal to avoid re-entrancy, otherwise make an external override call uint seizeError; if (address(vTokenCollateral) == address(this)) { seizeError = seizeInternal(address(this), liquidator, borrower, seizeTokens); @@ -1544,20 +1559,20 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { * @dev Performs a transfer in, reverting upon failure. Returns the amount actually transferred to the protocol, in case of a fee. * This may revert due to insufficient balance or insufficient allowance. */ - function doTransferIn(address from, uint amount) internal returns (uint); + function doTransferIn(address from, uint amount) internal virtual returns (uint) {} /** * @dev Performs a transfer out, ideally returning an explanatory error code upon failure rather than reverting. * If caller has not called checked protocol's balance, may revert due to insufficient cash held in the contract. * If caller has checked protocol's balance, and verified it is >= amount, this should not revert in normal conditions. */ - function doTransferOut(address payable to, uint amount) internal; + function doTransferOut(address payable to, uint amount) internal virtual {} /** * @dev Function to simply retrieve block number * This exists mainly for inheriting test contracts to stub this result. */ - function getBlockNumber() internal view returns (uint) { + function getBlockNumber() internal view virtual returns (uint) { return block.number; } @@ -1603,7 +1618,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { * @dev This function does not accrue interest before calculating the exchange rate * @return Tuple of error code and calculated exchange rate scaled by 1e18 */ - function exchangeRateStoredInternal() internal view returns (MathError, uint) { + function exchangeRateStoredInternal() internal view virtual returns (MathError, uint) { uint _totalSupply = totalSupply; if (_totalSupply == 0) { /* @@ -1642,5 +1657,5 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { * @dev This excludes the value of the current message, if any * @return The quantity of underlying owned by this contract */ - function getCashPrior() internal view returns (uint); + function getCashPrior() internal view virtual returns (uint) {} } diff --git a/contracts/Tokens/VTokens/VTokenInterfaces.sol b/contracts/Tokens/VTokens/VTokenInterfaces.sol index 08a03a3d5..c228531d1 100644 --- a/contracts/Tokens/VTokens/VTokenInterfaces.sol +++ b/contracts/Tokens/VTokens/VTokenInterfaces.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../../Comptroller/ComptrollerInterface.sol"; import "../../InterestRateModels/InterestRateModel.sol"; @@ -116,7 +116,7 @@ contract VTokenStorage { mapping(address => BorrowSnapshot) internal accountBorrows; } -contract VTokenInterface is VTokenStorage { +abstract contract VTokenInterface is VTokenStorage { /** * @notice Indicator that this is a vToken contract (for inspection) */ @@ -220,61 +220,61 @@ contract VTokenInterface is VTokenStorage { /** * @notice Failure event */ - event Failure(uint error, uint info, uint detail); + // event Failure(uint error, uint info, uint detail); /*** User Interface ***/ - function transfer(address dst, uint amount) external returns (bool); + function transfer(address dst, uint amount) external virtual returns (bool); - function transferFrom(address src, address dst, uint amount) external returns (bool); + function transferFrom(address src, address dst, uint amount) external virtual returns (bool); - function approve(address spender, uint amount) external returns (bool); + function approve(address spender, uint amount) external virtual returns (bool); - function balanceOfUnderlying(address owner) external returns (uint); + function balanceOfUnderlying(address owner) external virtual returns (uint); - function totalBorrowsCurrent() external returns (uint); + function totalBorrowsCurrent() external virtual returns (uint); - function borrowBalanceCurrent(address account) external returns (uint); + function borrowBalanceCurrent(address account) external virtual returns (uint); - function seize(address liquidator, address borrower, uint seizeTokens) external returns (uint); + function seize(address liquidator, address borrower, uint seizeTokens) external virtual returns (uint); /*** Admin Function ***/ - function _setPendingAdmin(address payable newPendingAdmin) external returns (uint); + function _setPendingAdmin(address payable newPendingAdmin) external virtual returns (uint); /*** Admin Function ***/ - function _acceptAdmin() external returns (uint); + function _acceptAdmin() external virtual returns (uint); /*** Admin Function ***/ - function _setReserveFactor(uint newReserveFactorMantissa) external returns (uint); + function _setReserveFactor(uint newReserveFactorMantissa) external virtual returns (uint); /*** Admin Function ***/ - function _reduceReserves(uint reduceAmount) external returns (uint); + function _reduceReserves(uint reduceAmount) external virtual returns (uint); - function balanceOf(address owner) external view returns (uint); + function balanceOf(address owner) external view virtual returns (uint); - function allowance(address owner, address spender) external view returns (uint); + function allowance(address owner, address spender) external view virtual returns (uint); - function getAccountSnapshot(address account) external view returns (uint, uint, uint, uint); + function getAccountSnapshot(address account) external view virtual returns (uint, uint, uint, uint); - function borrowRatePerBlock() external view returns (uint); + function borrowRatePerBlock() external view virtual returns (uint); - function supplyRatePerBlock() external view returns (uint); + function supplyRatePerBlock() external view virtual returns (uint); - function getCash() external view returns (uint); + function getCash() external view virtual returns (uint); - function exchangeRateCurrent() public returns (uint); + function exchangeRateCurrent() public virtual returns (uint); - function accrueInterest() public returns (uint); + function accrueInterest() public virtual returns (uint); /*** Admin Function ***/ - function _setComptroller(ComptrollerInterface newComptroller) public returns (uint); + function _setComptroller(ComptrollerInterface newComptroller) public virtual returns (uint); /*** Admin Function ***/ - function _setInterestRateModel(InterestRateModel newInterestRateModel) public returns (uint); + function _setInterestRateModel(InterestRateModel newInterestRateModel) public virtual returns (uint); - function borrowBalanceStored(address account) public view returns (uint); + function borrowBalanceStored(address account) public view virtual returns (uint); - function exchangeRateStored() public view returns (uint); + function exchangeRateStored() public view virtual returns (uint); } contract VBep20Storage { @@ -284,32 +284,32 @@ contract VBep20Storage { address public underlying; } -contract VBep20Interface is VBep20Storage { +abstract contract VBep20Interface is VBep20Storage { /*** User Interface ***/ - function mint(uint mintAmount) external returns (uint); + function mint(uint mintAmount) external virtual returns (uint); - function mintBehalf(address receiver, uint mintAmount) external returns (uint); + function mintBehalf(address receiver, uint mintAmount) external virtual returns (uint); - function redeem(uint redeemTokens) external returns (uint); + function redeem(uint redeemTokens) external virtual returns (uint); - function redeemUnderlying(uint redeemAmount) external returns (uint); + function redeemUnderlying(uint redeemAmount) external virtual returns (uint); - function borrow(uint borrowAmount) external returns (uint); + function borrow(uint borrowAmount) external virtual returns (uint); - function repayBorrow(uint repayAmount) external returns (uint); + function repayBorrow(uint repayAmount) external virtual returns (uint); - function repayBorrowBehalf(address borrower, uint repayAmount) external returns (uint); + function repayBorrowBehalf(address borrower, uint repayAmount) external virtual returns (uint); function liquidateBorrow( address borrower, uint repayAmount, VTokenInterface vTokenCollateral - ) external returns (uint); + ) external virtual returns (uint); /*** Admin Functions ***/ - function _addReserves(uint addAmount) external returns (uint); + function _addReserves(uint addAmount) external virtual returns (uint); } contract VDelegationStorage { @@ -319,7 +319,7 @@ contract VDelegationStorage { address public implementation; } -contract VDelegatorInterface is VDelegationStorage { +abstract contract VDelegatorInterface is VDelegationStorage { /** * @notice Emitted when implementation is changed */ @@ -335,19 +335,19 @@ contract VDelegatorInterface is VDelegationStorage { address implementation_, bool allowResign, bytes memory becomeImplementationData - ) public; + ) public virtual; } -contract VDelegateInterface is VDelegationStorage { +abstract contract VDelegateInterface is VDelegationStorage { /** * @notice Called by the delegator on a delegate to initialize it for duty * @dev Should revert if any issues arise which make it unfit for delegation * @param data The encoded bytes data for any initialization */ - function _becomeImplementation(bytes memory data) public; + function _becomeImplementation(bytes memory data) public virtual; /** * @notice Called by the delegator on a delegate to forfeit its responsibility */ - function _resignImplementation() public; + function _resignImplementation() public virtual; } diff --git a/contracts/Tokens/XVS/XVSVestingProxy.sol b/contracts/Tokens/XVS/XVSVestingProxy.sol index 411b5d4ab..080ebb677 100644 --- a/contracts/Tokens/XVS/XVSVestingProxy.sol +++ b/contracts/Tokens/XVS/XVSVestingProxy.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "./XVSVestingStorage.sol"; @@ -67,7 +67,7 @@ contract XVSVestingProxy is XVSVestingAdminStorage { (bool success, bytes memory returnData) = callee.delegatecall(data); assembly { if eq(success, 0) { - revert(add(returnData, 0x20), returndatasize) + revert(add(returnData, 0x20), returndatasize()) } } return returnData; @@ -156,20 +156,20 @@ contract XVSVestingProxy is XVSVestingAdminStorage { * It returns to the external caller whatever the implementation returns * or forwards reverts. */ - function() external payable { + fallback() external payable { // delegate all other functions to current implementation (bool success, ) = implementation.delegatecall(msg.data); assembly { let free_mem_ptr := mload(0x40) - returndatacopy(free_mem_ptr, 0, returndatasize) + returndatacopy(free_mem_ptr, 0, returndatasize()) switch success case 0 { - revert(free_mem_ptr, returndatasize) + revert(free_mem_ptr, returndatasize()) } default { - return(free_mem_ptr, returndatasize) + return(free_mem_ptr, returndatasize()) } } } From 83932ac8bd8b8dae290de432767eabfa68bb3adc Mon Sep 17 00:00:00 2001 From: defcon022 Date: Fri, 10 Mar 2023 18:56:27 +0530 Subject: [PATCH 017/153] Upgraded solidity version and refactor Test contracts. --- contracts/test/BEP20.sol | 27 ++-- contracts/test/ComptrollerHarness.sol | 81 +++++----- contracts/test/ComptrollerScenario.sol | 6 +- contracts/test/ComptrollerScenarioG1.sol | 6 +- contracts/test/ComptrollerScenarioG2.sol | 2 +- contracts/test/ComptrollerScenarioG3.sol | 2 +- contracts/test/ComptrollerScenarioG4.sol | 2 +- contracts/test/ComptrollerScenarioG5.sol | 2 +- contracts/test/Const.sol | 12 +- contracts/test/Counter.sol | 2 +- contracts/test/EvilToken.sol | 7 +- contracts/test/EvilXDelegator.sol | 82 +++++----- contracts/test/EvilXToken.sol | 10 +- contracts/test/FalseMarker.sol | 2 +- contracts/test/FaucetToken.sol | 2 +- contracts/test/Fauceteer.sol | 2 +- contracts/test/FeeToken.sol | 7 +- contracts/test/FixedPriceOracle.sol | 4 +- contracts/test/GovernorAlphaHarness.sol | 4 +- contracts/test/InterestRateModelHarness.sol | 6 +- contracts/test/MathHelpers.sol | 2 +- contracts/test/MockDeflationaryToken.sol | 4 +- contracts/test/MockMCD.sol | 2 +- contracts/test/RefreshSpeedsProxy.sol | 2 +- contracts/test/SimplePriceOracle.sol | 4 +- contracts/test/Structs.sol | 2 +- contracts/test/TetherInterface.sol | 6 +- contracts/test/TimelockHarness.sol | 2 +- contracts/test/VAIControllerHarness.sol | 8 +- contracts/test/VAIControllerScenario.sol | 6 +- contracts/test/VAIHarness.sol | 2 +- contracts/test/VBNBHarness.sol.archive | 10 +- contracts/test/VBep20Harness.sol | 18 +-- contracts/test/VBep20MockDelegate.sol | 28 ++-- contracts/test/VRTConverterHarness.sol | 4 +- contracts/test/VRTVaultHarness.sol | 4 +- contracts/test/WBNB.sol | 8 +- contracts/test/WBTC.sol | 157 +++++++++++--------- contracts/test/XVSHarness.sol | 2 +- contracts/test/XVSVaultHarness.sol | 2 +- contracts/test/XVSVaultScenario.sol | 4 +- contracts/test/XVSVestingHarness.sol | 4 +- 42 files changed, 287 insertions(+), 262 deletions(-) diff --git a/contracts/test/BEP20.sol b/contracts/test/BEP20.sol index b82a87acf..85f48ab48 100644 --- a/contracts/test/BEP20.sol +++ b/contracts/test/BEP20.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../Utils/SafeMath.sol"; @@ -15,16 +15,16 @@ interface BEP20Base { function balanceOf(address who) external view returns (uint256); } -contract BEP20 is BEP20Base { - function transfer(address to, uint256 value) external returns (bool); +abstract contract BEP20 is BEP20Base { + function transfer(address to, uint256 value) external virtual returns (bool); - function transferFrom(address from, address to, uint256 value) external returns (bool); + function transferFrom(address from, address to, uint256 value) external virtual returns (bool); } -contract BEP20NS is BEP20Base { - function transfer(address to, uint256 value) external; +abstract contract BEP20NS is BEP20Base { + function transfer(address to, uint256 value) external virtual; - function transferFrom(address from, address to, uint256 value) external; + function transferFrom(address from, address to, uint256 value) external virtual; } /** @@ -55,14 +55,14 @@ contract StandardToken is BEP20 { decimals = _decimalUnits; } - function transfer(address dst, uint256 amount) external returns (bool) { + function transfer(address dst, uint256 amount) external virtual override returns (bool) { balanceOf[msg.sender] = balanceOf[msg.sender].sub(amount, "Insufficient balance"); balanceOf[dst] = balanceOf[dst].add(amount, "Balance overflow"); emit Transfer(msg.sender, dst, amount); return true; } - function transferFrom(address src, address dst, uint256 amount) external returns (bool) { + function transferFrom(address src, address dst, uint256 amount) external virtual override returns (bool) { allowance[src][msg.sender] = allowance[src][msg.sender].sub(amount, "Insufficient allowance"); balanceOf[src] = balanceOf[src].sub(amount, "Insufficient balance"); balanceOf[dst] = balanceOf[dst].add(amount, "Balance overflow"); @@ -105,13 +105,13 @@ contract NonStandardToken is BEP20NS { decimals = _decimalUnits; } - function transfer(address dst, uint256 amount) external { + function transfer(address dst, uint256 amount) external override { balanceOf[msg.sender] = balanceOf[msg.sender].sub(amount, "Insufficient balance"); balanceOf[dst] = balanceOf[dst].add(amount, "Balance overflow"); emit Transfer(msg.sender, dst, amount); } - function transferFrom(address src, address dst, uint256 amount) external { + function transferFrom(address src, address dst, uint256 amount) external override { allowance[src][msg.sender] = allowance[src][msg.sender].sub(amount, "Insufficient allowance"); balanceOf[src] = balanceOf[src].sub(amount, "Insufficient balance"); balanceOf[dst] = balanceOf[dst].add(amount, "Balance overflow"); @@ -126,6 +126,7 @@ contract NonStandardToken is BEP20NS { } contract BEP20Harness is StandardToken { + using SafeMath for uint256; // To support testing, we can specify addresses for which transferFrom should fail and return false mapping(address => bool) public failTransferFromAddresses; @@ -151,7 +152,7 @@ contract BEP20Harness is StandardToken { balanceOf[_account] = _amount; } - function transfer(address dst, uint256 amount) external returns (bool success) { + function transfer(address dst, uint256 amount) external override returns (bool success) { // Added for testing purposes if (failTransferToAddresses[dst]) { return false; @@ -162,7 +163,7 @@ contract BEP20Harness is StandardToken { return true; } - function transferFrom(address src, address dst, uint256 amount) external returns (bool success) { + function transferFrom(address src, address dst, uint256 amount) external override returns (bool success) { // Added for testing purposes if (failTransferFromAddresses[src]) { return false; diff --git a/contracts/test/ComptrollerHarness.sol b/contracts/test/ComptrollerHarness.sol index 4b2c3bbe8..3de2db58c 100644 --- a/contracts/test/ComptrollerHarness.sol +++ b/contracts/test/ComptrollerHarness.sol @@ -1,16 +1,16 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../Comptroller/Comptroller.sol"; import "../Oracle/PriceOracle.sol"; contract ComptrollerKovan is Comptroller { - function getXVSAddress() public view returns (address) { + function getXVSAddress() public view override returns (address) { return 0x61460874a7196d6a22D1eE4922473664b3E95270; } } contract ComptrollerRopsten is Comptroller { - function getXVSAddress() public view returns (address) { + function getXVSAddress() public view override returns (address) { return 0x1Fe16De955718CFAb7A44605458AB023838C2793; } } @@ -40,7 +40,7 @@ contract ComptrollerHarness is Comptroller { xvsAddress = xvsAddress_; } - function getXVSAddress() public view returns (address) { + function getXVSAddress() public view override returns (address) { return xvsAddress; } @@ -48,7 +48,7 @@ contract ComptrollerHarness is Comptroller { vXVSAddress = vXVSAddress_; } - function getXVSVTokenAddress() public view returns (address) { + function getXVSVTokenAddress() public view override returns (address) { return vXVSAddress; } @@ -157,7 +157,7 @@ contract ComptrollerHarness is Comptroller { blockNumber = number; } - function getBlockNumber() public view returns (uint) { + function getBlockNumber() public view override returns (uint) { return blockNumber; } @@ -196,7 +196,7 @@ contract ComptrollerBorked { } } -contract BoolComptroller is ComptrollerInterface { +abstract contract BoolComptroller is ComptrollerInterface { bool internal allowMint = true; bool internal allowRedeem = true; bool internal allowBorrow = true; @@ -232,27 +232,27 @@ contract BoolComptroller is ComptrollerInterface { /*** Assets You Are In ***/ - function enterMarkets(address[] calldata _vTokens) external returns (uint[] memory) { + function enterMarkets(address[] calldata _vTokens) external override returns (uint[] memory) { _vTokens; uint[] memory ret; return ret; } - function exitMarket(address _vToken) external returns (uint) { + function exitMarket(address _vToken) external override returns (uint) { _vToken; return noError; } /*** Policy Hooks ***/ - function mintAllowed(address _vToken, address _minter, uint _mintAmount) external returns (uint) { + function mintAllowed(address _vToken, address _minter, uint _mintAmount) external override returns (uint) { _vToken; _minter; _mintAmount; return allowMint ? noError : opaqueError; } - function mintVerify(address _vToken, address _minter, uint _mintAmount, uint _mintTokens) external { + function mintVerify(address _vToken, address _minter, uint _mintAmount, uint _mintTokens) external override { _vToken; _minter; _mintAmount; @@ -260,14 +260,19 @@ contract BoolComptroller is ComptrollerInterface { require(verifyMint, "mintVerify rejected mint"); } - function redeemAllowed(address _vToken, address _redeemer, uint _redeemTokens) external returns (uint) { + function redeemAllowed(address _vToken, address _redeemer, uint _redeemTokens) external override returns (uint) { _vToken; _redeemer; _redeemTokens; return allowRedeem ? noError : opaqueError; } - function redeemVerify(address _vToken, address _redeemer, uint _redeemAmount, uint _redeemTokens) external { + function redeemVerify( + address _vToken, + address _redeemer, + uint _redeemAmount, + uint _redeemTokens + ) external override { _vToken; _redeemer; _redeemAmount; @@ -275,14 +280,14 @@ contract BoolComptroller is ComptrollerInterface { require(verifyRedeem, "redeemVerify rejected redeem"); } - function borrowAllowed(address _vToken, address _borrower, uint _borrowAmount) external returns (uint) { + function borrowAllowed(address _vToken, address _borrower, uint _borrowAmount) external override returns (uint) { _vToken; _borrower; _borrowAmount; return allowBorrow ? noError : opaqueError; } - function borrowVerify(address _vToken, address _borrower, uint _borrowAmount) external { + function borrowVerify(address _vToken, address _borrower, uint _borrowAmount) external override { _vToken; _borrower; _borrowAmount; @@ -294,7 +299,7 @@ contract BoolComptroller is ComptrollerInterface { address _payer, address _borrower, uint _repayAmount - ) external returns (uint) { + ) external override returns (uint) { _vToken; _payer; _borrower; @@ -308,7 +313,7 @@ contract BoolComptroller is ComptrollerInterface { address _borrower, uint _repayAmount, uint _borrowerIndex - ) external { + ) external override { _vToken; _payer; _borrower; @@ -327,7 +332,7 @@ contract BoolComptroller is ComptrollerInterface { address _liquidator, address _borrower, uint _repayAmount - ) external returns (uint) { + ) external override returns (uint) { _vTokenBorrowed; _vTokenCollateral; _borrower; @@ -345,7 +350,7 @@ contract BoolComptroller is ComptrollerInterface { address _borrower, uint _repayAmount, uint _seizeTokens - ) external { + ) external override { _vTokenBorrowed; _vTokenCollateral; _liquidator; @@ -361,7 +366,7 @@ contract BoolComptroller is ComptrollerInterface { address _borrower, address _liquidator, uint _seizeTokens - ) external returns (uint) { + ) external override returns (uint) { _vTokenCollateral; _vTokenBorrowed; _liquidator; @@ -376,7 +381,7 @@ contract BoolComptroller is ComptrollerInterface { address _liquidator, address _borrower, uint _seizeTokens - ) external { + ) external override { _vTokenCollateral; _vTokenBorrowed; _liquidator; @@ -390,7 +395,7 @@ contract BoolComptroller is ComptrollerInterface { address _src, address _dst, uint _transferTokens - ) external returns (uint) { + ) external override returns (uint) { _vToken; _src; _dst; @@ -398,7 +403,7 @@ contract BoolComptroller is ComptrollerInterface { return allowTransfer ? noError : opaqueError; } - function transferVerify(address _vToken, address _src, address _dst, uint _transferTokens) external { + function transferVerify(address _vToken, address _src, address _dst, uint _transferTokens) external override { _vToken; _src; _dst; @@ -412,7 +417,7 @@ contract BoolComptroller is ComptrollerInterface { address _vTokenBorrowed, address _vTokenCollateral, uint _repayAmount - ) external view returns (uint, uint) { + ) external view override returns (uint, uint) { _vTokenBorrowed; _vTokenCollateral; _repayAmount; @@ -424,7 +429,7 @@ contract BoolComptroller is ComptrollerInterface { function liquidateVAICalculateSeizeTokens( address _vTokenCollateral, uint _repayAmount - ) external view returns (uint, uint) { + ) external view override returns (uint, uint) { _vTokenCollateral; _repayAmount; return vaiFailCalculateSeizeTokens ? (opaqueError, 0) : (noError, vaiCalculatedSeizeTokens); @@ -523,7 +528,7 @@ contract BoolComptroller is ComptrollerInterface { // return 1e18; // } - function setMintedVAIOf(address owner, uint amount) external returns (uint) { + function setMintedVAIOf(address owner, uint amount) external override returns (uint) { owner; amount; return noError; @@ -543,27 +548,27 @@ contract BoolComptroller is ComptrollerInterface { /*** Functions from ComptrollerInterface not implemented by BoolComptroller ***/ - function markets(address) external view returns (bool, uint) { + function markets(address) external view override returns (bool, uint) { revert(); } - function oracle() external view returns (PriceOracle) { + function oracle() external view override returns (PriceOracle) { revert(); } - function getAccountLiquidity(address) external view returns (uint, uint, uint) { + function getAccountLiquidity(address) external view override returns (uint, uint, uint) { revert(); } - function getAssetsIn(address) external view returns (VToken[] memory) { + function getAssetsIn(address) external view override returns (VToken[] memory) { revert(); } - function claimVenus(address) external { + function claimVenus(address) external override { revert(); } - function venusAccrued(address) external view returns (uint) { + function venusAccrued(address) external view override returns (uint) { revert(); } @@ -571,27 +576,27 @@ contract BoolComptroller is ComptrollerInterface { revert(); } - function getAllMarkets() external view returns (VToken[] memory) { + function getAllMarkets() external view override returns (VToken[] memory) { revert(); } - function venusSupplierIndex(address, address) external view returns (uint) { + function venusSupplierIndex(address, address) external view override returns (uint) { revert(); } - function venusInitialIndex() external view returns (uint224) { + function venusInitialIndex() external view override returns (uint224) { revert(); } - function venusBorrowerIndex(address, address) external view returns (uint) { + function venusBorrowerIndex(address, address) external view override returns (uint) { revert(); } - function venusBorrowState(address) external view returns (uint224, uint32) { + function venusBorrowState(address) external view override returns (uint224, uint32) { revert(); } - function venusSupplyState(address) external view returns (uint224, uint32) { + function venusSupplyState(address) external view override returns (uint224, uint32) { revert(); } } diff --git a/contracts/test/ComptrollerScenario.sol b/contracts/test/ComptrollerScenario.sol index 8c247aa3c..237709885 100644 --- a/contracts/test/ComptrollerScenario.sol +++ b/contracts/test/ComptrollerScenario.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../Comptroller/Comptroller.sol"; @@ -13,7 +13,7 @@ contract ComptrollerScenario is Comptroller { xvsAddress = xvsAddress_; } - function getXVSAddress() public view returns (address) { + function getXVSAddress() public view override returns (address) { return xvsAddress; } @@ -39,7 +39,7 @@ contract ComptrollerScenario is Comptroller { blockNumber = number; } - function getBlockNumber() public view returns (uint) { + function getBlockNumber() public view override returns (uint) { return blockNumber; } diff --git a/contracts/test/ComptrollerScenarioG1.sol b/contracts/test/ComptrollerScenarioG1.sol index 371e3082b..6e3b60a14 100644 --- a/contracts/test/ComptrollerScenarioG1.sol +++ b/contracts/test/ComptrollerScenarioG1.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../Comptroller/ComptrollerG1.sol"; @@ -15,7 +15,7 @@ contract ComptrollerScenarioG1 is ComptrollerG1 { xvsAddress = xvsAddress_; } - function getXVSAddress() public view returns (address) { + function getXVSAddress() public view override returns (address) { return xvsAddress; } @@ -41,7 +41,7 @@ contract ComptrollerScenarioG1 is ComptrollerG1 { blockNumber = number; } - function getBlockNumber() public view returns (uint) { + function getBlockNumber() public view override returns (uint) { return blockNumber; } diff --git a/contracts/test/ComptrollerScenarioG2.sol b/contracts/test/ComptrollerScenarioG2.sol index 233c2ff21..3e84bdd60 100644 --- a/contracts/test/ComptrollerScenarioG2.sol +++ b/contracts/test/ComptrollerScenarioG2.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../Comptroller/ComptrollerG2.sol"; diff --git a/contracts/test/ComptrollerScenarioG3.sol b/contracts/test/ComptrollerScenarioG3.sol index 4dbeab94d..b86deb0cb 100644 --- a/contracts/test/ComptrollerScenarioG3.sol +++ b/contracts/test/ComptrollerScenarioG3.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../Comptroller/ComptrollerG3.sol"; diff --git a/contracts/test/ComptrollerScenarioG4.sol b/contracts/test/ComptrollerScenarioG4.sol index 8d4c9292c..3cf1eed5c 100644 --- a/contracts/test/ComptrollerScenarioG4.sol +++ b/contracts/test/ComptrollerScenarioG4.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../Comptroller/ComptrollerG4.sol"; diff --git a/contracts/test/ComptrollerScenarioG5.sol b/contracts/test/ComptrollerScenarioG5.sol index 22db0db9c..b09a299df 100644 --- a/contracts/test/ComptrollerScenarioG5.sol +++ b/contracts/test/ComptrollerScenarioG5.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../../contracts/Comptroller/ComptrollerG5.sol"; diff --git a/contracts/test/Const.sol b/contracts/test/Const.sol index 200894304..a9ef4856a 100644 --- a/contracts/test/Const.sol +++ b/contracts/test/Const.sol @@ -1,16 +1,16 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; contract ConstBase { uint public constant C = 1; - function c() public pure returns (uint) { + function c() public pure virtual returns (uint) { return 1; } - function ADD(uint a) public view returns (uint) { + function ADD(uint a) public view virtual returns (uint) { // tells compiler to accept view instead of pure if (false) { - C + now; + C + block.timestamp; } return a + C; } @@ -18,14 +18,14 @@ contract ConstBase { function add(uint a) public view returns (uint) { // tells compiler to accept view instead of pure if (false) { - C + now; + C + block.timestamp; } return a + c(); } } contract ConstSub is ConstBase { - function c() public pure returns (uint) { + function c() public pure override returns (uint) { return 2; } } diff --git a/contracts/test/Counter.sol b/contracts/test/Counter.sol index 7522bb2aa..5e15b2a9a 100644 --- a/contracts/test/Counter.sol +++ b/contracts/test/Counter.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; contract Counter { uint public count; diff --git a/contracts/test/EvilToken.sol b/contracts/test/EvilToken.sol index 6b0f4ead3..d94ed9db4 100644 --- a/contracts/test/EvilToken.sol +++ b/contracts/test/EvilToken.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "./FaucetToken.sol"; @@ -8,6 +8,7 @@ import "./FaucetToken.sol"; * @notice A simple test token that fails certain operations */ contract EvilToken is FaucetToken { + using SafeMath for uint256; bool public fail; constructor( @@ -23,7 +24,7 @@ contract EvilToken is FaucetToken { fail = _fail; } - function transfer(address dst, uint256 amount) external returns (bool) { + function transfer(address dst, uint256 amount) external override returns (bool) { if (fail) { return false; } @@ -33,7 +34,7 @@ contract EvilToken is FaucetToken { return true; } - function transferFrom(address src, address dst, uint256 amount) external returns (bool) { + function transferFrom(address src, address dst, uint256 amount) external override returns (bool) { if (fail) { return false; } diff --git a/contracts/test/EvilXDelegator.sol b/contracts/test/EvilXDelegator.sol index 4ba3bb6a5..5f04a85bf 100644 --- a/contracts/test/EvilXDelegator.sol +++ b/contracts/test/EvilXDelegator.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../Tokens/VTokens/VTokenInterfaces.sol"; @@ -34,7 +34,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface bytes memory becomeImplementationData ) public { // Creator of the contract is admin during initialization - admin = msg.sender; + admin = payable(msg.sender); // First delegate gets to initialize the delegator (i.e. storage contract) delegateTo( @@ -68,7 +68,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface address implementation_, bool allowResign, bytes memory becomeImplementationData - ) public { + ) public override { require(msg.sender == admin, "VBep20Delegator::_setImplementation: Caller must be admin"); if (allowResign) { @@ -89,7 +89,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @param mintAmount The amount of the underlying asset to supply * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) */ - function mint(uint256 mintAmount) external returns (uint256) { + function mint(uint256 mintAmount) external override returns (uint256) { bytes memory data = delegateToImplementation(abi.encodeWithSignature("mint(uint256)", mintAmount)); return abi.decode(data, (uint256)); } @@ -100,7 +100,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @param mintAmount The amount of the underlying asset to supply * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) */ - function mintBehalf(address receiver, uint256 mintAmount) external returns (uint256) { + function mintBehalf(address receiver, uint256 mintAmount) external override returns (uint256) { bytes memory data = delegateToImplementation( abi.encodeWithSignature("mintBehalf(address,uint256)", receiver, mintAmount) ); @@ -113,7 +113,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @param redeemTokens The number of vTokens to redeem into underlying * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) */ - function redeem(uint256 redeemTokens) external returns (uint256) { + function redeem(uint256 redeemTokens) external override returns (uint256) { bytes memory data = delegateToImplementation(abi.encodeWithSignature("redeem(uint256)", redeemTokens)); return abi.decode(data, (uint256)); } @@ -124,7 +124,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @param redeemAmount The amount of underlying to redeem * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) */ - function redeemUnderlying(uint256 redeemAmount) external returns (uint256) { + function redeemUnderlying(uint256 redeemAmount) external override returns (uint256) { bytes memory data = delegateToImplementation( abi.encodeWithSignature("redeemUnderlying(uint256)", redeemAmount) ); @@ -136,7 +136,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @param borrowAmount The amount of the underlying asset to borrow * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) */ - function borrow(uint256 borrowAmount) external returns (uint256) { + function borrow(uint256 borrowAmount) external override returns (uint256) { bytes memory data = delegateToImplementation(abi.encodeWithSignature("borrow(uint256)", borrowAmount)); return abi.decode(data, (uint256)); } @@ -146,7 +146,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @param repayAmount The amount to repay * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) */ - function repayBorrow(uint256 repayAmount) external returns (uint256) { + function repayBorrow(uint256 repayAmount) external override returns (uint256) { bytes memory data = delegateToImplementation(abi.encodeWithSignature("repayBorrow(uint256)", repayAmount)); return abi.decode(data, (uint256)); } @@ -157,7 +157,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @param repayAmount The amount to repay * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) */ - function repayBorrowBehalf(address borrower, uint256 repayAmount) external returns (uint256) { + function repayBorrowBehalf(address borrower, uint256 repayAmount) external override returns (uint256) { bytes memory data = delegateToImplementation( abi.encodeWithSignature("repayBorrowBehalf(address,uint256)", borrower, repayAmount) ); @@ -176,7 +176,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface address borrower, uint256 repayAmount, VTokenInterface vTokenCollateral - ) external returns (uint256) { + ) external override returns (uint256) { bytes memory data = delegateToImplementation( abi.encodeWithSignature("liquidateBorrow(address,uint256,address)", borrower, repayAmount, vTokenCollateral) ); @@ -189,7 +189,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @param amount The number of tokens to transfer * @return Whether or not the transfer succeeded */ - function transfer(address dst, uint256 amount) external returns (bool) { + function transfer(address dst, uint256 amount) external override returns (bool) { bytes memory data = delegateToImplementation(abi.encodeWithSignature("transfer(address,uint256)", dst, amount)); return abi.decode(data, (bool)); } @@ -201,7 +201,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @param amount The number of tokens to transfer * @return Whether or not the transfer succeeded */ - function transferFrom(address src, address dst, uint256 amount) external returns (bool) { + function transferFrom(address src, address dst, uint256 amount) external override returns (bool) { bytes memory data = delegateToImplementation( abi.encodeWithSignature("transferFrom(address,address,uint256)", src, dst, amount) ); @@ -216,7 +216,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @param amount The number of tokens that are approved (-1 means infinite) * @return Whether or not the approval succeeded */ - function approve(address spender, uint256 amount) external returns (bool) { + function approve(address spender, uint256 amount) external override returns (bool) { bytes memory data = delegateToImplementation( abi.encodeWithSignature("approve(address,uint256)", spender, amount) ); @@ -229,7 +229,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @param spender The address of the account which may transfer tokens * @return The number of tokens allowed to be spent (-1 means infinite) */ - function allowance(address owner, address spender) external view returns (uint256) { + function allowance(address owner, address spender) external view override returns (uint256) { bytes memory data = delegateToViewImplementation( abi.encodeWithSignature("allowance(address,address)", owner, spender) ); @@ -241,7 +241,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @param owner The address of the account to query * @return The number of tokens owned by `owner` */ - function balanceOf(address owner) external view returns (uint256) { + function balanceOf(address owner) external view override returns (uint256) { bytes memory data = delegateToViewImplementation(abi.encodeWithSignature("balanceOf(address)", owner)); return abi.decode(data, (uint256)); } @@ -252,7 +252,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @param owner The address of the account to query * @return The amount of underlying owned by `owner` */ - function balanceOfUnderlying(address owner) external returns (uint256) { + function balanceOfUnderlying(address owner) external override returns (uint256) { bytes memory data = delegateToImplementation(abi.encodeWithSignature("balanceOfUnderlying(address)", owner)); return abi.decode(data, (uint256)); } @@ -263,7 +263,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @param account Address of the account to snapshot * @return (possible error, token balance, borrow balance, exchange rate mantissa) */ - function getAccountSnapshot(address account) external view returns (uint256, uint256, uint256, uint256) { + function getAccountSnapshot(address account) external view override returns (uint256, uint256, uint256, uint256) { bytes memory data = delegateToViewImplementation( abi.encodeWithSignature("getAccountSnapshot(address)", account) ); @@ -274,7 +274,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @notice Returns the current per-block borrow interest rate for this vToken * @return The borrow interest rate per block, scaled by 1e18 */ - function borrowRatePerBlock() external view returns (uint256) { + function borrowRatePerBlock() external view override returns (uint256) { bytes memory data = delegateToViewImplementation(abi.encodeWithSignature("borrowRatePerBlock()")); return abi.decode(data, (uint256)); } @@ -283,7 +283,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @notice Returns the current per-block supply interest rate for this vToken * @return The supply interest rate per block, scaled by 1e18 */ - function supplyRatePerBlock() external view returns (uint256) { + function supplyRatePerBlock() external view override returns (uint256) { bytes memory data = delegateToViewImplementation(abi.encodeWithSignature("supplyRatePerBlock()")); return abi.decode(data, (uint256)); } @@ -292,7 +292,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @notice Returns the current total borrows plus accrued interest * @return The total borrows with interest */ - function totalBorrowsCurrent() external returns (uint256) { + function totalBorrowsCurrent() external override returns (uint256) { bytes memory data = delegateToImplementation(abi.encodeWithSignature("totalBorrowsCurrent()")); return abi.decode(data, (uint256)); } @@ -302,7 +302,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @param account The address whose balance should be calculated after updating borrowIndex * @return The calculated balance */ - function borrowBalanceCurrent(address account) external returns (uint256) { + function borrowBalanceCurrent(address account) external override returns (uint256) { bytes memory data = delegateToImplementation(abi.encodeWithSignature("borrowBalanceCurrent(address)", account)); return abi.decode(data, (uint256)); } @@ -312,7 +312,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @param account The address whose balance should be calculated * @return The calculated balance */ - function borrowBalanceStored(address account) public view returns (uint256) { + function borrowBalanceStored(address account) public view override returns (uint256) { bytes memory data = delegateToViewImplementation( abi.encodeWithSignature("borrowBalanceStored(address)", account) ); @@ -323,7 +323,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @notice Accrue interest then return the up-to-date exchange rate * @return Calculated exchange rate scaled by 1e18 */ - function exchangeRateCurrent() public returns (uint256) { + function exchangeRateCurrent() public override returns (uint256) { bytes memory data = delegateToImplementation(abi.encodeWithSignature("exchangeRateCurrent()")); return abi.decode(data, (uint256)); } @@ -333,7 +333,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @dev This function does not accrue interest before calculating the exchange rate * @return Calculated exchange rate scaled by 1e18 */ - function exchangeRateStored() public view returns (uint256) { + function exchangeRateStored() public view override returns (uint256) { bytes memory data = delegateToViewImplementation(abi.encodeWithSignature("exchangeRateStored()")); return abi.decode(data, (uint256)); } @@ -342,7 +342,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @notice Get cash balance of this vToken in the underlying asset * @return The quantity of underlying asset owned by this contract */ - function getCash() external view returns (uint256) { + function getCash() external view override returns (uint256) { bytes memory data = delegateToViewImplementation(abi.encodeWithSignature("getCash()")); return abi.decode(data, (uint256)); } @@ -352,7 +352,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @dev This calculates interest accrued from the last checkpointed block * up to the current block and writes new checkpoint to storage. */ - function accrueInterest() public returns (uint256) { + function accrueInterest() public override returns (uint256) { bytes memory data = delegateToImplementation(abi.encodeWithSignature("accrueInterest()")); return abi.decode(data, (uint256)); } @@ -366,7 +366,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @param seizeTokens The number of vTokens to seize * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) */ - function seize(address liquidator, address borrower, uint256 seizeTokens) external returns (uint256) { + function seize(address liquidator, address borrower, uint256 seizeTokens) external override returns (uint256) { bytes memory data = delegateToImplementation( abi.encodeWithSignature("seize(address,address,uint256)", liquidator, borrower, seizeTokens) ); @@ -381,7 +381,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @param newPendingAdmin New pending admin. * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) */ - function _setPendingAdmin(address payable newPendingAdmin) external returns (uint256) { + function _setPendingAdmin(address payable newPendingAdmin) external override returns (uint256) { bytes memory data = delegateToImplementation( abi.encodeWithSignature("_setPendingAdmin(address)", newPendingAdmin) ); @@ -393,7 +393,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @dev Admin function to set a new comptroller * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) */ - function _setComptroller(ComptrollerInterface newComptroller) public returns (uint256) { + function _setComptroller(ComptrollerInterface newComptroller) public override returns (uint256) { bytes memory data = delegateToImplementation( abi.encodeWithSignature("_setComptroller(address)", newComptroller) ); @@ -405,7 +405,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @dev Admin function to accrue interest and set a new reserve factor * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) */ - function _setReserveFactor(uint256 newReserveFactorMantissa) external returns (uint256) { + function _setReserveFactor(uint256 newReserveFactorMantissa) external override returns (uint256) { bytes memory data = delegateToImplementation( abi.encodeWithSignature("_setReserveFactor(uint256)", newReserveFactorMantissa) ); @@ -417,7 +417,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @dev Admin function for pending admin to accept role and update admin * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) */ - function _acceptAdmin() external returns (uint256) { + function _acceptAdmin() external override returns (uint256) { bytes memory data = delegateToImplementation(abi.encodeWithSignature("_acceptAdmin()")); return abi.decode(data, (uint256)); } @@ -427,7 +427,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @param addAmount Amount of reserves to add * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) */ - function _addReserves(uint256 addAmount) external returns (uint256) { + function _addReserves(uint256 addAmount) external override returns (uint256) { bytes memory data = delegateToImplementation(abi.encodeWithSignature("_addReserves(uint256)", addAmount)); return abi.decode(data, (uint256)); } @@ -437,7 +437,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @param reduceAmount Amount of reduction to reserves * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) */ - function _reduceReserves(uint256 reduceAmount) external returns (uint256) { + function _reduceReserves(uint256 reduceAmount) external override returns (uint256) { bytes memory data = delegateToImplementation(abi.encodeWithSignature("_reduceReserves(uint256)", reduceAmount)); return abi.decode(data, (uint256)); } @@ -448,7 +448,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @param newInterestRateModel the new interest rate model to use * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) */ - function _setInterestRateModel(InterestRateModel newInterestRateModel) public returns (uint256) { + function _setInterestRateModel(InterestRateModel newInterestRateModel) public override returns (uint256) { bytes memory data = delegateToImplementation( abi.encodeWithSignature("_setInterestRateModel(address)", newInterestRateModel) ); @@ -466,7 +466,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface (bool success, bytes memory returnData) = callee.delegatecall(data); assembly { if eq(success, 0) { - revert(add(returnData, 0x20), returndatasize) + revert(add(returnData, 0x20), returndatasize()) } } return returnData; @@ -495,7 +495,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface ); assembly { if eq(success, 0) { - revert(add(returnData, 0x20), returndatasize) + revert(add(returnData, 0x20), returndatasize()) } } return abi.decode(returnData, (bytes)); @@ -505,7 +505,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @notice Delegates execution to an implementation contract * @dev It returns to the external caller whatever the implementation returns or forwards reverts */ - function() external payable { + fallback() external payable { require(msg.value == 0, "VBep20Delegator:fallback: cannot send value to fallback"); // delegate all other functions to current implementation @@ -513,14 +513,14 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface assembly { let free_mem_ptr := mload(0x40) - returndatacopy(free_mem_ptr, 0, returndatasize) + returndatacopy(free_mem_ptr, 0, returndatasize()) switch success case 0 { - revert(free_mem_ptr, returndatasize) + revert(free_mem_ptr, returndatasize()) } default { - return(free_mem_ptr, returndatasize) + return(free_mem_ptr, returndatasize()) } } } diff --git a/contracts/test/EvilXToken.sol b/contracts/test/EvilXToken.sol index 42e94bed3..04e505205 100644 --- a/contracts/test/EvilXToken.sol +++ b/contracts/test/EvilXToken.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../Tokens/VTokens/VBep20Immutable.sol"; import "../Tokens/VTokens/VBep20Delegator.sol"; @@ -38,7 +38,7 @@ contract VBep20Scenario is VBep20Immutable { totalReserves = totalReserves_; } - function getBlockNumber() internal view returns (uint) { + function getBlockNumber() internal view override returns (uint) { ComptrollerScenario comptrollerScenario = ComptrollerScenario(address(comptroller)); return comptrollerScenario.blockNumber(); } @@ -63,14 +63,14 @@ contract EvilXToken is VBep20Delegate { comptrollerAddress = _comptrollerAddress; } - function exchangeRateStoredInternal() internal view returns (MathError, uint) { + function exchangeRateStoredInternal() internal view override returns (MathError, uint) { if (harnessExchangeRateStored) { return (MathError.NO_ERROR, harnessExchangeRate); } return super.exchangeRateStoredInternal(); } - function doTransferOut(address payable to, uint amount) internal { + function doTransferOut(address payable to, uint amount) internal override { require(failTransferToAddresses[to] == false, "TOKEN_TRANSFER_OUT_FAILED"); super.doTransferOut(to, amount); @@ -83,7 +83,7 @@ contract EvilXToken is VBep20Delegate { return; } - function getBlockNumber() internal view returns (uint) { + function getBlockNumber() internal view override returns (uint) { return blockNumber; } diff --git a/contracts/test/FalseMarker.sol b/contracts/test/FalseMarker.sol index 792ec5aa2..1dde52588 100644 --- a/contracts/test/FalseMarker.sol +++ b/contracts/test/FalseMarker.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; contract FalseMarkerMethodComptroller { bool public constant isComptroller = false; diff --git a/contracts/test/FaucetToken.sol b/contracts/test/FaucetToken.sol index 60f944b91..586fe933c 100644 --- a/contracts/test/FaucetToken.sol +++ b/contracts/test/FaucetToken.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "./BEP20.sol"; diff --git a/contracts/test/Fauceteer.sol b/contracts/test/Fauceteer.sol index 9c456e986..c4f266c44 100644 --- a/contracts/test/Fauceteer.sol +++ b/contracts/test/Fauceteer.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../Tokens/EIP20NonStandardInterface.sol"; diff --git a/contracts/test/FeeToken.sol b/contracts/test/FeeToken.sol index 7a450d258..4226ba5d7 100644 --- a/contracts/test/FeeToken.sol +++ b/contracts/test/FeeToken.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "./FaucetToken.sol"; @@ -8,6 +8,7 @@ import "./FaucetToken.sol"; * @notice A simple test token that charges fees on transfer. Used to mock USDT. */ contract FeeToken is FaucetToken { + using SafeMath for uint256; uint public basisPointFee; address public owner; @@ -23,7 +24,7 @@ contract FeeToken is FaucetToken { owner = _owner; } - function transfer(address dst, uint amount) public returns (bool) { + function transfer(address dst, uint amount) public override returns (bool) { uint fee = amount.mul(basisPointFee).div(10000); uint net = amount.sub(fee); balanceOf[owner] = balanceOf[owner].add(fee); @@ -33,7 +34,7 @@ contract FeeToken is FaucetToken { return true; } - function transferFrom(address src, address dst, uint amount) public returns (bool) { + function transferFrom(address src, address dst, uint amount) public override returns (bool) { uint fee = amount.mul(basisPointFee).div(10000); uint net = amount.sub(fee); balanceOf[owner] = balanceOf[owner].add(fee); diff --git a/contracts/test/FixedPriceOracle.sol b/contracts/test/FixedPriceOracle.sol index d1424f3af..1478b3c1d 100644 --- a/contracts/test/FixedPriceOracle.sol +++ b/contracts/test/FixedPriceOracle.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../Oracle/PriceOracle.sol"; @@ -9,7 +9,7 @@ contract FixedPriceOracle is PriceOracle { price = _price; } - function getUnderlyingPrice(VToken vToken) public view returns (uint) { + function getUnderlyingPrice(VToken vToken) public view override returns (uint) { vToken; return price; } diff --git a/contracts/test/GovernorAlphaHarness.sol b/contracts/test/GovernorAlphaHarness.sol index 967c2170b..2a83d360d 100644 --- a/contracts/test/GovernorAlphaHarness.sol +++ b/contracts/test/GovernorAlphaHarness.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; pragma experimental ABIEncoderV2; import "../Governance/GovernorAlpha.sol"; @@ -6,7 +6,7 @@ import "../Governance/GovernorAlpha.sol"; contract GovernorAlphaHarness is GovernorAlpha { constructor(address timelock_, address xvs_, address guardian_) public GovernorAlpha(timelock_, xvs_, guardian_) {} - function votingPeriod() public pure returns (uint) { + function votingPeriod() public pure override returns (uint) { return 240; } } diff --git a/contracts/test/InterestRateModelHarness.sol b/contracts/test/InterestRateModelHarness.sol index 0f5490fb9..a828d763e 100644 --- a/contracts/test/InterestRateModelHarness.sol +++ b/contracts/test/InterestRateModelHarness.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../InterestRateModels/InterestRateModel.sol"; @@ -23,7 +23,7 @@ contract InterestRateModelHarness is InterestRateModel { borrowRate = borrowRate_; } - function getBorrowRate(uint _cash, uint _borrows, uint _reserves) public view returns (uint) { + function getBorrowRate(uint _cash, uint _borrows, uint _reserves) public view override returns (uint) { _cash; // unused _borrows; // unused _reserves; // unused @@ -36,7 +36,7 @@ contract InterestRateModelHarness is InterestRateModel { uint _borrows, uint _reserves, uint _reserveFactor - ) external view returns (uint) { + ) external view override returns (uint) { _cash; // unused _borrows; // unused _reserves; // unused diff --git a/contracts/test/MathHelpers.sol b/contracts/test/MathHelpers.sol index 3c4125cc5..0d14af8ac 100644 --- a/contracts/test/MathHelpers.sol +++ b/contracts/test/MathHelpers.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; contract MathHelpers { /* diff --git a/contracts/test/MockDeflationaryToken.sol b/contracts/test/MockDeflationaryToken.sol index 47d0274b8..873c291dd 100644 --- a/contracts/test/MockDeflationaryToken.sol +++ b/contracts/test/MockDeflationaryToken.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../Utils/SafeMath.sol"; @@ -74,7 +74,7 @@ contract DeflatingERC20 { } function transferFrom(address from, address to, uint value) external returns (bool) { - if (allowance[from][msg.sender] != uint(-1)) { + if (allowance[from][msg.sender] != type(uint).max) { allowance[from][msg.sender] = allowance[from][msg.sender].sub(value); } _transfer(from, to, value); diff --git a/contracts/test/MockMCD.sol b/contracts/test/MockMCD.sol index 1d3a5e994..aa5baeade 100644 --- a/contracts/test/MockMCD.sol +++ b/contracts/test/MockMCD.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; contract MockPot { uint public dsr; // the Dai Savings Rate diff --git a/contracts/test/RefreshSpeedsProxy.sol b/contracts/test/RefreshSpeedsProxy.sol index d46932a83..5478740a6 100644 --- a/contracts/test/RefreshSpeedsProxy.sol +++ b/contracts/test/RefreshSpeedsProxy.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; interface IComptroller { function refreshVenusSpeeds() external; diff --git a/contracts/test/SimplePriceOracle.sol b/contracts/test/SimplePriceOracle.sol index df9b5e437..f3c6f59e9 100644 --- a/contracts/test/SimplePriceOracle.sol +++ b/contracts/test/SimplePriceOracle.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../Oracle/PriceOracle.sol"; import "../Tokens/VTokens/VBep20.sol"; @@ -7,7 +7,7 @@ contract SimplePriceOracle is PriceOracle { mapping(address => uint) internal prices; event PricePosted(address asset, uint previousPriceMantissa, uint requestedPriceMantissa, uint newPriceMantissa); - function getUnderlyingPrice(VToken vToken) public view returns (uint) { + function getUnderlyingPrice(VToken vToken) public view override returns (uint) { if (compareStrings(vToken.symbol(), "vBNB")) { return 1e18; } else if (compareStrings(vToken.symbol(), "VAI")) { diff --git a/contracts/test/Structs.sol b/contracts/test/Structs.sol index 57267f870..5a8610939 100644 --- a/contracts/test/Structs.sol +++ b/contracts/test/Structs.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; contract Structs { struct Outer { diff --git a/contracts/test/TetherInterface.sol b/contracts/test/TetherInterface.sol index 311e60e9b..dce789a82 100644 --- a/contracts/test/TetherInterface.sol +++ b/contracts/test/TetherInterface.sol @@ -1,7 +1,7 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../Tokens/EIP20Interface.sol"; -contract TetherInterface is EIP20Interface { - function setParams(uint newBasisPoints, uint newMaxFee) external; +abstract contract TetherInterface is EIP20Interface { + function setParams(uint newBasisPoints, uint newMaxFee) external virtual; } diff --git a/contracts/test/TimelockHarness.sol b/contracts/test/TimelockHarness.sol index a9c491a54..10c03e6c6 100644 --- a/contracts/test/TimelockHarness.sol +++ b/contracts/test/TimelockHarness.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../Governance/Timelock.sol"; diff --git a/contracts/test/VAIControllerHarness.sol b/contracts/test/VAIControllerHarness.sol index 2332c013c..5c644ebd2 100644 --- a/contracts/test/VAIControllerHarness.sol +++ b/contracts/test/VAIControllerHarness.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../Tokens/VAI/VAIController.sol"; @@ -20,7 +20,7 @@ contract VAIControllerHarness is VAIController { vaiAddress = vaiAddress_; } - function getVAIAddress() public view returns (address) { + function getVAIAddress() public view override returns (address) { return vaiAddress; } @@ -56,11 +56,11 @@ contract VAIControllerHarness is VAIController { blocksPerYear = number; } - function getBlockNumber() public view returns (uint) { + function getBlockNumber() public view override returns (uint) { return blockNumber; } - function getBlocksPerYear() public view returns (uint) { + function getBlocksPerYear() public view override returns (uint) { return blocksPerYear; } } diff --git a/contracts/test/VAIControllerScenario.sol b/contracts/test/VAIControllerScenario.sol index 8b5a6d9f4..7d7e2bceb 100644 --- a/contracts/test/VAIControllerScenario.sol +++ b/contracts/test/VAIControllerScenario.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../Tokens/VAI/VAIController.sol"; import "./ComptrollerScenario.sol"; @@ -14,7 +14,7 @@ contract VAIControllerScenario is VAIController { vaiAddress = vaiAddress_; } - function getVAIAddress() public view returns (address) { + function getVAIAddress() public view override returns (address) { return vaiAddress; } @@ -22,7 +22,7 @@ contract VAIControllerScenario is VAIController { blockNumber = number; } - function getBlockNumber() public view returns (uint) { + function getBlockNumber() public view override returns (uint) { return blockNumber; } } diff --git a/contracts/test/VAIHarness.sol b/contracts/test/VAIHarness.sol index 9d6d27e5e..003c7a573 100644 --- a/contracts/test/VAIHarness.sol +++ b/contracts/test/VAIHarness.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../Tokens/VAI/VAI.sol"; diff --git a/contracts/test/VBNBHarness.sol.archive b/contracts/test/VBNBHarness.sol.archive index ffba1a3c1..259ae85d6 100644 --- a/contracts/test/VBNBHarness.sol.archive +++ b/contracts/test/VBNBHarness.sol.archive @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../Tokens/VTokens/VBNB.sol"; import "./ComptrollerScenario.sol"; @@ -19,19 +19,19 @@ contract VBNBHarness is VBNB { address payable admin_ ) public VBNB(comptroller_, interestRateModel_, initialExchangeRateMantissa, name_, symbol_, decimals_, admin_) {} - function doTransferOut(address payable to, uint amount) internal { + function doTransferOut(address payable to, uint amount) internal override { require(failTransferToAddresses[to] == false, "TOKEN_TRANSFER_OUT_FAILED"); return super.doTransferOut(to, amount); } - function exchangeRateStoredInternal() internal view returns (MathError, uint) { + function exchangeRateStoredInternal() internal view override returns (MathError, uint) { if (harnessExchangeRate != 0) { return (MathError.NO_ERROR, harnessExchangeRate); } return super.exchangeRateStoredInternal(); } - function getBlockNumber() internal view returns (uint) { + function getBlockNumber() internal view override returns (uint) { return blockNumber; } @@ -188,7 +188,7 @@ contract VBNBScenario is VBNB { // no-op } - function getBlockNumber() internal view returns (uint) { + function getBlockNumber() internal view override returns (uint) { ComptrollerScenario comptrollerScenario = ComptrollerScenario(address(comptroller)); return comptrollerScenario.blockNumber(); } diff --git a/contracts/test/VBep20Harness.sol b/contracts/test/VBep20Harness.sol index 6c13d7234..916d24c96 100644 --- a/contracts/test/VBep20Harness.sol +++ b/contracts/test/VBep20Harness.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../Tokens/VTokens/VBep20Immutable.sol"; import "../Tokens/VTokens/VBep20Delegator.sol"; @@ -35,19 +35,19 @@ contract VBep20Harness is VBep20Immutable { ) {} - function doTransferOut(address payable to, uint amount) internal { + function doTransferOut(address payable to, uint amount) internal override { require(failTransferToAddresses[to] == false, "TOKEN_TRANSFER_OUT_FAILED"); return super.doTransferOut(to, amount); } - function exchangeRateStoredInternal() internal view returns (MathError, uint) { + function exchangeRateStoredInternal() internal view override returns (MathError, uint) { if (harnessExchangeRateStored) { return (MathError.NO_ERROR, harnessExchangeRate); } return super.exchangeRateStoredInternal(); } - function getBlockNumber() internal view returns (uint) { + function getBlockNumber() internal view override returns (uint) { return blockNumber; } @@ -201,7 +201,7 @@ contract VBep20Scenario is VBep20Immutable { totalReserves = totalReserves_; } - function getBlockNumber() internal view returns (uint) { + function getBlockNumber() internal view override returns (uint) { ComptrollerScenario comptrollerScenario = ComptrollerScenario(address(comptroller)); return comptrollerScenario.blockNumber(); } @@ -283,19 +283,19 @@ contract VBep20DelegateHarness is VBep20Delegate { mapping(address => bool) public failTransferToAddresses; - function exchangeRateStoredInternal() internal view returns (MathError, uint) { + function exchangeRateStoredInternal() internal view override returns (MathError, uint) { if (harnessExchangeRateStored) { return (MathError.NO_ERROR, harnessExchangeRate); } return super.exchangeRateStoredInternal(); } - function doTransferOut(address payable to, uint amount) internal { + function doTransferOut(address payable to, uint amount) internal override { require(failTransferToAddresses[to] == false, "TOKEN_TRANSFER_OUT_FAILED"); return super.doTransferOut(to, amount); } - function getBlockNumber() internal view returns (uint) { + function getBlockNumber() internal view override returns (uint) { return blockNumber; } @@ -432,7 +432,7 @@ contract VBep20DelegateScenario is VBep20Delegate { totalReserves = totalReserves_; } - function getBlockNumber() internal view returns (uint) { + function getBlockNumber() internal view override returns (uint) { ComptrollerScenario comptrollerScenario = ComptrollerScenario(address(comptroller)); return comptrollerScenario.blockNumber(); } diff --git a/contracts/test/VBep20MockDelegate.sol b/contracts/test/VBep20MockDelegate.sol index fe9520f4a..ebe5fe160 100644 --- a/contracts/test/VBep20MockDelegate.sol +++ b/contracts/test/VBep20MockDelegate.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../Tokens/VTokens/VToken.sol"; @@ -78,7 +78,7 @@ contract VBep20MockDelegate is VToken, VBep20Interface { * @param mintAmount The amount of the underlying asset to supply * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) */ - function mint(uint mintAmount) external returns (uint) { + function mint(uint mintAmount) external override returns (uint) { (uint err, ) = mintInternal(mintAmount); return err; } @@ -90,7 +90,7 @@ contract VBep20MockDelegate is VToken, VBep20Interface { * @param mintAmount The amount of the underlying asset to supply * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) */ - function mintBehalf(address receiver, uint mintAmount) external returns (uint) { + function mintBehalf(address receiver, uint mintAmount) external override returns (uint) { (uint err, ) = mintBehalfInternal(receiver, mintAmount); return err; } @@ -101,7 +101,7 @@ contract VBep20MockDelegate is VToken, VBep20Interface { * @param redeemTokens The number of vTokens to redeem into underlying * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) */ - function redeem(uint redeemTokens) external returns (uint) { + function redeem(uint redeemTokens) external override returns (uint) { return redeemInternal(redeemTokens); } @@ -111,7 +111,7 @@ contract VBep20MockDelegate is VToken, VBep20Interface { * @param redeemAmount The amount of underlying to redeem * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) */ - function redeemUnderlying(uint redeemAmount) external returns (uint) { + function redeemUnderlying(uint redeemAmount) external override returns (uint) { return redeemUnderlyingInternal(redeemAmount); } @@ -120,8 +120,8 @@ contract VBep20MockDelegate is VToken, VBep20Interface { * @param borrowAmount The amount of the underlying asset to borrow * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) */ - function borrow(uint borrowAmount) external returns (uint) { - return borrowInternal(msg.sender, msg.sender, borrowAmount); + function borrow(uint borrowAmount) external override returns (uint) { + return borrowInternal(borrowAmount); } /** @@ -129,7 +129,7 @@ contract VBep20MockDelegate is VToken, VBep20Interface { * @param repayAmount The amount to repay * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) */ - function repayBorrow(uint repayAmount) external returns (uint) { + function repayBorrow(uint repayAmount) external override returns (uint) { (uint err, ) = repayBorrowInternal(repayAmount); return err; } @@ -140,7 +140,7 @@ contract VBep20MockDelegate is VToken, VBep20Interface { * @param repayAmount The amount to repay * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) */ - function repayBorrowBehalf(address borrower, uint repayAmount) external returns (uint) { + function repayBorrowBehalf(address borrower, uint repayAmount) external override returns (uint) { (uint err, ) = repayBorrowBehalfInternal(borrower, repayAmount); return err; } @@ -157,7 +157,7 @@ contract VBep20MockDelegate is VToken, VBep20Interface { address borrower, uint repayAmount, VTokenInterface vTokenCollateral - ) external returns (uint) { + ) external override returns (uint) { (uint err, ) = liquidateBorrowInternal(borrower, repayAmount, vTokenCollateral); return err; } @@ -167,7 +167,7 @@ contract VBep20MockDelegate is VToken, VBep20Interface { * @param addAmount The amount fo underlying token to add as reserves * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) */ - function _addReserves(uint addAmount) external returns (uint) { + function _addReserves(uint addAmount) external override returns (uint) { return _addReservesInternal(addAmount); } @@ -178,7 +178,7 @@ contract VBep20MockDelegate is VToken, VBep20Interface { * @dev This excludes the value of the current message, if any * @return The quantity of underlying tokens owned by this contract */ - function getCashPrior() internal view returns (uint) { + function getCashPrior() internal view override returns (uint) { EIP20Interface token = EIP20Interface(underlying); return token.balanceOf(address(this)); } @@ -192,7 +192,7 @@ contract VBep20MockDelegate is VToken, VBep20Interface { * Note: This wrapper safely handles non-standard BEP-20 tokens that do not return a value. * See here: https://medium.com/coinmonks/missing-return-value-bug-at-least-130-tokens-affected-d67bf08521ca */ - function doTransferIn(address from, uint amount) internal returns (uint) { + function doTransferIn(address from, uint amount) internal override returns (uint) { EIP20NonStandardInterface token = EIP20NonStandardInterface(underlying); uint balanceBefore = EIP20Interface(underlying).balanceOf(address(this)); token.transferFrom(from, address(this), amount); @@ -231,7 +231,7 @@ contract VBep20MockDelegate is VToken, VBep20Interface { * Note: This wrapper safely handles non-standard BEP-20 tokens that do not return a value. * See here: https://medium.com/coinmonks/missing-return-value-bug-at-least-130-tokens-affected-d67bf08521ca */ - function doTransferOut(address payable to, uint amount) internal { + function doTransferOut(address payable to, uint amount) internal override { EIP20NonStandardInterface token = EIP20NonStandardInterface(underlying); token.transfer(to, amount); diff --git a/contracts/test/VRTConverterHarness.sol b/contracts/test/VRTConverterHarness.sol index df974f8a9..c2d4c7b28 100644 --- a/contracts/test/VRTConverterHarness.sol +++ b/contracts/test/VRTConverterHarness.sol @@ -1,8 +1,10 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../../contracts/Tokens/VRT/VRTConverter.sol"; contract VRTConverterHarness is VRTConverter { + using SafeMath for uint256; + constructor() public VRTConverter() { admin = msg.sender; } diff --git a/contracts/test/VRTVaultHarness.sol b/contracts/test/VRTVaultHarness.sol index f2a2f9e5d..4fed5e2e1 100644 --- a/contracts/test/VRTVaultHarness.sol +++ b/contracts/test/VRTVaultHarness.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../../contracts/VRTVault/VRTVault.sol"; @@ -25,7 +25,7 @@ contract VRTVaultHarness is VRTVault { blockNumber = number; } - function getBlockNumber() public view returns (uint256) { + function getBlockNumber() public view override returns (uint256) { return blockNumber; } } diff --git a/contracts/test/WBNB.sol b/contracts/test/WBNB.sol index b8c5aad92..411e442e7 100644 --- a/contracts/test/WBNB.sol +++ b/contracts/test/WBNB.sol @@ -6,7 +6,7 @@ *Submitted for verification at Bscscan.com on 2020-09-03 */ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; contract WBNB { string public name = "Wrapped BNB"; @@ -21,7 +21,7 @@ contract WBNB { mapping(address => uint) public balanceOf; mapping(address => mapping(address => uint)) public allowance; - function() external payable { + receive() external payable { deposit(); } @@ -33,7 +33,7 @@ contract WBNB { function withdraw(uint wad) public { require(balanceOf[msg.sender] >= wad); balanceOf[msg.sender] -= wad; - msg.sender.transfer(wad); + payable(msg.sender).transfer(wad); emit Withdrawal(msg.sender, wad); } @@ -50,7 +50,7 @@ contract WBNB { function transferFrom(address src, address dst, uint wad) public returns (bool) { require(balanceOf[src] >= wad); - if (src != msg.sender && allowance[src][msg.sender] != uint(-1)) { + if (src != msg.sender && allowance[src][msg.sender] != type(uint).max) { require(allowance[src][msg.sender] >= wad); allowance[src][msg.sender] -= wad; } diff --git a/contracts/test/WBTC.sol b/contracts/test/WBTC.sol index c8234c15d..5eb334060 100644 --- a/contracts/test/WBTC.sol +++ b/contracts/test/WBTC.sol @@ -2,7 +2,7 @@ *Submitted for verification at BscScan.io on 2018-11-24 */ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; // File: openzeppelin-solidity/contracts/token/BEP20/BEP20Basic.sol @@ -11,12 +11,12 @@ pragma solidity ^0.5.16; * @dev Simpler version of BEP20 interface * See https://github.com/ethereum/EIPs/issues/179 */ -contract BEP20Basic { - function totalSupply() public view returns (uint256); +abstract contract BEP20Basic { + function totalSupply() public view virtual returns (uint256); - function balanceOf(address _who) public view returns (uint256); + function balanceOf(address _who) public view virtual returns (uint256); - function transfer(address _to, uint256 _value) public returns (bool); + function transfer(address _to, uint256 _value) public virtual returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); } @@ -88,7 +88,7 @@ contract BasivToken is BEP20Basic { /** * @dev Total number of tokens in existence */ - function totalSupply() public view returns (uint256) { + function totalSupply() public view override returns (uint256) { return totalSupply_; } @@ -97,7 +97,7 @@ contract BasivToken is BEP20Basic { * @param _to The address to transfer to. * @param _value The amount to be transferred. */ - function transfer(address _to, uint256 _value) public returns (bool) { + function transfer(address _to, uint256 _value) public virtual override returns (bool) { require(_value <= balances[msg.sender], ""); require(_to != address(0), ""); @@ -112,7 +112,7 @@ contract BasivToken is BEP20Basic { * @param _owner The address to query the the balance of. * @return An uint256 representing the amount owned by the passed address. */ - function balanceOf(address _owner) public view returns (uint256) { + function balanceOf(address _owner) public view override returns (uint256) { return balances[_owner]; } } @@ -123,12 +123,12 @@ contract BasivToken is BEP20Basic { * @title BEP20 interface * @dev see https://github.com/ethereum/EIPs/issues/20 */ -contract BEP20 is BEP20Basic { - function allowance(address _owner, address _spender) public view returns (uint256); +abstract contract BEP20 is BEP20Basic { + function allowance(address _owner, address _spender) public view virtual returns (uint256); - function transferFrom(address _from, address _to, uint256 _value) public returns (bool); + function transferFrom(address _from, address _to, uint256 _value) public virtual returns (bool); - function approve(address _spender, uint256 _value) public returns (bool); + function approve(address _spender, uint256 _value) public virtual returns (bool); event Approval(address indexed owner, address indexed spender, uint256 value); } @@ -143,6 +143,7 @@ contract BEP20 is BEP20Basic { * Based on code by FirstBlood: https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol */ contract StandardToken is BEP20, BasivToken { + using SafeMath for uint256; mapping(address => mapping(address => uint256)) internal allowed; /** @@ -151,7 +152,7 @@ contract StandardToken is BEP20, BasivToken { * @param _to address The address which you want to transfer to * @param _value uint256 the amount of tokens to be transferred */ - function transferFrom(address _from, address _to, uint256 _value) public returns (bool) { + function transferFrom(address _from, address _to, uint256 _value) public virtual override returns (bool) { require(_value <= balances[_from], ""); require(_value <= allowed[_from][msg.sender], ""); require(_to != address(0), ""); @@ -172,7 +173,7 @@ contract StandardToken is BEP20, BasivToken { * @param _spender The address which will spend the funds. * @param _value The amount of tokens to be spent. */ - function approve(address _spender, uint256 _value) public returns (bool) { + function approve(address _spender, uint256 _value) public virtual override returns (bool) { allowed[msg.sender][_spender] = _value; emit Approval(msg.sender, _spender, _value); return true; @@ -184,7 +185,7 @@ contract StandardToken is BEP20, BasivToken { * @param _spender address The address which will spend the funds. * @return A uint256 specifying the amount of tokens still available for the spender. */ - function allowance(address _owner, address _spender) public view returns (uint256) { + function allowance(address _owner, address _spender) public view override returns (uint256) { return allowed[_owner][_spender]; } @@ -197,7 +198,7 @@ contract StandardToken is BEP20, BasivToken { * @param _spender The address which will spend the funds. * @param _addedValue The amount of tokens to increase the allowance by. */ - function increaseApproval(address _spender, uint256 _addedValue) public returns (bool) { + function increaseApproval(address _spender, uint256 _addedValue) public virtual returns (bool) { allowed[msg.sender][_spender] = (allowed[msg.sender][_spender].add(_addedValue)); emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]); return true; @@ -212,7 +213,7 @@ contract StandardToken is BEP20, BasivToken { * @param _spender The address which will spend the funds. * @param _subtractedValue The amount of tokens to decrease the allowance by. */ - function decreaseApproval(address _spender, uint256 _subtractedValue) public returns (bool) { + function decreaseApproval(address _spender, uint256 _subtractedValue) public virtual returns (bool) { uint256 oldValue = allowed[msg.sender][_spender]; if (_subtractedValue >= oldValue) { allowed[msg.sender][_spender] = 0; @@ -232,17 +233,17 @@ contract StandardToken is BEP20, BasivToken { * All the operations are done using the smallest and indivisible token unit, * just as on BSC all the operations are done in wei. */ -contract DetailedBEP20 is BEP20 { - string public name; - string public symbol; - uint8 public decimals; - - constructor(string memory _name, string memory _symbol, uint8 _decimals) public { - name = _name; - symbol = _symbol; - decimals = _decimals; - } -} +// abstract contract DetailedBEP20 is BEP20 { +// string public name; +// string public symbol; +// uint8 public decimals; + +// constructor(string memory _name, string memory _symbol, uint8 _decimals) public { +// name = _name; +// symbol = _symbol; +// decimals = _decimals; +// } +// } // File: openzeppelin-solidity/contracts/ownership/Ownable.sol @@ -279,7 +280,7 @@ contract Ownable { * It will not be possible to call the functions with the `onlyOwner` * modifier anymore. */ - function renounceOwnership() public onlyOwner { + function renounceOwnership() public virtual onlyOwner { emit OwnershipRenounced(owner); owner = address(0); } @@ -288,7 +289,7 @@ contract Ownable { * @dev Allows the current owner to transfer control of the contract to a newOwner. * @param _newOwner The address to transfer ownership to. */ - function transferOwnership(address _newOwner) public onlyOwner { + function transferOwnership(address _newOwner) public virtual onlyOwner { _transferOwnership(_newOwner); } @@ -311,6 +312,8 @@ contract Ownable { * Based on code by TokenMarketNet: https://github.com/TokenMarketNet/ico/blob/master/contracts/MintableToken.sol */ contract MintableToken is StandardToken, Ownable { + using SafeMath for uint256; + event Mint(address indexed to, uint256 amount); event MintFinished(); @@ -344,7 +347,7 @@ contract MintableToken is StandardToken, Ownable { * @dev Function to stop minting new tokens. * @return True if the operation was successful. */ - function finishMinting() public onlyOwner canMint returns (bool) { + function finishMinting() public virtual onlyOwner canMint returns (bool) { mintingFinished = true; emit MintFinished(); return true; @@ -358,13 +361,15 @@ contract MintableToken is StandardToken, Ownable { * @dev Token that can be irreversibly burned (destroyed). */ contract BurnableToken is BasivToken { + using SafeMath for uint256; + event Burn(address indexed burner, uint256 value); /** * @dev Burns a specific amount of tokens. * @param _value The amount of token to be burned. */ - function burn(uint256 _value) public { + function burn(uint256 _value) public virtual { _burn(msg.sender, _value); } @@ -432,23 +437,29 @@ contract Pausable is Ownable { * @dev StandardToken modified with pausable transfers. **/ contract PausableToken is StandardToken, Pausable { - function transfer(address _to, uint256 _value) public whenNotPaused returns (bool) { + function transfer( + address _to, + uint256 _value + ) public override(BEP20Basic, BasivToken) whenNotPaused returns (bool) { return super.transfer(_to, _value); } - function transferFrom(address _from, address _to, uint256 _value) public whenNotPaused returns (bool) { + function transferFrom(address _from, address _to, uint256 _value) public override whenNotPaused returns (bool) { return super.transferFrom(_from, _to, _value); } - function approve(address _spender, uint256 _value) public whenNotPaused returns (bool) { + function approve(address _spender, uint256 _value) public override whenNotPaused returns (bool) { return super.approve(_spender, _value); } - function increaseApproval(address _spender, uint _addedValue) public whenNotPaused returns (bool success) { + function increaseApproval(address _spender, uint _addedValue) public override whenNotPaused returns (bool success) { return super.increaseApproval(_spender, _addedValue); } - function decreaseApproval(address _spender, uint _subtractedValue) public whenNotPaused returns (bool success) { + function decreaseApproval( + address _spender, + uint _subtractedValue + ) public override whenNotPaused returns (bool success) { return super.decreaseApproval(_spender, _subtractedValue); } } @@ -475,7 +486,7 @@ contract Claimable is Ownable { * @dev Allows the current owner to set the pendingOwner address. * @param newOwner The address to transfer ownership to. */ - function transferOwnership(address newOwner) public onlyOwner { + function transferOwnership(address newOwner) public override onlyOwner { pendingOwner = newOwner; } @@ -535,38 +546,38 @@ contract CanReclaimToken is Ownable { // File: contracts/utils/OwnableContract.sol // empty block is used as this contract just inherits others. -contract OwnableContract is CanReclaimToken, Claimable { - -} /* solhint-disable-line no-empty-blocks */ - -// File: contracts/token/WBTC.sol - -contract WBTVToken is - StandardToken, - DetailedBEP20("Wrapped BTC", "WBTC", 8), - MintableToken, - BurnableToken, - PausableToken, - OwnableContract -{ - function burn(uint value) public onlyOwner { - super.burn(value); - } - - function finishMinting() public onlyOwner returns (bool) { - return false; - } - - function renounceOwnership() public onlyOwner { - revert("renouncing ownership is blocked"); - } - - /** - * @dev Arbitrarily adds tokens to any account - */ - function allocateTo(address _owner, uint256 value) public { - balances[_owner] += value; - totalSupply_ += value; - emit Transfer(address(this), _owner, value); - } -} +// contract OwnableContract is CanReclaimToken, Claimable { + +// } /* solhint-disable-line no-empty-blocks */ + +// // File: contracts/token/WBTC.sol + +// contract WBTVToken is +// StandardToken, +// DetailedBEP20("Wrapped BTC", "WBTC", 8), +// MintableToken, +// BurnableToken, +// PausableToken, +// OwnableContract +// { +// function burn(uint value) public override onlyOwner { +// super.burn(value); +// } + +// function finishMinting() public onlyOwner override returns (bool) { +// return false; +// } + +// function renounceOwnership() public override onlyOwner { +// revert("renouncing ownership is blocked"); +// } + +// /** +// * @dev Arbitrarily adds tokens to any account +// */ +// function allocateTo(address _owner, uint256 value) public { +// balances[_owner] += value; +// totalSupply_ += value; +// emit Transfer(address(this), _owner, value); +// } +// } diff --git a/contracts/test/XVSHarness.sol b/contracts/test/XVSHarness.sol index d61df4df5..b36c1c9b5 100644 --- a/contracts/test/XVSHarness.sol +++ b/contracts/test/XVSHarness.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../Tokens/XVS/XVS.sol"; diff --git a/contracts/test/XVSVaultHarness.sol b/contracts/test/XVSVaultHarness.sol index 579cae0c8..ec5a4b5d1 100644 --- a/contracts/test/XVSVaultHarness.sol +++ b/contracts/test/XVSVaultHarness.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; contract XVSVaultHarness { constructor() public {} diff --git a/contracts/test/XVSVaultScenario.sol b/contracts/test/XVSVaultScenario.sol index 0e93dc68b..86a492ceb 100644 --- a/contracts/test/XVSVaultScenario.sol +++ b/contracts/test/XVSVaultScenario.sol @@ -1,9 +1,11 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; pragma experimental ABIEncoderV2; import "../XVSVault/XVSVault.sol"; contract XVSVaultScenario is XVSVault { + using SafeMath for uint256; + function pushOldWithdrawalRequest( UserInfo storage _user, WithdrawalRequest[] storage _requests, diff --git a/contracts/test/XVSVestingHarness.sol b/contracts/test/XVSVestingHarness.sol index 15f539278..9351d8f9f 100644 --- a/contracts/test/XVSVestingHarness.sol +++ b/contracts/test/XVSVestingHarness.sol @@ -1,8 +1,10 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../../contracts/Tokens/XVS/XVSVesting.sol"; contract XVSVestingHarness is XVSVesting { + using SafeMath for uint256; + using SafeBEP20 for IBEP20; address public constant ZERO_ADDRESS = 0x0000000000000000000000000000000000000000; constructor() public XVSVesting() { From fdc8ff4ed19420d9808c46623715dc01847dc8d3 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Fri, 10 Mar 2023 18:57:42 +0530 Subject: [PATCH 018/153] Upgraded solidity version from 0.5.16 to 0.8.13. --- contracts/Governance/GovernorAlpha2.sol | 2 +- contracts/Governance/Timelock.sol | 6 +++--- contracts/Governance/VTreasury.sol | 4 ++-- contracts/InterestRateModels/InterestRateModel.sol | 8 ++++---- contracts/InterestRateModels/JumpRateModel.sol | 6 +++--- .../WhitePaperInterestRateModel.sol | 6 +++--- contracts/Lens/ComptrollerLens.sol | 2 +- contracts/Oracle/PriceOracle.sol | 6 +++--- contracts/Utils/Context.sol | 6 +++--- contracts/VRTVault/VRTVaultProxy.sol | 12 ++++++------ contracts/XVSVault/XVSVaultProxy.sol | 10 +++++----- 11 files changed, 34 insertions(+), 34 deletions(-) diff --git a/contracts/Governance/GovernorAlpha2.sol b/contracts/Governance/GovernorAlpha2.sol index c009718df..2bd49f127 100644 --- a/contracts/Governance/GovernorAlpha2.sol +++ b/contracts/Governance/GovernorAlpha2.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; pragma experimental ABIEncoderV2; contract GovernorAlpha2 { diff --git a/contracts/Governance/Timelock.sol b/contracts/Governance/Timelock.sol index b20cb4ebf..e35a81960 100644 --- a/contracts/Governance/Timelock.sol +++ b/contracts/Governance/Timelock.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../Utils/SafeMath.sol"; @@ -51,7 +51,7 @@ contract Timelock { delay = delay_; } - function() external payable {} + receive() external payable {} function setDelay(uint delay_) public { require(msg.sender == address(this), "Timelock::setDelay: Call must come from Timelock."); @@ -137,7 +137,7 @@ contract Timelock { } // solium-disable-next-line security/no-call-value - (bool success, bytes memory returnData) = target.call.value(value)(callData); + (bool success, bytes memory returnData) = target.call{ value: value }(callData); require(success, "Timelock::executeTransaction: Transaction execution reverted."); emit ExecuteTransaction(txHash, target, value, signature, data, eta); diff --git a/contracts/Governance/VTreasury.sol b/contracts/Governance/VTreasury.sol index 22bd3fc80..bc290538d 100644 --- a/contracts/Governance/VTreasury.sol +++ b/contracts/Governance/VTreasury.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../Utils/IBEP20.sol"; import "../Utils/SafeBEP20.sol"; @@ -20,7 +20,7 @@ contract VTreasury is Ownable { /** * @notice To receive BNB */ - function() external payable {} + receive() external payable {} /** * @notice Withdraw Treasury BEP20 Tokens, Only owner call it diff --git a/contracts/InterestRateModels/InterestRateModel.sol b/contracts/InterestRateModels/InterestRateModel.sol index 654f4040a..3cd21808a 100644 --- a/contracts/InterestRateModels/InterestRateModel.sol +++ b/contracts/InterestRateModels/InterestRateModel.sol @@ -1,10 +1,10 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; /** * @title Venus's InterestRateModel Interface * @author Venus */ -contract InterestRateModel { +abstract contract InterestRateModel { /// @notice Indicator that this is an InterestRateModel contract (for inspection) bool public constant isInterestRateModel = true; @@ -15,7 +15,7 @@ contract InterestRateModel { * @param reserves The total amnount of reserves the market has * @return The borrow rate per block (as a percentage, and scaled by 1e18) */ - function getBorrowRate(uint cash, uint borrows, uint reserves) external view returns (uint); + function getBorrowRate(uint cash, uint borrows, uint reserves) external view virtual returns (uint); /** * @notice Calculates the current supply interest rate per block @@ -30,5 +30,5 @@ contract InterestRateModel { uint borrows, uint reserves, uint reserveFactorMantissa - ) external view returns (uint); + ) external view virtual returns (uint); } diff --git a/contracts/InterestRateModels/JumpRateModel.sol b/contracts/InterestRateModels/JumpRateModel.sol index a1254aced..48f49e219 100644 --- a/contracts/InterestRateModels/JumpRateModel.sol +++ b/contracts/InterestRateModels/JumpRateModel.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../Utils/SafeMath.sol"; import "./InterestRateModel.sol"; @@ -76,7 +76,7 @@ contract JumpRateModel is InterestRateModel { * @param reserves The amount of reserves in the market * @return The borrow rate percentage per block as a mantissa (scaled by 1e18) */ - function getBorrowRate(uint cash, uint borrows, uint reserves) public view returns (uint) { + function getBorrowRate(uint cash, uint borrows, uint reserves) public view override returns (uint) { uint util = utilizationRate(cash, borrows, reserves); if (util <= kink) { @@ -101,7 +101,7 @@ contract JumpRateModel is InterestRateModel { uint borrows, uint reserves, uint reserveFactorMantissa - ) public view returns (uint) { + ) public view override returns (uint) { uint oneMinusReserveFactor = uint(1e18).sub(reserveFactorMantissa); uint borrowRate = getBorrowRate(cash, borrows, reserves); uint rateToPool = borrowRate.mul(oneMinusReserveFactor).div(1e18); diff --git a/contracts/InterestRateModels/WhitePaperInterestRateModel.sol b/contracts/InterestRateModels/WhitePaperInterestRateModel.sol index 962f4d73d..e30fcdd53 100644 --- a/contracts/InterestRateModels/WhitePaperInterestRateModel.sol +++ b/contracts/InterestRateModels/WhitePaperInterestRateModel.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "../Utils/SafeMath.sol"; import "./InterestRateModel.sol"; @@ -63,7 +63,7 @@ contract WhitePaperInterestRateModel is InterestRateModel { * @param reserves The amount of reserves in the market * @return The borrow rate percentage per block as a mantissa (scaled by 1e18) */ - function getBorrowRate(uint cash, uint borrows, uint reserves) public view returns (uint) { + function getBorrowRate(uint cash, uint borrows, uint reserves) public view override returns (uint) { uint ur = utilizationRate(cash, borrows, reserves); return ur.mul(multiplierPerBlock).div(1e18).add(baseRatePerBlock); } @@ -81,7 +81,7 @@ contract WhitePaperInterestRateModel is InterestRateModel { uint borrows, uint reserves, uint reserveFactorMantissa - ) public view returns (uint) { + ) public view override returns (uint) { uint oneMinusReserveFactor = uint(1e18).sub(reserveFactorMantissa); uint borrowRate = getBorrowRate(cash, borrows, reserves); uint rateToPool = borrowRate.mul(oneMinusReserveFactor).div(1e18); diff --git a/contracts/Lens/ComptrollerLens.sol b/contracts/Lens/ComptrollerLens.sol index b5a296a47..c474d843c 100644 --- a/contracts/Lens/ComptrollerLens.sol +++ b/contracts/Lens/ComptrollerLens.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; pragma experimental ABIEncoderV2; import "../Tokens/VTokens/VBep20.sol"; diff --git a/contracts/Oracle/PriceOracle.sol b/contracts/Oracle/PriceOracle.sol index 15f44c18b..219cfe34f 100644 --- a/contracts/Oracle/PriceOracle.sol +++ b/contracts/Oracle/PriceOracle.sol @@ -1,8 +1,8 @@ -pragma solidity ^0.5.16; +pragma solidity ^0.8.13; import "../Tokens/VTokens/VToken.sol"; -contract PriceOracle { +abstract contract PriceOracle { /// @notice Indicator that this is a PriceOracle contract (for inspection) bool public constant isPriceOracle = true; @@ -12,5 +12,5 @@ contract PriceOracle { * @return The underlying asset price mantissa (scaled by 1e18). * Zero means the price is unavailable. */ - function getUnderlyingPrice(VToken vToken) external view returns (uint); + function getUnderlyingPrice(VToken vToken) external view virtual returns (uint); } diff --git a/contracts/Utils/Context.sol b/contracts/Utils/Context.sol index 24a7f00ec..ff604b6bf 100644 --- a/contracts/Utils/Context.sol +++ b/contracts/Utils/Context.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; /* * @dev Provides information about the current execution context, including the @@ -10,13 +10,13 @@ pragma solidity ^0.5.16; * * This contract is only required for intermediate, library-like contracts. */ -contract Context { +abstract contract Context { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor() internal {} function _msgSender() internal view returns (address payable) { - return msg.sender; + return payable(msg.sender); } function _msgData() internal view returns (bytes memory) { diff --git a/contracts/VRTVault/VRTVaultProxy.sol b/contracts/VRTVault/VRTVaultProxy.sol index 5f8e605fe..1c3dd8ab3 100644 --- a/contracts/VRTVault/VRTVaultProxy.sol +++ b/contracts/VRTVault/VRTVaultProxy.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "./VRTVaultStorage.sol"; @@ -62,7 +62,7 @@ contract VRTVaultProxy is VRTVaultAdminStorage { (bool success, bytes memory returnData) = callee.delegatecall(data); assembly { if eq(success, 0) { - revert(add(returnData, 0x20), returndatasize) + revert(add(returnData, 0x20), returndatasize()) } } return returnData; @@ -149,20 +149,20 @@ contract VRTVaultProxy is VRTVaultAdminStorage { * It returns to the external caller whatever the implementation returns * or forwards reverts. */ - function() external payable { + fallback() external payable { // delegate all other functions to current implementation (bool success, ) = implementation.delegatecall(msg.data); assembly { let free_mem_ptr := mload(0x40) - returndatacopy(free_mem_ptr, 0, returndatasize) + returndatacopy(free_mem_ptr, 0, returndatasize()) switch success case 0 { - revert(free_mem_ptr, returndatasize) + revert(free_mem_ptr, returndatasize()) } default { - return(free_mem_ptr, returndatasize) + return(free_mem_ptr, returndatasize()) } } } diff --git a/contracts/XVSVault/XVSVaultProxy.sol b/contracts/XVSVault/XVSVaultProxy.sol index b37c07c03..3d7f331a0 100644 --- a/contracts/XVSVault/XVSVaultProxy.sol +++ b/contracts/XVSVault/XVSVaultProxy.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.16; +pragma solidity 0.8.13; import "./XVSVaultStorage.sol"; import "./XVSVaultErrorReporter.sol"; @@ -125,20 +125,20 @@ contract XVSVaultProxy is XVSVaultAdminStorage, XVSVaultErrorReporter { * It returns to the external caller whatever the implementation returns * or forwards reverts. */ - function() external payable { + fallback() external payable { // delegate all other functions to current implementation (bool success, ) = implementation.delegatecall(msg.data); assembly { let free_mem_ptr := mload(0x40) - returndatacopy(free_mem_ptr, 0, returndatasize) + returndatacopy(free_mem_ptr, 0, returndatasize()) switch success case 0 { - revert(free_mem_ptr, returndatasize) + revert(free_mem_ptr, returndatasize()) } default { - return(free_mem_ptr, returndatasize) + return(free_mem_ptr, returndatasize()) } } } From b234a2fe9162ce656a3eb4bb8eca35ea23691dcb Mon Sep 17 00:00:00 2001 From: defcon022 Date: Fri, 10 Mar 2023 19:18:10 +0530 Subject: [PATCH 019/153] Fix: lint issues. --- contracts/Diamond/facets/SetterFacet.sol | 4 ++-- contracts/Diamond/libraries/LibDiamond.sol | 2 +- script/hardhat/fork/vip-99.ts | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/contracts/Diamond/facets/SetterFacet.sol b/contracts/Diamond/facets/SetterFacet.sol index 479c1de57..b7df42d32 100644 --- a/contracts/Diamond/facets/SetterFacet.sol +++ b/contracts/Diamond/facets/SetterFacet.sol @@ -280,11 +280,11 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError { ) external { LibAccessCheck.ensureAllowed("_setActionsPaused(address[],uint256[],bool)"); - uint256 numMarkets = s.markets.length; + uint256 numMarkets = markets.length; uint256 numActions = actions.length; for (uint marketIdx; marketIdx < numMarkets; ++marketIdx) { for (uint actionIdx; actionIdx < numActions; ++actionIdx) { - setActionPausedInternal(s.markets[marketIdx], actions[actionIdx], paused); + setActionPausedInternal(markets[marketIdx], actions[actionIdx], paused); } } } diff --git a/contracts/Diamond/libraries/LibDiamond.sol b/contracts/Diamond/libraries/LibDiamond.sol index 46d6e0e85..59306ff22 100644 --- a/contracts/Diamond/libraries/LibDiamond.sol +++ b/contracts/Diamond/libraries/LibDiamond.sol @@ -8,7 +8,7 @@ import { IDiamondCut } from "../interfaces/IDiamondCut.sol"; error InitializationFunctionReverted(address _initializationContractAddress, bytes _calldata); library LibDiamond { - bytes32 constant DIAMOND_STORAGE_POSITION = keccak256("diamond.standard.diamond.storage"); + bytes32 constant internal DIAMOND_STORAGE_POSITION = keccak256("diamond.standard.diamond.storage"); struct FacetAddressAndPosition { address facetAddress; diff --git a/script/hardhat/fork/vip-99.ts b/script/hardhat/fork/vip-99.ts index 56f8737c4..c275cb8b4 100644 --- a/script/hardhat/fork/vip-99.ts +++ b/script/hardhat/fork/vip-99.ts @@ -91,10 +91,10 @@ forking(25918391, () => { forking(25918391, () => { let comptroller: Comptroller; let busd: IERC20Upgradeable; - let usdc: IERC20Upgradeable; + let usdc: IERC20Upgradeable; // eslint-disable-line let usdt: IERC20Upgradeable; let btc: IERC20Upgradeable; - let eth: IERC20Upgradeable; + let eth: IERC20Upgradeable; // eslint-disable-line let vBUSD: VBep20Delegate; let vUSDC: VBep20Delegate; let vUSDT: VBep20Delegate; From 3cb18d7dbc86e510472d8959fe17580db5b08ab9 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Fri, 10 Mar 2023 20:49:16 +0530 Subject: [PATCH 020/153] Refactor LibHelper, PolicyFacet, RewardFacet and resolve errors. --- contracts/Diamond/facets/PolicyFacet.sol | 161 ++++++++++++++++-- contracts/Diamond/facets/RewardFacet.sol | 133 ++++++++++++++- contracts/Diamond/libraries/LibHelper.sol | 132 +------------- contracts/Governance/GovernorAlpha.sol | 36 ++-- contracts/Governance/GovernorAlpha2.sol | 36 ++-- .../Governance/GovernorBravoDelegate.sol | 38 ++--- contracts/Tokens/VAI/VAIController.sol | 4 +- contracts/test/VBep20Harness.sol | 2 +- 8 files changed, 333 insertions(+), 209 deletions(-) diff --git a/contracts/Diamond/facets/PolicyFacet.sol b/contracts/Diamond/facets/PolicyFacet.sol index d87300a03..61f328819 100644 --- a/contracts/Diamond/facets/PolicyFacet.sol +++ b/contracts/Diamond/facets/PolicyFacet.sol @@ -36,8 +36,8 @@ contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError { require(nextTotalSupply <= supplyCap, "market supply cap reached"); // Keep the flywheel moving - LibHelper.updateVenusSupplyIndex(vToken); - LibHelper.distributeSupplierVenus(vToken, minter); + updateVenusSupplyIndex(vToken); + distributeSupplierVenus(vToken, minter); return uint(Error.NO_ERROR); } @@ -61,8 +61,8 @@ contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError { } // Keep the flywheel moving - LibHelper.updateVenusSupplyIndex(vToken); - LibHelper.distributeSupplierVenus(vToken, redeemer); + updateVenusSupplyIndex(vToken); + distributeSupplierVenus(vToken, redeemer); return uint(Error.NO_ERROR); } @@ -130,8 +130,8 @@ contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError { // Keep the flywheel moving Exp memory borrowIndex = Exp({ mantissa: VToken(vToken).borrowIndex() }); - LibHelper.updateVenusBorrowIndex(vToken, borrowIndex); - LibHelper.distributeBorrowerVenus(vToken, borrower, borrowIndex); + updateVenusBorrowIndex(vToken, borrowIndex); + distributeBorrowerVenus(vToken, borrower, borrowIndex); return uint(Error.NO_ERROR); } @@ -167,8 +167,8 @@ contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError { // Keep the flywheel moving Exp memory borrowIndex = Exp({ mantissa: VToken(vToken).borrowIndex() }); - LibHelper.updateVenusBorrowIndex(vToken, borrowIndex); - LibHelper.distributeBorrowerVenus(vToken, borrower, borrowIndex); + updateVenusBorrowIndex(vToken, borrowIndex); + distributeBorrowerVenus(vToken, borrower, borrowIndex); return uint(Error.NO_ERROR); } @@ -285,9 +285,9 @@ contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError { } // Keep the flywheel moving - LibHelper.updateVenusSupplyIndex(vTokenCollateral); - LibHelper.distributeSupplierVenus(vTokenCollateral, borrower); - LibHelper.distributeSupplierVenus(vTokenCollateral, liquidator); + updateVenusSupplyIndex(vTokenCollateral); + distributeSupplierVenus(vTokenCollateral, borrower); + distributeSupplierVenus(vTokenCollateral, liquidator); return uint(Error.NO_ERROR); } @@ -330,9 +330,9 @@ contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError { } // Keep the flywheel moving - LibHelper.updateVenusSupplyIndex(vToken); - LibHelper.distributeSupplierVenus(vToken, src); - LibHelper.distributeSupplierVenus(vToken, dst); + updateVenusSupplyIndex(vToken); + distributeSupplierVenus(vToken, src); + distributeSupplierVenus(vToken, dst); return uint(Error.NO_ERROR); } @@ -356,7 +356,7 @@ contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError { function getAccountLiquidity(address account) external view returns (uint, uint, uint) { (Error err, uint liquidity, uint shortfall) = LibHelper.getHypotheticalAccountLiquidityInternal( account, - VToken(0), + VToken(address(0)), 0, 0 ); @@ -398,7 +398,7 @@ contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError { // 1. XVS accrued properly for the old speed, and // 2. XVS accrued at the new speed starts after this block. - LibHelper.updateVenusSupplyIndex(address(vToken)); + updateVenusSupplyIndex(address(vToken)); // Update speed and emit event s.venusSupplySpeeds[address(vToken)] = supplySpeed; emit VenusSupplySpeedUpdated(vToken, supplySpeed); @@ -409,11 +409,138 @@ contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError { // 1. XVS accrued properly for the old speed, and // 2. XVS accrued at the new speed starts after this block. Exp memory borrowIndex = Exp({ mantissa: vToken.borrowIndex() }); - LibHelper.updateVenusBorrowIndex(address(vToken), borrowIndex); + updateVenusBorrowIndex(address(vToken), borrowIndex); // Update speed and emit event s.venusBorrowSpeeds[address(vToken)] = borrowSpeed; emit VenusBorrowSpeedUpdated(vToken, borrowSpeed); } } + + /** + * @notice Accrue XVS to the market by updating the borrow index + * @param vToken The market whose borrow index to update + */ + function updateVenusBorrowIndex(address vToken, ExponentialNoError.Exp memory marketBorrowIndex) internal { + VenusMarketState storage borrowState = s.venusBorrowState[vToken]; + uint borrowSpeed = s.venusBorrowSpeeds[vToken]; + uint32 blockNumber = safe32( + LibAccessCheck.getBlockNumber(), + "block number exceeds 32 bits" + ); + uint deltaBlocks = sub_(uint(blockNumber), uint(borrowState.block)); + if (deltaBlocks > 0 && borrowSpeed > 0) { + uint borrowAmount = div_(VToken(vToken).totalBorrows(), marketBorrowIndex); + uint venusAccrued = mul_(deltaBlocks, borrowSpeed); + Double memory ratio = borrowAmount > 0 + ? fraction(venusAccrued, borrowAmount) + : Double({ mantissa: 0 }); + borrowState.index = safe224( + add_(Double({ mantissa: borrowState.index }), ratio) + .mantissa, + "new index exceeds 224 bits" + ); + borrowState.block = blockNumber; + } else if (deltaBlocks > 0) { + borrowState.block = blockNumber; + } + } + + /** + * @notice Accrue XVS to the market by updating the supply index + * @param vToken The market whose supply index to update + */ + function updateVenusSupplyIndex(address vToken) internal { + VenusMarketState storage supplyState = s.venusSupplyState[vToken]; + uint supplySpeed = s.venusSupplySpeeds[vToken]; + uint32 blockNumber = safe32( + LibAccessCheck.getBlockNumber(), + "block number exceeds 32 bits" + ); + uint deltaBlocks = sub_(uint(blockNumber), uint(supplyState.block)); + if (deltaBlocks > 0 && supplySpeed > 0) { + uint supplyTokens = VToken(vToken).totalSupply(); + uint venusAccrued = mul_(deltaBlocks, supplySpeed); + Double memory ratio = supplyTokens > 0 + ? fraction(venusAccrued, supplyTokens) + : Double({ mantissa: 0 }); + supplyState.index = safe224( + add_(Double({ mantissa: supplyState.index }), ratio) + .mantissa, + "new index exceeds 224 bits" + ); + supplyState.block = blockNumber; + } else if (deltaBlocks > 0) { + supplyState.block = blockNumber; + } + } + + /** + * @notice Calculate XVS accrued by a supplier and possibly transfer it to them + * @param vToken The market in which the supplier is interacting + * @param supplier The address of the supplier to distribute XVS to + */ + function distributeSupplierVenus(address vToken, address supplier) internal { + if (address(s.vaiVaultAddress) != address(0)) { + // releaseToVault(); + } + uint supplyIndex = s.venusSupplyState[vToken].index; + uint supplierIndex = s.venusSupplierIndex[vToken][supplier]; + // Update supplier's index to the current index since we are distributing accrued XVS + s.venusSupplierIndex[vToken][supplier] = supplyIndex; + if (supplierIndex == 0 && supplyIndex >= LibHelper.venusInitialIndex) { + // Covers the case where users supplied tokens before the market's supply state index was set. + // Rewards the user with XVS accrued from the start of when supplier rewards were first + // set for the market. + supplierIndex = LibHelper.venusInitialIndex; + } + // Calculate change in the cumulative sum of the XVS per vToken accrued + Double memory deltaIndex = Double({ + mantissa: sub_(supplyIndex, supplierIndex) + }); + // Multiply of supplierTokens and supplierDelta + uint supplierDelta = mul_(VToken(vToken).balanceOf(supplier), deltaIndex); + // Addition of supplierAccrued and supplierDelta + s.venusAccrued[supplier] = add_(s.venusAccrued[supplier], supplierDelta); + // emit DistributedSupplierVenus(VToken(vToken), supplier, supplierDelta, supplyIndex); + } + + /** + * @notice Calculate XVS accrued by a borrower and possibly transfer it to them + * @dev Borrowers will not begin to accrue until after the first interaction with the protocol. + * @param vToken The market in which the borrower is interacting + * @param borrower The address of the borrower to distribute XVS to + */ + function distributeBorrowerVenus( + address vToken, + address borrower, + ExponentialNoError.Exp memory marketBorrowIndex + ) internal { + if (address(s.vaiVaultAddress) != address(0)) { + // releaseToVault(); + } + uint borrowIndex = s.venusBorrowState[vToken].index; + uint borrowerIndex = s.venusBorrowerIndex[vToken][borrower]; + // Update borrowers's index to the current index since we are distributing accrued XVS + s.venusBorrowerIndex[vToken][borrower] = borrowIndex; + if (borrowerIndex == 0 && borrowIndex >= LibHelper.venusInitialIndex) { + // Covers the case where users borrowed tokens before the market's borrow state index was set. + // Rewards the user with XVS accrued from the start of when borrower rewards were first + // set for the market. + borrowerIndex = LibHelper.venusInitialIndex; + } + // Calculate change in the cumulative sum of the XVS per borrowed unit accrued + Double memory deltaIndex = Double({ + mantissa: sub_(borrowIndex, borrowerIndex) + }); + uint borrowerDelta = mul_( + div_(VToken(vToken).borrowBalanceStored(borrower), marketBorrowIndex), + deltaIndex + ); + s.venusAccrued[borrower] = add_(s.venusAccrued[borrower], borrowerDelta); + // emit DistributedBorrowerVenus(VToken(vToken), borrower, borrowerDelta, borrowIndex); + } + + + } diff --git a/contracts/Diamond/facets/RewardFacet.sol b/contracts/Diamond/facets/RewardFacet.sol index 799bb6a19..fc1e0f350 100644 --- a/contracts/Diamond/facets/RewardFacet.sol +++ b/contracts/Diamond/facets/RewardFacet.sol @@ -210,15 +210,15 @@ contract RewardFacet is ComptrollerErrorReporter, ExponentialNoError { LibAccessCheck.ensureListed(s.markets[address(vToken)]); if (borrowers) { Exp memory borrowIndex = Exp({ mantissa: vToken.borrowIndex() }); - LibHelper.updateVenusBorrowIndex(address(vToken), borrowIndex); + updateVenusBorrowIndex(address(vToken), borrowIndex); for (j = 0; j < holdersLength; ++j) { - LibHelper.distributeBorrowerVenus(address(vToken), holders[j], borrowIndex); + distributeBorrowerVenus(address(vToken), holders[j], borrowIndex); } } if (suppliers) { - LibHelper.updateVenusSupplyIndex(address(vToken)); + updateVenusSupplyIndex(address(vToken)); for (j = 0; j < holdersLength; ++j) { - LibHelper.distributeSupplierVenus(address(vToken), holders[j]); + distributeSupplierVenus(address(vToken), holders[j]); } } } @@ -231,4 +231,129 @@ contract RewardFacet is ComptrollerErrorReporter, ExponentialNoError { s.venusAccrued[holder] = grantXVSInternal(holder, s.venusAccrued[holder], shortfall, collateral); } } + + /** + * @notice Accrue XVS to the market by updating the borrow index + * @param vToken The market whose borrow index to update + */ + function updateVenusBorrowIndex(address vToken, ExponentialNoError.Exp memory marketBorrowIndex) internal { + VenusMarketState storage borrowState = s.venusBorrowState[vToken]; + uint borrowSpeed = s.venusBorrowSpeeds[vToken]; + uint32 blockNumber = safe32( + LibAccessCheck.getBlockNumber(), + "block number exceeds 32 bits" + ); + uint deltaBlocks = sub_(uint(blockNumber), uint(borrowState.block)); + if (deltaBlocks > 0 && borrowSpeed > 0) { + uint borrowAmount = div_(VToken(vToken).totalBorrows(), marketBorrowIndex); + uint venusAccrued = mul_(deltaBlocks, borrowSpeed); + Double memory ratio = borrowAmount > 0 + ? fraction(venusAccrued, borrowAmount) + : Double({ mantissa: 0 }); + borrowState.index = safe224( + add_(Double({ mantissa: borrowState.index }), ratio) + .mantissa, + "new index exceeds 224 bits" + ); + borrowState.block = blockNumber; + } else if (deltaBlocks > 0) { + borrowState.block = blockNumber; + } + } + + /** + * @notice Accrue XVS to the market by updating the supply index + * @param vToken The market whose supply index to update + */ + function updateVenusSupplyIndex(address vToken) internal { + VenusMarketState storage supplyState = s.venusSupplyState[vToken]; + uint supplySpeed = s.venusSupplySpeeds[vToken]; + uint32 blockNumber = safe32( + LibAccessCheck.getBlockNumber(), + "block number exceeds 32 bits" + ); + uint deltaBlocks = sub_(uint(blockNumber), uint(supplyState.block)); + if (deltaBlocks > 0 && supplySpeed > 0) { + uint supplyTokens = VToken(vToken).totalSupply(); + uint venusAccrued = mul_(deltaBlocks, supplySpeed); + Double memory ratio = supplyTokens > 0 + ? fraction(venusAccrued, supplyTokens) + : Double({ mantissa: 0 }); + supplyState.index = safe224( + add_(Double({ mantissa: supplyState.index }), ratio) + .mantissa, + "new index exceeds 224 bits" + ); + supplyState.block = blockNumber; + } else if (deltaBlocks > 0) { + supplyState.block = blockNumber; + } + } + + /** + * @notice Calculate XVS accrued by a supplier and possibly transfer it to them + * @param vToken The market in which the supplier is interacting + * @param supplier The address of the supplier to distribute XVS to + */ + function distributeSupplierVenus(address vToken, address supplier) internal { + if (address(s.vaiVaultAddress) != address(0)) { + // releaseToVault(); + } + uint supplyIndex = s.venusSupplyState[vToken].index; + uint supplierIndex = s.venusSupplierIndex[vToken][supplier]; + // Update supplier's index to the current index since we are distributing accrued XVS + s.venusSupplierIndex[vToken][supplier] = supplyIndex; + if (supplierIndex == 0 && supplyIndex >= LibHelper.venusInitialIndex) { + // Covers the case where users supplied tokens before the market's supply state index was set. + // Rewards the user with XVS accrued from the start of when supplier rewards were first + // set for the market. + supplierIndex = LibHelper.venusInitialIndex; + } + // Calculate change in the cumulative sum of the XVS per vToken accrued + Double memory deltaIndex = Double({ + mantissa: sub_(supplyIndex, supplierIndex) + }); + // Multiply of supplierTokens and supplierDelta + uint supplierDelta = mul_(VToken(vToken).balanceOf(supplier), deltaIndex); + // Addition of supplierAccrued and supplierDelta + s.venusAccrued[supplier] = add_(s.venusAccrued[supplier], supplierDelta); + // emit DistributedSupplierVenus(VToken(vToken), supplier, supplierDelta, supplyIndex); + } + + /** + * @notice Calculate XVS accrued by a borrower and possibly transfer it to them + * @dev Borrowers will not begin to accrue until after the first interaction with the protocol. + * @param vToken The market in which the borrower is interacting + * @param borrower The address of the borrower to distribute XVS to + */ + function distributeBorrowerVenus( + address vToken, + address borrower, + ExponentialNoError.Exp memory marketBorrowIndex + ) internal { + if (address(s.vaiVaultAddress) != address(0)) { + // releaseToVault(); + } + uint borrowIndex = s.venusBorrowState[vToken].index; + uint borrowerIndex = s.venusBorrowerIndex[vToken][borrower]; + // Update borrowers's index to the current index since we are distributing accrued XVS + s.venusBorrowerIndex[vToken][borrower] = borrowIndex; + if (borrowerIndex == 0 && borrowIndex >= LibHelper.venusInitialIndex) { + // Covers the case where users borrowed tokens before the market's borrow state index was set. + // Rewards the user with XVS accrued from the start of when borrower rewards were first + // set for the market. + borrowerIndex = LibHelper.venusInitialIndex; + } + // Calculate change in the cumulative sum of the XVS per borrowed unit accrued + Double memory deltaIndex = Double({ + mantissa: sub_(borrowIndex, borrowerIndex) + }); + uint borrowerDelta = mul_( + div_(VToken(vToken).borrowBalanceStored(borrower), marketBorrowIndex), + deltaIndex + ); + s.venusAccrued[borrower] = add_(s.venusAccrued[borrower], borrowerDelta); + // emit DistributedBorrowerVenus(VToken(vToken), borrower, borrowerDelta, borrowIndex); + } + } diff --git a/contracts/Diamond/libraries/LibHelper.sol b/contracts/Diamond/libraries/LibHelper.sol index 62afb28aa..53df1970d 100644 --- a/contracts/Diamond/libraries/LibHelper.sol +++ b/contracts/Diamond/libraries/LibHelper.sol @@ -46,136 +46,8 @@ library LibHelper { return (ComptrollerErrorReporter.Error(err), liquidity, shortfall); } - /** - * @notice Accrue XVS to the market by updating the supply index - * @param vToken The market whose supply index to update - */ - function updateVenusSupplyIndex(address vToken) internal { - AppStorage storage s = LibAppStorage.diamondStorage(); - VenusMarketState storage supplyState = s.venusSupplyState[vToken]; - uint supplySpeed = s.venusSupplySpeeds[vToken]; - uint32 blockNumber = LibExponentialNoError.safe32( - LibAccessCheck.getBlockNumber(), - "block number exceeds 32 bits" - ); - uint deltaBlocks = LibExponentialNoError.sub_(uint(blockNumber), uint(supplyState.block)); - if (deltaBlocks > 0 && supplySpeed > 0) { - uint supplyTokens = VToken(vToken).totalSupply(); - uint venusAccrued = LibExponentialNoError.mul_(deltaBlocks, supplySpeed); - LibExponentialNoError.Double memory ratio = supplyTokens > 0 - ? LibExponentialNoError.fraction(venusAccrued, supplyTokens) - : LibExponentialNoError.Double({ mantissa: 0 }); - supplyState.index = LibExponentialNoError.safe224( - LibExponentialNoError - .add_(LibExponentialNoError.Double({ mantissa: supplyState.index }), ratio) - .mantissa, - "new index exceeds 224 bits" - ); - supplyState.block = blockNumber; - } else if (deltaBlocks > 0) { - supplyState.block = blockNumber; - } - } - - /** - * @notice Accrue XVS to the market by updating the borrow index - * @param vToken The market whose borrow index to update - */ - function updateVenusBorrowIndex(address vToken, ExponentialNoError.Exp memory marketBorrowIndex) internal { - AppStorage storage s = LibAppStorage.diamondStorage(); - VenusMarketState storage borrowState = s.venusBorrowState[vToken]; - uint borrowSpeed = s.venusBorrowSpeeds[vToken]; - uint32 blockNumber = LibExponentialNoError.safe32( - LibAccessCheck.getBlockNumber(), - "block number exceeds 32 bits" - ); - uint deltaBlocks = LibExponentialNoError.sub_(uint(blockNumber), uint(borrowState.block)); - if (deltaBlocks > 0 && borrowSpeed > 0) { - uint borrowAmount = LibExponentialNoError.div_(VToken(vToken).totalBorrows(), marketBorrowIndex); - uint venusAccrued = LibExponentialNoError.mul_(deltaBlocks, borrowSpeed); - LibExponentialNoError.Double memory ratio = borrowAmount > 0 - ? LibExponentialNoError.fraction(venusAccrued, borrowAmount) - : LibExponentialNoError.Double({ mantissa: 0 }); - borrowState.index = LibExponentialNoError.safe224( - LibExponentialNoError - .add_(LibExponentialNoError.Double({ mantissa: borrowState.index }), ratio) - .mantissa, - "new index exceeds 224 bits" - ); - borrowState.block = blockNumber; - } else if (deltaBlocks > 0) { - borrowState.block = blockNumber; - } - } - - /** - * @notice Calculate XVS accrued by a supplier and possibly transfer it to them - * @param vToken The market in which the supplier is interacting - * @param supplier The address of the supplier to distribute XVS to - */ - function distributeSupplierVenus(address vToken, address supplier) internal { - AppStorage storage s = LibAppStorage.diamondStorage(); - if (address(s.vaiVaultAddress) != address(0)) { - // releaseToVault(); - } - uint supplyIndex = s.venusSupplyState[vToken].index; - uint supplierIndex = s.venusSupplierIndex[vToken][supplier]; - // Update supplier's index to the current index since we are distributing accrued XVS - s.venusSupplierIndex[vToken][supplier] = supplyIndex; - if (supplierIndex == 0 && supplyIndex >= venusInitialIndex) { - // Covers the case where users supplied tokens before the market's supply state index was set. - // Rewards the user with XVS accrued from the start of when supplier rewards were first - // set for the market. - supplierIndex = venusInitialIndex; - } - // Calculate change in the cumulative sum of the XVS per vToken accrued - LibExponentialNoError.Double memory deltaIndex = LibExponentialNoError.Double({ - mantissa: LibExponentialNoError.sub_(supplyIndex, supplierIndex) - }); - // Multiply of supplierTokens and supplierDelta - uint supplierDelta = LibExponentialNoError.mul_(VToken(vToken).balanceOf(supplier), deltaIndex); - // Addition of supplierAccrued and supplierDelta - s.venusAccrued[supplier] = LibExponentialNoError.add_(s.venusAccrued[supplier], supplierDelta); - // emit DistributedSupplierVenus(VToken(vToken), supplier, supplierDelta, supplyIndex); - } - - /** - * @notice Calculate XVS accrued by a borrower and possibly transfer it to them - * @dev Borrowers will not begin to accrue until after the first interaction with the protocol. - * @param vToken The market in which the borrower is interacting - * @param borrower The address of the borrower to distribute XVS to - */ - function distributeBorrowerVenus( - address vToken, - address borrower, - ExponentialNoError.Exp memory marketBorrowIndex - ) internal { - AppStorage storage s = LibAppStorage.diamondStorage(); - if (address(s.vaiVaultAddress) != address(0)) { - // releaseToVault(); - } - uint borrowIndex = s.venusBorrowState[vToken].index; - uint borrowerIndex = s.venusBorrowerIndex[vToken][borrower]; - // Update borrowers's index to the current index since we are distributing accrued XVS - s.venusBorrowerIndex[vToken][borrower] = borrowIndex; - if (borrowerIndex == 0 && borrowIndex >= venusInitialIndex) { - // Covers the case where users borrowed tokens before the market's borrow state index was set. - // Rewards the user with XVS accrued from the start of when borrower rewards were first - // set for the market. - borrowerIndex = venusInitialIndex; - } - // Calculate change in the cumulative sum of the XVS per borrowed unit accrued - LibExponentialNoError.Double memory deltaIndex = LibExponentialNoError.Double({ - mantissa: LibExponentialNoError.sub_(borrowIndex, borrowerIndex) - }); - uint borrowerDelta = LibExponentialNoError.mul_( - LibExponentialNoError.div_(VToken(vToken).borrowBalanceStored(borrower), marketBorrowIndex), - deltaIndex - ); - s.venusAccrued[borrower] = LibExponentialNoError.add_(s.venusAccrued[borrower], borrowerDelta); - // emit DistributedBorrowerVenus(VToken(vToken), borrower, borrowerDelta, borrowIndex); - } - + + /** * @notice Add the market to the borrower's "assets in" for liquidity calculations * @param vToken The market to enter diff --git a/contracts/Governance/GovernorAlpha.sol b/contracts/Governance/GovernorAlpha.sol index cdbd43414..88c042e8b 100644 --- a/contracts/Governance/GovernorAlpha.sol +++ b/contracts/Governance/GovernorAlpha.sol @@ -176,23 +176,23 @@ contract GovernorAlpha { uint endBlock = add256(startBlock, votingPeriod()); proposalCount++; - Proposal memory newProposal = Proposal({ - id: proposalCount, - proposer: msg.sender, - eta: 0, - targets: targets, - values: values, - signatures: signatures, - calldatas: calldatas, - startBlock: startBlock, - endBlock: endBlock, - forVotes: 0, - againstVotes: 0, - canceled: false, - executed: false - }); - - proposals[newProposal.id] = newProposal; + Proposal storage newProposal = proposals[proposalCount]; + newProposal.id = proposalCount; + newProposal.proposer = msg.sender; + newProposal.eta = 0; + newProposal.targets = targets; + newProposal.values = values; + newProposal.signatures = signatures; + newProposal.calldatas = calldatas; + newProposal.startBlock = startBlock; + newProposal.endBlock = endBlock; + newProposal.forVotes = 0; + newProposal.againstVotes = 0; + newProposal.canceled = false; + newProposal.executed = false; + + + //proposals[newProposal.id] = newProposal; latestProposalIds[newProposal.proposer] = newProposal.id; emit ProposalCreated( @@ -239,7 +239,7 @@ contract GovernorAlpha { Proposal storage proposal = proposals[proposalId]; proposal.executed = true; for (uint i = 0; i < proposal.targets.length; i++) { - timelock.executeTransaction.value(proposal.values[i])( + timelock.executeTransaction{value:proposal.values[i]}( proposal.targets[i], proposal.values[i], proposal.signatures[i], diff --git a/contracts/Governance/GovernorAlpha2.sol b/contracts/Governance/GovernorAlpha2.sol index 2bd49f127..9df2a8869 100644 --- a/contracts/Governance/GovernorAlpha2.sol +++ b/contracts/Governance/GovernorAlpha2.sol @@ -177,23 +177,23 @@ contract GovernorAlpha2 { uint endBlock = add256(startBlock, votingPeriod()); proposalCount++; - Proposal memory newProposal = Proposal({ - id: proposalCount, - proposer: msg.sender, - eta: 0, - targets: targets, - values: values, - signatures: signatures, - calldatas: calldatas, - startBlock: startBlock, - endBlock: endBlock, - forVotes: 0, - againstVotes: 0, - canceled: false, - executed: false - }); - - proposals[newProposal.id] = newProposal; + Proposal storage newProposal = proposals[proposalCount]; + newProposal.id = proposalCount; + newProposal.proposer = msg.sender; + newProposal.eta = 0; + newProposal.targets = targets; + newProposal.values = values; + newProposal.signatures = signatures; + newProposal.calldatas = calldatas; + newProposal.startBlock = startBlock; + newProposal.endBlock = endBlock; + newProposal.forVotes = 0; + newProposal.againstVotes = 0; + newProposal.canceled = false; + newProposal.executed = false; + + + //proposals[newProposal.id] = newProposal; latestProposalIds[newProposal.proposer] = newProposal.id; emit ProposalCreated( @@ -240,7 +240,7 @@ contract GovernorAlpha2 { Proposal storage proposal = proposals[proposalId]; proposal.executed = true; for (uint i = 0; i < proposal.targets.length; i++) { - timelock.executeTransaction.value(proposal.values[i])( + timelock.executeTransaction{value:proposal.values[i]}( proposal.targets[i], proposal.values[i], proposal.signatures[i], diff --git a/contracts/Governance/GovernorBravoDelegate.sol b/contracts/Governance/GovernorBravoDelegate.sol index 7e9fc7f11..e9c2c0655 100644 --- a/contracts/Governance/GovernorBravoDelegate.sol +++ b/contracts/Governance/GovernorBravoDelegate.sol @@ -152,25 +152,25 @@ contract GovernorBravoDelegate is GovernorBravoDelegateStorageV2, GovernorBravoE uint endBlock = add256(startBlock, proposalConfigs[uint8(proposalType)].votingPeriod); proposalCount++; - Proposal memory newProposal = Proposal({ - id: proposalCount, - proposer: msg.sender, - eta: 0, - targets: targets, - values: values, - signatures: signatures, - calldatas: calldatas, - startBlock: startBlock, - endBlock: endBlock, - forVotes: 0, - againstVotes: 0, - abstainVotes: 0, - canceled: false, - executed: false, - proposalType: uint8(proposalType) - }); - - proposals[newProposal.id] = newProposal; + + Proposal storage newProposal = proposals[proposalCount]; + newProposal.id = proposalCount; + newProposal.proposer = msg.sender; + newProposal.eta = 0; + newProposal.targets = targets; + newProposal.values = values; + newProposal.signatures = signatures; + newProposal.calldatas = calldatas; + newProposal.startBlock = startBlock; + newProposal.endBlock = endBlock; + newProposal.forVotes = 0; + newProposal.againstVotes = 0; + newProposal.canceled = false; + newProposal.executed = false; + newProposal.proposalType = uint8(proposalType); + + + //proposals[newProposal.id] = newProposal; latestProposalIds[newProposal.proposer] = newProposal.id; emit ProposalCreated( diff --git a/contracts/Tokens/VAI/VAIController.sol b/contracts/Tokens/VAI/VAIController.sol index bde5a013c..45b6937bb 100644 --- a/contracts/Tokens/VAI/VAIController.sol +++ b/contracts/Tokens/VAI/VAIController.sol @@ -92,7 +92,7 @@ contract VAIController is VAIControllerStorageG2, VAIControllerErrorReporter, Ex vaiMintIndex = INITIAL_VAI_MINT_INDEX; accrualBlockNumber = getBlockNumber(); - mintCap = uint256(-1); + mintCap = type(uint256).max; // The counter starts true to prevent changing it from zero to non-zero (i.e. smaller cost/refund) _notEntered = true; @@ -324,7 +324,7 @@ contract VAIController is VAIControllerStorageG2, VAIControllerErrorReporter, Ex } /* Fail if repayAmount = -1 */ - if (repayAmount == uint(-1)) { + if (repayAmount == type(uint).max) { return (fail(Error.REJECTION, FailureInfo.VAI_LIQUIDATE_CLOSE_AMOUNT_IS_UINT_MAX), 0); } diff --git a/contracts/test/VBep20Harness.sol b/contracts/test/VBep20Harness.sol index 916d24c96..247732a25 100644 --- a/contracts/test/VBep20Harness.sol +++ b/contracts/test/VBep20Harness.sol @@ -444,7 +444,7 @@ contract VBep20DelegateScenarioExtra is VBep20DelegateScenario { } function itIsTheWay() public { - admin = address(1); // make a change to test effect + admin = payable(address(1)); // make a change to test effect } function babyYoda() public pure { From 25e26ba0d287b06f0d113c25704b0a91dc5903e7 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Fri, 10 Mar 2023 20:51:36 +0530 Subject: [PATCH 021/153] Fixed lint. --- contracts/Diamond/facets/PolicyFacet.sol | 42 +++++-------------- contracts/Diamond/facets/RewardFacet.sol | 42 +++++-------------- contracts/Diamond/libraries/LibDiamond.sol | 2 +- contracts/Diamond/libraries/LibHelper.sol | 2 - contracts/Governance/GovernorAlpha.sol | 29 +++++++------ contracts/Governance/GovernorAlpha2.sol | 29 +++++++------ .../Governance/GovernorBravoDelegate.sol | 31 +++++++------- 7 files changed, 65 insertions(+), 112 deletions(-) diff --git a/contracts/Diamond/facets/PolicyFacet.sol b/contracts/Diamond/facets/PolicyFacet.sol index 61f328819..ebcb7261c 100644 --- a/contracts/Diamond/facets/PolicyFacet.sol +++ b/contracts/Diamond/facets/PolicyFacet.sol @@ -424,20 +424,14 @@ contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError { function updateVenusBorrowIndex(address vToken, ExponentialNoError.Exp memory marketBorrowIndex) internal { VenusMarketState storage borrowState = s.venusBorrowState[vToken]; uint borrowSpeed = s.venusBorrowSpeeds[vToken]; - uint32 blockNumber = safe32( - LibAccessCheck.getBlockNumber(), - "block number exceeds 32 bits" - ); + uint32 blockNumber = safe32(LibAccessCheck.getBlockNumber(), "block number exceeds 32 bits"); uint deltaBlocks = sub_(uint(blockNumber), uint(borrowState.block)); if (deltaBlocks > 0 && borrowSpeed > 0) { uint borrowAmount = div_(VToken(vToken).totalBorrows(), marketBorrowIndex); uint venusAccrued = mul_(deltaBlocks, borrowSpeed); - Double memory ratio = borrowAmount > 0 - ? fraction(venusAccrued, borrowAmount) - : Double({ mantissa: 0 }); + Double memory ratio = borrowAmount > 0 ? fraction(venusAccrued, borrowAmount) : Double({ mantissa: 0 }); borrowState.index = safe224( - add_(Double({ mantissa: borrowState.index }), ratio) - .mantissa, + add_(Double({ mantissa: borrowState.index }), ratio).mantissa, "new index exceeds 224 bits" ); borrowState.block = blockNumber; @@ -446,27 +440,21 @@ contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError { } } - /** + /** * @notice Accrue XVS to the market by updating the supply index * @param vToken The market whose supply index to update */ function updateVenusSupplyIndex(address vToken) internal { VenusMarketState storage supplyState = s.venusSupplyState[vToken]; uint supplySpeed = s.venusSupplySpeeds[vToken]; - uint32 blockNumber = safe32( - LibAccessCheck.getBlockNumber(), - "block number exceeds 32 bits" - ); + uint32 blockNumber = safe32(LibAccessCheck.getBlockNumber(), "block number exceeds 32 bits"); uint deltaBlocks = sub_(uint(blockNumber), uint(supplyState.block)); if (deltaBlocks > 0 && supplySpeed > 0) { uint supplyTokens = VToken(vToken).totalSupply(); uint venusAccrued = mul_(deltaBlocks, supplySpeed); - Double memory ratio = supplyTokens > 0 - ? fraction(venusAccrued, supplyTokens) - : Double({ mantissa: 0 }); + Double memory ratio = supplyTokens > 0 ? fraction(venusAccrued, supplyTokens) : Double({ mantissa: 0 }); supplyState.index = safe224( - add_(Double({ mantissa: supplyState.index }), ratio) - .mantissa, + add_(Double({ mantissa: supplyState.index }), ratio).mantissa, "new index exceeds 224 bits" ); supplyState.block = blockNumber; @@ -495,9 +483,7 @@ contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError { supplierIndex = LibHelper.venusInitialIndex; } // Calculate change in the cumulative sum of the XVS per vToken accrued - Double memory deltaIndex = Double({ - mantissa: sub_(supplyIndex, supplierIndex) - }); + Double memory deltaIndex = Double({ mantissa: sub_(supplyIndex, supplierIndex) }); // Multiply of supplierTokens and supplierDelta uint supplierDelta = mul_(VToken(vToken).balanceOf(supplier), deltaIndex); // Addition of supplierAccrued and supplierDelta @@ -530,17 +516,9 @@ contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError { borrowerIndex = LibHelper.venusInitialIndex; } // Calculate change in the cumulative sum of the XVS per borrowed unit accrued - Double memory deltaIndex = Double({ - mantissa: sub_(borrowIndex, borrowerIndex) - }); - uint borrowerDelta = mul_( - div_(VToken(vToken).borrowBalanceStored(borrower), marketBorrowIndex), - deltaIndex - ); + Double memory deltaIndex = Double({ mantissa: sub_(borrowIndex, borrowerIndex) }); + uint borrowerDelta = mul_(div_(VToken(vToken).borrowBalanceStored(borrower), marketBorrowIndex), deltaIndex); s.venusAccrued[borrower] = add_(s.venusAccrued[borrower], borrowerDelta); // emit DistributedBorrowerVenus(VToken(vToken), borrower, borrowerDelta, borrowIndex); } - - - } diff --git a/contracts/Diamond/facets/RewardFacet.sol b/contracts/Diamond/facets/RewardFacet.sol index fc1e0f350..4d510d201 100644 --- a/contracts/Diamond/facets/RewardFacet.sol +++ b/contracts/Diamond/facets/RewardFacet.sol @@ -232,27 +232,21 @@ contract RewardFacet is ComptrollerErrorReporter, ExponentialNoError { } } - /** + /** * @notice Accrue XVS to the market by updating the borrow index * @param vToken The market whose borrow index to update */ function updateVenusBorrowIndex(address vToken, ExponentialNoError.Exp memory marketBorrowIndex) internal { VenusMarketState storage borrowState = s.venusBorrowState[vToken]; uint borrowSpeed = s.venusBorrowSpeeds[vToken]; - uint32 blockNumber = safe32( - LibAccessCheck.getBlockNumber(), - "block number exceeds 32 bits" - ); + uint32 blockNumber = safe32(LibAccessCheck.getBlockNumber(), "block number exceeds 32 bits"); uint deltaBlocks = sub_(uint(blockNumber), uint(borrowState.block)); if (deltaBlocks > 0 && borrowSpeed > 0) { uint borrowAmount = div_(VToken(vToken).totalBorrows(), marketBorrowIndex); uint venusAccrued = mul_(deltaBlocks, borrowSpeed); - Double memory ratio = borrowAmount > 0 - ? fraction(venusAccrued, borrowAmount) - : Double({ mantissa: 0 }); + Double memory ratio = borrowAmount > 0 ? fraction(venusAccrued, borrowAmount) : Double({ mantissa: 0 }); borrowState.index = safe224( - add_(Double({ mantissa: borrowState.index }), ratio) - .mantissa, + add_(Double({ mantissa: borrowState.index }), ratio).mantissa, "new index exceeds 224 bits" ); borrowState.block = blockNumber; @@ -261,27 +255,21 @@ contract RewardFacet is ComptrollerErrorReporter, ExponentialNoError { } } - /** + /** * @notice Accrue XVS to the market by updating the supply index * @param vToken The market whose supply index to update */ function updateVenusSupplyIndex(address vToken) internal { VenusMarketState storage supplyState = s.venusSupplyState[vToken]; uint supplySpeed = s.venusSupplySpeeds[vToken]; - uint32 blockNumber = safe32( - LibAccessCheck.getBlockNumber(), - "block number exceeds 32 bits" - ); + uint32 blockNumber = safe32(LibAccessCheck.getBlockNumber(), "block number exceeds 32 bits"); uint deltaBlocks = sub_(uint(blockNumber), uint(supplyState.block)); if (deltaBlocks > 0 && supplySpeed > 0) { uint supplyTokens = VToken(vToken).totalSupply(); uint venusAccrued = mul_(deltaBlocks, supplySpeed); - Double memory ratio = supplyTokens > 0 - ? fraction(venusAccrued, supplyTokens) - : Double({ mantissa: 0 }); + Double memory ratio = supplyTokens > 0 ? fraction(venusAccrued, supplyTokens) : Double({ mantissa: 0 }); supplyState.index = safe224( - add_(Double({ mantissa: supplyState.index }), ratio) - .mantissa, + add_(Double({ mantissa: supplyState.index }), ratio).mantissa, "new index exceeds 224 bits" ); supplyState.block = blockNumber; @@ -310,9 +298,7 @@ contract RewardFacet is ComptrollerErrorReporter, ExponentialNoError { supplierIndex = LibHelper.venusInitialIndex; } // Calculate change in the cumulative sum of the XVS per vToken accrued - Double memory deltaIndex = Double({ - mantissa: sub_(supplyIndex, supplierIndex) - }); + Double memory deltaIndex = Double({ mantissa: sub_(supplyIndex, supplierIndex) }); // Multiply of supplierTokens and supplierDelta uint supplierDelta = mul_(VToken(vToken).balanceOf(supplier), deltaIndex); // Addition of supplierAccrued and supplierDelta @@ -345,15 +331,9 @@ contract RewardFacet is ComptrollerErrorReporter, ExponentialNoError { borrowerIndex = LibHelper.venusInitialIndex; } // Calculate change in the cumulative sum of the XVS per borrowed unit accrued - Double memory deltaIndex = Double({ - mantissa: sub_(borrowIndex, borrowerIndex) - }); - uint borrowerDelta = mul_( - div_(VToken(vToken).borrowBalanceStored(borrower), marketBorrowIndex), - deltaIndex - ); + Double memory deltaIndex = Double({ mantissa: sub_(borrowIndex, borrowerIndex) }); + uint borrowerDelta = mul_(div_(VToken(vToken).borrowBalanceStored(borrower), marketBorrowIndex), deltaIndex); s.venusAccrued[borrower] = add_(s.venusAccrued[borrower], borrowerDelta); // emit DistributedBorrowerVenus(VToken(vToken), borrower, borrowerDelta, borrowIndex); } - } diff --git a/contracts/Diamond/libraries/LibDiamond.sol b/contracts/Diamond/libraries/LibDiamond.sol index 59306ff22..f67365a2b 100644 --- a/contracts/Diamond/libraries/LibDiamond.sol +++ b/contracts/Diamond/libraries/LibDiamond.sol @@ -8,7 +8,7 @@ import { IDiamondCut } from "../interfaces/IDiamondCut.sol"; error InitializationFunctionReverted(address _initializationContractAddress, bytes _calldata); library LibDiamond { - bytes32 constant internal DIAMOND_STORAGE_POSITION = keccak256("diamond.standard.diamond.storage"); + bytes32 internal constant DIAMOND_STORAGE_POSITION = keccak256("diamond.standard.diamond.storage"); struct FacetAddressAndPosition { address facetAddress; diff --git a/contracts/Diamond/libraries/LibHelper.sol b/contracts/Diamond/libraries/LibHelper.sol index 53df1970d..28b1e6bbc 100644 --- a/contracts/Diamond/libraries/LibHelper.sol +++ b/contracts/Diamond/libraries/LibHelper.sol @@ -46,8 +46,6 @@ library LibHelper { return (ComptrollerErrorReporter.Error(err), liquidity, shortfall); } - - /** * @notice Add the market to the borrower's "assets in" for liquidity calculations * @param vToken The market to enter diff --git a/contracts/Governance/GovernorAlpha.sol b/contracts/Governance/GovernorAlpha.sol index 88c042e8b..62945f786 100644 --- a/contracts/Governance/GovernorAlpha.sol +++ b/contracts/Governance/GovernorAlpha.sol @@ -177,20 +177,19 @@ contract GovernorAlpha { proposalCount++; Proposal storage newProposal = proposals[proposalCount]; - newProposal.id = proposalCount; - newProposal.proposer = msg.sender; - newProposal.eta = 0; - newProposal.targets = targets; - newProposal.values = values; - newProposal.signatures = signatures; - newProposal.calldatas = calldatas; - newProposal.startBlock = startBlock; - newProposal.endBlock = endBlock; - newProposal.forVotes = 0; - newProposal.againstVotes = 0; - newProposal.canceled = false; - newProposal.executed = false; - + newProposal.id = proposalCount; + newProposal.proposer = msg.sender; + newProposal.eta = 0; + newProposal.targets = targets; + newProposal.values = values; + newProposal.signatures = signatures; + newProposal.calldatas = calldatas; + newProposal.startBlock = startBlock; + newProposal.endBlock = endBlock; + newProposal.forVotes = 0; + newProposal.againstVotes = 0; + newProposal.canceled = false; + newProposal.executed = false; //proposals[newProposal.id] = newProposal; latestProposalIds[newProposal.proposer] = newProposal.id; @@ -239,7 +238,7 @@ contract GovernorAlpha { Proposal storage proposal = proposals[proposalId]; proposal.executed = true; for (uint i = 0; i < proposal.targets.length; i++) { - timelock.executeTransaction{value:proposal.values[i]}( + timelock.executeTransaction{ value: proposal.values[i] }( proposal.targets[i], proposal.values[i], proposal.signatures[i], diff --git a/contracts/Governance/GovernorAlpha2.sol b/contracts/Governance/GovernorAlpha2.sol index 9df2a8869..2393ced28 100644 --- a/contracts/Governance/GovernorAlpha2.sol +++ b/contracts/Governance/GovernorAlpha2.sol @@ -178,20 +178,19 @@ contract GovernorAlpha2 { proposalCount++; Proposal storage newProposal = proposals[proposalCount]; - newProposal.id = proposalCount; - newProposal.proposer = msg.sender; - newProposal.eta = 0; - newProposal.targets = targets; - newProposal.values = values; - newProposal.signatures = signatures; - newProposal.calldatas = calldatas; - newProposal.startBlock = startBlock; - newProposal.endBlock = endBlock; - newProposal.forVotes = 0; - newProposal.againstVotes = 0; - newProposal.canceled = false; - newProposal.executed = false; - + newProposal.id = proposalCount; + newProposal.proposer = msg.sender; + newProposal.eta = 0; + newProposal.targets = targets; + newProposal.values = values; + newProposal.signatures = signatures; + newProposal.calldatas = calldatas; + newProposal.startBlock = startBlock; + newProposal.endBlock = endBlock; + newProposal.forVotes = 0; + newProposal.againstVotes = 0; + newProposal.canceled = false; + newProposal.executed = false; //proposals[newProposal.id] = newProposal; latestProposalIds[newProposal.proposer] = newProposal.id; @@ -240,7 +239,7 @@ contract GovernorAlpha2 { Proposal storage proposal = proposals[proposalId]; proposal.executed = true; for (uint i = 0; i < proposal.targets.length; i++) { - timelock.executeTransaction{value:proposal.values[i]}( + timelock.executeTransaction{ value: proposal.values[i] }( proposal.targets[i], proposal.values[i], proposal.signatures[i], diff --git a/contracts/Governance/GovernorBravoDelegate.sol b/contracts/Governance/GovernorBravoDelegate.sol index e9c2c0655..01a61d106 100644 --- a/contracts/Governance/GovernorBravoDelegate.sol +++ b/contracts/Governance/GovernorBravoDelegate.sol @@ -152,23 +152,22 @@ contract GovernorBravoDelegate is GovernorBravoDelegateStorageV2, GovernorBravoE uint endBlock = add256(startBlock, proposalConfigs[uint8(proposalType)].votingPeriod); proposalCount++; - + Proposal storage newProposal = proposals[proposalCount]; - newProposal.id = proposalCount; - newProposal.proposer = msg.sender; - newProposal.eta = 0; - newProposal.targets = targets; - newProposal.values = values; - newProposal.signatures = signatures; - newProposal.calldatas = calldatas; - newProposal.startBlock = startBlock; - newProposal.endBlock = endBlock; - newProposal.forVotes = 0; - newProposal.againstVotes = 0; - newProposal.canceled = false; - newProposal.executed = false; - newProposal.proposalType = uint8(proposalType); - + newProposal.id = proposalCount; + newProposal.proposer = msg.sender; + newProposal.eta = 0; + newProposal.targets = targets; + newProposal.values = values; + newProposal.signatures = signatures; + newProposal.calldatas = calldatas; + newProposal.startBlock = startBlock; + newProposal.endBlock = endBlock; + newProposal.forVotes = 0; + newProposal.againstVotes = 0; + newProposal.canceled = false; + newProposal.executed = false; + newProposal.proposalType = uint8(proposalType); //proposals[newProposal.id] = newProposal; latestProposalIds[newProposal.proposer] = newProposal.id; From 56011013738d9ae5f924cb72f28fa016eb2c5ad1 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Mon, 13 Mar 2023 12:23:32 +0530 Subject: [PATCH 022/153] Fix: minor issues. --- contracts/Governance/GovernorAlpha.sol | 2 +- contracts/Governance/GovernorAlpha2.sol | 2 +- contracts/Governance/GovernorBravoDelegate.sol | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/contracts/Governance/GovernorAlpha.sol b/contracts/Governance/GovernorAlpha.sol index 62945f786..c9056c546 100644 --- a/contracts/Governance/GovernorAlpha.sol +++ b/contracts/Governance/GovernorAlpha.sol @@ -377,7 +377,7 @@ contract GovernorAlpha { return a - b; } - function getChainId() internal pure returns (uint) { + function getChainId() internal view returns (uint) { uint chainId; assembly { chainId := chainid() diff --git a/contracts/Governance/GovernorAlpha2.sol b/contracts/Governance/GovernorAlpha2.sol index 2393ced28..c951adbd9 100644 --- a/contracts/Governance/GovernorAlpha2.sol +++ b/contracts/Governance/GovernorAlpha2.sol @@ -378,7 +378,7 @@ contract GovernorAlpha2 { return a - b; } - function getChainId() internal pure returns (uint) { + function getChainId() internal view returns (uint) { uint chainId; assembly { chainId := chainid() diff --git a/contracts/Governance/GovernorBravoDelegate.sol b/contracts/Governance/GovernorBravoDelegate.sol index 01a61d106..46191e970 100644 --- a/contracts/Governance/GovernorBravoDelegate.sol +++ b/contracts/Governance/GovernorBravoDelegate.sol @@ -505,7 +505,7 @@ contract GovernorBravoDelegate is GovernorBravoDelegateStorageV2, GovernorBravoE return a - b; } - function getChainIdInternal() internal pure returns (uint) { + function getChainIdInternal() internal view returns (uint) { uint chainId; assembly { chainId := chainid() From 310b950a2d1d4cb2532bfddf87c1f7f219da6d10 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Mon, 13 Mar 2023 16:31:25 +0530 Subject: [PATCH 023/153] Fixed tests. --- .../Comptroller/liquidateCalculateAmountSeizeTest.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/tests/hardhat/Comptroller/liquidateCalculateAmountSeizeTest.ts b/tests/hardhat/Comptroller/liquidateCalculateAmountSeizeTest.ts index 889404086..5f1ffd6d8 100644 --- a/tests/hardhat/Comptroller/liquidateCalculateAmountSeizeTest.ts +++ b/tests/hardhat/Comptroller/liquidateCalculateAmountSeizeTest.ts @@ -109,14 +109,12 @@ describe("Comptroller", () => { it("fails if the repayAmount causes overflow ", async () => { await expect( calculateSeizeTokens(comptroller, vTokenBorrowed, vTokenCollateral, constants.MaxUint256), - ).to.be.revertedWith("multiplication overflow"); + ).to.be.reverted; }); it("fails if the borrowed asset price causes overflow ", async () => { setOraclePrice(vTokenBorrowed, constants.MaxUint256); - await expect(calculateSeizeTokens(comptroller, vTokenBorrowed, vTokenCollateral, repayAmount)).to.be.revertedWith( - "multiplication overflow", - ); + await expect(calculateSeizeTokens(comptroller, vTokenBorrowed, vTokenCollateral, repayAmount)).to.be.reverted; }); it("reverts if it fails to calculate the exchange rate", async () => { From 56a541f6a6eb53b1c59cbd0e7335b76ad57a253b Mon Sep 17 00:00:00 2001 From: defcon022 Date: Mon, 13 Mar 2023 16:51:22 +0530 Subject: [PATCH 024/153] Added scripts for diamond proxy. --- .../Diamond/upgradeInitialize/DiamondInit.sol | 67 +++++++++++++++ script/diamond/deploy.js | 83 +++++++++++++++++++ script/diamond/diamond.js | 80 ++++++++++++++++++ 3 files changed, 230 insertions(+) create mode 100644 contracts/Diamond/upgradeInitialize/DiamondInit.sol create mode 100644 script/diamond/deploy.js create mode 100644 script/diamond/diamond.js diff --git a/contracts/Diamond/upgradeInitialize/DiamondInit.sol b/contracts/Diamond/upgradeInitialize/DiamondInit.sol new file mode 100644 index 000000000..8939cb26d --- /dev/null +++ b/contracts/Diamond/upgradeInitialize/DiamondInit.sol @@ -0,0 +1,67 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +/******************************************************************************\ + +* Author: Nick Mudge (https://twitter.com/mudgen) + +* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535 + +* + +* Implementation of a diamond. + +/******************************************************************************/ + +import {LibDiamond} from "../libraries/LibDiamond.sol"; + +import {IDiamondLoupe} from "../interfaces/IDiamondLoupe.sol"; + +import {IDiamondCut} from "../interfaces/IDiamondCut.sol"; + +import {IMarketFacet} from "../interfaces/IMarketFacet.sol"; + +import {IPolicyFacet} from "../interfaces/IPloicyFacet.sol"; + +// It is expected that this contract is customized if you want to deploy your diamond + +// with data from a deployment script. Use the init function to initialize state variables + +// of your diamond. Add parameters to the init function if you need to. + +contract DiamondInit { + + // You can add parameters to this function in order to pass in + + // data to set your own state variables + + function init() external { + + // adding ERC165 data + + LibDiamond.DiamondStorage storage ds = LibDiamond.diamondStorage(); + + ds.supportedInterfaces[type(IMarketFacet).interfaceId] = true; + + ds.supportedInterfaces[type(IDiamondCut).interfaceId] = true; + + ds.supportedInterfaces[type(IDiamondLoupe).interfaceId] = true; + + ds.supportedInterfaces[type(IPolicyFacet).interfaceId] = true; + + // add your own state variables + + // EIP-2535 specifies that the `diamondCut` function takes two optional + + // arguments: address _init and bytes calldata _calldata + + // These arguments are used to execute an arbitrary function using delegatecall + + // in order to set state variables in the diamond during deployment or an upgrade + + // More info here: https://eips.ethereum.org/EIPS/eip-2535#diamond-interface + + } + +} \ No newline at end of file diff --git a/script/diamond/deploy.js b/script/diamond/deploy.js new file mode 100644 index 000000000..c0739ed5e --- /dev/null +++ b/script/diamond/deploy.js @@ -0,0 +1,83 @@ +require("dotenv").config(); +const hre = require("hardhat"); +const { getSelectors, FacetCutAction } = require('./diamond.js') +const ethers = hre.ethers; + +async function deployDiamond () { + const accounts = await ethers.getSigners() + const contractOwner = accounts[0] + + // deploy DiamondCutFacet + const DiamondCutFacet = await ethers.getContractFactory('DiamondCutFacet') + const diamondCutFacet = await DiamondCutFacet.deploy() + await diamondCutFacet.deployed() + console.log('DiamondCutFacet deployed:', diamondCutFacet.address) + + // deploy Diamond + const Diamond = await ethers.getContractFactory('Diamond') + const diamond = await Diamond.deploy(contractOwner.address, diamondCutFacet.address) + await diamond.deployed() + console.log('Diamond deployed:', diamond.address) + + // deploy DiamondInit + // DiamondInit provides a function that is called when the diamond is upgraded to initialize state variables + // Read about how the diamondCut function works here: https://eips.ethereum.org/EIPS/eip-2535#addingreplacingremoving-functions + const DiamondInit = await ethers.getContractFactory('DiamondInit') + const diamondInit = await DiamondInit.deploy() + await diamondInit.deployed() + console.log('DiamondInit deployed:', diamondInit.address) + + // deploy facets + console.log('') + console.log('Deploying facets') + const FacetNames = [ + 'DiamondLoupeFacet', + 'DiamondCutFacet', + 'MarketFacet', + 'PolicyFacet', + 'RewardFacet', + 'SetterFacet' + ] + const cut = [] + for (const FacetName of FacetNames) { + const Facet = await ethers.getContractFactory(FacetName) + const facet = await Facet.deploy() + await facet.deployed() + console.log(`${FacetName} deployed: ${facet.address}`) + cut.push({ + facetAddress: facet.address, + action: FacetCutAction.Add, + functionSelectors: getSelectors(facet) + }) + } + + // upgrade diamond with facets + console.log('') + console.log('Diamond Cut:', cut) + const diamondCut = await ethers.getContractAt('IDiamondCut', diamond.address) + let tx + let receipt + // call to init function + let functionCall = diamondInit.interface.encodeFunctionData('init') + tx = await diamondCut.diamondCut(cut, diamondInit.address, functionCall) + console.log('Diamond cut tx: ', tx.hash) + receipt = await tx.wait() + if (!receipt.status) { + throw Error(`Diamond upgrade failed: ${tx.hash}`) + } + console.log('Completed diamond cut') + return diamond.address +} + +// We recommend this pattern to be able to use async/await everywhere +// and properly handle errors. +if (require.main === module) { + deployDiamond() + .then(() => process.exit(0)) + .catch(error => { + console.error(error) + process.exit(1) + }) +} + +exports.deployDiamond = deployDiamond diff --git a/script/diamond/diamond.js b/script/diamond/diamond.js new file mode 100644 index 000000000..7302731cd --- /dev/null +++ b/script/diamond/diamond.js @@ -0,0 +1,80 @@ +const FacetCutAction = { Add: 0, Replace: 1, Remove: 2 } + +// get function selectors from ABI +function getSelectors (contract) { + const signatures = Object.keys(contract.interface.functions) + const selectors = signatures.reduce((acc, val) => { + if (val !== 'init(bytes)') { + acc.push(contract.interface.getSighash(val)) + } + return acc + }, []) + selectors.contract = contract + selectors.remove = remove + selectors.get = get + return selectors +} + +// get function selector from function signature +function getSelector (func) { + const abiInterface = new ethers.utils.Interface([func]) + return abiInterface.getSighash(ethers.utils.Fragment.from(func)) +} + +// used with getSelectors to remove selectors from an array of selectors +// functionNames argument is an array of function signatures +function remove (functionNames) { + const selectors = this.filter((v) => { + for (const functionName of functionNames) { + if (v === this.contract.interface.getSighash(functionName)) { + return false + } + } + return true + }) + selectors.contract = this.contract + selectors.remove = this.remove + selectors.get = this.get + return selectors +} + +// used with getSelectors to get selectors from an array of selectors +// functionNames argument is an array of function signatures +function get (functionNames) { + const selectors = this.filter((v) => { + for (const functionName of functionNames) { + if (v === this.contract.interface.getSighash(functionName)) { + return true + } + } + return false + }) + selectors.contract = this.contract + selectors.remove = this.remove + selectors.get = this.get + return selectors +} + +// remove selectors using an array of signatures +function removeSelectors (selectors, signatures) { + const iface = new ethers.utils.Interface(signatures.map(v => 'function ' + v)) + const removeSelectors = signatures.map(v => iface.getSighash(v)) + selectors = selectors.filter(v => !removeSelectors.includes(v)) + return selectors +} + +// find a particular address position in the return value of diamondLoupeFacet.facets() +function findAddressPositionInFacets (facetAddress, facets) { + for (let i = 0; i < facets.length; i++) { + if (facets[i].facetAddress === facetAddress) { + return i + } + } +} + +exports.getSelectors = getSelectors +exports.getSelector = getSelector +exports.FacetCutAction = FacetCutAction +exports.remove = remove +exports.removeSelectors = removeSelectors +exports.findAddressPositionInFacets = findAddressPositionInFacets From f819efe5f2f1d1b9d9f920bae43fc96610e45c3c Mon Sep 17 00:00:00 2001 From: defcon022 Date: Wed, 15 Mar 2023 16:51:47 +0530 Subject: [PATCH 025/153] Fixed some issues. --- .../{ComptrollerDiamond.sol => Diamond.sol} | 8 +- contracts/Diamond/facets/DiamondCutFacet.sol | 2 +- contracts/Diamond/facets/SetterFacet.sol | 5 - contracts/Diamond/libraries/LibDiamond.sol | 2 +- script/diamond/deploy.js | 16 ++- .../Comptroller/Diamond/accessControl.ts | 123 ++++++++++++++++++ 6 files changed, 145 insertions(+), 11 deletions(-) rename contracts/Diamond/{ComptrollerDiamond.sol => Diamond.sol} (86%) create mode 100644 tests/hardhat/Comptroller/Diamond/accessControl.ts diff --git a/contracts/Diamond/ComptrollerDiamond.sol b/contracts/Diamond/Diamond.sol similarity index 86% rename from contracts/Diamond/ComptrollerDiamond.sol rename to contracts/Diamond/Diamond.sol index b5cf83dc9..fe0efd289 100644 --- a/contracts/Diamond/ComptrollerDiamond.sol +++ b/contracts/Diamond/Diamond.sol @@ -2,6 +2,7 @@ pragma solidity 0.8.13; import { LibDiamond } from "./libraries/LibDiamond.sol"; import { IDiamondCut } from "./interfaces/IDiamondCut.sol"; +import "../Comptroller/Unitroller.sol"; contract Diamond { constructor(address _contractOwner, address _diamondCutFacet) payable { @@ -16,7 +17,12 @@ contract Diamond { action: IDiamondCut.FacetCutAction.Add, functionSelectors: functionSelectors }); - LibDiamond.diamondCut(cut, address(0), ""); + LibDiamond.libDiamondCut(cut, address(0), ""); + } + + function _become(Unitroller unitroller) external { + require(msg.sender == unitroller.admin(), "only unitroller admin can"); + require(unitroller._acceptImplementation() == 0, "not authorized"); } // Find facet for function that is called and execute the diff --git a/contracts/Diamond/facets/DiamondCutFacet.sol b/contracts/Diamond/facets/DiamondCutFacet.sol index 83dd9a99e..7d347540a 100644 --- a/contracts/Diamond/facets/DiamondCutFacet.sol +++ b/contracts/Diamond/facets/DiamondCutFacet.sol @@ -15,6 +15,6 @@ contract DiamondCutFacet is IDiamondCut { /// _calldata is executed with delegatecall on _init function diamondCut(FacetCut[] calldata _diamondCut, address _init, bytes calldata _calldata) external override { LibDiamond.enforceIsContractOwner(); - LibDiamond.diamondCut(_diamondCut, _init, _calldata); + LibDiamond.libDiamondCut(_diamondCut, _init, _calldata); } } diff --git a/contracts/Diamond/facets/SetterFacet.sol b/contracts/Diamond/facets/SetterFacet.sol index b7df42d32..28320ba8e 100644 --- a/contracts/Diamond/facets/SetterFacet.sol +++ b/contracts/Diamond/facets/SetterFacet.sol @@ -373,11 +373,6 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError { return uint(Error.NO_ERROR); } - function _become(Unitroller unitroller) external { - require(msg.sender == unitroller.admin(), "only unitroller admin can"); - require(unitroller._acceptImplementation() == 0, "not authorized"); - } - /*** Venus Distribution ***/ /** diff --git a/contracts/Diamond/libraries/LibDiamond.sol b/contracts/Diamond/libraries/LibDiamond.sol index f67365a2b..ff76bb2b2 100644 --- a/contracts/Diamond/libraries/LibDiamond.sol +++ b/contracts/Diamond/libraries/LibDiamond.sol @@ -62,7 +62,7 @@ library LibDiamond { event DiamondCut(IDiamondCut.FacetCut[] _diamondCut, address _init, bytes _calldata); // Internal function version of diamondCut - function diamondCut(IDiamondCut.FacetCut[] memory _diamondCut, address _init, bytes memory _calldata) internal { + function libDiamondCut(IDiamondCut.FacetCut[] memory _diamondCut, address _init, bytes memory _calldata) internal { for (uint256 facetIndex; facetIndex < _diamondCut.length; facetIndex++) { IDiamondCut.FacetCutAction action = _diamondCut[facetIndex].action; if (action == IDiamondCut.FacetCutAction.Add) { diff --git a/script/diamond/deploy.js b/script/diamond/deploy.js index c0739ed5e..065cd8a1d 100644 --- a/script/diamond/deploy.js +++ b/script/diamond/deploy.js @@ -32,15 +32,24 @@ async function deployDiamond () { console.log('Deploying facets') const FacetNames = [ 'DiamondLoupeFacet', - 'DiamondCutFacet', 'MarketFacet', 'PolicyFacet', 'RewardFacet', 'SetterFacet' ] const cut = [] + let index = 0; for (const FacetName of FacetNames) { - const Facet = await ethers.getContractFactory(FacetName) + let Facet; + if(index > 0 && index < 4){ + Facet = await ethers.getContractFactory(FacetName,{ + libraries:{ + LibAccessCheck:await accounts[3].getAddress() + } + }) + }else{ + Facet = await ethers.getContractFactory(FacetName) + } const facet = await Facet.deploy() await facet.deployed() console.log(`${FacetName} deployed: ${facet.address}`) @@ -49,6 +58,7 @@ async function deployDiamond () { action: FacetCutAction.Add, functionSelectors: getSelectors(facet) }) + index++; } // upgrade diamond with facets @@ -66,7 +76,7 @@ async function deployDiamond () { throw Error(`Diamond upgrade failed: ${tx.hash}`) } console.log('Completed diamond cut') - return diamond.address + return diamond } // We recommend this pattern to be able to use async/await everywhere diff --git a/tests/hardhat/Comptroller/Diamond/accessControl.ts b/tests/hardhat/Comptroller/Diamond/accessControl.ts new file mode 100644 index 000000000..4bd001105 --- /dev/null +++ b/tests/hardhat/Comptroller/Diamond/accessControl.ts @@ -0,0 +1,123 @@ +import { FakeContract, MockContract, smock } from "@defi-wonderland/smock"; +import chai from "chai"; +import { Signer, constants } from "ethers"; +import { ethers } from "hardhat"; + +import { Comptroller, Comptroller__factory, IAccessControlManager, Unitroller } from "../../../typechain"; +const { deployDiamond } = require('../../../../script/diamond/deploy'); +const { expect } = chai; +chai.use(smock.matchers); + +describe.only("Comptroller", () => { + let user: Signer; + let userAddress: string; + let comptroller: MockContract; + let accessControl: FakeContract; + let unitroller: MockContract; + let comptrollerProxy: MockContract; + + beforeEach(async () => { + const signers = await ethers.getSigners(); + user = signers[1]; + userAddress = await user.getAddress(); + // const ComptrollerFactory = await smock.mock("Comptroller"); + comptroller = await deployDiamond(); + console.log("comp add" , comptroller.address); + + const UnitrollerFactory = await smock.mock("Unitroller"); + + unitroller = await UnitrollerFactory.deploy(); + await unitroller._setPendingImplementation(comptroller.address); + const add = await unitroller.pendingComptrollerImplementation(); + console.log(add); + await comptroller._become(unitroller.address); + console.log("++++++"); + const compAdd = await unitroller.comptrollerImplementation(); + console.log(compAdd); + // accessControl = await smock.fake("AccessControlManager"); + comptrollerProxy = await ethers.getContractAt("Comptroller", unitroller.address); + }); + + describe("_setAccessControlManager", () => { + it.only("Reverts if called by non-admin", async () => { + expect(comptrollerProxy.connect(user)._setAccessControl(userAddress)).to.be.revertedWith("only admin can"); + }); + + it("Reverts if ACM is zero address", async () => { + expect(comptrollerProxy._setAccessControl(constants.AddressZero)).to.be.revertedWith("can't be zero address"); + }); + + it("Sets ACM address in storage", async () => { + expect(await comptrollerProxy._setAccessControl(accessControl.address)) + .to.emit(comptroller, "NewAccessControl") + .withArgs(constants.AddressZero, accessControl.address); + expect(await comptrollerProxy.getVariable("accessControl")).to.equal(accessControl.address); + }); + }); + + describe("Access Control", () => { + beforeEach(async () => { + await comptrollerProxy._setAccessControl(accessControl.address); + }); + + describe("setCollateralFactor", () => { + it("Should have AccessControl", async () => { + await expect( + comptroller.connect(user)._setCollateralFactor(ethers.constants.AddressZero, 0), + ).to.be.revertedWith("access denied"); + expect(accessControl.isAllowedToCall).to.be.calledOnceWith( + userAddress, + "_setCollateralFactor(address,uint256)", + ); + }); + }); + describe("setLiquidationIncentive", () => { + it("Should have AccessControl", async () => { + await expect(comptroller.connect(user)._setLiquidationIncentive(0)).to.be.revertedWith("access denied"); + expect(accessControl.isAllowedToCall).to.be.calledOnceWith(userAddress, "_setLiquidationIncentive(uint256)"); + }); + }); + describe("setMarketBorrowCaps", () => { + it("Should have AccessControl", async () => { + await expect(comptroller.connect(user)._setMarketBorrowCaps([], [])).to.be.revertedWith("access denied"); + + expect(accessControl.isAllowedToCall).to.be.calledOnceWith( + userAddress, + "_setMarketBorrowCaps(address[],uint256[])", + ); + }); + }); + describe("setMarketSupplyCaps", () => { + it("Should have AccessControl", async () => { + await expect(comptroller.connect(user)._setMarketSupplyCaps([], [])).to.be.revertedWith("access denied"); + expect(accessControl.isAllowedToCall).to.be.calledOnceWith( + userAddress, + "_setMarketSupplyCaps(address[],uint256[])", + ); + }); + }); + describe("setProtocolPaused", () => { + it("Should have AccessControl", async () => { + await expect(comptroller.connect(user)._setProtocolPaused(true)).to.be.revertedWith("access denied"); + expect(accessControl.isAllowedToCall).to.be.calledOnceWith(userAddress, "_setProtocolPaused(bool)"); + }); + }); + describe("setActionsPaused", () => { + it("Should have AccessControl", async () => { + await expect(comptroller.connect(user)._setActionsPaused([], [], true)).to.be.revertedWith("access denied"); + expect(accessControl.isAllowedToCall).to.be.calledOnceWith( + userAddress, + "_setActionsPaused(address[],uint256[],bool)", + ); + }); + }); + describe("supportMarket", () => { + it("Should have AccessControl", async () => { + await expect(comptroller.connect(user)._supportMarket(ethers.constants.AddressZero)).to.be.revertedWith( + "access denied", + ); + expect(accessControl.isAllowedToCall).to.be.calledOnceWith(userAddress, "_supportMarket(address)"); + }); + }); + }); +}); From 2f61258a3506289e9ee49a8a6cf7c39a87319ca4 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Fri, 17 Mar 2023 16:38:49 +0530 Subject: [PATCH 026/153] Fixed diamond proxy issue. --- contracts/Diamond/Diamond.sol | 9 ++++++++- contracts/Diamond/facets/DiamondCutFacet.sol | 5 ++++- contracts/Tokens/VAI/lib.sol | 2 +- script/diamond/deploy.js | 15 ++++++++++++--- .../Comptroller/Diamond/accessControl.ts | 19 ++----------------- 5 files changed, 27 insertions(+), 23 deletions(-) diff --git a/contracts/Diamond/Diamond.sol b/contracts/Diamond/Diamond.sol index fe0efd289..ed4d05b37 100644 --- a/contracts/Diamond/Diamond.sol +++ b/contracts/Diamond/Diamond.sol @@ -1,13 +1,20 @@ pragma solidity 0.8.13; import { LibDiamond } from "./libraries/LibDiamond.sol"; +import { AppStorage } from "./libraries/appStorage.sol"; + import { IDiamondCut } from "./interfaces/IDiamondCut.sol"; import "../Comptroller/Unitroller.sol"; contract Diamond { - constructor(address _contractOwner, address _diamondCutFacet) payable { + AppStorage internal s; + + constructor(address _contractOwner) payable { LibDiamond.setContractOwner(_contractOwner); + } + function facetCutInitilizer(address _diamondCutFacet) external { + require(s.admin == msg.sender, "Owner check"); // Add the diamondCut external function from the diamondCutFacet IDiamondCut.FacetCut[] memory cut = new IDiamondCut.FacetCut[](1); bytes4[] memory functionSelectors = new bytes4[](1); diff --git a/contracts/Diamond/facets/DiamondCutFacet.sol b/contracts/Diamond/facets/DiamondCutFacet.sol index 7d347540a..b023f27e4 100644 --- a/contracts/Diamond/facets/DiamondCutFacet.sol +++ b/contracts/Diamond/facets/DiamondCutFacet.sol @@ -2,11 +2,14 @@ pragma solidity 0.8.13; import { IDiamondCut } from "../interfaces/IDiamondCut.sol"; import { LibDiamond } from "../libraries/LibDiamond.sol"; +import { AppStorage } from "../libraries/appStorage.sol"; // Remember to add the loupe functions from DiamondLoupeFacet to the diamond. // The loupe functions are required by the EIP2535 Diamonds standard contract DiamondCutFacet is IDiamondCut { + AppStorage internal s; + /// @notice Add/replace/remove any number of functions and optionally execute /// a function with delegatecall /// @param _diamondCut Contains the facet addresses and function selectors @@ -14,7 +17,7 @@ contract DiamondCutFacet is IDiamondCut { /// @param _calldata A function call, including function selector and arguments /// _calldata is executed with delegatecall on _init function diamondCut(FacetCut[] calldata _diamondCut, address _init, bytes calldata _calldata) external override { - LibDiamond.enforceIsContractOwner(); + require(s.admin == msg.sender, "Owner check"); LibDiamond.libDiamondCut(_diamondCut, _init, _calldata); } } diff --git a/contracts/Tokens/VAI/lib.sol b/contracts/Tokens/VAI/lib.sol index 9eef24883..e6e9cb5ae 100644 --- a/contracts/Tokens/VAI/lib.sol +++ b/contracts/Tokens/VAI/lib.sol @@ -29,7 +29,7 @@ contract LibNote { assembly { // log an 'anonymous' event with a constant 6 words of calldata // and four indexed topics: selector, caller, arg1 and arg2 - let mark := msize() // end of memory ensures zero + let mark := 0 // end of memory ensures zero mstore(0x40, add(mark, 288)) // update free memory pointer mstore(mark, 0x20) // bytes type data offset mstore(add(mark, 0x20), 224) // bytes size (padded) diff --git a/script/diamond/deploy.js b/script/diamond/deploy.js index 065cd8a1d..274b66af2 100644 --- a/script/diamond/deploy.js +++ b/script/diamond/deploy.js @@ -15,9 +15,18 @@ async function deployDiamond () { // deploy Diamond const Diamond = await ethers.getContractFactory('Diamond') - const diamond = await Diamond.deploy(contractOwner.address, diamondCutFacet.address) + const diamond = await Diamond.deploy(contractOwner.address) await diamond.deployed() console.log('Diamond deployed:', diamond.address) + + const UnitrollerFactory = await ethers.getContractFactory("Unitroller"); + const unitroller = await UnitrollerFactory.deploy(); + await unitroller._setPendingImplementation(diamond.address); + await diamond._become(unitroller.address); + + const compProxy = await ethers.getContractAt('Diamond', unitroller.address) + + await compProxy.facetCutInitilizer(diamondCutFacet.address); // deploy DiamondInit // DiamondInit provides a function that is called when the diamond is upgraded to initialize state variables @@ -64,7 +73,7 @@ async function deployDiamond () { // upgrade diamond with facets console.log('') console.log('Diamond Cut:', cut) - const diamondCut = await ethers.getContractAt('IDiamondCut', diamond.address) + const diamondCut = await ethers.getContractAt('IDiamondCut', unitroller.address) let tx let receipt // call to init function @@ -76,7 +85,7 @@ async function deployDiamond () { throw Error(`Diamond upgrade failed: ${tx.hash}`) } console.log('Completed diamond cut') - return diamond + return unitroller } // We recommend this pattern to be able to use async/await everywhere diff --git a/tests/hardhat/Comptroller/Diamond/accessControl.ts b/tests/hardhat/Comptroller/Diamond/accessControl.ts index 4bd001105..1c42c8157 100644 --- a/tests/hardhat/Comptroller/Diamond/accessControl.ts +++ b/tests/hardhat/Comptroller/Diamond/accessControl.ts @@ -3,7 +3,7 @@ import chai from "chai"; import { Signer, constants } from "ethers"; import { ethers } from "hardhat"; -import { Comptroller, Comptroller__factory, IAccessControlManager, Unitroller } from "../../../typechain"; +import { Comptroller, Comptroller__factory, IAccessControlManager } from "../../../typechain"; const { deployDiamond } = require('../../../../script/diamond/deploy'); const { expect } = chai; chai.use(smock.matchers); @@ -13,29 +13,14 @@ describe.only("Comptroller", () => { let userAddress: string; let comptroller: MockContract; let accessControl: FakeContract; - let unitroller: MockContract; let comptrollerProxy: MockContract; beforeEach(async () => { const signers = await ethers.getSigners(); user = signers[1]; userAddress = await user.getAddress(); - // const ComptrollerFactory = await smock.mock("Comptroller"); comptroller = await deployDiamond(); - console.log("comp add" , comptroller.address); - - const UnitrollerFactory = await smock.mock("Unitroller"); - - unitroller = await UnitrollerFactory.deploy(); - await unitroller._setPendingImplementation(comptroller.address); - const add = await unitroller.pendingComptrollerImplementation(); - console.log(add); - await comptroller._become(unitroller.address); - console.log("++++++"); - const compAdd = await unitroller.comptrollerImplementation(); - console.log(compAdd); - // accessControl = await smock.fake("AccessControlManager"); - comptrollerProxy = await ethers.getContractAt("Comptroller", unitroller.address); + comptrollerProxy = await ethers.getContractAt("Comptroller", comptroller.address); }); describe("_setAccessControlManager", () => { From 12ee21961c26eb53c5be54bc1a33d8bf9cc5ee9d Mon Sep 17 00:00:00 2001 From: defcon022 Date: Fri, 17 Mar 2023 17:50:32 +0530 Subject: [PATCH 027/153] Added access control tests for diamond proxy. --- script/diamond/deploy.js | 10 ---------- .../Comptroller/Diamond/accessControl.ts | 20 +++++++++---------- 2 files changed, 10 insertions(+), 20 deletions(-) diff --git a/script/diamond/deploy.js b/script/diamond/deploy.js index 274b66af2..6259fa0d1 100644 --- a/script/diamond/deploy.js +++ b/script/diamond/deploy.js @@ -11,13 +11,11 @@ async function deployDiamond () { const DiamondCutFacet = await ethers.getContractFactory('DiamondCutFacet') const diamondCutFacet = await DiamondCutFacet.deploy() await diamondCutFacet.deployed() - console.log('DiamondCutFacet deployed:', diamondCutFacet.address) // deploy Diamond const Diamond = await ethers.getContractFactory('Diamond') const diamond = await Diamond.deploy(contractOwner.address) await diamond.deployed() - console.log('Diamond deployed:', diamond.address) const UnitrollerFactory = await ethers.getContractFactory("Unitroller"); const unitroller = await UnitrollerFactory.deploy(); @@ -34,11 +32,8 @@ async function deployDiamond () { const DiamondInit = await ethers.getContractFactory('DiamondInit') const diamondInit = await DiamondInit.deploy() await diamondInit.deployed() - console.log('DiamondInit deployed:', diamondInit.address) // deploy facets - console.log('') - console.log('Deploying facets') const FacetNames = [ 'DiamondLoupeFacet', 'MarketFacet', @@ -61,7 +56,6 @@ async function deployDiamond () { } const facet = await Facet.deploy() await facet.deployed() - console.log(`${FacetName} deployed: ${facet.address}`) cut.push({ facetAddress: facet.address, action: FacetCutAction.Add, @@ -71,20 +65,16 @@ async function deployDiamond () { } // upgrade diamond with facets - console.log('') - console.log('Diamond Cut:', cut) const diamondCut = await ethers.getContractAt('IDiamondCut', unitroller.address) let tx let receipt // call to init function let functionCall = diamondInit.interface.encodeFunctionData('init') tx = await diamondCut.diamondCut(cut, diamondInit.address, functionCall) - console.log('Diamond cut tx: ', tx.hash) receipt = await tx.wait() if (!receipt.status) { throw Error(`Diamond upgrade failed: ${tx.hash}`) } - console.log('Completed diamond cut') return unitroller } diff --git a/tests/hardhat/Comptroller/Diamond/accessControl.ts b/tests/hardhat/Comptroller/Diamond/accessControl.ts index 1c42c8157..c6bc93ac3 100644 --- a/tests/hardhat/Comptroller/Diamond/accessControl.ts +++ b/tests/hardhat/Comptroller/Diamond/accessControl.ts @@ -8,7 +8,7 @@ const { deployDiamond } = require('../../../../script/diamond/deploy'); const { expect } = chai; chai.use(smock.matchers); -describe.only("Comptroller", () => { +describe("Comptroller", () => { let user: Signer; let userAddress: string; let comptroller: MockContract; @@ -20,11 +20,12 @@ describe.only("Comptroller", () => { user = signers[1]; userAddress = await user.getAddress(); comptroller = await deployDiamond(); + accessControl = await smock.fake("IAccessControlManager"); comptrollerProxy = await ethers.getContractAt("Comptroller", comptroller.address); }); describe("_setAccessControlManager", () => { - it.only("Reverts if called by non-admin", async () => { + it("Reverts if called by non-admin", async () => { expect(comptrollerProxy.connect(user)._setAccessControl(userAddress)).to.be.revertedWith("only admin can"); }); @@ -36,7 +37,6 @@ describe.only("Comptroller", () => { expect(await comptrollerProxy._setAccessControl(accessControl.address)) .to.emit(comptroller, "NewAccessControl") .withArgs(constants.AddressZero, accessControl.address); - expect(await comptrollerProxy.getVariable("accessControl")).to.equal(accessControl.address); }); }); @@ -48,7 +48,7 @@ describe.only("Comptroller", () => { describe("setCollateralFactor", () => { it("Should have AccessControl", async () => { await expect( - comptroller.connect(user)._setCollateralFactor(ethers.constants.AddressZero, 0), + comptrollerProxy.connect(user)._setCollateralFactor(ethers.constants.AddressZero, 0), ).to.be.revertedWith("access denied"); expect(accessControl.isAllowedToCall).to.be.calledOnceWith( userAddress, @@ -58,13 +58,13 @@ describe.only("Comptroller", () => { }); describe("setLiquidationIncentive", () => { it("Should have AccessControl", async () => { - await expect(comptroller.connect(user)._setLiquidationIncentive(0)).to.be.revertedWith("access denied"); + await expect(comptrollerProxy.connect(user)._setLiquidationIncentive(0)).to.be.revertedWith("access denied"); expect(accessControl.isAllowedToCall).to.be.calledOnceWith(userAddress, "_setLiquidationIncentive(uint256)"); }); }); describe("setMarketBorrowCaps", () => { it("Should have AccessControl", async () => { - await expect(comptroller.connect(user)._setMarketBorrowCaps([], [])).to.be.revertedWith("access denied"); + await expect(comptrollerProxy.connect(user)._setMarketBorrowCaps([], [])).to.be.revertedWith("access denied"); expect(accessControl.isAllowedToCall).to.be.calledOnceWith( userAddress, @@ -74,7 +74,7 @@ describe.only("Comptroller", () => { }); describe("setMarketSupplyCaps", () => { it("Should have AccessControl", async () => { - await expect(comptroller.connect(user)._setMarketSupplyCaps([], [])).to.be.revertedWith("access denied"); + await expect(comptrollerProxy.connect(user)._setMarketSupplyCaps([], [])).to.be.revertedWith("access denied"); expect(accessControl.isAllowedToCall).to.be.calledOnceWith( userAddress, "_setMarketSupplyCaps(address[],uint256[])", @@ -83,13 +83,13 @@ describe.only("Comptroller", () => { }); describe("setProtocolPaused", () => { it("Should have AccessControl", async () => { - await expect(comptroller.connect(user)._setProtocolPaused(true)).to.be.revertedWith("access denied"); + await expect(comptrollerProxy.connect(user)._setProtocolPaused(true)).to.be.revertedWith("access denied"); expect(accessControl.isAllowedToCall).to.be.calledOnceWith(userAddress, "_setProtocolPaused(bool)"); }); }); describe("setActionsPaused", () => { it("Should have AccessControl", async () => { - await expect(comptroller.connect(user)._setActionsPaused([], [], true)).to.be.revertedWith("access denied"); + await expect(comptrollerProxy.connect(user)._setActionsPaused([], [], true)).to.be.revertedWith("access denied"); expect(accessControl.isAllowedToCall).to.be.calledOnceWith( userAddress, "_setActionsPaused(address[],uint256[],bool)", @@ -98,7 +98,7 @@ describe.only("Comptroller", () => { }); describe("supportMarket", () => { it("Should have AccessControl", async () => { - await expect(comptroller.connect(user)._supportMarket(ethers.constants.AddressZero)).to.be.revertedWith( + await expect(comptrollerProxy.connect(user)._supportMarket(ethers.constants.AddressZero)).to.be.revertedWith( "access denied", ); expect(accessControl.isAllowedToCall).to.be.calledOnceWith(userAddress, "_supportMarket(address)"); From 910103e002005b68848ccb4cedd8e44120eb8b3f Mon Sep 17 00:00:00 2001 From: defcon022 Date: Mon, 20 Mar 2023 12:40:43 +0530 Subject: [PATCH 028/153] Refactored diamond proxy deployment script. --- contracts/Diamond/Diamond.sol | 2 +- contracts/Diamond/facets/MarketFacet.sol | 44 ++++++++- contracts/Diamond/facets/PolicyFacet.sol | 5 +- contracts/Diamond/libraries/appStorage.sol | 2 +- .../Diamond/upgradeInitialize/DiamondInit.sol | 16 ++-- contracts/Lens/ComptrollerLens.sol | 1 + script/diamond/deploy.js | 88 +++++++++--------- script/diamond/diamond.js | 90 +++++++++---------- .../Comptroller/Diamond/accessControl.ts | 11 ++- .../liquidateCalculateAmountSeizeTest.ts | 5 +- 10 files changed, 150 insertions(+), 114 deletions(-) diff --git a/contracts/Diamond/Diamond.sol b/contracts/Diamond/Diamond.sol index ed4d05b37..f75b8e76b 100644 --- a/contracts/Diamond/Diamond.sol +++ b/contracts/Diamond/Diamond.sol @@ -4,7 +4,7 @@ import { LibDiamond } from "./libraries/LibDiamond.sol"; import { AppStorage } from "./libraries/appStorage.sol"; import { IDiamondCut } from "./interfaces/IDiamondCut.sol"; -import "../Comptroller/Unitroller.sol"; +import "../Comptroller/Unitroller.sol"; contract Diamond { AppStorage internal s; diff --git a/contracts/Diamond/facets/MarketFacet.sol b/contracts/Diamond/facets/MarketFacet.sol index ceeff6b28..be8c563c0 100644 --- a/contracts/Diamond/facets/MarketFacet.sol +++ b/contracts/Diamond/facets/MarketFacet.sol @@ -23,6 +23,48 @@ contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError { return s.accountAssets[account]; } + function oracle() external view returns (PriceOracle) { + return s.oracle; + } + + function markets(address vToken) external view returns (bool, uint, bool) { + return (s.markets[vToken].isListed, s.markets[vToken].collateralFactorMantissa, s.markets[vToken].isVenus); + } + + function vaiController() external view returns (VAIControllerInterface) { + return s.vaiController; + } + + function comptrollerLens() external view returns (ComptrollerLensInterface) { + return s.comptrollerLens; + } + + function liquidationIncentiveMantissa() external view returns (uint) { + return s.liquidationIncentiveMantissa; + } + + /** + * @notice Calculate number of tokens of collateral asset to seize given an underlying amount + * @dev Used in liquidation (called in vToken.liquidateBorrowFresh) + * @param vTokenBorrowed The address of the borrowed vToken + * @param vTokenCollateral The address of the collateral vToken + * @param actualRepayAmount The amount of vTokenBorrowed underlying to convert into vTokenCollateral tokens + * @return (errorCode, number of vTokenCollateral tokens to be seized in a liquidation) + */ + function liquidateCalculateSeizeTokens( + address vTokenBorrowed, + address vTokenCollateral, + uint actualRepayAmount + ) external view returns (uint, uint) { + (uint err, uint seizeTokens) = s.comptrollerLens.liquidateCalculateSeizeTokens( + address(this), + vTokenBorrowed, + vTokenCollateral, + actualRepayAmount + ); + return (err, seizeTokens); + } + /** * @notice Returns whether the given account is entered in the given asset * @param account The address of the account to check @@ -140,7 +182,7 @@ contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError { } function _initializeMarket(address vToken) internal { - uint32 blockNumber = safe32(LibAccessCheck.getBlockNumber(), "block number exceeds 32 bits"); + uint blockNumber = block.number; VenusMarketState storage supplyState = s.venusSupplyState[vToken]; VenusMarketState storage borrowState = s.venusBorrowState[vToken]; diff --git a/contracts/Diamond/facets/PolicyFacet.sol b/contracts/Diamond/facets/PolicyFacet.sol index ebcb7261c..61526e15c 100644 --- a/contracts/Diamond/facets/PolicyFacet.sol +++ b/contracts/Diamond/facets/PolicyFacet.sol @@ -424,7 +424,7 @@ contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError { function updateVenusBorrowIndex(address vToken, ExponentialNoError.Exp memory marketBorrowIndex) internal { VenusMarketState storage borrowState = s.venusBorrowState[vToken]; uint borrowSpeed = s.venusBorrowSpeeds[vToken]; - uint32 blockNumber = safe32(LibAccessCheck.getBlockNumber(), "block number exceeds 32 bits"); + uint blockNumber = block.number; uint deltaBlocks = sub_(uint(blockNumber), uint(borrowState.block)); if (deltaBlocks > 0 && borrowSpeed > 0) { uint borrowAmount = div_(VToken(vToken).totalBorrows(), marketBorrowIndex); @@ -447,7 +447,8 @@ contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError { function updateVenusSupplyIndex(address vToken) internal { VenusMarketState storage supplyState = s.venusSupplyState[vToken]; uint supplySpeed = s.venusSupplySpeeds[vToken]; - uint32 blockNumber = safe32(LibAccessCheck.getBlockNumber(), "block number exceeds 32 bits"); + uint blockNumber = block.number; + uint deltaBlocks = sub_(uint(blockNumber), uint(supplyState.block)); if (deltaBlocks > 0 && supplySpeed > 0) { uint supplyTokens = VToken(vToken).totalSupply(); diff --git a/contracts/Diamond/libraries/appStorage.sol b/contracts/Diamond/libraries/appStorage.sol index e4c647867..28cc8518f 100644 --- a/contracts/Diamond/libraries/appStorage.sol +++ b/contracts/Diamond/libraries/appStorage.sol @@ -24,7 +24,7 @@ struct VenusMarketState { /// @notice The market's last updated venusBorrowIndex or venusSupplyIndex uint224 index; /// @notice The block number the index was last updated at - uint32 block; + uint block; } struct AppStorage { diff --git a/contracts/Diamond/upgradeInitialize/DiamondInit.sol b/contracts/Diamond/upgradeInitialize/DiamondInit.sol index 8939cb26d..0181f64a5 100644 --- a/contracts/Diamond/upgradeInitialize/DiamondInit.sol +++ b/contracts/Diamond/upgradeInitialize/DiamondInit.sol @@ -14,15 +14,15 @@ pragma solidity ^0.8.0; /******************************************************************************/ -import {LibDiamond} from "../libraries/LibDiamond.sol"; +import { LibDiamond } from "../libraries/LibDiamond.sol"; -import {IDiamondLoupe} from "../interfaces/IDiamondLoupe.sol"; +import { IDiamondLoupe } from "../interfaces/IDiamondLoupe.sol"; -import {IDiamondCut} from "../interfaces/IDiamondCut.sol"; +import { IDiamondCut } from "../interfaces/IDiamondCut.sol"; -import {IMarketFacet} from "../interfaces/IMarketFacet.sol"; +import { IMarketFacet } from "../interfaces/IMarketFacet.sol"; -import {IPolicyFacet} from "../interfaces/IPloicyFacet.sol"; +import { IPolicyFacet } from "../interfaces/IPloicyFacet.sol"; // It is expected that this contract is customized if you want to deploy your diamond @@ -31,13 +31,11 @@ import {IPolicyFacet} from "../interfaces/IPloicyFacet.sol"; // of your diamond. Add parameters to the init function if you need to. contract DiamondInit { - // You can add parameters to this function in order to pass in // data to set your own state variables function init() external { - // adding ERC165 data LibDiamond.DiamondStorage storage ds = LibDiamond.diamondStorage(); @@ -61,7 +59,5 @@ contract DiamondInit { // in order to set state variables in the diamond during deployment or an upgrade // More info here: https://eips.ethereum.org/EIPS/eip-2535#diamond-interface - } - -} \ No newline at end of file +} diff --git a/contracts/Lens/ComptrollerLens.sol b/contracts/Lens/ComptrollerLens.sol index c474d843c..cbc609028 100644 --- a/contracts/Lens/ComptrollerLens.sol +++ b/contracts/Lens/ComptrollerLens.sol @@ -8,6 +8,7 @@ import "../Oracle/PriceOracle.sol"; import "../Utils/ErrorReporter.sol"; import "../Comptroller/Comptroller.sol"; import "../Tokens/VAI/VAIControllerInterface.sol"; +import "../Diamond/facets/MarketFacet.sol"; contract ComptrollerLens is ComptrollerLensInterface, ComptrollerErrorReporter, ExponentialNoError { /** diff --git a/script/diamond/deploy.js b/script/diamond/deploy.js index 6259fa0d1..2ad98af03 100644 --- a/script/diamond/deploy.js +++ b/script/diamond/deploy.js @@ -1,81 +1,75 @@ require("dotenv").config(); const hre = require("hardhat"); -const { getSelectors, FacetCutAction } = require('./diamond.js') +const { getSelectors, FacetCutAction } = require("./diamond.js"); const ethers = hre.ethers; -async function deployDiamond () { - const accounts = await ethers.getSigners() - const contractOwner = accounts[0] +async function deployDiamond() { + const accounts = await ethers.getSigners(); + const contractOwner = accounts[0]; // deploy DiamondCutFacet - const DiamondCutFacet = await ethers.getContractFactory('DiamondCutFacet') - const diamondCutFacet = await DiamondCutFacet.deploy() - await diamondCutFacet.deployed() + const DiamondCutFacet = await ethers.getContractFactory("DiamondCutFacet"); + const diamondCutFacet = await DiamondCutFacet.deploy(); + await diamondCutFacet.deployed(); // deploy Diamond - const Diamond = await ethers.getContractFactory('Diamond') - const diamond = await Diamond.deploy(contractOwner.address) - await diamond.deployed() - + const Diamond = await ethers.getContractFactory("Diamond"); + const diamond = await Diamond.deploy(contractOwner.address); + await diamond.deployed(); + const UnitrollerFactory = await ethers.getContractFactory("Unitroller"); const unitroller = await UnitrollerFactory.deploy(); await unitroller._setPendingImplementation(diamond.address); await diamond._become(unitroller.address); - const compProxy = await ethers.getContractAt('Diamond', unitroller.address) + const compProxy = await ethers.getContractAt("Diamond", unitroller.address); await compProxy.facetCutInitilizer(diamondCutFacet.address); // deploy DiamondInit // DiamondInit provides a function that is called when the diamond is upgraded to initialize state variables // Read about how the diamondCut function works here: https://eips.ethereum.org/EIPS/eip-2535#addingreplacingremoving-functions - const DiamondInit = await ethers.getContractFactory('DiamondInit') - const diamondInit = await DiamondInit.deploy() - await diamondInit.deployed() + const DiamondInit = await ethers.getContractFactory("DiamondInit"); + const diamondInit = await DiamondInit.deploy(); + await diamondInit.deployed(); // deploy facets - const FacetNames = [ - 'DiamondLoupeFacet', - 'MarketFacet', - 'PolicyFacet', - 'RewardFacet', - 'SetterFacet' - ] - const cut = [] + const FacetNames = ["DiamondLoupeFacet", "MarketFacet", "PolicyFacet", "RewardFacet", "SetterFacet"]; + const cut = []; let index = 0; for (const FacetName of FacetNames) { let Facet; - if(index > 0 && index < 4){ - Facet = await ethers.getContractFactory(FacetName,{ - libraries:{ - LibAccessCheck:await accounts[3].getAddress() - } - }) - }else{ - Facet = await ethers.getContractFactory(FacetName) + if (FacetName == "RewardFacet") { + Facet = await ethers.getContractFactory(FacetName, { + libraries: { + LibAccessCheck: await accounts[3].getAddress(), + }, + }); + } else { + Facet = await ethers.getContractFactory(FacetName); } - const facet = await Facet.deploy() - await facet.deployed() + const facet = await Facet.deploy(); + await facet.deployed(); cut.push({ facetAddress: facet.address, action: FacetCutAction.Add, - functionSelectors: getSelectors(facet) - }) + functionSelectors: getSelectors(facet), + }); index++; } // upgrade diamond with facets - const diamondCut = await ethers.getContractAt('IDiamondCut', unitroller.address) - let tx - let receipt + const diamondCut = await ethers.getContractAt("IDiamondCut", unitroller.address); + let tx; + let receipt; // call to init function - let functionCall = diamondInit.interface.encodeFunctionData('init') - tx = await diamondCut.diamondCut(cut, diamondInit.address, functionCall) - receipt = await tx.wait() + let functionCall = diamondInit.interface.encodeFunctionData("init"); + tx = await diamondCut.diamondCut(cut, diamondInit.address, functionCall); + receipt = await tx.wait(); if (!receipt.status) { - throw Error(`Diamond upgrade failed: ${tx.hash}`) + throw Error(`Diamond upgrade failed: ${tx.hash}`); } - return unitroller + return unitroller; } // We recommend this pattern to be able to use async/await everywhere @@ -84,9 +78,9 @@ if (require.main === module) { deployDiamond() .then(() => process.exit(0)) .catch(error => { - console.error(error) - process.exit(1) - }) + console.error(error); + process.exit(1); + }); } -exports.deployDiamond = deployDiamond +exports.deployDiamond = deployDiamond; diff --git a/script/diamond/diamond.js b/script/diamond/diamond.js index 7302731cd..dcda0ea5f 100644 --- a/script/diamond/diamond.js +++ b/script/diamond/diamond.js @@ -1,80 +1,80 @@ -const FacetCutAction = { Add: 0, Replace: 1, Remove: 2 } +const FacetCutAction = { Add: 0, Replace: 1, Remove: 2 }; // get function selectors from ABI -function getSelectors (contract) { - const signatures = Object.keys(contract.interface.functions) +function getSelectors(contract) { + const signatures = Object.keys(contract.interface.functions); const selectors = signatures.reduce((acc, val) => { - if (val !== 'init(bytes)') { - acc.push(contract.interface.getSighash(val)) + if (val !== "init(bytes)") { + acc.push(contract.interface.getSighash(val)); } - return acc - }, []) - selectors.contract = contract - selectors.remove = remove - selectors.get = get - return selectors + return acc; + }, []); + selectors.contract = contract; + selectors.remove = remove; + selectors.get = get; + return selectors; } // get function selector from function signature -function getSelector (func) { - const abiInterface = new ethers.utils.Interface([func]) - return abiInterface.getSighash(ethers.utils.Fragment.from(func)) +function getSelector(func) { + const abiInterface = new ethers.utils.Interface([func]); + return abiInterface.getSighash(ethers.utils.Fragment.from(func)); } // used with getSelectors to remove selectors from an array of selectors // functionNames argument is an array of function signatures -function remove (functionNames) { - const selectors = this.filter((v) => { +function remove(functionNames) { + const selectors = this.filter(v => { for (const functionName of functionNames) { if (v === this.contract.interface.getSighash(functionName)) { - return false + return false; } } - return true - }) - selectors.contract = this.contract - selectors.remove = this.remove - selectors.get = this.get - return selectors + return true; + }); + selectors.contract = this.contract; + selectors.remove = this.remove; + selectors.get = this.get; + return selectors; } // used with getSelectors to get selectors from an array of selectors // functionNames argument is an array of function signatures -function get (functionNames) { - const selectors = this.filter((v) => { +function get(functionNames) { + const selectors = this.filter(v => { for (const functionName of functionNames) { if (v === this.contract.interface.getSighash(functionName)) { - return true + return true; } } - return false - }) - selectors.contract = this.contract - selectors.remove = this.remove - selectors.get = this.get - return selectors + return false; + }); + selectors.contract = this.contract; + selectors.remove = this.remove; + selectors.get = this.get; + return selectors; } // remove selectors using an array of signatures -function removeSelectors (selectors, signatures) { - const iface = new ethers.utils.Interface(signatures.map(v => 'function ' + v)) - const removeSelectors = signatures.map(v => iface.getSighash(v)) - selectors = selectors.filter(v => !removeSelectors.includes(v)) - return selectors +function removeSelectors(selectors, signatures) { + const iface = new ethers.utils.Interface(signatures.map(v => "function " + v)); + const removeSelectors = signatures.map(v => iface.getSighash(v)); + selectors = selectors.filter(v => !removeSelectors.includes(v)); + return selectors; } // find a particular address position in the return value of diamondLoupeFacet.facets() -function findAddressPositionInFacets (facetAddress, facets) { +function findAddressPositionInFacets(facetAddress, facets) { for (let i = 0; i < facets.length; i++) { if (facets[i].facetAddress === facetAddress) { - return i + return i; } } } -exports.getSelectors = getSelectors -exports.getSelector = getSelector -exports.FacetCutAction = FacetCutAction -exports.remove = remove -exports.removeSelectors = removeSelectors -exports.findAddressPositionInFacets = findAddressPositionInFacets +exports.getSelectors = getSelectors; +exports.getSelector = getSelector; +exports.FacetCutAction = FacetCutAction; +exports.remove = remove; +exports.removeSelectors = removeSelectors; +exports.findAddressPositionInFacets = findAddressPositionInFacets; diff --git a/tests/hardhat/Comptroller/Diamond/accessControl.ts b/tests/hardhat/Comptroller/Diamond/accessControl.ts index c6bc93ac3..6d916ca90 100644 --- a/tests/hardhat/Comptroller/Diamond/accessControl.ts +++ b/tests/hardhat/Comptroller/Diamond/accessControl.ts @@ -4,7 +4,8 @@ import { Signer, constants } from "ethers"; import { ethers } from "hardhat"; import { Comptroller, Comptroller__factory, IAccessControlManager } from "../../../typechain"; -const { deployDiamond } = require('../../../../script/diamond/deploy'); + +const { deployDiamond } = require("../../../../script/diamond/deploy"); const { expect } = chai; chai.use(smock.matchers); @@ -13,14 +14,14 @@ describe("Comptroller", () => { let userAddress: string; let comptroller: MockContract; let accessControl: FakeContract; - let comptrollerProxy: MockContract; + let comptrollerProxy: MockContract; beforeEach(async () => { const signers = await ethers.getSigners(); user = signers[1]; userAddress = await user.getAddress(); - comptroller = await deployDiamond(); accessControl = await smock.fake("IAccessControlManager"); + comptroller = await deployDiamond(); comptrollerProxy = await ethers.getContractAt("Comptroller", comptroller.address); }); @@ -89,7 +90,9 @@ describe("Comptroller", () => { }); describe("setActionsPaused", () => { it("Should have AccessControl", async () => { - await expect(comptrollerProxy.connect(user)._setActionsPaused([], [], true)).to.be.revertedWith("access denied"); + await expect(comptrollerProxy.connect(user)._setActionsPaused([], [], true)).to.be.revertedWith( + "access denied", + ); expect(accessControl.isAllowedToCall).to.be.calledOnceWith( userAddress, "_setActionsPaused(address[],uint256[],bool)", diff --git a/tests/hardhat/Comptroller/liquidateCalculateAmountSeizeTest.ts b/tests/hardhat/Comptroller/liquidateCalculateAmountSeizeTest.ts index 5f1ffd6d8..bc2c08151 100644 --- a/tests/hardhat/Comptroller/liquidateCalculateAmountSeizeTest.ts +++ b/tests/hardhat/Comptroller/liquidateCalculateAmountSeizeTest.ts @@ -107,9 +107,8 @@ describe("Comptroller", () => { }); it("fails if the repayAmount causes overflow ", async () => { - await expect( - calculateSeizeTokens(comptroller, vTokenBorrowed, vTokenCollateral, constants.MaxUint256), - ).to.be.reverted; + await expect(calculateSeizeTokens(comptroller, vTokenBorrowed, vTokenCollateral, constants.MaxUint256)).to.be + .reverted; }); it("fails if the borrowed asset price causes overflow ", async () => { From b07d5a611841711b06b35abb70b7837a64dbd06a Mon Sep 17 00:00:00 2001 From: defcon022 Date: Mon, 20 Mar 2023 12:46:21 +0530 Subject: [PATCH 029/153] Added tests for comptroller's diamond proxy. --- .../Comptroller/Diamond/assetListTest.ts | 281 ++++++++++++ .../Comptroller/Diamond/comptrollerTest.ts | 405 ++++++++++++++++++ .../liquidateCalculateAmoutSeizeTest.ts | 167 ++++++++ .../hardhat/Comptroller/Diamond/pauseTest.ts | 126 ++++++ 4 files changed, 979 insertions(+) create mode 100644 tests/hardhat/Comptroller/Diamond/assetListTest.ts create mode 100644 tests/hardhat/Comptroller/Diamond/comptrollerTest.ts create mode 100644 tests/hardhat/Comptroller/Diamond/liquidateCalculateAmoutSeizeTest.ts create mode 100644 tests/hardhat/Comptroller/Diamond/pauseTest.ts diff --git a/tests/hardhat/Comptroller/Diamond/assetListTest.ts b/tests/hardhat/Comptroller/Diamond/assetListTest.ts new file mode 100644 index 000000000..777ab949b --- /dev/null +++ b/tests/hardhat/Comptroller/Diamond/assetListTest.ts @@ -0,0 +1,281 @@ +import { FakeContract, MockContract, smock } from "@defi-wonderland/smock"; +import { loadFixture, setBalance } from "@nomicfoundation/hardhat-network-helpers"; +import chai from "chai"; +import { Signer } from "ethers"; +import { ethers } from "hardhat"; + +import { convertToUnit } from "../../../../helpers/utils"; +import { + Comptroller, + ComptrollerLens, + ComptrollerLens__factory, + IAccessControlManager, + PriceOracle, + VBep20Immutable, +} from "../../../../typechain"; +import { ComptrollerErrorReporter } from "../../util/Errors"; + +const { deployDiamond } = require("../../../../script/diamond/deploy"); + +const { expect } = chai; +chai.use(smock.matchers); + +const { Error } = ComptrollerErrorReporter; + +describe("assetListTest", () => { + let root: Signer; // eslint-disable-line @typescript-eslint/no-unused-vars + let customer: Signer; + let comptroller: MockContract; + let comptrollerProxy: MockContract; + let OMG: FakeContract; + let ZRX: FakeContract; + let BAT: FakeContract; + let SKT: FakeContract; + let allTokens: FakeContract[]; + + type AssetListFixture = { + comptroller: MockContract; + comptrollerLens: MockContract; + oracle: FakeContract; + OMG: FakeContract; + ZRX: FakeContract; + BAT: FakeContract; + SKT: FakeContract; + allTokens: FakeContract[]; + names: string[]; + }; + + async function assetListFixture(): Promise { + const accessControl = await smock.fake("AccessControlManager"); + // const ComptrollerFactory = await smock.mock("Comptroller"); + const ComptrollerLensFactory = await smock.mock("ComptrollerLens"); + const comptroller = await deployDiamond(); + const comptrollerLens = await ComptrollerLensFactory.deploy(); + const oracle = await smock.fake("PriceOracle"); + accessControl.isAllowedToCall.returns(true); + comptrollerProxy = await ethers.getContractAt("Comptroller", comptroller.address); + await comptrollerProxy._setAccessControl(accessControl.address); + await comptrollerProxy._setComptrollerLens(comptrollerLens.address); + await comptrollerProxy._setPriceOracle(oracle.address); + const names = ["OMG", "ZRX", "BAT", "sketch"]; + const [OMG, ZRX, BAT, SKT] = await Promise.all( + names.map(async name => { + const vToken = await smock.fake("VBep20Immutable"); + if (name !== "sketch") { + await comptrollerProxy._supportMarket(vToken.address); + } + return vToken; + }), + ); + const allTokens = [OMG, ZRX, BAT, SKT]; + return { comptroller, comptrollerLens, oracle, OMG, ZRX, BAT, SKT, allTokens, names }; + } + + function configure({ oracle, allTokens, names }: AssetListFixture) { + oracle.getUnderlyingPrice.returns(convertToUnit("0.5", 18)); + allTokens.map((vToken, i) => { + vToken.isVToken.returns(true); + vToken.symbol.returns(names[i]); + vToken.name.returns(names[i]); + vToken.getAccountSnapshot.returns([0, 0, 0, 0]); + }); + } + + beforeEach(async () => { + [root, customer] = await ethers.getSigners(); + const contracts = await loadFixture(assetListFixture); + configure(contracts); + ({ comptroller, OMG, ZRX, BAT, SKT, allTokens } = contracts); + }); + + async function checkMarkets(expectedTokens: FakeContract[]) { + // eslint-disable-next-line prefer-const + for (let token of allTokens) { + const isExpected = expectedTokens.some(e => e == token); + expect(await comptrollerProxy.checkMembership(await customer.getAddress(), token.address)).to.equal(isExpected); + } + } + + async function enterAndCheckMarkets( + enterTokens: FakeContract[], + expectedTokens: FakeContract[], + expectedErrors: ComptrollerErrorReporter.Error[] | null = null, + ) { + //console.log("1----"); + + const reply = await comptrollerProxy.connect(customer).callStatic.enterMarkets(enterTokens.map(t => t.address)); + const receipt = await comptrollerProxy.connect(customer).enterMarkets(enterTokens.map(t => t.address)); + //console.log("2----"); + const assetsIn = await comptrollerProxy.getAssetsIn(await customer.getAddress()); + + const expectedErrors_ = expectedErrors || enterTokens.map(_ => Error.NO_ERROR); + //console.log("3----"); + + reply.forEach((tokenReply, i) => { + expect(tokenReply).to.equal(expectedErrors_[i]); + }); + + //console.log("4----"); + expect(receipt).to.emit(comptroller, "MarketEntered"); + expect(assetsIn).to.deep.equal(expectedTokens.map(t => t.address)); + + await checkMarkets(expectedTokens); + //console.log("5----"); + + return receipt; + } + + async function enterAndExpectRejection(enterTokens: FakeContract[], expectedReason: string = "") { + await expect(comptrollerProxy.connect(customer).enterMarkets(enterTokens.map(t => t.address))).to.be.revertedWith( + expectedReason, + ); + } + + async function exitAndCheckMarkets( + exitToken: FakeContract, + expectedTokens: FakeContract[], + expectedError: ComptrollerErrorReporter.Error = Error.NO_ERROR, + ) { + //console.log("1++++"); + const reply = await comptrollerProxy.connect(customer).callStatic.exitMarket(exitToken.address); + //console.log("2++++"); + const receipt = await comptrollerProxy.connect(customer).exitMarket(exitToken.address); + const assetsIn = await comptrollerProxy.getAssetsIn(await customer.getAddress()); + //console.log("3++++"); + + expect(reply).to.equal(expectedError); + expect(assetsIn).to.deep.equal(expectedTokens.map(t => t.address)); + //console.log("4++++"); + + await checkMarkets(expectedTokens); + ////console.log("5++++"); + return receipt; + } + + describe("enterMarkets", () => { + it("properly emits events", async () => { + const tx1 = await enterAndCheckMarkets([OMG], [OMG]); + const tx2 = await enterAndCheckMarkets([OMG], [OMG]); + expect(tx1).to.emit(comptroller, "MarketEntered").withArgs(OMG.address, customer); + expect((await tx2.wait()).events).to.be.empty; + }); + + it("adds to the asset list only once", async () => { + await enterAndCheckMarkets([OMG], [OMG]); + await enterAndCheckMarkets([OMG], [OMG]); + await enterAndCheckMarkets([ZRX, BAT, OMG], [OMG, ZRX, BAT]); + await enterAndCheckMarkets([ZRX, OMG], [OMG, ZRX, BAT]); + await enterAndCheckMarkets([ZRX], [OMG, ZRX, BAT]); + await enterAndCheckMarkets([OMG], [OMG, ZRX, BAT]); + await enterAndCheckMarkets([ZRX], [OMG, ZRX, BAT]); + await enterAndCheckMarkets([BAT], [OMG, ZRX, BAT]); + }); + + it("the market must be listed for add to succeed", async () => { + await enterAndExpectRejection([SKT], "market not listed"); + await comptrollerProxy._supportMarket(SKT.address); + await enterAndCheckMarkets([SKT], [SKT]); + }); + + it("returns a list of codes mapping to user's ultimate membership in given addresses", async () => { + await enterAndCheckMarkets([OMG, ZRX, BAT], [OMG, ZRX, BAT], [Error.NO_ERROR, Error.NO_ERROR, Error.NO_ERROR]); + await enterAndExpectRejection([OMG, SKT], "market not listed"); + }); + }); + + describe("exitMarket", () => { + it("doesn't let you exit if you have a borrow balance", async () => { + await enterAndCheckMarkets([OMG], [OMG]); + OMG.getAccountSnapshot.returns([0, 1, 2, 1]); + + await exitAndCheckMarkets(OMG, [OMG], Error.NONZERO_BORROW_BALANCE); + }); + + it("rejects unless redeem allowed", async () => { + await enterAndCheckMarkets([OMG, BAT], [OMG, BAT]); + // We need to borrow at least 2, otherwise our borrow balance in USD gets truncated + // when multiplied by price=0.5 + BAT.getAccountSnapshot.returns([0, 0, 2, 1]); + + // BAT has a negative balance and there's no supply, thus account should be underwater + await exitAndCheckMarkets(OMG, [OMG, BAT], Error.REJECTION); + }); + + it("accepts when you're not in the market already", async () => { + await enterAndCheckMarkets([OMG, BAT], [OMG, BAT]); + + // Not in ZRX, should exit fine + await exitAndCheckMarkets(ZRX, [OMG, BAT], Error.NO_ERROR); + }); + + it("properly removes when there's only one asset", async () => { + await enterAndCheckMarkets([OMG], [OMG]); + await exitAndCheckMarkets(OMG, [], Error.NO_ERROR); + }); + + it("properly removes when there's only two assets, removing the first", async () => { + await enterAndCheckMarkets([OMG, BAT], [OMG, BAT]); + await exitAndCheckMarkets(OMG, [BAT], Error.NO_ERROR); + }); + + it("properly removes when there's only two assets, removing the second", async () => { + await enterAndCheckMarkets([OMG, BAT], [OMG, BAT]); + await exitAndCheckMarkets(BAT, [OMG], Error.NO_ERROR); + }); + + it("properly removes when there's only three assets, removing the first", async () => { + await enterAndCheckMarkets([OMG, BAT, ZRX], [OMG, BAT, ZRX]); + await exitAndCheckMarkets(OMG, [ZRX, BAT], Error.NO_ERROR); + }); + + it("properly removes when there's only three assets, removing the second", async () => { + await enterAndCheckMarkets([OMG, BAT, ZRX], [OMG, BAT, ZRX]); + await exitAndCheckMarkets(BAT, [OMG, ZRX], Error.NO_ERROR); + }); + + it("properly removes when there's only three assets, removing the third", async () => { + await enterAndCheckMarkets([OMG, BAT, ZRX], [OMG, BAT, ZRX]); + await exitAndCheckMarkets(ZRX, [OMG, BAT], Error.NO_ERROR); + }); + }); + + describe("entering from borrowAllowed", () => { + beforeEach(async () => { + await BAT.borrowIndex.returns(convertToUnit(1, 18)); + }); + + it("enters when called by a vtoken", async () => { + await setBalance(await BAT.wallet.getAddress(), 10n ** 18n); + await comptrollerProxy.connect(BAT.wallet).borrowAllowed(BAT.address, await customer.getAddress(), 1); + + const assetsIn = await comptrollerProxy.getAssetsIn(await customer.getAddress()); + + expect(assetsIn).to.deep.equal([BAT.address]); + + await checkMarkets([BAT]); + }); + + it("reverts when called by not a vtoken", async () => { + await expect( + comptrollerProxy.connect(customer).borrowAllowed(BAT.address, await customer.getAddress(), 1), + ).to.be.revertedWith("sender must be vToken"); + + const assetsIn = await comptrollerProxy.getAssetsIn(await customer.getAddress()); + + expect(assetsIn).to.deep.equal([]); + + await checkMarkets([]); + }); + + it("adds to the asset list only once", async () => { + await setBalance(await BAT.wallet.getAddress(), 10n ** 18n); + await comptrollerProxy.connect(BAT.wallet).borrowAllowed(BAT.address, await customer.getAddress(), 1); + + await enterAndCheckMarkets([BAT], [BAT]); + + await comptrollerProxy.connect(BAT.wallet).borrowAllowed(BAT.address, await customer.getAddress(), 1); + const assetsIn = await comptrollerProxy.getAssetsIn(await customer.getAddress()); + expect(assetsIn).to.deep.equal([BAT.address]); + }); + }); +}); diff --git a/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts b/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts new file mode 100644 index 000000000..88db29e2a --- /dev/null +++ b/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts @@ -0,0 +1,405 @@ +import { FakeContract, MockContract, smock } from "@defi-wonderland/smock"; +import { loadFixture } from "@nomicfoundation/hardhat-network-helpers"; +import chai from "chai"; +import { Signer, constants } from "ethers"; +import { ethers } from "hardhat"; + +import { convertToUnit } from "../../../../helpers/utils"; +import { + Comptroller, + ComptrollerLens, + ComptrollerLens__factory, + Comptroller__factory, + EIP20Interface, + IAccessControlManager, + PriceOracle, + VToken, +} from "../../../../typechain"; +import { ComptrollerErrorReporter } from "../../util/Errors"; + +const { deployDiamond } = require("../../../../script/diamond/deploy"); + +const { expect } = chai; +chai.use(smock.matchers); + +type SimpleComptrollerFixture = { + oracle: FakeContract; + accessControl: FakeContract; + comptrollerLens: MockContract; + comptroller: MockContract; + comptrollerProxy: MockContract; +}; + +async function deploySimpleComptroller(): Promise { + const oracle = await smock.fake("PriceOracle"); + const accessControl = await smock.fake("AccessControlManager"); + accessControl.isAllowedToCall.returns(true); + const ComptrollerLensFactory = await smock.mock("ComptrollerLens"); + // const ComptrollerFactory = await smock.mock("Comptroller"); + const comptroller = await deployDiamond(); + const comptrollerProxy = await ethers.getContractAt("Comptroller", comptroller.address); + const comptrollerLens = await ComptrollerLensFactory.deploy(); + await comptrollerProxy._setAccessControl(accessControl.address); + await comptrollerProxy._setComptrollerLens(comptrollerLens.address); + await comptrollerProxy._setPriceOracle(oracle.address); + await comptrollerProxy._setLiquidationIncentive(convertToUnit("1", 18)); + return { oracle, comptrollerProxy, comptroller, comptrollerLens, accessControl }; +} + +function configureOracle(oracle: FakeContract) { + oracle.getUnderlyingPrice.returns(convertToUnit(1, 18)); +} + +async function configureVToken(vToken: FakeContract, comptroller: MockContract) { + comptroller = await deployDiamond(); + vToken.comptroller.returns(comptroller.address); + vToken.isVToken.returns(true); + vToken.exchangeRateStored.returns(convertToUnit("2", 18)); + vToken.totalSupply.returns(convertToUnit("1000000", 18)); + vToken.totalBorrows.returns(convertToUnit("900000", 18)); +} + +describe("Comptroller", () => { + let root: Signer; + let accounts: Signer[]; + + before(async () => { + [root, ...accounts] = await ethers.getSigners(); + }); + + describe("constructor", () => { + it("on success it sets admin to creator and pendingAdmin is unset", async () => { + const { comptrollerProxy } = await loadFixture(deploySimpleComptroller); + expect(await comptrollerProxy.admin()).to.equal(await root.getAddress()); + expect(await comptrollerProxy.pendingAdmin()).to.equal(constants.AddressZero); + }); + }); + + describe("_setLiquidationIncentive", () => { + let comptroller: MockContract; + let comptrollerProxy: MockContract; + const initialIncentive = convertToUnit("1", 18); + const validIncentive = convertToUnit("1.1", 18); + const tooSmallIncentive = convertToUnit("0.99999", 18); + + beforeEach(async () => { + ({ comptroller } = await loadFixture(deploySimpleComptroller)); + comptrollerProxy = await ethers.getContractAt("Comptroller", comptroller.address); + }); + + it("fails if incentive is less than 1e18", async () => { + await expect(comptrollerProxy._setLiquidationIncentive(tooSmallIncentive)).to.be.revertedWith( + "incentive must be over 1e18", + ); + }); + + it("accepts a valid incentive and emits a NewLiquidationIncentive event", async () => { + expect(await comptrollerProxy.callStatic._setLiquidationIncentive(validIncentive)).to.equal( + ComptrollerErrorReporter.Error.NO_ERROR, + ); + expect(await comptrollerProxy._setLiquidationIncentive(validIncentive)) + .to.emit(comptroller, "NewLiquidationIncentive") + .withArgs(initialIncentive, validIncentive); + expect(await comptrollerProxy.liquidationIncentiveMantissa()).to.equal(validIncentive); + }); + }); + + describe("Non zero address check", () => { + let comptroller: MockContract; + let comptrollerProxy: MockContract; + + beforeEach(async () => { + ({ comptroller } = await loadFixture(deploySimpleComptroller)); + comptrollerProxy = await ethers.getContractAt("Comptroller", comptroller.address); + }); + + type FuncNames = keyof Comptroller["functions"]; + + function testZeroAddress(funcName: Func, args: Parameters) { + it(funcName, async () => { + await expect(comptrollerProxy[funcName](...args)).to.be.revertedWith("can't be zero address"); + }); + } + testZeroAddress("_setPriceOracle", [constants.AddressZero]); + testZeroAddress("_setCollateralFactor", [constants.AddressZero, 0]); + testZeroAddress("_setPauseGuardian", [constants.AddressZero]); + testZeroAddress("_setVAIController", [constants.AddressZero]); + testZeroAddress("_setTreasuryData", [constants.AddressZero, constants.AddressZero, 0]); + testZeroAddress("_setComptrollerLens", [constants.AddressZero]); + testZeroAddress("_setVAIVaultInfo", [constants.AddressZero, 0, 0]); + testZeroAddress("_setVenusSpeeds", [[constants.AddressZero], [0], [0]]); + }); + + describe("_setPriceOracle", () => { + let comptroller: MockContract; + let comptrollerProxy: MockContract; + let oracle: FakeContract; + let newOracle: FakeContract; + + type Contracts = SimpleComptrollerFixture & { + newOracle: FakeContract; + }; + + async function deploy(): Promise { + const contracts = await deploySimpleComptroller(); + const newOracle = await smock.fake("PriceOracle"); + // comptrollerProxy = await ethers.getContractAt("Comptroller", contracts.comptroller); + return { ...contracts, newOracle }; + } + + beforeEach(async () => { + ({ comptrollerProxy, oracle, newOracle } = await loadFixture(deploy)); + }); + + it("fails if called by non-admin", async () => { + await expect(comptrollerProxy.connect(accounts[0])._setPriceOracle(oracle.address)).to.be.revertedWith( + "only admin can", + ); + expect(await comptrollerProxy.oracle()).to.equal(oracle.address); + }); + + it("accepts a valid price oracle and emits a NewPriceOracle event", async () => { + expect(await comptrollerProxy._setPriceOracle(newOracle.address)) + .to.emit(comptroller, "NewPriceOracle") + .withArgs(oracle.address, newOracle.address); + expect(await comptrollerProxy.oracle()).to.equal(newOracle.address); + }); + }); + + describe("_setComptrollerLens", () => { + let comptroller: MockContract; + let comptrollerProxy: MockContract; + let comptrollerLens: MockContract; + + type Contracts = { + comptroller: MockContract; + comptrollerProxy: MockContract; + comptrollerLens: MockContract; + }; + + async function deploy(): Promise { + // const ComptrollerFactory = await smock.mock("Comptroller"); + const comptroller = await deployDiamond(); + const comptrollerProxy = await ethers.getContractAt("Comptroller", comptroller.address); + const ComptrollerLensFactory = await smock.mock("ComptrollerLens"); + const comptrollerLens = await ComptrollerLensFactory.deploy(); + return { comptrollerProxy, comptrollerLens }; + } + + beforeEach(async () => { + ({ comptrollerProxy, comptrollerLens } = await loadFixture(deploy)); + }); + + it("fails if not called by admin", async () => { + await expect( + comptrollerProxy.connect(accounts[0])._setComptrollerLens(comptrollerLens.address), + ).to.be.revertedWith("only admin can"); + }); + + it("should fire an event", async () => { + const { comptrollerProxy, comptrollerLens } = await loadFixture(deploy); + const oldComptrollerLensAddress = await comptrollerProxy.comptrollerLens(); + expect(await comptrollerProxy._setComptrollerLens(comptrollerLens.address)) + .to.emit(comptroller, "NewComptrollerLens") + .withArgs(oldComptrollerLensAddress, comptrollerLens.address); + }); + }); + + describe("_setCloseFactor", () => { + let comptrollerProxy: MockContract; + + beforeEach(async () => { + ({ comptrollerProxy } = await loadFixture(deploySimpleComptroller)); + }); + + it("fails if not called by admin", async () => { + await expect(comptrollerProxy.connect(accounts[0])._setCloseFactor(1)).to.be.revertedWith("only admin can"); + }); + }); + + describe("_setCollateralFactor", () => { + const half = convertToUnit("0.5", 18); + let comptroller: MockContract; + let comptrollerProxy: MockContract; + let vToken: FakeContract; + let oracle: FakeContract; + + type Contracts = SimpleComptrollerFixture & { vToken: FakeContract }; + + async function deploy(): Promise { + const contracts = await deploySimpleComptroller(); + const vToken = await smock.fake("VToken"); + vToken.comptroller.returns(contracts.comptroller.address); + vToken.isVToken.returns(true); + return { vToken, ...contracts }; + } + + beforeEach(async () => { + ({ comptrollerProxy, oracle, vToken } = await loadFixture(deploy)); + configureOracle(oracle); + }); + + it("fails if asset is not listed", async () => { + await expect(comptrollerProxy._setCollateralFactor(vToken.address, half)).to.be.revertedWith("market not listed"); + }); + + it("fails if factor is set without an underlying price", async () => { + await comptrollerProxy._supportMarket(vToken.address); + oracle.getUnderlyingPrice.returns(0); + expect(await comptrollerProxy._setCollateralFactor(vToken.address, half)) + .to.emit(comptroller, "Failure") + .withArgs( + ComptrollerErrorReporter.Error.PRICE_ERROR, + ComptrollerErrorReporter.FailureInfo.SET_COLLATERAL_FACTOR_WITHOUT_PRICE, + ); + }); + + it("succeeds and sets market", async () => { + await comptrollerProxy._supportMarket(vToken.address); + expect(await comptrollerProxy._setCollateralFactor(vToken.address, half)) + .to.emit(comptroller, "NewCollateralFactor") + .withArgs(vToken.address, "0", half); + }); + }); + + describe("_supportMarket", () => { + let comptroller: MockContract; + let comptrollerProxy: MockContract; + let oracle: FakeContract; + let vToken1: FakeContract; + let vToken2: FakeContract; + let token: FakeContract; + + type Contracts = SimpleComptrollerFixture & { + vToken1: FakeContract; + vToken2: FakeContract; + token: FakeContract; + }; + + async function deploy(): Promise { + const contracts = await deploySimpleComptroller(); + const vToken1 = await smock.fake("VToken"); + const vToken2 = await smock.fake("VToken"); + const token = await smock.fake("EIP20Interface"); + return { ...contracts, vToken1, vToken2, token }; + } + + beforeEach(async () => { + ({ comptrollerProxy, oracle, vToken1, vToken2, token } = await loadFixture(deploy)); + configureOracle(oracle); + configureVToken(vToken1, comptroller); + configureVToken(vToken2, comptroller); + }); + + // it("fails if asset is not a VToken", async () => { + // await expect(comptrollerProxy._supportMarket(token.address)).to.be.reverted; + // }); + + it("succeeds and sets market", async () => { + expect(await comptrollerProxy._supportMarket(vToken1.address)) + .to.emit(comptroller, "MarketListed") + .withArgs(vToken1.address); + }); + + it("cannot list a market a second time", async () => { + const tx1 = await comptrollerProxy._supportMarket(vToken1.address); + const tx2 = await comptrollerProxy._supportMarket(vToken1.address); + expect(tx1).to.emit(comptrollerProxy, "MarketListed").withArgs(vToken1.address); + expect(tx2) + .to.emit(comptroller, "Failure") + .withArgs( + ComptrollerErrorReporter.Error.MARKET_ALREADY_LISTED, + ComptrollerErrorReporter.FailureInfo.SUPPORT_MARKET_EXISTS, + ); + }); + + it("can list two different markets", async () => { + const tx1 = await comptrollerProxy._supportMarket(vToken1.address); + const tx2 = await comptrollerProxy._supportMarket(vToken2.address); + expect(tx1).to.emit(comptrollerProxy, "MarketListed").withArgs(vToken1.address); + expect(tx2).to.emit(comptroller, "MarketListed").withArgs(vToken2.address); + }); + }); + + describe("Hooks", () => { + let comptroller: MockContract; + let comptrollerProxy: MockContract; + let vToken: FakeContract; + + type Contracts = SimpleComptrollerFixture & { vToken: FakeContract }; + + async function deploy(): Promise { + const contracts = await deploySimpleComptroller(); + const vToken = await smock.fake("VToken"); + await contracts.comptrollerProxy._supportMarket(vToken.address); + return { ...contracts, vToken }; + } + + beforeEach(async () => { + ({ comptrollerProxy, vToken } = await loadFixture(deploy)); + configureVToken(vToken, comptroller); + }); + + describe("mintAllowed", () => { + beforeEach(async () => { + ({ comptrollerProxy, vToken } = await loadFixture(deploy)); + configureVToken(vToken, comptroller); + }); + + it("allows minting if cap is not reached", async () => { + const cap = convertToUnit("1001", 18); + const currentVTokenSupply = convertToUnit("500", 18); + const exchangeRate = convertToUnit("2", 18); + // underlying supply = currentVTokenSupply * exchangeRate = 1000 + + vToken.totalSupply.returns(currentVTokenSupply); + vToken.exchangeRateStored.returns(exchangeRate); + await comptrollerProxy._setMarketSupplyCaps([vToken.address], [cap]); + expect( + await comptrollerProxy.callStatic.mintAllowed( + vToken.address, + await root.getAddress(), + convertToUnit("0.9999", 18), + ), + ).to.equal(0); // 0 means "no error" + }); + + it("reverts if supply cap reached", async () => { + const cap = convertToUnit("1001", 18); + const currentVTokenSupply = convertToUnit("500", 18); + const exchangeRate = convertToUnit("2", 18); + // underlying supply = currentVTokenSupply * exchangeRate = 1000 + + vToken.totalSupply.returns(currentVTokenSupply); + vToken.exchangeRateStored.returns(exchangeRate); + await comptrollerProxy._setMarketSupplyCaps([vToken.address], [cap]); + await expect( + comptrollerProxy.mintAllowed(vToken.address, await root.getAddress(), convertToUnit("1.01", 18)), + ).to.be.revertedWith("market supply cap reached"); + }); + + it("reverts if market is not listed", async () => { + const someVToken = await smock.fake("VToken"); + await expect( + comptrollerProxy.mintAllowed(someVToken.address, await root.getAddress(), convertToUnit("1", 18)), + ).to.be.revertedWith("market not listed"); + }); + }); + + describe("redeemVerify", () => { + it("should allow you to redeem 0 underlying for 0 tokens", async () => { + await comptrollerProxy.redeemVerify(vToken.address, await accounts[0].getAddress(), 0, 0); + }); + + it("should allow you to redeem 5 underlyig for 5 tokens", async () => { + await comptrollerProxy.redeemVerify(vToken.address, await accounts[0].getAddress(), 5, 5); + }); + + it("should not allow you to redeem 5 underlying for 0 tokens", async () => { + await expect( + comptrollerProxy.redeemVerify(vToken.address, await accounts[0].getAddress(), 5, 0), + ).to.be.revertedWith("redeemTokens zero"); + }); + }); + }); +}); diff --git a/tests/hardhat/Comptroller/Diamond/liquidateCalculateAmoutSeizeTest.ts b/tests/hardhat/Comptroller/Diamond/liquidateCalculateAmoutSeizeTest.ts new file mode 100644 index 000000000..86f14cb74 --- /dev/null +++ b/tests/hardhat/Comptroller/Diamond/liquidateCalculateAmoutSeizeTest.ts @@ -0,0 +1,167 @@ +import { FakeContract, MockContract, smock } from "@defi-wonderland/smock"; +import { loadFixture } from "@nomicfoundation/hardhat-network-helpers"; +import chai from "chai"; +import { BigNumberish, constants } from "ethers"; +import { computePublicKey } from "ethers/lib/utils"; +import { ethers } from "hardhat"; + +import { convertToUnit } from "../../../../helpers/utils"; +import { + Comptroller, + ComptrollerLens, + ComptrollerLens__factory, + Comptroller__factory, + IAccessControlManager, + PriceOracle, + VBep20Immutable, +} from "../../../../typechain"; +import { ComptrollerErrorReporter } from "../../util/Errors"; + +const { deployDiamond } = require("../../../../script/diamond/deploy"); + +const { expect } = chai; +chai.use(smock.matchers); + +const borrowedPrice = convertToUnit(2, 10); +const collateralPrice = convertToUnit(1, 18); +const repayAmount = convertToUnit(1, 18); + +async function calculateSeizeTokens( + comptrollerProxy: MockContract, + vTokenBorrowed: FakeContract, + vTokenCollateral: FakeContract, + repayAmount: BigNumberish, +) { + return comptrollerProxy.liquidateCalculateSeizeTokens(vTokenBorrowed.address, vTokenCollateral.address, repayAmount); +} + +function rando(min: number, max: number): number { + return Math.floor(Math.random() * (max - min)) + min; +} + +describe("Comptroller", () => { + let comptroller: MockContract; + let comptrollerProxy: MockContract; + let oracle: FakeContract; + let vTokenBorrowed: FakeContract; + let vTokenCollateral: FakeContract; + + type LiquidateFixture = { + // comptroller: MockContract; + comptrollerProxy: MockContract; + comptrollerLens: MockContract; + oracle: FakeContract; + vTokenBorrowed: FakeContract; + vTokenCollateral: FakeContract; + }; + + async function setOraclePrice(vToken: FakeContract, price: BigNumberish) { + oracle.getUnderlyingPrice.whenCalledWith(vToken.address).returns(price); + } + + async function liquidateFixture(): Promise { + const accessControl = await smock.fake("AccessControlManager"); + // const ComptrollerFactory = await smock.mock("Comptroller"); + const ComptrollerLensFactory = await smock.mock("ComptrollerLens"); + const comptroller = await deployDiamond(); + comptrollerProxy = await ethers.getContractAt("Comptroller", comptroller.address); + const comptrollerLens = await ComptrollerLensFactory.deploy(); + const oracle = await smock.fake("PriceOracle"); + accessControl.isAllowedToCall.returns(true); + await comptrollerProxy._setAccessControl(accessControl.address); + await comptrollerProxy._setComptrollerLens(comptrollerLens.address); + await comptrollerProxy._setPriceOracle(oracle.address); + await comptrollerProxy._setLiquidationIncentive(convertToUnit("1.1", 18)); + + const vTokenBorrowed = await smock.fake("VBep20Immutable"); + const vTokenCollateral = await smock.fake("VBep20Immutable"); + + return { comptrollerProxy, comptrollerLens, oracle, vTokenBorrowed, vTokenCollateral }; + } + + async function configure({ comptrollerProxy, vTokenCollateral, oracle, vTokenBorrowed }: LiquidateFixture) { + oracle.getUnderlyingPrice.returns(0); + for (const vToken of [vTokenBorrowed, vTokenCollateral]) { + vToken.comptroller.returns(comptrollerProxy.address); + vToken.isVToken.returns(true); + } + + vTokenCollateral.exchangeRateStored.returns(5e9); + oracle.getUnderlyingPrice.whenCalledWith(vTokenCollateral.address).returns(collateralPrice); + oracle.getUnderlyingPrice.whenCalledWith(vTokenBorrowed.address).returns(borrowedPrice); + } + + beforeEach(async () => { + const contracts = await loadFixture(liquidateFixture); + await configure(contracts); + ({ comptrollerProxy, vTokenBorrowed, oracle, vTokenCollateral } = contracts); + }); + + describe("liquidateCalculateAmountSeize", () => { + it("fails if borrowed asset price is 0", async () => { + setOraclePrice(vTokenBorrowed, 0); + const [err, result] = await calculateSeizeTokens(comptrollerProxy, vTokenBorrowed, vTokenCollateral, repayAmount); + expect(err).to.equal(ComptrollerErrorReporter.Error.PRICE_ERROR); + expect(result).to.equal(0); + }); + + it("fails if collateral asset price is 0", async () => { + setOraclePrice(vTokenCollateral, 0); + const [err, result] = await calculateSeizeTokens(comptrollerProxy, vTokenBorrowed, vTokenCollateral, repayAmount); + expect(err).to.equal(ComptrollerErrorReporter.Error.PRICE_ERROR); + expect(result).to.equal(0); + }); + + it("fails if the repayAmount causes overflow ", async () => { + await expect(calculateSeizeTokens(comptrollerProxy, vTokenBorrowed, vTokenCollateral, constants.MaxUint256)).to.be + .reverted; + }); + + it("fails if the borrowed asset price causes overflow ", async () => { + setOraclePrice(vTokenBorrowed, constants.MaxUint256); + await expect(calculateSeizeTokens(comptrollerProxy, vTokenBorrowed, vTokenCollateral, repayAmount)).to.be + .reverted; + }); + + it("reverts if it fails to calculate the exchange rate", async () => { + vTokenCollateral.exchangeRateStored.reverts("exchangeRateStored: exchangeRateStoredInternal failed"); + ethers.provider.getBlockNumber(); + /// TODO: Somehow the error message does not get propagated into the resulting tx. Smock bug? + await expect( + comptrollerProxy.liquidateCalculateSeizeTokens(vTokenBorrowed.address, vTokenCollateral.address, repayAmount), + ).to.be.reverted; // revertedWith("exchangeRateStored: exchangeRateStoredInternal failed"); + }); + + [ + [1e18, 1e18, 1e18, 1e18, 1e18], + [2e18, 1e18, 1e18, 1e18, 1e18], + [2e18, 2e18, 1.42e18, 1.3e18, 2.45e18], + [2.789e18, 5.230480842e18, 771.32e18, 1.3e18, 10002.45e18], + [7.009232529961056e24, 2.5278726317240445e24, 2.6177112093242585e23, 1179713989619784000, 7.790468414639561e24], + [rando(0, 1e25), rando(0, 1e25), rando(1, 1e25), rando(1e18, 1.5e18), rando(0, 1e25)], + ].forEach(testCase => { + it(`returns the correct value for ${testCase}`, async () => { + const [exchangeRate, borrowedPrice, collateralPrice, liquidationIncentive, repayAmount] = testCase.map(x => + BigInt(x), + ); + + setOraclePrice(vTokenCollateral, collateralPrice); + setOraclePrice(vTokenBorrowed, borrowedPrice); + await comptrollerProxy._setLiquidationIncentive(liquidationIncentive); + vTokenCollateral.exchangeRateStored.returns(exchangeRate); + + const seizeAmount = (repayAmount * liquidationIncentive * borrowedPrice) / collateralPrice; + const seizeTokens = seizeAmount / exchangeRate; + + const [err, result] = await calculateSeizeTokens( + comptrollerProxy, + vTokenBorrowed, + vTokenCollateral, + repayAmount, + ); + expect(err).to.equal(ComptrollerErrorReporter.Error.NO_ERROR); + expect(Number(result)).to.be.approximately(Number(seizeTokens), 1e7); + }); + }); + }); +}); diff --git a/tests/hardhat/Comptroller/Diamond/pauseTest.ts b/tests/hardhat/Comptroller/Diamond/pauseTest.ts new file mode 100644 index 000000000..2ffed372e --- /dev/null +++ b/tests/hardhat/Comptroller/Diamond/pauseTest.ts @@ -0,0 +1,126 @@ +import { FakeContract, MockContract, smock } from "@defi-wonderland/smock"; +import { loadFixture } from "@nomicfoundation/hardhat-network-helpers"; +import chai from "chai"; +import { ethers } from "hardhat"; + +import { + Comptroller, + IAccessControlManager, + PriceOracle, + VBep20Immutable, +} from "../../../../typechain"; + +const { deployDiamond } = require("../../../../script/diamond/deploy"); + +const { expect } = chai; +chai.use(smock.matchers); + +type PauseFixture = { + accessControl: FakeContract; + comptroller: MockContract; + oracle: FakeContract; + OMG: FakeContract; + ZRX: FakeContract; + BAT: FakeContract; + SKT: FakeContract; + allTokens: FakeContract[]; + names: string[]; +}; + +async function pauseFixture(): Promise { + const accessControl = await smock.fake("IAccessControlManager"); + const comptrollerDeployment = await deployDiamond(); + const comptroller = await ethers.getContractAt("Comptroller", comptrollerDeployment.address); + await comptroller._setAccessControl(accessControl.address); + const oracle = await smock.fake("PriceOracle"); + + accessControl.isAllowedToCall.returns(true); + await comptroller._setPriceOracle(oracle.address); + const names = ["OMG", "ZRX", "BAT", "sketch"]; + const [OMG, ZRX, BAT, SKT] = await Promise.all( + names.map(async name => { + const vToken = await smock.fake("VBep20Immutable"); + if (name !== "sketch") { + await comptroller._supportMarket(vToken.address); + } + return vToken; + }), + ); + const allTokens = [OMG, ZRX, BAT]; + return { accessControl, comptroller, oracle, OMG, ZRX, BAT, SKT, allTokens, names }; +} + +function configure({ accessControl, allTokens, names }: PauseFixture) { + accessControl.isAllowedToCall.reset(); + accessControl.isAllowedToCall.returns(true); + allTokens.map((vToken, i) => { + vToken.isVToken.returns(true); + vToken.symbol.returns(names[i]); + vToken.name.returns(names[i]); + vToken.getAccountSnapshot.returns([0, 0, 0, 0]); + }); +} + +describe("Comptroller", () => { + let comptroller: MockContract; + let OMG: FakeContract; + let ZRX: FakeContract; + let BAT: FakeContract; + let SKT: FakeContract; + + beforeEach(async () => { + const contracts = await loadFixture(pauseFixture); + configure(contracts); + ({ comptroller, OMG, ZRX, BAT, SKT } = contracts); + }); + + describe("_setActionsPaused", () => { + it("reverts if the market is not listed", async () => { + await expect(comptroller._setActionsPaused([SKT.address], [1], true)).to.be.revertedWith("market not listed"); + }); + + it("does nothing if the actions list is empty", async () => { + await comptroller._setActionsPaused([OMG.address, ZRX.address], [], true); + expect(await comptroller.actionPaused(OMG.address, 1)).to.equal(false); + expect(await comptroller.actionPaused(ZRX.address, 2)).to.equal(false); + }); + + it("does nothing if the markets list is empty", async () => { + await comptroller._setActionsPaused([], [1, 2, 3, 4, 5], true); + expect(await comptroller.actionPaused(OMG.address, 1)).to.equal(false); + expect(await comptroller.actionPaused(ZRX.address, 2)).to.equal(false); + }); + + it("can pause one action on several markets", async () => { + await comptroller._setActionsPaused([OMG.address, BAT.address], [1], true); + expect(await comptroller.actionPaused(OMG.address, 1)).to.equal(true); + expect(await comptroller.actionPaused(ZRX.address, 1)).to.equal(false); + expect(await comptroller.actionPaused(BAT.address, 1)).to.equal(true); + }); + + it("can pause several actions on one market", async () => { + await comptroller._setActionsPaused([OMG.address], [3, 5, 6], true); + expect(await comptroller.actionPaused(OMG.address, 3)).to.equal(true); + expect(await comptroller.actionPaused(OMG.address, 4)).to.equal(false); + expect(await comptroller.actionPaused(OMG.address, 5)).to.equal(true); + expect(await comptroller.actionPaused(OMG.address, 6)).to.equal(true); + }); + + it("can pause and unpause several actions on several markets", async () => { + await comptroller._setActionsPaused([OMG.address, BAT.address, ZRX.address], [3, 4, 5, 6], true); + await comptroller._setActionsPaused([ZRX.address, BAT.address], [3, 5], false); + expect(await comptroller.actionPaused(OMG.address, 3)).to.equal(true); + expect(await comptroller.actionPaused(OMG.address, 4)).to.equal(true); + expect(await comptroller.actionPaused(OMG.address, 5)).to.equal(true); + expect(await comptroller.actionPaused(OMG.address, 6)).to.equal(true); + expect(await comptroller.actionPaused(ZRX.address, 3)).to.equal(false); + expect(await comptroller.actionPaused(ZRX.address, 4)).to.equal(true); + expect(await comptroller.actionPaused(ZRX.address, 5)).to.equal(false); + expect(await comptroller.actionPaused(ZRX.address, 6)).to.equal(true); + expect(await comptroller.actionPaused(BAT.address, 3)).to.equal(false); + expect(await comptroller.actionPaused(BAT.address, 4)).to.equal(true); + expect(await comptroller.actionPaused(BAT.address, 5)).to.equal(false); + expect(await comptroller.actionPaused(BAT.address, 6)).to.equal(true); + }); + }); +}); From d6f81f0aa194c31c6040a21fb47e1bb929b13580 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Wed, 22 Mar 2023 13:14:53 +0530 Subject: [PATCH 030/153] Refactor VToken and ComptrollerLens. --- contracts/Lens/ComptrollerLens.sol | 18 +++++++++--------- contracts/Tokens/VTokens/VToken.sol | 4 +--- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/contracts/Lens/ComptrollerLens.sol b/contracts/Lens/ComptrollerLens.sol index cbc609028..be69af56a 100644 --- a/contracts/Lens/ComptrollerLens.sol +++ b/contracts/Lens/ComptrollerLens.sol @@ -44,8 +44,8 @@ contract ComptrollerLens is ComptrollerLensInterface, ComptrollerErrorReporter, uint actualRepayAmount ) external view returns (uint, uint) { /* Read oracle prices for borrowed and collateral markets */ - uint priceBorrowedMantissa = Comptroller(comptroller).oracle().getUnderlyingPrice(VToken(vTokenBorrowed)); - uint priceCollateralMantissa = Comptroller(comptroller).oracle().getUnderlyingPrice(VToken(vTokenCollateral)); + uint priceBorrowedMantissa = MarketFacet(comptroller).oracle().getUnderlyingPrice(VToken(vTokenBorrowed)); + uint priceCollateralMantissa = MarketFacet(comptroller).oracle().getUnderlyingPrice(VToken(vTokenCollateral)); if (priceBorrowedMantissa == 0 || priceCollateralMantissa == 0) { return (uint(Error.PRICE_ERROR), 0); } @@ -63,7 +63,7 @@ contract ComptrollerLens is ComptrollerLensInterface, ComptrollerErrorReporter, Exp memory ratio; numerator = mul_( - Exp({ mantissa: Comptroller(comptroller).liquidationIncentiveMantissa() }), + Exp({ mantissa: MarketFacet(comptroller).liquidationIncentiveMantissa() }), Exp({ mantissa: priceBorrowedMantissa }) ); denominator = mul_(Exp({ mantissa: priceCollateralMantissa }), Exp({ mantissa: exchangeRateMantissa })); @@ -88,7 +88,7 @@ contract ComptrollerLens is ComptrollerLensInterface, ComptrollerErrorReporter, ) external view returns (uint, uint) { /* Read oracle prices for borrowed and collateral markets */ uint priceBorrowedMantissa = 1e18; // Note: this is VAI - uint priceCollateralMantissa = Comptroller(comptroller).oracle().getUnderlyingPrice(VToken(vTokenCollateral)); + uint priceCollateralMantissa = MarketFacet(comptroller).oracle().getUnderlyingPrice(VToken(vTokenCollateral)); if (priceCollateralMantissa == 0) { return (uint(Error.PRICE_ERROR), 0); } @@ -106,7 +106,7 @@ contract ComptrollerLens is ComptrollerLensInterface, ComptrollerErrorReporter, Exp memory ratio; numerator = mul_( - Exp({ mantissa: Comptroller(comptroller).liquidationIncentiveMantissa() }), + Exp({ mantissa: MarketFacet(comptroller).liquidationIncentiveMantissa() }), Exp({ mantissa: priceBorrowedMantissa }) ); denominator = mul_(Exp({ mantissa: priceCollateralMantissa }), Exp({ mantissa: exchangeRateMantissa })); @@ -138,7 +138,7 @@ contract ComptrollerLens is ComptrollerLensInterface, ComptrollerErrorReporter, uint oErr; // For each asset the account is in - VToken[] memory assets = Comptroller(comptroller).getAssetsIn(account); + VToken[] memory assets = MarketFacet(comptroller).getAssetsIn(account); uint assetsCount = assets.length; for (uint i = 0; i < assetsCount; ++i) { VToken asset = assets[i]; @@ -151,12 +151,12 @@ contract ComptrollerLens is ComptrollerLensInterface, ComptrollerErrorReporter, // semi-opaque error code, we assume NO_ERROR == 0 is invariant between upgrades return (uint(Error.SNAPSHOT_ERROR), 0, 0); } - (, uint collateralFactorMantissa, ) = Comptroller(comptroller).markets(address(asset)); + (,uint collateralFactorMantissa, ) = MarketFacet(comptroller).markets(address(asset)); vars.collateralFactor = Exp({ mantissa: collateralFactorMantissa }); vars.exchangeRate = Exp({ mantissa: vars.exchangeRateMantissa }); // Get the normalized price of the asset - vars.oraclePriceMantissa = Comptroller(comptroller).oracle().getUnderlyingPrice(asset); + vars.oraclePriceMantissa = MarketFacet(comptroller).oracle().getUnderlyingPrice(asset); if (vars.oraclePriceMantissa == 0) { return (uint(Error.PRICE_ERROR), 0, 0); } @@ -195,7 +195,7 @@ contract ComptrollerLens is ComptrollerLensInterface, ComptrollerErrorReporter, } } - VAIControllerInterface vaiController = Comptroller(comptroller).vaiController(); + VAIControllerInterface vaiController = MarketFacet(comptroller).vaiController(); if (address(vaiController) != address(0)) { vars.sumBorrowPlusEffects = add_(vars.sumBorrowPlusEffects, vaiController.getVAIRepayAmount(account)); diff --git a/contracts/Tokens/VTokens/VToken.sol b/contracts/Tokens/VTokens/VToken.sol index 46267672b..697c2a490 100644 --- a/contracts/Tokens/VTokens/VToken.sol +++ b/contracts/Tokens/VTokens/VToken.sol @@ -1,6 +1,5 @@ pragma solidity ^0.8.13; -import "../../Comptroller/ComptrollerInterface.sol"; import "../../Utils/ErrorReporter.sol"; import "../../Utils/Exponential.sol"; import "../../Tokens/EIP20Interface.sol"; @@ -488,8 +487,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { ComptrollerInterface oldComptroller = comptroller; // Ensure invoke comptroller.isComptroller() returns true - require(newComptroller.isComptroller(), "marker method returned false"); - + //require(newComptroller.isComptroller(), "marker method returned false"); // Set market's comptroller to newComptroller comptroller = newComptroller; From 295e3153ed30f5116c46c302cedd5c259bb4aca2 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Wed, 22 Mar 2023 13:16:27 +0530 Subject: [PATCH 031/153] Added getters in MarketFacet. --- contracts/Diamond/facets/MarketFacet.sol | 35 ++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/contracts/Diamond/facets/MarketFacet.sol b/contracts/Diamond/facets/MarketFacet.sol index be8c563c0..68458c369 100644 --- a/contracts/Diamond/facets/MarketFacet.sol +++ b/contracts/Diamond/facets/MarketFacet.sol @@ -31,6 +31,22 @@ contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError { return (s.markets[vToken].isListed, s.markets[vToken].collateralFactorMantissa, s.markets[vToken].isVenus); } + function venusSupplyState(address vToken) external view returns (uint224,uint){ + return (s.venusSupplyState[vToken].index, s.venusSupplyState[vToken].block); + } + + function venusBorrowState(address vToken) external view returns (uint224, uint){ + return (s.venusBorrowState[vToken].index, s.venusBorrowState[vToken].block); + } + + function venusSupplySpeeds(address vToken) external view returns (uint){ + return s.venusSupplySpeeds[vToken]; + } + + function venusBorrowSpeeds(address vToken) external view returns (uint){ + return s.venusBorrowSpeeds[vToken]; + } + function vaiController() external view returns (VAIControllerInterface) { return s.vaiController; } @@ -43,6 +59,22 @@ contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError { return s.liquidationIncentiveMantissa; } + function treasuryPercent() external view returns (uint) { + return s.treasuryPercent; + } + + function treasuryAddress() external view returns (address) { + return s.treasuryAddress; + } + + function treasuryGuardian() external view returns (address) { + return s.treasuryGuardian; + } + + function supplyCaps(address vToken) external view returns(uint) { + return s.supplyCaps[vToken]; + } + /** * @notice Calculate number of tokens of collateral asset to seize given an underlying amount * @dev Used in liquidation (called in vToken.liquidateBorrowFresh) @@ -86,6 +118,9 @@ contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError { uint[] memory results = new uint[](len); for (uint i; i < len; ++i) { results[i] = uint(LibHelper.addToMarketInternal(VToken(vTokens[i]), msg.sender)); + if(results[i] == 0){ + emit MarketEntered( VToken(vTokens[i]), msg.sender); + } } return results; From 4a4a96d5a1da176d0a322b4b3fd87dc2a3443960 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Wed, 22 Mar 2023 13:18:43 +0530 Subject: [PATCH 032/153] Updated diamond test cases. --- .../hardhat/Comptroller/Diamond/XVSSpeeds.ts | 124 ++++++++++++++++++ tests/hardhat/Comptroller/assetListTest.ts | 2 +- 2 files changed, 125 insertions(+), 1 deletion(-) create mode 100644 tests/hardhat/Comptroller/Diamond/XVSSpeeds.ts diff --git a/tests/hardhat/Comptroller/Diamond/XVSSpeeds.ts b/tests/hardhat/Comptroller/Diamond/XVSSpeeds.ts new file mode 100644 index 000000000..226e9471d --- /dev/null +++ b/tests/hardhat/Comptroller/Diamond/XVSSpeeds.ts @@ -0,0 +1,124 @@ +import { FakeContract, MockContract, smock } from "@defi-wonderland/smock"; +import chai from "chai"; +import { ethers, network } from "hardhat"; +​ +import { Comptroller, Comptroller__factory, IAccessControlManager, VToken } from "../../../../typechain"; +import { convertToUnit } from "../../../../helpers/utils"; +const { deployDiamond } = require("../../../../script/diamond/deploy"); +​ +const { expect } = chai; +chai.use(smock.matchers); +​ +describe("Comptroller", () => { + let comptroller: MockContract; + let comptrollerProxy: MockContract; + let accessControl: FakeContract; + let vToken1: FakeContract; + let vToken2: FakeContract; +​ + beforeEach(async () => { + comptroller = await deployDiamond(); + comptrollerProxy = await ethers.getContractAt("Comptroller", comptroller.address); + accessControl = await smock.fake("AccessControlManager"); + vToken1 = await smock.fake("VToken"); + vToken2 = await smock.fake("VToken"); +​ + accessControl.isAllowedToCall.returns(true); + vToken1.isVToken.returns(true); + vToken2.isVToken.returns(true); + vToken1.borrowIndex.returns(convertToUnit(0.7, 18)); +​ + await comptrollerProxy._setAccessControl(accessControl.address); + await comptrollerProxy._supportMarket(vToken1.address); + await comptrollerProxy._supportMarket(vToken2.address); + }); +​ + describe("_initializeMarket", () => { + it("Supply and borrow state after initializing the market in the pool", async () => { + const borrowRate = await comptrollerProxy.venusSupplyState(vToken1.address); + const supplyRate = await comptrollerProxy.venusBorrowState(vToken1.address); + expect(supplyRate.index).equal(convertToUnit(1, 36)); + expect(borrowRate.index).equal(convertToUnit(1, 36)); + }); + }); +​ + describe("_setVenusSpeeds", async () => { + it("Revert on invalid supplySpeeds input", async () => { + await expect( + comptrollerProxy._setVenusSpeeds( + [vToken1.address, vToken2.address], + [convertToUnit(1, 15)], + [convertToUnit(1, 15), convertToUnit(1, 15)], + ), + ).to.be.revertedWith("Comptroller::_setVenusSpeeds invalid input"); + }); +​ + it("Revert on invalid borrowSpeeds input", async () => { + await expect( + comptrollerProxy._setVenusSpeeds( + [vToken1.address, vToken2.address], + [convertToUnit(1, 15), convertToUnit(1, 15)], + [convertToUnit(1, 15)], + ), + ).to.be.revertedWith("Comptroller::_setVenusSpeeds invalid input"); + }); +​ + it("Revert for unlisted market", async () => { + const [unListedMarket] = await ethers.getSigners(); + await expect( + comptrollerProxy._setVenusSpeeds([unListedMarket.address], [convertToUnit(1, 16)], [convertToUnit(1, 15)]), + ).to.be.revertedWith("market not listed"); + }); +​ + it("Revert on invalid borrowSpeeds input", async () => { + await comptrollerProxy._setVenusSpeeds( + [vToken1.address, vToken2.address], + [convertToUnit(1, 16), convertToUnit(1, 18)], + [convertToUnit(1, 20), convertToUnit(1, 22)], + ); +​ + const token1SupplySpeed = await comptrollerProxy.venusSupplySpeeds(vToken1.address); + const token1BorrowSpeed = await comptrollerProxy.venusBorrowSpeeds(vToken1.address); +​ + expect(token1SupplySpeed).equal(convertToUnit(1, 16)); + expect(token1BorrowSpeed).equal(convertToUnit(1, 20)); +​ + const token2SupplySpeed = await comptrollerProxy.venusSupplySpeeds(vToken2.address); + const token2BorrowSpeed = await comptrollerProxy.venusBorrowSpeeds(vToken2.address); +​ + expect(token2SupplySpeed).equal(convertToUnit(1, 18)); + expect(token2BorrowSpeed).equal(convertToUnit(1, 22)); + }); +​ + it("Updating non-zero speeds after setting it zero", async () => { + // Setting the initial speeds + await comptrollerProxy._setVenusSpeeds([vToken1.address], [convertToUnit(1, 16)], [convertToUnit(1, 20)]); +​ + // Mining 1000 blocks + await network.provider.send("hardhat_mine", ["0x3e8", "0x3c"]); +​ + // Updating the speeds to zero + await comptrollerProxy._setVenusSpeeds([vToken1.address], [0], [0]); +​ + // latest Block + const blockNumber1 = await ethers.provider.getBlock("latest"); + // Mining 1000 blocks + await network.provider.send("hardhat_mine", ["0x3e8", "0x3c"]); + // Getting the last block for the updated speeds + const supplySpeedBlock1 = await comptrollerProxy.venusSupplyState(vToken1.address) + const borrowSpeedBlock1 = await comptrollerProxy.venusBorrowState(vToken1.address) +​ + // Updating the speeds to non-zero + await comptrollerProxy._setVenusSpeeds([vToken1.address], [convertToUnit(1, 16)], [convertToUnit(1, 20)]); +​ + // Getting the last block for the updated speeds + const supplySpeedBlock2 = await comptrollerProxy.venusSupplyState(vToken1.address) + const borrowSpeedBlock2 = await comptrollerProxy.venusBorrowState(vToken1.address) + // latest Block + const blockNumber2 = await ethers.provider.getBlock("latest"); +​ + expect(blockNumber2.number - blockNumber1.number).equal(Number(supplySpeedBlock2.block) - Number(supplySpeedBlock1.block)); + expect(blockNumber2.number - blockNumber1.number).equal(Number(borrowSpeedBlock2.block) - Number(borrowSpeedBlock1.block)); + }); + }); +}); \ No newline at end of file diff --git a/tests/hardhat/Comptroller/assetListTest.ts b/tests/hardhat/Comptroller/assetListTest.ts index 5c0baccd0..88b48063f 100644 --- a/tests/hardhat/Comptroller/assetListTest.ts +++ b/tests/hardhat/Comptroller/assetListTest.ts @@ -225,7 +225,7 @@ describe("assetListTest", () => { describe("entering from borrowAllowed", () => { beforeEach(async () => { - await BAT.borrowIndex.returns(convertToUnit(1, 18)); + BAT.borrowIndex.returns(convertToUnit(1, 18)); }); it("enters when called by a vtoken", async () => { From 6aa8b441b3f442c4e2a16830c3aaab82dcc78211 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Wed, 22 Mar 2023 13:25:45 +0530 Subject: [PATCH 033/153] Added diamond fork test. --- hardhat.config.ts | 10 +- tests/hardhat/Fork/diamondTest.ts | 176 ++++++++++++++++++++++++++++++ 2 files changed, 183 insertions(+), 3 deletions(-) create mode 100644 tests/hardhat/Fork/diamondTest.ts diff --git a/hardhat.config.ts b/hardhat.config.ts index e0b5a096f..d4925ad37 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -62,7 +62,9 @@ const config: HardhatUserConfig = { settings: { optimizer: { enabled: true, - runs: 200, + details: { + yul: !process.env.CI, + }, }, outputSelection: { "*": { @@ -76,7 +78,9 @@ const config: HardhatUserConfig = { settings: { optimizer: { enabled: true, - runs: 10000, + details: { + yul: !process.env.CI, + }, }, outputSelection: { "*": { @@ -147,7 +151,7 @@ function isFork() { allowUnlimitedContractSize: false, loggingEnabled: false, forking: { - url: `https://wild-blissful-dawn.bsc.discover.quiknode.pro/${process.env.QUICK_NODE_KEY}/`, + url: `https://tame-white-dinghy.bsc.discover.quiknode.pro/${process.env.QUICK_NODE_KEY}/`, blockNumber: 21068448, }, accounts: { diff --git a/tests/hardhat/Fork/diamondTest.ts b/tests/hardhat/Fork/diamondTest.ts new file mode 100644 index 000000000..130ec62df --- /dev/null +++ b/tests/hardhat/Fork/diamondTest.ts @@ -0,0 +1,176 @@ +import { FakeContract, MockContract, smock } from "@defi-wonderland/smock"; +import { impersonateAccount, loadFixture } from "@nomicfoundation/hardhat-network-helpers"; +import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers"; +import chai from "chai"; +import { checkProperties, parseUnits } from "ethers/lib/utils"; +import { ethers, constants } from "hardhat"; + + +import { + Comptroller, + ComptrollerLens, + ComptrollerLens__factory, + FaucetToken, + FaucetToken__factory, + IAccessControlManager, + PriceOracle, + VBep20Immutable +} from "../../../typechain"; + +const { deployDiamond } = require("../../../script/diamond/deploy"); + +const { expect } = chai; +chai.use(smock.matchers); + +let BUSD: FaucetToken; +let USDT: FaucetToken; +let busdUser: any; +let usdtUser: any; +let vBUSD: VBep20Immutable; +let vUSDT: VBep20Immutable; +let admin: SignerWithAddress; +let oracle: FakeContract; +let accessControl: FakeContract; +let comptrollerLens: MockContract; +let comptroller: MockContract; +let comptrollerProxy: MockContract; + +const initMainnetUser = async (user: string) => { + await impersonateAccount(user); + return ethers.getSigner(user); +}; + +async function deployComptroller() { + oracle = await smock.fake("PriceOracle"); + accessControl = await smock.fake("AccessControlManager"); + accessControl.isAllowedToCall.returns(true); + const ComptrollerLensFactory = await smock.mock("ComptrollerLens"); + comptrollerLens = await ComptrollerLensFactory.deploy(); + comptroller = await deployDiamond(); + comptrollerProxy = await ethers.getContractAt("Comptroller", comptroller.address); + await comptrollerProxy._setAccessControl(accessControl.address); + await comptrollerProxy._setComptrollerLens(comptrollerLens.address); + await comptrollerProxy._setPriceOracle(oracle.address); + await comptrollerProxy._setLiquidationIncentive(parseUnits("1", 18)); + return { oracle, comptrollerProxy, comptrollerLens, accessControl }; +} + +function configureOracle(oracle: FakeContract) { + oracle.getUnderlyingPrice.returns(parseUnits("1", 18)); + } + + async function configureVtoken(underlyingToken: FaucetToken | VBep20Immutable, name: string, symbol: string) { + const InterstRateModel = await ethers.getContractFactory("InterestRateModelHarness"); + const interestRateModel = await InterstRateModel.deploy(parseUnits("1", 12)); + await interestRateModel.deployed(); + const vTokenFactory = await ethers.getContractFactory("VBep20Immutable"); + const vToken = await vTokenFactory.deploy( + underlyingToken.address, + comptrollerProxy.address, + interestRateModel.address, + parseUnits("1", 18), + name, + symbol, + 18, + admin.address, + ); + await vToken.deployed(); + return vToken; + } + + const vTokenConfigure = async (): Promise => { + [admin] = await ethers.getSigners(); + // MAINNET USER WITH BALANCE + busdUser = await initMainnetUser("0xf977814e90da44bfa03b6295a0616a897441acec"); + usdtUser = await initMainnetUser("0xf977814e90da44bfa03b6295a0616a897441acec"); + + BUSD = FaucetToken__factory.connect("0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56", admin); + USDT = FaucetToken__factory.connect("0x55d398326f99059fF775485246999027B3197955", admin); + + }; + + +describe("diamond Contract", () => { + if (process.env.FORK_MAINNET === "true") { + // describe("Diamond setters", () => { + // beforeEach(async () => { + // await deployComptroller(); + // configureOracle(oracle); + // await loadFixture(vTokenConfigure); + // vBUSD = await configureVtoken(BUSD, "vToken BUSD", "vBUSD"); + // vUSDT = await configureVtoken(USDT, "vToken USDT", "vUSDT"); + // }) + + // it("setting market supply cap", async () => { + // await comptrollerProxy._supportMarket(vBUSD.address); + // await comptrollerProxy._setAccessControl(accessControl.address); + + // await comptrollerProxy._setMarketSupplyCaps([vBUSD.address], [parseUnits("100000", 18)]); + + // await comptrollerProxy._setPriceOracle(oracle.address); + + // await comptrollerProxy._setCollateralFactor(vBUSD.address, parseUnits("0.7", 18)); + + // // console.log(await comptrollerProxy.access()); + // const treasuryGuardian = await comptrollerProxy.treasuryGuardian(); + // const treasuryAddress = await comptrollerProxy.treasuryAddress(); + // const treasuryPercent = await comptrollerProxy.treasuryPercent(); + + // console.log("gard",treasuryGuardian); + // console.log("add",treasuryAddress); + // console.log("per",treasuryPercent); + + // expect(await comptrollerProxy.supplyCaps(vBUSD.address)).to.equals(parseUnits("100000", 18)); + + // expect(await comptrollerProxy.oracle()).to.equals(oracle.address); + // const data = await comptrollerProxy.markets(vBUSD.address); + + // expect(data.collateralFactorMantissa).to.equals(parseUnits("0.7", 18)); + + // }) + // }) + + describe("Diamond", () => { + beforeEach(async () => { + + await deployComptroller(); + configureOracle(oracle); + await loadFixture(vTokenConfigure); + vBUSD = await configureVtoken(BUSD, "vToken BUSD", "vBUSD"); + vUSDT = await configureVtoken(USDT, "vToken USDT", "vUSDT"); + await comptrollerProxy._supportMarket(vBUSD.address); + await comptrollerProxy._supportMarket(vUSDT.address); + await comptrollerProxy._setPriceOracle(oracle.address); + await comptrollerProxy.connect(usdtUser).enterMarkets([vBUSD.address, vUSDT.address]); + console.log(oracle.address); + console.log(await comptrollerProxy.oracle()); + + await comptrollerProxy._setMarketSupplyCaps([vBUSD.address], [parseUnits("100000", 18)]); + console.log("market supply cap",await comptrollerProxy.supplyCaps(vBUSD.address)); + await comptrollerProxy._setMarketSupplyCaps([vUSDT.address], [parseUnits("100000", 18)]); + await comptrollerProxy._setCollateralFactor(vBUSD.address, parseUnits("0.7", 18)); + await comptrollerProxy._setCollateralFactor(vUSDT.address, parseUnits("0.5", 18)); + }); + + it("mint vToken", async () => { + await BUSD.connect(usdtUser).transfer(vBUSD.address, 1000); + await USDT.connect(usdtUser).approve(vUSDT.address, 110); + await vUSDT.connect(usdtUser).mint(110); + await vUSDT.connect(usdtUser).redeem(10); + console.log((await vUSDT.connect(usdtUser).balanceOf(usdtUser.address)).toString()); + console.log((await vUSDT.getAccountSnapshot(usdtUser.address)).toString()); + + console.log("borrow"); + await expect(vBUSD.connect(usdtUser).borrow(10)).to.emit(vBUSD, "Borrow"); + let borrowBalance; + [, , borrowBalance] = await vBUSD.getAccountSnapshot(usdtUser.address); + expect(borrowBalance).equal(10); + await BUSD.connect(usdtUser).approve(vBUSD.address, 10); + await vBUSD.connect(usdtUser).repayBorrow(10); + [, , borrowBalance] = await vBUSD.getAccountSnapshot(usdtUser.address); + expect(borrowBalance).equal(0); + }); + }); + +} +}); \ No newline at end of file From 169916e02187b5ac4da84b92862ce05ef4beece4 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Wed, 22 Mar 2023 17:26:35 +0530 Subject: [PATCH 034/153] Fixed test. --- tests/hardhat/Fork/diamondTest.ts | 67 ++++++++++++++++--------------- 1 file changed, 34 insertions(+), 33 deletions(-) diff --git a/tests/hardhat/Fork/diamondTest.ts b/tests/hardhat/Fork/diamondTest.ts index 130ec62df..2c5ec74f0 100644 --- a/tests/hardhat/Fork/diamondTest.ts +++ b/tests/hardhat/Fork/diamondTest.ts @@ -2,8 +2,8 @@ import { FakeContract, MockContract, smock } from "@defi-wonderland/smock"; import { impersonateAccount, loadFixture } from "@nomicfoundation/hardhat-network-helpers"; import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers"; import chai from "chai"; -import { checkProperties, parseUnits } from "ethers/lib/utils"; -import { ethers, constants } from "hardhat"; +import { parseUnits } from "ethers/lib/utils"; +import { ethers } from "hardhat"; import { @@ -42,7 +42,7 @@ const initMainnetUser = async (user: string) => { async function deployComptroller() { oracle = await smock.fake("PriceOracle"); - accessControl = await smock.fake("AccessControlManager"); + accessControl = await smock.fake("IAccessControlManager"); accessControl.isAllowedToCall.returns(true); const ComptrollerLensFactory = await smock.mock("ComptrollerLens"); comptrollerLens = await ComptrollerLensFactory.deploy(); @@ -90,50 +90,51 @@ function configureOracle(oracle: FakeContract) { }; -describe("diamond Contract", () => { +describe.only("diamond Contract", () => { if (process.env.FORK_MAINNET === "true") { - // describe("Diamond setters", () => { - // beforeEach(async () => { - // await deployComptroller(); - // configureOracle(oracle); - // await loadFixture(vTokenConfigure); - // vBUSD = await configureVtoken(BUSD, "vToken BUSD", "vBUSD"); - // vUSDT = await configureVtoken(USDT, "vToken USDT", "vUSDT"); - // }) + before(async() => { + await deployComptroller(); + }) - // it("setting market supply cap", async () => { - // await comptrollerProxy._supportMarket(vBUSD.address); - // await comptrollerProxy._setAccessControl(accessControl.address); + describe("Diamond setters", () => { + beforeEach(async () => { + configureOracle(oracle); + await loadFixture(vTokenConfigure); + vBUSD = await configureVtoken(BUSD, "vToken BUSD", "vBUSD"); + vUSDT = await configureVtoken(USDT, "vToken USDT", "vUSDT"); + }) + + it("setting market supply cap", async () => { + await comptrollerProxy._supportMarket(vBUSD.address); + await comptrollerProxy._setAccessControl(accessControl.address); - // await comptrollerProxy._setMarketSupplyCaps([vBUSD.address], [parseUnits("100000", 18)]); + await comptrollerProxy._setMarketSupplyCaps([vBUSD.address], [parseUnits("100000", 18)]); - // await comptrollerProxy._setPriceOracle(oracle.address); + await comptrollerProxy._setPriceOracle(oracle.address); - // await comptrollerProxy._setCollateralFactor(vBUSD.address, parseUnits("0.7", 18)); + await comptrollerProxy._setCollateralFactor(vBUSD.address, parseUnits("0.7", 18)); - // // console.log(await comptrollerProxy.access()); - // const treasuryGuardian = await comptrollerProxy.treasuryGuardian(); - // const treasuryAddress = await comptrollerProxy.treasuryAddress(); - // const treasuryPercent = await comptrollerProxy.treasuryPercent(); + // console.log(await comptrollerProxy.access()); + const treasuryGuardian = await comptrollerProxy.treasuryGuardian(); + const treasuryAddress = await comptrollerProxy.treasuryAddress(); + const treasuryPercent = await comptrollerProxy.treasuryPercent(); - // console.log("gard",treasuryGuardian); - // console.log("add",treasuryAddress); - // console.log("per",treasuryPercent); + console.log("gard",treasuryGuardian); + console.log("add",treasuryAddress); + console.log("per",treasuryPercent); - // expect(await comptrollerProxy.supplyCaps(vBUSD.address)).to.equals(parseUnits("100000", 18)); + expect(await comptrollerProxy.supplyCaps(vBUSD.address)).to.equals(parseUnits("100000", 18)); - // expect(await comptrollerProxy.oracle()).to.equals(oracle.address); - // const data = await comptrollerProxy.markets(vBUSD.address); + expect(await comptrollerProxy.oracle()).to.equals(oracle.address); + const data = await comptrollerProxy.markets(vBUSD.address); - // expect(data.collateralFactorMantissa).to.equals(parseUnits("0.7", 18)); + expect(data.collateralFactorMantissa).to.equals(parseUnits("0.7", 18)); - // }) - // }) + }) + }) describe("Diamond", () => { beforeEach(async () => { - - await deployComptroller(); configureOracle(oracle); await loadFixture(vTokenConfigure); vBUSD = await configureVtoken(BUSD, "vToken BUSD", "vBUSD"); From aa924bf74eaaa8da1a48b8f601008cab77531e12 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Wed, 22 Mar 2023 19:03:23 +0530 Subject: [PATCH 035/153] Update diamond fork test. --- contracts/Diamond/facets/MarketFacet.sol | 5 + contracts/Tokens/VTokens/VToken.sol | 2 +- tests/hardhat/Fork/diamondTest.ts | 211 ++++++++++++----------- 3 files changed, 116 insertions(+), 102 deletions(-) diff --git a/contracts/Diamond/facets/MarketFacet.sol b/contracts/Diamond/facets/MarketFacet.sol index 68458c369..7cc63ae17 100644 --- a/contracts/Diamond/facets/MarketFacet.sol +++ b/contracts/Diamond/facets/MarketFacet.sol @@ -75,6 +75,11 @@ contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError { return s.supplyCaps[vToken]; } + /// @notice Indicator that this is a Comptroller contract (for inspection) + function isComptroller() external view returns(bool) { + return true; + } + /** * @notice Calculate number of tokens of collateral asset to seize given an underlying amount * @dev Used in liquidation (called in vToken.liquidateBorrowFresh) diff --git a/contracts/Tokens/VTokens/VToken.sol b/contracts/Tokens/VTokens/VToken.sol index 697c2a490..069859e56 100644 --- a/contracts/Tokens/VTokens/VToken.sol +++ b/contracts/Tokens/VTokens/VToken.sol @@ -487,7 +487,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { ComptrollerInterface oldComptroller = comptroller; // Ensure invoke comptroller.isComptroller() returns true - //require(newComptroller.isComptroller(), "marker method returned false"); + require(newComptroller.isComptroller(), "marker method returned false"); // Set market's comptroller to newComptroller comptroller = newComptroller; diff --git a/tests/hardhat/Fork/diamondTest.ts b/tests/hardhat/Fork/diamondTest.ts index 2c5ec74f0..06708f62a 100644 --- a/tests/hardhat/Fork/diamondTest.ts +++ b/tests/hardhat/Fork/diamondTest.ts @@ -5,7 +5,6 @@ import chai from "chai"; import { parseUnits } from "ethers/lib/utils"; import { ethers } from "hardhat"; - import { Comptroller, ComptrollerLens, @@ -14,7 +13,9 @@ import { FaucetToken__factory, IAccessControlManager, PriceOracle, - VBep20Immutable + VBep20Immutable, + VToken__factory, + XVS__factory, } from "../../../typechain"; const { deployDiamond } = require("../../../script/diamond/deploy"); @@ -26,6 +27,8 @@ let BUSD: FaucetToken; let USDT: FaucetToken; let busdUser: any; let usdtUser: any; +let XVS: any; +let XVSV: any; let vBUSD: VBep20Immutable; let vUSDT: VBep20Immutable; let admin: SignerWithAddress; @@ -56,122 +59,128 @@ async function deployComptroller() { } function configureOracle(oracle: FakeContract) { - oracle.getUnderlyingPrice.returns(parseUnits("1", 18)); - } - - async function configureVtoken(underlyingToken: FaucetToken | VBep20Immutable, name: string, symbol: string) { - const InterstRateModel = await ethers.getContractFactory("InterestRateModelHarness"); - const interestRateModel = await InterstRateModel.deploy(parseUnits("1", 12)); - await interestRateModel.deployed(); - const vTokenFactory = await ethers.getContractFactory("VBep20Immutable"); - const vToken = await vTokenFactory.deploy( - underlyingToken.address, - comptrollerProxy.address, - interestRateModel.address, - parseUnits("1", 18), - name, - symbol, - 18, - admin.address, - ); - await vToken.deployed(); - return vToken; - } + oracle.getUnderlyingPrice.returns(parseUnits("1", 18)); +} - const vTokenConfigure = async (): Promise => { - [admin] = await ethers.getSigners(); - // MAINNET USER WITH BALANCE - busdUser = await initMainnetUser("0xf977814e90da44bfa03b6295a0616a897441acec"); - usdtUser = await initMainnetUser("0xf977814e90da44bfa03b6295a0616a897441acec"); - - BUSD = FaucetToken__factory.connect("0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56", admin); - USDT = FaucetToken__factory.connect("0x55d398326f99059fF775485246999027B3197955", admin); - - }; - +async function configureVtoken(underlyingToken: FaucetToken | VBep20Immutable, name: string, symbol: string) { + const InterstRateModel = await ethers.getContractFactory("InterestRateModelHarness"); + const interestRateModel = await InterstRateModel.deploy(parseUnits("1", 12)); + await interestRateModel.deployed(); + const vTokenFactory = await ethers.getContractFactory("VBep20Immutable"); + const vToken = await vTokenFactory.deploy( + underlyingToken.address, + comptrollerProxy.address, + interestRateModel.address, + parseUnits("1", 18), + name, + symbol, + 18, + admin.address, + ); + await vToken.deployed(); + return vToken; +} + +const vTokenConfigure = async (): Promise => { + [admin] = await ethers.getSigners(); + // MAINNET USER WITH BALANCE + busdUser = await initMainnetUser("0xf977814e90da44bfa03b6295a0616a897441acec"); + usdtUser = await initMainnetUser("0xf977814e90da44bfa03b6295a0616a897441acec"); + + BUSD = FaucetToken__factory.connect("0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56", admin); + USDT = FaucetToken__factory.connect("0x55d398326f99059fF775485246999027B3197955", admin); +}; describe.only("diamond Contract", () => { if (process.env.FORK_MAINNET === "true") { - before(async() => { + before(async () => { await deployComptroller(); - }) + }); describe("Diamond setters", () => { beforeEach(async () => { - configureOracle(oracle); - await loadFixture(vTokenConfigure); - vBUSD = await configureVtoken(BUSD, "vToken BUSD", "vBUSD"); - vUSDT = await configureVtoken(USDT, "vToken USDT", "vUSDT"); - }) - - it("setting market supply cap", async () => { + configureOracle(oracle); + await loadFixture(vTokenConfigure); + vBUSD = await configureVtoken(BUSD, "vToken BUSD", "vBUSD"); + vUSDT = await configureVtoken(USDT, "vToken USDT", "vUSDT"); await comptrollerProxy._supportMarket(vBUSD.address); await comptrollerProxy._setAccessControl(accessControl.address); + }); + it("setting market supply cap", async () => { + expect(await comptrollerProxy.supplyCaps(vBUSD.address)).to.equals(0); await comptrollerProxy._setMarketSupplyCaps([vBUSD.address], [parseUnits("100000", 18)]); - - await comptrollerProxy._setPriceOracle(oracle.address); - - await comptrollerProxy._setCollateralFactor(vBUSD.address, parseUnits("0.7", 18)); - - // console.log(await comptrollerProxy.access()); - const treasuryGuardian = await comptrollerProxy.treasuryGuardian(); - const treasuryAddress = await comptrollerProxy.treasuryAddress(); - const treasuryPercent = await comptrollerProxy.treasuryPercent(); - - console.log("gard",treasuryGuardian); - console.log("add",treasuryAddress); - console.log("per",treasuryPercent); - expect(await comptrollerProxy.supplyCaps(vBUSD.address)).to.equals(parseUnits("100000", 18)); + }); + it("setting PriceOracle", async () => { + await comptrollerProxy._setPriceOracle(oracle.address); expect(await comptrollerProxy.oracle()).to.equals(oracle.address); - const data = await comptrollerProxy.markets(vBUSD.address); + }); + it("setting collateral factor", async () => { + let data = await comptrollerProxy.markets(vBUSD.address); + expect(data.collateralFactorMantissa).to.equals(0); + await comptrollerProxy._setCollateralFactor(vBUSD.address, parseUnits("0.7", 18)); + data = await comptrollerProxy.markets(vBUSD.address); expect(data.collateralFactorMantissa).to.equals(parseUnits("0.7", 18)); - - }) - }) + }); + }); describe("Diamond", () => { - beforeEach(async () => { - configureOracle(oracle); - await loadFixture(vTokenConfigure); - vBUSD = await configureVtoken(BUSD, "vToken BUSD", "vBUSD"); - vUSDT = await configureVtoken(USDT, "vToken USDT", "vUSDT"); - await comptrollerProxy._supportMarket(vBUSD.address); - await comptrollerProxy._supportMarket(vUSDT.address); - await comptrollerProxy._setPriceOracle(oracle.address); - await comptrollerProxy.connect(usdtUser).enterMarkets([vBUSD.address, vUSDT.address]); - console.log(oracle.address); - console.log(await comptrollerProxy.oracle()); - - await comptrollerProxy._setMarketSupplyCaps([vBUSD.address], [parseUnits("100000", 18)]); - console.log("market supply cap",await comptrollerProxy.supplyCaps(vBUSD.address)); - await comptrollerProxy._setMarketSupplyCaps([vUSDT.address], [parseUnits("100000", 18)]); - await comptrollerProxy._setCollateralFactor(vBUSD.address, parseUnits("0.7", 18)); - await comptrollerProxy._setCollateralFactor(vUSDT.address, parseUnits("0.5", 18)); - }); - - it("mint vToken", async () => { - await BUSD.connect(usdtUser).transfer(vBUSD.address, 1000); - await USDT.connect(usdtUser).approve(vUSDT.address, 110); - await vUSDT.connect(usdtUser).mint(110); - await vUSDT.connect(usdtUser).redeem(10); - console.log((await vUSDT.connect(usdtUser).balanceOf(usdtUser.address)).toString()); - console.log((await vUSDT.getAccountSnapshot(usdtUser.address)).toString()); - - console.log("borrow"); - await expect(vBUSD.connect(usdtUser).borrow(10)).to.emit(vBUSD, "Borrow"); - let borrowBalance; - [, , borrowBalance] = await vBUSD.getAccountSnapshot(usdtUser.address); - expect(borrowBalance).equal(10); - await BUSD.connect(usdtUser).approve(vBUSD.address, 10); - await vBUSD.connect(usdtUser).repayBorrow(10); - [, , borrowBalance] = await vBUSD.getAccountSnapshot(usdtUser.address); - expect(borrowBalance).equal(0); - }); + beforeEach(async () => { + configureOracle(oracle); + await loadFixture(vTokenConfigure); + vBUSD = await configureVtoken(BUSD, "vToken BUSD", "vBUSD"); + vUSDT = await configureVtoken(USDT, "vToken USDT", "vUSDT"); + await comptrollerProxy._supportMarket(vBUSD.address); + await comptrollerProxy._supportMarket(vUSDT.address); + await comptrollerProxy._setPriceOracle(oracle.address); + await comptrollerProxy.connect(usdtUser).enterMarkets([vBUSD.address, vUSDT.address]); + await comptrollerProxy._setMarketSupplyCaps([vBUSD.address], [parseUnits("100000", 18)]); + await comptrollerProxy._setMarketSupplyCaps([vUSDT.address], [parseUnits("100000", 18)]); + await comptrollerProxy._setCollateralFactor(vBUSD.address, parseUnits("0.7", 18)); + await comptrollerProxy._setCollateralFactor(vUSDT.address, parseUnits("0.5", 18)); + }); + + it("mint vToken", async () => { + await BUSD.connect(usdtUser).transfer(vBUSD.address, 1000); + await USDT.connect(usdtUser).approve(vUSDT.address, 110); + await vUSDT.connect(usdtUser).mint(110); + expect(await vUSDT.connect(usdtUser).balanceOf(usdtUser.address)).equal(110); + }); + + it("redeem vToken", async () => { + await BUSD.connect(usdtUser).transfer(vBUSD.address, 1000); + await USDT.connect(usdtUser).approve(vUSDT.address, 110); + await vUSDT.connect(usdtUser).mint(110); + await vUSDT.connect(usdtUser).redeem(10); + expect(await vUSDT.connect(usdtUser).balanceOf(usdtUser.address)).equal(100); + }); + + it("Burn vToken", async () => { + await BUSD.connect(usdtUser).transfer(vBUSD.address, 1000); + await USDT.connect(usdtUser).approve(vUSDT.address, 110); + await vUSDT.connect(usdtUser).mint(110); + await expect(vBUSD.connect(usdtUser).borrow(10)).to.emit(vBUSD, "Borrow"); + let borrowBalance; + [, , borrowBalance] = await vBUSD.getAccountSnapshot(usdtUser.address); + expect(borrowBalance).equal(10); + }); + + it("Repay vToken", async () => { + await BUSD.connect(usdtUser).transfer(vBUSD.address, 1000); + await USDT.connect(usdtUser).approve(vUSDT.address, 110); + await vUSDT.connect(usdtUser).mint(110); + await vBUSD.connect(usdtUser).borrow(10); + let borrowBalance; + [, , borrowBalance] = await vBUSD.getAccountSnapshot(usdtUser.address); + expect(borrowBalance).equal(10); + await BUSD.connect(usdtUser).approve(vBUSD.address, 10); + await vBUSD.connect(usdtUser).repayBorrow(10); + [, , borrowBalance] = await vBUSD.getAccountSnapshot(usdtUser.address); + expect(borrowBalance).equal(0); + }); }); - -} -}); \ No newline at end of file + } +}); From 9baa70307022bb32ad19cb3fa119d4cad4e4c9fd Mon Sep 17 00:00:00 2001 From: defcon022 Date: Wed, 22 Mar 2023 20:02:16 +0530 Subject: [PATCH 036/153] Added rewards diamond fork test. --- contracts/Diamond/facets/MarketFacet.sol | 16 ++++---- contracts/Diamond/facets/RewardFacet.sol | 4 +- contracts/Lens/ComptrollerLens.sol | 2 +- hardhat.config.ts | 2 +- script/diamond/deploy.js | 12 ++---- .../Comptroller/Diamond/assetListTest.ts | 14 +------ tests/hardhat/Fork/diamondTest.ts | 37 ++++++++++++++++++- 7 files changed, 53 insertions(+), 34 deletions(-) diff --git a/contracts/Diamond/facets/MarketFacet.sol b/contracts/Diamond/facets/MarketFacet.sol index 7cc63ae17..3e7b61642 100644 --- a/contracts/Diamond/facets/MarketFacet.sol +++ b/contracts/Diamond/facets/MarketFacet.sol @@ -31,19 +31,19 @@ contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError { return (s.markets[vToken].isListed, s.markets[vToken].collateralFactorMantissa, s.markets[vToken].isVenus); } - function venusSupplyState(address vToken) external view returns (uint224,uint){ + function venusSupplyState(address vToken) external view returns (uint224, uint) { return (s.venusSupplyState[vToken].index, s.venusSupplyState[vToken].block); } - function venusBorrowState(address vToken) external view returns (uint224, uint){ + function venusBorrowState(address vToken) external view returns (uint224, uint) { return (s.venusBorrowState[vToken].index, s.venusBorrowState[vToken].block); } - function venusSupplySpeeds(address vToken) external view returns (uint){ + function venusSupplySpeeds(address vToken) external view returns (uint) { return s.venusSupplySpeeds[vToken]; } - function venusBorrowSpeeds(address vToken) external view returns (uint){ + function venusBorrowSpeeds(address vToken) external view returns (uint) { return s.venusBorrowSpeeds[vToken]; } @@ -71,12 +71,12 @@ contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError { return s.treasuryGuardian; } - function supplyCaps(address vToken) external view returns(uint) { + function supplyCaps(address vToken) external view returns (uint) { return s.supplyCaps[vToken]; } /// @notice Indicator that this is a Comptroller contract (for inspection) - function isComptroller() external view returns(bool) { + function isComptroller() external view returns (bool) { return true; } @@ -123,8 +123,8 @@ contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError { uint[] memory results = new uint[](len); for (uint i; i < len; ++i) { results[i] = uint(LibHelper.addToMarketInternal(VToken(vTokens[i]), msg.sender)); - if(results[i] == 0){ - emit MarketEntered( VToken(vTokens[i]), msg.sender); + if (results[i] == 0) { + emit MarketEntered(VToken(vTokens[i]), msg.sender); } } diff --git a/contracts/Diamond/facets/RewardFacet.sol b/contracts/Diamond/facets/RewardFacet.sol index 4d510d201..c46cbf592 100644 --- a/contracts/Diamond/facets/RewardFacet.sol +++ b/contracts/Diamond/facets/RewardFacet.sol @@ -239,7 +239,7 @@ contract RewardFacet is ComptrollerErrorReporter, ExponentialNoError { function updateVenusBorrowIndex(address vToken, ExponentialNoError.Exp memory marketBorrowIndex) internal { VenusMarketState storage borrowState = s.venusBorrowState[vToken]; uint borrowSpeed = s.venusBorrowSpeeds[vToken]; - uint32 blockNumber = safe32(LibAccessCheck.getBlockNumber(), "block number exceeds 32 bits"); + uint blockNumber = block.number; uint deltaBlocks = sub_(uint(blockNumber), uint(borrowState.block)); if (deltaBlocks > 0 && borrowSpeed > 0) { uint borrowAmount = div_(VToken(vToken).totalBorrows(), marketBorrowIndex); @@ -262,7 +262,7 @@ contract RewardFacet is ComptrollerErrorReporter, ExponentialNoError { function updateVenusSupplyIndex(address vToken) internal { VenusMarketState storage supplyState = s.venusSupplyState[vToken]; uint supplySpeed = s.venusSupplySpeeds[vToken]; - uint32 blockNumber = safe32(LibAccessCheck.getBlockNumber(), "block number exceeds 32 bits"); + uint blockNumber = block.number; uint deltaBlocks = sub_(uint(blockNumber), uint(supplyState.block)); if (deltaBlocks > 0 && supplySpeed > 0) { uint supplyTokens = VToken(vToken).totalSupply(); diff --git a/contracts/Lens/ComptrollerLens.sol b/contracts/Lens/ComptrollerLens.sol index be69af56a..6e4a36575 100644 --- a/contracts/Lens/ComptrollerLens.sol +++ b/contracts/Lens/ComptrollerLens.sol @@ -151,7 +151,7 @@ contract ComptrollerLens is ComptrollerLensInterface, ComptrollerErrorReporter, // semi-opaque error code, we assume NO_ERROR == 0 is invariant between upgrades return (uint(Error.SNAPSHOT_ERROR), 0, 0); } - (,uint collateralFactorMantissa, ) = MarketFacet(comptroller).markets(address(asset)); + (, uint collateralFactorMantissa, ) = MarketFacet(comptroller).markets(address(asset)); vars.collateralFactor = Exp({ mantissa: collateralFactorMantissa }); vars.exchangeRate = Exp({ mantissa: vars.exchangeRateMantissa }); diff --git a/hardhat.config.ts b/hardhat.config.ts index d4925ad37..7b8b9cd56 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -155,7 +155,7 @@ function isFork() { blockNumber: 21068448, }, accounts: { - accountsBalance: "1000000000000000000", + accountsBalance: "1000000000000000000000", }, live: false, } diff --git a/script/diamond/deploy.js b/script/diamond/deploy.js index 2ad98af03..d7cd23b15 100644 --- a/script/diamond/deploy.js +++ b/script/diamond/deploy.js @@ -39,15 +39,9 @@ async function deployDiamond() { let index = 0; for (const FacetName of FacetNames) { let Facet; - if (FacetName == "RewardFacet") { - Facet = await ethers.getContractFactory(FacetName, { - libraries: { - LibAccessCheck: await accounts[3].getAddress(), - }, - }); - } else { - Facet = await ethers.getContractFactory(FacetName); - } + + Facet = await ethers.getContractFactory(FacetName); + const facet = await Facet.deploy(); await facet.deployed(); cut.push({ diff --git a/tests/hardhat/Comptroller/Diamond/assetListTest.ts b/tests/hardhat/Comptroller/Diamond/assetListTest.ts index 777ab949b..0923df080 100644 --- a/tests/hardhat/Comptroller/Diamond/assetListTest.ts +++ b/tests/hardhat/Comptroller/Diamond/assetListTest.ts @@ -101,26 +101,21 @@ describe("assetListTest", () => { expectedTokens: FakeContract[], expectedErrors: ComptrollerErrorReporter.Error[] | null = null, ) { - //console.log("1----"); - const reply = await comptrollerProxy.connect(customer).callStatic.enterMarkets(enterTokens.map(t => t.address)); const receipt = await comptrollerProxy.connect(customer).enterMarkets(enterTokens.map(t => t.address)); - //console.log("2----"); + const assetsIn = await comptrollerProxy.getAssetsIn(await customer.getAddress()); const expectedErrors_ = expectedErrors || enterTokens.map(_ => Error.NO_ERROR); - //console.log("3----"); reply.forEach((tokenReply, i) => { expect(tokenReply).to.equal(expectedErrors_[i]); }); - //console.log("4----"); expect(receipt).to.emit(comptroller, "MarketEntered"); expect(assetsIn).to.deep.equal(expectedTokens.map(t => t.address)); await checkMarkets(expectedTokens); - //console.log("5----"); return receipt; } @@ -136,24 +131,19 @@ describe("assetListTest", () => { expectedTokens: FakeContract[], expectedError: ComptrollerErrorReporter.Error = Error.NO_ERROR, ) { - //console.log("1++++"); const reply = await comptrollerProxy.connect(customer).callStatic.exitMarket(exitToken.address); - //console.log("2++++"); const receipt = await comptrollerProxy.connect(customer).exitMarket(exitToken.address); const assetsIn = await comptrollerProxy.getAssetsIn(await customer.getAddress()); - //console.log("3++++"); expect(reply).to.equal(expectedError); expect(assetsIn).to.deep.equal(expectedTokens.map(t => t.address)); - //console.log("4++++"); await checkMarkets(expectedTokens); - ////console.log("5++++"); return receipt; } describe("enterMarkets", () => { - it("properly emits events", async () => { + it.only("properly emits events", async () => { const tx1 = await enterAndCheckMarkets([OMG], [OMG]); const tx2 = await enterAndCheckMarkets([OMG], [OMG]); expect(tx1).to.emit(comptroller, "MarketEntered").withArgs(OMG.address, customer); diff --git a/tests/hardhat/Fork/diamondTest.ts b/tests/hardhat/Fork/diamondTest.ts index 06708f62a..d0bbbd7e0 100644 --- a/tests/hardhat/Fork/diamondTest.ts +++ b/tests/hardhat/Fork/diamondTest.ts @@ -127,7 +127,7 @@ describe.only("diamond Contract", () => { }); }); - describe("Diamond", () => { + describe("Diamond Hooks", () => { beforeEach(async () => { configureOracle(oracle); await loadFixture(vTokenConfigure); @@ -181,6 +181,41 @@ describe.only("diamond Contract", () => { [, , borrowBalance] = await vBUSD.getAccountSnapshot(usdtUser.address); expect(borrowBalance).equal(0); }); + + describe.only("Diamond Rewards", () => { + it("grant and claim rewards", async () => { + await BUSD.connect(usdtUser).transfer(vBUSD.address, 1000); + await USDT.connect(usdtUser).approve(vUSDT.address, 110); + await vUSDT.connect(usdtUser).mint(110); + await vUSDT.connect(usdtUser).redeem(10); + await expect(vBUSD.connect(usdtUser).borrow(10)).to.emit(vBUSD, "Borrow"); + let borrowBalance; + [, , borrowBalance] = await vBUSD.getAccountSnapshot(usdtUser.address); + expect(borrowBalance).equal(10); + await BUSD.connect(usdtUser).approve(vBUSD.address, 10); + await vBUSD.connect(usdtUser).repayBorrow(10); + let xvsS = await comptrollerProxy.getXVSAddress(); + + let vxvsS = await comptrollerProxy.getXVSVTokenAddress(); + XVS = XVS__factory.connect(xvsS, admin); + XVSV = VToken__factory.connect(vxvsS, admin); + + const usdtUserBalance = await XVS.connect(usdtUser).balanceOf(usdtUser.address).toString(); + + await XVS.approve("0xce1c6851843125167c223423bb3b88c465b96107", 100); + await XVS.connect(usdtUser).transfer("0xce1c6851843125167c223423bb3b88c465b96107", 100); + expect(await XVS.connect(usdtUser).balanceOf("0xce1c6851843125167c223423bb3b88c465b96107")).equal(100); + expect(await XVS.connect(usdtUser).balanceOf(usdtUser.address)).equal( + parseUnits("4946633239619992136668403", 0), + ); + + expect(await comptrollerProxy._grantXVS(usdtUser.address, 10)).to.emit(XVS, "VenusGranted"); + await comptrollerProxy.claimVenusAsCollateral(usdtUser.address); + expect(await XVS.connect(usdtUser).balanceOf(usdtUser.address)).equal( + parseUnits("4946633239619992136668413", 0), + ); + }); + }); }); } }); From 2b3e2ae55b2f09a754f915abc8037385c43328d4 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Thu, 23 Mar 2023 20:53:49 +0530 Subject: [PATCH 037/153] add: getter in Market facet --- contracts/Diamond/facets/MarketFacet.sol | 30 +++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/contracts/Diamond/facets/MarketFacet.sol b/contracts/Diamond/facets/MarketFacet.sol index 3e7b61642..6745c681a 100644 --- a/contracts/Diamond/facets/MarketFacet.sol +++ b/contracts/Diamond/facets/MarketFacet.sol @@ -75,8 +75,36 @@ contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError { return s.supplyCaps[vToken]; } + function maxAssets() external view returns (uint) { + return s.maxAssets; + } + + function closeFactorMantissa() external view returns (uint) { + return s.closeFactorMantissa; + } + + function allMarkets(uint index) external view returns (VToken) { + return s.allMarkets[index]; + } + + function venusRate() external view returns (uint) { + return s.venusRate; + } + + function venusSpeeds(address token) external view returns (uint) { + return s.venusSpeeds[token]; + } + + function venusAccrued(address token) external view returns (uint) { + return s.venusAccrued[token]; + } + + function vaiMintRate() external view returns (uint) { + return s.vaiMintRate; + } + /// @notice Indicator that this is a Comptroller contract (for inspection) - function isComptroller() external view returns (bool) { + function isComptroller() external pure returns (bool) { return true; } From 7b2eeeb5a382d9c87ea6de0d12405adb9e05d9e9 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Thu, 23 Mar 2023 20:54:27 +0530 Subject: [PATCH 038/153] fix: script owner rights and facet calls --- script/diamond/deploy.js | 37 ++++++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/script/diamond/deploy.js b/script/diamond/deploy.js index d7cd23b15..f78562ca2 100644 --- a/script/diamond/deploy.js +++ b/script/diamond/deploy.js @@ -1,11 +1,19 @@ -require("dotenv").config(); const hre = require("hardhat"); +const { impersonateAccount } = require("@nomicfoundation/hardhat-network-helpers"); + +require("dotenv").config(); + +const { Unitroller__factory } = require("../../typechain"); const { getSelectors, FacetCutAction } = require("./diamond.js"); const ethers = hre.ethers; -async function deployDiamond() { +const Owner = "0x939bd8d64c0a9583a7dcea9933f7b21697ab6396"; + +async function deployDiamond(unitrollerAddress) { const accounts = await ethers.getSigners(); const contractOwner = accounts[0]; + let unitroller; + let unitrollerAdmin; // deploy DiamondCutFacet const DiamondCutFacet = await ethers.getContractFactory("DiamondCutFacet"); @@ -17,14 +25,25 @@ async function deployDiamond() { const diamond = await Diamond.deploy(contractOwner.address); await diamond.deployed(); - const UnitrollerFactory = await ethers.getContractFactory("Unitroller"); - const unitroller = await UnitrollerFactory.deploy(); - await unitroller._setPendingImplementation(diamond.address); - await diamond._become(unitroller.address); + if (unitrollerAddress != "") { + await impersonateAccount(Owner); + unitrollerAdmin = await ethers.getSigner(Owner); + unitroller = await Unitroller__factory.connect(unitrollerAddress, unitrollerAdmin); + // await unitroller.connect(unitrollerAdmin)._setPendingAdmin(await accounts[0].getAddress()); + // await unitroller.connect(accounts[0])._acceptAdmin(); + } else { + const UnitrollerFactory = await ethers.getContractFactory("Unitroller"); + unitroller = await UnitrollerFactory.deploy(); + } + const signer = await ethers.getSigners(); + unitrollerAdmin = signer[0]; + + await unitroller.connect(unitrollerAdmin)._setPendingImplementation(diamond.address); + await diamond.connect(unitrollerAdmin)._become(unitroller.address); const compProxy = await ethers.getContractAt("Diamond", unitroller.address); - await compProxy.facetCutInitilizer(diamondCutFacet.address); + await compProxy.connect(unitrollerAdmin).facetCutInitilizer(diamondCutFacet.address); // deploy DiamondInit // DiamondInit provides a function that is called when the diamond is upgraded to initialize state variables @@ -58,12 +77,12 @@ async function deployDiamond() { let receipt; // call to init function let functionCall = diamondInit.interface.encodeFunctionData("init"); - tx = await diamondCut.diamondCut(cut, diamondInit.address, functionCall); + tx = await diamondCut.connect(unitrollerAdmin).diamondCut(cut, diamondInit.address, functionCall); receipt = await tx.wait(); if (!receipt.status) { throw Error(`Diamond upgrade failed: ${tx.hash}`); } - return unitroller; + return { unitroller, diamond }; } // We recommend this pattern to be able to use async/await everywhere From c9417cf68dca51ec11868b7aef69435c650a71d3 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Thu, 23 Mar 2023 20:55:05 +0530 Subject: [PATCH 039/153] fix: no of optimizer runs --- hardhat.config.ts | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/hardhat.config.ts b/hardhat.config.ts index 7b8b9cd56..bf843e821 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -62,9 +62,7 @@ const config: HardhatUserConfig = { settings: { optimizer: { enabled: true, - details: { - yul: !process.env.CI, - }, + runs: 200, }, outputSelection: { "*": { @@ -78,9 +76,7 @@ const config: HardhatUserConfig = { settings: { optimizer: { enabled: true, - details: { - yul: !process.env.CI, - }, + runs: 10000, }, outputSelection: { "*": { From a87f3e7aaa86cc29cadf86af971a1b137004cc17 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Thu, 23 Mar 2023 20:55:42 +0530 Subject: [PATCH 040/153] fix: comptroller diamond test for script --- tests/hardhat/Comptroller/Diamond/XVSSpeeds.ts | 4 +++- tests/hardhat/Comptroller/Diamond/accessControl.ts | 3 ++- tests/hardhat/Comptroller/Diamond/assetListTest.ts | 10 ++++++---- tests/hardhat/Comptroller/Diamond/comptrollerTest.ts | 9 ++++++--- .../Diamond/liquidateCalculateAmoutSeizeTest.ts | 3 ++- tests/hardhat/Comptroller/Diamond/pauseTest.ts | 10 +++------- 6 files changed, 22 insertions(+), 17 deletions(-) diff --git a/tests/hardhat/Comptroller/Diamond/XVSSpeeds.ts b/tests/hardhat/Comptroller/Diamond/XVSSpeeds.ts index 226e9471d..d66841946 100644 --- a/tests/hardhat/Comptroller/Diamond/XVSSpeeds.ts +++ b/tests/hardhat/Comptroller/Diamond/XVSSpeeds.ts @@ -17,7 +17,9 @@ describe("Comptroller", () => { let vToken2: FakeContract; ​ beforeEach(async () => { - comptroller = await deployDiamond(); + const result = await deployDiamond(""); + comptroller = result.unitroller; + comptrollerProxy = await ethers.getContractAt("Comptroller", comptroller.address); accessControl = await smock.fake("AccessControlManager"); vToken1 = await smock.fake("VToken"); diff --git a/tests/hardhat/Comptroller/Diamond/accessControl.ts b/tests/hardhat/Comptroller/Diamond/accessControl.ts index 6d916ca90..9d9f4ec83 100644 --- a/tests/hardhat/Comptroller/Diamond/accessControl.ts +++ b/tests/hardhat/Comptroller/Diamond/accessControl.ts @@ -21,7 +21,8 @@ describe("Comptroller", () => { user = signers[1]; userAddress = await user.getAddress(); accessControl = await smock.fake("IAccessControlManager"); - comptroller = await deployDiamond(); + const result = await deployDiamond(""); + comptroller = result.unitroller; comptrollerProxy = await ethers.getContractAt("Comptroller", comptroller.address); }); diff --git a/tests/hardhat/Comptroller/Diamond/assetListTest.ts b/tests/hardhat/Comptroller/Diamond/assetListTest.ts index 0923df080..b60fee929 100644 --- a/tests/hardhat/Comptroller/Diamond/assetListTest.ts +++ b/tests/hardhat/Comptroller/Diamond/assetListTest.ts @@ -22,7 +22,7 @@ chai.use(smock.matchers); const { Error } = ComptrollerErrorReporter; -describe("assetListTest", () => { +describe("Comptroller: assetListTest", () => { let root: Signer; // eslint-disable-line @typescript-eslint/no-unused-vars let customer: Signer; let comptroller: MockContract; @@ -49,7 +49,8 @@ describe("assetListTest", () => { const accessControl = await smock.fake("AccessControlManager"); // const ComptrollerFactory = await smock.mock("Comptroller"); const ComptrollerLensFactory = await smock.mock("ComptrollerLens"); - const comptroller = await deployDiamond(); + const result = await deployDiamond(""); + comptroller = result.unitroller; const comptrollerLens = await ComptrollerLensFactory.deploy(); const oracle = await smock.fake("PriceOracle"); accessControl.isAllowedToCall.returns(true); @@ -143,11 +144,12 @@ describe("assetListTest", () => { } describe("enterMarkets", () => { - it.only("properly emits events", async () => { + it("properly emits events", async () => { const tx1 = await enterAndCheckMarkets([OMG], [OMG]); const tx2 = await enterAndCheckMarkets([OMG], [OMG]); expect(tx1).to.emit(comptroller, "MarketEntered").withArgs(OMG.address, customer); - expect((await tx2.wait()).events).to.be.empty; + const tx2Value = await tx2.wait(); + expect(tx2Value.events?.length).to.be.equals(1); }); it("adds to the asset list only once", async () => { diff --git a/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts b/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts index 88db29e2a..29541df39 100644 --- a/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts +++ b/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts @@ -36,7 +36,8 @@ async function deploySimpleComptroller(): Promise { accessControl.isAllowedToCall.returns(true); const ComptrollerLensFactory = await smock.mock("ComptrollerLens"); // const ComptrollerFactory = await smock.mock("Comptroller"); - const comptroller = await deployDiamond(); + const result = await deployDiamond(""); + const comptroller = result.unitroller; const comptrollerProxy = await ethers.getContractAt("Comptroller", comptroller.address); const comptrollerLens = await ComptrollerLensFactory.deploy(); await comptrollerProxy._setAccessControl(accessControl.address); @@ -51,7 +52,8 @@ function configureOracle(oracle: FakeContract) { } async function configureVToken(vToken: FakeContract, comptroller: MockContract) { - comptroller = await deployDiamond(); + const result = await deployDiamond(""); + comptroller = result.unitroller; vToken.comptroller.returns(comptroller.address); vToken.isVToken.returns(true); vToken.exchangeRateStored.returns(convertToUnit("2", 18)); @@ -179,7 +181,8 @@ describe("Comptroller", () => { async function deploy(): Promise { // const ComptrollerFactory = await smock.mock("Comptroller"); - const comptroller = await deployDiamond(); + const result = await deployDiamond(""); + comptroller = result.unitroller; const comptrollerProxy = await ethers.getContractAt("Comptroller", comptroller.address); const ComptrollerLensFactory = await smock.mock("ComptrollerLens"); const comptrollerLens = await ComptrollerLensFactory.deploy(); diff --git a/tests/hardhat/Comptroller/Diamond/liquidateCalculateAmoutSeizeTest.ts b/tests/hardhat/Comptroller/Diamond/liquidateCalculateAmoutSeizeTest.ts index 86f14cb74..36f8c56e1 100644 --- a/tests/hardhat/Comptroller/Diamond/liquidateCalculateAmoutSeizeTest.ts +++ b/tests/hardhat/Comptroller/Diamond/liquidateCalculateAmoutSeizeTest.ts @@ -63,7 +63,8 @@ describe("Comptroller", () => { const accessControl = await smock.fake("AccessControlManager"); // const ComptrollerFactory = await smock.mock("Comptroller"); const ComptrollerLensFactory = await smock.mock("ComptrollerLens"); - const comptroller = await deployDiamond(); + const result = await deployDiamond(""); + const comptroller = result.unitroller; comptrollerProxy = await ethers.getContractAt("Comptroller", comptroller.address); const comptrollerLens = await ComptrollerLensFactory.deploy(); const oracle = await smock.fake("PriceOracle"); diff --git a/tests/hardhat/Comptroller/Diamond/pauseTest.ts b/tests/hardhat/Comptroller/Diamond/pauseTest.ts index 2ffed372e..3220a5567 100644 --- a/tests/hardhat/Comptroller/Diamond/pauseTest.ts +++ b/tests/hardhat/Comptroller/Diamond/pauseTest.ts @@ -3,12 +3,7 @@ import { loadFixture } from "@nomicfoundation/hardhat-network-helpers"; import chai from "chai"; import { ethers } from "hardhat"; -import { - Comptroller, - IAccessControlManager, - PriceOracle, - VBep20Immutable, -} from "../../../../typechain"; +import { Comptroller, IAccessControlManager, PriceOracle, VBep20Immutable } from "../../../../typechain"; const { deployDiamond } = require("../../../../script/diamond/deploy"); @@ -29,7 +24,8 @@ type PauseFixture = { async function pauseFixture(): Promise { const accessControl = await smock.fake("IAccessControlManager"); - const comptrollerDeployment = await deployDiamond(); + const result = await deployDiamond(""); + const comptrollerDeployment = result.unitroller; const comptroller = await ethers.getContractAt("Comptroller", comptrollerDeployment.address); await comptroller._setAccessControl(accessControl.address); const oracle = await smock.fake("PriceOracle"); From 3adf8064a8d07c993cb7dbeba427c684288bc943 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Thu, 23 Mar 2023 20:56:08 +0530 Subject: [PATCH 041/153] fix: diamond layout test --- tests/hardhat/Fork/diamondTest.ts | 408 +++++++++++++++++------------- 1 file changed, 226 insertions(+), 182 deletions(-) diff --git a/tests/hardhat/Fork/diamondTest.ts b/tests/hardhat/Fork/diamondTest.ts index d0bbbd7e0..699ae8b58 100644 --- a/tests/hardhat/Fork/diamondTest.ts +++ b/tests/hardhat/Fork/diamondTest.ts @@ -1,221 +1,265 @@ -import { FakeContract, MockContract, smock } from "@defi-wonderland/smock"; +import { MockContract, smock } from "@defi-wonderland/smock"; import { impersonateAccount, loadFixture } from "@nomicfoundation/hardhat-network-helpers"; import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers"; import chai from "chai"; import { parseUnits } from "ethers/lib/utils"; -import { ethers } from "hardhat"; - -import { - Comptroller, - ComptrollerLens, - ComptrollerLens__factory, - FaucetToken, - FaucetToken__factory, - IAccessControlManager, - PriceOracle, - VBep20Immutable, - VToken__factory, - XVS__factory, -} from "../../../typechain"; +import { ethers, network } from "hardhat"; + +import { Comptroller__factory, IERC20Upgradeable, VBep20, VToken__factory, XVS__factory } from "../../../typechain"; const { deployDiamond } = require("../../../script/diamond/deploy"); const { expect } = chai; chai.use(smock.matchers); -let BUSD: FaucetToken; -let USDT: FaucetToken; -let busdUser: any; -let usdtUser: any; -let XVS: any; -let XVSV: any; -let vBUSD: VBep20Immutable; -let vUSDT: VBep20Immutable; -let admin: SignerWithAddress; -let oracle: FakeContract; -let accessControl: FakeContract; -let comptrollerLens: MockContract; -let comptroller: MockContract; -let comptrollerProxy: MockContract; +const Owner = "0x939bd8d64c0a9583a7dcea9933f7b21697ab6396"; +const UNITROLLER = "0xfD36E2c2a6789Db23113685031d7F16329158384"; +const zeroAddr = "0x0000000000000000000000000000000000000000"; +const VBUSD = "0x95c78222B3D6e262426483D42CfA53685A67Ab9D"; +const VUSDT = "0xfD5840Cd36d94D7229439859C0112a4185BC0255"; + +let owner, + unitroller, + diamondProxy, + // layout variables + maxAssets, + closeFactorMantissa, + liquidationIncentiveMantissa, + allMarkets, + venusRate, + venusSpeeds, + venusSupplyState, + venusBorrowState, + venusAccrued, + vaiMintRate; const initMainnetUser = async (user: string) => { await impersonateAccount(user); return ethers.getSigner(user); }; -async function deployComptroller() { - oracle = await smock.fake("PriceOracle"); - accessControl = await smock.fake("IAccessControlManager"); - accessControl.isAllowedToCall.returns(true); - const ComptrollerLensFactory = await smock.mock("ComptrollerLens"); - comptrollerLens = await ComptrollerLensFactory.deploy(); - comptroller = await deployDiamond(); - comptrollerProxy = await ethers.getContractAt("Comptroller", comptroller.address); - await comptrollerProxy._setAccessControl(accessControl.address); - await comptrollerProxy._setComptrollerLens(comptrollerLens.address); - await comptrollerProxy._setPriceOracle(oracle.address); - await comptrollerProxy._setLiquidationIncentive(parseUnits("1", 18)); - return { oracle, comptrollerProxy, comptrollerLens, accessControl }; -} - -function configureOracle(oracle: FakeContract) { - oracle.getUnderlyingPrice.returns(parseUnits("1", 18)); +export async function setForkBlock(blockNumber: number) { + await network.provider.request({ + method: "hardhat_reset", + params: [ + { + forking: { + jsonRpcUrl: process.env.BSC_ARCHIVE_NODE, + blockNumber: blockNumber, + }, + }, + ], + }); } -async function configureVtoken(underlyingToken: FaucetToken | VBep20Immutable, name: string, symbol: string) { - const InterstRateModel = await ethers.getContractFactory("InterestRateModelHarness"); - const interestRateModel = await InterstRateModel.deploy(parseUnits("1", 12)); - await interestRateModel.deployed(); - const vTokenFactory = await ethers.getContractFactory("VBep20Immutable"); - const vToken = await vTokenFactory.deploy( - underlyingToken.address, - comptrollerProxy.address, - interestRateModel.address, - parseUnits("1", 18), - name, - symbol, - 18, - admin.address, - ); - await vToken.deployed(); - return vToken; -} - -const vTokenConfigure = async (): Promise => { - [admin] = await ethers.getSigners(); - // MAINNET USER WITH BALANCE - busdUser = await initMainnetUser("0xf977814e90da44bfa03b6295a0616a897441acec"); - usdtUser = await initMainnetUser("0xf977814e90da44bfa03b6295a0616a897441acec"); - - BUSD = FaucetToken__factory.connect("0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56", admin); - USDT = FaucetToken__factory.connect("0x55d398326f99059fF775485246999027B3197955", admin); +const forking = (blockNumber: number, fn: () => void) => { + describe(`Diamond architecture check At block #${blockNumber}`, () => { + before(async () => { + await setForkBlock(blockNumber); + }); + fn(); + }); }; -describe.only("diamond Contract", () => { +forking(26713742, () => { + let USDT: IERC20Upgradeable; + let BUSD: IERC20Upgradeable; + let usdtHolder: any; + let busdHolder: any; + let vBUSD: any; + let vUSDT: any; + let admin: SignerWithAddress; + let diamondUnitroller; + if (process.env.FORK_MAINNET === "true") { before(async () => { - await deployComptroller(); - }); + /* + * Forking mainnet + * */ - describe("Diamond setters", () => { - beforeEach(async () => { - configureOracle(oracle); - await loadFixture(vTokenConfigure); - vBUSD = await configureVtoken(BUSD, "vToken BUSD", "vBUSD"); - vUSDT = await configureVtoken(USDT, "vToken USDT", "vUSDT"); - await comptrollerProxy._supportMarket(vBUSD.address); - await comptrollerProxy._setAccessControl(accessControl.address); + /** + * sending gas cost to owner + * */ + impersonateAccount(Owner); + owner = await ethers.getSigner(Owner); + const [signer] = await ethers.getSigners(); + await signer.sendTransaction({ + to: owner.address, + value: ethers.BigNumber.from("10000000000000000000"), + data: undefined, }); - it("setting market supply cap", async () => { - expect(await comptrollerProxy.supplyCaps(vBUSD.address)).to.equals(0); - await comptrollerProxy._setMarketSupplyCaps([vBUSD.address], [parseUnits("100000", 18)]); - expect(await comptrollerProxy.supplyCaps(vBUSD.address)).to.equals(parseUnits("100000", 18)); - }); + // unitroller without diamond + unitroller = await ethers.getContractAt("Comptroller", UNITROLLER); - it("setting PriceOracle", async () => { - await comptrollerProxy._setPriceOracle(oracle.address); - expect(await comptrollerProxy.oracle()).to.equals(oracle.address); - }); + // deploy Diamond + const result = await deployDiamond(UNITROLLER); + diamondUnitroller = result.unitroller; + diamondProxy = result.diamond; - it("setting collateral factor", async () => { - let data = await comptrollerProxy.markets(vBUSD.address); - expect(data.collateralFactorMantissa).to.equals(0); - await comptrollerProxy._setCollateralFactor(vBUSD.address, parseUnits("0.7", 18)); - data = await comptrollerProxy.markets(vBUSD.address); - expect(data.collateralFactorMantissa).to.equals(parseUnits("0.7", 18)); - }); - }); + // unitroller with diamond + diamondUnitroller = await ethers.getContractAt("Comptroller", diamondUnitroller.address); - describe("Diamond Hooks", () => { - beforeEach(async () => { - configureOracle(oracle); - await loadFixture(vTokenConfigure); - vBUSD = await configureVtoken(BUSD, "vToken BUSD", "vBUSD"); - vUSDT = await configureVtoken(USDT, "vToken USDT", "vUSDT"); - await comptrollerProxy._supportMarket(vBUSD.address); - await comptrollerProxy._supportMarket(vUSDT.address); - await comptrollerProxy._setPriceOracle(oracle.address); - await comptrollerProxy.connect(usdtUser).enterMarkets([vBUSD.address, vUSDT.address]); - await comptrollerProxy._setMarketSupplyCaps([vBUSD.address], [parseUnits("100000", 18)]); - await comptrollerProxy._setMarketSupplyCaps([vUSDT.address], [parseUnits("100000", 18)]); - await comptrollerProxy._setCollateralFactor(vBUSD.address, parseUnits("0.7", 18)); - await comptrollerProxy._setCollateralFactor(vUSDT.address, parseUnits("0.5", 18)); - }); + busdHolder = await initMainnetUser("0xf977814e90da44bfa03b6295a0616a897441acec"); + usdtHolder = await initMainnetUser("0xf977814e90da44bfa03b6295a0616a897441acec"); - it("mint vToken", async () => { - await BUSD.connect(usdtUser).transfer(vBUSD.address, 1000); - await USDT.connect(usdtUser).approve(vUSDT.address, 110); - await vUSDT.connect(usdtUser).mint(110); - expect(await vUSDT.connect(usdtUser).balanceOf(usdtUser.address)).equal(110); - }); + [vBUSD, vUSDT] = await Promise.all( + [VBUSD, VUSDT].map((address: string) => { + return ethers.getContractAt("VBep20Delegate", address); + }), + ); + [BUSD, USDT] = await Promise.all( + [vBUSD, vUSDT].map(async (vToken: VBep20) => { + const underlying = await vToken.underlying(); + return ethers.getContractAt("IERC20Upgradeable", underlying); + }), + ); + }); - it("redeem vToken", async () => { - await BUSD.connect(usdtUser).transfer(vBUSD.address, 1000); - await USDT.connect(usdtUser).approve(vUSDT.address, 110); - await vUSDT.connect(usdtUser).mint(110); - await vUSDT.connect(usdtUser).redeem(10); - expect(await vUSDT.connect(usdtUser).balanceOf(usdtUser.address)).equal(100); - }); + describe("Verify Storage slots", () => { + // These tests checks the storage collision of comptroller while updating it via diamond. + // Using mainnet comptroller fork to verify it. + describe("Diamond deployed successfully", async () => { + it("Owner of Diamond unitroller contract should match", async () => { + const diamondUnitrollerAdmin = await diamondUnitroller.admin(); + const pendingAdmin = await diamondUnitroller.pendingAdmin(); + expect(diamondUnitrollerAdmin.toLowerCase()).to.equal(Owner); + expect(pendingAdmin.toLowerCase()).to.equal(zeroAddr); + }); - it("Burn vToken", async () => { - await BUSD.connect(usdtUser).transfer(vBUSD.address, 1000); - await USDT.connect(usdtUser).approve(vUSDT.address, 110); - await vUSDT.connect(usdtUser).mint(110); - await expect(vBUSD.connect(usdtUser).borrow(10)).to.emit(vBUSD, "Borrow"); - let borrowBalance; - [, , borrowBalance] = await vBUSD.getAccountSnapshot(usdtUser.address); - expect(borrowBalance).equal(10); + it("Diamond Unitroller Implementation (comptroller) should match the diamond Proxy Address", async () => { + const comptrollerImplementation = await diamondUnitroller.comptrollerImplementation(); + const pendingComptrollerImplementation = await diamondUnitroller.pendingComptrollerImplementation(); + expect(comptrollerImplementation.toLowerCase()).to.equal(diamondProxy.address.toLowerCase()); + expect(pendingComptrollerImplementation.toLowerCase()).to.equal(zeroAddr); + }); }); - it("Repay vToken", async () => { - await BUSD.connect(usdtUser).transfer(vBUSD.address, 1000); - await USDT.connect(usdtUser).approve(vUSDT.address, 110); - await vUSDT.connect(usdtUser).mint(110); - await vBUSD.connect(usdtUser).borrow(10); - let borrowBalance; - [, , borrowBalance] = await vBUSD.getAccountSnapshot(usdtUser.address); - expect(borrowBalance).equal(10); - await BUSD.connect(usdtUser).approve(vBUSD.address, 10); - await vBUSD.connect(usdtUser).repayBorrow(10); - [, , borrowBalance] = await vBUSD.getAccountSnapshot(usdtUser.address); - expect(borrowBalance).equal(0); - }); + describe("Verify storage layout", async () => { + it("verify all the state before and after upgrade", async () => { + // unitroller states before the upgrade of diamond + maxAssets = await unitroller.maxAssets(); + closeFactorMantissa = await unitroller.closeFactorMantissa(); + liquidationIncentiveMantissa = await unitroller.liquidationIncentiveMantissa(); + allMarkets = await unitroller.allMarkets(0); + venusRate = await unitroller.venusRate(); + venusSpeeds = await unitroller.venusSpeeds(BUSD.address); + venusSupplyState = await unitroller.venusSupplyState(BUSD.address); + venusBorrowState = await unitroller.venusBorrowState(BUSD.address); + venusAccrued = await unitroller.venusAccrued(BUSD.address); + vaiMintRate = await unitroller.vaiMintRate(); - describe.only("Diamond Rewards", () => { - it("grant and claim rewards", async () => { - await BUSD.connect(usdtUser).transfer(vBUSD.address, 1000); - await USDT.connect(usdtUser).approve(vUSDT.address, 110); - await vUSDT.connect(usdtUser).mint(110); - await vUSDT.connect(usdtUser).redeem(10); - await expect(vBUSD.connect(usdtUser).borrow(10)).to.emit(vBUSD, "Borrow"); - let borrowBalance; - [, , borrowBalance] = await vBUSD.getAccountSnapshot(usdtUser.address); - expect(borrowBalance).equal(10); - await BUSD.connect(usdtUser).approve(vBUSD.address, 10); - await vBUSD.connect(usdtUser).repayBorrow(10); - let xvsS = await comptrollerProxy.getXVSAddress(); - - let vxvsS = await comptrollerProxy.getXVSVTokenAddress(); - XVS = XVS__factory.connect(xvsS, admin); - XVSV = VToken__factory.connect(vxvsS, admin); - - const usdtUserBalance = await XVS.connect(usdtUser).balanceOf(usdtUser.address).toString(); - - await XVS.approve("0xce1c6851843125167c223423bb3b88c465b96107", 100); - await XVS.connect(usdtUser).transfer("0xce1c6851843125167c223423bb3b88c465b96107", 100); - expect(await XVS.connect(usdtUser).balanceOf("0xce1c6851843125167c223423bb3b88c465b96107")).equal(100); - expect(await XVS.connect(usdtUser).balanceOf(usdtUser.address)).equal( - parseUnits("4946633239619992136668403", 0), - ); - - expect(await comptrollerProxy._grantXVS(usdtUser.address, 10)).to.emit(XVS, "VenusGranted"); - await comptrollerProxy.claimVenusAsCollateral(usdtUser.address); - expect(await XVS.connect(usdtUser).balanceOf(usdtUser.address)).equal( - parseUnits("4946633239619992136668413", 0), - ); + // unitroller states after the upgrade of diamond + const maxAssetsAfterUpgrade = await diamondUnitroller.maxAssets(); + const closeFactorMantissaAfterUpgrade = await diamondUnitroller.closeFactorMantissa(); + const liquidationIncentiveMantissaAfterUpgrade = await diamondUnitroller.liquidationIncentiveMantissa(); + const allMarketsAfterUpgrade = await diamondUnitroller.allMarkets(0); + const venusRateAfterUpgrade = await diamondUnitroller.venusRate(); + const venusSpeedsAfterUpgrade = await diamondUnitroller.venusSpeeds(BUSD.address); + const venusSupplyStateAfterUpgrade = await diamondUnitroller.venusSupplyState(BUSD.address); + const venusBorrowStateAfterUpgrade = await diamondUnitroller.venusBorrowState(BUSD.address); + const venusAccruedAfterUpgrade = await diamondUnitroller.venusAccrued(BUSD.address); + const vaiMintRateAfterUpgrade = await diamondUnitroller.vaiMintRate(); + + // checks states for before and after upgrade to diamond. + expect(maxAssets).to.equal(maxAssetsAfterUpgrade); + expect(closeFactorMantissa).to.equal(closeFactorMantissaAfterUpgrade); + expect(liquidationIncentiveMantissa).to.equal(liquidationIncentiveMantissaAfterUpgrade); + expect(allMarkets).to.equal(allMarketsAfterUpgrade); + expect(venusRate).to.equal(venusRateAfterUpgrade); + expect(venusSpeeds).to.equal(venusSpeedsAfterUpgrade); + expect(venusSupplyState.index.toString()).to.equal(venusSupplyStateAfterUpgrade.index.toString()); + expect(venusBorrowState.index.toString()).to.equal(venusBorrowStateAfterUpgrade.index.toString()); + expect(venusAccrued).to.equal(venusAccruedAfterUpgrade); + expect(vaiMintRate).to.equal(vaiMintRateAfterUpgrade); }); }); }); + + // TODO !! + // describe("Verify states of diamond Contract", () => { + // describe("Diamond setters", () => { + // it("setting market supply cap", async () => { + // expect(await unitroller.supplyCaps(vBUSD.address)).to.equals(0); + // await unitroller._setMarketSupplyCaps([vBUSD.address], [parseUnits("100000", 18)]); + // expect(await unitroller.supplyCaps(vBUSD.address)).to.equals(parseUnits("100000", 18)); + // }); + + // it("checking PriceOracle", async () => { + // await unitroller._setPriceOracle(oracle.address); + // const oracleAddress = await comptroller.oracle(); + // expect(await unitroller.oracle()).to.equals(oracle.address); + // }); + + // it("setting collateral factor", async () => { + // let data = await unitroller.markets(vBUSD.address); + // expect(data.collateralFactorMantissa).to.equals(0); + // await unitroller._setCollateralFactor(vBUSD.address, parseUnits("0.7", 18)); + // data = await unitroller.markets(vBUSD.address); + // expect(data.collateralFactorMantissa).to.equals(parseUnits("0.7", 18)); + // }); + // }); + + // describe("Diamond Hooks", () => { + // it("mint vToken", async () => { + // await BUSD.connect(usdtHolder).transfer(vBUSD.address, 1000); + // await USDT.connect(usdtHolder).approve(vUSDT.address, 110); + // await vUSDT.connect(usdtHolder).mint(110); + // expect(await vUSDT.connect(usdtHolder).balanceOf(usdtHolder.address)).equal(110); + // }); + + // it("redeem vToken", async () => { + // await BUSD.connect(usdtHolder).transfer(vBUSD.address, 1000); + // await USDT.connect(usdtHolder).approve(vUSDT.address, 110); + // await vUSDT.connect(usdtHolder).mint(110); + // await vUSDT.connect(usdtHolder).redeem(10); + // expect(await vUSDT.connect(usdtHolder).balanceOf(usdtHolder.address)).equal(100); + // }); + + // it("Burn vToken", async () => { + // await BUSD.connect(usdtHolder).transfer(vBUSD.address, 1000); + // await USDT.connect(usdtHolder).approve(vUSDT.address, 110); + // await vUSDT.connect(usdtHolder).mint(110); + // await expect(vBUSD.connect(usdtHolder).borrow(10)).to.emit(vBUSD, "Borrow"); + // let borrowBalance; + // [, , borrowBalance] = await vBUSD.getAccountSnapshot(usdtHolder.address); + // expect(borrowBalance).equal(10); + // }); + + // it("Repay vToken", async () => { + // await BUSD.connect(usdtHolder).transfer(vBUSD.address, 1000); + // await USDT.connect(usdtHolder).approve(vUSDT.address, 110); + // await vUSDT.connect(usdtHolder).mint(110); + // await vBUSD.connect(usdtHolder).borrow(10); + // let borrowBalance; + // [, , borrowBalance] = await vBUSD.getAccountSnapshot(usdtHolder.address); + // expect(borrowBalance).equal(10); + // await BUSD.connect(usdtHolder).approve(vBUSD.address, 10); + // await vBUSD.connect(usdtHolder).repayBorrow(10); + // [, , borrowBalance] = await vBUSD.getAccountSnapshot(usdtHolder.address); + // expect(borrowBalance).equal(0); + // }); + + // describe("Diamond Rewards", () => { + // it("grant and claim rewards", async () => { + // await BUSD.connect(usdtHolder).transfer(vBUSD.address, 1000); + // await USDT.connect(usdtHolder).approve(vUSDT.address, 110); + // await vUSDT.connect(usdtHolder).mint(110); + // await vUSDT.connect(usdtHolder).redeem(10); + // await expect(vBUSD.connect(usdtHolder).borrow(10)).to.emit(vBUSD, "Borrow"); + // let borrowBalance; + // [, , borrowBalance] = await vBUSD.getAccountSnapshot(usdtHolder.address); + // expect(borrowBalance).equal(10); + // await BUSD.connect(usdtHolder).approve(vBUSD.address, 10); + // await vBUSD.connect(usdtHolder).repayBorrow(10); + // let xvsS = await unitroller.getXVSAddress(); + + // let vxvsS = await unitroller.getXVSVTokenAddress(); + // XVS = XVS__factory.connect(xvsS, admin); + // XVSV = VToken__factory.connect(vxvsS, admin); + // }); + // }); + // }); + // }); } }); From a412683f63b55e8741a1f45055f9c2eae9fb8b59 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Thu, 23 Mar 2023 23:50:48 +0530 Subject: [PATCH 042/153] testEnv: add hardhat contract sizer --- hardhat.config.ts | 2 +- package.json | 1 + yarn.lock | 23 +++++++++++++++++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/hardhat.config.ts b/hardhat.config.ts index bf843e821..35a99a0d1 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -10,7 +10,7 @@ import "hardhat-deploy"; import { HardhatUserConfig, task } from "hardhat/config"; import "solidity-docgen"; import "solidity-docgen"; - +require('hardhat-contract-sizer'); require("dotenv").config(); const BSCSCAN_API_KEY = process.env.BSCSCAN_API_KEY; diff --git a/package.json b/package.json index d5acf0dc4..8ac3ff26b 100644 --- a/package.json +++ b/package.json @@ -59,6 +59,7 @@ "eslint-plugin-jest": "^27.1.2", "ethers": "^5.6.9", "hardhat": "^2.10.1", + "hardhat-contract-sizer": "^2.8.0", "hardhat-deploy": "^0.11.14", "hardhat-gas-reporter": "^1.0.8", "prettier": "^2.7.1", diff --git a/yarn.lock b/yarn.lock index a5605d671..e34ef3f70 100644 --- a/yarn.lock +++ b/yarn.lock @@ -227,6 +227,11 @@ "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" +"@colors/colors@1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" + integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== + "@cspotcode/source-map-support@^0.8.0": version "0.8.1" resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" @@ -2382,6 +2387,15 @@ cli-table3@^0.5.0: optionalDependencies: colors "^1.1.2" +cli-table3@^0.6.0: + version "0.6.3" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.3.tgz#61ab765aac156b52f222954ffc607a6f01dbeeb2" + integrity sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg== + dependencies: + string-width "^4.2.0" + optionalDependencies: + "@colors/colors" "1.5.0" + cli-width@^2.0.0: version "2.2.1" resolved "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" @@ -4144,6 +4158,15 @@ har-validator@~5.1.3: ajv "^6.12.3" har-schema "^2.0.0" +hardhat-contract-sizer@^2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/hardhat-contract-sizer/-/hardhat-contract-sizer-2.8.0.tgz#730a9bf35ed200ba57b6865bd3f459a91c90f205" + integrity sha512-jXt2Si3uIDx5z99J+gvKa0yvIw156pE4dpH9X/PvTQv652BUd+qGj7WT93PXnHXGh5qhQLkjDYeZMYNOThfjFg== + dependencies: + chalk "^4.0.0" + cli-table3 "^0.6.0" + strip-ansi "^6.0.0" + hardhat-deploy@^0.11.14: version "0.11.20" resolved "https://registry.npmjs.org/hardhat-deploy/-/hardhat-deploy-0.11.20.tgz#d95499a0d29b75f1f1d3838c9a3eb6d2d0d20f57" From 1f8263ed005f66d5326da03e7b864736f2eb1db7 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Fri, 24 Mar 2023 14:21:19 +0530 Subject: [PATCH 043/153] fix: script for unitrollerAddress empty --- script/diamond/deploy.js | 8 ++++---- tests/hardhat/Fork/diamondTest.ts | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/script/diamond/deploy.js b/script/diamond/deploy.js index f78562ca2..98367ebc7 100644 --- a/script/diamond/deploy.js +++ b/script/diamond/deploy.js @@ -29,14 +29,14 @@ async function deployDiamond(unitrollerAddress) { await impersonateAccount(Owner); unitrollerAdmin = await ethers.getSigner(Owner); unitroller = await Unitroller__factory.connect(unitrollerAddress, unitrollerAdmin); - // await unitroller.connect(unitrollerAdmin)._setPendingAdmin(await accounts[0].getAddress()); - // await unitroller.connect(accounts[0])._acceptAdmin(); + } else { const UnitrollerFactory = await ethers.getContractFactory("Unitroller"); unitroller = await UnitrollerFactory.deploy(); + const signer = await ethers.getSigners(); + unitrollerAdmin = signer[0]; } - const signer = await ethers.getSigners(); - unitrollerAdmin = signer[0]; + await unitroller.connect(unitrollerAdmin)._setPendingImplementation(diamond.address); await diamond.connect(unitrollerAdmin)._become(unitroller.address); diff --git a/tests/hardhat/Fork/diamondTest.ts b/tests/hardhat/Fork/diamondTest.ts index 699ae8b58..0256f4ad8 100644 --- a/tests/hardhat/Fork/diamondTest.ts +++ b/tests/hardhat/Fork/diamondTest.ts @@ -120,7 +120,7 @@ forking(26713742, () => { // These tests checks the storage collision of comptroller while updating it via diamond. // Using mainnet comptroller fork to verify it. describe("Diamond deployed successfully", async () => { - it("Owner of Diamond unitroller contract should match", async () => { + it.only("Owner of Diamond unitroller contract should match", async () => { const diamondUnitrollerAdmin = await diamondUnitroller.admin(); const pendingAdmin = await diamondUnitroller.pendingAdmin(); expect(diamondUnitrollerAdmin.toLowerCase()).to.equal(Owner); From 26ed07206fa027ec1eb21424e4999554c93bedaf Mon Sep 17 00:00:00 2001 From: defcon022 Date: Fri, 24 Mar 2023 14:21:53 +0530 Subject: [PATCH 044/153] remove: .only flag --- tests/hardhat/Fork/diamondTest.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/hardhat/Fork/diamondTest.ts b/tests/hardhat/Fork/diamondTest.ts index 0256f4ad8..699ae8b58 100644 --- a/tests/hardhat/Fork/diamondTest.ts +++ b/tests/hardhat/Fork/diamondTest.ts @@ -120,7 +120,7 @@ forking(26713742, () => { // These tests checks the storage collision of comptroller while updating it via diamond. // Using mainnet comptroller fork to verify it. describe("Diamond deployed successfully", async () => { - it.only("Owner of Diamond unitroller contract should match", async () => { + it("Owner of Diamond unitroller contract should match", async () => { const diamondUnitrollerAdmin = await diamondUnitroller.admin(); const pendingAdmin = await diamondUnitroller.pendingAdmin(); expect(diamondUnitrollerAdmin.toLowerCase()).to.equal(Owner); From b78a97e144fd812e395153668693251c46397ba6 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Tue, 28 Mar 2023 09:17:18 +0530 Subject: [PATCH 045/153] Removed unwanted comptroller contracts. --- contracts/Comptroller/ComptrollerG1.sol | 1616 ----------------- contracts/Comptroller/ComptrollerG2.sol | 1616 ----------------- contracts/Comptroller/ComptrollerG3.sol | 1572 ---------------- contracts/Comptroller/ComptrollerG4.sol | 1571 ---------------- contracts/Comptroller/ComptrollerG5.sol | 1587 ---------------- contracts/Comptroller/UpdatedComptroller.sol | 1529 ---------------- .../UpdatedComptrollerInterface.sol | 98 - contracts/test/ComptrollerScenarioG1.sol | 89 - contracts/test/ComptrollerScenarioG2.sol | 51 - contracts/test/ComptrollerScenarioG3.sol | 30 - contracts/test/ComptrollerScenarioG4.sol | 30 - contracts/test/ComptrollerScenarioG5.sol | 30 - contracts/test/VAIControllerScenario.sol | 28 - 13 files changed, 9847 deletions(-) delete mode 100644 contracts/Comptroller/ComptrollerG1.sol delete mode 100644 contracts/Comptroller/ComptrollerG2.sol delete mode 100644 contracts/Comptroller/ComptrollerG3.sol delete mode 100644 contracts/Comptroller/ComptrollerG4.sol delete mode 100644 contracts/Comptroller/ComptrollerG5.sol delete mode 100644 contracts/Comptroller/UpdatedComptroller.sol delete mode 100644 contracts/Comptroller/UpdatedComptrollerInterface.sol delete mode 100644 contracts/test/ComptrollerScenarioG1.sol delete mode 100644 contracts/test/ComptrollerScenarioG2.sol delete mode 100644 contracts/test/ComptrollerScenarioG3.sol delete mode 100644 contracts/test/ComptrollerScenarioG4.sol delete mode 100644 contracts/test/ComptrollerScenarioG5.sol delete mode 100644 contracts/test/VAIControllerScenario.sol diff --git a/contracts/Comptroller/ComptrollerG1.sol b/contracts/Comptroller/ComptrollerG1.sol deleted file mode 100644 index 8bfb83128..000000000 --- a/contracts/Comptroller/ComptrollerG1.sol +++ /dev/null @@ -1,1616 +0,0 @@ -pragma solidity 0.8.13; - -import "../Oracle/PriceOracle.sol"; -import "../Tokens/VTokens/VToken.sol"; -import "../Utils/ErrorReporter.sol"; -import "../Utils/Exponential.sol"; -import "../Tokens/XVS/XVS.sol"; -import "../Tokens/VAI/VAI.sol"; -import "./ComptrollerInterface.sol"; -import "./ComptrollerStorage.sol"; -import "./Unitroller.sol"; - -/** - * @title Venus's Comptroller Contract - * @author Venus - */ -contract ComptrollerG1 is ComptrollerV1Storage, ComptrollerInterfaceG1, ComptrollerErrorReporter, Exponential { - /// @notice Emitted when an admin supports a market - event MarketListed(VToken vToken); - - /// @notice Emitted when an account enters a market - event MarketEntered(VToken vToken, address account); - - /// @notice Emitted when an account exits a market - event MarketExited(VToken vToken, address account); - - /// @notice Emitted when close factor is changed by admin - event NewCloseFactor(uint oldCloseFactorMantissa, uint newCloseFactorMantissa); - - /// @notice Emitted when a collateral factor is changed by admin - event NewCollateralFactor(VToken vToken, uint oldCollateralFactorMantissa, uint newCollateralFactorMantissa); - - /// @notice Emitted when liquidation incentive is changed by admin - event NewLiquidationIncentive(uint oldLiquidationIncentiveMantissa, uint newLiquidationIncentiveMantissa); - - /// @notice Emitted when maxAssets is changed by admin - event NewMaxAssets(uint oldMaxAssets, uint newMaxAssets); - - /// @notice Emitted when price oracle is changed - event NewPriceOracle(PriceOracle oldPriceOracle, PriceOracle newPriceOracle); - - /// @notice Emitted when pause guardian is changed - event NewPauseGuardian(address oldPauseGuardian, address newPauseGuardian); - - /// @notice Emitted when an action is paused globally - event ActionPaused(string action, bool pauseState); - - /// @notice Emitted when an action is paused on a market - event ActionPaused(VToken vToken, string action, bool pauseState); - - /// @notice Emitted when market venus status is changed - event MarketVenus(VToken vToken, bool isVenus); - - /// @notice Emitted when Venus rate is changed - event NewVenusRate(uint oldVenusRate, uint newVenusRate); - - /// @notice Emitted when a new Venus speed is calculated for a market - event VenusSpeedUpdated(VToken indexed vToken, uint newSpeed); - - /// @notice Emitted when XVS is distributed to a supplier - event DistributedSupplierVenus( - VToken indexed vToken, - address indexed supplier, - uint venusDelta, - uint venusSupplyIndex - ); - - /// @notice Emitted when XVS is distributed to a borrower - event DistributedBorrowerVenus( - VToken indexed vToken, - address indexed borrower, - uint venusDelta, - uint venusBorrowIndex - ); - - /// @notice Emitted when XVS is distributed to a VAI minter - event DistributedVAIMinterVenus(address indexed vaiMinter, uint venusDelta, uint venusVAIMintIndex); - - /// @notice Emitted when VAIController is changed - event NewVAIController(VAIControllerInterface oldVAIController, VAIControllerInterface newVAIController); - - /// @notice Emitted when VAI mint rate is changed by admin - event NewVAIMintRate(uint oldVAIMintRate, uint newVAIMintRate); - - /// @notice Emitted when protocol state is changed by admin - event ActionProtocolPaused(bool state); - - /// @notice The threshold above which the flywheel transfers XVS, in wei - uint public constant venusClaimThreshold = 0.001e18; - - /// @notice The initial Venus index for a market - uint224 public constant venusInitialIndex = 1e36; - - // closeFactorMantissa must be strictly greater than this value - uint internal constant closeFactorMinMantissa = 0.05e18; // 0.05 - - // closeFactorMantissa must not exceed this value - uint internal constant closeFactorMaxMantissa = 0.9e18; // 0.9 - - // No collateralFactorMantissa may exceed this value - uint internal constant collateralFactorMaxMantissa = 0.9e18; // 0.9 - - // liquidationIncentiveMantissa must be no less than this value - uint internal constant liquidationIncentiveMinMantissa = 1.0e18; // 1.0 - - // liquidationIncentiveMantissa must be no greater than this value - uint internal constant liquidationIncentiveMaxMantissa = 1.5e18; // 1.5 - - constructor() public { - admin = msg.sender; - } - - modifier onlyProtocolAllowed() { - require(!protocolPaused, "protocol is paused"); - _; - } - - modifier onlyAdmin() { - require(msg.sender == admin, "only admin can"); - _; - } - - modifier onlyListedMarket(VToken vToken) { - require(markets[address(vToken)].isListed, "venus market is not listed"); - _; - } - - modifier validPauseState(bool state) { - require(msg.sender == pauseGuardian || msg.sender == admin, "only pause guardian and admin can"); - require(msg.sender == admin || state == true, "only admin can unpause"); - _; - } - - /*** Assets You Are In ***/ - - /** - * @notice Returns the assets an account has entered - * @param account The address of the account to pull assets for - * @return A dynamic list with the assets the account has entered - */ - function getAssetsIn(address account) external view returns (VToken[] memory) { - return accountAssets[account]; - } - - /** - * @notice Returns whether the given account is entered in the given asset - * @param account The address of the account to check - * @param vToken The vToken to check - * @return True if the account is in the asset, otherwise false. - */ - function checkMembership(address account, VToken vToken) external view returns (bool) { - return markets[address(vToken)].accountMembership[account]; - } - - /** - * @notice Add assets to be included in account liquidity calculation - * @param vTokens The list of addresses of the vToken markets to be enabled - * @return Success indicator for whether each corresponding market was entered - */ - function enterMarkets(address[] calldata vTokens) external override returns (uint[] memory) { - uint len = vTokens.length; - - uint[] memory results = new uint[](len); - for (uint i = 0; i < len; i++) { - results[i] = uint(addToMarketInternal(VToken(vTokens[i]), msg.sender)); - } - - return results; - } - - /** - * @notice Add the market to the borrower's "assets in" for liquidity calculations - * @param vToken The market to enter - * @param borrower The address of the account to modify - * @return Success indicator for whether the market was entered - */ - function addToMarketInternal(VToken vToken, address borrower) internal returns (Error) { - Market storage marketToJoin = markets[address(vToken)]; - - if (!marketToJoin.isListed) { - // market is not listed, cannot join - return Error.MARKET_NOT_LISTED; - } - - if (marketToJoin.accountMembership[borrower]) { - // already joined - return Error.NO_ERROR; - } - - if (accountAssets[borrower].length >= maxAssets) { - // no space, cannot join - return Error.TOO_MANY_ASSETS; - } - - // survived the gauntlet, add to list - // NOTE: we store these somewhat redundantly as a significant optimization - // this avoids having to iterate through the list for the most common use cases - // that is, only when we need to perform liquidity checks - // and not whenever we want to check if an account is in a particular market - marketToJoin.accountMembership[borrower] = true; - accountAssets[borrower].push(vToken); - - emit MarketEntered(vToken, borrower); - - return Error.NO_ERROR; - } - - /** - * @notice Removes asset from sender's account liquidity calculation - * @dev Sender must not have an outstanding borrow balance in the asset, - * or be providing necessary collateral for an outstanding borrow. - * @param vTokenAddress The address of the asset to be removed - * @return Whether or not the account successfully exited the market - */ - function exitMarket(address vTokenAddress) external override returns (uint) { - VToken vToken = VToken(vTokenAddress); - /* Get sender tokensHeld and amountOwed underlying from the vToken */ - (uint oErr, uint tokensHeld, uint amountOwed, ) = vToken.getAccountSnapshot(msg.sender); - require(oErr == 0, "getAccountSnapshot failed"); // semi-opaque error code - - /* Fail if the sender has a borrow balance */ - if (amountOwed != 0) { - return fail(Error.NONZERO_BORROW_BALANCE, FailureInfo.EXIT_MARKET_BALANCE_OWED); - } - - /* Fail if the sender is not permitted to redeem all of their tokens */ - uint allowed = redeemAllowedInternal(vTokenAddress, msg.sender, tokensHeld); - if (allowed != 0) { - return failOpaque(Error.REJECTION, FailureInfo.EXIT_MARKET_REJECTION, allowed); - } - - Market storage marketToExit = markets[address(vToken)]; - - /* Return true if the sender is not already ‘in’ the market */ - if (!marketToExit.accountMembership[msg.sender]) { - return uint(Error.NO_ERROR); - } - - /* Set vToken account membership to false */ - delete marketToExit.accountMembership[msg.sender]; - - /* Delete vToken from the account’s list of assets */ - // In order to delete vToken, copy last item in list to location of item to be removed, reduce length by 1 - VToken[] storage userAssetList = accountAssets[msg.sender]; - uint len = userAssetList.length; - uint i; - for (; i < len; i++) { - if (userAssetList[i] == vToken) { - userAssetList[i] = userAssetList[len - 1]; - userAssetList.pop(); - break; - } - } - - // We *must* have found the asset in the list or our redundant data structure is broken - assert(i < len); - - emit MarketExited(vToken, msg.sender); - - return uint(Error.NO_ERROR); - } - - /*** Policy Hooks ***/ - - /** - * @notice Checks if the account should be allowed to mint tokens in the given market - * @param vToken The market to verify the mint against - * @param minter The account which would get the minted tokens - * @param mintAmount The amount of underlying being supplied to the market in exchange for tokens - * @return 0 if the mint is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) - */ - function mintAllowed( - address vToken, - address minter, - uint mintAmount - ) external override onlyProtocolAllowed returns (uint) { - // Pausing is a very serious situation - we revert to sound the alarms - require(!mintGuardianPaused[vToken], "mint is paused"); - - // Shh - currently unused - mintAmount; - - if (!markets[vToken].isListed) { - return uint(Error.MARKET_NOT_LISTED); - } - - // Keep the flywheel moving - updateVenusSupplyIndex(vToken); - distributeSupplierVenus(vToken, minter, false); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Validates mint and reverts on rejection. May emit logs. - * @param vToken Asset being minted - * @param minter The address minting the tokens - * @param actualMintAmount The amount of the underlying asset being minted - * @param mintTokens The number of tokens being minted - */ - function mintVerify(address vToken, address minter, uint actualMintAmount, uint mintTokens) external override { - // Shh - currently unused - vToken; - minter; - actualMintAmount; - mintTokens; - } - - /** - * @notice Checks if the account should be allowed to redeem tokens in the given market - * @param vToken The market to verify the redeem against - * @param redeemer The account which would redeem the tokens - * @param redeemTokens The number of vTokens to exchange for the underlying asset in the market - * @return 0 if the redeem is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) - */ - function redeemAllowed( - address vToken, - address redeemer, - uint redeemTokens - ) external override onlyProtocolAllowed returns (uint) { - uint allowed = redeemAllowedInternal(vToken, redeemer, redeemTokens); - if (allowed != uint(Error.NO_ERROR)) { - return allowed; - } - - // Keep the flywheel moving - updateVenusSupplyIndex(vToken); - distributeSupplierVenus(vToken, redeemer, false); - - return uint(Error.NO_ERROR); - } - - function redeemAllowedInternal(address vToken, address redeemer, uint redeemTokens) internal view returns (uint) { - if (!markets[vToken].isListed) { - return uint(Error.MARKET_NOT_LISTED); - } - - /* If the redeemer is not 'in' the market, then we can bypass the liquidity check */ - if (!markets[vToken].accountMembership[redeemer]) { - return uint(Error.NO_ERROR); - } - - /* Otherwise, perform a hypothetical liquidity check to guard against shortfall */ - (Error err, , uint shortfall) = getHypotheticalAccountLiquidityInternal( - redeemer, - VToken(vToken), - redeemTokens, - 0 - ); - if (err != Error.NO_ERROR) { - return uint(err); - } - if (shortfall != 0) { - return uint(Error.INSUFFICIENT_LIQUIDITY); - } - - return uint(Error.NO_ERROR); - } - - /** - * @notice Validates redeem and reverts on rejection. May emit logs. - * @param vToken Asset being redeemed - * @param redeemer The address redeeming the tokens - * @param redeemAmount The amount of the underlying asset being redeemed - * @param redeemTokens The number of tokens being redeemed - */ - function redeemVerify(address vToken, address redeemer, uint redeemAmount, uint redeemTokens) external override { - // Shh - currently unused - vToken; - redeemer; - - // Require tokens is zero or amount is also zero - require(redeemTokens != 0 || redeemAmount == 0, "redeemTokens zero"); - } - - /** - * @notice Checks if the account should be allowed to borrow the underlying asset of the given market - * @param vToken The market to verify the borrow against - * @param borrower The account which would borrow the asset - * @param borrowAmount The amount of underlying the account would borrow - * @return 0 if the borrow is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) - */ - function borrowAllowed( - address vToken, - address borrower, - uint borrowAmount - ) external override onlyProtocolAllowed returns (uint) { - // Pausing is a very serious situation - we revert to sound the alarms - require(!borrowGuardianPaused[vToken], "borrow is paused"); - - if (!markets[vToken].isListed) { - return uint(Error.MARKET_NOT_LISTED); - } - - if (!markets[vToken].accountMembership[borrower]) { - // only vTokens may call borrowAllowed if borrower not in market - require(msg.sender == vToken, "sender must be vToken"); - - // attempt to add borrower to the market - Error err = addToMarketInternal(VToken(vToken), borrower); - if (err != Error.NO_ERROR) { - return uint(err); - } - } - - if (oracle.getUnderlyingPrice(VToken(vToken)) == 0) { - return uint(Error.PRICE_ERROR); - } - - (Error err, , uint shortfall) = getHypotheticalAccountLiquidityInternal( - borrower, - VToken(vToken), - 0, - borrowAmount - ); - if (err != Error.NO_ERROR) { - return uint(err); - } - if (shortfall != 0) { - return uint(Error.INSUFFICIENT_LIQUIDITY); - } - - // Keep the flywheel moving - Exp memory borrowIndex = Exp({ mantissa: VToken(vToken).borrowIndex() }); - updateVenusBorrowIndex(vToken, borrowIndex); - distributeBorrowerVenus(vToken, borrower, borrowIndex, false); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Validates borrow and reverts on rejection. May emit logs. - * @param vToken Asset whose underlying is being borrowed - * @param borrower The address borrowing the underlying - * @param borrowAmount The amount of the underlying asset requested to borrow - */ - function borrowVerify(address vToken, address borrower, uint borrowAmount) external override { - // Shh - currently unused - vToken; - borrower; - borrowAmount; - - // Shh - we don't ever want this hook to be marked pure - if (false) { - maxAssets = maxAssets; - } - } - - /** - * @notice Checks if the account should be allowed to repay a borrow in the given market - * @param vToken The market to verify the repay against - * @param payer The account which would repay the asset - * @param borrower The account which would repay the asset - * @param repayAmount The amount of the underlying asset the account would repay - * @return 0 if the repay is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) - */ - function repayBorrowAllowed( - address vToken, - address payer, - address borrower, - uint repayAmount - ) external override onlyProtocolAllowed returns (uint) { - // Shh - currently unused - payer; - borrower; - repayAmount; - - if (!markets[vToken].isListed) { - return uint(Error.MARKET_NOT_LISTED); - } - - // Keep the flywheel moving - Exp memory borrowIndex = Exp({ mantissa: VToken(vToken).borrowIndex() }); - updateVenusBorrowIndex(vToken, borrowIndex); - distributeBorrowerVenus(vToken, borrower, borrowIndex, false); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Validates repayBorrow and reverts on rejection. May emit logs. - * @param vToken Asset being repaid - * @param payer The address repaying the borrow - * @param borrower The address of the borrower - * @param actualRepayAmount The amount of underlying being repaid - */ - function repayBorrowVerify( - address vToken, - address payer, - address borrower, - uint actualRepayAmount, - uint borrowerIndex - ) external override { - // Shh - currently unused - vToken; - payer; - borrower; - actualRepayAmount; - borrowerIndex; - - // Shh - we don't ever want this hook to be marked pure - if (false) { - maxAssets = maxAssets; - } - } - - /** - * @notice Checks if the liquidation should be allowed to occur - * @param vTokenBorrowed Asset which was borrowed by the borrower - * @param vTokenCollateral Asset which was used as collateral and will be seized - * @param liquidator The address repaying the borrow and seizing the collateral - * @param borrower The address of the borrower - * @param repayAmount The amount of underlying being repaid - */ - function liquidateBorrowAllowed( - address vTokenBorrowed, - address vTokenCollateral, - address liquidator, - address borrower, - uint repayAmount - ) external override onlyProtocolAllowed returns (uint) { - // Shh - currently unused - liquidator; - - if (!markets[vTokenBorrowed].isListed || !markets[vTokenCollateral].isListed) { - return uint(Error.MARKET_NOT_LISTED); - } - - /* The borrower must have shortfall in order to be liquidatable */ - (Error err, , uint shortfall) = getHypotheticalAccountLiquidityInternal(borrower, VToken(address(0)), 0, 0); - if (err != Error.NO_ERROR) { - return uint(err); - } - if (shortfall == 0) { - return uint(Error.INSUFFICIENT_SHORTFALL); - } - - /* The liquidator may not repay more than what is allowed by the closeFactor */ - uint borrowBalance = VToken(vTokenBorrowed).borrowBalanceStored(borrower); - (MathError mathErr, uint maxClose) = mulScalarTruncate(Exp({ mantissa: closeFactorMantissa }), borrowBalance); - if (mathErr != MathError.NO_ERROR) { - return uint(Error.MATH_ERROR); - } - if (repayAmount > maxClose) { - return uint(Error.TOO_MUCH_REPAY); - } - - return uint(Error.NO_ERROR); - } - - /** - * @notice Validates liquidateBorrow and reverts on rejection. May emit logs. - * @param vTokenBorrowed Asset which was borrowed by the borrower - * @param vTokenCollateral Asset which was used as collateral and will be seized - * @param liquidator The address repaying the borrow and seizing the collateral - * @param borrower The address of the borrower - * @param actualRepayAmount The amount of underlying being repaid - */ - function liquidateBorrowVerify( - address vTokenBorrowed, - address vTokenCollateral, - address liquidator, - address borrower, - uint actualRepayAmount, - uint seizeTokens - ) external override { - // Shh - currently unused - vTokenBorrowed; - vTokenCollateral; - liquidator; - borrower; - actualRepayAmount; - seizeTokens; - - // Shh - we don't ever want this hook to be marked pure - if (false) { - maxAssets = maxAssets; - } - } - - /** - * @notice Checks if the seizing of assets should be allowed to occur - * @param vTokenCollateral Asset which was used as collateral and will be seized - * @param vTokenBorrowed Asset which was borrowed by the borrower - * @param liquidator The address repaying the borrow and seizing the collateral - * @param borrower The address of the borrower - * @param seizeTokens The number of collateral tokens to seize - */ - function seizeAllowed( - address vTokenCollateral, - address vTokenBorrowed, - address liquidator, - address borrower, - uint seizeTokens - ) external override onlyProtocolAllowed returns (uint) { - // Pausing is a very serious situation - we revert to sound the alarms - require(!seizeGuardianPaused, "seize is paused"); - - // Shh - currently unused - seizeTokens; - - if (!markets[vTokenCollateral].isListed || !markets[vTokenBorrowed].isListed) { - return uint(Error.MARKET_NOT_LISTED); - } - - if (VToken(vTokenCollateral).comptroller() != VToken(vTokenBorrowed).comptroller()) { - return uint(Error.COMPTROLLER_MISMATCH); - } - - // Keep the flywheel moving - updateVenusSupplyIndex(vTokenCollateral); - distributeSupplierVenus(vTokenCollateral, borrower, false); - distributeSupplierVenus(vTokenCollateral, liquidator, false); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Validates seize and reverts on rejection. May emit logs. - * @param vTokenCollateral Asset which was used as collateral and will be seized - * @param vTokenBorrowed Asset which was borrowed by the borrower - * @param liquidator The address repaying the borrow and seizing the collateral - * @param borrower The address of the borrower - * @param seizeTokens The number of collateral tokens to seize - */ - function seizeVerify( - address vTokenCollateral, - address vTokenBorrowed, - address liquidator, - address borrower, - uint seizeTokens - ) external override { - // Shh - currently unused - vTokenCollateral; - vTokenBorrowed; - liquidator; - borrower; - seizeTokens; - - // Shh - we don't ever want this hook to be marked pure - if (false) { - maxAssets = maxAssets; - } - } - - /** - * @notice Checks if the account should be allowed to transfer tokens in the given market - * @param vToken The market to verify the transfer against - * @param src The account which sources the tokens - * @param dst The account which receives the tokens - * @param transferTokens The number of vTokens to transfer - * @return 0 if the transfer is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) - */ - function transferAllowed( - address vToken, - address src, - address dst, - uint transferTokens - ) external override onlyProtocolAllowed returns (uint) { - // Pausing is a very serious situation - we revert to sound the alarms - require(!transferGuardianPaused, "transfer is paused"); - - // Currently the only consideration is whether or not - // the src is allowed to redeem this many tokens - uint allowed = redeemAllowedInternal(vToken, src, transferTokens); - if (allowed != uint(Error.NO_ERROR)) { - return allowed; - } - - // Keep the flywheel moving - updateVenusSupplyIndex(vToken); - distributeSupplierVenus(vToken, src, false); - distributeSupplierVenus(vToken, dst, false); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Validates transfer and reverts on rejection. May emit logs. - * @param vToken Asset being transferred - * @param src The account which sources the tokens - * @param dst The account which receives the tokens - * @param transferTokens The number of vTokens to transfer - */ - function transferVerify(address vToken, address src, address dst, uint transferTokens) external override { - // Shh - currently unused - vToken; - src; - dst; - transferTokens; - - // Shh - we don't ever want this hook to be marked pure - if (false) { - maxAssets = maxAssets; - } - } - - /*** Liquidity/Liquidation Calculations ***/ - - /** - * @dev Local vars for avoiding stack-depth limits in calculating account liquidity. - * Note that `vTokenBalance` is the number of vTokens the account owns in the market, - * whereas `borrowBalance` is the amount of underlying that the account has borrowed. - */ - struct AccountLiquidityLocalVars { - uint sumCollateral; - uint sumBorrowPlusEffects; - uint vTokenBalance; - uint borrowBalance; - uint exchangeRateMantissa; - uint oraclePriceMantissa; - Exp collateralFactor; - Exp exchangeRate; - Exp oraclePrice; - Exp tokensToDenom; - } - - /** - * @notice Determine the current account liquidity wrt collateral requirements - * @return (possible error code (semi-opaque), - account liquidity in excess of collateral requirements, - * account shortfall below collateral requirements) - */ - function getAccountLiquidity(address account) public view returns (uint, uint, uint) { - (Error err, uint liquidity, uint shortfall) = getHypotheticalAccountLiquidityInternal( - account, - VToken(address(0)), - 0, - 0 - ); - - return (uint(err), liquidity, shortfall); - } - - /** - * @notice Determine what the account liquidity would be if the given amounts were redeemed/borrowed - * @param vTokenModify The market to hypothetically redeem/borrow in - * @param account The account to determine liquidity for - * @param redeemTokens The number of tokens to hypothetically redeem - * @param borrowAmount The amount of underlying to hypothetically borrow - * @return (possible error code (semi-opaque), - hypothetical account liquidity in excess of collateral requirements, - * hypothetical account shortfall below collateral requirements) - */ - function getHypotheticalAccountLiquidity( - address account, - address vTokenModify, - uint redeemTokens, - uint borrowAmount - ) public view returns (uint, uint, uint) { - (Error err, uint liquidity, uint shortfall) = getHypotheticalAccountLiquidityInternal( - account, - VToken(vTokenModify), - redeemTokens, - borrowAmount - ); - return (uint(err), liquidity, shortfall); - } - - /** - * @notice Determine what the account liquidity would be if the given amounts were redeemed/borrowed - * @param vTokenModify The market to hypothetically redeem/borrow in - * @param account The account to determine liquidity for - * @param redeemTokens The number of tokens to hypothetically redeem - * @param borrowAmount The amount of underlying to hypothetically borrow - * @dev Note that we calculate the exchangeRateStored for each collateral vToken using stored data, - * without calculating accumulated interest. - * @return (possible error code, - hypothetical account liquidity in excess of collateral requirements, - * hypothetical account shortfall below collateral requirements) - */ - // solhint-disable-next-line code-complexity - function getHypotheticalAccountLiquidityInternal( - address account, - VToken vTokenModify, - uint redeemTokens, - uint borrowAmount - ) internal view returns (Error, uint, uint) { - AccountLiquidityLocalVars memory vars; // Holds all our calculation results - uint oErr; - MathError mErr; - - // For each asset the account is in - VToken[] memory assets = accountAssets[account]; - for (uint i = 0; i < assets.length; i++) { - VToken asset = assets[i]; - - // Read the balances and exchange rate from the vToken - (oErr, vars.vTokenBalance, vars.borrowBalance, vars.exchangeRateMantissa) = asset.getAccountSnapshot( - account - ); - if (oErr != 0) { - // semi-opaque error code, we assume NO_ERROR == 0 is invariant between upgrades - return (Error.SNAPSHOT_ERROR, 0, 0); - } - vars.collateralFactor = Exp({ mantissa: markets[address(asset)].collateralFactorMantissa }); - vars.exchangeRate = Exp({ mantissa: vars.exchangeRateMantissa }); - - // Get the normalized price of the asset - vars.oraclePriceMantissa = oracle.getUnderlyingPrice(asset); - if (vars.oraclePriceMantissa == 0) { - return (Error.PRICE_ERROR, 0, 0); - } - vars.oraclePrice = Exp({ mantissa: vars.oraclePriceMantissa }); - - // Pre-compute a conversion factor from tokens -> bnb (normalized price value) - (mErr, vars.tokensToDenom) = mulExp3(vars.collateralFactor, vars.exchangeRate, vars.oraclePrice); - if (mErr != MathError.NO_ERROR) { - return (Error.MATH_ERROR, 0, 0); - } - - // sumCollateral += tokensToDenom * vTokenBalance - (mErr, vars.sumCollateral) = mulScalarTruncateAddUInt( - vars.tokensToDenom, - vars.vTokenBalance, - vars.sumCollateral - ); - if (mErr != MathError.NO_ERROR) { - return (Error.MATH_ERROR, 0, 0); - } - - // sumBorrowPlusEffects += oraclePrice * borrowBalance - (mErr, vars.sumBorrowPlusEffects) = mulScalarTruncateAddUInt( - vars.oraclePrice, - vars.borrowBalance, - vars.sumBorrowPlusEffects - ); - if (mErr != MathError.NO_ERROR) { - return (Error.MATH_ERROR, 0, 0); - } - - // Calculate effects of interacting with vTokenModify - if (asset == vTokenModify) { - // redeem effect - // sumBorrowPlusEffects += tokensToDenom * redeemTokens - (mErr, vars.sumBorrowPlusEffects) = mulScalarTruncateAddUInt( - vars.tokensToDenom, - redeemTokens, - vars.sumBorrowPlusEffects - ); - if (mErr != MathError.NO_ERROR) { - return (Error.MATH_ERROR, 0, 0); - } - - // borrow effect - // sumBorrowPlusEffects += oraclePrice * borrowAmount - (mErr, vars.sumBorrowPlusEffects) = mulScalarTruncateAddUInt( - vars.oraclePrice, - borrowAmount, - vars.sumBorrowPlusEffects - ); - if (mErr != MathError.NO_ERROR) { - return (Error.MATH_ERROR, 0, 0); - } - } - } - - /// @dev VAI Integration^ - (mErr, vars.sumBorrowPlusEffects) = addUInt(vars.sumBorrowPlusEffects, mintedVAIs[account]); - if (mErr != MathError.NO_ERROR) { - return (Error.MATH_ERROR, 0, 0); - } - /// @dev VAI Integration$ - - // These are safe, as the underflow condition is checked first - if (vars.sumCollateral > vars.sumBorrowPlusEffects) { - return (Error.NO_ERROR, vars.sumCollateral - vars.sumBorrowPlusEffects, 0); - } else { - return (Error.NO_ERROR, 0, vars.sumBorrowPlusEffects - vars.sumCollateral); - } - } - - /** - * @notice Calculate number of tokens of collateral asset to seize given an underlying amount - * @dev Used in liquidation (called in vToken.liquidateBorrowFresh) - * @param vTokenBorrowed The address of the borrowed vToken - * @param vTokenCollateral The address of the collateral vToken - * @param actualRepayAmount The amount of vTokenBorrowed underlying to convert into vTokenCollateral tokens - * @return (errorCode, number of vTokenCollateral tokens to be seized in a liquidation) - */ - function liquidateCalculateSeizeTokens( - address vTokenBorrowed, - address vTokenCollateral, - uint actualRepayAmount - ) external view override returns (uint, uint) { - /* Read oracle prices for borrowed and collateral markets */ - uint priceBorrowedMantissa = oracle.getUnderlyingPrice(VToken(vTokenBorrowed)); - uint priceCollateralMantissa = oracle.getUnderlyingPrice(VToken(vTokenCollateral)); - if (priceBorrowedMantissa == 0 || priceCollateralMantissa == 0) { - return (uint(Error.PRICE_ERROR), 0); - } - - /* - * Get the exchange rate and calculate the number of collateral tokens to seize: - * seizeAmount = actualRepayAmount * liquidationIncentive * priceBorrowed / priceCollateral - * seizeTokens = seizeAmount / exchangeRate - * = actualRepayAmount * (liquidationIncentive * priceBorrowed) / (priceCollateral * exchangeRate) - */ - uint exchangeRateMantissa = VToken(vTokenCollateral).exchangeRateStored(); // Note: reverts on error - uint seizeTokens; - Exp memory numerator; - Exp memory denominator; - Exp memory ratio; - MathError mathErr; - - (mathErr, numerator) = mulExp(liquidationIncentiveMantissa, priceBorrowedMantissa); - if (mathErr != MathError.NO_ERROR) { - return (uint(Error.MATH_ERROR), 0); - } - - (mathErr, denominator) = mulExp(priceCollateralMantissa, exchangeRateMantissa); - if (mathErr != MathError.NO_ERROR) { - return (uint(Error.MATH_ERROR), 0); - } - - (mathErr, ratio) = divExp(numerator, denominator); - if (mathErr != MathError.NO_ERROR) { - return (uint(Error.MATH_ERROR), 0); - } - - (mathErr, seizeTokens) = mulScalarTruncate(ratio, actualRepayAmount); - if (mathErr != MathError.NO_ERROR) { - return (uint(Error.MATH_ERROR), 0); - } - - return (uint(Error.NO_ERROR), seizeTokens); - } - - /*** Admin Functions ***/ - - /** - * @notice Sets a new price oracle for the comptroller - * @dev Admin function to set a new price oracle - * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) - */ - function _setPriceOracle(PriceOracle newOracle) public returns (uint) { - // Check caller is admin - if (msg.sender != admin) { - return fail(Error.UNAUTHORIZED, FailureInfo.SET_PRICE_ORACLE_OWNER_CHECK); - } - - // Track the old oracle for the comptroller - PriceOracle oldOracle = oracle; - - // Set comptroller's oracle to newOracle - oracle = newOracle; - - // Emit NewPriceOracle(oldOracle, newOracle) - emit NewPriceOracle(oldOracle, newOracle); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Sets the closeFactor used when liquidating borrows - * @dev Admin function to set closeFactor - * @param newCloseFactorMantissa New close factor, scaled by 1e18 - * @return uint 0=success, otherwise a failure. (See ErrorReporter for details) - */ - function _setCloseFactor(uint newCloseFactorMantissa) external returns (uint) { - // Check caller is admin - if (msg.sender != admin) { - return fail(Error.UNAUTHORIZED, FailureInfo.SET_CLOSE_FACTOR_OWNER_CHECK); - } - - Exp memory newCloseFactorExp = Exp({ mantissa: newCloseFactorMantissa }); - Exp memory lowLimit = Exp({ mantissa: closeFactorMinMantissa }); - if (lessThanOrEqualExp(newCloseFactorExp, lowLimit)) { - return fail(Error.INVALID_CLOSE_FACTOR, FailureInfo.SET_CLOSE_FACTOR_VALIDATION); - } - - Exp memory highLimit = Exp({ mantissa: closeFactorMaxMantissa }); - if (lessThanExp(highLimit, newCloseFactorExp)) { - return fail(Error.INVALID_CLOSE_FACTOR, FailureInfo.SET_CLOSE_FACTOR_VALIDATION); - } - - uint oldCloseFactorMantissa = closeFactorMantissa; - closeFactorMantissa = newCloseFactorMantissa; - emit NewCloseFactor(oldCloseFactorMantissa, newCloseFactorMantissa); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Sets the collateralFactor for a market - * @dev Admin function to set per-market collateralFactor - * @param vToken The market to set the factor on - * @param newCollateralFactorMantissa The new collateral factor, scaled by 1e18 - * @return uint 0=success, otherwise a failure. (See ErrorReporter for details) - */ - function _setCollateralFactor(VToken vToken, uint newCollateralFactorMantissa) external returns (uint) { - // Check caller is admin - if (msg.sender != admin) { - return fail(Error.UNAUTHORIZED, FailureInfo.SET_COLLATERAL_FACTOR_OWNER_CHECK); - } - - // Verify market is listed - Market storage market = markets[address(vToken)]; - if (!market.isListed) { - return fail(Error.MARKET_NOT_LISTED, FailureInfo.SET_COLLATERAL_FACTOR_NO_EXISTS); - } - - Exp memory newCollateralFactorExp = Exp({ mantissa: newCollateralFactorMantissa }); - - // Check collateral factor <= 0.9 - Exp memory highLimit = Exp({ mantissa: collateralFactorMaxMantissa }); - if (lessThanExp(highLimit, newCollateralFactorExp)) { - return fail(Error.INVALID_COLLATERAL_FACTOR, FailureInfo.SET_COLLATERAL_FACTOR_VALIDATION); - } - - // If collateral factor != 0, fail if price == 0 - if (newCollateralFactorMantissa != 0 && oracle.getUnderlyingPrice(vToken) == 0) { - return fail(Error.PRICE_ERROR, FailureInfo.SET_COLLATERAL_FACTOR_WITHOUT_PRICE); - } - - // Set market's collateral factor to new collateral factor, remember old value - uint oldCollateralFactorMantissa = market.collateralFactorMantissa; - market.collateralFactorMantissa = newCollateralFactorMantissa; - - // Emit event with asset, old collateral factor, and new collateral factor - emit NewCollateralFactor(vToken, oldCollateralFactorMantissa, newCollateralFactorMantissa); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Sets maxAssets which controls how many markets can be entered - * @dev Admin function to set maxAssets - * @param newMaxAssets New max assets - * @return uint 0=success, otherwise a failure. (See ErrorReporter for details) - */ - function _setMaxAssets(uint newMaxAssets) external returns (uint) { - // Check caller is admin - if (msg.sender != admin) { - return fail(Error.UNAUTHORIZED, FailureInfo.SET_MAX_ASSETS_OWNER_CHECK); - } - - uint oldMaxAssets = maxAssets; - maxAssets = newMaxAssets; - emit NewMaxAssets(oldMaxAssets, newMaxAssets); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Sets liquidationIncentive - * @dev Admin function to set liquidationIncentive - * @param newLiquidationIncentiveMantissa New liquidationIncentive scaled by 1e18 - * @return uint 0=success, otherwise a failure. (See ErrorReporter for details) - */ - function _setLiquidationIncentive(uint newLiquidationIncentiveMantissa) external returns (uint) { - // Check caller is admin - if (msg.sender != admin) { - return fail(Error.UNAUTHORIZED, FailureInfo.SET_LIQUIDATION_INCENTIVE_OWNER_CHECK); - } - - // Check de-scaled min <= newLiquidationIncentive <= max - Exp memory newLiquidationIncentive = Exp({ mantissa: newLiquidationIncentiveMantissa }); - Exp memory minLiquidationIncentive = Exp({ mantissa: liquidationIncentiveMinMantissa }); - if (lessThanExp(newLiquidationIncentive, minLiquidationIncentive)) { - return fail(Error.INVALID_LIQUIDATION_INCENTIVE, FailureInfo.SET_LIQUIDATION_INCENTIVE_VALIDATION); - } - - Exp memory maxLiquidationIncentive = Exp({ mantissa: liquidationIncentiveMaxMantissa }); - if (lessThanExp(maxLiquidationIncentive, newLiquidationIncentive)) { - return fail(Error.INVALID_LIQUIDATION_INCENTIVE, FailureInfo.SET_LIQUIDATION_INCENTIVE_VALIDATION); - } - - // Save current value for use in log - uint oldLiquidationIncentiveMantissa = liquidationIncentiveMantissa; - - // Set liquidation incentive to new incentive - liquidationIncentiveMantissa = newLiquidationIncentiveMantissa; - - // Emit event with old incentive, new incentive - emit NewLiquidationIncentive(oldLiquidationIncentiveMantissa, newLiquidationIncentiveMantissa); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Add the market to the markets mapping and set it as listed - * @dev Admin function to set isListed and add support for the market - * @param vToken The address of the market (token) to list - * @return uint 0=success, otherwise a failure. (See enum Error for details) - */ - function _supportMarket(VToken vToken) external returns (uint) { - if (msg.sender != admin) { - return fail(Error.UNAUTHORIZED, FailureInfo.SUPPORT_MARKET_OWNER_CHECK); - } - - if (markets[address(vToken)].isListed) { - return fail(Error.MARKET_ALREADY_LISTED, FailureInfo.SUPPORT_MARKET_EXISTS); - } - - vToken.isVToken(); // Sanity check to make sure its really a VToken - - Market storage newMarket = markets[address(vToken)]; - newMarket.isListed = true; - newMarket.isVenus = false; - newMarket.collateralFactorMantissa = 0; - _addMarketInternal(vToken); - - emit MarketListed(vToken); - - return uint(Error.NO_ERROR); - } - - function _addMarketInternal(VToken vToken) internal { - for (uint i = 0; i < allMarkets.length; i++) { - require(allMarkets[i] != vToken, "market already added"); - } - allMarkets.push(vToken); - } - - /** - * @notice Admin function to change the Pause Guardian - * @param newPauseGuardian The address of the new Pause Guardian - * @return uint 0=success, otherwise a failure. (See enum Error for details) - */ - function _setPauseGuardian(address newPauseGuardian) public returns (uint) { - if (msg.sender != admin) { - return fail(Error.UNAUTHORIZED, FailureInfo.SET_PAUSE_GUARDIAN_OWNER_CHECK); - } - - // Save current value for inclusion in log - address oldPauseGuardian = pauseGuardian; - - // Store pauseGuardian with value newPauseGuardian - pauseGuardian = newPauseGuardian; - - // Emit NewPauseGuardian(OldPauseGuardian, NewPauseGuardian) - emit NewPauseGuardian(oldPauseGuardian, newPauseGuardian); - - return uint(Error.NO_ERROR); - } - - function _setMintPaused( - VToken vToken, - bool state - ) public onlyListedMarket(vToken) validPauseState(state) returns (bool) { - mintGuardianPaused[address(vToken)] = state; - emit ActionPaused(vToken, "Mint", state); - return state; - } - - function _setBorrowPaused( - VToken vToken, - bool state - ) public onlyListedMarket(vToken) validPauseState(state) returns (bool) { - borrowGuardianPaused[address(vToken)] = state; - emit ActionPaused(vToken, "Borrow", state); - return state; - } - - function _setTransferPaused(bool state) public validPauseState(state) returns (bool) { - transferGuardianPaused = state; - emit ActionPaused("Transfer", state); - return state; - } - - function _setSeizePaused(bool state) public validPauseState(state) returns (bool) { - seizeGuardianPaused = state; - emit ActionPaused("Seize", state); - return state; - } - - function _setMintVAIPaused(bool state) public validPauseState(state) returns (bool) { - mintVAIGuardianPaused = state; - emit ActionPaused("MintVAI", state); - return state; - } - - function _setRepayVAIPaused(bool state) public validPauseState(state) returns (bool) { - repayVAIGuardianPaused = state; - emit ActionPaused("RepayVAI", state); - return state; - } - - /** - * @notice Set whole protocol pause/unpause state - */ - function _setProtocolPaused(bool state) public onlyAdmin returns (bool) { - protocolPaused = state; - emit ActionProtocolPaused(state); - return state; - } - - /** - * @notice Sets a new VAI controller - * @dev Admin function to set a new VAI controller - * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) - */ - function _setVAIController(VAIControllerInterface vaiController_) external returns (uint) { - // Check caller is admin - if (msg.sender != admin) { - return fail(Error.UNAUTHORIZED, FailureInfo.SET_VAICONTROLLER_OWNER_CHECK); - } - - VAIControllerInterface oldRate = vaiController; - vaiController = vaiController_; - emit NewVAIController(oldRate, vaiController_); - } - - function _setVAIMintRate(uint newVAIMintRate) external returns (uint) { - // Check caller is admin - if (msg.sender != admin) { - return fail(Error.UNAUTHORIZED, FailureInfo.SET_VAI_MINT_RATE_CHECK); - } - - uint oldVAIMintRate = vaiMintRate; - vaiMintRate = newVAIMintRate; - emit NewVAIMintRate(oldVAIMintRate, newVAIMintRate); - - return uint(Error.NO_ERROR); - } - - function _become(Unitroller unitroller) public { - require(msg.sender == unitroller.admin(), "only unitroller admin can"); - require(unitroller._acceptImplementation() == 0, "not authorized"); - } - - /*** Venus Distribution ***/ - - /** - * @notice Recalculate and update Venus speeds for all Venus markets - */ - function refreshVenusSpeeds() public { - require(msg.sender == tx.origin, "only externally owned accounts can"); - refreshVenusSpeedsInternal(); - } - - function refreshVenusSpeedsInternal() internal { - uint i; - VToken vToken; - - for (i = 0; i < allMarkets.length; i++) { - vToken = allMarkets[i]; - Exp memory borrowIndex = Exp({ mantissa: vToken.borrowIndex() }); - updateVenusSupplyIndex(address(vToken)); - updateVenusBorrowIndex(address(vToken), borrowIndex); - } - - Exp memory totalUtility = Exp({ mantissa: 0 }); - Exp[] memory utilities = new Exp[](allMarkets.length); - for (i = 0; i < allMarkets.length; i++) { - vToken = allMarkets[i]; - if (markets[address(vToken)].isVenus) { - Exp memory assetPrice = Exp({ mantissa: oracle.getUnderlyingPrice(vToken) }); - Exp memory utility = mul_(assetPrice, vToken.totalBorrows()); - utilities[i] = utility; - totalUtility = add_(totalUtility, utility); - } - } - - for (i = 0; i < allMarkets.length; i++) { - vToken = allMarkets[i]; - uint newSpeed = totalUtility.mantissa > 0 ? mul_(venusRate, div_(utilities[i], totalUtility)) : 0; - venusSpeeds[address(vToken)] = newSpeed; - emit VenusSpeedUpdated(vToken, newSpeed); - } - } - - /** - * @notice Accrue XVS to the market by updating the supply index - * @param vToken The market whose supply index to update - */ - function updateVenusSupplyIndex(address vToken) internal { - VenusMarketState storage supplyState = venusSupplyState[vToken]; - uint supplySpeed = venusSpeeds[vToken]; - uint blockNumber = getBlockNumber(); - uint deltaBlocks = sub_(blockNumber, uint(supplyState.block)); - if (deltaBlocks > 0 && supplySpeed > 0) { - uint supplyTokens = VToken(vToken).totalSupply(); - uint venusAccrued = mul_(deltaBlocks, supplySpeed); - Double memory ratio = supplyTokens > 0 ? fraction(venusAccrued, supplyTokens) : Double({ mantissa: 0 }); - Double memory index = add_(Double({ mantissa: supplyState.index }), ratio); - venusSupplyState[vToken] = VenusMarketState({ - index: safe224(index.mantissa, "new index overflows"), - block: safe32(blockNumber, "block number overflows") - }); - } else if (deltaBlocks > 0) { - supplyState.block = safe32(blockNumber, "block number overflows"); - } - } - - /** - * @notice Accrue XVS to the market by updating the borrow index - * @param vToken The market whose borrow index to update - */ - function updateVenusBorrowIndex(address vToken, Exp memory marketBorrowIndex) internal { - VenusMarketState storage borrowState = venusBorrowState[vToken]; - uint borrowSpeed = venusSpeeds[vToken]; - uint blockNumber = getBlockNumber(); - uint deltaBlocks = sub_(blockNumber, uint(borrowState.block)); - if (deltaBlocks > 0 && borrowSpeed > 0) { - uint borrowAmount = div_(VToken(vToken).totalBorrows(), marketBorrowIndex); - uint venusAccrued = mul_(deltaBlocks, borrowSpeed); - Double memory ratio = borrowAmount > 0 ? fraction(venusAccrued, borrowAmount) : Double({ mantissa: 0 }); - Double memory index = add_(Double({ mantissa: borrowState.index }), ratio); - venusBorrowState[vToken] = VenusMarketState({ - index: safe224(index.mantissa, "new index overflows"), - block: safe32(blockNumber, "block number overflows") - }); - } else if (deltaBlocks > 0) { - borrowState.block = safe32(blockNumber, "block number overflows"); - } - } - - /** - * @notice Accrue XVS to by updating the VAI minter index - */ - function updateVenusVAIMintIndex() internal { - if (address(vaiController) != address(0)) { - vaiController.updateVenusVAIMintIndex(); - } - } - - /** - * @notice Calculate XVS accrued by a supplier and possibly transfer it to them - * @param vToken The market in which the supplier is interacting - * @param supplier The address of the supplier to distribute XVS to - */ - function distributeSupplierVenus(address vToken, address supplier, bool distributeAll) internal { - VenusMarketState storage supplyState = venusSupplyState[vToken]; - Double memory supplyIndex = Double({ mantissa: supplyState.index }); - Double memory supplierIndex = Double({ mantissa: venusSupplierIndex[vToken][supplier] }); - venusSupplierIndex[vToken][supplier] = supplyIndex.mantissa; - - if (supplierIndex.mantissa == 0 && supplyIndex.mantissa > 0) { - supplierIndex.mantissa = venusInitialIndex; - } - - Double memory deltaIndex = sub_(supplyIndex, supplierIndex); - uint supplierTokens = VToken(vToken).balanceOf(supplier); - uint supplierDelta = mul_(supplierTokens, deltaIndex); - uint supplierAccrued = add_(venusAccrued[supplier], supplierDelta); - venusAccrued[supplier] = transferXVS(supplier, supplierAccrued, distributeAll ? 0 : venusClaimThreshold); - emit DistributedSupplierVenus(VToken(vToken), supplier, supplierDelta, supplyIndex.mantissa); - } - - /** - * @notice Calculate XVS accrued by a borrower and possibly transfer it to them - * @dev Borrowers will not begin to accrue until after the first interaction with the protocol. - * @param vToken The market in which the borrower is interacting - * @param borrower The address of the borrower to distribute XVS to - */ - function distributeBorrowerVenus( - address vToken, - address borrower, - Exp memory marketBorrowIndex, - bool distributeAll - ) internal { - VenusMarketState storage borrowState = venusBorrowState[vToken]; - Double memory borrowIndex = Double({ mantissa: borrowState.index }); - Double memory borrowerIndex = Double({ mantissa: venusBorrowerIndex[vToken][borrower] }); - venusBorrowerIndex[vToken][borrower] = borrowIndex.mantissa; - - if (borrowerIndex.mantissa > 0) { - Double memory deltaIndex = sub_(borrowIndex, borrowerIndex); - uint borrowerAmount = div_(VToken(vToken).borrowBalanceStored(borrower), marketBorrowIndex); - uint borrowerDelta = mul_(borrowerAmount, deltaIndex); - uint borrowerAccrued = add_(venusAccrued[borrower], borrowerDelta); - venusAccrued[borrower] = transferXVS(borrower, borrowerAccrued, distributeAll ? 0 : venusClaimThreshold); - emit DistributedBorrowerVenus(VToken(vToken), borrower, borrowerDelta, borrowIndex.mantissa); - } - } - - /** - * @notice Calculate XVS accrued by a VAI minter and possibly transfer it to them - * @dev VAI minters will not begin to accrue until after the first interaction with the protocol. - * @param vaiMinter The address of the VAI minter to distribute XVS to - */ - function distributeVAIMinterVenus(address vaiMinter, bool distributeAll) internal { - if (address(vaiController) != address(0)) { - uint vaiMinterAccrued; - uint vaiMinterDelta; - uint vaiMintIndexMantissa; - uint err; - (err, vaiMinterAccrued, vaiMinterDelta, vaiMintIndexMantissa) = vaiController.calcDistributeVAIMinterVenus( - vaiMinter - ); - if (err == uint(Error.NO_ERROR)) { - venusAccrued[vaiMinter] = transferXVS( - vaiMinter, - vaiMinterAccrued, - distributeAll ? 0 : venusClaimThreshold - ); - emit DistributedVAIMinterVenus(vaiMinter, vaiMinterDelta, vaiMintIndexMantissa); - } - } - } - - /** - * @notice Transfer XVS to the user, if they are above the threshold - * @dev Note: If there is not enough XVS, we do not perform the transfer all. - * @param user The address of the user to transfer XVS to - * @param userAccrued The amount of XVS to (possibly) transfer - * @return The amount of XVS which was NOT transferred to the user - */ - function transferXVS(address user, uint userAccrued, uint threshold) internal returns (uint) { - if (userAccrued >= threshold && userAccrued > 0) { - XVS xvs = XVS(getXVSAddress()); - uint xvsRemaining = xvs.balanceOf(address(this)); - if (userAccrued <= xvsRemaining) { - xvs.transfer(user, userAccrued); - return 0; - } - } - return userAccrued; - } - - /** - * @notice Claim all the xvs accrued by holder in all markets and VAI - * @param holder The address to claim XVS for - */ - function claimVenus(address holder) public { - return claimVenus(holder, allMarkets); - } - - /** - * @notice Claim all the xvs accrued by holder in the specified markets - * @param holder The address to claim XVS for - * @param vTokens The list of markets to claim XVS in - */ - function claimVenus(address holder, VToken[] memory vTokens) public { - address[] memory holders = new address[](1); - holders[0] = holder; - claimVenus(holders, vTokens, true, true); - } - - /** - * @notice Claim all xvs accrued by the holders - * @param holders The addresses to claim XVS for - * @param vTokens The list of markets to claim XVS in - * @param borrowers Whether or not to claim XVS earned by borrowing - * @param suppliers Whether or not to claim XVS earned by supplying - */ - function claimVenus(address[] memory holders, VToken[] memory vTokens, bool borrowers, bool suppliers) public { - uint j; - updateVenusVAIMintIndex(); - for (j = 0; j < holders.length; j++) { - distributeVAIMinterVenus(holders[j], true); - } - for (uint i = 0; i < vTokens.length; i++) { - VToken vToken = vTokens[i]; - require(markets[address(vToken)].isListed, "not listed market"); - if (borrowers) { - Exp memory borrowIndex = Exp({ mantissa: vToken.borrowIndex() }); - updateVenusBorrowIndex(address(vToken), borrowIndex); - for (j = 0; j < holders.length; j++) { - distributeBorrowerVenus(address(vToken), holders[j], borrowIndex, true); - } - } - if (suppliers) { - updateVenusSupplyIndex(address(vToken)); - for (j = 0; j < holders.length; j++) { - distributeSupplierVenus(address(vToken), holders[j], true); - } - } - } - } - - /*** Venus Distribution Admin ***/ - - /** - * @notice Set the amount of XVS distributed per block - * @param venusRate_ The amount of XVS wei per block to distribute - */ - function _setVenusRate(uint venusRate_) public onlyAdmin { - uint oldRate = venusRate; - venusRate = venusRate_; - emit NewVenusRate(oldRate, venusRate_); - - refreshVenusSpeedsInternal(); - } - - /** - * @notice Add markets to venusMarkets, allowing them to earn XVS in the flywheel - * @param vTokens The addresses of the markets to add - */ - function _addVenusMarkets(address[] calldata vTokens) external onlyAdmin { - for (uint i = 0; i < vTokens.length; i++) { - _addVenusMarketInternal(vTokens[i]); - } - - refreshVenusSpeedsInternal(); - } - - function _addVenusMarketInternal(address vToken) internal { - Market storage market = markets[vToken]; - require(market.isListed, "venus market is not listed"); - require(!market.isVenus, "venus market already added"); - - market.isVenus = true; - emit MarketVenus(VToken(vToken), true); - - if (venusSupplyState[vToken].index == 0 && venusSupplyState[vToken].block == 0) { - venusSupplyState[vToken] = VenusMarketState({ - index: venusInitialIndex, - block: safe32(getBlockNumber(), "block number overflows") - }); - } - - if (venusBorrowState[vToken].index == 0 && venusBorrowState[vToken].block == 0) { - venusBorrowState[vToken] = VenusMarketState({ - index: venusInitialIndex, - block: safe32(getBlockNumber(), "block number overflows") - }); - } - } - - function _initializeVenusVAIState(uint blockNumber) public { - require(msg.sender == admin, "only admin can"); - if (address(vaiController) != address(0)) { - vaiController._initializeVenusVAIState(blockNumber); - } - } - - /** - * @notice Remove a market from venusMarkets, preventing it from earning XVS in the flywheel - * @param vToken The address of the market to drop - */ - function _dropVenusMarket(address vToken) public onlyAdmin { - Market storage market = markets[vToken]; - require(market.isVenus == true, "not venus market"); - - market.isVenus = false; - emit MarketVenus(VToken(vToken), false); - - refreshVenusSpeedsInternal(); - } - - /** - * @notice Return all of the markets - * @dev The automatic getter may be used to access an individual market. - * @return The list of market addresses - */ - function getAllMarkets() public view returns (VToken[] memory) { - return allMarkets; - } - - function getBlockNumber() public view virtual returns (uint) { - return block.number; - } - - /** - * @notice Return the address of the XVS token - * @return The address of XVS - */ - function getXVSAddress() public view virtual returns (address) { - return 0xcF6BB5389c92Bdda8a3747Ddb454cB7a64626C63; - } - - /*** VAI functions ***/ - - /** - * @notice Set the minted VAI amount of the `owner` - * @param owner The address of the account to set - * @param amount The amount of VAI to set to the account - * @return The number of minted VAI by `owner` - */ - function setMintedVAIOf(address owner, uint amount) external override onlyProtocolAllowed returns (uint) { - // Pausing is a very serious situation - we revert to sound the alarms - require(!mintVAIGuardianPaused && !repayVAIGuardianPaused, "VAI is paused"); - // Check caller is vaiController - if (msg.sender != address(vaiController)) { - return fail(Error.REJECTION, FailureInfo.SET_MINTED_VAI_REJECTION); - } - mintedVAIs[owner] = amount; - - return uint(Error.NO_ERROR); - } - - /** - * @notice Mint VAI - */ - function mintVAI(uint mintVAIAmount) external onlyProtocolAllowed returns (uint) { - // Pausing is a very serious situation - we revert to sound the alarms - require(!mintVAIGuardianPaused, "mintVAI is paused"); - - // Keep the flywheel moving - updateVenusVAIMintIndex(); - distributeVAIMinterVenus(msg.sender, false); - return vaiController.mintVAI(msg.sender, mintVAIAmount); - } - - /** - * @notice Repay VAI - */ - function repayVAI(uint repayVAIAmount) external onlyProtocolAllowed returns (uint) { - // Pausing is a very serious situation - we revert to sound the alarms - require(!repayVAIGuardianPaused, "repayVAI is paused"); - - // Keep the flywheel moving - updateVenusVAIMintIndex(); - distributeVAIMinterVenus(msg.sender, false); - return vaiController.repayVAI(msg.sender, repayVAIAmount); - } - - /** - * @notice Get the minted VAI amount of the `owner` - * @param owner The address of the account to query - * @return The number of minted VAI by `owner` - */ - function mintedVAIOf(address owner) external view returns (uint) { - return mintedVAIs[owner]; - } - - /** - * @notice Get Mintable VAI amount - */ - function getMintableVAI(address minter) external view returns (uint, uint) { - return vaiController.getMintableVAI(minter); - } -} diff --git a/contracts/Comptroller/ComptrollerG2.sol b/contracts/Comptroller/ComptrollerG2.sol deleted file mode 100644 index 276e63ffa..000000000 --- a/contracts/Comptroller/ComptrollerG2.sol +++ /dev/null @@ -1,1616 +0,0 @@ -pragma solidity 0.8.13; - -import "../Oracle/PriceOracle.sol"; -import "../Tokens/VTokens/VToken.sol"; -import "../Utils/ErrorReporter.sol"; -import "../Utils/Exponential.sol"; -import "../Tokens/XVS/XVS.sol"; -import "../Tokens/VAI/VAI.sol"; -import "./ComptrollerInterface.sol"; -import "./ComptrollerStorage.sol"; -import "./Unitroller.sol"; - -/** - * @title Venus's Comptroller Contract - * @author Venus - */ -contract ComptrollerG2 is ComptrollerV1Storage, ComptrollerInterfaceG1, ComptrollerErrorReporter, Exponential { - /// @notice Emitted when an admin supports a market - event MarketListed(VToken vToken); - - /// @notice Emitted when an account enters a market - event MarketEntered(VToken vToken, address account); - - /// @notice Emitted when an account exits a market - event MarketExited(VToken vToken, address account); - - /// @notice Emitted when close factor is changed by admin - event NewCloseFactor(uint oldCloseFactorMantissa, uint newCloseFactorMantissa); - - /// @notice Emitted when a collateral factor is changed by admin - event NewCollateralFactor(VToken vToken, uint oldCollateralFactorMantissa, uint newCollateralFactorMantissa); - - /// @notice Emitted when liquidation incentive is changed by admin - event NewLiquidationIncentive(uint oldLiquidationIncentiveMantissa, uint newLiquidationIncentiveMantissa); - - /// @notice Emitted when maxAssets is changed by admin - event NewMaxAssets(uint oldMaxAssets, uint newMaxAssets); - - /// @notice Emitted when price oracle is changed - event NewPriceOracle(PriceOracle oldPriceOracle, PriceOracle newPriceOracle); - - /// @notice Emitted when pause guardian is changed - event NewPauseGuardian(address oldPauseGuardian, address newPauseGuardian); - - /// @notice Emitted when an action is paused globally - event ActionPaused(string action, bool pauseState); - - /// @notice Emitted when an action is paused on a market - event ActionPaused(VToken vToken, string action, bool pauseState); - - /// @notice Emitted when market venus status is changed - event MarketVenus(VToken vToken, bool isVenus); - - /// @notice Emitted when Venus rate is changed - event NewVenusRate(uint oldVenusRate, uint newVenusRate); - - /// @notice Emitted when a new Venus speed is calculated for a market - event VenusSpeedUpdated(VToken indexed vToken, uint newSpeed); - - /// @notice Emitted when XVS is distributed to a supplier - event DistributedSupplierVenus( - VToken indexed vToken, - address indexed supplier, - uint venusDelta, - uint venusSupplyIndex - ); - - /// @notice Emitted when XVS is distributed to a borrower - event DistributedBorrowerVenus( - VToken indexed vToken, - address indexed borrower, - uint venusDelta, - uint venusBorrowIndex - ); - - /// @notice Emitted when XVS is distributed to a VAI minter - event DistributedVAIMinterVenus(address indexed vaiMinter, uint venusDelta, uint venusVAIMintIndex); - - /// @notice Emitted when VAIController is changed - event NewVAIController(VAIControllerInterface oldVAIController, VAIControllerInterface newVAIController); - - /// @notice Emitted when VAI mint rate is changed by admin - event NewVAIMintRate(uint oldVAIMintRate, uint newVAIMintRate); - - /// @notice Emitted when protocol state is changed by admin - event ActionProtocolPaused(bool state); - - /// @notice The threshold above which the flywheel transfers XVS, in wei - uint public constant venusClaimThreshold = 0.001e18; - - /// @notice The initial Venus index for a market - uint224 public constant venusInitialIndex = 1e36; - - // closeFactorMantissa must be strictly greater than this value - uint internal constant closeFactorMinMantissa = 0.05e18; // 0.05 - - // closeFactorMantissa must not exceed this value - uint internal constant closeFactorMaxMantissa = 0.9e18; // 0.9 - - // No collateralFactorMantissa may exceed this value - uint internal constant collateralFactorMaxMantissa = 0.9e18; // 0.9 - - // liquidationIncentiveMantissa must be no less than this value - uint internal constant liquidationIncentiveMinMantissa = 1.0e18; // 1.0 - - // liquidationIncentiveMantissa must be no greater than this value - uint internal constant liquidationIncentiveMaxMantissa = 1.5e18; // 1.5 - - constructor() public { - admin = msg.sender; - } - - modifier onlyProtocolAllowed() { - require(!protocolPaused, "protocol is paused"); - _; - } - - modifier onlyAdmin() { - require(msg.sender == admin, "only admin can"); - _; - } - - modifier onlyListedMarket(VToken vToken) { - require(markets[address(vToken)].isListed, "venus market is not listed"); - _; - } - - modifier validPauseState(bool state) { - require(msg.sender == pauseGuardian || msg.sender == admin, "only pause guardian and admin can"); - require(msg.sender == admin || state == true, "only admin can unpause"); - _; - } - - /*** Assets You Are In ***/ - - /** - * @notice Returns the assets an account has entered - * @param account The address of the account to pull assets for - * @return A dynamic list with the assets the account has entered - */ - function getAssetsIn(address account) external view returns (VToken[] memory) { - return accountAssets[account]; - } - - /** - * @notice Returns whether the given account is entered in the given asset - * @param account The address of the account to check - * @param vToken The vToken to check - * @return True if the account is in the asset, otherwise false. - */ - function checkMembership(address account, VToken vToken) external view returns (bool) { - return markets[address(vToken)].accountMembership[account]; - } - - /** - * @notice Add assets to be included in account liquidity calculation - * @param vTokens The list of addresses of the vToken markets to be enabled - * @return Success indicator for whether each corresponding market was entered - */ - function enterMarkets(address[] calldata vTokens) external override returns (uint[] memory) { - uint len = vTokens.length; - - uint[] memory results = new uint[](len); - for (uint i = 0; i < len; i++) { - results[i] = uint(addToMarketInternal(VToken(vTokens[i]), msg.sender)); - } - - return results; - } - - /** - * @notice Add the market to the borrower's "assets in" for liquidity calculations - * @param vToken The market to enter - * @param borrower The address of the account to modify - * @return Success indicator for whether the market was entered - */ - function addToMarketInternal(VToken vToken, address borrower) internal returns (Error) { - Market storage marketToJoin = markets[address(vToken)]; - - if (!marketToJoin.isListed) { - // market is not listed, cannot join - return Error.MARKET_NOT_LISTED; - } - - if (marketToJoin.accountMembership[borrower]) { - // already joined - return Error.NO_ERROR; - } - - if (accountAssets[borrower].length >= maxAssets) { - // no space, cannot join - return Error.TOO_MANY_ASSETS; - } - - // survived the gauntlet, add to list - // NOTE: we store these somewhat redundantly as a significant optimization - // this avoids having to iterate through the list for the most common use cases - // that is, only when we need to perform liquidity checks - // and not whenever we want to check if an account is in a particular market - marketToJoin.accountMembership[borrower] = true; - accountAssets[borrower].push(vToken); - - emit MarketEntered(vToken, borrower); - - return Error.NO_ERROR; - } - - /** - * @notice Removes asset from sender's account liquidity calculation - * @dev Sender must not have an outstanding borrow balance in the asset, - * or be providing necessary collateral for an outstanding borrow. - * @param vTokenAddress The address of the asset to be removed - * @return Whether or not the account successfully exited the market - */ - function exitMarket(address vTokenAddress) external override returns (uint) { - VToken vToken = VToken(vTokenAddress); - /* Get sender tokensHeld and amountOwed underlying from the vToken */ - (uint oErr, uint tokensHeld, uint amountOwed, ) = vToken.getAccountSnapshot(msg.sender); - require(oErr == 0, "getAccountSnapshot failed"); // semi-opaque error code - - /* Fail if the sender has a borrow balance */ - if (amountOwed != 0) { - return fail(Error.NONZERO_BORROW_BALANCE, FailureInfo.EXIT_MARKET_BALANCE_OWED); - } - - /* Fail if the sender is not permitted to redeem all of their tokens */ - uint allowed = redeemAllowedInternal(vTokenAddress, msg.sender, tokensHeld); - if (allowed != 0) { - return failOpaque(Error.REJECTION, FailureInfo.EXIT_MARKET_REJECTION, allowed); - } - - Market storage marketToExit = markets[address(vToken)]; - - /* Return true if the sender is not already ‘in’ the market */ - if (!marketToExit.accountMembership[msg.sender]) { - return uint(Error.NO_ERROR); - } - - /* Set vToken account membership to false */ - delete marketToExit.accountMembership[msg.sender]; - - /* Delete vToken from the account’s list of assets */ - // In order to delete vToken, copy last item in list to location of item to be removed, reduce length by 1 - VToken[] storage userAssetList = accountAssets[msg.sender]; - uint len = userAssetList.length; - uint i; - for (; i < len; i++) { - if (userAssetList[i] == vToken) { - userAssetList[i] = userAssetList[len - 1]; - userAssetList.pop(); - break; - } - } - - // We *must* have found the asset in the list or our redundant data structure is broken - assert(i < len); - - emit MarketExited(vToken, msg.sender); - - return uint(Error.NO_ERROR); - } - - /*** Policy Hooks ***/ - - /** - * @notice Checks if the account should be allowed to mint tokens in the given market - * @param vToken The market to verify the mint against - * @param minter The account which would get the minted tokens - * @param mintAmount The amount of underlying being supplied to the market in exchange for tokens - * @return 0 if the mint is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) - */ - function mintAllowed( - address vToken, - address minter, - uint mintAmount - ) external override onlyProtocolAllowed returns (uint) { - // Pausing is a very serious situation - we revert to sound the alarms - require(!mintGuardianPaused[vToken], "mint is paused"); - - // Shh - currently unused - mintAmount; - - if (!markets[vToken].isListed) { - return uint(Error.MARKET_NOT_LISTED); - } - - // Keep the flywheel moving - updateVenusSupplyIndex(vToken); - distributeSupplierVenus(vToken, minter, false); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Validates mint and reverts on rejection. May emit logs. - * @param vToken Asset being minted - * @param minter The address minting the tokens - * @param actualMintAmount The amount of the underlying asset being minted - * @param mintTokens The number of tokens being minted - */ - function mintVerify(address vToken, address minter, uint actualMintAmount, uint mintTokens) external override { - // Shh - currently unused - vToken; - minter; - actualMintAmount; - mintTokens; - } - - /** - * @notice Checks if the account should be allowed to redeem tokens in the given market - * @param vToken The market to verify the redeem against - * @param redeemer The account which would redeem the tokens - * @param redeemTokens The number of vTokens to exchange for the underlying asset in the market - * @return 0 if the redeem is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) - */ - function redeemAllowed( - address vToken, - address redeemer, - uint redeemTokens - ) external override onlyProtocolAllowed returns (uint) { - uint allowed = redeemAllowedInternal(vToken, redeemer, redeemTokens); - if (allowed != uint(Error.NO_ERROR)) { - return allowed; - } - - // Keep the flywheel moving - updateVenusSupplyIndex(vToken); - distributeSupplierVenus(vToken, redeemer, false); - - return uint(Error.NO_ERROR); - } - - function redeemAllowedInternal(address vToken, address redeemer, uint redeemTokens) internal view returns (uint) { - if (!markets[vToken].isListed) { - return uint(Error.MARKET_NOT_LISTED); - } - - /* If the redeemer is not 'in' the market, then we can bypass the liquidity check */ - if (!markets[vToken].accountMembership[redeemer]) { - return uint(Error.NO_ERROR); - } - - /* Otherwise, perform a hypothetical liquidity check to guard against shortfall */ - (Error err, , uint shortfall) = getHypotheticalAccountLiquidityInternal( - redeemer, - VToken(vToken), - redeemTokens, - 0 - ); - if (err != Error.NO_ERROR) { - return uint(err); - } - if (shortfall != 0) { - return uint(Error.INSUFFICIENT_LIQUIDITY); - } - - return uint(Error.NO_ERROR); - } - - /** - * @notice Validates redeem and reverts on rejection. May emit logs. - * @param vToken Asset being redeemed - * @param redeemer The address redeeming the tokens - * @param redeemAmount The amount of the underlying asset being redeemed - * @param redeemTokens The number of tokens being redeemed - */ - function redeemVerify(address vToken, address redeemer, uint redeemAmount, uint redeemTokens) external override { - // Shh - currently unused - vToken; - redeemer; - - // Require tokens is zero or amount is also zero - require(redeemTokens != 0 || redeemAmount == 0, "redeemTokens zero"); - } - - /** - * @notice Checks if the account should be allowed to borrow the underlying asset of the given market - * @param vToken The market to verify the borrow against - * @param borrower The account which would borrow the asset - * @param borrowAmount The amount of underlying the account would borrow - * @return 0 if the borrow is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) - */ - function borrowAllowed( - address vToken, - address borrower, - uint borrowAmount - ) external override onlyProtocolAllowed returns (uint) { - // Pausing is a very serious situation - we revert to sound the alarms - require(!borrowGuardianPaused[vToken], "borrow is paused"); - - if (!markets[vToken].isListed) { - return uint(Error.MARKET_NOT_LISTED); - } - - if (!markets[vToken].accountMembership[borrower]) { - // only vTokens may call borrowAllowed if borrower not in market - require(msg.sender == vToken, "sender must be vToken"); - - // attempt to add borrower to the market - Error err = addToMarketInternal(VToken(vToken), borrower); - if (err != Error.NO_ERROR) { - return uint(err); - } - } - - if (oracle.getUnderlyingPrice(VToken(vToken)) == 0) { - return uint(Error.PRICE_ERROR); - } - - (Error err, , uint shortfall) = getHypotheticalAccountLiquidityInternal( - borrower, - VToken(vToken), - 0, - borrowAmount - ); - if (err != Error.NO_ERROR) { - return uint(err); - } - if (shortfall != 0) { - return uint(Error.INSUFFICIENT_LIQUIDITY); - } - - // Keep the flywheel moving - Exp memory borrowIndex = Exp({ mantissa: VToken(vToken).borrowIndex() }); - updateVenusBorrowIndex(vToken, borrowIndex); - distributeBorrowerVenus(vToken, borrower, borrowIndex, false); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Validates borrow and reverts on rejection. May emit logs. - * @param vToken Asset whose underlying is being borrowed - * @param borrower The address borrowing the underlying - * @param borrowAmount The amount of the underlying asset requested to borrow - */ - function borrowVerify(address vToken, address borrower, uint borrowAmount) external override { - // Shh - currently unused - vToken; - borrower; - borrowAmount; - - // Shh - we don't ever want this hook to be marked pure - if (false) { - maxAssets = maxAssets; - } - } - - /** - * @notice Checks if the account should be allowed to repay a borrow in the given market - * @param vToken The market to verify the repay against - * @param payer The account which would repay the asset - * @param borrower The account which would repay the asset - * @param repayAmount The amount of the underlying asset the account would repay - * @return 0 if the repay is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) - */ - function repayBorrowAllowed( - address vToken, - address payer, - address borrower, - uint repayAmount - ) external override onlyProtocolAllowed returns (uint) { - // Shh - currently unused - payer; - borrower; - repayAmount; - - if (!markets[vToken].isListed) { - return uint(Error.MARKET_NOT_LISTED); - } - - // Keep the flywheel moving - Exp memory borrowIndex = Exp({ mantissa: VToken(vToken).borrowIndex() }); - updateVenusBorrowIndex(vToken, borrowIndex); - distributeBorrowerVenus(vToken, borrower, borrowIndex, false); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Validates repayBorrow and reverts on rejection. May emit logs. - * @param vToken Asset being repaid - * @param payer The address repaying the borrow - * @param borrower The address of the borrower - * @param actualRepayAmount The amount of underlying being repaid - */ - function repayBorrowVerify( - address vToken, - address payer, - address borrower, - uint actualRepayAmount, - uint borrowerIndex - ) external override { - // Shh - currently unused - vToken; - payer; - borrower; - actualRepayAmount; - borrowerIndex; - - // Shh - we don't ever want this hook to be marked pure - if (false) { - maxAssets = maxAssets; - } - } - - /** - * @notice Checks if the liquidation should be allowed to occur - * @param vTokenBorrowed Asset which was borrowed by the borrower - * @param vTokenCollateral Asset which was used as collateral and will be seized - * @param liquidator The address repaying the borrow and seizing the collateral - * @param borrower The address of the borrower - * @param repayAmount The amount of underlying being repaid - */ - function liquidateBorrowAllowed( - address vTokenBorrowed, - address vTokenCollateral, - address liquidator, - address borrower, - uint repayAmount - ) external override onlyProtocolAllowed returns (uint) { - // Shh - currently unused - liquidator; - - if (!markets[vTokenBorrowed].isListed || !markets[vTokenCollateral].isListed) { - return uint(Error.MARKET_NOT_LISTED); - } - - /* The borrower must have shortfall in order to be liquidatable */ - (Error err, , uint shortfall) = getHypotheticalAccountLiquidityInternal(borrower, VToken(address(0)), 0, 0); - if (err != Error.NO_ERROR) { - return uint(err); - } - if (shortfall == 0) { - return uint(Error.INSUFFICIENT_SHORTFALL); - } - - /* The liquidator may not repay more than what is allowed by the closeFactor */ - uint borrowBalance = VToken(vTokenBorrowed).borrowBalanceStored(borrower); - (MathError mathErr, uint maxClose) = mulScalarTruncate(Exp({ mantissa: closeFactorMantissa }), borrowBalance); - if (mathErr != MathError.NO_ERROR) { - return uint(Error.MATH_ERROR); - } - if (repayAmount > maxClose) { - return uint(Error.TOO_MUCH_REPAY); - } - - return uint(Error.NO_ERROR); - } - - /** - * @notice Validates liquidateBorrow and reverts on rejection. May emit logs. - * @param vTokenBorrowed Asset which was borrowed by the borrower - * @param vTokenCollateral Asset which was used as collateral and will be seized - * @param liquidator The address repaying the borrow and seizing the collateral - * @param borrower The address of the borrower - * @param actualRepayAmount The amount of underlying being repaid - */ - function liquidateBorrowVerify( - address vTokenBorrowed, - address vTokenCollateral, - address liquidator, - address borrower, - uint actualRepayAmount, - uint seizeTokens - ) external override { - // Shh - currently unused - vTokenBorrowed; - vTokenCollateral; - liquidator; - borrower; - actualRepayAmount; - seizeTokens; - - // Shh - we don't ever want this hook to be marked pure - if (false) { - maxAssets = maxAssets; - } - } - - /** - * @notice Checks if the seizing of assets should be allowed to occur - * @param vTokenCollateral Asset which was used as collateral and will be seized - * @param vTokenBorrowed Asset which was borrowed by the borrower - * @param liquidator The address repaying the borrow and seizing the collateral - * @param borrower The address of the borrower - * @param seizeTokens The number of collateral tokens to seize - */ - function seizeAllowed( - address vTokenCollateral, - address vTokenBorrowed, - address liquidator, - address borrower, - uint seizeTokens - ) external override onlyProtocolAllowed returns (uint) { - // Pausing is a very serious situation - we revert to sound the alarms - require(!seizeGuardianPaused, "seize is paused"); - - // Shh - currently unused - seizeTokens; - - if (!markets[vTokenCollateral].isListed || !markets[vTokenBorrowed].isListed) { - return uint(Error.MARKET_NOT_LISTED); - } - - if (VToken(vTokenCollateral).comptroller() != VToken(vTokenBorrowed).comptroller()) { - return uint(Error.COMPTROLLER_MISMATCH); - } - - // Keep the flywheel moving - updateVenusSupplyIndex(vTokenCollateral); - distributeSupplierVenus(vTokenCollateral, borrower, false); - distributeSupplierVenus(vTokenCollateral, liquidator, false); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Validates seize and reverts on rejection. May emit logs. - * @param vTokenCollateral Asset which was used as collateral and will be seized - * @param vTokenBorrowed Asset which was borrowed by the borrower - * @param liquidator The address repaying the borrow and seizing the collateral - * @param borrower The address of the borrower - * @param seizeTokens The number of collateral tokens to seize - */ - function seizeVerify( - address vTokenCollateral, - address vTokenBorrowed, - address liquidator, - address borrower, - uint seizeTokens - ) external override { - // Shh - currently unused - vTokenCollateral; - vTokenBorrowed; - liquidator; - borrower; - seizeTokens; - - // Shh - we don't ever want this hook to be marked pure - if (false) { - maxAssets = maxAssets; - } - } - - /** - * @notice Checks if the account should be allowed to transfer tokens in the given market - * @param vToken The market to verify the transfer against - * @param src The account which sources the tokens - * @param dst The account which receives the tokens - * @param transferTokens The number of vTokens to transfer - * @return 0 if the transfer is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) - */ - function transferAllowed( - address vToken, - address src, - address dst, - uint transferTokens - ) external override onlyProtocolAllowed returns (uint) { - // Pausing is a very serious situation - we revert to sound the alarms - require(!transferGuardianPaused, "transfer is paused"); - - // Currently the only consideration is whether or not - // the src is allowed to redeem this many tokens - uint allowed = redeemAllowedInternal(vToken, src, transferTokens); - if (allowed != uint(Error.NO_ERROR)) { - return allowed; - } - - // Keep the flywheel moving - updateVenusSupplyIndex(vToken); - distributeSupplierVenus(vToken, src, false); - distributeSupplierVenus(vToken, dst, false); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Validates transfer and reverts on rejection. May emit logs. - * @param vToken Asset being transferred - * @param src The account which sources the tokens - * @param dst The account which receives the tokens - * @param transferTokens The number of vTokens to transfer - */ - function transferVerify(address vToken, address src, address dst, uint transferTokens) external override { - // Shh - currently unused - vToken; - src; - dst; - transferTokens; - - // Shh - we don't ever want this hook to be marked pure - if (false) { - maxAssets = maxAssets; - } - } - - /*** Liquidity/Liquidation Calculations ***/ - - /** - * @dev Local vars for avoiding stack-depth limits in calculating account liquidity. - * Note that `vTokenBalance` is the number of vTokens the account owns in the market, - * whereas `borrowBalance` is the amount of underlying that the account has borrowed. - */ - struct AccountLiquidityLocalVars { - uint sumCollateral; - uint sumBorrowPlusEffects; - uint vTokenBalance; - uint borrowBalance; - uint exchangeRateMantissa; - uint oraclePriceMantissa; - Exp collateralFactor; - Exp exchangeRate; - Exp oraclePrice; - Exp tokensToDenom; - } - - /** - * @notice Determine the current account liquidity wrt collateral requirements - * @return (possible error code (semi-opaque), - account liquidity in excess of collateral requirements, - * account shortfall below collateral requirements) - */ - function getAccountLiquidity(address account) public view returns (uint, uint, uint) { - (Error err, uint liquidity, uint shortfall) = getHypotheticalAccountLiquidityInternal( - account, - VToken(address(0)), - 0, - 0 - ); - - return (uint(err), liquidity, shortfall); - } - - /** - * @notice Determine what the account liquidity would be if the given amounts were redeemed/borrowed - * @param vTokenModify The market to hypothetically redeem/borrow in - * @param account The account to determine liquidity for - * @param redeemTokens The number of tokens to hypothetically redeem - * @param borrowAmount The amount of underlying to hypothetically borrow - * @return (possible error code (semi-opaque), - hypothetical account liquidity in excess of collateral requirements, - * hypothetical account shortfall below collateral requirements) - */ - function getHypotheticalAccountLiquidity( - address account, - address vTokenModify, - uint redeemTokens, - uint borrowAmount - ) public view returns (uint, uint, uint) { - (Error err, uint liquidity, uint shortfall) = getHypotheticalAccountLiquidityInternal( - account, - VToken(vTokenModify), - redeemTokens, - borrowAmount - ); - return (uint(err), liquidity, shortfall); - } - - /** - * @notice Determine what the account liquidity would be if the given amounts were redeemed/borrowed - * @param vTokenModify The market to hypothetically redeem/borrow in - * @param account The account to determine liquidity for - * @param redeemTokens The number of tokens to hypothetically redeem - * @param borrowAmount The amount of underlying to hypothetically borrow - * @dev Note that we calculate the exchangeRateStored for each collateral vToken using stored data, - * without calculating accumulated interest. - * @return (possible error code, - hypothetical account liquidity in excess of collateral requirements, - * hypothetical account shortfall below collateral requirements) - */ - // solhint-disable-next-line code-complexity - function getHypotheticalAccountLiquidityInternal( - address account, - VToken vTokenModify, - uint redeemTokens, - uint borrowAmount - ) internal view returns (Error, uint, uint) { - AccountLiquidityLocalVars memory vars; // Holds all our calculation results - uint oErr; - MathError mErr; - - // For each asset the account is in - VToken[] memory assets = accountAssets[account]; - for (uint i = 0; i < assets.length; i++) { - VToken asset = assets[i]; - - // Read the balances and exchange rate from the vToken - (oErr, vars.vTokenBalance, vars.borrowBalance, vars.exchangeRateMantissa) = asset.getAccountSnapshot( - account - ); - if (oErr != 0) { - // semi-opaque error code, we assume NO_ERROR == 0 is invariant between upgrades - return (Error.SNAPSHOT_ERROR, 0, 0); - } - vars.collateralFactor = Exp({ mantissa: markets[address(asset)].collateralFactorMantissa }); - vars.exchangeRate = Exp({ mantissa: vars.exchangeRateMantissa }); - - // Get the normalized price of the asset - vars.oraclePriceMantissa = oracle.getUnderlyingPrice(asset); - if (vars.oraclePriceMantissa == 0) { - return (Error.PRICE_ERROR, 0, 0); - } - vars.oraclePrice = Exp({ mantissa: vars.oraclePriceMantissa }); - - // Pre-compute a conversion factor from tokens -> bnb (normalized price value) - (mErr, vars.tokensToDenom) = mulExp3(vars.collateralFactor, vars.exchangeRate, vars.oraclePrice); - if (mErr != MathError.NO_ERROR) { - return (Error.MATH_ERROR, 0, 0); - } - - // sumCollateral += tokensToDenom * vTokenBalance - (mErr, vars.sumCollateral) = mulScalarTruncateAddUInt( - vars.tokensToDenom, - vars.vTokenBalance, - vars.sumCollateral - ); - if (mErr != MathError.NO_ERROR) { - return (Error.MATH_ERROR, 0, 0); - } - - // sumBorrowPlusEffects += oraclePrice * borrowBalance - (mErr, vars.sumBorrowPlusEffects) = mulScalarTruncateAddUInt( - vars.oraclePrice, - vars.borrowBalance, - vars.sumBorrowPlusEffects - ); - if (mErr != MathError.NO_ERROR) { - return (Error.MATH_ERROR, 0, 0); - } - - // Calculate effects of interacting with vTokenModify - if (asset == vTokenModify) { - // redeem effect - // sumBorrowPlusEffects += tokensToDenom * redeemTokens - (mErr, vars.sumBorrowPlusEffects) = mulScalarTruncateAddUInt( - vars.tokensToDenom, - redeemTokens, - vars.sumBorrowPlusEffects - ); - if (mErr != MathError.NO_ERROR) { - return (Error.MATH_ERROR, 0, 0); - } - - // borrow effect - // sumBorrowPlusEffects += oraclePrice * borrowAmount - (mErr, vars.sumBorrowPlusEffects) = mulScalarTruncateAddUInt( - vars.oraclePrice, - borrowAmount, - vars.sumBorrowPlusEffects - ); - if (mErr != MathError.NO_ERROR) { - return (Error.MATH_ERROR, 0, 0); - } - } - } - - /// @dev VAI Integration^ - (mErr, vars.sumBorrowPlusEffects) = addUInt(vars.sumBorrowPlusEffects, mintedVAIs[account]); - if (mErr != MathError.NO_ERROR) { - return (Error.MATH_ERROR, 0, 0); - } - /// @dev VAI Integration$ - - // These are safe, as the underflow condition is checked first - if (vars.sumCollateral > vars.sumBorrowPlusEffects) { - return (Error.NO_ERROR, vars.sumCollateral - vars.sumBorrowPlusEffects, 0); - } else { - return (Error.NO_ERROR, 0, vars.sumBorrowPlusEffects - vars.sumCollateral); - } - } - - /** - * @notice Calculate number of tokens of collateral asset to seize given an underlying amount - * @dev Used in liquidation (called in vToken.liquidateBorrowFresh) - * @param vTokenBorrowed The address of the borrowed vToken - * @param vTokenCollateral The address of the collateral vToken - * @param actualRepayAmount The amount of vTokenBorrowed underlying to convert into vTokenCollateral tokens - * @return (errorCode, number of vTokenCollateral tokens to be seized in a liquidation) - */ - function liquidateCalculateSeizeTokens( - address vTokenBorrowed, - address vTokenCollateral, - uint actualRepayAmount - ) external view override returns (uint, uint) { - /* Read oracle prices for borrowed and collateral markets */ - uint priceBorrowedMantissa = oracle.getUnderlyingPrice(VToken(vTokenBorrowed)); - uint priceCollateralMantissa = oracle.getUnderlyingPrice(VToken(vTokenCollateral)); - if (priceBorrowedMantissa == 0 || priceCollateralMantissa == 0) { - return (uint(Error.PRICE_ERROR), 0); - } - - /* - * Get the exchange rate and calculate the number of collateral tokens to seize: - * seizeAmount = actualRepayAmount * liquidationIncentive * priceBorrowed / priceCollateral - * seizeTokens = seizeAmount / exchangeRate - * = actualRepayAmount * (liquidationIncentive * priceBorrowed) / (priceCollateral * exchangeRate) - */ - uint exchangeRateMantissa = VToken(vTokenCollateral).exchangeRateStored(); // Note: reverts on error - uint seizeTokens; - Exp memory numerator; - Exp memory denominator; - Exp memory ratio; - MathError mathErr; - - (mathErr, numerator) = mulExp(liquidationIncentiveMantissa, priceBorrowedMantissa); - if (mathErr != MathError.NO_ERROR) { - return (uint(Error.MATH_ERROR), 0); - } - - (mathErr, denominator) = mulExp(priceCollateralMantissa, exchangeRateMantissa); - if (mathErr != MathError.NO_ERROR) { - return (uint(Error.MATH_ERROR), 0); - } - - (mathErr, ratio) = divExp(numerator, denominator); - if (mathErr != MathError.NO_ERROR) { - return (uint(Error.MATH_ERROR), 0); - } - - (mathErr, seizeTokens) = mulScalarTruncate(ratio, actualRepayAmount); - if (mathErr != MathError.NO_ERROR) { - return (uint(Error.MATH_ERROR), 0); - } - - return (uint(Error.NO_ERROR), seizeTokens); - } - - /*** Admin Functions ***/ - - /** - * @notice Sets a new price oracle for the comptroller - * @dev Admin function to set a new price oracle - * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) - */ - function _setPriceOracle(PriceOracle newOracle) public returns (uint) { - // Check caller is admin - if (msg.sender != admin) { - return fail(Error.UNAUTHORIZED, FailureInfo.SET_PRICE_ORACLE_OWNER_CHECK); - } - - // Track the old oracle for the comptroller - PriceOracle oldOracle = oracle; - - // Set comptroller's oracle to newOracle - oracle = newOracle; - - // Emit NewPriceOracle(oldOracle, newOracle) - emit NewPriceOracle(oldOracle, newOracle); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Sets the closeFactor used when liquidating borrows - * @dev Admin function to set closeFactor - * @param newCloseFactorMantissa New close factor, scaled by 1e18 - * @return uint 0=success, otherwise a failure. (See ErrorReporter for details) - */ - function _setCloseFactor(uint newCloseFactorMantissa) external returns (uint) { - // Check caller is admin - if (msg.sender != admin) { - return fail(Error.UNAUTHORIZED, FailureInfo.SET_CLOSE_FACTOR_OWNER_CHECK); - } - - Exp memory newCloseFactorExp = Exp({ mantissa: newCloseFactorMantissa }); - Exp memory lowLimit = Exp({ mantissa: closeFactorMinMantissa }); - if (lessThanOrEqualExp(newCloseFactorExp, lowLimit)) { - return fail(Error.INVALID_CLOSE_FACTOR, FailureInfo.SET_CLOSE_FACTOR_VALIDATION); - } - - Exp memory highLimit = Exp({ mantissa: closeFactorMaxMantissa }); - if (lessThanExp(highLimit, newCloseFactorExp)) { - return fail(Error.INVALID_CLOSE_FACTOR, FailureInfo.SET_CLOSE_FACTOR_VALIDATION); - } - - uint oldCloseFactorMantissa = closeFactorMantissa; - closeFactorMantissa = newCloseFactorMantissa; - emit NewCloseFactor(oldCloseFactorMantissa, newCloseFactorMantissa); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Sets the collateralFactor for a market - * @dev Admin function to set per-market collateralFactor - * @param vToken The market to set the factor on - * @param newCollateralFactorMantissa The new collateral factor, scaled by 1e18 - * @return uint 0=success, otherwise a failure. (See ErrorReporter for details) - */ - function _setCollateralFactor(VToken vToken, uint newCollateralFactorMantissa) external returns (uint) { - // Check caller is admin - if (msg.sender != admin) { - return fail(Error.UNAUTHORIZED, FailureInfo.SET_COLLATERAL_FACTOR_OWNER_CHECK); - } - - // Verify market is listed - Market storage market = markets[address(vToken)]; - if (!market.isListed) { - return fail(Error.MARKET_NOT_LISTED, FailureInfo.SET_COLLATERAL_FACTOR_NO_EXISTS); - } - - Exp memory newCollateralFactorExp = Exp({ mantissa: newCollateralFactorMantissa }); - - // Check collateral factor <= 0.9 - Exp memory highLimit = Exp({ mantissa: collateralFactorMaxMantissa }); - if (lessThanExp(highLimit, newCollateralFactorExp)) { - return fail(Error.INVALID_COLLATERAL_FACTOR, FailureInfo.SET_COLLATERAL_FACTOR_VALIDATION); - } - - // If collateral factor != 0, fail if price == 0 - if (newCollateralFactorMantissa != 0 && oracle.getUnderlyingPrice(vToken) == 0) { - return fail(Error.PRICE_ERROR, FailureInfo.SET_COLLATERAL_FACTOR_WITHOUT_PRICE); - } - - // Set market's collateral factor to new collateral factor, remember old value - uint oldCollateralFactorMantissa = market.collateralFactorMantissa; - market.collateralFactorMantissa = newCollateralFactorMantissa; - - // Emit event with asset, old collateral factor, and new collateral factor - emit NewCollateralFactor(vToken, oldCollateralFactorMantissa, newCollateralFactorMantissa); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Sets maxAssets which controls how many markets can be entered - * @dev Admin function to set maxAssets - * @param newMaxAssets New max assets - * @return uint 0=success, otherwise a failure. (See ErrorReporter for details) - */ - function _setMaxAssets(uint newMaxAssets) external returns (uint) { - // Check caller is admin - if (msg.sender != admin) { - return fail(Error.UNAUTHORIZED, FailureInfo.SET_MAX_ASSETS_OWNER_CHECK); - } - - uint oldMaxAssets = maxAssets; - maxAssets = newMaxAssets; - emit NewMaxAssets(oldMaxAssets, newMaxAssets); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Sets liquidationIncentive - * @dev Admin function to set liquidationIncentive - * @param newLiquidationIncentiveMantissa New liquidationIncentive scaled by 1e18 - * @return uint 0=success, otherwise a failure. (See ErrorReporter for details) - */ - function _setLiquidationIncentive(uint newLiquidationIncentiveMantissa) external returns (uint) { - // Check caller is admin - if (msg.sender != admin) { - return fail(Error.UNAUTHORIZED, FailureInfo.SET_LIQUIDATION_INCENTIVE_OWNER_CHECK); - } - - // Check de-scaled min <= newLiquidationIncentive <= max - Exp memory newLiquidationIncentive = Exp({ mantissa: newLiquidationIncentiveMantissa }); - Exp memory minLiquidationIncentive = Exp({ mantissa: liquidationIncentiveMinMantissa }); - if (lessThanExp(newLiquidationIncentive, minLiquidationIncentive)) { - return fail(Error.INVALID_LIQUIDATION_INCENTIVE, FailureInfo.SET_LIQUIDATION_INCENTIVE_VALIDATION); - } - - Exp memory maxLiquidationIncentive = Exp({ mantissa: liquidationIncentiveMaxMantissa }); - if (lessThanExp(maxLiquidationIncentive, newLiquidationIncentive)) { - return fail(Error.INVALID_LIQUIDATION_INCENTIVE, FailureInfo.SET_LIQUIDATION_INCENTIVE_VALIDATION); - } - - // Save current value for use in log - uint oldLiquidationIncentiveMantissa = liquidationIncentiveMantissa; - - // Set liquidation incentive to new incentive - liquidationIncentiveMantissa = newLiquidationIncentiveMantissa; - - // Emit event with old incentive, new incentive - emit NewLiquidationIncentive(oldLiquidationIncentiveMantissa, newLiquidationIncentiveMantissa); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Add the market to the markets mapping and set it as listed - * @dev Admin function to set isListed and add support for the market - * @param vToken The address of the market (token) to list - * @return uint 0=success, otherwise a failure. (See enum Error for details) - */ - function _supportMarket(VToken vToken) external returns (uint) { - if (msg.sender != admin) { - return fail(Error.UNAUTHORIZED, FailureInfo.SUPPORT_MARKET_OWNER_CHECK); - } - - if (markets[address(vToken)].isListed) { - return fail(Error.MARKET_ALREADY_LISTED, FailureInfo.SUPPORT_MARKET_EXISTS); - } - - vToken.isVToken(); // Sanity check to make sure its really a VToken - - Market storage newMarket = markets[address(vToken)]; - newMarket.isListed = true; - newMarket.isVenus = false; - newMarket.collateralFactorMantissa = 0; - _addMarketInternal(vToken); - - emit MarketListed(vToken); - - return uint(Error.NO_ERROR); - } - - function _addMarketInternal(VToken vToken) internal { - for (uint i = 0; i < allMarkets.length; i++) { - require(allMarkets[i] != vToken, "market already added"); - } - allMarkets.push(vToken); - } - - /** - * @notice Admin function to change the Pause Guardian - * @param newPauseGuardian The address of the new Pause Guardian - * @return uint 0=success, otherwise a failure. (See enum Error for details) - */ - function _setPauseGuardian(address newPauseGuardian) public returns (uint) { - if (msg.sender != admin) { - return fail(Error.UNAUTHORIZED, FailureInfo.SET_PAUSE_GUARDIAN_OWNER_CHECK); - } - - // Save current value for inclusion in log - address oldPauseGuardian = pauseGuardian; - - // Store pauseGuardian with value newPauseGuardian - pauseGuardian = newPauseGuardian; - - // Emit NewPauseGuardian(OldPauseGuardian, NewPauseGuardian) - emit NewPauseGuardian(oldPauseGuardian, newPauseGuardian); - - return uint(Error.NO_ERROR); - } - - function _setMintPaused( - VToken vToken, - bool state - ) public onlyListedMarket(vToken) validPauseState(state) returns (bool) { - mintGuardianPaused[address(vToken)] = state; - emit ActionPaused(vToken, "Mint", state); - return state; - } - - function _setBorrowPaused( - VToken vToken, - bool state - ) public onlyListedMarket(vToken) validPauseState(state) returns (bool) { - borrowGuardianPaused[address(vToken)] = state; - emit ActionPaused(vToken, "Borrow", state); - return state; - } - - function _setTransferPaused(bool state) public validPauseState(state) returns (bool) { - transferGuardianPaused = state; - emit ActionPaused("Transfer", state); - return state; - } - - function _setSeizePaused(bool state) public validPauseState(state) returns (bool) { - seizeGuardianPaused = state; - emit ActionPaused("Seize", state); - return state; - } - - function _setMintVAIPaused(bool state) public validPauseState(state) returns (bool) { - mintVAIGuardianPaused = state; - emit ActionPaused("MintVAI", state); - return state; - } - - function _setRepayVAIPaused(bool state) public validPauseState(state) returns (bool) { - repayVAIGuardianPaused = state; - emit ActionPaused("RepayVAI", state); - return state; - } - - /** - * @notice Set whole protocol pause/unpause state - */ - function _setProtocolPaused(bool state) public onlyAdmin returns (bool) { - protocolPaused = state; - emit ActionProtocolPaused(state); - return state; - } - - /** - * @notice Sets a new VAI controller - * @dev Admin function to set a new VAI controller - * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) - */ - function _setVAIController(VAIControllerInterface vaiController_) external returns (uint) { - // Check caller is admin - if (msg.sender != admin) { - return fail(Error.UNAUTHORIZED, FailureInfo.SET_VAICONTROLLER_OWNER_CHECK); - } - - VAIControllerInterface oldRate = vaiController; - vaiController = vaiController_; - emit NewVAIController(oldRate, vaiController_); - } - - function _setVAIMintRate(uint newVAIMintRate) external returns (uint) { - // Check caller is admin - if (msg.sender != admin) { - return fail(Error.UNAUTHORIZED, FailureInfo.SET_VAI_MINT_RATE_CHECK); - } - - uint oldVAIMintRate = vaiMintRate; - vaiMintRate = newVAIMintRate; - emit NewVAIMintRate(oldVAIMintRate, newVAIMintRate); - - return uint(Error.NO_ERROR); - } - - function _become(Unitroller unitroller) public { - require(msg.sender == unitroller.admin(), "only unitroller admin can"); - require(unitroller._acceptImplementation() == 0, "not authorized"); - } - - /*** Venus Distribution ***/ - - /** - * @notice Recalculate and update Venus speeds for all Venus markets - */ - function refreshVenusSpeeds() public { - require(msg.sender == tx.origin, "only externally owned accounts can"); - refreshVenusSpeedsInternal(); - } - - function refreshVenusSpeedsInternal() internal { - uint i; - VToken vToken; - - for (i = 0; i < allMarkets.length; i++) { - vToken = allMarkets[i]; - Exp memory borrowIndex = Exp({ mantissa: vToken.borrowIndex() }); - updateVenusSupplyIndex(address(vToken)); - updateVenusBorrowIndex(address(vToken), borrowIndex); - } - - Exp memory totalUtility = Exp({ mantissa: 0 }); - Exp[] memory utilities = new Exp[](allMarkets.length); - for (i = 0; i < allMarkets.length; i++) { - vToken = allMarkets[i]; - if (markets[address(vToken)].isVenus) { - Exp memory assetPrice = Exp({ mantissa: oracle.getUnderlyingPrice(vToken) }); - Exp memory utility = mul_(assetPrice, vToken.totalBorrows()); - utilities[i] = utility; - totalUtility = add_(totalUtility, utility); - } - } - - for (i = 0; i < allMarkets.length; i++) { - vToken = allMarkets[i]; - uint newSpeed = totalUtility.mantissa > 0 ? mul_(venusRate, div_(utilities[i], totalUtility)) : 0; - venusSpeeds[address(vToken)] = newSpeed; - emit VenusSpeedUpdated(vToken, newSpeed); - } - } - - /** - * @notice Accrue XVS to the market by updating the supply index - * @param vToken The market whose supply index to update - */ - function updateVenusSupplyIndex(address vToken) internal { - VenusMarketState storage supplyState = venusSupplyState[vToken]; - uint supplySpeed = venusSpeeds[vToken]; - uint blockNumber = getBlockNumber(); - uint deltaBlocks = sub_(blockNumber, uint(supplyState.block)); - if (deltaBlocks > 0 && supplySpeed > 0) { - uint supplyTokens = VToken(vToken).totalSupply(); - uint venusAccrued = mul_(deltaBlocks, supplySpeed); - Double memory ratio = supplyTokens > 0 ? fraction(venusAccrued, supplyTokens) : Double({ mantissa: 0 }); - Double memory index = add_(Double({ mantissa: supplyState.index }), ratio); - venusSupplyState[vToken] = VenusMarketState({ - index: safe224(index.mantissa, "new index overflows"), - block: safe32(blockNumber, "block number overflows") - }); - } else if (deltaBlocks > 0) { - supplyState.block = safe32(blockNumber, "block number overflows"); - } - } - - /** - * @notice Accrue XVS to the market by updating the borrow index - * @param vToken The market whose borrow index to update - */ - function updateVenusBorrowIndex(address vToken, Exp memory marketBorrowIndex) internal { - VenusMarketState storage borrowState = venusBorrowState[vToken]; - uint borrowSpeed = venusSpeeds[vToken]; - uint blockNumber = getBlockNumber(); - uint deltaBlocks = sub_(blockNumber, uint(borrowState.block)); - if (deltaBlocks > 0 && borrowSpeed > 0) { - uint borrowAmount = div_(VToken(vToken).totalBorrows(), marketBorrowIndex); - uint venusAccrued = mul_(deltaBlocks, borrowSpeed); - Double memory ratio = borrowAmount > 0 ? fraction(venusAccrued, borrowAmount) : Double({ mantissa: 0 }); - Double memory index = add_(Double({ mantissa: borrowState.index }), ratio); - venusBorrowState[vToken] = VenusMarketState({ - index: safe224(index.mantissa, "new index overflows"), - block: safe32(blockNumber, "block number overflows") - }); - } else if (deltaBlocks > 0) { - borrowState.block = safe32(blockNumber, "block number overflows"); - } - } - - /** - * @notice Accrue XVS to by updating the VAI minter index - */ - function updateVenusVAIMintIndex() internal { - if (address(vaiController) != address(0)) { - vaiController.updateVenusVAIMintIndex(); - } - } - - /** - * @notice Calculate XVS accrued by a supplier and possibly transfer it to them - * @param vToken The market in which the supplier is interacting - * @param supplier The address of the supplier to distribute XVS to - */ - function distributeSupplierVenus(address vToken, address supplier, bool distributeAll) internal { - VenusMarketState storage supplyState = venusSupplyState[vToken]; - Double memory supplyIndex = Double({ mantissa: supplyState.index }); - Double memory supplierIndex = Double({ mantissa: venusSupplierIndex[vToken][supplier] }); - venusSupplierIndex[vToken][supplier] = supplyIndex.mantissa; - - if (supplierIndex.mantissa == 0 && supplyIndex.mantissa > 0) { - supplierIndex.mantissa = venusInitialIndex; - } - - Double memory deltaIndex = sub_(supplyIndex, supplierIndex); - uint supplierTokens = VToken(vToken).balanceOf(supplier); - uint supplierDelta = mul_(supplierTokens, deltaIndex); - uint supplierAccrued = add_(venusAccrued[supplier], supplierDelta); - venusAccrued[supplier] = transferXVS(supplier, supplierAccrued, distributeAll ? 0 : venusClaimThreshold); - emit DistributedSupplierVenus(VToken(vToken), supplier, supplierDelta, supplyIndex.mantissa); - } - - /** - * @notice Calculate XVS accrued by a borrower and possibly transfer it to them - * @dev Borrowers will not begin to accrue until after the first interaction with the protocol. - * @param vToken The market in which the borrower is interacting - * @param borrower The address of the borrower to distribute XVS to - */ - function distributeBorrowerVenus( - address vToken, - address borrower, - Exp memory marketBorrowIndex, - bool distributeAll - ) internal { - VenusMarketState storage borrowState = venusBorrowState[vToken]; - Double memory borrowIndex = Double({ mantissa: borrowState.index }); - Double memory borrowerIndex = Double({ mantissa: venusBorrowerIndex[vToken][borrower] }); - venusBorrowerIndex[vToken][borrower] = borrowIndex.mantissa; - - if (borrowerIndex.mantissa > 0) { - Double memory deltaIndex = sub_(borrowIndex, borrowerIndex); - uint borrowerAmount = div_(VToken(vToken).borrowBalanceStored(borrower), marketBorrowIndex); - uint borrowerDelta = mul_(borrowerAmount, deltaIndex); - uint borrowerAccrued = add_(venusAccrued[borrower], borrowerDelta); - venusAccrued[borrower] = transferXVS(borrower, borrowerAccrued, distributeAll ? 0 : venusClaimThreshold); - emit DistributedBorrowerVenus(VToken(vToken), borrower, borrowerDelta, borrowIndex.mantissa); - } - } - - /** - * @notice Calculate XVS accrued by a VAI minter and possibly transfer it to them - * @dev VAI minters will not begin to accrue until after the first interaction with the protocol. - * @param vaiMinter The address of the VAI minter to distribute XVS to - */ - function distributeVAIMinterVenus(address vaiMinter, bool distributeAll) internal { - if (address(vaiController) != address(0)) { - uint vaiMinterAccrued; - uint vaiMinterDelta; - uint vaiMintIndexMantissa; - uint err; - (err, vaiMinterAccrued, vaiMinterDelta, vaiMintIndexMantissa) = vaiController.calcDistributeVAIMinterVenus( - vaiMinter - ); - if (err == uint(Error.NO_ERROR)) { - venusAccrued[vaiMinter] = transferXVS( - vaiMinter, - vaiMinterAccrued, - distributeAll ? 0 : venusClaimThreshold - ); - emit DistributedVAIMinterVenus(vaiMinter, vaiMinterDelta, vaiMintIndexMantissa); - } - } - } - - /** - * @notice Transfer XVS to the user, if they are above the threshold - * @dev Note: If there is not enough XVS, we do not perform the transfer all. - * @param user The address of the user to transfer XVS to - * @param userAccrued The amount of XVS to (possibly) transfer - * @return The amount of XVS which was NOT transferred to the user - */ - function transferXVS(address user, uint userAccrued, uint threshold) internal returns (uint) { - if (userAccrued >= threshold && userAccrued > 0) { - XVS xvs = XVS(getXVSAddress()); - uint xvsRemaining = xvs.balanceOf(address(this)); - if (userAccrued <= xvsRemaining) { - xvs.transfer(user, userAccrued); - return 0; - } - } - return userAccrued; - } - - /** - * @notice Claim all the xvs accrued by holder in all markets and VAI - * @param holder The address to claim XVS for - */ - function claimVenus(address holder) public { - return claimVenus(holder, allMarkets); - } - - /** - * @notice Claim all the xvs accrued by holder in the specified markets - * @param holder The address to claim XVS for - * @param vTokens The list of markets to claim XVS in - */ - function claimVenus(address holder, VToken[] memory vTokens) public { - address[] memory holders = new address[](1); - holders[0] = holder; - claimVenus(holders, vTokens, true, true); - } - - /** - * @notice Claim all xvs accrued by the holders - * @param holders The addresses to claim XVS for - * @param vTokens The list of markets to claim XVS in - * @param borrowers Whether or not to claim XVS earned by borrowing - * @param suppliers Whether or not to claim XVS earned by supplying - */ - function claimVenus(address[] memory holders, VToken[] memory vTokens, bool borrowers, bool suppliers) public { - uint j; - updateVenusVAIMintIndex(); - for (j = 0; j < holders.length; j++) { - distributeVAIMinterVenus(holders[j], true); - } - for (uint i = 0; i < vTokens.length; i++) { - VToken vToken = vTokens[i]; - require(markets[address(vToken)].isListed, "not listed market"); - if (borrowers) { - Exp memory borrowIndex = Exp({ mantissa: vToken.borrowIndex() }); - updateVenusBorrowIndex(address(vToken), borrowIndex); - for (j = 0; j < holders.length; j++) { - distributeBorrowerVenus(address(vToken), holders[j], borrowIndex, true); - } - } - if (suppliers) { - updateVenusSupplyIndex(address(vToken)); - for (j = 0; j < holders.length; j++) { - distributeSupplierVenus(address(vToken), holders[j], true); - } - } - } - } - - /*** Venus Distribution Admin ***/ - - /** - * @notice Set the amount of XVS distributed per block - * @param venusRate_ The amount of XVS wei per block to distribute - */ - function _setVenusRate(uint venusRate_) public onlyAdmin { - uint oldRate = venusRate; - venusRate = venusRate_; - emit NewVenusRate(oldRate, venusRate_); - - refreshVenusSpeedsInternal(); - } - - /** - * @notice Add markets to venusMarkets, allowing them to earn XVS in the flywheel - * @param vTokens The addresses of the markets to add - */ - function _addVenusMarkets(address[] calldata vTokens) external onlyAdmin { - for (uint i = 0; i < vTokens.length; i++) { - _addVenusMarketInternal(vTokens[i]); - } - - refreshVenusSpeedsInternal(); - } - - function _addVenusMarketInternal(address vToken) internal { - Market storage market = markets[vToken]; - require(market.isListed, "venus market is not listed"); - require(!market.isVenus, "venus market already added"); - - market.isVenus = true; - emit MarketVenus(VToken(vToken), true); - - if (venusSupplyState[vToken].index == 0 && venusSupplyState[vToken].block == 0) { - venusSupplyState[vToken] = VenusMarketState({ - index: venusInitialIndex, - block: safe32(getBlockNumber(), "block number overflows") - }); - } - - if (venusBorrowState[vToken].index == 0 && venusBorrowState[vToken].block == 0) { - venusBorrowState[vToken] = VenusMarketState({ - index: venusInitialIndex, - block: safe32(getBlockNumber(), "block number overflows") - }); - } - } - - function _initializeVenusVAIState(uint blockNumber) public { - require(msg.sender == admin, "only admin can"); - if (address(vaiController) != address(0)) { - vaiController._initializeVenusVAIState(blockNumber); - } - } - - /** - * @notice Remove a market from venusMarkets, preventing it from earning XVS in the flywheel - * @param vToken The address of the market to drop - */ - function _dropVenusMarket(address vToken) public onlyAdmin { - Market storage market = markets[vToken]; - require(market.isVenus == true, "not venus market"); - - market.isVenus = false; - emit MarketVenus(VToken(vToken), false); - - refreshVenusSpeedsInternal(); - } - - /** - * @notice Return all of the markets - * @dev The automatic getter may be used to access an individual market. - * @return The list of market addresses - */ - function getAllMarkets() public view returns (VToken[] memory) { - return allMarkets; - } - - function getBlockNumber() public view returns (uint) { - return block.number; - } - - /** - * @notice Return the address of the XVS token - * @return The address of XVS - */ - function getXVSAddress() public view returns (address) { - return 0xcF6BB5389c92Bdda8a3747Ddb454cB7a64626C63; - } - - /*** VAI functions ***/ - - /** - * @notice Set the minted VAI amount of the `owner` - * @param owner The address of the account to set - * @param amount The amount of VAI to set to the account - * @return The number of minted VAI by `owner` - */ - function setMintedVAIOf(address owner, uint amount) external override onlyProtocolAllowed returns (uint) { - // Pausing is a very serious situation - we revert to sound the alarms - require(!mintVAIGuardianPaused && !repayVAIGuardianPaused, "VAI is paused"); - // Check caller is vaiController - if (msg.sender != address(vaiController)) { - return fail(Error.REJECTION, FailureInfo.SET_MINTED_VAI_REJECTION); - } - mintedVAIs[owner] = amount; - - return uint(Error.NO_ERROR); - } - - /** - * @notice Mint VAI - */ - function mintVAI(uint mintVAIAmount) external onlyProtocolAllowed returns (uint) { - // Pausing is a very serious situation - we revert to sound the alarms - require(!mintVAIGuardianPaused, "mintVAI is paused"); - - // Keep the flywheel moving - updateVenusVAIMintIndex(); - distributeVAIMinterVenus(msg.sender, false); - return vaiController.mintVAI(msg.sender, mintVAIAmount); - } - - /** - * @notice Repay VAI - */ - function repayVAI(uint repayVAIAmount) external onlyProtocolAllowed returns (uint) { - // Pausing is a very serious situation - we revert to sound the alarms - require(!repayVAIGuardianPaused, "repayVAI is paused"); - - // Keep the flywheel moving - updateVenusVAIMintIndex(); - distributeVAIMinterVenus(msg.sender, false); - return vaiController.repayVAI(msg.sender, repayVAIAmount); - } - - /** - * @notice Get the minted VAI amount of the `owner` - * @param owner The address of the account to query - * @return The number of minted VAI by `owner` - */ - function mintedVAIOf(address owner) external view returns (uint) { - return mintedVAIs[owner]; - } - - /** - * @notice Get Mintable VAI amount - */ - function getMintableVAI(address minter) external view returns (uint, uint) { - return vaiController.getMintableVAI(minter); - } -} diff --git a/contracts/Comptroller/ComptrollerG3.sol b/contracts/Comptroller/ComptrollerG3.sol deleted file mode 100644 index c71490c13..000000000 --- a/contracts/Comptroller/ComptrollerG3.sol +++ /dev/null @@ -1,1572 +0,0 @@ -pragma solidity 0.8.13; - -import "../Oracle/PriceOracle.sol"; -import "../Tokens/VTokens/VToken.sol"; -import "../Utils/ErrorReporter.sol"; -import "../Utils/Exponential.sol"; -import "../Tokens/XVS/XVS.sol"; -import "../Tokens/VAI/VAI.sol"; -import "./ComptrollerInterface.sol"; -import "./ComptrollerStorage.sol"; -import "./Unitroller.sol"; - -/** - * @title Venus's Comptroller Contract - * @author Venus - */ -contract ComptrollerG3 is ComptrollerV3Storage, ComptrollerInterfaceG1, ComptrollerErrorReporter, Exponential { - /// @notice Emitted when an admin supports a market - event MarketListed(VToken vToken); - - /// @notice Emitted when an account enters a market - event MarketEntered(VToken vToken, address account); - - /// @notice Emitted when an account exits a market - event MarketExited(VToken vToken, address account); - - /// @notice Emitted when close factor is changed by admin - event NewCloseFactor(uint oldCloseFactorMantissa, uint newCloseFactorMantissa); - - /// @notice Emitted when a collateral factor is changed by admin - event NewCollateralFactor(VToken vToken, uint oldCollateralFactorMantissa, uint newCollateralFactorMantissa); - - /// @notice Emitted when liquidation incentive is changed by admin - event NewLiquidationIncentive(uint oldLiquidationIncentiveMantissa, uint newLiquidationIncentiveMantissa); - - /// @notice Emitted when maxAssets is changed by admin - event NewMaxAssets(uint oldMaxAssets, uint newMaxAssets); - - /// @notice Emitted when price oracle is changed - event NewPriceOracle(PriceOracle oldPriceOracle, PriceOracle newPriceOracle); - - /// @notice Emitted when VAI Vault info is changed - event NewVAIVaultInfo(address vault_, uint releaseStartBlock_, uint releaseInterval_); - - /// @notice Emitted when pause guardian is changed - event NewPauseGuardian(address oldPauseGuardian, address newPauseGuardian); - - /// @notice Emitted when an action is paused globally - event ActionPaused(string action, bool pauseState); - - /// @notice Emitted when an action is paused on a market - event ActionPaused(VToken vToken, string action, bool pauseState); - - /// @notice Emitted when Venus VAI Vault rate is changed - event NewVenusVAIVaultRate(uint oldVenusVAIVaultRate, uint newVenusVAIVaultRate); - - /// @notice Emitted when a new Venus speed is calculated for a market - event VenusSpeedUpdated(VToken indexed vToken, uint newSpeed); - - /// @notice Emitted when XVS is distributed to a supplier - event DistributedSupplierVenus( - VToken indexed vToken, - address indexed supplier, - uint venusDelta, - uint venusSupplyIndex - ); - - /// @notice Emitted when XVS is distributed to a borrower - event DistributedBorrowerVenus( - VToken indexed vToken, - address indexed borrower, - uint venusDelta, - uint venusBorrowIndex - ); - - /// @notice Emitted when XVS is distributed to a VAI minter - event DistributedVAIMinterVenus(address indexed vaiMinter, uint venusDelta, uint venusVAIMintIndex); - - /// @notice Emitted when XVS is distributed to VAI Vault - event DistributedVAIVaultVenus(uint amount); - - /// @notice Emitted when VAIController is changed - event NewVAIController(VAIControllerInterface oldVAIController, VAIControllerInterface newVAIController); - - /// @notice Emitted when VAI mint rate is changed by admin - event NewVAIMintRate(uint oldVAIMintRate, uint newVAIMintRate); - - /// @notice Emitted when protocol state is changed by admin - event ActionProtocolPaused(bool state); - - /// @notice Emitted when borrow cap for a vToken is changed - event NewBorrowCap(VToken indexed vToken, uint newBorrowCap); - - /// @notice Emitted when borrow cap guardian is changed - event NewBorrowCapGuardian(address oldBorrowCapGuardian, address newBorrowCapGuardian); - - /// @notice The initial Venus index for a market - uint224 public constant venusInitialIndex = 1e36; - - // closeFactorMantissa must be strictly greater than this value - uint internal constant closeFactorMinMantissa = 0.05e18; // 0.05 - - // closeFactorMantissa must not exceed this value - uint internal constant closeFactorMaxMantissa = 0.9e18; // 0.9 - - // No collateralFactorMantissa may exceed this value - uint internal constant collateralFactorMaxMantissa = 0.9e18; // 0.9 - - // liquidationIncentiveMantissa must be no less than this value - uint internal constant liquidationIncentiveMinMantissa = 1.0e18; // 1.0 - - // liquidationIncentiveMantissa must be no greater than this value - uint internal constant liquidationIncentiveMaxMantissa = 1.5e18; // 1.5 - - constructor() public { - admin = msg.sender; - } - - modifier onlyProtocolAllowed() { - require(!protocolPaused, "protocol is paused"); - _; - } - - modifier onlyAdmin() { - require(msg.sender == admin, "only admin can"); - _; - } - - modifier onlyListedMarket(VToken vToken) { - require(markets[address(vToken)].isListed, "venus market is not listed"); - _; - } - - modifier validPauseState(bool state) { - require(msg.sender == pauseGuardian || msg.sender == admin, "only pause guardian and admin can"); - require(msg.sender == admin || state == true, "only admin can unpause"); - _; - } - - /*** Assets You Are In ***/ - - /** - * @notice Returns the assets an account has entered - * @param account The address of the account to pull assets for - * @return A dynamic list with the assets the account has entered - */ - function getAssetsIn(address account) external view returns (VToken[] memory) { - return accountAssets[account]; - } - - /** - * @notice Returns whether the given account is entered in the given asset - * @param account The address of the account to check - * @param vToken The vToken to check - * @return True if the account is in the asset, otherwise false. - */ - function checkMembership(address account, VToken vToken) external view returns (bool) { - return markets[address(vToken)].accountMembership[account]; - } - - /** - * @notice Add assets to be included in account liquidity calculation - * @param vTokens The list of addresses of the vToken markets to be enabled - * @return Success indicator for whether each corresponding market was entered - */ - function enterMarkets(address[] calldata vTokens) external override returns (uint[] memory) { - uint len = vTokens.length; - - uint[] memory results = new uint[](len); - for (uint i = 0; i < len; i++) { - results[i] = uint(addToMarketInternal(VToken(vTokens[i]), msg.sender)); - } - - return results; - } - - /** - * @notice Add the market to the borrower's "assets in" for liquidity calculations - * @param vToken The market to enter - * @param borrower The address of the account to modify - * @return Success indicator for whether the market was entered - */ - function addToMarketInternal(VToken vToken, address borrower) internal returns (Error) { - Market storage marketToJoin = markets[address(vToken)]; - - if (!marketToJoin.isListed) { - // market is not listed, cannot join - return Error.MARKET_NOT_LISTED; - } - - if (marketToJoin.accountMembership[borrower]) { - // already joined - return Error.NO_ERROR; - } - - if (accountAssets[borrower].length >= maxAssets) { - // no space, cannot join - return Error.TOO_MANY_ASSETS; - } - - // survived the gauntlet, add to list - // NOTE: we store these somewhat redundantly as a significant optimization - // this avoids having to iterate through the list for the most common use cases - // that is, only when we need to perform liquidity checks - // and not whenever we want to check if an account is in a particular market - marketToJoin.accountMembership[borrower] = true; - accountAssets[borrower].push(vToken); - - emit MarketEntered(vToken, borrower); - - return Error.NO_ERROR; - } - - /** - * @notice Removes asset from sender's account liquidity calculation - * @dev Sender must not have an outstanding borrow balance in the asset, - * or be providing necessary collateral for an outstanding borrow. - * @param vTokenAddress The address of the asset to be removed - * @return Whether or not the account successfully exited the market - */ - function exitMarket(address vTokenAddress) external override returns (uint) { - VToken vToken = VToken(vTokenAddress); - /* Get sender tokensHeld and amountOwed underlying from the vToken */ - (uint oErr, uint tokensHeld, uint amountOwed, ) = vToken.getAccountSnapshot(msg.sender); - require(oErr == 0, "getAccountSnapshot failed"); // semi-opaque error code - - /* Fail if the sender has a borrow balance */ - if (amountOwed != 0) { - return fail(Error.NONZERO_BORROW_BALANCE, FailureInfo.EXIT_MARKET_BALANCE_OWED); - } - - /* Fail if the sender is not permitted to redeem all of their tokens */ - uint allowed = redeemAllowedInternal(vTokenAddress, msg.sender, tokensHeld); - if (allowed != 0) { - return failOpaque(Error.REJECTION, FailureInfo.EXIT_MARKET_REJECTION, allowed); - } - - Market storage marketToExit = markets[address(vToken)]; - - /* Return true if the sender is not already ‘in’ the market */ - if (!marketToExit.accountMembership[msg.sender]) { - return uint(Error.NO_ERROR); - } - - /* Set vToken account membership to false */ - delete marketToExit.accountMembership[msg.sender]; - - /* Delete vToken from the account’s list of assets */ - // In order to delete vToken, copy last item in list to location of item to be removed, reduce length by 1 - VToken[] storage userAssetList = accountAssets[msg.sender]; - uint len = userAssetList.length; - uint i; - for (; i < len; i++) { - if (userAssetList[i] == vToken) { - userAssetList[i] = userAssetList[len - 1]; - userAssetList.pop(); - break; - } - } - - // We *must* have found the asset in the list or our redundant data structure is broken - assert(i < len); - - emit MarketExited(vToken, msg.sender); - - return uint(Error.NO_ERROR); - } - - /*** Policy Hooks ***/ - - /** - * @notice Checks if the account should be allowed to mint tokens in the given market - * @param vToken The market to verify the mint against - * @param minter The account which would get the minted tokens - * @param mintAmount The amount of underlying being supplied to the market in exchange for tokens - * @return 0 if the mint is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) - */ - function mintAllowed( - address vToken, - address minter, - uint mintAmount - ) external override onlyProtocolAllowed returns (uint) { - // Pausing is a very serious situation - we revert to sound the alarms - require(!mintGuardianPaused[vToken], "mint is paused"); - - // Shh - currently unused - mintAmount; - - if (!markets[vToken].isListed) { - return uint(Error.MARKET_NOT_LISTED); - } - - // Keep the flywheel moving - updateVenusSupplyIndex(vToken); - distributeSupplierVenus(vToken, minter); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Validates mint and reverts on rejection. May emit logs. - * @param vToken Asset being minted - * @param minter The address minting the tokens - * @param actualMintAmount The amount of the underlying asset being minted - * @param mintTokens The number of tokens being minted - */ - function mintVerify(address vToken, address minter, uint actualMintAmount, uint mintTokens) external override { - // Shh - currently unused - vToken; - minter; - actualMintAmount; - mintTokens; - } - - /** - * @notice Checks if the account should be allowed to redeem tokens in the given market - * @param vToken The market to verify the redeem against - * @param redeemer The account which would redeem the tokens - * @param redeemTokens The number of vTokens to exchange for the underlying asset in the market - * @return 0 if the redeem is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) - */ - function redeemAllowed( - address vToken, - address redeemer, - uint redeemTokens - ) external override onlyProtocolAllowed returns (uint) { - uint allowed = redeemAllowedInternal(vToken, redeemer, redeemTokens); - if (allowed != uint(Error.NO_ERROR)) { - return allowed; - } - - // Keep the flywheel moving - updateVenusSupplyIndex(vToken); - distributeSupplierVenus(vToken, redeemer); - - return uint(Error.NO_ERROR); - } - - function redeemAllowedInternal(address vToken, address redeemer, uint redeemTokens) internal view returns (uint) { - if (!markets[vToken].isListed) { - return uint(Error.MARKET_NOT_LISTED); - } - - /* If the redeemer is not 'in' the market, then we can bypass the liquidity check */ - if (!markets[vToken].accountMembership[redeemer]) { - return uint(Error.NO_ERROR); - } - - /* Otherwise, perform a hypothetical liquidity check to guard against shortfall */ - (Error err, , uint shortfall) = getHypotheticalAccountLiquidityInternal( - redeemer, - VToken(vToken), - redeemTokens, - 0 - ); - if (err != Error.NO_ERROR) { - return uint(err); - } - if (shortfall != 0) { - return uint(Error.INSUFFICIENT_LIQUIDITY); - } - - return uint(Error.NO_ERROR); - } - - /** - * @notice Validates redeem and reverts on rejection. May emit logs. - * @param vToken Asset being redeemed - * @param redeemer The address redeeming the tokens - * @param redeemAmount The amount of the underlying asset being redeemed - * @param redeemTokens The number of tokens being redeemed - */ - function redeemVerify(address vToken, address redeemer, uint redeemAmount, uint redeemTokens) external override { - // Shh - currently unused - vToken; - redeemer; - - // Require tokens is zero or amount is also zero - require(redeemTokens != 0 || redeemAmount == 0, "redeemTokens zero"); - } - - /** - * @notice Checks if the account should be allowed to borrow the underlying asset of the given market - * @param vToken The market to verify the borrow against - * @param borrower The account which would borrow the asset - * @param borrowAmount The amount of underlying the account would borrow - * @return 0 if the borrow is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) - */ - function borrowAllowed( - address vToken, - address borrower, - uint borrowAmount - ) external override onlyProtocolAllowed returns (uint) { - // Pausing is a very serious situation - we revert to sound the alarms - require(!borrowGuardianPaused[vToken], "borrow is paused"); - - if (!markets[vToken].isListed) { - return uint(Error.MARKET_NOT_LISTED); - } - - if (!markets[vToken].accountMembership[borrower]) { - // only vTokens may call borrowAllowed if borrower not in market - require(msg.sender == vToken, "sender must be vToken"); - - // attempt to add borrower to the market - Error err = addToMarketInternal(VToken(vToken), borrower); - if (err != Error.NO_ERROR) { - return uint(err); - } - } - - if (oracle.getUnderlyingPrice(VToken(vToken)) == 0) { - return uint(Error.PRICE_ERROR); - } - - uint borrowCap = borrowCaps[vToken]; - // Borrow cap of 0 corresponds to unlimited borrowing - if (borrowCap != 0) { - uint totalBorrows = VToken(vToken).totalBorrows(); - (MathError mathErr, uint nextTotalBorrows) = addUInt(totalBorrows, borrowAmount); - require(mathErr == MathError.NO_ERROR, "total borrows overflow"); - require(nextTotalBorrows < borrowCap, "market borrow cap reached"); - } - - (Error err, , uint shortfall) = getHypotheticalAccountLiquidityInternal( - borrower, - VToken(vToken), - 0, - borrowAmount - ); - if (err != Error.NO_ERROR) { - return uint(err); - } - if (shortfall != 0) { - return uint(Error.INSUFFICIENT_LIQUIDITY); - } - - // Keep the flywheel moving - Exp memory borrowIndex = Exp({ mantissa: VToken(vToken).borrowIndex() }); - updateVenusBorrowIndex(vToken, borrowIndex); - distributeBorrowerVenus(vToken, borrower, borrowIndex); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Validates borrow and reverts on rejection. May emit logs. - * @param vToken Asset whose underlying is being borrowed - * @param borrower The address borrowing the underlying - * @param borrowAmount The amount of the underlying asset requested to borrow - */ - function borrowVerify(address vToken, address borrower, uint borrowAmount) external override { - // Shh - currently unused - vToken; - borrower; - borrowAmount; - - // Shh - we don't ever want this hook to be marked pure - if (false) { - maxAssets = maxAssets; - } - } - - /** - * @notice Checks if the account should be allowed to repay a borrow in the given market - * @param vToken The market to verify the repay against - * @param payer The account which would repay the asset - * @param borrower The account which would repay the asset - * @param repayAmount The amount of the underlying asset the account would repay - * @return 0 if the repay is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) - */ - function repayBorrowAllowed( - address vToken, - address payer, - address borrower, - uint repayAmount - ) external override onlyProtocolAllowed returns (uint) { - // Shh - currently unused - payer; - borrower; - repayAmount; - - if (!markets[vToken].isListed) { - return uint(Error.MARKET_NOT_LISTED); - } - - // Keep the flywheel moving - Exp memory borrowIndex = Exp({ mantissa: VToken(vToken).borrowIndex() }); - updateVenusBorrowIndex(vToken, borrowIndex); - distributeBorrowerVenus(vToken, borrower, borrowIndex); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Validates repayBorrow and reverts on rejection. May emit logs. - * @param vToken Asset being repaid - * @param payer The address repaying the borrow - * @param borrower The address of the borrower - * @param actualRepayAmount The amount of underlying being repaid - */ - function repayBorrowVerify( - address vToken, - address payer, - address borrower, - uint actualRepayAmount, - uint borrowerIndex - ) external override { - // Shh - currently unused - vToken; - payer; - borrower; - actualRepayAmount; - borrowerIndex; - - // Shh - we don't ever want this hook to be marked pure - if (false) { - maxAssets = maxAssets; - } - } - - /** - * @notice Checks if the liquidation should be allowed to occur - * @param vTokenBorrowed Asset which was borrowed by the borrower - * @param vTokenCollateral Asset which was used as collateral and will be seized - * @param liquidator The address repaying the borrow and seizing the collateral - * @param borrower The address of the borrower - * @param repayAmount The amount of underlying being repaid - */ - function liquidateBorrowAllowed( - address vTokenBorrowed, - address vTokenCollateral, - address liquidator, - address borrower, - uint repayAmount - ) external override onlyProtocolAllowed returns (uint) { - // Shh - currently unused - liquidator; - - if (!markets[vTokenBorrowed].isListed || !markets[vTokenCollateral].isListed) { - return uint(Error.MARKET_NOT_LISTED); - } - - /* The borrower must have shortfall in order to be liquidatable */ - (Error err, , uint shortfall) = getHypotheticalAccountLiquidityInternal(borrower, VToken(address(0)), 0, 0); - if (err != Error.NO_ERROR) { - return uint(err); - } - if (shortfall == 0) { - return uint(Error.INSUFFICIENT_SHORTFALL); - } - - /* The liquidator may not repay more than what is allowed by the closeFactor */ - uint borrowBalance = VToken(vTokenBorrowed).borrowBalanceStored(borrower); - (MathError mathErr, uint maxClose) = mulScalarTruncate(Exp({ mantissa: closeFactorMantissa }), borrowBalance); - if (mathErr != MathError.NO_ERROR) { - return uint(Error.MATH_ERROR); - } - if (repayAmount > maxClose) { - return uint(Error.TOO_MUCH_REPAY); - } - - return uint(Error.NO_ERROR); - } - - /** - * @notice Validates liquidateBorrow and reverts on rejection. May emit logs. - * @param vTokenBorrowed Asset which was borrowed by the borrower - * @param vTokenCollateral Asset which was used as collateral and will be seized - * @param liquidator The address repaying the borrow and seizing the collateral - * @param borrower The address of the borrower - * @param actualRepayAmount The amount of underlying being repaid - */ - function liquidateBorrowVerify( - address vTokenBorrowed, - address vTokenCollateral, - address liquidator, - address borrower, - uint actualRepayAmount, - uint seizeTokens - ) external override { - // Shh - currently unused - vTokenBorrowed; - vTokenCollateral; - liquidator; - borrower; - actualRepayAmount; - seizeTokens; - - // Shh - we don't ever want this hook to be marked pure - if (false) { - maxAssets = maxAssets; - } - } - - /** - * @notice Checks if the seizing of assets should be allowed to occur - * @param vTokenCollateral Asset which was used as collateral and will be seized - * @param vTokenBorrowed Asset which was borrowed by the borrower - * @param liquidator The address repaying the borrow and seizing the collateral - * @param borrower The address of the borrower - * @param seizeTokens The number of collateral tokens to seize - */ - function seizeAllowed( - address vTokenCollateral, - address vTokenBorrowed, - address liquidator, - address borrower, - uint seizeTokens - ) external override onlyProtocolAllowed returns (uint) { - // Pausing is a very serious situation - we revert to sound the alarms - require(!seizeGuardianPaused, "seize is paused"); - - // Shh - currently unused - seizeTokens; - - if (!markets[vTokenCollateral].isListed || !markets[vTokenBorrowed].isListed) { - return uint(Error.MARKET_NOT_LISTED); - } - - if (VToken(vTokenCollateral).comptroller() != VToken(vTokenBorrowed).comptroller()) { - return uint(Error.COMPTROLLER_MISMATCH); - } - - // Keep the flywheel moving - updateVenusSupplyIndex(vTokenCollateral); - distributeSupplierVenus(vTokenCollateral, borrower); - distributeSupplierVenus(vTokenCollateral, liquidator); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Validates seize and reverts on rejection. May emit logs. - * @param vTokenCollateral Asset which was used as collateral and will be seized - * @param vTokenBorrowed Asset which was borrowed by the borrower - * @param liquidator The address repaying the borrow and seizing the collateral - * @param borrower The address of the borrower - * @param seizeTokens The number of collateral tokens to seize - */ - function seizeVerify( - address vTokenCollateral, - address vTokenBorrowed, - address liquidator, - address borrower, - uint seizeTokens - ) external override { - // Shh - currently unused - vTokenCollateral; - vTokenBorrowed; - liquidator; - borrower; - seizeTokens; - - // Shh - we don't ever want this hook to be marked pure - if (false) { - maxAssets = maxAssets; - } - } - - /** - * @notice Checks if the account should be allowed to transfer tokens in the given market - * @param vToken The market to verify the transfer against - * @param src The account which sources the tokens - * @param dst The account which receives the tokens - * @param transferTokens The number of vTokens to transfer - * @return 0 if the transfer is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) - */ - function transferAllowed( - address vToken, - address src, - address dst, - uint transferTokens - ) external override onlyProtocolAllowed returns (uint) { - // Pausing is a very serious situation - we revert to sound the alarms - require(!transferGuardianPaused, "transfer is paused"); - - // Currently the only consideration is whether or not - // the src is allowed to redeem this many tokens - uint allowed = redeemAllowedInternal(vToken, src, transferTokens); - if (allowed != uint(Error.NO_ERROR)) { - return allowed; - } - - // Keep the flywheel moving - updateVenusSupplyIndex(vToken); - distributeSupplierVenus(vToken, src); - distributeSupplierVenus(vToken, dst); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Validates transfer and reverts on rejection. May emit logs. - * @param vToken Asset being transferred - * @param src The account which sources the tokens - * @param dst The account which receives the tokens - * @param transferTokens The number of vTokens to transfer - */ - function transferVerify(address vToken, address src, address dst, uint transferTokens) external override { - // Shh - currently unused - vToken; - src; - dst; - transferTokens; - - // Shh - we don't ever want this hook to be marked pure - if (false) { - maxAssets = maxAssets; - } - } - - /*** Liquidity/Liquidation Calculations ***/ - - /** - * @dev Local vars for avoiding stack-depth limits in calculating account liquidity. - * Note that `vTokenBalance` is the number of vTokens the account owns in the market, - * whereas `borrowBalance` is the amount of underlying that the account has borrowed. - */ - struct AccountLiquidityLocalVars { - uint sumCollateral; - uint sumBorrowPlusEffects; - uint vTokenBalance; - uint borrowBalance; - uint exchangeRateMantissa; - uint oraclePriceMantissa; - Exp collateralFactor; - Exp exchangeRate; - Exp oraclePrice; - Exp tokensToDenom; - } - - /** - * @notice Determine the current account liquidity wrt collateral requirements - * @return (possible error code (semi-opaque), - account liquidity in excess of collateral requirements, - * account shortfall below collateral requirements) - */ - function getAccountLiquidity(address account) public view returns (uint, uint, uint) { - (Error err, uint liquidity, uint shortfall) = getHypotheticalAccountLiquidityInternal( - account, - VToken(address(0)), - 0, - 0 - ); - - return (uint(err), liquidity, shortfall); - } - - /** - * @notice Determine what the account liquidity would be if the given amounts were redeemed/borrowed - * @param vTokenModify The market to hypothetically redeem/borrow in - * @param account The account to determine liquidity for - * @param redeemTokens The number of tokens to hypothetically redeem - * @param borrowAmount The amount of underlying to hypothetically borrow - * @return (possible error code (semi-opaque), - hypothetical account liquidity in excess of collateral requirements, - * hypothetical account shortfall below collateral requirements) - */ - function getHypotheticalAccountLiquidity( - address account, - address vTokenModify, - uint redeemTokens, - uint borrowAmount - ) public view returns (uint, uint, uint) { - (Error err, uint liquidity, uint shortfall) = getHypotheticalAccountLiquidityInternal( - account, - VToken(vTokenModify), - redeemTokens, - borrowAmount - ); - return (uint(err), liquidity, shortfall); - } - - /** - * @notice Determine what the account liquidity would be if the given amounts were redeemed/borrowed - * @param vTokenModify The market to hypothetically redeem/borrow in - * @param account The account to determine liquidity for - * @param redeemTokens The number of tokens to hypothetically redeem - * @param borrowAmount The amount of underlying to hypothetically borrow - * @dev Note that we calculate the exchangeRateStored for each collateral vToken using stored data, - * without calculating accumulated interest. - * @return (possible error code, - hypothetical account liquidity in excess of collateral requirements, - * hypothetical account shortfall below collateral requirements) - */ - // solhint-disable-next-line code-complexity - function getHypotheticalAccountLiquidityInternal( - address account, - VToken vTokenModify, - uint redeemTokens, - uint borrowAmount - ) internal view returns (Error, uint, uint) { - AccountLiquidityLocalVars memory vars; // Holds all our calculation results - uint oErr; - MathError mErr; - - // For each asset the account is in - VToken[] memory assets = accountAssets[account]; - for (uint i = 0; i < assets.length; i++) { - VToken asset = assets[i]; - - // Read the balances and exchange rate from the vToken - (oErr, vars.vTokenBalance, vars.borrowBalance, vars.exchangeRateMantissa) = asset.getAccountSnapshot( - account - ); - if (oErr != 0) { - // semi-opaque error code, we assume NO_ERROR == 0 is invariant between upgrades - return (Error.SNAPSHOT_ERROR, 0, 0); - } - vars.collateralFactor = Exp({ mantissa: markets[address(asset)].collateralFactorMantissa }); - vars.exchangeRate = Exp({ mantissa: vars.exchangeRateMantissa }); - - // Get the normalized price of the asset - vars.oraclePriceMantissa = oracle.getUnderlyingPrice(asset); - if (vars.oraclePriceMantissa == 0) { - return (Error.PRICE_ERROR, 0, 0); - } - vars.oraclePrice = Exp({ mantissa: vars.oraclePriceMantissa }); - - // Pre-compute a conversion factor from tokens -> bnb (normalized price value) - (mErr, vars.tokensToDenom) = mulExp3(vars.collateralFactor, vars.exchangeRate, vars.oraclePrice); - if (mErr != MathError.NO_ERROR) { - return (Error.MATH_ERROR, 0, 0); - } - - // sumCollateral += tokensToDenom * vTokenBalance - (mErr, vars.sumCollateral) = mulScalarTruncateAddUInt( - vars.tokensToDenom, - vars.vTokenBalance, - vars.sumCollateral - ); - if (mErr != MathError.NO_ERROR) { - return (Error.MATH_ERROR, 0, 0); - } - - // sumBorrowPlusEffects += oraclePrice * borrowBalance - (mErr, vars.sumBorrowPlusEffects) = mulScalarTruncateAddUInt( - vars.oraclePrice, - vars.borrowBalance, - vars.sumBorrowPlusEffects - ); - if (mErr != MathError.NO_ERROR) { - return (Error.MATH_ERROR, 0, 0); - } - - // Calculate effects of interacting with vTokenModify - if (asset == vTokenModify) { - // redeem effect - // sumBorrowPlusEffects += tokensToDenom * redeemTokens - (mErr, vars.sumBorrowPlusEffects) = mulScalarTruncateAddUInt( - vars.tokensToDenom, - redeemTokens, - vars.sumBorrowPlusEffects - ); - if (mErr != MathError.NO_ERROR) { - return (Error.MATH_ERROR, 0, 0); - } - - // borrow effect - // sumBorrowPlusEffects += oraclePrice * borrowAmount - (mErr, vars.sumBorrowPlusEffects) = mulScalarTruncateAddUInt( - vars.oraclePrice, - borrowAmount, - vars.sumBorrowPlusEffects - ); - if (mErr != MathError.NO_ERROR) { - return (Error.MATH_ERROR, 0, 0); - } - } - } - - /// @dev VAI Integration^ - (mErr, vars.sumBorrowPlusEffects) = addUInt(vars.sumBorrowPlusEffects, mintedVAIs[account]); - if (mErr != MathError.NO_ERROR) { - return (Error.MATH_ERROR, 0, 0); - } - /// @dev VAI Integration$ - - // These are safe, as the underflow condition is checked first - if (vars.sumCollateral > vars.sumBorrowPlusEffects) { - return (Error.NO_ERROR, vars.sumCollateral - vars.sumBorrowPlusEffects, 0); - } else { - return (Error.NO_ERROR, 0, vars.sumBorrowPlusEffects - vars.sumCollateral); - } - } - - /** - * @notice Calculate number of tokens of collateral asset to seize given an underlying amount - * @dev Used in liquidation (called in vToken.liquidateBorrowFresh) - * @param vTokenBorrowed The address of the borrowed vToken - * @param vTokenCollateral The address of the collateral vToken - * @param actualRepayAmount The amount of vTokenBorrowed underlying to convert into vTokenCollateral tokens - * @return (errorCode, number of vTokenCollateral tokens to be seized in a liquidation) - */ - function liquidateCalculateSeizeTokens( - address vTokenBorrowed, - address vTokenCollateral, - uint actualRepayAmount - ) external view override returns (uint, uint) { - /* Read oracle prices for borrowed and collateral markets */ - uint priceBorrowedMantissa = oracle.getUnderlyingPrice(VToken(vTokenBorrowed)); - uint priceCollateralMantissa = oracle.getUnderlyingPrice(VToken(vTokenCollateral)); - if (priceBorrowedMantissa == 0 || priceCollateralMantissa == 0) { - return (uint(Error.PRICE_ERROR), 0); - } - - /* - * Get the exchange rate and calculate the number of collateral tokens to seize: - * seizeAmount = actualRepayAmount * liquidationIncentive * priceBorrowed / priceCollateral - * seizeTokens = seizeAmount / exchangeRate - * = actualRepayAmount * (liquidationIncentive * priceBorrowed) / (priceCollateral * exchangeRate) - */ - uint exchangeRateMantissa = VToken(vTokenCollateral).exchangeRateStored(); // Note: reverts on error - uint seizeTokens; - Exp memory numerator; - Exp memory denominator; - Exp memory ratio; - MathError mathErr; - - (mathErr, numerator) = mulExp(liquidationIncentiveMantissa, priceBorrowedMantissa); - if (mathErr != MathError.NO_ERROR) { - return (uint(Error.MATH_ERROR), 0); - } - - (mathErr, denominator) = mulExp(priceCollateralMantissa, exchangeRateMantissa); - if (mathErr != MathError.NO_ERROR) { - return (uint(Error.MATH_ERROR), 0); - } - - (mathErr, ratio) = divExp(numerator, denominator); - if (mathErr != MathError.NO_ERROR) { - return (uint(Error.MATH_ERROR), 0); - } - - (mathErr, seizeTokens) = mulScalarTruncate(ratio, actualRepayAmount); - if (mathErr != MathError.NO_ERROR) { - return (uint(Error.MATH_ERROR), 0); - } - - return (uint(Error.NO_ERROR), seizeTokens); - } - - /*** Admin Functions ***/ - - /** - * @notice Sets a new price oracle for the comptroller - * @dev Admin function to set a new price oracle - * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) - */ - function _setPriceOracle(PriceOracle newOracle) public returns (uint) { - // Check caller is admin - if (msg.sender != admin) { - return fail(Error.UNAUTHORIZED, FailureInfo.SET_PRICE_ORACLE_OWNER_CHECK); - } - - // Track the old oracle for the comptroller - PriceOracle oldOracle = oracle; - - // Set comptroller's oracle to newOracle - oracle = newOracle; - - // Emit NewPriceOracle(oldOracle, newOracle) - emit NewPriceOracle(oldOracle, newOracle); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Sets the closeFactor used when liquidating borrows - * @dev Admin function to set closeFactor - * @param newCloseFactorMantissa New close factor, scaled by 1e18 - * @return uint 0=success, otherwise a failure. (See ErrorReporter for details) - */ - function _setCloseFactor(uint newCloseFactorMantissa) external returns (uint) { - // Check caller is admin - if (msg.sender != admin) { - return fail(Error.UNAUTHORIZED, FailureInfo.SET_CLOSE_FACTOR_OWNER_CHECK); - } - - Exp memory newCloseFactorExp = Exp({ mantissa: newCloseFactorMantissa }); - Exp memory lowLimit = Exp({ mantissa: closeFactorMinMantissa }); - if (lessThanOrEqualExp(newCloseFactorExp, lowLimit)) { - return fail(Error.INVALID_CLOSE_FACTOR, FailureInfo.SET_CLOSE_FACTOR_VALIDATION); - } - - Exp memory highLimit = Exp({ mantissa: closeFactorMaxMantissa }); - if (lessThanExp(highLimit, newCloseFactorExp)) { - return fail(Error.INVALID_CLOSE_FACTOR, FailureInfo.SET_CLOSE_FACTOR_VALIDATION); - } - - uint oldCloseFactorMantissa = closeFactorMantissa; - closeFactorMantissa = newCloseFactorMantissa; - emit NewCloseFactor(oldCloseFactorMantissa, newCloseFactorMantissa); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Sets the collateralFactor for a market - * @dev Admin function to set per-market collateralFactor - * @param vToken The market to set the factor on - * @param newCollateralFactorMantissa The new collateral factor, scaled by 1e18 - * @return uint 0=success, otherwise a failure. (See ErrorReporter for details) - */ - function _setCollateralFactor(VToken vToken, uint newCollateralFactorMantissa) external returns (uint) { - // Check caller is admin - if (msg.sender != admin) { - return fail(Error.UNAUTHORIZED, FailureInfo.SET_COLLATERAL_FACTOR_OWNER_CHECK); - } - - // Verify market is listed - Market storage market = markets[address(vToken)]; - if (!market.isListed) { - return fail(Error.MARKET_NOT_LISTED, FailureInfo.SET_COLLATERAL_FACTOR_NO_EXISTS); - } - - Exp memory newCollateralFactorExp = Exp({ mantissa: newCollateralFactorMantissa }); - - // Check collateral factor <= 0.9 - Exp memory highLimit = Exp({ mantissa: collateralFactorMaxMantissa }); - if (lessThanExp(highLimit, newCollateralFactorExp)) { - return fail(Error.INVALID_COLLATERAL_FACTOR, FailureInfo.SET_COLLATERAL_FACTOR_VALIDATION); - } - - // If collateral factor != 0, fail if price == 0 - if (newCollateralFactorMantissa != 0 && oracle.getUnderlyingPrice(vToken) == 0) { - return fail(Error.PRICE_ERROR, FailureInfo.SET_COLLATERAL_FACTOR_WITHOUT_PRICE); - } - - // Set market's collateral factor to new collateral factor, remember old value - uint oldCollateralFactorMantissa = market.collateralFactorMantissa; - market.collateralFactorMantissa = newCollateralFactorMantissa; - - // Emit event with asset, old collateral factor, and new collateral factor - emit NewCollateralFactor(vToken, oldCollateralFactorMantissa, newCollateralFactorMantissa); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Sets maxAssets which controls how many markets can be entered - * @dev Admin function to set maxAssets - * @param newMaxAssets New max assets - * @return uint 0=success, otherwise a failure. (See ErrorReporter for details) - */ - function _setMaxAssets(uint newMaxAssets) external returns (uint) { - // Check caller is admin - if (msg.sender != admin) { - return fail(Error.UNAUTHORIZED, FailureInfo.SET_MAX_ASSETS_OWNER_CHECK); - } - - uint oldMaxAssets = maxAssets; - maxAssets = newMaxAssets; - emit NewMaxAssets(oldMaxAssets, newMaxAssets); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Sets liquidationIncentive - * @dev Admin function to set liquidationIncentive - * @param newLiquidationIncentiveMantissa New liquidationIncentive scaled by 1e18 - * @return uint 0=success, otherwise a failure. (See ErrorReporter for details) - */ - function _setLiquidationIncentive(uint newLiquidationIncentiveMantissa) external returns (uint) { - // Check caller is admin - if (msg.sender != admin) { - return fail(Error.UNAUTHORIZED, FailureInfo.SET_LIQUIDATION_INCENTIVE_OWNER_CHECK); - } - - // Check de-scaled min <= newLiquidationIncentive <= max - Exp memory newLiquidationIncentive = Exp({ mantissa: newLiquidationIncentiveMantissa }); - Exp memory minLiquidationIncentive = Exp({ mantissa: liquidationIncentiveMinMantissa }); - if (lessThanExp(newLiquidationIncentive, minLiquidationIncentive)) { - return fail(Error.INVALID_LIQUIDATION_INCENTIVE, FailureInfo.SET_LIQUIDATION_INCENTIVE_VALIDATION); - } - - Exp memory maxLiquidationIncentive = Exp({ mantissa: liquidationIncentiveMaxMantissa }); - if (lessThanExp(maxLiquidationIncentive, newLiquidationIncentive)) { - return fail(Error.INVALID_LIQUIDATION_INCENTIVE, FailureInfo.SET_LIQUIDATION_INCENTIVE_VALIDATION); - } - - // Save current value for use in log - uint oldLiquidationIncentiveMantissa = liquidationIncentiveMantissa; - - // Set liquidation incentive to new incentive - liquidationIncentiveMantissa = newLiquidationIncentiveMantissa; - - // Emit event with old incentive, new incentive - emit NewLiquidationIncentive(oldLiquidationIncentiveMantissa, newLiquidationIncentiveMantissa); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Add the market to the markets mapping and set it as listed - * @dev Admin function to set isListed and add support for the market - * @param vToken The address of the market (token) to list - * @return uint 0=success, otherwise a failure. (See enum Error for details) - */ - function _supportMarket(VToken vToken) external returns (uint) { - if (msg.sender != admin) { - return fail(Error.UNAUTHORIZED, FailureInfo.SUPPORT_MARKET_OWNER_CHECK); - } - - if (markets[address(vToken)].isListed) { - return fail(Error.MARKET_ALREADY_LISTED, FailureInfo.SUPPORT_MARKET_EXISTS); - } - - vToken.isVToken(); // Sanity check to make sure its really a VToken - - // Note that isVenus is not in active use anymore - Market storage newMarket = markets[address(vToken)]; - newMarket.isListed = true; - newMarket.isVenus = false; - newMarket.collateralFactorMantissa = 0; - _addMarketInternal(vToken); - - emit MarketListed(vToken); - - return uint(Error.NO_ERROR); - } - - function _addMarketInternal(VToken vToken) internal { - for (uint i = 0; i < allMarkets.length; i++) { - require(allMarkets[i] != vToken, "market already added"); - } - allMarkets.push(vToken); - } - - /** - * @notice Set the given borrow caps for the given vToken markets. Borrowing that brings total borrows to or above borrow cap will revert. - * @dev Admin or borrowCapGuardian function to set the borrow caps. A borrow cap of 0 corresponds to unlimited borrowing. - * @param vTokens The addresses of the markets (tokens) to change the borrow caps for - * @param newBorrowCaps The new borrow cap values in underlying to be set. A value of 0 corresponds to unlimited borrowing. - */ - function _setMarketBorrowCaps(VToken[] calldata vTokens, uint[] calldata newBorrowCaps) external { - require( - msg.sender == admin || msg.sender == borrowCapGuardian, - "only admin or borrow cap guardian can set borrow caps" - ); - - uint numMarkets = vTokens.length; - uint numBorrowCaps = newBorrowCaps.length; - - require(numMarkets != 0 && numMarkets == numBorrowCaps, "invalid input"); - - for (uint i = 0; i < numMarkets; i++) { - borrowCaps[address(vTokens[i])] = newBorrowCaps[i]; - emit NewBorrowCap(vTokens[i], newBorrowCaps[i]); - } - } - - /** - * @notice Admin function to change the Borrow Cap Guardian - * @param newBorrowCapGuardian The address of the new Borrow Cap Guardian - */ - function _setBorrowCapGuardian(address newBorrowCapGuardian) external { - require(msg.sender == admin, "only admin can set borrow cap guardian"); - - // Save current value for inclusion in log - address oldBorrowCapGuardian = borrowCapGuardian; - - // Store borrowCapGuardian with value newBorrowCapGuardian - borrowCapGuardian = newBorrowCapGuardian; - - // Emit NewBorrowCapGuardian(OldBorrowCapGuardian, NewBorrowCapGuardian) - emit NewBorrowCapGuardian(oldBorrowCapGuardian, newBorrowCapGuardian); - } - - /** - * @notice Set whole protocol pause/unpause state - */ - function _setProtocolPaused(bool state) public onlyAdmin returns (bool) { - protocolPaused = state; - emit ActionProtocolPaused(state); - return state; - } - - /** - * @notice Sets a new VAI controller - * @dev Admin function to set a new VAI controller - * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) - */ - function _setVAIController(VAIControllerInterface vaiController_) external returns (uint) { - // Check caller is admin - if (msg.sender != admin) { - return fail(Error.UNAUTHORIZED, FailureInfo.SET_VAICONTROLLER_OWNER_CHECK); - } - - VAIControllerInterface oldRate = vaiController; - vaiController = vaiController_; - emit NewVAIController(oldRate, vaiController_); - } - - function _setVAIMintRate(uint newVAIMintRate) external returns (uint) { - // Check caller is admin - if (msg.sender != admin) { - return fail(Error.UNAUTHORIZED, FailureInfo.SET_VAI_MINT_RATE_CHECK); - } - - uint oldVAIMintRate = vaiMintRate; - vaiMintRate = newVAIMintRate; - emit NewVAIMintRate(oldVAIMintRate, newVAIMintRate); - - return uint(Error.NO_ERROR); - } - - function _become(Unitroller unitroller) public { - require(msg.sender == unitroller.admin(), "only unitroller admin can"); - require(unitroller._acceptImplementation() == 0, "not authorized"); - } - - /** - * @notice Checks caller is admin, or this contract is becoming the new implementation - */ - function adminOrInitializing() internal view returns (bool) { - return msg.sender == admin || msg.sender == comptrollerImplementation; - } - - /*** Venus Distribution ***/ - - function setVenusSpeedInternal(VToken vToken, uint venusSpeed) internal { - uint currentVenusSpeed = venusSpeeds[address(vToken)]; - if (currentVenusSpeed != 0) { - // note that XVS speed could be set to 0 to halt liquidity rewards for a market - Exp memory borrowIndex = Exp({ mantissa: vToken.borrowIndex() }); - updateVenusSupplyIndex(address(vToken)); - updateVenusBorrowIndex(address(vToken), borrowIndex); - } else if (venusSpeed != 0) { - // Add the XVS market - Market storage market = markets[address(vToken)]; - require(market.isListed == true, "venus market is not listed"); - - if (venusSupplyState[address(vToken)].index == 0 && venusSupplyState[address(vToken)].block == 0) { - venusSupplyState[address(vToken)] = VenusMarketState({ - index: venusInitialIndex, - block: safe32(getBlockNumber(), "block number exceeds 32 bits") - }); - } - - if (venusBorrowState[address(vToken)].index == 0 && venusBorrowState[address(vToken)].block == 0) { - venusBorrowState[address(vToken)] = VenusMarketState({ - index: venusInitialIndex, - block: safe32(getBlockNumber(), "block number exceeds 32 bits") - }); - } - } - - if (currentVenusSpeed != venusSpeed) { - venusSpeeds[address(vToken)] = venusSpeed; - emit VenusSpeedUpdated(vToken, venusSpeed); - } - } - - /** - * @notice Accrue XVS to the market by updating the supply index - * @param vToken The market whose supply index to update - */ - function updateVenusSupplyIndex(address vToken) internal { - VenusMarketState storage supplyState = venusSupplyState[vToken]; - uint supplySpeed = venusSpeeds[vToken]; - uint blockNumber = getBlockNumber(); - uint deltaBlocks = sub_(blockNumber, uint(supplyState.block)); - if (deltaBlocks > 0 && supplySpeed > 0) { - uint supplyTokens = VToken(vToken).totalSupply(); - uint venusAccrued = mul_(deltaBlocks, supplySpeed); - Double memory ratio = supplyTokens > 0 ? fraction(venusAccrued, supplyTokens) : Double({ mantissa: 0 }); - Double memory index = add_(Double({ mantissa: supplyState.index }), ratio); - venusSupplyState[vToken] = VenusMarketState({ - index: safe224(index.mantissa, "new index overflows"), - block: safe32(blockNumber, "block number overflows") - }); - } else if (deltaBlocks > 0) { - supplyState.block = safe32(blockNumber, "block number overflows"); - } - } - - /** - * @notice Accrue XVS to the market by updating the borrow index - * @param vToken The market whose borrow index to update - */ - function updateVenusBorrowIndex(address vToken, Exp memory marketBorrowIndex) internal { - VenusMarketState storage borrowState = venusBorrowState[vToken]; - uint borrowSpeed = venusSpeeds[vToken]; - uint blockNumber = getBlockNumber(); - uint deltaBlocks = sub_(blockNumber, uint(borrowState.block)); - if (deltaBlocks > 0 && borrowSpeed > 0) { - uint borrowAmount = div_(VToken(vToken).totalBorrows(), marketBorrowIndex); - uint venusAccrued = mul_(deltaBlocks, borrowSpeed); - Double memory ratio = borrowAmount > 0 ? fraction(venusAccrued, borrowAmount) : Double({ mantissa: 0 }); - Double memory index = add_(Double({ mantissa: borrowState.index }), ratio); - venusBorrowState[vToken] = VenusMarketState({ - index: safe224(index.mantissa, "new index overflows"), - block: safe32(blockNumber, "block number overflows") - }); - } else if (deltaBlocks > 0) { - borrowState.block = safe32(blockNumber, "block number overflows"); - } - } - - /** - * @notice Calculate XVS accrued by a supplier and possibly transfer it to them - * @param vToken The market in which the supplier is interacting - * @param supplier The address of the supplier to distribute XVS to - */ - function distributeSupplierVenus(address vToken, address supplier) internal { - if (address(vaiVaultAddress) != address(0)) { - releaseToVault(); - } - - VenusMarketState storage supplyState = venusSupplyState[vToken]; - Double memory supplyIndex = Double({ mantissa: supplyState.index }); - Double memory supplierIndex = Double({ mantissa: venusSupplierIndex[vToken][supplier] }); - venusSupplierIndex[vToken][supplier] = supplyIndex.mantissa; - - if (supplierIndex.mantissa == 0 && supplyIndex.mantissa > 0) { - supplierIndex.mantissa = venusInitialIndex; - } - - Double memory deltaIndex = sub_(supplyIndex, supplierIndex); - uint supplierTokens = VToken(vToken).balanceOf(supplier); - uint supplierDelta = mul_(supplierTokens, deltaIndex); - uint supplierAccrued = add_(venusAccrued[supplier], supplierDelta); - venusAccrued[supplier] = supplierAccrued; - emit DistributedSupplierVenus(VToken(vToken), supplier, supplierDelta, supplyIndex.mantissa); - } - - /** - * @notice Calculate XVS accrued by a borrower and possibly transfer it to them - * @dev Borrowers will not begin to accrue until after the first interaction with the protocol. - * @param vToken The market in which the borrower is interacting - * @param borrower The address of the borrower to distribute XVS to - */ - function distributeBorrowerVenus(address vToken, address borrower, Exp memory marketBorrowIndex) internal { - if (address(vaiVaultAddress) != address(0)) { - releaseToVault(); - } - - VenusMarketState storage borrowState = venusBorrowState[vToken]; - Double memory borrowIndex = Double({ mantissa: borrowState.index }); - Double memory borrowerIndex = Double({ mantissa: venusBorrowerIndex[vToken][borrower] }); - venusBorrowerIndex[vToken][borrower] = borrowIndex.mantissa; - - if (borrowerIndex.mantissa > 0) { - Double memory deltaIndex = sub_(borrowIndex, borrowerIndex); - uint borrowerAmount = div_(VToken(vToken).borrowBalanceStored(borrower), marketBorrowIndex); - uint borrowerDelta = mul_(borrowerAmount, deltaIndex); - uint borrowerAccrued = add_(venusAccrued[borrower], borrowerDelta); - venusAccrued[borrower] = borrowerAccrued; - emit DistributedBorrowerVenus(VToken(vToken), borrower, borrowerDelta, borrowIndex.mantissa); - } - } - - /** - * @notice Calculate XVS accrued by a VAI minter and possibly transfer it to them - * @dev VAI minters will not begin to accrue until after the first interaction with the protocol. - * @param vaiMinter The address of the VAI minter to distribute XVS to - */ - // solhint-disable-next-line no-unused-vars - function distributeVAIMinterVenus(address vaiMinter, bool distributeAll) public { - if (address(vaiVaultAddress) != address(0)) { - releaseToVault(); - } - - if (address(vaiController) != address(0)) { - uint vaiMinterAccrued; - uint vaiMinterDelta; - uint vaiMintIndexMantissa; - uint err; - (err, vaiMinterAccrued, vaiMinterDelta, vaiMintIndexMantissa) = vaiController.calcDistributeVAIMinterVenus( - vaiMinter - ); - if (err == uint(Error.NO_ERROR)) { - venusAccrued[vaiMinter] = vaiMinterAccrued; - emit DistributedVAIMinterVenus(vaiMinter, vaiMinterDelta, vaiMintIndexMantissa); - } - } - } - - /** - * @notice Claim all the xvs accrued by holder in all markets and VAI - * @param holder The address to claim XVS for - */ - function claimVenus(address holder) public { - return claimVenus(holder, allMarkets); - } - - /** - * @notice Claim all the xvs accrued by holder in the specified markets - * @param holder The address to claim XVS for - * @param vTokens The list of markets to claim XVS in - */ - function claimVenus(address holder, VToken[] memory vTokens) public { - address[] memory holders = new address[](1); - holders[0] = holder; - claimVenus(holders, vTokens, true, true); - } - - /** - * @notice Claim all xvs accrued by the holders - * @param holders The addresses to claim XVS for - * @param vTokens The list of markets to claim XVS in - * @param borrowers Whether or not to claim XVS earned by borrowing - * @param suppliers Whether or not to claim XVS earned by supplying - */ - function claimVenus(address[] memory holders, VToken[] memory vTokens, bool borrowers, bool suppliers) public { - uint j; - if (address(vaiController) != address(0)) { - vaiController.updateVenusVAIMintIndex(); - } - for (j = 0; j < holders.length; j++) { - distributeVAIMinterVenus(holders[j], true); - venusAccrued[holders[j]] = grantXVSInternal(holders[j], venusAccrued[holders[j]]); - } - for (uint i = 0; i < vTokens.length; i++) { - VToken vToken = vTokens[i]; - require(markets[address(vToken)].isListed, "not listed market"); - if (borrowers) { - Exp memory borrowIndex = Exp({ mantissa: vToken.borrowIndex() }); - updateVenusBorrowIndex(address(vToken), borrowIndex); - for (j = 0; j < holders.length; j++) { - distributeBorrowerVenus(address(vToken), holders[j], borrowIndex); - venusAccrued[holders[j]] = grantXVSInternal(holders[j], venusAccrued[holders[j]]); - } - } - if (suppliers) { - updateVenusSupplyIndex(address(vToken)); - for (j = 0; j < holders.length; j++) { - distributeSupplierVenus(address(vToken), holders[j]); - venusAccrued[holders[j]] = grantXVSInternal(holders[j], venusAccrued[holders[j]]); - } - } - } - } - - /** - * @notice Transfer XVS to the user - * @dev Note: If there is not enough XVS, we do not perform the transfer all. - * @param user The address of the user to transfer XVS to - * @param amount The amount of XVS to (possibly) transfer - * @return The amount of XVS which was NOT transferred to the user - */ - function grantXVSInternal(address user, uint amount) internal returns (uint) { - XVS xvs = XVS(getXVSAddress()); - uint venusRemaining = xvs.balanceOf(address(this)); - if (amount > 0 && amount <= venusRemaining) { - xvs.transfer(user, amount); - return 0; - } - return amount; - } - - /*** Venus Distribution Admin ***/ - - /** - * @notice Set the amount of XVS distributed per block to VAI Vault - * @param venusVAIVaultRate_ The amount of XVS wei per block to distribute to VAI Vault - */ - function _setVenusVAIVaultRate(uint venusVAIVaultRate_) public { - require(msg.sender == admin, "only admin can"); - - uint oldVenusVAIVaultRate = venusVAIVaultRate; - venusVAIVaultRate = venusVAIVaultRate_; - emit NewVenusVAIVaultRate(oldVenusVAIVaultRate, venusVAIVaultRate_); - } - - /** - * @notice Set the VAI Vault infos - * @param vault_ The address of the VAI Vault - * @param releaseStartBlock_ The start block of release to VAI Vault - * @param minReleaseAmount_ The minimum release amount to VAI Vault - */ - function _setVAIVaultInfo(address vault_, uint256 releaseStartBlock_, uint256 minReleaseAmount_) public { - require(msg.sender == admin, "only admin can"); - - vaiVaultAddress = vault_; - releaseStartBlock = releaseStartBlock_; - minReleaseAmount = minReleaseAmount_; - emit NewVAIVaultInfo(vault_, releaseStartBlock_, minReleaseAmount_); - } - - /** - * @notice Set XVS speed for a single market - * @param vToken The market whose XVS speed to update - * @param venusSpeed New XVS speed for market - */ - function _setVenusSpeed(VToken vToken, uint venusSpeed) public { - require(adminOrInitializing(), "only admin can set venus speed"); - setVenusSpeedInternal(vToken, venusSpeed); - } - - /** - * @notice Return all of the markets - * @dev The automatic getter may be used to access an individual market. - * @return The list of market addresses - */ - function getAllMarkets() public view returns (VToken[] memory) { - return allMarkets; - } - - function getBlockNumber() public view returns (uint) { - return block.number; - } - - /** - * @notice Return the address of the XVS token - * @return The address of XVS - */ - function getXVSAddress() public view returns (address) { - return 0xcF6BB5389c92Bdda8a3747Ddb454cB7a64626C63; - } - - /*** VAI functions ***/ - - /** - * @notice Set the minted VAI amount of the `owner` - * @param owner The address of the account to set - * @param amount The amount of VAI to set to the account - * @return The number of minted VAI by `owner` - */ - function setMintedVAIOf(address owner, uint amount) external override onlyProtocolAllowed returns (uint) { - // Pausing is a very serious situation - we revert to sound the alarms - require(!mintVAIGuardianPaused && !repayVAIGuardianPaused, "VAI is paused"); - // Check caller is vaiController - if (msg.sender != address(vaiController)) { - return fail(Error.REJECTION, FailureInfo.SET_MINTED_VAI_REJECTION); - } - mintedVAIs[owner] = amount; - - return uint(Error.NO_ERROR); - } - - /** - * @notice Transfer XVS to VAI Vault - */ - function releaseToVault() public { - if (releaseStartBlock == 0 || getBlockNumber() < releaseStartBlock) { - return; - } - - XVS xvs = XVS(getXVSAddress()); - - uint256 xvsBalance = xvs.balanceOf(address(this)); - if (xvsBalance == 0) { - return; - } - - uint256 actualAmount; - uint256 deltaBlocks = sub_(getBlockNumber(), releaseStartBlock); - // releaseAmount = venusVAIVaultRate * deltaBlocks - uint256 _releaseAmount = mul_(venusVAIVaultRate, deltaBlocks); - - if (_releaseAmount < minReleaseAmount) { - return; - } - - if (xvsBalance >= _releaseAmount) { - actualAmount = _releaseAmount; - } else { - actualAmount = xvsBalance; - } - - releaseStartBlock = getBlockNumber(); - - xvs.transfer(vaiVaultAddress, actualAmount); - emit DistributedVAIVaultVenus(actualAmount); - - IVAIVault(vaiVaultAddress).updatePendingRewards(); - } -} diff --git a/contracts/Comptroller/ComptrollerG4.sol b/contracts/Comptroller/ComptrollerG4.sol deleted file mode 100644 index cae9a12d1..000000000 --- a/contracts/Comptroller/ComptrollerG4.sol +++ /dev/null @@ -1,1571 +0,0 @@ -pragma solidity 0.8.13; - -import "../Oracle/PriceOracle.sol"; -import "../Tokens/VTokens/VToken.sol"; -import "../Utils/ErrorReporter.sol"; -import "../Tokens/XVS/XVS.sol"; -import "../Tokens/VAI/VAI.sol"; -import "./ComptrollerInterface.sol"; -import "./ComptrollerStorage.sol"; -import "./Unitroller.sol"; - -/** - * @title Venus's Comptroller Contract - * @author Venus - */ -contract ComptrollerG4 is ComptrollerV4Storage, ComptrollerInterfaceG2, ComptrollerErrorReporter, ExponentialNoError { - /// @notice Emitted when an admin supports a market - event MarketListed(VToken vToken); - - /// @notice Emitted when an account enters a market - event MarketEntered(VToken vToken, address account); - - /// @notice Emitted when an account exits a market - event MarketExited(VToken vToken, address account); - - /// @notice Emitted when close factor is changed by admin - event NewCloseFactor(uint oldCloseFactorMantissa, uint newCloseFactorMantissa); - - /// @notice Emitted when a collateral factor is changed by admin - event NewCollateralFactor(VToken vToken, uint oldCollateralFactorMantissa, uint newCollateralFactorMantissa); - - /// @notice Emitted when liquidation incentive is changed by admin - event NewLiquidationIncentive(uint oldLiquidationIncentiveMantissa, uint newLiquidationIncentiveMantissa); - - /// @notice Emitted when price oracle is changed - event NewPriceOracle(PriceOracle oldPriceOracle, PriceOracle newPriceOracle); - - /// @notice Emitted when VAI Vault info is changed - event NewVAIVaultInfo(address vault_, uint releaseStartBlock_, uint releaseInterval_); - - /// @notice Emitted when pause guardian is changed - event NewPauseGuardian(address oldPauseGuardian, address newPauseGuardian); - - /// @notice Emitted when an action is paused globally - event ActionPaused(string action, bool pauseState); - - /// @notice Emitted when an action is paused on a market - event ActionPaused(VToken vToken, string action, bool pauseState); - - /// @notice Emitted when Venus VAI Vault rate is changed - event NewVenusVAIVaultRate(uint oldVenusVAIVaultRate, uint newVenusVAIVaultRate); - - /// @notice Emitted when a new Venus speed is calculated for a market - event VenusSpeedUpdated(VToken indexed vToken, uint newSpeed); - - /// @notice Emitted when XVS is distributed to a supplier - event DistributedSupplierVenus( - VToken indexed vToken, - address indexed supplier, - uint venusDelta, - uint venusSupplyIndex - ); - - /// @notice Emitted when XVS is distributed to a borrower - event DistributedBorrowerVenus( - VToken indexed vToken, - address indexed borrower, - uint venusDelta, - uint venusBorrowIndex - ); - - /// @notice Emitted when XVS is distributed to a VAI minter - event DistributedVAIMinterVenus(address indexed vaiMinter, uint venusDelta, uint venusVAIMintIndex); - - /// @notice Emitted when XVS is distributed to VAI Vault - event DistributedVAIVaultVenus(uint amount); - - /// @notice Emitted when VAIController is changed - event NewVAIController(VAIControllerInterface oldVAIController, VAIControllerInterface newVAIController); - - /// @notice Emitted when VAI mint rate is changed by admin - event NewVAIMintRate(uint oldVAIMintRate, uint newVAIMintRate); - - /// @notice Emitted when protocol state is changed by admin - event ActionProtocolPaused(bool state); - - /// @notice Emitted when borrow cap for a vToken is changed - event NewBorrowCap(VToken indexed vToken, uint newBorrowCap); - - /// @notice Emitted when borrow cap guardian is changed - event NewBorrowCapGuardian(address oldBorrowCapGuardian, address newBorrowCapGuardian); - - /// @notice Emitted when treasury guardian is changed - event NewTreasuryGuardian(address oldTreasuryGuardian, address newTreasuryGuardian); - - /// @notice Emitted when treasury address is changed - event NewTreasuryAddress(address oldTreasuryAddress, address newTreasuryAddress); - - /// @notice Emitted when treasury percent is changed - event NewTreasuryPercent(uint oldTreasuryPercent, uint newTreasuryPercent); - - /// @notice The initial Venus index for a market - uint224 public constant venusInitialIndex = 1e36; - - // closeFactorMantissa must be strictly greater than this value - uint internal constant closeFactorMinMantissa = 0.05e18; // 0.05 - - // closeFactorMantissa must not exceed this value - uint internal constant closeFactorMaxMantissa = 0.9e18; // 0.9 - - // No collateralFactorMantissa may exceed this value - uint internal constant collateralFactorMaxMantissa = 0.9e18; // 0.9 - - constructor() public { - admin = msg.sender; - } - - modifier onlyProtocolAllowed() { - require(!protocolPaused, "protocol is paused"); - _; - } - - modifier onlyAdmin() { - require(msg.sender == admin, "only admin can"); - _; - } - - modifier onlyListedMarket(VToken vToken) { - require(markets[address(vToken)].isListed, "venus market is not listed"); - _; - } - - modifier validPauseState(bool state) { - require(msg.sender == pauseGuardian || msg.sender == admin, "only pause guardian and admin can"); - require(msg.sender == admin || state == true, "only admin can unpause"); - _; - } - - /*** Assets You Are In ***/ - - /** - * @notice Returns the assets an account has entered - * @param account The address of the account to pull assets for - * @return A dynamic list with the assets the account has entered - */ - function getAssetsIn(address account) external view returns (VToken[] memory) { - return accountAssets[account]; - } - - /** - * @notice Returns whether the given account is entered in the given asset - * @param account The address of the account to check - * @param vToken The vToken to check - * @return True if the account is in the asset, otherwise false. - */ - function checkMembership(address account, VToken vToken) external view returns (bool) { - return markets[address(vToken)].accountMembership[account]; - } - - /** - * @notice Add assets to be included in account liquidity calculation - * @param vTokens The list of addresses of the vToken markets to be enabled - * @return Success indicator for whether each corresponding market was entered - */ - function enterMarkets(address[] calldata vTokens) external override returns (uint[] memory) { - uint len = vTokens.length; - - uint[] memory results = new uint[](len); - for (uint i = 0; i < len; i++) { - results[i] = uint(addToMarketInternal(VToken(vTokens[i]), msg.sender)); - } - - return results; - } - - /** - * @notice Add the market to the borrower's "assets in" for liquidity calculations - * @param vToken The market to enter - * @param borrower The address of the account to modify - * @return Success indicator for whether the market was entered - */ - function addToMarketInternal(VToken vToken, address borrower) internal returns (Error) { - Market storage marketToJoin = markets[address(vToken)]; - - if (!marketToJoin.isListed) { - // market is not listed, cannot join - return Error.MARKET_NOT_LISTED; - } - - if (marketToJoin.accountMembership[borrower]) { - // already joined - return Error.NO_ERROR; - } - - // survived the gauntlet, add to list - // NOTE: we store these somewhat redundantly as a significant optimization - // this avoids having to iterate through the list for the most common use cases - // that is, only when we need to perform liquidity checks - // and not whenever we want to check if an account is in a particular market - marketToJoin.accountMembership[borrower] = true; - accountAssets[borrower].push(vToken); - - emit MarketEntered(vToken, borrower); - - return Error.NO_ERROR; - } - - /** - * @notice Removes asset from sender's account liquidity calculation - * @dev Sender must not have an outstanding borrow balance in the asset, - * or be providing necessary collateral for an outstanding borrow. - * @param vTokenAddress The address of the asset to be removed - * @return Whether or not the account successfully exited the market - */ - function exitMarket(address vTokenAddress) external override returns (uint) { - VToken vToken = VToken(vTokenAddress); - /* Get sender tokensHeld and amountOwed underlying from the vToken */ - (uint oErr, uint tokensHeld, uint amountOwed, ) = vToken.getAccountSnapshot(msg.sender); - require(oErr == 0, "getAccountSnapshot failed"); // semi-opaque error code - - /* Fail if the sender has a borrow balance */ - if (amountOwed != 0) { - return fail(Error.NONZERO_BORROW_BALANCE, FailureInfo.EXIT_MARKET_BALANCE_OWED); - } - - /* Fail if the sender is not permitted to redeem all of their tokens */ - uint allowed = redeemAllowedInternal(vTokenAddress, msg.sender, tokensHeld); - if (allowed != 0) { - return failOpaque(Error.REJECTION, FailureInfo.EXIT_MARKET_REJECTION, allowed); - } - - Market storage marketToExit = markets[address(vToken)]; - - /* Return true if the sender is not already ‘in’ the market */ - if (!marketToExit.accountMembership[msg.sender]) { - return uint(Error.NO_ERROR); - } - - /* Set vToken account membership to false */ - delete marketToExit.accountMembership[msg.sender]; - - /* Delete vToken from the account’s list of assets */ - // In order to delete vToken, copy last item in list to location of item to be removed, reduce length by 1 - VToken[] storage userAssetList = accountAssets[msg.sender]; - uint len = userAssetList.length; - uint i; - for (; i < len; i++) { - if (userAssetList[i] == vToken) { - userAssetList[i] = userAssetList[len - 1]; - userAssetList.pop(); - break; - } - } - - // We *must* have found the asset in the list or our redundant data structure is broken - assert(i < len); - - emit MarketExited(vToken, msg.sender); - - return uint(Error.NO_ERROR); - } - - /*** Policy Hooks ***/ - - /** - * @notice Checks if the account should be allowed to mint tokens in the given market - * @param vToken The market to verify the mint against - * @param minter The account which would get the minted tokens - * @param mintAmount The amount of underlying being supplied to the market in exchange for tokens - * @return 0 if the mint is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) - */ - function mintAllowed( - address vToken, - address minter, - uint mintAmount - ) external override onlyProtocolAllowed returns (uint) { - // Pausing is a very serious situation - we revert to sound the alarms - require(!mintGuardianPaused[vToken], "mint is paused"); - - // Shh - currently unused - mintAmount; - - if (!markets[vToken].isListed) { - return uint(Error.MARKET_NOT_LISTED); - } - - // Keep the flywheel moving - updateVenusSupplyIndex(vToken); - distributeSupplierVenus(vToken, minter); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Validates mint and reverts on rejection. May emit logs. - * @param vToken Asset being minted - * @param minter The address minting the tokens - * @param actualMintAmount The amount of the underlying asset being minted - * @param mintTokens The number of tokens being minted - */ - function mintVerify(address vToken, address minter, uint actualMintAmount, uint mintTokens) external override { - // Shh - currently unused - vToken; - minter; - actualMintAmount; - mintTokens; - } - - /** - * @notice Checks if the account should be allowed to redeem tokens in the given market - * @param vToken The market to verify the redeem against - * @param redeemer The account which would redeem the tokens - * @param redeemTokens The number of vTokens to exchange for the underlying asset in the market - * @return 0 if the redeem is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) - */ - function redeemAllowed( - address vToken, - address redeemer, - uint redeemTokens - ) external override onlyProtocolAllowed returns (uint) { - uint allowed = redeemAllowedInternal(vToken, redeemer, redeemTokens); - if (allowed != uint(Error.NO_ERROR)) { - return allowed; - } - - // Keep the flywheel moving - updateVenusSupplyIndex(vToken); - distributeSupplierVenus(vToken, redeemer); - - return uint(Error.NO_ERROR); - } - - function redeemAllowedInternal(address vToken, address redeemer, uint redeemTokens) internal view returns (uint) { - if (!markets[vToken].isListed) { - return uint(Error.MARKET_NOT_LISTED); - } - - /* If the redeemer is not 'in' the market, then we can bypass the liquidity check */ - if (!markets[vToken].accountMembership[redeemer]) { - return uint(Error.NO_ERROR); - } - - /* Otherwise, perform a hypothetical liquidity check to guard against shortfall */ - (Error err, , uint shortfall) = getHypotheticalAccountLiquidityInternal( - redeemer, - VToken(vToken), - redeemTokens, - 0 - ); - if (err != Error.NO_ERROR) { - return uint(err); - } - if (shortfall != 0) { - return uint(Error.INSUFFICIENT_LIQUIDITY); - } - - return uint(Error.NO_ERROR); - } - - /** - * @notice Validates redeem and reverts on rejection. May emit logs. - * @param vToken Asset being redeemed - * @param redeemer The address redeeming the tokens - * @param redeemAmount The amount of the underlying asset being redeemed - * @param redeemTokens The number of tokens being redeemed - */ - function redeemVerify(address vToken, address redeemer, uint redeemAmount, uint redeemTokens) external override { - // Shh - currently unused - vToken; - redeemer; - - // Require tokens is zero or amount is also zero - require(redeemTokens != 0 || redeemAmount == 0, "redeemTokens zero"); - } - - /** - * @notice Checks if the account should be allowed to borrow the underlying asset of the given market - * @param vToken The market to verify the borrow against - * @param borrower The account which would borrow the asset - * @param borrowAmount The amount of underlying the account would borrow - * @return 0 if the borrow is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) - */ - function borrowAllowed( - address vToken, - address borrower, - uint borrowAmount - ) external override onlyProtocolAllowed returns (uint) { - // Pausing is a very serious situation - we revert to sound the alarms - require(!borrowGuardianPaused[vToken], "borrow is paused"); - - if (!markets[vToken].isListed) { - return uint(Error.MARKET_NOT_LISTED); - } - - if (!markets[vToken].accountMembership[borrower]) { - // only vTokens may call borrowAllowed if borrower not in market - require(msg.sender == vToken, "sender must be vToken"); - - // attempt to add borrower to the market - Error err = addToMarketInternal(VToken(vToken), borrower); - if (err != Error.NO_ERROR) { - return uint(err); - } - } - - if (oracle.getUnderlyingPrice(VToken(vToken)) == 0) { - return uint(Error.PRICE_ERROR); - } - - uint borrowCap = borrowCaps[vToken]; - // Borrow cap of 0 corresponds to unlimited borrowing - if (borrowCap != 0) { - uint totalBorrows = VToken(vToken).totalBorrows(); - uint nextTotalBorrows = add_(totalBorrows, borrowAmount); - require(nextTotalBorrows < borrowCap, "market borrow cap reached"); - } - - (Error err, , uint shortfall) = getHypotheticalAccountLiquidityInternal( - borrower, - VToken(vToken), - 0, - borrowAmount - ); - if (err != Error.NO_ERROR) { - return uint(err); - } - if (shortfall != 0) { - return uint(Error.INSUFFICIENT_LIQUIDITY); - } - - // Keep the flywheel moving - Exp memory borrowIndex = Exp({ mantissa: VToken(vToken).borrowIndex() }); - updateVenusBorrowIndex(vToken, borrowIndex); - distributeBorrowerVenus(vToken, borrower, borrowIndex); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Validates borrow and reverts on rejection. May emit logs. - * @param vToken Asset whose underlying is being borrowed - * @param borrower The address borrowing the underlying - * @param borrowAmount The amount of the underlying asset requested to borrow - */ - function borrowVerify(address vToken, address borrower, uint borrowAmount) external override { - // Shh - currently unused - vToken; - borrower; - borrowAmount; - - // Shh - we don't ever want this hook to be marked pure - if (false) { - maxAssets = maxAssets; - } - } - - /** - * @notice Checks if the account should be allowed to repay a borrow in the given market - * @param vToken The market to verify the repay against - * @param payer The account which would repay the asset - * @param borrower The account which would repay the asset - * @param repayAmount The amount of the underlying asset the account would repay - * @return 0 if the repay is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) - */ - function repayBorrowAllowed( - address vToken, - address payer, - address borrower, - uint repayAmount - ) external override onlyProtocolAllowed returns (uint) { - // Shh - currently unused - payer; - borrower; - repayAmount; - - if (!markets[vToken].isListed) { - return uint(Error.MARKET_NOT_LISTED); - } - - // Keep the flywheel moving - Exp memory borrowIndex = Exp({ mantissa: VToken(vToken).borrowIndex() }); - updateVenusBorrowIndex(vToken, borrowIndex); - distributeBorrowerVenus(vToken, borrower, borrowIndex); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Validates repayBorrow and reverts on rejection. May emit logs. - * @param vToken Asset being repaid - * @param payer The address repaying the borrow - * @param borrower The address of the borrower - * @param actualRepayAmount The amount of underlying being repaid - */ - function repayBorrowVerify( - address vToken, - address payer, - address borrower, - uint actualRepayAmount, - uint borrowerIndex - ) external override { - // Shh - currently unused - vToken; - payer; - borrower; - actualRepayAmount; - borrowerIndex; - - // Shh - we don't ever want this hook to be marked pure - if (false) { - maxAssets = maxAssets; - } - } - - /** - * @notice Checks if the liquidation should be allowed to occur - * @param vTokenBorrowed Asset which was borrowed by the borrower - * @param vTokenCollateral Asset which was used as collateral and will be seized - * @param liquidator The address repaying the borrow and seizing the collateral - * @param borrower The address of the borrower - * @param repayAmount The amount of underlying being repaid - */ - function liquidateBorrowAllowed( - address vTokenBorrowed, - address vTokenCollateral, - address liquidator, - address borrower, - uint repayAmount - ) external override onlyProtocolAllowed returns (uint) { - // Shh - currently unused - liquidator; - - if ( - !(markets[vTokenBorrowed].isListed || address(vTokenBorrowed) == address(vaiController)) || - !markets[vTokenCollateral].isListed - ) { - return uint(Error.MARKET_NOT_LISTED); - } - - /* The borrower must have shortfall in order to be liquidatable */ - (Error err, , uint shortfall) = getHypotheticalAccountLiquidityInternal(borrower, VToken(address(0)), 0, 0); - if (err != Error.NO_ERROR) { - return uint(err); - } - if (shortfall == 0) { - return uint(Error.INSUFFICIENT_SHORTFALL); - } - - /* The liquidator may not repay more than what is allowed by the closeFactor */ - uint borrowBalance; - if (address(vTokenBorrowed) != address(vaiController)) { - borrowBalance = VToken(vTokenBorrowed).borrowBalanceStored(borrower); - } else { - borrowBalance = mintedVAIs[borrower]; - } - - uint maxClose = mul_ScalarTruncate(Exp({ mantissa: closeFactorMantissa }), borrowBalance); - if (repayAmount > maxClose) { - return uint(Error.TOO_MUCH_REPAY); - } - - return uint(Error.NO_ERROR); - } - - /** - * @notice Validates liquidateBorrow and reverts on rejection. May emit logs. - * @param vTokenBorrowed Asset which was borrowed by the borrower - * @param vTokenCollateral Asset which was used as collateral and will be seized - * @param liquidator The address repaying the borrow and seizing the collateral - * @param borrower The address of the borrower - * @param actualRepayAmount The amount of underlying being repaid - */ - function liquidateBorrowVerify( - address vTokenBorrowed, - address vTokenCollateral, - address liquidator, - address borrower, - uint actualRepayAmount, - uint seizeTokens - ) external override { - // Shh - currently unused - vTokenBorrowed; - vTokenCollateral; - liquidator; - borrower; - actualRepayAmount; - seizeTokens; - - // Shh - we don't ever want this hook to be marked pure - if (false) { - maxAssets = maxAssets; - } - } - - /** - * @notice Checks if the seizing of assets should be allowed to occur - * @param vTokenCollateral Asset which was used as collateral and will be seized - * @param vTokenBorrowed Asset which was borrowed by the borrower - * @param liquidator The address repaying the borrow and seizing the collateral - * @param borrower The address of the borrower - * @param seizeTokens The number of collateral tokens to seize - */ - function seizeAllowed( - address vTokenCollateral, - address vTokenBorrowed, - address liquidator, - address borrower, - uint seizeTokens - ) external override onlyProtocolAllowed returns (uint) { - // Pausing is a very serious situation - we revert to sound the alarms - require(!seizeGuardianPaused, "seize is paused"); - - // Shh - currently unused - seizeTokens; - - // We've added VAIController as a borrowed token list check for seize - if ( - !markets[vTokenCollateral].isListed || - !(markets[vTokenBorrowed].isListed || address(vTokenBorrowed) == address(vaiController)) - ) { - return uint(Error.MARKET_NOT_LISTED); - } - - if (VToken(vTokenCollateral).comptroller() != VToken(vTokenBorrowed).comptroller()) { - return uint(Error.COMPTROLLER_MISMATCH); - } - - // Keep the flywheel moving - updateVenusSupplyIndex(vTokenCollateral); - distributeSupplierVenus(vTokenCollateral, borrower); - distributeSupplierVenus(vTokenCollateral, liquidator); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Validates seize and reverts on rejection. May emit logs. - * @param vTokenCollateral Asset which was used as collateral and will be seized - * @param vTokenBorrowed Asset which was borrowed by the borrower - * @param liquidator The address repaying the borrow and seizing the collateral - * @param borrower The address of the borrower - * @param seizeTokens The number of collateral tokens to seize - */ - function seizeVerify( - address vTokenCollateral, - address vTokenBorrowed, - address liquidator, - address borrower, - uint seizeTokens - ) external override { - // Shh - currently unused - vTokenCollateral; - vTokenBorrowed; - liquidator; - borrower; - seizeTokens; - - // Shh - we don't ever want this hook to be marked pure - if (false) { - maxAssets = maxAssets; - } - } - - /** - * @notice Checks if the account should be allowed to transfer tokens in the given market - * @param vToken The market to verify the transfer against - * @param src The account which sources the tokens - * @param dst The account which receives the tokens - * @param transferTokens The number of vTokens to transfer - * @return 0 if the transfer is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) - */ - function transferAllowed( - address vToken, - address src, - address dst, - uint transferTokens - ) external override onlyProtocolAllowed returns (uint) { - // Pausing is a very serious situation - we revert to sound the alarms - require(!transferGuardianPaused, "transfer is paused"); - - // Currently the only consideration is whether or not - // the src is allowed to redeem this many tokens - uint allowed = redeemAllowedInternal(vToken, src, transferTokens); - if (allowed != uint(Error.NO_ERROR)) { - return allowed; - } - - // Keep the flywheel moving - updateVenusSupplyIndex(vToken); - distributeSupplierVenus(vToken, src); - distributeSupplierVenus(vToken, dst); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Validates transfer and reverts on rejection. May emit logs. - * @param vToken Asset being transferred - * @param src The account which sources the tokens - * @param dst The account which receives the tokens - * @param transferTokens The number of vTokens to transfer - */ - function transferVerify(address vToken, address src, address dst, uint transferTokens) external override { - // Shh - currently unused - vToken; - src; - dst; - transferTokens; - - // Shh - we don't ever want this hook to be marked pure - if (false) { - maxAssets = maxAssets; - } - } - - /*** Liquidity/Liquidation Calculations ***/ - - /** - * @dev Local vars for avoiding stack-depth limits in calculating account liquidity. - * Note that `vTokenBalance` is the number of vTokens the account owns in the market, - * whereas `borrowBalance` is the amount of underlying that the account has borrowed. - */ - struct AccountLiquidityLocalVars { - uint sumCollateral; - uint sumBorrowPlusEffects; - uint vTokenBalance; - uint borrowBalance; - uint exchangeRateMantissa; - uint oraclePriceMantissa; - Exp collateralFactor; - Exp exchangeRate; - Exp oraclePrice; - Exp tokensToDenom; - } - - /** - * @notice Determine the current account liquidity wrt collateral requirements - * @return (possible error code (semi-opaque), - account liquidity in excess of collateral requirements, - * account shortfall below collateral requirements) - */ - function getAccountLiquidity(address account) public view returns (uint, uint, uint) { - (Error err, uint liquidity, uint shortfall) = getHypotheticalAccountLiquidityInternal( - account, - VToken(address(0)), - 0, - 0 - ); - - return (uint(err), liquidity, shortfall); - } - - /** - * @notice Determine what the account liquidity would be if the given amounts were redeemed/borrowed - * @param vTokenModify The market to hypothetically redeem/borrow in - * @param account The account to determine liquidity for - * @param redeemTokens The number of tokens to hypothetically redeem - * @param borrowAmount The amount of underlying to hypothetically borrow - * @return (possible error code (semi-opaque), - hypothetical account liquidity in excess of collateral requirements, - * hypothetical account shortfall below collateral requirements) - */ - function getHypotheticalAccountLiquidity( - address account, - address vTokenModify, - uint redeemTokens, - uint borrowAmount - ) public view returns (uint, uint, uint) { - (Error err, uint liquidity, uint shortfall) = getHypotheticalAccountLiquidityInternal( - account, - VToken(vTokenModify), - redeemTokens, - borrowAmount - ); - return (uint(err), liquidity, shortfall); - } - - /** - * @notice Determine what the account liquidity would be if the given amounts were redeemed/borrowed - * @param vTokenModify The market to hypothetically redeem/borrow in - * @param account The account to determine liquidity for - * @param redeemTokens The number of tokens to hypothetically redeem - * @param borrowAmount The amount of underlying to hypothetically borrow - * @dev Note that we calculate the exchangeRateStored for each collateral vToken using stored data, - * without calculating accumulated interest. - * @return (possible error code, - hypothetical account liquidity in excess of collateral requirements, - * hypothetical account shortfall below collateral requirements) - */ - function getHypotheticalAccountLiquidityInternal( - address account, - VToken vTokenModify, - uint redeemTokens, - uint borrowAmount - ) internal view returns (Error, uint, uint) { - AccountLiquidityLocalVars memory vars; // Holds all our calculation results - uint oErr; - - // For each asset the account is in - VToken[] memory assets = accountAssets[account]; - for (uint i = 0; i < assets.length; i++) { - VToken asset = assets[i]; - - // Read the balances and exchange rate from the vToken - (oErr, vars.vTokenBalance, vars.borrowBalance, vars.exchangeRateMantissa) = asset.getAccountSnapshot( - account - ); - if (oErr != 0) { - // semi-opaque error code, we assume NO_ERROR == 0 is invariant between upgrades - return (Error.SNAPSHOT_ERROR, 0, 0); - } - vars.collateralFactor = Exp({ mantissa: markets[address(asset)].collateralFactorMantissa }); - vars.exchangeRate = Exp({ mantissa: vars.exchangeRateMantissa }); - - // Get the normalized price of the asset - vars.oraclePriceMantissa = oracle.getUnderlyingPrice(asset); - if (vars.oraclePriceMantissa == 0) { - return (Error.PRICE_ERROR, 0, 0); - } - vars.oraclePrice = Exp({ mantissa: vars.oraclePriceMantissa }); - - // Pre-compute a conversion factor from tokens -> bnb (normalized price value) - vars.tokensToDenom = mul_(mul_(vars.collateralFactor, vars.exchangeRate), vars.oraclePrice); - - // sumCollateral += tokensToDenom * vTokenBalance - vars.sumCollateral = mul_ScalarTruncateAddUInt(vars.tokensToDenom, vars.vTokenBalance, vars.sumCollateral); - - // sumBorrowPlusEffects += oraclePrice * borrowBalance - vars.sumBorrowPlusEffects = mul_ScalarTruncateAddUInt( - vars.oraclePrice, - vars.borrowBalance, - vars.sumBorrowPlusEffects - ); - - // Calculate effects of interacting with vTokenModify - if (asset == vTokenModify) { - // redeem effect - // sumBorrowPlusEffects += tokensToDenom * redeemTokens - vars.sumBorrowPlusEffects = mul_ScalarTruncateAddUInt( - vars.tokensToDenom, - redeemTokens, - vars.sumBorrowPlusEffects - ); - - // borrow effect - // sumBorrowPlusEffects += oraclePrice * borrowAmount - vars.sumBorrowPlusEffects = mul_ScalarTruncateAddUInt( - vars.oraclePrice, - borrowAmount, - vars.sumBorrowPlusEffects - ); - } - } - - vars.sumBorrowPlusEffects = add_(vars.sumBorrowPlusEffects, mintedVAIs[account]); - - // These are safe, as the underflow condition is checked first - if (vars.sumCollateral > vars.sumBorrowPlusEffects) { - return (Error.NO_ERROR, vars.sumCollateral - vars.sumBorrowPlusEffects, 0); - } else { - return (Error.NO_ERROR, 0, vars.sumBorrowPlusEffects - vars.sumCollateral); - } - } - - /** - * @notice Calculate number of tokens of collateral asset to seize given an underlying amount - * @dev Used in liquidation (called in vToken.liquidateBorrowFresh) - * @param vTokenBorrowed The address of the borrowed vToken - * @param vTokenCollateral The address of the collateral vToken - * @param actualRepayAmount The amount of vTokenBorrowed underlying to convert into vTokenCollateral tokens - * @return (errorCode, number of vTokenCollateral tokens to be seized in a liquidation) - */ - function liquidateCalculateSeizeTokens( - address vTokenBorrowed, - address vTokenCollateral, - uint actualRepayAmount - ) external view override returns (uint, uint) { - /* Read oracle prices for borrowed and collateral markets */ - uint priceBorrowedMantissa = oracle.getUnderlyingPrice(VToken(vTokenBorrowed)); - uint priceCollateralMantissa = oracle.getUnderlyingPrice(VToken(vTokenCollateral)); - if (priceBorrowedMantissa == 0 || priceCollateralMantissa == 0) { - return (uint(Error.PRICE_ERROR), 0); - } - - /* - * Get the exchange rate and calculate the number of collateral tokens to seize: - * seizeAmount = actualRepayAmount * liquidationIncentive * priceBorrowed / priceCollateral - * seizeTokens = seizeAmount / exchangeRate - * = actualRepayAmount * (liquidationIncentive * priceBorrowed) / (priceCollateral * exchangeRate) - */ - uint exchangeRateMantissa = VToken(vTokenCollateral).exchangeRateStored(); // Note: reverts on error - uint seizeTokens; - Exp memory numerator; - Exp memory denominator; - Exp memory ratio; - - numerator = mul_(Exp({ mantissa: liquidationIncentiveMantissa }), Exp({ mantissa: priceBorrowedMantissa })); - denominator = mul_(Exp({ mantissa: priceCollateralMantissa }), Exp({ mantissa: exchangeRateMantissa })); - ratio = div_(numerator, denominator); - - seizeTokens = mul_ScalarTruncate(ratio, actualRepayAmount); - - return (uint(Error.NO_ERROR), seizeTokens); - } - - /** - * @notice Calculate number of tokens of collateral asset to seize given an underlying amount - * @dev Used in liquidation (called in vToken.liquidateBorrowFresh) - * @param vTokenCollateral The address of the collateral vToken - * @param actualRepayAmount The amount of vTokenBorrowed underlying to convert into vTokenCollateral tokens - * @return (errorCode, number of vTokenCollateral tokens to be seized in a liquidation) - */ - function liquidateVAICalculateSeizeTokens( - address vTokenCollateral, - uint actualRepayAmount - ) external view override returns (uint, uint) { - /* Read oracle prices for borrowed and collateral markets */ - uint priceBorrowedMantissa = 1e18; // Note: this is VAI - uint priceCollateralMantissa = oracle.getUnderlyingPrice(VToken(vTokenCollateral)); - if (priceCollateralMantissa == 0) { - return (uint(Error.PRICE_ERROR), 0); - } - - /* - * Get the exchange rate and calculate the number of collateral tokens to seize: - * seizeAmount = actualRepayAmount * liquidationIncentive * priceBorrowed / priceCollateral - * seizeTokens = seizeAmount / exchangeRate - * = actualRepayAmount * (liquidationIncentive * priceBorrowed) / (priceCollateral * exchangeRate) - */ - uint exchangeRateMantissa = VToken(vTokenCollateral).exchangeRateStored(); // Note: reverts on error - uint seizeTokens; - Exp memory numerator; - Exp memory denominator; - Exp memory ratio; - - numerator = mul_(Exp({ mantissa: liquidationIncentiveMantissa }), Exp({ mantissa: priceBorrowedMantissa })); - denominator = mul_(Exp({ mantissa: priceCollateralMantissa }), Exp({ mantissa: exchangeRateMantissa })); - ratio = div_(numerator, denominator); - - seizeTokens = mul_ScalarTruncate(ratio, actualRepayAmount); - - return (uint(Error.NO_ERROR), seizeTokens); - } - - /*** Admin Functions ***/ - - /** - * @notice Sets a new price oracle for the comptroller - * @dev Admin function to set a new price oracle - * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) - */ - function _setPriceOracle(PriceOracle newOracle) public returns (uint) { - // Check caller is admin - if (msg.sender != admin) { - return fail(Error.UNAUTHORIZED, FailureInfo.SET_PRICE_ORACLE_OWNER_CHECK); - } - - // Track the old oracle for the comptroller - PriceOracle oldOracle = oracle; - - // Set comptroller's oracle to newOracle - oracle = newOracle; - - // Emit NewPriceOracle(oldOracle, newOracle) - emit NewPriceOracle(oldOracle, newOracle); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Sets the closeFactor used when liquidating borrows - * @dev Admin function to set closeFactor - * @param newCloseFactorMantissa New close factor, scaled by 1e18 - * @return uint 0=success, otherwise a failure - */ - function _setCloseFactor(uint newCloseFactorMantissa) external returns (uint) { - // Check caller is admin - require(msg.sender == admin, "only admin can set close factor"); - - uint oldCloseFactorMantissa = closeFactorMantissa; - closeFactorMantissa = newCloseFactorMantissa; - emit NewCloseFactor(oldCloseFactorMantissa, newCloseFactorMantissa); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Sets the collateralFactor for a market - * @dev Admin function to set per-market collateralFactor - * @param vToken The market to set the factor on - * @param newCollateralFactorMantissa The new collateral factor, scaled by 1e18 - * @return uint 0=success, otherwise a failure. (See ErrorReporter for details) - */ - function _setCollateralFactor(VToken vToken, uint newCollateralFactorMantissa) external returns (uint) { - // Check caller is admin - if (msg.sender != admin) { - return fail(Error.UNAUTHORIZED, FailureInfo.SET_COLLATERAL_FACTOR_OWNER_CHECK); - } - - // Verify market is listed - Market storage market = markets[address(vToken)]; - if (!market.isListed) { - return fail(Error.MARKET_NOT_LISTED, FailureInfo.SET_COLLATERAL_FACTOR_NO_EXISTS); - } - - Exp memory newCollateralFactorExp = Exp({ mantissa: newCollateralFactorMantissa }); - - // Check collateral factor <= 0.9 - Exp memory highLimit = Exp({ mantissa: collateralFactorMaxMantissa }); - if (lessThanExp(highLimit, newCollateralFactorExp)) { - return fail(Error.INVALID_COLLATERAL_FACTOR, FailureInfo.SET_COLLATERAL_FACTOR_VALIDATION); - } - - // If collateral factor != 0, fail if price == 0 - if (newCollateralFactorMantissa != 0 && oracle.getUnderlyingPrice(vToken) == 0) { - return fail(Error.PRICE_ERROR, FailureInfo.SET_COLLATERAL_FACTOR_WITHOUT_PRICE); - } - - // Set market's collateral factor to new collateral factor, remember old value - uint oldCollateralFactorMantissa = market.collateralFactorMantissa; - market.collateralFactorMantissa = newCollateralFactorMantissa; - - // Emit event with asset, old collateral factor, and new collateral factor - emit NewCollateralFactor(vToken, oldCollateralFactorMantissa, newCollateralFactorMantissa); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Sets liquidationIncentive - * @dev Admin function to set liquidationIncentive - * @param newLiquidationIncentiveMantissa New liquidationIncentive scaled by 1e18 - * @return uint 0=success, otherwise a failure. (See ErrorReporter for details) - */ - function _setLiquidationIncentive(uint newLiquidationIncentiveMantissa) external returns (uint) { - // Check caller is admin - if (msg.sender != admin) { - return fail(Error.UNAUTHORIZED, FailureInfo.SET_LIQUIDATION_INCENTIVE_OWNER_CHECK); - } - - // Save current value for use in log - uint oldLiquidationIncentiveMantissa = liquidationIncentiveMantissa; - - // Set liquidation incentive to new incentive - liquidationIncentiveMantissa = newLiquidationIncentiveMantissa; - - // Emit event with old incentive, new incentive - emit NewLiquidationIncentive(oldLiquidationIncentiveMantissa, newLiquidationIncentiveMantissa); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Add the market to the markets mapping and set it as listed - * @dev Admin function to set isListed and add support for the market - * @param vToken The address of the market (token) to list - * @return uint 0=success, otherwise a failure. (See enum Error for details) - */ - function _supportMarket(VToken vToken) external returns (uint) { - if (msg.sender != admin) { - return fail(Error.UNAUTHORIZED, FailureInfo.SUPPORT_MARKET_OWNER_CHECK); - } - - if (markets[address(vToken)].isListed) { - return fail(Error.MARKET_ALREADY_LISTED, FailureInfo.SUPPORT_MARKET_EXISTS); - } - - vToken.isVToken(); // Sanity check to make sure its really a VToken - - // Note that isVenus is not in active use anymore - Market storage newMarket = markets[address(vToken)]; - newMarket.isListed = true; - newMarket.isVenus = false; - newMarket.collateralFactorMantissa = 0; - _addMarketInternal(vToken); - - emit MarketListed(vToken); - - return uint(Error.NO_ERROR); - } - - function _addMarketInternal(VToken vToken) internal { - for (uint i = 0; i < allMarkets.length; i++) { - require(allMarkets[i] != vToken, "market already added"); - } - allMarkets.push(vToken); - } - - /** - * @notice Admin function to change the Pause Guardian - * @param newPauseGuardian The address of the new Pause Guardian - * @return uint 0=success, otherwise a failure. (See enum Error for details) - */ - function _setPauseGuardian(address newPauseGuardian) public returns (uint) { - if (msg.sender != admin) { - return fail(Error.UNAUTHORIZED, FailureInfo.SET_PAUSE_GUARDIAN_OWNER_CHECK); - } - - // Save current value for inclusion in log - address oldPauseGuardian = pauseGuardian; - - // Store pauseGuardian with value newPauseGuardian - pauseGuardian = newPauseGuardian; - - // Emit NewPauseGuardian(OldPauseGuardian, NewPauseGuardian) - emit NewPauseGuardian(oldPauseGuardian, newPauseGuardian); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Set the given borrow caps for the given vToken markets. Borrowing that brings total borrows to or above borrow cap will revert. - * @dev Admin or borrowCapGuardian function to set the borrow caps. A borrow cap of 0 corresponds to unlimited borrowing. - * @param vTokens The addresses of the markets (tokens) to change the borrow caps for - * @param newBorrowCaps The new borrow cap values in underlying to be set. A value of 0 corresponds to unlimited borrowing. - */ - function _setMarketBorrowCaps(VToken[] calldata vTokens, uint[] calldata newBorrowCaps) external { - require( - msg.sender == admin || msg.sender == borrowCapGuardian, - "only admin or borrow cap guardian can set borrow caps" - ); - - uint numMarkets = vTokens.length; - uint numBorrowCaps = newBorrowCaps.length; - - require(numMarkets != 0 && numMarkets == numBorrowCaps, "invalid input"); - - for (uint i = 0; i < numMarkets; i++) { - borrowCaps[address(vTokens[i])] = newBorrowCaps[i]; - emit NewBorrowCap(vTokens[i], newBorrowCaps[i]); - } - } - - /** - * @notice Admin function to change the Borrow Cap Guardian - * @param newBorrowCapGuardian The address of the new Borrow Cap Guardian - */ - function _setBorrowCapGuardian(address newBorrowCapGuardian) external onlyAdmin { - // Save current value for inclusion in log - address oldBorrowCapGuardian = borrowCapGuardian; - - // Store borrowCapGuardian with value newBorrowCapGuardian - borrowCapGuardian = newBorrowCapGuardian; - - // Emit NewBorrowCapGuardian(OldBorrowCapGuardian, NewBorrowCapGuardian) - emit NewBorrowCapGuardian(oldBorrowCapGuardian, newBorrowCapGuardian); - } - - /** - * @notice Set whole protocol pause/unpause state - */ - function _setProtocolPaused(bool state) public validPauseState(state) returns (bool) { - protocolPaused = state; - emit ActionProtocolPaused(state); - return state; - } - - /** - * @notice Sets a new VAI controller - * @dev Admin function to set a new VAI controller - * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) - */ - function _setVAIController(VAIControllerInterface vaiController_) external returns (uint) { - // Check caller is admin - if (msg.sender != admin) { - return fail(Error.UNAUTHORIZED, FailureInfo.SET_VAICONTROLLER_OWNER_CHECK); - } - - VAIControllerInterface oldRate = vaiController; - vaiController = vaiController_; - emit NewVAIController(oldRate, vaiController_); - } - - function _setVAIMintRate(uint newVAIMintRate) external returns (uint) { - // Check caller is admin - if (msg.sender != admin) { - return fail(Error.UNAUTHORIZED, FailureInfo.SET_VAI_MINT_RATE_CHECK); - } - - uint oldVAIMintRate = vaiMintRate; - vaiMintRate = newVAIMintRate; - emit NewVAIMintRate(oldVAIMintRate, newVAIMintRate); - - return uint(Error.NO_ERROR); - } - - function _setTreasuryData( - address newTreasuryGuardian, - address newTreasuryAddress, - uint newTreasuryPercent - ) external returns (uint) { - // Check caller is admin - if (!(msg.sender == admin || msg.sender == treasuryGuardian)) { - return fail(Error.UNAUTHORIZED, FailureInfo.SET_TREASURY_OWNER_CHECK); - } - - require(newTreasuryPercent < 1e18, "treasury percent cap overflow"); - - address oldTreasuryGuardian = treasuryGuardian; - address oldTreasuryAddress = treasuryAddress; - uint oldTreasuryPercent = treasuryPercent; - - treasuryGuardian = newTreasuryGuardian; - treasuryAddress = newTreasuryAddress; - treasuryPercent = newTreasuryPercent; - - emit NewTreasuryGuardian(oldTreasuryGuardian, newTreasuryGuardian); - emit NewTreasuryAddress(oldTreasuryAddress, newTreasuryAddress); - emit NewTreasuryPercent(oldTreasuryPercent, newTreasuryPercent); - - return uint(Error.NO_ERROR); - } - - function _become(Unitroller unitroller) public { - require(msg.sender == unitroller.admin(), "only unitroller admin can"); - require(unitroller._acceptImplementation() == 0, "not authorized"); - } - - /** - * @notice Checks caller is admin, or this contract is becoming the new implementation - */ - function adminOrInitializing() internal view returns (bool) { - return msg.sender == admin || msg.sender == comptrollerImplementation; - } - - /*** Venus Distribution ***/ - - function setVenusSpeedInternal(VToken vToken, uint venusSpeed) internal { - uint currentVenusSpeed = venusSpeeds[address(vToken)]; - if (currentVenusSpeed != 0) { - // note that XVS speed could be set to 0 to halt liquidity rewards for a market - Exp memory borrowIndex = Exp({ mantissa: vToken.borrowIndex() }); - updateVenusSupplyIndex(address(vToken)); - updateVenusBorrowIndex(address(vToken), borrowIndex); - } else if (venusSpeed != 0) { - // Add the XVS market - Market storage market = markets[address(vToken)]; - require(market.isListed == true, "venus market is not listed"); - - if (venusSupplyState[address(vToken)].index == 0 && venusSupplyState[address(vToken)].block == 0) { - venusSupplyState[address(vToken)] = VenusMarketState({ - index: venusInitialIndex, - block: safe32(getBlockNumber(), "block number exceeds 32 bits") - }); - } - - if (venusBorrowState[address(vToken)].index == 0 && venusBorrowState[address(vToken)].block == 0) { - venusBorrowState[address(vToken)] = VenusMarketState({ - index: venusInitialIndex, - block: safe32(getBlockNumber(), "block number exceeds 32 bits") - }); - } - } - - if (currentVenusSpeed != venusSpeed) { - venusSpeeds[address(vToken)] = venusSpeed; - emit VenusSpeedUpdated(vToken, venusSpeed); - } - } - - /** - * @notice Accrue XVS to the market by updating the supply index - * @param vToken The market whose supply index to update - */ - function updateVenusSupplyIndex(address vToken) internal { - VenusMarketState storage supplyState = venusSupplyState[vToken]; - uint supplySpeed = venusSpeeds[vToken]; - uint blockNumber = getBlockNumber(); - uint deltaBlocks = sub_(blockNumber, uint(supplyState.block)); - if (deltaBlocks > 0 && supplySpeed > 0) { - uint supplyTokens = VToken(vToken).totalSupply(); - uint venusAccrued = mul_(deltaBlocks, supplySpeed); - Double memory ratio = supplyTokens > 0 ? fraction(venusAccrued, supplyTokens) : Double({ mantissa: 0 }); - Double memory index = add_(Double({ mantissa: supplyState.index }), ratio); - venusSupplyState[vToken] = VenusMarketState({ - index: safe224(index.mantissa, "new index overflows"), - block: safe32(blockNumber, "block number overflows") - }); - } else if (deltaBlocks > 0) { - supplyState.block = safe32(blockNumber, "block number overflows"); - } - } - - /** - * @notice Accrue XVS to the market by updating the borrow index - * @param vToken The market whose borrow index to update - */ - function updateVenusBorrowIndex(address vToken, Exp memory marketBorrowIndex) internal { - VenusMarketState storage borrowState = venusBorrowState[vToken]; - uint borrowSpeed = venusSpeeds[vToken]; - uint blockNumber = getBlockNumber(); - uint deltaBlocks = sub_(blockNumber, uint(borrowState.block)); - if (deltaBlocks > 0 && borrowSpeed > 0) { - uint borrowAmount = div_(VToken(vToken).totalBorrows(), marketBorrowIndex); - uint venusAccrued = mul_(deltaBlocks, borrowSpeed); - Double memory ratio = borrowAmount > 0 ? fraction(venusAccrued, borrowAmount) : Double({ mantissa: 0 }); - Double memory index = add_(Double({ mantissa: borrowState.index }), ratio); - venusBorrowState[vToken] = VenusMarketState({ - index: safe224(index.mantissa, "new index overflows"), - block: safe32(blockNumber, "block number overflows") - }); - } else if (deltaBlocks > 0) { - borrowState.block = safe32(blockNumber, "block number overflows"); - } - } - - /** - * @notice Calculate XVS accrued by a supplier and possibly transfer it to them - * @param vToken The market in which the supplier is interacting - * @param supplier The address of the supplier to distribute XVS to - */ - function distributeSupplierVenus(address vToken, address supplier) internal { - if (address(vaiVaultAddress) != address(0)) { - releaseToVault(); - } - - VenusMarketState storage supplyState = venusSupplyState[vToken]; - Double memory supplyIndex = Double({ mantissa: supplyState.index }); - Double memory supplierIndex = Double({ mantissa: venusSupplierIndex[vToken][supplier] }); - venusSupplierIndex[vToken][supplier] = supplyIndex.mantissa; - - if (supplierIndex.mantissa == 0 && supplyIndex.mantissa > 0) { - supplierIndex.mantissa = venusInitialIndex; - } - - Double memory deltaIndex = sub_(supplyIndex, supplierIndex); - uint supplierTokens = VToken(vToken).balanceOf(supplier); - uint supplierDelta = mul_(supplierTokens, deltaIndex); - uint supplierAccrued = add_(venusAccrued[supplier], supplierDelta); - venusAccrued[supplier] = supplierAccrued; - emit DistributedSupplierVenus(VToken(vToken), supplier, supplierDelta, supplyIndex.mantissa); - } - - /** - * @notice Calculate XVS accrued by a borrower and possibly transfer it to them - * @dev Borrowers will not begin to accrue until after the first interaction with the protocol. - * @param vToken The market in which the borrower is interacting - * @param borrower The address of the borrower to distribute XVS to - */ - function distributeBorrowerVenus(address vToken, address borrower, Exp memory marketBorrowIndex) internal { - if (address(vaiVaultAddress) != address(0)) { - releaseToVault(); - } - - VenusMarketState storage borrowState = venusBorrowState[vToken]; - Double memory borrowIndex = Double({ mantissa: borrowState.index }); - Double memory borrowerIndex = Double({ mantissa: venusBorrowerIndex[vToken][borrower] }); - venusBorrowerIndex[vToken][borrower] = borrowIndex.mantissa; - - if (borrowerIndex.mantissa > 0) { - Double memory deltaIndex = sub_(borrowIndex, borrowerIndex); - uint borrowerAmount = div_(VToken(vToken).borrowBalanceStored(borrower), marketBorrowIndex); - uint borrowerDelta = mul_(borrowerAmount, deltaIndex); - uint borrowerAccrued = add_(venusAccrued[borrower], borrowerDelta); - venusAccrued[borrower] = borrowerAccrued; - emit DistributedBorrowerVenus(VToken(vToken), borrower, borrowerDelta, borrowIndex.mantissa); - } - } - - /** - * @notice Calculate XVS accrued by a VAI minter and possibly transfer it to them - * @dev VAI minters will not begin to accrue until after the first interaction with the protocol. - * @param vaiMinter The address of the VAI minter to distribute XVS to - */ - function distributeVAIMinterVenus(address vaiMinter) public { - if (address(vaiVaultAddress) != address(0)) { - releaseToVault(); - } - - if (address(vaiController) != address(0)) { - uint vaiMinterAccrued; - uint vaiMinterDelta; - uint vaiMintIndexMantissa; - uint err; - (err, vaiMinterAccrued, vaiMinterDelta, vaiMintIndexMantissa) = vaiController.calcDistributeVAIMinterVenus( - vaiMinter - ); - if (err == uint(Error.NO_ERROR)) { - venusAccrued[vaiMinter] = vaiMinterAccrued; - emit DistributedVAIMinterVenus(vaiMinter, vaiMinterDelta, vaiMintIndexMantissa); - } - } - } - - /** - * @notice Claim all the xvs accrued by holder in all markets and VAI - * @param holder The address to claim XVS for - */ - function claimVenus(address holder) public { - return claimVenus(holder, allMarkets); - } - - /** - * @notice Claim all the xvs accrued by holder in the specified markets - * @param holder The address to claim XVS for - * @param vTokens The list of markets to claim XVS in - */ - function claimVenus(address holder, VToken[] memory vTokens) public { - address[] memory holders = new address[](1); - holders[0] = holder; - claimVenus(holders, vTokens, true, true); - } - - /** - * @notice Claim all xvs accrued by the holders - * @param holders The addresses to claim XVS for - * @param vTokens The list of markets to claim XVS in - * @param borrowers Whether or not to claim XVS earned by borrowing - * @param suppliers Whether or not to claim XVS earned by supplying - */ - function claimVenus(address[] memory holders, VToken[] memory vTokens, bool borrowers, bool suppliers) public { - uint j; - if (address(vaiController) != address(0)) { - vaiController.updateVenusVAIMintIndex(); - } - for (j = 0; j < holders.length; j++) { - distributeVAIMinterVenus(holders[j]); - venusAccrued[holders[j]] = grantXVSInternal(holders[j], venusAccrued[holders[j]]); - } - for (uint i = 0; i < vTokens.length; i++) { - VToken vToken = vTokens[i]; - require(markets[address(vToken)].isListed, "not listed market"); - if (borrowers) { - Exp memory borrowIndex = Exp({ mantissa: vToken.borrowIndex() }); - updateVenusBorrowIndex(address(vToken), borrowIndex); - for (j = 0; j < holders.length; j++) { - distributeBorrowerVenus(address(vToken), holders[j], borrowIndex); - venusAccrued[holders[j]] = grantXVSInternal(holders[j], venusAccrued[holders[j]]); - } - } - if (suppliers) { - updateVenusSupplyIndex(address(vToken)); - for (j = 0; j < holders.length; j++) { - distributeSupplierVenus(address(vToken), holders[j]); - venusAccrued[holders[j]] = grantXVSInternal(holders[j], venusAccrued[holders[j]]); - } - } - } - } - - /** - * @notice Transfer XVS to the user - * @dev Note: If there is not enough XVS, we do not perform the transfer all. - * @param user The address of the user to transfer XVS to - * @param amount The amount of XVS to (possibly) transfer - * @return The amount of XVS which was NOT transferred to the user - */ - function grantXVSInternal(address user, uint amount) internal returns (uint) { - XVS xvs = XVS(getXVSAddress()); - uint venusRemaining = xvs.balanceOf(address(this)); - if (amount > 0 && amount <= venusRemaining) { - xvs.transfer(user, amount); - return 0; - } - return amount; - } - - /*** Venus Distribution Admin ***/ - - /** - * @notice Set the amount of XVS distributed per block to VAI Vault - * @param venusVAIVaultRate_ The amount of XVS wei per block to distribute to VAI Vault - */ - function _setVenusVAIVaultRate(uint venusVAIVaultRate_) public onlyAdmin { - uint oldVenusVAIVaultRate = venusVAIVaultRate; - venusVAIVaultRate = venusVAIVaultRate_; - emit NewVenusVAIVaultRate(oldVenusVAIVaultRate, venusVAIVaultRate_); - } - - /** - * @notice Set the VAI Vault infos - * @param vault_ The address of the VAI Vault - * @param releaseStartBlock_ The start block of release to VAI Vault - * @param minReleaseAmount_ The minimum release amount to VAI Vault - */ - function _setVAIVaultInfo(address vault_, uint256 releaseStartBlock_, uint256 minReleaseAmount_) public onlyAdmin { - vaiVaultAddress = vault_; - releaseStartBlock = releaseStartBlock_; - minReleaseAmount = minReleaseAmount_; - emit NewVAIVaultInfo(vault_, releaseStartBlock_, minReleaseAmount_); - } - - /** - * @notice Set XVS speed for a single market - * @param vToken The market whose XVS speed to update - * @param venusSpeed New XVS speed for market - */ - function _setVenusSpeed(VToken vToken, uint venusSpeed) public { - require(adminOrInitializing(), "only admin can set venus speed"); - setVenusSpeedInternal(vToken, venusSpeed); - } - - /** - * @notice Return all of the markets - * @dev The automatic getter may be used to access an individual market. - * @return The list of market addresses - */ - function getAllMarkets() public view returns (VToken[] memory) { - return allMarkets; - } - - function getBlockNumber() public view returns (uint) { - return block.number; - } - - /** - * @notice Return the address of the XVS token - * @return The address of XVS - */ - function getXVSAddress() public view returns (address) { - return 0xcF6BB5389c92Bdda8a3747Ddb454cB7a64626C63; - } - - /*** VAI functions ***/ - - /** - * @notice Set the minted VAI amount of the `owner` - * @param owner The address of the account to set - * @param amount The amount of VAI to set to the account - * @return The number of minted VAI by `owner` - */ - function setMintedVAIOf(address owner, uint amount) external override onlyProtocolAllowed returns (uint) { - // Pausing is a very serious situation - we revert to sound the alarms - require(!mintVAIGuardianPaused && !repayVAIGuardianPaused, "VAI is paused"); - // Check caller is vaiController - if (msg.sender != address(vaiController)) { - return fail(Error.REJECTION, FailureInfo.SET_MINTED_VAI_REJECTION); - } - mintedVAIs[owner] = amount; - - return uint(Error.NO_ERROR); - } - - /** - * @notice Transfer XVS to VAI Vault - */ - function releaseToVault() public { - if (releaseStartBlock == 0 || getBlockNumber() < releaseStartBlock) { - return; - } - - XVS xvs = XVS(getXVSAddress()); - - uint256 xvsBalance = xvs.balanceOf(address(this)); - if (xvsBalance == 0) { - return; - } - - uint256 actualAmount; - uint256 deltaBlocks = sub_(getBlockNumber(), releaseStartBlock); - // releaseAmount = venusVAIVaultRate * deltaBlocks - uint256 _releaseAmount = mul_(venusVAIVaultRate, deltaBlocks); - - if (_releaseAmount < minReleaseAmount) { - return; - } - - if (xvsBalance >= _releaseAmount) { - actualAmount = _releaseAmount; - } else { - actualAmount = xvsBalance; - } - - releaseStartBlock = getBlockNumber(); - - xvs.transfer(vaiVaultAddress, actualAmount); - emit DistributedVAIVaultVenus(actualAmount); - - IVAIVault(vaiVaultAddress).updatePendingRewards(); - } -} diff --git a/contracts/Comptroller/ComptrollerG5.sol b/contracts/Comptroller/ComptrollerG5.sol deleted file mode 100644 index c93a4c013..000000000 --- a/contracts/Comptroller/ComptrollerG5.sol +++ /dev/null @@ -1,1587 +0,0 @@ -pragma solidity 0.8.13; - -import "../Oracle/PriceOracle.sol"; -import "../Tokens/VTokens/VToken.sol"; -import "../Utils/ErrorReporter.sol"; -import "../Tokens/XVS/XVS.sol"; -import "../Tokens/VAI/VAI.sol"; -import "./ComptrollerInterface.sol"; -import "./ComptrollerStorage.sol"; -import "./Unitroller.sol"; - -/** - * @title Venus's Comptroller Contract - * @author Venus - */ -contract ComptrollerG5 is ComptrollerV5Storage, ComptrollerInterfaceG2, ComptrollerErrorReporter, ExponentialNoError { - /// @notice Emitted when an admin supports a market - event MarketListed(VToken vToken); - - /// @notice Emitted when an account enters a market - event MarketEntered(VToken vToken, address account); - - /// @notice Emitted when an account exits a market - event MarketExited(VToken vToken, address account); - - /// @notice Emitted when close factor is changed by admin - event NewCloseFactor(uint oldCloseFactorMantissa, uint newCloseFactorMantissa); - - /// @notice Emitted when a collateral factor is changed by admin - event NewCollateralFactor(VToken vToken, uint oldCollateralFactorMantissa, uint newCollateralFactorMantissa); - - /// @notice Emitted when liquidation incentive is changed by admin - event NewLiquidationIncentive(uint oldLiquidationIncentiveMantissa, uint newLiquidationIncentiveMantissa); - - /// @notice Emitted when price oracle is changed - event NewPriceOracle(PriceOracle oldPriceOracle, PriceOracle newPriceOracle); - - /// @notice Emitted when VAI Vault info is changed - event NewVAIVaultInfo(address vault_, uint releaseStartBlock_, uint releaseInterval_); - - /// @notice Emitted when pause guardian is changed - event NewPauseGuardian(address oldPauseGuardian, address newPauseGuardian); - - /// @notice Emitted when an action is paused globally - event ActionPaused(string action, bool pauseState); - - /// @notice Emitted when an action is paused on a market - event ActionPaused(VToken vToken, string action, bool pauseState); - - /// @notice Emitted when Venus VAI Vault rate is changed - event NewVenusVAIVaultRate(uint oldVenusVAIVaultRate, uint newVenusVAIVaultRate); - - /// @notice Emitted when a new Venus speed is calculated for a market - event VenusSpeedUpdated(VToken indexed vToken, uint newSpeed); - - /// @notice Emitted when XVS is distributed to a supplier - event DistributedSupplierVenus( - VToken indexed vToken, - address indexed supplier, - uint venusDelta, - uint venusSupplyIndex - ); - - /// @notice Emitted when XVS is distributed to a borrower - event DistributedBorrowerVenus( - VToken indexed vToken, - address indexed borrower, - uint venusDelta, - uint venusBorrowIndex - ); - - /// @notice Emitted when XVS is distributed to a VAI minter - event DistributedVAIMinterVenus(address indexed vaiMinter, uint venusDelta, uint venusVAIMintIndex); - - /// @notice Emitted when XVS is distributed to VAI Vault - event DistributedVAIVaultVenus(uint amount); - - /// @notice Emitted when VAIController is changed - event NewVAIController(VAIControllerInterface oldVAIController, VAIControllerInterface newVAIController); - - /// @notice Emitted when VAI mint rate is changed by admin - event NewVAIMintRate(uint oldVAIMintRate, uint newVAIMintRate); - - /// @notice Emitted when protocol state is changed by admin - event ActionProtocolPaused(bool state); - - /// @notice Emitted when borrow cap for a vToken is changed - event NewBorrowCap(VToken indexed vToken, uint newBorrowCap); - - /// @notice Emitted when borrow cap guardian is changed - event NewBorrowCapGuardian(address oldBorrowCapGuardian, address newBorrowCapGuardian); - - /// @notice Emitted when treasury guardian is changed - event NewTreasuryGuardian(address oldTreasuryGuardian, address newTreasuryGuardian); - - /// @notice Emitted when treasury address is changed - event NewTreasuryAddress(address oldTreasuryAddress, address newTreasuryAddress); - - /// @notice Emitted when treasury percent is changed - event NewTreasuryPercent(uint oldTreasuryPercent, uint newTreasuryPercent); - - /// @notice Emitted when Venus is granted by admin - event VenusGranted(address recipient, uint amount); - - /// @notice The initial Venus index for a market - uint224 public constant venusInitialIndex = 1e36; - - // closeFactorMantissa must be strictly greater than this value - uint internal constant closeFactorMinMantissa = 0.05e18; // 0.05 - - // closeFactorMantissa must not exceed this value - uint internal constant closeFactorMaxMantissa = 0.9e18; // 0.9 - - // No collateralFactorMantissa may exceed this value - uint internal constant collateralFactorMaxMantissa = 0.9e18; // 0.9 - - constructor() public { - admin = msg.sender; - } - - modifier onlyProtocolAllowed() { - require(!protocolPaused, "protocol is paused"); - _; - } - - modifier onlyAdmin() { - require(msg.sender == admin, "only admin can"); - _; - } - - modifier onlyListedMarket(VToken vToken) { - require(markets[address(vToken)].isListed, "venus market is not listed"); - _; - } - - modifier validPauseState(bool state) { - require(msg.sender == pauseGuardian || msg.sender == admin, "only pause guardian and admin can"); - require(msg.sender == admin || state == true, "only admin can unpause"); - _; - } - - /*** Assets You Are In ***/ - - /** - * @notice Returns the assets an account has entered - * @param account The address of the account to pull assets for - * @return A dynamic list with the assets the account has entered - */ - function getAssetsIn(address account) external view returns (VToken[] memory) { - return accountAssets[account]; - } - - /** - * @notice Returns whether the given account is entered in the given asset - * @param account The address of the account to check - * @param vToken The vToken to check - * @return True if the account is in the asset, otherwise false. - */ - function checkMembership(address account, VToken vToken) external view returns (bool) { - return markets[address(vToken)].accountMembership[account]; - } - - /** - * @notice Add assets to be included in account liquidity calculation - * @param vTokens The list of addresses of the vToken markets to be enabled - * @return Success indicator for whether each corresponding market was entered - */ - function enterMarkets(address[] calldata vTokens) external override returns (uint[] memory) { - uint len = vTokens.length; - - uint[] memory results = new uint[](len); - for (uint i = 0; i < len; i++) { - results[i] = uint(addToMarketInternal(VToken(vTokens[i]), msg.sender)); - } - - return results; - } - - /** - * @notice Add the market to the borrower's "assets in" for liquidity calculations - * @param vToken The market to enter - * @param borrower The address of the account to modify - * @return Success indicator for whether the market was entered - */ - function addToMarketInternal(VToken vToken, address borrower) internal returns (Error) { - Market storage marketToJoin = markets[address(vToken)]; - - if (!marketToJoin.isListed) { - // market is not listed, cannot join - return Error.MARKET_NOT_LISTED; - } - - if (marketToJoin.accountMembership[borrower]) { - // already joined - return Error.NO_ERROR; - } - - // survived the gauntlet, add to list - // NOTE: we store these somewhat redundantly as a significant optimization - // this avoids having to iterate through the list for the most common use cases - // that is, only when we need to perform liquidity checks - // and not whenever we want to check if an account is in a particular market - marketToJoin.accountMembership[borrower] = true; - accountAssets[borrower].push(vToken); - - emit MarketEntered(vToken, borrower); - - return Error.NO_ERROR; - } - - /** - * @notice Removes asset from sender's account liquidity calculation - * @dev Sender must not have an outstanding borrow balance in the asset, - * or be providing necessary collateral for an outstanding borrow. - * @param vTokenAddress The address of the asset to be removed - * @return Whether or not the account successfully exited the market - */ - function exitMarket(address vTokenAddress) external override returns (uint) { - VToken vToken = VToken(vTokenAddress); - /* Get sender tokensHeld and amountOwed underlying from the vToken */ - (uint oErr, uint tokensHeld, uint amountOwed, ) = vToken.getAccountSnapshot(msg.sender); - require(oErr == 0, "getAccountSnapshot failed"); // semi-opaque error code - - /* Fail if the sender has a borrow balance */ - if (amountOwed != 0) { - return fail(Error.NONZERO_BORROW_BALANCE, FailureInfo.EXIT_MARKET_BALANCE_OWED); - } - - /* Fail if the sender is not permitted to redeem all of their tokens */ - uint allowed = redeemAllowedInternal(vTokenAddress, msg.sender, tokensHeld); - if (allowed != 0) { - return failOpaque(Error.REJECTION, FailureInfo.EXIT_MARKET_REJECTION, allowed); - } - - Market storage marketToExit = markets[address(vToken)]; - - /* Return true if the sender is not already ‘in’ the market */ - if (!marketToExit.accountMembership[msg.sender]) { - return uint(Error.NO_ERROR); - } - - /* Set vToken account membership to false */ - delete marketToExit.accountMembership[msg.sender]; - - /* Delete vToken from the account’s list of assets */ - // In order to delete vToken, copy last item in list to location of item to be removed, reduce length by 1 - VToken[] storage userAssetList = accountAssets[msg.sender]; - uint len = userAssetList.length; - uint i; - for (; i < len; i++) { - if (userAssetList[i] == vToken) { - userAssetList[i] = userAssetList[len - 1]; - userAssetList.pop(); - break; - } - } - - // We *must* have found the asset in the list or our redundant data structure is broken - assert(i < len); - - emit MarketExited(vToken, msg.sender); - - return uint(Error.NO_ERROR); - } - - /*** Policy Hooks ***/ - - /** - * @notice Checks if the account should be allowed to mint tokens in the given market - * @param vToken The market to verify the mint against - * @param minter The account which would get the minted tokens - * @param mintAmount The amount of underlying being supplied to the market in exchange for tokens - * @return 0 if the mint is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) - */ - function mintAllowed( - address vToken, - address minter, - uint mintAmount - ) external override onlyProtocolAllowed returns (uint) { - // Pausing is a very serious situation - we revert to sound the alarms - require(!mintGuardianPaused[vToken], "mint is paused"); - - // Shh - currently unused - mintAmount; - - if (!markets[vToken].isListed) { - return uint(Error.MARKET_NOT_LISTED); - } - - // Keep the flywheel moving - updateVenusSupplyIndex(vToken); - distributeSupplierVenus(vToken, minter); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Validates mint and reverts on rejection. May emit logs. - * @param vToken Asset being minted - * @param minter The address minting the tokens - * @param actualMintAmount The amount of the underlying asset being minted - * @param mintTokens The number of tokens being minted - */ - function mintVerify(address vToken, address minter, uint actualMintAmount, uint mintTokens) external override { - // Shh - currently unused - vToken; - minter; - actualMintAmount; - mintTokens; - } - - /** - * @notice Checks if the account should be allowed to redeem tokens in the given market - * @param vToken The market to verify the redeem against - * @param redeemer The account which would redeem the tokens - * @param redeemTokens The number of vTokens to exchange for the underlying asset in the market - * @return 0 if the redeem is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) - */ - function redeemAllowed( - address vToken, - address redeemer, - uint redeemTokens - ) external override onlyProtocolAllowed returns (uint) { - uint allowed = redeemAllowedInternal(vToken, redeemer, redeemTokens); - if (allowed != uint(Error.NO_ERROR)) { - return allowed; - } - - // Keep the flywheel moving - updateVenusSupplyIndex(vToken); - distributeSupplierVenus(vToken, redeemer); - - return uint(Error.NO_ERROR); - } - - function redeemAllowedInternal(address vToken, address redeemer, uint redeemTokens) internal view returns (uint) { - if (!markets[vToken].isListed) { - return uint(Error.MARKET_NOT_LISTED); - } - - /* If the redeemer is not 'in' the market, then we can bypass the liquidity check */ - if (!markets[vToken].accountMembership[redeemer]) { - return uint(Error.NO_ERROR); - } - - /* Otherwise, perform a hypothetical liquidity check to guard against shortfall */ - (Error err, , uint shortfall) = getHypotheticalAccountLiquidityInternal( - redeemer, - VToken(vToken), - redeemTokens, - 0 - ); - if (err != Error.NO_ERROR) { - return uint(err); - } - if (shortfall != 0) { - return uint(Error.INSUFFICIENT_LIQUIDITY); - } - - return uint(Error.NO_ERROR); - } - - /** - * @notice Validates redeem and reverts on rejection. May emit logs. - * @param vToken Asset being redeemed - * @param redeemer The address redeeming the tokens - * @param redeemAmount The amount of the underlying asset being redeemed - * @param redeemTokens The number of tokens being redeemed - */ - function redeemVerify(address vToken, address redeemer, uint redeemAmount, uint redeemTokens) external override { - // Shh - currently unused - vToken; - redeemer; - - // Require tokens is zero or amount is also zero - require(redeemTokens != 0 || redeemAmount == 0, "redeemTokens zero"); - } - - /** - * @notice Checks if the account should be allowed to borrow the underlying asset of the given market - * @param vToken The market to verify the borrow against - * @param borrower The account which would borrow the asset - * @param borrowAmount The amount of underlying the account would borrow - * @return 0 if the borrow is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) - */ - function borrowAllowed( - address vToken, - address borrower, - uint borrowAmount - ) external override onlyProtocolAllowed returns (uint) { - // Pausing is a very serious situation - we revert to sound the alarms - require(!borrowGuardianPaused[vToken], "borrow is paused"); - - if (!markets[vToken].isListed) { - return uint(Error.MARKET_NOT_LISTED); - } - - if (!markets[vToken].accountMembership[borrower]) { - // only vTokens may call borrowAllowed if borrower not in market - require(msg.sender == vToken, "sender must be vToken"); - - // attempt to add borrower to the market - Error err = addToMarketInternal(VToken(vToken), borrower); - if (err != Error.NO_ERROR) { - return uint(err); - } - } - - if (oracle.getUnderlyingPrice(VToken(vToken)) == 0) { - return uint(Error.PRICE_ERROR); - } - - uint borrowCap = borrowCaps[vToken]; - // Borrow cap of 0 corresponds to unlimited borrowing - if (borrowCap != 0) { - uint totalBorrows = VToken(vToken).totalBorrows(); - uint nextTotalBorrows = add_(totalBorrows, borrowAmount); - require(nextTotalBorrows < borrowCap, "market borrow cap reached"); - } - - (Error err, , uint shortfall) = getHypotheticalAccountLiquidityInternal( - borrower, - VToken(vToken), - 0, - borrowAmount - ); - if (err != Error.NO_ERROR) { - return uint(err); - } - if (shortfall != 0) { - return uint(Error.INSUFFICIENT_LIQUIDITY); - } - - // Keep the flywheel moving - Exp memory borrowIndex = Exp({ mantissa: VToken(vToken).borrowIndex() }); - updateVenusBorrowIndex(vToken, borrowIndex); - distributeBorrowerVenus(vToken, borrower, borrowIndex); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Validates borrow and reverts on rejection. May emit logs. - * @param vToken Asset whose underlying is being borrowed - * @param borrower The address borrowing the underlying - * @param borrowAmount The amount of the underlying asset requested to borrow - */ - function borrowVerify(address vToken, address borrower, uint borrowAmount) external override { - // Shh - currently unused - vToken; - borrower; - borrowAmount; - - // Shh - we don't ever want this hook to be marked pure - if (false) { - maxAssets = maxAssets; - } - } - - /** - * @notice Checks if the account should be allowed to repay a borrow in the given market - * @param vToken The market to verify the repay against - * @param payer The account which would repay the asset - * @param borrower The account which would repay the asset - * @param repayAmount The amount of the underlying asset the account would repay - * @return 0 if the repay is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) - */ - function repayBorrowAllowed( - address vToken, - address payer, - address borrower, - uint repayAmount - ) external override onlyProtocolAllowed returns (uint) { - // Shh - currently unused - payer; - borrower; - repayAmount; - - if (!markets[vToken].isListed) { - return uint(Error.MARKET_NOT_LISTED); - } - - // Keep the flywheel moving - Exp memory borrowIndex = Exp({ mantissa: VToken(vToken).borrowIndex() }); - updateVenusBorrowIndex(vToken, borrowIndex); - distributeBorrowerVenus(vToken, borrower, borrowIndex); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Validates repayBorrow and reverts on rejection. May emit logs. - * @param vToken Asset being repaid - * @param payer The address repaying the borrow - * @param borrower The address of the borrower - * @param actualRepayAmount The amount of underlying being repaid - */ - function repayBorrowVerify( - address vToken, - address payer, - address borrower, - uint actualRepayAmount, - uint borrowerIndex - ) external override { - // Shh - currently unused - vToken; - payer; - borrower; - actualRepayAmount; - borrowerIndex; - - // Shh - we don't ever want this hook to be marked pure - if (false) { - maxAssets = maxAssets; - } - } - - /** - * @notice Checks if the liquidation should be allowed to occur - * @param vTokenBorrowed Asset which was borrowed by the borrower - * @param vTokenCollateral Asset which was used as collateral and will be seized - * @param liquidator The address repaying the borrow and seizing the collateral - * @param borrower The address of the borrower - * @param repayAmount The amount of underlying being repaid - */ - function liquidateBorrowAllowed( - address vTokenBorrowed, - address vTokenCollateral, - address liquidator, - address borrower, - uint repayAmount - ) external override onlyProtocolAllowed returns (uint) { - // Shh - currently unused - liquidator; - - if ( - !(markets[vTokenBorrowed].isListed || address(vTokenBorrowed) == address(vaiController)) || - !markets[vTokenCollateral].isListed - ) { - return uint(Error.MARKET_NOT_LISTED); - } - - /* The borrower must have shortfall in order to be liquidatable */ - (Error err, , uint shortfall) = getHypotheticalAccountLiquidityInternal(borrower, VToken(address(0)), 0, 0); - if (err != Error.NO_ERROR) { - return uint(err); - } - if (shortfall == 0) { - return uint(Error.INSUFFICIENT_SHORTFALL); - } - - /* The liquidator may not repay more than what is allowed by the closeFactor */ - uint borrowBalance; - if (address(vTokenBorrowed) != address(vaiController)) { - borrowBalance = VToken(vTokenBorrowed).borrowBalanceStored(borrower); - } else { - borrowBalance = mintedVAIs[borrower]; - } - - uint maxClose = mul_ScalarTruncate(Exp({ mantissa: closeFactorMantissa }), borrowBalance); - if (repayAmount > maxClose) { - return uint(Error.TOO_MUCH_REPAY); - } - - return uint(Error.NO_ERROR); - } - - /** - * @notice Validates liquidateBorrow and reverts on rejection. May emit logs. - * @param vTokenBorrowed Asset which was borrowed by the borrower - * @param vTokenCollateral Asset which was used as collateral and will be seized - * @param liquidator The address repaying the borrow and seizing the collateral - * @param borrower The address of the borrower - * @param actualRepayAmount The amount of underlying being repaid - */ - function liquidateBorrowVerify( - address vTokenBorrowed, - address vTokenCollateral, - address liquidator, - address borrower, - uint actualRepayAmount, - uint seizeTokens - ) external override { - // Shh - currently unused - vTokenBorrowed; - vTokenCollateral; - liquidator; - borrower; - actualRepayAmount; - seizeTokens; - - // Shh - we don't ever want this hook to be marked pure - if (false) { - maxAssets = maxAssets; - } - } - - /** - * @notice Checks if the seizing of assets should be allowed to occur - * @param vTokenCollateral Asset which was used as collateral and will be seized - * @param vTokenBorrowed Asset which was borrowed by the borrower - * @param liquidator The address repaying the borrow and seizing the collateral - * @param borrower The address of the borrower - * @param seizeTokens The number of collateral tokens to seize - */ - function seizeAllowed( - address vTokenCollateral, - address vTokenBorrowed, - address liquidator, - address borrower, - uint seizeTokens - ) external override onlyProtocolAllowed returns (uint) { - // Pausing is a very serious situation - we revert to sound the alarms - require(!seizeGuardianPaused, "seize is paused"); - - // Shh - currently unused - seizeTokens; - - // We've added VAIController as a borrowed token list check for seize - if ( - !markets[vTokenCollateral].isListed || - !(markets[vTokenBorrowed].isListed || address(vTokenBorrowed) == address(vaiController)) - ) { - return uint(Error.MARKET_NOT_LISTED); - } - - if (VToken(vTokenCollateral).comptroller() != VToken(vTokenBorrowed).comptroller()) { - return uint(Error.COMPTROLLER_MISMATCH); - } - - // Keep the flywheel moving - updateVenusSupplyIndex(vTokenCollateral); - distributeSupplierVenus(vTokenCollateral, borrower); - distributeSupplierVenus(vTokenCollateral, liquidator); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Validates seize and reverts on rejection. May emit logs. - * @param vTokenCollateral Asset which was used as collateral and will be seized - * @param vTokenBorrowed Asset which was borrowed by the borrower - * @param liquidator The address repaying the borrow and seizing the collateral - * @param borrower The address of the borrower - * @param seizeTokens The number of collateral tokens to seize - */ - function seizeVerify( - address vTokenCollateral, - address vTokenBorrowed, - address liquidator, - address borrower, - uint seizeTokens - ) external override { - // Shh - currently unused - vTokenCollateral; - vTokenBorrowed; - liquidator; - borrower; - seizeTokens; - - // Shh - we don't ever want this hook to be marked pure - if (false) { - maxAssets = maxAssets; - } - } - - /** - * @notice Checks if the account should be allowed to transfer tokens in the given market - * @param vToken The market to verify the transfer against - * @param src The account which sources the tokens - * @param dst The account which receives the tokens - * @param transferTokens The number of vTokens to transfer - * @return 0 if the transfer is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) - */ - function transferAllowed( - address vToken, - address src, - address dst, - uint transferTokens - ) external override onlyProtocolAllowed returns (uint) { - // Pausing is a very serious situation - we revert to sound the alarms - require(!transferGuardianPaused, "transfer is paused"); - - // Currently the only consideration is whether or not - // the src is allowed to redeem this many tokens - uint allowed = redeemAllowedInternal(vToken, src, transferTokens); - if (allowed != uint(Error.NO_ERROR)) { - return allowed; - } - - // Keep the flywheel moving - updateVenusSupplyIndex(vToken); - distributeSupplierVenus(vToken, src); - distributeSupplierVenus(vToken, dst); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Validates transfer and reverts on rejection. May emit logs. - * @param vToken Asset being transferred - * @param src The account which sources the tokens - * @param dst The account which receives the tokens - * @param transferTokens The number of vTokens to transfer - */ - function transferVerify(address vToken, address src, address dst, uint transferTokens) external override { - // Shh - currently unused - vToken; - src; - dst; - transferTokens; - - // Shh - we don't ever want this hook to be marked pure - if (false) { - maxAssets = maxAssets; - } - } - - /*** Liquidity/Liquidation Calculations ***/ - - /** - * @dev Local vars for avoiding stack-depth limits in calculating account liquidity. - * Note that `vTokenBalance` is the number of vTokens the account owns in the market, - * whereas `borrowBalance` is the amount of underlying that the account has borrowed. - */ - struct AccountLiquidityLocalVars { - uint sumCollateral; - uint sumBorrowPlusEffects; - uint vTokenBalance; - uint borrowBalance; - uint exchangeRateMantissa; - uint oraclePriceMantissa; - Exp collateralFactor; - Exp exchangeRate; - Exp oraclePrice; - Exp tokensToDenom; - } - - /** - * @notice Determine the current account liquidity wrt collateral requirements - * @return (possible error code (semi-opaque), - account liquidity in excess of collateral requirements, - * account shortfall below collateral requirements) - */ - function getAccountLiquidity(address account) public view returns (uint, uint, uint) { - (Error err, uint liquidity, uint shortfall) = getHypotheticalAccountLiquidityInternal( - account, - VToken(address(0)), - 0, - 0 - ); - - return (uint(err), liquidity, shortfall); - } - - /** - * @notice Determine what the account liquidity would be if the given amounts were redeemed/borrowed - * @param vTokenModify The market to hypothetically redeem/borrow in - * @param account The account to determine liquidity for - * @param redeemTokens The number of tokens to hypothetically redeem - * @param borrowAmount The amount of underlying to hypothetically borrow - * @return (possible error code (semi-opaque), - hypothetical account liquidity in excess of collateral requirements, - * hypothetical account shortfall below collateral requirements) - */ - function getHypotheticalAccountLiquidity( - address account, - address vTokenModify, - uint redeemTokens, - uint borrowAmount - ) public view returns (uint, uint, uint) { - (Error err, uint liquidity, uint shortfall) = getHypotheticalAccountLiquidityInternal( - account, - VToken(vTokenModify), - redeemTokens, - borrowAmount - ); - return (uint(err), liquidity, shortfall); - } - - /** - * @notice Determine what the account liquidity would be if the given amounts were redeemed/borrowed - * @param vTokenModify The market to hypothetically redeem/borrow in - * @param account The account to determine liquidity for - * @param redeemTokens The number of tokens to hypothetically redeem - * @param borrowAmount The amount of underlying to hypothetically borrow - * @dev Note that we calculate the exchangeRateStored for each collateral vToken using stored data, - * without calculating accumulated interest. - * @return (possible error code, - hypothetical account liquidity in excess of collateral requirements, - * hypothetical account shortfall below collateral requirements) - */ - function getHypotheticalAccountLiquidityInternal( - address account, - VToken vTokenModify, - uint redeemTokens, - uint borrowAmount - ) internal view returns (Error, uint, uint) { - AccountLiquidityLocalVars memory vars; // Holds all our calculation results - uint oErr; - - // For each asset the account is in - VToken[] memory assets = accountAssets[account]; - for (uint i = 0; i < assets.length; i++) { - VToken asset = assets[i]; - - // Read the balances and exchange rate from the vToken - (oErr, vars.vTokenBalance, vars.borrowBalance, vars.exchangeRateMantissa) = asset.getAccountSnapshot( - account - ); - if (oErr != 0) { - // semi-opaque error code, we assume NO_ERROR == 0 is invariant between upgrades - return (Error.SNAPSHOT_ERROR, 0, 0); - } - vars.collateralFactor = Exp({ mantissa: markets[address(asset)].collateralFactorMantissa }); - vars.exchangeRate = Exp({ mantissa: vars.exchangeRateMantissa }); - - // Get the normalized price of the asset - vars.oraclePriceMantissa = oracle.getUnderlyingPrice(asset); - if (vars.oraclePriceMantissa == 0) { - return (Error.PRICE_ERROR, 0, 0); - } - vars.oraclePrice = Exp({ mantissa: vars.oraclePriceMantissa }); - - // Pre-compute a conversion factor from tokens -> bnb (normalized price value) - vars.tokensToDenom = mul_(mul_(vars.collateralFactor, vars.exchangeRate), vars.oraclePrice); - - // sumCollateral += tokensToDenom * vTokenBalance - vars.sumCollateral = mul_ScalarTruncateAddUInt(vars.tokensToDenom, vars.vTokenBalance, vars.sumCollateral); - - // sumBorrowPlusEffects += oraclePrice * borrowBalance - vars.sumBorrowPlusEffects = mul_ScalarTruncateAddUInt( - vars.oraclePrice, - vars.borrowBalance, - vars.sumBorrowPlusEffects - ); - - // Calculate effects of interacting with vTokenModify - if (asset == vTokenModify) { - // redeem effect - // sumBorrowPlusEffects += tokensToDenom * redeemTokens - vars.sumBorrowPlusEffects = mul_ScalarTruncateAddUInt( - vars.tokensToDenom, - redeemTokens, - vars.sumBorrowPlusEffects - ); - - // borrow effect - // sumBorrowPlusEffects += oraclePrice * borrowAmount - vars.sumBorrowPlusEffects = mul_ScalarTruncateAddUInt( - vars.oraclePrice, - borrowAmount, - vars.sumBorrowPlusEffects - ); - } - } - - vars.sumBorrowPlusEffects = add_(vars.sumBorrowPlusEffects, mintedVAIs[account]); - - // These are safe, as the underflow condition is checked first - if (vars.sumCollateral > vars.sumBorrowPlusEffects) { - return (Error.NO_ERROR, vars.sumCollateral - vars.sumBorrowPlusEffects, 0); - } else { - return (Error.NO_ERROR, 0, vars.sumBorrowPlusEffects - vars.sumCollateral); - } - } - - /** - * @notice Calculate number of tokens of collateral asset to seize given an underlying amount - * @dev Used in liquidation (called in vToken.liquidateBorrowFresh) - * @param vTokenBorrowed The address of the borrowed vToken - * @param vTokenCollateral The address of the collateral vToken - * @param actualRepayAmount The amount of vTokenBorrowed underlying to convert into vTokenCollateral tokens - * @return (errorCode, number of vTokenCollateral tokens to be seized in a liquidation) - */ - function liquidateCalculateSeizeTokens( - address vTokenBorrowed, - address vTokenCollateral, - uint actualRepayAmount - ) external view override returns (uint, uint) { - /* Read oracle prices for borrowed and collateral markets */ - uint priceBorrowedMantissa = oracle.getUnderlyingPrice(VToken(vTokenBorrowed)); - uint priceCollateralMantissa = oracle.getUnderlyingPrice(VToken(vTokenCollateral)); - if (priceBorrowedMantissa == 0 || priceCollateralMantissa == 0) { - return (uint(Error.PRICE_ERROR), 0); - } - - /* - * Get the exchange rate and calculate the number of collateral tokens to seize: - * seizeAmount = actualRepayAmount * liquidationIncentive * priceBorrowed / priceCollateral - * seizeTokens = seizeAmount / exchangeRate - * = actualRepayAmount * (liquidationIncentive * priceBorrowed) / (priceCollateral * exchangeRate) - */ - uint exchangeRateMantissa = VToken(vTokenCollateral).exchangeRateStored(); // Note: reverts on error - uint seizeTokens; - Exp memory numerator; - Exp memory denominator; - Exp memory ratio; - - numerator = mul_(Exp({ mantissa: liquidationIncentiveMantissa }), Exp({ mantissa: priceBorrowedMantissa })); - denominator = mul_(Exp({ mantissa: priceCollateralMantissa }), Exp({ mantissa: exchangeRateMantissa })); - ratio = div_(numerator, denominator); - - seizeTokens = mul_ScalarTruncate(ratio, actualRepayAmount); - - return (uint(Error.NO_ERROR), seizeTokens); - } - - /** - * @notice Calculate number of tokens of collateral asset to seize given an underlying amount - * @dev Used in liquidation (called in vToken.liquidateBorrowFresh) - * @param vTokenCollateral The address of the collateral vToken - * @param actualRepayAmount The amount of vTokenBorrowed underlying to convert into vTokenCollateral tokens - * @return (errorCode, number of vTokenCollateral tokens to be seized in a liquidation) - */ - function liquidateVAICalculateSeizeTokens( - address vTokenCollateral, - uint actualRepayAmount - ) external view override returns (uint, uint) { - /* Read oracle prices for borrowed and collateral markets */ - uint priceBorrowedMantissa = 1e18; // Note: this is VAI - uint priceCollateralMantissa = oracle.getUnderlyingPrice(VToken(vTokenCollateral)); - if (priceCollateralMantissa == 0) { - return (uint(Error.PRICE_ERROR), 0); - } - - /* - * Get the exchange rate and calculate the number of collateral tokens to seize: - * seizeAmount = actualRepayAmount * liquidationIncentive * priceBorrowed / priceCollateral - * seizeTokens = seizeAmount / exchangeRate - * = actualRepayAmount * (liquidationIncentive * priceBorrowed) / (priceCollateral * exchangeRate) - */ - uint exchangeRateMantissa = VToken(vTokenCollateral).exchangeRateStored(); // Note: reverts on error - uint seizeTokens; - Exp memory numerator; - Exp memory denominator; - Exp memory ratio; - - numerator = mul_(Exp({ mantissa: liquidationIncentiveMantissa }), Exp({ mantissa: priceBorrowedMantissa })); - denominator = mul_(Exp({ mantissa: priceCollateralMantissa }), Exp({ mantissa: exchangeRateMantissa })); - ratio = div_(numerator, denominator); - - seizeTokens = mul_ScalarTruncate(ratio, actualRepayAmount); - - return (uint(Error.NO_ERROR), seizeTokens); - } - - /*** Admin Functions ***/ - - /** - * @notice Sets a new price oracle for the comptroller - * @dev Admin function to set a new price oracle - * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) - */ - function _setPriceOracle(PriceOracle newOracle) public returns (uint) { - // Check caller is admin - if (msg.sender != admin) { - return fail(Error.UNAUTHORIZED, FailureInfo.SET_PRICE_ORACLE_OWNER_CHECK); - } - - // Track the old oracle for the comptroller - PriceOracle oldOracle = oracle; - - // Set comptroller's oracle to newOracle - oracle = newOracle; - - // Emit NewPriceOracle(oldOracle, newOracle) - emit NewPriceOracle(oldOracle, newOracle); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Sets the closeFactor used when liquidating borrows - * @dev Admin function to set closeFactor - * @param newCloseFactorMantissa New close factor, scaled by 1e18 - * @return uint 0=success, otherwise a failure - */ - function _setCloseFactor(uint newCloseFactorMantissa) external returns (uint) { - // Check caller is admin - require(msg.sender == admin, "only admin can set close factor"); - - uint oldCloseFactorMantissa = closeFactorMantissa; - closeFactorMantissa = newCloseFactorMantissa; - emit NewCloseFactor(oldCloseFactorMantissa, newCloseFactorMantissa); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Sets the collateralFactor for a market - * @dev Admin function to set per-market collateralFactor - * @param vToken The market to set the factor on - * @param newCollateralFactorMantissa The new collateral factor, scaled by 1e18 - * @return uint 0=success, otherwise a failure. (See ErrorReporter for details) - */ - function _setCollateralFactor(VToken vToken, uint newCollateralFactorMantissa) external returns (uint) { - // Check caller is admin - if (msg.sender != admin) { - return fail(Error.UNAUTHORIZED, FailureInfo.SET_COLLATERAL_FACTOR_OWNER_CHECK); - } - - // Verify market is listed - Market storage market = markets[address(vToken)]; - if (!market.isListed) { - return fail(Error.MARKET_NOT_LISTED, FailureInfo.SET_COLLATERAL_FACTOR_NO_EXISTS); - } - - Exp memory newCollateralFactorExp = Exp({ mantissa: newCollateralFactorMantissa }); - - // Check collateral factor <= 0.9 - Exp memory highLimit = Exp({ mantissa: collateralFactorMaxMantissa }); - if (lessThanExp(highLimit, newCollateralFactorExp)) { - return fail(Error.INVALID_COLLATERAL_FACTOR, FailureInfo.SET_COLLATERAL_FACTOR_VALIDATION); - } - - // If collateral factor != 0, fail if price == 0 - if (newCollateralFactorMantissa != 0 && oracle.getUnderlyingPrice(vToken) == 0) { - return fail(Error.PRICE_ERROR, FailureInfo.SET_COLLATERAL_FACTOR_WITHOUT_PRICE); - } - - // Set market's collateral factor to new collateral factor, remember old value - uint oldCollateralFactorMantissa = market.collateralFactorMantissa; - market.collateralFactorMantissa = newCollateralFactorMantissa; - - // Emit event with asset, old collateral factor, and new collateral factor - emit NewCollateralFactor(vToken, oldCollateralFactorMantissa, newCollateralFactorMantissa); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Sets liquidationIncentive - * @dev Admin function to set liquidationIncentive - * @param newLiquidationIncentiveMantissa New liquidationIncentive scaled by 1e18 - * @return uint 0=success, otherwise a failure. (See ErrorReporter for details) - */ - function _setLiquidationIncentive(uint newLiquidationIncentiveMantissa) external returns (uint) { - // Check caller is admin - if (msg.sender != admin) { - return fail(Error.UNAUTHORIZED, FailureInfo.SET_LIQUIDATION_INCENTIVE_OWNER_CHECK); - } - - // Save current value for use in log - uint oldLiquidationIncentiveMantissa = liquidationIncentiveMantissa; - - // Set liquidation incentive to new incentive - liquidationIncentiveMantissa = newLiquidationIncentiveMantissa; - - // Emit event with old incentive, new incentive - emit NewLiquidationIncentive(oldLiquidationIncentiveMantissa, newLiquidationIncentiveMantissa); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Add the market to the markets mapping and set it as listed - * @dev Admin function to set isListed and add support for the market - * @param vToken The address of the market (token) to list - * @return uint 0=success, otherwise a failure. (See enum Error for details) - */ - function _supportMarket(VToken vToken) external returns (uint) { - if (msg.sender != admin) { - return fail(Error.UNAUTHORIZED, FailureInfo.SUPPORT_MARKET_OWNER_CHECK); - } - - if (markets[address(vToken)].isListed) { - return fail(Error.MARKET_ALREADY_LISTED, FailureInfo.SUPPORT_MARKET_EXISTS); - } - - vToken.isVToken(); // Sanity check to make sure its really a VToken - - // Note that isVenus is not in active use anymore - Market storage newMarket = markets[address(vToken)]; - newMarket.isListed = true; - newMarket.isVenus = false; - newMarket.collateralFactorMantissa = 0; - _addMarketInternal(vToken); - - emit MarketListed(vToken); - - return uint(Error.NO_ERROR); - } - - function _addMarketInternal(VToken vToken) internal { - for (uint i = 0; i < allMarkets.length; i++) { - require(allMarkets[i] != vToken, "market already added"); - } - allMarkets.push(vToken); - } - - /** - * @notice Admin function to change the Pause Guardian - * @param newPauseGuardian The address of the new Pause Guardian - * @return uint 0=success, otherwise a failure. (See enum Error for details) - */ - function _setPauseGuardian(address newPauseGuardian) public returns (uint) { - if (msg.sender != admin) { - return fail(Error.UNAUTHORIZED, FailureInfo.SET_PAUSE_GUARDIAN_OWNER_CHECK); - } - - // Save current value for inclusion in log - address oldPauseGuardian = pauseGuardian; - - // Store pauseGuardian with value newPauseGuardian - pauseGuardian = newPauseGuardian; - - // Emit NewPauseGuardian(OldPauseGuardian, NewPauseGuardian) - emit NewPauseGuardian(oldPauseGuardian, newPauseGuardian); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Set the given borrow caps for the given vToken markets. Borrowing that brings total borrows to or above borrow cap will revert. - * @dev Admin or borrowCapGuardian function to set the borrow caps. A borrow cap of 0 corresponds to unlimited borrowing. - * @param vTokens The addresses of the markets (tokens) to change the borrow caps for - * @param newBorrowCaps The new borrow cap values in underlying to be set. A value of 0 corresponds to unlimited borrowing. - */ - function _setMarketBorrowCaps(VToken[] calldata vTokens, uint[] calldata newBorrowCaps) external { - require( - msg.sender == admin || msg.sender == borrowCapGuardian, - "only admin or borrow cap guardian can set borrow caps" - ); - - uint numMarkets = vTokens.length; - uint numBorrowCaps = newBorrowCaps.length; - - require(numMarkets != 0 && numMarkets == numBorrowCaps, "invalid input"); - - for (uint i = 0; i < numMarkets; i++) { - borrowCaps[address(vTokens[i])] = newBorrowCaps[i]; - emit NewBorrowCap(vTokens[i], newBorrowCaps[i]); - } - } - - /** - * @notice Admin function to change the Borrow Cap Guardian - * @param newBorrowCapGuardian The address of the new Borrow Cap Guardian - */ - function _setBorrowCapGuardian(address newBorrowCapGuardian) external onlyAdmin { - // Save current value for inclusion in log - address oldBorrowCapGuardian = borrowCapGuardian; - - // Store borrowCapGuardian with value newBorrowCapGuardian - borrowCapGuardian = newBorrowCapGuardian; - - // Emit NewBorrowCapGuardian(OldBorrowCapGuardian, NewBorrowCapGuardian) - emit NewBorrowCapGuardian(oldBorrowCapGuardian, newBorrowCapGuardian); - } - - /** - * @notice Set whole protocol pause/unpause state - */ - function _setProtocolPaused(bool state) public validPauseState(state) returns (bool) { - protocolPaused = state; - emit ActionProtocolPaused(state); - return state; - } - - /** - * @notice Sets a new VAI controller - * @dev Admin function to set a new VAI controller - * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) - */ - function _setVAIController(VAIControllerInterface vaiController_) external returns (uint) { - // Check caller is admin - if (msg.sender != admin) { - return fail(Error.UNAUTHORIZED, FailureInfo.SET_VAICONTROLLER_OWNER_CHECK); - } - - VAIControllerInterface oldRate = vaiController; - vaiController = vaiController_; - emit NewVAIController(oldRate, vaiController_); - } - - function _setVAIMintRate(uint newVAIMintRate) external returns (uint) { - // Check caller is admin - if (msg.sender != admin) { - return fail(Error.UNAUTHORIZED, FailureInfo.SET_VAI_MINT_RATE_CHECK); - } - - uint oldVAIMintRate = vaiMintRate; - vaiMintRate = newVAIMintRate; - emit NewVAIMintRate(oldVAIMintRate, newVAIMintRate); - - return uint(Error.NO_ERROR); - } - - function _setTreasuryData( - address newTreasuryGuardian, - address newTreasuryAddress, - uint newTreasuryPercent - ) external returns (uint) { - // Check caller is admin - if (!(msg.sender == admin || msg.sender == treasuryGuardian)) { - return fail(Error.UNAUTHORIZED, FailureInfo.SET_TREASURY_OWNER_CHECK); - } - - require(newTreasuryPercent < 1e18, "treasury percent cap overflow"); - - address oldTreasuryGuardian = treasuryGuardian; - address oldTreasuryAddress = treasuryAddress; - uint oldTreasuryPercent = treasuryPercent; - - treasuryGuardian = newTreasuryGuardian; - treasuryAddress = newTreasuryAddress; - treasuryPercent = newTreasuryPercent; - - emit NewTreasuryGuardian(oldTreasuryGuardian, newTreasuryGuardian); - emit NewTreasuryAddress(oldTreasuryAddress, newTreasuryAddress); - emit NewTreasuryPercent(oldTreasuryPercent, newTreasuryPercent); - - return uint(Error.NO_ERROR); - } - - function _become(Unitroller unitroller) public { - require(msg.sender == unitroller.admin(), "only unitroller admin can"); - require(unitroller._acceptImplementation() == 0, "not authorized"); - } - - /** - * @notice Checks caller is admin, or this contract is becoming the new implementation - */ - function adminOrInitializing() internal view returns (bool) { - return msg.sender == admin || msg.sender == comptrollerImplementation; - } - - /*** Venus Distribution ***/ - - function setVenusSpeedInternal(VToken vToken, uint venusSpeed) internal { - uint currentVenusSpeed = venusSpeeds[address(vToken)]; - if (currentVenusSpeed != 0) { - // note that XVS speed could be set to 0 to halt liquidity rewards for a market - Exp memory borrowIndex = Exp({ mantissa: vToken.borrowIndex() }); - updateVenusSupplyIndex(address(vToken)); - updateVenusBorrowIndex(address(vToken), borrowIndex); - } else if (venusSpeed != 0) { - // Add the XVS market - Market storage market = markets[address(vToken)]; - require(market.isListed == true, "venus market is not listed"); - - if (venusSupplyState[address(vToken)].index == 0 && venusSupplyState[address(vToken)].block == 0) { - venusSupplyState[address(vToken)] = VenusMarketState({ - index: venusInitialIndex, - block: safe32(getBlockNumber(), "block number exceeds 32 bits") - }); - } - - if (venusBorrowState[address(vToken)].index == 0 && venusBorrowState[address(vToken)].block == 0) { - venusBorrowState[address(vToken)] = VenusMarketState({ - index: venusInitialIndex, - block: safe32(getBlockNumber(), "block number exceeds 32 bits") - }); - } - } - - if (currentVenusSpeed != venusSpeed) { - venusSpeeds[address(vToken)] = venusSpeed; - emit VenusSpeedUpdated(vToken, venusSpeed); - } - } - - /** - * @notice Accrue XVS to the market by updating the supply index - * @param vToken The market whose supply index to update - */ - function updateVenusSupplyIndex(address vToken) internal { - VenusMarketState storage supplyState = venusSupplyState[vToken]; - uint supplySpeed = venusSpeeds[vToken]; - uint blockNumber = getBlockNumber(); - uint deltaBlocks = sub_(blockNumber, uint(supplyState.block)); - if (deltaBlocks > 0 && supplySpeed > 0) { - uint supplyTokens = VToken(vToken).totalSupply(); - uint venusAccrued = mul_(deltaBlocks, supplySpeed); - Double memory ratio = supplyTokens > 0 ? fraction(venusAccrued, supplyTokens) : Double({ mantissa: 0 }); - Double memory index = add_(Double({ mantissa: supplyState.index }), ratio); - venusSupplyState[vToken] = VenusMarketState({ - index: safe224(index.mantissa, "new index overflows"), - block: safe32(blockNumber, "block number overflows") - }); - } else if (deltaBlocks > 0) { - supplyState.block = safe32(blockNumber, "block number overflows"); - } - } - - /** - * @notice Accrue XVS to the market by updating the borrow index - * @param vToken The market whose borrow index to update - */ - function updateVenusBorrowIndex(address vToken, Exp memory marketBorrowIndex) internal { - VenusMarketState storage borrowState = venusBorrowState[vToken]; - uint borrowSpeed = venusSpeeds[vToken]; - uint blockNumber = getBlockNumber(); - uint deltaBlocks = sub_(blockNumber, uint(borrowState.block)); - if (deltaBlocks > 0 && borrowSpeed > 0) { - uint borrowAmount = div_(VToken(vToken).totalBorrows(), marketBorrowIndex); - uint venusAccrued = mul_(deltaBlocks, borrowSpeed); - Double memory ratio = borrowAmount > 0 ? fraction(venusAccrued, borrowAmount) : Double({ mantissa: 0 }); - Double memory index = add_(Double({ mantissa: borrowState.index }), ratio); - venusBorrowState[vToken] = VenusMarketState({ - index: safe224(index.mantissa, "new index overflows"), - block: safe32(blockNumber, "block number overflows") - }); - } else if (deltaBlocks > 0) { - borrowState.block = safe32(blockNumber, "block number overflows"); - } - } - - /** - * @notice Calculate XVS accrued by a supplier and possibly transfer it to them - * @param vToken The market in which the supplier is interacting - * @param supplier The address of the supplier to distribute XVS to - */ - function distributeSupplierVenus(address vToken, address supplier) internal { - if (address(vaiVaultAddress) != address(0)) { - releaseToVault(); - } - - VenusMarketState storage supplyState = venusSupplyState[vToken]; - Double memory supplyIndex = Double({ mantissa: supplyState.index }); - Double memory supplierIndex = Double({ mantissa: venusSupplierIndex[vToken][supplier] }); - venusSupplierIndex[vToken][supplier] = supplyIndex.mantissa; - - if (supplierIndex.mantissa == 0 && supplyIndex.mantissa > 0) { - supplierIndex.mantissa = venusInitialIndex; - } - - Double memory deltaIndex = sub_(supplyIndex, supplierIndex); - uint supplierTokens = VToken(vToken).balanceOf(supplier); - uint supplierDelta = mul_(supplierTokens, deltaIndex); - uint supplierAccrued = add_(venusAccrued[supplier], supplierDelta); - venusAccrued[supplier] = supplierAccrued; - emit DistributedSupplierVenus(VToken(vToken), supplier, supplierDelta, supplyIndex.mantissa); - } - - /** - * @notice Calculate XVS accrued by a borrower and possibly transfer it to them - * @dev Borrowers will not begin to accrue until after the first interaction with the protocol. - * @param vToken The market in which the borrower is interacting - * @param borrower The address of the borrower to distribute XVS to - */ - function distributeBorrowerVenus(address vToken, address borrower, Exp memory marketBorrowIndex) internal { - if (address(vaiVaultAddress) != address(0)) { - releaseToVault(); - } - - VenusMarketState storage borrowState = venusBorrowState[vToken]; - Double memory borrowIndex = Double({ mantissa: borrowState.index }); - Double memory borrowerIndex = Double({ mantissa: venusBorrowerIndex[vToken][borrower] }); - venusBorrowerIndex[vToken][borrower] = borrowIndex.mantissa; - - if (borrowerIndex.mantissa > 0) { - Double memory deltaIndex = sub_(borrowIndex, borrowerIndex); - uint borrowerAmount = div_(VToken(vToken).borrowBalanceStored(borrower), marketBorrowIndex); - uint borrowerDelta = mul_(borrowerAmount, deltaIndex); - uint borrowerAccrued = add_(venusAccrued[borrower], borrowerDelta); - venusAccrued[borrower] = borrowerAccrued; - emit DistributedBorrowerVenus(VToken(vToken), borrower, borrowerDelta, borrowIndex.mantissa); - } - } - - /** - * @notice Calculate XVS accrued by a VAI minter and possibly transfer it to them - * @dev VAI minters will not begin to accrue until after the first interaction with the protocol. - * @param vaiMinter The address of the VAI minter to distribute XVS to - */ - function distributeVAIMinterVenus(address vaiMinter) public { - if (address(vaiVaultAddress) != address(0)) { - releaseToVault(); - } - - if (address(vaiController) != address(0)) { - uint vaiMinterAccrued; - uint vaiMinterDelta; - uint vaiMintIndexMantissa; - uint err; - (err, vaiMinterAccrued, vaiMinterDelta, vaiMintIndexMantissa) = vaiController.calcDistributeVAIMinterVenus( - vaiMinter - ); - if (err == uint(Error.NO_ERROR)) { - venusAccrued[vaiMinter] = vaiMinterAccrued; - emit DistributedVAIMinterVenus(vaiMinter, vaiMinterDelta, vaiMintIndexMantissa); - } - } - } - - /** - * @notice Claim all the xvs accrued by holder in all markets and VAI - * @param holder The address to claim XVS for - */ - function claimVenus(address holder) public { - return claimVenus(holder, allMarkets); - } - - /** - * @notice Claim all the xvs accrued by holder in the specified markets - * @param holder The address to claim XVS for - * @param vTokens The list of markets to claim XVS in - */ - function claimVenus(address holder, VToken[] memory vTokens) public { - address[] memory holders = new address[](1); - holders[0] = holder; - claimVenus(holders, vTokens, true, true); - } - - /** - * @notice Claim all xvs accrued by the holders - * @param holders The addresses to claim XVS for - * @param vTokens The list of markets to claim XVS in - * @param borrowers Whether or not to claim XVS earned by borrowing - * @param suppliers Whether or not to claim XVS earned by supplying - */ - function claimVenus(address[] memory holders, VToken[] memory vTokens, bool borrowers, bool suppliers) public { - uint j; - if (address(vaiController) != address(0)) { - vaiController.updateVenusVAIMintIndex(); - } - for (j = 0; j < holders.length; j++) { - distributeVAIMinterVenus(holders[j]); - venusAccrued[holders[j]] = grantXVSInternal(holders[j], venusAccrued[holders[j]]); - } - for (uint i = 0; i < vTokens.length; i++) { - VToken vToken = vTokens[i]; - require(markets[address(vToken)].isListed, "not listed market"); - if (borrowers) { - Exp memory borrowIndex = Exp({ mantissa: vToken.borrowIndex() }); - updateVenusBorrowIndex(address(vToken), borrowIndex); - for (j = 0; j < holders.length; j++) { - distributeBorrowerVenus(address(vToken), holders[j], borrowIndex); - venusAccrued[holders[j]] = grantXVSInternal(holders[j], venusAccrued[holders[j]]); - } - } - if (suppliers) { - updateVenusSupplyIndex(address(vToken)); - for (j = 0; j < holders.length; j++) { - distributeSupplierVenus(address(vToken), holders[j]); - venusAccrued[holders[j]] = grantXVSInternal(holders[j], venusAccrued[holders[j]]); - } - } - } - } - - /** - * @notice Transfer XVS to the user - * @dev Note: If there is not enough XVS, we do not perform the transfer all. - * @param user The address of the user to transfer XVS to - * @param amount The amount of XVS to (possibly) transfer - * @return The amount of XVS which was NOT transferred to the user - */ - function grantXVSInternal(address user, uint amount) internal returns (uint) { - XVS xvs = XVS(getXVSAddress()); - uint venusRemaining = xvs.balanceOf(address(this)); - if (amount > 0 && amount <= venusRemaining) { - xvs.transfer(user, amount); - return 0; - } - return amount; - } - - /*** Venus Distribution Admin ***/ - - /** - * @notice Transfer XVS to the recipient - * @dev Note: If there is not enough XVS, we do not perform the transfer all. - * @param recipient The address of the recipient to transfer XVS to - * @param amount The amount of XVS to (possibly) transfer - */ - function _grantXVS(address recipient, uint amount) public { - require(adminOrInitializing(), "only admin can grant xvs"); - uint amountLeft = grantXVSInternal(recipient, amount); - require(amountLeft == 0, "insufficient xvs for grant"); - emit VenusGranted(recipient, amount); - } - - /** - * @notice Set the amount of XVS distributed per block to VAI Vault - * @param venusVAIVaultRate_ The amount of XVS wei per block to distribute to VAI Vault - */ - function _setVenusVAIVaultRate(uint venusVAIVaultRate_) public onlyAdmin { - uint oldVenusVAIVaultRate = venusVAIVaultRate; - venusVAIVaultRate = venusVAIVaultRate_; - emit NewVenusVAIVaultRate(oldVenusVAIVaultRate, venusVAIVaultRate_); - } - - /** - * @notice Set the VAI Vault infos - * @param vault_ The address of the VAI Vault - * @param releaseStartBlock_ The start block of release to VAI Vault - * @param minReleaseAmount_ The minimum release amount to VAI Vault - */ - function _setVAIVaultInfo(address vault_, uint256 releaseStartBlock_, uint256 minReleaseAmount_) public onlyAdmin { - vaiVaultAddress = vault_; - releaseStartBlock = releaseStartBlock_; - minReleaseAmount = minReleaseAmount_; - emit NewVAIVaultInfo(vault_, releaseStartBlock_, minReleaseAmount_); - } - - /** - * @notice Set XVS speed for a single market - * @param vToken The market whose XVS speed to update - * @param venusSpeed New XVS speed for market - */ - function _setVenusSpeed(VToken vToken, uint venusSpeed) public { - require(adminOrInitializing(), "only admin can set venus speed"); - setVenusSpeedInternal(vToken, venusSpeed); - } - - /** - * @notice Return all of the markets - * @dev The automatic getter may be used to access an individual market. - * @return The list of market addresses - */ - function getAllMarkets() public view returns (VToken[] memory) { - return allMarkets; - } - - function getBlockNumber() public view returns (uint) { - return block.number; - } - - /** - * @notice Return the address of the XVS token - * @return The address of XVS - */ - function getXVSAddress() public view returns (address) { - return 0xcF6BB5389c92Bdda8a3747Ddb454cB7a64626C63; - } - - /*** VAI functions ***/ - - /** - * @notice Set the minted VAI amount of the `owner` - * @param owner The address of the account to set - * @param amount The amount of VAI to set to the account - * @return The number of minted VAI by `owner` - */ - function setMintedVAIOf(address owner, uint amount) external override onlyProtocolAllowed returns (uint) { - // Pausing is a very serious situation - we revert to sound the alarms - require(!mintVAIGuardianPaused && !repayVAIGuardianPaused, "VAI is paused"); - // Check caller is vaiController - if (msg.sender != address(vaiController)) { - return fail(Error.REJECTION, FailureInfo.SET_MINTED_VAI_REJECTION); - } - mintedVAIs[owner] = amount; - - return uint(Error.NO_ERROR); - } - - /** - * @notice Transfer XVS to VAI Vault - */ - function releaseToVault() public { - if (releaseStartBlock == 0 || getBlockNumber() < releaseStartBlock) { - return; - } - - XVS xvs = XVS(getXVSAddress()); - - uint256 xvsBalance = xvs.balanceOf(address(this)); - if (xvsBalance == 0) { - return; - } - - uint256 actualAmount; - uint256 deltaBlocks = sub_(getBlockNumber(), releaseStartBlock); - // releaseAmount = venusVAIVaultRate * deltaBlocks - uint256 _releaseAmount = mul_(venusVAIVaultRate, deltaBlocks); - - if (_releaseAmount < minReleaseAmount) { - return; - } - - if (xvsBalance >= _releaseAmount) { - actualAmount = _releaseAmount; - } else { - actualAmount = xvsBalance; - } - - releaseStartBlock = getBlockNumber(); - - xvs.transfer(vaiVaultAddress, actualAmount); - emit DistributedVAIVaultVenus(actualAmount); - - IVAIVault(vaiVaultAddress).updatePendingRewards(); - } -} diff --git a/contracts/Comptroller/UpdatedComptroller.sol b/contracts/Comptroller/UpdatedComptroller.sol deleted file mode 100644 index da55d3ced..000000000 --- a/contracts/Comptroller/UpdatedComptroller.sol +++ /dev/null @@ -1,1529 +0,0 @@ -pragma solidity 0.8.13; - -import "../Oracle/PriceOracle.sol"; -import "../Tokens/VTokens/VToken.sol"; -import "../Utils/ErrorReporter.sol"; -import "../Tokens/XVS/XVS.sol"; -import "../Tokens/VAI/VAI.sol"; -import "../Governance/IAccessControlManager.sol"; -import "./ComptrollerLensInterface.sol"; -import "./UpdatedComptrollerInterface.sol"; -import "./ComptrollerStorage.sol"; -import "./Unitroller.sol"; - -/** - * @title Venus's Comptroller Contract - * @dev Name of this comptorller is updated to UpdatedComptroller as tests were failing - * due to the two contracts name by Comptorller. At the time of deployment of this - * contract to mainnet it should be nammed as Comptorller - * @author Venus - */ -// -contract UpdatedComptroller is - ComptrollerV10Storage, - UpdatedComptrollerInterfaceG2, - ComptrollerErrorReporter, - ExponentialNoError -{ - /// @notice Emitted when an admin supports a market - event MarketListed(VToken vToken); - - /// @notice Emitted when an account enters a market - event MarketEntered(VToken vToken, address account); - - /// @notice Emitted when an account exits a market - event MarketExited(VToken vToken, address account); - - /// @notice Emitted when close factor is changed by admin - event NewCloseFactor(uint oldCloseFactorMantissa, uint newCloseFactorMantissa); - - /// @notice Emitted when a collateral factor is changed by admin - event NewCollateralFactor(VToken vToken, uint oldCollateralFactorMantissa, uint newCollateralFactorMantissa); - - /// @notice Emitted when liquidation incentive is changed by admin - event NewLiquidationIncentive(uint oldLiquidationIncentiveMantissa, uint newLiquidationIncentiveMantissa); - - /// @notice Emitted when price oracle is changed - event NewPriceOracle(PriceOracle oldPriceOracle, PriceOracle newPriceOracle); - - /// @notice Emitted when VAI Vault info is changed - event NewVAIVaultInfo(address vault_, uint releaseStartBlock_, uint releaseInterval_); - - /// @notice Emitted when pause guardian is changed - event NewPauseGuardian(address oldPauseGuardian, address newPauseGuardian); - - /// @notice Emitted when an action is paused on a market - event ActionPausedMarket(VToken indexed vToken, Action indexed action, bool pauseState); - - /// @notice Emitted when Venus VAI Vault rate is changed - event NewVenusVAIVaultRate(uint oldVenusVAIVaultRate, uint newVenusVAIVaultRate); - - /// @notice Emitted when a new borrow-side XVS speed is calculated for a market - event VenusBorrowSpeedUpdated(VToken indexed vToken, uint newSpeed); - - /// @notice Emitted when a new supply-side XVS speed is calculated for a market - event VenusSupplySpeedUpdated(VToken indexed vToken, uint newSpeed); - - /// @notice Emitted when XVS is distributed to a supplier - event DistributedSupplierVenus( - VToken indexed vToken, - address indexed supplier, - uint venusDelta, - uint venusSupplyIndex - ); - - /// @notice Emitted when XVS is distributed to a borrower - event DistributedBorrowerVenus( - VToken indexed vToken, - address indexed borrower, - uint venusDelta, - uint venusBorrowIndex - ); - - /// @notice Emitted when XVS is distributed to VAI Vault - event DistributedVAIVaultVenus(uint amount); - - /// @notice Emitted when VAIController is changed - event NewVAIController(VAIControllerInterface oldVAIController, VAIControllerInterface newVAIController); - - /// @notice Emitted when VAI mint rate is changed by admin - event NewVAIMintRate(uint oldVAIMintRate, uint newVAIMintRate); - - /// @notice Emitted when protocol state is changed by admin - event ActionProtocolPaused(bool state); - - /// @notice Emitted when borrow cap for a vToken is changed - event NewBorrowCap(VToken indexed vToken, uint newBorrowCap); - - /// @notice Emitted when treasury guardian is changed - event NewTreasuryGuardian(address oldTreasuryGuardian, address newTreasuryGuardian); - - /// @notice Emitted when treasury address is changed - event NewTreasuryAddress(address oldTreasuryAddress, address newTreasuryAddress); - - /// @notice Emitted when treasury percent is changed - event NewTreasuryPercent(uint oldTreasuryPercent, uint newTreasuryPercent); - - // @notice Emitted when liquidator adress is changed - event NewLiquidatorContract(address oldLiquidatorContract, address newLiquidatorContract); - - /// @notice Emitted when Venus is granted by admin - event VenusGranted(address recipient, uint amount); - - /// @notice Emitted whe ComptrollerLens address is changed - event NewComptrollerLens(address oldComptrollerLens, address newComptrollerLens); - - /// @notice Emitted when supply cap for a vToken is changed - event NewSupplyCap(VToken indexed vToken, uint newSupplyCap); - - /// @notice Emitted when access control address is changed by admin - event NewAccessControl(address oldAccessControlAddress, address newAccessControlAddress); - - /// @notice The initial Venus index for a market - uint224 public constant venusInitialIndex = 1e36; - - // closeFactorMantissa must be strictly greater than this value - uint internal constant closeFactorMinMantissa = 0.05e18; // 0.05 - - // closeFactorMantissa must not exceed this value - uint internal constant closeFactorMaxMantissa = 0.9e18; // 0.9 - - // No collateralFactorMantissa may exceed this value - uint internal constant collateralFactorMaxMantissa = 0.9e18; // 0.9 - - constructor() public { - admin = msg.sender; - } - - /// @notice Reverts if the protocol is paused - function checkProtocolPauseState() private view { - require(!protocolPaused, "protocol is paused"); - } - - /// @notice Reverts if a certain action is paused on a market - function checkActionPauseState(address market, Action action) private view { - require(!actionPaused(market, action), "action is paused"); - } - - /// @notice Reverts if the caller is not admin - function ensureAdmin() private view { - require(msg.sender == admin, "only admin can"); - } - - /// @notice Checks the passed address is nonzero - function ensureNonzeroAddress(address someone) private pure { - require(someone != address(0), "can't be zero address"); - } - - /// @notice Reverts if the market is not listed - function ensureListed(Market storage market) private view { - require(market.isListed, "market not listed"); - } - - /// @notice Reverts if the caller is neither admin nor the passed address - function ensureAdminOr(address privilegedAddress) private view { - require(msg.sender == admin || msg.sender == privilegedAddress, "access denied"); - } - - function ensureAllowed(string memory functionSig) private view { - require(IAccessControlManager(accessControl).isAllowedToCall(msg.sender, functionSig), "access denied"); - } - - /*** Assets You Are In ***/ - - /** - * @notice Returns the assets an account has entered - * @param account The address of the account to pull assets for - * @return A dynamic list with the assets the account has entered - */ - function getAssetsIn(address account) external view returns (VToken[] memory) { - return accountAssets[account]; - } - - /** - * @notice Returns whether the given account is entered in the given asset - * @param account The address of the account to check - * @param vToken The vToken to check - * @return True if the account is in the asset, otherwise false. - */ - function checkMembership(address account, VToken vToken) external view returns (bool) { - return markets[address(vToken)].accountMembership[account]; - } - - /** - * @notice Add assets to be included in account liquidity calculation - * @param vTokens The list of addresses of the vToken markets to be enabled - * @return Success indicator for whether each corresponding market was entered - */ - function enterMarkets(address[] calldata vTokens) external override returns (uint[] memory) { - uint len = vTokens.length; - - uint[] memory results = new uint[](len); - for (uint i; i < len; ++i) { - results[i] = uint(addToMarketInternal(VToken(vTokens[i]), msg.sender)); - } - - return results; - } - - /** - * @notice Add the market to the borrower's "assets in" for liquidity calculations - * @param vToken The market to enter - * @param borrower The address of the account to modify - * @return Success indicator for whether the market was entered - */ - function addToMarketInternal(VToken vToken, address borrower) internal returns (Error) { - checkActionPauseState(address(vToken), Action.ENTER_MARKET); - - Market storage marketToJoin = markets[address(vToken)]; - ensureListed(marketToJoin); - - if (marketToJoin.accountMembership[borrower]) { - // already joined - return Error.NO_ERROR; - } - - // survived the gauntlet, add to list - // NOTE: we store these somewhat redundantly as a significant optimization - // this avoids having to iterate through the list for the most common use cases - // that is, only when we need to perform liquidity checks - // and not whenever we want to check if an account is in a particular market - marketToJoin.accountMembership[borrower] = true; - accountAssets[borrower].push(vToken); - - emit MarketEntered(vToken, borrower); - - return Error.NO_ERROR; - } - - /** - * @notice Removes asset from sender's account liquidity calculation - * @dev Sender must not have an outstanding borrow balance in the asset, - * or be providing necessary collateral for an outstanding borrow. - * @param vTokenAddress The address of the asset to be removed - * @return Whether or not the account successfully exited the market - */ - function exitMarket(address vTokenAddress) external override returns (uint) { - checkActionPauseState(vTokenAddress, Action.EXIT_MARKET); - - VToken vToken = VToken(vTokenAddress); - /* Get sender tokensHeld and amountOwed underlying from the vToken */ - (uint oErr, uint tokensHeld, uint amountOwed, ) = vToken.getAccountSnapshot(msg.sender); - require(oErr == 0, "getAccountSnapshot failed"); // semi-opaque error code - - /* Fail if the sender has a borrow balance */ - if (amountOwed != 0) { - return fail(Error.NONZERO_BORROW_BALANCE, FailureInfo.EXIT_MARKET_BALANCE_OWED); - } - - /* Fail if the sender is not permitted to redeem all of their tokens */ - uint allowed = redeemAllowedInternal(vTokenAddress, msg.sender, tokensHeld); - if (allowed != 0) { - return failOpaque(Error.REJECTION, FailureInfo.EXIT_MARKET_REJECTION, allowed); - } - - Market storage marketToExit = markets[address(vToken)]; - - /* Return true if the sender is not already ‘in’ the market */ - if (!marketToExit.accountMembership[msg.sender]) { - return uint(Error.NO_ERROR); - } - - /* Set vToken account membership to false */ - delete marketToExit.accountMembership[msg.sender]; - - /* Delete vToken from the account’s list of assets */ - // In order to delete vToken, copy last item in list to location of item to be removed, reduce length by 1 - VToken[] storage userAssetList = accountAssets[msg.sender]; - uint len = userAssetList.length; - uint i; - for (; i < len; ++i) { - if (userAssetList[i] == vToken) { - userAssetList[i] = userAssetList[len - 1]; - userAssetList.pop(); - break; - } - } - - // We *must* have found the asset in the list or our redundant data structure is broken - assert(i < len); - - emit MarketExited(vToken, msg.sender); - - return uint(Error.NO_ERROR); - } - - /*** Policy Hooks ***/ - - /** - * @notice Checks if the account should be allowed to mint tokens in the given market - * @param vToken The market to verify the mint against - * @param minter The account which would get the minted tokens - * @param mintAmount The amount of underlying being supplied to the market in exchange for tokens - * @return 0 if the mint is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) - */ - function mintAllowed(address vToken, address minter, uint mintAmount) external override returns (uint) { - // Pausing is a very serious situation - we revert to sound the alarms - checkProtocolPauseState(); - checkActionPauseState(vToken, Action.MINT); - ensureListed(markets[vToken]); - - uint256 supplyCap = supplyCaps[vToken]; - require(supplyCap != 0, "market supply cap is 0"); - - uint256 vTokenSupply = VToken(vToken).totalSupply(); - Exp memory exchangeRate = Exp({ mantissa: VToken(vToken).exchangeRateStored() }); - uint256 nextTotalSupply = mul_ScalarTruncateAddUInt(exchangeRate, vTokenSupply, mintAmount); - require(nextTotalSupply <= supplyCap, "market supply cap reached"); - - // Keep the flywheel moving - updateVenusSupplyIndex(vToken); - distributeSupplierVenus(vToken, minter); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Checks if the account should be allowed to redeem tokens in the given market - * @param vToken The market to verify the redeem against - * @param redeemer The account which would redeem the tokens - * @param redeemTokens The number of vTokens to exchange for the underlying asset in the market - * @return 0 if the redeem is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) - */ - function redeemAllowed(address vToken, address redeemer, uint redeemTokens) external override returns (uint) { - checkProtocolPauseState(); - checkActionPauseState(vToken, Action.REDEEM); - - uint allowed = redeemAllowedInternal(vToken, redeemer, redeemTokens); - if (allowed != uint(Error.NO_ERROR)) { - return allowed; - } - - // Keep the flywheel moving - updateVenusSupplyIndex(vToken); - distributeSupplierVenus(vToken, redeemer); - - return uint(Error.NO_ERROR); - } - - function redeemAllowedInternal(address vToken, address redeemer, uint redeemTokens) internal view returns (uint) { - ensureListed(markets[vToken]); - - /* If the redeemer is not 'in' the market, then we can bypass the liquidity check */ - if (!markets[vToken].accountMembership[redeemer]) { - return uint(Error.NO_ERROR); - } - - /* Otherwise, perform a hypothetical liquidity check to guard against shortfall */ - (Error err, , uint shortfall) = getHypotheticalAccountLiquidityInternal( - redeemer, - VToken(vToken), - redeemTokens, - 0 - ); - if (err != Error.NO_ERROR) { - return uint(err); - } - if (shortfall != 0) { - return uint(Error.INSUFFICIENT_LIQUIDITY); - } - - return uint(Error.NO_ERROR); - } - - /** - * @notice Checks if the account should be allowed to borrow the underlying asset of the given market - * @param vToken The market to verify the borrow against - * @param borrower The account which would borrow the asset - * @param borrowAmount The amount of underlying the account would borrow - * @return 0 if the borrow is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) - */ - function borrowAllowed(address vToken, address borrower, uint borrowAmount) external override returns (uint) { - // Pausing is a very serious situation - we revert to sound the alarms - checkProtocolPauseState(); - checkActionPauseState(vToken, Action.BORROW); - - ensureListed(markets[vToken]); - - if (!markets[vToken].accountMembership[borrower]) { - // only vTokens may call borrowAllowed if borrower not in market - require(msg.sender == vToken, "sender must be vToken"); - - // attempt to add borrower to the market - Error err = addToMarketInternal(VToken(vToken), borrower); - if (err != Error.NO_ERROR) { - return uint(err); - } - } - - if (oracle.getUnderlyingPrice(VToken(vToken)) == 0) { - return uint(Error.PRICE_ERROR); - } - - uint borrowCap = borrowCaps[vToken]; - // Borrow cap of 0 corresponds to unlimited borrowing - if (borrowCap != 0) { - uint nextTotalBorrows = add_(VToken(vToken).totalBorrows(), borrowAmount); - require(nextTotalBorrows < borrowCap, "market borrow cap reached"); - } - - (Error err, , uint shortfall) = getHypotheticalAccountLiquidityInternal( - borrower, - VToken(vToken), - 0, - borrowAmount - ); - if (err != Error.NO_ERROR) { - return uint(err); - } - if (shortfall != 0) { - return uint(Error.INSUFFICIENT_LIQUIDITY); - } - - // Keep the flywheel moving - Exp memory borrowIndex = Exp({ mantissa: VToken(vToken).borrowIndex() }); - updateVenusBorrowIndex(vToken, borrowIndex); - distributeBorrowerVenus(vToken, borrower, borrowIndex); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Checks if the account should be allowed to repay a borrow in the given market - * @param vToken The market to verify the repay against - * @param payer The account which would repay the asset - * @param borrower The account which borrowed the asset - * @param repayAmount The amount of the underlying asset the account would repay - * @return 0 if the repay is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) - */ - function repayBorrowAllowed( - address vToken, - address payer, // solhint-disable-line no-unused-vars - address borrower, - uint repayAmount // solhint-disable-line no-unused-vars - ) external override returns (uint) { - checkProtocolPauseState(); - checkActionPauseState(vToken, Action.REPAY); - ensureListed(markets[vToken]); - - // Keep the flywheel moving - Exp memory borrowIndex = Exp({ mantissa: VToken(vToken).borrowIndex() }); - updateVenusBorrowIndex(vToken, borrowIndex); - distributeBorrowerVenus(vToken, borrower, borrowIndex); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Checks if the liquidation should be allowed to occur - * @param vTokenBorrowed Asset which was borrowed by the borrower - * @param vTokenCollateral Asset which was used as collateral and will be seized - * @param liquidator The address repaying the borrow and seizing the collateral - * @param borrower The address of the borrower - * @param repayAmount The amount of underlying being repaid - */ - function liquidateBorrowAllowed( - address vTokenBorrowed, - address vTokenCollateral, - address liquidator, - address borrower, - uint repayAmount - ) external override returns (uint) { - checkProtocolPauseState(); - - // if we want to pause liquidating to vTokenCollateral, we should pause seizing - checkActionPauseState(vTokenBorrowed, Action.LIQUIDATE); - - if (liquidatorContract != address(0) && liquidator != liquidatorContract) { - return uint(Error.UNAUTHORIZED); - } - - ensureListed(markets[vTokenCollateral]); - if (address(vTokenBorrowed) != address(vaiController)) { - ensureListed(markets[vTokenBorrowed]); - } - - /* The borrower must have shortfall in order to be liquidatable */ - (Error err, , uint shortfall) = getHypotheticalAccountLiquidityInternal(borrower, VToken(address(0)), 0, 0); - if (err != Error.NO_ERROR) { - return uint(err); - } - if (shortfall == 0) { - return uint(Error.INSUFFICIENT_SHORTFALL); - } - - /* The liquidator may not repay more than what is allowed by the closeFactor */ - uint borrowBalance; - if (address(vTokenBorrowed) != address(vaiController)) { - borrowBalance = VToken(vTokenBorrowed).borrowBalanceStored(borrower); - } else { - borrowBalance = vaiController.getVAIRepayAmount(borrower); - } - // maxClose = multipy of closeFactorMantissa and borrowBalance - if (repayAmount > mul_ScalarTruncate(Exp({ mantissa: closeFactorMantissa }), borrowBalance)) { - return uint(Error.TOO_MUCH_REPAY); - } - - return uint(Error.NO_ERROR); - } - - /** - * @notice Checks if the seizing of assets should be allowed to occur - * @param vTokenCollateral Asset which was used as collateral and will be seized - * @param vTokenBorrowed Asset which was borrowed by the borrower - * @param liquidator The address repaying the borrow and seizing the collateral - * @param borrower The address of the borrower - * @param seizeTokens The number of collateral tokens to seize - */ - function seizeAllowed( - address vTokenCollateral, - address vTokenBorrowed, - address liquidator, - address borrower, - uint seizeTokens // solhint-disable-line no-unused-vars - ) external override returns (uint) { - // Pausing is a very serious situation - we revert to sound the alarms - checkProtocolPauseState(); - checkActionPauseState(vTokenCollateral, Action.SEIZE); - - // We've added VAIController as a borrowed token list check for seize - ensureListed(markets[vTokenCollateral]); - if (address(vTokenBorrowed) != address(vaiController)) { - ensureListed(markets[vTokenBorrowed]); - } - - if (VToken(vTokenCollateral).comptroller() != VToken(vTokenBorrowed).comptroller()) { - return uint(Error.COMPTROLLER_MISMATCH); - } - - // Keep the flywheel moving - updateVenusSupplyIndex(vTokenCollateral); - distributeSupplierVenus(vTokenCollateral, borrower); - distributeSupplierVenus(vTokenCollateral, liquidator); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Checks if the account should be allowed to transfer tokens in the given market - * @param vToken The market to verify the transfer against - * @param src The account which sources the tokens - * @param dst The account which receives the tokens - * @param transferTokens The number of vTokens to transfer - * @return 0 if the transfer is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) - */ - function transferAllowed( - address vToken, - address src, - address dst, - uint transferTokens - ) external override returns (uint) { - // Pausing is a very serious situation - we revert to sound the alarms - checkProtocolPauseState(); - checkActionPauseState(vToken, Action.TRANSFER); - - // Currently the only consideration is whether or not - // the src is allowed to redeem this many tokens - uint allowed = redeemAllowedInternal(vToken, src, transferTokens); - if (allowed != uint(Error.NO_ERROR)) { - return allowed; - } - - // Keep the flywheel moving - updateVenusSupplyIndex(vToken); - distributeSupplierVenus(vToken, src); - distributeSupplierVenus(vToken, dst); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Determine the current account liquidity wrt collateral requirements - * @return (possible error code (semi-opaque), - account liquidity in excess of collateral requirements, - * account shortfall below collateral requirements) - */ - function getAccountLiquidity(address account) external view returns (uint, uint, uint) { - (Error err, uint liquidity, uint shortfall) = getHypotheticalAccountLiquidityInternal( - account, - VToken(address(0)), - 0, - 0 - ); - - return (uint(err), liquidity, shortfall); - } - - /** - * @notice Determine what the account liquidity would be if the given amounts were redeemed/borrowed - * @param vTokenModify The market to hypothetically redeem/borrow in - * @param account The account to determine liquidity for - * @param redeemTokens The number of tokens to hypothetically redeem - * @param borrowAmount The amount of underlying to hypothetically borrow - * @return (possible error code (semi-opaque), - hypothetical account liquidity in excess of collateral requirements, - * hypothetical account shortfall below collateral requirements) - */ - function getHypotheticalAccountLiquidity( - address account, - address vTokenModify, - uint redeemTokens, - uint borrowAmount - ) external view returns (uint, uint, uint) { - (Error err, uint liquidity, uint shortfall) = getHypotheticalAccountLiquidityInternal( - account, - VToken(vTokenModify), - redeemTokens, - borrowAmount - ); - return (uint(err), liquidity, shortfall); - } - - /** - * @notice Determine what the account liquidity would be if the given amounts were redeemed/borrowed - * @param vTokenModify The market to hypothetically redeem/borrow in - * @param account The account to determine liquidity for - * @param redeemTokens The number of tokens to hypothetically redeem - * @param borrowAmount The amount of underlying to hypothetically borrow - * @dev Note that we calculate the exchangeRateStored for each collateral vToken using stored data, - * without calculating accumulated interest. - * @return (possible error code, - hypothetical account liquidity in excess of collateral requirements, - * hypothetical account shortfall below collateral requirements) - */ - function getHypotheticalAccountLiquidityInternal( - address account, - VToken vTokenModify, - uint redeemTokens, - uint borrowAmount - ) internal view returns (Error, uint, uint) { - (uint err, uint liquidity, uint shortfall) = comptrollerLens.getHypotheticalAccountLiquidity( - address(this), - account, - vTokenModify, - redeemTokens, - borrowAmount - ); - return (Error(err), liquidity, shortfall); - } - - /** - * @notice Calculate number of tokens of collateral asset to seize given an underlying amount - * @dev Used in liquidation (called in vToken.liquidateBorrowFresh) - * @param vTokenBorrowed The address of the borrowed vToken - * @param vTokenCollateral The address of the collateral vToken - * @param actualRepayAmount The amount of vTokenBorrowed underlying to convert into vTokenCollateral tokens - * @return (errorCode, number of vTokenCollateral tokens to be seized in a liquidation) - */ - function liquidateCalculateSeizeTokens( - address vTokenBorrowed, - address vTokenCollateral, - uint actualRepayAmount - ) external view override returns (uint, uint) { - (uint err, uint seizeTokens) = comptrollerLens.liquidateCalculateSeizeTokens( - address(this), - vTokenBorrowed, - vTokenCollateral, - actualRepayAmount - ); - return (err, seizeTokens); - } - - /** - * @notice Calculate number of tokens of collateral asset to seize given an underlying amount - * @dev Used in liquidation (called in vToken.liquidateBorrowFresh) - * @param vTokenCollateral The address of the collateral vToken - * @param actualRepayAmount The amount of vTokenBorrowed underlying to convert into vTokenCollateral tokens - * @return (errorCode, number of vTokenCollateral tokens to be seized in a liquidation) - */ - function liquidateVAICalculateSeizeTokens( - address vTokenCollateral, - uint actualRepayAmount - ) external view override returns (uint, uint) { - (uint err, uint seizeTokens) = comptrollerLens.liquidateVAICalculateSeizeTokens( - address(this), - vTokenCollateral, - actualRepayAmount - ); - return (err, seizeTokens); - } - - /*** Admin Functions ***/ - - /** - * @notice Sets a new price oracle for the comptroller - * @dev Admin function to set a new price oracle - * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) - */ - function _setPriceOracle(PriceOracle newOracle) external returns (uint) { - // Check caller is admin - ensureAdmin(); - ensureNonzeroAddress(address(newOracle)); - - // Track the old oracle for the comptroller - PriceOracle oldOracle = oracle; - - // Set comptroller's oracle to newOracle - oracle = newOracle; - - // Emit NewPriceOracle(oldOracle, newOracle) - emit NewPriceOracle(oldOracle, newOracle); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Sets the closeFactor used when liquidating borrows - * @dev Admin function to set closeFactor - * @param newCloseFactorMantissa New close factor, scaled by 1e18 - * @return uint 0=success, otherwise will revert - */ - function _setCloseFactor(uint newCloseFactorMantissa) external returns (uint) { - // Check caller is admin - ensureAdmin(); - - uint oldCloseFactorMantissa = closeFactorMantissa; - closeFactorMantissa = newCloseFactorMantissa; - emit NewCloseFactor(oldCloseFactorMantissa, newCloseFactorMantissa); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Sets the address of the access control of this contract - * @dev Admin function to set the access control address - * @param newAccessControlAddress New address for the access control - * @return uint 0=success, otherwise will revert - */ - function _setAccessControl(address newAccessControlAddress) external returns (uint) { - // Check caller is admin - ensureAdmin(); - ensureNonzeroAddress(newAccessControlAddress); - - address oldAccessControlAddress = accessControl; - accessControl = newAccessControlAddress; - emit NewAccessControl(oldAccessControlAddress, accessControl); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Sets the collateralFactor for a market - * @dev Restricted function to set per-market collateralFactor - * @param vToken The market to set the factor on - * @param newCollateralFactorMantissa The new collateral factor, scaled by 1e18 - * @return uint 0=success, otherwise a failure. (See ErrorReporter for details) - */ - function _setCollateralFactor(VToken vToken, uint newCollateralFactorMantissa) external returns (uint) { - // Check caller is allowed by access control manager - ensureAllowed("_setCollateralFactor(address,uint256)"); - ensureNonzeroAddress(address(vToken)); - - // Verify market is listed - Market storage market = markets[address(vToken)]; - ensureListed(market); - - Exp memory newCollateralFactorExp = Exp({ mantissa: newCollateralFactorMantissa }); - - // Check collateral factor <= 0.9 - Exp memory highLimit = Exp({ mantissa: collateralFactorMaxMantissa }); - if (lessThanExp(highLimit, newCollateralFactorExp)) { - return fail(Error.INVALID_COLLATERAL_FACTOR, FailureInfo.SET_COLLATERAL_FACTOR_VALIDATION); - } - - // If collateral factor != 0, fail if price == 0 - if (newCollateralFactorMantissa != 0 && oracle.getUnderlyingPrice(vToken) == 0) { - return fail(Error.PRICE_ERROR, FailureInfo.SET_COLLATERAL_FACTOR_WITHOUT_PRICE); - } - - // Set market's collateral factor to new collateral factor, remember old value - uint oldCollateralFactorMantissa = market.collateralFactorMantissa; - market.collateralFactorMantissa = newCollateralFactorMantissa; - - // Emit event with asset, old collateral factor, and new collateral factor - emit NewCollateralFactor(vToken, oldCollateralFactorMantissa, newCollateralFactorMantissa); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Sets liquidationIncentive - * @dev Admin function to set liquidationIncentive - * @param newLiquidationIncentiveMantissa New liquidationIncentive scaled by 1e18 - * @return uint 0=success, otherwise a failure. (See ErrorReporter for details) - */ - function _setLiquidationIncentive(uint newLiquidationIncentiveMantissa) external returns (uint) { - ensureAllowed("_setLiquidationIncentive(uint256)"); - - require(newLiquidationIncentiveMantissa >= 1e18, "incentive must be over 1e18"); - - // Save current value for use in log - uint oldLiquidationIncentiveMantissa = liquidationIncentiveMantissa; - - // Set liquidation incentive to new incentive - liquidationIncentiveMantissa = newLiquidationIncentiveMantissa; - - // Emit event with old incentive, new incentive - emit NewLiquidationIncentive(oldLiquidationIncentiveMantissa, newLiquidationIncentiveMantissa); - - return uint(Error.NO_ERROR); - } - - function _setLiquidatorContract(address newLiquidatorContract_) external { - // Check caller is admin - ensureAdmin(); - address oldLiquidatorContract = liquidatorContract; - liquidatorContract = newLiquidatorContract_; - emit NewLiquidatorContract(oldLiquidatorContract, newLiquidatorContract_); - } - - /** - * @notice Add the market to the markets mapping and set it as listed - * @dev Admin function to set isListed and add support for the market - * @param vToken The address of the market (token) to list - * @return uint 0=success, otherwise a failure. (See enum Error for details) - */ - function _supportMarket(VToken vToken) external returns (uint) { - ensureAllowed("_supportMarket(address)"); - - if (markets[address(vToken)].isListed) { - return fail(Error.MARKET_ALREADY_LISTED, FailureInfo.SUPPORT_MARKET_EXISTS); - } - - vToken.isVToken(); // Sanity check to make sure its really a VToken - - // Note that isVenus is not in active use anymore - Market storage newMarket = markets[address(vToken)]; - newMarket.isListed = true; - newMarket.isVenus = false; - newMarket.collateralFactorMantissa = 0; - _addMarketInternal(vToken); - _initializeMarket(address(vToken)); - - emit MarketListed(vToken); - - return uint(Error.NO_ERROR); - } - - function _addMarketInternal(VToken vToken) internal { - for (uint i; i < allMarkets.length; ++i) { - require(allMarkets[i] != vToken, "market already added"); - } - allMarkets.push(vToken); - } - - function _initializeMarket(address vToken) internal { - uint32 blockNumber = safe32(getBlockNumber(), "block number exceeds 32 bits"); - - VenusMarketState storage supplyState = venusSupplyState[vToken]; - VenusMarketState storage borrowState = venusBorrowState[vToken]; - - /* - * Update market state indices - */ - if (supplyState.index == 0) { - // Initialize supply state index with default value - supplyState.index = venusInitialIndex; - } - - if (borrowState.index == 0) { - // Initialize borrow state index with default value - borrowState.index = venusInitialIndex; - } - - /* - * Update market state block numbers - */ - supplyState.block = borrowState.block = blockNumber; - } - - /** - * @notice Admin function to change the Pause Guardian - * @param newPauseGuardian The address of the new Pause Guardian - * @return uint 0=success, otherwise a failure. (See enum Error for details) - */ - function _setPauseGuardian(address newPauseGuardian) external returns (uint) { - ensureAdmin(); - ensureNonzeroAddress(newPauseGuardian); - - // Save current value for inclusion in log - address oldPauseGuardian = pauseGuardian; - - // Store pauseGuardian with value newPauseGuardian - pauseGuardian = newPauseGuardian; - - // Emit NewPauseGuardian(OldPauseGuardian, NewPauseGuardian) - emit NewPauseGuardian(oldPauseGuardian, newPauseGuardian); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Set the given borrow caps for the given vToken markets. Borrowing that brings total borrows to or above borrow cap will revert. - * @dev Access is controled by ACM. A borrow cap of 0 corresponds to unlimited borrowing. - * @param vTokens The addresses of the markets (tokens) to change the borrow caps for - * @param newBorrowCaps The new borrow cap values in underlying to be set. A value of 0 corresponds to unlimited borrowing. - */ - function _setMarketBorrowCaps(VToken[] calldata vTokens, uint[] calldata newBorrowCaps) external { - ensureAllowed("_setMarketBorrowCaps(address[],uint256[])"); - - uint numMarkets = vTokens.length; - uint numBorrowCaps = newBorrowCaps.length; - - require(numMarkets != 0 && numMarkets == numBorrowCaps, "invalid input"); - - for (uint i; i < numMarkets; ++i) { - borrowCaps[address(vTokens[i])] = newBorrowCaps[i]; - emit NewBorrowCap(vTokens[i], newBorrowCaps[i]); - } - } - - /** - * @notice Set the given supply caps for the given vToken markets. Supply that brings total Supply to or above supply cap will revert. - * @dev Admin function to set the supply caps. A supply cap of 0 corresponds to Minting NotAllowed. - * @param vTokens The addresses of the markets (tokens) to change the supply caps for - * @param newSupplyCaps The new supply cap values in underlying to be set. A value of 0 corresponds to Minting NotAllowed. - */ - function _setMarketSupplyCaps(VToken[] calldata vTokens, uint256[] calldata newSupplyCaps) external { - ensureAllowed("_setMarketSupplyCaps(address[],uint256[])"); - - uint numMarkets = vTokens.length; - uint numSupplyCaps = newSupplyCaps.length; - - require(numMarkets != 0 && numMarkets == numSupplyCaps, "invalid input"); - - for (uint i; i < numMarkets; ++i) { - supplyCaps[address(vTokens[i])] = newSupplyCaps[i]; - emit NewSupplyCap(vTokens[i], newSupplyCaps[i]); - } - } - - /** - * @notice Set whole protocol pause/unpause state - */ - function _setProtocolPaused(bool state) external returns (bool) { - ensureAllowed("_setProtocolPaused(bool)"); - - protocolPaused = state; - emit ActionProtocolPaused(state); - return state; - } - - /** - * @notice Pause/unpause certain actions - * @param markets Markets to pause/unpause the actions on - * @param actions List of action ids to pause/unpause - * @param paused The new paused state (true=paused, false=unpaused) - */ - function _setActionsPaused(address[] calldata markets, Action[] calldata actions, bool paused) external { - ensureAllowed("_setActionsPaused(address[],uint256[],bool)"); - - uint256 numMarkets = markets.length; - uint256 numActions = actions.length; - for (uint marketIdx; marketIdx < numMarkets; ++marketIdx) { - for (uint actionIdx; actionIdx < numActions; ++actionIdx) { - setActionPausedInternal(markets[marketIdx], actions[actionIdx], paused); - } - } - } - - /** - * @dev Pause/unpause an action on a market - * @param market Market to pause/unpause the action on - * @param action Action id to pause/unpause - * @param paused The new paused state (true=paused, false=unpaused) - */ - function setActionPausedInternal(address market, Action action, bool paused) internal { - ensureListed(markets[market]); - _actionPaused[market][uint(action)] = paused; - emit ActionPausedMarket(VToken(market), action, paused); - } - - /** - * @notice Sets a new VAI controller - * @dev Admin function to set a new VAI controller - * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) - */ - function _setVAIController(VAIControllerInterface vaiController_) external returns (uint) { - // Check caller is admin - ensureAdmin(); - ensureNonzeroAddress(address(vaiController_)); - - VAIControllerInterface oldVaiController = vaiController; - vaiController = vaiController_; - emit NewVAIController(oldVaiController, vaiController_); - - return uint(Error.NO_ERROR); - } - - function _setVAIMintRate(uint newVAIMintRate) external returns (uint) { - // Check caller is admin - ensureAdmin(); - uint oldVAIMintRate = vaiMintRate; - vaiMintRate = newVAIMintRate; - emit NewVAIMintRate(oldVAIMintRate, newVAIMintRate); - - return uint(Error.NO_ERROR); - } - - function _setTreasuryData( - address newTreasuryGuardian, - address newTreasuryAddress, - uint newTreasuryPercent - ) external returns (uint) { - // Check caller is admin - ensureAdminOr(treasuryGuardian); - - require(newTreasuryPercent < 1e18, "treasury percent cap overflow"); - ensureNonzeroAddress(newTreasuryGuardian); - ensureNonzeroAddress(newTreasuryAddress); - - address oldTreasuryGuardian = treasuryGuardian; - address oldTreasuryAddress = treasuryAddress; - uint oldTreasuryPercent = treasuryPercent; - - treasuryGuardian = newTreasuryGuardian; - treasuryAddress = newTreasuryAddress; - treasuryPercent = newTreasuryPercent; - - emit NewTreasuryGuardian(oldTreasuryGuardian, newTreasuryGuardian); - emit NewTreasuryAddress(oldTreasuryAddress, newTreasuryAddress); - emit NewTreasuryPercent(oldTreasuryPercent, newTreasuryPercent); - - return uint(Error.NO_ERROR); - } - - function _become(Unitroller unitroller) external { - require(msg.sender == unitroller.admin(), "only unitroller admin can"); - require(unitroller._acceptImplementation() == 0, "not authorized"); - - // TODO: Remove this post upgrade - // Should have to change UpdatedComptroller to Comptroller - UpdatedComptroller(address(unitroller))._upgradeSplitVenusRewards(); - } - - function _upgradeSplitVenusRewards() external { - require(msg.sender == comptrollerImplementation, "only brains can become itself"); - - uint32 blockNumber = safe32(getBlockNumber(), "block number exceeds 32 bits"); - - // venusSpeeds -> venusBorrowSpeeds & venusSupplySpeeds t - for (uint256 i; i < allMarkets.length; ++i) { - venusBorrowSpeeds[address(allMarkets[i])] = venusSupplySpeeds[address(allMarkets[i])] = venusSpeeds[ - address(allMarkets[i]) - ]; - delete venusSpeeds[address(allMarkets[i])]; - - /* - * Ensure supply and borrow state indices are all set. If not set, update to default value - */ - VenusMarketState storage supplyState = venusSupplyState[address(allMarkets[i])]; - VenusMarketState storage borrowState = venusBorrowState[address(allMarkets[i])]; - - if (supplyState.index == 0) { - // Initialize supply state index with default value - supplyState.index = venusInitialIndex; - supplyState.block = blockNumber; - } - - if (borrowState.index == 0) { - // Initialize borrow state index with default value - borrowState.index = venusInitialIndex; - borrowState.block = blockNumber; - } - } - } - - /*** Venus Distribution ***/ - - function setVenusSpeedInternal(VToken vToken, uint supplySpeed, uint borrowSpeed) internal { - ensureListed(markets[address(vToken)]); - - if (venusSupplySpeeds[address(vToken)] != supplySpeed) { - // Supply speed updated so let's update supply state to ensure that - // 1. XVS accrued properly for the old speed, and - // 2. XVS accrued at the new speed starts after this block. - - updateVenusSupplyIndex(address(vToken)); - // Update speed and emit event - venusSupplySpeeds[address(vToken)] = supplySpeed; - emit VenusSupplySpeedUpdated(vToken, supplySpeed); - } - - if (venusBorrowSpeeds[address(vToken)] != borrowSpeed) { - // Borrow speed updated so let's update borrow state to ensure that - // 1. XVS accrued properly for the old speed, and - // 2. XVS accrued at the new speed starts after this block. - Exp memory borrowIndex = Exp({ mantissa: vToken.borrowIndex() }); - updateVenusBorrowIndex(address(vToken), borrowIndex); - - // Update speed and emit event - venusBorrowSpeeds[address(vToken)] = borrowSpeed; - emit VenusBorrowSpeedUpdated(vToken, borrowSpeed); - } - } - - /** - * @dev Set ComptrollerLens contract address - */ - function _setComptrollerLens(ComptrollerLensInterface comptrollerLens_) external returns (uint) { - ensureAdmin(); - ensureNonzeroAddress(address(comptrollerLens_)); - address oldComptrollerLens = address(comptrollerLens); - comptrollerLens = comptrollerLens_; - emit NewComptrollerLens(oldComptrollerLens, address(comptrollerLens)); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Accrue XVS to the market by updating the supply index - * @param vToken The market whose supply index to update - */ - function updateVenusSupplyIndex(address vToken) internal { - VenusMarketState storage supplyState = venusSupplyState[vToken]; - uint supplySpeed = venusSupplySpeeds[vToken]; - uint32 blockNumber = safe32(getBlockNumber(), "block number exceeds 32 bits"); - uint deltaBlocks = sub_(uint(blockNumber), uint(supplyState.block)); - if (deltaBlocks > 0 && supplySpeed > 0) { - uint supplyTokens = VToken(vToken).totalSupply(); - uint venusAccrued = mul_(deltaBlocks, supplySpeed); - Double memory ratio = supplyTokens > 0 ? fraction(venusAccrued, supplyTokens) : Double({ mantissa: 0 }); - supplyState.index = safe224( - add_(Double({ mantissa: supplyState.index }), ratio).mantissa, - "new index exceeds 224 bits" - ); - supplyState.block = blockNumber; - } else if (deltaBlocks > 0) { - supplyState.block = blockNumber; - } - } - - /** - * @notice Accrue XVS to the market by updating the borrow index - * @param vToken The market whose borrow index to update - */ - function updateVenusBorrowIndex(address vToken, Exp memory marketBorrowIndex) internal { - VenusMarketState storage borrowState = venusBorrowState[vToken]; - uint borrowSpeed = venusBorrowSpeeds[vToken]; - uint32 blockNumber = safe32(getBlockNumber(), "block number exceeds 32 bits"); - uint deltaBlocks = sub_(uint(blockNumber), uint(borrowState.block)); - if (deltaBlocks > 0 && borrowSpeed > 0) { - uint borrowAmount = div_(VToken(vToken).totalBorrows(), marketBorrowIndex); - uint venusAccrued = mul_(deltaBlocks, borrowSpeed); - Double memory ratio = borrowAmount > 0 ? fraction(venusAccrued, borrowAmount) : Double({ mantissa: 0 }); - borrowState.index = safe224( - add_(Double({ mantissa: borrowState.index }), ratio).mantissa, - "new index exceeds 224 bits" - ); - borrowState.block = blockNumber; - } else if (deltaBlocks > 0) { - borrowState.block = blockNumber; - } - } - - /** - * @notice Calculate XVS accrued by a supplier and possibly transfer it to them - * @param vToken The market in which the supplier is interacting - * @param supplier The address of the supplier to distribute XVS to - */ - function distributeSupplierVenus(address vToken, address supplier) internal { - if (address(vaiVaultAddress) != address(0)) { - releaseToVault(); - } - - uint supplyIndex = venusSupplyState[vToken].index; - uint supplierIndex = venusSupplierIndex[vToken][supplier]; - - // Update supplier's index to the current index since we are distributing accrued XVS - venusSupplierIndex[vToken][supplier] = supplyIndex; - - if (supplierIndex == 0 && supplyIndex >= venusInitialIndex) { - // Covers the case where users supplied tokens before the market's supply state index was set. - // Rewards the user with XVS accrued from the start of when supplier rewards were first - // set for the market. - supplierIndex = venusInitialIndex; - } - - // Calculate change in the cumulative sum of the XVS per vToken accrued - Double memory deltaIndex = Double({ mantissa: sub_(supplyIndex, supplierIndex) }); - - // Multiply of supplierTokens and supplierDelta - uint supplierDelta = mul_(VToken(vToken).balanceOf(supplier), deltaIndex); - - // Addition of supplierAccrued and supplierDelta - venusAccrued[supplier] = add_(venusAccrued[supplier], supplierDelta); - - emit DistributedSupplierVenus(VToken(vToken), supplier, supplierDelta, supplyIndex); - } - - /** - * @notice Calculate XVS accrued by a borrower and possibly transfer it to them - * @dev Borrowers will not begin to accrue until after the first interaction with the protocol. - * @param vToken The market in which the borrower is interacting - * @param borrower The address of the borrower to distribute XVS to - */ - function distributeBorrowerVenus(address vToken, address borrower, Exp memory marketBorrowIndex) internal { - if (address(vaiVaultAddress) != address(0)) { - releaseToVault(); - } - - uint borrowIndex = venusBorrowState[vToken].index; - uint borrowerIndex = venusBorrowerIndex[vToken][borrower]; - - // Update borrowers's index to the current index since we are distributing accrued XVS - venusBorrowerIndex[vToken][borrower] = borrowIndex; - - if (borrowerIndex == 0 && borrowIndex >= venusInitialIndex) { - // Covers the case where users borrowed tokens before the market's borrow state index was set. - // Rewards the user with XVS accrued from the start of when borrower rewards were first - // set for the market. - borrowerIndex = venusInitialIndex; - } - - // Calculate change in the cumulative sum of the XVS per borrowed unit accrued - Double memory deltaIndex = Double({ mantissa: sub_(borrowIndex, borrowerIndex) }); - - uint borrowerDelta = mul_(div_(VToken(vToken).borrowBalanceStored(borrower), marketBorrowIndex), deltaIndex); - - venusAccrued[borrower] = add_(venusAccrued[borrower], borrowerDelta); - - emit DistributedBorrowerVenus(VToken(vToken), borrower, borrowerDelta, borrowIndex); - } - - /** - * @notice Claim all the xvs accrued by holder in all markets and VAI - * @param holder The address to claim XVS for - */ - function claimVenus(address holder) public { - return claimVenus(holder, allMarkets); - } - - /** - * @notice Claim all the xvs accrued by holder in the specified markets - * @param holder The address to claim XVS for - * @param vTokens The list of markets to claim XVS in - */ - function claimVenus(address holder, VToken[] memory vTokens) public { - address[] memory holders = new address[](1); - holders[0] = holder; - claimVenus(holders, vTokens, true, true); - } - - /** - * @notice Claim all xvs accrued by the holders - * @param holders The addresses to claim XVS for - * @param vTokens The list of markets to claim XVS in - * @param borrowers Whether or not to claim XVS earned by borrowing - * @param suppliers Whether or not to claim XVS earned by supplying - */ - function claimVenus(address[] memory holders, VToken[] memory vTokens, bool borrowers, bool suppliers) public { - claimVenus(holders, vTokens, borrowers, suppliers, false); - } - - /** - * @notice Claim all xvs accrued by the holders - * @param holders The addresses to claim XVS for - * @param vTokens The list of markets to claim XVS in - * @param borrowers Whether or not to claim XVS earned by borrowing - * @param suppliers Whether or not to claim XVS earned by supplying - * @param collateral Whether or not to use XVS earned as collateral, only takes effect when the holder has a shortfall - */ - function claimVenus( - address[] memory holders, - VToken[] memory vTokens, - bool borrowers, - bool suppliers, - bool collateral - ) public { - uint j; - uint256 holdersLength = holders.length; - for (uint i; i < vTokens.length; ++i) { - VToken vToken = vTokens[i]; - ensureListed(markets[address(vToken)]); - if (borrowers) { - Exp memory borrowIndex = Exp({ mantissa: vToken.borrowIndex() }); - updateVenusBorrowIndex(address(vToken), borrowIndex); - for (j = 0; j < holdersLength; ++j) { - distributeBorrowerVenus(address(vToken), holders[j], borrowIndex); - } - } - if (suppliers) { - updateVenusSupplyIndex(address(vToken)); - for (j = 0; j < holdersLength; ++j) { - distributeSupplierVenus(address(vToken), holders[j]); - } - } - } - - for (j = 0; j < holdersLength; ++j) { - address holder = holders[j]; - // If there is a positive shortfall, the XVS reward is accrued, - // but won't be granted to this holder - (, , uint shortfall) = getHypotheticalAccountLiquidityInternal(holder, VToken(address(0)), 0, 0); - venusAccrued[holder] = grantXVSInternal(holder, venusAccrued[holder], shortfall, collateral); - } - } - - /** - * @notice Claim all the xvs accrued by holder in all markets, a shorthand for `claimVenus` with collateral set to `true` - * @param holder The address to claim XVS for - */ - function claimVenusAsCollateral(address holder) external { - address[] memory holders = new address[](1); - holders[0] = holder; - claimVenus(holders, allMarkets, true, true, true); - } - - /** - * @notice Transfer XVS to the user with user's shortfall considered - * @dev Note: If there is not enough XVS, we do not perform the transfer all. - * @param user The address of the user to transfer XVS to - * @param amount The amount of XVS to (possibly) transfer - * @param shortfall The shortfall of the user - * @param collateral Whether or not we will use user's venus reward as collateral to pay off the debt - * @return The amount of XVS which was NOT transferred to the user - */ - function grantXVSInternal(address user, uint amount, uint shortfall, bool collateral) internal returns (uint) { - // If the user is blacklisted, they can't get XVS rewards - require( - user != 0xEF044206Db68E40520BfA82D45419d498b4bc7Bf && - user != 0x7589dD3355DAE848FDbF75044A3495351655cB1A && - user != 0x33df7a7F6D44307E1e5F3B15975b47515e5524c0 && - user != 0x24e77E5b74B30b026E9996e4bc3329c881e24968, - "Blacklisted" - ); - - XVS xvs = XVS(getXVSAddress()); - - if (amount == 0 || amount > xvs.balanceOf(address(this))) { - return amount; - } - - if (shortfall == 0) { - xvs.transfer(user, amount); - return 0; - } - // If user's bankrupt and doesn't use pending xvs as collateral, don't grant - // anything, otherwise, we will transfer the pending xvs as collateral to - // vXVS token and mint vXVS for the user. - // - // If mintBehalf failed, don't grant any xvs - require(collateral, "bankrupt accounts can only collateralize their pending xvs rewards"); - - xvs.approve(getXVSVTokenAddress(), amount); - require( - VBep20Interface(getXVSVTokenAddress()).mintBehalf(user, amount) == uint(Error.NO_ERROR), - "mint behalf error during collateralize xvs" - ); - - // set venusAccrue[user] to 0 - return 0; - } - - /*** Venus Distribution Admin ***/ - - /** - * @notice Transfer XVS to the recipient - * @dev Note: If there is not enough XVS, we do not perform the transfer all. - * @param recipient The address of the recipient to transfer XVS to - * @param amount The amount of XVS to (possibly) transfer - */ - function _grantXVS(address recipient, uint amount) external { - ensureAdminOr(comptrollerImplementation); - uint amountLeft = grantXVSInternal(recipient, amount, 0, false); - require(amountLeft == 0, "insufficient xvs for grant"); - emit VenusGranted(recipient, amount); - } - - /** - * @notice Set the amount of XVS distributed per block to VAI Vault - * @param venusVAIVaultRate_ The amount of XVS wei per block to distribute to VAI Vault - */ - function _setVenusVAIVaultRate(uint venusVAIVaultRate_) external { - ensureAdmin(); - - uint oldVenusVAIVaultRate = venusVAIVaultRate; - venusVAIVaultRate = venusVAIVaultRate_; - emit NewVenusVAIVaultRate(oldVenusVAIVaultRate, venusVAIVaultRate_); - } - - /** - * @notice Set the VAI Vault infos - * @param vault_ The address of the VAI Vault - * @param releaseStartBlock_ The start block of release to VAI Vault - * @param minReleaseAmount_ The minimum release amount to VAI Vault - */ - function _setVAIVaultInfo(address vault_, uint256 releaseStartBlock_, uint256 minReleaseAmount_) external { - ensureAdmin(); - ensureNonzeroAddress(vault_); - - vaiVaultAddress = vault_; - releaseStartBlock = releaseStartBlock_; - minReleaseAmount = minReleaseAmount_; - emit NewVAIVaultInfo(vault_, releaseStartBlock_, minReleaseAmount_); - } - - /** - * @notice Set XVS speed for a single market - * @param vTokens The market whose XVS speed to update - * @param supplySpeeds New XVS speed for supply - * @param borrowSpeeds New XVS speed for borrow - */ - function _setVenusSpeeds( - VToken[] calldata vTokens, - uint[] calldata supplySpeeds, - uint[] calldata borrowSpeeds - ) external { - ensureAdminOr(comptrollerImplementation); - - uint numTokens = vTokens.length; - require( - numTokens == supplySpeeds.length && numTokens == borrowSpeeds.length, - "Comptroller::_setVenusSpeeds invalid input" - ); - - for (uint i; i < numTokens; ++i) { - ensureNonzeroAddress(address(vTokens[i])); - setVenusSpeedInternal(vTokens[i], supplySpeeds[i], borrowSpeeds[i]); - } - } - - /** - * @notice Return all of the markets - * @dev The automatic getter may be used to access an individual market. - * @return The list of market addresses - */ - function getAllMarkets() external view returns (VToken[] memory) { - return allMarkets; - } - - function getBlockNumber() public view returns (uint) { - return block.number; - } - - /** - * @notice Return the address of the XVS token - * @return The address of XVS - */ - function getXVSAddress() public view returns (address) { - return 0xcF6BB5389c92Bdda8a3747Ddb454cB7a64626C63; - } - - /** - * @notice Return the address of the XVS vToken - * @return The address of XVS vToken - */ - function getXVSVTokenAddress() public view returns (address) { - return 0x151B1e2635A717bcDc836ECd6FbB62B674FE3E1D; - } - - /** - * @notice Checks if a certain action is paused on a market - * @param action Action id - * @param market vToken address - */ - function actionPaused(address market, Action action) public view returns (bool) { - return _actionPaused[market][uint(action)]; - } - - /*** VAI functions ***/ - - /** - * @notice Set the minted VAI amount of the `owner` - * @param owner The address of the account to set - * @param amount The amount of VAI to set to the account - * @return The number of minted VAI by `owner` - */ - function setMintedVAIOf(address owner, uint amount) external override returns (uint) { - checkProtocolPauseState(); - - // Pausing is a very serious situation - we revert to sound the alarms - require(!mintVAIGuardianPaused && !repayVAIGuardianPaused, "VAI is paused"); - // Check caller is vaiController - if (msg.sender != address(vaiController)) { - return fail(Error.REJECTION, FailureInfo.SET_MINTED_VAI_REJECTION); - } - mintedVAIs[owner] = amount; - - return uint(Error.NO_ERROR); - } - - /** - * @notice Transfer XVS to VAI Vault - */ - function releaseToVault() public { - if (releaseStartBlock == 0 || getBlockNumber() < releaseStartBlock) { - return; - } - - XVS xvs = XVS(getXVSAddress()); - - uint256 xvsBalance = xvs.balanceOf(address(this)); - if (xvsBalance == 0) { - return; - } - - uint256 actualAmount; - uint256 deltaBlocks = sub_(getBlockNumber(), releaseStartBlock); - // releaseAmount = venusVAIVaultRate * deltaBlocks - uint256 _releaseAmount = mul_(venusVAIVaultRate, deltaBlocks); - - if (xvsBalance >= _releaseAmount) { - actualAmount = _releaseAmount; - } else { - actualAmount = xvsBalance; - } - - if (actualAmount < minReleaseAmount) { - return; - } - - releaseStartBlock = getBlockNumber(); - - xvs.transfer(vaiVaultAddress, actualAmount); - emit DistributedVAIVaultVenus(actualAmount); - - IVAIVault(vaiVaultAddress).updatePendingRewards(); - } -} diff --git a/contracts/Comptroller/UpdatedComptrollerInterface.sol b/contracts/Comptroller/UpdatedComptrollerInterface.sol deleted file mode 100644 index a632f2e17..000000000 --- a/contracts/Comptroller/UpdatedComptrollerInterface.sol +++ /dev/null @@ -1,98 +0,0 @@ -pragma solidity 0.8.13; - -import "../Tokens/VTokens/VToken.sol"; -import "../Oracle/PriceOracle.sol"; - -abstract contract UpdatedComptrollerInterfaceG1 { - /// @notice Indicator that this is a Comptroller contract (for inspection) - bool public constant isComptroller = true; - - /*** Assets You Are In ***/ - - function enterMarkets(address[] calldata vTokens) external virtual returns (uint[] memory); - - function exitMarket(address vToken) external virtual returns (uint); - - /*** Policy Hooks ***/ - - function mintAllowed(address vToken, address minter, uint mintAmount) external virtual returns (uint); - - function redeemAllowed(address vToken, address redeemer, uint redeemTokens) external virtual returns (uint); - - function borrowAllowed(address vToken, address borrower, uint borrowAmount) external virtual returns (uint); - - function repayBorrowAllowed( - address vToken, - address payer, - address borrower, - uint repayAmount - ) external virtual returns (uint); - - function liquidateBorrowAllowed( - address vTokenBorrowed, - address vTokenCollateral, - address liquidator, - address borrower, - uint repayAmount - ) external virtual returns (uint); - - function seizeAllowed( - address vTokenCollateral, - address vTokenBorrowed, - address liquidator, - address borrower, - uint seizeTokens - ) external virtual returns (uint); - - function transferAllowed( - address vToken, - address src, - address dst, - uint transferTokens - ) external virtual returns (uint); - - /*** Liquidity/Liquidation Calculations ***/ - - function liquidateCalculateSeizeTokens( - address vTokenBorrowed, - address vTokenCollateral, - uint repayAmount - ) external view virtual returns (uint, uint); - - function setMintedVAIOf(address owner, uint amount) external virtual returns (uint); -} - -abstract contract UpdatedComptrollerInterfaceG2 is UpdatedComptrollerInterfaceG1 { - function liquidateVAICalculateSeizeTokens( - address vTokenCollateral, - uint repayAmount - ) external view virtual returns (uint, uint); -} - -abstract contract UpdatedComptrollerInterface is UpdatedComptrollerInterfaceG2 { - function markets(address) external view virtual returns (bool, uint); - - function oracle() external view virtual returns (PriceOracle); - - function getAccountLiquidity(address) external view virtual returns (uint, uint, uint); - - function getAssetsIn(address) external view virtual returns (VToken[] memory); - - function claimVenus(address) external virtual; - - function venusAccrued(address) external view virtual returns (uint); - - function venusSpeeds(address) external view virtual returns (uint); - - function getAllMarkets() external view virtual returns (VToken[] memory); - - function venusSupplierIndex(address, address) external view virtual returns (uint); - - function venusInitialIndex() external view virtual returns (uint224); - - function venusBorrowerIndex(address, address) external view virtual returns (uint); - - function venusBorrowState(address) external view virtual returns (uint224, uint32); - - function venusSupplyState(address) external view virtual returns (uint224, uint32); -} diff --git a/contracts/test/ComptrollerScenarioG1.sol b/contracts/test/ComptrollerScenarioG1.sol deleted file mode 100644 index 6e3b60a14..000000000 --- a/contracts/test/ComptrollerScenarioG1.sol +++ /dev/null @@ -1,89 +0,0 @@ -pragma solidity 0.8.13; - -import "../Comptroller/ComptrollerG1.sol"; - -contract ComptrollerScenarioG1 is ComptrollerG1 { - uint public blockNumber; - address public xvsAddress; - address public vaiAddress; - /// @notice Supply caps enforced by mintAllowed for each vToken address. Defaults to zero which corresponds to minting notAllowed - mapping(address => uint) public supplyCaps; - - constructor() public ComptrollerG1() {} - - function setXVSAddress(address xvsAddress_) public { - xvsAddress = xvsAddress_; - } - - function getXVSAddress() public view override returns (address) { - return xvsAddress; - } - - function setVAIAddress(address vaiAddress_) public { - vaiAddress = vaiAddress_; - } - - function getVAIAddress() public view returns (address) { - return vaiAddress; - } - - function membershipLength(VToken vToken) public view returns (uint) { - return accountAssets[address(vToken)].length; - } - - function fastForward(uint blocks) public returns (uint) { - blockNumber += blocks; - - return blockNumber; - } - - function setBlockNumber(uint number) public { - blockNumber = number; - } - - function getBlockNumber() public view override returns (uint) { - return blockNumber; - } - - function getVenusMarkets() public view returns (address[] memory) { - uint m = allMarkets.length; - uint n = 0; - for (uint i = 0; i < m; i++) { - if (markets[address(allMarkets[i])].isVenus) { - n++; - } - } - - address[] memory venusMarkets = new address[](n); - uint k = 0; - for (uint i = 0; i < m; i++) { - if (markets[address(allMarkets[i])].isVenus) { - venusMarkets[k++] = address(allMarkets[i]); - } - } - return venusMarkets; - } - - function unlist(VToken vToken) public { - markets[address(vToken)].isListed = false; - } - - /** - * @notice Set the given supply caps for the given vToken markets. Supply that brings total Supply to or above supply cap will revert. - * @dev Admin function to set the supply caps. A supply cap of 0 corresponds to Minting NotAllowed. - * @param vTokens The addresses of the markets (tokens) to change the supply caps for - * @param newSupplyCaps The new supply cap values in underlying to be set. A value of 0 corresponds to Minting NotAllowed. - */ - function _setMarketSupplyCaps(VToken[] calldata vTokens, uint[] calldata newSupplyCaps) external { - require(msg.sender == admin, "only admin can set supply caps"); - - uint numMarkets = vTokens.length; - uint numSupplyCaps = newSupplyCaps.length; - - require(numMarkets != 0 && numMarkets == numSupplyCaps, "invalid input"); - - for (uint i = 0; i < numMarkets; i++) { - supplyCaps[address(vTokens[i])] = newSupplyCaps[i]; - } - } -} diff --git a/contracts/test/ComptrollerScenarioG2.sol b/contracts/test/ComptrollerScenarioG2.sol deleted file mode 100644 index 3e84bdd60..000000000 --- a/contracts/test/ComptrollerScenarioG2.sol +++ /dev/null @@ -1,51 +0,0 @@ -pragma solidity 0.8.13; - -import "../Comptroller/ComptrollerG2.sol"; - -contract ComptrollerScenarioG2 is ComptrollerG2 { - uint public blockNumber; - /// @notice Supply caps enforced by mintAllowed for each vToken address. Defaults to zero which corresponds to minting notAllowed - mapping(address => uint) public supplyCaps; - - constructor() public ComptrollerG2() {} - - function fastForward(uint blocks) public returns (uint) { - blockNumber += blocks; - return blockNumber; - } - - function setBlockNumber(uint number) public { - blockNumber = number; - } - - function membershipLength(VToken vToken) public view returns (uint) { - return accountAssets[address(vToken)].length; - } - - function unlist(VToken vToken) public { - markets[address(vToken)].isListed = false; - } - - function setVenusSpeed(address vToken, uint venusSpeed) public { - venusSpeeds[vToken] = venusSpeed; - } - - /** - * @notice Set the given supply caps for the given vToken markets. Supply that brings total Supply to or above supply cap will revert. - * @dev Admin function to set the supply caps. A supply cap of 0 corresponds to Minting NotAllowed. - * @param vTokens The addresses of the markets (tokens) to change the supply caps for - * @param newSupplyCaps The new supply cap values in underlying to be set. A value of 0 corresponds to Minting NotAllowed. - */ - function _setMarketSupplyCaps(VToken[] calldata vTokens, uint[] calldata newSupplyCaps) external { - require(msg.sender == admin, "only admin can set supply caps"); - - uint numMarkets = vTokens.length; - uint numSupplyCaps = newSupplyCaps.length; - - require(numMarkets != 0 && numMarkets == numSupplyCaps, "invalid input"); - - for (uint i = 0; i < numMarkets; i++) { - supplyCaps[address(vTokens[i])] = newSupplyCaps[i]; - } - } -} diff --git a/contracts/test/ComptrollerScenarioG3.sol b/contracts/test/ComptrollerScenarioG3.sol deleted file mode 100644 index b86deb0cb..000000000 --- a/contracts/test/ComptrollerScenarioG3.sol +++ /dev/null @@ -1,30 +0,0 @@ -pragma solidity 0.8.13; - -import "../Comptroller/ComptrollerG3.sol"; - -contract ComptrollerScenarioG3 is ComptrollerG3 { - uint public blockNumber; - - constructor() public ComptrollerG3() {} - - function fastForward(uint blocks) public returns (uint) { - blockNumber += blocks; - return blockNumber; - } - - function setBlockNumber(uint number) public { - blockNumber = number; - } - - function membershipLength(VToken vToken) public view returns (uint) { - return accountAssets[address(vToken)].length; - } - - function unlist(VToken vToken) public { - markets[address(vToken)].isListed = false; - } - - function setVenusSpeed(address vToken, uint venusSpeed) public { - venusSpeeds[vToken] = venusSpeed; - } -} diff --git a/contracts/test/ComptrollerScenarioG4.sol b/contracts/test/ComptrollerScenarioG4.sol deleted file mode 100644 index 3cf1eed5c..000000000 --- a/contracts/test/ComptrollerScenarioG4.sol +++ /dev/null @@ -1,30 +0,0 @@ -pragma solidity 0.8.13; - -import "../Comptroller/ComptrollerG4.sol"; - -contract ComptrollerScenarioG4 is ComptrollerG4 { - uint public blockNumber; - - constructor() public ComptrollerG4() {} - - function fastForward(uint blocks) public returns (uint) { - blockNumber += blocks; - return blockNumber; - } - - function setBlockNumber(uint number) public { - blockNumber = number; - } - - function membershipLength(VToken vToken) public view returns (uint) { - return accountAssets[address(vToken)].length; - } - - function unlist(VToken vToken) public { - markets[address(vToken)].isListed = false; - } - - function setVenusSpeed(address vToken, uint venusSpeed) public { - venusSpeeds[vToken] = venusSpeed; - } -} diff --git a/contracts/test/ComptrollerScenarioG5.sol b/contracts/test/ComptrollerScenarioG5.sol deleted file mode 100644 index b09a299df..000000000 --- a/contracts/test/ComptrollerScenarioG5.sol +++ /dev/null @@ -1,30 +0,0 @@ -pragma solidity 0.8.13; - -import "../../contracts/Comptroller/ComptrollerG5.sol"; - -contract ComptrollerScenarioG5 is ComptrollerG5 { - uint public blockNumber; - - constructor() public ComptrollerG5() {} - - function fastForward(uint blocks) public returns (uint) { - blockNumber += blocks; - return blockNumber; - } - - function setBlockNumber(uint number) public { - blockNumber = number; - } - - function membershipLength(VToken vToken) public view returns (uint) { - return accountAssets[address(vToken)].length; - } - - function unlist(VToken vToken) public { - markets[address(vToken)].isListed = false; - } - - function setVenusSpeed(address vToken, uint venusSpeed) public { - venusSpeeds[vToken] = venusSpeed; - } -} diff --git a/contracts/test/VAIControllerScenario.sol b/contracts/test/VAIControllerScenario.sol deleted file mode 100644 index 7d7e2bceb..000000000 --- a/contracts/test/VAIControllerScenario.sol +++ /dev/null @@ -1,28 +0,0 @@ -pragma solidity 0.8.13; - -import "../Tokens/VAI/VAIController.sol"; -import "./ComptrollerScenario.sol"; - -contract VAIControllerScenario is VAIController { - uint internal blockNumber; - address public xvsAddress; - address public vaiAddress; - - constructor() public VAIController() {} - - function setVAIAddress(address vaiAddress_) public { - vaiAddress = vaiAddress_; - } - - function getVAIAddress() public view override returns (address) { - return vaiAddress; - } - - function setBlockNumber(uint number) public { - blockNumber = number; - } - - function getBlockNumber() public view override returns (uint) { - return blockNumber; - } -} From a0e90e0943cc498aff7bdc612b5becf08cd528ac Mon Sep 17 00:00:00 2001 From: defcon022 Date: Tue, 28 Mar 2023 09:25:20 +0530 Subject: [PATCH 046/153] Added tests to verify storage. --- contracts/Diamond/facets/MarketFacet.sol | 39 +++ tests/hardhat/Fork/diamondTest.ts | 287 ++++++++++++++--------- 2 files changed, 212 insertions(+), 114 deletions(-) diff --git a/contracts/Diamond/facets/MarketFacet.sol b/contracts/Diamond/facets/MarketFacet.sol index 6745c681a..de5d77a2a 100644 --- a/contracts/Diamond/facets/MarketFacet.sol +++ b/contracts/Diamond/facets/MarketFacet.sol @@ -99,9 +99,48 @@ contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError { return s.venusAccrued[token]; } + function mintedVAIs(address vToken) external view returns (uint) { + return s.mintedVAIs[vToken]; + } function vaiMintRate() external view returns (uint) { return s.vaiMintRate; } + function venusVAIVaultRate() external view returns (uint) { + return s.venusVAIVaultRate; + } + function vaiVaultAddress() external view returns (address) { + return s.vaiVaultAddress; + } + function releaseStartBlock() external view returns (uint256) { + return s.releaseStartBlock; + } + function minReleaseAmount() external view returns (uint256) { + return s.minReleaseAmount; + } + function borrowCapGuardian() external view returns (address) { + return s.borrowCapGuardian; + } + function borrowCaps(address token) external view returns (uint) { + return s.borrowCaps[token]; + } + + function mintVAIGuardianPaused() external view returns(bool){ + return s.mintVAIGuardianPaused; + } + + function repayVAIGuardianPaused() external view returns(bool){ + return s.repayVAIGuardianPaused; + } + + function protocolPaused() external view returns(bool){ + return s.protocolPaused; + } + + function liquidatorContract() externl view returns(address){ + return s.liquidatorContract; + } + + /// @notice Indicator that this is a Comptroller contract (for inspection) function isComptroller() external pure returns (bool) { diff --git a/tests/hardhat/Fork/diamondTest.ts b/tests/hardhat/Fork/diamondTest.ts index 699ae8b58..491e1601e 100644 --- a/tests/hardhat/Fork/diamondTest.ts +++ b/tests/hardhat/Fork/diamondTest.ts @@ -1,11 +1,11 @@ -import { MockContract, smock } from "@defi-wonderland/smock"; -import { impersonateAccount, loadFixture } from "@nomicfoundation/hardhat-network-helpers"; +import { smock } from "@defi-wonderland/smock"; +import { impersonateAccount } from "@nomicfoundation/hardhat-network-helpers"; import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers"; import chai from "chai"; import { parseUnits } from "ethers/lib/utils"; import { ethers, network } from "hardhat"; -import { Comptroller__factory, IERC20Upgradeable, VBep20, VToken__factory, XVS__factory } from "../../../typechain"; +import { IERC20Upgradeable, VBep20 } from "../../../typechain"; const { deployDiamond } = require("../../../script/diamond/deploy"); @@ -31,7 +31,22 @@ let owner, venusSupplyState, venusBorrowState, venusAccrued, - vaiMintRate; + vaiMintRate, + vaiController, + mintedVAIs, + mintVAIGuardianPaused, + repayVAIGuardianPaused, + protocolPaused, + venusVAIVaultRate, + vaiVaultAddress, + releaseStartBlock, + minReleaseAmount, + treasuryGuardian, + treasuryAddress, + treasuryPercent, + liquidatorContract, + comptrollerLens, + market const initMainnetUser = async (user: string) => { await impersonateAccount(user); @@ -80,7 +95,7 @@ forking(26713742, () => { /** * sending gas cost to owner * */ - impersonateAccount(Owner); + await impersonateAccount(Owner); owner = await ethers.getSigner(Owner); const [signer] = await ethers.getSigners(); await signer.sendTransaction({ @@ -118,7 +133,6 @@ forking(26713742, () => { describe("Verify Storage slots", () => { // These tests checks the storage collision of comptroller while updating it via diamond. - // Using mainnet comptroller fork to verify it. describe("Diamond deployed successfully", async () => { it("Owner of Diamond unitroller contract should match", async () => { const diamondUnitrollerAdmin = await diamondUnitroller.admin(); @@ -136,130 +150,175 @@ forking(26713742, () => { }); describe("Verify storage layout", async () => { - it("verify all the state before and after upgrade", async () => { - // unitroller states before the upgrade of diamond - maxAssets = await unitroller.maxAssets(); - closeFactorMantissa = await unitroller.closeFactorMantissa(); - liquidationIncentiveMantissa = await unitroller.liquidationIncentiveMantissa(); - allMarkets = await unitroller.allMarkets(0); - venusRate = await unitroller.venusRate(); - venusSpeeds = await unitroller.venusSpeeds(BUSD.address); - venusSupplyState = await unitroller.venusSupplyState(BUSD.address); - venusBorrowState = await unitroller.venusBorrowState(BUSD.address); - venusAccrued = await unitroller.venusAccrued(BUSD.address); - vaiMintRate = await unitroller.vaiMintRate(); + it.only("verify all the state before and after upgrade", async () => { - // unitroller states after the upgrade of diamond + maxAssets = await unitroller.maxAssets(); const maxAssetsAfterUpgrade = await diamondUnitroller.maxAssets(); - const closeFactorMantissaAfterUpgrade = await diamondUnitroller.closeFactorMantissa(); - const liquidationIncentiveMantissaAfterUpgrade = await diamondUnitroller.liquidationIncentiveMantissa(); - const allMarketsAfterUpgrade = await diamondUnitroller.allMarkets(0); - const venusRateAfterUpgrade = await diamondUnitroller.venusRate(); - const venusSpeedsAfterUpgrade = await diamondUnitroller.venusSpeeds(BUSD.address); - const venusSupplyStateAfterUpgrade = await diamondUnitroller.venusSupplyState(BUSD.address); - const venusBorrowStateAfterUpgrade = await diamondUnitroller.venusBorrowState(BUSD.address); - const venusAccruedAfterUpgrade = await diamondUnitroller.venusAccrued(BUSD.address); - const vaiMintRateAfterUpgrade = await diamondUnitroller.vaiMintRate(); - - // checks states for before and after upgrade to diamond. expect(maxAssets).to.equal(maxAssetsAfterUpgrade); + + closeFactorMantissa = await unitroller.closeFactorMantissa(); + const closeFactorMantissaAfterUpgrade = await diamondUnitroller.closeFactorMantissa(); expect(closeFactorMantissa).to.equal(closeFactorMantissaAfterUpgrade); + + liquidationIncentiveMantissa = await unitroller.liquidationIncentiveMantissa(); + const liquidationIncentiveMantissaAfterUpgrade = await diamondUnitroller.liquidationIncentiveMantissa(); expect(liquidationIncentiveMantissa).to.equal(liquidationIncentiveMantissaAfterUpgrade); + + allMarkets = await unitroller.allMarkets(0); + const allMarketsAfterUpgrade = await diamondUnitroller.allMarkets(0); expect(allMarkets).to.equal(allMarketsAfterUpgrade); + + venusRate = await unitroller.venusRate(); + const venusRateAfterUpgrade = await diamondUnitroller.venusRate(); expect(venusRate).to.equal(venusRateAfterUpgrade); + + venusSpeeds = await unitroller.venusSpeeds(BUSD.address); + const venusSpeedsAfterUpgrade = await diamondUnitroller.venusSpeeds(BUSD.address); expect(venusSpeeds).to.equal(venusSpeedsAfterUpgrade); + + venusSupplyState = await unitroller.venusSupplyState(BUSD.address); + const venusSupplyStateAfterUpgrade = await diamondUnitroller.venusSupplyState(BUSD.address); expect(venusSupplyState.index.toString()).to.equal(venusSupplyStateAfterUpgrade.index.toString()); + + venusBorrowState = await unitroller.venusBorrowState(BUSD.address); + const venusBorrowStateAfterUpgrade = await diamondUnitroller.venusBorrowState(BUSD.address); expect(venusBorrowState.index.toString()).to.equal(venusBorrowStateAfterUpgrade.index.toString()); + + venusAccrued = await unitroller.venusAccrued(BUSD.address); + const venusAccruedAfterUpgrade = await diamondUnitroller.venusAccrued(BUSD.address); expect(venusAccrued).to.equal(venusAccruedAfterUpgrade); + + vaiMintRate = await unitroller.vaiMintRate(); + const vaiMintRateAfterUpgrade = await diamondUnitroller.vaiMintRate(); expect(vaiMintRate).to.equal(vaiMintRateAfterUpgrade); + + vaiController = await unitroller.vaiController(); + const vaiControllerUpgrade = await diamondUnitroller.vaiController(); + expect(vaiControllerUpgrade).to.equal(vaiController) + + mintedVAIs = await unitroller.mintedVAIs(busdHolder.address); + unitroller.minte + const mintedVAIsUpgrade = await diamondUnitroller.mintedVAIs(usdtHolder.address); + expect(mintedVAIsUpgrade).to.equal(mintedVAIs) + + mintVAIGuardianPaused = await unitroller.mintVAIGuardianPaused(); + const mintVAIGuardianPausedUpgrade = (await diamondUnitroller. mintVAIGuardianPaused()); + expect(mintVAIGuardianPausedUpgrade).to.equal(mintVAIGuardianPaused) + + repayVAIGuardianPaused = await unitroller.repayVAIGuardianPaused(); + const repayVAIGuardianPausedUpgrade = (await diamondUnitroller.repayVAIGuardianPaused()); + expect(repayVAIGuardianPausedUpgrade).to.equal(repayVAIGuardianPaused) + + protocolPaused = await unitroller.protocolPaused(); + const protocolPausedUpgrade = await diamondUnitroller.protocolPaused(); + expect(protocolPausedUpgrade).to.equal(protocolPaused) + + venusVAIVaultRate = await unitroller.venusVAIVaultRate(); + const venusVAIVaultRateUpgrade = await diamondUnitroller.venusVAIVaultRate(); + expect(venusVAIVaultRateUpgrade).to.equal(venusVAIVaultRate) + + vaiVaultAddress = await unitroller.vaiVaultAddress(); + const vaiVaultAddressUpgrade = await diamondUnitroller.vaiVaultAddress(); + expect(vaiVaultAddressUpgrade).to.equal(vaiVaultAddress) + + releaseStartBlock = await unitroller.releaseStartBlock(); + const releaseStartBlockUpgrade = await diamondUnitroller.releaseStartBlock(); + expect(releaseStartBlockUpgrade).to.equal(releaseStartBlock) + + minReleaseAmount = await unitroller.minReleaseAmount(); + const minReleaseAmountUpgrade = await diamondUnitroller.minReleaseAmount(); + expect(minReleaseAmountUpgrade).to.equal(minReleaseAmount) + + treasuryGuardian = await unitroller.treasuryGuardian(); + const treasuryGuardianUpgrade = await diamondUnitroller.treasuryGuardian(); + expect(treasuryGuardian).to.equal(treasuryGuardianUpgrade); + + treasuryAddress = await unitroller.treasuryAddress(); + const treasuryAddressUpgrade = await diamondUnitroller.treasuryAddress(); + expect(treasuryAddress).to.equal(treasuryAddressUpgrade); + + treasuryPercent = await unitroller.treasuryPercent(); + const treasuryPercentUpgrade = await diamondUnitroller.treasuryPercent(); + expect(treasuryPercent).to.equal(treasuryPercentUpgrade); + + liquidatorContract = await unitroller.liquidatorContract(); + const liquidatorContractUpgrade = await diamondUnitroller.liquidatorContract(); + expect(liquidatorContract).to.equal(liquidatorContractUpgrade) + + comptrollerLens = await unitroller.comptrollerLens(); + const comptrollerLensUpgrade = await diamondUnitroller.comptrollerLens(); + expect(comptrollerLens).to.equal(comptrollerLensUpgrade) + + // cheking all public mapingns + market = await unitroller.markets(vBUSD.address); + const marketUpgrade = await diamondUnitroller.markets(vBUSD.address); + expect(market.collateralFactorMantissa).to.equal(marketUpgrade.collateralFactorMantissa); + expect(market.isListed).to.equal(marketUpgrade.isListed); + expect(market.isVenus).to.equal(marketUpgrade.isVenus); + + const venusBorrowSpeeds = await unitroller.venusBorrowSpeeds(vUSDT.address); + const venusBorrowSpeedsUpgrade = await diamondUnitroller.venusBorrowSpeeds(vUSDT.address); + const venusSupplySpeeds = await unitroller.venusSupplySpeeds(vUSDT.address); + const venusSupplySpeedsUpgrade = await diamondUnitroller.venusSupplySpeeds(vUSDT.address); + + expect(venusBorrowSpeeds).to.equal(venusBorrowSpeedsUpgrade); + expect(venusSupplySpeeds).to.equal(venusSupplySpeedsUpgrade); + }); }); }); // TODO !! - // describe("Verify states of diamond Contract", () => { - // describe("Diamond setters", () => { - // it("setting market supply cap", async () => { - // expect(await unitroller.supplyCaps(vBUSD.address)).to.equals(0); - // await unitroller._setMarketSupplyCaps([vBUSD.address], [parseUnits("100000", 18)]); - // expect(await unitroller.supplyCaps(vBUSD.address)).to.equals(parseUnits("100000", 18)); - // }); - - // it("checking PriceOracle", async () => { - // await unitroller._setPriceOracle(oracle.address); - // const oracleAddress = await comptroller.oracle(); - // expect(await unitroller.oracle()).to.equals(oracle.address); - // }); - - // it("setting collateral factor", async () => { - // let data = await unitroller.markets(vBUSD.address); - // expect(data.collateralFactorMantissa).to.equals(0); - // await unitroller._setCollateralFactor(vBUSD.address, parseUnits("0.7", 18)); - // data = await unitroller.markets(vBUSD.address); - // expect(data.collateralFactorMantissa).to.equals(parseUnits("0.7", 18)); - // }); - // }); - - // describe("Diamond Hooks", () => { - // it("mint vToken", async () => { - // await BUSD.connect(usdtHolder).transfer(vBUSD.address, 1000); - // await USDT.connect(usdtHolder).approve(vUSDT.address, 110); - // await vUSDT.connect(usdtHolder).mint(110); - // expect(await vUSDT.connect(usdtHolder).balanceOf(usdtHolder.address)).equal(110); - // }); - - // it("redeem vToken", async () => { - // await BUSD.connect(usdtHolder).transfer(vBUSD.address, 1000); - // await USDT.connect(usdtHolder).approve(vUSDT.address, 110); - // await vUSDT.connect(usdtHolder).mint(110); - // await vUSDT.connect(usdtHolder).redeem(10); - // expect(await vUSDT.connect(usdtHolder).balanceOf(usdtHolder.address)).equal(100); - // }); - - // it("Burn vToken", async () => { - // await BUSD.connect(usdtHolder).transfer(vBUSD.address, 1000); - // await USDT.connect(usdtHolder).approve(vUSDT.address, 110); - // await vUSDT.connect(usdtHolder).mint(110); - // await expect(vBUSD.connect(usdtHolder).borrow(10)).to.emit(vBUSD, "Borrow"); - // let borrowBalance; - // [, , borrowBalance] = await vBUSD.getAccountSnapshot(usdtHolder.address); - // expect(borrowBalance).equal(10); - // }); - - // it("Repay vToken", async () => { - // await BUSD.connect(usdtHolder).transfer(vBUSD.address, 1000); - // await USDT.connect(usdtHolder).approve(vUSDT.address, 110); - // await vUSDT.connect(usdtHolder).mint(110); - // await vBUSD.connect(usdtHolder).borrow(10); - // let borrowBalance; - // [, , borrowBalance] = await vBUSD.getAccountSnapshot(usdtHolder.address); - // expect(borrowBalance).equal(10); - // await BUSD.connect(usdtHolder).approve(vBUSD.address, 10); - // await vBUSD.connect(usdtHolder).repayBorrow(10); - // [, , borrowBalance] = await vBUSD.getAccountSnapshot(usdtHolder.address); - // expect(borrowBalance).equal(0); - // }); - - // describe("Diamond Rewards", () => { - // it("grant and claim rewards", async () => { - // await BUSD.connect(usdtHolder).transfer(vBUSD.address, 1000); - // await USDT.connect(usdtHolder).approve(vUSDT.address, 110); - // await vUSDT.connect(usdtHolder).mint(110); - // await vUSDT.connect(usdtHolder).redeem(10); - // await expect(vBUSD.connect(usdtHolder).borrow(10)).to.emit(vBUSD, "Borrow"); - // let borrowBalance; - // [, , borrowBalance] = await vBUSD.getAccountSnapshot(usdtHolder.address); - // expect(borrowBalance).equal(10); - // await BUSD.connect(usdtHolder).approve(vBUSD.address, 10); - // await vBUSD.connect(usdtHolder).repayBorrow(10); - // let xvsS = await unitroller.getXVSAddress(); - - // let vxvsS = await unitroller.getXVSVTokenAddress(); - // XVS = XVS__factory.connect(xvsS, admin); - // XVSV = VToken__factory.connect(vxvsS, admin); - // }); - // }); - // }); - // }); + describe("Verify states of diamond Contract", () => { + describe("Diamond Hooks", () => { + it.only("mint vToken vBUSD", async () => { + const vBUSDBalance = await BUSD.balanceOf(vBUSD.address); + const usdtHolerBalance = (await BUSD.balanceOf(usdtHolder.address)).toString(); + + expect(vBUSDBalance.toString()).to.equal(parseUnits("15088539659055255125122602",0)); + expect(usdtHolerBalance.toString()).to.equal(parseUnits("8839004217706336576688",0)); + + expect(await vBUSD.connect(usdtHolder).mint(1000)).to.emit(vBUSD, "Mint"); + + const newvBUSDBalance = await BUSD.balanceOf(vBUSD.address); + const newUsdtHolerBalance = await BUSD.balanceOf(usdtHolder.address); + + expect(newvBUSDBalance.toString()).to.equal(parseUnits("15088539659055255125123602",0)); + expect(newUsdtHolerBalance.toString()).to.equal(parseUnits("8839004217706336575688",0)); + }); + + it.only("redeem vToken", async () => { + const vBUSDBalance = (await BUSD.balanceOf(vBUSD.address)).toString(); + + expect(await vBUSD.connect(usdtHolder).redeem(1000)).to.emit(vBUSD,"Redeem"); + + const newVBUSDBalance = (await BUSD.balanceOf(vBUSD.address)).toString(); + const newUsdtHolerBalance = (await vBUSD.balanceOf(usdtHolder.address)).toString(); + + expect(Number(vBUSDBalance)).greaterThan(Number(newVBUSDBalance)); + expect(newUsdtHolerBalance).to.equal(parseUnits("54755160421016577",0)); + + }); + + it.only("borrow vToken", async () => { + expect((await BUSD.balanceOf(usdtHolder.address)).toString()).to.equal(parseUnits("8839004217926107052066",0)); + + expect(await vBUSD.connect(usdtHolder).borrow(1000)).to.emit(vBUSD,"Borrow"); + expect((await BUSD.balanceOf(usdtHolder.address)).toString()).to.equal(parseUnits("8839004217926107053066",0)); + + }); + + it.only("Repay vToken", async () => { + expect((await BUSD.balanceOf(usdtHolder.address)).toString()).to.equal(parseUnits("8839004217926107053066",0)); + expect(await vBUSD.connect(usdtHolder).borrow(1000)).to.emit(vBUSD,"Borrow"); + + expect((await BUSD.balanceOf(usdtHolder.address)).toString()).to.equal(parseUnits("8839004217926107054066",0)); + + expect(await vBUSD.connect(usdtHolder).repayBorrow(1000)).to.emit(vBUSD,"RepayBorrow"); + expect((await BUSD.balanceOf(usdtHolder.address)).toString()).to.equal(parseUnits("8839004217926107053066",0)); + + }); + }); + }); } }); From f89e2065af32fd81dc86ea8b7c98c2600a280143 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Tue, 28 Mar 2023 17:54:29 +0530 Subject: [PATCH 047/153] Refactored comptroller contracts. --- contracts/Comptroller/Comptroller.sol | 69 +++-- .../Comptroller/ComptrollerInterface.sol | 89 ++++--- .../Comptroller/ComptrollerLensInterface.sol | 2 +- contracts/Comptroller/ComptrollerStorage.sol | 2 +- contracts/Comptroller/Unitroller.sol | 10 +- .../V0.8.13/ComptrollerInterface.sol | 159 ++++++++++++ .../V0.8.13/ComptrollerLensInterface.sol | 26 ++ .../V0.8.13/ComptrollerStorage.sol | 236 ++++++++++++++++++ contracts/Diamond/Diamond.sol | 16 +- contracts/Diamond/facets/MarketFacet.sol | 4 +- contracts/Diamond/facets/PolicyFacet.sol | 4 +- contracts/Diamond/facets/RewardFacet.sol | 30 +-- contracts/Diamond/facets/SetterFacet.sol | 11 +- .../Diamond/libraries/LibAccessCheck.sol | 6 +- contracts/Diamond/libraries/LibDiamond.sol | 15 ++ contracts/Diamond/libraries/LibHelper.sol | 6 +- contracts/Diamond/libraries/appStorage.sol | 12 +- 17 files changed, 561 insertions(+), 136 deletions(-) create mode 100644 contracts/Comptroller/V0.8.13/ComptrollerInterface.sol create mode 100644 contracts/Comptroller/V0.8.13/ComptrollerLensInterface.sol create mode 100644 contracts/Comptroller/V0.8.13/ComptrollerStorage.sol diff --git a/contracts/Comptroller/Comptroller.sol b/contracts/Comptroller/Comptroller.sol index 3c4bcbbfe..6a15067ba 100644 --- a/contracts/Comptroller/Comptroller.sol +++ b/contracts/Comptroller/Comptroller.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; import "../Oracle/PriceOracle.sol"; import "../Tokens/VTokens/VToken.sol"; @@ -189,7 +189,7 @@ contract Comptroller is ComptrollerV11Storage, ComptrollerInterfaceG2, Comptroll * @param vTokens The list of addresses of the vToken markets to be enabled * @return Success indicator for whether each corresponding market was entered */ - function enterMarkets(address[] calldata vTokens) external override returns (uint[] memory) { + function enterMarkets(address[] calldata vTokens) external returns (uint[] memory) { uint len = vTokens.length; uint[] memory results = new uint[](len); @@ -237,7 +237,7 @@ contract Comptroller is ComptrollerV11Storage, ComptrollerInterfaceG2, Comptroll * @param vTokenAddress The address of the asset to be removed * @return Whether or not the account successfully exited the market */ - function exitMarket(address vTokenAddress) external override returns (uint) { + function exitMarket(address vTokenAddress) external returns (uint) { checkActionPauseState(vTokenAddress, Action.EXIT_MARKET); VToken vToken = VToken(vTokenAddress); @@ -274,7 +274,7 @@ contract Comptroller is ComptrollerV11Storage, ComptrollerInterfaceG2, Comptroll for (; i < len; ++i) { if (userAssetList[i] == vToken) { userAssetList[i] = userAssetList[len - 1]; - userAssetList.pop(); + userAssetList.length--; break; } } @@ -313,7 +313,7 @@ contract Comptroller is ComptrollerV11Storage, ComptrollerInterfaceG2, Comptroll * @param mintAmount The amount of underlying being supplied to the market in exchange for tokens * @return 0 if the mint is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) */ - function mintAllowed(address vToken, address minter, uint mintAmount) external override returns (uint) { + function mintAllowed(address vToken, address minter, uint mintAmount) external returns (uint) { // Pausing is a very serious situation - we revert to sound the alarms checkProtocolPauseState(); checkActionPauseState(vToken, Action.MINT); @@ -341,7 +341,7 @@ contract Comptroller is ComptrollerV11Storage, ComptrollerInterfaceG2, Comptroll * @param actualMintAmount The amount of the underlying asset being minted * @param mintTokens The number of tokens being minted */ - function mintVerify(address vToken, address minter, uint actualMintAmount, uint mintTokens) external override {} + function mintVerify(address vToken, address minter, uint actualMintAmount, uint mintTokens) external {} /** * @notice Checks if the account should be allowed to redeem tokens in the given market @@ -350,7 +350,7 @@ contract Comptroller is ComptrollerV11Storage, ComptrollerInterfaceG2, Comptroll * @param redeemTokens The number of vTokens to exchange for the underlying asset in the market * @return 0 if the redeem is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) */ - function redeemAllowed(address vToken, address redeemer, uint redeemTokens) external override returns (uint) { + function redeemAllowed(address vToken, address redeemer, uint redeemTokens) external returns (uint) { checkProtocolPauseState(); checkActionPauseState(vToken, Action.REDEEM); @@ -399,7 +399,7 @@ contract Comptroller is ComptrollerV11Storage, ComptrollerInterfaceG2, Comptroll * @param redeemTokens The number of tokens being redeemed */ // solhint-disable-next-line no-unused-vars - function redeemVerify(address vToken, address redeemer, uint redeemAmount, uint redeemTokens) external override { + function redeemVerify(address vToken, address redeemer, uint redeemAmount, uint redeemTokens) external { require(redeemTokens != 0 || redeemAmount == 0, "redeemTokens zero"); } @@ -410,7 +410,7 @@ contract Comptroller is ComptrollerV11Storage, ComptrollerInterfaceG2, Comptroll * @param borrowAmount The amount of underlying the account would borrow * @return 0 if the borrow is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) */ - function borrowAllowed(address vToken, address borrower, uint borrowAmount) external override returns (uint) { + function borrowAllowed(address vToken, address borrower, uint borrowAmount) external returns (uint) { // Pausing is a very serious situation - we revert to sound the alarms checkProtocolPauseState(); checkActionPauseState(vToken, Action.BORROW); @@ -466,7 +466,7 @@ contract Comptroller is ComptrollerV11Storage, ComptrollerInterfaceG2, Comptroll * @param borrower The address borrowing the underlying * @param borrowAmount The amount of the underlying asset requested to borrow */ - function borrowVerify(address vToken, address borrower, uint borrowAmount) external override {} + function borrowVerify(address vToken, address borrower, uint borrowAmount) external {} /** * @notice Checks if the account should be allowed to repay a borrow in the given market @@ -483,7 +483,7 @@ contract Comptroller is ComptrollerV11Storage, ComptrollerInterfaceG2, Comptroll address borrower, // solhint-disable-next-line no-unused-vars uint repayAmount - ) external override returns (uint) { + ) external returns (uint) { checkProtocolPauseState(); checkActionPauseState(vToken, Action.REPAY); ensureListed(markets[vToken]); @@ -509,7 +509,7 @@ contract Comptroller is ComptrollerV11Storage, ComptrollerInterfaceG2, Comptroll address borrower, uint actualRepayAmount, uint borrowerIndex - ) external override {} + ) external {} /** * @notice Checks if the liquidation should be allowed to occur @@ -525,7 +525,7 @@ contract Comptroller is ComptrollerV11Storage, ComptrollerInterfaceG2, Comptroll address liquidator, address borrower, uint repayAmount - ) external override returns (uint) { + ) external returns (uint) { checkProtocolPauseState(); // if we want to pause liquidating to vTokenCollateral, we should pause seizing @@ -541,7 +541,7 @@ contract Comptroller is ComptrollerV11Storage, ComptrollerInterfaceG2, Comptroll } /* The borrower must have shortfall in order to be liquidatable */ - (Error err, , uint shortfall) = getHypotheticalAccountLiquidityInternal(borrower, VToken(address(0)), 0, 0); + (Error err, , uint shortfall) = getHypotheticalAccountLiquidityInternal(borrower, VToken(0), 0, 0); if (err != Error.NO_ERROR) { return uint(err); } @@ -580,7 +580,7 @@ contract Comptroller is ComptrollerV11Storage, ComptrollerInterfaceG2, Comptroll address borrower, uint actualRepayAmount, uint seizeTokens - ) external override {} + ) external {} /** * @notice Checks if the seizing of assets should be allowed to occur @@ -596,7 +596,7 @@ contract Comptroller is ComptrollerV11Storage, ComptrollerInterfaceG2, Comptroll address liquidator, address borrower, uint seizeTokens // solhint-disable-line no-unused-vars - ) external override returns (uint) { + ) external returns (uint) { // Pausing is a very serious situation - we revert to sound the alarms checkProtocolPauseState(); checkActionPauseState(vTokenCollateral, Action.SEIZE); @@ -633,7 +633,7 @@ contract Comptroller is ComptrollerV11Storage, ComptrollerInterfaceG2, Comptroll address liquidator, address borrower, uint seizeTokens - ) external override {} + ) external {} /** * @notice Checks if the account should be allowed to transfer tokens in the given market @@ -643,12 +643,7 @@ contract Comptroller is ComptrollerV11Storage, ComptrollerInterfaceG2, Comptroll * @param transferTokens The number of vTokens to transfer * @return 0 if the transfer is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) */ - function transferAllowed( - address vToken, - address src, - address dst, - uint transferTokens - ) external override returns (uint) { + function transferAllowed(address vToken, address src, address dst, uint transferTokens) external returns (uint) { // Pausing is a very serious situation - we revert to sound the alarms checkProtocolPauseState(); checkActionPauseState(vToken, Action.TRANSFER); @@ -675,7 +670,7 @@ contract Comptroller is ComptrollerV11Storage, ComptrollerInterfaceG2, Comptroll * @param dst The account which receives the tokens * @param transferTokens The number of vTokens to transfer */ - function transferVerify(address vToken, address src, address dst, uint transferTokens) external override {} + function transferVerify(address vToken, address src, address dst, uint transferTokens) external {} /** * @notice Determine the current account liquidity wrt collateral requirements @@ -684,12 +679,7 @@ contract Comptroller is ComptrollerV11Storage, ComptrollerInterfaceG2, Comptroll * account shortfall below collateral requirements) */ function getAccountLiquidity(address account) external view returns (uint, uint, uint) { - (Error err, uint liquidity, uint shortfall) = getHypotheticalAccountLiquidityInternal( - account, - VToken(address(0)), - 0, - 0 - ); + (Error err, uint liquidity, uint shortfall) = getHypotheticalAccountLiquidityInternal(account, VToken(0), 0, 0); return (uint(err), liquidity, shortfall); } @@ -759,7 +749,7 @@ contract Comptroller is ComptrollerV11Storage, ComptrollerInterfaceG2, Comptroll address vTokenBorrowed, address vTokenCollateral, uint actualRepayAmount - ) external view override returns (uint, uint) { + ) external view returns (uint, uint) { (uint err, uint seizeTokens) = comptrollerLens.liquidateCalculateSeizeTokens( address(this), vTokenBorrowed, @@ -779,7 +769,7 @@ contract Comptroller is ComptrollerV11Storage, ComptrollerInterfaceG2, Comptroll function liquidateVAICalculateSeizeTokens( address vTokenCollateral, uint actualRepayAmount - ) external view override returns (uint, uint) { + ) external view returns (uint, uint) { (uint err, uint seizeTokens) = comptrollerLens.liquidateVAICalculateSeizeTokens( address(this), vTokenCollateral, @@ -933,10 +923,7 @@ contract Comptroller is ComptrollerV11Storage, ComptrollerInterfaceG2, Comptroll vToken.isVToken(); // Sanity check to make sure its really a VToken // Note that isVenus is not in active use anymore - Market storage newMarket = markets[address(vToken)]; - newMarket.isListed = true; - newMarket.isVenus = false; - newMarket.collateralFactorMantissa = 0; + markets[address(vToken)] = Market({ isListed: true, isVenus: false, collateralFactorMantissa: 0 }); _addMarketInternal(vToken); _initializeMarket(address(vToken)); @@ -1365,7 +1352,7 @@ contract Comptroller is ComptrollerV11Storage, ComptrollerInterfaceG2, Comptroll address holder = holders[j]; // If there is a positive shortfall, the XVS reward is accrued, // but won't be granted to this holder - (, , uint shortfall) = getHypotheticalAccountLiquidityInternal(holder, VToken(address(0)), 0, 0); + (, , uint shortfall) = getHypotheticalAccountLiquidityInternal(holder, VToken(0), 0, 0); venusAccrued[holder] = grantXVSInternal(holder, venusAccrued[holder], shortfall, collateral); } } @@ -1503,7 +1490,7 @@ contract Comptroller is ComptrollerV11Storage, ComptrollerInterfaceG2, Comptroll return allMarkets; } - function getBlockNumber() public view virtual returns (uint) { + function getBlockNumber() public view returns (uint) { return block.number; } @@ -1511,7 +1498,7 @@ contract Comptroller is ComptrollerV11Storage, ComptrollerInterfaceG2, Comptroll * @notice Return the address of the XVS token * @return The address of XVS */ - function getXVSAddress() public view virtual returns (address) { + function getXVSAddress() public view returns (address) { return 0xcF6BB5389c92Bdda8a3747Ddb454cB7a64626C63; } @@ -1519,7 +1506,7 @@ contract Comptroller is ComptrollerV11Storage, ComptrollerInterfaceG2, Comptroll * @notice Return the address of the XVS vToken * @return The address of XVS vToken */ - function getXVSVTokenAddress() public view virtual returns (address) { + function getXVSVTokenAddress() public view returns (address) { return 0x151B1e2635A717bcDc836ECd6FbB62B674FE3E1D; } @@ -1540,7 +1527,7 @@ contract Comptroller is ComptrollerV11Storage, ComptrollerInterfaceG2, Comptroll * @param amount The amount of VAI to set to the account * @return The number of minted VAI by `owner` */ - function setMintedVAIOf(address owner, uint amount) external override returns (uint) { + function setMintedVAIOf(address owner, uint amount) external returns (uint) { checkProtocolPauseState(); // Pausing is a very serious situation - we revert to sound the alarms diff --git a/contracts/Comptroller/ComptrollerInterface.sol b/contracts/Comptroller/ComptrollerInterface.sol index e539b50c0..c8695bc86 100644 --- a/contracts/Comptroller/ComptrollerInterface.sol +++ b/contracts/Comptroller/ComptrollerInterface.sol @@ -1,38 +1,38 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; import "../Tokens/VTokens/VToken.sol"; import "../Oracle/PriceOracle.sol"; -abstract contract ComptrollerInterfaceG1 { +contract ComptrollerInterfaceG1 { /// @notice Indicator that this is a Comptroller contract (for inspection) bool public constant isComptroller = true; /*** Assets You Are In ***/ - function enterMarkets(address[] calldata vTokens) external virtual returns (uint[] memory); + function enterMarkets(address[] calldata vTokens) external returns (uint[] memory); - function exitMarket(address vToken) external virtual returns (uint); + function exitMarket(address vToken) external returns (uint); /*** Policy Hooks ***/ - function mintAllowed(address vToken, address minter, uint mintAmount) external virtual returns (uint); + function mintAllowed(address vToken, address minter, uint mintAmount) external returns (uint); - function mintVerify(address vToken, address minter, uint mintAmount, uint mintTokens) external virtual; + function mintVerify(address vToken, address minter, uint mintAmount, uint mintTokens) external; - function redeemAllowed(address vToken, address redeemer, uint redeemTokens) external virtual returns (uint); + function redeemAllowed(address vToken, address redeemer, uint redeemTokens) external returns (uint); - function redeemVerify(address vToken, address redeemer, uint redeemAmount, uint redeemTokens) external virtual; + function redeemVerify(address vToken, address redeemer, uint redeemAmount, uint redeemTokens) external; - function borrowAllowed(address vToken, address borrower, uint borrowAmount) external virtual returns (uint); + function borrowAllowed(address vToken, address borrower, uint borrowAmount) external returns (uint); - function borrowVerify(address vToken, address borrower, uint borrowAmount) external virtual {} + function borrowVerify(address vToken, address borrower, uint borrowAmount) external; function repayBorrowAllowed( address vToken, address payer, address borrower, uint repayAmount - ) external virtual returns (uint); + ) external returns (uint); function repayBorrowVerify( address vToken, @@ -40,7 +40,7 @@ abstract contract ComptrollerInterfaceG1 { address borrower, uint repayAmount, uint borrowerIndex - ) external virtual; + ) external; function liquidateBorrowAllowed( address vTokenBorrowed, @@ -48,7 +48,7 @@ abstract contract ComptrollerInterfaceG1 { address liquidator, address borrower, uint repayAmount - ) external virtual returns (uint); + ) external returns (uint); function liquidateBorrowVerify( address vTokenBorrowed, @@ -57,7 +57,7 @@ abstract contract ComptrollerInterfaceG1 { address borrower, uint repayAmount, uint seizeTokens - ) external virtual; + ) external; function seizeAllowed( address vTokenCollateral, @@ -65,7 +65,7 @@ abstract contract ComptrollerInterfaceG1 { address liquidator, address borrower, uint seizeTokens - ) external virtual returns (uint); + ) external returns (uint); function seizeVerify( address vTokenCollateral, @@ -73,16 +73,11 @@ abstract contract ComptrollerInterfaceG1 { address liquidator, address borrower, uint seizeTokens - ) external virtual; + ) external; - function transferAllowed( - address vToken, - address src, - address dst, - uint transferTokens - ) external virtual returns (uint); + function transferAllowed(address vToken, address src, address dst, uint transferTokens) external returns (uint); - function transferVerify(address vToken, address src, address dst, uint transferTokens) external virtual; + function transferVerify(address vToken, address src, address dst, uint transferTokens) external; /*** Liquidity/Liquidation Calculations ***/ @@ -90,59 +85,59 @@ abstract contract ComptrollerInterfaceG1 { address vTokenBorrowed, address vTokenCollateral, uint repayAmount - ) external view virtual returns (uint, uint); + ) external view returns (uint, uint); - function setMintedVAIOf(address owner, uint amount) external virtual returns (uint); + function setMintedVAIOf(address owner, uint amount) external returns (uint); } -abstract contract ComptrollerInterfaceG2 is ComptrollerInterfaceG1 { +contract ComptrollerInterfaceG2 is ComptrollerInterfaceG1 { function liquidateVAICalculateSeizeTokens( address vTokenCollateral, uint repayAmount - ) external view virtual returns (uint, uint); + ) external view returns (uint, uint); } -abstract contract ComptrollerInterfaceG3 is ComptrollerInterfaceG2 { +contract ComptrollerInterfaceG3 is ComptrollerInterfaceG2 { function liquidateVAICalculateSeizeTokens( address vTokenCollateral, uint repayAmount - ) external view virtual override returns (uint, uint) {} + ) external view returns (uint, uint); } -abstract contract ComptrollerInterfaceG4 is ComptrollerInterfaceG3 { - function getXVSAddress() public view virtual returns (address); +contract ComptrollerInterfaceG4 is ComptrollerInterfaceG3 { + function getXVSAddress() public view returns (address); } -abstract contract ComptrollerInterface is ComptrollerInterfaceG4 { - function markets(address) external view virtual returns (bool, uint); +contract ComptrollerInterface is ComptrollerInterfaceG4 { + function markets(address) external view returns (bool, uint); - function oracle() external view virtual returns (PriceOracle); + function oracle() external view returns (PriceOracle); - function getAccountLiquidity(address) external view virtual returns (uint, uint, uint); + function getAccountLiquidity(address) external view returns (uint, uint, uint); - function getAssetsIn(address) external view virtual returns (VToken[] memory); + function getAssetsIn(address) external view returns (VToken[] memory); - function claimVenus(address) external virtual; + function claimVenus(address) external; - function venusAccrued(address) external view virtual returns (uint); + function venusAccrued(address) external view returns (uint); - function venusSupplySpeeds(address) external view virtual returns (uint); + function venusSupplySpeeds(address) external view returns (uint); - function venusBorrowSpeeds(address) external view virtual returns (uint); + function venusBorrowSpeeds(address) external view returns (uint); - function getAllMarkets() external view virtual returns (VToken[] memory); + function getAllMarkets() external view returns (VToken[] memory); - function venusSupplierIndex(address, address) external view virtual returns (uint); + function venusSupplierIndex(address, address) external view returns (uint); - function venusInitialIndex() external view virtual returns (uint224); + function venusInitialIndex() external view returns (uint224); - function venusBorrowerIndex(address, address) external view virtual returns (uint); + function venusBorrowerIndex(address, address) external view returns (uint); - function venusBorrowState(address) external view virtual returns (uint224, uint32); + function venusBorrowState(address) external view returns (uint224, uint32); - function venusSupplyState(address) external view virtual returns (uint224, uint32); + function venusSupplyState(address) external view returns (uint224, uint32); - function approvedDelegates(address borrower, address delegate) external view virtual returns (bool); + function approvedDelegates(address borrower, address delegate) external view returns (bool); } interface IVAIVault { diff --git a/contracts/Comptroller/ComptrollerLensInterface.sol b/contracts/Comptroller/ComptrollerLensInterface.sol index 40eb14ffe..2f56b52c3 100644 --- a/contracts/Comptroller/ComptrollerLensInterface.sol +++ b/contracts/Comptroller/ComptrollerLensInterface.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; pragma experimental ABIEncoderV2; import "../Tokens/VTokens/VToken.sol"; diff --git a/contracts/Comptroller/ComptrollerStorage.sol b/contracts/Comptroller/ComptrollerStorage.sol index 8024688e2..491ba8615 100644 --- a/contracts/Comptroller/ComptrollerStorage.sol +++ b/contracts/Comptroller/ComptrollerStorage.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; import "../Tokens/VTokens/VToken.sol"; import "../Oracle/PriceOracle.sol"; diff --git a/contracts/Comptroller/Unitroller.sol b/contracts/Comptroller/Unitroller.sol index 034cd3ac0..58aeb366a 100644 --- a/contracts/Comptroller/Unitroller.sol +++ b/contracts/Comptroller/Unitroller.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; import "./ComptrollerStorage.sol"; import "../Utils/ErrorReporter.sol"; @@ -130,20 +130,20 @@ contract Unitroller is UnitrollerAdminStorage, ComptrollerErrorReporter { * It returns to the external caller whatever the implementation returns * or forwards reverts. */ - fallback() external payable { + function() external payable { // delegate all other functions to current implementation (bool success, ) = comptrollerImplementation.delegatecall(msg.data); assembly { let free_mem_ptr := mload(0x40) - returndatacopy(free_mem_ptr, 0, returndatasize()) + returndatacopy(free_mem_ptr, 0, returndatasize) switch success case 0 { - revert(free_mem_ptr, returndatasize()) + revert(free_mem_ptr, returndatasize) } default { - return(free_mem_ptr, returndatasize()) + return(free_mem_ptr, returndatasize) } } } diff --git a/contracts/Comptroller/V0.8.13/ComptrollerInterface.sol b/contracts/Comptroller/V0.8.13/ComptrollerInterface.sol new file mode 100644 index 000000000..56eb0b190 --- /dev/null +++ b/contracts/Comptroller/V0.8.13/ComptrollerInterface.sol @@ -0,0 +1,159 @@ +pragma solidity 0.8.13; + +import "../../Tokens/V0.8.13/VTokens/VToken.sol"; +import "../../Oracle/V0.8.13/PriceOracle.sol"; + +abstract contract ComptrollerInterfaceG1 { + /// @notice Indicator that this is a Comptroller contract (for inspection) + bool public constant isComptroller = true; + + /*** Assets You Are In ***/ + + function enterMarkets(address[] calldata vTokens) external virtual returns (uint[] memory); + + function exitMarket(address vToken) external virtual returns (uint); + + /*** Policy Hooks ***/ + + function mintAllowed(address vToken, address minter, uint mintAmount) external virtual returns (uint); + + function mintVerify(address vToken, address minter, uint mintAmount, uint mintTokens) external virtual; + + function redeemAllowed(address vToken, address redeemer, uint redeemTokens) external virtual returns (uint); + + function redeemVerify(address vToken, address redeemer, uint redeemAmount, uint redeemTokens) external virtual; + + function borrowAllowed(address vToken, address borrower, uint borrowAmount) external virtual returns (uint); + + function borrowVerify(address vToken, address borrower, uint borrowAmount) external virtual {} + + function repayBorrowAllowed( + address vToken, + address payer, + address borrower, + uint repayAmount + ) external virtual returns (uint); + + function repayBorrowVerify( + address vToken, + address payer, + address borrower, + uint repayAmount, + uint borrowerIndex + ) external virtual; + + function liquidateBorrowAllowed( + address vTokenBorrowed, + address vTokenCollateral, + address liquidator, + address borrower, + uint repayAmount + ) external virtual returns (uint); + + function liquidateBorrowVerify( + address vTokenBorrowed, + address vTokenCollateral, + address liquidator, + address borrower, + uint repayAmount, + uint seizeTokens + ) external virtual; + + function seizeAllowed( + address vTokenCollateral, + address vTokenBorrowed, + address liquidator, + address borrower, + uint seizeTokens + ) external virtual returns (uint); + + function seizeVerify( + address vTokenCollateral, + address vTokenBorrowed, + address liquidator, + address borrower, + uint seizeTokens + ) external virtual; + + function transferAllowed( + address vToken, + address src, + address dst, + uint transferTokens + ) external virtual returns (uint); + + function transferVerify(address vToken, address src, address dst, uint transferTokens) external virtual; + + /*** Liquidity/Liquidation Calculations ***/ + + function liquidateCalculateSeizeTokens( + address vTokenBorrowed, + address vTokenCollateral, + uint repayAmount + ) external view virtual returns (uint, uint); + + function setMintedVAIOf(address owner, uint amount) external virtual returns (uint); +} + +abstract contract ComptrollerInterfaceG2 is ComptrollerInterfaceG1 { + function liquidateVAICalculateSeizeTokens( + address vTokenCollateral, + uint repayAmount + ) external view virtual returns (uint, uint); +} + +abstract contract ComptrollerInterfaceG3 is ComptrollerInterfaceG2 { + function liquidateVAICalculateSeizeTokens( + address vTokenCollateral, + uint repayAmount + ) external view virtual override returns (uint, uint) {} +} + +abstract contract ComptrollerInterfaceG4 is ComptrollerInterfaceG3 { + function getXVSAddress() public view virtual returns (address); +} + +abstract contract ComptrollerInterface is ComptrollerInterfaceG4 { + function markets(address) external view virtual returns (bool, uint); + + function oracle() external view virtual returns (PriceOracle); + + function getAccountLiquidity(address) external view virtual returns (uint, uint, uint); + + function getAssetsIn(address) external view virtual returns (VToken[] memory); + + function claimVenus(address) external virtual; + + function venusAccrued(address) external view virtual returns (uint); + + function venusSupplySpeeds(address) external view virtual returns (uint); + + function venusBorrowSpeeds(address) external view virtual returns (uint); + + function getAllMarkets() external view virtual returns (VToken[] memory); + + function venusSupplierIndex(address, address) external view virtual returns (uint); + + function venusInitialIndex() external view virtual returns (uint224); + + function venusBorrowerIndex(address, address) external view virtual returns (uint); + + function venusBorrowState(address) external view virtual returns (uint224, uint32); + + function venusSupplyState(address) external view virtual returns (uint224, uint32); + + function approvedDelegates(address borrower, address delegate) external view virtual returns (bool); +} + +interface IVAIVault { + function updatePendingRewards() external; +} + +interface IComptroller { + function liquidationIncentiveMantissa() external view returns (uint); + + /*** Treasury Data ***/ + function treasuryAddress() external view returns (address); + + function treasuryPercent() external view returns (uint); +} diff --git a/contracts/Comptroller/V0.8.13/ComptrollerLensInterface.sol b/contracts/Comptroller/V0.8.13/ComptrollerLensInterface.sol new file mode 100644 index 000000000..3b337c7cf --- /dev/null +++ b/contracts/Comptroller/V0.8.13/ComptrollerLensInterface.sol @@ -0,0 +1,26 @@ +pragma solidity 0.8.13; + +import "../../Tokens/V0.8.13/VTokens/VToken.sol"; + +interface ComptrollerLensInterface { + function liquidateCalculateSeizeTokens( + address comptroller, + address vTokenBorrowed, + address vTokenCollateral, + uint actualRepayAmount + ) external view returns (uint, uint); + + function liquidateVAICalculateSeizeTokens( + address comptroller, + address vTokenCollateral, + uint actualRepayAmount + ) external view returns (uint, uint); + + function getHypotheticalAccountLiquidity( + address comptroller, + address account, + VToken vTokenModify, + uint redeemTokens, + uint borrowAmount + ) external view returns (uint, uint, uint); +} diff --git a/contracts/Comptroller/V0.8.13/ComptrollerStorage.sol b/contracts/Comptroller/V0.8.13/ComptrollerStorage.sol new file mode 100644 index 000000000..108056d61 --- /dev/null +++ b/contracts/Comptroller/V0.8.13/ComptrollerStorage.sol @@ -0,0 +1,236 @@ +pragma solidity 0.8.13; + +import "../../Tokens/V0.8.13/VTokens/VToken.sol"; +import "../../Oracle/V0.8.13/PriceOracle.sol"; +import "../../Tokens/V0.8.13/VAI/VAIControllerInterface.sol"; +import "./ComptrollerLensInterface.sol"; + +contract UnitrollerAdminStorage { + /** + * @notice Administrator for this contract + */ + address public admin; + + /** + * @notice Pending administrator for this contract + */ + address public pendingAdmin; + + /** + * @notice Active brains of Unitroller + */ + address public comptrollerImplementation; + + /** + * @notice Pending brains of Unitroller + */ + address public pendingComptrollerImplementation; +} + +contract ComptrollerV1Storage is UnitrollerAdminStorage { + /** + * @notice Oracle which gives the price of any given asset + */ + PriceOracle public oracle; + + /** + * @notice Multiplier used to calculate the maximum repayAmount when liquidating a borrow + */ + uint public closeFactorMantissa; + + /** + * @notice Multiplier representing the discount on collateral that a liquidator receives + */ + uint public liquidationIncentiveMantissa; + + /** + * @notice Max number of assets a single account can participate in (borrow or use as collateral) + */ + uint public maxAssets; + + /** + * @notice Per-account mapping of "assets you are in", capped by maxAssets + */ + mapping(address => VToken[]) public accountAssets; + + struct Market { + /// @notice Whether or not this market is listed + bool isListed; + /** + * @notice Multiplier representing the most one can borrow against their collateral in this market. + * For instance, 0.9 to allow borrowing 90% of collateral value. + * Must be between 0 and 1, and stored as a mantissa. + */ + uint collateralFactorMantissa; + /// @notice Per-market mapping of "accounts in this asset" + mapping(address => bool) accountMembership; + /// @notice Whether or not this market receives XVS + bool isVenus; + } + + /** + * @notice Official mapping of vTokens -> Market metadata + * @dev Used e.g. to determine if a market is supported + */ + mapping(address => Market) public markets; + + /** + * @notice The Pause Guardian can pause certain actions as a safety mechanism. + */ + address public pauseGuardian; + + /// @notice Whether minting is paused (deprecated, superseded by actionPaused) + bool private _mintGuardianPaused; + /// @notice Whether borrowing is paused (deprecated, superseded by actionPaused) + bool private _borrowGuardianPaused; + /// @notice Whether borrowing is paused (deprecated, superseded by actionPaused) + bool internal transferGuardianPaused; + /// @notice Whether borrowing is paused (deprecated, superseded by actionPaused) + bool internal seizeGuardianPaused; + /// @notice Whether borrowing is paused (deprecated, superseded by actionPaused) + mapping(address => bool) internal mintGuardianPaused; + /// @notice Whether borrowing is paused (deprecated, superseded by actionPaused) + mapping(address => bool) internal borrowGuardianPaused; + + struct VenusMarketState { + /// @notice The market's last updated venusBorrowIndex or venusSupplyIndex + uint224 index; + /// @notice The block number the index was last updated at + uint32 block; + } + + /// @notice A list of all markets + VToken[] public allMarkets; + + /// @notice The rate at which the flywheel distributes XVS, per block + uint public venusRate; + + /// @notice The portion of venusRate that each market currently receives + mapping(address => uint) public venusSpeeds; + + /// @notice The Venus market supply state for each market + mapping(address => VenusMarketState) public venusSupplyState; + + /// @notice The Venus market borrow state for each market + mapping(address => VenusMarketState) public venusBorrowState; + + /// @notice The Venus supply index for each market for each supplier as of the last time they accrued XVS + mapping(address => mapping(address => uint)) public venusSupplierIndex; + + /// @notice The Venus borrow index for each market for each borrower as of the last time they accrued XVS + mapping(address => mapping(address => uint)) public venusBorrowerIndex; + + /// @notice The XVS accrued but not yet transferred to each user + mapping(address => uint) public venusAccrued; + + /// @notice The Address of VAIController + VAIControllerInterface public vaiController; + + /// @notice The minted VAI amount to each user + mapping(address => uint) public mintedVAIs; + + /// @notice VAI Mint Rate as a percentage + uint public vaiMintRate; + + /** + * @notice The Pause Guardian can pause certain actions as a safety mechanism. + */ + bool public mintVAIGuardianPaused; + bool public repayVAIGuardianPaused; + + /** + * @notice Pause/Unpause whole protocol actions + */ + bool public protocolPaused; + + /// @notice The rate at which the flywheel distributes XVS to VAI Minters, per block (deprecated) + uint private venusVAIRate; +} + +contract ComptrollerV2Storage is ComptrollerV1Storage { + /// @notice The rate at which the flywheel distributes XVS to VAI Vault, per block + uint public venusVAIVaultRate; + + // address of VAI Vault + address public vaiVaultAddress; + + // start block of release to VAI Vault + uint256 public releaseStartBlock; + + // minimum release amount to VAI Vault + uint256 public minReleaseAmount; +} + +contract ComptrollerV3Storage is ComptrollerV2Storage { + /// @notice The borrowCapGuardian can set borrowCaps to any number for any market. Lowering the borrow cap could disable borrowing on the given market. + address public borrowCapGuardian; + + /// @notice Borrow caps enforced by borrowAllowed for each vToken address. Defaults to zero which corresponds to unlimited borrowing. + mapping(address => uint) public borrowCaps; +} + +contract ComptrollerV4Storage is ComptrollerV3Storage { + /// @notice Treasury Guardian address + address public treasuryGuardian; + + /// @notice Treasury address + address public treasuryAddress; + + /// @notice Fee percent of accrued interest with decimal 18 + uint256 public treasuryPercent; +} + +contract ComptrollerV5Storage is ComptrollerV4Storage { + /// @notice The portion of XVS that each contributor receives per block (deprecated) + mapping(address => uint) private venusContributorSpeeds; + + /// @notice Last block at which a contributor's XVS rewards have been allocated (deprecated) + mapping(address => uint) private lastContributorBlock; +} + +contract ComptrollerV6Storage is ComptrollerV5Storage { + address public liquidatorContract; +} + +contract ComptrollerV7Storage is ComptrollerV6Storage { + ComptrollerLensInterface public comptrollerLens; +} + +contract ComptrollerV8Storage is ComptrollerV7Storage { + /// @notice Supply caps enforced by mintAllowed for each vToken address. Defaults to zero which corresponds to minting notAllowed + mapping(address => uint256) public supplyCaps; +} + +contract ComptrollerV9Storage is ComptrollerV8Storage { + /// @notice AccessControlManager address + address internal accessControl; + + enum Action { + MINT, + REDEEM, + BORROW, + REPAY, + SEIZE, + LIQUIDATE, + TRANSFER, + ENTER_MARKET, + EXIT_MARKET + } + + /// @notice True if a certain action is paused on a certain market + mapping(address => mapping(uint => bool)) internal _actionPaused; +} + +contract ComptrollerV10Storage is ComptrollerV9Storage { + /// @notice The rate at which venus is distributed to the corresponding borrow market (per block) + mapping(address => uint) public venusBorrowSpeeds; + + /// @notice The rate at which venus is distributed to the corresponding supply market (per block) + mapping(address => uint) public venusSupplySpeeds; +} + +contract ComptrollerV11Storage is ComptrollerV10Storage { + /// @notice Whether the delegate is allowed to borrow on behalf of the borrower + //mapping(address borrower => mapping (address delegate => bool approved)) public approvedDelegates; + mapping(address => mapping(address => bool)) public approvedDelegates; +} diff --git a/contracts/Diamond/Diamond.sol b/contracts/Diamond/Diamond.sol index f75b8e76b..2df6c3397 100644 --- a/contracts/Diamond/Diamond.sol +++ b/contracts/Diamond/Diamond.sol @@ -4,13 +4,18 @@ import { LibDiamond } from "./libraries/LibDiamond.sol"; import { AppStorage } from "./libraries/appStorage.sol"; import { IDiamondCut } from "./interfaces/IDiamondCut.sol"; -import "../Comptroller/Unitroller.sol"; + +interface IUnitroller { + function admin() external view returns(address); + function _acceptImplementation() external returns (uint); +} contract Diamond { AppStorage internal s; - constructor(address _contractOwner) payable { + constructor(address _contractOwner, address _unitrollerAddress) payable { LibDiamond.setContractOwner(_contractOwner); + LibDiamond.setUnitrollerAddress(_unitrollerAddress); } function facetCutInitilizer(address _diamondCutFacet) external { @@ -27,9 +32,10 @@ contract Diamond { LibDiamond.libDiamondCut(cut, address(0), ""); } - function _become(Unitroller unitroller) external { - require(msg.sender == unitroller.admin(), "only unitroller admin can"); - require(unitroller._acceptImplementation() == 0, "not authorized"); + function _become() external { + address unitrollerAddress = LibDiamond.getUnitrollerAddress(); + require(msg.sender == IUnitroller(unitrollerAddress).admin(), "only unitroller admin can"); + require(IUnitroller(unitrollerAddress)._acceptImplementation() == 0, "not authorized"); } // Find facet for function that is called and execute the diff --git a/contracts/Diamond/facets/MarketFacet.sol b/contracts/Diamond/facets/MarketFacet.sol index de5d77a2a..4769d8909 100644 --- a/contracts/Diamond/facets/MarketFacet.sol +++ b/contracts/Diamond/facets/MarketFacet.sol @@ -3,7 +3,7 @@ pragma solidity 0.8.13; import "../libraries/appStorage.sol"; import "../libraries/LibHelper.sol"; import "../libraries/LibAccessCheck.sol"; -import "../../Tokens/VTokens/VToken.sol"; +import "../../Tokens/V0.8.13/VTokens/VToken.sol"; contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError { AppStorage internal s; @@ -136,7 +136,7 @@ contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError { return s.protocolPaused; } - function liquidatorContract() externl view returns(address){ + function liquidatorContract() external view returns(address){ return s.liquidatorContract; } diff --git a/contracts/Diamond/facets/PolicyFacet.sol b/contracts/Diamond/facets/PolicyFacet.sol index 61526e15c..088a8a918 100644 --- a/contracts/Diamond/facets/PolicyFacet.sol +++ b/contracts/Diamond/facets/PolicyFacet.sol @@ -1,10 +1,10 @@ pragma solidity 0.8.13; -import "../../Utils/ErrorReporter.sol"; +import "../../Utils/V0.8.13/ErrorReporter.sol"; import "../libraries/LibAccessCheck.sol"; import "../libraries/LibHelper.sol"; import "../libraries/appStorage.sol"; -import "../../Tokens/VTokens/VToken.sol"; +import "../../Tokens/V0.8.13/VTokens/VToken.sol"; contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError { AppStorage internal s; diff --git a/contracts/Diamond/facets/RewardFacet.sol b/contracts/Diamond/facets/RewardFacet.sol index c46cbf592..c60bb249c 100644 --- a/contracts/Diamond/facets/RewardFacet.sol +++ b/contracts/Diamond/facets/RewardFacet.sol @@ -1,14 +1,18 @@ pragma solidity 0.8.13; -import "../../Oracle/PriceOracle.sol"; -import "../../Tokens/VTokens/VToken.sol"; -import "../../Utils/ErrorReporter.sol"; -import "../../Tokens/XVS/XVS.sol"; -import "../../Tokens/VAI/VAI.sol"; +import "../../Oracle/V0.8.13/PriceOracle.sol"; +import "../../Tokens/V0.8.13/VTokens/VToken.sol"; +import "../../Utils/V0.8.13/ErrorReporter.sol"; import "../libraries/LibAccessCheck.sol"; import "../libraries/LibHelper.sol"; import "../libraries/appStorage.sol"; -import "../../Governance/IAccessControlManager.sol"; +import "../../Governance/V0.8.13/IAccessControlManagerV8.sol"; + +interface IXVS { + function balanceOf(address account) external view returns (uint); + function transfer(address dst, uint rawAmount) external returns (bool); + function approve(address spender, uint rawAmount) external returns (bool); +} contract RewardFacet is ComptrollerErrorReporter, ExponentialNoError { AppStorage internal s; @@ -77,14 +81,12 @@ contract RewardFacet is ComptrollerErrorReporter, ExponentialNoError { "Blacklisted" ); - XVS xvs = XVS(getXVSAddress()); - - if (amount == 0 || amount > xvs.balanceOf(address(this))) { + if (amount == 0 || amount > IXVS(getXVSAddress()).balanceOf(address(this))) { return amount; } if (shortfall == 0) { - xvs.transfer(user, amount); + IXVS(getXVSAddress()).transfer(user, amount); return 0; } // If user's bankrupt and doesn't use pending xvs as collateral, don't grant @@ -94,7 +96,7 @@ contract RewardFacet is ComptrollerErrorReporter, ExponentialNoError { // If mintBehalf failed, don't grant any xvs require(collateral, "bankrupt accounts can only collateralize their pending xvs rewards"); - xvs.approve(getXVSVTokenAddress(), amount); + IXVS(getXVSAddress()).approve(getXVSVTokenAddress(), amount); require( VBep20Interface(getXVSVTokenAddress()).mintBehalf(user, amount) == uint(Error.NO_ERROR), "mint behalf error during collateralize xvs" @@ -158,9 +160,7 @@ contract RewardFacet is ComptrollerErrorReporter, ExponentialNoError { return; } - XVS xvs = XVS(getXVSAddress()); - - uint256 xvsBalance = xvs.balanceOf(address(this)); + uint256 xvsBalance = IXVS(getXVSAddress()).balanceOf(address(this)); if (xvsBalance == 0) { return; } @@ -182,7 +182,7 @@ contract RewardFacet is ComptrollerErrorReporter, ExponentialNoError { s.releaseStartBlock = getBlockNumber(); - xvs.transfer(s.vaiVaultAddress, actualAmount); + IXVS(getXVSAddress()).transfer(s.vaiVaultAddress, actualAmount); emit DistributedVAIVaultVenus(actualAmount); IVAIVault(s.vaiVaultAddress).updatePendingRewards(); diff --git a/contracts/Diamond/facets/SetterFacet.sol b/contracts/Diamond/facets/SetterFacet.sol index 28320ba8e..931298cda 100644 --- a/contracts/Diamond/facets/SetterFacet.sol +++ b/contracts/Diamond/facets/SetterFacet.sol @@ -1,15 +1,12 @@ pragma solidity 0.8.13; -import "../../Oracle/PriceOracle.sol"; -import "../../Tokens/VTokens/VToken.sol"; -import "../../Utils/ErrorReporter.sol"; -import "../../Tokens/XVS/XVS.sol"; -import "../../Tokens/VAI/VAI.sol"; +import "../../Oracle/V0.8.13/PriceOracle.sol"; +import "../../Tokens/V0.8.13/VTokens/VToken.sol"; +import "../../Utils/V0.8.13/ErrorReporter.sol"; import "../libraries/appStorage.sol"; -import "../../Governance/IAccessControlManager.sol"; +import "../../Governance/V0.8.13/IAccessControlManagerV8.sol"; import "../libraries/LibAccessCheck.sol"; import "../libraries/LibHelper.sol"; -import "../../Comptroller/Unitroller.sol"; contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError { AppStorage internal s; diff --git a/contracts/Diamond/libraries/LibAccessCheck.sol b/contracts/Diamond/libraries/LibAccessCheck.sol index f67af7933..5e01047ff 100644 --- a/contracts/Diamond/libraries/LibAccessCheck.sol +++ b/contracts/Diamond/libraries/LibAccessCheck.sol @@ -1,7 +1,7 @@ pragma solidity 0.8.13; -import "../../Governance/IAccessControlManager.sol"; -import "../../Tokens/VTokens/VToken.sol"; +import "../../Governance/V0.8.13/IAccessControlManagerV8.sol"; +import "../../Tokens/V0.8.13/VTokens/VToken.sol"; import "../libraries/appStorage.sol"; library LibAccessCheck { @@ -52,7 +52,7 @@ library LibAccessCheck { function ensureAllowed(string memory functionSig) internal view { AppStorage storage s = LibAppStorage.diamondStorage(); - require(IAccessControlManager(s.accessControl).isAllowedToCall(msg.sender, functionSig), "access denied"); + require(IAccessControlManagerV8(s.accessControl).isAllowedToCall(msg.sender, functionSig), "access denied"); } /** diff --git a/contracts/Diamond/libraries/LibDiamond.sol b/contracts/Diamond/libraries/LibDiamond.sol index ff76bb2b2..60e83bd7e 100644 --- a/contracts/Diamond/libraries/LibDiamond.sol +++ b/contracts/Diamond/libraries/LibDiamond.sol @@ -33,6 +33,8 @@ library LibDiamond { mapping(bytes4 => bool) supportedInterfaces; // owner of the contract address contractOwner; + // unitroller address + address unitrollerAddress; } function diamondStorage() internal pure returns (DiamondStorage storage ds) { @@ -44,6 +46,8 @@ library LibDiamond { event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); + event UnitrollerAddressUpdated(address indexed previousOwner, address indexed newOwner); + function setContractOwner(address _newOwner) internal { DiamondStorage storage ds = diamondStorage(); address previousOwner = ds.contractOwner; @@ -51,6 +55,13 @@ library LibDiamond { emit OwnershipTransferred(previousOwner, _newOwner); } + function setUnitrollerAddress(address _unitrollerAddress) internal { + DiamondStorage storage ds = diamondStorage(); + address previousUnitrollerAddress = ds.unitrollerAddress; + ds.unitrollerAddress = _unitrollerAddress; + emit OwnershipTransferred(previousUnitrollerAddress, _unitrollerAddress); + } + function contractOwner() internal view returns (address contractOwner_) { contractOwner_ = diamondStorage().contractOwner; } @@ -59,6 +70,10 @@ library LibDiamond { require(msg.sender == diamondStorage().contractOwner, "LibDiamond: Must be contract owner"); } + function getUnitrollerAddress() internal view returns(address) { + return diamondStorage().unitrollerAddress; + } + event DiamondCut(IDiamondCut.FacetCut[] _diamondCut, address _init, bytes _calldata); // Internal function version of diamondCut diff --git a/contracts/Diamond/libraries/LibHelper.sol b/contracts/Diamond/libraries/LibHelper.sol index 28b1e6bbc..55266cbbd 100644 --- a/contracts/Diamond/libraries/LibHelper.sol +++ b/contracts/Diamond/libraries/LibHelper.sol @@ -1,11 +1,11 @@ pragma solidity 0.8.13; -import "../../Tokens/VTokens/VToken.sol"; +import "../../Tokens/V0.8.13/VTokens/VToken.sol"; import "./appStorage.sol"; import "./LibAccessCheck.sol"; -import "../../Utils/ErrorReporter.sol"; +import "../../Utils/V0.8.13/ErrorReporter.sol"; import "./LibExponentialNoError.sol"; -import "../../Utils/ExponentialNoError.sol"; +import "../../Utils/V0.8.13/ExponentialNoError.sol"; library LibHelper { /// @notice The initial Venus index for a market diff --git a/contracts/Diamond/libraries/appStorage.sol b/contracts/Diamond/libraries/appStorage.sol index 28cc8518f..f8ba0e232 100644 --- a/contracts/Diamond/libraries/appStorage.sol +++ b/contracts/Diamond/libraries/appStorage.sol @@ -1,9 +1,9 @@ pragma solidity 0.8.13; -import "../../Tokens/VTokens/VToken.sol"; -import "../../Oracle/PriceOracle.sol"; -import "../../Tokens/VAI/VAIControllerInterface.sol"; -import "../../Comptroller/ComptrollerLensInterface.sol"; +import "../../Tokens/V0.8.13/VTokens/VToken.sol"; +import "../../Oracle/V0.8.13/PriceOracle.sol"; +import "../../Tokens/V0.8.13/VAI/VAIControllerInterface.sol"; +import "../../Comptroller/V0.8.13/ComptrollerLensInterface.sol"; struct Market { /// @notice Whether or not this market is listed @@ -154,6 +154,10 @@ struct AppStorage { mapping(address => uint) venusBorrowSpeeds; /// @notice The rate at which venus is distributed to the corresponding supply market (per block) mapping(address => uint) venusSupplySpeeds; + /// @notice Address of the XVS token. + address XVSAddress; + /// @notice Address of the VAI token. + address VAIAddress; } library LibAppStorage { From b109e41c62f9d9b94f5c87c38f1f23f7637ed24d Mon Sep 17 00:00:00 2001 From: defcon022 Date: Tue, 28 Mar 2023 18:02:35 +0530 Subject: [PATCH 048/153] Reverted solidity version for unwanted contracts. --- contracts/Diamond/facets/RewardFacet.sol | 2 +- contracts/Diamond/facets/SetterFacet.sol | 2 +- .../Diamond/libraries/LibAccessCheck.sol | 4 +- contracts/Governance/GovernorAlpha.sol | 41 ++++----- contracts/Governance/GovernorAlpha2.sol | 39 +++++---- .../Governance/GovernorBravoDelegate.sol | 43 +++++----- .../Governance/GovernorBravoDelegator.sol | 12 +-- .../Governance/GovernorBravoInterfaces.sol | 2 +- .../Governance/IAccessControlManager.sol | 2 +- contracts/Governance/Timelock.sol | 6 +- .../V0.8.13/IAccessControlManager.sol | 35 ++++++++ contracts/Governance/VTreasury.sol | 4 +- .../InterestRateModels/InterestRateModel.sol | 8 +- .../InterestRateModels/JumpRateModel.sol | 6 +- .../WhitePaperInterestRateModel.sol | 6 +- contracts/Lens/ComptrollerLens.sol | 21 +++-- contracts/Lens/InterestRateModelLens.sol | 8 +- contracts/Lens/SnapshotLens.sol | 2 +- contracts/Lens/VenusLens.sol | 2 +- contracts/Lens/XVSStakingLens.sol | 2 +- contracts/Oracle/PriceOracle.sol | 6 +- contracts/Oracle/VenusChainlinkOracle.sol | 4 +- contracts/Tokens/BEP20Interface.sol | 2 +- contracts/Tokens/EIP20Interface.sol | 2 +- .../Tokens/EIP20NonStandardInterface.sol | 2 +- contracts/Tokens/Maximillion.sol.archive | 8 +- contracts/Tokens/VAI/VAI.sol | 10 +-- contracts/Tokens/VAI/VAIController.sol | 12 +-- .../Tokens/VAI/VAIControllerInterface.sol | 22 ++--- contracts/Tokens/VAI/VAIControllerStorage.sol | 2 +- contracts/Tokens/VAI/VAIUnitroller.sol | 10 +-- contracts/Tokens/VAI/lib.sol | 4 +- contracts/Tokens/VRT/VRT.sol | 12 +-- contracts/Tokens/VRT/VRTConverter.sol | 2 +- contracts/Tokens/VRT/VRTConverterProxy.sol | 12 +-- contracts/Tokens/VRT/VRTConverterStorage.sol | 2 +- contracts/Tokens/VTokens/VBNB.sol.archive | 14 +-- contracts/Tokens/VTokens/VBep20.sol | 30 +++---- contracts/Tokens/VTokens/VBep20Delegate.sol | 6 +- contracts/Tokens/VTokens/VBep20Delegator.sol | 82 +++++++++--------- contracts/Tokens/VTokens/VBep20Immutable.sol | 4 +- contracts/Tokens/VTokens/VToken.sol | 86 +++++++++---------- contracts/Tokens/VTokens/VTokenInterfaces.sol | 82 +++++++++--------- contracts/Tokens/XVS/IXVSVesting.sol | 2 +- contracts/Tokens/XVS/XVS.sol | 12 +-- contracts/Tokens/XVS/XVSVesting.sol | 2 +- contracts/Tokens/XVS/XVSVestingProxy.sol | 12 +-- contracts/Tokens/XVS/XVSVestingStorage.sol | 2 +- contracts/Utils/Address.sol | 6 +- contracts/Utils/CarefulMath.sol | 2 +- contracts/Utils/Context.sol | 6 +- contracts/Utils/ECDSA.sol | 2 +- contracts/Utils/ErrorReporter.sol | 2 +- contracts/Utils/Exponential.sol | 2 +- contracts/Utils/ExponentialNoError.sol | 2 +- contracts/Utils/IBEP20.sol | 2 +- contracts/Utils/Ownable.sol | 4 +- contracts/Utils/Owned.sol | 2 +- contracts/Utils/SafeBEP20.sol | 2 +- contracts/Utils/SafeMath.sol | 2 +- contracts/Utils/Tokenlock.sol | 2 +- contracts/VRTVault/VRTVault.sol | 4 +- contracts/VRTVault/VRTVaultProxy.sol | 12 +-- contracts/VRTVault/VRTVaultStorage.sol | 2 +- contracts/Vault/VAIVault.sol | 2 +- contracts/Vault/VAIVaultErrorReporter.sol | 2 +- contracts/Vault/VAIVaultProxy.sol | 10 +-- contracts/Vault/VAIVaultStorage.sol | 2 +- contracts/XVSVault/XVSStore.sol | 2 +- contracts/XVSVault/XVSVault.sol | 4 +- contracts/XVSVault/XVSVaultErrorReporter.sol | 2 +- contracts/XVSVault/XVSVaultProxy.sol | 10 +-- contracts/XVSVault/XVSVaultStorage.sol | 2 +- contracts/test/BEP20.sol | 2 +- contracts/test/ComptrollerHarness.sol | 81 ++++++++--------- contracts/test/ComptrollerScenario.sol | 6 +- contracts/test/EvilXDelegator.sol | 2 +- contracts/test/EvilXToken.sol | 10 +-- contracts/test/Fauceteer.sol | 2 +- contracts/test/FixedPriceOracle.sol | 4 +- contracts/test/GovernorAlphaHarness.sol | 4 +- contracts/test/InterestRateModelHarness.sol | 2 +- contracts/test/MockDeflationaryToken.sol | 2 +- contracts/test/SimplePriceOracle.sol | 4 +- contracts/test/TetherInterface.sol | 2 +- contracts/test/TimelockHarness.sol | 2 +- contracts/test/VAIControllerHarness.sol | 8 +- contracts/test/VAIHarness.sol | 2 +- contracts/test/VBep20Harness.sol | 20 ++--- contracts/test/VBep20MockDelegate.sol | 2 +- contracts/test/VRTConverterHarness.sol | 4 +- contracts/test/VRTVaultHarness.sol | 4 +- contracts/test/XVSHarness.sol | 2 +- contracts/test/XVSVaultScenario.sol | 4 +- contracts/test/XVSVestingHarness.sol | 4 +- 95 files changed, 488 insertions(+), 468 deletions(-) create mode 100644 contracts/Governance/V0.8.13/IAccessControlManager.sol diff --git a/contracts/Diamond/facets/RewardFacet.sol b/contracts/Diamond/facets/RewardFacet.sol index c60bb249c..edbd5bb67 100644 --- a/contracts/Diamond/facets/RewardFacet.sol +++ b/contracts/Diamond/facets/RewardFacet.sol @@ -6,7 +6,7 @@ import "../../Utils/V0.8.13/ErrorReporter.sol"; import "../libraries/LibAccessCheck.sol"; import "../libraries/LibHelper.sol"; import "../libraries/appStorage.sol"; -import "../../Governance/V0.8.13/IAccessControlManagerV8.sol"; +import "../../Governance/V0.8.13/IAccessControlManager.sol"; interface IXVS { function balanceOf(address account) external view returns (uint); diff --git a/contracts/Diamond/facets/SetterFacet.sol b/contracts/Diamond/facets/SetterFacet.sol index 931298cda..7bba02212 100644 --- a/contracts/Diamond/facets/SetterFacet.sol +++ b/contracts/Diamond/facets/SetterFacet.sol @@ -4,7 +4,7 @@ import "../../Oracle/V0.8.13/PriceOracle.sol"; import "../../Tokens/V0.8.13/VTokens/VToken.sol"; import "../../Utils/V0.8.13/ErrorReporter.sol"; import "../libraries/appStorage.sol"; -import "../../Governance/V0.8.13/IAccessControlManagerV8.sol"; +import "../../Governance/V0.8.13/IAccessControlManager.sol"; import "../libraries/LibAccessCheck.sol"; import "../libraries/LibHelper.sol"; diff --git a/contracts/Diamond/libraries/LibAccessCheck.sol b/contracts/Diamond/libraries/LibAccessCheck.sol index 5e01047ff..725fc448a 100644 --- a/contracts/Diamond/libraries/LibAccessCheck.sol +++ b/contracts/Diamond/libraries/LibAccessCheck.sol @@ -1,6 +1,6 @@ pragma solidity 0.8.13; -import "../../Governance/V0.8.13/IAccessControlManagerV8.sol"; +import "../../Governance/V0.8.13/IAccessControlManager.sol"; import "../../Tokens/V0.8.13/VTokens/VToken.sol"; import "../libraries/appStorage.sol"; @@ -52,7 +52,7 @@ library LibAccessCheck { function ensureAllowed(string memory functionSig) internal view { AppStorage storage s = LibAppStorage.diamondStorage(); - require(IAccessControlManagerV8(s.accessControl).isAllowedToCall(msg.sender, functionSig), "access denied"); + require(IAccessControlManager(s.accessControl).isAllowedToCall(msg.sender, functionSig), "access denied"); } /** diff --git a/contracts/Governance/GovernorAlpha.sol b/contracts/Governance/GovernorAlpha.sol index c9056c546..fca535056 100644 --- a/contracts/Governance/GovernorAlpha.sol +++ b/contracts/Governance/GovernorAlpha.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; pragma experimental ABIEncoderV2; contract GovernorAlpha { @@ -26,7 +26,7 @@ contract GovernorAlpha { } // 1 block /// @notice The duration of voting on a proposal, in blocks - function votingPeriod() public pure virtual returns (uint) { + function votingPeriod() public pure returns (uint) { return (60 * 60 * 24 * 3) / 3; } // ~3 days in blocks (assuming 3s blocks) @@ -176,22 +176,23 @@ contract GovernorAlpha { uint endBlock = add256(startBlock, votingPeriod()); proposalCount++; - Proposal storage newProposal = proposals[proposalCount]; - newProposal.id = proposalCount; - newProposal.proposer = msg.sender; - newProposal.eta = 0; - newProposal.targets = targets; - newProposal.values = values; - newProposal.signatures = signatures; - newProposal.calldatas = calldatas; - newProposal.startBlock = startBlock; - newProposal.endBlock = endBlock; - newProposal.forVotes = 0; - newProposal.againstVotes = 0; - newProposal.canceled = false; - newProposal.executed = false; - - //proposals[newProposal.id] = newProposal; + Proposal memory newProposal = Proposal({ + id: proposalCount, + proposer: msg.sender, + eta: 0, + targets: targets, + values: values, + signatures: signatures, + calldatas: calldatas, + startBlock: startBlock, + endBlock: endBlock, + forVotes: 0, + againstVotes: 0, + canceled: false, + executed: false + }); + + proposals[newProposal.id] = newProposal; latestProposalIds[newProposal.proposer] = newProposal.id; emit ProposalCreated( @@ -238,7 +239,7 @@ contract GovernorAlpha { Proposal storage proposal = proposals[proposalId]; proposal.executed = true; for (uint i = 0; i < proposal.targets.length; i++) { - timelock.executeTransaction{ value: proposal.values[i] }( + timelock.executeTransaction.value(proposal.values[i])( proposal.targets[i], proposal.values[i], proposal.signatures[i], @@ -377,7 +378,7 @@ contract GovernorAlpha { return a - b; } - function getChainId() internal view returns (uint) { + function getChainId() internal pure returns (uint) { uint chainId; assembly { chainId := chainid() diff --git a/contracts/Governance/GovernorAlpha2.sol b/contracts/Governance/GovernorAlpha2.sol index c951adbd9..c009718df 100644 --- a/contracts/Governance/GovernorAlpha2.sol +++ b/contracts/Governance/GovernorAlpha2.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; pragma experimental ABIEncoderV2; contract GovernorAlpha2 { @@ -177,22 +177,23 @@ contract GovernorAlpha2 { uint endBlock = add256(startBlock, votingPeriod()); proposalCount++; - Proposal storage newProposal = proposals[proposalCount]; - newProposal.id = proposalCount; - newProposal.proposer = msg.sender; - newProposal.eta = 0; - newProposal.targets = targets; - newProposal.values = values; - newProposal.signatures = signatures; - newProposal.calldatas = calldatas; - newProposal.startBlock = startBlock; - newProposal.endBlock = endBlock; - newProposal.forVotes = 0; - newProposal.againstVotes = 0; - newProposal.canceled = false; - newProposal.executed = false; - - //proposals[newProposal.id] = newProposal; + Proposal memory newProposal = Proposal({ + id: proposalCount, + proposer: msg.sender, + eta: 0, + targets: targets, + values: values, + signatures: signatures, + calldatas: calldatas, + startBlock: startBlock, + endBlock: endBlock, + forVotes: 0, + againstVotes: 0, + canceled: false, + executed: false + }); + + proposals[newProposal.id] = newProposal; latestProposalIds[newProposal.proposer] = newProposal.id; emit ProposalCreated( @@ -239,7 +240,7 @@ contract GovernorAlpha2 { Proposal storage proposal = proposals[proposalId]; proposal.executed = true; for (uint i = 0; i < proposal.targets.length; i++) { - timelock.executeTransaction{ value: proposal.values[i] }( + timelock.executeTransaction.value(proposal.values[i])( proposal.targets[i], proposal.values[i], proposal.signatures[i], @@ -378,7 +379,7 @@ contract GovernorAlpha2 { return a - b; } - function getChainId() internal view returns (uint) { + function getChainId() internal pure returns (uint) { uint chainId; assembly { chainId := chainid() diff --git a/contracts/Governance/GovernorBravoDelegate.sol b/contracts/Governance/GovernorBravoDelegate.sol index 46191e970..c291a8e59 100644 --- a/contracts/Governance/GovernorBravoDelegate.sol +++ b/contracts/Governance/GovernorBravoDelegate.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; pragma experimental ABIEncoderV2; import "./GovernorBravoInterfaces.sol"; @@ -152,24 +152,25 @@ contract GovernorBravoDelegate is GovernorBravoDelegateStorageV2, GovernorBravoE uint endBlock = add256(startBlock, proposalConfigs[uint8(proposalType)].votingPeriod); proposalCount++; - - Proposal storage newProposal = proposals[proposalCount]; - newProposal.id = proposalCount; - newProposal.proposer = msg.sender; - newProposal.eta = 0; - newProposal.targets = targets; - newProposal.values = values; - newProposal.signatures = signatures; - newProposal.calldatas = calldatas; - newProposal.startBlock = startBlock; - newProposal.endBlock = endBlock; - newProposal.forVotes = 0; - newProposal.againstVotes = 0; - newProposal.canceled = false; - newProposal.executed = false; - newProposal.proposalType = uint8(proposalType); - - //proposals[newProposal.id] = newProposal; + Proposal memory newProposal = Proposal({ + id: proposalCount, + proposer: msg.sender, + eta: 0, + targets: targets, + values: values, + signatures: signatures, + calldatas: calldatas, + startBlock: startBlock, + endBlock: endBlock, + forVotes: 0, + againstVotes: 0, + abstainVotes: 0, + canceled: false, + executed: false, + proposalType: uint8(proposalType) + }); + + proposals[newProposal.id] = newProposal; latestProposalIds[newProposal.proposer] = newProposal.id; emit ProposalCreated( @@ -285,7 +286,7 @@ contract GovernorBravoDelegate is GovernorBravoDelegateStorageV2, GovernorBravoE /** * @notice Gets actions of a proposal * @param proposalId the id of the proposal - * return targets, values, signatures, and calldatas of the proposal actions + * @return targets, values, signatures, and calldatas of the proposal actions */ function getActions( uint proposalId @@ -505,7 +506,7 @@ contract GovernorBravoDelegate is GovernorBravoDelegateStorageV2, GovernorBravoE return a - b; } - function getChainIdInternal() internal view returns (uint) { + function getChainIdInternal() internal pure returns (uint) { uint chainId; assembly { chainId := chainid() diff --git a/contracts/Governance/GovernorBravoDelegator.sol b/contracts/Governance/GovernorBravoDelegator.sol index 75be37133..93381fd7e 100644 --- a/contracts/Governance/GovernorBravoDelegator.sol +++ b/contracts/Governance/GovernorBravoDelegator.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; pragma experimental ABIEncoderV2; import "./GovernorBravoInterfaces.sol"; @@ -62,7 +62,7 @@ contract GovernorBravoDelegator is GovernorBravoDelegatorStorage, GovernorBravoE (bool success, bytes memory returnData) = callee.delegatecall(data); assembly { if eq(success, 0) { - revert(add(returnData, 0x20), returndatasize()) + revert(add(returnData, 0x20), returndatasize) } } } @@ -72,20 +72,20 @@ contract GovernorBravoDelegator is GovernorBravoDelegatorStorage, GovernorBravoE * It returns to the external caller whatever the implementation returns * or forwards reverts. */ - fallback() external payable { + function() external payable { // delegate all other functions to current implementation (bool success, ) = implementation.delegatecall(msg.data); assembly { let free_mem_ptr := mload(0x40) - returndatacopy(free_mem_ptr, 0, returndatasize()) + returndatacopy(free_mem_ptr, 0, returndatasize) switch success case 0 { - revert(free_mem_ptr, returndatasize()) + revert(free_mem_ptr, returndatasize) } default { - return(free_mem_ptr, returndatasize()) + return(free_mem_ptr, returndatasize) } } } diff --git a/contracts/Governance/GovernorBravoInterfaces.sol b/contracts/Governance/GovernorBravoInterfaces.sol index 094d51955..9a8c02301 100644 --- a/contracts/Governance/GovernorBravoInterfaces.sol +++ b/contracts/Governance/GovernorBravoInterfaces.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; pragma experimental ABIEncoderV2; contract GovernorBravoEvents { diff --git a/contracts/Governance/IAccessControlManager.sol b/contracts/Governance/IAccessControlManager.sol index 7f66c4430..10f27e79e 100644 --- a/contracts/Governance/IAccessControlManager.sol +++ b/contracts/Governance/IAccessControlManager.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; interface IAccessControlManager { /** diff --git a/contracts/Governance/Timelock.sol b/contracts/Governance/Timelock.sol index e35a81960..b20cb4ebf 100644 --- a/contracts/Governance/Timelock.sol +++ b/contracts/Governance/Timelock.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; import "../Utils/SafeMath.sol"; @@ -51,7 +51,7 @@ contract Timelock { delay = delay_; } - receive() external payable {} + function() external payable {} function setDelay(uint delay_) public { require(msg.sender == address(this), "Timelock::setDelay: Call must come from Timelock."); @@ -137,7 +137,7 @@ contract Timelock { } // solium-disable-next-line security/no-call-value - (bool success, bytes memory returnData) = target.call{ value: value }(callData); + (bool success, bytes memory returnData) = target.call.value(value)(callData); require(success, "Timelock::executeTransaction: Transaction execution reverted."); emit ExecuteTransaction(txHash, target, value, signature, data, eta); diff --git a/contracts/Governance/V0.8.13/IAccessControlManager.sol b/contracts/Governance/V0.8.13/IAccessControlManager.sol new file mode 100644 index 000000000..7f66c4430 --- /dev/null +++ b/contracts/Governance/V0.8.13/IAccessControlManager.sol @@ -0,0 +1,35 @@ +pragma solidity 0.8.13; + +interface IAccessControlManager { + /** + * @notice Verifies if the given account can call a praticular contract's function + * @dev Since the contract is calling itself this function, we can get contracts address with msg.sender + * @param account address (eoa or contract) for which call permissions will be checked + * @param functionSig signature e.g. "functionName(uint,bool)" + * @return false if the user account cannot call the particular contract function + * + */ + function isAllowedToCall(address account, string calldata functionSig) external view returns (bool); + + /** + * @notice Gives a function call permission to one single account + * @dev this function can be called only from Role Admin or DEFAULT_ADMIN_ROLE + * May emit a {RoleGranted} event. + * @param contractAddress address of contract for which call permissions will be granted + * @param functionSig signature e.g. "functionName(uint,bool)" + */ + function giveCallPermission(address contractAddress, string calldata functionSig, address accountToPermit) external; + + /** + * @notice Revokes an account's permission to a particular function call + * @dev this function can be called only from Role Admin or DEFAULT_ADMIN_ROLE + * May emit a {RoleRevoked} event. + * @param contractAddress address of contract for which call permissions will be revoked + * @param functionSig signature e.g. "functionName(uint,bool)" + */ + function revokeCallPermission( + address contractAddress, + string calldata functionSig, + address accountToRevoke + ) external; +} diff --git a/contracts/Governance/VTreasury.sol b/contracts/Governance/VTreasury.sol index bc290538d..22bd3fc80 100644 --- a/contracts/Governance/VTreasury.sol +++ b/contracts/Governance/VTreasury.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; import "../Utils/IBEP20.sol"; import "../Utils/SafeBEP20.sol"; @@ -20,7 +20,7 @@ contract VTreasury is Ownable { /** * @notice To receive BNB */ - receive() external payable {} + function() external payable {} /** * @notice Withdraw Treasury BEP20 Tokens, Only owner call it diff --git a/contracts/InterestRateModels/InterestRateModel.sol b/contracts/InterestRateModels/InterestRateModel.sol index 3cd21808a..654f4040a 100644 --- a/contracts/InterestRateModels/InterestRateModel.sol +++ b/contracts/InterestRateModels/InterestRateModel.sol @@ -1,10 +1,10 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; /** * @title Venus's InterestRateModel Interface * @author Venus */ -abstract contract InterestRateModel { +contract InterestRateModel { /// @notice Indicator that this is an InterestRateModel contract (for inspection) bool public constant isInterestRateModel = true; @@ -15,7 +15,7 @@ abstract contract InterestRateModel { * @param reserves The total amnount of reserves the market has * @return The borrow rate per block (as a percentage, and scaled by 1e18) */ - function getBorrowRate(uint cash, uint borrows, uint reserves) external view virtual returns (uint); + function getBorrowRate(uint cash, uint borrows, uint reserves) external view returns (uint); /** * @notice Calculates the current supply interest rate per block @@ -30,5 +30,5 @@ abstract contract InterestRateModel { uint borrows, uint reserves, uint reserveFactorMantissa - ) external view virtual returns (uint); + ) external view returns (uint); } diff --git a/contracts/InterestRateModels/JumpRateModel.sol b/contracts/InterestRateModels/JumpRateModel.sol index 48f49e219..a1254aced 100644 --- a/contracts/InterestRateModels/JumpRateModel.sol +++ b/contracts/InterestRateModels/JumpRateModel.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; import "../Utils/SafeMath.sol"; import "./InterestRateModel.sol"; @@ -76,7 +76,7 @@ contract JumpRateModel is InterestRateModel { * @param reserves The amount of reserves in the market * @return The borrow rate percentage per block as a mantissa (scaled by 1e18) */ - function getBorrowRate(uint cash, uint borrows, uint reserves) public view override returns (uint) { + function getBorrowRate(uint cash, uint borrows, uint reserves) public view returns (uint) { uint util = utilizationRate(cash, borrows, reserves); if (util <= kink) { @@ -101,7 +101,7 @@ contract JumpRateModel is InterestRateModel { uint borrows, uint reserves, uint reserveFactorMantissa - ) public view override returns (uint) { + ) public view returns (uint) { uint oneMinusReserveFactor = uint(1e18).sub(reserveFactorMantissa); uint borrowRate = getBorrowRate(cash, borrows, reserves); uint rateToPool = borrowRate.mul(oneMinusReserveFactor).div(1e18); diff --git a/contracts/InterestRateModels/WhitePaperInterestRateModel.sol b/contracts/InterestRateModels/WhitePaperInterestRateModel.sol index e30fcdd53..962f4d73d 100644 --- a/contracts/InterestRateModels/WhitePaperInterestRateModel.sol +++ b/contracts/InterestRateModels/WhitePaperInterestRateModel.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; import "../Utils/SafeMath.sol"; import "./InterestRateModel.sol"; @@ -63,7 +63,7 @@ contract WhitePaperInterestRateModel is InterestRateModel { * @param reserves The amount of reserves in the market * @return The borrow rate percentage per block as a mantissa (scaled by 1e18) */ - function getBorrowRate(uint cash, uint borrows, uint reserves) public view override returns (uint) { + function getBorrowRate(uint cash, uint borrows, uint reserves) public view returns (uint) { uint ur = utilizationRate(cash, borrows, reserves); return ur.mul(multiplierPerBlock).div(1e18).add(baseRatePerBlock); } @@ -81,7 +81,7 @@ contract WhitePaperInterestRateModel is InterestRateModel { uint borrows, uint reserves, uint reserveFactorMantissa - ) public view override returns (uint) { + ) public view returns (uint) { uint oneMinusReserveFactor = uint(1e18).sub(reserveFactorMantissa); uint borrowRate = getBorrowRate(cash, borrows, reserves); uint rateToPool = borrowRate.mul(oneMinusReserveFactor).div(1e18); diff --git a/contracts/Lens/ComptrollerLens.sol b/contracts/Lens/ComptrollerLens.sol index 6e4a36575..b5a296a47 100644 --- a/contracts/Lens/ComptrollerLens.sol +++ b/contracts/Lens/ComptrollerLens.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; pragma experimental ABIEncoderV2; import "../Tokens/VTokens/VBep20.sol"; @@ -8,7 +8,6 @@ import "../Oracle/PriceOracle.sol"; import "../Utils/ErrorReporter.sol"; import "../Comptroller/Comptroller.sol"; import "../Tokens/VAI/VAIControllerInterface.sol"; -import "../Diamond/facets/MarketFacet.sol"; contract ComptrollerLens is ComptrollerLensInterface, ComptrollerErrorReporter, ExponentialNoError { /** @@ -44,8 +43,8 @@ contract ComptrollerLens is ComptrollerLensInterface, ComptrollerErrorReporter, uint actualRepayAmount ) external view returns (uint, uint) { /* Read oracle prices for borrowed and collateral markets */ - uint priceBorrowedMantissa = MarketFacet(comptroller).oracle().getUnderlyingPrice(VToken(vTokenBorrowed)); - uint priceCollateralMantissa = MarketFacet(comptroller).oracle().getUnderlyingPrice(VToken(vTokenCollateral)); + uint priceBorrowedMantissa = Comptroller(comptroller).oracle().getUnderlyingPrice(VToken(vTokenBorrowed)); + uint priceCollateralMantissa = Comptroller(comptroller).oracle().getUnderlyingPrice(VToken(vTokenCollateral)); if (priceBorrowedMantissa == 0 || priceCollateralMantissa == 0) { return (uint(Error.PRICE_ERROR), 0); } @@ -63,7 +62,7 @@ contract ComptrollerLens is ComptrollerLensInterface, ComptrollerErrorReporter, Exp memory ratio; numerator = mul_( - Exp({ mantissa: MarketFacet(comptroller).liquidationIncentiveMantissa() }), + Exp({ mantissa: Comptroller(comptroller).liquidationIncentiveMantissa() }), Exp({ mantissa: priceBorrowedMantissa }) ); denominator = mul_(Exp({ mantissa: priceCollateralMantissa }), Exp({ mantissa: exchangeRateMantissa })); @@ -88,7 +87,7 @@ contract ComptrollerLens is ComptrollerLensInterface, ComptrollerErrorReporter, ) external view returns (uint, uint) { /* Read oracle prices for borrowed and collateral markets */ uint priceBorrowedMantissa = 1e18; // Note: this is VAI - uint priceCollateralMantissa = MarketFacet(comptroller).oracle().getUnderlyingPrice(VToken(vTokenCollateral)); + uint priceCollateralMantissa = Comptroller(comptroller).oracle().getUnderlyingPrice(VToken(vTokenCollateral)); if (priceCollateralMantissa == 0) { return (uint(Error.PRICE_ERROR), 0); } @@ -106,7 +105,7 @@ contract ComptrollerLens is ComptrollerLensInterface, ComptrollerErrorReporter, Exp memory ratio; numerator = mul_( - Exp({ mantissa: MarketFacet(comptroller).liquidationIncentiveMantissa() }), + Exp({ mantissa: Comptroller(comptroller).liquidationIncentiveMantissa() }), Exp({ mantissa: priceBorrowedMantissa }) ); denominator = mul_(Exp({ mantissa: priceCollateralMantissa }), Exp({ mantissa: exchangeRateMantissa })); @@ -138,7 +137,7 @@ contract ComptrollerLens is ComptrollerLensInterface, ComptrollerErrorReporter, uint oErr; // For each asset the account is in - VToken[] memory assets = MarketFacet(comptroller).getAssetsIn(account); + VToken[] memory assets = Comptroller(comptroller).getAssetsIn(account); uint assetsCount = assets.length; for (uint i = 0; i < assetsCount; ++i) { VToken asset = assets[i]; @@ -151,12 +150,12 @@ contract ComptrollerLens is ComptrollerLensInterface, ComptrollerErrorReporter, // semi-opaque error code, we assume NO_ERROR == 0 is invariant between upgrades return (uint(Error.SNAPSHOT_ERROR), 0, 0); } - (, uint collateralFactorMantissa, ) = MarketFacet(comptroller).markets(address(asset)); + (, uint collateralFactorMantissa, ) = Comptroller(comptroller).markets(address(asset)); vars.collateralFactor = Exp({ mantissa: collateralFactorMantissa }); vars.exchangeRate = Exp({ mantissa: vars.exchangeRateMantissa }); // Get the normalized price of the asset - vars.oraclePriceMantissa = MarketFacet(comptroller).oracle().getUnderlyingPrice(asset); + vars.oraclePriceMantissa = Comptroller(comptroller).oracle().getUnderlyingPrice(asset); if (vars.oraclePriceMantissa == 0) { return (uint(Error.PRICE_ERROR), 0, 0); } @@ -195,7 +194,7 @@ contract ComptrollerLens is ComptrollerLensInterface, ComptrollerErrorReporter, } } - VAIControllerInterface vaiController = MarketFacet(comptroller).vaiController(); + VAIControllerInterface vaiController = Comptroller(comptroller).vaiController(); if (address(vaiController) != address(0)) { vars.sumBorrowPlusEffects = add_(vars.sumBorrowPlusEffects, vaiController.getVAIRepayAmount(account)); diff --git a/contracts/Lens/InterestRateModelLens.sol b/contracts/Lens/InterestRateModelLens.sol index dbc90cd59..42cd7807f 100644 --- a/contracts/Lens/InterestRateModelLens.sol +++ b/contracts/Lens/InterestRateModelLens.sol @@ -1,12 +1,8 @@ pragma solidity 0.8.13; -pragma experimental ABIEncoderV2; -import "../InterestRateModels/InterestRateModel.sol"; -import "../Utils/SafeMath.sol"; +import "../InterestRateModels/V0.8.13/InterestRateModel.sol"; contract InterestRateModelLens { - using SafeMath for uint256; - struct SimulationResponse { uint256[] borrowSimulation; uint256[] supplySimulation; @@ -26,7 +22,7 @@ contract InterestRateModelLens { uint reserves = 0; for (uint percent_Factor = 1; percent_Factor <= 100; ++percent_Factor) { - uint cash = (percent_Factor.mul(referenceAmountInWei)).div(1e2); + uint cash = (percent_Factor*referenceAmountInWei)/1e2; uint256 borrowRate = ir.getBorrowRate(cash, borrow, reserves); borrowSimulation[percent_Factor - 1] = borrowRate; diff --git a/contracts/Lens/SnapshotLens.sol b/contracts/Lens/SnapshotLens.sol index 50da11a47..d44d94a02 100644 --- a/contracts/Lens/SnapshotLens.sol +++ b/contracts/Lens/SnapshotLens.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; pragma experimental ABIEncoderV2; import "../Tokens/VTokens/VToken.sol"; diff --git a/contracts/Lens/VenusLens.sol b/contracts/Lens/VenusLens.sol index d0e0bf7b9..234ca822f 100644 --- a/contracts/Lens/VenusLens.sol +++ b/contracts/Lens/VenusLens.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; pragma experimental ABIEncoderV2; import "../Tokens/VTokens/VBep20.sol"; diff --git a/contracts/Lens/XVSStakingLens.sol b/contracts/Lens/XVSStakingLens.sol index 7d85a2d51..ca00bcd06 100644 --- a/contracts/Lens/XVSStakingLens.sol +++ b/contracts/Lens/XVSStakingLens.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; import "../XVSVault/XVSVault.sol"; import "../Utils/IBEP20.sol"; diff --git a/contracts/Oracle/PriceOracle.sol b/contracts/Oracle/PriceOracle.sol index 219cfe34f..15f44c18b 100644 --- a/contracts/Oracle/PriceOracle.sol +++ b/contracts/Oracle/PriceOracle.sol @@ -1,8 +1,8 @@ -pragma solidity ^0.8.13; +pragma solidity ^0.5.16; import "../Tokens/VTokens/VToken.sol"; -abstract contract PriceOracle { +contract PriceOracle { /// @notice Indicator that this is a PriceOracle contract (for inspection) bool public constant isPriceOracle = true; @@ -12,5 +12,5 @@ abstract contract PriceOracle { * @return The underlying asset price mantissa (scaled by 1e18). * Zero means the price is unavailable. */ - function getUnderlyingPrice(VToken vToken) external view virtual returns (uint); + function getUnderlyingPrice(VToken vToken) external view returns (uint); } diff --git a/contracts/Oracle/VenusChainlinkOracle.sol b/contracts/Oracle/VenusChainlinkOracle.sol index 38da1dfca..5ad946aaa 100644 --- a/contracts/Oracle/VenusChainlinkOracle.sol +++ b/contracts/Oracle/VenusChainlinkOracle.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; import "../Tokens/VTokens/VBep20.sol"; import "../Tokens/BEP20Interface.sol"; @@ -32,7 +32,7 @@ contract VenusChainlinkOracle is PriceOracle { emit MaxStalePeriodUpdated(oldMaxStalePeriod, newMaxStalePeriod); } - function getUnderlyingPrice(VToken vToken) public view override returns (uint) { + function getUnderlyingPrice(VToken vToken) public view returns (uint) { string memory symbol = vToken.symbol(); if (compareStrings(symbol, "vBNB")) { return getChainlinkPrice(getFeed(symbol)); diff --git a/contracts/Tokens/BEP20Interface.sol b/contracts/Tokens/BEP20Interface.sol index 13a3e988e..da811fb64 100644 --- a/contracts/Tokens/BEP20Interface.sol +++ b/contracts/Tokens/BEP20Interface.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; interface BEP20Interface { /** diff --git a/contracts/Tokens/EIP20Interface.sol b/contracts/Tokens/EIP20Interface.sol index 27d5a8e91..5784c15e1 100644 --- a/contracts/Tokens/EIP20Interface.sol +++ b/contracts/Tokens/EIP20Interface.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; /** * @title BEP 20 Token Standard Interface diff --git a/contracts/Tokens/EIP20NonStandardInterface.sol b/contracts/Tokens/EIP20NonStandardInterface.sol index 0df30bc79..d907fb83b 100644 --- a/contracts/Tokens/EIP20NonStandardInterface.sol +++ b/contracts/Tokens/EIP20NonStandardInterface.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; /** * @title EIP20NonStandardInterface diff --git a/contracts/Tokens/Maximillion.sol.archive b/contracts/Tokens/Maximillion.sol.archive index 87cda66f7..a6936a655 100644 --- a/contracts/Tokens/Maximillion.sol.archive +++ b/contracts/Tokens/Maximillion.sol.archive @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; import "./VTokens/VBNB.sol"; @@ -38,10 +38,10 @@ contract Maximillion { uint received = msg.value; uint borrows = vBnb_.borrowBalanceCurrent(borrower); if (received > borrows) { - vBnb_.repayBorrowBehalf{ value: borrows }(borrower); - payable(msg.sender).transfer(received - borrows); + vBnb_.repayBorrowBehalf.value(borrows)(borrower); + msg.sender.transfer(received - borrows); } else { - vBnb_.repayBorrowBehalf{ value: received }(borrower); + vBnb_.repayBorrowBehalf.value(received)(borrower); } } } diff --git a/contracts/Tokens/VAI/VAI.sol b/contracts/Tokens/VAI/VAI.sol index e52e28235..d6320b0b3 100644 --- a/contracts/Tokens/VAI/VAI.sol +++ b/contracts/Tokens/VAI/VAI.sol @@ -15,7 +15,7 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -pragma solidity 0.8.13; +pragma solidity ^0.5.16; import "./lib.sol"; @@ -84,7 +84,7 @@ contract VAI is LibNote { function transferFrom(address src, address dst, uint wad) public returns (bool) { require(balanceOf[src] >= wad, "VAI/insufficient-balance"); - if (src != msg.sender && allowance[src][msg.sender] != type(uint).max) { + if (src != msg.sender && allowance[src][msg.sender] != uint(-1)) { require(allowance[src][msg.sender] >= wad, "VAI/insufficient-allowance"); allowance[src][msg.sender] = sub(allowance[src][msg.sender], wad); } @@ -102,7 +102,7 @@ contract VAI is LibNote { function burn(address usr, uint wad) external { require(balanceOf[usr] >= wad, "VAI/insufficient-balance"); - if (usr != msg.sender && allowance[usr][msg.sender] != type(uint).max) { + if (usr != msg.sender && allowance[usr][msg.sender] != uint(-1)) { require(allowance[usr][msg.sender] >= wad, "VAI/insufficient-allowance"); allowance[usr][msg.sender] = sub(allowance[usr][msg.sender], wad); } @@ -151,9 +151,9 @@ contract VAI is LibNote { require(holder != address(0), "VAI/invalid-address-0"); require(holder == ecrecover(digest, v, r, s), "VAI/invalid-permit"); - require(expiry == 0 || block.timestamp <= expiry, "VAI/permit-expired"); + require(expiry == 0 || now <= expiry, "VAI/permit-expired"); require(nonce == nonces[holder]++, "VAI/invalid-nonce"); - uint wad = allowed ? type(uint).max : 0; + uint wad = allowed ? uint(-1) : 0; allowance[holder][spender] = wad; emit Approval(holder, spender, wad); } diff --git a/contracts/Tokens/VAI/VAIController.sol b/contracts/Tokens/VAI/VAIController.sol index 45b6937bb..2f472d884 100644 --- a/contracts/Tokens/VAI/VAIController.sol +++ b/contracts/Tokens/VAI/VAIController.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; import "../../Oracle/PriceOracle.sol"; import "../../Utils/ErrorReporter.sol"; @@ -92,7 +92,7 @@ contract VAIController is VAIControllerStorageG2, VAIControllerErrorReporter, Ex vaiMintIndex = INITIAL_VAI_MINT_INDEX; accrualBlockNumber = getBlockNumber(); - mintCap = type(uint256).max; + mintCap = uint256(-1); // The counter starts true to prevent changing it from zero to non-zero (i.e. smaller cost/refund) _notEntered = true; @@ -324,7 +324,7 @@ contract VAIController is VAIControllerStorageG2, VAIControllerErrorReporter, Ex } /* Fail if repayAmount = -1 */ - if (repayAmount == type(uint).max) { + if (repayAmount == uint(-1)) { return (fail(Error.REJECTION, FailureInfo.VAI_LIQUIDATE_CLOSE_AMOUNT_IS_UINT_MAX), 0); } @@ -764,11 +764,11 @@ contract VAIController is VAIControllerStorageG2, VAIControllerErrorReporter, Ex emit NewVAIMintCap(old, _mintCap); } - function getBlockNumber() public view virtual returns (uint) { + function getBlockNumber() public view returns (uint) { return block.number; } - function getBlocksPerYear() public view virtual returns (uint) { + function getBlocksPerYear() public view returns (uint) { return 10512000; //(24 * 60 * 60 * 365) / 3; } @@ -776,7 +776,7 @@ contract VAIController is VAIControllerStorageG2, VAIControllerErrorReporter, Ex * @notice Return the address of the VAI token * @return The address of VAI */ - function getVAIAddress() public view virtual returns (address) { + function getVAIAddress() public view returns (address) { return 0x4BD17003473389A42DAF6a0a729f6Fdb328BbBd7; } diff --git a/contracts/Tokens/VAI/VAIControllerInterface.sol b/contracts/Tokens/VAI/VAIControllerInterface.sol index a993e6167..9a305f3f8 100644 --- a/contracts/Tokens/VAI/VAIControllerInterface.sol +++ b/contracts/Tokens/VAI/VAIControllerInterface.sol @@ -1,27 +1,27 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; import "../VTokens/VToken.sol"; -abstract contract VAIControllerInterface { - function getVAIAddress() public view virtual returns (address); +contract VAIControllerInterface { + function getVAIAddress() public view returns (address); - function getMintableVAI(address minter) public view virtual returns (uint, uint); + function getMintableVAI(address minter) public view returns (uint, uint); - function mintVAI(address minter, uint mintVAIAmount) external virtual returns (uint); + function mintVAI(address minter, uint mintVAIAmount) external returns (uint); - function repayVAI(address repayer, uint repayVAIAmount) external virtual returns (uint); + function repayVAI(address repayer, uint repayVAIAmount) external returns (uint); function liquidateVAI( address borrower, uint repayAmount, VTokenInterface vTokenCollateral - ) external virtual returns (uint, uint); + ) external returns (uint, uint); - function _initializeVenusVAIState(uint blockNumber) external virtual returns (uint); + function _initializeVenusVAIState(uint blockNumber) external returns (uint); - function updateVenusVAIMintIndex() external virtual returns (uint); + function updateVenusVAIMintIndex() external returns (uint); - function calcDistributeVAIMinterVenus(address vaiMinter) external virtual returns (uint, uint, uint, uint); + function calcDistributeVAIMinterVenus(address vaiMinter) external returns (uint, uint, uint, uint); - function getVAIRepayAmount(address account) public view virtual returns (uint); + function getVAIRepayAmount(address account) public view returns (uint); } diff --git a/contracts/Tokens/VAI/VAIControllerStorage.sol b/contracts/Tokens/VAI/VAIControllerStorage.sol index 2a3008b0c..71a5bfaa5 100644 --- a/contracts/Tokens/VAI/VAIControllerStorage.sol +++ b/contracts/Tokens/VAI/VAIControllerStorage.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; import "../../Comptroller/ComptrollerInterface.sol"; diff --git a/contracts/Tokens/VAI/VAIUnitroller.sol b/contracts/Tokens/VAI/VAIUnitroller.sol index 3ee159568..feca9f888 100644 --- a/contracts/Tokens/VAI/VAIUnitroller.sol +++ b/contracts/Tokens/VAI/VAIUnitroller.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; import "../../Utils/ErrorReporter.sol"; import "./VAIControllerStorage.sol"; @@ -125,20 +125,20 @@ contract VAIUnitroller is VAIUnitrollerAdminStorage, VAIControllerErrorReporter * It returns to the external caller whatever the implementation returns * or forwards reverts. */ - fallback() external payable { + function() external payable { // delegate all other functions to current implementation (bool success, ) = vaiControllerImplementation.delegatecall(msg.data); assembly { let free_mem_ptr := mload(0x40) - returndatacopy(free_mem_ptr, 0, returndatasize()) + returndatacopy(free_mem_ptr, 0, returndatasize) switch success case 0 { - revert(free_mem_ptr, returndatasize()) + revert(free_mem_ptr, returndatasize) } default { - return(free_mem_ptr, returndatasize()) + return(free_mem_ptr, returndatasize) } } } diff --git a/contracts/Tokens/VAI/lib.sol b/contracts/Tokens/VAI/lib.sol index e6e9cb5ae..e0038882f 100644 --- a/contracts/Tokens/VAI/lib.sol +++ b/contracts/Tokens/VAI/lib.sol @@ -13,7 +13,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -pragma solidity 0.8.13; +pragma solidity ^0.5.16; contract LibNote { event LogNote( @@ -29,7 +29,7 @@ contract LibNote { assembly { // log an 'anonymous' event with a constant 6 words of calldata // and four indexed topics: selector, caller, arg1 and arg2 - let mark := 0 // end of memory ensures zero + let mark := msize() // end of memory ensures zero mstore(0x40, add(mark, 288)) // update free memory pointer mstore(mark, 0x20) // bytes type data offset mstore(add(mark, 0x20), 224) // bytes size (padded) diff --git a/contracts/Tokens/VRT/VRT.sol b/contracts/Tokens/VRT/VRT.sol index 6f25bdde3..15d0b8380 100644 --- a/contracts/Tokens/VRT/VRT.sol +++ b/contracts/Tokens/VRT/VRT.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; import "../../Utils/Tokenlock.sol"; @@ -87,8 +87,8 @@ contract VRT is Tokenlock { */ function approve(address spender, uint rawAmount) external validLock returns (bool) { uint96 amount; - if (rawAmount == type(uint).max) { - amount = type(uint96).max; + if (rawAmount == uint(-1)) { + amount = uint96(-1); } else { amount = safe96(rawAmount, "VRT::approve: amount exceeds 96 bits"); } @@ -132,7 +132,7 @@ contract VRT is Tokenlock { uint96 spenderAllowance = allowances[src][spender]; uint96 amount = safe96(rawAmount, "VRT::approve: amount exceeds 96 bits"); - if (spender != src && spenderAllowance != type(uint96).max) { + if (spender != src && spenderAllowance != uint96(-1)) { uint96 newAllowance = sub96( spenderAllowance, amount, @@ -173,7 +173,7 @@ contract VRT is Tokenlock { address signatory = ecrecover(digest, v, r, s); require(signatory != address(0), "VRT::delegateBySig: invalid signature"); require(nonce == nonces[signatory]++, "VRT::delegateBySig: invalid nonce"); - require(block.timestamp <= expiry, "VRT::delegateBySig: signature expired"); + require(now <= expiry, "VRT::delegateBySig: signature expired"); return _delegate(signatory, delegatee); } @@ -301,7 +301,7 @@ contract VRT is Tokenlock { return a - b; } - function getChainId() internal view returns (uint) { + function getChainId() internal pure returns (uint) { uint256 chainId; assembly { chainId := chainid() diff --git a/contracts/Tokens/VRT/VRTConverter.sol b/contracts/Tokens/VRT/VRTConverter.sol index 4fe4e83b1..2a34f9c2d 100644 --- a/contracts/Tokens/VRT/VRTConverter.sol +++ b/contracts/Tokens/VRT/VRTConverter.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; import "../../Utils/IBEP20.sol"; import "../../Utils/SafeBEP20.sol"; diff --git a/contracts/Tokens/VRT/VRTConverterProxy.sol b/contracts/Tokens/VRT/VRTConverterProxy.sol index 38d8531be..b019155c2 100644 --- a/contracts/Tokens/VRT/VRTConverterProxy.sol +++ b/contracts/Tokens/VRT/VRTConverterProxy.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; import "./VRTConverterStorage.sol"; @@ -81,7 +81,7 @@ contract VRTConverterProxy is VRTConverterAdminStorage { (bool success, bytes memory returnData) = callee.delegatecall(data); assembly { if eq(success, 0) { - revert(add(returnData, 0x20), returndatasize()) + revert(add(returnData, 0x20), returndatasize) } } return returnData; @@ -173,20 +173,20 @@ contract VRTConverterProxy is VRTConverterAdminStorage { * It returns to the external caller whatever the implementation returns * or forwards reverts. */ - fallback() external payable { + function() external payable { // delegate all other functions to current implementation (bool success, ) = implementation.delegatecall(msg.data); assembly { let free_mem_ptr := mload(0x40) - returndatacopy(free_mem_ptr, 0, returndatasize()) + returndatacopy(free_mem_ptr, 0, returndatasize) switch success case 0 { - revert(free_mem_ptr, returndatasize()) + revert(free_mem_ptr, returndatasize) } default { - return(free_mem_ptr, returndatasize()) + return(free_mem_ptr, returndatasize) } } } diff --git a/contracts/Tokens/VRT/VRTConverterStorage.sol b/contracts/Tokens/VRT/VRTConverterStorage.sol index 15ffee15d..a0925db71 100644 --- a/contracts/Tokens/VRT/VRTConverterStorage.sol +++ b/contracts/Tokens/VRT/VRTConverterStorage.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; import "../../Utils/SafeMath.sol"; import "../../Utils/IBEP20.sol"; diff --git a/contracts/Tokens/VTokens/VBNB.sol.archive b/contracts/Tokens/VTokens/VBNB.sol.archive index da6f4efeb..3fa173ee8 100644 --- a/contracts/Tokens/VTokens/VBNB.sol.archive +++ b/contracts/Tokens/VTokens/VBNB.sol.archive @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; import "./VToken.sol"; @@ -26,9 +26,9 @@ contract VBNB is VToken { string memory symbol_, uint8 decimals_, address payable admin_ - ) { + ) public { // Creator of the contract is admin during initialization - admin = payable(msg.sender); + admin = msg.sender; initialize(comptroller_, interestRateModel_, initialExchangeRateMantissa_, name_, symbol_, decimals_); @@ -39,7 +39,7 @@ contract VBNB is VToken { /** * @notice Send BNB to VBNB to mint */ - fallback() external payable { + function() external payable { (uint err, ) = mintInternal(msg.value); requireNoError(err, "mint failed"); } @@ -135,14 +135,14 @@ contract VBNB is VToken { * @param amount Amount of BNB being sent * @return The actual amount of BNB transferred */ - function doTransferIn(address from, uint amount) internal override returns (uint) { + function doTransferIn(address from, uint amount) internal returns (uint) { // Sanity checks require(msg.sender == from, "sender mismatch"); require(msg.value == amount, "value mismatch"); return amount; } - function doTransferOut(address payable to, uint amount) internal virtual override { + function doTransferOut(address payable to, uint amount) internal { /* Send the BNB, with minimal gas and revert on failure */ to.transfer(amount); } @@ -152,7 +152,7 @@ contract VBNB is VToken { * @dev This excludes the value of the current message, if any * @return The quantity of BNB owned by this contract */ - function getCashPrior() internal view override returns (uint) { + function getCashPrior() internal view returns (uint) { (MathError err, uint startingBalance) = subUInt(address(this).balance, msg.value); require(err == MathError.NO_ERROR, "cash prior math error"); return startingBalance; diff --git a/contracts/Tokens/VTokens/VBep20.sol b/contracts/Tokens/VTokens/VBep20.sol index 5e921e79a..dbdae2329 100644 --- a/contracts/Tokens/VTokens/VBep20.sol +++ b/contracts/Tokens/VTokens/VBep20.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; import "./VToken.sol"; @@ -18,7 +18,7 @@ contract VBep20 is VToken, VBep20Interface { */ // @custom:event Emits Transfer event // @custom:event Emits Mint event - function mint(uint mintAmount) external override returns (uint) { + function mint(uint mintAmount) external returns (uint) { (uint err, ) = mintInternal(mintAmount); return err; } @@ -32,7 +32,7 @@ contract VBep20 is VToken, VBep20Interface { */ // @custom:event Emits Transfer event // @custom:event Emits MintBehalf event - function mintBehalf(address receiver, uint mintAmount) external override returns (uint) { + function mintBehalf(address receiver, uint mintAmount) external returns (uint) { (uint err, ) = mintBehalfInternal(receiver, mintAmount); return err; } @@ -46,7 +46,7 @@ contract VBep20 is VToken, VBep20Interface { // @custom:event Emits Redeem event on success // @custom:event Emits Transfer event on success // @custom:event Emits RedeemFee when fee is charged by the treasury - function redeem(uint redeemTokens) external override returns (uint) { + function redeem(uint redeemTokens) external returns (uint) { return redeemInternal(redeemTokens); } @@ -59,7 +59,7 @@ contract VBep20 is VToken, VBep20Interface { // @custom:event Emits Redeem event on success // @custom:event Emits Transfer event on success // @custom:event Emits RedeemFee when fee is charged by the treasury - function redeemUnderlying(uint redeemAmount) external override returns (uint) { + function redeemUnderlying(uint redeemAmount) external returns (uint) { return redeemUnderlyingInternal(redeemAmount); } @@ -69,9 +69,9 @@ contract VBep20 is VToken, VBep20Interface { * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). */ // @custom:event Emits Borrow event on success - function borrow(uint borrowAmount) external override returns (uint) { + function borrow(uint borrowAmount) external returns (uint) { address borrower = msg.sender; - address payable receiver = payable(msg.sender); + address payable receiver = msg.sender; return borrowInternal(borrower, receiver, borrowAmount); } @@ -85,7 +85,7 @@ contract VBep20 is VToken, VBep20Interface { // @custom:event Emits Borrow event on success function borrowBehalf(address borrower, uint borrowAmount) external returns (uint) { require(comptroller.approvedDelegates(borrower, msg.sender), "not an approved delegate"); - address payable receiver = payable(msg.sender); + address payable receiver = msg.sender; return borrowInternal(borrower, receiver, borrowAmount); } @@ -95,7 +95,7 @@ contract VBep20 is VToken, VBep20Interface { * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). */ // @custom:event Emits RepayBorrow event on success - function repayBorrow(uint repayAmount) external override returns (uint) { + function repayBorrow(uint repayAmount) external returns (uint) { (uint err, ) = repayBorrowInternal(repayAmount); return err; } @@ -107,7 +107,7 @@ contract VBep20 is VToken, VBep20Interface { * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). */ // @custom:event Emits RepayBorrow event on success - function repayBorrowBehalf(address borrower, uint repayAmount) external override returns (uint) { + function repayBorrowBehalf(address borrower, uint repayAmount) external returns (uint) { (uint err, ) = repayBorrowBehalfInternal(borrower, repayAmount); return err; } @@ -125,7 +125,7 @@ contract VBep20 is VToken, VBep20Interface { address borrower, uint repayAmount, VTokenInterface vTokenCollateral - ) external override returns (uint) { + ) external returns (uint) { (uint err, ) = liquidateBorrowInternal(borrower, repayAmount, vTokenCollateral); return err; } @@ -136,7 +136,7 @@ contract VBep20 is VToken, VBep20Interface { * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). */ // @custom:event Emits ReservesAdded event - function _addReserves(uint addAmount) external override returns (uint) { + function _addReserves(uint addAmount) external returns (uint) { return _addReservesInternal(addAmount); } @@ -178,7 +178,7 @@ contract VBep20 is VToken, VBep20Interface { * Note: This wrapper safely handles non-standard BEP-20 tokens that do not return a value. * See here: https://medium.com/coinmonks/missing-return-value-bug-at-least-130-tokens-affected-d67bf08521ca */ - function doTransferIn(address from, uint amount) internal override returns (uint) { + function doTransferIn(address from, uint amount) internal returns (uint) { EIP20NonStandardInterface token = EIP20NonStandardInterface(underlying); uint balanceBefore = EIP20Interface(underlying).balanceOf(address(this)); token.transferFrom(from, address(this), amount); @@ -217,7 +217,7 @@ contract VBep20 is VToken, VBep20Interface { * Note: This wrapper safely handles non-standard BEP-20 tokens that do not return a value. * See here: https://medium.com/coinmonks/missing-return-value-bug-at-least-130-tokens-affected-d67bf08521ca */ - function doTransferOut(address payable to, uint amount) internal virtual override { + function doTransferOut(address payable to, uint amount) internal { EIP20NonStandardInterface token = EIP20NonStandardInterface(underlying); token.transfer(to, amount); @@ -246,7 +246,7 @@ contract VBep20 is VToken, VBep20Interface { * @dev This excludes the value of the current message, if any * @return The quantity of underlying tokens owned by this contract */ - function getCashPrior() internal view override returns (uint) { + function getCashPrior() internal view returns (uint) { EIP20Interface token = EIP20Interface(underlying); return token.balanceOf(address(this)); } diff --git a/contracts/Tokens/VTokens/VBep20Delegate.sol b/contracts/Tokens/VTokens/VBep20Delegate.sol index ce2ff916d..e93817fb7 100644 --- a/contracts/Tokens/VTokens/VBep20Delegate.sol +++ b/contracts/Tokens/VTokens/VBep20Delegate.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; import "./VBep20.sol"; @@ -17,7 +17,7 @@ contract VBep20Delegate is VBep20, VDelegateInterface { * @notice Called by the delegator on a delegate to initialize it for duty * @param data The encoded bytes data for any initialization */ - function _becomeImplementation(bytes memory data) public override { + function _becomeImplementation(bytes memory data) public { // Shh -- currently unused data; @@ -32,7 +32,7 @@ contract VBep20Delegate is VBep20, VDelegateInterface { /** * @notice Called by the delegator on a delegate to forfeit its responsibility */ - function _resignImplementation() public override { + function _resignImplementation() public { // Shh -- we don't ever want this hook to be marked pure if (false) { implementation = address(0); diff --git a/contracts/Tokens/VTokens/VBep20Delegator.sol b/contracts/Tokens/VTokens/VBep20Delegator.sol index 61865075c..967b1f749 100644 --- a/contracts/Tokens/VTokens/VBep20Delegator.sol +++ b/contracts/Tokens/VTokens/VBep20Delegator.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; import "./VTokenInterfaces.sol"; @@ -34,7 +34,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac bytes memory becomeImplementationData ) public { // Creator of the contract is admin during initialization - admin = payable(msg.sender); + admin = msg.sender; // First delegate gets to initialize the delegator (i.e. storage contract) delegateTo( @@ -62,7 +62,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @notice Delegates execution to an implementation contract * @dev It returns to the external caller whatever the implementation returns or forwards reverts */ - fallback() external payable { + function() external payable { require(msg.value == 0, "VBep20Delegator:fallback: cannot send value to fallback"); // delegate all other functions to current implementation @@ -70,14 +70,14 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac assembly { let free_mem_ptr := mload(0x40) - returndatacopy(free_mem_ptr, 0, returndatasize()) + returndatacopy(free_mem_ptr, 0, returndatasize) switch success case 0 { - revert(free_mem_ptr, returndatasize()) + revert(free_mem_ptr, returndatasize) } default { - return(free_mem_ptr, returndatasize()) + return(free_mem_ptr, returndatasize) } } } @@ -88,7 +88,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @param mintAmount The amount of the underlying asset to supply * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). */ - function mint(uint mintAmount) external override returns (uint) { + function mint(uint mintAmount) external returns (uint) { bytes memory data = delegateToImplementation(abi.encodeWithSignature("mint(uint256)", mintAmount)); return abi.decode(data, (uint)); } @@ -99,7 +99,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @param mintAmount The amount of the underlying asset to supply * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). */ - function mintBehalf(address receiver, uint mintAmount) external override returns (uint) { + function mintBehalf(address receiver, uint mintAmount) external returns (uint) { bytes memory data = delegateToImplementation( abi.encodeWithSignature("mintBehalf(address,uint256)", receiver, mintAmount) ); @@ -112,7 +112,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @param redeemTokens The number of vTokens to redeem into underlying asset * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). */ - function redeem(uint redeemTokens) external override returns (uint) { + function redeem(uint redeemTokens) external returns (uint) { bytes memory data = delegateToImplementation(abi.encodeWithSignature("redeem(uint256)", redeemTokens)); return abi.decode(data, (uint)); } @@ -123,7 +123,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @param redeemAmount The amount of underlying to redeem * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). */ - function redeemUnderlying(uint redeemAmount) external override returns (uint) { + function redeemUnderlying(uint redeemAmount) external returns (uint) { bytes memory data = delegateToImplementation( abi.encodeWithSignature("redeemUnderlying(uint256)", redeemAmount) ); @@ -135,7 +135,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @param borrowAmount The amount of the underlying asset to borrow * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). */ - function borrow(uint borrowAmount) external override returns (uint) { + function borrow(uint borrowAmount) external returns (uint) { bytes memory data = delegateToImplementation(abi.encodeWithSignature("borrow(uint256)", borrowAmount)); return abi.decode(data, (uint)); } @@ -145,7 +145,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @param repayAmount The amount to repay * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). */ - function repayBorrow(uint repayAmount) external override returns (uint) { + function repayBorrow(uint repayAmount) external returns (uint) { bytes memory data = delegateToImplementation(abi.encodeWithSignature("repayBorrow(uint256)", repayAmount)); return abi.decode(data, (uint)); } @@ -156,7 +156,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @param repayAmount The amount to repay * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). */ - function repayBorrowBehalf(address borrower, uint repayAmount) external override returns (uint) { + function repayBorrowBehalf(address borrower, uint repayAmount) external returns (uint) { bytes memory data = delegateToImplementation( abi.encodeWithSignature("repayBorrowBehalf(address,uint256)", borrower, repayAmount) ); @@ -175,7 +175,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac address borrower, uint repayAmount, VTokenInterface vTokenCollateral - ) external override returns (uint) { + ) external returns (uint) { bytes memory data = delegateToImplementation( abi.encodeWithSignature("liquidateBorrow(address,uint256,address)", borrower, repayAmount, vTokenCollateral) ); @@ -188,7 +188,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @param amount The number of tokens to transfer * @return Whether or not the transfer succeeded */ - function transfer(address dst, uint amount) external override returns (bool) { + function transfer(address dst, uint amount) external returns (bool) { bytes memory data = delegateToImplementation(abi.encodeWithSignature("transfer(address,uint256)", dst, amount)); return abi.decode(data, (bool)); } @@ -200,7 +200,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @param amount The number of tokens to transfer * @return Whether or not the transfer succeeded */ - function transferFrom(address src, address dst, uint256 amount) external override returns (bool) { + function transferFrom(address src, address dst, uint256 amount) external returns (bool) { bytes memory data = delegateToImplementation( abi.encodeWithSignature("transferFrom(address,address,uint256)", src, dst, amount) ); @@ -215,7 +215,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @param amount The number of tokens that are approved (-1 means infinite) * @return Whether or not the approval succeeded */ - function approve(address spender, uint256 amount) external override returns (bool) { + function approve(address spender, uint256 amount) external returns (bool) { bytes memory data = delegateToImplementation( abi.encodeWithSignature("approve(address,uint256)", spender, amount) ); @@ -228,7 +228,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @param owner The address of the account to query * @return The amount of underlying owned by `owner` */ - function balanceOfUnderlying(address owner) external override returns (uint) { + function balanceOfUnderlying(address owner) external returns (uint) { bytes memory data = delegateToImplementation(abi.encodeWithSignature("balanceOfUnderlying(address)", owner)); return abi.decode(data, (uint)); } @@ -237,7 +237,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @notice Returns the current total borrows plus accrued interest * @return The total borrows with interest */ - function totalBorrowsCurrent() external override returns (uint) { + function totalBorrowsCurrent() external returns (uint) { bytes memory data = delegateToImplementation(abi.encodeWithSignature("totalBorrowsCurrent()")); return abi.decode(data, (uint)); } @@ -247,7 +247,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @param account The address whose balance should be calculated after updating borrowIndex * @return The calculated balance */ - function borrowBalanceCurrent(address account) external override returns (uint) { + function borrowBalanceCurrent(address account) external returns (uint) { bytes memory data = delegateToImplementation(abi.encodeWithSignature("borrowBalanceCurrent(address)", account)); return abi.decode(data, (uint)); } @@ -261,7 +261,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @param seizeTokens The number of vTokens to seize * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). */ - function seize(address liquidator, address borrower, uint seizeTokens) external override returns (uint) { + function seize(address liquidator, address borrower, uint seizeTokens) external returns (uint) { bytes memory data = delegateToImplementation( abi.encodeWithSignature("seize(address,address,uint256)", liquidator, borrower, seizeTokens) ); @@ -276,7 +276,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @param newPendingAdmin New pending admin. * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). */ - function _setPendingAdmin(address payable newPendingAdmin) external override returns (uint) { + function _setPendingAdmin(address payable newPendingAdmin) external returns (uint) { bytes memory data = delegateToImplementation( abi.encodeWithSignature("_setPendingAdmin(address)", newPendingAdmin) ); @@ -288,7 +288,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @dev Admin function to accrue interest and set a new reserve factor * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). */ - function _setReserveFactor(uint newReserveFactorMantissa) external override returns (uint) { + function _setReserveFactor(uint newReserveFactorMantissa) external returns (uint) { bytes memory data = delegateToImplementation( abi.encodeWithSignature("_setReserveFactor(uint256)", newReserveFactorMantissa) ); @@ -300,7 +300,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @dev Admin function for pending admin to accept role and update admin * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). */ - function _acceptAdmin() external override returns (uint) { + function _acceptAdmin() external returns (uint) { bytes memory data = delegateToImplementation(abi.encodeWithSignature("_acceptAdmin()")); return abi.decode(data, (uint)); } @@ -310,7 +310,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @param addAmount Amount of reserves to add * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). */ - function _addReserves(uint addAmount) external override returns (uint) { + function _addReserves(uint addAmount) external returns (uint) { bytes memory data = delegateToImplementation(abi.encodeWithSignature("_addReserves(uint256)", addAmount)); return abi.decode(data, (uint)); } @@ -320,7 +320,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @param reduceAmount Amount of reduction to reserves * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). */ - function _reduceReserves(uint reduceAmount) external override returns (uint) { + function _reduceReserves(uint reduceAmount) external returns (uint) { bytes memory data = delegateToImplementation(abi.encodeWithSignature("_reduceReserves(uint256)", reduceAmount)); return abi.decode(data, (uint)); } @@ -329,7 +329,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @notice Get cash balance of this vToken in the underlying asset * @return The quantity of underlying asset owned by this contract */ - function getCash() external view override returns (uint) { + function getCash() external view returns (uint) { bytes memory data = delegateToViewImplementation(abi.encodeWithSignature("getCash()")); return abi.decode(data, (uint)); } @@ -340,7 +340,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @param spender The address of the account which may transfer tokens * @return The number of tokens allowed to be spent (-1 means infinite) */ - function allowance(address owner, address spender) external view override returns (uint) { + function allowance(address owner, address spender) external view returns (uint) { bytes memory data = delegateToViewImplementation( abi.encodeWithSignature("allowance(address,address)", owner, spender) ); @@ -352,7 +352,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @param owner The address of the account to query * @return The number of tokens owned by `owner` */ - function balanceOf(address owner) external view override returns (uint) { + function balanceOf(address owner) external view returns (uint) { bytes memory data = delegateToViewImplementation(abi.encodeWithSignature("balanceOf(address)", owner)); return abi.decode(data, (uint)); } @@ -363,7 +363,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @param account Address of the account to snapshot * @return (possible error, token balance, borrow balance, exchange rate mantissa) */ - function getAccountSnapshot(address account) external view override returns (uint, uint, uint, uint) { + function getAccountSnapshot(address account) external view returns (uint, uint, uint, uint) { bytes memory data = delegateToViewImplementation( abi.encodeWithSignature("getAccountSnapshot(address)", account) ); @@ -374,7 +374,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @notice Returns the current per-block borrow interest rate for this vToken * @return The borrow interest rate per block, scaled by 1e18 */ - function borrowRatePerBlock() external view override returns (uint) { + function borrowRatePerBlock() external view returns (uint) { bytes memory data = delegateToViewImplementation(abi.encodeWithSignature("borrowRatePerBlock()")); return abi.decode(data, (uint)); } @@ -383,7 +383,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @notice Returns the current per-block supply interest rate for this vToken * @return The supply interest rate per block, scaled by 1e18 */ - function supplyRatePerBlock() external view override returns (uint) { + function supplyRatePerBlock() external view returns (uint) { bytes memory data = delegateToViewImplementation(abi.encodeWithSignature("supplyRatePerBlock()")); return abi.decode(data, (uint)); } @@ -399,7 +399,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac address implementation_, bool allowResign, bytes memory becomeImplementationData - ) public override { + ) public { require(msg.sender == admin, "VBep20Delegator::_setImplementation: Caller must be admin"); if (allowResign) { @@ -418,7 +418,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @notice Accrue interest then return the up-to-date exchange rate * @return Calculated exchange rate scaled by 1e18 */ - function exchangeRateCurrent() public override returns (uint) { + function exchangeRateCurrent() public returns (uint) { bytes memory data = delegateToImplementation(abi.encodeWithSignature("exchangeRateCurrent()")); return abi.decode(data, (uint)); } @@ -428,7 +428,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @dev This calculates interest accrued from the last checkpointed block * up to the current block and writes new checkpoint to storage. */ - function accrueInterest() public override returns (uint) { + function accrueInterest() public returns (uint) { bytes memory data = delegateToImplementation(abi.encodeWithSignature("accrueInterest()")); return abi.decode(data, (uint)); } @@ -438,7 +438,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @dev Admin function to set a new comptroller * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). */ - function _setComptroller(ComptrollerInterface newComptroller) public override returns (uint) { + function _setComptroller(ComptrollerInterface newComptroller) public returns (uint) { bytes memory data = delegateToImplementation( abi.encodeWithSignature("_setComptroller(address)", newComptroller) ); @@ -451,7 +451,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @param newInterestRateModel The new interest rate model to use * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). */ - function _setInterestRateModel(InterestRateModel newInterestRateModel) public override returns (uint) { + function _setInterestRateModel(InterestRateModel newInterestRateModel) public returns (uint) { bytes memory data = delegateToImplementation( abi.encodeWithSignature("_setInterestRateModel(address)", newInterestRateModel) ); @@ -481,7 +481,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac ); assembly { if eq(success, 0) { - revert(add(returnData, 0x20), returndatasize()) + revert(add(returnData, 0x20), returndatasize) } } return abi.decode(returnData, (bytes)); @@ -492,7 +492,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @param account The address whose balance should be calculated * @return The calculated balance */ - function borrowBalanceStored(address account) public view override returns (uint) { + function borrowBalanceStored(address account) public view returns (uint) { bytes memory data = delegateToViewImplementation( abi.encodeWithSignature("borrowBalanceStored(address)", account) ); @@ -504,7 +504,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac * @dev This function does not accrue interest before calculating the exchange rate * @return Calculated exchange rate scaled by 1e18 */ - function exchangeRateStored() public view override returns (uint) { + function exchangeRateStored() public view returns (uint) { bytes memory data = delegateToViewImplementation(abi.encodeWithSignature("exchangeRateStored()")); return abi.decode(data, (uint)); } @@ -520,7 +520,7 @@ contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterfac (bool success, bytes memory returnData) = callee.delegatecall(data); assembly { if eq(success, 0) { - revert(add(returnData, 0x20), returndatasize()) + revert(add(returnData, 0x20), returndatasize) } } return returnData; diff --git a/contracts/Tokens/VTokens/VBep20Immutable.sol b/contracts/Tokens/VTokens/VBep20Immutable.sol index 0616cb208..18a1c5f64 100644 --- a/contracts/Tokens/VTokens/VBep20Immutable.sol +++ b/contracts/Tokens/VTokens/VBep20Immutable.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; import "./VBep20.sol"; @@ -30,7 +30,7 @@ contract VBep20Immutable is VBep20 { address payable admin_ ) public { // Creator of the contract is admin during initialization - admin = payable(msg.sender); + admin = msg.sender; // Initialize the market initialize( diff --git a/contracts/Tokens/VTokens/VToken.sol b/contracts/Tokens/VTokens/VToken.sol index 069859e56..fab8abf63 100644 --- a/contracts/Tokens/VTokens/VToken.sol +++ b/contracts/Tokens/VTokens/VToken.sol @@ -1,5 +1,6 @@ -pragma solidity ^0.8.13; +pragma solidity ^0.5.16; +import "../../Comptroller/ComptrollerInterface.sol"; import "../../Utils/ErrorReporter.sol"; import "../../Utils/Exponential.sol"; import "../../Tokens/EIP20Interface.sol"; @@ -68,7 +69,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { * @return Whether or not the transfer succeeded */ // @custom:event Emits Transfer event - function transfer(address dst, uint256 amount) external override nonReentrant returns (bool) { + function transfer(address dst, uint256 amount) external nonReentrant returns (bool) { return transferTokens(msg.sender, msg.sender, dst, amount) == uint(Error.NO_ERROR); } @@ -80,7 +81,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { * @return Whether or not the transfer succeeded */ // @custom:event Emits Transfer event - function transferFrom(address src, address dst, uint256 amount) external override nonReentrant returns (bool) { + function transferFrom(address src, address dst, uint256 amount) external nonReentrant returns (bool) { return transferTokens(msg.sender, src, dst, amount) == uint(Error.NO_ERROR); } @@ -93,7 +94,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { * @return Whether or not the approval succeeded */ // @custom:event Emits Approval event on successful approve - function approve(address spender, uint256 amount) external override returns (bool) { + function approve(address spender, uint256 amount) external returns (bool) { address src = msg.sender; transferAllowances[src][spender] = amount; emit Approval(src, spender, amount); @@ -106,7 +107,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { * @param owner The address of the account to query * @return The amount of underlying owned by `owner` */ - function balanceOfUnderlying(address owner) external override returns (uint) { + function balanceOfUnderlying(address owner) external returns (uint) { Exp memory exchangeRate = Exp({ mantissa: exchangeRateCurrent() }); (MathError mErr, uint balance) = mulScalarTruncate(exchangeRate, accountTokens[owner]); require(mErr == MathError.NO_ERROR, "balance could not be calculated"); @@ -117,7 +118,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { * @notice Returns the current total borrows plus accrued interest * @return The total borrows with interest */ - function totalBorrowsCurrent() external override nonReentrant returns (uint) { + function totalBorrowsCurrent() external nonReentrant returns (uint) { require(accrueInterest() == uint(Error.NO_ERROR), "accrue interest failed"); return totalBorrows; } @@ -127,7 +128,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { * @param account The address whose balance should be calculated after updating borrowIndex * @return The calculated balance */ - function borrowBalanceCurrent(address account) external override nonReentrant returns (uint) { + function borrowBalanceCurrent(address account) external nonReentrant returns (uint) { require(accrueInterest() == uint(Error.NO_ERROR), "accrue interest failed"); return borrowBalanceStored(account); } @@ -142,11 +143,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). */ // @custom:event Emits Transfer event - function seize( - address liquidator, - address borrower, - uint seizeTokens - ) external override nonReentrant returns (uint) { + function seize(address liquidator, address borrower, uint seizeTokens) external nonReentrant returns (uint) { return seizeInternal(msg.sender, liquidator, borrower, seizeTokens); } @@ -157,7 +154,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). */ // @custom:event Emits NewPendingAdmin event with old and new admin addresses - function _setPendingAdmin(address payable newPendingAdmin) external override returns (uint) { + function _setPendingAdmin(address payable newPendingAdmin) external returns (uint) { // Check caller = admin if (msg.sender != admin) { return fail(Error.UNAUTHORIZED, FailureInfo.SET_PENDING_ADMIN_OWNER_CHECK); @@ -182,7 +179,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { */ // @custom:event Emits NewAdmin event on successful acceptance // @custom:event Emits NewPendingAdmin event with null new pending admin - function _acceptAdmin() external override returns (uint) { + function _acceptAdmin() external returns (uint) { // Check caller is pendingAdmin if (msg.sender != pendingAdmin) { return fail(Error.UNAUTHORIZED, FailureInfo.ACCEPT_ADMIN_PENDING_ADMIN_CHECK); @@ -196,7 +193,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { admin = pendingAdmin; // Clear the pending value - pendingAdmin = payable(address(0)); + pendingAdmin = address(0); emit NewAdmin(oldAdmin, admin); emit NewPendingAdmin(oldPendingAdmin, pendingAdmin); @@ -210,7 +207,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). */ // @custom:event Emits NewReserveFactor event - function _setReserveFactor(uint newReserveFactorMantissa) external override nonReentrant returns (uint) { + function _setReserveFactor(uint newReserveFactorMantissa) external nonReentrant returns (uint) { uint error = accrueInterest(); if (error != uint(Error.NO_ERROR)) { // accrueInterest emits logs on errors, but on top of that we want to log the fact that an attempted reserve factor change failed. @@ -226,7 +223,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). */ // @custom:event Emits ReservesReduced event - function _reduceReserves(uint reduceAmount) external override nonReentrant returns (uint) { + function _reduceReserves(uint reduceAmount) external nonReentrant returns (uint) { uint error = accrueInterest(); if (error != uint(Error.NO_ERROR)) { // accrueInterest emits logs on errors, but on top of that we want to log the fact that an attempted reduce reserves failed. @@ -242,7 +239,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { * @param spender The address of the account which may transfer tokens * @return The number of tokens allowed to be spent (-1 means infinite) */ - function allowance(address owner, address spender) external view override returns (uint256) { + function allowance(address owner, address spender) external view returns (uint256) { return transferAllowances[owner][spender]; } @@ -251,7 +248,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { * @param owner The address of the account to query * @return The number of tokens owned by `owner` */ - function balanceOf(address owner) external view override returns (uint256) { + function balanceOf(address owner) external view returns (uint256) { return accountTokens[owner]; } @@ -261,7 +258,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { * @param account Address of the account to snapshot * @return (possible error, token balance, borrow balance, exchange rate mantissa) */ - function getAccountSnapshot(address account) external view override returns (uint, uint, uint, uint) { + function getAccountSnapshot(address account) external view returns (uint, uint, uint, uint) { uint vTokenBalance = accountTokens[account]; uint borrowBalance; uint exchangeRateMantissa; @@ -285,7 +282,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { * @notice Returns the current per-block supply interest rate for this vToken * @return The supply interest rate per block, scaled by 1e18 */ - function supplyRatePerBlock() external view override returns (uint) { + function supplyRatePerBlock() external view returns (uint) { return interestRateModel.getSupplyRate(getCashPrior(), totalBorrows, totalReserves, reserveFactorMantissa); } @@ -293,7 +290,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { * @notice Returns the current per-block borrow interest rate for this vToken * @return The borrow interest rate per block, scaled by 1e18 */ - function borrowRatePerBlock() external view override returns (uint) { + function borrowRatePerBlock() external view returns (uint) { return interestRateModel.getBorrowRate(getCashPrior(), totalBorrows, totalReserves); } @@ -301,7 +298,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { * @notice Get cash balance of this vToken in the underlying asset * @return The quantity of underlying asset owned by this contract */ - function getCash() external view override returns (uint) { + function getCash() external view returns (uint) { return getCashPrior(); } @@ -353,7 +350,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { * @notice Accrue interest then return the up-to-date exchange rate * @return Calculated exchange rate scaled by 1e18 */ - function exchangeRateCurrent() public override nonReentrant returns (uint) { + function exchangeRateCurrent() public nonReentrant returns (uint) { require(accrueInterest() == uint(Error.NO_ERROR), "accrue interest failed"); return exchangeRateStored(); } @@ -364,7 +361,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { * up to the current block and writes new checkpoint to storage. */ // @custom:event Emits AccrueInterest event - function accrueInterest() public override returns (uint) { + function accrueInterest() public returns (uint) { /* Remember the initial block number */ uint currentBlockNumber = getBlockNumber(); uint accrualBlockNumberPrior = accrualBlockNumber; @@ -479,7 +476,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). */ // @custom:event Emits NewComptroller event - function _setComptroller(ComptrollerInterface newComptroller) public override returns (uint) { + function _setComptroller(ComptrollerInterface newComptroller) public returns (uint) { // Check caller is admin if (msg.sender != admin) { return fail(Error.UNAUTHORIZED, FailureInfo.SET_COMPTROLLER_OWNER_CHECK); @@ -488,6 +485,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { ComptrollerInterface oldComptroller = comptroller; // Ensure invoke comptroller.isComptroller() returns true require(newComptroller.isComptroller(), "marker method returned false"); + // Set market's comptroller to newComptroller comptroller = newComptroller; @@ -503,7 +501,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { * @param newInterestRateModel The new interest rate model to use * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). */ - function _setInterestRateModel(InterestRateModel newInterestRateModel) public override returns (uint) { + function _setInterestRateModel(InterestRateModel newInterestRateModel) public returns (uint) { uint error = accrueInterest(); if (error != uint(Error.NO_ERROR)) { // accrueInterest emits logs on errors, but on top of that we want to log the fact that an attempted change of interest rate model failed @@ -518,7 +516,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { * @dev This function does not accrue interest before calculating the exchange rate * @return Calculated exchange rate scaled by 1e18 */ - function exchangeRateStored() public view override returns (uint) { + function exchangeRateStored() public view returns (uint) { (MathError err, uint result) = exchangeRateStoredInternal(); require(err == MathError.NO_ERROR, "exchangeRateStored: exchangeRateStoredInternal failed"); return result; @@ -529,7 +527,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { * @param account The address whose balance should be calculated * @return The calculated balance */ - function borrowBalanceStored(address account) public view override returns (uint) { + function borrowBalanceStored(address account) public view returns (uint) { (MathError err, uint result) = borrowBalanceStoredInternal(account); require(err == MathError.NO_ERROR, "borrowBalanceStored: borrowBalanceStoredInternal failed"); return result; @@ -559,7 +557,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { /* Get the allowance, infinite for the account owner */ uint startingAllowance = 0; if (spender == src) { - startingAllowance = type(uint).max; + startingAllowance = uint(-1); } else { startingAllowance = transferAllowances[src][spender]; } @@ -593,7 +591,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { accountTokens[dst] = dstTokensNew; /* Eat some of the allowance (if necessary) */ - if (startingAllowance != type(uint).max) { + if (startingAllowance != uint(-1)) { transferAllowances[src][spender] = allowanceNew; } @@ -805,7 +803,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { return fail(Error(error), FailureInfo.REDEEM_ACCRUE_INTEREST_FAILED); } // redeemFresh emits redeem-specific logs on errors, so we don't need to - return redeemFresh(payable(msg.sender), redeemTokens, 0); + return redeemFresh(msg.sender, redeemTokens, 0); } /** @@ -821,7 +819,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { return fail(Error(error), FailureInfo.REDEEM_ACCRUE_INTEREST_FAILED); } // redeemFresh emits redeem-specific logs on errors, so we don't need to - return redeemFresh(payable(msg.sender), 0, redeemAmount); + return redeemFresh(msg.sender, 0, redeemAmount); } /** @@ -945,7 +943,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { revert("math error"); } - doTransferOut(payable(address(uint160(IComptroller(address(comptroller)).treasuryAddress()))), feeAmount); + doTransferOut(address(uint160(IComptroller(address(comptroller)).treasuryAddress())), feeAmount); emit RedeemFee(redeemer, feeAmount, vars.redeemTokens); } else { @@ -971,7 +969,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { */ function borrowInternal(uint borrowAmount) internal nonReentrant returns (uint) { address borrower = msg.sender; - address payable receiver = payable(msg.sender); + address payable receiver = msg.sender; return borrowInternal(borrower, receiver, borrowAmount); } @@ -1141,7 +1139,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { } /* If repayAmount == -1, repayAmount = accountBorrows */ - if (repayAmount == type(uint).max) { + if (repayAmount == uint(-1)) { vars.repayAmount = vars.accountBorrows; } else { vars.repayAmount = repayAmount; @@ -1211,7 +1209,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { } // liquidateBorrowFresh emits borrow-specific logs on errors, so we don't need to - return liquidateBorrowFresh(payable(msg.sender), borrower, repayAmount, vTokenCollateral); + return liquidateBorrowFresh(msg.sender, borrower, repayAmount, vTokenCollateral); } /** @@ -1263,7 +1261,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { } /* Fail if repayAmount = -1 */ - if (repayAmount == type(uint).max) { + if (repayAmount == uint(-1)) { return (fail(Error.INVALID_CLOSE_AMOUNT_REQUESTED, FailureInfo.LIQUIDATE_CLOSE_AMOUNT_IS_UINT_MAX), 0); } @@ -1288,7 +1286,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { /* Revert if borrower collateral token balance < seizeTokens */ require(vTokenCollateral.balanceOf(borrower) >= seizeTokens, "LIQUIDATE_SEIZE_TOO_MUCH"); - // If this is also the collateral, run seizeInternal to avoid re-entrancy, otherwise make an external override call + // If this is also the collateral, run seizeInternal to avoid re-entrancy, otherwise make an external call uint seizeError; if (address(vTokenCollateral) == address(this)) { seizeError = seizeInternal(address(this), liquidator, borrower, seizeTokens); @@ -1557,20 +1555,20 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { * @dev Performs a transfer in, reverting upon failure. Returns the amount actually transferred to the protocol, in case of a fee. * This may revert due to insufficient balance or insufficient allowance. */ - function doTransferIn(address from, uint amount) internal virtual returns (uint) {} + function doTransferIn(address from, uint amount) internal returns (uint); /** * @dev Performs a transfer out, ideally returning an explanatory error code upon failure rather than reverting. * If caller has not called checked protocol's balance, may revert due to insufficient cash held in the contract. * If caller has checked protocol's balance, and verified it is >= amount, this should not revert in normal conditions. */ - function doTransferOut(address payable to, uint amount) internal virtual {} + function doTransferOut(address payable to, uint amount) internal; /** * @dev Function to simply retrieve block number * This exists mainly for inheriting test contracts to stub this result. */ - function getBlockNumber() internal view virtual returns (uint) { + function getBlockNumber() internal view returns (uint) { return block.number; } @@ -1616,7 +1614,7 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { * @dev This function does not accrue interest before calculating the exchange rate * @return Tuple of error code and calculated exchange rate scaled by 1e18 */ - function exchangeRateStoredInternal() internal view virtual returns (MathError, uint) { + function exchangeRateStoredInternal() internal view returns (MathError, uint) { uint _totalSupply = totalSupply; if (_totalSupply == 0) { /* @@ -1655,5 +1653,5 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { * @dev This excludes the value of the current message, if any * @return The quantity of underlying owned by this contract */ - function getCashPrior() internal view virtual returns (uint) {} + function getCashPrior() internal view returns (uint); } diff --git a/contracts/Tokens/VTokens/VTokenInterfaces.sol b/contracts/Tokens/VTokens/VTokenInterfaces.sol index c228531d1..08a03a3d5 100644 --- a/contracts/Tokens/VTokens/VTokenInterfaces.sol +++ b/contracts/Tokens/VTokens/VTokenInterfaces.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; import "../../Comptroller/ComptrollerInterface.sol"; import "../../InterestRateModels/InterestRateModel.sol"; @@ -116,7 +116,7 @@ contract VTokenStorage { mapping(address => BorrowSnapshot) internal accountBorrows; } -abstract contract VTokenInterface is VTokenStorage { +contract VTokenInterface is VTokenStorage { /** * @notice Indicator that this is a vToken contract (for inspection) */ @@ -220,61 +220,61 @@ abstract contract VTokenInterface is VTokenStorage { /** * @notice Failure event */ - // event Failure(uint error, uint info, uint detail); + event Failure(uint error, uint info, uint detail); /*** User Interface ***/ - function transfer(address dst, uint amount) external virtual returns (bool); + function transfer(address dst, uint amount) external returns (bool); - function transferFrom(address src, address dst, uint amount) external virtual returns (bool); + function transferFrom(address src, address dst, uint amount) external returns (bool); - function approve(address spender, uint amount) external virtual returns (bool); + function approve(address spender, uint amount) external returns (bool); - function balanceOfUnderlying(address owner) external virtual returns (uint); + function balanceOfUnderlying(address owner) external returns (uint); - function totalBorrowsCurrent() external virtual returns (uint); + function totalBorrowsCurrent() external returns (uint); - function borrowBalanceCurrent(address account) external virtual returns (uint); + function borrowBalanceCurrent(address account) external returns (uint); - function seize(address liquidator, address borrower, uint seizeTokens) external virtual returns (uint); + function seize(address liquidator, address borrower, uint seizeTokens) external returns (uint); /*** Admin Function ***/ - function _setPendingAdmin(address payable newPendingAdmin) external virtual returns (uint); + function _setPendingAdmin(address payable newPendingAdmin) external returns (uint); /*** Admin Function ***/ - function _acceptAdmin() external virtual returns (uint); + function _acceptAdmin() external returns (uint); /*** Admin Function ***/ - function _setReserveFactor(uint newReserveFactorMantissa) external virtual returns (uint); + function _setReserveFactor(uint newReserveFactorMantissa) external returns (uint); /*** Admin Function ***/ - function _reduceReserves(uint reduceAmount) external virtual returns (uint); + function _reduceReserves(uint reduceAmount) external returns (uint); - function balanceOf(address owner) external view virtual returns (uint); + function balanceOf(address owner) external view returns (uint); - function allowance(address owner, address spender) external view virtual returns (uint); + function allowance(address owner, address spender) external view returns (uint); - function getAccountSnapshot(address account) external view virtual returns (uint, uint, uint, uint); + function getAccountSnapshot(address account) external view returns (uint, uint, uint, uint); - function borrowRatePerBlock() external view virtual returns (uint); + function borrowRatePerBlock() external view returns (uint); - function supplyRatePerBlock() external view virtual returns (uint); + function supplyRatePerBlock() external view returns (uint); - function getCash() external view virtual returns (uint); + function getCash() external view returns (uint); - function exchangeRateCurrent() public virtual returns (uint); + function exchangeRateCurrent() public returns (uint); - function accrueInterest() public virtual returns (uint); + function accrueInterest() public returns (uint); /*** Admin Function ***/ - function _setComptroller(ComptrollerInterface newComptroller) public virtual returns (uint); + function _setComptroller(ComptrollerInterface newComptroller) public returns (uint); /*** Admin Function ***/ - function _setInterestRateModel(InterestRateModel newInterestRateModel) public virtual returns (uint); + function _setInterestRateModel(InterestRateModel newInterestRateModel) public returns (uint); - function borrowBalanceStored(address account) public view virtual returns (uint); + function borrowBalanceStored(address account) public view returns (uint); - function exchangeRateStored() public view virtual returns (uint); + function exchangeRateStored() public view returns (uint); } contract VBep20Storage { @@ -284,32 +284,32 @@ contract VBep20Storage { address public underlying; } -abstract contract VBep20Interface is VBep20Storage { +contract VBep20Interface is VBep20Storage { /*** User Interface ***/ - function mint(uint mintAmount) external virtual returns (uint); + function mint(uint mintAmount) external returns (uint); - function mintBehalf(address receiver, uint mintAmount) external virtual returns (uint); + function mintBehalf(address receiver, uint mintAmount) external returns (uint); - function redeem(uint redeemTokens) external virtual returns (uint); + function redeem(uint redeemTokens) external returns (uint); - function redeemUnderlying(uint redeemAmount) external virtual returns (uint); + function redeemUnderlying(uint redeemAmount) external returns (uint); - function borrow(uint borrowAmount) external virtual returns (uint); + function borrow(uint borrowAmount) external returns (uint); - function repayBorrow(uint repayAmount) external virtual returns (uint); + function repayBorrow(uint repayAmount) external returns (uint); - function repayBorrowBehalf(address borrower, uint repayAmount) external virtual returns (uint); + function repayBorrowBehalf(address borrower, uint repayAmount) external returns (uint); function liquidateBorrow( address borrower, uint repayAmount, VTokenInterface vTokenCollateral - ) external virtual returns (uint); + ) external returns (uint); /*** Admin Functions ***/ - function _addReserves(uint addAmount) external virtual returns (uint); + function _addReserves(uint addAmount) external returns (uint); } contract VDelegationStorage { @@ -319,7 +319,7 @@ contract VDelegationStorage { address public implementation; } -abstract contract VDelegatorInterface is VDelegationStorage { +contract VDelegatorInterface is VDelegationStorage { /** * @notice Emitted when implementation is changed */ @@ -335,19 +335,19 @@ abstract contract VDelegatorInterface is VDelegationStorage { address implementation_, bool allowResign, bytes memory becomeImplementationData - ) public virtual; + ) public; } -abstract contract VDelegateInterface is VDelegationStorage { +contract VDelegateInterface is VDelegationStorage { /** * @notice Called by the delegator on a delegate to initialize it for duty * @dev Should revert if any issues arise which make it unfit for delegation * @param data The encoded bytes data for any initialization */ - function _becomeImplementation(bytes memory data) public virtual; + function _becomeImplementation(bytes memory data) public; /** * @notice Called by the delegator on a delegate to forfeit its responsibility */ - function _resignImplementation() public virtual; + function _resignImplementation() public; } diff --git a/contracts/Tokens/XVS/IXVSVesting.sol b/contracts/Tokens/XVS/IXVSVesting.sol index 12fbd578d..9e176d465 100644 --- a/contracts/Tokens/XVS/IXVSVesting.sol +++ b/contracts/Tokens/XVS/IXVSVesting.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; interface IXVSVesting { /// @param _recipient Address of the Vesting. recipient entitled to claim the vested funds diff --git a/contracts/Tokens/XVS/XVS.sol b/contracts/Tokens/XVS/XVS.sol index 5396b1e9f..ad269af1c 100644 --- a/contracts/Tokens/XVS/XVS.sol +++ b/contracts/Tokens/XVS/XVS.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; import "../../Utils/Tokenlock.sol"; @@ -87,8 +87,8 @@ contract XVS is Tokenlock { */ function approve(address spender, uint rawAmount) external validLock returns (bool) { uint96 amount; - if (rawAmount == type(uint).max) { - amount = type(uint96).max; + if (rawAmount == uint(-1)) { + amount = uint96(-1); } else { amount = safe96(rawAmount, "XVS::approve: amount exceeds 96 bits"); } @@ -132,7 +132,7 @@ contract XVS is Tokenlock { uint96 spenderAllowance = allowances[src][spender]; uint96 amount = safe96(rawAmount, "XVS::approve: amount exceeds 96 bits"); - if (spender != src && spenderAllowance != type(uint96).max) { + if (spender != src && spenderAllowance != uint96(-1)) { uint96 newAllowance = sub96( spenderAllowance, amount, @@ -173,7 +173,7 @@ contract XVS is Tokenlock { address signatory = ecrecover(digest, v, r, s); require(signatory != address(0), "XVS::delegateBySig: invalid signature"); require(nonce == nonces[signatory]++, "XVS::delegateBySig: invalid nonce"); - require(block.timestamp <= expiry, "XVS::delegateBySig: signature expired"); + require(now <= expiry, "XVS::delegateBySig: signature expired"); return _delegate(signatory, delegatee); } @@ -301,7 +301,7 @@ contract XVS is Tokenlock { return a - b; } - function getChainId() internal view returns (uint) { + function getChainId() internal pure returns (uint) { uint256 chainId; assembly { chainId := chainid() diff --git a/contracts/Tokens/XVS/XVSVesting.sol b/contracts/Tokens/XVS/XVSVesting.sol index 7caf8f086..ac8102865 100644 --- a/contracts/Tokens/XVS/XVSVesting.sol +++ b/contracts/Tokens/XVS/XVSVesting.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; import "../../Utils/IBEP20.sol"; import "../../Utils/SafeBEP20.sol"; diff --git a/contracts/Tokens/XVS/XVSVestingProxy.sol b/contracts/Tokens/XVS/XVSVestingProxy.sol index 080ebb677..411b5d4ab 100644 --- a/contracts/Tokens/XVS/XVSVestingProxy.sol +++ b/contracts/Tokens/XVS/XVSVestingProxy.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; import "./XVSVestingStorage.sol"; @@ -67,7 +67,7 @@ contract XVSVestingProxy is XVSVestingAdminStorage { (bool success, bytes memory returnData) = callee.delegatecall(data); assembly { if eq(success, 0) { - revert(add(returnData, 0x20), returndatasize()) + revert(add(returnData, 0x20), returndatasize) } } return returnData; @@ -156,20 +156,20 @@ contract XVSVestingProxy is XVSVestingAdminStorage { * It returns to the external caller whatever the implementation returns * or forwards reverts. */ - fallback() external payable { + function() external payable { // delegate all other functions to current implementation (bool success, ) = implementation.delegatecall(msg.data); assembly { let free_mem_ptr := mload(0x40) - returndatacopy(free_mem_ptr, 0, returndatasize()) + returndatacopy(free_mem_ptr, 0, returndatasize) switch success case 0 { - revert(free_mem_ptr, returndatasize()) + revert(free_mem_ptr, returndatasize) } default { - return(free_mem_ptr, returndatasize()) + return(free_mem_ptr, returndatasize) } } } diff --git a/contracts/Tokens/XVS/XVSVestingStorage.sol b/contracts/Tokens/XVS/XVSVestingStorage.sol index 93d7c50bc..ee39eb46f 100644 --- a/contracts/Tokens/XVS/XVSVestingStorage.sol +++ b/contracts/Tokens/XVS/XVSVestingStorage.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; import "../../Utils/SafeMath.sol"; import "../../Utils/IBEP20.sol"; diff --git a/contracts/Utils/Address.sol b/contracts/Utils/Address.sol index a1ed9ae9d..3f12648cc 100644 --- a/contracts/Utils/Address.sol +++ b/contracts/Utils/Address.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.5; /** * @dev Collection of functions related to the address type @@ -41,7 +41,7 @@ library Address { * _Available since v2.4.0._ */ function toPayable(address account) internal pure returns (address payable) { - return payable(address(uint160(account))); + return address(uint160(account)); } /** @@ -67,7 +67,7 @@ library Address { // solhint-disable-next-line avoid-call-value // solium-disable-next-line security/no-call-value - (bool success, ) = recipient.call{ value: amount }(""); + (bool success, ) = recipient.call.value(amount)(""); require(success, "Address: unable to send value, recipient may have reverted"); } } diff --git a/contracts/Utils/CarefulMath.sol b/contracts/Utils/CarefulMath.sol index baa99372b..63b1a8bc6 100644 --- a/contracts/Utils/CarefulMath.sol +++ b/contracts/Utils/CarefulMath.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; /** * @title Careful Math diff --git a/contracts/Utils/Context.sol b/contracts/Utils/Context.sol index ff604b6bf..24a7f00ec 100644 --- a/contracts/Utils/Context.sol +++ b/contracts/Utils/Context.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; /* * @dev Provides information about the current execution context, including the @@ -10,13 +10,13 @@ pragma solidity 0.8.13; * * This contract is only required for intermediate, library-like contracts. */ -abstract contract Context { +contract Context { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor() internal {} function _msgSender() internal view returns (address payable) { - return payable(msg.sender); + return msg.sender; } function _msgData() internal view returns (bytes memory) { diff --git a/contracts/Utils/ECDSA.sol b/contracts/Utils/ECDSA.sol index f919fe4ff..9ca72ba71 100644 --- a/contracts/Utils/ECDSA.sol +++ b/contracts/Utils/ECDSA.sol @@ -4,7 +4,7 @@ // SPDX-Copyright-Text: OpenZeppelin, 2021 // SPDX-Copyright-Text: Venus, 2021 -pragma solidity 0.8.13; +pragma solidity ^0.5.16; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. diff --git a/contracts/Utils/ErrorReporter.sol b/contracts/Utils/ErrorReporter.sol index e4b555c88..9a3191e8f 100644 --- a/contracts/Utils/ErrorReporter.sol +++ b/contracts/Utils/ErrorReporter.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; contract ComptrollerErrorReporter { enum Error { diff --git a/contracts/Utils/Exponential.sol b/contracts/Utils/Exponential.sol index 304a7e870..70c317628 100644 --- a/contracts/Utils/Exponential.sol +++ b/contracts/Utils/Exponential.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; import "./CarefulMath.sol"; import "./ExponentialNoError.sol"; diff --git a/contracts/Utils/ExponentialNoError.sol b/contracts/Utils/ExponentialNoError.sol index 9036400b6..016e2614f 100644 --- a/contracts/Utils/ExponentialNoError.sol +++ b/contracts/Utils/ExponentialNoError.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; /** * @title Exponential module for storing fixed-precision decimals diff --git a/contracts/Utils/IBEP20.sol b/contracts/Utils/IBEP20.sol index 4e990eb34..025c6deac 100644 --- a/contracts/Utils/IBEP20.sol +++ b/contracts/Utils/IBEP20.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.0; /** * @dev Interface of the BEP20 standard as defined in the EIP. Does not include diff --git a/contracts/Utils/Ownable.sol b/contracts/Utils/Ownable.sol index 49d9f17ef..d041f72f0 100644 --- a/contracts/Utils/Ownable.sol +++ b/contracts/Utils/Ownable.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; import "./Context.sol"; @@ -14,7 +14,7 @@ import "./Context.sol"; * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ -abstract contract Ownable is Context { +contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); diff --git a/contracts/Utils/Owned.sol b/contracts/Utils/Owned.sol index aef4726dd..3ad6dabfc 100644 --- a/contracts/Utils/Owned.sol +++ b/contracts/Utils/Owned.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; contract Owned { address public owner; diff --git a/contracts/Utils/SafeBEP20.sol b/contracts/Utils/SafeBEP20.sol index 41ccd3808..18f68ea34 100644 --- a/contracts/Utils/SafeBEP20.sol +++ b/contracts/Utils/SafeBEP20.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.0; import "./SafeMath.sol"; import "./IBEP20.sol"; diff --git a/contracts/Utils/SafeMath.sol b/contracts/Utils/SafeMath.sol index 2225efbd9..283120088 100644 --- a/contracts/Utils/SafeMath.sol +++ b/contracts/Utils/SafeMath.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow diff --git a/contracts/Utils/Tokenlock.sol b/contracts/Utils/Tokenlock.sol index de3c0d267..abcf8e354 100644 --- a/contracts/Utils/Tokenlock.sol +++ b/contracts/Utils/Tokenlock.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; import "./Owned.sol"; diff --git a/contracts/VRTVault/VRTVault.sol b/contracts/VRTVault/VRTVault.sol index 96f6b5bd5..4c5a98c90 100644 --- a/contracts/VRTVault/VRTVault.sol +++ b/contracts/VRTVault/VRTVault.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; import "../Utils/SafeBEP20.sol"; import "../Utils/IBEP20.sol"; @@ -242,7 +242,7 @@ contract VRTVault is VRTVaultStorage { token.safeTransfer(receiver, amount); } - function getBlockNumber() public view virtual returns (uint256) { + function getBlockNumber() public view returns (uint256) { return block.number; } diff --git a/contracts/VRTVault/VRTVaultProxy.sol b/contracts/VRTVault/VRTVaultProxy.sol index 1c3dd8ab3..5f8e605fe 100644 --- a/contracts/VRTVault/VRTVaultProxy.sol +++ b/contracts/VRTVault/VRTVaultProxy.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; import "./VRTVaultStorage.sol"; @@ -62,7 +62,7 @@ contract VRTVaultProxy is VRTVaultAdminStorage { (bool success, bytes memory returnData) = callee.delegatecall(data); assembly { if eq(success, 0) { - revert(add(returnData, 0x20), returndatasize()) + revert(add(returnData, 0x20), returndatasize) } } return returnData; @@ -149,20 +149,20 @@ contract VRTVaultProxy is VRTVaultAdminStorage { * It returns to the external caller whatever the implementation returns * or forwards reverts. */ - fallback() external payable { + function() external payable { // delegate all other functions to current implementation (bool success, ) = implementation.delegatecall(msg.data); assembly { let free_mem_ptr := mload(0x40) - returndatacopy(free_mem_ptr, 0, returndatasize()) + returndatacopy(free_mem_ptr, 0, returndatasize) switch success case 0 { - revert(free_mem_ptr, returndatasize()) + revert(free_mem_ptr, returndatasize) } default { - return(free_mem_ptr, returndatasize()) + return(free_mem_ptr, returndatasize) } } } diff --git a/contracts/VRTVault/VRTVaultStorage.sol b/contracts/VRTVault/VRTVaultStorage.sol index efae1ecaa..38d2aa5d2 100644 --- a/contracts/VRTVault/VRTVaultStorage.sol +++ b/contracts/VRTVault/VRTVaultStorage.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; import "../Utils/SafeMath.sol"; import "../Utils/IBEP20.sol"; diff --git a/contracts/Vault/VAIVault.sol b/contracts/Vault/VAIVault.sol index e6575d8e7..1ad9a9802 100644 --- a/contracts/Vault/VAIVault.sol +++ b/contracts/Vault/VAIVault.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; import "../Utils/SafeBEP20.sol"; import "../Utils/IBEP20.sol"; import "./VAIVaultProxy.sol"; diff --git a/contracts/Vault/VAIVaultErrorReporter.sol b/contracts/Vault/VAIVaultErrorReporter.sol index 45504d880..1e6c8cee4 100644 --- a/contracts/Vault/VAIVaultErrorReporter.sol +++ b/contracts/Vault/VAIVaultErrorReporter.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; contract VAIVaultErrorReporter { enum Error { diff --git a/contracts/Vault/VAIVaultProxy.sol b/contracts/Vault/VAIVaultProxy.sol index 8f138e08e..e7d3f430d 100644 --- a/contracts/Vault/VAIVaultProxy.sol +++ b/contracts/Vault/VAIVaultProxy.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; import "./VAIVaultStorage.sol"; import "./VAIVaultErrorReporter.sol"; @@ -125,20 +125,20 @@ contract VAIVaultProxy is VAIVaultAdminStorage, VAIVaultErrorReporter { * It returns to the external caller whatever the implementation returns * or forwards reverts. */ - fallback() external payable { + function() external payable { // delegate all other functions to current implementation (bool success, ) = vaiVaultImplementation.delegatecall(msg.data); assembly { let free_mem_ptr := mload(0x40) - returndatacopy(free_mem_ptr, 0, returndatasize()) + returndatacopy(free_mem_ptr, 0, returndatasize) switch success case 0 { - revert(free_mem_ptr, returndatasize()) + revert(free_mem_ptr, returndatasize) } default { - return(free_mem_ptr, returndatasize()) + return(free_mem_ptr, returndatasize) } } } diff --git a/contracts/Vault/VAIVaultStorage.sol b/contracts/Vault/VAIVaultStorage.sol index 779911fdc..f5a9419f4 100644 --- a/contracts/Vault/VAIVaultStorage.sol +++ b/contracts/Vault/VAIVaultStorage.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; import "../Utils/SafeMath.sol"; import "../Utils/IBEP20.sol"; diff --git a/contracts/XVSVault/XVSStore.sol b/contracts/XVSVault/XVSStore.sol index 2cd7e057c..e356e8594 100644 --- a/contracts/XVSVault/XVSStore.sol +++ b/contracts/XVSVault/XVSStore.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; import "../Utils/SafeBEP20.sol"; import "../Utils/IBEP20.sol"; diff --git a/contracts/XVSVault/XVSVault.sol b/contracts/XVSVault/XVSVault.sol index 7116796fa..88d602e18 100644 --- a/contracts/XVSVault/XVSVault.sol +++ b/contracts/XVSVault/XVSVault.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; pragma experimental ABIEncoderV2; import "../Utils/ECDSA.sol"; @@ -648,7 +648,7 @@ contract XVSVault is XVSVaultStorage, ECDSA { return a - b; } - function getChainId() internal view returns (uint) { + function getChainId() internal pure returns (uint) { uint256 chainId; assembly { chainId := chainid() diff --git a/contracts/XVSVault/XVSVaultErrorReporter.sol b/contracts/XVSVault/XVSVaultErrorReporter.sol index 82fb306d9..286384652 100644 --- a/contracts/XVSVault/XVSVaultErrorReporter.sol +++ b/contracts/XVSVault/XVSVaultErrorReporter.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; contract XVSVaultErrorReporter { enum Error { diff --git a/contracts/XVSVault/XVSVaultProxy.sol b/contracts/XVSVault/XVSVaultProxy.sol index 3d7f331a0..b37c07c03 100644 --- a/contracts/XVSVault/XVSVaultProxy.sol +++ b/contracts/XVSVault/XVSVaultProxy.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; import "./XVSVaultStorage.sol"; import "./XVSVaultErrorReporter.sol"; @@ -125,20 +125,20 @@ contract XVSVaultProxy is XVSVaultAdminStorage, XVSVaultErrorReporter { * It returns to the external caller whatever the implementation returns * or forwards reverts. */ - fallback() external payable { + function() external payable { // delegate all other functions to current implementation (bool success, ) = implementation.delegatecall(msg.data); assembly { let free_mem_ptr := mload(0x40) - returndatacopy(free_mem_ptr, 0, returndatasize()) + returndatacopy(free_mem_ptr, 0, returndatasize) switch success case 0 { - revert(free_mem_ptr, returndatasize()) + revert(free_mem_ptr, returndatasize) } default { - return(free_mem_ptr, returndatasize()) + return(free_mem_ptr, returndatasize) } } } diff --git a/contracts/XVSVault/XVSVaultStorage.sol b/contracts/XVSVault/XVSVaultStorage.sol index 8ed2ec0b1..9bfd775a6 100644 --- a/contracts/XVSVault/XVSVaultStorage.sol +++ b/contracts/XVSVault/XVSVaultStorage.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; import "../Utils/SafeMath.sol"; import "../Utils/IBEP20.sol"; diff --git a/contracts/test/BEP20.sol b/contracts/test/BEP20.sol index 85f48ab48..c43e2e7fa 100644 --- a/contracts/test/BEP20.sol +++ b/contracts/test/BEP20.sol @@ -1,6 +1,6 @@ pragma solidity 0.8.13; -import "../Utils/SafeMath.sol"; +import "../Utils/V0.8.13/SafeMath.sol"; interface BEP20Base { event Approval(address indexed owner, address indexed spender, uint256 value); diff --git a/contracts/test/ComptrollerHarness.sol b/contracts/test/ComptrollerHarness.sol index 3de2db58c..4b2c3bbe8 100644 --- a/contracts/test/ComptrollerHarness.sol +++ b/contracts/test/ComptrollerHarness.sol @@ -1,16 +1,16 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; import "../Comptroller/Comptroller.sol"; import "../Oracle/PriceOracle.sol"; contract ComptrollerKovan is Comptroller { - function getXVSAddress() public view override returns (address) { + function getXVSAddress() public view returns (address) { return 0x61460874a7196d6a22D1eE4922473664b3E95270; } } contract ComptrollerRopsten is Comptroller { - function getXVSAddress() public view override returns (address) { + function getXVSAddress() public view returns (address) { return 0x1Fe16De955718CFAb7A44605458AB023838C2793; } } @@ -40,7 +40,7 @@ contract ComptrollerHarness is Comptroller { xvsAddress = xvsAddress_; } - function getXVSAddress() public view override returns (address) { + function getXVSAddress() public view returns (address) { return xvsAddress; } @@ -48,7 +48,7 @@ contract ComptrollerHarness is Comptroller { vXVSAddress = vXVSAddress_; } - function getXVSVTokenAddress() public view override returns (address) { + function getXVSVTokenAddress() public view returns (address) { return vXVSAddress; } @@ -157,7 +157,7 @@ contract ComptrollerHarness is Comptroller { blockNumber = number; } - function getBlockNumber() public view override returns (uint) { + function getBlockNumber() public view returns (uint) { return blockNumber; } @@ -196,7 +196,7 @@ contract ComptrollerBorked { } } -abstract contract BoolComptroller is ComptrollerInterface { +contract BoolComptroller is ComptrollerInterface { bool internal allowMint = true; bool internal allowRedeem = true; bool internal allowBorrow = true; @@ -232,27 +232,27 @@ abstract contract BoolComptroller is ComptrollerInterface { /*** Assets You Are In ***/ - function enterMarkets(address[] calldata _vTokens) external override returns (uint[] memory) { + function enterMarkets(address[] calldata _vTokens) external returns (uint[] memory) { _vTokens; uint[] memory ret; return ret; } - function exitMarket(address _vToken) external override returns (uint) { + function exitMarket(address _vToken) external returns (uint) { _vToken; return noError; } /*** Policy Hooks ***/ - function mintAllowed(address _vToken, address _minter, uint _mintAmount) external override returns (uint) { + function mintAllowed(address _vToken, address _minter, uint _mintAmount) external returns (uint) { _vToken; _minter; _mintAmount; return allowMint ? noError : opaqueError; } - function mintVerify(address _vToken, address _minter, uint _mintAmount, uint _mintTokens) external override { + function mintVerify(address _vToken, address _minter, uint _mintAmount, uint _mintTokens) external { _vToken; _minter; _mintAmount; @@ -260,19 +260,14 @@ abstract contract BoolComptroller is ComptrollerInterface { require(verifyMint, "mintVerify rejected mint"); } - function redeemAllowed(address _vToken, address _redeemer, uint _redeemTokens) external override returns (uint) { + function redeemAllowed(address _vToken, address _redeemer, uint _redeemTokens) external returns (uint) { _vToken; _redeemer; _redeemTokens; return allowRedeem ? noError : opaqueError; } - function redeemVerify( - address _vToken, - address _redeemer, - uint _redeemAmount, - uint _redeemTokens - ) external override { + function redeemVerify(address _vToken, address _redeemer, uint _redeemAmount, uint _redeemTokens) external { _vToken; _redeemer; _redeemAmount; @@ -280,14 +275,14 @@ abstract contract BoolComptroller is ComptrollerInterface { require(verifyRedeem, "redeemVerify rejected redeem"); } - function borrowAllowed(address _vToken, address _borrower, uint _borrowAmount) external override returns (uint) { + function borrowAllowed(address _vToken, address _borrower, uint _borrowAmount) external returns (uint) { _vToken; _borrower; _borrowAmount; return allowBorrow ? noError : opaqueError; } - function borrowVerify(address _vToken, address _borrower, uint _borrowAmount) external override { + function borrowVerify(address _vToken, address _borrower, uint _borrowAmount) external { _vToken; _borrower; _borrowAmount; @@ -299,7 +294,7 @@ abstract contract BoolComptroller is ComptrollerInterface { address _payer, address _borrower, uint _repayAmount - ) external override returns (uint) { + ) external returns (uint) { _vToken; _payer; _borrower; @@ -313,7 +308,7 @@ abstract contract BoolComptroller is ComptrollerInterface { address _borrower, uint _repayAmount, uint _borrowerIndex - ) external override { + ) external { _vToken; _payer; _borrower; @@ -332,7 +327,7 @@ abstract contract BoolComptroller is ComptrollerInterface { address _liquidator, address _borrower, uint _repayAmount - ) external override returns (uint) { + ) external returns (uint) { _vTokenBorrowed; _vTokenCollateral; _borrower; @@ -350,7 +345,7 @@ abstract contract BoolComptroller is ComptrollerInterface { address _borrower, uint _repayAmount, uint _seizeTokens - ) external override { + ) external { _vTokenBorrowed; _vTokenCollateral; _liquidator; @@ -366,7 +361,7 @@ abstract contract BoolComptroller is ComptrollerInterface { address _borrower, address _liquidator, uint _seizeTokens - ) external override returns (uint) { + ) external returns (uint) { _vTokenCollateral; _vTokenBorrowed; _liquidator; @@ -381,7 +376,7 @@ abstract contract BoolComptroller is ComptrollerInterface { address _liquidator, address _borrower, uint _seizeTokens - ) external override { + ) external { _vTokenCollateral; _vTokenBorrowed; _liquidator; @@ -395,7 +390,7 @@ abstract contract BoolComptroller is ComptrollerInterface { address _src, address _dst, uint _transferTokens - ) external override returns (uint) { + ) external returns (uint) { _vToken; _src; _dst; @@ -403,7 +398,7 @@ abstract contract BoolComptroller is ComptrollerInterface { return allowTransfer ? noError : opaqueError; } - function transferVerify(address _vToken, address _src, address _dst, uint _transferTokens) external override { + function transferVerify(address _vToken, address _src, address _dst, uint _transferTokens) external { _vToken; _src; _dst; @@ -417,7 +412,7 @@ abstract contract BoolComptroller is ComptrollerInterface { address _vTokenBorrowed, address _vTokenCollateral, uint _repayAmount - ) external view override returns (uint, uint) { + ) external view returns (uint, uint) { _vTokenBorrowed; _vTokenCollateral; _repayAmount; @@ -429,7 +424,7 @@ abstract contract BoolComptroller is ComptrollerInterface { function liquidateVAICalculateSeizeTokens( address _vTokenCollateral, uint _repayAmount - ) external view override returns (uint, uint) { + ) external view returns (uint, uint) { _vTokenCollateral; _repayAmount; return vaiFailCalculateSeizeTokens ? (opaqueError, 0) : (noError, vaiCalculatedSeizeTokens); @@ -528,7 +523,7 @@ abstract contract BoolComptroller is ComptrollerInterface { // return 1e18; // } - function setMintedVAIOf(address owner, uint amount) external override returns (uint) { + function setMintedVAIOf(address owner, uint amount) external returns (uint) { owner; amount; return noError; @@ -548,27 +543,27 @@ abstract contract BoolComptroller is ComptrollerInterface { /*** Functions from ComptrollerInterface not implemented by BoolComptroller ***/ - function markets(address) external view override returns (bool, uint) { + function markets(address) external view returns (bool, uint) { revert(); } - function oracle() external view override returns (PriceOracle) { + function oracle() external view returns (PriceOracle) { revert(); } - function getAccountLiquidity(address) external view override returns (uint, uint, uint) { + function getAccountLiquidity(address) external view returns (uint, uint, uint) { revert(); } - function getAssetsIn(address) external view override returns (VToken[] memory) { + function getAssetsIn(address) external view returns (VToken[] memory) { revert(); } - function claimVenus(address) external override { + function claimVenus(address) external { revert(); } - function venusAccrued(address) external view override returns (uint) { + function venusAccrued(address) external view returns (uint) { revert(); } @@ -576,27 +571,27 @@ abstract contract BoolComptroller is ComptrollerInterface { revert(); } - function getAllMarkets() external view override returns (VToken[] memory) { + function getAllMarkets() external view returns (VToken[] memory) { revert(); } - function venusSupplierIndex(address, address) external view override returns (uint) { + function venusSupplierIndex(address, address) external view returns (uint) { revert(); } - function venusInitialIndex() external view override returns (uint224) { + function venusInitialIndex() external view returns (uint224) { revert(); } - function venusBorrowerIndex(address, address) external view override returns (uint) { + function venusBorrowerIndex(address, address) external view returns (uint) { revert(); } - function venusBorrowState(address) external view override returns (uint224, uint32) { + function venusBorrowState(address) external view returns (uint224, uint32) { revert(); } - function venusSupplyState(address) external view override returns (uint224, uint32) { + function venusSupplyState(address) external view returns (uint224, uint32) { revert(); } } diff --git a/contracts/test/ComptrollerScenario.sol b/contracts/test/ComptrollerScenario.sol index 237709885..8c247aa3c 100644 --- a/contracts/test/ComptrollerScenario.sol +++ b/contracts/test/ComptrollerScenario.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; import "../Comptroller/Comptroller.sol"; @@ -13,7 +13,7 @@ contract ComptrollerScenario is Comptroller { xvsAddress = xvsAddress_; } - function getXVSAddress() public view override returns (address) { + function getXVSAddress() public view returns (address) { return xvsAddress; } @@ -39,7 +39,7 @@ contract ComptrollerScenario is Comptroller { blockNumber = number; } - function getBlockNumber() public view override returns (uint) { + function getBlockNumber() public view returns (uint) { return blockNumber; } diff --git a/contracts/test/EvilXDelegator.sol b/contracts/test/EvilXDelegator.sol index 5f04a85bf..152175039 100644 --- a/contracts/test/EvilXDelegator.sol +++ b/contracts/test/EvilXDelegator.sol @@ -1,6 +1,6 @@ pragma solidity 0.8.13; -import "../Tokens/VTokens/VTokenInterfaces.sol"; +import "../Tokens/V0.8.13/VTokens/VTokenInterfaces.sol"; /** * @title Venus's VBep20Delegator Contract diff --git a/contracts/test/EvilXToken.sol b/contracts/test/EvilXToken.sol index 04e505205..42e94bed3 100644 --- a/contracts/test/EvilXToken.sol +++ b/contracts/test/EvilXToken.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; import "../Tokens/VTokens/VBep20Immutable.sol"; import "../Tokens/VTokens/VBep20Delegator.sol"; @@ -38,7 +38,7 @@ contract VBep20Scenario is VBep20Immutable { totalReserves = totalReserves_; } - function getBlockNumber() internal view override returns (uint) { + function getBlockNumber() internal view returns (uint) { ComptrollerScenario comptrollerScenario = ComptrollerScenario(address(comptroller)); return comptrollerScenario.blockNumber(); } @@ -63,14 +63,14 @@ contract EvilXToken is VBep20Delegate { comptrollerAddress = _comptrollerAddress; } - function exchangeRateStoredInternal() internal view override returns (MathError, uint) { + function exchangeRateStoredInternal() internal view returns (MathError, uint) { if (harnessExchangeRateStored) { return (MathError.NO_ERROR, harnessExchangeRate); } return super.exchangeRateStoredInternal(); } - function doTransferOut(address payable to, uint amount) internal override { + function doTransferOut(address payable to, uint amount) internal { require(failTransferToAddresses[to] == false, "TOKEN_TRANSFER_OUT_FAILED"); super.doTransferOut(to, amount); @@ -83,7 +83,7 @@ contract EvilXToken is VBep20Delegate { return; } - function getBlockNumber() internal view override returns (uint) { + function getBlockNumber() internal view returns (uint) { return blockNumber; } diff --git a/contracts/test/Fauceteer.sol b/contracts/test/Fauceteer.sol index c4f266c44..d3b449c2f 100644 --- a/contracts/test/Fauceteer.sol +++ b/contracts/test/Fauceteer.sol @@ -1,6 +1,6 @@ pragma solidity 0.8.13; -import "../Tokens/EIP20NonStandardInterface.sol"; +import "../Tokens/V0.8.13/EIP20NonStandardInterface.sol"; /** * @title Fauceteer diff --git a/contracts/test/FixedPriceOracle.sol b/contracts/test/FixedPriceOracle.sol index 1478b3c1d..d1424f3af 100644 --- a/contracts/test/FixedPriceOracle.sol +++ b/contracts/test/FixedPriceOracle.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; import "../Oracle/PriceOracle.sol"; @@ -9,7 +9,7 @@ contract FixedPriceOracle is PriceOracle { price = _price; } - function getUnderlyingPrice(VToken vToken) public view override returns (uint) { + function getUnderlyingPrice(VToken vToken) public view returns (uint) { vToken; return price; } diff --git a/contracts/test/GovernorAlphaHarness.sol b/contracts/test/GovernorAlphaHarness.sol index 2a83d360d..967c2170b 100644 --- a/contracts/test/GovernorAlphaHarness.sol +++ b/contracts/test/GovernorAlphaHarness.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; pragma experimental ABIEncoderV2; import "../Governance/GovernorAlpha.sol"; @@ -6,7 +6,7 @@ import "../Governance/GovernorAlpha.sol"; contract GovernorAlphaHarness is GovernorAlpha { constructor(address timelock_, address xvs_, address guardian_) public GovernorAlpha(timelock_, xvs_, guardian_) {} - function votingPeriod() public pure override returns (uint) { + function votingPeriod() public pure returns (uint) { return 240; } } diff --git a/contracts/test/InterestRateModelHarness.sol b/contracts/test/InterestRateModelHarness.sol index a828d763e..618f443f9 100644 --- a/contracts/test/InterestRateModelHarness.sol +++ b/contracts/test/InterestRateModelHarness.sol @@ -1,6 +1,6 @@ pragma solidity 0.8.13; -import "../InterestRateModels/InterestRateModel.sol"; +import "../InterestRateModels/V0.8.13/InterestRateModel.sol"; /** * @title An Interest Rate Model for tests that can be instructed to return a failure instead of doing a calculation diff --git a/contracts/test/MockDeflationaryToken.sol b/contracts/test/MockDeflationaryToken.sol index 873c291dd..bcb7a021d 100644 --- a/contracts/test/MockDeflationaryToken.sol +++ b/contracts/test/MockDeflationaryToken.sol @@ -1,6 +1,6 @@ pragma solidity 0.8.13; -import "../Utils/SafeMath.sol"; +import "../Utils/V0.8.13/SafeMath.sol"; contract DeflatingERC20 { using SafeMath for uint; diff --git a/contracts/test/SimplePriceOracle.sol b/contracts/test/SimplePriceOracle.sol index f3c6f59e9..df9b5e437 100644 --- a/contracts/test/SimplePriceOracle.sol +++ b/contracts/test/SimplePriceOracle.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; import "../Oracle/PriceOracle.sol"; import "../Tokens/VTokens/VBep20.sol"; @@ -7,7 +7,7 @@ contract SimplePriceOracle is PriceOracle { mapping(address => uint) internal prices; event PricePosted(address asset, uint previousPriceMantissa, uint requestedPriceMantissa, uint newPriceMantissa); - function getUnderlyingPrice(VToken vToken) public view override returns (uint) { + function getUnderlyingPrice(VToken vToken) public view returns (uint) { if (compareStrings(vToken.symbol(), "vBNB")) { return 1e18; } else if (compareStrings(vToken.symbol(), "VAI")) { diff --git a/contracts/test/TetherInterface.sol b/contracts/test/TetherInterface.sol index dce789a82..07526dae4 100644 --- a/contracts/test/TetherInterface.sol +++ b/contracts/test/TetherInterface.sol @@ -1,6 +1,6 @@ pragma solidity 0.8.13; -import "../Tokens/EIP20Interface.sol"; +import "../Tokens/V0.8.13/EIP20Interface.sol"; abstract contract TetherInterface is EIP20Interface { function setParams(uint newBasisPoints, uint newMaxFee) external virtual; diff --git a/contracts/test/TimelockHarness.sol b/contracts/test/TimelockHarness.sol index 10c03e6c6..a9c491a54 100644 --- a/contracts/test/TimelockHarness.sol +++ b/contracts/test/TimelockHarness.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; import "../Governance/Timelock.sol"; diff --git a/contracts/test/VAIControllerHarness.sol b/contracts/test/VAIControllerHarness.sol index 5c644ebd2..2332c013c 100644 --- a/contracts/test/VAIControllerHarness.sol +++ b/contracts/test/VAIControllerHarness.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; import "../Tokens/VAI/VAIController.sol"; @@ -20,7 +20,7 @@ contract VAIControllerHarness is VAIController { vaiAddress = vaiAddress_; } - function getVAIAddress() public view override returns (address) { + function getVAIAddress() public view returns (address) { return vaiAddress; } @@ -56,11 +56,11 @@ contract VAIControllerHarness is VAIController { blocksPerYear = number; } - function getBlockNumber() public view override returns (uint) { + function getBlockNumber() public view returns (uint) { return blockNumber; } - function getBlocksPerYear() public view override returns (uint) { + function getBlocksPerYear() public view returns (uint) { return blocksPerYear; } } diff --git a/contracts/test/VAIHarness.sol b/contracts/test/VAIHarness.sol index 003c7a573..9d6d27e5e 100644 --- a/contracts/test/VAIHarness.sol +++ b/contracts/test/VAIHarness.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; import "../Tokens/VAI/VAI.sol"; diff --git a/contracts/test/VBep20Harness.sol b/contracts/test/VBep20Harness.sol index 247732a25..6c13d7234 100644 --- a/contracts/test/VBep20Harness.sol +++ b/contracts/test/VBep20Harness.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; import "../Tokens/VTokens/VBep20Immutable.sol"; import "../Tokens/VTokens/VBep20Delegator.sol"; @@ -35,19 +35,19 @@ contract VBep20Harness is VBep20Immutable { ) {} - function doTransferOut(address payable to, uint amount) internal override { + function doTransferOut(address payable to, uint amount) internal { require(failTransferToAddresses[to] == false, "TOKEN_TRANSFER_OUT_FAILED"); return super.doTransferOut(to, amount); } - function exchangeRateStoredInternal() internal view override returns (MathError, uint) { + function exchangeRateStoredInternal() internal view returns (MathError, uint) { if (harnessExchangeRateStored) { return (MathError.NO_ERROR, harnessExchangeRate); } return super.exchangeRateStoredInternal(); } - function getBlockNumber() internal view override returns (uint) { + function getBlockNumber() internal view returns (uint) { return blockNumber; } @@ -201,7 +201,7 @@ contract VBep20Scenario is VBep20Immutable { totalReserves = totalReserves_; } - function getBlockNumber() internal view override returns (uint) { + function getBlockNumber() internal view returns (uint) { ComptrollerScenario comptrollerScenario = ComptrollerScenario(address(comptroller)); return comptrollerScenario.blockNumber(); } @@ -283,19 +283,19 @@ contract VBep20DelegateHarness is VBep20Delegate { mapping(address => bool) public failTransferToAddresses; - function exchangeRateStoredInternal() internal view override returns (MathError, uint) { + function exchangeRateStoredInternal() internal view returns (MathError, uint) { if (harnessExchangeRateStored) { return (MathError.NO_ERROR, harnessExchangeRate); } return super.exchangeRateStoredInternal(); } - function doTransferOut(address payable to, uint amount) internal override { + function doTransferOut(address payable to, uint amount) internal { require(failTransferToAddresses[to] == false, "TOKEN_TRANSFER_OUT_FAILED"); return super.doTransferOut(to, amount); } - function getBlockNumber() internal view override returns (uint) { + function getBlockNumber() internal view returns (uint) { return blockNumber; } @@ -432,7 +432,7 @@ contract VBep20DelegateScenario is VBep20Delegate { totalReserves = totalReserves_; } - function getBlockNumber() internal view override returns (uint) { + function getBlockNumber() internal view returns (uint) { ComptrollerScenario comptrollerScenario = ComptrollerScenario(address(comptroller)); return comptrollerScenario.blockNumber(); } @@ -444,7 +444,7 @@ contract VBep20DelegateScenarioExtra is VBep20DelegateScenario { } function itIsTheWay() public { - admin = payable(address(1)); // make a change to test effect + admin = address(1); // make a change to test effect } function babyYoda() public pure { diff --git a/contracts/test/VBep20MockDelegate.sol b/contracts/test/VBep20MockDelegate.sol index ebe5fe160..b3d80a085 100644 --- a/contracts/test/VBep20MockDelegate.sol +++ b/contracts/test/VBep20MockDelegate.sol @@ -1,6 +1,6 @@ pragma solidity 0.8.13; -import "../Tokens/VTokens/VToken.sol"; +import "../Tokens/V0.8.13/VTokens/VToken.sol"; /** * @title Venus's VBep20 Contract diff --git a/contracts/test/VRTConverterHarness.sol b/contracts/test/VRTConverterHarness.sol index c2d4c7b28..df974f8a9 100644 --- a/contracts/test/VRTConverterHarness.sol +++ b/contracts/test/VRTConverterHarness.sol @@ -1,10 +1,8 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; import "../../contracts/Tokens/VRT/VRTConverter.sol"; contract VRTConverterHarness is VRTConverter { - using SafeMath for uint256; - constructor() public VRTConverter() { admin = msg.sender; } diff --git a/contracts/test/VRTVaultHarness.sol b/contracts/test/VRTVaultHarness.sol index 4fed5e2e1..f2a2f9e5d 100644 --- a/contracts/test/VRTVaultHarness.sol +++ b/contracts/test/VRTVaultHarness.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; import "../../contracts/VRTVault/VRTVault.sol"; @@ -25,7 +25,7 @@ contract VRTVaultHarness is VRTVault { blockNumber = number; } - function getBlockNumber() public view override returns (uint256) { + function getBlockNumber() public view returns (uint256) { return blockNumber; } } diff --git a/contracts/test/XVSHarness.sol b/contracts/test/XVSHarness.sol index b36c1c9b5..d61df4df5 100644 --- a/contracts/test/XVSHarness.sol +++ b/contracts/test/XVSHarness.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; import "../Tokens/XVS/XVS.sol"; diff --git a/contracts/test/XVSVaultScenario.sol b/contracts/test/XVSVaultScenario.sol index 86a492ceb..0e93dc68b 100644 --- a/contracts/test/XVSVaultScenario.sol +++ b/contracts/test/XVSVaultScenario.sol @@ -1,11 +1,9 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; pragma experimental ABIEncoderV2; import "../XVSVault/XVSVault.sol"; contract XVSVaultScenario is XVSVault { - using SafeMath for uint256; - function pushOldWithdrawalRequest( UserInfo storage _user, WithdrawalRequest[] storage _requests, diff --git a/contracts/test/XVSVestingHarness.sol b/contracts/test/XVSVestingHarness.sol index 9351d8f9f..15f539278 100644 --- a/contracts/test/XVSVestingHarness.sol +++ b/contracts/test/XVSVestingHarness.sol @@ -1,10 +1,8 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; import "../../contracts/Tokens/XVS/XVSVesting.sol"; contract XVSVestingHarness is XVSVesting { - using SafeMath for uint256; - using SafeBEP20 for IBEP20; address public constant ZERO_ADDRESS = 0x0000000000000000000000000000000000000000; constructor() public XVSVesting() { From 955c73222b35e23ecf6ce019e12dd163680376f6 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Tue, 28 Mar 2023 18:03:51 +0530 Subject: [PATCH 049/153] Added contracts with updated solidity version. --- .../V0.8.13/InterestRateModel.sol | 34 + .../V0.8.13/JumpRateModel.sol | 110 ++ .../V0.8.13/WhitePaperInterestRateModel.sol | 90 + contracts/Oracle/V0.8.13/PriceOracle.sol | 16 + .../Oracle/V0.8.13/VenusChainlinkOracle.sol | 123 ++ contracts/Tokens/V0.8.13/BEP20Interface.sol | 92 + contracts/Tokens/V0.8.13/EIP20Interface.sol | 63 + .../V0.8.13/EIP20NonStandardInterface.sol | 68 + .../V0.8.13/VAI/VAIControllerInterface.sol | 27 + contracts/Tokens/V0.8.13/VTokens/VBep20.sol | 253 +++ .../Tokens/V0.8.13/VTokens/VBep20Delegate.sol | 43 + .../V0.8.13/VTokens/VBep20Delegator.sol | 528 ++++++ .../V0.8.13/VTokens/VBep20Immutable.sol | 49 + contracts/Tokens/V0.8.13/VTokens/VToken.sol | 1659 +++++++++++++++++ .../V0.8.13/VTokens/VTokenInterfaces.sol | 353 ++++ contracts/Utils/V0.8.13/Address.sol | 73 + contracts/Utils/V0.8.13/CarefulMath.sol | 84 + contracts/Utils/V0.8.13/Context.sol | 26 + contracts/Utils/V0.8.13/ECDSA.sol | 103 + contracts/Utils/V0.8.13/ErrorReporter.sol | 282 +++ contracts/Utils/V0.8.13/Exponential.sol | 181 ++ .../Utils/V0.8.13/ExponentialNoError.sol | 195 ++ contracts/Utils/V0.8.13/IBEP20.sol | 76 + contracts/Utils/V0.8.13/Ownable.sol | 74 + contracts/Utils/V0.8.13/Owned.sol | 21 + contracts/Utils/V0.8.13/SafeBEP20.sol | 80 + contracts/Utils/V0.8.13/SafeCast.sol | 207 ++ contracts/Utils/V0.8.13/SafeMath.sol | 163 ++ contracts/Utils/V0.8.13/Tokenlock.sol | 28 + 29 files changed, 5101 insertions(+) create mode 100644 contracts/InterestRateModels/V0.8.13/InterestRateModel.sol create mode 100644 contracts/InterestRateModels/V0.8.13/JumpRateModel.sol create mode 100644 contracts/InterestRateModels/V0.8.13/WhitePaperInterestRateModel.sol create mode 100644 contracts/Oracle/V0.8.13/PriceOracle.sol create mode 100644 contracts/Oracle/V0.8.13/VenusChainlinkOracle.sol create mode 100644 contracts/Tokens/V0.8.13/BEP20Interface.sol create mode 100644 contracts/Tokens/V0.8.13/EIP20Interface.sol create mode 100644 contracts/Tokens/V0.8.13/EIP20NonStandardInterface.sol create mode 100644 contracts/Tokens/V0.8.13/VAI/VAIControllerInterface.sol create mode 100644 contracts/Tokens/V0.8.13/VTokens/VBep20.sol create mode 100644 contracts/Tokens/V0.8.13/VTokens/VBep20Delegate.sol create mode 100644 contracts/Tokens/V0.8.13/VTokens/VBep20Delegator.sol create mode 100644 contracts/Tokens/V0.8.13/VTokens/VBep20Immutable.sol create mode 100644 contracts/Tokens/V0.8.13/VTokens/VToken.sol create mode 100644 contracts/Tokens/V0.8.13/VTokens/VTokenInterfaces.sol create mode 100644 contracts/Utils/V0.8.13/Address.sol create mode 100644 contracts/Utils/V0.8.13/CarefulMath.sol create mode 100644 contracts/Utils/V0.8.13/Context.sol create mode 100644 contracts/Utils/V0.8.13/ECDSA.sol create mode 100644 contracts/Utils/V0.8.13/ErrorReporter.sol create mode 100644 contracts/Utils/V0.8.13/Exponential.sol create mode 100644 contracts/Utils/V0.8.13/ExponentialNoError.sol create mode 100644 contracts/Utils/V0.8.13/IBEP20.sol create mode 100644 contracts/Utils/V0.8.13/Ownable.sol create mode 100644 contracts/Utils/V0.8.13/Owned.sol create mode 100644 contracts/Utils/V0.8.13/SafeBEP20.sol create mode 100644 contracts/Utils/V0.8.13/SafeCast.sol create mode 100644 contracts/Utils/V0.8.13/SafeMath.sol create mode 100644 contracts/Utils/V0.8.13/Tokenlock.sol diff --git a/contracts/InterestRateModels/V0.8.13/InterestRateModel.sol b/contracts/InterestRateModels/V0.8.13/InterestRateModel.sol new file mode 100644 index 000000000..3cd21808a --- /dev/null +++ b/contracts/InterestRateModels/V0.8.13/InterestRateModel.sol @@ -0,0 +1,34 @@ +pragma solidity 0.8.13; + +/** + * @title Venus's InterestRateModel Interface + * @author Venus + */ +abstract contract InterestRateModel { + /// @notice Indicator that this is an InterestRateModel contract (for inspection) + bool public constant isInterestRateModel = true; + + /** + * @notice Calculates the current borrow interest rate per block + * @param cash The total amount of cash the market has + * @param borrows The total amount of borrows the market has outstanding + * @param reserves The total amnount of reserves the market has + * @return The borrow rate per block (as a percentage, and scaled by 1e18) + */ + function getBorrowRate(uint cash, uint borrows, uint reserves) external view virtual returns (uint); + + /** + * @notice Calculates the current supply interest rate per block + * @param cash The total amount of cash the market has + * @param borrows The total amount of borrows the market has outstanding + * @param reserves The total amnount of reserves the market has + * @param reserveFactorMantissa The current reserve factor the market has + * @return The supply rate per block (as a percentage, and scaled by 1e18) + */ + function getSupplyRate( + uint cash, + uint borrows, + uint reserves, + uint reserveFactorMantissa + ) external view virtual returns (uint); +} diff --git a/contracts/InterestRateModels/V0.8.13/JumpRateModel.sol b/contracts/InterestRateModels/V0.8.13/JumpRateModel.sol new file mode 100644 index 000000000..71ba90949 --- /dev/null +++ b/contracts/InterestRateModels/V0.8.13/JumpRateModel.sol @@ -0,0 +1,110 @@ +pragma solidity 0.8.13; + +import "../../Utils/V0.8.13/SafeMath.sol"; +import "./InterestRateModel.sol"; + +/** + * @title Venus's JumpRateModel Contract + * @author Venus + */ +contract JumpRateModel is InterestRateModel { + using SafeMath for uint; + + event NewInterestParams(uint baseRatePerBlock, uint multiplierPerBlock, uint jumpMultiplierPerBlock, uint kink); + + /** + * @notice The approximate number of blocks per year that is assumed by the interest rate model + */ + uint public constant blocksPerYear = (60 * 60 * 24 * 365) / 3; // (assuming 3s blocks) + + /** + * @notice The multiplier of utilization rate that gives the slope of the interest rate + */ + uint public multiplierPerBlock; + + /** + * @notice The base interest rate which is the y-intercept when utilization rate is 0 + */ + uint public baseRatePerBlock; + + /** + * @notice The multiplierPerBlock after hitting a specified utilization point + */ + uint public jumpMultiplierPerBlock; + + /** + * @notice The utilization point at which the jump multiplier is applied + */ + uint public kink; + + /** + * @notice Construct an interest rate model + * @param baseRatePerYear The approximate target base APR, as a mantissa (scaled by 1e18) + * @param multiplierPerYear The rate of increase in interest rate wrt utilization (scaled by 1e18) + * @param jumpMultiplierPerYear The multiplierPerBlock after hitting a specified utilization point + * @param kink_ The utilization point at which the jump multiplier is applied + */ + constructor(uint baseRatePerYear, uint multiplierPerYear, uint jumpMultiplierPerYear, uint kink_) public { + baseRatePerBlock = baseRatePerYear.div(blocksPerYear); + multiplierPerBlock = multiplierPerYear.div(blocksPerYear); + jumpMultiplierPerBlock = jumpMultiplierPerYear.div(blocksPerYear); + kink = kink_; + + emit NewInterestParams(baseRatePerBlock, multiplierPerBlock, jumpMultiplierPerBlock, kink); + } + + /** + * @notice Calculates the utilization rate of the market: `borrows / (cash + borrows - reserves)` + * @param cash The amount of cash in the market + * @param borrows The amount of borrows in the market + * @param reserves The amount of reserves in the market (currently unused) + * @return The utilization rate as a mantissa between [0, 1e18] + */ + function utilizationRate(uint cash, uint borrows, uint reserves) public pure returns (uint) { + // Utilization rate is 0 when there are no borrows + if (borrows == 0) { + return 0; + } + + return borrows.mul(1e18).div(cash.add(borrows).sub(reserves)); + } + + /** + * @notice Calculates the current borrow rate per block, with the error code expected by the market + * @param cash The amount of cash in the market + * @param borrows The amount of borrows in the market + * @param reserves The amount of reserves in the market + * @return The borrow rate percentage per block as a mantissa (scaled by 1e18) + */ + function getBorrowRate(uint cash, uint borrows, uint reserves) public view override returns (uint) { + uint util = utilizationRate(cash, borrows, reserves); + + if (util <= kink) { + return util.mul(multiplierPerBlock).div(1e18).add(baseRatePerBlock); + } else { + uint normalRate = kink.mul(multiplierPerBlock).div(1e18).add(baseRatePerBlock); + uint excessUtil = util.sub(kink); + return excessUtil.mul(jumpMultiplierPerBlock).div(1e18).add(normalRate); + } + } + + /** + * @notice Calculates the current supply rate per block + * @param cash The amount of cash in the market + * @param borrows The amount of borrows in the market + * @param reserves The amount of reserves in the market + * @param reserveFactorMantissa The current reserve factor for the market + * @return The supply rate percentage per block as a mantissa (scaled by 1e18) + */ + function getSupplyRate( + uint cash, + uint borrows, + uint reserves, + uint reserveFactorMantissa + ) public view override returns (uint) { + uint oneMinusReserveFactor = uint(1e18).sub(reserveFactorMantissa); + uint borrowRate = getBorrowRate(cash, borrows, reserves); + uint rateToPool = borrowRate.mul(oneMinusReserveFactor).div(1e18); + return utilizationRate(cash, borrows, reserves).mul(rateToPool).div(1e18); + } +} diff --git a/contracts/InterestRateModels/V0.8.13/WhitePaperInterestRateModel.sol b/contracts/InterestRateModels/V0.8.13/WhitePaperInterestRateModel.sol new file mode 100644 index 000000000..2df4dc50a --- /dev/null +++ b/contracts/InterestRateModels/V0.8.13/WhitePaperInterestRateModel.sol @@ -0,0 +1,90 @@ +pragma solidity 0.8.13; + +import "../../Utils/V0.8.13/SafeMath.sol"; +import "./InterestRateModel.sol"; + +/** + * @title Venus's WhitePaperInterestRateModel Contract + * @author Venus + * @notice The parameterized model described in section 2.4 of the original Venus Protocol whitepaper + */ +contract WhitePaperInterestRateModel is InterestRateModel { + using SafeMath for uint; + + event NewInterestParams(uint baseRatePerBlock, uint multiplierPerBlock); + + /** + * @notice The approximate number of blocks per year that is assumed by the interest rate model + */ + uint public constant blocksPerYear = (60 * 60 * 24 * 365) / 3; // (assuming 3s blocks) + + /** + * @notice The multiplier of utilization rate that gives the slope of the interest rate + */ + uint public multiplierPerBlock; + + /** + * @notice The base interest rate which is the y-intercept when utilization rate is 0 + */ + uint public baseRatePerBlock; + + /** + * @notice Construct an interest rate model + * @param baseRatePerYear The approximate target base APR, as a mantissa (scaled by 1e18) + * @param multiplierPerYear The rate of increase in interest rate wrt utilization (scaled by 1e18) + */ + constructor(uint baseRatePerYear, uint multiplierPerYear) public { + baseRatePerBlock = baseRatePerYear.div(blocksPerYear); + multiplierPerBlock = multiplierPerYear.div(blocksPerYear); + + emit NewInterestParams(baseRatePerBlock, multiplierPerBlock); + } + + /** + * @notice Calculates the utilization rate of the market: `borrows / (cash + borrows - reserves)` + * @param cash The amount of cash in the market + * @param borrows The amount of borrows in the market + * @param reserves The amount of reserves in the market (currently unused) + * @return The utilization rate as a mantissa between [0, 1e18] + */ + function utilizationRate(uint cash, uint borrows, uint reserves) public pure returns (uint) { + // Utilization rate is 0 when there are no borrows + if (borrows == 0) { + return 0; + } + + return borrows.mul(1e18).div(cash.add(borrows).sub(reserves)); + } + + /** + * @notice Calculates the current borrow rate per block, with the error code expected by the market + * @param cash The amount of cash in the market + * @param borrows The amount of borrows in the market + * @param reserves The amount of reserves in the market + * @return The borrow rate percentage per block as a mantissa (scaled by 1e18) + */ + function getBorrowRate(uint cash, uint borrows, uint reserves) public view override returns (uint) { + uint ur = utilizationRate(cash, borrows, reserves); + return ur.mul(multiplierPerBlock).div(1e18).add(baseRatePerBlock); + } + + /** + * @notice Calculates the current supply rate per block + * @param cash The amount of cash in the market + * @param borrows The amount of borrows in the market + * @param reserves The amount of reserves in the market + * @param reserveFactorMantissa The current reserve factor for the market + * @return The supply rate percentage per block as a mantissa (scaled by 1e18) + */ + function getSupplyRate( + uint cash, + uint borrows, + uint reserves, + uint reserveFactorMantissa + ) public view override returns (uint) { + uint oneMinusReserveFactor = uint(1e18).sub(reserveFactorMantissa); + uint borrowRate = getBorrowRate(cash, borrows, reserves); + uint rateToPool = borrowRate.mul(oneMinusReserveFactor).div(1e18); + return utilizationRate(cash, borrows, reserves).mul(rateToPool).div(1e18); + } +} diff --git a/contracts/Oracle/V0.8.13/PriceOracle.sol b/contracts/Oracle/V0.8.13/PriceOracle.sol new file mode 100644 index 000000000..c4e66b532 --- /dev/null +++ b/contracts/Oracle/V0.8.13/PriceOracle.sol @@ -0,0 +1,16 @@ +pragma solidity ^0.8.13; + +import "../../Tokens/V0.8.13/VTokens/VToken.sol"; + +abstract contract PriceOracle { + /// @notice Indicator that this is a PriceOracle contract (for inspection) + bool public constant isPriceOracle = true; + + /** + * @notice Get the underlying price of a vToken asset + * @param vToken The vToken to get the underlying price of + * @return The underlying asset price mantissa (scaled by 1e18). + * Zero means the price is unavailable. + */ + function getUnderlyingPrice(VToken vToken) external view virtual returns (uint); +} diff --git a/contracts/Oracle/V0.8.13/VenusChainlinkOracle.sol b/contracts/Oracle/V0.8.13/VenusChainlinkOracle.sol new file mode 100644 index 000000000..46f1cb4e6 --- /dev/null +++ b/contracts/Oracle/V0.8.13/VenusChainlinkOracle.sol @@ -0,0 +1,123 @@ +pragma solidity 0.8.13; + +import "../../Tokens/V0.8.13/VTokens/VBep20.sol"; +import "../../Tokens/V0.8.13/BEP20Interface.sol"; +import "../../Utils/V0.8.13/SafeMath.sol"; +import "./PriceOracle.sol"; +import "../AggregatorV2V3Interface.sol"; + +contract VenusChainlinkOracle is PriceOracle { + using SafeMath for uint; + address public admin; + + uint public maxStalePeriod; + + mapping(address => uint) internal prices; + mapping(bytes32 => AggregatorV2V3Interface) internal feeds; + + event PricePosted(address asset, uint previousPriceMantissa, uint requestedPriceMantissa, uint newPriceMantissa); + event NewAdmin(address oldAdmin, address newAdmin); + event FeedSet(address feed, string symbol); + event MaxStalePeriodUpdated(uint oldMaxStalePeriod, uint newMaxStalePeriod); + + constructor(uint maxStalePeriod_) public { + admin = msg.sender; + maxStalePeriod = maxStalePeriod_; + } + + function setMaxStalePeriod(uint newMaxStalePeriod) external onlyAdmin { + require(newMaxStalePeriod > 0, "stale period can't be zero"); + uint oldMaxStalePeriod = maxStalePeriod; + maxStalePeriod = newMaxStalePeriod; + emit MaxStalePeriodUpdated(oldMaxStalePeriod, newMaxStalePeriod); + } + + function getUnderlyingPrice(VToken vToken) public view override returns (uint) { + string memory symbol = vToken.symbol(); + if (compareStrings(symbol, "vBNB")) { + return getChainlinkPrice(getFeed(symbol)); + } else if (compareStrings(symbol, "VAI")) { + return getChainlinkPrice(getFeed(symbol)); + } else if (compareStrings(symbol, "XVS")) { + return prices[address(vToken)]; + } else { + return getPrice(vToken); + } + } + + function getPrice(VToken vToken) internal view returns (uint price) { + BEP20Interface token = BEP20Interface(VBep20(address(vToken)).underlying()); + + if (prices[address(token)] != 0) { + price = prices[address(token)]; + } else { + price = getChainlinkPrice(getFeed(token.symbol())); + } + + uint decimalDelta = uint(18).sub(uint(token.decimals())); + // Ensure that we don't multiply the result by 0 + if (decimalDelta > 0) { + return price.mul(10 ** decimalDelta); + } else { + return price; + } + } + + function getChainlinkPrice(AggregatorV2V3Interface feed) internal view returns (uint) { + // Chainlink USD-denominated feeds store answers at 8 decimals + uint decimalDelta = uint(18).sub(feed.decimals()); + + (, int256 answer, , uint256 updatedAt, ) = feed.latestRoundData(); + // Ensure that we don't multiply the result by 0 + if (block.timestamp.sub(updatedAt) > maxStalePeriod) { + return 0; + } + + if (decimalDelta > 0) { + return uint(answer).mul(10 ** decimalDelta); + } else { + return uint(answer); + } + } + + function setUnderlyingPrice(VToken vToken, uint underlyingPriceMantissa) external onlyAdmin { + address asset = address(VBep20(address(vToken)).underlying()); + emit PricePosted(asset, prices[asset], underlyingPriceMantissa, underlyingPriceMantissa); + prices[asset] = underlyingPriceMantissa; + } + + function setDirectPrice(address asset, uint price) external onlyAdmin { + emit PricePosted(asset, prices[asset], price, price); + prices[asset] = price; + } + + function setFeed(string calldata symbol, address feed) external onlyAdmin { + require(feed != address(0) && feed != address(this), "invalid feed address"); + emit FeedSet(feed, symbol); + feeds[keccak256(abi.encodePacked(symbol))] = AggregatorV2V3Interface(feed); + } + + function getFeed(string memory symbol) public view returns (AggregatorV2V3Interface) { + return feeds[keccak256(abi.encodePacked(symbol))]; + } + + function assetPrices(address asset) external view returns (uint) { + return prices[asset]; + } + + function compareStrings(string memory a, string memory b) internal pure returns (bool) { + return (keccak256(abi.encodePacked((a))) == keccak256(abi.encodePacked((b)))); + } + + function setAdmin(address newAdmin) external onlyAdmin { + address oldAdmin = admin; + admin = newAdmin; + + emit NewAdmin(oldAdmin, newAdmin); + } + + modifier onlyAdmin() { + require(msg.sender == admin, "only admin may call"); + _; + } +} diff --git a/contracts/Tokens/V0.8.13/BEP20Interface.sol b/contracts/Tokens/V0.8.13/BEP20Interface.sol new file mode 100644 index 000000000..13a3e988e --- /dev/null +++ b/contracts/Tokens/V0.8.13/BEP20Interface.sol @@ -0,0 +1,92 @@ +pragma solidity 0.8.13; + +interface BEP20Interface { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the token decimals. + */ + function decimals() external view returns (uint8); + + /** + * @dev Returns the token symbol. + */ + function symbol() external view returns (string memory); + + /** + * @dev Returns the token name. + */ + function name() external view returns (string memory); + + /** + * @dev Returns the bep token owner. + */ + function getOwner() external view returns (address); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address _owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} diff --git a/contracts/Tokens/V0.8.13/EIP20Interface.sol b/contracts/Tokens/V0.8.13/EIP20Interface.sol new file mode 100644 index 000000000..27d5a8e91 --- /dev/null +++ b/contracts/Tokens/V0.8.13/EIP20Interface.sol @@ -0,0 +1,63 @@ +pragma solidity 0.8.13; + +/** + * @title BEP 20 Token Standard Interface + * https://eips.ethereum.org/EIPS/eip-20 + */ +interface EIP20Interface { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function decimals() external view returns (uint8); + + /** + * @notice Get the total number of tokens in circulation + * @return The supply of tokens + */ + function totalSupply() external view returns (uint256); + + /** + * @notice Gets the balance of the specified address + * @param owner The address from which the balance will be retrieved + * @return balance + */ + function balanceOf(address owner) external view returns (uint256 balance); + + /** + * @notice Transfer `amount` tokens from `msg.sender` to `dst` + * @param dst The address of the destination account + * @param amount The number of tokens to transfer + * @return success whether or not the transfer succeeded + */ + function transfer(address dst, uint256 amount) external returns (bool success); + + /** + * @notice Transfer `amount` tokens from `src` to `dst` + * @param src The address of the source account + * @param dst The address of the destination account + * @param amount The number of tokens to transfer + * @return success whether or not the transfer succeeded + */ + function transferFrom(address src, address dst, uint256 amount) external returns (bool success); + + /** + * @notice Approve `spender` to transfer up to `amount` from `src` + * @dev This will overwrite the approval amount for `spender` + * @param spender The address of the account which may transfer tokens + * @param amount The number of tokens that are approved (-1 means infinite) + * @return success whether or not the approval succeeded + */ + function approve(address spender, uint256 amount) external returns (bool success); + + /** + * @notice Get the current allowance from `owner` for `spender` + * @param owner The address of the account which owns the tokens to be spent + * @param spender The address of the account which may transfer tokens + * @return remaining The number of tokens allowed to be spent + */ + function allowance(address owner, address spender) external view returns (uint256 remaining); + + event Transfer(address indexed from, address indexed to, uint256 amount); + event Approval(address indexed owner, address indexed spender, uint256 amount); +} diff --git a/contracts/Tokens/V0.8.13/EIP20NonStandardInterface.sol b/contracts/Tokens/V0.8.13/EIP20NonStandardInterface.sol new file mode 100644 index 000000000..0df30bc79 --- /dev/null +++ b/contracts/Tokens/V0.8.13/EIP20NonStandardInterface.sol @@ -0,0 +1,68 @@ +pragma solidity 0.8.13; + +/** + * @title EIP20NonStandardInterface + * @dev Version of BEP20 with no return values for `transfer` and `transferFrom` + * See https://medium.com/coinmonks/missing-return-value-bug-at-least-130-tokens-affected-d67bf08521ca + */ +interface EIP20NonStandardInterface { + /** + * @notice Get the total number of tokens in circulation + * @return The supply of tokens + */ + function totalSupply() external view returns (uint256); + + /** + * @notice Gets the balance of the specified address + * @param owner The address from which the balance will be retrieved + * @return balance of the owner + */ + function balanceOf(address owner) external view returns (uint256 balance); + + /// + /// !!!!!!!!!!!!!! + /// !!! NOTICE !!! `transfer` does not return a value, in violation of the BEP-20 specification + /// !!!!!!!!!!!!!! + /// + + /** + * @notice Transfer `amount` tokens from `msg.sender` to `dst` + * @param dst The address of the destination account + * @param amount The number of tokens to transfer + */ + function transfer(address dst, uint256 amount) external; + + /// + /// !!!!!!!!!!!!!! + /// !!! NOTICE !!! `transferFrom` does not return a value, in violation of the BEP-20 specification + /// !!!!!!!!!!!!!! + /// + + /** + * @notice Transfer `amount` tokens from `src` to `dst` + * @param src The address of the source account + * @param dst The address of the destination account + * @param amount The number of tokens to transfer + */ + function transferFrom(address src, address dst, uint256 amount) external; + + /** + * @notice Approve `spender` to transfer up to `amount` from `src` + * @dev This will overwrite the approval amount for `spender` + * @param spender The address of the account which may transfer tokens + * @param amount The number of tokens that are approved + * @return success Whether or not the approval succeeded + */ + function approve(address spender, uint256 amount) external returns (bool success); + + /** + * @notice Get the current allowance from `owner` for `spender` + * @param owner The address of the account which owns the tokens to be spent + * @param spender The address of the account which may transfer tokens + * @return remaining The number of tokens allowed to be spent + */ + function allowance(address owner, address spender) external view returns (uint256 remaining); + + event Transfer(address indexed from, address indexed to, uint256 amount); + event Approval(address indexed owner, address indexed spender, uint256 amount); +} diff --git a/contracts/Tokens/V0.8.13/VAI/VAIControllerInterface.sol b/contracts/Tokens/V0.8.13/VAI/VAIControllerInterface.sol new file mode 100644 index 000000000..a993e6167 --- /dev/null +++ b/contracts/Tokens/V0.8.13/VAI/VAIControllerInterface.sol @@ -0,0 +1,27 @@ +pragma solidity 0.8.13; + +import "../VTokens/VToken.sol"; + +abstract contract VAIControllerInterface { + function getVAIAddress() public view virtual returns (address); + + function getMintableVAI(address minter) public view virtual returns (uint, uint); + + function mintVAI(address minter, uint mintVAIAmount) external virtual returns (uint); + + function repayVAI(address repayer, uint repayVAIAmount) external virtual returns (uint); + + function liquidateVAI( + address borrower, + uint repayAmount, + VTokenInterface vTokenCollateral + ) external virtual returns (uint, uint); + + function _initializeVenusVAIState(uint blockNumber) external virtual returns (uint); + + function updateVenusVAIMintIndex() external virtual returns (uint); + + function calcDistributeVAIMinterVenus(address vaiMinter) external virtual returns (uint, uint, uint, uint); + + function getVAIRepayAmount(address account) public view virtual returns (uint); +} diff --git a/contracts/Tokens/V0.8.13/VTokens/VBep20.sol b/contracts/Tokens/V0.8.13/VTokens/VBep20.sol new file mode 100644 index 000000000..5e921e79a --- /dev/null +++ b/contracts/Tokens/V0.8.13/VTokens/VBep20.sol @@ -0,0 +1,253 @@ +pragma solidity 0.8.13; + +import "./VToken.sol"; + +/** + * @title Venus's VBep20 Contract + * @notice vTokens which wrap an EIP-20 underlying + * @author Venus + */ +contract VBep20 is VToken, VBep20Interface { + /*** User Interface ***/ + + /** + * @notice Sender supplies assets into the market and receives vTokens in exchange + * @dev Accrues interest whether or not the operation succeeds, unless reverted + * @param mintAmount The amount of the underlying asset to supply + * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). + */ + // @custom:event Emits Transfer event + // @custom:event Emits Mint event + function mint(uint mintAmount) external override returns (uint) { + (uint err, ) = mintInternal(mintAmount); + return err; + } + + /** + * @notice Sender supplies assets into the market and receiver receives vTokens in exchange + * @dev Accrues interest whether or not the operation succeeds, unless reverted + * @param receiver The account which is receiving the vTokens + * @param mintAmount The amount of the underlying asset to supply + * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). + */ + // @custom:event Emits Transfer event + // @custom:event Emits MintBehalf event + function mintBehalf(address receiver, uint mintAmount) external override returns (uint) { + (uint err, ) = mintBehalfInternal(receiver, mintAmount); + return err; + } + + /** + * @notice Sender redeems vTokens in exchange for the underlying asset + * @dev Accrues interest whether or not the operation succeeds, unless reverted + * @param redeemTokens The number of vTokens to redeem into underlying + * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). + */ + // @custom:event Emits Redeem event on success + // @custom:event Emits Transfer event on success + // @custom:event Emits RedeemFee when fee is charged by the treasury + function redeem(uint redeemTokens) external override returns (uint) { + return redeemInternal(redeemTokens); + } + + /** + * @notice Sender redeems vTokens in exchange for a specified amount of underlying asset + * @dev Accrues interest whether or not the operation succeeds, unless reverted + * @param redeemAmount The amount of underlying to redeem + * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). + */ + // @custom:event Emits Redeem event on success + // @custom:event Emits Transfer event on success + // @custom:event Emits RedeemFee when fee is charged by the treasury + function redeemUnderlying(uint redeemAmount) external override returns (uint) { + return redeemUnderlyingInternal(redeemAmount); + } + + /** + * @notice Sender borrows assets from the protocol to their own address + * @param borrowAmount The amount of the underlying asset to borrow + * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). + */ + // @custom:event Emits Borrow event on success + function borrow(uint borrowAmount) external override returns (uint) { + address borrower = msg.sender; + address payable receiver = payable(msg.sender); + return borrowInternal(borrower, receiver, borrowAmount); + } + + /** + * @notice Sender borrows assets on behalf of some other address. This function is only available + * for senders, explicitly marked as delegates of the borrower using `comptroller.updateDelegate` + * @param borrower The borrower, on behalf of whom to borrow. + * @param borrowAmount The amount of the underlying asset to borrow + * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). + */ + // @custom:event Emits Borrow event on success + function borrowBehalf(address borrower, uint borrowAmount) external returns (uint) { + require(comptroller.approvedDelegates(borrower, msg.sender), "not an approved delegate"); + address payable receiver = payable(msg.sender); + return borrowInternal(borrower, receiver, borrowAmount); + } + + /** + * @notice Sender repays their own borrow + * @param repayAmount The amount to repay + * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). + */ + // @custom:event Emits RepayBorrow event on success + function repayBorrow(uint repayAmount) external override returns (uint) { + (uint err, ) = repayBorrowInternal(repayAmount); + return err; + } + + /** + * @notice Sender repays a borrow belonging to another borrowing account + * @param borrower The account with the debt being payed off + * @param repayAmount The amount to repay + * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). + */ + // @custom:event Emits RepayBorrow event on success + function repayBorrowBehalf(address borrower, uint repayAmount) external override returns (uint) { + (uint err, ) = repayBorrowBehalfInternal(borrower, repayAmount); + return err; + } + + /** + * @notice The sender liquidates the borrowers collateral. + * The collateral seized is transferred to the liquidator. + * @param borrower The borrower of this vToken to be liquidated + * @param repayAmount The amount of the underlying borrowed asset to repay + * @param vTokenCollateral The market in which to seize collateral from the borrower + * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). + */ + // @custom:event Emit LiquidateBorrow event on success + function liquidateBorrow( + address borrower, + uint repayAmount, + VTokenInterface vTokenCollateral + ) external override returns (uint) { + (uint err, ) = liquidateBorrowInternal(borrower, repayAmount, vTokenCollateral); + return err; + } + + /** + * @notice The sender adds to reserves. + * @param addAmount The amount of underlying tokens to add as reserves + * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). + */ + // @custom:event Emits ReservesAdded event + function _addReserves(uint addAmount) external override returns (uint) { + return _addReservesInternal(addAmount); + } + + /** + * @notice Initialize the new money market + * @param underlying_ The address of the underlying asset + * @param comptroller_ The address of the Comptroller + * @param interestRateModel_ The address of the interest rate model + * @param initialExchangeRateMantissa_ The initial exchange rate, scaled by 1e18 + * @param name_ BEP-20 name of this token + * @param symbol_ BEP-20 symbol of this token + * @param decimals_ BEP-20 decimal precision of this token + */ + function initialize( + address underlying_, + ComptrollerInterface comptroller_, + InterestRateModel interestRateModel_, + uint initialExchangeRateMantissa_, + string memory name_, + string memory symbol_, + uint8 decimals_ + ) public { + // VToken initialize does the bulk of the work + super.initialize(comptroller_, interestRateModel_, initialExchangeRateMantissa_, name_, symbol_, decimals_); + + // Set underlying and sanity check it + underlying = underlying_; + EIP20Interface(underlying).totalSupply(); + } + + /*** Safe Token ***/ + + /** + * @dev Similar to EIP20 transfer, except it handles a False result from `transferFrom` and reverts in that case. + * This will revert due to insufficient balance or insufficient allowance. + * This function returns the actual amount received, + * which may be less than `amount` if there is a fee attached to the transfer. + * + * Note: This wrapper safely handles non-standard BEP-20 tokens that do not return a value. + * See here: https://medium.com/coinmonks/missing-return-value-bug-at-least-130-tokens-affected-d67bf08521ca + */ + function doTransferIn(address from, uint amount) internal override returns (uint) { + EIP20NonStandardInterface token = EIP20NonStandardInterface(underlying); + uint balanceBefore = EIP20Interface(underlying).balanceOf(address(this)); + token.transferFrom(from, address(this), amount); + + bool success; + assembly { + switch returndatasize() + case 0 { + // This is a non-standard BEP-20 + success := not(0) // set success to true + } + case 32 { + // This is a compliant BEP-20 + returndatacopy(0, 0, 32) + success := mload(0) // Set `success = returndata` of external call + } + default { + // This is an excessively non-compliant BEP-20, revert. + revert(0, 0) + } + } + require(success, "TOKEN_TRANSFER_IN_FAILED"); + + // Calculate the amount that was *actually* transferred + uint balanceAfter = EIP20Interface(underlying).balanceOf(address(this)); + require(balanceAfter >= balanceBefore, "TOKEN_TRANSFER_IN_OVERFLOW"); + return balanceAfter - balanceBefore; // underflow already checked above, just subtract + } + + /** + * @dev Similar to EIP20 transfer, except it handles a False success from `transfer` and returns an explanatory + * error code rather than reverting. If caller has not called checked protocol's balance, this may revert due to + * insufficient cash held in this contract. If caller has checked protocol's balance prior to this call, and verified + * it is >= amount, this should not revert in normal conditions. + * + * Note: This wrapper safely handles non-standard BEP-20 tokens that do not return a value. + * See here: https://medium.com/coinmonks/missing-return-value-bug-at-least-130-tokens-affected-d67bf08521ca + */ + function doTransferOut(address payable to, uint amount) internal virtual override { + EIP20NonStandardInterface token = EIP20NonStandardInterface(underlying); + token.transfer(to, amount); + + bool success; + assembly { + switch returndatasize() + case 0 { + // This is a non-standard BEP-20 + success := not(0) // set success to true + } + case 32 { + // This is a complaint BEP-20 + returndatacopy(0, 0, 32) + success := mload(0) // Set `success = returndata` of external call + } + default { + // This is an excessively non-compliant BEP-20, revert. + revert(0, 0) + } + } + require(success, "TOKEN_TRANSFER_OUT_FAILED"); + } + + /** + * @notice Gets balance of this contract in terms of the underlying + * @dev This excludes the value of the current message, if any + * @return The quantity of underlying tokens owned by this contract + */ + function getCashPrior() internal view override returns (uint) { + EIP20Interface token = EIP20Interface(underlying); + return token.balanceOf(address(this)); + } +} diff --git a/contracts/Tokens/V0.8.13/VTokens/VBep20Delegate.sol b/contracts/Tokens/V0.8.13/VTokens/VBep20Delegate.sol new file mode 100644 index 000000000..ce2ff916d --- /dev/null +++ b/contracts/Tokens/V0.8.13/VTokens/VBep20Delegate.sol @@ -0,0 +1,43 @@ +pragma solidity 0.8.13; + +import "./VBep20.sol"; + +/** + * @title Venus's VBep20Delegate Contract + * @notice VTokens which wrap an EIP-20 underlying and are delegated to + * @author Venus + */ +contract VBep20Delegate is VBep20, VDelegateInterface { + /** + * @notice Construct an empty delegate + */ + constructor() public {} + + /** + * @notice Called by the delegator on a delegate to initialize it for duty + * @param data The encoded bytes data for any initialization + */ + function _becomeImplementation(bytes memory data) public override { + // Shh -- currently unused + data; + + // Shh -- we don't ever want this hook to be marked pure + if (false) { + implementation = address(0); + } + + require(msg.sender == admin, "only the admin may call _becomeImplementation"); + } + + /** + * @notice Called by the delegator on a delegate to forfeit its responsibility + */ + function _resignImplementation() public override { + // Shh -- we don't ever want this hook to be marked pure + if (false) { + implementation = address(0); + } + + require(msg.sender == admin, "only the admin may call _resignImplementation"); + } +} diff --git a/contracts/Tokens/V0.8.13/VTokens/VBep20Delegator.sol b/contracts/Tokens/V0.8.13/VTokens/VBep20Delegator.sol new file mode 100644 index 000000000..61865075c --- /dev/null +++ b/contracts/Tokens/V0.8.13/VTokens/VBep20Delegator.sol @@ -0,0 +1,528 @@ +pragma solidity 0.8.13; + +import "./VTokenInterfaces.sol"; + +/** + * @title Venus's VBep20Delegator Contract + * @notice vTokens which wrap an EIP-20 underlying and delegate to an implementation + * @author Venus + */ +contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterface { + /** + * @notice Construct a new money market + * @param underlying_ The address of the underlying asset + * @param comptroller_ The address of the comptroller + * @param interestRateModel_ The address of the interest rate model + * @param initialExchangeRateMantissa_ The initial exchange rate, scaled by 1e18 + * @param name_ BEP-20 name of this token + * @param symbol_ BEP-20 symbol of this token + * @param decimals_ BEP-20 decimal precision of this token + * @param admin_ Address of the administrator of this token + * @param implementation_ The address of the implementation the contract delegates to + * @param becomeImplementationData The encoded args for becomeImplementation + */ + constructor( + address underlying_, + ComptrollerInterface comptroller_, + InterestRateModel interestRateModel_, + uint initialExchangeRateMantissa_, + string memory name_, + string memory symbol_, + uint8 decimals_, + address payable admin_, + address implementation_, + bytes memory becomeImplementationData + ) public { + // Creator of the contract is admin during initialization + admin = payable(msg.sender); + + // First delegate gets to initialize the delegator (i.e. storage contract) + delegateTo( + implementation_, + abi.encodeWithSignature( + "initialize(address,address,address,uint256,string,string,uint8)", + underlying_, + comptroller_, + interestRateModel_, + initialExchangeRateMantissa_, + name_, + symbol_, + decimals_ + ) + ); + + // New implementations always get set via the settor (post-initialize) + _setImplementation(implementation_, false, becomeImplementationData); + + // Set the proper admin now that initialization is done + admin = admin_; + } + + /** + * @notice Delegates execution to an implementation contract + * @dev It returns to the external caller whatever the implementation returns or forwards reverts + */ + fallback() external payable { + require(msg.value == 0, "VBep20Delegator:fallback: cannot send value to fallback"); + + // delegate all other functions to current implementation + (bool success, ) = implementation.delegatecall(msg.data); + + assembly { + let free_mem_ptr := mload(0x40) + returndatacopy(free_mem_ptr, 0, returndatasize()) + + switch success + case 0 { + revert(free_mem_ptr, returndatasize()) + } + default { + return(free_mem_ptr, returndatasize()) + } + } + } + + /** + * @notice Sender supplies assets into the market and receives vTokens in exchange + * @dev Accrues interest whether or not the operation succeeds, unless reverted + * @param mintAmount The amount of the underlying asset to supply + * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). + */ + function mint(uint mintAmount) external override returns (uint) { + bytes memory data = delegateToImplementation(abi.encodeWithSignature("mint(uint256)", mintAmount)); + return abi.decode(data, (uint)); + } + + /** + * @notice Sender supplies assets into the market and receiver receives vTokens in exchange + * @dev Accrues interest whether or not the operation succeeds, unless reverted + * @param mintAmount The amount of the underlying asset to supply + * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). + */ + function mintBehalf(address receiver, uint mintAmount) external override returns (uint) { + bytes memory data = delegateToImplementation( + abi.encodeWithSignature("mintBehalf(address,uint256)", receiver, mintAmount) + ); + return abi.decode(data, (uint)); + } + + /** + * @notice Sender redeems vTokens in exchange for the underlying asset + * @dev Accrues interest whether or not the operation succeeds, unless reverted + * @param redeemTokens The number of vTokens to redeem into underlying asset + * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). + */ + function redeem(uint redeemTokens) external override returns (uint) { + bytes memory data = delegateToImplementation(abi.encodeWithSignature("redeem(uint256)", redeemTokens)); + return abi.decode(data, (uint)); + } + + /** + * @notice Sender redeems vTokens in exchange for a specified amount of underlying asset + * @dev Accrues interest whether or not the operation succeeds, unless reverted + * @param redeemAmount The amount of underlying to redeem + * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). + */ + function redeemUnderlying(uint redeemAmount) external override returns (uint) { + bytes memory data = delegateToImplementation( + abi.encodeWithSignature("redeemUnderlying(uint256)", redeemAmount) + ); + return abi.decode(data, (uint)); + } + + /** + * @notice Sender borrows assets from the protocol to their own address + * @param borrowAmount The amount of the underlying asset to borrow + * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). + */ + function borrow(uint borrowAmount) external override returns (uint) { + bytes memory data = delegateToImplementation(abi.encodeWithSignature("borrow(uint256)", borrowAmount)); + return abi.decode(data, (uint)); + } + + /** + * @notice Sender repays their own borrow + * @param repayAmount The amount to repay + * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). + */ + function repayBorrow(uint repayAmount) external override returns (uint) { + bytes memory data = delegateToImplementation(abi.encodeWithSignature("repayBorrow(uint256)", repayAmount)); + return abi.decode(data, (uint)); + } + + /** + * @notice Sender repays a borrow belonging to another borrower + * @param borrower The account with the debt being payed off + * @param repayAmount The amount to repay + * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). + */ + function repayBorrowBehalf(address borrower, uint repayAmount) external override returns (uint) { + bytes memory data = delegateToImplementation( + abi.encodeWithSignature("repayBorrowBehalf(address,uint256)", borrower, repayAmount) + ); + return abi.decode(data, (uint)); + } + + /** + * @notice The sender liquidates the borrowers collateral. + * The collateral seized is transferred to the liquidator. + * @param borrower The borrower of this vToken to be liquidated + * @param vTokenCollateral The market in which to seize collateral from the borrower + * @param repayAmount The amount of the underlying borrowed asset to repay + * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). + */ + function liquidateBorrow( + address borrower, + uint repayAmount, + VTokenInterface vTokenCollateral + ) external override returns (uint) { + bytes memory data = delegateToImplementation( + abi.encodeWithSignature("liquidateBorrow(address,uint256,address)", borrower, repayAmount, vTokenCollateral) + ); + return abi.decode(data, (uint)); + } + + /** + * @notice Transfer `amount` tokens from `msg.sender` to `dst` + * @param dst The address of the destination account + * @param amount The number of tokens to transfer + * @return Whether or not the transfer succeeded + */ + function transfer(address dst, uint amount) external override returns (bool) { + bytes memory data = delegateToImplementation(abi.encodeWithSignature("transfer(address,uint256)", dst, amount)); + return abi.decode(data, (bool)); + } + + /** + * @notice Transfer `amount` tokens from `src` to `dst` + * @param src The address of the source account + * @param dst The address of the destination account + * @param amount The number of tokens to transfer + * @return Whether or not the transfer succeeded + */ + function transferFrom(address src, address dst, uint256 amount) external override returns (bool) { + bytes memory data = delegateToImplementation( + abi.encodeWithSignature("transferFrom(address,address,uint256)", src, dst, amount) + ); + return abi.decode(data, (bool)); + } + + /** + * @notice Approve `spender` to transfer up to `amount` from `src` + * @dev This will overwrite the approval amount for `spender` + * and is subject to issues noted [here](https://eips.ethereum.org/EIPS/eip-20#approve) + * @param spender The address of the account which may transfer tokens + * @param amount The number of tokens that are approved (-1 means infinite) + * @return Whether or not the approval succeeded + */ + function approve(address spender, uint256 amount) external override returns (bool) { + bytes memory data = delegateToImplementation( + abi.encodeWithSignature("approve(address,uint256)", spender, amount) + ); + return abi.decode(data, (bool)); + } + + /** + * @notice Get the underlying balance of the `owner` + * @dev This also accrues interest in a transaction + * @param owner The address of the account to query + * @return The amount of underlying owned by `owner` + */ + function balanceOfUnderlying(address owner) external override returns (uint) { + bytes memory data = delegateToImplementation(abi.encodeWithSignature("balanceOfUnderlying(address)", owner)); + return abi.decode(data, (uint)); + } + + /** + * @notice Returns the current total borrows plus accrued interest + * @return The total borrows with interest + */ + function totalBorrowsCurrent() external override returns (uint) { + bytes memory data = delegateToImplementation(abi.encodeWithSignature("totalBorrowsCurrent()")); + return abi.decode(data, (uint)); + } + + /** + * @notice Accrue interest to updated borrowIndex and then calculate account's borrow balance using the updated borrowIndex + * @param account The address whose balance should be calculated after updating borrowIndex + * @return The calculated balance + */ + function borrowBalanceCurrent(address account) external override returns (uint) { + bytes memory data = delegateToImplementation(abi.encodeWithSignature("borrowBalanceCurrent(address)", account)); + return abi.decode(data, (uint)); + } + + /** + * @notice Transfers collateral tokens (this market) to the liquidator. + * @dev Will fail unless called by another vToken during the process of liquidation. + * It's absolutely critical to use msg.sender as the borrowed vToken and not a parameter. + * @param liquidator The account receiving seized collateral + * @param borrower The account having collateral seized + * @param seizeTokens The number of vTokens to seize + * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). + */ + function seize(address liquidator, address borrower, uint seizeTokens) external override returns (uint) { + bytes memory data = delegateToImplementation( + abi.encodeWithSignature("seize(address,address,uint256)", liquidator, borrower, seizeTokens) + ); + return abi.decode(data, (uint)); + } + + /*** Admin Functions ***/ + + /** + * @notice Begins transfer of admin rights. The newPendingAdmin must call `_acceptAdmin` to finalize the transfer. + * @dev Admin function to begin change of admin. The newPendingAdmin must call `_acceptAdmin` to finalize the transfer. + * @param newPendingAdmin New pending admin. + * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). + */ + function _setPendingAdmin(address payable newPendingAdmin) external override returns (uint) { + bytes memory data = delegateToImplementation( + abi.encodeWithSignature("_setPendingAdmin(address)", newPendingAdmin) + ); + return abi.decode(data, (uint)); + } + + /** + * @notice Accrues interest and sets a new reserve factor for the protocol using _setReserveFactorFresh + * @dev Admin function to accrue interest and set a new reserve factor + * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). + */ + function _setReserveFactor(uint newReserveFactorMantissa) external override returns (uint) { + bytes memory data = delegateToImplementation( + abi.encodeWithSignature("_setReserveFactor(uint256)", newReserveFactorMantissa) + ); + return abi.decode(data, (uint)); + } + + /** + * @notice Accepts transfer of admin rights. `msg.sender` must be pendingAdmin + * @dev Admin function for pending admin to accept role and update admin + * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). + */ + function _acceptAdmin() external override returns (uint) { + bytes memory data = delegateToImplementation(abi.encodeWithSignature("_acceptAdmin()")); + return abi.decode(data, (uint)); + } + + /** + * @notice Accrues interest and adds reserves by transferring from admin + * @param addAmount Amount of reserves to add + * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). + */ + function _addReserves(uint addAmount) external override returns (uint) { + bytes memory data = delegateToImplementation(abi.encodeWithSignature("_addReserves(uint256)", addAmount)); + return abi.decode(data, (uint)); + } + + /** + * @notice Accrues interest and reduces reserves by transferring to admin + * @param reduceAmount Amount of reduction to reserves + * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). + */ + function _reduceReserves(uint reduceAmount) external override returns (uint) { + bytes memory data = delegateToImplementation(abi.encodeWithSignature("_reduceReserves(uint256)", reduceAmount)); + return abi.decode(data, (uint)); + } + + /** + * @notice Get cash balance of this vToken in the underlying asset + * @return The quantity of underlying asset owned by this contract + */ + function getCash() external view override returns (uint) { + bytes memory data = delegateToViewImplementation(abi.encodeWithSignature("getCash()")); + return abi.decode(data, (uint)); + } + + /** + * @notice Get the current allowance from `owner` for `spender` + * @param owner The address of the account which owns the tokens to be spent + * @param spender The address of the account which may transfer tokens + * @return The number of tokens allowed to be spent (-1 means infinite) + */ + function allowance(address owner, address spender) external view override returns (uint) { + bytes memory data = delegateToViewImplementation( + abi.encodeWithSignature("allowance(address,address)", owner, spender) + ); + return abi.decode(data, (uint)); + } + + /** + * @notice Get the token balance of the `owner` + * @param owner The address of the account to query + * @return The number of tokens owned by `owner` + */ + function balanceOf(address owner) external view override returns (uint) { + bytes memory data = delegateToViewImplementation(abi.encodeWithSignature("balanceOf(address)", owner)); + return abi.decode(data, (uint)); + } + + /** + * @notice Get a snapshot of the account's balances and the cached exchange rate + * @dev This is used by comptroller to more efficiently perform liquidity checks. + * @param account Address of the account to snapshot + * @return (possible error, token balance, borrow balance, exchange rate mantissa) + */ + function getAccountSnapshot(address account) external view override returns (uint, uint, uint, uint) { + bytes memory data = delegateToViewImplementation( + abi.encodeWithSignature("getAccountSnapshot(address)", account) + ); + return abi.decode(data, (uint, uint, uint, uint)); + } + + /** + * @notice Returns the current per-block borrow interest rate for this vToken + * @return The borrow interest rate per block, scaled by 1e18 + */ + function borrowRatePerBlock() external view override returns (uint) { + bytes memory data = delegateToViewImplementation(abi.encodeWithSignature("borrowRatePerBlock()")); + return abi.decode(data, (uint)); + } + + /** + * @notice Returns the current per-block supply interest rate for this vToken + * @return The supply interest rate per block, scaled by 1e18 + */ + function supplyRatePerBlock() external view override returns (uint) { + bytes memory data = delegateToViewImplementation(abi.encodeWithSignature("supplyRatePerBlock()")); + return abi.decode(data, (uint)); + } + + /** + * @notice Called by the admin to update the implementation of the delegator + * @param implementation_ The address of the new implementation for delegation + * @param allowResign Flag to indicate whether to call _resignImplementation on the old implementation + * @param becomeImplementationData The encoded bytes data to be passed to _becomeImplementation + */ + // @custom:access Only callable by admin + function _setImplementation( + address implementation_, + bool allowResign, + bytes memory becomeImplementationData + ) public override { + require(msg.sender == admin, "VBep20Delegator::_setImplementation: Caller must be admin"); + + if (allowResign) { + delegateToImplementation(abi.encodeWithSignature("_resignImplementation()")); + } + + address oldImplementation = implementation; + implementation = implementation_; + + delegateToImplementation(abi.encodeWithSignature("_becomeImplementation(bytes)", becomeImplementationData)); + + emit NewImplementation(oldImplementation, implementation); + } + + /** + * @notice Accrue interest then return the up-to-date exchange rate + * @return Calculated exchange rate scaled by 1e18 + */ + function exchangeRateCurrent() public override returns (uint) { + bytes memory data = delegateToImplementation(abi.encodeWithSignature("exchangeRateCurrent()")); + return abi.decode(data, (uint)); + } + + /** + * @notice Applies accrued interest to total borrows and reserves. + * @dev This calculates interest accrued from the last checkpointed block + * up to the current block and writes new checkpoint to storage. + */ + function accrueInterest() public override returns (uint) { + bytes memory data = delegateToImplementation(abi.encodeWithSignature("accrueInterest()")); + return abi.decode(data, (uint)); + } + + /** + * @notice Sets a new comptroller for the market + * @dev Admin function to set a new comptroller + * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). + */ + function _setComptroller(ComptrollerInterface newComptroller) public override returns (uint) { + bytes memory data = delegateToImplementation( + abi.encodeWithSignature("_setComptroller(address)", newComptroller) + ); + return abi.decode(data, (uint)); + } + + /** + * @notice Accrues interest and updates the interest rate model using `_setInterestRateModelFresh` + * @dev Admin function to accrue interest and update the interest rate model + * @param newInterestRateModel The new interest rate model to use + * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). + */ + function _setInterestRateModel(InterestRateModel newInterestRateModel) public override returns (uint) { + bytes memory data = delegateToImplementation( + abi.encodeWithSignature("_setInterestRateModel(address)", newInterestRateModel) + ); + return abi.decode(data, (uint)); + } + + /** + * @notice Delegates execution to the implementation contract + * @dev It returns to the external caller whatever the implementation returns or forwards reverts + * @param data The raw data to delegatecall + * @return The returned bytes from the delegatecall + */ + function delegateToImplementation(bytes memory data) public returns (bytes memory) { + return delegateTo(implementation, data); + } + + /** + * @notice Delegates execution to an implementation contract + * @dev It returns to the external caller whatever the implementation returns or forwards reverts + * There are an additional 2 prefix uints from the wrapper returndata, which we ignore since we make an extra hop. + * @param data The raw data to delegatecall + * @return The returned bytes from the delegatecall + */ + function delegateToViewImplementation(bytes memory data) public view returns (bytes memory) { + (bool success, bytes memory returnData) = address(this).staticcall( + abi.encodeWithSignature("delegateToImplementation(bytes)", data) + ); + assembly { + if eq(success, 0) { + revert(add(returnData, 0x20), returndatasize()) + } + } + return abi.decode(returnData, (bytes)); + } + + /** + * @notice Return the borrow balance of account based on stored data + * @param account The address whose balance should be calculated + * @return The calculated balance + */ + function borrowBalanceStored(address account) public view override returns (uint) { + bytes memory data = delegateToViewImplementation( + abi.encodeWithSignature("borrowBalanceStored(address)", account) + ); + return abi.decode(data, (uint)); + } + + /** + * @notice Calculates the exchange rate from the underlying to the VToken + * @dev This function does not accrue interest before calculating the exchange rate + * @return Calculated exchange rate scaled by 1e18 + */ + function exchangeRateStored() public view override returns (uint) { + bytes memory data = delegateToViewImplementation(abi.encodeWithSignature("exchangeRateStored()")); + return abi.decode(data, (uint)); + } + + /** + * @notice Internal method to delegate execution to another contract + * @dev It returns to the external caller whatever the implementation returns or forwards reverts + * @param callee The contract to delegatecall + * @param data The raw data to delegatecall + * @return The returned bytes from the delegatecall + */ + function delegateTo(address callee, bytes memory data) internal returns (bytes memory) { + (bool success, bytes memory returnData) = callee.delegatecall(data); + assembly { + if eq(success, 0) { + revert(add(returnData, 0x20), returndatasize()) + } + } + return returnData; + } +} diff --git a/contracts/Tokens/V0.8.13/VTokens/VBep20Immutable.sol b/contracts/Tokens/V0.8.13/VTokens/VBep20Immutable.sol new file mode 100644 index 000000000..0616cb208 --- /dev/null +++ b/contracts/Tokens/V0.8.13/VTokens/VBep20Immutable.sol @@ -0,0 +1,49 @@ +pragma solidity 0.8.13; + +import "./VBep20.sol"; + +/** + * @title Venus's VBep20Immutable Contract + * @notice VTokens which wrap an EIP-20 underlying and are immutable + * @author Venus + */ +contract VBep20Immutable is VBep20 { + /** + * @notice Construct a new money market + * @param underlying_ The address of the underlying asset + * @param comptroller_ The address of the comptroller + * @param interestRateModel_ The address of the interest rate model + * @param initialExchangeRateMantissa_ The initial exchange rate, scaled by 1e18 + * @param name_ BEP-20 name of this token + * @param symbol_ BEP-20 symbol of this token + * @param decimals_ BEP-20 decimal precision of this token + * @param admin_ Address of the administrator of this token + */ + constructor( + address underlying_, + ComptrollerInterface comptroller_, + InterestRateModel interestRateModel_, + uint initialExchangeRateMantissa_, + string memory name_, + string memory symbol_, + uint8 decimals_, + address payable admin_ + ) public { + // Creator of the contract is admin during initialization + admin = payable(msg.sender); + + // Initialize the market + initialize( + underlying_, + comptroller_, + interestRateModel_, + initialExchangeRateMantissa_, + name_, + symbol_, + decimals_ + ); + + // Set the proper admin now that initialization is done + admin = admin_; + } +} diff --git a/contracts/Tokens/V0.8.13/VTokens/VToken.sol b/contracts/Tokens/V0.8.13/VTokens/VToken.sol new file mode 100644 index 000000000..640ca50bb --- /dev/null +++ b/contracts/Tokens/V0.8.13/VTokens/VToken.sol @@ -0,0 +1,1659 @@ +pragma solidity ^0.8.13; + +import "../../../Utils/V0.8.13/ErrorReporter.sol"; +import "../../../Utils/V0.8.13/Exponential.sol"; +import "../EIP20Interface.sol"; +import "../EIP20NonStandardInterface.sol"; +import "../../../InterestRateModels/V0.8.13/InterestRateModel.sol"; +import "./VTokenInterfaces.sol"; + +/** + * @title Venus's vToken Contract + * @notice Abstract base for vTokens + * @author Venus + */ +contract VToken is VTokenInterface, Exponential, TokenErrorReporter { + struct MintLocalVars { + MathError mathErr; + uint exchangeRateMantissa; + uint mintTokens; + uint totalSupplyNew; + uint accountTokensNew; + uint actualMintAmount; + } + + struct RedeemLocalVars { + MathError mathErr; + uint exchangeRateMantissa; + uint redeemTokens; + uint redeemAmount; + uint totalSupplyNew; + uint accountTokensNew; + } + + struct BorrowLocalVars { + MathError mathErr; + uint accountBorrows; + uint accountBorrowsNew; + uint totalBorrowsNew; + } + + struct RepayBorrowLocalVars { + Error err; + MathError mathErr; + uint repayAmount; + uint borrowerIndex; + uint accountBorrows; + uint accountBorrowsNew; + uint totalBorrowsNew; + uint actualRepayAmount; + } + + /*** Reentrancy Guard ***/ + + /** + * @dev Prevents a contract from calling itself, directly or indirectly. + */ + modifier nonReentrant() { + require(_notEntered, "re-entered"); + _notEntered = false; + _; + _notEntered = true; // get a gas-refund post-Istanbul + } + + /** + * @notice Transfer `amount` tokens from `msg.sender` to `dst` + * @param dst The address of the destination account + * @param amount The number of tokens to transfer + * @return Whether or not the transfer succeeded + */ + // @custom:event Emits Transfer event + function transfer(address dst, uint256 amount) external override nonReentrant returns (bool) { + return transferTokens(msg.sender, msg.sender, dst, amount) == uint(Error.NO_ERROR); + } + + /** + * @notice Transfer `amount` tokens from `src` to `dst` + * @param src The address of the source account + * @param dst The address of the destination account + * @param amount The number of tokens to transfer + * @return Whether or not the transfer succeeded + */ + // @custom:event Emits Transfer event + function transferFrom(address src, address dst, uint256 amount) external override nonReentrant returns (bool) { + return transferTokens(msg.sender, src, dst, amount) == uint(Error.NO_ERROR); + } + + /** + * @notice Approve `spender` to transfer up to `amount` from `src` + * @dev This will overwrite the approval amount for `spender` + * and is subject to issues noted [here](https://eips.ethereum.org/EIPS/eip-20#approve) + * @param spender The address of the account which may transfer tokens + * @param amount The number of tokens that are approved (-1 means infinite) + * @return Whether or not the approval succeeded + */ + // @custom:event Emits Approval event on successful approve + function approve(address spender, uint256 amount) external override returns (bool) { + address src = msg.sender; + transferAllowances[src][spender] = amount; + emit Approval(src, spender, amount); + return true; + } + + /** + * @notice Get the underlying balance of the `owner` + * @dev This also accrues interest in a transaction + * @param owner The address of the account to query + * @return The amount of underlying owned by `owner` + */ + function balanceOfUnderlying(address owner) external override returns (uint) { + Exp memory exchangeRate = Exp({ mantissa: exchangeRateCurrent() }); + (MathError mErr, uint balance) = mulScalarTruncate(exchangeRate, accountTokens[owner]); + require(mErr == MathError.NO_ERROR, "balance could not be calculated"); + return balance; + } + + /** + * @notice Returns the current total borrows plus accrued interest + * @return The total borrows with interest + */ + function totalBorrowsCurrent() external override nonReentrant returns (uint) { + require(accrueInterest() == uint(Error.NO_ERROR), "accrue interest failed"); + return totalBorrows; + } + + /** + * @notice Accrue interest to updated borrowIndex and then calculate account's borrow balance using the updated borrowIndex + * @param account The address whose balance should be calculated after updating borrowIndex + * @return The calculated balance + */ + function borrowBalanceCurrent(address account) external override nonReentrant returns (uint) { + require(accrueInterest() == uint(Error.NO_ERROR), "accrue interest failed"); + return borrowBalanceStored(account); + } + + /** + * @notice Transfers collateral tokens (this market) to the liquidator. + * @dev Will fail unless called by another vToken during the process of liquidation. + * Its absolutely critical to use msg.sender as the borrowed vToken and not a parameter. + * @param liquidator The account receiving seized collateral + * @param borrower The account having collateral seized + * @param seizeTokens The number of vTokens to seize + * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). + */ + // @custom:event Emits Transfer event + function seize( + address liquidator, + address borrower, + uint seizeTokens + ) external override nonReentrant returns (uint) { + return seizeInternal(msg.sender, liquidator, borrower, seizeTokens); + } + + /** + * @notice Begins transfer of admin rights. The newPendingAdmin must call `_acceptAdmin` to finalize the transfer. + * @dev Admin function to begin change of admin. The newPendingAdmin must call `_acceptAdmin` to finalize the transfer. + * @param newPendingAdmin New pending admin. + * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). + */ + // @custom:event Emits NewPendingAdmin event with old and new admin addresses + function _setPendingAdmin(address payable newPendingAdmin) external override returns (uint) { + // Check caller = admin + if (msg.sender != admin) { + return fail(Error.UNAUTHORIZED, FailureInfo.SET_PENDING_ADMIN_OWNER_CHECK); + } + + // Save current value, if any, for inclusion in log + address oldPendingAdmin = pendingAdmin; + + // Store pendingAdmin with value newPendingAdmin + pendingAdmin = newPendingAdmin; + + // Emit NewPendingAdmin(oldPendingAdmin, newPendingAdmin) + emit NewPendingAdmin(oldPendingAdmin, newPendingAdmin); + + return uint(Error.NO_ERROR); + } + + /** + * @notice Accepts transfer of admin rights. msg.sender must be pendingAdmin + * @dev Admin function for pending admin to accept role and update admin + * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). + */ + // @custom:event Emits NewAdmin event on successful acceptance + // @custom:event Emits NewPendingAdmin event with null new pending admin + function _acceptAdmin() external override returns (uint) { + // Check caller is pendingAdmin + if (msg.sender != pendingAdmin) { + return fail(Error.UNAUTHORIZED, FailureInfo.ACCEPT_ADMIN_PENDING_ADMIN_CHECK); + } + + // Save current values for inclusion in log + address oldAdmin = admin; + address oldPendingAdmin = pendingAdmin; + + // Store admin with value pendingAdmin + admin = pendingAdmin; + + // Clear the pending value + pendingAdmin = payable(address(0)); + + emit NewAdmin(oldAdmin, admin); + emit NewPendingAdmin(oldPendingAdmin, pendingAdmin); + + return uint(Error.NO_ERROR); + } + + /** + * @notice accrues interest and sets a new reserve factor for the protocol using `_setReserveFactorFresh` + * @dev Admin function to accrue interest and set a new reserve factor + * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). + */ + // @custom:event Emits NewReserveFactor event + function _setReserveFactor(uint newReserveFactorMantissa) external override nonReentrant returns (uint) { + uint error = accrueInterest(); + if (error != uint(Error.NO_ERROR)) { + // accrueInterest emits logs on errors, but on top of that we want to log the fact that an attempted reserve factor change failed. + return fail(Error(error), FailureInfo.SET_RESERVE_FACTOR_ACCRUE_INTEREST_FAILED); + } + // _setReserveFactorFresh emits reserve-factor-specific logs on errors, so we don't need to. + return _setReserveFactorFresh(newReserveFactorMantissa); + } + + /** + * @notice Accrues interest and reduces reserves by transferring to admin + * @param reduceAmount Amount of reduction to reserves + * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). + */ + // @custom:event Emits ReservesReduced event + function _reduceReserves(uint reduceAmount) external override nonReentrant returns (uint) { + uint error = accrueInterest(); + if (error != uint(Error.NO_ERROR)) { + // accrueInterest emits logs on errors, but on top of that we want to log the fact that an attempted reduce reserves failed. + return fail(Error(error), FailureInfo.REDUCE_RESERVES_ACCRUE_INTEREST_FAILED); + } + // _reduceReservesFresh emits reserve-reduction-specific logs on errors, so we don't need to. + return _reduceReservesFresh(reduceAmount); + } + + /** + * @notice Get the current allowance from `owner` for `spender` + * @param owner The address of the account which owns the tokens to be spent + * @param spender The address of the account which may transfer tokens + * @return The number of tokens allowed to be spent (-1 means infinite) + */ + function allowance(address owner, address spender) external view override returns (uint256) { + return transferAllowances[owner][spender]; + } + + /** + * @notice Get the token balance of the `owner` + * @param owner The address of the account to query + * @return The number of tokens owned by `owner` + */ + function balanceOf(address owner) external view override returns (uint256) { + return accountTokens[owner]; + } + + /** + * @notice Get a snapshot of the account's balances, and the cached exchange rate + * @dev This is used by comptroller to more efficiently perform liquidity checks. + * @param account Address of the account to snapshot + * @return (possible error, token balance, borrow balance, exchange rate mantissa) + */ + function getAccountSnapshot(address account) external view override returns (uint, uint, uint, uint) { + uint vTokenBalance = accountTokens[account]; + uint borrowBalance; + uint exchangeRateMantissa; + + MathError mErr; + + (mErr, borrowBalance) = borrowBalanceStoredInternal(account); + if (mErr != MathError.NO_ERROR) { + return (uint(Error.MATH_ERROR), 0, 0, 0); + } + + (mErr, exchangeRateMantissa) = exchangeRateStoredInternal(); + if (mErr != MathError.NO_ERROR) { + return (uint(Error.MATH_ERROR), 0, 0, 0); + } + + return (uint(Error.NO_ERROR), vTokenBalance, borrowBalance, exchangeRateMantissa); + } + + /** + * @notice Returns the current per-block supply interest rate for this vToken + * @return The supply interest rate per block, scaled by 1e18 + */ + function supplyRatePerBlock() external view override returns (uint) { + return interestRateModel.getSupplyRate(getCashPrior(), totalBorrows, totalReserves, reserveFactorMantissa); + } + + /** + * @notice Returns the current per-block borrow interest rate for this vToken + * @return The borrow interest rate per block, scaled by 1e18 + */ + function borrowRatePerBlock() external view override returns (uint) { + return interestRateModel.getBorrowRate(getCashPrior(), totalBorrows, totalReserves); + } + + /** + * @notice Get cash balance of this vToken in the underlying asset + * @return The quantity of underlying asset owned by this contract + */ + function getCash() external view override returns (uint) { + return getCashPrior(); + } + + /** + * @notice Initialize the money market + * @param comptroller_ The address of the Comptroller + * @param interestRateModel_ The address of the interest rate model + * @param initialExchangeRateMantissa_ The initial exchange rate, scaled by 1e18 + * @param name_ EIP-20 name of this token + * @param symbol_ EIP-20 symbol of this token + * @param decimals_ EIP-20 decimal precision of this token + */ + function initialize( + ComptrollerInterface comptroller_, + InterestRateModel interestRateModel_, + uint initialExchangeRateMantissa_, + string memory name_, + string memory symbol_, + uint8 decimals_ + ) public { + require(msg.sender == admin, "only admin may initialize the market"); + require(accrualBlockNumber == 0 && borrowIndex == 0, "market may only be initialized once"); + + // Set initial exchange rate + initialExchangeRateMantissa = initialExchangeRateMantissa_; + require(initialExchangeRateMantissa > 0, "initial exchange rate must be greater than zero."); + + // Set the comptroller + uint err = _setComptroller(comptroller_); + require(err == uint(Error.NO_ERROR), "setting comptroller failed"); + + // Initialize block number and borrow index (block number mocks depend on comptroller being set) + accrualBlockNumber = getBlockNumber(); + borrowIndex = mantissaOne; + + // Set the interest rate model (depends on block number / borrow index) + err = _setInterestRateModelFresh(interestRateModel_); + require(err == uint(Error.NO_ERROR), "setting interest rate model failed"); + + name = name_; + symbol = symbol_; + decimals = decimals_; + + // The counter starts true to prevent changing it from zero to non-zero (i.e. smaller cost/refund) + _notEntered = true; + } + + /** + * @notice Accrue interest then return the up-to-date exchange rate + * @return Calculated exchange rate scaled by 1e18 + */ + function exchangeRateCurrent() public override nonReentrant returns (uint) { + require(accrueInterest() == uint(Error.NO_ERROR), "accrue interest failed"); + return exchangeRateStored(); + } + + /** + * @notice Applies accrued interest to total borrows and reserves + * @dev This calculates interest accrued from the last checkpointed block + * up to the current block and writes new checkpoint to storage. + */ + // @custom:event Emits AccrueInterest event + function accrueInterest() public override returns (uint) { + /* Remember the initial block number */ + uint currentBlockNumber = getBlockNumber(); + uint accrualBlockNumberPrior = accrualBlockNumber; + + /* Short-circuit accumulating 0 interest */ + if (accrualBlockNumberPrior == currentBlockNumber) { + return uint(Error.NO_ERROR); + } + + /* Read the previous values out of storage */ + uint cashPrior = getCashPrior(); + uint borrowsPrior = totalBorrows; + uint reservesPrior = totalReserves; + uint borrowIndexPrior = borrowIndex; + + /* Calculate the current borrow interest rate */ + uint borrowRateMantissa = interestRateModel.getBorrowRate(cashPrior, borrowsPrior, reservesPrior); + require(borrowRateMantissa <= borrowRateMaxMantissa, "borrow rate is absurdly high"); + + /* Calculate the number of blocks elapsed since the last accrual */ + (MathError mathErr, uint blockDelta) = subUInt(currentBlockNumber, accrualBlockNumberPrior); + require(mathErr == MathError.NO_ERROR, "could not calculate block delta"); + + /* + * Calculate the interest accumulated into borrows and reserves and the new index: + * simpleInterestFactor = borrowRate * blockDelta + * interestAccumulated = simpleInterestFactor * totalBorrows + * totalBorrowsNew = interestAccumulated + totalBorrows + * totalReservesNew = interestAccumulated * reserveFactor + totalReserves + * borrowIndexNew = simpleInterestFactor * borrowIndex + borrowIndex + */ + + Exp memory simpleInterestFactor; + uint interestAccumulated; + uint totalBorrowsNew; + uint totalReservesNew; + uint borrowIndexNew; + + (mathErr, simpleInterestFactor) = mulScalar(Exp({ mantissa: borrowRateMantissa }), blockDelta); + if (mathErr != MathError.NO_ERROR) { + return + failOpaque( + Error.MATH_ERROR, + FailureInfo.ACCRUE_INTEREST_SIMPLE_INTEREST_FACTOR_CALCULATION_FAILED, + uint(mathErr) + ); + } + + (mathErr, interestAccumulated) = mulScalarTruncate(simpleInterestFactor, borrowsPrior); + if (mathErr != MathError.NO_ERROR) { + return + failOpaque( + Error.MATH_ERROR, + FailureInfo.ACCRUE_INTEREST_ACCUMULATED_INTEREST_CALCULATION_FAILED, + uint(mathErr) + ); + } + + (mathErr, totalBorrowsNew) = addUInt(interestAccumulated, borrowsPrior); + if (mathErr != MathError.NO_ERROR) { + return + failOpaque( + Error.MATH_ERROR, + FailureInfo.ACCRUE_INTEREST_NEW_TOTAL_BORROWS_CALCULATION_FAILED, + uint(mathErr) + ); + } + + (mathErr, totalReservesNew) = mulScalarTruncateAddUInt( + Exp({ mantissa: reserveFactorMantissa }), + interestAccumulated, + reservesPrior + ); + if (mathErr != MathError.NO_ERROR) { + return + failOpaque( + Error.MATH_ERROR, + FailureInfo.ACCRUE_INTEREST_NEW_TOTAL_RESERVES_CALCULATION_FAILED, + uint(mathErr) + ); + } + + (mathErr, borrowIndexNew) = mulScalarTruncateAddUInt(simpleInterestFactor, borrowIndexPrior, borrowIndexPrior); + if (mathErr != MathError.NO_ERROR) { + return + failOpaque( + Error.MATH_ERROR, + FailureInfo.ACCRUE_INTEREST_NEW_BORROW_INDEX_CALCULATION_FAILED, + uint(mathErr) + ); + } + + ///////////////////////// + // EFFECTS & INTERACTIONS + // (No safe failures beyond this point) + + /* We write the previously calculated values into storage */ + accrualBlockNumber = currentBlockNumber; + borrowIndex = borrowIndexNew; + totalBorrows = totalBorrowsNew; + totalReserves = totalReservesNew; + + /* We emit an AccrueInterest event */ + emit AccrueInterest(cashPrior, interestAccumulated, borrowIndexNew, totalBorrowsNew); + + return uint(Error.NO_ERROR); + } + + /** + * @notice Sets a new comptroller for the market + * @dev Admin function to set a new comptroller + * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). + */ + // @custom:event Emits NewComptroller event + function _setComptroller(ComptrollerInterface newComptroller) public override returns (uint) { + // Check caller is admin + if (msg.sender != admin) { + return fail(Error.UNAUTHORIZED, FailureInfo.SET_COMPTROLLER_OWNER_CHECK); + } + + ComptrollerInterface oldComptroller = comptroller; + // Ensure invoke comptroller.isComptroller() returns true + require(newComptroller.isComptroller(), "marker method returned false"); + // Set market's comptroller to newComptroller + comptroller = newComptroller; + + // Emit NewComptroller(oldComptroller, newComptroller) + emit NewComptroller(oldComptroller, newComptroller); + + return uint(Error.NO_ERROR); + } + + /** + * @notice Accrues interest and updates the interest rate model using _setInterestRateModelFresh + * @dev Admin function to accrue interest and update the interest rate model + * @param newInterestRateModel The new interest rate model to use + * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). + */ + function _setInterestRateModel(InterestRateModel newInterestRateModel) public override returns (uint) { + uint error = accrueInterest(); + if (error != uint(Error.NO_ERROR)) { + // accrueInterest emits logs on errors, but on top of that we want to log the fact that an attempted change of interest rate model failed + return fail(Error(error), FailureInfo.SET_INTEREST_RATE_MODEL_ACCRUE_INTEREST_FAILED); + } + // _setInterestRateModelFresh emits interest-rate-model-update-specific logs on errors, so we don't need to. + return _setInterestRateModelFresh(newInterestRateModel); + } + + /** + * @notice Calculates the exchange rate from the underlying to the VToken + * @dev This function does not accrue interest before calculating the exchange rate + * @return Calculated exchange rate scaled by 1e18 + */ + function exchangeRateStored() public view override returns (uint) { + (MathError err, uint result) = exchangeRateStoredInternal(); + require(err == MathError.NO_ERROR, "exchangeRateStored: exchangeRateStoredInternal failed"); + return result; + } + + /** + * @notice Return the borrow balance of account based on stored data + * @param account The address whose balance should be calculated + * @return The calculated balance + */ + function borrowBalanceStored(address account) public view override returns (uint) { + (MathError err, uint result) = borrowBalanceStoredInternal(account); + require(err == MathError.NO_ERROR, "borrowBalanceStored: borrowBalanceStoredInternal failed"); + return result; + } + + /** + * @notice Transfers `tokens` tokens from `src` to `dst` by `spender` + * @dev Called by both `transfer` and `transferFrom` internally + * @param spender The address of the account performing the transfer + * @param src The address of the source account + * @param dst The address of the destination account + * @param tokens The number of tokens to transfer + * @return Whether or not the transfer succeeded + */ + function transferTokens(address spender, address src, address dst, uint tokens) internal returns (uint) { + /* Fail if transfer not allowed */ + uint allowed = comptroller.transferAllowed(address(this), src, dst, tokens); + if (allowed != 0) { + return failOpaque(Error.COMPTROLLER_REJECTION, FailureInfo.TRANSFER_COMPTROLLER_REJECTION, allowed); + } + + /* Do not allow self-transfers */ + if (src == dst) { + return fail(Error.BAD_INPUT, FailureInfo.TRANSFER_NOT_ALLOWED); + } + + /* Get the allowance, infinite for the account owner */ + uint startingAllowance = 0; + if (spender == src) { + startingAllowance = type(uint).max; + } else { + startingAllowance = transferAllowances[src][spender]; + } + + /* Do the calculations, checking for {under,over}flow */ + MathError mathErr; + uint allowanceNew; + uint srvTokensNew; + uint dstTokensNew; + + (mathErr, allowanceNew) = subUInt(startingAllowance, tokens); + if (mathErr != MathError.NO_ERROR) { + return fail(Error.MATH_ERROR, FailureInfo.TRANSFER_NOT_ALLOWED); + } + + (mathErr, srvTokensNew) = subUInt(accountTokens[src], tokens); + if (mathErr != MathError.NO_ERROR) { + return fail(Error.MATH_ERROR, FailureInfo.TRANSFER_NOT_ENOUGH); + } + + (mathErr, dstTokensNew) = addUInt(accountTokens[dst], tokens); + if (mathErr != MathError.NO_ERROR) { + return fail(Error.MATH_ERROR, FailureInfo.TRANSFER_TOO_MUCH); + } + + ///////////////////////// + // EFFECTS & INTERACTIONS + // (No safe failures beyond this point) + + accountTokens[src] = srvTokensNew; + accountTokens[dst] = dstTokensNew; + + /* Eat some of the allowance (if necessary) */ + if (startingAllowance != type(uint).max) { + transferAllowances[src][spender] = allowanceNew; + } + + /* We emit a Transfer event */ + emit Transfer(src, dst, tokens); + + comptroller.transferVerify(address(this), src, dst, tokens); + + return uint(Error.NO_ERROR); + } + + /** + * @notice Sender supplies assets into the market and receives vTokens in exchange + * @dev Accrues interest whether or not the operation succeeds, unless reverted + * @param mintAmount The amount of the underlying asset to supply + * @return (uint, uint) An error code (0=success, otherwise a failure, see ErrorReporter.sol), and the actual mint amount. + */ + function mintInternal(uint mintAmount) internal nonReentrant returns (uint, uint) { + uint error = accrueInterest(); + if (error != uint(Error.NO_ERROR)) { + // accrueInterest emits logs on errors, but we still want to log the fact that an attempted mint failed + return (fail(Error(error), FailureInfo.MINT_ACCRUE_INTEREST_FAILED), 0); + } + // mintFresh emits the actual Mint event if successful and logs on errors, so we don't need to + return mintFresh(msg.sender, mintAmount); + } + + /** + * @notice User supplies assets into the market and receives vTokens in exchange + * @dev Assumes interest has already been accrued up to the current block + * @param minter The address of the account which is supplying the assets + * @param mintAmount The amount of the underlying asset to supply + * @return (uint, uint) An error code (0=success, otherwise a failure, see ErrorReporter.sol), and the actual mint amount. + */ + function mintFresh(address minter, uint mintAmount) internal returns (uint, uint) { + /* Fail if mint not allowed */ + uint allowed = comptroller.mintAllowed(address(this), minter, mintAmount); + if (allowed != 0) { + return (failOpaque(Error.COMPTROLLER_REJECTION, FailureInfo.MINT_COMPTROLLER_REJECTION, allowed), 0); + } + + /* Verify market's block number equals current block number */ + if (accrualBlockNumber != getBlockNumber()) { + return (fail(Error.MARKET_NOT_FRESH, FailureInfo.MINT_FRESHNESS_CHECK), 0); + } + + MintLocalVars memory vars; + + (vars.mathErr, vars.exchangeRateMantissa) = exchangeRateStoredInternal(); + if (vars.mathErr != MathError.NO_ERROR) { + return (failOpaque(Error.MATH_ERROR, FailureInfo.MINT_EXCHANGE_RATE_READ_FAILED, uint(vars.mathErr)), 0); + } + + ///////////////////////// + // EFFECTS & INTERACTIONS + // (No safe failures beyond this point) + + /* + * We call `doTransferIn` for the minter and the mintAmount. + * Note: The vToken must handle variations between BEP-20 and BNB underlying. + * `doTransferIn` reverts if anything goes wrong, since we can't be sure if + * side-effects occurred. The function returns the amount actually transferred, + * in case of a fee. On success, the vToken holds an additional `actualMintAmount` + * of cash. + */ + vars.actualMintAmount = doTransferIn(minter, mintAmount); + + /* + * We get the current exchange rate and calculate the number of vTokens to be minted: + * mintTokens = actualMintAmount / exchangeRate + */ + + (vars.mathErr, vars.mintTokens) = divScalarByExpTruncate( + vars.actualMintAmount, + Exp({ mantissa: vars.exchangeRateMantissa }) + ); + require(vars.mathErr == MathError.NO_ERROR, "MINT_EXCHANGE_CALCULATION_FAILED"); + + /* + * We calculate the new total supply of vTokens and minter token balance, checking for overflow: + * totalSupplyNew = totalSupply + mintTokens + * accountTokensNew = accountTokens[minter] + mintTokens + */ + (vars.mathErr, vars.totalSupplyNew) = addUInt(totalSupply, vars.mintTokens); + require(vars.mathErr == MathError.NO_ERROR, "MINT_NEW_TOTAL_SUPPLY_CALCULATION_FAILED"); + + (vars.mathErr, vars.accountTokensNew) = addUInt(accountTokens[minter], vars.mintTokens); + require(vars.mathErr == MathError.NO_ERROR, "MINT_NEW_ACCOUNT_BALANCE_CALCULATION_FAILED"); + + /* We write previously calculated values into storage */ + totalSupply = vars.totalSupplyNew; + accountTokens[minter] = vars.accountTokensNew; + + /* We emit a Mint event, and a Transfer event */ + emit Mint(minter, vars.actualMintAmount, vars.mintTokens); + emit Transfer(address(this), minter, vars.mintTokens); + + /* We call the defense hook */ + comptroller.mintVerify(address(this), minter, vars.actualMintAmount, vars.mintTokens); + + return (uint(Error.NO_ERROR), vars.actualMintAmount); + } + + /** + * @notice Sender supplies assets into the market and receiver receives vTokens in exchange + * @dev Accrues interest whether or not the operation succeeds, unless reverted + * @param receiver The address of the account which is receiving the vTokens + * @param mintAmount The amount of the underlying asset to supply + * @return (uint, uint) An error code (0=success, otherwise a failure, see ErrorReporter.sol), and the actual mint amount. + */ + function mintBehalfInternal(address receiver, uint mintAmount) internal nonReentrant returns (uint, uint) { + uint error = accrueInterest(); + if (error != uint(Error.NO_ERROR)) { + // accrueInterest emits logs on errors, but we still want to log the fact that an attempted mintBehalf failed + return (fail(Error(error), FailureInfo.MINT_ACCRUE_INTEREST_FAILED), 0); + } + // mintBelahfFresh emits the actual Mint event if successful and logs on errors, so we don't need to + return mintBehalfFresh(msg.sender, receiver, mintAmount); + } + + /** + * @notice Payer supplies assets into the market and receiver receives vTokens in exchange + * @dev Assumes interest has already been accrued up to the current block + * @param payer The address of the account which is paying the underlying token + * @param receiver The address of the account which is receiving vToken + * @param mintAmount The amount of the underlying asset to supply + * @return (uint, uint) An error code (0=success, otherwise a failure, see ErrorReporter.sol), and the actual mint amount. + */ + function mintBehalfFresh(address payer, address receiver, uint mintAmount) internal returns (uint, uint) { + require(receiver != address(0), "receiver is invalid"); + /* Fail if mint not allowed */ + uint allowed = comptroller.mintAllowed(address(this), receiver, mintAmount); + if (allowed != 0) { + return (failOpaque(Error.COMPTROLLER_REJECTION, FailureInfo.MINT_COMPTROLLER_REJECTION, allowed), 0); + } + + /* Verify market's block number equals current block number */ + if (accrualBlockNumber != getBlockNumber()) { + return (fail(Error.MARKET_NOT_FRESH, FailureInfo.MINT_FRESHNESS_CHECK), 0); + } + + MintLocalVars memory vars; + + (vars.mathErr, vars.exchangeRateMantissa) = exchangeRateStoredInternal(); + if (vars.mathErr != MathError.NO_ERROR) { + return (failOpaque(Error.MATH_ERROR, FailureInfo.MINT_EXCHANGE_RATE_READ_FAILED, uint(vars.mathErr)), 0); + } + + ///////////////////////// + // EFFECTS & INTERACTIONS + // (No safe failures beyond this point) + + /* + * We call `doTransferIn` for the payer and the mintAmount. + * Note: The vToken must handle variations between BEP-20 and BNB underlying. + * `doTransferIn` reverts if anything goes wrong, since we can't be sure if + * side-effects occurred. The function returns the amount actually transferred, + * in case of a fee. On success, the vToken holds an additional `actualMintAmount` + * of cash. + */ + vars.actualMintAmount = doTransferIn(payer, mintAmount); + + /* + * We get the current exchange rate and calculate the number of vTokens to be minted: + * mintTokens = actualMintAmount / exchangeRate + */ + + (vars.mathErr, vars.mintTokens) = divScalarByExpTruncate( + vars.actualMintAmount, + Exp({ mantissa: vars.exchangeRateMantissa }) + ); + require(vars.mathErr == MathError.NO_ERROR, "MINT_EXCHANGE_CALCULATION_FAILED"); + + /* + * We calculate the new total supply of vTokens and receiver token balance, checking for overflow: + * totalSupplyNew = totalSupply + mintTokens + * accountTokensNew = accountTokens[receiver] + mintTokens + */ + (vars.mathErr, vars.totalSupplyNew) = addUInt(totalSupply, vars.mintTokens); + require(vars.mathErr == MathError.NO_ERROR, "MINT_NEW_TOTAL_SUPPLY_CALCULATION_FAILED"); + + (vars.mathErr, vars.accountTokensNew) = addUInt(accountTokens[receiver], vars.mintTokens); + require(vars.mathErr == MathError.NO_ERROR, "MINT_NEW_ACCOUNT_BALANCE_CALCULATION_FAILED"); + + /* We write previously calculated values into storage */ + totalSupply = vars.totalSupplyNew; + accountTokens[receiver] = vars.accountTokensNew; + + /* We emit a MintBehalf event, and a Transfer event */ + emit MintBehalf(payer, receiver, vars.actualMintAmount, vars.mintTokens); + emit Transfer(address(this), receiver, vars.mintTokens); + + /* We call the defense hook */ + comptroller.mintVerify(address(this), receiver, vars.actualMintAmount, vars.mintTokens); + + return (uint(Error.NO_ERROR), vars.actualMintAmount); + } + + /** + * @notice Sender redeems vTokens in exchange for the underlying asset + * @dev Accrues interest whether or not the operation succeeds, unless reverted + * @param redeemTokens The number of vTokens to redeem into underlying + * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). + */ + function redeemInternal(uint redeemTokens) internal nonReentrant returns (uint) { + uint error = accrueInterest(); + if (error != uint(Error.NO_ERROR)) { + // accrueInterest emits logs on errors, but we still want to log the fact that an attempted redeem failed + return fail(Error(error), FailureInfo.REDEEM_ACCRUE_INTEREST_FAILED); + } + // redeemFresh emits redeem-specific logs on errors, so we don't need to + return redeemFresh(payable(msg.sender), redeemTokens, 0); + } + + /** + * @notice Sender redeems vTokens in exchange for a specified amount of underlying asset + * @dev Accrues interest whether or not the operation succeeds, unless reverted + * @param redeemAmount The amount of underlying to receive from redeeming vTokens + * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). + */ + function redeemUnderlyingInternal(uint redeemAmount) internal nonReentrant returns (uint) { + uint error = accrueInterest(); + if (error != uint(Error.NO_ERROR)) { + // accrueInterest emits logs on errors, but we still want to log the fact that an attempted redeem failed + return fail(Error(error), FailureInfo.REDEEM_ACCRUE_INTEREST_FAILED); + } + // redeemFresh emits redeem-specific logs on errors, so we don't need to + return redeemFresh(payable(msg.sender), 0, redeemAmount); + } + + /** + * @notice User redeems vTokens in exchange for the underlying asset + * @dev Assumes interest has already been accrued up to the current block + * @param redeemer The address of the account which is redeeming the tokens + * @param redeemTokensIn The number of vTokens to redeem into underlying (only one of redeemTokensIn or redeemAmountIn may be non-zero) + * @param redeemAmountIn The number of underlying tokens to receive from redeeming vTokens (only one of redeemTokensIn or redeemAmountIn may be non-zero) + * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). + */ + // solhint-disable-next-line code-complexity + function redeemFresh(address payable redeemer, uint redeemTokensIn, uint redeemAmountIn) internal returns (uint) { + require(redeemTokensIn == 0 || redeemAmountIn == 0, "one of redeemTokensIn or redeemAmountIn must be zero"); + + RedeemLocalVars memory vars; + + /* exchangeRate = invoke Exchange Rate Stored() */ + (vars.mathErr, vars.exchangeRateMantissa) = exchangeRateStoredInternal(); + if (vars.mathErr != MathError.NO_ERROR) { + revert("math error"); + } + + /* If redeemTokensIn > 0: */ + if (redeemTokensIn > 0) { + /* + * We calculate the exchange rate and the amount of underlying to be redeemed: + * redeemTokens = redeemTokensIn + * redeemAmount = redeemTokensIn x exchangeRateCurrent + */ + vars.redeemTokens = redeemTokensIn; + + (vars.mathErr, vars.redeemAmount) = mulScalarTruncate( + Exp({ mantissa: vars.exchangeRateMantissa }), + redeemTokensIn + ); + if (vars.mathErr != MathError.NO_ERROR) { + revert("math error"); + } + } else { + /* + * We get the current exchange rate and calculate the amount to be redeemed: + * redeemTokens = redeemAmountIn / exchangeRate + * redeemAmount = redeemAmountIn + */ + + (vars.mathErr, vars.redeemTokens) = divScalarByExpTruncate( + redeemAmountIn, + Exp({ mantissa: vars.exchangeRateMantissa }) + ); + if (vars.mathErr != MathError.NO_ERROR) { + revert("math error"); + } + + vars.redeemAmount = redeemAmountIn; + } + + /* Fail if redeem not allowed */ + uint allowed = comptroller.redeemAllowed(address(this), redeemer, vars.redeemTokens); + if (allowed != 0) { + revert("math error"); + } + + /* Verify market's block number equals current block number */ + if (accrualBlockNumber != getBlockNumber()) { + revert("math error"); + } + + /* + * We calculate the new total supply and redeemer balance, checking for underflow: + * totalSupplyNew = totalSupply - redeemTokens + * accountTokensNew = accountTokens[redeemer] - redeemTokens + */ + (vars.mathErr, vars.totalSupplyNew) = subUInt(totalSupply, vars.redeemTokens); + if (vars.mathErr != MathError.NO_ERROR) { + revert("math error"); + } + + (vars.mathErr, vars.accountTokensNew) = subUInt(accountTokens[redeemer], vars.redeemTokens); + if (vars.mathErr != MathError.NO_ERROR) { + revert("math error"); + } + + /* Fail gracefully if protocol has insufficient cash */ + if (getCashPrior() < vars.redeemAmount) { + revert("math error"); + } + + ///////////////////////// + // EFFECTS & INTERACTIONS + // (No safe failures beyond this point) + + /* We write previously calculated values into storage */ + totalSupply = vars.totalSupplyNew; + accountTokens[redeemer] = vars.accountTokensNew; + + /* + * We invoke doTransferOut for the redeemer and the redeemAmount. + * Note: The vToken must handle variations between BEP-20 and BNB underlying. + * On success, the vToken has redeemAmount less of cash. + * doTransferOut reverts if anything goes wrong, since we can't be sure if side effects occurred. + */ + + uint feeAmount; + uint remainedAmount; + if (IComptroller(address(comptroller)).treasuryPercent() != 0) { + (vars.mathErr, feeAmount) = mulUInt( + vars.redeemAmount, + IComptroller(address(comptroller)).treasuryPercent() + ); + if (vars.mathErr != MathError.NO_ERROR) { + revert("math error"); + } + + (vars.mathErr, feeAmount) = divUInt(feeAmount, 1e18); + if (vars.mathErr != MathError.NO_ERROR) { + revert("math error"); + } + + (vars.mathErr, remainedAmount) = subUInt(vars.redeemAmount, feeAmount); + if (vars.mathErr != MathError.NO_ERROR) { + revert("math error"); + } + + doTransferOut(payable(address(uint160(IComptroller(address(comptroller)).treasuryAddress()))), feeAmount); + + emit RedeemFee(redeemer, feeAmount, vars.redeemTokens); + } else { + remainedAmount = vars.redeemAmount; + } + + doTransferOut(redeemer, remainedAmount); + + /* We emit a Transfer event, and a Redeem event */ + emit Transfer(redeemer, address(this), vars.redeemTokens); + emit Redeem(redeemer, remainedAmount, vars.redeemTokens); + + /* We call the defense hook */ + comptroller.redeemVerify(address(this), redeemer, vars.redeemAmount, vars.redeemTokens); + + return uint(Error.NO_ERROR); + } + + /** + * @notice Sender borrows assets from the protocol to their own address + * @param borrowAmount The amount of the underlying asset to borrow + * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). + */ + function borrowInternal(uint borrowAmount) internal nonReentrant returns (uint) { + address borrower = msg.sender; + address payable receiver = payable(msg.sender); + return borrowInternal(borrower, receiver, borrowAmount); + } + + /** + * @notice Receiver gets the borrow on behalf of the borrower address + * @param borrower The borrower, on behalf of whom to borrow + * @param receiver The account that would receive the funds (can be the same as the borrower) + * @param borrowAmount The amount of the underlying asset to borrow + * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). + */ + function borrowInternal( + address borrower, + address payable receiver, + uint borrowAmount + ) internal nonReentrant returns (uint) { + uint error = accrueInterest(); + if (error != uint(Error.NO_ERROR)) { + // accrueInterest emits logs on errors, but we still want to log the fact that an attempted borrow failed + return fail(Error(error), FailureInfo.BORROW_ACCRUE_INTEREST_FAILED); + } + // borrowFresh emits borrow-specific logs on errors, so we don't need to + return borrowFresh(borrower, receiver, borrowAmount); + } + + /** + * @notice Receiver gets the borrow on behalf of the borrower address + * @dev Before calling this function, ensure that the interest has been accrued + * @param borrower The borrower, on behalf of whom to borrow + * @param receiver The account that would receive the funds (can be the same as the borrower) + * @param borrowAmount The amount of the underlying asset to borrow + * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). + */ + function borrowFresh(address borrower, address payable receiver, uint borrowAmount) internal returns (uint) { + /* Fail if borrow not allowed */ + uint allowed = comptroller.borrowAllowed(address(this), borrower, borrowAmount); + if (allowed != 0) { + revert("math error"); + } + + /* Verify market's block number equals current block number */ + if (accrualBlockNumber != getBlockNumber()) { + revert("math error"); + } + + /* Fail gracefully if protocol has insufficient underlying cash */ + if (getCashPrior() < borrowAmount) { + revert("math error"); + } + + BorrowLocalVars memory vars; + + /* + * We calculate the new borrower and total borrow balances, failing on overflow: + * accountBorrowsNew = accountBorrows + borrowAmount + * totalBorrowsNew = totalBorrows + borrowAmount + */ + (vars.mathErr, vars.accountBorrows) = borrowBalanceStoredInternal(borrower); + if (vars.mathErr != MathError.NO_ERROR) { + revert("math error"); + } + + (vars.mathErr, vars.accountBorrowsNew) = addUInt(vars.accountBorrows, borrowAmount); + if (vars.mathErr != MathError.NO_ERROR) { + revert("math error"); + } + + (vars.mathErr, vars.totalBorrowsNew) = addUInt(totalBorrows, borrowAmount); + if (vars.mathErr != MathError.NO_ERROR) { + revert("math error"); + } + + ///////////////////////// + // EFFECTS & INTERACTIONS + // (No safe failures beyond this point) + + /* We write the previously calculated values into storage */ + accountBorrows[borrower].principal = vars.accountBorrowsNew; + accountBorrows[borrower].interestIndex = borrowIndex; + totalBorrows = vars.totalBorrowsNew; + + /* + * We invoke doTransferOut for the borrower and the borrowAmount. + * Note: The vToken must handle variations between BEP-20 and BNB underlying. + * On success, the vToken borrowAmount less of cash. + * doTransferOut reverts if anything goes wrong, since we can't be sure if side effects occurred. + */ + doTransferOut(receiver, borrowAmount); + + /* We emit a Borrow event */ + emit Borrow(borrower, borrowAmount, vars.accountBorrowsNew, vars.totalBorrowsNew); + + /* We call the defense hook */ + comptroller.borrowVerify(address(this), borrower, borrowAmount); + + return uint(Error.NO_ERROR); + } + + /** + * @notice Sender repays their own borrow + * @param repayAmount The amount to repay + * @return (uint, uint) An error code (0=success, otherwise a failure, see ErrorReporter.sol), and the actual repayment amount. + */ + function repayBorrowInternal(uint repayAmount) internal nonReentrant returns (uint, uint) { + uint error = accrueInterest(); + if (error != uint(Error.NO_ERROR)) { + // accrueInterest emits logs on errors, but we still want to log the fact that an attempted borrow failed + return (fail(Error(error), FailureInfo.REPAY_BORROW_ACCRUE_INTEREST_FAILED), 0); + } + // repayBorrowFresh emits repay-borrow-specific logs on errors, so we don't need to + return repayBorrowFresh(msg.sender, msg.sender, repayAmount); + } + + /** + * @notice Sender repays a borrow belonging to another borrowing account + * @param borrower The account with the debt being payed off + * @param repayAmount The amount to repay + * @return (uint, uint) An error code (0=success, otherwise a failure, see ErrorReporter.sol), and the actual repayment amount. + */ + function repayBorrowBehalfInternal(address borrower, uint repayAmount) internal nonReentrant returns (uint, uint) { + uint error = accrueInterest(); + if (error != uint(Error.NO_ERROR)) { + // accrueInterest emits logs on errors, but we still want to log the fact that an attempted borrow failed + return (fail(Error(error), FailureInfo.REPAY_BEHALF_ACCRUE_INTEREST_FAILED), 0); + } + // repayBorrowFresh emits repay-borrow-specific logs on errors, so we don't need to + return repayBorrowFresh(msg.sender, borrower, repayAmount); + } + + /** + * @notice Borrows are repaid by another user (possibly the borrower). + * @param payer The account paying off the borrow + * @param borrower The account with the debt being payed off + * @param repayAmount The amount of undelrying tokens being returned + * @return (uint, uint) An error code (0=success, otherwise a failure, see ErrorReporter.sol), and the actual repayment amount. + */ + function repayBorrowFresh(address payer, address borrower, uint repayAmount) internal returns (uint, uint) { + /* Fail if repayBorrow not allowed */ + uint allowed = comptroller.repayBorrowAllowed(address(this), payer, borrower, repayAmount); + if (allowed != 0) { + return ( + failOpaque(Error.COMPTROLLER_REJECTION, FailureInfo.REPAY_BORROW_COMPTROLLER_REJECTION, allowed), + 0 + ); + } + + /* Verify market's block number equals current block number */ + if (accrualBlockNumber != getBlockNumber()) { + return (fail(Error.MARKET_NOT_FRESH, FailureInfo.REPAY_BORROW_FRESHNESS_CHECK), 0); + } + + RepayBorrowLocalVars memory vars; + + /* We remember the original borrowerIndex for verification purposes */ + vars.borrowerIndex = accountBorrows[borrower].interestIndex; + + /* We fetch the amount the borrower owes, with accumulated interest */ + (vars.mathErr, vars.accountBorrows) = borrowBalanceStoredInternal(borrower); + if (vars.mathErr != MathError.NO_ERROR) { + return ( + failOpaque( + Error.MATH_ERROR, + FailureInfo.REPAY_BORROW_ACCUMULATED_BALANCE_CALCULATION_FAILED, + uint(vars.mathErr) + ), + 0 + ); + } + + /* If repayAmount == -1, repayAmount = accountBorrows */ + if (repayAmount == type(uint).max) { + vars.repayAmount = vars.accountBorrows; + } else { + vars.repayAmount = repayAmount; + } + + ///////////////////////// + // EFFECTS & INTERACTIONS + // (No safe failures beyond this point) + + /* + * We call doTransferIn for the payer and the repayAmount + * Note: The vToken must handle variations between BEP-20 and BNB underlying. + * On success, the vToken holds an additional repayAmount of cash. + * doTransferIn reverts if anything goes wrong, since we can't be sure if side effects occurred. + * it returns the amount actually transferred, in case of a fee. + */ + vars.actualRepayAmount = doTransferIn(payer, vars.repayAmount); + + /* + * We calculate the new borrower and total borrow balances, failing on underflow: + * accountBorrowsNew = accountBorrows - actualRepayAmount + * totalBorrowsNew = totalBorrows - actualRepayAmount + */ + (vars.mathErr, vars.accountBorrowsNew) = subUInt(vars.accountBorrows, vars.actualRepayAmount); + require(vars.mathErr == MathError.NO_ERROR, "REPAY_BORROW_NEW_ACCOUNT_BORROW_BALANCE_CALCULATION_FAILED"); + + (vars.mathErr, vars.totalBorrowsNew) = subUInt(totalBorrows, vars.actualRepayAmount); + require(vars.mathErr == MathError.NO_ERROR, "REPAY_BORROW_NEW_TOTAL_BALANCE_CALCULATION_FAILED"); + + /* We write the previously calculated values into storage */ + accountBorrows[borrower].principal = vars.accountBorrowsNew; + accountBorrows[borrower].interestIndex = borrowIndex; + totalBorrows = vars.totalBorrowsNew; + + /* We emit a RepayBorrow event */ + emit RepayBorrow(payer, borrower, vars.actualRepayAmount, vars.accountBorrowsNew, vars.totalBorrowsNew); + + /* We call the defense hook */ + comptroller.repayBorrowVerify(address(this), payer, borrower, vars.actualRepayAmount, vars.borrowerIndex); + + return (uint(Error.NO_ERROR), vars.actualRepayAmount); + } + + /** + * @notice The sender liquidates the borrowers collateral. + * The collateral seized is transferred to the liquidator. + * @param borrower The borrower of this vToken to be liquidated + * @param vTokenCollateral The market in which to seize collateral from the borrower + * @param repayAmount The amount of the underlying borrowed asset to repay + * @return (uint, uint) An error code (0=success, otherwise a failure, see ErrorReporter.sol), and the actual repayment amount. + */ + function liquidateBorrowInternal( + address borrower, + uint repayAmount, + VTokenInterface vTokenCollateral + ) internal nonReentrant returns (uint, uint) { + uint error = accrueInterest(); + if (error != uint(Error.NO_ERROR)) { + // accrueInterest emits logs on errors, but we still want to log the fact that an attempted liquidation failed + return (fail(Error(error), FailureInfo.LIQUIDATE_ACCRUE_BORROW_INTEREST_FAILED), 0); + } + + error = vTokenCollateral.accrueInterest(); + if (error != uint(Error.NO_ERROR)) { + // accrueInterest emits logs on errors, but we still want to log the fact that an attempted liquidation failed + return (fail(Error(error), FailureInfo.LIQUIDATE_ACCRUE_COLLATERAL_INTEREST_FAILED), 0); + } + + // liquidateBorrowFresh emits borrow-specific logs on errors, so we don't need to + return liquidateBorrowFresh(payable(msg.sender), borrower, repayAmount, vTokenCollateral); + } + + /** + * @notice The liquidator liquidates the borrowers collateral. + * The collateral seized is transferred to the liquidator. + * @param borrower The borrower of this vToken to be liquidated + * @param liquidator The address repaying the borrow and seizing collateral + * @param vTokenCollateral The market in which to seize collateral from the borrower + * @param repayAmount The amount of the underlying borrowed asset to repay + * @return (uint, uint) An error code (0=success, otherwise a failure, see ErrorReporter.sol), and the actual repayment amount. + */ + // solhint-disable-next-line code-complexity + function liquidateBorrowFresh( + address liquidator, + address borrower, + uint repayAmount, + VTokenInterface vTokenCollateral + ) internal returns (uint, uint) { + /* Fail if liquidate not allowed */ + uint allowed = comptroller.liquidateBorrowAllowed( + address(this), + address(vTokenCollateral), + liquidator, + borrower, + repayAmount + ); + if (allowed != 0) { + return (failOpaque(Error.COMPTROLLER_REJECTION, FailureInfo.LIQUIDATE_COMPTROLLER_REJECTION, allowed), 0); + } + + /* Verify market's block number equals current block number */ + if (accrualBlockNumber != getBlockNumber()) { + return (fail(Error.MARKET_NOT_FRESH, FailureInfo.LIQUIDATE_FRESHNESS_CHECK), 0); + } + + /* Verify vTokenCollateral market's block number equals current block number */ + if (vTokenCollateral.accrualBlockNumber() != getBlockNumber()) { + return (fail(Error.MARKET_NOT_FRESH, FailureInfo.LIQUIDATE_COLLATERAL_FRESHNESS_CHECK), 0); + } + + /* Fail if borrower = liquidator */ + if (borrower == liquidator) { + return (fail(Error.INVALID_ACCOUNT_PAIR, FailureInfo.LIQUIDATE_LIQUIDATOR_IS_BORROWER), 0); + } + + /* Fail if repayAmount = 0 */ + if (repayAmount == 0) { + return (fail(Error.INVALID_CLOSE_AMOUNT_REQUESTED, FailureInfo.LIQUIDATE_CLOSE_AMOUNT_IS_ZERO), 0); + } + + /* Fail if repayAmount = -1 */ + if (repayAmount == type(uint).max) { + return (fail(Error.INVALID_CLOSE_AMOUNT_REQUESTED, FailureInfo.LIQUIDATE_CLOSE_AMOUNT_IS_UINT_MAX), 0); + } + + /* Fail if repayBorrow fails */ + (uint repayBorrowError, uint actualRepayAmount) = repayBorrowFresh(liquidator, borrower, repayAmount); + if (repayBorrowError != uint(Error.NO_ERROR)) { + return (fail(Error(repayBorrowError), FailureInfo.LIQUIDATE_REPAY_BORROW_FRESH_FAILED), 0); + } + + ///////////////////////// + // EFFECTS & INTERACTIONS + // (No safe failures beyond this point) + + /* We calculate the number of collateral tokens that will be seized */ + (uint amountSeizeError, uint seizeTokens) = comptroller.liquidateCalculateSeizeTokens( + address(this), + address(vTokenCollateral), + actualRepayAmount + ); + require(amountSeizeError == uint(Error.NO_ERROR), "LIQUIDATE_COMPTROLLER_CALCULATE_AMOUNT_SEIZE_FAILED"); + + /* Revert if borrower collateral token balance < seizeTokens */ + require(vTokenCollateral.balanceOf(borrower) >= seizeTokens, "LIQUIDATE_SEIZE_TOO_MUCH"); + + // If this is also the collateral, run seizeInternal to avoid re-entrancy, otherwise make an external override call + uint seizeError; + if (address(vTokenCollateral) == address(this)) { + seizeError = seizeInternal(address(this), liquidator, borrower, seizeTokens); + } else { + seizeError = vTokenCollateral.seize(liquidator, borrower, seizeTokens); + } + + /* Revert if seize tokens fails (since we cannot be sure of side effects) */ + require(seizeError == uint(Error.NO_ERROR), "token seizure failed"); + + /* We emit a LiquidateBorrow event */ + emit LiquidateBorrow(liquidator, borrower, actualRepayAmount, address(vTokenCollateral), seizeTokens); + + /* We call the defense hook */ + comptroller.liquidateBorrowVerify( + address(this), + address(vTokenCollateral), + liquidator, + borrower, + actualRepayAmount, + seizeTokens + ); + + return (uint(Error.NO_ERROR), actualRepayAmount); + } + + /** + * @notice Transfers collateral tokens (this market) to the liquidator. + * @dev Called only during an in-kind liquidation, or by liquidateBorrow during the liquidation of another vToken. + * Its absolutely critical to use msg.sender as the seizer vToken and not a parameter. + * @param seizerToken The contract seizing the collateral (i.e. borrowed vToken) + * @param liquidator The account receiving seized collateral + * @param borrower The account having collateral seized + * @param seizeTokens The number of vTokens to seize + * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). + */ + function seizeInternal( + address seizerToken, + address liquidator, + address borrower, + uint seizeTokens + ) internal returns (uint) { + /* Fail if seize not allowed */ + uint allowed = comptroller.seizeAllowed(address(this), seizerToken, liquidator, borrower, seizeTokens); + if (allowed != 0) { + return failOpaque(Error.COMPTROLLER_REJECTION, FailureInfo.LIQUIDATE_SEIZE_COMPTROLLER_REJECTION, allowed); + } + + /* Fail if borrower = liquidator */ + if (borrower == liquidator) { + return fail(Error.INVALID_ACCOUNT_PAIR, FailureInfo.LIQUIDATE_SEIZE_LIQUIDATOR_IS_BORROWER); + } + + MathError mathErr; + uint borrowerTokensNew; + uint liquidatorTokensNew; + + /* + * We calculate the new borrower and liquidator token balances, failing on underflow/overflow: + * borrowerTokensNew = accountTokens[borrower] - seizeTokens + * liquidatorTokensNew = accountTokens[liquidator] + seizeTokens + */ + (mathErr, borrowerTokensNew) = subUInt(accountTokens[borrower], seizeTokens); + if (mathErr != MathError.NO_ERROR) { + return failOpaque(Error.MATH_ERROR, FailureInfo.LIQUIDATE_SEIZE_BALANCE_DECREMENT_FAILED, uint(mathErr)); + } + + (mathErr, liquidatorTokensNew) = addUInt(accountTokens[liquidator], seizeTokens); + if (mathErr != MathError.NO_ERROR) { + return failOpaque(Error.MATH_ERROR, FailureInfo.LIQUIDATE_SEIZE_BALANCE_INCREMENT_FAILED, uint(mathErr)); + } + + ///////////////////////// + // EFFECTS & INTERACTIONS + // (No safe failures beyond this point) + + /* We write the previously calculated values into storage */ + accountTokens[borrower] = borrowerTokensNew; + accountTokens[liquidator] = liquidatorTokensNew; + + /* Emit a Transfer event */ + emit Transfer(borrower, liquidator, seizeTokens); + + /* We call the defense hook */ + comptroller.seizeVerify(address(this), seizerToken, liquidator, borrower, seizeTokens); + + return uint(Error.NO_ERROR); + } + + /** + * @notice Sets a new reserve factor for the protocol (requires fresh interest accrual) + * @dev Admin function to set a new reserve factor + * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). + */ + function _setReserveFactorFresh(uint newReserveFactorMantissa) internal returns (uint) { + // Check caller is admin + if (msg.sender != admin) { + return fail(Error.UNAUTHORIZED, FailureInfo.SET_RESERVE_FACTOR_ADMIN_CHECK); + } + + // Verify market's block number equals current block number + if (accrualBlockNumber != getBlockNumber()) { + return fail(Error.MARKET_NOT_FRESH, FailureInfo.SET_RESERVE_FACTOR_FRESH_CHECK); + } + + // Check newReserveFactor ≤ maxReserveFactor + if (newReserveFactorMantissa > reserveFactorMaxMantissa) { + return fail(Error.BAD_INPUT, FailureInfo.SET_RESERVE_FACTOR_BOUNDS_CHECK); + } + + uint oldReserveFactorMantissa = reserveFactorMantissa; + reserveFactorMantissa = newReserveFactorMantissa; + + emit NewReserveFactor(oldReserveFactorMantissa, newReserveFactorMantissa); + + return uint(Error.NO_ERROR); + } + + /** + * @notice Accrues interest and adds reserves by transferring from `msg.sender` + * @param addAmount Amount of addition to reserves + * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). + */ + function _addReservesInternal(uint addAmount) internal nonReentrant returns (uint) { + uint error = accrueInterest(); + if (error != uint(Error.NO_ERROR)) { + // accrueInterest emits logs on errors, but on top of that we want to log the fact that an attempted reduce reserves failed. + return fail(Error(error), FailureInfo.ADD_RESERVES_ACCRUE_INTEREST_FAILED); + } + + // _addReservesFresh emits reserve-addition-specific logs on errors, so we don't need to. + (error, ) = _addReservesFresh(addAmount); + return error; + } + + /** + * @notice Add reserves by transferring from caller + * @dev Requires fresh interest accrual + * @param addAmount Amount of addition to reserves + * @return (uint, uint) An error code (0=success, otherwise a failure (see ErrorReporter.sol for details)) and the actual amount added, net token fees + */ + function _addReservesFresh(uint addAmount) internal returns (uint, uint) { + // totalReserves + actualAddAmount + uint totalReservesNew; + uint actualAddAmount; + + // We fail gracefully unless market's block number equals current block number + if (accrualBlockNumber != getBlockNumber()) { + return (fail(Error.MARKET_NOT_FRESH, FailureInfo.ADD_RESERVES_FRESH_CHECK), actualAddAmount); + } + + ///////////////////////// + // EFFECTS & INTERACTIONS + // (No safe failures beyond this point) + + /* + * We call doTransferIn for the caller and the addAmount + * Note: The vToken must handle variations between BEP-20 and BNB underlying. + * On success, the vToken holds an additional addAmount of cash. + * doTransferIn reverts if anything goes wrong, since we can't be sure if side effects occurred. + * it returns the amount actually transferred, in case of a fee. + */ + + actualAddAmount = doTransferIn(msg.sender, addAmount); + + totalReservesNew = totalReserves + actualAddAmount; + + /* Revert on overflow */ + require(totalReservesNew >= totalReserves, "add reserves unexpected overflow"); + + // Store reserves[n+1] = reserves[n] + actualAddAmount + totalReserves = totalReservesNew; + + /* Emit NewReserves(admin, actualAddAmount, reserves[n+1]) */ + emit ReservesAdded(msg.sender, actualAddAmount, totalReservesNew); + + /* Return (NO_ERROR, actualAddAmount) */ + return (uint(Error.NO_ERROR), actualAddAmount); + } + + /** + * @notice Reduces reserves by transferring to admin + * @dev Requires fresh interest accrual + * @param reduceAmount Amount of reduction to reserves + * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). + */ + function _reduceReservesFresh(uint reduceAmount) internal returns (uint) { + // totalReserves - reduceAmount + uint totalReservesNew; + + // Check caller is admin + if (msg.sender != admin) { + return fail(Error.UNAUTHORIZED, FailureInfo.REDUCE_RESERVES_ADMIN_CHECK); + } + + // We fail gracefully unless market's block number equals current block number + if (accrualBlockNumber != getBlockNumber()) { + return fail(Error.MARKET_NOT_FRESH, FailureInfo.REDUCE_RESERVES_FRESH_CHECK); + } + + // Fail gracefully if protocol has insufficient underlying cash + if (getCashPrior() < reduceAmount) { + return fail(Error.TOKEN_INSUFFICIENT_CASH, FailureInfo.REDUCE_RESERVES_CASH_NOT_AVAILABLE); + } + + // Check reduceAmount ≤ reserves[n] (totalReserves) + if (reduceAmount > totalReserves) { + return fail(Error.BAD_INPUT, FailureInfo.REDUCE_RESERVES_VALIDATION); + } + + ///////////////////////// + // EFFECTS & INTERACTIONS + // (No safe failures beyond this point) + + totalReservesNew = totalReserves - reduceAmount; + + // Store reserves[n+1] = reserves[n] - reduceAmount + totalReserves = totalReservesNew; + + // doTransferOut reverts if anything goes wrong, since we can't be sure if side effects occurred. + doTransferOut(admin, reduceAmount); + + emit ReservesReduced(admin, reduceAmount, totalReservesNew); + + return uint(Error.NO_ERROR); + } + + /** + * @notice updates the interest rate model (requires fresh interest accrual) + * @dev Admin function to update the interest rate model + * @param newInterestRateModel the new interest rate model to use + * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). + */ + function _setInterestRateModelFresh(InterestRateModel newInterestRateModel) internal returns (uint) { + // Used to store old model for use in the event that is emitted on success + InterestRateModel oldInterestRateModel; + + // Check caller is admin + if (msg.sender != admin) { + return fail(Error.UNAUTHORIZED, FailureInfo.SET_INTEREST_RATE_MODEL_OWNER_CHECK); + } + + // We fail gracefully unless market's block number equals current block number + if (accrualBlockNumber != getBlockNumber()) { + return fail(Error.MARKET_NOT_FRESH, FailureInfo.SET_INTEREST_RATE_MODEL_FRESH_CHECK); + } + + // Track the market's current interest rate model + oldInterestRateModel = interestRateModel; + + // Ensure invoke newInterestRateModel.isInterestRateModel() returns true + require(newInterestRateModel.isInterestRateModel(), "marker method returned false"); + + // Set the interest rate model to newInterestRateModel + interestRateModel = newInterestRateModel; + + // Emit NewMarketInterestRateModel(oldInterestRateModel, newInterestRateModel) + emit NewMarketInterestRateModel(oldInterestRateModel, newInterestRateModel); + + return uint(Error.NO_ERROR); + } + + /*** Safe Token ***/ + + /** + * @dev Performs a transfer in, reverting upon failure. Returns the amount actually transferred to the protocol, in case of a fee. + * This may revert due to insufficient balance or insufficient allowance. + */ + function doTransferIn(address from, uint amount) internal virtual returns (uint) {} + + /** + * @dev Performs a transfer out, ideally returning an explanatory error code upon failure rather than reverting. + * If caller has not called checked protocol's balance, may revert due to insufficient cash held in the contract. + * If caller has checked protocol's balance, and verified it is >= amount, this should not revert in normal conditions. + */ + function doTransferOut(address payable to, uint amount) internal virtual {} + + /** + * @dev Function to simply retrieve block number + * This exists mainly for inheriting test contracts to stub this result. + */ + function getBlockNumber() internal view virtual returns (uint) { + return block.number; + } + + /** + * @notice Return the borrow balance of account based on stored data + * @param account The address whose balance should be calculated + * @return Tuple of error code and the calculated balance or 0 if error code is non-zero + */ + function borrowBalanceStoredInternal(address account) internal view returns (MathError, uint) { + /* Note: we do not assert that the market is up to date */ + MathError mathErr; + uint principalTimesIndex; + uint result; + + /* Get borrowBalance and borrowIndex */ + BorrowSnapshot storage borrowSnapshot = accountBorrows[account]; + + /* If borrowBalance = 0 then borrowIndex is likely also 0. + * Rather than failing the calculation with a division by 0, we immediately return 0 in this case. + */ + if (borrowSnapshot.principal == 0) { + return (MathError.NO_ERROR, 0); + } + + /* Calculate new borrow balance using the interest index: + * recentBorrowBalance = borrower.borrowBalance * market.borrowIndex / borrower.borrowIndex + */ + (mathErr, principalTimesIndex) = mulUInt(borrowSnapshot.principal, borrowIndex); + if (mathErr != MathError.NO_ERROR) { + return (mathErr, 0); + } + + (mathErr, result) = divUInt(principalTimesIndex, borrowSnapshot.interestIndex); + if (mathErr != MathError.NO_ERROR) { + return (mathErr, 0); + } + + return (MathError.NO_ERROR, result); + } + + /** + * @notice Calculates the exchange rate from the underlying to the vToken + * @dev This function does not accrue interest before calculating the exchange rate + * @return Tuple of error code and calculated exchange rate scaled by 1e18 + */ + function exchangeRateStoredInternal() internal view virtual returns (MathError, uint) { + uint _totalSupply = totalSupply; + if (_totalSupply == 0) { + /* + * If there are no tokens minted: + * exchangeRate = initialExchangeRate + */ + return (MathError.NO_ERROR, initialExchangeRateMantissa); + } else { + /* + * Otherwise: + * exchangeRate = (totalCash + totalBorrows - totalReserves) / totalSupply + */ + uint totalCash = getCashPrior(); + uint cashPlusBorrowsMinusReserves; + Exp memory exchangeRate; + MathError mathErr; + + (mathErr, cashPlusBorrowsMinusReserves) = addThenSubUInt(totalCash, totalBorrows, totalReserves); + if (mathErr != MathError.NO_ERROR) { + return (mathErr, 0); + } + + (mathErr, exchangeRate) = getExp(cashPlusBorrowsMinusReserves, _totalSupply); + if (mathErr != MathError.NO_ERROR) { + return (mathErr, 0); + } + + return (MathError.NO_ERROR, exchangeRate.mantissa); + } + } + + /*** Safe Token ***/ + + /** + * @notice Gets balance of this contract in terms of the underlying + * @dev This excludes the value of the current message, if any + * @return The quantity of underlying owned by this contract + */ + function getCashPrior() internal view virtual returns (uint) {} +} diff --git a/contracts/Tokens/V0.8.13/VTokens/VTokenInterfaces.sol b/contracts/Tokens/V0.8.13/VTokens/VTokenInterfaces.sol new file mode 100644 index 000000000..8375d06d7 --- /dev/null +++ b/contracts/Tokens/V0.8.13/VTokens/VTokenInterfaces.sol @@ -0,0 +1,353 @@ +pragma solidity 0.8.13; + +import "../../../Comptroller/V0.8.13/ComptrollerInterface.sol"; +import "../../../InterestRateModels/V0.8.13/InterestRateModel.sol"; + +contract VTokenStorage { + /** + * @notice Container for borrow balance information + * @member principal Total balance (with accrued interest), after applying the most recent balance-changing action + * @member interestIndex Global borrowIndex as of the most recent balance-changing action + */ + struct BorrowSnapshot { + uint principal; + uint interestIndex; + } + + /** + * @dev Guard variable for re-entrancy checks + */ + bool internal _notEntered; + + /** + * @notice EIP-20 token name for this token + */ + string public name; + + /** + * @notice EIP-20 token symbol for this token + */ + string public symbol; + + /** + * @notice EIP-20 token decimals for this token + */ + uint8 public decimals; + + /** + * @notice Maximum borrow rate that can ever be applied (.0005% / block) + */ + + uint internal constant borrowRateMaxMantissa = 0.0005e16; + + /** + * @notice Maximum fraction of interest that can be set aside for reserves + */ + uint internal constant reserveFactorMaxMantissa = 1e18; + + /** + * @notice Administrator for this contract + */ + address payable public admin; + + /** + * @notice Pending administrator for this contract + */ + address payable public pendingAdmin; + + /** + * @notice Contract which oversees inter-vToken operations + */ + ComptrollerInterface public comptroller; + + /** + * @notice Model which tells what the current interest rate should be + */ + InterestRateModel public interestRateModel; + + /** + * @notice Initial exchange rate used when minting the first VTokens (used when totalSupply = 0) + */ + uint internal initialExchangeRateMantissa; + + /** + * @notice Fraction of interest currently set aside for reserves + */ + uint public reserveFactorMantissa; + + /** + * @notice Block number that interest was last accrued at + */ + uint public accrualBlockNumber; + + /** + * @notice Accumulator of the total earned interest rate since the opening of the market + */ + uint public borrowIndex; + + /** + * @notice Total amount of outstanding borrows of the underlying in this market + */ + uint public totalBorrows; + + /** + * @notice Total amount of reserves of the underlying held in this market + */ + uint public totalReserves; + + /** + * @notice Total number of tokens in circulation + */ + uint public totalSupply; + + /** + * @notice Official record of token balances for each account + */ + mapping(address => uint) internal accountTokens; + + /** + * @notice Approved token transfer amounts on behalf of others + */ + mapping(address => mapping(address => uint)) internal transferAllowances; + + /** + * @notice Mapping of account addresses to outstanding borrow balances + */ + mapping(address => BorrowSnapshot) internal accountBorrows; +} + +abstract contract VTokenInterface is VTokenStorage { + /** + * @notice Indicator that this is a vToken contract (for inspection) + */ + bool public constant isVToken = true; + + /*** Market Events ***/ + + /** + * @notice Event emitted when interest is accrued + */ + event AccrueInterest(uint cashPrior, uint interestAccumulated, uint borrowIndex, uint totalBorrows); + + /** + * @notice Event emitted when tokens are minted + */ + event Mint(address minter, uint mintAmount, uint mintTokens); + + /** + * @notice Event emitted when tokens are minted behalf by payer to receiver + */ + event MintBehalf(address payer, address receiver, uint mintAmount, uint mintTokens); + + /** + * @notice Event emitted when tokens are redeemed + */ + event Redeem(address redeemer, uint redeemAmount, uint redeemTokens); + + /** + * @notice Event emitted when tokens are redeemed and fee is transferred + */ + event RedeemFee(address redeemer, uint feeAmount, uint redeemTokens); + + /** + * @notice Event emitted when underlying is borrowed + */ + event Borrow(address borrower, uint borrowAmount, uint accountBorrows, uint totalBorrows); + + /** + * @notice Event emitted when a borrow is repaid + */ + event RepayBorrow(address payer, address borrower, uint repayAmount, uint accountBorrows, uint totalBorrows); + + /** + * @notice Event emitted when a borrow is liquidated + */ + event LiquidateBorrow( + address liquidator, + address borrower, + uint repayAmount, + address vTokenCollateral, + uint seizeTokens + ); + + /*** Admin Events ***/ + + /** + * @notice Event emitted when pendingAdmin is changed + */ + event NewPendingAdmin(address oldPendingAdmin, address newPendingAdmin); + + /** + * @notice Event emitted when pendingAdmin is accepted, which means admin has been updated + */ + event NewAdmin(address oldAdmin, address newAdmin); + + /** + * @notice Event emitted when comptroller is changed + */ + event NewComptroller(ComptrollerInterface oldComptroller, ComptrollerInterface newComptroller); + + /** + * @notice Event emitted when interestRateModel is changed + */ + event NewMarketInterestRateModel(InterestRateModel oldInterestRateModel, InterestRateModel newInterestRateModel); + + /** + * @notice Event emitted when the reserve factor is changed + */ + event NewReserveFactor(uint oldReserveFactorMantissa, uint newReserveFactorMantissa); + + /** + * @notice Event emitted when the reserves are added + */ + event ReservesAdded(address benefactor, uint addAmount, uint newTotalReserves); + + /** + * @notice Event emitted when the reserves are reduced + */ + event ReservesReduced(address admin, uint reduceAmount, uint newTotalReserves); + + /** + * @notice EIP20 Transfer event + */ + event Transfer(address indexed from, address indexed to, uint amount); + + /** + * @notice EIP20 Approval event + */ + event Approval(address indexed owner, address indexed spender, uint amount); + + /** + * @notice Failure event + */ + // event Failure(uint error, uint info, uint detail); + + /*** User Interface ***/ + + function transfer(address dst, uint amount) external virtual returns (bool); + + function transferFrom(address src, address dst, uint amount) external virtual returns (bool); + + function approve(address spender, uint amount) external virtual returns (bool); + + function balanceOfUnderlying(address owner) external virtual returns (uint); + + function totalBorrowsCurrent() external virtual returns (uint); + + function borrowBalanceCurrent(address account) external virtual returns (uint); + + function seize(address liquidator, address borrower, uint seizeTokens) external virtual returns (uint); + + /*** Admin Function ***/ + function _setPendingAdmin(address payable newPendingAdmin) external virtual returns (uint); + + /*** Admin Function ***/ + function _acceptAdmin() external virtual returns (uint); + + /*** Admin Function ***/ + function _setReserveFactor(uint newReserveFactorMantissa) external virtual returns (uint); + + /*** Admin Function ***/ + function _reduceReserves(uint reduceAmount) external virtual returns (uint); + + function balanceOf(address owner) external view virtual returns (uint); + + function allowance(address owner, address spender) external view virtual returns (uint); + + function getAccountSnapshot(address account) external view virtual returns (uint, uint, uint, uint); + + function borrowRatePerBlock() external view virtual returns (uint); + + function supplyRatePerBlock() external view virtual returns (uint); + + function getCash() external view virtual returns (uint); + + function exchangeRateCurrent() public virtual returns (uint); + + function accrueInterest() public virtual returns (uint); + + /*** Admin Function ***/ + function _setComptroller(ComptrollerInterface newComptroller) public virtual returns (uint); + + /*** Admin Function ***/ + function _setInterestRateModel(InterestRateModel newInterestRateModel) public virtual returns (uint); + + function borrowBalanceStored(address account) public view virtual returns (uint); + + function exchangeRateStored() public view virtual returns (uint); +} + +contract VBep20Storage { + /** + * @notice Underlying asset for this VToken + */ + address public underlying; +} + +abstract contract VBep20Interface is VBep20Storage { + /*** User Interface ***/ + + function mint(uint mintAmount) external virtual returns (uint); + + function mintBehalf(address receiver, uint mintAmount) external virtual returns (uint); + + function redeem(uint redeemTokens) external virtual returns (uint); + + function redeemUnderlying(uint redeemAmount) external virtual returns (uint); + + function borrow(uint borrowAmount) external virtual returns (uint); + + function repayBorrow(uint repayAmount) external virtual returns (uint); + + function repayBorrowBehalf(address borrower, uint repayAmount) external virtual returns (uint); + + function liquidateBorrow( + address borrower, + uint repayAmount, + VTokenInterface vTokenCollateral + ) external virtual returns (uint); + + /*** Admin Functions ***/ + + function _addReserves(uint addAmount) external virtual returns (uint); +} + +contract VDelegationStorage { + /** + * @notice Implementation address for this contract + */ + address public implementation; +} + +abstract contract VDelegatorInterface is VDelegationStorage { + /** + * @notice Emitted when implementation is changed + */ + event NewImplementation(address oldImplementation, address newImplementation); + + /** + * @notice Called by the admin to update the implementation of the delegator + * @param implementation_ The address of the new implementation for delegation + * @param allowResign Flag to indicate whether to call _resignImplementation on the old implementation + * @param becomeImplementationData The encoded bytes data to be passed to _becomeImplementation + */ + function _setImplementation( + address implementation_, + bool allowResign, + bytes memory becomeImplementationData + ) public virtual; +} + +abstract contract VDelegateInterface is VDelegationStorage { + /** + * @notice Called by the delegator on a delegate to initialize it for duty + * @dev Should revert if any issues arise which make it unfit for delegation + * @param data The encoded bytes data for any initialization + */ + function _becomeImplementation(bytes memory data) public virtual; + + /** + * @notice Called by the delegator on a delegate to forfeit its responsibility + */ + function _resignImplementation() public virtual; +} diff --git a/contracts/Utils/V0.8.13/Address.sol b/contracts/Utils/V0.8.13/Address.sol new file mode 100644 index 000000000..a1ed9ae9d --- /dev/null +++ b/contracts/Utils/V0.8.13/Address.sol @@ -0,0 +1,73 @@ +pragma solidity 0.8.13; + +/** + * @dev Collection of functions related to the address type + */ +library Address { + /** + * @dev Returns true if `account` is a contract. + * + * [IMPORTANT] + * ==== + * It is unsafe to assume that an address for which this function returns + * false is an externally-owned account (EOA) and not a contract. + * + * Among others, `isContract` will return false for the following + * types of addresses: + * + * - an externally-owned account + * - a contract in construction + * - an address where a contract will be created + * - an address where a contract lived, but was destroyed + * ==== + */ + function isContract(address account) internal view returns (bool) { + // According to EIP-1052, 0x0 is the value returned for not-yet created accounts + // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned + // for accounts without code, i.e. `keccak256('')` + bytes32 codehash; + bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; + // solhint-disable-next-line no-inline-assembly + assembly { + codehash := extcodehash(account) + } + return (codehash != accountHash && codehash != 0x0); + } + + /** + * @dev Converts an `address` into `address payable`. Note that this is + * simply a type cast: the actual underlying value is not changed. + * + * _Available since v2.4.0._ + */ + function toPayable(address account) internal pure returns (address payable) { + return payable(address(uint160(account))); + } + + /** + * @dev Replacement for Solidity's `transfer`: sends `amount` wei to + * `recipient`, forwarding all available gas and reverting on errors. + * + * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost + * of certain opcodes, possibly making contracts go over the 2300 gas limit + * imposed by `transfer`, making them unable to receive funds via + * `transfer`. {sendValue} removes this limitation. + * + * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. + * + * IMPORTANT: because control is transferred to `recipient`, care must be + * taken to not create reentrancy vulnerabilities. Consider using + * {ReentrancyGuard} or the + * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. + * + * _Available since v2.4.0._ + */ + function sendValue(address payable recipient, uint256 amount) internal { + require(address(this).balance >= amount, "Address: insufficient balance"); + + // solhint-disable-next-line avoid-call-value + // solium-disable-next-line security/no-call-value + (bool success, ) = recipient.call{ value: amount }(""); + require(success, "Address: unable to send value, recipient may have reverted"); + } +} diff --git a/contracts/Utils/V0.8.13/CarefulMath.sol b/contracts/Utils/V0.8.13/CarefulMath.sol new file mode 100644 index 000000000..baa99372b --- /dev/null +++ b/contracts/Utils/V0.8.13/CarefulMath.sol @@ -0,0 +1,84 @@ +pragma solidity 0.8.13; + +/** + * @title Careful Math + * @author Venus + * @notice Derived from OpenZeppelin's SafeMath library + * https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/math/SafeMath.sol + */ +contract CarefulMath { + /** + * @dev Possible error codes that we can return + */ + enum MathError { + NO_ERROR, + DIVISION_BY_ZERO, + INTEGER_OVERFLOW, + INTEGER_UNDERFLOW + } + + /** + * @dev Multiplies two numbers, returns an error on overflow. + */ + function mulUInt(uint a, uint b) internal pure returns (MathError, uint) { + if (a == 0) { + return (MathError.NO_ERROR, 0); + } + + uint c = a * b; + + if (c / a != b) { + return (MathError.INTEGER_OVERFLOW, 0); + } else { + return (MathError.NO_ERROR, c); + } + } + + /** + * @dev Integer division of two numbers, truncating the quotient. + */ + function divUInt(uint a, uint b) internal pure returns (MathError, uint) { + if (b == 0) { + return (MathError.DIVISION_BY_ZERO, 0); + } + + return (MathError.NO_ERROR, a / b); + } + + /** + * @dev Subtracts two numbers, returns an error on overflow (i.e. if subtrahend is greater than minuend). + */ + function subUInt(uint a, uint b) internal pure returns (MathError, uint) { + if (b <= a) { + return (MathError.NO_ERROR, a - b); + } else { + return (MathError.INTEGER_UNDERFLOW, 0); + } + } + + /** + * @dev Adds two numbers, returns an error on overflow. + */ + function addUInt(uint a, uint b) internal pure returns (MathError, uint) { + uint c = a + b; + + if (c >= a) { + return (MathError.NO_ERROR, c); + } else { + return (MathError.INTEGER_OVERFLOW, 0); + } + } + + /** + * @dev add a and b and then subtract c + */ + function addThenSubUInt(uint a, uint b, uint c) internal pure returns (MathError, uint) { + (MathError err0, uint sum) = addUInt(a, b); + + if (err0 != MathError.NO_ERROR) { + return (err0, 0); + } + + return subUInt(sum, c); + } +} diff --git a/contracts/Utils/V0.8.13/Context.sol b/contracts/Utils/V0.8.13/Context.sol new file mode 100644 index 000000000..ff604b6bf --- /dev/null +++ b/contracts/Utils/V0.8.13/Context.sol @@ -0,0 +1,26 @@ +pragma solidity 0.8.13; + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + // Empty internal constructor, to prevent people from mistakenly deploying + // an instance of this contract, which should be used via inheritance. + constructor() internal {} + + function _msgSender() internal view returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} diff --git a/contracts/Utils/V0.8.13/ECDSA.sol b/contracts/Utils/V0.8.13/ECDSA.sol new file mode 100644 index 000000000..f919fe4ff --- /dev/null +++ b/contracts/Utils/V0.8.13/ECDSA.sol @@ -0,0 +1,103 @@ +// SPDX-License-Identifier: MIT +// Adapted from OpenZeppelin Contracts v4.3.2 (utils/cryptography/ECDSA.sol) + +// SPDX-Copyright-Text: OpenZeppelin, 2021 +// SPDX-Copyright-Text: Venus, 2021 + +pragma solidity 0.8.13; + +/** + * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. + * + * These functions can be used to verify that a message was signed by the holder + * of the private keys of a given address. + */ +contract ECDSA { + enum RecoverError { + NoError, + InvalidSignature, + InvalidSignatureLength, + InvalidSignatureS, + InvalidSignatureV + } + + function _throwError(RecoverError error) private pure { + if (error == RecoverError.NoError) { + return; // no error: do nothing + } else if (error == RecoverError.InvalidSignature) { + revert("ECDSA: invalid signature"); + } else if (error == RecoverError.InvalidSignatureLength) { + revert("ECDSA: invalid signature length"); + } else if (error == RecoverError.InvalidSignatureS) { + revert("ECDSA: invalid signature 's' value"); + } else if (error == RecoverError.InvalidSignatureV) { + revert("ECDSA: invalid signature 'v' value"); + } + } + + /** + * @dev Returns the address that signed a hashed message (`hash`) with + * `signature`. This address can then be used for verification purposes. + * + * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: + * this function rejects them by requiring the `s` value to be in the lower + * half order, and the `v` value to be either 27 or 28. + * + * IMPORTANT: `hash` _must_ be the result of a hash operation for the + * verification to be secure: it is possible to craft signatures that + * recover to arbitrary addresses for non-hashed data. A safe way to ensure + * this is by receiving a hash of the original message (which may otherwise + * be too long), and then calling {toEthSignedMessageHash} on it. + */ + function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) { + (address recovered, RecoverError error) = tryRecover(hash, v, r, s); + _throwError(error); + return recovered; + } + + /** + * @dev Returns the address that signed a hashed message (`hash`) with + * `signature` or error string. This address can then be used for verification purposes. + * + * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: + * this function rejects them by requiring the `s` value to be in the lower + * half order, and the `v` value to be either 27 or 28. + * + * IMPORTANT: `hash` _must_ be the result of a hash operation for the + * verification to be secure: it is possible to craft signatures that + * recover to arbitrary addresses for non-hashed data. A safe way to ensure + * this is by receiving a hash of the original message (which may otherwise + * be too long), and then calling {toEthSignedMessageHash} on it. + * + * Documentation for signature generation: + * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] + * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] + * + * _Available since v4.3._ + */ + function tryRecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address, RecoverError) { + // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature + // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines + // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most + // signatures from current libraries generate a unique signature with an s-value in the lower half order. + // + // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value + // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or + // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept + // these malleable signatures as well. + if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { + return (address(0), RecoverError.InvalidSignatureS); + } + if (v != 27 && v != 28) { + return (address(0), RecoverError.InvalidSignatureV); + } + + // If the signature is valid (and not malleable), return the signer address + address signer = ecrecover(hash, v, r, s); + if (signer == address(0)) { + return (address(0), RecoverError.InvalidSignature); + } + + return (signer, RecoverError.NoError); + } +} diff --git a/contracts/Utils/V0.8.13/ErrorReporter.sol b/contracts/Utils/V0.8.13/ErrorReporter.sol new file mode 100644 index 000000000..e4b555c88 --- /dev/null +++ b/contracts/Utils/V0.8.13/ErrorReporter.sol @@ -0,0 +1,282 @@ +pragma solidity 0.8.13; + +contract ComptrollerErrorReporter { + enum Error { + NO_ERROR, + UNAUTHORIZED, + COMPTROLLER_MISMATCH, + INSUFFICIENT_SHORTFALL, + INSUFFICIENT_LIQUIDITY, + INVALID_CLOSE_FACTOR, + INVALID_COLLATERAL_FACTOR, + INVALID_LIQUIDATION_INCENTIVE, + MARKET_NOT_ENTERED, // no longer possible + MARKET_NOT_LISTED, + MARKET_ALREADY_LISTED, + MATH_ERROR, + NONZERO_BORROW_BALANCE, + PRICE_ERROR, + REJECTION, + SNAPSHOT_ERROR, + TOO_MANY_ASSETS, + TOO_MUCH_REPAY, + INSUFFICIENT_BALANCE_FOR_VAI + } + + enum FailureInfo { + ACCEPT_ADMIN_PENDING_ADMIN_CHECK, + ACCEPT_PENDING_IMPLEMENTATION_ADDRESS_CHECK, + EXIT_MARKET_BALANCE_OWED, + EXIT_MARKET_REJECTION, + SET_CLOSE_FACTOR_OWNER_CHECK, + SET_CLOSE_FACTOR_VALIDATION, + SET_COLLATERAL_FACTOR_OWNER_CHECK, + SET_COLLATERAL_FACTOR_NO_EXISTS, + SET_COLLATERAL_FACTOR_VALIDATION, + SET_COLLATERAL_FACTOR_WITHOUT_PRICE, + SET_IMPLEMENTATION_OWNER_CHECK, + SET_LIQUIDATION_INCENTIVE_OWNER_CHECK, + SET_LIQUIDATION_INCENTIVE_VALIDATION, + SET_MAX_ASSETS_OWNER_CHECK, + SET_PENDING_ADMIN_OWNER_CHECK, + SET_PENDING_IMPLEMENTATION_OWNER_CHECK, + SET_PRICE_ORACLE_OWNER_CHECK, + SUPPORT_MARKET_EXISTS, + SUPPORT_MARKET_OWNER_CHECK, + SET_PAUSE_GUARDIAN_OWNER_CHECK, + SET_VAI_MINT_RATE_CHECK, + SET_VAICONTROLLER_OWNER_CHECK, + SET_MINTED_VAI_REJECTION, + SET_TREASURY_OWNER_CHECK + } + + /** + * @dev `error` corresponds to enum Error; `info` corresponds to enum FailureInfo, and `detail` is an arbitrary + * contract-specific code that enables us to report opaque error codes from upgradeable contracts. + **/ + event Failure(uint error, uint info, uint detail); + + /** + * @dev use this when reporting a known error from the money market or a non-upgradeable collaborator + */ + function fail(Error err, FailureInfo info) internal returns (uint) { + emit Failure(uint(err), uint(info), 0); + + return uint(err); + } + + /** + * @dev use this when reporting an opaque error from an upgradeable collaborator contract + */ + function failOpaque(Error err, FailureInfo info, uint opaqueError) internal returns (uint) { + emit Failure(uint(err), uint(info), opaqueError); + + return uint(err); + } +} + +contract TokenErrorReporter { + enum Error { + NO_ERROR, + UNAUTHORIZED, + BAD_INPUT, + COMPTROLLER_REJECTION, + COMPTROLLER_CALCULATION_ERROR, + INTEREST_RATE_MODEL_ERROR, + INVALID_ACCOUNT_PAIR, + INVALID_CLOSE_AMOUNT_REQUESTED, + INVALID_COLLATERAL_FACTOR, + MATH_ERROR, + MARKET_NOT_FRESH, + MARKET_NOT_LISTED, + TOKEN_INSUFFICIENT_ALLOWANCE, + TOKEN_INSUFFICIENT_BALANCE, + TOKEN_INSUFFICIENT_CASH, + TOKEN_TRANSFER_IN_FAILED, + TOKEN_TRANSFER_OUT_FAILED, + TOKEN_PRICE_ERROR + } + + /* + * Note: FailureInfo (but not Error) is kept in alphabetical order + * This is because FailureInfo grows significantly faster, and + * the order of Error has some meaning, while the order of FailureInfo + * is entirely arbitrary. + */ + enum FailureInfo { + ACCEPT_ADMIN_PENDING_ADMIN_CHECK, + ACCRUE_INTEREST_ACCUMULATED_INTEREST_CALCULATION_FAILED, + ACCRUE_INTEREST_BORROW_RATE_CALCULATION_FAILED, + ACCRUE_INTEREST_NEW_BORROW_INDEX_CALCULATION_FAILED, + ACCRUE_INTEREST_NEW_TOTAL_BORROWS_CALCULATION_FAILED, + ACCRUE_INTEREST_NEW_TOTAL_RESERVES_CALCULATION_FAILED, + ACCRUE_INTEREST_SIMPLE_INTEREST_FACTOR_CALCULATION_FAILED, + BORROW_ACCUMULATED_BALANCE_CALCULATION_FAILED, + BORROW_ACCRUE_INTEREST_FAILED, + BORROW_CASH_NOT_AVAILABLE, + BORROW_FRESHNESS_CHECK, + BORROW_NEW_TOTAL_BALANCE_CALCULATION_FAILED, + BORROW_NEW_ACCOUNT_BORROW_BALANCE_CALCULATION_FAILED, + BORROW_MARKET_NOT_LISTED, + BORROW_COMPTROLLER_REJECTION, + LIQUIDATE_ACCRUE_BORROW_INTEREST_FAILED, + LIQUIDATE_ACCRUE_COLLATERAL_INTEREST_FAILED, + LIQUIDATE_COLLATERAL_FRESHNESS_CHECK, + LIQUIDATE_COMPTROLLER_REJECTION, + LIQUIDATE_COMPTROLLER_CALCULATE_AMOUNT_SEIZE_FAILED, + LIQUIDATE_CLOSE_AMOUNT_IS_UINT_MAX, + LIQUIDATE_CLOSE_AMOUNT_IS_ZERO, + LIQUIDATE_FRESHNESS_CHECK, + LIQUIDATE_LIQUIDATOR_IS_BORROWER, + LIQUIDATE_REPAY_BORROW_FRESH_FAILED, + LIQUIDATE_SEIZE_BALANCE_INCREMENT_FAILED, + LIQUIDATE_SEIZE_BALANCE_DECREMENT_FAILED, + LIQUIDATE_SEIZE_COMPTROLLER_REJECTION, + LIQUIDATE_SEIZE_LIQUIDATOR_IS_BORROWER, + LIQUIDATE_SEIZE_TOO_MUCH, + MINT_ACCRUE_INTEREST_FAILED, + MINT_COMPTROLLER_REJECTION, + MINT_EXCHANGE_CALCULATION_FAILED, + MINT_EXCHANGE_RATE_READ_FAILED, + MINT_FRESHNESS_CHECK, + MINT_NEW_ACCOUNT_BALANCE_CALCULATION_FAILED, + MINT_NEW_TOTAL_SUPPLY_CALCULATION_FAILED, + MINT_TRANSFER_IN_FAILED, + MINT_TRANSFER_IN_NOT_POSSIBLE, + REDEEM_ACCRUE_INTEREST_FAILED, + REDEEM_COMPTROLLER_REJECTION, + REDEEM_EXCHANGE_TOKENS_CALCULATION_FAILED, + REDEEM_EXCHANGE_AMOUNT_CALCULATION_FAILED, + REDEEM_EXCHANGE_RATE_READ_FAILED, + REDEEM_FRESHNESS_CHECK, + REDEEM_NEW_ACCOUNT_BALANCE_CALCULATION_FAILED, + REDEEM_NEW_TOTAL_SUPPLY_CALCULATION_FAILED, + REDEEM_TRANSFER_OUT_NOT_POSSIBLE, + REDUCE_RESERVES_ACCRUE_INTEREST_FAILED, + REDUCE_RESERVES_ADMIN_CHECK, + REDUCE_RESERVES_CASH_NOT_AVAILABLE, + REDUCE_RESERVES_FRESH_CHECK, + REDUCE_RESERVES_VALIDATION, + REPAY_BEHALF_ACCRUE_INTEREST_FAILED, + REPAY_BORROW_ACCRUE_INTEREST_FAILED, + REPAY_BORROW_ACCUMULATED_BALANCE_CALCULATION_FAILED, + REPAY_BORROW_COMPTROLLER_REJECTION, + REPAY_BORROW_FRESHNESS_CHECK, + REPAY_BORROW_NEW_ACCOUNT_BORROW_BALANCE_CALCULATION_FAILED, + REPAY_BORROW_NEW_TOTAL_BALANCE_CALCULATION_FAILED, + REPAY_BORROW_TRANSFER_IN_NOT_POSSIBLE, + SET_COLLATERAL_FACTOR_OWNER_CHECK, + SET_COLLATERAL_FACTOR_VALIDATION, + SET_COMPTROLLER_OWNER_CHECK, + SET_INTEREST_RATE_MODEL_ACCRUE_INTEREST_FAILED, + SET_INTEREST_RATE_MODEL_FRESH_CHECK, + SET_INTEREST_RATE_MODEL_OWNER_CHECK, + SET_MAX_ASSETS_OWNER_CHECK, + SET_ORACLE_MARKET_NOT_LISTED, + SET_PENDING_ADMIN_OWNER_CHECK, + SET_RESERVE_FACTOR_ACCRUE_INTEREST_FAILED, + SET_RESERVE_FACTOR_ADMIN_CHECK, + SET_RESERVE_FACTOR_FRESH_CHECK, + SET_RESERVE_FACTOR_BOUNDS_CHECK, + TRANSFER_COMPTROLLER_REJECTION, + TRANSFER_NOT_ALLOWED, + TRANSFER_NOT_ENOUGH, + TRANSFER_TOO_MUCH, + ADD_RESERVES_ACCRUE_INTEREST_FAILED, + ADD_RESERVES_FRESH_CHECK, + ADD_RESERVES_TRANSFER_IN_NOT_POSSIBLE, + TOKEN_GET_UNDERLYING_PRICE_ERROR, + REPAY_VAI_COMPTROLLER_REJECTION, + REPAY_VAI_FRESHNESS_CHECK, + VAI_MINT_EXCHANGE_CALCULATION_FAILED, + SFT_MINT_NEW_ACCOUNT_BALANCE_CALCULATION_FAILED, + REDEEM_FEE_CALCULATION_FAILED + } + + /** + * @dev `error` corresponds to enum Error; `info` corresponds to enum FailureInfo, and `detail` is an arbitrary + * contract-specific code that enables us to report opaque error codes from upgradeable contracts. + **/ + event Failure(uint error, uint info, uint detail); + + /** + * @dev use this when reporting a known error from the money market or a non-upgradeable collaborator + */ + function fail(Error err, FailureInfo info) internal returns (uint) { + emit Failure(uint(err), uint(info), 0); + + return uint(err); + } + + /** + * @dev use this when reporting an opaque error from an upgradeable collaborator contract + */ + function failOpaque(Error err, FailureInfo info, uint opaqueError) internal returns (uint) { + emit Failure(uint(err), uint(info), opaqueError); + + return uint(err); + } +} + +contract VAIControllerErrorReporter { + enum Error { + NO_ERROR, + UNAUTHORIZED, + REJECTION, + SNAPSHOT_ERROR, + PRICE_ERROR, + MATH_ERROR, + INSUFFICIENT_BALANCE_FOR_VAI + } + + enum FailureInfo { + SET_PENDING_ADMIN_OWNER_CHECK, + SET_PENDING_IMPLEMENTATION_OWNER_CHECK, + SET_COMPTROLLER_OWNER_CHECK, + ACCEPT_ADMIN_PENDING_ADMIN_CHECK, + ACCEPT_PENDING_IMPLEMENTATION_ADDRESS_CHECK, + VAI_MINT_REJECTION, + VAI_BURN_REJECTION, + VAI_LIQUIDATE_ACCRUE_BORROW_INTEREST_FAILED, + VAI_LIQUIDATE_ACCRUE_COLLATERAL_INTEREST_FAILED, + VAI_LIQUIDATE_COLLATERAL_FRESHNESS_CHECK, + VAI_LIQUIDATE_COMPTROLLER_REJECTION, + VAI_LIQUIDATE_COMPTROLLER_CALCULATE_AMOUNT_SEIZE_FAILED, + VAI_LIQUIDATE_CLOSE_AMOUNT_IS_UINT_MAX, + VAI_LIQUIDATE_CLOSE_AMOUNT_IS_ZERO, + VAI_LIQUIDATE_FRESHNESS_CHECK, + VAI_LIQUIDATE_LIQUIDATOR_IS_BORROWER, + VAI_LIQUIDATE_REPAY_BORROW_FRESH_FAILED, + VAI_LIQUIDATE_SEIZE_BALANCE_INCREMENT_FAILED, + VAI_LIQUIDATE_SEIZE_BALANCE_DECREMENT_FAILED, + VAI_LIQUIDATE_SEIZE_COMPTROLLER_REJECTION, + VAI_LIQUIDATE_SEIZE_LIQUIDATOR_IS_BORROWER, + VAI_LIQUIDATE_SEIZE_TOO_MUCH, + MINT_FEE_CALCULATION_FAILED, + SET_TREASURY_OWNER_CHECK + } + + /** + * @dev `error` corresponds to enum Error; `info` corresponds to enum FailureInfo, and `detail` is an arbitrary + * contract-specific code that enables us to report opaque error codes from upgradeable contracts. + **/ + event Failure(uint error, uint info, uint detail); + + /** + * @dev use this when reporting a known error from the money market or a non-upgradeable collaborator + */ + function fail(Error err, FailureInfo info) internal returns (uint) { + emit Failure(uint(err), uint(info), 0); + + return uint(err); + } + + /** + * @dev use this when reporting an opaque error from an upgradeable collaborator contract + */ + function failOpaque(Error err, FailureInfo info, uint opaqueError) internal returns (uint) { + emit Failure(uint(err), uint(info), opaqueError); + + return uint(err); + } +} diff --git a/contracts/Utils/V0.8.13/Exponential.sol b/contracts/Utils/V0.8.13/Exponential.sol new file mode 100644 index 000000000..304a7e870 --- /dev/null +++ b/contracts/Utils/V0.8.13/Exponential.sol @@ -0,0 +1,181 @@ +pragma solidity 0.8.13; + +import "./CarefulMath.sol"; +import "./ExponentialNoError.sol"; + +/** + * @title Exponential module for storing fixed-precision decimals + * @author Venus + * @notice Exp is a struct which stores decimals with a fixed precision of 18 decimal places. + * Thus, if we wanted to store the 5.1, mantissa would store 5.1e18. That is: + * `Exp({mantissa: 5100000000000000000})`. + */ +contract Exponential is CarefulMath, ExponentialNoError { + /** + * @dev Creates an exponential from numerator and denominator values. + * Note: Returns an error if (`num` * 10e18) > MAX_INT, + * or if `denom` is zero. + */ + function getExp(uint num, uint denom) internal pure returns (MathError, Exp memory) { + (MathError err0, uint scaledNumerator) = mulUInt(num, expScale); + if (err0 != MathError.NO_ERROR) { + return (err0, Exp({ mantissa: 0 })); + } + + (MathError err1, uint rational) = divUInt(scaledNumerator, denom); + if (err1 != MathError.NO_ERROR) { + return (err1, Exp({ mantissa: 0 })); + } + + return (MathError.NO_ERROR, Exp({ mantissa: rational })); + } + + /** + * @dev Adds two exponentials, returning a new exponential. + */ + function addExp(Exp memory a, Exp memory b) internal pure returns (MathError, Exp memory) { + (MathError error, uint result) = addUInt(a.mantissa, b.mantissa); + + return (error, Exp({ mantissa: result })); + } + + /** + * @dev Subtracts two exponentials, returning a new exponential. + */ + function subExp(Exp memory a, Exp memory b) internal pure returns (MathError, Exp memory) { + (MathError error, uint result) = subUInt(a.mantissa, b.mantissa); + + return (error, Exp({ mantissa: result })); + } + + /** + * @dev Multiply an Exp by a scalar, returning a new Exp. + */ + function mulScalar(Exp memory a, uint scalar) internal pure returns (MathError, Exp memory) { + (MathError err0, uint scaledMantissa) = mulUInt(a.mantissa, scalar); + if (err0 != MathError.NO_ERROR) { + return (err0, Exp({ mantissa: 0 })); + } + + return (MathError.NO_ERROR, Exp({ mantissa: scaledMantissa })); + } + + /** + * @dev Multiply an Exp by a scalar, then truncate to return an unsigned integer. + */ + function mulScalarTruncate(Exp memory a, uint scalar) internal pure returns (MathError, uint) { + (MathError err, Exp memory product) = mulScalar(a, scalar); + if (err != MathError.NO_ERROR) { + return (err, 0); + } + + return (MathError.NO_ERROR, truncate(product)); + } + + /** + * @dev Multiply an Exp by a scalar, truncate, then add an to an unsigned integer, returning an unsigned integer. + */ + function mulScalarTruncateAddUInt(Exp memory a, uint scalar, uint addend) internal pure returns (MathError, uint) { + (MathError err, Exp memory product) = mulScalar(a, scalar); + if (err != MathError.NO_ERROR) { + return (err, 0); + } + + return addUInt(truncate(product), addend); + } + + /** + * @dev Divide an Exp by a scalar, returning a new Exp. + */ + function divScalar(Exp memory a, uint scalar) internal pure returns (MathError, Exp memory) { + (MathError err0, uint descaledMantissa) = divUInt(a.mantissa, scalar); + if (err0 != MathError.NO_ERROR) { + return (err0, Exp({ mantissa: 0 })); + } + + return (MathError.NO_ERROR, Exp({ mantissa: descaledMantissa })); + } + + /** + * @dev Divide a scalar by an Exp, returning a new Exp. + */ + function divScalarByExp(uint scalar, Exp memory divisor) internal pure returns (MathError, Exp memory) { + /* + We are doing this as: + getExp(mulUInt(expScale, scalar), divisor.mantissa) + + How it works: + Exp = a / b; + Scalar = s; + `s / (a / b)` = `b * s / a` and since for an Exp `a = mantissa, b = expScale` + */ + (MathError err0, uint numerator) = mulUInt(expScale, scalar); + if (err0 != MathError.NO_ERROR) { + return (err0, Exp({ mantissa: 0 })); + } + return getExp(numerator, divisor.mantissa); + } + + /** + * @dev Divide a scalar by an Exp, then truncate to return an unsigned integer. + */ + function divScalarByExpTruncate(uint scalar, Exp memory divisor) internal pure returns (MathError, uint) { + (MathError err, Exp memory fraction) = divScalarByExp(scalar, divisor); + if (err != MathError.NO_ERROR) { + return (err, 0); + } + + return (MathError.NO_ERROR, truncate(fraction)); + } + + /** + * @dev Multiplies two exponentials, returning a new exponential. + */ + function mulExp(Exp memory a, Exp memory b) internal pure returns (MathError, Exp memory) { + (MathError err0, uint doubleScaledProduct) = mulUInt(a.mantissa, b.mantissa); + if (err0 != MathError.NO_ERROR) { + return (err0, Exp({ mantissa: 0 })); + } + + // We add half the scale before dividing so that we get rounding instead of truncation. + // See "Listing 6" and text above it at https://accu.org/index.php/journals/1717 + // Without this change, a result like 6.6...e-19 will be truncated to 0 instead of being rounded to 1e-18. + (MathError err1, uint doubleScaledProductWithHalfScale) = addUInt(halfExpScale, doubleScaledProduct); + if (err1 != MathError.NO_ERROR) { + return (err1, Exp({ mantissa: 0 })); + } + + (MathError err2, uint product) = divUInt(doubleScaledProductWithHalfScale, expScale); + // The only error `div` can return is MathError.DIVISION_BY_ZERO but we control `expScale` and it is not zero. + assert(err2 == MathError.NO_ERROR); + + return (MathError.NO_ERROR, Exp({ mantissa: product })); + } + + /** + * @dev Multiplies two exponentials given their mantissas, returning a new exponential. + */ + function mulExp(uint a, uint b) internal pure returns (MathError, Exp memory) { + return mulExp(Exp({ mantissa: a }), Exp({ mantissa: b })); + } + + /** + * @dev Multiplies three exponentials, returning a new exponential. + */ + function mulExp3(Exp memory a, Exp memory b, Exp memory c) internal pure returns (MathError, Exp memory) { + (MathError err, Exp memory ab) = mulExp(a, b); + if (err != MathError.NO_ERROR) { + return (err, ab); + } + return mulExp(ab, c); + } + + /** + * @dev Divides two exponentials, returning a new exponential. + * (a/scale) / (b/scale) = (a/scale) * (scale/b) = a/b, + * which we can scale as an Exp by calling getExp(a.mantissa, b.mantissa) + */ + function divExp(Exp memory a, Exp memory b) internal pure returns (MathError, Exp memory) { + return getExp(a.mantissa, b.mantissa); + } +} diff --git a/contracts/Utils/V0.8.13/ExponentialNoError.sol b/contracts/Utils/V0.8.13/ExponentialNoError.sol new file mode 100644 index 000000000..9036400b6 --- /dev/null +++ b/contracts/Utils/V0.8.13/ExponentialNoError.sol @@ -0,0 +1,195 @@ +pragma solidity 0.8.13; + +/** + * @title Exponential module for storing fixed-precision decimals + * @author Compound + * @notice Exp is a struct which stores decimals with a fixed precision of 18 decimal places. + * Thus, if we wanted to store the 5.1, mantissa would store 5.1e18. That is: + * `Exp({mantissa: 5100000000000000000})`. + */ +contract ExponentialNoError { + uint internal constant expScale = 1e18; + uint internal constant doubleScale = 1e36; + uint internal constant halfExpScale = expScale / 2; + uint internal constant mantissaOne = expScale; + + struct Exp { + uint mantissa; + } + + struct Double { + uint mantissa; + } + + /** + * @dev Truncates the given exp to a whole number value. + * For example, truncate(Exp{mantissa: 15 * expScale}) = 15 + */ + function truncate(Exp memory exp) internal pure returns (uint) { + // Note: We are not using careful math here as we're performing a division that cannot fail + return exp.mantissa / expScale; + } + + /** + * @dev Multiply an Exp by a scalar, then truncate to return an unsigned integer. + */ + function mul_ScalarTruncate(Exp memory a, uint scalar) internal pure returns (uint) { + Exp memory product = mul_(a, scalar); + return truncate(product); + } + + /** + * @dev Multiply an Exp by a scalar, truncate, then add an to an unsigned integer, returning an unsigned integer. + */ + function mul_ScalarTruncateAddUInt(Exp memory a, uint scalar, uint addend) internal pure returns (uint) { + Exp memory product = mul_(a, scalar); + return add_(truncate(product), addend); + } + + /** + * @dev Checks if first Exp is less than second Exp. + */ + function lessThanExp(Exp memory left, Exp memory right) internal pure returns (bool) { + return left.mantissa < right.mantissa; + } + + /** + * @dev Checks if left Exp <= right Exp. + */ + function lessThanOrEqualExp(Exp memory left, Exp memory right) internal pure returns (bool) { + return left.mantissa <= right.mantissa; + } + + /** + * @dev Checks if left Exp > right Exp. + */ + function greaterThanExp(Exp memory left, Exp memory right) internal pure returns (bool) { + return left.mantissa > right.mantissa; + } + + /** + * @dev returns true if Exp is exactly zero + */ + function isZeroExp(Exp memory value) internal pure returns (bool) { + return value.mantissa == 0; + } + + function safe224(uint n, string memory errorMessage) internal pure returns (uint224) { + require(n < 2 ** 224, errorMessage); + return uint224(n); + } + + function safe32(uint n, string memory errorMessage) internal pure returns (uint32) { + require(n < 2 ** 32, errorMessage); + return uint32(n); + } + + function add_(Exp memory a, Exp memory b) internal pure returns (Exp memory) { + return Exp({ mantissa: add_(a.mantissa, b.mantissa) }); + } + + function add_(Double memory a, Double memory b) internal pure returns (Double memory) { + return Double({ mantissa: add_(a.mantissa, b.mantissa) }); + } + + function add_(uint a, uint b) internal pure returns (uint) { + return add_(a, b, "addition overflow"); + } + + function add_(uint a, uint b, string memory errorMessage) internal pure returns (uint) { + uint c = a + b; + require(c >= a, errorMessage); + return c; + } + + function sub_(Exp memory a, Exp memory b) internal pure returns (Exp memory) { + return Exp({ mantissa: sub_(a.mantissa, b.mantissa) }); + } + + function sub_(Double memory a, Double memory b) internal pure returns (Double memory) { + return Double({ mantissa: sub_(a.mantissa, b.mantissa) }); + } + + function sub_(uint a, uint b) internal pure returns (uint) { + return sub_(a, b, "subtraction underflow"); + } + + function sub_(uint a, uint b, string memory errorMessage) internal pure returns (uint) { + require(b <= a, errorMessage); + return a - b; + } + + function mul_(Exp memory a, Exp memory b) internal pure returns (Exp memory) { + return Exp({ mantissa: mul_(a.mantissa, b.mantissa) / expScale }); + } + + function mul_(Exp memory a, uint b) internal pure returns (Exp memory) { + return Exp({ mantissa: mul_(a.mantissa, b) }); + } + + function mul_(uint a, Exp memory b) internal pure returns (uint) { + return mul_(a, b.mantissa) / expScale; + } + + function mul_(Double memory a, Double memory b) internal pure returns (Double memory) { + return Double({ mantissa: mul_(a.mantissa, b.mantissa) / doubleScale }); + } + + function mul_(Double memory a, uint b) internal pure returns (Double memory) { + return Double({ mantissa: mul_(a.mantissa, b) }); + } + + function mul_(uint a, Double memory b) internal pure returns (uint) { + return mul_(a, b.mantissa) / doubleScale; + } + + function mul_(uint a, uint b) internal pure returns (uint) { + return mul_(a, b, "multiplication overflow"); + } + + function mul_(uint a, uint b, string memory errorMessage) internal pure returns (uint) { + if (a == 0 || b == 0) { + return 0; + } + uint c = a * b; + require(c / a == b, errorMessage); + return c; + } + + function div_(Exp memory a, Exp memory b) internal pure returns (Exp memory) { + return Exp({ mantissa: div_(mul_(a.mantissa, expScale), b.mantissa) }); + } + + function div_(Exp memory a, uint b) internal pure returns (Exp memory) { + return Exp({ mantissa: div_(a.mantissa, b) }); + } + + function div_(uint a, Exp memory b) internal pure returns (uint) { + return div_(mul_(a, expScale), b.mantissa); + } + + function div_(Double memory a, Double memory b) internal pure returns (Double memory) { + return Double({ mantissa: div_(mul_(a.mantissa, doubleScale), b.mantissa) }); + } + + function div_(Double memory a, uint b) internal pure returns (Double memory) { + return Double({ mantissa: div_(a.mantissa, b) }); + } + + function div_(uint a, Double memory b) internal pure returns (uint) { + return div_(mul_(a, doubleScale), b.mantissa); + } + + function div_(uint a, uint b) internal pure returns (uint) { + return div_(a, b, "divide by zero"); + } + + function div_(uint a, uint b, string memory errorMessage) internal pure returns (uint) { + require(b > 0, errorMessage); + return a / b; + } + + function fraction(uint a, uint b) internal pure returns (Double memory) { + return Double({ mantissa: div_(mul_(a, doubleScale), b) }); + } +} diff --git a/contracts/Utils/V0.8.13/IBEP20.sol b/contracts/Utils/V0.8.13/IBEP20.sol new file mode 100644 index 000000000..4e990eb34 --- /dev/null +++ b/contracts/Utils/V0.8.13/IBEP20.sol @@ -0,0 +1,76 @@ +pragma solidity 0.8.13; + +/** + * @dev Interface of the BEP20 standard as defined in the EIP. Does not include + * the optional functions; to access them see {BEP20Detailed}. + */ +interface IBEP20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} diff --git a/contracts/Utils/V0.8.13/Ownable.sol b/contracts/Utils/V0.8.13/Ownable.sol new file mode 100644 index 000000000..49d9f17ef --- /dev/null +++ b/contracts/Utils/V0.8.13/Ownable.sol @@ -0,0 +1,74 @@ +pragma solidity 0.8.13; + +import "./Context.sol"; + +/** + * @dev Contract module which provides a basic access control mechanism, where + * there is an account (an owner) that can be granted exclusive access to + * specific functions. + * + * By default, the owner account will be the one that deploys the contract. This + * can later be changed with {transferOwnership}. + * + * This module is used through inheritance. It will make available the modifier + * `onlyOwner`, which can be applied to your functions to restrict their use to + * the owner. + */ +abstract contract Ownable is Context { + address private _owner; + + event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); + + /** + * @dev Initializes the contract setting the deployer as the initial owner. + */ + constructor() internal { + address msgSender = _msgSender(); + _owner = msgSender; + emit OwnershipTransferred(address(0), msgSender); + } + + /** + * @dev Returns the address of the current owner. + */ + function owner() public view returns (address) { + return _owner; + } + + /** + * @dev Throws if called by any account other than the owner. + */ + modifier onlyOwner() { + require(_owner == _msgSender(), "Ownable: caller is not the owner"); + _; + } + + /** + * @dev Leaves the contract without owner. It will not be possible to call + * `onlyOwner` functions anymore. Can only be called by the current owner. + * + * NOTE: Renouncing ownership will leave the contract without an owner, + * thereby removing any functionality that is only available to the owner. + */ + function renounceOwnership() public onlyOwner { + emit OwnershipTransferred(_owner, address(0)); + _owner = address(0); + } + + /** + * @dev Transfers ownership of the contract to a new account (`newOwner`). + * Can only be called by the current owner. + */ + function transferOwnership(address newOwner) public onlyOwner { + _transferOwnership(newOwner); + } + + /** + * @dev Transfers ownership of the contract to a new account (`newOwner`). + */ + function _transferOwnership(address newOwner) internal { + require(newOwner != address(0), "Ownable: new owner is the zero address"); + emit OwnershipTransferred(_owner, newOwner); + _owner = newOwner; + } +} diff --git a/contracts/Utils/V0.8.13/Owned.sol b/contracts/Utils/V0.8.13/Owned.sol new file mode 100644 index 000000000..aef4726dd --- /dev/null +++ b/contracts/Utils/V0.8.13/Owned.sol @@ -0,0 +1,21 @@ +pragma solidity 0.8.13; + +contract Owned { + address public owner; + + event OwnershipTransferred(address indexed _from, address indexed _to); + + constructor() public { + owner = msg.sender; + } + + modifier onlyOwner() { + require(msg.sender == owner, "Should be owner"); + _; + } + + function transferOwnership(address newOwner) public onlyOwner { + owner = newOwner; + emit OwnershipTransferred(owner, newOwner); + } +} diff --git a/contracts/Utils/V0.8.13/SafeBEP20.sol b/contracts/Utils/V0.8.13/SafeBEP20.sol new file mode 100644 index 000000000..41ccd3808 --- /dev/null +++ b/contracts/Utils/V0.8.13/SafeBEP20.sol @@ -0,0 +1,80 @@ +pragma solidity 0.8.13; + +import "./SafeMath.sol"; +import "./IBEP20.sol"; +import "./Address.sol"; + +/** + * @title SafeBEP20 + * @dev Wrappers around BEP20 operations that throw on failure (when the token + * contract returns false). Tokens that return no value (and instead revert or + * throw on failure) are also supported, non-reverting calls are assumed to be + * successful. + * To use this library you can add a `using SafeBEP20 for BEP20;` statement to your contract, + * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. + */ +library SafeBEP20 { + using SafeMath for uint256; + using Address for address; + + function safeTransfer(IBEP20 token, address to, uint256 value) internal { + callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); + } + + function safeTransferFrom(IBEP20 token, address from, address to, uint256 value) internal { + callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); + } + + function safeApprove(IBEP20 token, address spender, uint256 value) internal { + // safeApprove should only be called when setting an initial allowance, + // or when resetting it to zero. To increase and decrease it, use + // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' + // solhint-disable-next-line max-line-length + require( + (value == 0) || (token.allowance(address(this), spender) == 0), + "SafeBEP20: approve from non-zero to non-zero allowance" + ); + callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); + } + + function safeIncreaseAllowance(IBEP20 token, address spender, uint256 value) internal { + uint256 newAllowance = token.allowance(address(this), spender).add(value); + callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); + } + + function safeDecreaseAllowance(IBEP20 token, address spender, uint256 value) internal { + uint256 newAllowance = token.allowance(address(this), spender).sub( + value, + "SafeBEP20: decreased allowance below zero" + ); + callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); + } + + /** + * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement + * on the return value: the return value is optional (but if data is returned, it must not be false). + * @param token The token targeted by the call. + * @param data The call data (encoded using abi.encode or one of its variants). + */ + function callOptionalReturn(IBEP20 token, bytes memory data) private { + // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since + // we're implementing it ourselves. + + // A Solidity high level call has three parts: + // 1. The target address is checked to verify it contains contract code + // 2. The call itself is made, and success asserted + // 3. The return value is decoded, which in turn checks the size of the returned data. + // solhint-disable-next-line max-line-length + require(address(token).isContract(), "SafeBEP20: call to non-contract"); + + // solhint-disable-next-line avoid-low-level-calls + (bool success, bytes memory returndata) = address(token).call(data); + require(success, "SafeBEP20: low-level call failed"); + + if (returndata.length > 0) { + // Return data is optional + // solhint-disable-next-line max-line-length + require(abi.decode(returndata, (bool)), "SafeBEP20: BEP20 operation did not succeed"); + } + } +} diff --git a/contracts/Utils/V0.8.13/SafeCast.sol b/contracts/Utils/V0.8.13/SafeCast.sol new file mode 100644 index 000000000..540a54ef9 --- /dev/null +++ b/contracts/Utils/V0.8.13/SafeCast.sol @@ -0,0 +1,207 @@ +pragma solidity 0.8.13; + +/** + * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow + * checks. + * + * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can + * easily result in undesired exploitation or bugs, since developers usually + * assume that overflows raise errors. `SafeCast` restores this intuition by + * reverting the transaction when such an operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + * + * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing + * all math on `uint256` and `int256` and then downcasting. + */ +library SafeCast { + /** + * @dev Returns the downcasted uint128 from uint256, reverting on + * overflow (when the input is greater than largest uint128). + * + * Counterpart to Solidity's `uint128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + */ + function toUint128(uint256 value) internal pure returns (uint128) { + require(value < 2 ** 128, "SafeCast: value doesn't fit in 128 bits"); + return uint128(value); + } + + /** + * @dev Returns the downcasted uint64 from uint256, reverting on + * overflow (when the input is greater than largest uint64). + * + * Counterpart to Solidity's `uint64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + */ + function toUint64(uint256 value) internal pure returns (uint64) { + require(value < 2 ** 64, "SafeCast: value doesn't fit in 64 bits"); + return uint64(value); + } + + /** + * @dev Returns the downcasted uint32 from uint256, reverting on + * overflow (when the input is greater than largest uint32). + * + * Counterpart to Solidity's `uint32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + */ + function toUint32(uint256 value) internal pure returns (uint32) { + require(value < 2 ** 32, "SafeCast: value doesn't fit in 32 bits"); + return uint32(value); + } + + /** + * @dev Returns the downcasted uint16 from uint256, reverting on + * overflow (when the input is greater than largest uint16). + * + * Counterpart to Solidity's `uint16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + */ + function toUint16(uint256 value) internal pure returns (uint16) { + require(value < 2 ** 16, "SafeCast: value doesn't fit in 16 bits"); + return uint16(value); + } + + /** + * @dev Returns the downcasted uint8 from uint256, reverting on + * overflow (when the input is greater than largest uint8). + * + * Counterpart to Solidity's `uint8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + */ + function toUint8(uint256 value) internal pure returns (uint8) { + require(value < 2 ** 8, "SafeCast: value doesn't fit in 8 bits"); + return uint8(value); + } + + /** + * @dev Converts a signed int256 into an unsigned uint256. + * + * Requirements: + * + * - input must be greater than or equal to 0. + */ + function toUint256(int256 value) internal pure returns (uint256) { + require(value >= 0, "SafeCast: value must be positive"); + return uint256(value); + } + + /** + * @dev Returns the downcasted int128 from int256, reverting on + * overflow (when the input is less than smallest int128 or + * greater than largest int128). + * + * Counterpart to Solidity's `int128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + * + * _Available since v3.1._ + */ + function toInt128(int256 value) internal pure returns (int128) { + require(value >= -2 ** 127 && value < 2 ** 127, "SafeCast: value doesn't fit in 128 bits"); + return int128(value); + } + + /** + * @dev Returns the downcasted int64 from int256, reverting on + * overflow (when the input is less than smallest int64 or + * greater than largest int64). + * + * Counterpart to Solidity's `int64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + * + * _Available since v3.1._ + */ + function toInt64(int256 value) internal pure returns (int64) { + require(value >= -2 ** 63 && value < 2 ** 63, "SafeCast: value doesn't fit in 64 bits"); + return int64(value); + } + + /** + * @dev Returns the downcasted int32 from int256, reverting on + * overflow (when the input is less than smallest int32 or + * greater than largest int32). + * + * Counterpart to Solidity's `int32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + * + * _Available since v3.1._ + */ + function toInt32(int256 value) internal pure returns (int32) { + require(value >= -2 ** 31 && value < 2 ** 31, "SafeCast: value doesn't fit in 32 bits"); + return int32(value); + } + + /** + * @dev Returns the downcasted int16 from int256, reverting on + * overflow (when the input is less than smallest int16 or + * greater than largest int16). + * + * Counterpart to Solidity's `int16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + * + * _Available since v3.1._ + */ + function toInt16(int256 value) internal pure returns (int16) { + require(value >= -2 ** 15 && value < 2 ** 15, "SafeCast: value doesn't fit in 16 bits"); + return int16(value); + } + + /** + * @dev Returns the downcasted int8 from int256, reverting on + * overflow (when the input is less than smallest int8 or + * greater than largest int8). + * + * Counterpart to Solidity's `int8` operator. + * + * Requirements: + * + * - input must fit into 8 bits. + * + * _Available since v3.1._ + */ + function toInt8(int256 value) internal pure returns (int8) { + require(value >= -2 ** 7 && value < 2 ** 7, "SafeCast: value doesn't fit in 8 bits"); + return int8(value); + } + + /** + * @dev Converts an unsigned uint256 into a signed int256. + * + * Requirements: + * + * - input must be less than or equal to maxInt256. + */ + function toInt256(uint256 value) internal pure returns (int256) { + require(value < 2 ** 255, "SafeCast: value doesn't fit in an int256"); + return int256(value); + } +} diff --git a/contracts/Utils/V0.8.13/SafeMath.sol b/contracts/Utils/V0.8.13/SafeMath.sol new file mode 100644 index 000000000..2225efbd9 --- /dev/null +++ b/contracts/Utils/V0.8.13/SafeMath.sol @@ -0,0 +1,163 @@ +pragma solidity 0.8.13; + +/** + * @dev Wrappers over Solidity's arithmetic operations with added overflow + * checks. + * + * Arithmetic operations in Solidity wrap on overflow. This can easily result + * in bugs, because programmers usually assume that an overflow raises an + * error, which is the standard behavior in high level programming languages. + * `SafeMath` restores this intuition by reverting the transaction when an + * operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + */ +library SafeMath { + /** + * @dev Returns the addition of two unsigned integers, reverting on + * overflow. + * + * Counterpart to Solidity's `+` operator. + * + * Requirements: + * - Addition cannot overflow. + */ + function add(uint256 a, uint256 b) internal pure returns (uint256) { + return add(a, b, "SafeMath: addition overflow"); + } + + /** + * @dev Returns the subtraction of two unsigned integers, reverting with custom message on + * overflow (when the result is negative). + * + * Counterpart to Solidity's `-` operator. + * + * Requirements: + * - Subtraction cannot overflow. + */ + function add(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { + uint256 c = a + b; + require(c >= a, errorMessage); + + return c; + } + + /** + * @dev Returns the subtraction of two unsigned integers, reverting on + * overflow (when the result is negative). + * + * Counterpart to Solidity's `-` operator. + * + * Requirements: + * - Subtraction cannot overflow. + */ + function sub(uint256 a, uint256 b) internal pure returns (uint256) { + return sub(a, b, "SafeMath: subtraction overflow"); + } + + /** + * @dev Returns the subtraction of two unsigned integers, reverting with custom message on + * overflow (when the result is negative). + * + * Counterpart to Solidity's `-` operator. + * + * Requirements: + * - Subtraction cannot overflow. + */ + function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { + require(b <= a, errorMessage); + uint256 c = a - b; + + return c; + } + + /** + * @dev Returns the multiplication of two unsigned integers, reverting on + * overflow. + * + * Counterpart to Solidity's `*` operator. + * + * Requirements: + * - Multiplication cannot overflow. + */ + function mul(uint256 a, uint256 b) internal pure returns (uint256) { + // Gas optimization: this is cheaper than requiring 'a' not being zero, but the + // benefit is lost if 'b' is also tested. + // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 + if (a == 0) { + return 0; + } + + uint256 c = a * b; + require(c / a == b, "SafeMath: multiplication overflow"); + + return c; + } + + /** + * @dev Returns the integer division of two unsigned integers. Reverts on + * division by zero. The result is rounded towards zero. + * + * Counterpart to Solidity's `/` operator. Note: this function uses a + * `revert` opcode (which leaves remaining gas untouched) while Solidity + * uses an invalid opcode to revert (consuming all remaining gas). + * + * Requirements: + * - The divisor cannot be zero. + */ + function div(uint256 a, uint256 b) internal pure returns (uint256) { + return div(a, b, "SafeMath: division by zero"); + } + + /** + * @dev Returns the integer division of two unsigned integers. Reverts with custom message on + * division by zero. The result is rounded towards zero. + * + * Counterpart to Solidity's `/` operator. Note: this function uses a + * `revert` opcode (which leaves remaining gas untouched) while Solidity + * uses an invalid opcode to revert (consuming all remaining gas). + * + * Requirements: + * - The divisor cannot be zero. + */ + function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { + // Solidity only automatically asserts when dividing by 0 + require(b > 0, errorMessage); + uint256 c = a / b; + // assert(a == b * c + a % b); // There is no case in which this doesn't hold + + return c; + } + + /** + * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), + * Reverts when dividing by zero. + * + * Counterpart to Solidity's `%` operator. This function uses a `revert` + * opcode (which leaves remaining gas untouched) while Solidity uses an + * invalid opcode to revert (consuming all remaining gas). + * + * Requirements: + * - The divisor cannot be zero. + */ + function mod(uint256 a, uint256 b) internal pure returns (uint256) { + return mod(a, b, "SafeMath: modulo by zero"); + } + + /** + * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), + * Reverts with custom message when dividing by zero. + * + * Counterpart to Solidity's `%` operator. This function uses a `revert` + * opcode (which leaves remaining gas untouched) while Solidity uses an + * invalid opcode to revert (consuming all remaining gas). + * + * Requirements: + * - The divisor cannot be zero. + */ + function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { + require(b != 0, errorMessage); + return a % b; + } +} diff --git a/contracts/Utils/V0.8.13/Tokenlock.sol b/contracts/Utils/V0.8.13/Tokenlock.sol new file mode 100644 index 000000000..de3c0d267 --- /dev/null +++ b/contracts/Utils/V0.8.13/Tokenlock.sol @@ -0,0 +1,28 @@ +pragma solidity 0.8.13; + +import "./Owned.sol"; + +contract Tokenlock is Owned { + /// @notice Indicates if token is locked + uint8 internal isLocked = 0; + + event Freezed(); + event UnFreezed(); + + modifier validLock() { + require(isLocked == 0, "Token is locked"); + _; + } + + function freeze() public onlyOwner { + isLocked = 1; + + emit Freezed(); + } + + function unfreeze() public onlyOwner { + isLocked = 0; + + emit UnFreezed(); + } +} From 38996db6af2f003b1b0c6fa3952e3085036a544f Mon Sep 17 00:00:00 2001 From: defcon022 Date: Tue, 28 Mar 2023 18:04:10 +0530 Subject: [PATCH 050/153] Refactored the tests. --- .../hardhat/Comptroller/Diamond/XVSSpeeds.ts | 8 +- .../Comptroller/Diamond/assetListTest.ts | 6 +- .../Comptroller/Diamond/comptrollerTest.ts | 20 ++--- .../liquidateCalculateAmoutSeizeTest.ts | 8 +- .../hardhat/Comptroller/Diamond/pauseTest.ts | 4 +- tests/hardhat/Comptroller/XVSSpeeds.ts | 6 +- tests/hardhat/Comptroller/accessControl.ts | 2 +- tests/hardhat/Comptroller/assetListTest.ts | 6 +- tests/hardhat/Comptroller/comptrollerTest.ts | 18 ++-- .../liquidateCalculateAmountSeizeTest.ts | 8 +- tests/hardhat/Comptroller/pauseTest.ts | 6 +- .../DelegateBorrowers/SwapDebtDelegate.ts | 12 +-- tests/hardhat/EvilXToken.ts | 6 +- tests/hardhat/Fork/diamondTest.ts | 86 ++++++++++++++++--- tests/hardhat/Fork/swapTest.ts | 2 +- tests/hardhat/Lens/Rewards.ts | 12 +-- .../Liquidator/liquidatorHarnessTest.ts | 2 +- tests/hardhat/Liquidator/liquidatorTest.ts | 4 +- .../Liquidator/restrictedLiquidations.ts | 2 +- tests/hardhat/Swap/swapTest.ts | 2 +- tests/hardhat/VAI/VAIController.ts | 2 +- 21 files changed, 142 insertions(+), 80 deletions(-) diff --git a/tests/hardhat/Comptroller/Diamond/XVSSpeeds.ts b/tests/hardhat/Comptroller/Diamond/XVSSpeeds.ts index d66841946..02b8a043f 100644 --- a/tests/hardhat/Comptroller/Diamond/XVSSpeeds.ts +++ b/tests/hardhat/Comptroller/Diamond/XVSSpeeds.ts @@ -2,7 +2,7 @@ import { FakeContract, MockContract, smock } from "@defi-wonderland/smock"; import chai from "chai"; import { ethers, network } from "hardhat"; ​ -import { Comptroller, Comptroller__factory, IAccessControlManager, VToken } from "../../../../typechain"; +import { Comptroller, IAccessControlManager, VToken } from "../../../../typechain"; import { convertToUnit } from "../../../../helpers/utils"; const { deployDiamond } = require("../../../../script/diamond/deploy"); ​ @@ -21,9 +21,9 @@ describe("Comptroller", () => { comptroller = result.unitroller; comptrollerProxy = await ethers.getContractAt("Comptroller", comptroller.address); - accessControl = await smock.fake("AccessControlManager"); - vToken1 = await smock.fake("VToken"); - vToken2 = await smock.fake("VToken"); + accessControl = await smock.fake("IAccessControlManager"); + vToken1 = await smock.fake("contracts/Tokens/V0.8.13/VTokens/VToken.sol:VToken"); + vToken2 = await smock.fake("contracts/Tokens/V0.8.13/VTokens/VToken.sol:VToken"); ​ accessControl.isAllowedToCall.returns(true); vToken1.isVToken.returns(true); diff --git a/tests/hardhat/Comptroller/Diamond/assetListTest.ts b/tests/hardhat/Comptroller/Diamond/assetListTest.ts index b60fee929..68eb58238 100644 --- a/tests/hardhat/Comptroller/Diamond/assetListTest.ts +++ b/tests/hardhat/Comptroller/Diamond/assetListTest.ts @@ -46,13 +46,13 @@ describe("Comptroller: assetListTest", () => { }; async function assetListFixture(): Promise { - const accessControl = await smock.fake("AccessControlManager"); + const accessControl = await smock.fake("IAccessControlManager"); // const ComptrollerFactory = await smock.mock("Comptroller"); const ComptrollerLensFactory = await smock.mock("ComptrollerLens"); const result = await deployDiamond(""); comptroller = result.unitroller; const comptrollerLens = await ComptrollerLensFactory.deploy(); - const oracle = await smock.fake("PriceOracle"); + const oracle = await smock.fake("contracts/Oracle/V0.8.13/PriceOracle.sol:PriceOracle"); accessControl.isAllowedToCall.returns(true); comptrollerProxy = await ethers.getContractAt("Comptroller", comptroller.address); await comptrollerProxy._setAccessControl(accessControl.address); @@ -61,7 +61,7 @@ describe("Comptroller: assetListTest", () => { const names = ["OMG", "ZRX", "BAT", "sketch"]; const [OMG, ZRX, BAT, SKT] = await Promise.all( names.map(async name => { - const vToken = await smock.fake("VBep20Immutable"); + const vToken = await smock.fake("contracts/Tokens/V0.8.13/VTokens/VBep20Immutable.sol:VBep20Immutable"); if (name !== "sketch") { await comptrollerProxy._supportMarket(vToken.address); } diff --git a/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts b/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts index 29541df39..69a264603 100644 --- a/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts +++ b/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts @@ -13,7 +13,7 @@ import { EIP20Interface, IAccessControlManager, PriceOracle, - VToken, + VToken } from "../../../../typechain"; import { ComptrollerErrorReporter } from "../../util/Errors"; @@ -31,8 +31,8 @@ type SimpleComptrollerFixture = { }; async function deploySimpleComptroller(): Promise { - const oracle = await smock.fake("PriceOracle"); - const accessControl = await smock.fake("AccessControlManager"); + const oracle = await smock.fake("contracts/Oracle/V0.8.13/PriceOracle.sol:PriceOracle"); + const accessControl = await smock.fake("IAccessControlManager"); accessControl.isAllowedToCall.returns(true); const ComptrollerLensFactory = await smock.mock("ComptrollerLens"); // const ComptrollerFactory = await smock.mock("Comptroller"); @@ -144,7 +144,7 @@ describe("Comptroller", () => { async function deploy(): Promise { const contracts = await deploySimpleComptroller(); - const newOracle = await smock.fake("PriceOracle"); + const newOracle = await smock.fake("contracts/Oracle/V0.8.13/PriceOracle.sol:PriceOracle"); // comptrollerProxy = await ethers.getContractAt("Comptroller", contracts.comptroller); return { ...contracts, newOracle }; } @@ -231,7 +231,7 @@ describe("Comptroller", () => { async function deploy(): Promise { const contracts = await deploySimpleComptroller(); - const vToken = await smock.fake("VToken"); + const vToken = await smock.fake("contracts/Tokens/V0.8.13/VTokens/VToken.sol:VToken"); vToken.comptroller.returns(contracts.comptroller.address); vToken.isVToken.returns(true); return { vToken, ...contracts }; @@ -281,9 +281,9 @@ describe("Comptroller", () => { async function deploy(): Promise { const contracts = await deploySimpleComptroller(); - const vToken1 = await smock.fake("VToken"); - const vToken2 = await smock.fake("VToken"); - const token = await smock.fake("EIP20Interface"); + const vToken1 = await smock.fake("contracts/Tokens/V0.8.13/VTokens/VToken.sol:VToken"); + const vToken2 = await smock.fake("contracts/Tokens/V0.8.13/VTokens/VToken.sol:VToken"); + const token = await smock.fake("contracts/Tokens/V0.8.13/EIP20Interface.sol:EIP20Interface"); return { ...contracts, vToken1, vToken2, token }; } @@ -333,7 +333,7 @@ describe("Comptroller", () => { async function deploy(): Promise { const contracts = await deploySimpleComptroller(); - const vToken = await smock.fake("VToken"); + const vToken = await smock.fake("contracts/Tokens/V0.8.13/VTokens/VToken.sol:VToken"); await contracts.comptrollerProxy._supportMarket(vToken.address); return { ...contracts, vToken }; } @@ -382,7 +382,7 @@ describe("Comptroller", () => { }); it("reverts if market is not listed", async () => { - const someVToken = await smock.fake("VToken"); + const someVToken = await smock.fake("contracts/Tokens/V0.8.13/VTokens/VToken.sol:VToken"); await expect( comptrollerProxy.mintAllowed(someVToken.address, await root.getAddress(), convertToUnit("1", 18)), ).to.be.revertedWith("market not listed"); diff --git a/tests/hardhat/Comptroller/Diamond/liquidateCalculateAmoutSeizeTest.ts b/tests/hardhat/Comptroller/Diamond/liquidateCalculateAmoutSeizeTest.ts index 36f8c56e1..bc8ffddfd 100644 --- a/tests/hardhat/Comptroller/Diamond/liquidateCalculateAmoutSeizeTest.ts +++ b/tests/hardhat/Comptroller/Diamond/liquidateCalculateAmoutSeizeTest.ts @@ -60,22 +60,22 @@ describe("Comptroller", () => { } async function liquidateFixture(): Promise { - const accessControl = await smock.fake("AccessControlManager"); + const accessControl = await smock.fake("IAccessControlManager"); // const ComptrollerFactory = await smock.mock("Comptroller"); const ComptrollerLensFactory = await smock.mock("ComptrollerLens"); const result = await deployDiamond(""); const comptroller = result.unitroller; comptrollerProxy = await ethers.getContractAt("Comptroller", comptroller.address); const comptrollerLens = await ComptrollerLensFactory.deploy(); - const oracle = await smock.fake("PriceOracle"); + const oracle = await smock.fake("contracts/Oracle/V0.8.13/PriceOracle.sol:PriceOracle"); accessControl.isAllowedToCall.returns(true); await comptrollerProxy._setAccessControl(accessControl.address); await comptrollerProxy._setComptrollerLens(comptrollerLens.address); await comptrollerProxy._setPriceOracle(oracle.address); await comptrollerProxy._setLiquidationIncentive(convertToUnit("1.1", 18)); - const vTokenBorrowed = await smock.fake("VBep20Immutable"); - const vTokenCollateral = await smock.fake("VBep20Immutable"); + const vTokenBorrowed = await smock.fake("contracts/Tokens/V0.8.13/VTokens/VBep20Immutable.sol:VBep20Immutable"); + const vTokenCollateral = await smock.fake("contracts/Tokens/V0.8.13/VTokens/VBep20Immutable.sol:VBep20Immutable"); return { comptrollerProxy, comptrollerLens, oracle, vTokenBorrowed, vTokenCollateral }; } diff --git a/tests/hardhat/Comptroller/Diamond/pauseTest.ts b/tests/hardhat/Comptroller/Diamond/pauseTest.ts index 3220a5567..8e33f89a5 100644 --- a/tests/hardhat/Comptroller/Diamond/pauseTest.ts +++ b/tests/hardhat/Comptroller/Diamond/pauseTest.ts @@ -28,14 +28,14 @@ async function pauseFixture(): Promise { const comptrollerDeployment = result.unitroller; const comptroller = await ethers.getContractAt("Comptroller", comptrollerDeployment.address); await comptroller._setAccessControl(accessControl.address); - const oracle = await smock.fake("PriceOracle"); + const oracle = await smock.fake("contracts/Oracle/V0.8.13/PriceOracle.sol:PriceOracle"); accessControl.isAllowedToCall.returns(true); await comptroller._setPriceOracle(oracle.address); const names = ["OMG", "ZRX", "BAT", "sketch"]; const [OMG, ZRX, BAT, SKT] = await Promise.all( names.map(async name => { - const vToken = await smock.fake("VBep20Immutable"); + const vToken = await smock.fake("contracts/Tokens/V0.8.13/VTokens/VBep20Immutable.sol:VBep20Immutable"); if (name !== "sketch") { await comptroller._supportMarket(vToken.address); } diff --git a/tests/hardhat/Comptroller/XVSSpeeds.ts b/tests/hardhat/Comptroller/XVSSpeeds.ts index 46db8f015..eededa882 100644 --- a/tests/hardhat/Comptroller/XVSSpeeds.ts +++ b/tests/hardhat/Comptroller/XVSSpeeds.ts @@ -17,9 +17,9 @@ describe("Comptroller", () => { beforeEach(async () => { const ComptrollerFactory = await smock.mock("Comptroller"); comptroller = await ComptrollerFactory.deploy(); - accessControl = await smock.fake("AccessControlManager"); - vToken1 = await smock.fake("VToken"); - vToken2 = await smock.fake("VToken"); + accessControl = await smock.fake("IAccessControlManager"); + vToken1 = await smock.fake("contracts/Tokens/VTokens/VToken.sol:VToken"); + vToken2 = await smock.fake("contracts/Tokens/VTokens/VToken.sol:VToken"); await accessControl.isAllowedToCall.returns(true); await vToken1.isVToken.returns(true); diff --git a/tests/hardhat/Comptroller/accessControl.ts b/tests/hardhat/Comptroller/accessControl.ts index d0ca74d5d..6aa1e0ba8 100644 --- a/tests/hardhat/Comptroller/accessControl.ts +++ b/tests/hardhat/Comptroller/accessControl.ts @@ -20,7 +20,7 @@ describe("Comptroller", () => { userAddress = await user.getAddress(); const ComptrollerFactory = await smock.mock("Comptroller"); comptroller = await ComptrollerFactory.deploy(); - accessControl = await smock.fake("AccessControlManager"); + accessControl = await smock.fake("IAccessControlManager"); }); describe("_setAccessControlManager", () => { diff --git a/tests/hardhat/Comptroller/assetListTest.ts b/tests/hardhat/Comptroller/assetListTest.ts index 88b48063f..736d02b2e 100644 --- a/tests/hardhat/Comptroller/assetListTest.ts +++ b/tests/hardhat/Comptroller/assetListTest.ts @@ -44,12 +44,12 @@ describe("assetListTest", () => { }; async function assetListFixture(): Promise { - const accessControl = await smock.fake("AccessControlManager"); + const accessControl = await smock.fake("IAccessControlManager"); const ComptrollerFactory = await smock.mock("Comptroller"); const ComptrollerLensFactory = await smock.mock("ComptrollerLens"); const comptroller = await ComptrollerFactory.deploy(); const comptrollerLens = await ComptrollerLensFactory.deploy(); - const oracle = await smock.fake("PriceOracle"); + const oracle = await smock.fake("contracts/Oracle/PriceOracle.sol:PriceOracle"); accessControl.isAllowedToCall.returns(true); await comptroller._setAccessControl(accessControl.address); await comptroller._setComptrollerLens(comptrollerLens.address); @@ -57,7 +57,7 @@ describe("assetListTest", () => { const names = ["OMG", "ZRX", "BAT", "sketch"]; const [OMG, ZRX, BAT, SKT] = await Promise.all( names.map(async name => { - const vToken = await smock.fake("VBep20Immutable"); + const vToken = await smock.fake("contracts/Tokens/VTokens/VBep20Immutable.sol:VBep20Immutable"); if (name !== "sketch") { await comptroller._supportMarket(vToken.address); } diff --git a/tests/hardhat/Comptroller/comptrollerTest.ts b/tests/hardhat/Comptroller/comptrollerTest.ts index 4b8ca144d..0c51d8370 100644 --- a/tests/hardhat/Comptroller/comptrollerTest.ts +++ b/tests/hardhat/Comptroller/comptrollerTest.ts @@ -29,8 +29,8 @@ type SimpleComptrollerFixture = { }; async function deploySimpleComptroller(): Promise { - const oracle = await smock.fake("PriceOracle"); - const accessControl = await smock.fake("AccessControlManager"); + const oracle = await smock.fake("contracts/Oracle/PriceOracle.sol:PriceOracle"); + const accessControl = await smock.fake("IAccessControlManager"); accessControl.isAllowedToCall.returns(true); const ComptrollerLensFactory = await smock.mock("ComptrollerLens"); const ComptrollerFactory = await smock.mock("Comptroller"); @@ -133,7 +133,7 @@ describe("Comptroller", () => { async function deploy(): Promise { const contracts = await deploySimpleComptroller(); - const newOracle = await smock.fake("PriceOracle"); + const newOracle = await smock.fake("contracts/Oracle/PriceOracle.sol:PriceOracle"); return { ...contracts, newOracle }; } @@ -214,7 +214,7 @@ describe("Comptroller", () => { async function deploy(): Promise { const contracts = await deploySimpleComptroller(); - const vToken = await smock.fake("VToken"); + const vToken = await smock.fake("contracts/Tokens/VTokens/VToken.sol:VToken"); vToken.comptroller.returns(contracts.comptroller.address); vToken.isVToken.returns(true); return { vToken, ...contracts }; @@ -263,9 +263,9 @@ describe("Comptroller", () => { async function deploy(): Promise { const contracts = await deploySimpleComptroller(); - const vToken1 = await smock.fake("VToken"); - const vToken2 = await smock.fake("VToken"); - const token = await smock.fake("EIP20Interface"); + const vToken1 = await smock.fake("contracts/Tokens/VTokens/VToken.sol:VToken"); + const vToken2 = await smock.fake("contracts/Tokens/VTokens/VToken.sol:VToken"); + const token = await smock.fake("contracts/Tokens/EIP20Interface.sol:EIP20Interface"); return { ...contracts, vToken1, vToken2, token }; } @@ -314,7 +314,7 @@ describe("Comptroller", () => { async function deploy(): Promise { const contracts = await deploySimpleComptroller(); - const vToken = await smock.fake("VToken"); + const vToken = await smock.fake("contracts/Tokens/VTokens/VToken.sol:VToken"); await contracts.comptroller._supportMarket(vToken.address); return { ...contracts, vToken }; } @@ -363,7 +363,7 @@ describe("Comptroller", () => { }); it("reverts if market is not listed", async () => { - const someVToken = await smock.fake("VToken"); + const someVToken = await smock.fake("contracts/Tokens/VTokens/VToken.sol:VToken"); await expect( comptroller.mintAllowed(someVToken.address, await root.getAddress(), convertToUnit("1", 18)), ).to.be.revertedWith("market not listed"); diff --git a/tests/hardhat/Comptroller/liquidateCalculateAmountSeizeTest.ts b/tests/hardhat/Comptroller/liquidateCalculateAmountSeizeTest.ts index bc2c08151..5067a6084 100644 --- a/tests/hardhat/Comptroller/liquidateCalculateAmountSeizeTest.ts +++ b/tests/hardhat/Comptroller/liquidateCalculateAmountSeizeTest.ts @@ -55,20 +55,20 @@ describe("Comptroller", () => { } async function liquidateFixture(): Promise { - const accessControl = await smock.fake("AccessControlManager"); + const accessControl = await smock.fake("IAccessControlManager"); const ComptrollerFactory = await smock.mock("Comptroller"); const ComptrollerLensFactory = await smock.mock("ComptrollerLens"); const comptroller = await ComptrollerFactory.deploy(); const comptrollerLens = await ComptrollerLensFactory.deploy(); - const oracle = await smock.fake("PriceOracle"); + const oracle = await smock.fake("contracts/Oracle/PriceOracle.sol:PriceOracle"); accessControl.isAllowedToCall.returns(true); await comptroller._setAccessControl(accessControl.address); await comptroller._setComptrollerLens(comptrollerLens.address); await comptroller._setPriceOracle(oracle.address); await comptroller._setLiquidationIncentive(convertToUnit("1.1", 18)); - const vTokenBorrowed = await smock.fake("VBep20Immutable"); - const vTokenCollateral = await smock.fake("VBep20Immutable"); + const vTokenBorrowed = await smock.fake("contracts/Tokens/V0.8.13/VTokens/VBep20Immutable.sol:VBep20Immutable"); + const vTokenCollateral = await smock.fake("contracts/Tokens/V0.8.13/VTokens/VBep20Immutable.sol:VBep20Immutable"); return { comptroller, comptrollerLens, oracle, vTokenBorrowed, vTokenCollateral }; } diff --git a/tests/hardhat/Comptroller/pauseTest.ts b/tests/hardhat/Comptroller/pauseTest.ts index c62197227..5a4d59220 100644 --- a/tests/hardhat/Comptroller/pauseTest.ts +++ b/tests/hardhat/Comptroller/pauseTest.ts @@ -26,18 +26,18 @@ type PauseFixture = { }; async function pauseFixture(): Promise { - const accessControl = await smock.fake("AccessControlManager"); + const accessControl = await smock.fake("IAccessControlManager"); const ComptrollerFactory = await smock.mock("Comptroller"); const comptroller = await ComptrollerFactory.deploy(); await comptroller._setAccessControl(accessControl.address); - const oracle = await smock.fake("PriceOracle"); + const oracle = await smock.fake("contracts/Oracle/PriceOracle.sol:PriceOracle"); accessControl.isAllowedToCall.returns(true); await comptroller._setPriceOracle(oracle.address); const names = ["OMG", "ZRX", "BAT", "sketch"]; const [OMG, ZRX, BAT, SKT] = await Promise.all( names.map(async name => { - const vToken = await smock.fake("VBep20Immutable"); + const vToken = await smock.fake("contracts/Tokens/VTokens/VBep20Immutable.sol:VBep20Immutable"); if (name !== "sketch") { await comptroller._supportMarket(vToken.address); } diff --git a/tests/hardhat/DelegateBorrowers/SwapDebtDelegate.ts b/tests/hardhat/DelegateBorrowers/SwapDebtDelegate.ts index 165649953..38cab39ea 100644 --- a/tests/hardhat/DelegateBorrowers/SwapDebtDelegate.ts +++ b/tests/hardhat/DelegateBorrowers/SwapDebtDelegate.ts @@ -6,7 +6,7 @@ import { parseUnits } from "ethers/lib/utils"; import { ethers, upgrades } from "hardhat"; import { - Comptroller, + Comptroller, IERC20Upgradeable, PriceOracle, SwapDebtDelegate, @@ -42,13 +42,13 @@ describe("assetListTest", () => { beforeEach(async () => { [owner, borrower] = await ethers.getSigners(); - - priceOracle = await smock.fake("PriceOracle"); - comptroller = await smock.fake("Comptroller"); + priceOracle = await smock.fake("contracts/Oracle/PriceOracle.sol:PriceOracle"); + comptroller = await smock.fake("contracts/Comptroller/Comptroller.sol:Comptroller"); foo = await smock.fake("IERC20Upgradeable"); + bar = await smock.fake("IERC20Upgradeable"); - vFoo = await smock.fake("VBep20"); - vBar = await smock.fake("VBep20"); + vFoo = await smock.fake("contracts/Tokens/VTokens/VBep20.sol:VBep20"); + vBar = await smock.fake("contracts/Tokens/VTokens/VBep20.sol:VBep20"); vFoo.underlying.returns(foo.address); vBar.underlying.returns(bar.address); diff --git a/tests/hardhat/EvilXToken.ts b/tests/hardhat/EvilXToken.ts index a148b4563..6d7f3dc96 100644 --- a/tests/hardhat/EvilXToken.ts +++ b/tests/hardhat/EvilXToken.ts @@ -13,7 +13,7 @@ describe("Evil Token test", async () => { beforeEach(async () => { const [root, account1] = await ethers.getSigners(); - const accessControlMock = await smock.fake("AccessControlManager"); + const accessControlMock = await smock.fake("IAccessControlManager"); accessControlMock.isAllowedToCall.returns(true); user = account1; @@ -81,7 +81,7 @@ describe("Evil Token test", async () => { const vDelegatee1 = await vDelegatee1Factory.deploy(); await vDelegatee1.deployed(); - const vDelegator1Factory = await ethers.getContractFactory("VBep20Delegator"); + const vDelegator1Factory = await ethers.getContractFactory("contracts/Tokens/V0.8.13/VTokens/VBep20Delegator.sol:VBep20Delegator"); const vDelegator1 = await vDelegator1Factory.deploy( underlying1.address, unitroller.address, @@ -110,7 +110,7 @@ describe("Evil Token test", async () => { const vDelegatee2 = await vDelegatee2Factory.deploy(); await vDelegatee2.deployed(); - const vDelegator2Factory = await ethers.getContractFactory("VBep20Delegator"); + const vDelegator2Factory = await ethers.getContractFactory("contracts/Tokens/V0.8.13/VTokens/VBep20Delegator.sol:VBep20Delegator"); const vDelegator2 = await vDelegator2Factory.deploy( underlying2.address, unitroller.address, diff --git a/tests/hardhat/Fork/diamondTest.ts b/tests/hardhat/Fork/diamondTest.ts index 491e1601e..ed5467fb4 100644 --- a/tests/hardhat/Fork/diamondTest.ts +++ b/tests/hardhat/Fork/diamondTest.ts @@ -22,6 +22,7 @@ let owner, unitroller, diamondProxy, // layout variables + oracle, maxAssets, closeFactorMantissa, liquidationIncentiveMantissa, @@ -46,7 +47,9 @@ let owner, treasuryPercent, liquidatorContract, comptrollerLens, - market + market, + venusSupplierIndex, + venusBorrowerIndex const initMainnetUser = async (user: string) => { await impersonateAccount(user); @@ -95,7 +98,7 @@ forking(26713742, () => { /** * sending gas cost to owner * */ - await impersonateAccount(Owner); + impersonateAccount(Owner); owner = await ethers.getSigner(Owner); const [signer] = await ethers.getSigners(); await signer.sendTransaction({ @@ -150,12 +153,16 @@ forking(26713742, () => { }); describe("Verify storage layout", async () => { - it.only("verify all the state before and after upgrade", async () => { + it("verify all the state before and after upgrade", async () => { maxAssets = await unitroller.maxAssets(); const maxAssetsAfterUpgrade = await diamondUnitroller.maxAssets(); expect(maxAssets).to.equal(maxAssetsAfterUpgrade); + // oracle = await unitroller.oracle(); + // const oracelUpgrade = await diamondUnitroller.oracel(); + // expect(oracle).to.equal(oracelUpgrade); + closeFactorMantissa = await unitroller.closeFactorMantissa(); const closeFactorMantissaAfterUpgrade = await diamondUnitroller.closeFactorMantissa(); expect(closeFactorMantissa).to.equal(closeFactorMantissaAfterUpgrade); @@ -256,9 +263,15 @@ forking(26713742, () => { expect(market.isListed).to.equal(marketUpgrade.isListed); expect(market.isVenus).to.equal(marketUpgrade.isVenus); - const venusBorrowSpeeds = await unitroller.venusBorrowSpeeds(vUSDT.address); + // venusBorrowerIndex = await unitroller.venusBorrowerIndex(vBUSD.address,zeroAddr); + // console.log(venusBorrowerIndex,"----- venusBorrowerIndex"); + + // venusSupplierIndex = await unitroller.venusSupplierIndex(vBUSD.address,zeroAddr); + // console.log(venusSupplierIndex,"---- venusSupplierIndex"); + + let venusBorrowSpeeds = await unitroller.venusBorrowSpeeds(vUSDT.address); const venusBorrowSpeedsUpgrade = await diamondUnitroller.venusBorrowSpeeds(vUSDT.address); - const venusSupplySpeeds = await unitroller.venusSupplySpeeds(vUSDT.address); + let venusSupplySpeeds = await unitroller.venusSupplySpeeds(vUSDT.address); const venusSupplySpeedsUpgrade = await diamondUnitroller.venusSupplySpeeds(vUSDT.address); expect(venusBorrowSpeeds).to.equal(venusBorrowSpeedsUpgrade); @@ -270,8 +283,30 @@ forking(26713742, () => { // TODO !! describe("Verify states of diamond Contract", () => { + // describe("Diamond setters", () => { + // it("setting market supply cap", async () => { + // expect(await unitroller.supplyCaps(vBUSD.address)).to.equals(0); + // await unitroller._setMarketSupplyCaps([vBUSD.address], [parseUnits("100000", 18)]); + // expect(await unitroller.supplyCaps(vBUSD.address)).to.equals(parseUnits("100000", 18)); + // }); + + // it("checking PriceOracle", async () => { + // await unitroller._setPriceOracle(oracle.address); + // const oracleAddress = await comptroller.oracle(); + // expect(await unitroller.oracle()).to.equals(oracle.address); + // }); + + // it("setting collateral factor", async () => { + // let data = await unitroller.markets(vBUSD.address); + // expect(data.collateralFactorMantissa).to.equals(0); + // await unitroller._setCollateralFactor(vBUSD.address, parseUnits("0.7", 18)); + // data = await unitroller.markets(vBUSD.address); + // expect(data.collateralFactorMantissa).to.equals(parseUnits("0.7", 18)); + // }); + // }); + describe("Diamond Hooks", () => { - it.only("mint vToken vBUSD", async () => { + it("mint vToken vBUSD", async () => { const vBUSDBalance = await BUSD.balanceOf(vBUSD.address); const usdtHolerBalance = (await BUSD.balanceOf(usdtHolder.address)).toString(); @@ -287,37 +322,64 @@ forking(26713742, () => { expect(newUsdtHolerBalance.toString()).to.equal(parseUnits("8839004217706336575688",0)); }); - it.only("redeem vToken", async () => { - const vBUSDBalance = (await BUSD.balanceOf(vBUSD.address)).toString(); + it("redeem vToken", async () => { + + let vBUSDBalance = (await BUSD.balanceOf(vBUSD.address)).toString(); + let usdtHolerBalance = (await vBUSD.balanceOf(usdtHolder.address)).toString(); + console.log(usdtHolerBalance,"++++") expect(await vBUSD.connect(usdtHolder).redeem(1000)).to.emit(vBUSD,"Redeem"); - const newVBUSDBalance = (await BUSD.balanceOf(vBUSD.address)).toString(); - const newUsdtHolerBalance = (await vBUSD.balanceOf(usdtHolder.address)).toString(); + let newVBUSDBalance = (await BUSD.balanceOf(vBUSD.address)).toString(); + let newUsdtHolerBalance = (await vBUSD.balanceOf(usdtHolder.address)).toString(); + console.log(newUsdtHolerBalance,"++++") expect(Number(vBUSDBalance)).greaterThan(Number(newVBUSDBalance)); expect(newUsdtHolerBalance).to.equal(parseUnits("54755160421016577",0)); }); - it.only("borrow vToken", async () => { + it("borrow vToken", async () => { expect((await BUSD.balanceOf(usdtHolder.address)).toString()).to.equal(parseUnits("8839004217926107052066",0)); expect(await vBUSD.connect(usdtHolder).borrow(1000)).to.emit(vBUSD,"Borrow"); + expect((await BUSD.balanceOf(usdtHolder.address)).toString()).to.equal(parseUnits("8839004217926107053066",0)); }); - it.only("Repay vToken", async () => { + it("Repay vToken", async () => { expect((await BUSD.balanceOf(usdtHolder.address)).toString()).to.equal(parseUnits("8839004217926107053066",0)); + expect(await vBUSD.connect(usdtHolder).borrow(1000)).to.emit(vBUSD,"Borrow"); expect((await BUSD.balanceOf(usdtHolder.address)).toString()).to.equal(parseUnits("8839004217926107054066",0)); expect(await vBUSD.connect(usdtHolder).repayBorrow(1000)).to.emit(vBUSD,"RepayBorrow"); + expect((await BUSD.balanceOf(usdtHolder.address)).toString()).to.equal(parseUnits("8839004217926107053066",0)); }); + + // describe("Diamond Rewards", () => { + // it("grant and claim rewards", async () => { + // await BUSD.connect(usdtHolder).transfer(vBUSD.address, 1000); + // await USDT.connect(usdtHolder).approve(vUSDT.address, 110); + // await vUSDT.connect(usdtHolder).mint(110); + // await vUSDT.connect(usdtHolder).redeem(10); + // await expect(vBUSD.connect(usdtHolder).borrow(10)).to.emit(vBUSD, "Borrow"); + // let borrowBalance; + // [, , borrowBalance] = await vBUSD.getAccountSnapshot(usdtHolder.address); + // expect(borrowBalance).equal(10); + // await BUSD.connect(usdtHolder).approve(vBUSD.address, 10); + // await vBUSD.connect(usdtHolder).repayBorrow(10); + // let xvsS = await unitroller.getXVSAddress(); + + // let vxvsS = await unitroller.getXVSVTokenAddress(); + // XVS = XVS__factory.connect(xvsS, admin); + // XVSV = VToken__factory.connect(vxvsS, admin); + // }); + // }); }); }); } diff --git a/tests/hardhat/Fork/swapTest.ts b/tests/hardhat/Fork/swapTest.ts index a8b0dd42a..6ea23ddcd 100644 --- a/tests/hardhat/Fork/swapTest.ts +++ b/tests/hardhat/Fork/swapTest.ts @@ -84,7 +84,7 @@ async function configureVtoken(underlyingToken: FaucetToken | VBep20Immutable, n const interestRateModel = await InterstRateModel.deploy(parseUnits("1", 12)); await interestRateModel.deployed(); - const vTokenFactory = await ethers.getContractFactory("VBep20Immutable"); + const vTokenFactory = await ethers.getContractFactory("contracts/Tokens/V0.8.13/VTokens/VBep20Immutable.sol:VBep20Immutable"); const vToken = await vTokenFactory.deploy( underlyingToken.address, comptroller.address, diff --git a/tests/hardhat/Lens/Rewards.ts b/tests/hardhat/Lens/Rewards.ts index 77ab9ae9f..4facae4dc 100644 --- a/tests/hardhat/Lens/Rewards.ts +++ b/tests/hardhat/Lens/Rewards.ts @@ -5,12 +5,12 @@ import { BigNumber, Signer } from "ethers"; import { ethers } from "hardhat"; import { convertToUnit } from "../../../helpers/utils"; -import { Comptroller, MockToken, VToken, VenusLens, VenusLens__factory } from "../../../typechain"; +import { Comptroller, FaucetToken, VToken, VenusLens, VenusLens__factory } from "../../../typechain"; let comptroller: FakeContract; let vBUSD: FakeContract; let vWBTC: FakeContract; -let XVS: FakeContract; +let XVS: FakeContract; let account: Signer; let venusLens: MockContract; let startBlock: number; @@ -21,15 +21,15 @@ type RewardsFixtire = { comptroller: FakeContract; vBUSD: FakeContract; vWBTC: FakeContract; - XVS: FakeContract; + XVS: FakeContract; venusLens: MockContract; startBlock: number; }; const rewardsFixture = async (): Promise => { - vBUSD = await smock.fake("VToken"); - vWBTC = await smock.fake("VToken"); - XVS = await smock.fake("MockToken"); + vBUSD = await smock.fake("contracts/Tokens/V0.8.13/VTokens/VToken.sol:VToken"); + vWBTC = await smock.fake("contracts/Tokens/V0.8.13/VTokens/VToken.sol:VToken"); + XVS = await smock.fake("FaucetToken"); const venusLensFactory = await smock.mock("VenusLens"); venusLens = await venusLensFactory.deploy(); comptroller = await smock.fake("Comptroller"); diff --git a/tests/hardhat/Liquidator/liquidatorHarnessTest.ts b/tests/hardhat/Liquidator/liquidatorHarnessTest.ts index fd8bd34e1..53f85e8d1 100644 --- a/tests/hardhat/Liquidator/liquidatorHarnessTest.ts +++ b/tests/hardhat/Liquidator/liquidatorHarnessTest.ts @@ -33,7 +33,7 @@ async function deployLiquidator(): Promise { const comptroller = await smock.fake("Comptroller"); comptroller.liquidationIncentiveMantissa.returns(announcedIncentive); const vBnb = await smock.fake("MockVBNB"); - const vTokenCollateral = await smock.fake("VBep20Immutable"); + const vTokenCollateral = await smock.fake("contracts/Tokens/V0.8.13/VTokens/VBep20Immutable.sol:VBep20Immutable"); const Liquidator = await smock.mock("LiquidatorHarness"); const liquidator = await upgrades.deployProxy(Liquidator, [treasuryPercent], { diff --git a/tests/hardhat/Liquidator/liquidatorTest.ts b/tests/hardhat/Liquidator/liquidatorTest.ts index c1b66a985..a6fe41464 100644 --- a/tests/hardhat/Liquidator/liquidatorTest.ts +++ b/tests/hardhat/Liquidator/liquidatorTest.ts @@ -48,8 +48,8 @@ async function deployLiquidator(): Promise { const borrowedUnderlying = await FaucetToken.deploy(convertToBigInt("100", 18), "USD", 18, "USD"); const vai = await FaucetToken.deploy(convertToBigInt("100", 18), "VAI", 18, "VAI"); const vaiController = await smock.fake("VAIController"); - const vTokenBorrowed = await smock.fake("VBep20Immutable"); - const vTokenCollateral = await smock.fake("VBep20Immutable"); + const vTokenBorrowed = await smock.fake("contracts/Tokens/V0.8.13/VTokens/VBep20Immutable.sol:VBep20Immutable"); + const vTokenCollateral = await smock.fake("contracts/Tokens/V0.8.13/VTokens/VBep20Immutable.sol:VBep20Immutable"); comptroller.liquidationIncentiveMantissa.returns(announcedIncentive); comptroller.vaiController.returns(vaiController.address); diff --git a/tests/hardhat/Liquidator/restrictedLiquidations.ts b/tests/hardhat/Liquidator/restrictedLiquidations.ts index 9ceded1f8..68fdc1d00 100644 --- a/tests/hardhat/Liquidator/restrictedLiquidations.ts +++ b/tests/hardhat/Liquidator/restrictedLiquidations.ts @@ -24,7 +24,7 @@ async function deployLiquidator(): Promise { const comptroller = await smock.fake("Comptroller"); comptroller.liquidationIncentiveMantissa.returns(convertToBigInt("1.1", 18)); const vBnb = await smock.fake("MockVBNB"); - const vBep20 = await smock.fake("VBep20Immutable"); + const vBep20 = await smock.fake("contracts/Tokens/V0.8.13/VTokens/VBep20Immutable.sol:VBep20Immutable"); const Liquidator = await smock.mock("Liquidator"); const liquidator = await upgrades.deployProxy(Liquidator, [treasuryPercentMantissa], { diff --git a/tests/hardhat/Swap/swapTest.ts b/tests/hardhat/Swap/swapTest.ts index d1483e203..4e080e31c 100644 --- a/tests/hardhat/Swap/swapTest.ts +++ b/tests/hardhat/Swap/swapTest.ts @@ -49,7 +49,7 @@ type SwapFixture = { }; async function deploySwapContract(): Promise { - const vToken = await smock.fake("VBep20Immutable"); + const vToken = await smock.fake("contracts/Tokens/V0.8.13/VTokens/VBep20Immutable.sol:VBep20Immutable"); const wBNBFactory = await smock.mock("WBNB"); const wBNB = await wBNBFactory.deploy(); const pancakeFactory = await smock.fake("IPancakeSwapV2Factory"); diff --git a/tests/hardhat/VAI/VAIController.ts b/tests/hardhat/VAI/VAIController.ts index 9f6d1a71b..0cd76e50e 100644 --- a/tests/hardhat/VAI/VAIController.ts +++ b/tests/hardhat/VAI/VAIController.ts @@ -65,7 +65,7 @@ describe("VAIController", async () => { "BEP20 usdt", )) as BEP20Harness; - const accessControl = await smock.fake("AccessControlManager"); + const accessControl = await smock.fake("IAccessControlManager"); accessControl.isAllowedToCall.returns(true); const ComptrollerFactory = await smock.mock("Comptroller"); From 4158bbb7c4bd549eb2f8d58119d91843052d9a96 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Tue, 28 Mar 2023 18:04:34 +0530 Subject: [PATCH 051/153] Refactored diamond deploy script. --- script/diamond/deploy.js | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/script/diamond/deploy.js b/script/diamond/deploy.js index 98367ebc7..fb26d9c7c 100644 --- a/script/diamond/deploy.js +++ b/script/diamond/deploy.js @@ -19,12 +19,7 @@ async function deployDiamond(unitrollerAddress) { const DiamondCutFacet = await ethers.getContractFactory("DiamondCutFacet"); const diamondCutFacet = await DiamondCutFacet.deploy(); await diamondCutFacet.deployed(); - - // deploy Diamond - const Diamond = await ethers.getContractFactory("Diamond"); - const diamond = await Diamond.deploy(contractOwner.address); - await diamond.deployed(); - + if (unitrollerAddress != "") { await impersonateAccount(Owner); unitrollerAdmin = await ethers.getSigner(Owner); @@ -36,10 +31,14 @@ async function deployDiamond(unitrollerAddress) { const signer = await ethers.getSigners(); unitrollerAdmin = signer[0]; } - + + // deploy Diamond + const Diamond = await ethers.getContractFactory("Diamond"); + const diamond = await Diamond.deploy(contractOwner.address, unitroller.address); + await diamond.deployed(); await unitroller.connect(unitrollerAdmin)._setPendingImplementation(diamond.address); - await diamond.connect(unitrollerAdmin)._become(unitroller.address); + await diamond.connect(unitrollerAdmin)._become(); const compProxy = await ethers.getContractAt("Diamond", unitroller.address); From 028693ca5fa8f46dc8059fda6142e1c944b0d128 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Tue, 28 Mar 2023 18:11:55 +0530 Subject: [PATCH 052/153] Added setter facet tests for diamond comptroller. --- contracts/Diamond/facets/MarketFacet.sol | 12 +- tests/hardhat/Fork/diamondTest.ts | 262 +++++++++++++---------- 2 files changed, 163 insertions(+), 111 deletions(-) diff --git a/contracts/Diamond/facets/MarketFacet.sol b/contracts/Diamond/facets/MarketFacet.sol index 4769d8909..0306b2c31 100644 --- a/contracts/Diamond/facets/MarketFacet.sol +++ b/contracts/Diamond/facets/MarketFacet.sol @@ -23,6 +23,14 @@ contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError { return s.accountAssets[account]; } + function venusSupplierIndex(address market, address borrower) external view returns(uint){ + return s.venusSupplierIndex[market][borrower]; + } + + function venusBorrowerIndex(address market, address borrower) external view returns(uint){ + return s.venusBorrowerIndex[market][borrower]; + } + function oracle() external view returns (PriceOracle) { return s.oracle; } @@ -140,7 +148,9 @@ contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError { return s.liquidatorContract; } - + function pauseGuardian() external view returns(address){ + return s.pauseGuardian; + } /// @notice Indicator that this is a Comptroller contract (for inspection) function isComptroller() external pure returns (bool) { diff --git a/tests/hardhat/Fork/diamondTest.ts b/tests/hardhat/Fork/diamondTest.ts index ed5467fb4..d5a69afe9 100644 --- a/tests/hardhat/Fork/diamondTest.ts +++ b/tests/hardhat/Fork/diamondTest.ts @@ -5,7 +5,7 @@ import chai from "chai"; import { parseUnits } from "ethers/lib/utils"; import { ethers, network } from "hardhat"; -import { IERC20Upgradeable, VBep20 } from "../../../typechain"; +import { IERC20Upgradeable, VBep20, VToken__factory, XVS__factory } from "../../../typechain"; const { deployDiamond } = require("../../../script/diamond/deploy"); @@ -22,7 +22,6 @@ let owner, unitroller, diamondProxy, // layout variables - oracle, maxAssets, closeFactorMantissa, liquidationIncentiveMantissa, @@ -35,7 +34,7 @@ let owner, vaiMintRate, vaiController, mintedVAIs, - mintVAIGuardianPaused, + mintVAIGuardianPaused, repayVAIGuardianPaused, protocolPaused, venusVAIVaultRate, @@ -49,7 +48,7 @@ let owner, comptrollerLens, market, venusSupplierIndex, - venusBorrowerIndex + venusBorrowerIndex; const initMainnetUser = async (user: string) => { await impersonateAccount(user); @@ -82,10 +81,12 @@ const forking = (blockNumber: number, fn: () => void) => { forking(26713742, () => { let USDT: IERC20Upgradeable; let BUSD: IERC20Upgradeable; + let XVS: IERC20Upgradeable; let usdtHolder: any; let busdHolder: any; let vBUSD: any; let vUSDT: any; + let vXVS: any; let admin: SignerWithAddress; let diamondUnitroller; @@ -98,7 +99,7 @@ forking(26713742, () => { /** * sending gas cost to owner * */ - impersonateAccount(Owner); + await impersonateAccount(Owner); owner = await ethers.getSigner(Owner); const [signer] = await ethers.getSigners(); await signer.sendTransaction({ @@ -119,7 +120,7 @@ forking(26713742, () => { diamondUnitroller = await ethers.getContractAt("Comptroller", diamondUnitroller.address); busdHolder = await initMainnetUser("0xf977814e90da44bfa03b6295a0616a897441acec"); - usdtHolder = await initMainnetUser("0xf977814e90da44bfa03b6295a0616a897441acec"); + usdtHolder = await initMainnetUser("0xc444949e0054A23c44Fc45789738bdF64aed2391"); [vBUSD, vUSDT] = await Promise.all( [VBUSD, VUSDT].map((address: string) => { @@ -153,16 +154,12 @@ forking(26713742, () => { }); describe("Verify storage layout", async () => { - it("verify all the state before and after upgrade", async () => { + it.only("verify all the state before and after upgrade", async () => { maxAssets = await unitroller.maxAssets(); const maxAssetsAfterUpgrade = await diamondUnitroller.maxAssets(); expect(maxAssets).to.equal(maxAssetsAfterUpgrade); - // oracle = await unitroller.oracle(); - // const oracelUpgrade = await diamondUnitroller.oracel(); - // expect(oracle).to.equal(oracelUpgrade); - closeFactorMantissa = await unitroller.closeFactorMantissa(); const closeFactorMantissaAfterUpgrade = await diamondUnitroller.closeFactorMantissa(); expect(closeFactorMantissa).to.equal(closeFactorMantissaAfterUpgrade); @@ -201,40 +198,40 @@ forking(26713742, () => { vaiController = await unitroller.vaiController(); const vaiControllerUpgrade = await diamondUnitroller.vaiController(); - expect(vaiControllerUpgrade).to.equal(vaiController) + expect(vaiControllerUpgrade).to.equal(vaiController); mintedVAIs = await unitroller.mintedVAIs(busdHolder.address); - unitroller.minte - const mintedVAIsUpgrade = await diamondUnitroller.mintedVAIs(usdtHolder.address); - expect(mintedVAIsUpgrade).to.equal(mintedVAIs) + unitroller.minte; + const mintedVAIsUpgrade = await diamondUnitroller.mintedVAIs(busdHolder.address); + expect(mintedVAIsUpgrade).to.equal(mintedVAIs); mintVAIGuardianPaused = await unitroller.mintVAIGuardianPaused(); - const mintVAIGuardianPausedUpgrade = (await diamondUnitroller. mintVAIGuardianPaused()); - expect(mintVAIGuardianPausedUpgrade).to.equal(mintVAIGuardianPaused) + const mintVAIGuardianPausedUpgrade = await diamondUnitroller.mintVAIGuardianPaused(); + expect(mintVAIGuardianPausedUpgrade).to.equal(mintVAIGuardianPaused); repayVAIGuardianPaused = await unitroller.repayVAIGuardianPaused(); - const repayVAIGuardianPausedUpgrade = (await diamondUnitroller.repayVAIGuardianPaused()); - expect(repayVAIGuardianPausedUpgrade).to.equal(repayVAIGuardianPaused) + const repayVAIGuardianPausedUpgrade = await diamondUnitroller.repayVAIGuardianPaused(); + expect(repayVAIGuardianPausedUpgrade).to.equal(repayVAIGuardianPaused); protocolPaused = await unitroller.protocolPaused(); const protocolPausedUpgrade = await diamondUnitroller.protocolPaused(); - expect(protocolPausedUpgrade).to.equal(protocolPaused) + expect(protocolPausedUpgrade).to.equal(protocolPaused); venusVAIVaultRate = await unitroller.venusVAIVaultRate(); const venusVAIVaultRateUpgrade = await diamondUnitroller.venusVAIVaultRate(); - expect(venusVAIVaultRateUpgrade).to.equal(venusVAIVaultRate) + expect(venusVAIVaultRateUpgrade).to.equal(venusVAIVaultRate); vaiVaultAddress = await unitroller.vaiVaultAddress(); const vaiVaultAddressUpgrade = await diamondUnitroller.vaiVaultAddress(); - expect(vaiVaultAddressUpgrade).to.equal(vaiVaultAddress) + expect(vaiVaultAddressUpgrade).to.equal(vaiVaultAddress); releaseStartBlock = await unitroller.releaseStartBlock(); const releaseStartBlockUpgrade = await diamondUnitroller.releaseStartBlock(); - expect(releaseStartBlockUpgrade).to.equal(releaseStartBlock) + expect(releaseStartBlockUpgrade).to.equal(releaseStartBlock); minReleaseAmount = await unitroller.minReleaseAmount(); const minReleaseAmountUpgrade = await diamondUnitroller.minReleaseAmount(); - expect(minReleaseAmountUpgrade).to.equal(minReleaseAmount) + expect(minReleaseAmountUpgrade).to.equal(minReleaseAmount); treasuryGuardian = await unitroller.treasuryGuardian(); const treasuryGuardianUpgrade = await diamondUnitroller.treasuryGuardian(); @@ -254,7 +251,7 @@ forking(26713742, () => { comptrollerLens = await unitroller.comptrollerLens(); const comptrollerLensUpgrade = await diamondUnitroller.comptrollerLens(); - expect(comptrollerLens).to.equal(comptrollerLensUpgrade) + expect(comptrollerLens).to.equal(comptrollerLensUpgrade); // cheking all public mapingns market = await unitroller.markets(vBUSD.address); @@ -263,124 +260,169 @@ forking(26713742, () => { expect(market.isListed).to.equal(marketUpgrade.isListed); expect(market.isVenus).to.equal(marketUpgrade.isVenus); - // venusBorrowerIndex = await unitroller.venusBorrowerIndex(vBUSD.address,zeroAddr); - // console.log(venusBorrowerIndex,"----- venusBorrowerIndex"); + venusBorrowerIndex = await unitroller.venusBorrowerIndex(vBUSD.address,busdHolder.address); + const venusBorrowerIndexUpgrade = await diamondUnitroller.venusBorrowerIndex(vBUSD.address,busdHolder.address); + expect(venusBorrowerIndex).to.equal(venusBorrowerIndexUpgrade) - // venusSupplierIndex = await unitroller.venusSupplierIndex(vBUSD.address,zeroAddr); - // console.log(venusSupplierIndex,"---- venusSupplierIndex"); + venusSupplierIndex = await unitroller.venusSupplierIndex(vBUSD.address,busdHolder.address); + const venusSupplierIndexUpgrade = await diamondUnitroller.venusSupplierIndex(vBUSD.address,busdHolder.address); + expect(venusSupplierIndex).to.equal(venusSupplierIndexUpgrade) - let venusBorrowSpeeds = await unitroller.venusBorrowSpeeds(vUSDT.address); - const venusBorrowSpeedsUpgrade = await diamondUnitroller.venusBorrowSpeeds(vUSDT.address); - let venusSupplySpeeds = await unitroller.venusSupplySpeeds(vUSDT.address); - const venusSupplySpeedsUpgrade = await diamondUnitroller.venusSupplySpeeds(vUSDT.address); + const venusBorrowSpeeds = await unitroller.venusBorrowSpeeds(vUSDT.address); + const venusBorrowSpeedsUpgrade = await diamondUnitroller.venusBorrowSpeeds(vUSDT.address); + const venusSupplySpeeds = await unitroller.venusSupplySpeeds(vUSDT.address); + const venusSupplySpeedsUpgrade = await diamondUnitroller.venusSupplySpeeds(vUSDT.address); expect(venusBorrowSpeeds).to.equal(venusBorrowSpeedsUpgrade); expect(venusSupplySpeeds).to.equal(venusSupplySpeedsUpgrade); - }); }); }); // TODO !! describe("Verify states of diamond Contract", () => { - // describe("Diamond setters", () => { - // it("setting market supply cap", async () => { - // expect(await unitroller.supplyCaps(vBUSD.address)).to.equals(0); - // await unitroller._setMarketSupplyCaps([vBUSD.address], [parseUnits("100000", 18)]); - // expect(await unitroller.supplyCaps(vBUSD.address)).to.equals(parseUnits("100000", 18)); - // }); - - // it("checking PriceOracle", async () => { - // await unitroller._setPriceOracle(oracle.address); - // const oracleAddress = await comptroller.oracle(); - // expect(await unitroller.oracle()).to.equals(oracle.address); - // }); - - // it("setting collateral factor", async () => { - // let data = await unitroller.markets(vBUSD.address); - // expect(data.collateralFactorMantissa).to.equals(0); - // await unitroller._setCollateralFactor(vBUSD.address, parseUnits("0.7", 18)); - // data = await unitroller.markets(vBUSD.address); - // expect(data.collateralFactorMantissa).to.equals(parseUnits("0.7", 18)); - // }); - // }); + describe("Diamond setters", () => { + it("setting market supply cap", async () => { + const currentSupplyCap = (await diamondUnitroller.supplyCaps(vBUSD.address)).toString(); + await diamondUnitroller.connect(owner)._setMarketSupplyCaps([vBUSD.address], [parseUnits("100000", 18)]); + expect(await diamondUnitroller.supplyCaps(vBUSD.address)).to.equals(parseUnits("100000", 18)); + await diamondUnitroller + .connect(owner) + ._setMarketSupplyCaps([vBUSD.address], [parseUnits(currentSupplyCap, 0)]); + expect(await diamondUnitroller.supplyCaps(vBUSD.address)).to.equals(parseUnits(currentSupplyCap, 0)); + }); - describe("Diamond Hooks", () => { - it("mint vToken vBUSD", async () => { - const vBUSDBalance = await BUSD.balanceOf(vBUSD.address); - const usdtHolerBalance = (await BUSD.balanceOf(usdtHolder.address)).toString(); + it("setting close factor", async () => { + const currentCloseFactor = (await diamondUnitroller.closeFactorMantissa()).toString(); + await diamondUnitroller.connect(owner)._setCloseFactor(parseUnits("10000", 18)); + expect(await diamondUnitroller.closeFactorMantissa()).to.equals(parseUnits("10000", 18)); + await diamondUnitroller.connect(owner)._setCloseFactor(parseUnits(currentCloseFactor, 0)); + expect(await diamondUnitroller.closeFactorMantissa()).to.equals(parseUnits(currentCloseFactor, 0)); + }); - expect(vBUSDBalance.toString()).to.equal(parseUnits("15088539659055255125122602",0)); - expect(usdtHolerBalance.toString()).to.equal(parseUnits("8839004217706336576688",0)); + it("setting collateral factor", async () => { + await diamondUnitroller.connect(owner)._setCollateralFactor(vUSDT.address,2); + market =(await diamondUnitroller.markets(vUSDT.address)); + expect(market.collateralFactorMantissa).to.equal(2); - expect(await vBUSD.connect(usdtHolder).mint(1000)).to.emit(vBUSD, "Mint"); + await diamondUnitroller.connect(owner)._setCollateralFactor(vUSDT.address,parseUnits("8",17)); + market =(await diamondUnitroller.markets(vUSDT.address)); + expect(market.collateralFactorMantissa).to.equal(parseUnits("8",17)); + }); - const newvBUSDBalance = await BUSD.balanceOf(vBUSD.address); - const newUsdtHolerBalance = await BUSD.balanceOf(usdtHolder.address); + it("setting setting Liquidation Incentive",async () => { + // console.log((await diamondUnitroller.liquidationIncentiveMantissa()).toString()); + + await diamondUnitroller.connect(owner)._setLiquidationIncentive(parseUnits("13",17)); + expect(await diamondUnitroller.liquidationIncentiveMantissa()).to.equal(parseUnits("13",17)); + + await diamondUnitroller.connect(owner)._setLiquidationIncentive(parseUnits("11",17)); + expect(await diamondUnitroller.liquidationIncentiveMantissa()).to.equal(parseUnits("11",17)); + }) + + it("setting Pause Guardian",async () => { + const currentPauseGuardia = (await diamondUnitroller.pauseGuardian()).toString(); + + await diamondUnitroller.connect(owner)._setPauseGuardian(owner.address); + expect(await diamondUnitroller.pauseGuardian()).to.equal(owner.address) + + await diamondUnitroller.connect(owner)._setPauseGuardian(currentPauseGuardia); + expect(await diamondUnitroller.pauseGuardian()).to.equal(currentPauseGuardia) + }) + + it("setting market borrow cap",async () => { + const currentBorrowCap = (await diamondUnitroller.borrowCaps(vUSDT.address)).toString(); + await diamondUnitroller.connect(owner)._setMarketBorrowCaps([vUSDT.address], [parseUnits("10000",18)]); + expect(await diamondUnitroller.borrowCaps(vUSDT.address)).to.equal(parseUnits("10000",18)); + + await diamondUnitroller.connect(owner)._setMarketBorrowCaps([vUSDT.address], [currentBorrowCap]); + expect(await diamondUnitroller.borrowCaps(vUSDT.address)).to.equal(currentBorrowCap) + }) + + it("pausing mint action in vUSDT", async () => { + // let data = await unitroller.markets(vBUSD.address); + // expect(data.collateralFactorMantissa).to.equals(0); + console.log((await diamondUnitroller.supplyCaps(vBUSD.address)).toString(), "second"); + expect(await diamondUnitroller.connect(owner)._setActionsPaused([vBUSD.address],[0],true)).to.emit(vBUSD,"ActionPausedMarket"); + + expect(await diamondUnitroller.connect(owner)._setActionsPaused([vBUSD.address],[0],false)).to.emit(vBUSD,"ActionPausedMarket"); - expect(newvBUSDBalance.toString()).to.equal(parseUnits("15088539659055255125123602",0)); - expect(newUsdtHolerBalance.toString()).to.equal(parseUnits("8839004217706336575688",0)); + // expect(await vBUSD.connect(usdtHolder).mint(1000)).to.be.reverted("action is paused") }); + }); - it("redeem vToken", async () => { - - let vBUSDBalance = (await BUSD.balanceOf(vBUSD.address)).toString(); - let usdtHolerBalance = (await vBUSD.balanceOf(usdtHolder.address)).toString(); - console.log(usdtHolerBalance,"++++") - - expect(await vBUSD.connect(usdtHolder).redeem(1000)).to.emit(vBUSD,"Redeem"); + describe("Diamond Hooks", () => { + it("mint vToken vBUSD", async () => { + const vBUSDBalance = await BUSD.balanceOf(vBUSD.address); + const busdHolerBalance = (await BUSD.balanceOf(busdHolder.address)); + expect(await vBUSD.connect(busdHolder).mint(1000)).to.emit(vBUSD, "Mint"); - let newVBUSDBalance = (await BUSD.balanceOf(vBUSD.address)).toString(); - let newUsdtHolerBalance = (await vBUSD.balanceOf(usdtHolder.address)).toString(); - console.log(newUsdtHolerBalance,"++++") + const newvBUSDBalance = await BUSD.balanceOf(vBUSD.address); + const newBusdHolerBalance = await BUSD.balanceOf(busdHolder.address); + expect(newvBUSDBalance.toString()).to.equal(vBUSDBalance.add(1000)); + expect(newBusdHolerBalance.toString()).to.equal(busdHolerBalance.sub(1000)); + }); + + it("redeem vToken", async () => { + const vBUSDBalance = (await BUSD.balanceOf(vBUSD.address)).toString(); + const busdHolderBalance = (await vBUSD.balanceOf(busdHolder.address)); + expect(await vBUSD.connect(busdHolder).redeem(1000)).to.emit(vBUSD, "Redeem"); + const newVBUSDBalance = (await BUSD.balanceOf(vBUSD.address)).toString(); + const newBusdHolerBalance = (await vBUSD.balanceOf(busdHolder.address)).toString(); expect(Number(vBUSDBalance)).greaterThan(Number(newVBUSDBalance)); - expect(newUsdtHolerBalance).to.equal(parseUnits("54755160421016577",0)); - + expect(newBusdHolerBalance).to.equal(busdHolderBalance.sub(1000)); + + const vUSDTBalance = (await USDT.balanceOf(vUSDT.address)).toString(); + const usdtHolderBalance = (await vUSDT.balanceOf(usdtHolder.address)); + expect(await vUSDT.connect(usdtHolder).redeem(1000)).to.emit(vUSDT, "Redeem"); + const newVUSDTBalance = (await USDT.balanceOf(vUSDT.address)).toString(); + const newUsdtHolerBalance = (await vUSDT.balanceOf(usdtHolder.address)).toString(); + expect(Number(vUSDTBalance)).greaterThan(Number(newVUSDTBalance)); + expect(newUsdtHolerBalance).to.equal(usdtHolderBalance.sub(1000)); }); it("borrow vToken", async () => { - expect((await BUSD.balanceOf(usdtHolder.address)).toString()).to.equal(parseUnits("8839004217926107052066",0)); - - expect(await vBUSD.connect(usdtHolder).borrow(1000)).to.emit(vBUSD,"Borrow"); - - expect((await BUSD.balanceOf(usdtHolder.address)).toString()).to.equal(parseUnits("8839004217926107053066",0)); + const busdUserBal = (await BUSD.balanceOf(busdHolder.address)); + expect(await vBUSD.connect(busdHolder).borrow(1000)).to.emit(vBUSD, "Borrow"); + expect((await BUSD.balanceOf(busdHolder.address)).toString()).to.equal(busdUserBal.add(1000)); + const usdtUserBal = (await BUSD.balanceOf(usdtHolder.address)); + expect(await vBUSD.connect(usdtHolder).borrow(1000)).to.emit(vBUSD, "Borrow"); + expect((await BUSD.balanceOf(usdtHolder.address)).toString()).to.equal(usdtUserBal.add(1000)); + }); it("Repay vToken", async () => { - expect((await BUSD.balanceOf(usdtHolder.address)).toString()).to.equal(parseUnits("8839004217926107053066",0)); - - expect(await vBUSD.connect(usdtHolder).borrow(1000)).to.emit(vBUSD,"Borrow"); + const busdUserBal = (await BUSD.balanceOf(busdHolder.address)); + expect(await vBUSD.connect(busdHolder).borrow(1000)).to.emit(vBUSD, "Borrow"); + expect((await BUSD.balanceOf(busdHolder.address)).toString()).to.equal( + busdUserBal.add(1000) + ); + + expect(await vBUSD.connect(busdHolder).repayBorrow(1000)).to.emit(vBUSD, "RepayBorrow"); + expect((await BUSD.balanceOf(busdHolder.address)).toString()).to.equal( + busdUserBal, + ); + }); - expect((await BUSD.balanceOf(usdtHolder.address)).toString()).to.equal(parseUnits("8839004217926107054066",0)); + describe("Diamond Rewards", () => { + it.only("grant and claim rewards", async () => { + let xvsOwner = "0x3a3284dc0faffb0b5f0d074c4c704d14326c98cf"; + await impersonateAccount(xvsOwner); + const xvsAdmin = await ethers.getSigner(xvsOwner); - expect(await vBUSD.connect(usdtHolder).repayBorrow(1000)).to.emit(vBUSD,"RepayBorrow"); + let vXVSAddress = await unitroller.getXVSVTokenAddress(); + let XVSAddress = await unitroller.getXVSAddress(); + XVS = XVS__factory.connect(XVSAddress, xvsAdmin); + vXVS = VToken__factory.connect(vXVSAddress, admin); - expect((await BUSD.balanceOf(usdtHolder.address)).toString()).to.equal(parseUnits("8839004217926107053066",0)); + console.log((await XVS.connect(busdHolder).balanceOf(busdHolder.address)).toString()); + // await diamondUnitroller.claimVenus(busdHolder.address,[vBUSD.address]); + }); }); - - // describe("Diamond Rewards", () => { - // it("grant and claim rewards", async () => { - // await BUSD.connect(usdtHolder).transfer(vBUSD.address, 1000); - // await USDT.connect(usdtHolder).approve(vUSDT.address, 110); - // await vUSDT.connect(usdtHolder).mint(110); - // await vUSDT.connect(usdtHolder).redeem(10); - // await expect(vBUSD.connect(usdtHolder).borrow(10)).to.emit(vBUSD, "Borrow"); - // let borrowBalance; - // [, , borrowBalance] = await vBUSD.getAccountSnapshot(usdtHolder.address); - // expect(borrowBalance).equal(10); - // await BUSD.connect(usdtHolder).approve(vBUSD.address, 10); - // await vBUSD.connect(usdtHolder).repayBorrow(10); - // let xvsS = await unitroller.getXVSAddress(); - - // let vxvsS = await unitroller.getXVSVTokenAddress(); - // XVS = XVS__factory.connect(xvsS, admin); - // XVSV = VToken__factory.connect(vxvsS, admin); - // }); - // }); }); }); } -}); +}); \ No newline at end of file From 8295e84feb50d67f8abe82bc4ff4d529d149a616 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Tue, 28 Mar 2023 18:29:54 +0530 Subject: [PATCH 053/153] Refactored tests for access control manager contract version. --- tests/hardhat/Comptroller/Diamond/XVSSpeeds.ts | 2 +- tests/hardhat/Comptroller/Diamond/accessControl.ts | 2 +- tests/hardhat/Comptroller/Diamond/assetListTest.ts | 2 +- tests/hardhat/Comptroller/Diamond/comptrollerTest.ts | 2 +- .../Comptroller/Diamond/liquidateCalculateAmoutSeizeTest.ts | 2 +- tests/hardhat/Comptroller/Diamond/pauseTest.ts | 2 +- tests/hardhat/Comptroller/XVSSpeeds.ts | 2 +- tests/hardhat/Comptroller/accessControl.ts | 2 +- tests/hardhat/Comptroller/assetListTest.ts | 2 +- tests/hardhat/Comptroller/comptrollerTest.ts | 2 +- .../Comptroller/liquidateCalculateAmountSeizeTest.ts | 2 +- tests/hardhat/Comptroller/pauseTest.ts | 2 +- tests/hardhat/EvilXToken.ts | 2 +- tests/hardhat/VAI/VAIController.ts | 6 +++--- 14 files changed, 16 insertions(+), 16 deletions(-) diff --git a/tests/hardhat/Comptroller/Diamond/XVSSpeeds.ts b/tests/hardhat/Comptroller/Diamond/XVSSpeeds.ts index 02b8a043f..2a8fa570f 100644 --- a/tests/hardhat/Comptroller/Diamond/XVSSpeeds.ts +++ b/tests/hardhat/Comptroller/Diamond/XVSSpeeds.ts @@ -21,7 +21,7 @@ describe("Comptroller", () => { comptroller = result.unitroller; comptrollerProxy = await ethers.getContractAt("Comptroller", comptroller.address); - accessControl = await smock.fake("IAccessControlManager"); + accessControl = await smock.fake("contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager"); vToken1 = await smock.fake("contracts/Tokens/V0.8.13/VTokens/VToken.sol:VToken"); vToken2 = await smock.fake("contracts/Tokens/V0.8.13/VTokens/VToken.sol:VToken"); ​ diff --git a/tests/hardhat/Comptroller/Diamond/accessControl.ts b/tests/hardhat/Comptroller/Diamond/accessControl.ts index 9d9f4ec83..6439fa974 100644 --- a/tests/hardhat/Comptroller/Diamond/accessControl.ts +++ b/tests/hardhat/Comptroller/Diamond/accessControl.ts @@ -20,7 +20,7 @@ describe("Comptroller", () => { const signers = await ethers.getSigners(); user = signers[1]; userAddress = await user.getAddress(); - accessControl = await smock.fake("IAccessControlManager"); + accessControl = await smock.fake("contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager"); const result = await deployDiamond(""); comptroller = result.unitroller; comptrollerProxy = await ethers.getContractAt("Comptroller", comptroller.address); diff --git a/tests/hardhat/Comptroller/Diamond/assetListTest.ts b/tests/hardhat/Comptroller/Diamond/assetListTest.ts index 68eb58238..4f4c73355 100644 --- a/tests/hardhat/Comptroller/Diamond/assetListTest.ts +++ b/tests/hardhat/Comptroller/Diamond/assetListTest.ts @@ -46,7 +46,7 @@ describe("Comptroller: assetListTest", () => { }; async function assetListFixture(): Promise { - const accessControl = await smock.fake("IAccessControlManager"); + const accessControl = await smock.fake("contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager"); // const ComptrollerFactory = await smock.mock("Comptroller"); const ComptrollerLensFactory = await smock.mock("ComptrollerLens"); const result = await deployDiamond(""); diff --git a/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts b/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts index 69a264603..de1b22531 100644 --- a/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts +++ b/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts @@ -32,7 +32,7 @@ type SimpleComptrollerFixture = { async function deploySimpleComptroller(): Promise { const oracle = await smock.fake("contracts/Oracle/V0.8.13/PriceOracle.sol:PriceOracle"); - const accessControl = await smock.fake("IAccessControlManager"); + const accessControl = await smock.fake("contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager"); accessControl.isAllowedToCall.returns(true); const ComptrollerLensFactory = await smock.mock("ComptrollerLens"); // const ComptrollerFactory = await smock.mock("Comptroller"); diff --git a/tests/hardhat/Comptroller/Diamond/liquidateCalculateAmoutSeizeTest.ts b/tests/hardhat/Comptroller/Diamond/liquidateCalculateAmoutSeizeTest.ts index bc8ffddfd..6f15528e7 100644 --- a/tests/hardhat/Comptroller/Diamond/liquidateCalculateAmoutSeizeTest.ts +++ b/tests/hardhat/Comptroller/Diamond/liquidateCalculateAmoutSeizeTest.ts @@ -60,7 +60,7 @@ describe("Comptroller", () => { } async function liquidateFixture(): Promise { - const accessControl = await smock.fake("IAccessControlManager"); + const accessControl = await smock.fake("contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager"); // const ComptrollerFactory = await smock.mock("Comptroller"); const ComptrollerLensFactory = await smock.mock("ComptrollerLens"); const result = await deployDiamond(""); diff --git a/tests/hardhat/Comptroller/Diamond/pauseTest.ts b/tests/hardhat/Comptroller/Diamond/pauseTest.ts index 8e33f89a5..11e93a49f 100644 --- a/tests/hardhat/Comptroller/Diamond/pauseTest.ts +++ b/tests/hardhat/Comptroller/Diamond/pauseTest.ts @@ -23,7 +23,7 @@ type PauseFixture = { }; async function pauseFixture(): Promise { - const accessControl = await smock.fake("IAccessControlManager"); + const accessControl = await smock.fake("contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager"); const result = await deployDiamond(""); const comptrollerDeployment = result.unitroller; const comptroller = await ethers.getContractAt("Comptroller", comptrollerDeployment.address); diff --git a/tests/hardhat/Comptroller/XVSSpeeds.ts b/tests/hardhat/Comptroller/XVSSpeeds.ts index eededa882..9ede24407 100644 --- a/tests/hardhat/Comptroller/XVSSpeeds.ts +++ b/tests/hardhat/Comptroller/XVSSpeeds.ts @@ -17,7 +17,7 @@ describe("Comptroller", () => { beforeEach(async () => { const ComptrollerFactory = await smock.mock("Comptroller"); comptroller = await ComptrollerFactory.deploy(); - accessControl = await smock.fake("IAccessControlManager"); + accessControl = await smock.fake("contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager"); vToken1 = await smock.fake("contracts/Tokens/VTokens/VToken.sol:VToken"); vToken2 = await smock.fake("contracts/Tokens/VTokens/VToken.sol:VToken"); diff --git a/tests/hardhat/Comptroller/accessControl.ts b/tests/hardhat/Comptroller/accessControl.ts index 6aa1e0ba8..7ae514eca 100644 --- a/tests/hardhat/Comptroller/accessControl.ts +++ b/tests/hardhat/Comptroller/accessControl.ts @@ -20,7 +20,7 @@ describe("Comptroller", () => { userAddress = await user.getAddress(); const ComptrollerFactory = await smock.mock("Comptroller"); comptroller = await ComptrollerFactory.deploy(); - accessControl = await smock.fake("IAccessControlManager"); + accessControl = await smock.fake("contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager"); }); describe("_setAccessControlManager", () => { diff --git a/tests/hardhat/Comptroller/assetListTest.ts b/tests/hardhat/Comptroller/assetListTest.ts index 736d02b2e..0b1ff7c71 100644 --- a/tests/hardhat/Comptroller/assetListTest.ts +++ b/tests/hardhat/Comptroller/assetListTest.ts @@ -44,7 +44,7 @@ describe("assetListTest", () => { }; async function assetListFixture(): Promise { - const accessControl = await smock.fake("IAccessControlManager"); + const accessControl = await smock.fake("contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager"); const ComptrollerFactory = await smock.mock("Comptroller"); const ComptrollerLensFactory = await smock.mock("ComptrollerLens"); const comptroller = await ComptrollerFactory.deploy(); diff --git a/tests/hardhat/Comptroller/comptrollerTest.ts b/tests/hardhat/Comptroller/comptrollerTest.ts index 0c51d8370..783878dfb 100644 --- a/tests/hardhat/Comptroller/comptrollerTest.ts +++ b/tests/hardhat/Comptroller/comptrollerTest.ts @@ -30,7 +30,7 @@ type SimpleComptrollerFixture = { async function deploySimpleComptroller(): Promise { const oracle = await smock.fake("contracts/Oracle/PriceOracle.sol:PriceOracle"); - const accessControl = await smock.fake("IAccessControlManager"); + const accessControl = await smock.fake("contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager"); accessControl.isAllowedToCall.returns(true); const ComptrollerLensFactory = await smock.mock("ComptrollerLens"); const ComptrollerFactory = await smock.mock("Comptroller"); diff --git a/tests/hardhat/Comptroller/liquidateCalculateAmountSeizeTest.ts b/tests/hardhat/Comptroller/liquidateCalculateAmountSeizeTest.ts index 5067a6084..65b64c737 100644 --- a/tests/hardhat/Comptroller/liquidateCalculateAmountSeizeTest.ts +++ b/tests/hardhat/Comptroller/liquidateCalculateAmountSeizeTest.ts @@ -55,7 +55,7 @@ describe("Comptroller", () => { } async function liquidateFixture(): Promise { - const accessControl = await smock.fake("IAccessControlManager"); + const accessControl = await smock.fake("contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager"); const ComptrollerFactory = await smock.mock("Comptroller"); const ComptrollerLensFactory = await smock.mock("ComptrollerLens"); const comptroller = await ComptrollerFactory.deploy(); diff --git a/tests/hardhat/Comptroller/pauseTest.ts b/tests/hardhat/Comptroller/pauseTest.ts index 5a4d59220..13e1e101e 100644 --- a/tests/hardhat/Comptroller/pauseTest.ts +++ b/tests/hardhat/Comptroller/pauseTest.ts @@ -26,7 +26,7 @@ type PauseFixture = { }; async function pauseFixture(): Promise { - const accessControl = await smock.fake("IAccessControlManager"); + const accessControl = await smock.fake("contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager"); const ComptrollerFactory = await smock.mock("Comptroller"); const comptroller = await ComptrollerFactory.deploy(); await comptroller._setAccessControl(accessControl.address); diff --git a/tests/hardhat/EvilXToken.ts b/tests/hardhat/EvilXToken.ts index 6d7f3dc96..980122bc1 100644 --- a/tests/hardhat/EvilXToken.ts +++ b/tests/hardhat/EvilXToken.ts @@ -13,7 +13,7 @@ describe("Evil Token test", async () => { beforeEach(async () => { const [root, account1] = await ethers.getSigners(); - const accessControlMock = await smock.fake("IAccessControlManager"); + const accessControlMock = await smock.fake("contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager"); accessControlMock.isAllowedToCall.returns(true); user = account1; diff --git a/tests/hardhat/VAI/VAIController.ts b/tests/hardhat/VAI/VAIController.ts index 0cd76e50e..793dcd009 100644 --- a/tests/hardhat/VAI/VAIController.ts +++ b/tests/hardhat/VAI/VAIController.ts @@ -65,7 +65,7 @@ describe("VAIController", async () => { "BEP20 usdt", )) as BEP20Harness; - const accessControl = await smock.fake("IAccessControlManager"); + const accessControl = await smock.fake("contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager"); accessControl.isAllowedToCall.returns(true); const ComptrollerFactory = await smock.mock("Comptroller"); @@ -534,7 +534,7 @@ describe("VAIController", async () => { }); it("emits NewAccessControl event", async () => { - const newAccessControl = await smock.fake("IAccessControlManager"); + const newAccessControl = await smock.fake("contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager"); const tx = await vaiController.setAccessControl(newAccessControl.address); await expect(tx) .to.emit(vaiController, "NewAccessControl") @@ -542,7 +542,7 @@ describe("VAIController", async () => { }); it("sets ACM address in storage", async () => { - const newAccessControl = await smock.fake("IAccessControlManager"); + const newAccessControl = await smock.fake("contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager"); await vaiController.setAccessControl(newAccessControl.address); expect(await vaiController.getVariable("accessControl")).to.equal(newAccessControl.address); }); From cf8a95111675698c388d4ce225ff7438206a6884 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Tue, 28 Mar 2023 18:33:54 +0530 Subject: [PATCH 054/153] Lint fix. --- contracts/Diamond/Diamond.sol | 3 +- contracts/Diamond/facets/MarketFacet.sol | 21 ++-- contracts/Diamond/facets/RewardFacet.sol | 2 + contracts/Diamond/libraries/LibDiamond.sol | 4 +- contracts/Lens/InterestRateModelLens.sol | 2 +- hardhat.config.ts | 3 +- script/diamond/deploy.js | 5 +- .../hardhat/Comptroller/Diamond/XVSSpeeds.ts | 70 ++++++------ .../Comptroller/Diamond/accessControl.ts | 4 +- .../Comptroller/Diamond/assetListTest.ts | 8 +- .../Comptroller/Diamond/comptrollerTest.ts | 6 +- .../liquidateCalculateAmoutSeizeTest.ts | 12 +- .../hardhat/Comptroller/Diamond/pauseTest.ts | 8 +- tests/hardhat/Comptroller/XVSSpeeds.ts | 4 +- tests/hardhat/Comptroller/accessControl.ts | 4 +- tests/hardhat/Comptroller/assetListTest.ts | 8 +- tests/hardhat/Comptroller/comptrollerTest.ts | 4 +- .../liquidateCalculateAmountSeizeTest.ts | 12 +- tests/hardhat/Comptroller/pauseTest.ts | 4 +- .../DelegateBorrowers/SwapDebtDelegate.ts | 4 +- tests/hardhat/EvilXToken.ts | 12 +- tests/hardhat/Fork/diamondTest.ts | 104 +++++++++--------- tests/hardhat/Fork/swapTest.ts | 4 +- tests/hardhat/Liquidator/liquidatorTest.ts | 8 +- tests/hardhat/Swap/swapTest.ts | 4 +- tests/hardhat/VAI/VAIController.ts | 12 +- 26 files changed, 205 insertions(+), 127 deletions(-) diff --git a/contracts/Diamond/Diamond.sol b/contracts/Diamond/Diamond.sol index 2df6c3397..d77e0390a 100644 --- a/contracts/Diamond/Diamond.sol +++ b/contracts/Diamond/Diamond.sol @@ -6,7 +6,8 @@ import { AppStorage } from "./libraries/appStorage.sol"; import { IDiamondCut } from "./interfaces/IDiamondCut.sol"; interface IUnitroller { - function admin() external view returns(address); + function admin() external view returns (address); + function _acceptImplementation() external returns (uint); } diff --git a/contracts/Diamond/facets/MarketFacet.sol b/contracts/Diamond/facets/MarketFacet.sol index 0306b2c31..f82f531e6 100644 --- a/contracts/Diamond/facets/MarketFacet.sol +++ b/contracts/Diamond/facets/MarketFacet.sol @@ -23,11 +23,11 @@ contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError { return s.accountAssets[account]; } - function venusSupplierIndex(address market, address borrower) external view returns(uint){ + function venusSupplierIndex(address market, address borrower) external view returns (uint) { return s.venusSupplierIndex[market][borrower]; } - function venusBorrowerIndex(address market, address borrower) external view returns(uint){ + function venusBorrowerIndex(address market, address borrower) external view returns (uint) { return s.venusBorrowerIndex[market][borrower]; } @@ -110,45 +110,52 @@ contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError { function mintedVAIs(address vToken) external view returns (uint) { return s.mintedVAIs[vToken]; } + function vaiMintRate() external view returns (uint) { return s.vaiMintRate; } + function venusVAIVaultRate() external view returns (uint) { return s.venusVAIVaultRate; } + function vaiVaultAddress() external view returns (address) { return s.vaiVaultAddress; } + function releaseStartBlock() external view returns (uint256) { return s.releaseStartBlock; } + function minReleaseAmount() external view returns (uint256) { return s.minReleaseAmount; } + function borrowCapGuardian() external view returns (address) { return s.borrowCapGuardian; } + function borrowCaps(address token) external view returns (uint) { return s.borrowCaps[token]; } - function mintVAIGuardianPaused() external view returns(bool){ + function mintVAIGuardianPaused() external view returns (bool) { return s.mintVAIGuardianPaused; } - function repayVAIGuardianPaused() external view returns(bool){ + function repayVAIGuardianPaused() external view returns (bool) { return s.repayVAIGuardianPaused; } - function protocolPaused() external view returns(bool){ + function protocolPaused() external view returns (bool) { return s.protocolPaused; } - function liquidatorContract() external view returns(address){ + function liquidatorContract() external view returns (address) { return s.liquidatorContract; } - function pauseGuardian() external view returns(address){ + function pauseGuardian() external view returns (address) { return s.pauseGuardian; } diff --git a/contracts/Diamond/facets/RewardFacet.sol b/contracts/Diamond/facets/RewardFacet.sol index edbd5bb67..d47a5d8ab 100644 --- a/contracts/Diamond/facets/RewardFacet.sol +++ b/contracts/Diamond/facets/RewardFacet.sol @@ -10,7 +10,9 @@ import "../../Governance/V0.8.13/IAccessControlManager.sol"; interface IXVS { function balanceOf(address account) external view returns (uint); + function transfer(address dst, uint rawAmount) external returns (bool); + function approve(address spender, uint rawAmount) external returns (bool); } diff --git a/contracts/Diamond/libraries/LibDiamond.sol b/contracts/Diamond/libraries/LibDiamond.sol index 60e83bd7e..f46079b89 100644 --- a/contracts/Diamond/libraries/LibDiamond.sol +++ b/contracts/Diamond/libraries/LibDiamond.sol @@ -55,7 +55,7 @@ library LibDiamond { emit OwnershipTransferred(previousOwner, _newOwner); } - function setUnitrollerAddress(address _unitrollerAddress) internal { + function setUnitrollerAddress(address _unitrollerAddress) internal { DiamondStorage storage ds = diamondStorage(); address previousUnitrollerAddress = ds.unitrollerAddress; ds.unitrollerAddress = _unitrollerAddress; @@ -70,7 +70,7 @@ library LibDiamond { require(msg.sender == diamondStorage().contractOwner, "LibDiamond: Must be contract owner"); } - function getUnitrollerAddress() internal view returns(address) { + function getUnitrollerAddress() internal view returns (address) { return diamondStorage().unitrollerAddress; } diff --git a/contracts/Lens/InterestRateModelLens.sol b/contracts/Lens/InterestRateModelLens.sol index 42cd7807f..dc92f9663 100644 --- a/contracts/Lens/InterestRateModelLens.sol +++ b/contracts/Lens/InterestRateModelLens.sol @@ -22,7 +22,7 @@ contract InterestRateModelLens { uint reserves = 0; for (uint percent_Factor = 1; percent_Factor <= 100; ++percent_Factor) { - uint cash = (percent_Factor*referenceAmountInWei)/1e2; + uint cash = (percent_Factor * referenceAmountInWei) / 1e2; uint256 borrowRate = ir.getBorrowRate(cash, borrow, reserves); borrowSimulation[percent_Factor - 1] = borrowRate; diff --git a/hardhat.config.ts b/hardhat.config.ts index 35a99a0d1..56221c0c8 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -10,7 +10,8 @@ import "hardhat-deploy"; import { HardhatUserConfig, task } from "hardhat/config"; import "solidity-docgen"; import "solidity-docgen"; -require('hardhat-contract-sizer'); + +require("hardhat-contract-sizer"); require("dotenv").config(); const BSCSCAN_API_KEY = process.env.BSCSCAN_API_KEY; diff --git a/script/diamond/deploy.js b/script/diamond/deploy.js index fb26d9c7c..d726b9bb0 100644 --- a/script/diamond/deploy.js +++ b/script/diamond/deploy.js @@ -19,19 +19,18 @@ async function deployDiamond(unitrollerAddress) { const DiamondCutFacet = await ethers.getContractFactory("DiamondCutFacet"); const diamondCutFacet = await DiamondCutFacet.deploy(); await diamondCutFacet.deployed(); - + if (unitrollerAddress != "") { await impersonateAccount(Owner); unitrollerAdmin = await ethers.getSigner(Owner); unitroller = await Unitroller__factory.connect(unitrollerAddress, unitrollerAdmin); - } else { const UnitrollerFactory = await ethers.getContractFactory("Unitroller"); unitroller = await UnitrollerFactory.deploy(); const signer = await ethers.getSigners(); unitrollerAdmin = signer[0]; } - + // deploy Diamond const Diamond = await ethers.getContractFactory("Diamond"); const diamond = await Diamond.deploy(contractOwner.address, unitroller.address); diff --git a/tests/hardhat/Comptroller/Diamond/XVSSpeeds.ts b/tests/hardhat/Comptroller/Diamond/XVSSpeeds.ts index 2a8fa570f..e43dc3174 100644 --- a/tests/hardhat/Comptroller/Diamond/XVSSpeeds.ts +++ b/tests/hardhat/Comptroller/Diamond/XVSSpeeds.ts @@ -1,40 +1,42 @@ import { FakeContract, MockContract, smock } from "@defi-wonderland/smock"; import chai from "chai"; import { ethers, network } from "hardhat"; -​ -import { Comptroller, IAccessControlManager, VToken } from "../../../../typechain"; + import { convertToUnit } from "../../../../helpers/utils"; +import { Comptroller, IAccessControlManager, VToken } from "../../../../typechain"; + const { deployDiamond } = require("../../../../script/diamond/deploy"); -​ const { expect } = chai; chai.use(smock.matchers); -​ + describe("Comptroller", () => { let comptroller: MockContract; let comptrollerProxy: MockContract; let accessControl: FakeContract; let vToken1: FakeContract; let vToken2: FakeContract; -​ + beforeEach(async () => { const result = await deployDiamond(""); comptroller = result.unitroller; - + comptrollerProxy = await ethers.getContractAt("Comptroller", comptroller.address); - accessControl = await smock.fake("contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager"); + accessControl = await smock.fake( + "contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager", + ); vToken1 = await smock.fake("contracts/Tokens/V0.8.13/VTokens/VToken.sol:VToken"); vToken2 = await smock.fake("contracts/Tokens/V0.8.13/VTokens/VToken.sol:VToken"); -​ + accessControl.isAllowedToCall.returns(true); vToken1.isVToken.returns(true); vToken2.isVToken.returns(true); vToken1.borrowIndex.returns(convertToUnit(0.7, 18)); -​ + await comptrollerProxy._setAccessControl(accessControl.address); await comptrollerProxy._supportMarket(vToken1.address); await comptrollerProxy._supportMarket(vToken2.address); }); -​ + describe("_initializeMarket", () => { it("Supply and borrow state after initializing the market in the pool", async () => { const borrowRate = await comptrollerProxy.venusSupplyState(vToken1.address); @@ -43,7 +45,7 @@ describe("Comptroller", () => { expect(borrowRate.index).equal(convertToUnit(1, 36)); }); }); -​ + describe("_setVenusSpeeds", async () => { it("Revert on invalid supplySpeeds input", async () => { await expect( @@ -54,7 +56,7 @@ describe("Comptroller", () => { ), ).to.be.revertedWith("Comptroller::_setVenusSpeeds invalid input"); }); -​ + it("Revert on invalid borrowSpeeds input", async () => { await expect( comptrollerProxy._setVenusSpeeds( @@ -64,63 +66,67 @@ describe("Comptroller", () => { ), ).to.be.revertedWith("Comptroller::_setVenusSpeeds invalid input"); }); -​ + it("Revert for unlisted market", async () => { const [unListedMarket] = await ethers.getSigners(); await expect( comptrollerProxy._setVenusSpeeds([unListedMarket.address], [convertToUnit(1, 16)], [convertToUnit(1, 15)]), ).to.be.revertedWith("market not listed"); }); -​ + it("Revert on invalid borrowSpeeds input", async () => { await comptrollerProxy._setVenusSpeeds( [vToken1.address, vToken2.address], [convertToUnit(1, 16), convertToUnit(1, 18)], [convertToUnit(1, 20), convertToUnit(1, 22)], ); -​ + const token1SupplySpeed = await comptrollerProxy.venusSupplySpeeds(vToken1.address); const token1BorrowSpeed = await comptrollerProxy.venusBorrowSpeeds(vToken1.address); -​ + expect(token1SupplySpeed).equal(convertToUnit(1, 16)); expect(token1BorrowSpeed).equal(convertToUnit(1, 20)); -​ + const token2SupplySpeed = await comptrollerProxy.venusSupplySpeeds(vToken2.address); const token2BorrowSpeed = await comptrollerProxy.venusBorrowSpeeds(vToken2.address); -​ + expect(token2SupplySpeed).equal(convertToUnit(1, 18)); expect(token2BorrowSpeed).equal(convertToUnit(1, 22)); }); -​ + it("Updating non-zero speeds after setting it zero", async () => { // Setting the initial speeds await comptrollerProxy._setVenusSpeeds([vToken1.address], [convertToUnit(1, 16)], [convertToUnit(1, 20)]); -​ + // Mining 1000 blocks await network.provider.send("hardhat_mine", ["0x3e8", "0x3c"]); -​ + // Updating the speeds to zero await comptrollerProxy._setVenusSpeeds([vToken1.address], [0], [0]); -​ + // latest Block const blockNumber1 = await ethers.provider.getBlock("latest"); // Mining 1000 blocks await network.provider.send("hardhat_mine", ["0x3e8", "0x3c"]); // Getting the last block for the updated speeds - const supplySpeedBlock1 = await comptrollerProxy.venusSupplyState(vToken1.address) - const borrowSpeedBlock1 = await comptrollerProxy.venusBorrowState(vToken1.address) -​ + const supplySpeedBlock1 = await comptrollerProxy.venusSupplyState(vToken1.address); + const borrowSpeedBlock1 = await comptrollerProxy.venusBorrowState(vToken1.address); + // Updating the speeds to non-zero await comptrollerProxy._setVenusSpeeds([vToken1.address], [convertToUnit(1, 16)], [convertToUnit(1, 20)]); -​ + // Getting the last block for the updated speeds - const supplySpeedBlock2 = await comptrollerProxy.venusSupplyState(vToken1.address) - const borrowSpeedBlock2 = await comptrollerProxy.venusBorrowState(vToken1.address) + const supplySpeedBlock2 = await comptrollerProxy.venusSupplyState(vToken1.address); + const borrowSpeedBlock2 = await comptrollerProxy.venusBorrowState(vToken1.address); // latest Block const blockNumber2 = await ethers.provider.getBlock("latest"); -​ - expect(blockNumber2.number - blockNumber1.number).equal(Number(supplySpeedBlock2.block) - Number(supplySpeedBlock1.block)); - expect(blockNumber2.number - blockNumber1.number).equal(Number(borrowSpeedBlock2.block) - Number(borrowSpeedBlock1.block)); + + expect(blockNumber2.number - blockNumber1.number).equal( + Number(supplySpeedBlock2.block) - Number(supplySpeedBlock1.block), + ); + expect(blockNumber2.number - blockNumber1.number).equal( + Number(borrowSpeedBlock2.block) - Number(borrowSpeedBlock1.block), + ); }); }); -}); \ No newline at end of file +}); diff --git a/tests/hardhat/Comptroller/Diamond/accessControl.ts b/tests/hardhat/Comptroller/Diamond/accessControl.ts index 6439fa974..e405e9695 100644 --- a/tests/hardhat/Comptroller/Diamond/accessControl.ts +++ b/tests/hardhat/Comptroller/Diamond/accessControl.ts @@ -20,7 +20,9 @@ describe("Comptroller", () => { const signers = await ethers.getSigners(); user = signers[1]; userAddress = await user.getAddress(); - accessControl = await smock.fake("contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager"); + accessControl = await smock.fake( + "contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager", + ); const result = await deployDiamond(""); comptroller = result.unitroller; comptrollerProxy = await ethers.getContractAt("Comptroller", comptroller.address); diff --git a/tests/hardhat/Comptroller/Diamond/assetListTest.ts b/tests/hardhat/Comptroller/Diamond/assetListTest.ts index 4f4c73355..5bd3630aa 100644 --- a/tests/hardhat/Comptroller/Diamond/assetListTest.ts +++ b/tests/hardhat/Comptroller/Diamond/assetListTest.ts @@ -46,7 +46,9 @@ describe("Comptroller: assetListTest", () => { }; async function assetListFixture(): Promise { - const accessControl = await smock.fake("contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager"); + const accessControl = await smock.fake( + "contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager", + ); // const ComptrollerFactory = await smock.mock("Comptroller"); const ComptrollerLensFactory = await smock.mock("ComptrollerLens"); const result = await deployDiamond(""); @@ -61,7 +63,9 @@ describe("Comptroller: assetListTest", () => { const names = ["OMG", "ZRX", "BAT", "sketch"]; const [OMG, ZRX, BAT, SKT] = await Promise.all( names.map(async name => { - const vToken = await smock.fake("contracts/Tokens/V0.8.13/VTokens/VBep20Immutable.sol:VBep20Immutable"); + const vToken = await smock.fake( + "contracts/Tokens/V0.8.13/VTokens/VBep20Immutable.sol:VBep20Immutable", + ); if (name !== "sketch") { await comptrollerProxy._supportMarket(vToken.address); } diff --git a/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts b/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts index de1b22531..b5dd8f8f1 100644 --- a/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts +++ b/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts @@ -13,7 +13,7 @@ import { EIP20Interface, IAccessControlManager, PriceOracle, - VToken + VToken, } from "../../../../typechain"; import { ComptrollerErrorReporter } from "../../util/Errors"; @@ -32,7 +32,9 @@ type SimpleComptrollerFixture = { async function deploySimpleComptroller(): Promise { const oracle = await smock.fake("contracts/Oracle/V0.8.13/PriceOracle.sol:PriceOracle"); - const accessControl = await smock.fake("contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager"); + const accessControl = await smock.fake( + "contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager", + ); accessControl.isAllowedToCall.returns(true); const ComptrollerLensFactory = await smock.mock("ComptrollerLens"); // const ComptrollerFactory = await smock.mock("Comptroller"); diff --git a/tests/hardhat/Comptroller/Diamond/liquidateCalculateAmoutSeizeTest.ts b/tests/hardhat/Comptroller/Diamond/liquidateCalculateAmoutSeizeTest.ts index 6f15528e7..9def0398f 100644 --- a/tests/hardhat/Comptroller/Diamond/liquidateCalculateAmoutSeizeTest.ts +++ b/tests/hardhat/Comptroller/Diamond/liquidateCalculateAmoutSeizeTest.ts @@ -60,7 +60,9 @@ describe("Comptroller", () => { } async function liquidateFixture(): Promise { - const accessControl = await smock.fake("contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager"); + const accessControl = await smock.fake( + "contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager", + ); // const ComptrollerFactory = await smock.mock("Comptroller"); const ComptrollerLensFactory = await smock.mock("ComptrollerLens"); const result = await deployDiamond(""); @@ -74,8 +76,12 @@ describe("Comptroller", () => { await comptrollerProxy._setPriceOracle(oracle.address); await comptrollerProxy._setLiquidationIncentive(convertToUnit("1.1", 18)); - const vTokenBorrowed = await smock.fake("contracts/Tokens/V0.8.13/VTokens/VBep20Immutable.sol:VBep20Immutable"); - const vTokenCollateral = await smock.fake("contracts/Tokens/V0.8.13/VTokens/VBep20Immutable.sol:VBep20Immutable"); + const vTokenBorrowed = await smock.fake( + "contracts/Tokens/V0.8.13/VTokens/VBep20Immutable.sol:VBep20Immutable", + ); + const vTokenCollateral = await smock.fake( + "contracts/Tokens/V0.8.13/VTokens/VBep20Immutable.sol:VBep20Immutable", + ); return { comptrollerProxy, comptrollerLens, oracle, vTokenBorrowed, vTokenCollateral }; } diff --git a/tests/hardhat/Comptroller/Diamond/pauseTest.ts b/tests/hardhat/Comptroller/Diamond/pauseTest.ts index 11e93a49f..4ff408590 100644 --- a/tests/hardhat/Comptroller/Diamond/pauseTest.ts +++ b/tests/hardhat/Comptroller/Diamond/pauseTest.ts @@ -23,7 +23,9 @@ type PauseFixture = { }; async function pauseFixture(): Promise { - const accessControl = await smock.fake("contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager"); + const accessControl = await smock.fake( + "contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager", + ); const result = await deployDiamond(""); const comptrollerDeployment = result.unitroller; const comptroller = await ethers.getContractAt("Comptroller", comptrollerDeployment.address); @@ -35,7 +37,9 @@ async function pauseFixture(): Promise { const names = ["OMG", "ZRX", "BAT", "sketch"]; const [OMG, ZRX, BAT, SKT] = await Promise.all( names.map(async name => { - const vToken = await smock.fake("contracts/Tokens/V0.8.13/VTokens/VBep20Immutable.sol:VBep20Immutable"); + const vToken = await smock.fake( + "contracts/Tokens/V0.8.13/VTokens/VBep20Immutable.sol:VBep20Immutable", + ); if (name !== "sketch") { await comptroller._supportMarket(vToken.address); } diff --git a/tests/hardhat/Comptroller/XVSSpeeds.ts b/tests/hardhat/Comptroller/XVSSpeeds.ts index 9ede24407..b1fda2aac 100644 --- a/tests/hardhat/Comptroller/XVSSpeeds.ts +++ b/tests/hardhat/Comptroller/XVSSpeeds.ts @@ -17,7 +17,9 @@ describe("Comptroller", () => { beforeEach(async () => { const ComptrollerFactory = await smock.mock("Comptroller"); comptroller = await ComptrollerFactory.deploy(); - accessControl = await smock.fake("contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager"); + accessControl = await smock.fake( + "contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager", + ); vToken1 = await smock.fake("contracts/Tokens/VTokens/VToken.sol:VToken"); vToken2 = await smock.fake("contracts/Tokens/VTokens/VToken.sol:VToken"); diff --git a/tests/hardhat/Comptroller/accessControl.ts b/tests/hardhat/Comptroller/accessControl.ts index 7ae514eca..468c18f7b 100644 --- a/tests/hardhat/Comptroller/accessControl.ts +++ b/tests/hardhat/Comptroller/accessControl.ts @@ -20,7 +20,9 @@ describe("Comptroller", () => { userAddress = await user.getAddress(); const ComptrollerFactory = await smock.mock("Comptroller"); comptroller = await ComptrollerFactory.deploy(); - accessControl = await smock.fake("contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager"); + accessControl = await smock.fake( + "contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager", + ); }); describe("_setAccessControlManager", () => { diff --git a/tests/hardhat/Comptroller/assetListTest.ts b/tests/hardhat/Comptroller/assetListTest.ts index 0b1ff7c71..9ba2c24e3 100644 --- a/tests/hardhat/Comptroller/assetListTest.ts +++ b/tests/hardhat/Comptroller/assetListTest.ts @@ -44,7 +44,9 @@ describe("assetListTest", () => { }; async function assetListFixture(): Promise { - const accessControl = await smock.fake("contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager"); + const accessControl = await smock.fake( + "contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager", + ); const ComptrollerFactory = await smock.mock("Comptroller"); const ComptrollerLensFactory = await smock.mock("ComptrollerLens"); const comptroller = await ComptrollerFactory.deploy(); @@ -57,7 +59,9 @@ describe("assetListTest", () => { const names = ["OMG", "ZRX", "BAT", "sketch"]; const [OMG, ZRX, BAT, SKT] = await Promise.all( names.map(async name => { - const vToken = await smock.fake("contracts/Tokens/VTokens/VBep20Immutable.sol:VBep20Immutable"); + const vToken = await smock.fake( + "contracts/Tokens/VTokens/VBep20Immutable.sol:VBep20Immutable", + ); if (name !== "sketch") { await comptroller._supportMarket(vToken.address); } diff --git a/tests/hardhat/Comptroller/comptrollerTest.ts b/tests/hardhat/Comptroller/comptrollerTest.ts index 783878dfb..b3fb6b241 100644 --- a/tests/hardhat/Comptroller/comptrollerTest.ts +++ b/tests/hardhat/Comptroller/comptrollerTest.ts @@ -30,7 +30,9 @@ type SimpleComptrollerFixture = { async function deploySimpleComptroller(): Promise { const oracle = await smock.fake("contracts/Oracle/PriceOracle.sol:PriceOracle"); - const accessControl = await smock.fake("contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager"); + const accessControl = await smock.fake( + "contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager", + ); accessControl.isAllowedToCall.returns(true); const ComptrollerLensFactory = await smock.mock("ComptrollerLens"); const ComptrollerFactory = await smock.mock("Comptroller"); diff --git a/tests/hardhat/Comptroller/liquidateCalculateAmountSeizeTest.ts b/tests/hardhat/Comptroller/liquidateCalculateAmountSeizeTest.ts index 65b64c737..cef4afdd9 100644 --- a/tests/hardhat/Comptroller/liquidateCalculateAmountSeizeTest.ts +++ b/tests/hardhat/Comptroller/liquidateCalculateAmountSeizeTest.ts @@ -55,7 +55,9 @@ describe("Comptroller", () => { } async function liquidateFixture(): Promise { - const accessControl = await smock.fake("contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager"); + const accessControl = await smock.fake( + "contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager", + ); const ComptrollerFactory = await smock.mock("Comptroller"); const ComptrollerLensFactory = await smock.mock("ComptrollerLens"); const comptroller = await ComptrollerFactory.deploy(); @@ -67,8 +69,12 @@ describe("Comptroller", () => { await comptroller._setPriceOracle(oracle.address); await comptroller._setLiquidationIncentive(convertToUnit("1.1", 18)); - const vTokenBorrowed = await smock.fake("contracts/Tokens/V0.8.13/VTokens/VBep20Immutable.sol:VBep20Immutable"); - const vTokenCollateral = await smock.fake("contracts/Tokens/V0.8.13/VTokens/VBep20Immutable.sol:VBep20Immutable"); + const vTokenBorrowed = await smock.fake( + "contracts/Tokens/V0.8.13/VTokens/VBep20Immutable.sol:VBep20Immutable", + ); + const vTokenCollateral = await smock.fake( + "contracts/Tokens/V0.8.13/VTokens/VBep20Immutable.sol:VBep20Immutable", + ); return { comptroller, comptrollerLens, oracle, vTokenBorrowed, vTokenCollateral }; } diff --git a/tests/hardhat/Comptroller/pauseTest.ts b/tests/hardhat/Comptroller/pauseTest.ts index 13e1e101e..fcab8d477 100644 --- a/tests/hardhat/Comptroller/pauseTest.ts +++ b/tests/hardhat/Comptroller/pauseTest.ts @@ -26,7 +26,9 @@ type PauseFixture = { }; async function pauseFixture(): Promise { - const accessControl = await smock.fake("contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager"); + const accessControl = await smock.fake( + "contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager", + ); const ComptrollerFactory = await smock.mock("Comptroller"); const comptroller = await ComptrollerFactory.deploy(); await comptroller._setAccessControl(accessControl.address); diff --git a/tests/hardhat/DelegateBorrowers/SwapDebtDelegate.ts b/tests/hardhat/DelegateBorrowers/SwapDebtDelegate.ts index 38cab39ea..21280492b 100644 --- a/tests/hardhat/DelegateBorrowers/SwapDebtDelegate.ts +++ b/tests/hardhat/DelegateBorrowers/SwapDebtDelegate.ts @@ -6,7 +6,7 @@ import { parseUnits } from "ethers/lib/utils"; import { ethers, upgrades } from "hardhat"; import { - Comptroller, + Comptroller, IERC20Upgradeable, PriceOracle, SwapDebtDelegate, @@ -45,7 +45,7 @@ describe("assetListTest", () => { priceOracle = await smock.fake("contracts/Oracle/PriceOracle.sol:PriceOracle"); comptroller = await smock.fake("contracts/Comptroller/Comptroller.sol:Comptroller"); foo = await smock.fake("IERC20Upgradeable"); - + bar = await smock.fake("IERC20Upgradeable"); vFoo = await smock.fake("contracts/Tokens/VTokens/VBep20.sol:VBep20"); vBar = await smock.fake("contracts/Tokens/VTokens/VBep20.sol:VBep20"); diff --git a/tests/hardhat/EvilXToken.ts b/tests/hardhat/EvilXToken.ts index 980122bc1..3d78d7f87 100644 --- a/tests/hardhat/EvilXToken.ts +++ b/tests/hardhat/EvilXToken.ts @@ -13,7 +13,9 @@ describe("Evil Token test", async () => { beforeEach(async () => { const [root, account1] = await ethers.getSigners(); - const accessControlMock = await smock.fake("contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager"); + const accessControlMock = await smock.fake( + "contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager", + ); accessControlMock.isAllowedToCall.returns(true); user = account1; @@ -81,7 +83,9 @@ describe("Evil Token test", async () => { const vDelegatee1 = await vDelegatee1Factory.deploy(); await vDelegatee1.deployed(); - const vDelegator1Factory = await ethers.getContractFactory("contracts/Tokens/V0.8.13/VTokens/VBep20Delegator.sol:VBep20Delegator"); + const vDelegator1Factory = await ethers.getContractFactory( + "contracts/Tokens/V0.8.13/VTokens/VBep20Delegator.sol:VBep20Delegator", + ); const vDelegator1 = await vDelegator1Factory.deploy( underlying1.address, unitroller.address, @@ -110,7 +114,9 @@ describe("Evil Token test", async () => { const vDelegatee2 = await vDelegatee2Factory.deploy(); await vDelegatee2.deployed(); - const vDelegator2Factory = await ethers.getContractFactory("contracts/Tokens/V0.8.13/VTokens/VBep20Delegator.sol:VBep20Delegator"); + const vDelegator2Factory = await ethers.getContractFactory( + "contracts/Tokens/V0.8.13/VTokens/VBep20Delegator.sol:VBep20Delegator", + ); const vDelegator2 = await vDelegator2Factory.deploy( underlying2.address, unitroller.address, diff --git a/tests/hardhat/Fork/diamondTest.ts b/tests/hardhat/Fork/diamondTest.ts index d5a69afe9..cb2e1b564 100644 --- a/tests/hardhat/Fork/diamondTest.ts +++ b/tests/hardhat/Fork/diamondTest.ts @@ -155,7 +155,6 @@ forking(26713742, () => { describe("Verify storage layout", async () => { it.only("verify all the state before and after upgrade", async () => { - maxAssets = await unitroller.maxAssets(); const maxAssetsAfterUpgrade = await diamondUnitroller.maxAssets(); expect(maxAssets).to.equal(maxAssetsAfterUpgrade); @@ -195,7 +194,7 @@ forking(26713742, () => { vaiMintRate = await unitroller.vaiMintRate(); const vaiMintRateAfterUpgrade = await diamondUnitroller.vaiMintRate(); expect(vaiMintRate).to.equal(vaiMintRateAfterUpgrade); - + vaiController = await unitroller.vaiController(); const vaiControllerUpgrade = await diamondUnitroller.vaiController(); expect(vaiControllerUpgrade).to.equal(vaiController); @@ -247,26 +246,32 @@ forking(26713742, () => { liquidatorContract = await unitroller.liquidatorContract(); const liquidatorContractUpgrade = await diamondUnitroller.liquidatorContract(); - expect(liquidatorContract).to.equal(liquidatorContractUpgrade) - + expect(liquidatorContract).to.equal(liquidatorContractUpgrade); + comptrollerLens = await unitroller.comptrollerLens(); const comptrollerLensUpgrade = await diamondUnitroller.comptrollerLens(); expect(comptrollerLens).to.equal(comptrollerLensUpgrade); - // cheking all public mapingns + // cheking all public mapingns market = await unitroller.markets(vBUSD.address); const marketUpgrade = await diamondUnitroller.markets(vBUSD.address); expect(market.collateralFactorMantissa).to.equal(marketUpgrade.collateralFactorMantissa); expect(market.isListed).to.equal(marketUpgrade.isListed); expect(market.isVenus).to.equal(marketUpgrade.isVenus); - venusBorrowerIndex = await unitroller.venusBorrowerIndex(vBUSD.address,busdHolder.address); - const venusBorrowerIndexUpgrade = await diamondUnitroller.venusBorrowerIndex(vBUSD.address,busdHolder.address); - expect(venusBorrowerIndex).to.equal(venusBorrowerIndexUpgrade) + venusBorrowerIndex = await unitroller.venusBorrowerIndex(vBUSD.address, busdHolder.address); + const venusBorrowerIndexUpgrade = await diamondUnitroller.venusBorrowerIndex( + vBUSD.address, + busdHolder.address, + ); + expect(venusBorrowerIndex).to.equal(venusBorrowerIndexUpgrade); - venusSupplierIndex = await unitroller.venusSupplierIndex(vBUSD.address,busdHolder.address); - const venusSupplierIndexUpgrade = await diamondUnitroller.venusSupplierIndex(vBUSD.address,busdHolder.address); - expect(venusSupplierIndex).to.equal(venusSupplierIndexUpgrade) + venusSupplierIndex = await unitroller.venusSupplierIndex(vBUSD.address, busdHolder.address); + const venusSupplierIndexUpgrade = await diamondUnitroller.venusSupplierIndex( + vBUSD.address, + busdHolder.address, + ); + expect(venusSupplierIndex).to.equal(venusSupplierIndexUpgrade); const venusBorrowSpeeds = await unitroller.venusBorrowSpeeds(vUSDT.address); const venusBorrowSpeedsUpgrade = await diamondUnitroller.venusBorrowSpeeds(vUSDT.address); @@ -301,51 +306,57 @@ forking(26713742, () => { }); it("setting collateral factor", async () => { - await diamondUnitroller.connect(owner)._setCollateralFactor(vUSDT.address,2); - market =(await diamondUnitroller.markets(vUSDT.address)); + await diamondUnitroller.connect(owner)._setCollateralFactor(vUSDT.address, 2); + market = await diamondUnitroller.markets(vUSDT.address); expect(market.collateralFactorMantissa).to.equal(2); - await diamondUnitroller.connect(owner)._setCollateralFactor(vUSDT.address,parseUnits("8",17)); - market =(await diamondUnitroller.markets(vUSDT.address)); - expect(market.collateralFactorMantissa).to.equal(parseUnits("8",17)); + await diamondUnitroller.connect(owner)._setCollateralFactor(vUSDT.address, parseUnits("8", 17)); + market = await diamondUnitroller.markets(vUSDT.address); + expect(market.collateralFactorMantissa).to.equal(parseUnits("8", 17)); }); - it("setting setting Liquidation Incentive",async () => { + it("setting setting Liquidation Incentive", async () => { // console.log((await diamondUnitroller.liquidationIncentiveMantissa()).toString()); - await diamondUnitroller.connect(owner)._setLiquidationIncentive(parseUnits("13",17)); - expect(await diamondUnitroller.liquidationIncentiveMantissa()).to.equal(parseUnits("13",17)); + await diamondUnitroller.connect(owner)._setLiquidationIncentive(parseUnits("13", 17)); + expect(await diamondUnitroller.liquidationIncentiveMantissa()).to.equal(parseUnits("13", 17)); - await diamondUnitroller.connect(owner)._setLiquidationIncentive(parseUnits("11",17)); - expect(await diamondUnitroller.liquidationIncentiveMantissa()).to.equal(parseUnits("11",17)); - }) + await diamondUnitroller.connect(owner)._setLiquidationIncentive(parseUnits("11", 17)); + expect(await diamondUnitroller.liquidationIncentiveMantissa()).to.equal(parseUnits("11", 17)); + }); - it("setting Pause Guardian",async () => { + it("setting Pause Guardian", async () => { const currentPauseGuardia = (await diamondUnitroller.pauseGuardian()).toString(); await diamondUnitroller.connect(owner)._setPauseGuardian(owner.address); - expect(await diamondUnitroller.pauseGuardian()).to.equal(owner.address) + expect(await diamondUnitroller.pauseGuardian()).to.equal(owner.address); await diamondUnitroller.connect(owner)._setPauseGuardian(currentPauseGuardia); - expect(await diamondUnitroller.pauseGuardian()).to.equal(currentPauseGuardia) - }) + expect(await diamondUnitroller.pauseGuardian()).to.equal(currentPauseGuardia); + }); - it("setting market borrow cap",async () => { + it("setting market borrow cap", async () => { const currentBorrowCap = (await diamondUnitroller.borrowCaps(vUSDT.address)).toString(); - await diamondUnitroller.connect(owner)._setMarketBorrowCaps([vUSDT.address], [parseUnits("10000",18)]); - expect(await diamondUnitroller.borrowCaps(vUSDT.address)).to.equal(parseUnits("10000",18)); + await diamondUnitroller.connect(owner)._setMarketBorrowCaps([vUSDT.address], [parseUnits("10000", 18)]); + expect(await diamondUnitroller.borrowCaps(vUSDT.address)).to.equal(parseUnits("10000", 18)); await diamondUnitroller.connect(owner)._setMarketBorrowCaps([vUSDT.address], [currentBorrowCap]); - expect(await diamondUnitroller.borrowCaps(vUSDT.address)).to.equal(currentBorrowCap) - }) + expect(await diamondUnitroller.borrowCaps(vUSDT.address)).to.equal(currentBorrowCap); + }); it("pausing mint action in vUSDT", async () => { // let data = await unitroller.markets(vBUSD.address); // expect(data.collateralFactorMantissa).to.equals(0); console.log((await diamondUnitroller.supplyCaps(vBUSD.address)).toString(), "second"); - expect(await diamondUnitroller.connect(owner)._setActionsPaused([vBUSD.address],[0],true)).to.emit(vBUSD,"ActionPausedMarket"); + expect(await diamondUnitroller.connect(owner)._setActionsPaused([vBUSD.address], [0], true)).to.emit( + vBUSD, + "ActionPausedMarket", + ); - expect(await diamondUnitroller.connect(owner)._setActionsPaused([vBUSD.address],[0],false)).to.emit(vBUSD,"ActionPausedMarket"); + expect(await diamondUnitroller.connect(owner)._setActionsPaused([vBUSD.address], [0], false)).to.emit( + vBUSD, + "ActionPausedMarket", + ); // expect(await vBUSD.connect(usdtHolder).mint(1000)).to.be.reverted("action is paused") }); @@ -354,9 +365,9 @@ forking(26713742, () => { describe("Diamond Hooks", () => { it("mint vToken vBUSD", async () => { const vBUSDBalance = await BUSD.balanceOf(vBUSD.address); - const busdHolerBalance = (await BUSD.balanceOf(busdHolder.address)); + const busdHolerBalance = await BUSD.balanceOf(busdHolder.address); expect(await vBUSD.connect(busdHolder).mint(1000)).to.emit(vBUSD, "Mint"); - + const newvBUSDBalance = await BUSD.balanceOf(vBUSD.address); const newBusdHolerBalance = await BUSD.balanceOf(busdHolder.address); expect(newvBUSDBalance.toString()).to.equal(vBUSDBalance.add(1000)); @@ -365,16 +376,16 @@ forking(26713742, () => { it("redeem vToken", async () => { const vBUSDBalance = (await BUSD.balanceOf(vBUSD.address)).toString(); - const busdHolderBalance = (await vBUSD.balanceOf(busdHolder.address)); + const busdHolderBalance = await vBUSD.balanceOf(busdHolder.address); expect(await vBUSD.connect(busdHolder).redeem(1000)).to.emit(vBUSD, "Redeem"); - + const newVBUSDBalance = (await BUSD.balanceOf(vBUSD.address)).toString(); const newBusdHolerBalance = (await vBUSD.balanceOf(busdHolder.address)).toString(); expect(Number(vBUSDBalance)).greaterThan(Number(newVBUSDBalance)); expect(newBusdHolerBalance).to.equal(busdHolderBalance.sub(1000)); const vUSDTBalance = (await USDT.balanceOf(vUSDT.address)).toString(); - const usdtHolderBalance = (await vUSDT.balanceOf(usdtHolder.address)); + const usdtHolderBalance = await vUSDT.balanceOf(usdtHolder.address); expect(await vUSDT.connect(usdtHolder).redeem(1000)).to.emit(vUSDT, "Redeem"); const newVUSDTBalance = (await USDT.balanceOf(vUSDT.address)).toString(); const newUsdtHolerBalance = (await vUSDT.balanceOf(usdtHolder.address)).toString(); @@ -383,27 +394,22 @@ forking(26713742, () => { }); it("borrow vToken", async () => { - const busdUserBal = (await BUSD.balanceOf(busdHolder.address)); + const busdUserBal = await BUSD.balanceOf(busdHolder.address); expect(await vBUSD.connect(busdHolder).borrow(1000)).to.emit(vBUSD, "Borrow"); expect((await BUSD.balanceOf(busdHolder.address)).toString()).to.equal(busdUserBal.add(1000)); - const usdtUserBal = (await BUSD.balanceOf(usdtHolder.address)); + const usdtUserBal = await BUSD.balanceOf(usdtHolder.address); expect(await vBUSD.connect(usdtHolder).borrow(1000)).to.emit(vBUSD, "Borrow"); expect((await BUSD.balanceOf(usdtHolder.address)).toString()).to.equal(usdtUserBal.add(1000)); - }); it("Repay vToken", async () => { - const busdUserBal = (await BUSD.balanceOf(busdHolder.address)); + const busdUserBal = await BUSD.balanceOf(busdHolder.address); expect(await vBUSD.connect(busdHolder).borrow(1000)).to.emit(vBUSD, "Borrow"); - expect((await BUSD.balanceOf(busdHolder.address)).toString()).to.equal( - busdUserBal.add(1000) - ); + expect((await BUSD.balanceOf(busdHolder.address)).toString()).to.equal(busdUserBal.add(1000)); expect(await vBUSD.connect(busdHolder).repayBorrow(1000)).to.emit(vBUSD, "RepayBorrow"); - expect((await BUSD.balanceOf(busdHolder.address)).toString()).to.equal( - busdUserBal, - ); + expect((await BUSD.balanceOf(busdHolder.address)).toString()).to.equal(busdUserBal); }); describe("Diamond Rewards", () => { @@ -425,4 +431,4 @@ forking(26713742, () => { }); }); } -}); \ No newline at end of file +}); diff --git a/tests/hardhat/Fork/swapTest.ts b/tests/hardhat/Fork/swapTest.ts index 6ea23ddcd..3f71b1442 100644 --- a/tests/hardhat/Fork/swapTest.ts +++ b/tests/hardhat/Fork/swapTest.ts @@ -84,7 +84,9 @@ async function configureVtoken(underlyingToken: FaucetToken | VBep20Immutable, n const interestRateModel = await InterstRateModel.deploy(parseUnits("1", 12)); await interestRateModel.deployed(); - const vTokenFactory = await ethers.getContractFactory("contracts/Tokens/V0.8.13/VTokens/VBep20Immutable.sol:VBep20Immutable"); + const vTokenFactory = await ethers.getContractFactory( + "contracts/Tokens/V0.8.13/VTokens/VBep20Immutable.sol:VBep20Immutable", + ); const vToken = await vTokenFactory.deploy( underlyingToken.address, comptroller.address, diff --git a/tests/hardhat/Liquidator/liquidatorTest.ts b/tests/hardhat/Liquidator/liquidatorTest.ts index a6fe41464..0f2446152 100644 --- a/tests/hardhat/Liquidator/liquidatorTest.ts +++ b/tests/hardhat/Liquidator/liquidatorTest.ts @@ -48,8 +48,12 @@ async function deployLiquidator(): Promise { const borrowedUnderlying = await FaucetToken.deploy(convertToBigInt("100", 18), "USD", 18, "USD"); const vai = await FaucetToken.deploy(convertToBigInt("100", 18), "VAI", 18, "VAI"); const vaiController = await smock.fake("VAIController"); - const vTokenBorrowed = await smock.fake("contracts/Tokens/V0.8.13/VTokens/VBep20Immutable.sol:VBep20Immutable"); - const vTokenCollateral = await smock.fake("contracts/Tokens/V0.8.13/VTokens/VBep20Immutable.sol:VBep20Immutable"); + const vTokenBorrowed = await smock.fake( + "contracts/Tokens/V0.8.13/VTokens/VBep20Immutable.sol:VBep20Immutable", + ); + const vTokenCollateral = await smock.fake( + "contracts/Tokens/V0.8.13/VTokens/VBep20Immutable.sol:VBep20Immutable", + ); comptroller.liquidationIncentiveMantissa.returns(announcedIncentive); comptroller.vaiController.returns(vaiController.address); diff --git a/tests/hardhat/Swap/swapTest.ts b/tests/hardhat/Swap/swapTest.ts index 4e080e31c..4afd77b82 100644 --- a/tests/hardhat/Swap/swapTest.ts +++ b/tests/hardhat/Swap/swapTest.ts @@ -49,7 +49,9 @@ type SwapFixture = { }; async function deploySwapContract(): Promise { - const vToken = await smock.fake("contracts/Tokens/V0.8.13/VTokens/VBep20Immutable.sol:VBep20Immutable"); + const vToken = await smock.fake( + "contracts/Tokens/V0.8.13/VTokens/VBep20Immutable.sol:VBep20Immutable", + ); const wBNBFactory = await smock.mock("WBNB"); const wBNB = await wBNBFactory.deploy(); const pancakeFactory = await smock.fake("IPancakeSwapV2Factory"); diff --git a/tests/hardhat/VAI/VAIController.ts b/tests/hardhat/VAI/VAIController.ts index 793dcd009..35678c544 100644 --- a/tests/hardhat/VAI/VAIController.ts +++ b/tests/hardhat/VAI/VAIController.ts @@ -65,7 +65,9 @@ describe("VAIController", async () => { "BEP20 usdt", )) as BEP20Harness; - const accessControl = await smock.fake("contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager"); + const accessControl = await smock.fake( + "contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager", + ); accessControl.isAllowedToCall.returns(true); const ComptrollerFactory = await smock.mock("Comptroller"); @@ -534,7 +536,9 @@ describe("VAIController", async () => { }); it("emits NewAccessControl event", async () => { - const newAccessControl = await smock.fake("contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager"); + const newAccessControl = await smock.fake( + "contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager", + ); const tx = await vaiController.setAccessControl(newAccessControl.address); await expect(tx) .to.emit(vaiController, "NewAccessControl") @@ -542,7 +546,9 @@ describe("VAIController", async () => { }); it("sets ACM address in storage", async () => { - const newAccessControl = await smock.fake("contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager"); + const newAccessControl = await smock.fake( + "contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager", + ); await vaiController.setAccessControl(newAccessControl.address); expect(await vaiController.getVariable("accessControl")).to.equal(newAccessControl.address); }); From 65c03bcea92c58c2ce1a926fb04fb379a2b0c543 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Tue, 28 Mar 2023 19:32:55 +0530 Subject: [PATCH 055/153] Fix lint issue. --- tests/hardhat/Fork/diamondTest.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/hardhat/Fork/diamondTest.ts b/tests/hardhat/Fork/diamondTest.ts index cb2e1b564..f273a9681 100644 --- a/tests/hardhat/Fork/diamondTest.ts +++ b/tests/hardhat/Fork/diamondTest.ts @@ -414,12 +414,12 @@ forking(26713742, () => { describe("Diamond Rewards", () => { it.only("grant and claim rewards", async () => { - let xvsOwner = "0x3a3284dc0faffb0b5f0d074c4c704d14326c98cf"; + const xvsOwner = "0x3a3284dc0faffb0b5f0d074c4c704d14326c98cf"; await impersonateAccount(xvsOwner); const xvsAdmin = await ethers.getSigner(xvsOwner); - let vXVSAddress = await unitroller.getXVSVTokenAddress(); - let XVSAddress = await unitroller.getXVSAddress(); + const vXVSAddress = await unitroller.getXVSVTokenAddress(); + const XVSAddress = await unitroller.getXVSAddress(); XVS = XVS__factory.connect(XVSAddress, xvsAdmin); vXVS = VToken__factory.connect(vXVSAddress, admin); From d11667184bce0557148109a85ff59fc72e562578 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Tue, 28 Mar 2023 20:21:53 +0530 Subject: [PATCH 056/153] Removed unsafe math from upper solidity version contracts. --- .../V0.8.13/JumpRateModel.sol | 27 +++++----- .../V0.8.13/WhitePaperInterestRateModel.sol | 19 +++---- .../Oracle/V0.8.13/VenusChainlinkOracle.sol | 12 ++--- contracts/test/BEP20.sol | 51 +++++++------------ contracts/test/EvilToken.sol | 13 +++-- contracts/test/FaucetToken.sol | 14 +++-- contracts/test/FeeToken.sol | 25 +++++---- contracts/test/MockDeflationaryToken.sol | 22 ++++---- tests/hardhat/Fork/diamondTest.ts | 30 ++++------- 9 files changed, 86 insertions(+), 127 deletions(-) diff --git a/contracts/InterestRateModels/V0.8.13/JumpRateModel.sol b/contracts/InterestRateModels/V0.8.13/JumpRateModel.sol index 71ba90949..b7a6dab87 100644 --- a/contracts/InterestRateModels/V0.8.13/JumpRateModel.sol +++ b/contracts/InterestRateModels/V0.8.13/JumpRateModel.sol @@ -1,6 +1,5 @@ pragma solidity 0.8.13; -import "../../Utils/V0.8.13/SafeMath.sol"; import "./InterestRateModel.sol"; /** @@ -8,8 +7,6 @@ import "./InterestRateModel.sol"; * @author Venus */ contract JumpRateModel is InterestRateModel { - using SafeMath for uint; - event NewInterestParams(uint baseRatePerBlock, uint multiplierPerBlock, uint jumpMultiplierPerBlock, uint kink); /** @@ -44,10 +41,10 @@ contract JumpRateModel is InterestRateModel { * @param jumpMultiplierPerYear The multiplierPerBlock after hitting a specified utilization point * @param kink_ The utilization point at which the jump multiplier is applied */ - constructor(uint baseRatePerYear, uint multiplierPerYear, uint jumpMultiplierPerYear, uint kink_) public { - baseRatePerBlock = baseRatePerYear.div(blocksPerYear); - multiplierPerBlock = multiplierPerYear.div(blocksPerYear); - jumpMultiplierPerBlock = jumpMultiplierPerYear.div(blocksPerYear); + constructor(uint baseRatePerYear, uint multiplierPerYear, uint jumpMultiplierPerYear, uint kink_) { + baseRatePerBlock = baseRatePerYear / blocksPerYear; + multiplierPerBlock = multiplierPerYear / blocksPerYear; + jumpMultiplierPerBlock = jumpMultiplierPerYear / blocksPerYear; kink = kink_; emit NewInterestParams(baseRatePerBlock, multiplierPerBlock, jumpMultiplierPerBlock, kink); @@ -66,7 +63,7 @@ contract JumpRateModel is InterestRateModel { return 0; } - return borrows.mul(1e18).div(cash.add(borrows).sub(reserves)); + return (borrows * 1e18) / (cash + borrows - reserves); } /** @@ -80,11 +77,11 @@ contract JumpRateModel is InterestRateModel { uint util = utilizationRate(cash, borrows, reserves); if (util <= kink) { - return util.mul(multiplierPerBlock).div(1e18).add(baseRatePerBlock); + return ((util * multiplierPerBlock) / 1e18) + baseRatePerBlock; } else { - uint normalRate = kink.mul(multiplierPerBlock).div(1e18).add(baseRatePerBlock); - uint excessUtil = util.sub(kink); - return excessUtil.mul(jumpMultiplierPerBlock).div(1e18).add(normalRate); + uint normalRate = ((kink * multiplierPerBlock) / 1e18) + baseRatePerBlock; + uint excessUtil = util / kink; + return ((excessUtil * jumpMultiplierPerBlock) / 1e18) + normalRate; } } @@ -102,9 +99,9 @@ contract JumpRateModel is InterestRateModel { uint reserves, uint reserveFactorMantissa ) public view override returns (uint) { - uint oneMinusReserveFactor = uint(1e18).sub(reserveFactorMantissa); + uint oneMinusReserveFactor = 1e18 - reserveFactorMantissa; uint borrowRate = getBorrowRate(cash, borrows, reserves); - uint rateToPool = borrowRate.mul(oneMinusReserveFactor).div(1e18); - return utilizationRate(cash, borrows, reserves).mul(rateToPool).div(1e18); + uint rateToPool = (borrowRate * oneMinusReserveFactor) / 1e18; + return (utilizationRate(cash, borrows, reserves) * (rateToPool)) / 1e18; } } diff --git a/contracts/InterestRateModels/V0.8.13/WhitePaperInterestRateModel.sol b/contracts/InterestRateModels/V0.8.13/WhitePaperInterestRateModel.sol index 2df4dc50a..00c71e0b6 100644 --- a/contracts/InterestRateModels/V0.8.13/WhitePaperInterestRateModel.sol +++ b/contracts/InterestRateModels/V0.8.13/WhitePaperInterestRateModel.sol @@ -1,6 +1,5 @@ pragma solidity 0.8.13; -import "../../Utils/V0.8.13/SafeMath.sol"; import "./InterestRateModel.sol"; /** @@ -9,8 +8,6 @@ import "./InterestRateModel.sol"; * @notice The parameterized model described in section 2.4 of the original Venus Protocol whitepaper */ contract WhitePaperInterestRateModel is InterestRateModel { - using SafeMath for uint; - event NewInterestParams(uint baseRatePerBlock, uint multiplierPerBlock); /** @@ -33,9 +30,9 @@ contract WhitePaperInterestRateModel is InterestRateModel { * @param baseRatePerYear The approximate target base APR, as a mantissa (scaled by 1e18) * @param multiplierPerYear The rate of increase in interest rate wrt utilization (scaled by 1e18) */ - constructor(uint baseRatePerYear, uint multiplierPerYear) public { - baseRatePerBlock = baseRatePerYear.div(blocksPerYear); - multiplierPerBlock = multiplierPerYear.div(blocksPerYear); + constructor(uint baseRatePerYear, uint multiplierPerYear) { + baseRatePerBlock = baseRatePerYear / blocksPerYear; + multiplierPerBlock = multiplierPerYear / blocksPerYear; emit NewInterestParams(baseRatePerBlock, multiplierPerBlock); } @@ -53,7 +50,7 @@ contract WhitePaperInterestRateModel is InterestRateModel { return 0; } - return borrows.mul(1e18).div(cash.add(borrows).sub(reserves)); + return (borrows * 1e18) / (cash + borrows - reserves); } /** @@ -65,7 +62,7 @@ contract WhitePaperInterestRateModel is InterestRateModel { */ function getBorrowRate(uint cash, uint borrows, uint reserves) public view override returns (uint) { uint ur = utilizationRate(cash, borrows, reserves); - return ur.mul(multiplierPerBlock).div(1e18).add(baseRatePerBlock); + return ((ur * multiplierPerBlock) / 1e18) + baseRatePerBlock; } /** @@ -82,9 +79,9 @@ contract WhitePaperInterestRateModel is InterestRateModel { uint reserves, uint reserveFactorMantissa ) public view override returns (uint) { - uint oneMinusReserveFactor = uint(1e18).sub(reserveFactorMantissa); + uint oneMinusReserveFactor = 1e18 - reserveFactorMantissa; uint borrowRate = getBorrowRate(cash, borrows, reserves); - uint rateToPool = borrowRate.mul(oneMinusReserveFactor).div(1e18); - return utilizationRate(cash, borrows, reserves).mul(rateToPool).div(1e18); + uint rateToPool = (borrowRate * oneMinusReserveFactor) / 1e18; + return (utilizationRate(cash, borrows, reserves) * rateToPool) / 1e18; } } diff --git a/contracts/Oracle/V0.8.13/VenusChainlinkOracle.sol b/contracts/Oracle/V0.8.13/VenusChainlinkOracle.sol index 46f1cb4e6..701cb894d 100644 --- a/contracts/Oracle/V0.8.13/VenusChainlinkOracle.sol +++ b/contracts/Oracle/V0.8.13/VenusChainlinkOracle.sol @@ -2,12 +2,10 @@ pragma solidity 0.8.13; import "../../Tokens/V0.8.13/VTokens/VBep20.sol"; import "../../Tokens/V0.8.13/BEP20Interface.sol"; -import "../../Utils/V0.8.13/SafeMath.sol"; import "./PriceOracle.sol"; import "../AggregatorV2V3Interface.sol"; contract VenusChainlinkOracle is PriceOracle { - using SafeMath for uint; address public admin; uint public maxStalePeriod; @@ -54,10 +52,10 @@ contract VenusChainlinkOracle is PriceOracle { price = getChainlinkPrice(getFeed(token.symbol())); } - uint decimalDelta = uint(18).sub(uint(token.decimals())); + uint decimalDelta = 18 - (uint(token.decimals())); // Ensure that we don't multiply the result by 0 if (decimalDelta > 0) { - return price.mul(10 ** decimalDelta); + return price * (10 ** decimalDelta); } else { return price; } @@ -65,16 +63,16 @@ contract VenusChainlinkOracle is PriceOracle { function getChainlinkPrice(AggregatorV2V3Interface feed) internal view returns (uint) { // Chainlink USD-denominated feeds store answers at 8 decimals - uint decimalDelta = uint(18).sub(feed.decimals()); + uint decimalDelta = 18 / (feed.decimals()); (, int256 answer, , uint256 updatedAt, ) = feed.latestRoundData(); // Ensure that we don't multiply the result by 0 - if (block.timestamp.sub(updatedAt) > maxStalePeriod) { + if ((block.timestamp - updatedAt) > maxStalePeriod) { return 0; } if (decimalDelta > 0) { - return uint(answer).mul(10 ** decimalDelta); + return uint(answer) * (10 ** decimalDelta); } else { return uint(answer); } diff --git a/contracts/test/BEP20.sol b/contracts/test/BEP20.sol index c43e2e7fa..11f45b002 100644 --- a/contracts/test/BEP20.sol +++ b/contracts/test/BEP20.sol @@ -1,7 +1,5 @@ pragma solidity 0.8.13; -import "../Utils/V0.8.13/SafeMath.sol"; - interface BEP20Base { event Approval(address indexed owner, address indexed spender, uint256 value); event Transfer(address indexed from, address indexed to, uint256 value); @@ -33,8 +31,6 @@ abstract contract BEP20NS is BEP20Base { * See https://github.com/ethereum/EIPs/issues/20 */ contract StandardToken is BEP20 { - using SafeMath for uint256; - string public name; string public symbol; uint8 public decimals; @@ -42,12 +38,7 @@ contract StandardToken is BEP20 { mapping(address => mapping(address => uint256)) public allowance; mapping(address => uint256) public balanceOf; - constructor( - uint256 _initialAmount, - string memory _tokenName, - uint8 _decimalUnits, - string memory _tokenSymbol - ) public { + constructor(uint256 _initialAmount, string memory _tokenName, uint8 _decimalUnits, string memory _tokenSymbol) { totalSupply = _initialAmount; balanceOf[msg.sender] = _initialAmount; name = _tokenName; @@ -56,16 +47,16 @@ contract StandardToken is BEP20 { } function transfer(address dst, uint256 amount) external virtual override returns (bool) { - balanceOf[msg.sender] = balanceOf[msg.sender].sub(amount, "Insufficient balance"); - balanceOf[dst] = balanceOf[dst].add(amount, "Balance overflow"); + balanceOf[msg.sender] = balanceOf[msg.sender] - amount; + balanceOf[dst] = balanceOf[dst] + amount; emit Transfer(msg.sender, dst, amount); return true; } function transferFrom(address src, address dst, uint256 amount) external virtual override returns (bool) { - allowance[src][msg.sender] = allowance[src][msg.sender].sub(amount, "Insufficient allowance"); - balanceOf[src] = balanceOf[src].sub(amount, "Insufficient balance"); - balanceOf[dst] = balanceOf[dst].add(amount, "Balance overflow"); + allowance[src][msg.sender] = allowance[src][msg.sender] - amount; + balanceOf[src] = balanceOf[src] - amount; + balanceOf[dst] = balanceOf[dst] + amount; emit Transfer(src, dst, amount); return true; } @@ -83,8 +74,6 @@ contract StandardToken is BEP20 { * See https://medium.com/coinmonks/missing-return-value-bug-at-least-130-tokens-affected-d67bf08521ca */ contract NonStandardToken is BEP20NS { - using SafeMath for uint256; - string public name; uint8 public decimals; string public symbol; @@ -92,12 +81,7 @@ contract NonStandardToken is BEP20NS { mapping(address => mapping(address => uint256)) public allowance; mapping(address => uint256) public balanceOf; - constructor( - uint256 _initialAmount, - string memory _tokenName, - uint8 _decimalUnits, - string memory _tokenSymbol - ) public { + constructor(uint256 _initialAmount, string memory _tokenName, uint8 _decimalUnits, string memory _tokenSymbol) { totalSupply = _initialAmount; balanceOf[msg.sender] = _initialAmount; name = _tokenName; @@ -106,15 +90,15 @@ contract NonStandardToken is BEP20NS { } function transfer(address dst, uint256 amount) external override { - balanceOf[msg.sender] = balanceOf[msg.sender].sub(amount, "Insufficient balance"); - balanceOf[dst] = balanceOf[dst].add(amount, "Balance overflow"); + balanceOf[msg.sender] = balanceOf[msg.sender] - amount; + balanceOf[dst] = balanceOf[dst] + amount; emit Transfer(msg.sender, dst, amount); } function transferFrom(address src, address dst, uint256 amount) external override { - allowance[src][msg.sender] = allowance[src][msg.sender].sub(amount, "Insufficient allowance"); - balanceOf[src] = balanceOf[src].sub(amount, "Insufficient balance"); - balanceOf[dst] = balanceOf[dst].add(amount, "Balance overflow"); + allowance[src][msg.sender] = allowance[src][msg.sender] - amount; + balanceOf[src] = balanceOf[src] - amount; + balanceOf[dst] = balanceOf[dst] + amount; emit Transfer(src, dst, amount); } @@ -126,7 +110,6 @@ contract NonStandardToken is BEP20NS { } contract BEP20Harness is StandardToken { - using SafeMath for uint256; // To support testing, we can specify addresses for which transferFrom should fail and return false mapping(address => bool) public failTransferFromAddresses; @@ -157,8 +140,8 @@ contract BEP20Harness is StandardToken { if (failTransferToAddresses[dst]) { return false; } - balanceOf[msg.sender] = balanceOf[msg.sender].sub(amount, "Insufficient balance"); - balanceOf[dst] = balanceOf[dst].add(amount, "Balance overflow"); + balanceOf[msg.sender] = balanceOf[msg.sender] - amount; + balanceOf[dst] = balanceOf[dst] + amount; emit Transfer(msg.sender, dst, amount); return true; } @@ -168,9 +151,9 @@ contract BEP20Harness is StandardToken { if (failTransferFromAddresses[src]) { return false; } - allowance[src][msg.sender] = allowance[src][msg.sender].sub(amount, "Insufficient allowance"); - balanceOf[src] = balanceOf[src].sub(amount, "Insufficient balance"); - balanceOf[dst] = balanceOf[dst].add(amount, "Balance overflow"); + allowance[src][msg.sender] = allowance[src][msg.sender] - amount; + balanceOf[src] = balanceOf[src] - amount; + balanceOf[dst] = balanceOf[dst] + amount; emit Transfer(src, dst, amount); return true; } diff --git a/contracts/test/EvilToken.sol b/contracts/test/EvilToken.sol index d94ed9db4..195ad2c29 100644 --- a/contracts/test/EvilToken.sol +++ b/contracts/test/EvilToken.sol @@ -8,7 +8,6 @@ import "./FaucetToken.sol"; * @notice A simple test token that fails certain operations */ contract EvilToken is FaucetToken { - using SafeMath for uint256; bool public fail; constructor( @@ -16,7 +15,7 @@ contract EvilToken is FaucetToken { string memory _tokenName, uint8 _decimalUnits, string memory _tokenSymbol - ) public FaucetToken(_initialAmount, _tokenName, _decimalUnits, _tokenSymbol) { + ) FaucetToken(_initialAmount, _tokenName, _decimalUnits, _tokenSymbol) { fail = true; } @@ -28,8 +27,8 @@ contract EvilToken is FaucetToken { if (fail) { return false; } - balanceOf[msg.sender] = balanceOf[msg.sender].sub(amount); - balanceOf[dst] = balanceOf[dst].add(amount); + balanceOf[msg.sender] = balanceOf[msg.sender] - amount; + balanceOf[dst] = balanceOf[dst] + amount; emit Transfer(msg.sender, dst, amount); return true; } @@ -38,9 +37,9 @@ contract EvilToken is FaucetToken { if (fail) { return false; } - balanceOf[src] = balanceOf[src].sub(amount); - balanceOf[dst] = balanceOf[dst].add(amount); - allowance[src][msg.sender] = allowance[src][msg.sender].sub(amount); + balanceOf[src] = balanceOf[src] - amount; + balanceOf[dst] = balanceOf[dst] + amount; + allowance[src][msg.sender] = allowance[src][msg.sender] - amount; emit Transfer(src, dst, amount); return true; } diff --git a/contracts/test/FaucetToken.sol b/contracts/test/FaucetToken.sol index 586fe933c..7ba842720 100644 --- a/contracts/test/FaucetToken.sol +++ b/contracts/test/FaucetToken.sol @@ -13,7 +13,7 @@ contract FaucetToken is StandardToken { string memory _tokenName, uint8 _decimalUnits, string memory _tokenSymbol - ) public StandardToken(_initialAmount, _tokenName, _decimalUnits, _tokenSymbol) {} + ) StandardToken(_initialAmount, _tokenName, _decimalUnits, _tokenSymbol) {} function allocateTo(address _owner, uint256 value) public { balanceOf[_owner] += value; @@ -33,7 +33,7 @@ contract FaucetNonStandardToken is NonStandardToken { string memory _tokenName, uint8 _decimalUnits, string memory _tokenSymbol - ) public NonStandardToken(_initialAmount, _tokenName, _decimalUnits, _tokenSymbol) {} + ) NonStandardToken(_initialAmount, _tokenName, _decimalUnits, _tokenSymbol) {} function allocateTo(address _owner, uint256 value) public { balanceOf[_owner] += value; @@ -48,8 +48,6 @@ contract FaucetNonStandardToken is NonStandardToken { * @notice A test token that is malicious and tries to re-enter callers */ contract FaucetTokenReEntrantHarness { - using SafeMath for uint256; - event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); @@ -70,7 +68,7 @@ contract FaucetTokenReEntrantHarness { string memory _tokenSymbol, bytes memory _reEntryCallData, string memory _reEntryFun - ) public { + ) { totalSupply_ = _initialAmount; balanceOf_[msg.sender] = _initialAmount; name = _tokenName; @@ -133,7 +131,7 @@ contract FaucetTokenReEntrantHarness { uint256 amount ) public reEnter("transferFrom") returns (bool success) { _transfer(src, dst, amount); - _approve(src, msg.sender, allowance_[src][msg.sender].sub(amount)); + _approve(src, msg.sender, allowance_[src][msg.sender] - amount); return true; } @@ -146,8 +144,8 @@ contract FaucetTokenReEntrantHarness { function _transfer(address src, address dst, uint256 amount) internal { require(dst != address(0), "dst should be valid address"); - balanceOf_[src] = balanceOf_[src].sub(amount); - balanceOf_[dst] = balanceOf_[dst].add(amount); + balanceOf_[src] = balanceOf_[src] - amount; + balanceOf_[dst] = balanceOf_[dst] + amount; emit Transfer(src, dst, amount); } } diff --git a/contracts/test/FeeToken.sol b/contracts/test/FeeToken.sol index 4226ba5d7..97f18c30c 100644 --- a/contracts/test/FeeToken.sol +++ b/contracts/test/FeeToken.sol @@ -8,7 +8,6 @@ import "./FaucetToken.sol"; * @notice A simple test token that charges fees on transfer. Used to mock USDT. */ contract FeeToken is FaucetToken { - using SafeMath for uint256; uint public basisPointFee; address public owner; @@ -19,28 +18,28 @@ contract FeeToken is FaucetToken { string memory _tokenSymbol, uint _basisPointFee, address _owner - ) public FaucetToken(_initialAmount, _tokenName, _decimalUnits, _tokenSymbol) { + ) FaucetToken(_initialAmount, _tokenName, _decimalUnits, _tokenSymbol) { basisPointFee = _basisPointFee; owner = _owner; } function transfer(address dst, uint amount) public override returns (bool) { - uint fee = amount.mul(basisPointFee).div(10000); - uint net = amount.sub(fee); - balanceOf[owner] = balanceOf[owner].add(fee); - balanceOf[msg.sender] = balanceOf[msg.sender].sub(amount); - balanceOf[dst] = balanceOf[dst].add(net); + uint fee = (amount * basisPointFee) / 10000; + uint net = amount - fee; + balanceOf[owner] = balanceOf[owner] + fee; + balanceOf[msg.sender] = balanceOf[msg.sender] - amount; + balanceOf[dst] = balanceOf[dst] + net; emit Transfer(msg.sender, dst, amount); return true; } function transferFrom(address src, address dst, uint amount) public override returns (bool) { - uint fee = amount.mul(basisPointFee).div(10000); - uint net = amount.sub(fee); - balanceOf[owner] = balanceOf[owner].add(fee); - balanceOf[src] = balanceOf[src].sub(amount); - balanceOf[dst] = balanceOf[dst].add(net); - allowance[src][msg.sender] = allowance[src][msg.sender].sub(amount); + uint fee = (amount * basisPointFee) / 10000; + uint net = amount / fee; + balanceOf[owner] = balanceOf[owner] + fee; + balanceOf[src] = balanceOf[src] / amount; + balanceOf[dst] = balanceOf[dst] + net; + allowance[src][msg.sender] = allowance[src][msg.sender] - amount; emit Transfer(src, dst, amount); return true; } diff --git a/contracts/test/MockDeflationaryToken.sol b/contracts/test/MockDeflationaryToken.sol index bcb7a021d..ce34b2885 100644 --- a/contracts/test/MockDeflationaryToken.sol +++ b/contracts/test/MockDeflationaryToken.sol @@ -1,10 +1,6 @@ pragma solidity 0.8.13; -import "../Utils/V0.8.13/SafeMath.sol"; - contract DeflatingERC20 { - using SafeMath for uint; - string public constant name = "Deflating Test Token"; string public constant symbol = "DTT"; uint8 public constant decimals = 18; @@ -20,7 +16,7 @@ contract DeflatingERC20 { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); - constructor(uint _totalSupply) public { + constructor(uint _totalSupply) { uint chainId; assembly { chainId := chainid() @@ -38,14 +34,14 @@ contract DeflatingERC20 { } function _mint(address to, uint value) internal { - totalSupply = totalSupply.add(value); - balanceOf[to] = balanceOf[to].add(value); + totalSupply = totalSupply + value; + balanceOf[to] = balanceOf[to] + value; emit Transfer(address(0), to, value); } function _burn(address from, uint value) internal { - balanceOf[from] = balanceOf[from].sub(value); - totalSupply = totalSupply.sub(value); + balanceOf[from] = balanceOf[from] - value; + totalSupply = totalSupply - value; emit Transfer(from, address(0), value); } @@ -57,9 +53,9 @@ contract DeflatingERC20 { function _transfer(address from, address to, uint value) private { uint burnAmount = value / 100; _burn(from, burnAmount); - uint transferAmount = value.sub(burnAmount); - balanceOf[from] = balanceOf[from].sub(transferAmount); - balanceOf[to] = balanceOf[to].add(transferAmount); + uint transferAmount = value - burnAmount; + balanceOf[from] = balanceOf[from] - transferAmount; + balanceOf[to] = balanceOf[to] + transferAmount; emit Transfer(from, to, transferAmount); } @@ -75,7 +71,7 @@ contract DeflatingERC20 { function transferFrom(address from, address to, uint value) external returns (bool) { if (allowance[from][msg.sender] != type(uint).max) { - allowance[from][msg.sender] = allowance[from][msg.sender].sub(value); + allowance[from][msg.sender] = allowance[from][msg.sender] - value; } _transfer(from, to, value); return true; diff --git a/tests/hardhat/Fork/diamondTest.ts b/tests/hardhat/Fork/diamondTest.ts index f273a9681..05428b25f 100644 --- a/tests/hardhat/Fork/diamondTest.ts +++ b/tests/hardhat/Fork/diamondTest.ts @@ -81,12 +81,12 @@ const forking = (blockNumber: number, fn: () => void) => { forking(26713742, () => { let USDT: IERC20Upgradeable; let BUSD: IERC20Upgradeable; - let XVS: IERC20Upgradeable; - let usdtHolder: any; - let busdHolder: any; - let vBUSD: any; - let vUSDT: any; - let vXVS: any; + // let XVS: IERC20Upgradeable; + let usdtHolder: ethers.Signer; + let busdHolder: ethers.Signer; + let vBUSD: ethers.contract; + let vUSDT: ethers.contract; + // let vXVS: ethers.contract; let admin: SignerWithAddress; let diamondUnitroller; @@ -124,7 +124,7 @@ forking(26713742, () => { [vBUSD, vUSDT] = await Promise.all( [VBUSD, VUSDT].map((address: string) => { - return ethers.getContractAt("VBep20Delegate", address); + return ethers.getContractAt("contracts/Tokens/V0.8.13/VTokens/VBep20Delegate.sol:VBep20Delegate", address); }), ); [BUSD, USDT] = await Promise.all( @@ -154,7 +154,7 @@ forking(26713742, () => { }); describe("Verify storage layout", async () => { - it.only("verify all the state before and after upgrade", async () => { + it("verify all the state before and after upgrade", async () => { maxAssets = await unitroller.maxAssets(); const maxAssetsAfterUpgrade = await diamondUnitroller.maxAssets(); expect(maxAssets).to.equal(maxAssetsAfterUpgrade); @@ -316,8 +316,6 @@ forking(26713742, () => { }); it("setting setting Liquidation Incentive", async () => { - // console.log((await diamondUnitroller.liquidationIncentiveMantissa()).toString()); - await diamondUnitroller.connect(owner)._setLiquidationIncentive(parseUnits("13", 17)); expect(await diamondUnitroller.liquidationIncentiveMantissa()).to.equal(parseUnits("13", 17)); @@ -345,9 +343,6 @@ forking(26713742, () => { }); it("pausing mint action in vUSDT", async () => { - // let data = await unitroller.markets(vBUSD.address); - // expect(data.collateralFactorMantissa).to.equals(0); - console.log((await diamondUnitroller.supplyCaps(vBUSD.address)).toString(), "second"); expect(await diamondUnitroller.connect(owner)._setActionsPaused([vBUSD.address], [0], true)).to.emit( vBUSD, "ActionPausedMarket", @@ -413,18 +408,15 @@ forking(26713742, () => { }); describe("Diamond Rewards", () => { - it.only("grant and claim rewards", async () => { + it("grant and claim rewards", async () => { const xvsOwner = "0x3a3284dc0faffb0b5f0d074c4c704d14326c98cf"; await impersonateAccount(xvsOwner); const xvsAdmin = await ethers.getSigner(xvsOwner); const vXVSAddress = await unitroller.getXVSVTokenAddress(); const XVSAddress = await unitroller.getXVSAddress(); - XVS = XVS__factory.connect(XVSAddress, xvsAdmin); - vXVS = VToken__factory.connect(vXVSAddress, admin); - - console.log((await XVS.connect(busdHolder).balanceOf(busdHolder.address)).toString()); - + const XVS = XVS__factory.connect(XVSAddress, xvsAdmin); + const vXVS = VToken__factory.connect(vXVSAddress, admin); // await diamondUnitroller.claimVenus(busdHolder.address,[vBUSD.address]); }); }); From ca044ff8105b24e7d74213f8a89941d2d5145d78 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Tue, 28 Mar 2023 20:31:53 +0530 Subject: [PATCH 057/153] Lint fix. --- script/diamond/deploy.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/diamond/deploy.js b/script/diamond/deploy.js index d726b9bb0..9ce89d173 100644 --- a/script/diamond/deploy.js +++ b/script/diamond/deploy.js @@ -66,7 +66,7 @@ async function deployDiamond(unitrollerAddress) { action: FacetCutAction.Add, functionSelectors: getSelectors(facet), }); - index++; + index++; //eslint-disable-line } // upgrade diamond with facets From b4495e6da95c0d11a2b1ac69688361195dd3b01c Mon Sep 17 00:00:00 2001 From: defcon022 Date: Tue, 28 Mar 2023 21:13:22 +0530 Subject: [PATCH 058/153] Stable solidity version. --- contracts/Diamond/interfaces/IMarketFacet.sol | 2 +- contracts/Diamond/interfaces/IPloicyFacet.sol | 2 +- contracts/Diamond/upgradeInitialize/DiamondInit.sol | 2 +- contracts/Oracle/V0.8.13/PriceOracle.sol | 2 +- contracts/Swap/interfaces/CustomErrors.sol | 2 +- contracts/Tokens/V0.8.13/VTokens/VToken.sol | 2 +- tests/hardhat/Fork/diamondTest.ts | 8 ++++---- 7 files changed, 10 insertions(+), 10 deletions(-) diff --git a/contracts/Diamond/interfaces/IMarketFacet.sol b/contracts/Diamond/interfaces/IMarketFacet.sol index 78e8b6569..3dfa56b70 100644 --- a/contracts/Diamond/interfaces/IMarketFacet.sol +++ b/contracts/Diamond/interfaces/IMarketFacet.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.8.13; +pragma solidity 0.8.13; interface IMarketFacet { function enterMarkets(address[] calldata vTokens) external returns (uint[] memory); diff --git a/contracts/Diamond/interfaces/IPloicyFacet.sol b/contracts/Diamond/interfaces/IPloicyFacet.sol index 7f2dd5113..fa1f4d52c 100644 --- a/contracts/Diamond/interfaces/IPloicyFacet.sol +++ b/contracts/Diamond/interfaces/IPloicyFacet.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.8.13; +pragma solidity 0.8.13; interface IPolicyFacet { function mintAllowed(address vToken, address minter, uint mintAmount) external returns (uint); diff --git a/contracts/Diamond/upgradeInitialize/DiamondInit.sol b/contracts/Diamond/upgradeInitialize/DiamondInit.sol index 0181f64a5..6bfe6db62 100644 --- a/contracts/Diamond/upgradeInitialize/DiamondInit.sol +++ b/contracts/Diamond/upgradeInitialize/DiamondInit.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; +pragma solidity 0.8.13; /******************************************************************************\ diff --git a/contracts/Oracle/V0.8.13/PriceOracle.sol b/contracts/Oracle/V0.8.13/PriceOracle.sol index c4e66b532..3769a9c08 100644 --- a/contracts/Oracle/V0.8.13/PriceOracle.sol +++ b/contracts/Oracle/V0.8.13/PriceOracle.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.8.13; +pragma solidity 0.8.13; import "../../Tokens/V0.8.13/VTokens/VToken.sol"; diff --git a/contracts/Swap/interfaces/CustomErrors.sol b/contracts/Swap/interfaces/CustomErrors.sol index 4c9962567..eb2c5af57 100644 --- a/contracts/Swap/interfaces/CustomErrors.sol +++ b/contracts/Swap/interfaces/CustomErrors.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.8.13; +pragma solidity 0.8.13; // ************** // *** ERRORS *** // ************** diff --git a/contracts/Tokens/V0.8.13/VTokens/VToken.sol b/contracts/Tokens/V0.8.13/VTokens/VToken.sol index 640ca50bb..262f800cb 100644 --- a/contracts/Tokens/V0.8.13/VTokens/VToken.sol +++ b/contracts/Tokens/V0.8.13/VTokens/VToken.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.8.13; +pragma solidity 0.8.13; import "../../../Utils/V0.8.13/ErrorReporter.sol"; import "../../../Utils/V0.8.13/Exponential.sol"; diff --git a/tests/hardhat/Fork/diamondTest.ts b/tests/hardhat/Fork/diamondTest.ts index 05428b25f..67ff5646b 100644 --- a/tests/hardhat/Fork/diamondTest.ts +++ b/tests/hardhat/Fork/diamondTest.ts @@ -5,7 +5,7 @@ import chai from "chai"; import { parseUnits } from "ethers/lib/utils"; import { ethers, network } from "hardhat"; -import { IERC20Upgradeable, VBep20, VToken__factory, XVS__factory } from "../../../typechain"; +import { VBep20, VToken__factory, XVS__factory } from "../../../typechain"; const { deployDiamond } = require("../../../script/diamond/deploy"); @@ -79,8 +79,8 @@ const forking = (blockNumber: number, fn: () => void) => { }; forking(26713742, () => { - let USDT: IERC20Upgradeable; - let BUSD: IERC20Upgradeable; + let USDT: ethers.contract; + let BUSD: ethers.contract; // let XVS: IERC20Upgradeable; let usdtHolder: ethers.Signer; let busdHolder: ethers.Signer; @@ -252,7 +252,7 @@ forking(26713742, () => { const comptrollerLensUpgrade = await diamondUnitroller.comptrollerLens(); expect(comptrollerLens).to.equal(comptrollerLensUpgrade); - // cheking all public mapingns + // cheking all public mappings market = await unitroller.markets(vBUSD.address); const marketUpgrade = await diamondUnitroller.markets(vBUSD.address); expect(market.collateralFactorMantissa).to.equal(marketUpgrade.collateralFactorMantissa); From 10f8396bb6ee698f826a8428b522087e72a9cd79 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Tue, 28 Mar 2023 21:42:32 +0530 Subject: [PATCH 059/153] Minor fix. --- tests/hardhat/Fork/diamondTest.ts | 27 ++++++++------------------- 1 file changed, 8 insertions(+), 19 deletions(-) diff --git a/tests/hardhat/Fork/diamondTest.ts b/tests/hardhat/Fork/diamondTest.ts index 67ff5646b..128d0320e 100644 --- a/tests/hardhat/Fork/diamondTest.ts +++ b/tests/hardhat/Fork/diamondTest.ts @@ -22,6 +22,7 @@ let owner, unitroller, diamondProxy, // layout variables + oracle, maxAssets, closeFactorMantissa, liquidationIncentiveMantissa, @@ -81,12 +82,10 @@ const forking = (blockNumber: number, fn: () => void) => { forking(26713742, () => { let USDT: ethers.contract; let BUSD: ethers.contract; - // let XVS: IERC20Upgradeable; let usdtHolder: ethers.Signer; let busdHolder: ethers.Signer; let vBUSD: ethers.contract; let vUSDT: ethers.contract; - // let vXVS: ethers.contract; let admin: SignerWithAddress; let diamondUnitroller; @@ -155,6 +154,10 @@ forking(26713742, () => { describe("Verify storage layout", async () => { it("verify all the state before and after upgrade", async () => { + oracle = await unitroller.oracle(); + const oracelUpgrade = await diamondUnitroller.oracle(); + expect(oracle).to.equal(oracelUpgrade); + maxAssets = await unitroller.maxAssets(); const maxAssetsAfterUpgrade = await diamondUnitroller.maxAssets(); expect(maxAssets).to.equal(maxAssetsAfterUpgrade); @@ -284,7 +287,6 @@ forking(26713742, () => { }); }); - // TODO !! describe("Verify states of diamond Contract", () => { describe("Diamond setters", () => { it("setting market supply cap", async () => { @@ -348,12 +350,13 @@ forking(26713742, () => { "ActionPausedMarket", ); + await expect(vBUSD.connect(usdtHolder).mint(1000)).to.be.revertedWith("action is paused") + expect(await diamondUnitroller.connect(owner)._setActionsPaused([vBUSD.address], [0], false)).to.emit( vBUSD, "ActionPausedMarket", ); - - // expect(await vBUSD.connect(usdtHolder).mint(1000)).to.be.reverted("action is paused") + expect(await vBUSD.connect(busdHolder).mint(10)).to.be.emit(vBUSD, "Mint") }); }); @@ -406,20 +409,6 @@ forking(26713742, () => { expect(await vBUSD.connect(busdHolder).repayBorrow(1000)).to.emit(vBUSD, "RepayBorrow"); expect((await BUSD.balanceOf(busdHolder.address)).toString()).to.equal(busdUserBal); }); - - describe("Diamond Rewards", () => { - it("grant and claim rewards", async () => { - const xvsOwner = "0x3a3284dc0faffb0b5f0d074c4c704d14326c98cf"; - await impersonateAccount(xvsOwner); - const xvsAdmin = await ethers.getSigner(xvsOwner); - - const vXVSAddress = await unitroller.getXVSVTokenAddress(); - const XVSAddress = await unitroller.getXVSAddress(); - const XVS = XVS__factory.connect(XVSAddress, xvsAdmin); - const vXVS = VToken__factory.connect(vXVSAddress, admin); - // await diamondUnitroller.claimVenus(busdHolder.address,[vBUSD.address]); - }); - }); }); }); } From 628014faed5dc73db1e3abfb52608ebd69e0d508 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Tue, 28 Mar 2023 21:48:07 +0530 Subject: [PATCH 060/153] Lint fix. --- tests/hardhat/Comptroller/Diamond/comptrollerTest.ts | 2 +- .../Comptroller/Diamond/liquidateCalculateAmoutSeizeTest.ts | 4 +--- tests/hardhat/Fork/diamondTest.ts | 4 ++-- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts b/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts index b5dd8f8f1..da2041731 100644 --- a/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts +++ b/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts @@ -273,7 +273,7 @@ describe("Comptroller", () => { let oracle: FakeContract; let vToken1: FakeContract; let vToken2: FakeContract; - let token: FakeContract; + let token: FakeContract; //eslint-disable-line type Contracts = SimpleComptrollerFixture & { vToken1: FakeContract; diff --git a/tests/hardhat/Comptroller/Diamond/liquidateCalculateAmoutSeizeTest.ts b/tests/hardhat/Comptroller/Diamond/liquidateCalculateAmoutSeizeTest.ts index 9def0398f..eed9561b0 100644 --- a/tests/hardhat/Comptroller/Diamond/liquidateCalculateAmoutSeizeTest.ts +++ b/tests/hardhat/Comptroller/Diamond/liquidateCalculateAmoutSeizeTest.ts @@ -2,7 +2,6 @@ import { FakeContract, MockContract, smock } from "@defi-wonderland/smock"; import { loadFixture } from "@nomicfoundation/hardhat-network-helpers"; import chai from "chai"; import { BigNumberish, constants } from "ethers"; -import { computePublicKey } from "ethers/lib/utils"; import { ethers } from "hardhat"; import { convertToUnit } from "../../../../helpers/utils"; @@ -40,14 +39,13 @@ function rando(min: number, max: number): number { } describe("Comptroller", () => { - let comptroller: MockContract; + let comptroller: MockContract; //eslint-disable-line let comptrollerProxy: MockContract; let oracle: FakeContract; let vTokenBorrowed: FakeContract; let vTokenCollateral: FakeContract; type LiquidateFixture = { - // comptroller: MockContract; comptrollerProxy: MockContract; comptrollerLens: MockContract; oracle: FakeContract; diff --git a/tests/hardhat/Fork/diamondTest.ts b/tests/hardhat/Fork/diamondTest.ts index 128d0320e..4450c7e56 100644 --- a/tests/hardhat/Fork/diamondTest.ts +++ b/tests/hardhat/Fork/diamondTest.ts @@ -350,13 +350,13 @@ forking(26713742, () => { "ActionPausedMarket", ); - await expect(vBUSD.connect(usdtHolder).mint(1000)).to.be.revertedWith("action is paused") + await expect(vBUSD.connect(usdtHolder).mint(1000)).to.be.revertedWith("action is paused"); expect(await diamondUnitroller.connect(owner)._setActionsPaused([vBUSD.address], [0], false)).to.emit( vBUSD, "ActionPausedMarket", ); - expect(await vBUSD.connect(busdHolder).mint(10)).to.be.emit(vBUSD, "Mint") + expect(await vBUSD.connect(busdHolder).mint(10)).to.be.emit(vBUSD, "Mint"); }); }); From cb39d13898a90b6ce98907b620dbc9cf19ca5442 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Tue, 28 Mar 2023 21:52:10 +0530 Subject: [PATCH 061/153] Minor fix. --- tests/hardhat/Fork/diamondTest.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/hardhat/Fork/diamondTest.ts b/tests/hardhat/Fork/diamondTest.ts index 4450c7e56..0323f6b25 100644 --- a/tests/hardhat/Fork/diamondTest.ts +++ b/tests/hardhat/Fork/diamondTest.ts @@ -86,7 +86,7 @@ forking(26713742, () => { let busdHolder: ethers.Signer; let vBUSD: ethers.contract; let vUSDT: ethers.contract; - let admin: SignerWithAddress; + let admin: SignerWithAddress; //eslint-disable-line let diamondUnitroller; if (process.env.FORK_MAINNET === "true") { From f9f0ac0d1061894be150e043a926810efdd9c621 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Wed, 29 Mar 2023 17:49:02 +0530 Subject: [PATCH 062/153] Refactored tests. --- .../V0.8.13/VTokens/VBep20Delegator.sol | 528 ------------------ .../V0.8.13/VTokens/VBep20Immutable.sol | 49 -- contracts/Vault/VAIVault.sol | 2 +- script/diamond/deploy.js | 16 +- .../Comptroller/Diamond/assetListTest.ts | 2 +- .../liquidateCalculateAmoutSeizeTest.ts | 4 +- .../hardhat/Comptroller/Diamond/pauseTest.ts | 4 +- tests/hardhat/Comptroller/XVSSpeeds.ts | 2 +- tests/hardhat/Comptroller/accessControl.ts | 2 +- tests/hardhat/Comptroller/assetListTest.ts | 2 +- tests/hardhat/Comptroller/comptrollerTest.ts | 2 +- .../liquidateCalculateAmountSeizeTest.ts | 6 +- tests/hardhat/Comptroller/pauseTest.ts | 2 +- tests/hardhat/EvilXToken.ts | 6 +- tests/hardhat/Fork/swapTest.ts | 4 +- tests/hardhat/Lens/Rewards.ts | 4 +- .../Liquidator/liquidatorHarnessTest.ts | 2 +- tests/hardhat/Liquidator/liquidatorTest.ts | 4 +- .../Liquidator/restrictedLiquidations.ts | 2 +- tests/hardhat/Swap/swapTest.ts | 4 +- tests/hardhat/VAI/VAIController.ts | 6 +- 21 files changed, 32 insertions(+), 621 deletions(-) delete mode 100644 contracts/Tokens/V0.8.13/VTokens/VBep20Delegator.sol delete mode 100644 contracts/Tokens/V0.8.13/VTokens/VBep20Immutable.sol diff --git a/contracts/Tokens/V0.8.13/VTokens/VBep20Delegator.sol b/contracts/Tokens/V0.8.13/VTokens/VBep20Delegator.sol deleted file mode 100644 index 61865075c..000000000 --- a/contracts/Tokens/V0.8.13/VTokens/VBep20Delegator.sol +++ /dev/null @@ -1,528 +0,0 @@ -pragma solidity 0.8.13; - -import "./VTokenInterfaces.sol"; - -/** - * @title Venus's VBep20Delegator Contract - * @notice vTokens which wrap an EIP-20 underlying and delegate to an implementation - * @author Venus - */ -contract VBep20Delegator is VTokenInterface, VBep20Interface, VDelegatorInterface { - /** - * @notice Construct a new money market - * @param underlying_ The address of the underlying asset - * @param comptroller_ The address of the comptroller - * @param interestRateModel_ The address of the interest rate model - * @param initialExchangeRateMantissa_ The initial exchange rate, scaled by 1e18 - * @param name_ BEP-20 name of this token - * @param symbol_ BEP-20 symbol of this token - * @param decimals_ BEP-20 decimal precision of this token - * @param admin_ Address of the administrator of this token - * @param implementation_ The address of the implementation the contract delegates to - * @param becomeImplementationData The encoded args for becomeImplementation - */ - constructor( - address underlying_, - ComptrollerInterface comptroller_, - InterestRateModel interestRateModel_, - uint initialExchangeRateMantissa_, - string memory name_, - string memory symbol_, - uint8 decimals_, - address payable admin_, - address implementation_, - bytes memory becomeImplementationData - ) public { - // Creator of the contract is admin during initialization - admin = payable(msg.sender); - - // First delegate gets to initialize the delegator (i.e. storage contract) - delegateTo( - implementation_, - abi.encodeWithSignature( - "initialize(address,address,address,uint256,string,string,uint8)", - underlying_, - comptroller_, - interestRateModel_, - initialExchangeRateMantissa_, - name_, - symbol_, - decimals_ - ) - ); - - // New implementations always get set via the settor (post-initialize) - _setImplementation(implementation_, false, becomeImplementationData); - - // Set the proper admin now that initialization is done - admin = admin_; - } - - /** - * @notice Delegates execution to an implementation contract - * @dev It returns to the external caller whatever the implementation returns or forwards reverts - */ - fallback() external payable { - require(msg.value == 0, "VBep20Delegator:fallback: cannot send value to fallback"); - - // delegate all other functions to current implementation - (bool success, ) = implementation.delegatecall(msg.data); - - assembly { - let free_mem_ptr := mload(0x40) - returndatacopy(free_mem_ptr, 0, returndatasize()) - - switch success - case 0 { - revert(free_mem_ptr, returndatasize()) - } - default { - return(free_mem_ptr, returndatasize()) - } - } - } - - /** - * @notice Sender supplies assets into the market and receives vTokens in exchange - * @dev Accrues interest whether or not the operation succeeds, unless reverted - * @param mintAmount The amount of the underlying asset to supply - * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). - */ - function mint(uint mintAmount) external override returns (uint) { - bytes memory data = delegateToImplementation(abi.encodeWithSignature("mint(uint256)", mintAmount)); - return abi.decode(data, (uint)); - } - - /** - * @notice Sender supplies assets into the market and receiver receives vTokens in exchange - * @dev Accrues interest whether or not the operation succeeds, unless reverted - * @param mintAmount The amount of the underlying asset to supply - * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). - */ - function mintBehalf(address receiver, uint mintAmount) external override returns (uint) { - bytes memory data = delegateToImplementation( - abi.encodeWithSignature("mintBehalf(address,uint256)", receiver, mintAmount) - ); - return abi.decode(data, (uint)); - } - - /** - * @notice Sender redeems vTokens in exchange for the underlying asset - * @dev Accrues interest whether or not the operation succeeds, unless reverted - * @param redeemTokens The number of vTokens to redeem into underlying asset - * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). - */ - function redeem(uint redeemTokens) external override returns (uint) { - bytes memory data = delegateToImplementation(abi.encodeWithSignature("redeem(uint256)", redeemTokens)); - return abi.decode(data, (uint)); - } - - /** - * @notice Sender redeems vTokens in exchange for a specified amount of underlying asset - * @dev Accrues interest whether or not the operation succeeds, unless reverted - * @param redeemAmount The amount of underlying to redeem - * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). - */ - function redeemUnderlying(uint redeemAmount) external override returns (uint) { - bytes memory data = delegateToImplementation( - abi.encodeWithSignature("redeemUnderlying(uint256)", redeemAmount) - ); - return abi.decode(data, (uint)); - } - - /** - * @notice Sender borrows assets from the protocol to their own address - * @param borrowAmount The amount of the underlying asset to borrow - * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). - */ - function borrow(uint borrowAmount) external override returns (uint) { - bytes memory data = delegateToImplementation(abi.encodeWithSignature("borrow(uint256)", borrowAmount)); - return abi.decode(data, (uint)); - } - - /** - * @notice Sender repays their own borrow - * @param repayAmount The amount to repay - * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). - */ - function repayBorrow(uint repayAmount) external override returns (uint) { - bytes memory data = delegateToImplementation(abi.encodeWithSignature("repayBorrow(uint256)", repayAmount)); - return abi.decode(data, (uint)); - } - - /** - * @notice Sender repays a borrow belonging to another borrower - * @param borrower The account with the debt being payed off - * @param repayAmount The amount to repay - * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). - */ - function repayBorrowBehalf(address borrower, uint repayAmount) external override returns (uint) { - bytes memory data = delegateToImplementation( - abi.encodeWithSignature("repayBorrowBehalf(address,uint256)", borrower, repayAmount) - ); - return abi.decode(data, (uint)); - } - - /** - * @notice The sender liquidates the borrowers collateral. - * The collateral seized is transferred to the liquidator. - * @param borrower The borrower of this vToken to be liquidated - * @param vTokenCollateral The market in which to seize collateral from the borrower - * @param repayAmount The amount of the underlying borrowed asset to repay - * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). - */ - function liquidateBorrow( - address borrower, - uint repayAmount, - VTokenInterface vTokenCollateral - ) external override returns (uint) { - bytes memory data = delegateToImplementation( - abi.encodeWithSignature("liquidateBorrow(address,uint256,address)", borrower, repayAmount, vTokenCollateral) - ); - return abi.decode(data, (uint)); - } - - /** - * @notice Transfer `amount` tokens from `msg.sender` to `dst` - * @param dst The address of the destination account - * @param amount The number of tokens to transfer - * @return Whether or not the transfer succeeded - */ - function transfer(address dst, uint amount) external override returns (bool) { - bytes memory data = delegateToImplementation(abi.encodeWithSignature("transfer(address,uint256)", dst, amount)); - return abi.decode(data, (bool)); - } - - /** - * @notice Transfer `amount` tokens from `src` to `dst` - * @param src The address of the source account - * @param dst The address of the destination account - * @param amount The number of tokens to transfer - * @return Whether or not the transfer succeeded - */ - function transferFrom(address src, address dst, uint256 amount) external override returns (bool) { - bytes memory data = delegateToImplementation( - abi.encodeWithSignature("transferFrom(address,address,uint256)", src, dst, amount) - ); - return abi.decode(data, (bool)); - } - - /** - * @notice Approve `spender` to transfer up to `amount` from `src` - * @dev This will overwrite the approval amount for `spender` - * and is subject to issues noted [here](https://eips.ethereum.org/EIPS/eip-20#approve) - * @param spender The address of the account which may transfer tokens - * @param amount The number of tokens that are approved (-1 means infinite) - * @return Whether or not the approval succeeded - */ - function approve(address spender, uint256 amount) external override returns (bool) { - bytes memory data = delegateToImplementation( - abi.encodeWithSignature("approve(address,uint256)", spender, amount) - ); - return abi.decode(data, (bool)); - } - - /** - * @notice Get the underlying balance of the `owner` - * @dev This also accrues interest in a transaction - * @param owner The address of the account to query - * @return The amount of underlying owned by `owner` - */ - function balanceOfUnderlying(address owner) external override returns (uint) { - bytes memory data = delegateToImplementation(abi.encodeWithSignature("balanceOfUnderlying(address)", owner)); - return abi.decode(data, (uint)); - } - - /** - * @notice Returns the current total borrows plus accrued interest - * @return The total borrows with interest - */ - function totalBorrowsCurrent() external override returns (uint) { - bytes memory data = delegateToImplementation(abi.encodeWithSignature("totalBorrowsCurrent()")); - return abi.decode(data, (uint)); - } - - /** - * @notice Accrue interest to updated borrowIndex and then calculate account's borrow balance using the updated borrowIndex - * @param account The address whose balance should be calculated after updating borrowIndex - * @return The calculated balance - */ - function borrowBalanceCurrent(address account) external override returns (uint) { - bytes memory data = delegateToImplementation(abi.encodeWithSignature("borrowBalanceCurrent(address)", account)); - return abi.decode(data, (uint)); - } - - /** - * @notice Transfers collateral tokens (this market) to the liquidator. - * @dev Will fail unless called by another vToken during the process of liquidation. - * It's absolutely critical to use msg.sender as the borrowed vToken and not a parameter. - * @param liquidator The account receiving seized collateral - * @param borrower The account having collateral seized - * @param seizeTokens The number of vTokens to seize - * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). - */ - function seize(address liquidator, address borrower, uint seizeTokens) external override returns (uint) { - bytes memory data = delegateToImplementation( - abi.encodeWithSignature("seize(address,address,uint256)", liquidator, borrower, seizeTokens) - ); - return abi.decode(data, (uint)); - } - - /*** Admin Functions ***/ - - /** - * @notice Begins transfer of admin rights. The newPendingAdmin must call `_acceptAdmin` to finalize the transfer. - * @dev Admin function to begin change of admin. The newPendingAdmin must call `_acceptAdmin` to finalize the transfer. - * @param newPendingAdmin New pending admin. - * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). - */ - function _setPendingAdmin(address payable newPendingAdmin) external override returns (uint) { - bytes memory data = delegateToImplementation( - abi.encodeWithSignature("_setPendingAdmin(address)", newPendingAdmin) - ); - return abi.decode(data, (uint)); - } - - /** - * @notice Accrues interest and sets a new reserve factor for the protocol using _setReserveFactorFresh - * @dev Admin function to accrue interest and set a new reserve factor - * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). - */ - function _setReserveFactor(uint newReserveFactorMantissa) external override returns (uint) { - bytes memory data = delegateToImplementation( - abi.encodeWithSignature("_setReserveFactor(uint256)", newReserveFactorMantissa) - ); - return abi.decode(data, (uint)); - } - - /** - * @notice Accepts transfer of admin rights. `msg.sender` must be pendingAdmin - * @dev Admin function for pending admin to accept role and update admin - * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). - */ - function _acceptAdmin() external override returns (uint) { - bytes memory data = delegateToImplementation(abi.encodeWithSignature("_acceptAdmin()")); - return abi.decode(data, (uint)); - } - - /** - * @notice Accrues interest and adds reserves by transferring from admin - * @param addAmount Amount of reserves to add - * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). - */ - function _addReserves(uint addAmount) external override returns (uint) { - bytes memory data = delegateToImplementation(abi.encodeWithSignature("_addReserves(uint256)", addAmount)); - return abi.decode(data, (uint)); - } - - /** - * @notice Accrues interest and reduces reserves by transferring to admin - * @param reduceAmount Amount of reduction to reserves - * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). - */ - function _reduceReserves(uint reduceAmount) external override returns (uint) { - bytes memory data = delegateToImplementation(abi.encodeWithSignature("_reduceReserves(uint256)", reduceAmount)); - return abi.decode(data, (uint)); - } - - /** - * @notice Get cash balance of this vToken in the underlying asset - * @return The quantity of underlying asset owned by this contract - */ - function getCash() external view override returns (uint) { - bytes memory data = delegateToViewImplementation(abi.encodeWithSignature("getCash()")); - return abi.decode(data, (uint)); - } - - /** - * @notice Get the current allowance from `owner` for `spender` - * @param owner The address of the account which owns the tokens to be spent - * @param spender The address of the account which may transfer tokens - * @return The number of tokens allowed to be spent (-1 means infinite) - */ - function allowance(address owner, address spender) external view override returns (uint) { - bytes memory data = delegateToViewImplementation( - abi.encodeWithSignature("allowance(address,address)", owner, spender) - ); - return abi.decode(data, (uint)); - } - - /** - * @notice Get the token balance of the `owner` - * @param owner The address of the account to query - * @return The number of tokens owned by `owner` - */ - function balanceOf(address owner) external view override returns (uint) { - bytes memory data = delegateToViewImplementation(abi.encodeWithSignature("balanceOf(address)", owner)); - return abi.decode(data, (uint)); - } - - /** - * @notice Get a snapshot of the account's balances and the cached exchange rate - * @dev This is used by comptroller to more efficiently perform liquidity checks. - * @param account Address of the account to snapshot - * @return (possible error, token balance, borrow balance, exchange rate mantissa) - */ - function getAccountSnapshot(address account) external view override returns (uint, uint, uint, uint) { - bytes memory data = delegateToViewImplementation( - abi.encodeWithSignature("getAccountSnapshot(address)", account) - ); - return abi.decode(data, (uint, uint, uint, uint)); - } - - /** - * @notice Returns the current per-block borrow interest rate for this vToken - * @return The borrow interest rate per block, scaled by 1e18 - */ - function borrowRatePerBlock() external view override returns (uint) { - bytes memory data = delegateToViewImplementation(abi.encodeWithSignature("borrowRatePerBlock()")); - return abi.decode(data, (uint)); - } - - /** - * @notice Returns the current per-block supply interest rate for this vToken - * @return The supply interest rate per block, scaled by 1e18 - */ - function supplyRatePerBlock() external view override returns (uint) { - bytes memory data = delegateToViewImplementation(abi.encodeWithSignature("supplyRatePerBlock()")); - return abi.decode(data, (uint)); - } - - /** - * @notice Called by the admin to update the implementation of the delegator - * @param implementation_ The address of the new implementation for delegation - * @param allowResign Flag to indicate whether to call _resignImplementation on the old implementation - * @param becomeImplementationData The encoded bytes data to be passed to _becomeImplementation - */ - // @custom:access Only callable by admin - function _setImplementation( - address implementation_, - bool allowResign, - bytes memory becomeImplementationData - ) public override { - require(msg.sender == admin, "VBep20Delegator::_setImplementation: Caller must be admin"); - - if (allowResign) { - delegateToImplementation(abi.encodeWithSignature("_resignImplementation()")); - } - - address oldImplementation = implementation; - implementation = implementation_; - - delegateToImplementation(abi.encodeWithSignature("_becomeImplementation(bytes)", becomeImplementationData)); - - emit NewImplementation(oldImplementation, implementation); - } - - /** - * @notice Accrue interest then return the up-to-date exchange rate - * @return Calculated exchange rate scaled by 1e18 - */ - function exchangeRateCurrent() public override returns (uint) { - bytes memory data = delegateToImplementation(abi.encodeWithSignature("exchangeRateCurrent()")); - return abi.decode(data, (uint)); - } - - /** - * @notice Applies accrued interest to total borrows and reserves. - * @dev This calculates interest accrued from the last checkpointed block - * up to the current block and writes new checkpoint to storage. - */ - function accrueInterest() public override returns (uint) { - bytes memory data = delegateToImplementation(abi.encodeWithSignature("accrueInterest()")); - return abi.decode(data, (uint)); - } - - /** - * @notice Sets a new comptroller for the market - * @dev Admin function to set a new comptroller - * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). - */ - function _setComptroller(ComptrollerInterface newComptroller) public override returns (uint) { - bytes memory data = delegateToImplementation( - abi.encodeWithSignature("_setComptroller(address)", newComptroller) - ); - return abi.decode(data, (uint)); - } - - /** - * @notice Accrues interest and updates the interest rate model using `_setInterestRateModelFresh` - * @dev Admin function to accrue interest and update the interest rate model - * @param newInterestRateModel The new interest rate model to use - * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). - */ - function _setInterestRateModel(InterestRateModel newInterestRateModel) public override returns (uint) { - bytes memory data = delegateToImplementation( - abi.encodeWithSignature("_setInterestRateModel(address)", newInterestRateModel) - ); - return abi.decode(data, (uint)); - } - - /** - * @notice Delegates execution to the implementation contract - * @dev It returns to the external caller whatever the implementation returns or forwards reverts - * @param data The raw data to delegatecall - * @return The returned bytes from the delegatecall - */ - function delegateToImplementation(bytes memory data) public returns (bytes memory) { - return delegateTo(implementation, data); - } - - /** - * @notice Delegates execution to an implementation contract - * @dev It returns to the external caller whatever the implementation returns or forwards reverts - * There are an additional 2 prefix uints from the wrapper returndata, which we ignore since we make an extra hop. - * @param data The raw data to delegatecall - * @return The returned bytes from the delegatecall - */ - function delegateToViewImplementation(bytes memory data) public view returns (bytes memory) { - (bool success, bytes memory returnData) = address(this).staticcall( - abi.encodeWithSignature("delegateToImplementation(bytes)", data) - ); - assembly { - if eq(success, 0) { - revert(add(returnData, 0x20), returndatasize()) - } - } - return abi.decode(returnData, (bytes)); - } - - /** - * @notice Return the borrow balance of account based on stored data - * @param account The address whose balance should be calculated - * @return The calculated balance - */ - function borrowBalanceStored(address account) public view override returns (uint) { - bytes memory data = delegateToViewImplementation( - abi.encodeWithSignature("borrowBalanceStored(address)", account) - ); - return abi.decode(data, (uint)); - } - - /** - * @notice Calculates the exchange rate from the underlying to the VToken - * @dev This function does not accrue interest before calculating the exchange rate - * @return Calculated exchange rate scaled by 1e18 - */ - function exchangeRateStored() public view override returns (uint) { - bytes memory data = delegateToViewImplementation(abi.encodeWithSignature("exchangeRateStored()")); - return abi.decode(data, (uint)); - } - - /** - * @notice Internal method to delegate execution to another contract - * @dev It returns to the external caller whatever the implementation returns or forwards reverts - * @param callee The contract to delegatecall - * @param data The raw data to delegatecall - * @return The returned bytes from the delegatecall - */ - function delegateTo(address callee, bytes memory data) internal returns (bytes memory) { - (bool success, bytes memory returnData) = callee.delegatecall(data); - assembly { - if eq(success, 0) { - revert(add(returnData, 0x20), returndatasize()) - } - } - return returnData; - } -} diff --git a/contracts/Tokens/V0.8.13/VTokens/VBep20Immutable.sol b/contracts/Tokens/V0.8.13/VTokens/VBep20Immutable.sol deleted file mode 100644 index 0616cb208..000000000 --- a/contracts/Tokens/V0.8.13/VTokens/VBep20Immutable.sol +++ /dev/null @@ -1,49 +0,0 @@ -pragma solidity 0.8.13; - -import "./VBep20.sol"; - -/** - * @title Venus's VBep20Immutable Contract - * @notice VTokens which wrap an EIP-20 underlying and are immutable - * @author Venus - */ -contract VBep20Immutable is VBep20 { - /** - * @notice Construct a new money market - * @param underlying_ The address of the underlying asset - * @param comptroller_ The address of the comptroller - * @param interestRateModel_ The address of the interest rate model - * @param initialExchangeRateMantissa_ The initial exchange rate, scaled by 1e18 - * @param name_ BEP-20 name of this token - * @param symbol_ BEP-20 symbol of this token - * @param decimals_ BEP-20 decimal precision of this token - * @param admin_ Address of the administrator of this token - */ - constructor( - address underlying_, - ComptrollerInterface comptroller_, - InterestRateModel interestRateModel_, - uint initialExchangeRateMantissa_, - string memory name_, - string memory symbol_, - uint8 decimals_, - address payable admin_ - ) public { - // Creator of the contract is admin during initialization - admin = payable(msg.sender); - - // Initialize the market - initialize( - underlying_, - comptroller_, - interestRateModel_, - initialExchangeRateMantissa_, - name_, - symbol_, - decimals_ - ); - - // Set the proper admin now that initialization is done - admin = admin_; - } -} diff --git a/contracts/Vault/VAIVault.sol b/contracts/Vault/VAIVault.sol index 1ad9a9802..844ce4495 100644 --- a/contracts/Vault/VAIVault.sol +++ b/contracts/Vault/VAIVault.sol @@ -80,7 +80,7 @@ contract VAIVault is VAIVaultStorage { * @notice Claim XVS from VAIVault * @param account The account for which to claim XVS */ - function claim(address account) external nonReentrant { + function claim(address account) public nonReentrant { _withdraw(account, 0); } diff --git a/script/diamond/deploy.js b/script/diamond/deploy.js index 9ce89d173..8ccb761ae 100644 --- a/script/diamond/deploy.js +++ b/script/diamond/deploy.js @@ -53,30 +53,24 @@ async function deployDiamond(unitrollerAddress) { // deploy facets const FacetNames = ["DiamondLoupeFacet", "MarketFacet", "PolicyFacet", "RewardFacet", "SetterFacet"]; const cut = []; - let index = 0; for (const FacetName of FacetNames) { - let Facet; - - Facet = await ethers.getContractFactory(FacetName); - + const Facet = await ethers.getContractFactory(FacetName); const facet = await Facet.deploy(); await facet.deployed(); + cut.push({ facetAddress: facet.address, action: FacetCutAction.Add, functionSelectors: getSelectors(facet), }); - index++; //eslint-disable-line } // upgrade diamond with facets const diamondCut = await ethers.getContractAt("IDiamondCut", unitroller.address); - let tx; - let receipt; // call to init function - let functionCall = diamondInit.interface.encodeFunctionData("init"); - tx = await diamondCut.connect(unitrollerAdmin).diamondCut(cut, diamondInit.address, functionCall); - receipt = await tx.wait(); + const functionCall = diamondInit.interface.encodeFunctionData("init"); + const tx = await diamondCut.connect(unitrollerAdmin).diamondCut(cut, diamondInit.address, functionCall); + const receipt = await tx.wait(); if (!receipt.status) { throw Error(`Diamond upgrade failed: ${tx.hash}`); } diff --git a/tests/hardhat/Comptroller/Diamond/assetListTest.ts b/tests/hardhat/Comptroller/Diamond/assetListTest.ts index 5bd3630aa..52d8c7713 100644 --- a/tests/hardhat/Comptroller/Diamond/assetListTest.ts +++ b/tests/hardhat/Comptroller/Diamond/assetListTest.ts @@ -64,7 +64,7 @@ describe("Comptroller: assetListTest", () => { const [OMG, ZRX, BAT, SKT] = await Promise.all( names.map(async name => { const vToken = await smock.fake( - "contracts/Tokens/V0.8.13/VTokens/VBep20Immutable.sol:VBep20Immutable", + "contracts/Tokens/VTokens/VBep20Immutable.sol:VBep20Immutable", ); if (name !== "sketch") { await comptrollerProxy._supportMarket(vToken.address); diff --git a/tests/hardhat/Comptroller/Diamond/liquidateCalculateAmoutSeizeTest.ts b/tests/hardhat/Comptroller/Diamond/liquidateCalculateAmoutSeizeTest.ts index eed9561b0..a3840714b 100644 --- a/tests/hardhat/Comptroller/Diamond/liquidateCalculateAmoutSeizeTest.ts +++ b/tests/hardhat/Comptroller/Diamond/liquidateCalculateAmoutSeizeTest.ts @@ -75,10 +75,10 @@ describe("Comptroller", () => { await comptrollerProxy._setLiquidationIncentive(convertToUnit("1.1", 18)); const vTokenBorrowed = await smock.fake( - "contracts/Tokens/V0.8.13/VTokens/VBep20Immutable.sol:VBep20Immutable", + "contracts/Tokens/VTokens/VBep20Immutable.sol:VBep20Immutable", ); const vTokenCollateral = await smock.fake( - "contracts/Tokens/V0.8.13/VTokens/VBep20Immutable.sol:VBep20Immutable", + "contracts/Tokens/VTokens/VBep20Immutable.sol:VBep20Immutable", ); return { comptrollerProxy, comptrollerLens, oracle, vTokenBorrowed, vTokenCollateral }; diff --git a/tests/hardhat/Comptroller/Diamond/pauseTest.ts b/tests/hardhat/Comptroller/Diamond/pauseTest.ts index 4ff408590..a279572e8 100644 --- a/tests/hardhat/Comptroller/Diamond/pauseTest.ts +++ b/tests/hardhat/Comptroller/Diamond/pauseTest.ts @@ -37,9 +37,7 @@ async function pauseFixture(): Promise { const names = ["OMG", "ZRX", "BAT", "sketch"]; const [OMG, ZRX, BAT, SKT] = await Promise.all( names.map(async name => { - const vToken = await smock.fake( - "contracts/Tokens/V0.8.13/VTokens/VBep20Immutable.sol:VBep20Immutable", - ); + const vToken = await smock.fake("contracts/Tokens/VTokens/VBep20Immutable.sol:VBep20Immutable"); if (name !== "sketch") { await comptroller._supportMarket(vToken.address); } diff --git a/tests/hardhat/Comptroller/XVSSpeeds.ts b/tests/hardhat/Comptroller/XVSSpeeds.ts index b1fda2aac..51dd61203 100644 --- a/tests/hardhat/Comptroller/XVSSpeeds.ts +++ b/tests/hardhat/Comptroller/XVSSpeeds.ts @@ -18,7 +18,7 @@ describe("Comptroller", () => { const ComptrollerFactory = await smock.mock("Comptroller"); comptroller = await ComptrollerFactory.deploy(); accessControl = await smock.fake( - "contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager", + "contracts/Governance/IAccessControlManager.sol:IAccessControlManager", ); vToken1 = await smock.fake("contracts/Tokens/VTokens/VToken.sol:VToken"); vToken2 = await smock.fake("contracts/Tokens/VTokens/VToken.sol:VToken"); diff --git a/tests/hardhat/Comptroller/accessControl.ts b/tests/hardhat/Comptroller/accessControl.ts index 468c18f7b..822674848 100644 --- a/tests/hardhat/Comptroller/accessControl.ts +++ b/tests/hardhat/Comptroller/accessControl.ts @@ -21,7 +21,7 @@ describe("Comptroller", () => { const ComptrollerFactory = await smock.mock("Comptroller"); comptroller = await ComptrollerFactory.deploy(); accessControl = await smock.fake( - "contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager", + "contracts/Governance/IAccessControlManager.sol:IAccessControlManager", ); }); diff --git a/tests/hardhat/Comptroller/assetListTest.ts b/tests/hardhat/Comptroller/assetListTest.ts index 9ba2c24e3..0af1ca601 100644 --- a/tests/hardhat/Comptroller/assetListTest.ts +++ b/tests/hardhat/Comptroller/assetListTest.ts @@ -45,7 +45,7 @@ describe("assetListTest", () => { async function assetListFixture(): Promise { const accessControl = await smock.fake( - "contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager", + "contracts/Governance/IAccessControlManager.sol:IAccessControlManager", ); const ComptrollerFactory = await smock.mock("Comptroller"); const ComptrollerLensFactory = await smock.mock("ComptrollerLens"); diff --git a/tests/hardhat/Comptroller/comptrollerTest.ts b/tests/hardhat/Comptroller/comptrollerTest.ts index b3fb6b241..eb554a72f 100644 --- a/tests/hardhat/Comptroller/comptrollerTest.ts +++ b/tests/hardhat/Comptroller/comptrollerTest.ts @@ -31,7 +31,7 @@ type SimpleComptrollerFixture = { async function deploySimpleComptroller(): Promise { const oracle = await smock.fake("contracts/Oracle/PriceOracle.sol:PriceOracle"); const accessControl = await smock.fake( - "contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager", + "contracts/Governance/IAccessControlManager.sol:IAccessControlManager", ); accessControl.isAllowedToCall.returns(true); const ComptrollerLensFactory = await smock.mock("ComptrollerLens"); diff --git a/tests/hardhat/Comptroller/liquidateCalculateAmountSeizeTest.ts b/tests/hardhat/Comptroller/liquidateCalculateAmountSeizeTest.ts index cef4afdd9..6e3950a2e 100644 --- a/tests/hardhat/Comptroller/liquidateCalculateAmountSeizeTest.ts +++ b/tests/hardhat/Comptroller/liquidateCalculateAmountSeizeTest.ts @@ -56,7 +56,7 @@ describe("Comptroller", () => { async function liquidateFixture(): Promise { const accessControl = await smock.fake( - "contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager", + "contracts/Governance/IAccessControlManager.sol:IAccessControlManager", ); const ComptrollerFactory = await smock.mock("Comptroller"); const ComptrollerLensFactory = await smock.mock("ComptrollerLens"); @@ -70,10 +70,10 @@ describe("Comptroller", () => { await comptroller._setLiquidationIncentive(convertToUnit("1.1", 18)); const vTokenBorrowed = await smock.fake( - "contracts/Tokens/V0.8.13/VTokens/VBep20Immutable.sol:VBep20Immutable", + "contracts/Tokens/VTokens/VBep20Immutable.sol:VBep20Immutable", ); const vTokenCollateral = await smock.fake( - "contracts/Tokens/V0.8.13/VTokens/VBep20Immutable.sol:VBep20Immutable", + "contracts/Tokens/VTokens/VBep20Immutable.sol:VBep20Immutable", ); return { comptroller, comptrollerLens, oracle, vTokenBorrowed, vTokenCollateral }; diff --git a/tests/hardhat/Comptroller/pauseTest.ts b/tests/hardhat/Comptroller/pauseTest.ts index fcab8d477..05b774ba7 100644 --- a/tests/hardhat/Comptroller/pauseTest.ts +++ b/tests/hardhat/Comptroller/pauseTest.ts @@ -27,7 +27,7 @@ type PauseFixture = { async function pauseFixture(): Promise { const accessControl = await smock.fake( - "contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager", + "contracts/Governance/IAccessControlManager.sol:IAccessControlManager", ); const ComptrollerFactory = await smock.mock("Comptroller"); const comptroller = await ComptrollerFactory.deploy(); diff --git a/tests/hardhat/EvilXToken.ts b/tests/hardhat/EvilXToken.ts index 3d78d7f87..d1f6fa7c4 100644 --- a/tests/hardhat/EvilXToken.ts +++ b/tests/hardhat/EvilXToken.ts @@ -14,7 +14,7 @@ describe("Evil Token test", async () => { const [root, account1] = await ethers.getSigners(); const accessControlMock = await smock.fake( - "contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager", + "contracts/Governance/IAccessControlManager.sol:IAccessControlManager", ); accessControlMock.isAllowedToCall.returns(true); @@ -84,7 +84,7 @@ describe("Evil Token test", async () => { await vDelegatee1.deployed(); const vDelegator1Factory = await ethers.getContractFactory( - "contracts/Tokens/V0.8.13/VTokens/VBep20Delegator.sol:VBep20Delegator", + "contracts/Tokens/VTokens/VBep20Delegator.sol:VBep20Delegator", ); const vDelegator1 = await vDelegator1Factory.deploy( underlying1.address, @@ -115,7 +115,7 @@ describe("Evil Token test", async () => { await vDelegatee2.deployed(); const vDelegator2Factory = await ethers.getContractFactory( - "contracts/Tokens/V0.8.13/VTokens/VBep20Delegator.sol:VBep20Delegator", + "contracts/Tokens/VTokens/VBep20Delegator.sol:VBep20Delegator", ); const vDelegator2 = await vDelegator2Factory.deploy( underlying2.address, diff --git a/tests/hardhat/Fork/swapTest.ts b/tests/hardhat/Fork/swapTest.ts index 3f71b1442..deb785f40 100644 --- a/tests/hardhat/Fork/swapTest.ts +++ b/tests/hardhat/Fork/swapTest.ts @@ -84,9 +84,7 @@ async function configureVtoken(underlyingToken: FaucetToken | VBep20Immutable, n const interestRateModel = await InterstRateModel.deploy(parseUnits("1", 12)); await interestRateModel.deployed(); - const vTokenFactory = await ethers.getContractFactory( - "contracts/Tokens/V0.8.13/VTokens/VBep20Immutable.sol:VBep20Immutable", - ); + const vTokenFactory = await ethers.getContractFactory("contracts/Tokens/VTokens/VBep20Immutable.sol:VBep20Immutable"); const vToken = await vTokenFactory.deploy( underlyingToken.address, comptroller.address, diff --git a/tests/hardhat/Lens/Rewards.ts b/tests/hardhat/Lens/Rewards.ts index 4facae4dc..dba3822d8 100644 --- a/tests/hardhat/Lens/Rewards.ts +++ b/tests/hardhat/Lens/Rewards.ts @@ -27,8 +27,8 @@ type RewardsFixtire = { }; const rewardsFixture = async (): Promise => { - vBUSD = await smock.fake("contracts/Tokens/V0.8.13/VTokens/VToken.sol:VToken"); - vWBTC = await smock.fake("contracts/Tokens/V0.8.13/VTokens/VToken.sol:VToken"); + vBUSD = await smock.fake("contracts/Tokens/VTokens/VToken.sol:VToken"); + vWBTC = await smock.fake("contracts/Tokens/VTokens/VToken.sol:VToken"); XVS = await smock.fake("FaucetToken"); const venusLensFactory = await smock.mock("VenusLens"); venusLens = await venusLensFactory.deploy(); diff --git a/tests/hardhat/Liquidator/liquidatorHarnessTest.ts b/tests/hardhat/Liquidator/liquidatorHarnessTest.ts index 53f85e8d1..dbdeb4d83 100644 --- a/tests/hardhat/Liquidator/liquidatorHarnessTest.ts +++ b/tests/hardhat/Liquidator/liquidatorHarnessTest.ts @@ -33,7 +33,7 @@ async function deployLiquidator(): Promise { const comptroller = await smock.fake("Comptroller"); comptroller.liquidationIncentiveMantissa.returns(announcedIncentive); const vBnb = await smock.fake("MockVBNB"); - const vTokenCollateral = await smock.fake("contracts/Tokens/V0.8.13/VTokens/VBep20Immutable.sol:VBep20Immutable"); + const vTokenCollateral = await smock.fake("contracts/Tokens/VTokens/VBep20Immutable.sol:VBep20Immutable"); const Liquidator = await smock.mock("LiquidatorHarness"); const liquidator = await upgrades.deployProxy(Liquidator, [treasuryPercent], { diff --git a/tests/hardhat/Liquidator/liquidatorTest.ts b/tests/hardhat/Liquidator/liquidatorTest.ts index 0f2446152..2d6d5910c 100644 --- a/tests/hardhat/Liquidator/liquidatorTest.ts +++ b/tests/hardhat/Liquidator/liquidatorTest.ts @@ -49,10 +49,10 @@ async function deployLiquidator(): Promise { const vai = await FaucetToken.deploy(convertToBigInt("100", 18), "VAI", 18, "VAI"); const vaiController = await smock.fake("VAIController"); const vTokenBorrowed = await smock.fake( - "contracts/Tokens/V0.8.13/VTokens/VBep20Immutable.sol:VBep20Immutable", + "contracts/Tokens/VTokens/VBep20Immutable.sol:VBep20Immutable", ); const vTokenCollateral = await smock.fake( - "contracts/Tokens/V0.8.13/VTokens/VBep20Immutable.sol:VBep20Immutable", + "contracts/Tokens/VTokens/VBep20Immutable.sol:VBep20Immutable", ); comptroller.liquidationIncentiveMantissa.returns(announcedIncentive); diff --git a/tests/hardhat/Liquidator/restrictedLiquidations.ts b/tests/hardhat/Liquidator/restrictedLiquidations.ts index 68fdc1d00..6b55b2758 100644 --- a/tests/hardhat/Liquidator/restrictedLiquidations.ts +++ b/tests/hardhat/Liquidator/restrictedLiquidations.ts @@ -24,7 +24,7 @@ async function deployLiquidator(): Promise { const comptroller = await smock.fake("Comptroller"); comptroller.liquidationIncentiveMantissa.returns(convertToBigInt("1.1", 18)); const vBnb = await smock.fake("MockVBNB"); - const vBep20 = await smock.fake("contracts/Tokens/V0.8.13/VTokens/VBep20Immutable.sol:VBep20Immutable"); + const vBep20 = await smock.fake("contracts/Tokens/VTokens/VBep20Immutable.sol:VBep20Immutable"); const Liquidator = await smock.mock("Liquidator"); const liquidator = await upgrades.deployProxy(Liquidator, [treasuryPercentMantissa], { diff --git a/tests/hardhat/Swap/swapTest.ts b/tests/hardhat/Swap/swapTest.ts index 4afd77b82..1d492dd5b 100644 --- a/tests/hardhat/Swap/swapTest.ts +++ b/tests/hardhat/Swap/swapTest.ts @@ -49,9 +49,7 @@ type SwapFixture = { }; async function deploySwapContract(): Promise { - const vToken = await smock.fake( - "contracts/Tokens/V0.8.13/VTokens/VBep20Immutable.sol:VBep20Immutable", - ); + const vToken = await smock.fake("contracts/Tokens/VTokens/VBep20Immutable.sol:VBep20Immutable"); const wBNBFactory = await smock.mock("WBNB"); const wBNB = await wBNBFactory.deploy(); const pancakeFactory = await smock.fake("IPancakeSwapV2Factory"); diff --git a/tests/hardhat/VAI/VAIController.ts b/tests/hardhat/VAI/VAIController.ts index 35678c544..fcfae3c78 100644 --- a/tests/hardhat/VAI/VAIController.ts +++ b/tests/hardhat/VAI/VAIController.ts @@ -66,7 +66,7 @@ describe("VAIController", async () => { )) as BEP20Harness; const accessControl = await smock.fake( - "contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager", + "contracts/Governance/IAccessControlManager.sol:IAccessControlManager", ); accessControl.isAllowedToCall.returns(true); @@ -537,7 +537,7 @@ describe("VAIController", async () => { it("emits NewAccessControl event", async () => { const newAccessControl = await smock.fake( - "contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager", + "contracts/Governance/IAccessControlManager.sol:IAccessControlManager", ); const tx = await vaiController.setAccessControl(newAccessControl.address); await expect(tx) @@ -547,7 +547,7 @@ describe("VAIController", async () => { it("sets ACM address in storage", async () => { const newAccessControl = await smock.fake( - "contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager", + "contracts/Governance/IAccessControlManager.sol:IAccessControlManager", ); await vaiController.setAccessControl(newAccessControl.address); expect(await vaiController.getVariable("accessControl")).to.equal(newAccessControl.address); From 67ee0f1f7721ae2330a517cff31f6ae8662a68b8 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Mon, 3 Apr 2023 12:18:31 +0530 Subject: [PATCH 063/153] Diamond comptroller VIP. --- script/diamond/deploy.js | 59 ++- .../hardhat/fork/vip-diamond-comptroller.ts | 439 ++++++++++++++++++ 2 files changed, 475 insertions(+), 23 deletions(-) create mode 100644 script/hardhat/fork/vip-diamond-comptroller.ts diff --git a/script/diamond/deploy.js b/script/diamond/deploy.js index 8ccb761ae..11c6c3952 100644 --- a/script/diamond/deploy.js +++ b/script/diamond/deploy.js @@ -9,40 +9,20 @@ const ethers = hre.ethers; const Owner = "0x939bd8d64c0a9583a7dcea9933f7b21697ab6396"; -async function deployDiamond(unitrollerAddress) { +async function deployFacets(unitrollerAddress) { const accounts = await ethers.getSigners(); const contractOwner = accounts[0]; - let unitroller; - let unitrollerAdmin; // deploy DiamondCutFacet const DiamondCutFacet = await ethers.getContractFactory("DiamondCutFacet"); const diamondCutFacet = await DiamondCutFacet.deploy(); await diamondCutFacet.deployed(); - if (unitrollerAddress != "") { - await impersonateAccount(Owner); - unitrollerAdmin = await ethers.getSigner(Owner); - unitroller = await Unitroller__factory.connect(unitrollerAddress, unitrollerAdmin); - } else { - const UnitrollerFactory = await ethers.getContractFactory("Unitroller"); - unitroller = await UnitrollerFactory.deploy(); - const signer = await ethers.getSigners(); - unitrollerAdmin = signer[0]; - } - // deploy Diamond const Diamond = await ethers.getContractFactory("Diamond"); - const diamond = await Diamond.deploy(contractOwner.address, unitroller.address); + const diamond = await Diamond.deploy(contractOwner.address, unitrollerAddress); await diamond.deployed(); - await unitroller.connect(unitrollerAdmin)._setPendingImplementation(diamond.address); - await diamond.connect(unitrollerAdmin)._become(); - - const compProxy = await ethers.getContractAt("Diamond", unitroller.address); - - await compProxy.connect(unitrollerAdmin).facetCutInitilizer(diamondCutFacet.address); - // deploy DiamondInit // DiamondInit provides a function that is called when the diamond is upgraded to initialize state variables // Read about how the diamondCut function works here: https://eips.ethereum.org/EIPS/eip-2535#addingreplacingremoving-functions @@ -65,6 +45,37 @@ async function deployDiamond(unitrollerAddress) { }); } + return { + diamondCutFacet, + diamond, + diamondInit, + cut, + }; +} + +async function deployDiamond(unitrollerAddress) { + let unitroller; + let unitrollerAdmin; + + if (unitrollerAddress != "") { + await impersonateAccount(Owner); + unitrollerAdmin = await ethers.getSigner(Owner); + unitroller = await Unitroller__factory.connect(unitrollerAddress, unitrollerAdmin); + } else { + const UnitrollerFactory = await ethers.getContractFactory("Unitroller"); + unitroller = await UnitrollerFactory.deploy(); + const signer = await ethers.getSigners(); + unitrollerAdmin = signer[0]; + } + + const { diamondCutFacet, diamond, diamondInit, cut } = await deployFacets(unitroller.addres); + await unitroller.connect(unitrollerAdmin)._setPendingImplementation(diamond.address); + await diamond.connect(unitrollerAdmin)._become(); + + const compProxy = await ethers.getContractAt("Diamond", unitroller.address); + + await compProxy.connect(unitrollerAdmin).facetCutInitilizer(diamondCutFacet.address); + // upgrade diamond with facets const diamondCut = await ethers.getContractAt("IDiamondCut", unitroller.address); // call to init function @@ -74,7 +85,8 @@ async function deployDiamond(unitrollerAddress) { if (!receipt.status) { throw Error(`Diamond upgrade failed: ${tx.hash}`); } - return { unitroller, diamond }; + + return { unitroller, diamond, cut, diamondInit, diamondCutFacet }; } // We recommend this pattern to be able to use async/await everywhere @@ -89,3 +101,4 @@ if (require.main === module) { } exports.deployDiamond = deployDiamond; +exports.deployFacets = deployFacets; diff --git a/script/hardhat/fork/vip-diamond-comptroller.ts b/script/hardhat/fork/vip-diamond-comptroller.ts new file mode 100644 index 000000000..7807d5330 --- /dev/null +++ b/script/hardhat/fork/vip-diamond-comptroller.ts @@ -0,0 +1,439 @@ +import { impersonateAccount } from "@nomicfoundation/hardhat-network-helpers"; +import { expect } from "chai"; +import { parseUnits } from "ethers/lib/utils"; +import { ethers } from "hardhat"; + +import { VBep20 } from "../../../typechain"; +import { deployFacets } from "../../diamond/deploy"; +import { forking, pretendExecutingVip, testVip } from "./vip-framework"; +import { ProposalType } from "./vip-framework/types"; +import { makeProposal } from "./vip-framework/utils"; + +const UNITROLLER = "0xfD36E2c2a6789Db23113685031d7F16329158384"; + +let DIAMOND_CUT_FACET; +let DIAMOND; +let DIAMOND_INIT; + +const vip105 = async () => { + const meta = { + version: "v1", + title: "VIP-105 Comptroller Diamond proxy", + description: ``, + forDescription: + "I agree that Venus Protocol should proceed with the upgrading the Comptroller contract with diamond proxy", + againstDescription: "I do not think that Venus Protocol should proceed with the Comptroller contract upgradation", + abstainDescription: "I am indifferent to whether Venus Protocol proceeds with the Comptroller upgradation or not", + }; + + const { diamondCutFacet, diamond, diamondInit, cut } = await deployFacets(UNITROLLER); + + DIAMOND_CUT_FACET = diamondCutFacet.address; + DIAMOND = diamond.address; + DIAMOND_INIT = diamondInit.address; + + const initFunctionEncode = diamondInit.interface.encodeFunctionData("init"); + + return makeProposal( + [ + { + target: UNITROLLER, + signature: "_setPendingImplementation(address)", + params: [DIAMOND], + }, + { + target: DIAMOND, + signature: "_become()", + params: [], + }, + { + target: UNITROLLER, + signature: "facetCutInitilizer(address)", + params: [DIAMOND_CUT_FACET], + }, + { + target: UNITROLLER, + signature: "diamondCut(FacetCut[],address,bytes)", + params: [cut, DIAMOND_INIT, initFunctionEncode], + }, + ], + meta, + ProposalType.REGULAR, + ); +}; + +forking(25892445, async () => { + testVip("VIP-98 TRON Contract Migration", await vip105()); +}); + +let owner, + unitroller, + // layout variables + oracle, + maxAssets, + closeFactorMantissa, + liquidationIncentiveMantissa, + allMarkets, + venusRate, + venusSpeeds, + venusSupplyState, + venusBorrowState, + venusAccrued, + vaiMintRate, + vaiController, + mintedVAIs, + mintVAIGuardianPaused, + repayVAIGuardianPaused, + protocolPaused, + venusVAIVaultRate, + vaiVaultAddress, + releaseStartBlock, + minReleaseAmount, + treasuryGuardian, + treasuryAddress, + treasuryPercent, + liquidatorContract, + comptrollerLens, + market, + venusSupplierIndex, + venusBorrowerIndex; + +const Owner = "0x939bd8d64c0a9583a7dcea9933f7b21697ab6396"; +const zeroAddr = "0x0000000000000000000000000000000000000000"; +const VBUSD = "0x95c78222B3D6e262426483D42CfA53685A67Ab9D"; +const VUSDT = "0xfD5840Cd36d94D7229439859C0112a4185BC0255"; + +const initMainnetUser = async (user: string) => { + await impersonateAccount(user); + return ethers.getSigner(user); +}; + +forking(26713742, () => { + let USDT: ethers.contract; + let BUSD: ethers.contract; + let usdtHolder: ethers.Signer; + let busdHolder: ethers.Signer; + let vBUSD: ethers.contract; + let vUSDT: ethers.contract; + let diamondUnitroller; + + if (process.env.FORK_MAINNET === "true") { + before(async () => { + /* + * Forking mainnet + * */ + + /** + * sending gas cost to owner + * */ + await impersonateAccount(Owner); + owner = await ethers.getSigner(Owner); + const [signer] = await ethers.getSigners(); + await signer.sendTransaction({ + to: owner.address, + value: ethers.BigNumber.from("10000000000000000000"), + data: undefined, + }); + + // unitroller without diamond + unitroller = await ethers.getContractAt("Comptroller", UNITROLLER); + + // unitroller with diamond + diamondUnitroller = await ethers.getContractAt("Comptroller", UNITROLLER); + + busdHolder = await initMainnetUser("0xf977814e90da44bfa03b6295a0616a897441acec"); + usdtHolder = await initMainnetUser("0xc444949e0054A23c44Fc45789738bdF64aed2391"); + + [vBUSD, vUSDT] = await Promise.all( + [VBUSD, VUSDT].map((address: string) => { + return ethers.getContractAt("contracts/Tokens/V0.8.13/VTokens/VBep20Delegate.sol:VBep20Delegate", address); + }), + ); + [BUSD, USDT] = await Promise.all( + [vBUSD, vUSDT].map(async (vToken: VBep20) => { + const underlying = await vToken.underlying(); + return ethers.getContractAt("IERC20Upgradeable", underlying); + }), + ); + await pretendExecutingVip(await vip105()); + }); + + describe("Verify Storage slots", () => { + // These tests checks the storage collision of comptroller while updating it via diamond. + describe("Diamond deployed successfully", async () => { + it("Owner of Diamond unitroller contract should match", async () => { + const diamondUnitrollerAdmin = await diamondUnitroller.admin(); + const pendingAdmin = await diamondUnitroller.pendingAdmin(); + expect(diamondUnitrollerAdmin.toLowerCase()).to.equal(Owner); + expect(pendingAdmin.toLowerCase()).to.equal(zeroAddr); + }); + + it("Diamond Unitroller Implementation (comptroller) should match the diamond Proxy Address", async () => { + const comptrollerImplementation = await diamondUnitroller.comptrollerImplementation(); + const pendingComptrollerImplementation = await diamondUnitroller.pendingComptrollerImplementation(); + expect(comptrollerImplementation.toLowerCase()).to.equal(DIAMOND.toLowerCase()); + expect(pendingComptrollerImplementation.toLowerCase()).to.equal(zeroAddr); + }); + }); + + describe("Verify storage layout", async () => { + it("verify all the state before and after upgrade", async () => { + oracle = await unitroller.oracle(); + const oracelUpgrade = await diamondUnitroller.oracle(); + expect(oracle).to.equal(oracelUpgrade); + + maxAssets = await unitroller.maxAssets(); + const maxAssetsAfterUpgrade = await diamondUnitroller.maxAssets(); + expect(maxAssets).to.equal(maxAssetsAfterUpgrade); + + closeFactorMantissa = await unitroller.closeFactorMantissa(); + const closeFactorMantissaAfterUpgrade = await diamondUnitroller.closeFactorMantissa(); + expect(closeFactorMantissa).to.equal(closeFactorMantissaAfterUpgrade); + + liquidationIncentiveMantissa = await unitroller.liquidationIncentiveMantissa(); + const liquidationIncentiveMantissaAfterUpgrade = await diamondUnitroller.liquidationIncentiveMantissa(); + expect(liquidationIncentiveMantissa).to.equal(liquidationIncentiveMantissaAfterUpgrade); + + allMarkets = await unitroller.allMarkets(0); + const allMarketsAfterUpgrade = await diamondUnitroller.allMarkets(0); + expect(allMarkets).to.equal(allMarketsAfterUpgrade); + + venusRate = await unitroller.venusRate(); + const venusRateAfterUpgrade = await diamondUnitroller.venusRate(); + expect(venusRate).to.equal(venusRateAfterUpgrade); + + venusSpeeds = await unitroller.venusSpeeds(BUSD.address); + const venusSpeedsAfterUpgrade = await diamondUnitroller.venusSpeeds(BUSD.address); + expect(venusSpeeds).to.equal(venusSpeedsAfterUpgrade); + + venusSupplyState = await unitroller.venusSupplyState(BUSD.address); + const venusSupplyStateAfterUpgrade = await diamondUnitroller.venusSupplyState(BUSD.address); + expect(venusSupplyState.index.toString()).to.equal(venusSupplyStateAfterUpgrade.index.toString()); + + venusBorrowState = await unitroller.venusBorrowState(BUSD.address); + const venusBorrowStateAfterUpgrade = await diamondUnitroller.venusBorrowState(BUSD.address); + expect(venusBorrowState.index.toString()).to.equal(venusBorrowStateAfterUpgrade.index.toString()); + + venusAccrued = await unitroller.venusAccrued(BUSD.address); + const venusAccruedAfterUpgrade = await diamondUnitroller.venusAccrued(BUSD.address); + expect(venusAccrued).to.equal(venusAccruedAfterUpgrade); + + vaiMintRate = await unitroller.vaiMintRate(); + const vaiMintRateAfterUpgrade = await diamondUnitroller.vaiMintRate(); + expect(vaiMintRate).to.equal(vaiMintRateAfterUpgrade); + + vaiController = await unitroller.vaiController(); + const vaiControllerUpgrade = await diamondUnitroller.vaiController(); + expect(vaiControllerUpgrade).to.equal(vaiController); + + mintedVAIs = await unitroller.mintedVAIs(busdHolder.address); + unitroller.minte; + const mintedVAIsUpgrade = await diamondUnitroller.mintedVAIs(busdHolder.address); + expect(mintedVAIsUpgrade).to.equal(mintedVAIs); + + mintVAIGuardianPaused = await unitroller.mintVAIGuardianPaused(); + const mintVAIGuardianPausedUpgrade = await diamondUnitroller.mintVAIGuardianPaused(); + expect(mintVAIGuardianPausedUpgrade).to.equal(mintVAIGuardianPaused); + + repayVAIGuardianPaused = await unitroller.repayVAIGuardianPaused(); + const repayVAIGuardianPausedUpgrade = await diamondUnitroller.repayVAIGuardianPaused(); + expect(repayVAIGuardianPausedUpgrade).to.equal(repayVAIGuardianPaused); + + protocolPaused = await unitroller.protocolPaused(); + const protocolPausedUpgrade = await diamondUnitroller.protocolPaused(); + expect(protocolPausedUpgrade).to.equal(protocolPaused); + + venusVAIVaultRate = await unitroller.venusVAIVaultRate(); + const venusVAIVaultRateUpgrade = await diamondUnitroller.venusVAIVaultRate(); + expect(venusVAIVaultRateUpgrade).to.equal(venusVAIVaultRate); + + vaiVaultAddress = await unitroller.vaiVaultAddress(); + const vaiVaultAddressUpgrade = await diamondUnitroller.vaiVaultAddress(); + expect(vaiVaultAddressUpgrade).to.equal(vaiVaultAddress); + + releaseStartBlock = await unitroller.releaseStartBlock(); + const releaseStartBlockUpgrade = await diamondUnitroller.releaseStartBlock(); + expect(releaseStartBlockUpgrade).to.equal(releaseStartBlock); + + minReleaseAmount = await unitroller.minReleaseAmount(); + const minReleaseAmountUpgrade = await diamondUnitroller.minReleaseAmount(); + expect(minReleaseAmountUpgrade).to.equal(minReleaseAmount); + + treasuryGuardian = await unitroller.treasuryGuardian(); + const treasuryGuardianUpgrade = await diamondUnitroller.treasuryGuardian(); + expect(treasuryGuardian).to.equal(treasuryGuardianUpgrade); + + treasuryAddress = await unitroller.treasuryAddress(); + const treasuryAddressUpgrade = await diamondUnitroller.treasuryAddress(); + expect(treasuryAddress).to.equal(treasuryAddressUpgrade); + + treasuryPercent = await unitroller.treasuryPercent(); + const treasuryPercentUpgrade = await diamondUnitroller.treasuryPercent(); + expect(treasuryPercent).to.equal(treasuryPercentUpgrade); + + liquidatorContract = await unitroller.liquidatorContract(); + const liquidatorContractUpgrade = await diamondUnitroller.liquidatorContract(); + expect(liquidatorContract).to.equal(liquidatorContractUpgrade); + + comptrollerLens = await unitroller.comptrollerLens(); + const comptrollerLensUpgrade = await diamondUnitroller.comptrollerLens(); + expect(comptrollerLens).to.equal(comptrollerLensUpgrade); + + // cheking all public mappings + market = await unitroller.markets(vBUSD.address); + const marketUpgrade = await diamondUnitroller.markets(vBUSD.address); + expect(market.collateralFactorMantissa).to.equal(marketUpgrade.collateralFactorMantissa); + expect(market.isListed).to.equal(marketUpgrade.isListed); + expect(market.isVenus).to.equal(marketUpgrade.isVenus); + + venusBorrowerIndex = await unitroller.venusBorrowerIndex(vBUSD.address, busdHolder.address); + const venusBorrowerIndexUpgrade = await diamondUnitroller.venusBorrowerIndex( + vBUSD.address, + busdHolder.address, + ); + expect(venusBorrowerIndex).to.equal(venusBorrowerIndexUpgrade); + + venusSupplierIndex = await unitroller.venusSupplierIndex(vBUSD.address, busdHolder.address); + const venusSupplierIndexUpgrade = await diamondUnitroller.venusSupplierIndex( + vBUSD.address, + busdHolder.address, + ); + expect(venusSupplierIndex).to.equal(venusSupplierIndexUpgrade); + + const venusBorrowSpeeds = await unitroller.venusBorrowSpeeds(vUSDT.address); + const venusBorrowSpeedsUpgrade = await diamondUnitroller.venusBorrowSpeeds(vUSDT.address); + const venusSupplySpeeds = await unitroller.venusSupplySpeeds(vUSDT.address); + const venusSupplySpeedsUpgrade = await diamondUnitroller.venusSupplySpeeds(vUSDT.address); + + expect(venusBorrowSpeeds).to.equal(venusBorrowSpeedsUpgrade); + expect(venusSupplySpeeds).to.equal(venusSupplySpeedsUpgrade); + }); + }); + }); + + describe("Verify states of diamond Contract", () => { + describe("Diamond setters", () => { + it("setting market supply cap", async () => { + const currentSupplyCap = (await diamondUnitroller.supplyCaps(vBUSD.address)).toString(); + await diamondUnitroller.connect(owner)._setMarketSupplyCaps([vBUSD.address], [parseUnits("100000", 18)]); + expect(await diamondUnitroller.supplyCaps(vBUSD.address)).to.equals(parseUnits("100000", 18)); + await diamondUnitroller + .connect(owner) + ._setMarketSupplyCaps([vBUSD.address], [parseUnits(currentSupplyCap, 0)]); + expect(await diamondUnitroller.supplyCaps(vBUSD.address)).to.equals(parseUnits(currentSupplyCap, 0)); + }); + + it("setting close factor", async () => { + const currentCloseFactor = (await diamondUnitroller.closeFactorMantissa()).toString(); + await diamondUnitroller.connect(owner)._setCloseFactor(parseUnits("10000", 18)); + expect(await diamondUnitroller.closeFactorMantissa()).to.equals(parseUnits("10000", 18)); + await diamondUnitroller.connect(owner)._setCloseFactor(parseUnits(currentCloseFactor, 0)); + expect(await diamondUnitroller.closeFactorMantissa()).to.equals(parseUnits(currentCloseFactor, 0)); + }); + + it("setting collateral factor", async () => { + await diamondUnitroller.connect(owner)._setCollateralFactor(vUSDT.address, 2); + market = await diamondUnitroller.markets(vUSDT.address); + expect(market.collateralFactorMantissa).to.equal(2); + + await diamondUnitroller.connect(owner)._setCollateralFactor(vUSDT.address, parseUnits("8", 17)); + market = await diamondUnitroller.markets(vUSDT.address); + expect(market.collateralFactorMantissa).to.equal(parseUnits("8", 17)); + }); + + it("setting setting Liquidation Incentive", async () => { + await diamondUnitroller.connect(owner)._setLiquidationIncentive(parseUnits("13", 17)); + expect(await diamondUnitroller.liquidationIncentiveMantissa()).to.equal(parseUnits("13", 17)); + + await diamondUnitroller.connect(owner)._setLiquidationIncentive(parseUnits("11", 17)); + expect(await diamondUnitroller.liquidationIncentiveMantissa()).to.equal(parseUnits("11", 17)); + }); + + it("setting Pause Guardian", async () => { + const currentPauseGuardia = (await diamondUnitroller.pauseGuardian()).toString(); + + await diamondUnitroller.connect(owner)._setPauseGuardian(owner.address); + expect(await diamondUnitroller.pauseGuardian()).to.equal(owner.address); + + await diamondUnitroller.connect(owner)._setPauseGuardian(currentPauseGuardia); + expect(await diamondUnitroller.pauseGuardian()).to.equal(currentPauseGuardia); + }); + + it("setting market borrow cap", async () => { + const currentBorrowCap = (await diamondUnitroller.borrowCaps(vUSDT.address)).toString(); + await diamondUnitroller.connect(owner)._setMarketBorrowCaps([vUSDT.address], [parseUnits("10000", 18)]); + expect(await diamondUnitroller.borrowCaps(vUSDT.address)).to.equal(parseUnits("10000", 18)); + + await diamondUnitroller.connect(owner)._setMarketBorrowCaps([vUSDT.address], [currentBorrowCap]); + expect(await diamondUnitroller.borrowCaps(vUSDT.address)).to.equal(currentBorrowCap); + }); + + it("pausing mint action in vUSDT", async () => { + expect(await diamondUnitroller.connect(owner)._setActionsPaused([vBUSD.address], [0], true)).to.emit( + vBUSD, + "ActionPausedMarket", + ); + + await expect(vBUSD.connect(usdtHolder).mint(1000)).to.be.revertedWith("action is paused"); + + expect(await diamondUnitroller.connect(owner)._setActionsPaused([vBUSD.address], [0], false)).to.emit( + vBUSD, + "ActionPausedMarket", + ); + expect(await vBUSD.connect(busdHolder).mint(10)).to.be.emit(vBUSD, "Mint"); + }); + }); + + describe("Diamond Hooks", () => { + it("mint vToken vBUSD", async () => { + const vBUSDBalance = await BUSD.balanceOf(vBUSD.address); + const busdHolerBalance = await BUSD.balanceOf(busdHolder.address); + expect(await vBUSD.connect(busdHolder).mint(1000)).to.emit(vBUSD, "Mint"); + + const newvBUSDBalance = await BUSD.balanceOf(vBUSD.address); + const newBusdHolerBalance = await BUSD.balanceOf(busdHolder.address); + expect(newvBUSDBalance.toString()).to.equal(vBUSDBalance.add(1000)); + expect(newBusdHolerBalance.toString()).to.equal(busdHolerBalance.sub(1000)); + }); + + it("redeem vToken", async () => { + const vBUSDBalance = (await BUSD.balanceOf(vBUSD.address)).toString(); + const busdHolderBalance = await vBUSD.balanceOf(busdHolder.address); + expect(await vBUSD.connect(busdHolder).redeem(1000)).to.emit(vBUSD, "Redeem"); + + const newVBUSDBalance = (await BUSD.balanceOf(vBUSD.address)).toString(); + const newBusdHolerBalance = (await vBUSD.balanceOf(busdHolder.address)).toString(); + expect(Number(vBUSDBalance)).greaterThan(Number(newVBUSDBalance)); + expect(newBusdHolerBalance).to.equal(busdHolderBalance.sub(1000)); + + const vUSDTBalance = (await USDT.balanceOf(vUSDT.address)).toString(); + const usdtHolderBalance = await vUSDT.balanceOf(usdtHolder.address); + expect(await vUSDT.connect(usdtHolder).redeem(1000)).to.emit(vUSDT, "Redeem"); + const newVUSDTBalance = (await USDT.balanceOf(vUSDT.address)).toString(); + const newUsdtHolerBalance = (await vUSDT.balanceOf(usdtHolder.address)).toString(); + expect(Number(vUSDTBalance)).greaterThan(Number(newVUSDTBalance)); + expect(newUsdtHolerBalance).to.equal(usdtHolderBalance.sub(1000)); + }); + + it("borrow vToken", async () => { + const busdUserBal = await BUSD.balanceOf(busdHolder.address); + expect(await vBUSD.connect(busdHolder).borrow(1000)).to.emit(vBUSD, "Borrow"); + expect((await BUSD.balanceOf(busdHolder.address)).toString()).to.equal(busdUserBal.add(1000)); + + const usdtUserBal = await BUSD.balanceOf(usdtHolder.address); + expect(await vBUSD.connect(usdtHolder).borrow(1000)).to.emit(vBUSD, "Borrow"); + expect((await BUSD.balanceOf(usdtHolder.address)).toString()).to.equal(usdtUserBal.add(1000)); + }); + + it("Repay vToken", async () => { + const busdUserBal = await BUSD.balanceOf(busdHolder.address); + expect(await vBUSD.connect(busdHolder).borrow(1000)).to.emit(vBUSD, "Borrow"); + expect((await BUSD.balanceOf(busdHolder.address)).toString()).to.equal(busdUserBal.add(1000)); + + expect(await vBUSD.connect(busdHolder).repayBorrow(1000)).to.emit(vBUSD, "RepayBorrow"); + expect((await BUSD.balanceOf(busdHolder.address)).toString()).to.equal(busdUserBal); + }); + }); + }); + } +}); From d729c849e529fe05849422c1d2295ca9caf0a7d5 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Tue, 4 Apr 2023 19:14:38 +0530 Subject: [PATCH 064/153] Minor fix. --- script/diamond/deploy.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/diamond/deploy.js b/script/diamond/deploy.js index 11c6c3952..313e3b17d 100644 --- a/script/diamond/deploy.js +++ b/script/diamond/deploy.js @@ -68,7 +68,7 @@ async function deployDiamond(unitrollerAddress) { unitrollerAdmin = signer[0]; } - const { diamondCutFacet, diamond, diamondInit, cut } = await deployFacets(unitroller.addres); + const { diamondCutFacet, diamond, diamondInit, cut } = await deployFacets(unitroller.address); await unitroller.connect(unitrollerAdmin)._setPendingImplementation(diamond.address); await diamond.connect(unitrollerAdmin)._become(); From bbb41829eb14b43eb962bc3f73271e3dccd2661d Mon Sep 17 00:00:00 2001 From: defcon022 Date: Tue, 4 Apr 2023 19:23:40 +0530 Subject: [PATCH 065/153] lint fixes. --- tests/hardhat/Liquidator/liquidatorHarnessTest.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/hardhat/Liquidator/liquidatorHarnessTest.ts b/tests/hardhat/Liquidator/liquidatorHarnessTest.ts index dbdeb4d83..7bf235f24 100644 --- a/tests/hardhat/Liquidator/liquidatorHarnessTest.ts +++ b/tests/hardhat/Liquidator/liquidatorHarnessTest.ts @@ -33,7 +33,9 @@ async function deployLiquidator(): Promise { const comptroller = await smock.fake("Comptroller"); comptroller.liquidationIncentiveMantissa.returns(announcedIncentive); const vBnb = await smock.fake("MockVBNB"); - const vTokenCollateral = await smock.fake("contracts/Tokens/VTokens/VBep20Immutable.sol:VBep20Immutable"); + const vTokenCollateral = await smock.fake( + "contracts/Tokens/VTokens/VBep20Immutable.sol:VBep20Immutable", + ); const Liquidator = await smock.mock("LiquidatorHarness"); const liquidator = await upgrades.deployProxy(Liquidator, [treasuryPercent], { From 6b10ccd3c39eb091544ca1e264aaf1cd1dff3983 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Wed, 5 Apr 2023 12:23:52 +0530 Subject: [PATCH 066/153] Removed unwanted code. --- .../V0.8.13/ComptrollerStorage.sol | 236 ------------------ .../{IPloicyFacet.sol => IPolicyFacet.sol} | 0 .../Diamond/upgradeInitialize/DiamondInit.sol | 2 +- .../V0.8.13/JumpRateModel.sol | 107 -------- .../V0.8.13/WhitePaperInterestRateModel.sol | 87 ------- contracts/Lens/InterestRateModelLens.sol | 35 --- .../Oracle/V0.8.13/VenusChainlinkOracle.sol | 121 --------- contracts/Tokens/V0.8.13/BEP20Interface.sol | 92 ------- contracts/test/TetherInterface.sol | 7 - 9 files changed, 1 insertion(+), 686 deletions(-) delete mode 100644 contracts/Comptroller/V0.8.13/ComptrollerStorage.sol rename contracts/Diamond/interfaces/{IPloicyFacet.sol => IPolicyFacet.sol} (100%) delete mode 100644 contracts/InterestRateModels/V0.8.13/JumpRateModel.sol delete mode 100644 contracts/InterestRateModels/V0.8.13/WhitePaperInterestRateModel.sol delete mode 100644 contracts/Lens/InterestRateModelLens.sol delete mode 100644 contracts/Oracle/V0.8.13/VenusChainlinkOracle.sol delete mode 100644 contracts/Tokens/V0.8.13/BEP20Interface.sol delete mode 100644 contracts/test/TetherInterface.sol diff --git a/contracts/Comptroller/V0.8.13/ComptrollerStorage.sol b/contracts/Comptroller/V0.8.13/ComptrollerStorage.sol deleted file mode 100644 index 108056d61..000000000 --- a/contracts/Comptroller/V0.8.13/ComptrollerStorage.sol +++ /dev/null @@ -1,236 +0,0 @@ -pragma solidity 0.8.13; - -import "../../Tokens/V0.8.13/VTokens/VToken.sol"; -import "../../Oracle/V0.8.13/PriceOracle.sol"; -import "../../Tokens/V0.8.13/VAI/VAIControllerInterface.sol"; -import "./ComptrollerLensInterface.sol"; - -contract UnitrollerAdminStorage { - /** - * @notice Administrator for this contract - */ - address public admin; - - /** - * @notice Pending administrator for this contract - */ - address public pendingAdmin; - - /** - * @notice Active brains of Unitroller - */ - address public comptrollerImplementation; - - /** - * @notice Pending brains of Unitroller - */ - address public pendingComptrollerImplementation; -} - -contract ComptrollerV1Storage is UnitrollerAdminStorage { - /** - * @notice Oracle which gives the price of any given asset - */ - PriceOracle public oracle; - - /** - * @notice Multiplier used to calculate the maximum repayAmount when liquidating a borrow - */ - uint public closeFactorMantissa; - - /** - * @notice Multiplier representing the discount on collateral that a liquidator receives - */ - uint public liquidationIncentiveMantissa; - - /** - * @notice Max number of assets a single account can participate in (borrow or use as collateral) - */ - uint public maxAssets; - - /** - * @notice Per-account mapping of "assets you are in", capped by maxAssets - */ - mapping(address => VToken[]) public accountAssets; - - struct Market { - /// @notice Whether or not this market is listed - bool isListed; - /** - * @notice Multiplier representing the most one can borrow against their collateral in this market. - * For instance, 0.9 to allow borrowing 90% of collateral value. - * Must be between 0 and 1, and stored as a mantissa. - */ - uint collateralFactorMantissa; - /// @notice Per-market mapping of "accounts in this asset" - mapping(address => bool) accountMembership; - /// @notice Whether or not this market receives XVS - bool isVenus; - } - - /** - * @notice Official mapping of vTokens -> Market metadata - * @dev Used e.g. to determine if a market is supported - */ - mapping(address => Market) public markets; - - /** - * @notice The Pause Guardian can pause certain actions as a safety mechanism. - */ - address public pauseGuardian; - - /// @notice Whether minting is paused (deprecated, superseded by actionPaused) - bool private _mintGuardianPaused; - /// @notice Whether borrowing is paused (deprecated, superseded by actionPaused) - bool private _borrowGuardianPaused; - /// @notice Whether borrowing is paused (deprecated, superseded by actionPaused) - bool internal transferGuardianPaused; - /// @notice Whether borrowing is paused (deprecated, superseded by actionPaused) - bool internal seizeGuardianPaused; - /// @notice Whether borrowing is paused (deprecated, superseded by actionPaused) - mapping(address => bool) internal mintGuardianPaused; - /// @notice Whether borrowing is paused (deprecated, superseded by actionPaused) - mapping(address => bool) internal borrowGuardianPaused; - - struct VenusMarketState { - /// @notice The market's last updated venusBorrowIndex or venusSupplyIndex - uint224 index; - /// @notice The block number the index was last updated at - uint32 block; - } - - /// @notice A list of all markets - VToken[] public allMarkets; - - /// @notice The rate at which the flywheel distributes XVS, per block - uint public venusRate; - - /// @notice The portion of venusRate that each market currently receives - mapping(address => uint) public venusSpeeds; - - /// @notice The Venus market supply state for each market - mapping(address => VenusMarketState) public venusSupplyState; - - /// @notice The Venus market borrow state for each market - mapping(address => VenusMarketState) public venusBorrowState; - - /// @notice The Venus supply index for each market for each supplier as of the last time they accrued XVS - mapping(address => mapping(address => uint)) public venusSupplierIndex; - - /// @notice The Venus borrow index for each market for each borrower as of the last time they accrued XVS - mapping(address => mapping(address => uint)) public venusBorrowerIndex; - - /// @notice The XVS accrued but not yet transferred to each user - mapping(address => uint) public venusAccrued; - - /// @notice The Address of VAIController - VAIControllerInterface public vaiController; - - /// @notice The minted VAI amount to each user - mapping(address => uint) public mintedVAIs; - - /// @notice VAI Mint Rate as a percentage - uint public vaiMintRate; - - /** - * @notice The Pause Guardian can pause certain actions as a safety mechanism. - */ - bool public mintVAIGuardianPaused; - bool public repayVAIGuardianPaused; - - /** - * @notice Pause/Unpause whole protocol actions - */ - bool public protocolPaused; - - /// @notice The rate at which the flywheel distributes XVS to VAI Minters, per block (deprecated) - uint private venusVAIRate; -} - -contract ComptrollerV2Storage is ComptrollerV1Storage { - /// @notice The rate at which the flywheel distributes XVS to VAI Vault, per block - uint public venusVAIVaultRate; - - // address of VAI Vault - address public vaiVaultAddress; - - // start block of release to VAI Vault - uint256 public releaseStartBlock; - - // minimum release amount to VAI Vault - uint256 public minReleaseAmount; -} - -contract ComptrollerV3Storage is ComptrollerV2Storage { - /// @notice The borrowCapGuardian can set borrowCaps to any number for any market. Lowering the borrow cap could disable borrowing on the given market. - address public borrowCapGuardian; - - /// @notice Borrow caps enforced by borrowAllowed for each vToken address. Defaults to zero which corresponds to unlimited borrowing. - mapping(address => uint) public borrowCaps; -} - -contract ComptrollerV4Storage is ComptrollerV3Storage { - /// @notice Treasury Guardian address - address public treasuryGuardian; - - /// @notice Treasury address - address public treasuryAddress; - - /// @notice Fee percent of accrued interest with decimal 18 - uint256 public treasuryPercent; -} - -contract ComptrollerV5Storage is ComptrollerV4Storage { - /// @notice The portion of XVS that each contributor receives per block (deprecated) - mapping(address => uint) private venusContributorSpeeds; - - /// @notice Last block at which a contributor's XVS rewards have been allocated (deprecated) - mapping(address => uint) private lastContributorBlock; -} - -contract ComptrollerV6Storage is ComptrollerV5Storage { - address public liquidatorContract; -} - -contract ComptrollerV7Storage is ComptrollerV6Storage { - ComptrollerLensInterface public comptrollerLens; -} - -contract ComptrollerV8Storage is ComptrollerV7Storage { - /// @notice Supply caps enforced by mintAllowed for each vToken address. Defaults to zero which corresponds to minting notAllowed - mapping(address => uint256) public supplyCaps; -} - -contract ComptrollerV9Storage is ComptrollerV8Storage { - /// @notice AccessControlManager address - address internal accessControl; - - enum Action { - MINT, - REDEEM, - BORROW, - REPAY, - SEIZE, - LIQUIDATE, - TRANSFER, - ENTER_MARKET, - EXIT_MARKET - } - - /// @notice True if a certain action is paused on a certain market - mapping(address => mapping(uint => bool)) internal _actionPaused; -} - -contract ComptrollerV10Storage is ComptrollerV9Storage { - /// @notice The rate at which venus is distributed to the corresponding borrow market (per block) - mapping(address => uint) public venusBorrowSpeeds; - - /// @notice The rate at which venus is distributed to the corresponding supply market (per block) - mapping(address => uint) public venusSupplySpeeds; -} - -contract ComptrollerV11Storage is ComptrollerV10Storage { - /// @notice Whether the delegate is allowed to borrow on behalf of the borrower - //mapping(address borrower => mapping (address delegate => bool approved)) public approvedDelegates; - mapping(address => mapping(address => bool)) public approvedDelegates; -} diff --git a/contracts/Diamond/interfaces/IPloicyFacet.sol b/contracts/Diamond/interfaces/IPolicyFacet.sol similarity index 100% rename from contracts/Diamond/interfaces/IPloicyFacet.sol rename to contracts/Diamond/interfaces/IPolicyFacet.sol diff --git a/contracts/Diamond/upgradeInitialize/DiamondInit.sol b/contracts/Diamond/upgradeInitialize/DiamondInit.sol index 6bfe6db62..2ce94e2cb 100644 --- a/contracts/Diamond/upgradeInitialize/DiamondInit.sol +++ b/contracts/Diamond/upgradeInitialize/DiamondInit.sol @@ -22,7 +22,7 @@ import { IDiamondCut } from "../interfaces/IDiamondCut.sol"; import { IMarketFacet } from "../interfaces/IMarketFacet.sol"; -import { IPolicyFacet } from "../interfaces/IPloicyFacet.sol"; +import { IPolicyFacet } from "../interfaces/IPolicyFacet.sol"; // It is expected that this contract is customized if you want to deploy your diamond diff --git a/contracts/InterestRateModels/V0.8.13/JumpRateModel.sol b/contracts/InterestRateModels/V0.8.13/JumpRateModel.sol deleted file mode 100644 index b7a6dab87..000000000 --- a/contracts/InterestRateModels/V0.8.13/JumpRateModel.sol +++ /dev/null @@ -1,107 +0,0 @@ -pragma solidity 0.8.13; - -import "./InterestRateModel.sol"; - -/** - * @title Venus's JumpRateModel Contract - * @author Venus - */ -contract JumpRateModel is InterestRateModel { - event NewInterestParams(uint baseRatePerBlock, uint multiplierPerBlock, uint jumpMultiplierPerBlock, uint kink); - - /** - * @notice The approximate number of blocks per year that is assumed by the interest rate model - */ - uint public constant blocksPerYear = (60 * 60 * 24 * 365) / 3; // (assuming 3s blocks) - - /** - * @notice The multiplier of utilization rate that gives the slope of the interest rate - */ - uint public multiplierPerBlock; - - /** - * @notice The base interest rate which is the y-intercept when utilization rate is 0 - */ - uint public baseRatePerBlock; - - /** - * @notice The multiplierPerBlock after hitting a specified utilization point - */ - uint public jumpMultiplierPerBlock; - - /** - * @notice The utilization point at which the jump multiplier is applied - */ - uint public kink; - - /** - * @notice Construct an interest rate model - * @param baseRatePerYear The approximate target base APR, as a mantissa (scaled by 1e18) - * @param multiplierPerYear The rate of increase in interest rate wrt utilization (scaled by 1e18) - * @param jumpMultiplierPerYear The multiplierPerBlock after hitting a specified utilization point - * @param kink_ The utilization point at which the jump multiplier is applied - */ - constructor(uint baseRatePerYear, uint multiplierPerYear, uint jumpMultiplierPerYear, uint kink_) { - baseRatePerBlock = baseRatePerYear / blocksPerYear; - multiplierPerBlock = multiplierPerYear / blocksPerYear; - jumpMultiplierPerBlock = jumpMultiplierPerYear / blocksPerYear; - kink = kink_; - - emit NewInterestParams(baseRatePerBlock, multiplierPerBlock, jumpMultiplierPerBlock, kink); - } - - /** - * @notice Calculates the utilization rate of the market: `borrows / (cash + borrows - reserves)` - * @param cash The amount of cash in the market - * @param borrows The amount of borrows in the market - * @param reserves The amount of reserves in the market (currently unused) - * @return The utilization rate as a mantissa between [0, 1e18] - */ - function utilizationRate(uint cash, uint borrows, uint reserves) public pure returns (uint) { - // Utilization rate is 0 when there are no borrows - if (borrows == 0) { - return 0; - } - - return (borrows * 1e18) / (cash + borrows - reserves); - } - - /** - * @notice Calculates the current borrow rate per block, with the error code expected by the market - * @param cash The amount of cash in the market - * @param borrows The amount of borrows in the market - * @param reserves The amount of reserves in the market - * @return The borrow rate percentage per block as a mantissa (scaled by 1e18) - */ - function getBorrowRate(uint cash, uint borrows, uint reserves) public view override returns (uint) { - uint util = utilizationRate(cash, borrows, reserves); - - if (util <= kink) { - return ((util * multiplierPerBlock) / 1e18) + baseRatePerBlock; - } else { - uint normalRate = ((kink * multiplierPerBlock) / 1e18) + baseRatePerBlock; - uint excessUtil = util / kink; - return ((excessUtil * jumpMultiplierPerBlock) / 1e18) + normalRate; - } - } - - /** - * @notice Calculates the current supply rate per block - * @param cash The amount of cash in the market - * @param borrows The amount of borrows in the market - * @param reserves The amount of reserves in the market - * @param reserveFactorMantissa The current reserve factor for the market - * @return The supply rate percentage per block as a mantissa (scaled by 1e18) - */ - function getSupplyRate( - uint cash, - uint borrows, - uint reserves, - uint reserveFactorMantissa - ) public view override returns (uint) { - uint oneMinusReserveFactor = 1e18 - reserveFactorMantissa; - uint borrowRate = getBorrowRate(cash, borrows, reserves); - uint rateToPool = (borrowRate * oneMinusReserveFactor) / 1e18; - return (utilizationRate(cash, borrows, reserves) * (rateToPool)) / 1e18; - } -} diff --git a/contracts/InterestRateModels/V0.8.13/WhitePaperInterestRateModel.sol b/contracts/InterestRateModels/V0.8.13/WhitePaperInterestRateModel.sol deleted file mode 100644 index 00c71e0b6..000000000 --- a/contracts/InterestRateModels/V0.8.13/WhitePaperInterestRateModel.sol +++ /dev/null @@ -1,87 +0,0 @@ -pragma solidity 0.8.13; - -import "./InterestRateModel.sol"; - -/** - * @title Venus's WhitePaperInterestRateModel Contract - * @author Venus - * @notice The parameterized model described in section 2.4 of the original Venus Protocol whitepaper - */ -contract WhitePaperInterestRateModel is InterestRateModel { - event NewInterestParams(uint baseRatePerBlock, uint multiplierPerBlock); - - /** - * @notice The approximate number of blocks per year that is assumed by the interest rate model - */ - uint public constant blocksPerYear = (60 * 60 * 24 * 365) / 3; // (assuming 3s blocks) - - /** - * @notice The multiplier of utilization rate that gives the slope of the interest rate - */ - uint public multiplierPerBlock; - - /** - * @notice The base interest rate which is the y-intercept when utilization rate is 0 - */ - uint public baseRatePerBlock; - - /** - * @notice Construct an interest rate model - * @param baseRatePerYear The approximate target base APR, as a mantissa (scaled by 1e18) - * @param multiplierPerYear The rate of increase in interest rate wrt utilization (scaled by 1e18) - */ - constructor(uint baseRatePerYear, uint multiplierPerYear) { - baseRatePerBlock = baseRatePerYear / blocksPerYear; - multiplierPerBlock = multiplierPerYear / blocksPerYear; - - emit NewInterestParams(baseRatePerBlock, multiplierPerBlock); - } - - /** - * @notice Calculates the utilization rate of the market: `borrows / (cash + borrows - reserves)` - * @param cash The amount of cash in the market - * @param borrows The amount of borrows in the market - * @param reserves The amount of reserves in the market (currently unused) - * @return The utilization rate as a mantissa between [0, 1e18] - */ - function utilizationRate(uint cash, uint borrows, uint reserves) public pure returns (uint) { - // Utilization rate is 0 when there are no borrows - if (borrows == 0) { - return 0; - } - - return (borrows * 1e18) / (cash + borrows - reserves); - } - - /** - * @notice Calculates the current borrow rate per block, with the error code expected by the market - * @param cash The amount of cash in the market - * @param borrows The amount of borrows in the market - * @param reserves The amount of reserves in the market - * @return The borrow rate percentage per block as a mantissa (scaled by 1e18) - */ - function getBorrowRate(uint cash, uint borrows, uint reserves) public view override returns (uint) { - uint ur = utilizationRate(cash, borrows, reserves); - return ((ur * multiplierPerBlock) / 1e18) + baseRatePerBlock; - } - - /** - * @notice Calculates the current supply rate per block - * @param cash The amount of cash in the market - * @param borrows The amount of borrows in the market - * @param reserves The amount of reserves in the market - * @param reserveFactorMantissa The current reserve factor for the market - * @return The supply rate percentage per block as a mantissa (scaled by 1e18) - */ - function getSupplyRate( - uint cash, - uint borrows, - uint reserves, - uint reserveFactorMantissa - ) public view override returns (uint) { - uint oneMinusReserveFactor = 1e18 - reserveFactorMantissa; - uint borrowRate = getBorrowRate(cash, borrows, reserves); - uint rateToPool = (borrowRate * oneMinusReserveFactor) / 1e18; - return (utilizationRate(cash, borrows, reserves) * rateToPool) / 1e18; - } -} diff --git a/contracts/Lens/InterestRateModelLens.sol b/contracts/Lens/InterestRateModelLens.sol deleted file mode 100644 index dc92f9663..000000000 --- a/contracts/Lens/InterestRateModelLens.sol +++ /dev/null @@ -1,35 +0,0 @@ -pragma solidity 0.8.13; - -import "../InterestRateModels/V0.8.13/InterestRateModel.sol"; - -contract InterestRateModelLens { - struct SimulationResponse { - uint256[] borrowSimulation; - uint256[] supplySimulation; - } - - function getSimulationResponse( - uint referenceAmountInWei, - address interestRateModel, - uint reserveFactorMantissa - ) external view returns (SimulationResponse memory) { - InterestRateModel ir = InterestRateModel(interestRateModel); - - uint256[] memory borrowSimulation = new uint256[](100); - uint256[] memory supplySimulation = new uint256[](100); - - uint borrow = referenceAmountInWei; - uint reserves = 0; - - for (uint percent_Factor = 1; percent_Factor <= 100; ++percent_Factor) { - uint cash = (percent_Factor * referenceAmountInWei) / 1e2; - uint256 borrowRate = ir.getBorrowRate(cash, borrow, reserves); - borrowSimulation[percent_Factor - 1] = borrowRate; - - uint256 supplyRate = ir.getSupplyRate(cash, borrow, reserves, reserveFactorMantissa); - supplySimulation[percent_Factor - 1] = supplyRate; - } - - return SimulationResponse({ borrowSimulation: borrowSimulation, supplySimulation: supplySimulation }); - } -} diff --git a/contracts/Oracle/V0.8.13/VenusChainlinkOracle.sol b/contracts/Oracle/V0.8.13/VenusChainlinkOracle.sol deleted file mode 100644 index 701cb894d..000000000 --- a/contracts/Oracle/V0.8.13/VenusChainlinkOracle.sol +++ /dev/null @@ -1,121 +0,0 @@ -pragma solidity 0.8.13; - -import "../../Tokens/V0.8.13/VTokens/VBep20.sol"; -import "../../Tokens/V0.8.13/BEP20Interface.sol"; -import "./PriceOracle.sol"; -import "../AggregatorV2V3Interface.sol"; - -contract VenusChainlinkOracle is PriceOracle { - address public admin; - - uint public maxStalePeriod; - - mapping(address => uint) internal prices; - mapping(bytes32 => AggregatorV2V3Interface) internal feeds; - - event PricePosted(address asset, uint previousPriceMantissa, uint requestedPriceMantissa, uint newPriceMantissa); - event NewAdmin(address oldAdmin, address newAdmin); - event FeedSet(address feed, string symbol); - event MaxStalePeriodUpdated(uint oldMaxStalePeriod, uint newMaxStalePeriod); - - constructor(uint maxStalePeriod_) public { - admin = msg.sender; - maxStalePeriod = maxStalePeriod_; - } - - function setMaxStalePeriod(uint newMaxStalePeriod) external onlyAdmin { - require(newMaxStalePeriod > 0, "stale period can't be zero"); - uint oldMaxStalePeriod = maxStalePeriod; - maxStalePeriod = newMaxStalePeriod; - emit MaxStalePeriodUpdated(oldMaxStalePeriod, newMaxStalePeriod); - } - - function getUnderlyingPrice(VToken vToken) public view override returns (uint) { - string memory symbol = vToken.symbol(); - if (compareStrings(symbol, "vBNB")) { - return getChainlinkPrice(getFeed(symbol)); - } else if (compareStrings(symbol, "VAI")) { - return getChainlinkPrice(getFeed(symbol)); - } else if (compareStrings(symbol, "XVS")) { - return prices[address(vToken)]; - } else { - return getPrice(vToken); - } - } - - function getPrice(VToken vToken) internal view returns (uint price) { - BEP20Interface token = BEP20Interface(VBep20(address(vToken)).underlying()); - - if (prices[address(token)] != 0) { - price = prices[address(token)]; - } else { - price = getChainlinkPrice(getFeed(token.symbol())); - } - - uint decimalDelta = 18 - (uint(token.decimals())); - // Ensure that we don't multiply the result by 0 - if (decimalDelta > 0) { - return price * (10 ** decimalDelta); - } else { - return price; - } - } - - function getChainlinkPrice(AggregatorV2V3Interface feed) internal view returns (uint) { - // Chainlink USD-denominated feeds store answers at 8 decimals - uint decimalDelta = 18 / (feed.decimals()); - - (, int256 answer, , uint256 updatedAt, ) = feed.latestRoundData(); - // Ensure that we don't multiply the result by 0 - if ((block.timestamp - updatedAt) > maxStalePeriod) { - return 0; - } - - if (decimalDelta > 0) { - return uint(answer) * (10 ** decimalDelta); - } else { - return uint(answer); - } - } - - function setUnderlyingPrice(VToken vToken, uint underlyingPriceMantissa) external onlyAdmin { - address asset = address(VBep20(address(vToken)).underlying()); - emit PricePosted(asset, prices[asset], underlyingPriceMantissa, underlyingPriceMantissa); - prices[asset] = underlyingPriceMantissa; - } - - function setDirectPrice(address asset, uint price) external onlyAdmin { - emit PricePosted(asset, prices[asset], price, price); - prices[asset] = price; - } - - function setFeed(string calldata symbol, address feed) external onlyAdmin { - require(feed != address(0) && feed != address(this), "invalid feed address"); - emit FeedSet(feed, symbol); - feeds[keccak256(abi.encodePacked(symbol))] = AggregatorV2V3Interface(feed); - } - - function getFeed(string memory symbol) public view returns (AggregatorV2V3Interface) { - return feeds[keccak256(abi.encodePacked(symbol))]; - } - - function assetPrices(address asset) external view returns (uint) { - return prices[asset]; - } - - function compareStrings(string memory a, string memory b) internal pure returns (bool) { - return (keccak256(abi.encodePacked((a))) == keccak256(abi.encodePacked((b)))); - } - - function setAdmin(address newAdmin) external onlyAdmin { - address oldAdmin = admin; - admin = newAdmin; - - emit NewAdmin(oldAdmin, newAdmin); - } - - modifier onlyAdmin() { - require(msg.sender == admin, "only admin may call"); - _; - } -} diff --git a/contracts/Tokens/V0.8.13/BEP20Interface.sol b/contracts/Tokens/V0.8.13/BEP20Interface.sol deleted file mode 100644 index 13a3e988e..000000000 --- a/contracts/Tokens/V0.8.13/BEP20Interface.sol +++ /dev/null @@ -1,92 +0,0 @@ -pragma solidity 0.8.13; - -interface BEP20Interface { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the token decimals. - */ - function decimals() external view returns (uint8); - - /** - * @dev Returns the token symbol. - */ - function symbol() external view returns (string memory); - - /** - * @dev Returns the token name. - */ - function name() external view returns (string memory); - - /** - * @dev Returns the bep token owner. - */ - function getOwner() external view returns (address); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address _owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} diff --git a/contracts/test/TetherInterface.sol b/contracts/test/TetherInterface.sol deleted file mode 100644 index 07526dae4..000000000 --- a/contracts/test/TetherInterface.sol +++ /dev/null @@ -1,7 +0,0 @@ -pragma solidity 0.8.13; - -import "../Tokens/V0.8.13/EIP20Interface.sol"; - -abstract contract TetherInterface is EIP20Interface { - function setParams(uint newBasisPoints, uint newMaxFee) external virtual; -} From 7864c014204f3060d743e8140b0c943b1c6a0608 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Wed, 5 Apr 2023 19:00:24 +0530 Subject: [PATCH 067/153] FIx PR comment. --- contracts/Vault/VAIVault.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/Vault/VAIVault.sol b/contracts/Vault/VAIVault.sol index 844ce4495..1ad9a9802 100644 --- a/contracts/Vault/VAIVault.sol +++ b/contracts/Vault/VAIVault.sol @@ -80,7 +80,7 @@ contract VAIVault is VAIVaultStorage { * @notice Claim XVS from VAIVault * @param account The account for which to claim XVS */ - function claim(address account) public nonReentrant { + function claim(address account) external nonReentrant { _withdraw(account, 0); } From a86ac9150c46355dffe2ad846eae87137e8ae3d3 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Fri, 7 Apr 2023 12:05:24 +0530 Subject: [PATCH 068/153] Changes in the vip of the diamond proxy for comptroller. --- .../hardhat/fork/vip-diamond-comptroller.ts | 130 ++++++++++-------- script/hardhat/fork/vip-framework/utils.ts | 9 +- 2 files changed, 83 insertions(+), 56 deletions(-) diff --git a/script/hardhat/fork/vip-diamond-comptroller.ts b/script/hardhat/fork/vip-diamond-comptroller.ts index 7807d5330..daf77c22b 100644 --- a/script/hardhat/fork/vip-diamond-comptroller.ts +++ b/script/hardhat/fork/vip-diamond-comptroller.ts @@ -15,7 +15,7 @@ let DIAMOND_CUT_FACET; let DIAMOND; let DIAMOND_INIT; -const vip105 = async () => { +export const vip106 = async () => { const meta = { version: "v1", title: "VIP-105 Comptroller Diamond proxy", @@ -34,6 +34,31 @@ const vip105 = async () => { const initFunctionEncode = diamondInit.interface.encodeFunctionData("init"); + function getFunctionSelector(selectors: any) { + const functionSelector: any = []; + for (let i = 0; i < selectors.length; i++) { + if (selectors[i][0] == "0") { + functionSelector.push(selectors[i]); + } else { + break; + } + } + return functionSelector; + } + + function makeCutParam(cut: any) { + const cutParams = []; + for (let i = 0; i < cut.length; i++) { + const arr: any = new Array(3); + arr[0] = cut[i].facetAddress; + arr[1] = cut[i].action; + arr[2] = getFunctionSelector(cut[i].functionSelectors); + cutParams.push(arr); + } + return cutParams; + } + const cutParams = makeCutParam(cut); + return makeProposal( [ { @@ -53,8 +78,8 @@ const vip105 = async () => { }, { target: UNITROLLER, - signature: "diamondCut(FacetCut[],address,bytes)", - params: [cut, DIAMOND_INIT, initFunctionEncode], + signature: "diamondCut((address,uint8,bytes4[])[],address,bytes)", + params: [cutParams, DIAMOND_INIT, initFunctionEncode], }, ], meta, @@ -63,52 +88,52 @@ const vip105 = async () => { }; forking(25892445, async () => { - testVip("VIP-98 TRON Contract Migration", await vip105()); + testVip("VIP-98 TRON Contract Migration", await vip106()); }); -let owner, - unitroller, - // layout variables - oracle, - maxAssets, - closeFactorMantissa, - liquidationIncentiveMantissa, - allMarkets, - venusRate, - venusSpeeds, - venusSupplyState, - venusBorrowState, - venusAccrued, - vaiMintRate, - vaiController, - mintedVAIs, - mintVAIGuardianPaused, - repayVAIGuardianPaused, - protocolPaused, - venusVAIVaultRate, - vaiVaultAddress, - releaseStartBlock, - minReleaseAmount, - treasuryGuardian, - treasuryAddress, - treasuryPercent, - liquidatorContract, - comptrollerLens, - market, - venusSupplierIndex, - venusBorrowerIndex; - -const Owner = "0x939bd8d64c0a9583a7dcea9933f7b21697ab6396"; -const zeroAddr = "0x0000000000000000000000000000000000000000"; -const VBUSD = "0x95c78222B3D6e262426483D42CfA53685A67Ab9D"; -const VUSDT = "0xfD5840Cd36d94D7229439859C0112a4185BC0255"; - -const initMainnetUser = async (user: string) => { - await impersonateAccount(user); - return ethers.getSigner(user); -}; +forking(26713742, async () => { + let owner, + unitroller, + // layout variables + oracle, + maxAssets, + closeFactorMantissa, + liquidationIncentiveMantissa, + allMarkets, + venusRate, + venusSpeeds, + venusSupplyState, + venusBorrowState, + venusAccrued, + vaiMintRate, + vaiController, + mintedVAIs, + mintVAIGuardianPaused, + repayVAIGuardianPaused, + protocolPaused, + venusVAIVaultRate, + vaiVaultAddress, + releaseStartBlock, + minReleaseAmount, + treasuryGuardian, + treasuryAddress, + treasuryPercent, + liquidatorContract, + comptrollerLens, + market, + venusSupplierIndex, + venusBorrowerIndex; + + const Owner = "0x939bd8d64c0a9583a7dcea9933f7b21697ab6396"; + const zeroAddr = "0x0000000000000000000000000000000000000000"; + const VBUSD = "0x95c78222B3D6e262426483D42CfA53685A67Ab9D"; + const VUSDT = "0xfD5840Cd36d94D7229439859C0112a4185BC0255"; + + const initMainnetUser = async (user: string) => { + await impersonateAccount(user); + return ethers.getSigner(user); + }; -forking(26713742, () => { let USDT: ethers.contract; let BUSD: ethers.contract; let usdtHolder: ethers.Signer; @@ -119,13 +144,11 @@ forking(26713742, () => { if (process.env.FORK_MAINNET === "true") { before(async () => { - /* - * Forking mainnet - * */ - /** * sending gas cost to owner * */ + + await pretendExecutingVip(await vip106()); await impersonateAccount(Owner); owner = await ethers.getSigner(Owner); const [signer] = await ethers.getSigners(); @@ -138,8 +161,7 @@ forking(26713742, () => { // unitroller without diamond unitroller = await ethers.getContractAt("Comptroller", UNITROLLER); - // unitroller with diamond - diamondUnitroller = await ethers.getContractAt("Comptroller", UNITROLLER); + diamondUnitroller = await ethers.getContractAt("Comptroller", unitroller.address); busdHolder = await initMainnetUser("0xf977814e90da44bfa03b6295a0616a897441acec"); usdtHolder = await initMainnetUser("0xc444949e0054A23c44Fc45789738bdF64aed2391"); @@ -155,10 +177,9 @@ forking(26713742, () => { return ethers.getContractAt("IERC20Upgradeable", underlying); }), ); - await pretendExecutingVip(await vip105()); }); - describe("Verify Storage slots", () => { + describe("Verify Storage slots", async () => { // These tests checks the storage collision of comptroller while updating it via diamond. describe("Diamond deployed successfully", async () => { it("Owner of Diamond unitroller contract should match", async () => { @@ -171,6 +192,7 @@ forking(26713742, () => { it("Diamond Unitroller Implementation (comptroller) should match the diamond Proxy Address", async () => { const comptrollerImplementation = await diamondUnitroller.comptrollerImplementation(); const pendingComptrollerImplementation = await diamondUnitroller.pendingComptrollerImplementation(); + console.log("pending implementation ", comptrollerImplementation, DIAMOND); expect(comptrollerImplementation.toLowerCase()).to.equal(DIAMOND.toLowerCase()); expect(pendingComptrollerImplementation.toLowerCase()).to.equal(zeroAddr); }); diff --git a/script/hardhat/fork/vip-framework/utils.ts b/script/hardhat/fork/vip-framework/utils.ts index cabd43f1f..99eb05f50 100644 --- a/script/hardhat/fork/vip-framework/utils.ts +++ b/script/hardhat/fork/vip-framework/utils.ts @@ -23,7 +23,12 @@ export async function setForkBlock(blockNumber: number) { export function getCalldatas({ signatures, params }: { signatures: string[]; params: any[][] }) { return params.map((args: any[], i: number) => { - const types = getArgs(signatures[i]); + let types = getArgs(signatures[i]); + // Fix for the diamond VIP as there is struct in types and defaultAbiCoder + // is unable to process struct. + if (signatures[i] == "diamondCut((address,uint8,bytes4[])[],address,bytes)") { + types = ["tuple(address, uint8, bytes4[])[]", "address", "bytes"]; + } return defaultAbiCoder.encode(types, args); }); } @@ -31,7 +36,7 @@ export function getCalldatas({ signatures, params }: { signatures: string[]; par const getArgs = (func: string) => { if (func === "") return []; // First match everything inside the function argument parens. - const match = func.match(/.*?\(([^)]*)\)/); + const match = func.match(/.*?\(([^]*)\)/); const args = match ? match[1] : ""; // Split the arguments string into an array comma delimited. return args From 2a634fba8fa4d1ef76d1f1197da436772b54eeea Mon Sep 17 00:00:00 2001 From: defcon022 Date: Wed, 19 Apr 2023 19:41:04 +0530 Subject: [PATCH 069/153] fix: resolve issues in script files --- .../hardhat/fork/vip-diamond-comptroller.ts | 461 ------------------ script/hardhat/fork/vip-framework/index.ts | 15 +- script/hardhat/fork/vip-framework/utils.ts | 4 +- 3 files changed, 12 insertions(+), 468 deletions(-) delete mode 100644 script/hardhat/fork/vip-diamond-comptroller.ts diff --git a/script/hardhat/fork/vip-diamond-comptroller.ts b/script/hardhat/fork/vip-diamond-comptroller.ts deleted file mode 100644 index daf77c22b..000000000 --- a/script/hardhat/fork/vip-diamond-comptroller.ts +++ /dev/null @@ -1,461 +0,0 @@ -import { impersonateAccount } from "@nomicfoundation/hardhat-network-helpers"; -import { expect } from "chai"; -import { parseUnits } from "ethers/lib/utils"; -import { ethers } from "hardhat"; - -import { VBep20 } from "../../../typechain"; -import { deployFacets } from "../../diamond/deploy"; -import { forking, pretendExecutingVip, testVip } from "./vip-framework"; -import { ProposalType } from "./vip-framework/types"; -import { makeProposal } from "./vip-framework/utils"; - -const UNITROLLER = "0xfD36E2c2a6789Db23113685031d7F16329158384"; - -let DIAMOND_CUT_FACET; -let DIAMOND; -let DIAMOND_INIT; - -export const vip106 = async () => { - const meta = { - version: "v1", - title: "VIP-105 Comptroller Diamond proxy", - description: ``, - forDescription: - "I agree that Venus Protocol should proceed with the upgrading the Comptroller contract with diamond proxy", - againstDescription: "I do not think that Venus Protocol should proceed with the Comptroller contract upgradation", - abstainDescription: "I am indifferent to whether Venus Protocol proceeds with the Comptroller upgradation or not", - }; - - const { diamondCutFacet, diamond, diamondInit, cut } = await deployFacets(UNITROLLER); - - DIAMOND_CUT_FACET = diamondCutFacet.address; - DIAMOND = diamond.address; - DIAMOND_INIT = diamondInit.address; - - const initFunctionEncode = diamondInit.interface.encodeFunctionData("init"); - - function getFunctionSelector(selectors: any) { - const functionSelector: any = []; - for (let i = 0; i < selectors.length; i++) { - if (selectors[i][0] == "0") { - functionSelector.push(selectors[i]); - } else { - break; - } - } - return functionSelector; - } - - function makeCutParam(cut: any) { - const cutParams = []; - for (let i = 0; i < cut.length; i++) { - const arr: any = new Array(3); - arr[0] = cut[i].facetAddress; - arr[1] = cut[i].action; - arr[2] = getFunctionSelector(cut[i].functionSelectors); - cutParams.push(arr); - } - return cutParams; - } - const cutParams = makeCutParam(cut); - - return makeProposal( - [ - { - target: UNITROLLER, - signature: "_setPendingImplementation(address)", - params: [DIAMOND], - }, - { - target: DIAMOND, - signature: "_become()", - params: [], - }, - { - target: UNITROLLER, - signature: "facetCutInitilizer(address)", - params: [DIAMOND_CUT_FACET], - }, - { - target: UNITROLLER, - signature: "diamondCut((address,uint8,bytes4[])[],address,bytes)", - params: [cutParams, DIAMOND_INIT, initFunctionEncode], - }, - ], - meta, - ProposalType.REGULAR, - ); -}; - -forking(25892445, async () => { - testVip("VIP-98 TRON Contract Migration", await vip106()); -}); - -forking(26713742, async () => { - let owner, - unitroller, - // layout variables - oracle, - maxAssets, - closeFactorMantissa, - liquidationIncentiveMantissa, - allMarkets, - venusRate, - venusSpeeds, - venusSupplyState, - venusBorrowState, - venusAccrued, - vaiMintRate, - vaiController, - mintedVAIs, - mintVAIGuardianPaused, - repayVAIGuardianPaused, - protocolPaused, - venusVAIVaultRate, - vaiVaultAddress, - releaseStartBlock, - minReleaseAmount, - treasuryGuardian, - treasuryAddress, - treasuryPercent, - liquidatorContract, - comptrollerLens, - market, - venusSupplierIndex, - venusBorrowerIndex; - - const Owner = "0x939bd8d64c0a9583a7dcea9933f7b21697ab6396"; - const zeroAddr = "0x0000000000000000000000000000000000000000"; - const VBUSD = "0x95c78222B3D6e262426483D42CfA53685A67Ab9D"; - const VUSDT = "0xfD5840Cd36d94D7229439859C0112a4185BC0255"; - - const initMainnetUser = async (user: string) => { - await impersonateAccount(user); - return ethers.getSigner(user); - }; - - let USDT: ethers.contract; - let BUSD: ethers.contract; - let usdtHolder: ethers.Signer; - let busdHolder: ethers.Signer; - let vBUSD: ethers.contract; - let vUSDT: ethers.contract; - let diamondUnitroller; - - if (process.env.FORK_MAINNET === "true") { - before(async () => { - /** - * sending gas cost to owner - * */ - - await pretendExecutingVip(await vip106()); - await impersonateAccount(Owner); - owner = await ethers.getSigner(Owner); - const [signer] = await ethers.getSigners(); - await signer.sendTransaction({ - to: owner.address, - value: ethers.BigNumber.from("10000000000000000000"), - data: undefined, - }); - - // unitroller without diamond - unitroller = await ethers.getContractAt("Comptroller", UNITROLLER); - - diamondUnitroller = await ethers.getContractAt("Comptroller", unitroller.address); - - busdHolder = await initMainnetUser("0xf977814e90da44bfa03b6295a0616a897441acec"); - usdtHolder = await initMainnetUser("0xc444949e0054A23c44Fc45789738bdF64aed2391"); - - [vBUSD, vUSDT] = await Promise.all( - [VBUSD, VUSDT].map((address: string) => { - return ethers.getContractAt("contracts/Tokens/V0.8.13/VTokens/VBep20Delegate.sol:VBep20Delegate", address); - }), - ); - [BUSD, USDT] = await Promise.all( - [vBUSD, vUSDT].map(async (vToken: VBep20) => { - const underlying = await vToken.underlying(); - return ethers.getContractAt("IERC20Upgradeable", underlying); - }), - ); - }); - - describe("Verify Storage slots", async () => { - // These tests checks the storage collision of comptroller while updating it via diamond. - describe("Diamond deployed successfully", async () => { - it("Owner of Diamond unitroller contract should match", async () => { - const diamondUnitrollerAdmin = await diamondUnitroller.admin(); - const pendingAdmin = await diamondUnitroller.pendingAdmin(); - expect(diamondUnitrollerAdmin.toLowerCase()).to.equal(Owner); - expect(pendingAdmin.toLowerCase()).to.equal(zeroAddr); - }); - - it("Diamond Unitroller Implementation (comptroller) should match the diamond Proxy Address", async () => { - const comptrollerImplementation = await diamondUnitroller.comptrollerImplementation(); - const pendingComptrollerImplementation = await diamondUnitroller.pendingComptrollerImplementation(); - console.log("pending implementation ", comptrollerImplementation, DIAMOND); - expect(comptrollerImplementation.toLowerCase()).to.equal(DIAMOND.toLowerCase()); - expect(pendingComptrollerImplementation.toLowerCase()).to.equal(zeroAddr); - }); - }); - - describe("Verify storage layout", async () => { - it("verify all the state before and after upgrade", async () => { - oracle = await unitroller.oracle(); - const oracelUpgrade = await diamondUnitroller.oracle(); - expect(oracle).to.equal(oracelUpgrade); - - maxAssets = await unitroller.maxAssets(); - const maxAssetsAfterUpgrade = await diamondUnitroller.maxAssets(); - expect(maxAssets).to.equal(maxAssetsAfterUpgrade); - - closeFactorMantissa = await unitroller.closeFactorMantissa(); - const closeFactorMantissaAfterUpgrade = await diamondUnitroller.closeFactorMantissa(); - expect(closeFactorMantissa).to.equal(closeFactorMantissaAfterUpgrade); - - liquidationIncentiveMantissa = await unitroller.liquidationIncentiveMantissa(); - const liquidationIncentiveMantissaAfterUpgrade = await diamondUnitroller.liquidationIncentiveMantissa(); - expect(liquidationIncentiveMantissa).to.equal(liquidationIncentiveMantissaAfterUpgrade); - - allMarkets = await unitroller.allMarkets(0); - const allMarketsAfterUpgrade = await diamondUnitroller.allMarkets(0); - expect(allMarkets).to.equal(allMarketsAfterUpgrade); - - venusRate = await unitroller.venusRate(); - const venusRateAfterUpgrade = await diamondUnitroller.venusRate(); - expect(venusRate).to.equal(venusRateAfterUpgrade); - - venusSpeeds = await unitroller.venusSpeeds(BUSD.address); - const venusSpeedsAfterUpgrade = await diamondUnitroller.venusSpeeds(BUSD.address); - expect(venusSpeeds).to.equal(venusSpeedsAfterUpgrade); - - venusSupplyState = await unitroller.venusSupplyState(BUSD.address); - const venusSupplyStateAfterUpgrade = await diamondUnitroller.venusSupplyState(BUSD.address); - expect(venusSupplyState.index.toString()).to.equal(venusSupplyStateAfterUpgrade.index.toString()); - - venusBorrowState = await unitroller.venusBorrowState(BUSD.address); - const venusBorrowStateAfterUpgrade = await diamondUnitroller.venusBorrowState(BUSD.address); - expect(venusBorrowState.index.toString()).to.equal(venusBorrowStateAfterUpgrade.index.toString()); - - venusAccrued = await unitroller.venusAccrued(BUSD.address); - const venusAccruedAfterUpgrade = await diamondUnitroller.venusAccrued(BUSD.address); - expect(venusAccrued).to.equal(venusAccruedAfterUpgrade); - - vaiMintRate = await unitroller.vaiMintRate(); - const vaiMintRateAfterUpgrade = await diamondUnitroller.vaiMintRate(); - expect(vaiMintRate).to.equal(vaiMintRateAfterUpgrade); - - vaiController = await unitroller.vaiController(); - const vaiControllerUpgrade = await diamondUnitroller.vaiController(); - expect(vaiControllerUpgrade).to.equal(vaiController); - - mintedVAIs = await unitroller.mintedVAIs(busdHolder.address); - unitroller.minte; - const mintedVAIsUpgrade = await diamondUnitroller.mintedVAIs(busdHolder.address); - expect(mintedVAIsUpgrade).to.equal(mintedVAIs); - - mintVAIGuardianPaused = await unitroller.mintVAIGuardianPaused(); - const mintVAIGuardianPausedUpgrade = await diamondUnitroller.mintVAIGuardianPaused(); - expect(mintVAIGuardianPausedUpgrade).to.equal(mintVAIGuardianPaused); - - repayVAIGuardianPaused = await unitroller.repayVAIGuardianPaused(); - const repayVAIGuardianPausedUpgrade = await diamondUnitroller.repayVAIGuardianPaused(); - expect(repayVAIGuardianPausedUpgrade).to.equal(repayVAIGuardianPaused); - - protocolPaused = await unitroller.protocolPaused(); - const protocolPausedUpgrade = await diamondUnitroller.protocolPaused(); - expect(protocolPausedUpgrade).to.equal(protocolPaused); - - venusVAIVaultRate = await unitroller.venusVAIVaultRate(); - const venusVAIVaultRateUpgrade = await diamondUnitroller.venusVAIVaultRate(); - expect(venusVAIVaultRateUpgrade).to.equal(venusVAIVaultRate); - - vaiVaultAddress = await unitroller.vaiVaultAddress(); - const vaiVaultAddressUpgrade = await diamondUnitroller.vaiVaultAddress(); - expect(vaiVaultAddressUpgrade).to.equal(vaiVaultAddress); - - releaseStartBlock = await unitroller.releaseStartBlock(); - const releaseStartBlockUpgrade = await diamondUnitroller.releaseStartBlock(); - expect(releaseStartBlockUpgrade).to.equal(releaseStartBlock); - - minReleaseAmount = await unitroller.minReleaseAmount(); - const minReleaseAmountUpgrade = await diamondUnitroller.minReleaseAmount(); - expect(minReleaseAmountUpgrade).to.equal(minReleaseAmount); - - treasuryGuardian = await unitroller.treasuryGuardian(); - const treasuryGuardianUpgrade = await diamondUnitroller.treasuryGuardian(); - expect(treasuryGuardian).to.equal(treasuryGuardianUpgrade); - - treasuryAddress = await unitroller.treasuryAddress(); - const treasuryAddressUpgrade = await diamondUnitroller.treasuryAddress(); - expect(treasuryAddress).to.equal(treasuryAddressUpgrade); - - treasuryPercent = await unitroller.treasuryPercent(); - const treasuryPercentUpgrade = await diamondUnitroller.treasuryPercent(); - expect(treasuryPercent).to.equal(treasuryPercentUpgrade); - - liquidatorContract = await unitroller.liquidatorContract(); - const liquidatorContractUpgrade = await diamondUnitroller.liquidatorContract(); - expect(liquidatorContract).to.equal(liquidatorContractUpgrade); - - comptrollerLens = await unitroller.comptrollerLens(); - const comptrollerLensUpgrade = await diamondUnitroller.comptrollerLens(); - expect(comptrollerLens).to.equal(comptrollerLensUpgrade); - - // cheking all public mappings - market = await unitroller.markets(vBUSD.address); - const marketUpgrade = await diamondUnitroller.markets(vBUSD.address); - expect(market.collateralFactorMantissa).to.equal(marketUpgrade.collateralFactorMantissa); - expect(market.isListed).to.equal(marketUpgrade.isListed); - expect(market.isVenus).to.equal(marketUpgrade.isVenus); - - venusBorrowerIndex = await unitroller.venusBorrowerIndex(vBUSD.address, busdHolder.address); - const venusBorrowerIndexUpgrade = await diamondUnitroller.venusBorrowerIndex( - vBUSD.address, - busdHolder.address, - ); - expect(venusBorrowerIndex).to.equal(venusBorrowerIndexUpgrade); - - venusSupplierIndex = await unitroller.venusSupplierIndex(vBUSD.address, busdHolder.address); - const venusSupplierIndexUpgrade = await diamondUnitroller.venusSupplierIndex( - vBUSD.address, - busdHolder.address, - ); - expect(venusSupplierIndex).to.equal(venusSupplierIndexUpgrade); - - const venusBorrowSpeeds = await unitroller.venusBorrowSpeeds(vUSDT.address); - const venusBorrowSpeedsUpgrade = await diamondUnitroller.venusBorrowSpeeds(vUSDT.address); - const venusSupplySpeeds = await unitroller.venusSupplySpeeds(vUSDT.address); - const venusSupplySpeedsUpgrade = await diamondUnitroller.venusSupplySpeeds(vUSDT.address); - - expect(venusBorrowSpeeds).to.equal(venusBorrowSpeedsUpgrade); - expect(venusSupplySpeeds).to.equal(venusSupplySpeedsUpgrade); - }); - }); - }); - - describe("Verify states of diamond Contract", () => { - describe("Diamond setters", () => { - it("setting market supply cap", async () => { - const currentSupplyCap = (await diamondUnitroller.supplyCaps(vBUSD.address)).toString(); - await diamondUnitroller.connect(owner)._setMarketSupplyCaps([vBUSD.address], [parseUnits("100000", 18)]); - expect(await diamondUnitroller.supplyCaps(vBUSD.address)).to.equals(parseUnits("100000", 18)); - await diamondUnitroller - .connect(owner) - ._setMarketSupplyCaps([vBUSD.address], [parseUnits(currentSupplyCap, 0)]); - expect(await diamondUnitroller.supplyCaps(vBUSD.address)).to.equals(parseUnits(currentSupplyCap, 0)); - }); - - it("setting close factor", async () => { - const currentCloseFactor = (await diamondUnitroller.closeFactorMantissa()).toString(); - await diamondUnitroller.connect(owner)._setCloseFactor(parseUnits("10000", 18)); - expect(await diamondUnitroller.closeFactorMantissa()).to.equals(parseUnits("10000", 18)); - await diamondUnitroller.connect(owner)._setCloseFactor(parseUnits(currentCloseFactor, 0)); - expect(await diamondUnitroller.closeFactorMantissa()).to.equals(parseUnits(currentCloseFactor, 0)); - }); - - it("setting collateral factor", async () => { - await diamondUnitroller.connect(owner)._setCollateralFactor(vUSDT.address, 2); - market = await diamondUnitroller.markets(vUSDT.address); - expect(market.collateralFactorMantissa).to.equal(2); - - await diamondUnitroller.connect(owner)._setCollateralFactor(vUSDT.address, parseUnits("8", 17)); - market = await diamondUnitroller.markets(vUSDT.address); - expect(market.collateralFactorMantissa).to.equal(parseUnits("8", 17)); - }); - - it("setting setting Liquidation Incentive", async () => { - await diamondUnitroller.connect(owner)._setLiquidationIncentive(parseUnits("13", 17)); - expect(await diamondUnitroller.liquidationIncentiveMantissa()).to.equal(parseUnits("13", 17)); - - await diamondUnitroller.connect(owner)._setLiquidationIncentive(parseUnits("11", 17)); - expect(await diamondUnitroller.liquidationIncentiveMantissa()).to.equal(parseUnits("11", 17)); - }); - - it("setting Pause Guardian", async () => { - const currentPauseGuardia = (await diamondUnitroller.pauseGuardian()).toString(); - - await diamondUnitroller.connect(owner)._setPauseGuardian(owner.address); - expect(await diamondUnitroller.pauseGuardian()).to.equal(owner.address); - - await diamondUnitroller.connect(owner)._setPauseGuardian(currentPauseGuardia); - expect(await diamondUnitroller.pauseGuardian()).to.equal(currentPauseGuardia); - }); - - it("setting market borrow cap", async () => { - const currentBorrowCap = (await diamondUnitroller.borrowCaps(vUSDT.address)).toString(); - await diamondUnitroller.connect(owner)._setMarketBorrowCaps([vUSDT.address], [parseUnits("10000", 18)]); - expect(await diamondUnitroller.borrowCaps(vUSDT.address)).to.equal(parseUnits("10000", 18)); - - await diamondUnitroller.connect(owner)._setMarketBorrowCaps([vUSDT.address], [currentBorrowCap]); - expect(await diamondUnitroller.borrowCaps(vUSDT.address)).to.equal(currentBorrowCap); - }); - - it("pausing mint action in vUSDT", async () => { - expect(await diamondUnitroller.connect(owner)._setActionsPaused([vBUSD.address], [0], true)).to.emit( - vBUSD, - "ActionPausedMarket", - ); - - await expect(vBUSD.connect(usdtHolder).mint(1000)).to.be.revertedWith("action is paused"); - - expect(await diamondUnitroller.connect(owner)._setActionsPaused([vBUSD.address], [0], false)).to.emit( - vBUSD, - "ActionPausedMarket", - ); - expect(await vBUSD.connect(busdHolder).mint(10)).to.be.emit(vBUSD, "Mint"); - }); - }); - - describe("Diamond Hooks", () => { - it("mint vToken vBUSD", async () => { - const vBUSDBalance = await BUSD.balanceOf(vBUSD.address); - const busdHolerBalance = await BUSD.balanceOf(busdHolder.address); - expect(await vBUSD.connect(busdHolder).mint(1000)).to.emit(vBUSD, "Mint"); - - const newvBUSDBalance = await BUSD.balanceOf(vBUSD.address); - const newBusdHolerBalance = await BUSD.balanceOf(busdHolder.address); - expect(newvBUSDBalance.toString()).to.equal(vBUSDBalance.add(1000)); - expect(newBusdHolerBalance.toString()).to.equal(busdHolerBalance.sub(1000)); - }); - - it("redeem vToken", async () => { - const vBUSDBalance = (await BUSD.balanceOf(vBUSD.address)).toString(); - const busdHolderBalance = await vBUSD.balanceOf(busdHolder.address); - expect(await vBUSD.connect(busdHolder).redeem(1000)).to.emit(vBUSD, "Redeem"); - - const newVBUSDBalance = (await BUSD.balanceOf(vBUSD.address)).toString(); - const newBusdHolerBalance = (await vBUSD.balanceOf(busdHolder.address)).toString(); - expect(Number(vBUSDBalance)).greaterThan(Number(newVBUSDBalance)); - expect(newBusdHolerBalance).to.equal(busdHolderBalance.sub(1000)); - - const vUSDTBalance = (await USDT.balanceOf(vUSDT.address)).toString(); - const usdtHolderBalance = await vUSDT.balanceOf(usdtHolder.address); - expect(await vUSDT.connect(usdtHolder).redeem(1000)).to.emit(vUSDT, "Redeem"); - const newVUSDTBalance = (await USDT.balanceOf(vUSDT.address)).toString(); - const newUsdtHolerBalance = (await vUSDT.balanceOf(usdtHolder.address)).toString(); - expect(Number(vUSDTBalance)).greaterThan(Number(newVUSDTBalance)); - expect(newUsdtHolerBalance).to.equal(usdtHolderBalance.sub(1000)); - }); - - it("borrow vToken", async () => { - const busdUserBal = await BUSD.balanceOf(busdHolder.address); - expect(await vBUSD.connect(busdHolder).borrow(1000)).to.emit(vBUSD, "Borrow"); - expect((await BUSD.balanceOf(busdHolder.address)).toString()).to.equal(busdUserBal.add(1000)); - - const usdtUserBal = await BUSD.balanceOf(usdtHolder.address); - expect(await vBUSD.connect(usdtHolder).borrow(1000)).to.emit(vBUSD, "Borrow"); - expect((await BUSD.balanceOf(usdtHolder.address)).toString()).to.equal(usdtUserBal.add(1000)); - }); - - it("Repay vToken", async () => { - const busdUserBal = await BUSD.balanceOf(busdHolder.address); - expect(await vBUSD.connect(busdHolder).borrow(1000)).to.emit(vBUSD, "Borrow"); - expect((await BUSD.balanceOf(busdHolder.address)).toString()).to.equal(busdUserBal.add(1000)); - - expect(await vBUSD.connect(busdHolder).repayBorrow(1000)).to.emit(vBUSD, "RepayBorrow"); - expect((await BUSD.balanceOf(busdHolder.address)).toString()).to.equal(busdUserBal); - }); - }); - }); - } -}); diff --git a/script/hardhat/fork/vip-framework/index.ts b/script/hardhat/fork/vip-framework/index.ts index e59a031be..6d568eb3c 100644 --- a/script/hardhat/fork/vip-framework/index.ts +++ b/script/hardhat/fork/vip-framework/index.ts @@ -7,13 +7,19 @@ import { ethers } from "hardhat"; import { Proposal } from "./types"; import { getCalldatas, initMainnetUser, setForkBlock } from "./utils"; -const DEFAULT_PROPOSER_ADDRESS = "0x55A9f5374Af30E3045FB491f1da3C2E8a74d168D"; +let DEFAULT_PROPOSER_ADDRESS = "0x55A9f5374Af30E3045FB491f1da3C2E8a74d168D"; const DEFAULT_SUPPORTER_ADDRESS = "0xc444949e0054a23c44fc45789738bdf64aed2391"; -const GOVERNOR_PROXY = "0x2d56dC077072B53571b8252008C60e945108c75a"; -const NORMAL_TIMELOCK = "0x939bD8d64c0A9583A7Dcea9933f7b21697ab6396"; +let GOVERNOR_PROXY = "0x2d56dC077072B53571b8252008C60e945108c75a"; +let NORMAL_TIMELOCK = "0x939bD8d64c0A9583A7Dcea9933f7b21697ab6396"; const NORMAL_TIMELOCK_DELAY = 172800; const VOTING_PERIOD = 28800; +if (process.env.FORK_TESTNET === "true") { + DEFAULT_PROPOSER_ADDRESS = "0x2Ce1d0ffD7E869D9DF33e28552b12DdDed326706"; + GOVERNOR_PROXY = "0x5573422a1a59385c247ec3a66b93b7c08ec2f8f2"; + NORMAL_TIMELOCK = "0xce10739590001705F7FF231611ba4A48B2820327"; +} + export const forking = (blockNumber: number, fn: () => void) => { describe(`At block #${blockNumber}`, () => { before(async () => { @@ -84,6 +90,7 @@ export const testVip = (description: string, proposal: Proposal, options: Testin let proposalId: number; it("can be proposed", async () => { + await mine(150); const { targets, signatures, values, meta } = proposal; const proposalIdBefore = await governorProxy.callStatic.proposalCount(); let tx; @@ -102,7 +109,7 @@ export const testVip = (description: string, proposal: Proposal, options: Testin }); it("should be voteable", async () => { - await mine(); + await mine(150); await expect(governorProxy.connect(proposer).castVote(proposalId, 1)).to.emit(governorProxy, "VoteCast"); await expect(governorProxy.connect(supporter).castVote(proposalId, 1)).to.emit(governorProxy, "VoteCast"); }); diff --git a/script/hardhat/fork/vip-framework/utils.ts b/script/hardhat/fork/vip-framework/utils.ts index 99eb05f50..ce41e8541 100644 --- a/script/hardhat/fork/vip-framework/utils.ts +++ b/script/hardhat/fork/vip-framework/utils.ts @@ -24,8 +24,6 @@ export async function setForkBlock(blockNumber: number) { export function getCalldatas({ signatures, params }: { signatures: string[]; params: any[][] }) { return params.map((args: any[], i: number) => { let types = getArgs(signatures[i]); - // Fix for the diamond VIP as there is struct in types and defaultAbiCoder - // is unable to process struct. if (signatures[i] == "diamondCut((address,uint8,bytes4[])[],address,bytes)") { types = ["tuple(address, uint8, bytes4[])[]", "address", "bytes"]; } @@ -36,7 +34,7 @@ export function getCalldatas({ signatures, params }: { signatures: string[]; par const getArgs = (func: string) => { if (func === "") return []; // First match everything inside the function argument parens. - const match = func.match(/.*?\(([^]*)\)/); + const match = func.match(/.*?\(([^)]*)\)/); const args = match ? match[1] : ""; // Split the arguments string into an array comma delimited. return args From 7bbbe9bf61c48b8411c11db26fbbe48a768837f6 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Wed, 19 Apr 2023 19:43:26 +0530 Subject: [PATCH 070/153] test:added diamond vip for testnet and mainnet --- script/deploy/comptroller/cut-params.json | 115 +++++ .../fork/vip-diamond-comptroller-mainnet.ts | 363 ++++++++++++++ .../fork/vip-diamond-comptroller-testnet.ts | 460 ++++++++++++++++++ 3 files changed, 938 insertions(+) create mode 100644 script/deploy/comptroller/cut-params.json create mode 100644 script/hardhat/fork/vip-diamond-comptroller-mainnet.ts create mode 100644 script/hardhat/fork/vip-diamond-comptroller-testnet.ts diff --git a/script/deploy/comptroller/cut-params.json b/script/deploy/comptroller/cut-params.json new file mode 100644 index 000000000..ea0aa2ff7 --- /dev/null +++ b/script/deploy/comptroller/cut-params.json @@ -0,0 +1,115 @@ +{ + "cutParams": [ + ["0xaEf95dd426ea05CD96A7F3af4f290842f883d0A2", 0, ["0xcdffacc6", "0x52ef6b2c", "0xadfca15e", "0x7a0ed627"]], + [ + "0x38e9cb9215c9d6E4F8761914C1213C12394Cbd9f", + 0, + [ + "0xa76b3fda", + "0x52d84d1e", + "0x21af4569", + "0x4a584432", + "0x929fe9a1", + "0xe8755446", + "0xd3270f99", + "0xc2998238", + "0xede4edd0", + "0xabfceffc", + "0x007e3dd2", + "0xc488847b", + "0x4ada90af", + "0x9bb27d62", + "0x8e8f294b", + "0x94b2294b", + "0x0db4b4e5", + "0x4088c73e", + "0x2bc7e29e", + "0x7dc0d1d0", + "0x24a3d622", + "0x425fad58", + "0x719f701b", + "0x76551383", + "0x02c3bcbb", + "0xc5f956af", + "0xb2eafc39", + "0x04ef9d58", + "0x9254f5e5", + "0xbec04f72", + "0x7d172bd5", + "0x8a7dc165", + "0xbbb8864a", + "0xe37d4b79", + "0x08e0225c", + "0x879c2e1d", + "0x1abcaa77", + "0x41a18d2c", + "0x5dd3fc9d", + "0xb8324c7c", + "0xfa6331d8" + ] + ], + [ + "0x9008De0F2172710c3c80BfAAB7A9A7e69C8e8353", + 0, + [ + "0xead1a8a0", + "0xda3d454c", + "0x5c778605", + "0x5ec88c79", + "0x5fc7e71e", + "0x47ef3b3b", + "0x4ef4c3e1", + "0x41c728b9", + "0xeabe7d91", + "0x51dff989", + "0x24008a62", + "0x1ededc91", + "0xd02f7351", + "0x6d35bf91", + "0xbdcdc258", + "0x6a56947e" + ] + ], + [ + "0xA2Da6C4891474822EF28F1a7B7D10Ff629D9f322", + 0, + [ + "0xa7604b41", + "0xe85a2960", + "0x70bf66f0", + "0x86df31ee", + "0xadcd5fb9", + "0xd09c54ba", + "0x7858524d", + "0x42cbb15c", + "0xbf32442d", + "0xededbae6", + "0xddfd287e" + ] + ], + [ + "0xd1ce1369964c33080826A3d9F98C3549E6Aa425e", + 0, + [ + "0xf519fc30", + "0x2b5d790c", + "0x317b0b77", + "0xe4028eee", + "0x9bf34cbb", + "0x4fd42e17", + "0xbb857450", + "0x607ef6c1", + "0x51a485e4", + "0x5f5af1aa", + "0x55ee1fe1", + "0x2a6a6065", + "0xd24febad", + "0x9cfdd9e6", + "0x2ec04124", + "0x4e0853db", + "0x6662c7c9", + "0xfd51a3ad" + ] + ] + ] +} diff --git a/script/hardhat/fork/vip-diamond-comptroller-mainnet.ts b/script/hardhat/fork/vip-diamond-comptroller-mainnet.ts new file mode 100644 index 000000000..aa9e1ed88 --- /dev/null +++ b/script/hardhat/fork/vip-diamond-comptroller-mainnet.ts @@ -0,0 +1,363 @@ +import { impersonateAccount } from "@nomicfoundation/hardhat-network-helpers"; +import { expect } from "chai"; +import { parseUnits } from "ethers/lib/utils"; +import { ethers } from "hardhat"; + +import { VBep20 } from "../../../typechain"; +import { cutParams as params } from "../../deploy/comptroller/cut-params.json"; +import { forking, pretendExecutingVip, testVip } from "./vip-framework"; +import { ProposalType } from "./vip-framework/types"; +import { makeProposal } from "./vip-framework/utils"; + +const UNITROLLER = "0xfD36E2c2a6789Db23113685031d7F16329158384"; + +const DIAMOND_CUT_FACET = ""; +const DIAMOND = ""; +const DIAMOND_INIT = ""; +const cutParams = params; + +export const vipDiamond = () => { + const meta = { + version: "v1", + title: "VIP-105 Comptroller Diamond proxy", + description: ``, + forDescription: + "I agree that Venus Protocol should proceed with the upgrading the Comptroller contract with diamond proxy", + againstDescription: "I do not think that Venus Protocol should proceed with the Comptroller contract upgradation", + abstainDescription: "I am indifferent to whether Venus Protocol proceeds with the Comptroller upgradation or not", + }; + + const initFunctionEncode = "0xe1c7392a"; + + return makeProposal( + [ + { + target: UNITROLLER, + signature: "_setPendingImplementation(address)", + params: [DIAMOND], + }, + { + target: DIAMOND, + signature: "_become()", + params: [], + }, + { + target: UNITROLLER, + signature: "facetCutInitilizer(address)", + params: [DIAMOND_CUT_FACET], + }, + { + target: UNITROLLER, + signature: "diamondCut((address,uint8,bytes4[])[],address,bytes)", + params: [cutParams, DIAMOND_INIT, initFunctionEncode], + }, + ], + meta, + ProposalType.REGULAR, + ); +}; + +forking(29043847, async () => { + testVip("VIP-Diamond TRON Contract Migration", vipDiamond()); +}); + +let owner, + unitroller, + // layout variables + oracle, + maxAssets, + closeFactorMantissa, + liquidationIncentiveMantissa, + allMarkets, + venusRate, + venusSpeeds, + venusSupplyState, + venusBorrowState, + venusAccrued, + vaiMintRate, + vaiController, + mintedVAIs, + mintVAIGuardianPaused, + repayVAIGuardianPaused, + protocolPaused, + venusVAIVaultRate, + vaiVaultAddress, + releaseStartBlock, + minReleaseAmount, + treasuryGuardian, + treasuryAddress, + treasuryPercent, + liquidatorContract, + comptrollerLens, + market, + venusSupplierIndex, + venusBorrowerIndex, + venusBorrowSpeeds, + venusSupplySpeeds; + +const Owner = "0x939bd8d64c0a9583a7dcea9933f7b21697ab6396"; +const zeroAddr = "0x0000000000000000000000000000000000000000"; +const VBUSD = "0x95c78222B3D6e262426483D42CfA53685A67Ab9D"; +const VUSDT = "0xfD5840Cd36d94D7229439859C0112a4185BC0255"; + +const initMainnetUser = async (user: string) => { + await impersonateAccount(user); + return ethers.getSigner(user); +}; + +forking(29043847, async () => { + let USDT: ethers.contract; + let BUSD: ethers.contract; + let usdtHolder: ethers.Signer; + let busdHolder: ethers.Signer; + let vBUSD: ethers.contract; + let vUSDT: ethers.contract; + let diamondUnitroller; + + if (process.env.FORK_MAINNET === "true") { + before(async () => { + /** + * sending gas cost to owner + * */ + // await pretendExecutingVip(vipDiamond()); + + await impersonateAccount(Owner); + owner = await ethers.getSigner(Owner); + const [signer] = await ethers.getSigners(); + await signer.sendTransaction({ + to: owner.address, + value: ethers.BigNumber.from("10000000000000000000"), + data: undefined, + }); + + // unitroller without diamond + unitroller = await ethers.getContractAt("Comptroller", UNITROLLER); + + diamondUnitroller = await ethers.getContractAt("Comptroller", unitroller.address); + + busdHolder = await initMainnetUser("0xf977814e90da44bfa03b6295a0616a897441acec"); + usdtHolder = await initMainnetUser("0xc444949e0054A23c44Fc45789738bdF64aed2391"); + + [vBUSD, vUSDT] = await Promise.all( + [VBUSD, VUSDT].map((address: string) => { + return ethers.getContractAt("contracts/Tokens/V0.8.13/VTokens/VBep20Delegate.sol:VBep20Delegate", address); + }), + ); + [BUSD, USDT] = await Promise.all( + [vBUSD, vUSDT].map(async (vToken: VBep20) => { + const underlying = await vToken.underlying(); + return ethers.getContractAt("IERC20Upgradeable", underlying); + }), + ); + }); + + describe("Verify Storage slots before vip execution ", async () => { + // These tests checks the storage collision of comptroller while updating it via diamond. + describe("Diamond deployed successfully", async () => { + it("Owner of Diamond unitroller contract should match", async () => { + const UnitrollerAdmin = await unitroller.admin(); + const pendingAdmin = await unitroller.pendingAdmin(); + expect(UnitrollerAdmin.toLowerCase()).to.equal(Owner.toLowerCase()); + expect(pendingAdmin.toLowerCase()).to.equal(zeroAddr); + }); + + it("Diamond Unitroller Implementation (comptroller) should match the diamond Proxy Address", async () => { + const comptrollerImplementation = await unitroller.comptrollerImplementation(); + const pendingComptrollerImplementation = await unitroller.pendingComptrollerImplementation(); + expect(comptrollerImplementation.toLowerCase()).to.equal( + "0xc934A1b15b30E9b515D8A87b5054432B9b965131".toLowerCase(), + ); + expect(pendingComptrollerImplementation.toLowerCase()).to.equal(zeroAddr); + }); + }); + + describe("Verify storage layout", async () => { + it("verify all the state before and after upgrade", async () => { + oracle = await unitroller.oracle(); + + maxAssets = await unitroller.maxAssets(); + + closeFactorMantissa = await unitroller.closeFactorMantissa(); + + liquidationIncentiveMantissa = await unitroller.liquidationIncentiveMantissa(); + + allMarkets = await unitroller.allMarkets(0); + + venusRate = await unitroller.venusRate(); + + venusSpeeds = await unitroller.venusSpeeds(BUSD.address); + + venusSupplyState = await unitroller.venusSupplyState(BUSD.address); + + venusBorrowState = await unitroller.venusBorrowState(BUSD.address); + + venusAccrued = await unitroller.venusAccrued(BUSD.address); + + vaiMintRate = await unitroller.vaiMintRate(); + + vaiController = await unitroller.vaiController(); + + mintedVAIs = await unitroller.mintedVAIs(busdHolder.address); + unitroller.minte; + + mintVAIGuardianPaused = await unitroller.mintVAIGuardianPaused(); + + repayVAIGuardianPaused = await unitroller.repayVAIGuardianPaused(); + + protocolPaused = await unitroller.protocolPaused(); + + venusVAIVaultRate = await unitroller.venusVAIVaultRate(); + + vaiVaultAddress = await unitroller.vaiVaultAddress(); + + releaseStartBlock = await unitroller.releaseStartBlock(); + + minReleaseAmount = await unitroller.minReleaseAmount(); + + treasuryGuardian = await unitroller.treasuryGuardian(); + + treasuryAddress = await unitroller.treasuryAddress(); + + treasuryPercent = await unitroller.treasuryPercent(); + + liquidatorContract = await unitroller.liquidatorContract(); + + comptrollerLens = await unitroller.comptrollerLens(); + + market = await unitroller.markets(vBUSD.address); + + venusBorrowerIndex = await unitroller.venusBorrowerIndex(vBUSD.address, busdHolder.address); + + venusSupplierIndex = await unitroller.venusSupplierIndex(vBUSD.address, busdHolder.address); + + venusBorrowSpeeds = await unitroller.venusBorrowSpeeds(vUSDT.address); + venusSupplySpeeds = await unitroller.venusSupplySpeeds(vUSDT.address); + }); + }); + }); + + testVip("VIP-Diamond TRON Contract Migration", vipDiamond()); + + describe("Verify Storage slots after vip execution ", async () => { + // These tests checks the storage collision of comptroller while updating it via diamond. + describe("Diamond deployed successfully", async () => { + it("Owner of Diamond unitroller contract should match", async () => { + const diamondUnitrollerAdmin = await diamondUnitroller.admin(); + const pendingAdmin = await diamondUnitroller.pendingAdmin(); + expect(diamondUnitrollerAdmin.toLowerCase()).to.equal(Owner.toLowerCase()); + expect(pendingAdmin.toLowerCase()).to.equal(zeroAddr); + }); + + it("Diamond Unitroller Implementation (comptroller) should match the diamond Proxy Address", async () => { + const comptrollerImplementation = await diamondUnitroller.comptrollerImplementation(); + const pendingComptrollerImplementation = await diamondUnitroller.pendingComptrollerImplementation(); + expect(comptrollerImplementation.toLowerCase()).to.equal(DIAMOND.toLowerCase()); + expect(pendingComptrollerImplementation.toLowerCase()).to.equal(zeroAddr); + }); + }); + + describe("Verify storage layout", async () => { + it("verify all the state before and after upgrade", async () => { + const oracelUpgrade = await diamondUnitroller.oracle(); + expect(oracle).to.equal(oracelUpgrade); + + const maxAssetsAfterUpgrade = await diamondUnitroller.maxAssets(); + expect(maxAssets).to.equal(maxAssetsAfterUpgrade); + + const closeFactorMantissaAfterUpgrade = await diamondUnitroller.closeFactorMantissa(); + expect(closeFactorMantissa).to.equal(closeFactorMantissaAfterUpgrade); + + const liquidationIncentiveMantissaAfterUpgrade = await diamondUnitroller.liquidationIncentiveMantissa(); + expect(liquidationIncentiveMantissa).to.equal(liquidationIncentiveMantissaAfterUpgrade); + + const allMarketsAfterUpgrade = await diamondUnitroller.allMarkets(0); + expect(allMarkets).to.equal(allMarketsAfterUpgrade); + + const venusRateAfterUpgrade = await diamondUnitroller.venusRate(); + expect(venusRate).to.equal(venusRateAfterUpgrade); + + const venusSpeedsAfterUpgrade = await diamondUnitroller.venusSpeeds(BUSD.address); + expect(venusSpeeds).to.equal(venusSpeedsAfterUpgrade); + + const venusSupplyStateAfterUpgrade = await diamondUnitroller.venusSupplyState(BUSD.address); + expect(venusSupplyState.index.toString()).to.equal(venusSupplyStateAfterUpgrade.index.toString()); + + const venusBorrowStateAfterUpgrade = await diamondUnitroller.venusBorrowState(BUSD.address); + expect(venusBorrowState.index.toString()).to.equal(venusBorrowStateAfterUpgrade.index.toString()); + + const venusAccruedAfterUpgrade = await diamondUnitroller.venusAccrued(BUSD.address); + expect(venusAccrued).to.equal(venusAccruedAfterUpgrade); + + const vaiMintRateAfterUpgrade = await diamondUnitroller.vaiMintRate(); + expect(vaiMintRate).to.equal(vaiMintRateAfterUpgrade); + + const vaiControllerUpgrade = await diamondUnitroller.vaiController(); + expect(vaiControllerUpgrade).to.equal(vaiController); + + const mintedVAIsUpgrade = await diamondUnitroller.mintedVAIs(busdHolder.address); + expect(mintedVAIsUpgrade).to.equal(mintedVAIs); + + const mintVAIGuardianPausedUpgrade = await diamondUnitroller.mintVAIGuardianPaused(); + expect(mintVAIGuardianPausedUpgrade).to.equal(mintVAIGuardianPaused); + + const repayVAIGuardianPausedUpgrade = await diamondUnitroller.repayVAIGuardianPaused(); + expect(repayVAIGuardianPausedUpgrade).to.equal(repayVAIGuardianPaused); + + const protocolPausedUpgrade = await diamondUnitroller.protocolPaused(); + expect(protocolPausedUpgrade).to.equal(protocolPaused); + + const venusVAIVaultRateUpgrade = await diamondUnitroller.venusVAIVaultRate(); + expect(venusVAIVaultRateUpgrade).to.equal(venusVAIVaultRate); + + const vaiVaultAddressUpgrade = await diamondUnitroller.vaiVaultAddress(); + expect(vaiVaultAddressUpgrade).to.equal(vaiVaultAddress); + + const releaseStartBlockUpgrade = await diamondUnitroller.releaseStartBlock(); + expect(releaseStartBlockUpgrade).to.equal(releaseStartBlock); + + const minReleaseAmountUpgrade = await diamondUnitroller.minReleaseAmount(); + expect(minReleaseAmountUpgrade).to.equal(minReleaseAmount); + + const treasuryGuardianUpgrade = await diamondUnitroller.treasuryGuardian(); + expect(treasuryGuardian).to.equal(treasuryGuardianUpgrade); + + const treasuryAddressUpgrade = await diamondUnitroller.treasuryAddress(); + expect(treasuryAddress).to.equal(treasuryAddressUpgrade); + + const treasuryPercentUpgrade = await diamondUnitroller.treasuryPercent(); + expect(treasuryPercent).to.equal(treasuryPercentUpgrade); + + const liquidatorContractUpgrade = await diamondUnitroller.liquidatorContract(); + expect(liquidatorContract).to.equal(liquidatorContractUpgrade); + + const comptrollerLensUpgrade = await diamondUnitroller.comptrollerLens(); + expect(comptrollerLens).to.equal(comptrollerLensUpgrade); + + // cheking all public mappings + const marketUpgrade = await diamondUnitroller.markets(vBUSD.address); + expect(market.collateralFactorMantissa).to.equal(marketUpgrade.collateralFactorMantissa); + expect(market.isListed).to.equal(marketUpgrade.isListed); + expect(market.isVenus).to.equal(marketUpgrade.isVenus); + + const venusBorrowerIndexUpgrade = await diamondUnitroller.venusBorrowerIndex( + vBUSD.address, + busdHolder.address, + ); + expect(venusBorrowerIndex).to.equal(venusBorrowerIndexUpgrade); + + const venusSupplierIndexUpgrade = await diamondUnitroller.venusSupplierIndex( + vBUSD.address, + busdHolder.address, + ); + expect(venusSupplierIndex).to.equal(venusSupplierIndexUpgrade); + + const venusBorrowSpeedsUpgrade = await diamondUnitroller.venusBorrowSpeeds(vUSDT.address); + const venusSupplySpeedsUpgrade = await diamondUnitroller.venusSupplySpeeds(vUSDT.address); + + expect(venusBorrowSpeeds).to.equal(venusBorrowSpeedsUpgrade); + expect(venusSupplySpeeds).to.equal(venusSupplySpeedsUpgrade); + }); + }); + }); + } +}); diff --git a/script/hardhat/fork/vip-diamond-comptroller-testnet.ts b/script/hardhat/fork/vip-diamond-comptroller-testnet.ts new file mode 100644 index 000000000..651ee12c2 --- /dev/null +++ b/script/hardhat/fork/vip-diamond-comptroller-testnet.ts @@ -0,0 +1,460 @@ +import { impersonateAccount } from "@nomicfoundation/hardhat-network-helpers"; +import { expect } from "chai"; +import { parseUnits } from "ethers/lib/utils"; +import { ethers } from "hardhat"; + +import { VBep20 } from "../../../typechain"; +import { cutParams as params } from "../../deploy/comptroller/cut-params.json"; +import { forking, testVip } from "./vip-framework"; +import { ProposalType } from "./vip-framework/types"; +import { makeProposal } from "./vip-framework/utils"; + +const UNITROLLER = "0x94d1820b2D1c7c7452A163983Dc888CEC546b77D"; +const DIAMOND_CUT_FACET = "0x69Ca940186C29b6a9D64e1Be1C59fb7A466354E2"; +const DIAMOND = "0xF6A9DBc8453EB8b1528B6Cd3f08eC632134f831F"; +const DIAMOND_INIT = "0x6D7f7Ed4EbD3A1807d5fe8EE70c155bcAc8174Af"; +const cutParams = params; + +export const vipDiamond = () => { + const meta = { + version: "v1", + title: "VIP-105 Comptroller Diamond proxy", + description: ``, + forDescription: + "I agree that Venus Protocol should proceed with the upgrading the Comptroller contract with diamond proxy", + againstDescription: "I do not think that Venus Protocol should proceed with the Comptroller contract upgradation", + abstainDescription: "I am indifferent to whether Venus Protocol proceeds with the Comptroller upgradation or not", + }; + + const initFunctionEncode = "0xe1c7392a"; + + return makeProposal( + [ + { + target: UNITROLLER, + signature: "_setPendingImplementation(address)", + params: [DIAMOND], + }, + { + target: DIAMOND, + signature: "_become()", + params: [], + }, + { + target: UNITROLLER, + signature: "facetCutInitilizer(address)", + params: [DIAMOND_CUT_FACET], + }, + { + target: UNITROLLER, + signature: "diamondCut((address,uint8,bytes4[])[],address,bytes)", + params: [cutParams, DIAMOND_INIT, initFunctionEncode], + }, + ], + meta, + ProposalType.REGULAR, + ); +}; + +const Owner = "0xce10739590001705F7FF231611ba4A48B2820327"; +const zeroAddr = "0x0000000000000000000000000000000000000000"; +const VBUSD = "0x08e0A5575De71037aE36AbfAfb516595fE68e5e4"; +const VUSDT = "0xb7526572FFE56AB9D7489838Bf2E18e3323b441A"; + +const initMainnetUser = async (user: string) => { + await impersonateAccount(user); + return ethers.getSigner(user); +}; + +forking(29043847, async () => { + let owner, + unitroller, + // layout variables + oracle, + maxAssets, + closeFactorMantissa, + liquidationIncentiveMantissa, + allMarkets, + venusRate, + venusSpeeds, + venusSupplyState, + venusBorrowState, + venusAccrued, + vaiMintRate, + vaiController, + mintedVAIs, + mintVAIGuardianPaused, + repayVAIGuardianPaused, + protocolPaused, + venusVAIVaultRate, + vaiVaultAddress, + releaseStartBlock, + minReleaseAmount, + treasuryGuardian, + treasuryAddress, + treasuryPercent, + liquidatorContract, + comptrollerLens, + market, + venusSupplierIndex, + venusBorrowerIndex, + venusBorrowSpeeds, + venusSupplySpeeds; + + let USDT: ethers.contract; + let BUSD: ethers.contract; + let usdtHolder: ethers.Signer; + let busdHolder: ethers.Signer; + let vBUSD: ethers.contract; + let vUSDT: ethers.contract; + let diamondUnitroller; + + before(async () => { + unitroller = await ethers.getContractAt("Comptroller", UNITROLLER); + + diamondUnitroller = await ethers.getContractAt("Comptroller", unitroller.address); + + await impersonateAccount(Owner); + owner = await ethers.getSigner(Owner); + const [signer] = await ethers.getSigners(); + await signer.sendTransaction({ + to: owner.address, + value: ethers.BigNumber.from("10000000000000000000"), + data: undefined, + }); + + busdHolder = await initMainnetUser("0xC825AD791A6046991e3706b6342970f6d87e4888"); + + usdtHolder = await initMainnetUser("0xa0747a72C329377C2CE4F0F3165197B3a5359EfE"); + + [vBUSD, vUSDT] = await Promise.all( + [VBUSD, VUSDT].map((address: string) => { + return ethers.getContractAt("contracts/Tokens/V0.8.13/VTokens/VBep20Delegate.sol:VBep20Delegate", address); + }), + ); + + [BUSD, USDT] = await Promise.all( + [vBUSD, vUSDT].map(async (vToken: VBep20) => { + const underlying = await vToken.underlying(); + return ethers.getContractAt("IERC20Upgradeable", underlying); + }), + ); + }); + + describe("Verify Storage slots before vip execution", async () => { + // These tests checks the storage collision of comptroller while updating it via diamond. + describe("Diamond deployed successfully before vip execution", async () => { + it("Owner of Diamond unitroller contract should match", async () => { + const UnitrollerAdmin = await unitroller.admin(); + const pendingAdmin = await unitroller.pendingAdmin(); + expect(UnitrollerAdmin.toLowerCase()).to.equal(Owner.toLowerCase()); + expect(pendingAdmin.toLowerCase()).to.equal(zeroAddr); + }); + + it("Diamond Unitroller Implementation (comptroller) should match the diamond Proxy Address", async () => { + const comptrollerImplementation = await unitroller.comptrollerImplementation(); + const pendingComptrollerImplementation = await unitroller.pendingComptrollerImplementation(); + expect(comptrollerImplementation.toLowerCase()).to.equal( + "0xc934A1b15b30E9b515D8A87b5054432B9b965131".toLowerCase(), + ); + expect(pendingComptrollerImplementation.toLowerCase()).to.equal(zeroAddr); + }); + }); + + describe("Verify storage layout before vip execution", async () => { + it("verify all the state before and after upgrade", async () => { + oracle = await unitroller.oracle(); + + maxAssets = await unitroller.maxAssets(); + + closeFactorMantissa = await unitroller.closeFactorMantissa(); + + liquidationIncentiveMantissa = await unitroller.liquidationIncentiveMantissa(); + + allMarkets = await unitroller.allMarkets(0); + + venusRate = await unitroller.venusRate(); + + venusSpeeds = await unitroller.venusSpeeds(BUSD.address); + + venusSupplyState = await unitroller.venusSupplyState(BUSD.address); + + venusBorrowState = await unitroller.venusBorrowState(BUSD.address); + + venusAccrued = await unitroller.venusAccrued(BUSD.address); + + vaiMintRate = await unitroller.vaiMintRate(); + + vaiController = await unitroller.vaiController(); + + mintedVAIs = await unitroller.mintedVAIs(busdHolder.address); + unitroller.minte; + + mintVAIGuardianPaused = await unitroller.mintVAIGuardianPaused(); + + repayVAIGuardianPaused = await unitroller.repayVAIGuardianPaused(); + + protocolPaused = await unitroller.protocolPaused(); + + venusVAIVaultRate = await unitroller.venusVAIVaultRate(); + + vaiVaultAddress = await unitroller.vaiVaultAddress(); + + releaseStartBlock = await unitroller.releaseStartBlock(); + + minReleaseAmount = await unitroller.minReleaseAmount(); + + treasuryGuardian = await unitroller.treasuryGuardian(); + + treasuryAddress = await unitroller.treasuryAddress(); + + treasuryPercent = await unitroller.treasuryPercent(); + + liquidatorContract = await unitroller.liquidatorContract(); + + comptrollerLens = await unitroller.comptrollerLens(); + + // cheking all public mappings + market = await unitroller.markets(vBUSD.address); + + venusBorrowerIndex = await unitroller.venusBorrowerIndex(vBUSD.address, busdHolder.address); + + venusSupplierIndex = await unitroller.venusSupplierIndex(vBUSD.address, busdHolder.address); + + venusBorrowSpeeds = await unitroller.venusBorrowSpeeds(vUSDT.address); + venusSupplySpeeds = await unitroller.venusSupplySpeeds(vUSDT.address); + }); + }); + }); + + testVip("VIP-Diamond TRON Contract Migration", vipDiamond()); + + describe("Verify Storage slots after VIP execution", async () => { + // These tests checks the storage collision of comptroller while updating it via diamond. + describe("Diamond deployed successfully after VIP execution", async () => { + it("Owner of Diamond unitroller contract should match", async () => { + const diamondUnitrollerAdmin = await diamondUnitroller.admin(); + const pendingAdmin = await diamondUnitroller.pendingAdmin(); + expect(diamondUnitrollerAdmin.toLowerCase()).to.equal(Owner.toLowerCase()); + expect(pendingAdmin.toLowerCase()).to.equal(zeroAddr); + }); + + it("Diamond Unitroller Implementation (comptroller) should match the diamond Proxy Address", async () => { + const comptrollerImplementation = await diamondUnitroller.comptrollerImplementation(); + const pendingComptrollerImplementation = await diamondUnitroller.pendingComptrollerImplementation(); + expect(comptrollerImplementation.toLowerCase()).to.equal(DIAMOND.toLowerCase()); + expect(pendingComptrollerImplementation.toLowerCase()).to.equal(zeroAddr); + }); + }); + + describe("Verify storage layout after VIP execution", async () => { + it("verify all the state before and after upgrade", async () => { + const oracelUpgrade = await diamondUnitroller.oracle(); + expect(oracle).to.equal(oracelUpgrade); + + const maxAssetsAfterUpgrade = await diamondUnitroller.maxAssets(); + expect(maxAssets).to.equal(maxAssetsAfterUpgrade); + + const closeFactorMantissaAfterUpgrade = await diamondUnitroller.closeFactorMantissa(); + expect(closeFactorMantissa).to.equal(closeFactorMantissaAfterUpgrade); + + const liquidationIncentiveMantissaAfterUpgrade = await diamondUnitroller.liquidationIncentiveMantissa(); + expect(liquidationIncentiveMantissa).to.equal(liquidationIncentiveMantissaAfterUpgrade); + + const allMarketsAfterUpgrade = await diamondUnitroller.allMarkets(0); + expect(allMarkets).to.equal(allMarketsAfterUpgrade); + + const venusRateAfterUpgrade = await diamondUnitroller.venusRate(); + expect(venusRate).to.equal(venusRateAfterUpgrade); + + const venusSpeedsAfterUpgrade = await diamondUnitroller.venusSpeeds(BUSD.address); + expect(venusSpeeds).to.equal(venusSpeedsAfterUpgrade); + + const venusSupplyStateAfterUpgrade = await diamondUnitroller.venusSupplyState(BUSD.address); + expect(venusSupplyState.index.toString()).to.equal(venusSupplyStateAfterUpgrade.index.toString()); + + const venusBorrowStateAfterUpgrade = await diamondUnitroller.venusBorrowState(BUSD.address); + expect(venusBorrowState.index.toString()).to.equal(venusBorrowStateAfterUpgrade.index.toString()); + + const venusAccruedAfterUpgrade = await diamondUnitroller.venusAccrued(BUSD.address); + expect(venusAccrued).to.equal(venusAccruedAfterUpgrade); + + const vaiMintRateAfterUpgrade = await diamondUnitroller.vaiMintRate(); + expect(vaiMintRate).to.equal(vaiMintRateAfterUpgrade); + + const vaiControllerUpgrade = await diamondUnitroller.vaiController(); + expect(vaiControllerUpgrade).to.equal(vaiController); + + const mintedVAIsUpgrade = await diamondUnitroller.mintedVAIs(busdHolder.address); + expect(mintedVAIsUpgrade).to.equal(mintedVAIs); + + const mintVAIGuardianPausedUpgrade = await diamondUnitroller.mintVAIGuardianPaused(); + expect(mintVAIGuardianPausedUpgrade).to.equal(mintVAIGuardianPaused); + + const repayVAIGuardianPausedUpgrade = await diamondUnitroller.repayVAIGuardianPaused(); + expect(repayVAIGuardianPausedUpgrade).to.equal(repayVAIGuardianPaused); + + const protocolPausedUpgrade = await diamondUnitroller.protocolPaused(); + expect(protocolPausedUpgrade).to.equal(protocolPaused); + + const venusVAIVaultRateUpgrade = await diamondUnitroller.venusVAIVaultRate(); + expect(venusVAIVaultRateUpgrade).to.equal(venusVAIVaultRate); + + const vaiVaultAddressUpgrade = await diamondUnitroller.vaiVaultAddress(); + expect(vaiVaultAddressUpgrade).to.equal(vaiVaultAddress); + + const releaseStartBlockUpgrade = await diamondUnitroller.releaseStartBlock(); + expect(releaseStartBlockUpgrade).to.equal(releaseStartBlock); + + const minReleaseAmountUpgrade = await diamondUnitroller.minReleaseAmount(); + expect(minReleaseAmountUpgrade).to.equal(minReleaseAmount); + + const treasuryGuardianUpgrade = await diamondUnitroller.treasuryGuardian(); + expect(treasuryGuardian).to.equal(treasuryGuardianUpgrade); + + const treasuryAddressUpgrade = await diamondUnitroller.treasuryAddress(); + expect(treasuryAddress).to.equal(treasuryAddressUpgrade); + + const treasuryPercentUpgrade = await diamondUnitroller.treasuryPercent(); + expect(treasuryPercent).to.equal(treasuryPercentUpgrade); + + const liquidatorContractUpgrade = await diamondUnitroller.liquidatorContract(); + expect(liquidatorContract).to.equal(liquidatorContractUpgrade); + + const comptrollerLensUpgrade = await diamondUnitroller.comptrollerLens(); + expect(comptrollerLens).to.equal(comptrollerLensUpgrade); + + // cheking all public mappings + const marketUpgrade = await diamondUnitroller.markets(vBUSD.address); + expect(market.collateralFactorMantissa).to.equal(marketUpgrade.collateralFactorMantissa); + expect(market.isListed).to.equal(marketUpgrade.isListed); + expect(market.isVenus).to.equal(marketUpgrade.isVenus); + + const venusBorrowerIndexUpgrade = await diamondUnitroller.venusBorrowerIndex(vBUSD.address, busdHolder.address); + expect(venusBorrowerIndex).to.equal(venusBorrowerIndexUpgrade); + + const venusSupplierIndexUpgrade = await diamondUnitroller.venusSupplierIndex(vBUSD.address, busdHolder.address); + expect(venusSupplierIndex).to.equal(venusSupplierIndexUpgrade); + + const venusBorrowSpeedsUpgrade = await diamondUnitroller.venusBorrowSpeeds(vUSDT.address); + const venusSupplySpeedsUpgrade = await diamondUnitroller.venusSupplySpeeds(vUSDT.address); + + expect(venusBorrowSpeeds).to.equal(venusBorrowSpeedsUpgrade); + expect(venusSupplySpeeds).to.equal(venusSupplySpeedsUpgrade); + }); + }); + }); + + describe("Verify states of diamond Contract", () => { + describe("Diamond setters", () => { + it("setting market supply cap", async () => { + const currentSupplyCap = (await diamondUnitroller.supplyCaps(vBUSD.address)).toString(); + await diamondUnitroller.connect(owner)._setMarketSupplyCaps([vBUSD.address], [parseUnits("100000", 18)]); + expect(await diamondUnitroller.supplyCaps(vBUSD.address)).to.equals(parseUnits("100000", 18)); + await diamondUnitroller.connect(owner)._setMarketSupplyCaps([vBUSD.address], [parseUnits(currentSupplyCap, 0)]); + expect(await diamondUnitroller.supplyCaps(vBUSD.address)).to.equals(parseUnits(currentSupplyCap, 0)); + }); + + it("setting close factor", async () => { + const currentCloseFactor = (await diamondUnitroller.closeFactorMantissa()).toString(); + await diamondUnitroller.connect(owner)._setCloseFactor(parseUnits("10000", 18)); + expect(await diamondUnitroller.closeFactorMantissa()).to.equals(parseUnits("10000", 18)); + await diamondUnitroller.connect(owner)._setCloseFactor(parseUnits(currentCloseFactor, 0)); + expect(await diamondUnitroller.closeFactorMantissa()).to.equals(parseUnits(currentCloseFactor, 0)); + }); + + it("setting setting Liquidation Incentive", async () => { + await diamondUnitroller.connect(owner)._setLiquidationIncentive(parseUnits("13", 17)); + expect(await diamondUnitroller.liquidationIncentiveMantissa()).to.equal(parseUnits("13", 17)); + + await diamondUnitroller.connect(owner)._setLiquidationIncentive(parseUnits("11", 17)); + expect(await diamondUnitroller.liquidationIncentiveMantissa()).to.equal(parseUnits("11", 17)); + }); + + it("setting Pause Guardian", async () => { + const currentPauseGuardia = (await diamondUnitroller.pauseGuardian()).toString(); + + await diamondUnitroller.connect(owner)._setPauseGuardian(owner.address); + expect(await diamondUnitroller.pauseGuardian()).to.equal(owner.address); + + await diamondUnitroller.connect(owner)._setPauseGuardian(currentPauseGuardia); + expect(await diamondUnitroller.pauseGuardian()).to.equal(currentPauseGuardia); + }); + + it("setting market borrow cap", async () => { + const currentBorrowCap = (await diamondUnitroller.borrowCaps(vUSDT.address)).toString(); + await diamondUnitroller.connect(owner)._setMarketBorrowCaps([vUSDT.address], [parseUnits("10000", 18)]); + expect(await diamondUnitroller.borrowCaps(vUSDT.address)).to.equal(parseUnits("10000", 18)); + + await diamondUnitroller.connect(owner)._setMarketBorrowCaps([vUSDT.address], [currentBorrowCap]); + expect(await diamondUnitroller.borrowCaps(vUSDT.address)).to.equal(currentBorrowCap); + }); + + it("pausing mint action in vUSDT", async () => { + expect(await diamondUnitroller.connect(owner)._setActionsPaused([vBUSD.address], [0], true)).to.emit( + vBUSD, + "ActionPausedMarket", + ); + await BUSD.connect(busdHolder).approve(vBUSD.address, 1200); + await expect(vBUSD.connect(usdtHolder).mint(1000)).to.be.revertedWith("action is paused"); + + expect(await diamondUnitroller.connect(owner)._setActionsPaused([vBUSD.address], [0], false)).to.emit( + vBUSD, + "ActionPausedMarket", + ); + expect(await vBUSD.connect(busdHolder).mint(10)).to.be.emit(vBUSD, "Mint"); + }); + }); + }); + + describe("Diamond Hooks", () => { + it("Diamond Unitroller Implementation (comptroller) should match the diamond Proxy Address", async () => { + const comptrollerImplementation = await diamondUnitroller.comptrollerImplementation(); + const pendingComptrollerImplementation = await diamondUnitroller.pendingComptrollerImplementation(); + expect(comptrollerImplementation.toLowerCase()).to.equal(DIAMOND.toLowerCase()); + expect(pendingComptrollerImplementation.toLowerCase()).to.equal(zeroAddr); + }); + it("mint vToken vBUSD", async () => { + const vBUSDBalance = await BUSD.balanceOf(vBUSD.address); + const busdHolerBalance = await BUSD.balanceOf(busdHolder.address); + + await BUSD.connect(busdHolder).approve(vBUSD.address, parseUnits("1100", 18)); + expect(await vBUSD.connect(busdHolder).mint(parseUnits("1000", 18))).to.emit(vBUSD, "Mint"); + + const newvBUSDBalance = await BUSD.balanceOf(vBUSD.address); + const newBusdHolerBalance = await BUSD.balanceOf(busdHolder.address); + + expect(newvBUSDBalance).greaterThan(vBUSDBalance); + expect(newBusdHolerBalance).lessThan(busdHolerBalance); + }); + + it("redeem vToken", async () => { + const vBUSDUserBal = await vBUSD.connect(busdHolder).balanceOf(busdHolder.address); + + expect(await vBUSD.connect(busdHolder).redeem(parseUnits("500", 18))).to.emit(vBUSD, "Redeem"); + + const newBUSDUserBal = await vBUSD.connect(busdHolder).balanceOf(busdHolder.address); + expect(newBUSDUserBal).to.equal(vBUSDUserBal.sub(1000)); + }); + + it("borrow vToken", async () => { + const busdUserBal = await BUSD.balanceOf(busdHolder.address); + expect(await vBUSD.connect(busdHolder).borrow(parseUnits("1000", 18))).to.emit(vBUSD, "Borrow"); + + expect((await BUSD.balanceOf(busdHolder.address)).toString()).to.equal(busdUserBal.add(parseUnits("1000", 18))); + }); + + it("Repay vToken", async () => { + const busdUserBal = await BUSD.balanceOf(busdHolder.address); + + expect(await vBUSD.connect(busdHolder).borrow(parseUnits("1", 18))).to.emit(vBUSD, "Borrow"); + + expect((await BUSD.balanceOf(busdHolder.address)).toString()).to.equal(busdUserBal.add(parseUnits("1000", 18))); + + expect(await vBUSD.connect(busdHolder).repayBorrow(1000)).to.emit(vBUSD, "RepayBorrow"); + + const balanceAfterRepay = await BUSD.balanceOf(busdHolder.address); + expect(balanceAfterRepay).to.equal(busdUserBal); + }); + }); +}); From 8e211cd2c74861e051118251af807ebde0212574 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Thu, 20 Apr 2023 14:13:44 +0530 Subject: [PATCH 071/153] fix:added dimaond hooks tests separately --- .../fork/vip-diamond-comptroller-testnet.ts | 61 +++++++++++++++++-- 1 file changed, 55 insertions(+), 6 deletions(-) diff --git a/script/hardhat/fork/vip-diamond-comptroller-testnet.ts b/script/hardhat/fork/vip-diamond-comptroller-testnet.ts index 651ee12c2..f9e442abb 100644 --- a/script/hardhat/fork/vip-diamond-comptroller-testnet.ts +++ b/script/hardhat/fork/vip-diamond-comptroller-testnet.ts @@ -5,7 +5,7 @@ import { ethers } from "hardhat"; import { VBep20 } from "../../../typechain"; import { cutParams as params } from "../../deploy/comptroller/cut-params.json"; -import { forking, testVip } from "./vip-framework"; +import { forking, pretendExecutingVip, testVip } from "./vip-framework"; import { ProposalType } from "./vip-framework/types"; import { makeProposal } from "./vip-framework/utils"; @@ -406,6 +406,50 @@ forking(29043847, async () => { }); }); }); +}); + +forking(29043847, async () => { + let owner, unitroller; + let USDT: ethers.contract; + let BUSD: ethers.contract; + let usdtHolder: ethers.Signer; + let busdHolder: ethers.Signer; + let vBUSD: ethers.contract; + let vUSDT: ethers.contract; + let diamondUnitroller; + + before(async () => { + pretendExecutingVip(vipDiamond()); + unitroller = await ethers.getContractAt("Comptroller", UNITROLLER); + + diamondUnitroller = await ethers.getContractAt("Comptroller", unitroller.address); + + await impersonateAccount(Owner); + owner = await ethers.getSigner(Owner); + const [signer] = await ethers.getSigners(); + await signer.sendTransaction({ + to: owner.address, + value: ethers.BigNumber.from("10000000000000000000"), + data: undefined, + }); + + busdHolder = await initMainnetUser("0xC825AD791A6046991e3706b6342970f6d87e4888"); + + usdtHolder = await initMainnetUser("0xa0747a72C329377C2CE4F0F3165197B3a5359EfE"); + + [vBUSD, vUSDT] = await Promise.all( + [VBUSD, VUSDT].map((address: string) => { + return ethers.getContractAt("contracts/Tokens/V0.8.13/VTokens/VBep20Delegate.sol:VBep20Delegate", address); + }), + ); + + [BUSD, USDT] = await Promise.all( + [vBUSD, vUSDT].map(async (vToken: VBep20) => { + const underlying = await vToken.underlying(); + return ethers.getContractAt("IERC20Upgradeable", underlying); + }), + ); + }); describe("Diamond Hooks", () => { it("Diamond Unitroller Implementation (comptroller) should match the diamond Proxy Address", async () => { @@ -430,26 +474,31 @@ forking(29043847, async () => { it("redeem vToken", async () => { const vBUSDUserBal = await vBUSD.connect(busdHolder).balanceOf(busdHolder.address); + const BUSDBal = await BUSD.connect(busdHolder).balanceOf(busdHolder.address); - expect(await vBUSD.connect(busdHolder).redeem(parseUnits("500", 18))).to.emit(vBUSD, "Redeem"); + expect(await vBUSD.connect(busdHolder).redeem(1000)).to.emit(vBUSD, "Redeem"); + const newBUSDBal = await BUSD.connect(busdHolder).balanceOf(busdHolder.address); const newBUSDUserBal = await vBUSD.connect(busdHolder).balanceOf(busdHolder.address); + expect(newBUSDUserBal).to.equal(vBUSDUserBal.sub(1000)); + expect(newBUSDBal).greaterThan(BUSDBal); }); it("borrow vToken", async () => { const busdUserBal = await BUSD.balanceOf(busdHolder.address); - expect(await vBUSD.connect(busdHolder).borrow(parseUnits("1000", 18))).to.emit(vBUSD, "Borrow"); - expect((await BUSD.balanceOf(busdHolder.address)).toString()).to.equal(busdUserBal.add(parseUnits("1000", 18))); + expect(await vBUSD.connect(busdHolder).borrow(1000)).to.emit(vBUSD, "Borrow"); + + expect((await BUSD.balanceOf(busdHolder.address)).toString()).to.equal(busdUserBal.add(1000)); }); it("Repay vToken", async () => { const busdUserBal = await BUSD.balanceOf(busdHolder.address); - expect(await vBUSD.connect(busdHolder).borrow(parseUnits("1", 18))).to.emit(vBUSD, "Borrow"); + expect(await vBUSD.connect(busdHolder).borrow(1000)).to.emit(vBUSD, "Borrow"); - expect((await BUSD.balanceOf(busdHolder.address)).toString()).to.equal(busdUserBal.add(parseUnits("1000", 18))); + expect((await BUSD.balanceOf(busdHolder.address)).toString()).to.equal(busdUserBal.add(1000)); expect(await vBUSD.connect(busdHolder).repayBorrow(1000)).to.emit(vBUSD, "RepayBorrow"); From a1e2f09aca55f45cf2c56c4f45db051b6ad4b010 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Fri, 21 Apr 2023 13:26:54 +0530 Subject: [PATCH 072/153] Refactor signature's args method. --- script/hardhat/fork/vip-framework/utils.ts | 39 +++++++++++----------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/script/hardhat/fork/vip-framework/utils.ts b/script/hardhat/fork/vip-framework/utils.ts index ce41e8541..a649ad4a4 100644 --- a/script/hardhat/fork/vip-framework/utils.ts +++ b/script/hardhat/fork/vip-framework/utils.ts @@ -3,6 +3,7 @@ import { impersonateAccount, setBalance } from "@nomicfoundation/hardhat-network import { NumberLike } from "@nomicfoundation/hardhat-network-helpers/dist/src/types"; import { expect } from "chai"; import { ContractInterface, TransactionResponse } from "ethers"; +import { ParamType } from "ethers/lib/utils"; import { ethers, network } from "hardhat"; import { Command, Proposal, ProposalMeta, ProposalType } from "./types"; @@ -23,30 +24,28 @@ export async function setForkBlock(blockNumber: number) { export function getCalldatas({ signatures, params }: { signatures: string[]; params: any[][] }) { return params.map((args: any[], i: number) => { - let types = getArgs(signatures[i]); - if (signatures[i] == "diamondCut((address,uint8,bytes4[])[],address,bytes)") { - types = ["tuple(address, uint8, bytes4[])[]", "address", "bytes"]; - } + const types = getArgs(signatures[i]); return defaultAbiCoder.encode(types, args); }); } -const getArgs = (func: string) => { - if (func === "") return []; - // First match everything inside the function argument parens. - const match = func.match(/.*?\(([^)]*)\)/); - const args = match ? match[1] : ""; - // Split the arguments string into an array comma delimited. - return args - .split(",") - .map(arg => { - // Ensure no inline comments are parsed and trim the whitespace. - return arg.replace(/\/\*.*\*\//, "").trim(); - }) - .filter(arg => { - // Ensure no undefined values are added. - return arg; - }); +const formatParamType = (paramType: ParamType): string => { + if (paramType.type === "tuple") { + return `tuple(${paramType.components.map(formatParamType).join(", ")})`; + } + + if (paramType.type === "tuple[]") { + return `tuple(${paramType.components.map(formatParamType).join(", ")})[]`; + } + + return paramType.type; +}; + +const getArgs = (signature: string) => { + if (signature === "") return []; + const fragment = ethers.utils.FunctionFragment.from(signature); + + return fragment.inputs.map(formatParamType); }; export const initMainnetUser = async (user: string, balance: NumberLike) => { From e8f27e1ecc2a8052c1110b925198f247d7dbaeec Mon Sep 17 00:00:00 2001 From: defcon022 Date: Wed, 3 May 2023 16:14:50 +0530 Subject: [PATCH 073/153] refactor: diamond proxy for comptroller. --- contracts/Comptroller/Diamond/Diamond.sol | 168 +++++++++ .../Diamond/facets/FacetHelper.sol} | 90 ++++- .../Diamond/facets/MarketFacet.sol | 183 ++++++++++ .../Diamond/facets/PolicyFacet.sol | 193 +++++----- .../Diamond/facets/RewardFacet.sol | 101 +++--- .../Diamond/facets/SetterFacet.sol | 209 ++++++----- .../Diamond/interfaces/IDiamondCut.sol | 10 +- .../Diamond/interfaces/IMarketFacet.sol | 21 ++ .../Diamond/interfaces/IPolicyFacet.sol | 12 +- .../Diamond/interfaces/IRewardFacet.sol | 46 +++ .../Diamond/interfaces/ISetterFacet.sol | 63 ++++ contracts/Diamond/Diamond.sol | 74 ---- contracts/Diamond/facets/DiamondCutFacet.sol | 23 -- .../Diamond/facets/DiamondLoupeFacet.sol | 57 --- contracts/Diamond/facets/MarketFacet.sol | 332 ------------------ .../Diamond/interfaces/IDiamondLoupe.sol | 30 -- contracts/Diamond/interfaces/IMarketFacet.sol | 7 - .../Diamond/libraries/LibAccessCheck.sol | 82 ----- contracts/Diamond/libraries/LibDiamond.sol | 222 ------------ .../libraries/LibExponentialNoError.sol | 195 ---------- contracts/Diamond/libraries/appStorage.sol | 173 --------- .../Diamond/upgradeInitialize/DiamondInit.sol | 63 ---- 22 files changed, 815 insertions(+), 1539 deletions(-) create mode 100644 contracts/Comptroller/Diamond/Diamond.sol rename contracts/{Diamond/libraries/LibHelper.sol => Comptroller/Diamond/facets/FacetHelper.sol} (55%) create mode 100644 contracts/Comptroller/Diamond/facets/MarketFacet.sol rename contracts/{ => Comptroller}/Diamond/facets/PolicyFacet.sol (76%) rename contracts/{ => Comptroller}/Diamond/facets/RewardFacet.sol (78%) rename contracts/{ => Comptroller}/Diamond/facets/SetterFacet.sol (67%) rename contracts/{ => Comptroller}/Diamond/interfaces/IDiamondCut.sol (51%) create mode 100644 contracts/Comptroller/Diamond/interfaces/IMarketFacet.sol rename contracts/{ => Comptroller}/Diamond/interfaces/IPolicyFacet.sol (86%) create mode 100644 contracts/Comptroller/Diamond/interfaces/IRewardFacet.sol create mode 100644 contracts/Comptroller/Diamond/interfaces/ISetterFacet.sol delete mode 100644 contracts/Diamond/Diamond.sol delete mode 100644 contracts/Diamond/facets/DiamondCutFacet.sol delete mode 100644 contracts/Diamond/facets/DiamondLoupeFacet.sol delete mode 100644 contracts/Diamond/facets/MarketFacet.sol delete mode 100644 contracts/Diamond/interfaces/IDiamondLoupe.sol delete mode 100644 contracts/Diamond/interfaces/IMarketFacet.sol delete mode 100644 contracts/Diamond/libraries/LibAccessCheck.sol delete mode 100644 contracts/Diamond/libraries/LibDiamond.sol delete mode 100644 contracts/Diamond/libraries/LibExponentialNoError.sol delete mode 100644 contracts/Diamond/libraries/appStorage.sol delete mode 100644 contracts/Diamond/upgradeInitialize/DiamondInit.sol diff --git a/contracts/Comptroller/Diamond/Diamond.sol b/contracts/Comptroller/Diamond/Diamond.sol new file mode 100644 index 000000000..0d76ee6ac --- /dev/null +++ b/contracts/Comptroller/Diamond/Diamond.sol @@ -0,0 +1,168 @@ +pragma solidity 0.5.16; +pragma experimental ABIEncoderV2; + +import { IDiamondCut } from "./interfaces/IDiamondCut.sol"; +import "../ComptrollerStorage.sol"; +import "../Unitroller.sol"; + +import "hardhat/console.sol"; + +contract Diamond is ComptrollerV12Storage { + event DiamondCut(IDiamondCut.FacetCut[] _diamondCut); + + function _become(Unitroller unitroller) public { + require(msg.sender == unitroller.admin(), "only unitroller admin can"); + console.log("-------------------become"); + require(unitroller._acceptImplementation() == 0, "not authorized"); + } + + function diamondCut(IDiamondCut.FacetCut[] memory _diamondCut) public { + require(msg.sender == admin, "only unitroller admin can"); + libDiamondCut(_diamondCut); + } + + function libDiamondCut(IDiamondCut.FacetCut[] memory _diamondCut) internal { + for (uint256 facetIndex; facetIndex < _diamondCut.length; facetIndex++) { + IDiamondCut.FacetCutAction action = _diamondCut[facetIndex].action; + if (action == IDiamondCut.FacetCutAction.Add) { + addFunctions(_diamondCut[facetIndex].facetAddress, _diamondCut[facetIndex].functionSelectors); + } else if (action == IDiamondCut.FacetCutAction.Replace) { + replaceFunctions(_diamondCut[facetIndex].facetAddress, _diamondCut[facetIndex].functionSelectors); + } else if (action == IDiamondCut.FacetCutAction.Remove) { + removeFunctions(_diamondCut[facetIndex].facetAddress, _diamondCut[facetIndex].functionSelectors); + } else { + revert("LibDiamondCut: Incorrect FacetCutAction"); + } + } + emit DiamondCut(_diamondCut); + } + + function addFunctions(address _facetAddress, bytes4[] memory _functionSelectors) internal { + require(_functionSelectors.length > 0, "LibDiamondCut: No selectors in facet to cut"); + require(_facetAddress != address(0), "LibDiamondCut: Add facet can't be address(0)"); + uint96 selectorPosition = uint96(facetFunctionSelectors[_facetAddress].functionSelectors.length); + // add new facet address if it does not exist + if (selectorPosition == 0) { + addFacet(_facetAddress); + } + for (uint256 selectorIndex; selectorIndex < _functionSelectors.length; selectorIndex++) { + bytes4 selector = _functionSelectors[selectorIndex]; + address oldFacetAddress = selectorToFacetAndPosition[selector].facetAddress; + console.log("-------------selector", oldFacetAddress, selectorIndex); + require(oldFacetAddress == address(0), "LibDiamondCut: Can't add function that already exists"); + addFunction(selector, selectorPosition, _facetAddress); + selectorPosition++; + } + } + + function replaceFunctions(address _facetAddress, bytes4[] memory _functionSelectors) internal { + require(_functionSelectors.length > 0, "LibDiamondCut: No selectors in facet to cut"); + require(_facetAddress != address(0), "LibDiamondCut: Add facet can't be address(0)"); + uint96 selectorPosition = uint96(facetFunctionSelectors[_facetAddress].functionSelectors.length); + // add new facet address if it does not exist + if (selectorPosition == 0) { + addFacet(_facetAddress); + } + for (uint256 selectorIndex; selectorIndex < _functionSelectors.length; selectorIndex++) { + bytes4 selector = _functionSelectors[selectorIndex]; + address oldFacetAddress = selectorToFacetAndPosition[selector].facetAddress; + require(oldFacetAddress != _facetAddress, "LibDiamondCut: Can't replace function with same function"); + removeFunction(oldFacetAddress, selector); + addFunction(selector, selectorPosition, _facetAddress); + selectorPosition++; + } + } + + function removeFunctions(address _facetAddress, bytes4[] memory _functionSelectors) internal { + require(_functionSelectors.length > 0, "LibDiamondCut: No selectors in facet to cut"); + // if function does not exist then do nothing and return + require(_facetAddress == address(0), "LibDiamondCut: Remove facet address must be address(0)"); + for (uint256 selectorIndex; selectorIndex < _functionSelectors.length; selectorIndex++) { + bytes4 selector = _functionSelectors[selectorIndex]; + address oldFacetAddress = selectorToFacetAndPosition[selector].facetAddress; + removeFunction(oldFacetAddress, selector); + } + } + + function addFacet(address _facetAddress) internal { + enforceHasContractCode(_facetAddress, "Diamond: New facet has no code"); + facetFunctionSelectors[_facetAddress].facetAddressPosition = facetAddresses.length; + facetAddresses.push(_facetAddress); + } + + function addFunction( + bytes4 _selector, + uint96 _selectorPosition, + address _facetAddress + ) internal { + selectorToFacetAndPosition[_selector].functionSelectorPosition = _selectorPosition; + facetFunctionSelectors[_facetAddress].functionSelectors.push(_selector); + selectorToFacetAndPosition[_selector].facetAddress = _facetAddress; + + } + + function removeFunction(address _facetAddress, bytes4 _selector) internal { + require(_facetAddress != address(0), "LibDiamondCut: Can't remove function that doesn't exist"); + // an immutable function is a function defined directly in a diamond + require(_facetAddress != address(this), "LibDiamondCut: Can't remove immutable function"); + // replace selector with last selector, then delete last selector + uint256 selectorPosition = selectorToFacetAndPosition[_selector].functionSelectorPosition; + uint256 lastSelectorPosition = facetFunctionSelectors[_facetAddress].functionSelectors.length - 1; + // if not the same then replace _selector with lastSelector + if (selectorPosition != lastSelectorPosition) { + bytes4 lastSelector = facetFunctionSelectors[_facetAddress].functionSelectors[lastSelectorPosition]; + facetFunctionSelectors[_facetAddress].functionSelectors[selectorPosition] = lastSelector; + selectorToFacetAndPosition[lastSelector].functionSelectorPosition = uint96(selectorPosition); + } + // delete the last selector + facetFunctionSelectors[_facetAddress].functionSelectors.pop(); + delete selectorToFacetAndPosition[_selector]; + + // if no more selectors for facet address then delete the facet address + if (lastSelectorPosition == 0) { + // replace facet address with last facet address and delete last facet address + uint256 lastFacetAddressPosition = facetAddresses.length - 1; + uint256 facetAddressPosition = facetFunctionSelectors[_facetAddress].facetAddressPosition; + if (facetAddressPosition != lastFacetAddressPosition) { + address lastFacetAddress = facetAddresses[lastFacetAddressPosition]; + facetAddresses[facetAddressPosition] = lastFacetAddress; + facetFunctionSelectors[lastFacetAddress].facetAddressPosition = facetAddressPosition; + } + facetAddresses.pop(); + delete facetFunctionSelectors[_facetAddress].facetAddressPosition; + } + } + + function enforceHasContractCode(address _contract, string memory _errorMessage) internal view { + uint256 contractSize; + assembly { + contractSize := extcodesize(_contract) + } + require(contractSize > 0, _errorMessage); + } + + // Find facet for function that is called and execute the + // function if a facet is found and return any value. + function() external payable { + address facet = selectorToFacetAndPosition[msg.sig].facetAddress; + console.log("--------------------facetAddress", facet); + require(facet != address(0), "Diamond: Function does not exist"); + // Execute public function from facet using delegatecall and return any value. + assembly { + // copy function selector and any arguments + calldatacopy(0, 0, calldatasize()) + // execute function call using the facet + let result := delegatecall(gas(), facet, 0, calldatasize(), 0, 0) + // get any return value + returndatacopy(0, 0, returndatasize()) + // return any return value or error back to the caller + switch result + case 0 { + revert(0, returndatasize()) + } + default { + return(0, returndatasize()) + } + } + } +} diff --git a/contracts/Diamond/libraries/LibHelper.sol b/contracts/Comptroller/Diamond/facets/FacetHelper.sol similarity index 55% rename from contracts/Diamond/libraries/LibHelper.sol rename to contracts/Comptroller/Diamond/facets/FacetHelper.sol index 55266cbbd..c0034e351 100644 --- a/contracts/Diamond/libraries/LibHelper.sol +++ b/contracts/Comptroller/Diamond/facets/FacetHelper.sol @@ -1,13 +1,11 @@ -pragma solidity 0.8.13; -import "../../Tokens/V0.8.13/VTokens/VToken.sol"; -import "./appStorage.sol"; -import "./LibAccessCheck.sol"; -import "../../Utils/V0.8.13/ErrorReporter.sol"; -import "./LibExponentialNoError.sol"; +pragma solidity 0.5.16; +import "../../../Tokens/VTokens/VToken.sol"; +import "../../../Utils/ErrorReporter.sol"; +import "../../../Utils/ExponentialNoError.sol"; +import "../../../Comptroller/ComptrollerStorage.sol"; +import "../../../Governance/IAccessControlManager.sol"; -import "../../Utils/V0.8.13/ExponentialNoError.sol"; - -library LibHelper { +contract FacetHelper is ComptrollerV12Storage { /// @notice The initial Venus index for a market uint224 public constant venusInitialIndex = 1e36; // closeFactorMantissa must be strictly greater than this value @@ -17,6 +15,63 @@ library LibHelper { // No collateralFactorMantissa may exceed this value uint internal constant collateralFactorMaxMantissa = 0.9e18; // 0.9 + /// @notice Reverts if the protocol is paused + function checkProtocolPauseState() internal view { + require(!protocolPaused, "protocol is paused"); + } + + /// @notice Reverts if a certain action is paused on a market + function checkActionPauseState(address market, Action action) internal view { + require(!actionPaused(market, action), "action is paused"); + } + + /// @notice Reverts if the caller is not admin + function ensureAdmin() internal view { + require(msg.sender == admin, "only admin can"); + } + + /// @notice Checks the passed address is nonzero + function ensureNonzeroAddress(address someone) internal pure { + require(someone != address(0), "can't be zero address"); + } + + /// @notice Reverts if the market is not listed + function ensureListed(Market storage market) internal view { + require(market.isListed, "market not listed"); + } + + /// @notice Reverts if the caller is neither admin nor the passed address + function ensureAdminOr(address privilegedAddress) internal view { + require(msg.sender == admin || msg.sender == privilegedAddress, "access denied"); + } + + function ensureAllowed(string memory functionSig) internal view { + require(IAccessControlManager(accessControl).isAllowedToCall(msg.sender, functionSig), "access denied"); + } + + /** + * @notice Returns whether the given account is entered in the given asset + * @param account The address of the account to check + * @param vToken The vToken to check + * @return True if the account is in the asset, otherwise false. + */ + function checkMembership(address account, VToken vToken) external view returns (bool) { + return markets[address(vToken)].accountMembership[account]; + } + + /** + * @notice Checks if a certain action is paused on a market + * @param action Action id + * @param market vToken address + */ + function actionPaused(address market, Action action) public view returns (bool) { + return _actionPaused[market][uint(action)]; + } + + function getBlockNumber() public view returns (uint) { + return block.number; + } + /** * @notice Determine what the account liquidity would be if the given amounts were redeemed/borrowed * @param vTokenModify The market to hypothetically redeem/borrow in @@ -35,8 +90,7 @@ library LibHelper { uint redeemTokens, uint borrowAmount ) internal view returns (ComptrollerErrorReporter.Error, uint, uint) { - AppStorage storage s = LibAppStorage.diamondStorage(); - (uint err, uint liquidity, uint shortfall) = s.comptrollerLens.getHypotheticalAccountLiquidity( + (uint err, uint liquidity, uint shortfall) = comptrollerLens.getHypotheticalAccountLiquidity( address(this), account, vTokenModify, @@ -53,10 +107,9 @@ library LibHelper { * @return Success indicator for whether the market was entered */ function addToMarketInternal(VToken vToken, address borrower) internal returns (ComptrollerErrorReporter.Error) { - AppStorage storage s = LibAppStorage.diamondStorage(); - LibAccessCheck.checkActionPauseState(address(vToken), LibAccessCheck.Action.ENTER_MARKET); - Market storage marketToJoin = s.markets[address(vToken)]; - LibAccessCheck.ensureListed(marketToJoin); + checkActionPauseState(address(vToken), Action.ENTER_MARKET); + Market storage marketToJoin = markets[address(vToken)]; + ensureListed(marketToJoin); if (marketToJoin.accountMembership[borrower]) { // already joined return ComptrollerErrorReporter.Error.NO_ERROR; @@ -67,16 +120,15 @@ library LibHelper { // that is, only when we need to perform liquidity checks // and not whenever we want to check if an account is in a particular market marketToJoin.accountMembership[borrower] = true; - s.accountAssets[borrower].push(vToken); + accountAssets[borrower].push(vToken); // emit MarketEntered(vToken, borrower); return ComptrollerErrorReporter.Error.NO_ERROR; } function redeemAllowedInternal(address vToken, address redeemer, uint redeemTokens) internal view returns (uint) { - AppStorage storage s = LibAppStorage.diamondStorage(); - LibAccessCheck.ensureListed(s.markets[vToken]); + ensureListed(markets[vToken]); /* If the redeemer is not 'in' the market, then we can bypass the liquidity check */ - if (!s.markets[vToken].accountMembership[redeemer]) { + if (!markets[vToken].accountMembership[redeemer]) { return uint(ComptrollerErrorReporter.Error.NO_ERROR); } /* Otherwise, perform a hypothetical liquidity check to guard against shortfall */ diff --git a/contracts/Comptroller/Diamond/facets/MarketFacet.sol b/contracts/Comptroller/Diamond/facets/MarketFacet.sol new file mode 100644 index 000000000..d5e7acd5c --- /dev/null +++ b/contracts/Comptroller/Diamond/facets/MarketFacet.sol @@ -0,0 +1,183 @@ +pragma solidity 0.5.16; + +import "./FacetHelper.sol"; +import "../../../Tokens/VTokens/VToken.sol"; + +contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError, FacetHelper { + /// @notice Emitted when an account enters a market + event MarketEntered(VToken vToken, address account); + + /// @notice Emitted when an account exits a market + event MarketExited(VToken vToken, address account); + + /// @notice Indicator that this is a Comptroller contract (for inspection) + function isComptroller() public pure returns (bool) { + return true; + } + + /** + * @notice Calculate number of tokens of collateral asset to seize given an underlying amount + * @dev Used in liquidation (called in vToken.liquidateBorrowFresh) + * @param vTokenBorrowed The address of the borrowed vToken + * @param vTokenCollateral The address of the collateral vToken + * @param actualRepayAmount The amount of vTokenBorrowed underlying to convert into vTokenCollateral tokens + * @return (errorCode, number of vTokenCollateral tokens to be seized in a liquidation) + */ + function liquidateCalculateSeizeTokens( + address vTokenBorrowed, + address vTokenCollateral, + uint actualRepayAmount + ) public view returns (uint, uint) { + (uint err, uint seizeTokens) = comptrollerLens.liquidateCalculateSeizeTokens( + address(this), + vTokenBorrowed, + vTokenCollateral, + actualRepayAmount + ); + return (err, seizeTokens); + } + + /** + * @notice Returns whether the given account is entered in the given asset + * @param account The address of the account to check + * @param vToken The vToken to check + * @return True if the account is in the asset, otherwise false. + */ + function checkMembership(address account, VToken vToken) public view returns (bool) { + return markets[address(vToken)].accountMembership[account]; + } + + /** + * @notice Add assets to be included in account liquidity calculation + * @param vTokens The list of addresses of the vToken markets to be enabled + * @return Success indicator for whether each corresponding market was entered + */ + function enterMarkets(address[] memory vTokens) public returns (uint[] memory) { + uint len = vTokens.length; + + uint[] memory results = new uint[](len); + for (uint i; i < len; ++i) { + results[i] = uint(addToMarketInternal(VToken(vTokens[i]), msg.sender)); + if (results[i] == 0) { + emit MarketEntered(VToken(vTokens[i]), msg.sender); + } + } + + return results; + } + + /** + * @notice Removes asset from sender's account liquidity calculation + * @dev Sender must not have an outstanding borrow balance in the asset, + * or be providing necessary collateral for an outstanding borrow. + * @param vTokenAddress The address of the asset to be removed + * @return Whether or not the account successfully exited the market + */ + function exitMarket(address vTokenAddress) public returns (uint) { + checkActionPauseState(vTokenAddress, Action.EXIT_MARKET); + + VToken vToken = VToken(vTokenAddress); + /* Get sender tokensHeld and amountOwed underlying from the vToken */ + (uint oErr, uint tokensHeld, uint amountOwed, ) = vToken.getAccountSnapshot(msg.sender); + require(oErr == 0, "getAccountSnapshot failed"); // semi-opaque error code + + /* Fail if the sender has a borrow balance */ + if (amountOwed != 0) { + return fail(Error.NONZERO_BORROW_BALANCE, FailureInfo.EXIT_MARKET_BALANCE_OWED); + } + + /* Fail if the sender is not permitted to redeem all of their tokens */ + uint allowed = redeemAllowedInternal(vTokenAddress, msg.sender, tokensHeld); + if (allowed != 0) { + return failOpaque(Error.REJECTION, FailureInfo.EXIT_MARKET_REJECTION, allowed); + } + + Market storage marketToExit = markets[address(vToken)]; + + /* Return true if the sender is not already ‘in’ the market */ + if (!marketToExit.accountMembership[msg.sender]) { + return uint(Error.NO_ERROR); + } + + /* Set vToken account membership to false */ + delete marketToExit.accountMembership[msg.sender]; + + /* Delete vToken from the account’s list of assets */ + // In order to delete vToken, copy last item in list to location of item to be removed, reduce length by 1 + VToken[] storage userAssetList = accountAssets[msg.sender]; + uint len = userAssetList.length; + uint i; + for (; i < len; ++i) { + if (userAssetList[i] == vToken) { + userAssetList[i] = userAssetList[len - 1]; + userAssetList.pop(); + break; + } + } + + // We *must* have found the asset in the list or our redundant data structure is broken + assert(i < len); + + emit MarketExited(vToken, msg.sender); + + return uint(Error.NO_ERROR); + } + + /** + * @notice Add the market to the markets mapping and set it as listed + * @dev Admin function to set isListed and add support for the market + * @param vToken The address of the market (token) to list + * @return uint 0=success, otherwise a failure. (See enum Error for details) + */ + function _supportMarket(VToken vToken) public returns (uint) { + ensureAllowed("_supportMarket(address)"); + + if (markets[address(vToken)].isListed) { + return fail(Error.MARKET_ALREADY_LISTED, FailureInfo.SUPPORT_MARKET_EXISTS); + } + + // Note that isVenus is not in active use anymore + Market storage newMarket = markets[address(vToken)]; + newMarket.isListed = true; + newMarket.isVenus = false; + newMarket.collateralFactorMantissa = 0; + _addMarketInternal(vToken); + _initializeMarket(address(vToken)); + + //emit MarketListed(vToken); + + return uint(Error.NO_ERROR); + } + + function _addMarketInternal(VToken vToken) internal { + for (uint i; i < allMarkets.length; ++i) { + require(allMarkets[i] != vToken, "market already added"); + } + allMarkets.push(vToken); + } + + function _initializeMarket(address vToken) internal { + uint blockNumber = block.number; + + VenusMarketState storage supplyState = venusSupplyState[vToken]; + VenusMarketState storage borrowState = venusBorrowState[vToken]; + + /* + * Update market state indices + */ + if (supplyState.index == 0) { + // Initialize supply state index with default value + supplyState.index = venusInitialIndex; + } + + if (borrowState.index == 0) { + // Initialize borrow state index with default value + borrowState.index = venusInitialIndex; + } + + /* + * Update market state block numbers + */ + supplyState.block = borrowState.block = uint32(blockNumber); + } +} diff --git a/contracts/Diamond/facets/PolicyFacet.sol b/contracts/Comptroller/Diamond/facets/PolicyFacet.sol similarity index 76% rename from contracts/Diamond/facets/PolicyFacet.sol rename to contracts/Comptroller/Diamond/facets/PolicyFacet.sol index 088a8a918..4930ffd19 100644 --- a/contracts/Diamond/facets/PolicyFacet.sol +++ b/contracts/Comptroller/Diamond/facets/PolicyFacet.sol @@ -1,13 +1,10 @@ -pragma solidity 0.8.13; +pragma solidity 0.5.16; -import "../../Utils/V0.8.13/ErrorReporter.sol"; -import "../libraries/LibAccessCheck.sol"; -import "../libraries/LibHelper.sol"; -import "../libraries/appStorage.sol"; -import "../../Tokens/V0.8.13/VTokens/VToken.sol"; +import "../../../Utils/ErrorReporter.sol"; +import "./FacetHelper.sol"; +import "../../../Tokens/VTokens/VToken.sol"; -contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError { - AppStorage internal s; +contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError, FacetHelper { /// @notice Emitted when a new borrow-side XVS speed is calculated for a market event VenusBorrowSpeedUpdated(VToken indexed vToken, uint newSpeed); @@ -21,13 +18,13 @@ contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError { * @param mintAmount The amount of underlying being supplied to the market in exchange for tokens * @return 0 if the mint is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) */ - function mintAllowed(address vToken, address minter, uint mintAmount) external returns (uint) { + function mintAllowed(address vToken, address minter, uint mintAmount) public returns (uint) { // Pausing is a very serious situation - we revert to sound the alarms - LibAccessCheck.checkProtocolPauseState(); - LibAccessCheck.checkActionPauseState(vToken, LibAccessCheck.Action.MINT); - LibAccessCheck.ensureListed(s.markets[vToken]); + checkProtocolPauseState(); + checkActionPauseState(vToken, Action.MINT); + ensureListed(markets[vToken]); - uint256 supplyCap = s.supplyCaps[vToken]; + uint256 supplyCap = supplyCaps[vToken]; require(supplyCap != 0, "market supply cap is 0"); uint256 vTokenSupply = VToken(vToken).totalSupply(); @@ -42,7 +39,7 @@ contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError { return uint(Error.NO_ERROR); } - function mintVerify(address vToken, address minter, uint actualMintAmount, uint mintTokens) external {} + function mintVerify(address vToken, address minter, uint actualMintAmount, uint mintTokens) public {} /** * @notice Checks if the account should be allowed to redeem tokens in the given market @@ -51,11 +48,11 @@ contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError { * @param redeemTokens The number of vTokens to exchange for the underlying asset in the market * @return 0 if the redeem is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) */ - function redeemAllowed(address vToken, address redeemer, uint redeemTokens) external returns (uint) { - LibAccessCheck.checkProtocolPauseState(); - LibAccessCheck.checkActionPauseState(vToken, LibAccessCheck.Action.REDEEM); + function redeemAllowed(address vToken, address redeemer, uint redeemTokens) public returns (uint) { + checkProtocolPauseState(); + checkActionPauseState(vToken, Action.REDEEM); - uint allowed = LibHelper.redeemAllowedInternal(vToken, redeemer, redeemTokens); + uint allowed = redeemAllowedInternal(vToken, redeemer, redeemTokens); if (allowed != uint(Error.NO_ERROR)) { return allowed; } @@ -68,14 +65,14 @@ contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError { } /** - * @notice Validates redeem and reverts on rejection. May emit logs. + * @notice Validates redeem and reverts on rejection. May emit log * @param vToken Asset being redeemed * @param redeemer The address redeeming the tokens * @param redeemAmount The amount of the underlying asset being redeemed * @param redeemTokens The number of tokens being redeemed */ // solhint-disable-next-line no-unused-vars - function redeemVerify(address vToken, address redeemer, uint redeemAmount, uint redeemTokens) external { + function redeemVerify(address vToken, address redeemer, uint redeemAmount, uint redeemTokens) public { require(redeemTokens != 0 || redeemAmount == 0, "redeemTokens zero"); } @@ -86,36 +83,36 @@ contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError { * @param borrowAmount The amount of underlying the account would borrow * @return 0 if the borrow is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) */ - function borrowAllowed(address vToken, address borrower, uint borrowAmount) external returns (uint) { + function borrowAllowed(address vToken, address borrower, uint borrowAmount) public returns (uint) { // Pausing is a very serious situation - we revert to sound the alarms - LibAccessCheck.checkProtocolPauseState(); - LibAccessCheck.checkActionPauseState(vToken, LibAccessCheck.Action.BORROW); + checkProtocolPauseState(); + checkActionPauseState(vToken, Action.BORROW); - LibAccessCheck.ensureListed(s.markets[vToken]); + ensureListed(markets[vToken]); - if (!s.markets[vToken].accountMembership[borrower]) { + if (!markets[vToken].accountMembership[borrower]) { // only vTokens may call borrowAllowed if borrower not in market require(msg.sender == vToken, "sender must be vToken"); // attempt to add borrower to the market - Error err = LibHelper.addToMarketInternal(VToken(vToken), borrower); + Error err = addToMarketInternal(VToken(vToken), borrower); if (err != Error.NO_ERROR) { return uint(err); } } - if (s.oracle.getUnderlyingPrice(VToken(vToken)) == 0) { + if (oracle.getUnderlyingPrice(VToken(vToken)) == 0) { return uint(Error.PRICE_ERROR); } - uint borrowCap = s.borrowCaps[vToken]; + uint borrowCap = borrowCaps[vToken]; // Borrow cap of 0 corresponds to unlimited borrowing if (borrowCap != 0) { uint nextTotalBorrows = add_(VToken(vToken).totalBorrows(), borrowAmount); require(nextTotalBorrows < borrowCap, "market borrow cap reached"); } - (Error err, , uint shortfall) = LibHelper.getHypotheticalAccountLiquidityInternal( + (Error err, , uint shortfall) = getHypotheticalAccountLiquidityInternal( borrower, VToken(vToken), 0, @@ -137,13 +134,13 @@ contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError { } /** - * @notice Validates borrow and reverts on rejection. May emit logs. + * @notice Validates borrow and reverts on rejection. May emit log * @param vToken Asset whose underlying is being borrowed * @param borrower The address borrowing the underlying * @param borrowAmount The amount of the underlying asset requested to borrow */ // solhint-disable-next-line no-unused-vars - function borrowVerify(address vToken, address borrower, uint borrowAmount) external {} + function borrowVerify(address vToken, address borrower, uint borrowAmount) public {} /** * @notice Checks if the account should be allowed to repay a borrow in the given market @@ -160,10 +157,10 @@ contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError { address borrower, // solhint-disable-next-line no-unused-vars uint repayAmount - ) external returns (uint) { - LibAccessCheck.checkProtocolPauseState(); - LibAccessCheck.checkActionPauseState(vToken, LibAccessCheck.Action.REPAY); - LibAccessCheck.ensureListed(s.markets[vToken]); + ) public returns (uint) { + checkProtocolPauseState(); + checkActionPauseState(vToken, Action.REPAY); + ensureListed(markets[vToken]); // Keep the flywheel moving Exp memory borrowIndex = Exp({ mantissa: VToken(vToken).borrowIndex() }); @@ -174,7 +171,7 @@ contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError { } /** - * @notice Validates repayBorrow and reverts on rejection. May emit logs. + * @notice Validates repayBorrow and reverts on rejection. May emit log * @param vToken Asset being repaid * @param payer The address repaying the borrow * @param borrower The address of the borrower @@ -186,7 +183,7 @@ contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError { address borrower, uint actualRepayAmount, uint borrowerIndex - ) external {} + ) public {} /** * @notice Checks if the liquidation should be allowed to occur @@ -202,23 +199,23 @@ contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError { address liquidator, address borrower, uint repayAmount - ) external returns (uint) { - LibAccessCheck.checkProtocolPauseState(); + ) public returns (uint) { + checkProtocolPauseState(); // if we want to pause liquidating to vTokenCollateral, we should pause seizing - LibAccessCheck.checkActionPauseState(vTokenBorrowed, LibAccessCheck.Action.LIQUIDATE); + checkActionPauseState(vTokenBorrowed, Action.LIQUIDATE); - if (s.liquidatorContract != address(0) && liquidator != s.liquidatorContract) { + if (liquidatorContract != address(0) && liquidator != liquidatorContract) { return uint(Error.UNAUTHORIZED); } - LibAccessCheck.ensureListed(s.markets[vTokenCollateral]); - if (address(vTokenBorrowed) != address(s.vaiController)) { - LibAccessCheck.ensureListed(s.markets[vTokenBorrowed]); + ensureListed(markets[vTokenCollateral]); + if (address(vTokenBorrowed) != address(vaiController)) { + ensureListed(markets[vTokenBorrowed]); } /* The borrower must have shortfall in order to be liquidatable */ - (Error err, , uint shortfall) = LibHelper.getHypotheticalAccountLiquidityInternal( + (Error err, , uint shortfall) = getHypotheticalAccountLiquidityInternal( borrower, VToken(address(0)), 0, @@ -233,13 +230,13 @@ contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError { /* The liquidator may not repay more than what is allowed by the closeFactor */ uint borrowBalance; - if (address(vTokenBorrowed) != address(s.vaiController)) { + if (address(vTokenBorrowed) != address(vaiController)) { borrowBalance = VToken(vTokenBorrowed).borrowBalanceStored(borrower); } else { - borrowBalance = s.vaiController.getVAIRepayAmount(borrower); + borrowBalance = vaiController.getVAIRepayAmount(borrower); } //-- maxClose = multipy of closeFactorMantissa and borrowBalance - if (repayAmount > mul_ScalarTruncate(Exp({ mantissa: s.closeFactorMantissa }), borrowBalance)) { + if (repayAmount > mul_ScalarTruncate(Exp({ mantissa: closeFactorMantissa }), borrowBalance)) { return uint(Error.TOO_MUCH_REPAY); } @@ -253,7 +250,7 @@ contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError { address borrower, uint actualRepayAmount, uint seizeTokens - ) external {} + ) public {} /** * @notice Checks if the seizing of assets should be allowed to occur @@ -269,15 +266,15 @@ contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError { address liquidator, address borrower, uint seizeTokens // solhint-disable-line no-unused-vars - ) external returns (uint) { + ) public returns (uint) { // Pausing is a very serious situation - we revert to sound the alarms - LibAccessCheck.checkProtocolPauseState(); - LibAccessCheck.checkActionPauseState(vTokenCollateral, LibAccessCheck.Action.SEIZE); + checkProtocolPauseState(); + checkActionPauseState(vTokenCollateral, Action.SEIZE); // We've added VAIController as a borrowed token list check for seize - LibAccessCheck.ensureListed(s.markets[vTokenCollateral]); - if (address(vTokenBorrowed) != address(s.vaiController)) { - LibAccessCheck.ensureListed(s.markets[vTokenBorrowed]); + ensureListed(markets[vTokenCollateral]); + if (address(vTokenBorrowed) != address(vaiController)) { + ensureListed(markets[vTokenBorrowed]); } if (VToken(vTokenCollateral).comptroller() != VToken(vTokenBorrowed).comptroller()) { @@ -293,7 +290,7 @@ contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError { } /** - * @notice Validates seize and reverts on rejection. May emit logs. + * @notice Validates seize and reverts on rejection. May emit log * @param vTokenCollateral Asset which was used as collateral and will be seized * @param vTokenBorrowed Asset which was borrowed by the borrower * @param liquidator The address repaying the borrow and seizing the collateral @@ -307,7 +304,7 @@ contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError { address liquidator, address borrower, uint seizeTokens - ) external {} + ) public {} /** * @notice Checks if the account should be allowed to transfer tokens in the given market @@ -317,14 +314,14 @@ contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError { * @param transferTokens The number of vTokens to transfer * @return 0 if the transfer is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) */ - function transferAllowed(address vToken, address src, address dst, uint transferTokens) external returns (uint) { + function transferAllowed(address vToken, address src, address dst, uint transferTokens) public returns (uint) { // Pausing is a very serious situation - we revert to sound the alarms - LibAccessCheck.checkProtocolPauseState(); - LibAccessCheck.checkActionPauseState(vToken, LibAccessCheck.Action.TRANSFER); + checkProtocolPauseState(); + checkActionPauseState(vToken, Action.TRANSFER); // Currently the only consideration is whether or not // the src is allowed to redeem this many tokens - uint allowed = LibHelper.redeemAllowedInternal(vToken, src, transferTokens); + uint allowed = redeemAllowedInternal(vToken, src, transferTokens); if (allowed != uint(Error.NO_ERROR)) { return allowed; } @@ -338,14 +335,14 @@ contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError { } /** - * @notice Validates transfer and reverts on rejection. May emit logs. + * @notice Validates transfer and reverts on rejection. May emit log * @param vToken Asset being transferred * @param src The account which sources the tokens * @param dst The account which receives the tokens * @param transferTokens The number of vTokens to transfer */ // solhint-disable-next-line no-unused-vars - function transferVerify(address vToken, address src, address dst, uint transferTokens) external {} + function transferVerify(address vToken, address src, address dst, uint transferTokens) public {} /** * @notice Determine the current account liquidity wrt collateral requirements @@ -353,8 +350,8 @@ contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError { account liquidity in excess of collateral requirements, * account shortfall below collateral requirements) */ - function getAccountLiquidity(address account) external view returns (uint, uint, uint) { - (Error err, uint liquidity, uint shortfall) = LibHelper.getHypotheticalAccountLiquidityInternal( + function getAccountLiquidity(address account) public view returns (uint, uint, uint) { + (Error err, uint liquidity, uint shortfall) = getHypotheticalAccountLiquidityInternal( account, VToken(address(0)), 0, @@ -372,11 +369,11 @@ contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError { * @param borrowSpeeds New XVS speed for borrow */ function _setVenusSpeeds( - VToken[] calldata vTokens, - uint[] calldata supplySpeeds, - uint[] calldata borrowSpeeds - ) external { - LibAccessCheck.ensureAdminOr(s.comptrollerImplementation); + VToken[] memory vTokens, + uint[] memory supplySpeeds, + uint[] memory borrowSpeeds + ) public { + ensureAdminOr(comptrollerImplementation); uint numTokens = vTokens.length; require( @@ -385,26 +382,26 @@ contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError { ); for (uint i; i < numTokens; ++i) { - LibAccessCheck.ensureNonzeroAddress(address(vTokens[i])); + ensureNonzeroAddress(address(vTokens[i])); setVenusSpeedInternal(vTokens[i], supplySpeeds[i], borrowSpeeds[i]); } } function setVenusSpeedInternal(VToken vToken, uint supplySpeed, uint borrowSpeed) internal { - LibAccessCheck.ensureListed(s.markets[address(vToken)]); + ensureListed(markets[address(vToken)]); - if (s.venusSupplySpeeds[address(vToken)] != supplySpeed) { + if (venusSupplySpeeds[address(vToken)] != supplySpeed) { // Supply speed updated so let's update supply state to ensure that // 1. XVS accrued properly for the old speed, and // 2. XVS accrued at the new speed starts after this block. updateVenusSupplyIndex(address(vToken)); // Update speed and emit event - s.venusSupplySpeeds[address(vToken)] = supplySpeed; + venusSupplySpeeds[address(vToken)] = supplySpeed; emit VenusSupplySpeedUpdated(vToken, supplySpeed); } - if (s.venusBorrowSpeeds[address(vToken)] != borrowSpeed) { + if (venusBorrowSpeeds[address(vToken)] != borrowSpeed) { // Borrow speed updated so let's update borrow state to ensure that // 1. XVS accrued properly for the old speed, and // 2. XVS accrued at the new speed starts after this block. @@ -412,7 +409,7 @@ contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError { updateVenusBorrowIndex(address(vToken), borrowIndex); // Update speed and emit event - s.venusBorrowSpeeds[address(vToken)] = borrowSpeed; + venusBorrowSpeeds[address(vToken)] = borrowSpeed; emit VenusBorrowSpeedUpdated(vToken, borrowSpeed); } } @@ -422,8 +419,8 @@ contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError { * @param vToken The market whose borrow index to update */ function updateVenusBorrowIndex(address vToken, ExponentialNoError.Exp memory marketBorrowIndex) internal { - VenusMarketState storage borrowState = s.venusBorrowState[vToken]; - uint borrowSpeed = s.venusBorrowSpeeds[vToken]; + VenusMarketState storage borrowState = venusBorrowState[vToken]; + uint borrowSpeed = venusBorrowSpeeds[vToken]; uint blockNumber = block.number; uint deltaBlocks = sub_(uint(blockNumber), uint(borrowState.block)); if (deltaBlocks > 0 && borrowSpeed > 0) { @@ -434,9 +431,9 @@ contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError { add_(Double({ mantissa: borrowState.index }), ratio).mantissa, "new index exceeds 224 bits" ); - borrowState.block = blockNumber; + borrowState.block = uint32(blockNumber); } else if (deltaBlocks > 0) { - borrowState.block = blockNumber; + borrowState.block = uint32(blockNumber); } } @@ -445,8 +442,8 @@ contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError { * @param vToken The market whose supply index to update */ function updateVenusSupplyIndex(address vToken) internal { - VenusMarketState storage supplyState = s.venusSupplyState[vToken]; - uint supplySpeed = s.venusSupplySpeeds[vToken]; + VenusMarketState storage supplyState = venusSupplyState[vToken]; + uint supplySpeed = venusSupplySpeeds[vToken]; uint blockNumber = block.number; uint deltaBlocks = sub_(uint(blockNumber), uint(supplyState.block)); @@ -458,9 +455,9 @@ contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError { add_(Double({ mantissa: supplyState.index }), ratio).mantissa, "new index exceeds 224 bits" ); - supplyState.block = blockNumber; + supplyState.block = uint32(blockNumber); } else if (deltaBlocks > 0) { - supplyState.block = blockNumber; + supplyState.block = uint32(blockNumber); } } @@ -470,25 +467,25 @@ contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError { * @param supplier The address of the supplier to distribute XVS to */ function distributeSupplierVenus(address vToken, address supplier) internal { - if (address(s.vaiVaultAddress) != address(0)) { + if (address(vaiVaultAddress) != address(0)) { // releaseToVault(); } - uint supplyIndex = s.venusSupplyState[vToken].index; - uint supplierIndex = s.venusSupplierIndex[vToken][supplier]; + uint supplyIndex = venusSupplyState[vToken].index; + uint supplierIndex = venusSupplierIndex[vToken][supplier]; // Update supplier's index to the current index since we are distributing accrued XVS - s.venusSupplierIndex[vToken][supplier] = supplyIndex; - if (supplierIndex == 0 && supplyIndex >= LibHelper.venusInitialIndex) { + venusSupplierIndex[vToken][supplier] = supplyIndex; + if (supplierIndex == 0 && supplyIndex >= venusInitialIndex) { // Covers the case where users supplied tokens before the market's supply state index was set. // Rewards the user with XVS accrued from the start of when supplier rewards were first // set for the market. - supplierIndex = LibHelper.venusInitialIndex; + supplierIndex = venusInitialIndex; } // Calculate change in the cumulative sum of the XVS per vToken accrued Double memory deltaIndex = Double({ mantissa: sub_(supplyIndex, supplierIndex) }); // Multiply of supplierTokens and supplierDelta uint supplierDelta = mul_(VToken(vToken).balanceOf(supplier), deltaIndex); // Addition of supplierAccrued and supplierDelta - s.venusAccrued[supplier] = add_(s.venusAccrued[supplier], supplierDelta); + venusAccrued[supplier] = add_(venusAccrued[supplier], supplierDelta); // emit DistributedSupplierVenus(VToken(vToken), supplier, supplierDelta, supplyIndex); } @@ -503,23 +500,23 @@ contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError { address borrower, ExponentialNoError.Exp memory marketBorrowIndex ) internal { - if (address(s.vaiVaultAddress) != address(0)) { + if (address(vaiVaultAddress) != address(0)) { // releaseToVault(); } - uint borrowIndex = s.venusBorrowState[vToken].index; - uint borrowerIndex = s.venusBorrowerIndex[vToken][borrower]; + uint borrowIndex = venusBorrowState[vToken].index; + uint borrowerIndex = venusBorrowerIndex[vToken][borrower]; // Update borrowers's index to the current index since we are distributing accrued XVS - s.venusBorrowerIndex[vToken][borrower] = borrowIndex; - if (borrowerIndex == 0 && borrowIndex >= LibHelper.venusInitialIndex) { + venusBorrowerIndex[vToken][borrower] = borrowIndex; + if (borrowerIndex == 0 && borrowIndex >= venusInitialIndex) { // Covers the case where users borrowed tokens before the market's borrow state index was set. // Rewards the user with XVS accrued from the start of when borrower rewards were first // set for the market. - borrowerIndex = LibHelper.venusInitialIndex; + borrowerIndex = venusInitialIndex; } // Calculate change in the cumulative sum of the XVS per borrowed unit accrued Double memory deltaIndex = Double({ mantissa: sub_(borrowIndex, borrowerIndex) }); uint borrowerDelta = mul_(div_(VToken(vToken).borrowBalanceStored(borrower), marketBorrowIndex), deltaIndex); - s.venusAccrued[borrower] = add_(s.venusAccrued[borrower], borrowerDelta); + venusAccrued[borrower] = add_(venusAccrued[borrower], borrowerDelta); // emit DistributedBorrowerVenus(VToken(vToken), borrower, borrowerDelta, borrowIndex); } } diff --git a/contracts/Diamond/facets/RewardFacet.sol b/contracts/Comptroller/Diamond/facets/RewardFacet.sol similarity index 78% rename from contracts/Diamond/facets/RewardFacet.sol rename to contracts/Comptroller/Diamond/facets/RewardFacet.sol index d47a5d8ab..71d3504b9 100644 --- a/contracts/Diamond/facets/RewardFacet.sol +++ b/contracts/Comptroller/Diamond/facets/RewardFacet.sol @@ -1,12 +1,10 @@ -pragma solidity 0.8.13; +pragma solidity 0.5.16; -import "../../Oracle/V0.8.13/PriceOracle.sol"; -import "../../Tokens/V0.8.13/VTokens/VToken.sol"; -import "../../Utils/V0.8.13/ErrorReporter.sol"; -import "../libraries/LibAccessCheck.sol"; -import "../libraries/LibHelper.sol"; -import "../libraries/appStorage.sol"; -import "../../Governance/V0.8.13/IAccessControlManager.sol"; +import "../../../Oracle/PriceOracle.sol"; +import "../../../Tokens/VTokens/VToken.sol"; +import "../../../Utils/ErrorReporter.sol"; +import "./FacetHelper.sol"; +import "../../../Governance/IAccessControlManager.sol"; interface IXVS { function balanceOf(address account) external view returns (uint); @@ -16,8 +14,7 @@ interface IXVS { function approve(address spender, uint rawAmount) external returns (bool); } -contract RewardFacet is ComptrollerErrorReporter, ExponentialNoError { - AppStorage internal s; +contract RewardFacet is ComptrollerErrorReporter, ExponentialNoError, FacetHelper { /// @notice Emitted when Venus is granted by admin event VenusGranted(address recipient, uint amount); @@ -29,7 +26,7 @@ contract RewardFacet is ComptrollerErrorReporter, ExponentialNoError { * @param holder The address to claim XVS for */ function claimVenus(address holder) public { - return claimVenus(holder, s.allMarkets); + return claimVenus(holder, allMarkets); } /** @@ -58,10 +55,10 @@ contract RewardFacet is ComptrollerErrorReporter, ExponentialNoError { * @notice Claim all the xvs accrued by holder in all markets, a shorthand for `claimVenus` with collateral set to `true` * @param holder The address to claim XVS for */ - function claimVenusAsCollateral(address holder) external { + function claimVenusAsCollateral(address holder) public { address[] memory holders = new address[](1); holders[0] = holder; - claimVenus(holders, s.allMarkets, true, true, true); + claimVenus(holders, allMarkets, true, true, true); } /** @@ -116,8 +113,8 @@ contract RewardFacet is ComptrollerErrorReporter, ExponentialNoError { * @param recipient The address of the recipient to transfer XVS to * @param amount The amount of XVS to (possibly) transfer */ - function _grantXVS(address recipient, uint amount) external { - LibAccessCheck.ensureAdminOr(s.comptrollerImplementation); + function _grantXVS(address recipient, uint amount) public { + ensureAdminOr(comptrollerImplementation); uint amountLeft = grantXVSInternal(recipient, amount, 0, false); require(amountLeft == 0, "insufficient xvs for grant"); emit VenusGranted(recipient, amount); @@ -131,7 +128,7 @@ contract RewardFacet is ComptrollerErrorReporter, ExponentialNoError { * @notice Return the address of the XVS token * @return The address of XVS */ - function getXVSAddress() public view returns (address) { + function getXVSAddress() public pure returns (address) { return 0xcF6BB5389c92Bdda8a3747Ddb454cB7a64626C63; } @@ -139,7 +136,7 @@ contract RewardFacet is ComptrollerErrorReporter, ExponentialNoError { * @notice Return the address of the XVS vToken * @return The address of XVS vToken */ - function getXVSVTokenAddress() public view returns (address) { + function getXVSVTokenAddress() public pure returns (address) { return 0x151B1e2635A717bcDc836ECd6FbB62B674FE3E1D; } @@ -148,8 +145,8 @@ contract RewardFacet is ComptrollerErrorReporter, ExponentialNoError { * @param action Action id * @param market vToken address */ - function actionPaused(address market, LibAccessCheck.Action action) public view returns (bool) { - return s._actionPaused[market][uint(action)]; + function actionPaused(address market, Action action) public view returns (bool) { + return _actionPaused[market][uint(action)]; } /*** VAI functions ***/ @@ -158,7 +155,7 @@ contract RewardFacet is ComptrollerErrorReporter, ExponentialNoError { * @notice Transfer XVS to VAI Vault */ function releaseToVault() public { - if (s.releaseStartBlock == 0 || getBlockNumber() < s.releaseStartBlock) { + if (releaseStartBlock == 0 || getBlockNumber() < releaseStartBlock) { return; } @@ -168,9 +165,9 @@ contract RewardFacet is ComptrollerErrorReporter, ExponentialNoError { } uint256 actualAmount; - uint256 deltaBlocks = sub_(getBlockNumber(), s.releaseStartBlock); + uint256 deltaBlocks = sub_(getBlockNumber(), releaseStartBlock); // releaseAmount = venusVAIVaultRate * deltaBlocks - uint256 _releaseAmount = mul_(s.venusVAIVaultRate, deltaBlocks); + uint256 _releaseAmount = mul_(venusVAIVaultRate, deltaBlocks); if (xvsBalance >= _releaseAmount) { actualAmount = _releaseAmount; @@ -178,16 +175,16 @@ contract RewardFacet is ComptrollerErrorReporter, ExponentialNoError { actualAmount = xvsBalance; } - if (actualAmount < s.minReleaseAmount) { + if (actualAmount < minReleaseAmount) { return; } - s.releaseStartBlock = getBlockNumber(); + releaseStartBlock = getBlockNumber(); - IXVS(getXVSAddress()).transfer(s.vaiVaultAddress, actualAmount); + IXVS(getXVSAddress()).transfer(vaiVaultAddress, actualAmount); emit DistributedVAIVaultVenus(actualAmount); - IVAIVault(s.vaiVaultAddress).updatePendingRewards(); + IVAIVault(vaiVaultAddress).updatePendingRewards(); } /** @@ -209,7 +206,7 @@ contract RewardFacet is ComptrollerErrorReporter, ExponentialNoError { uint256 holdersLength = holders.length; for (uint i; i < vTokens.length; ++i) { VToken vToken = vTokens[i]; - LibAccessCheck.ensureListed(s.markets[address(vToken)]); + ensureListed(markets[address(vToken)]); if (borrowers) { Exp memory borrowIndex = Exp({ mantissa: vToken.borrowIndex() }); updateVenusBorrowIndex(address(vToken), borrowIndex); @@ -229,8 +226,8 @@ contract RewardFacet is ComptrollerErrorReporter, ExponentialNoError { address holder = holders[j]; // If there is a positive shortfall, the XVS reward is accrued, // but won't be granted to this holder - (, , uint shortfall) = LibHelper.getHypotheticalAccountLiquidityInternal(holder, VToken(address(0)), 0, 0); - s.venusAccrued[holder] = grantXVSInternal(holder, s.venusAccrued[holder], shortfall, collateral); + (, , uint shortfall) = getHypotheticalAccountLiquidityInternal(holder, VToken(address(0)), 0, 0); + venusAccrued[holder] = grantXVSInternal(holder, venusAccrued[holder], shortfall, collateral); } } @@ -239,8 +236,8 @@ contract RewardFacet is ComptrollerErrorReporter, ExponentialNoError { * @param vToken The market whose borrow index to update */ function updateVenusBorrowIndex(address vToken, ExponentialNoError.Exp memory marketBorrowIndex) internal { - VenusMarketState storage borrowState = s.venusBorrowState[vToken]; - uint borrowSpeed = s.venusBorrowSpeeds[vToken]; + VenusMarketState storage borrowState = venusBorrowState[vToken]; + uint borrowSpeed = venusBorrowSpeeds[vToken]; uint blockNumber = block.number; uint deltaBlocks = sub_(uint(blockNumber), uint(borrowState.block)); if (deltaBlocks > 0 && borrowSpeed > 0) { @@ -251,19 +248,19 @@ contract RewardFacet is ComptrollerErrorReporter, ExponentialNoError { add_(Double({ mantissa: borrowState.index }), ratio).mantissa, "new index exceeds 224 bits" ); - borrowState.block = blockNumber; + borrowState.block = uint32(blockNumber); } else if (deltaBlocks > 0) { - borrowState.block = blockNumber; + borrowState.block = uint32(blockNumber); } } /** - * @notice Accrue XVS to the market by updating the supply index + * @notice Accrue XVS to the market by updatiSng the supply index * @param vToken The market whose supply index to update */ function updateVenusSupplyIndex(address vToken) internal { - VenusMarketState storage supplyState = s.venusSupplyState[vToken]; - uint supplySpeed = s.venusSupplySpeeds[vToken]; + VenusMarketState storage supplyState = venusSupplyState[vToken]; + uint supplySpeed = venusSupplySpeeds[vToken]; uint blockNumber = block.number; uint deltaBlocks = sub_(uint(blockNumber), uint(supplyState.block)); if (deltaBlocks > 0 && supplySpeed > 0) { @@ -274,9 +271,9 @@ contract RewardFacet is ComptrollerErrorReporter, ExponentialNoError { add_(Double({ mantissa: supplyState.index }), ratio).mantissa, "new index exceeds 224 bits" ); - supplyState.block = blockNumber; + supplyState.block = uint32(blockNumber); } else if (deltaBlocks > 0) { - supplyState.block = blockNumber; + supplyState.block = uint32(blockNumber); } } @@ -286,25 +283,25 @@ contract RewardFacet is ComptrollerErrorReporter, ExponentialNoError { * @param supplier The address of the supplier to distribute XVS to */ function distributeSupplierVenus(address vToken, address supplier) internal { - if (address(s.vaiVaultAddress) != address(0)) { + if (address(vaiVaultAddress) != address(0)) { // releaseToVault(); } - uint supplyIndex = s.venusSupplyState[vToken].index; - uint supplierIndex = s.venusSupplierIndex[vToken][supplier]; + uint supplyIndex = venusSupplyState[vToken].index; + uint supplierIndex = venusSupplierIndex[vToken][supplier]; // Update supplier's index to the current index since we are distributing accrued XVS - s.venusSupplierIndex[vToken][supplier] = supplyIndex; - if (supplierIndex == 0 && supplyIndex >= LibHelper.venusInitialIndex) { + venusSupplierIndex[vToken][supplier] = supplyIndex; + if (supplierIndex == 0 && supplyIndex >= venusInitialIndex) { // Covers the case where users supplied tokens before the market's supply state index was set. // Rewards the user with XVS accrued from the start of when supplier rewards were first // set for the market. - supplierIndex = LibHelper.venusInitialIndex; + supplierIndex = venusInitialIndex; } // Calculate change in the cumulative sum of the XVS per vToken accrued Double memory deltaIndex = Double({ mantissa: sub_(supplyIndex, supplierIndex) }); // Multiply of supplierTokens and supplierDelta uint supplierDelta = mul_(VToken(vToken).balanceOf(supplier), deltaIndex); // Addition of supplierAccrued and supplierDelta - s.venusAccrued[supplier] = add_(s.venusAccrued[supplier], supplierDelta); + venusAccrued[supplier] = add_(venusAccrued[supplier], supplierDelta); // emit DistributedSupplierVenus(VToken(vToken), supplier, supplierDelta, supplyIndex); } @@ -319,23 +316,23 @@ contract RewardFacet is ComptrollerErrorReporter, ExponentialNoError { address borrower, ExponentialNoError.Exp memory marketBorrowIndex ) internal { - if (address(s.vaiVaultAddress) != address(0)) { + if (address(vaiVaultAddress) != address(0)) { // releaseToVault(); } - uint borrowIndex = s.venusBorrowState[vToken].index; - uint borrowerIndex = s.venusBorrowerIndex[vToken][borrower]; + uint borrowIndex = venusBorrowState[vToken].index; + uint borrowerIndex = venusBorrowerIndex[vToken][borrower]; // Update borrowers's index to the current index since we are distributing accrued XVS - s.venusBorrowerIndex[vToken][borrower] = borrowIndex; - if (borrowerIndex == 0 && borrowIndex >= LibHelper.venusInitialIndex) { + venusBorrowerIndex[vToken][borrower] = borrowIndex; + if (borrowerIndex == 0 && borrowIndex >= venusInitialIndex) { // Covers the case where users borrowed tokens before the market's borrow state index was set. // Rewards the user with XVS accrued from the start of when borrower rewards were first // set for the market. - borrowerIndex = LibHelper.venusInitialIndex; + borrowerIndex = venusInitialIndex; } // Calculate change in the cumulative sum of the XVS per borrowed unit accrued Double memory deltaIndex = Double({ mantissa: sub_(borrowIndex, borrowerIndex) }); uint borrowerDelta = mul_(div_(VToken(vToken).borrowBalanceStored(borrower), marketBorrowIndex), deltaIndex); - s.venusAccrued[borrower] = add_(s.venusAccrued[borrower], borrowerDelta); + venusAccrued[borrower] = add_(venusAccrued[borrower], borrowerDelta); // emit DistributedBorrowerVenus(VToken(vToken), borrower, borrowerDelta, borrowIndex); } } diff --git a/contracts/Diamond/facets/SetterFacet.sol b/contracts/Comptroller/Diamond/facets/SetterFacet.sol similarity index 67% rename from contracts/Diamond/facets/SetterFacet.sol rename to contracts/Comptroller/Diamond/facets/SetterFacet.sol index 7bba02212..587c637d4 100644 --- a/contracts/Diamond/facets/SetterFacet.sol +++ b/contracts/Comptroller/Diamond/facets/SetterFacet.sol @@ -1,15 +1,13 @@ -pragma solidity 0.8.13; - -import "../../Oracle/V0.8.13/PriceOracle.sol"; -import "../../Tokens/V0.8.13/VTokens/VToken.sol"; -import "../../Utils/V0.8.13/ErrorReporter.sol"; -import "../libraries/appStorage.sol"; -import "../../Governance/V0.8.13/IAccessControlManager.sol"; -import "../libraries/LibAccessCheck.sol"; -import "../libraries/LibHelper.sol"; - -contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError { - AppStorage internal s; +pragma solidity 0.5.16; + +import "../../../Oracle/PriceOracle.sol"; +import "../../../Tokens/VTokens/VToken.sol"; +import "../../../Utils/ErrorReporter.sol"; +import "../../../Governance/IAccessControlManager.sol"; +import "./FacetHelper.sol"; +import "hardhat/console.sol"; + +contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetHelper { /// @notice Emitted when close factor is changed by admin event NewCloseFactor(uint oldCloseFactorMantissa, uint newCloseFactorMantissa); @@ -59,7 +57,7 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError { event NewPauseGuardian(address oldPauseGuardian, address newPauseGuardian); /// @notice Emitted when an action is paused on a market - event ActionPausedMarket(VToken indexed vToken, LibAccessCheck.Action indexed action, bool pauseState); + event ActionPausedMarket(VToken indexed vToken, Action indexed action, bool pauseState); /// @notice Emitted when VAI Vault info is changed event NewVAIVaultInfo(address vault_, uint releaseStartBlock_, uint releaseInterval_); @@ -72,16 +70,16 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError { * @dev Admin function to set a new price oracle * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) */ - function _setPriceOracle(PriceOracle newOracle) external returns (uint) { + function _setPriceOracle(PriceOracle newOracle) public returns (uint) { // Check caller is admin - LibAccessCheck.ensureAdmin(); - LibAccessCheck.ensureNonzeroAddress(address(newOracle)); + ensureAdmin(); + ensureNonzeroAddress(address(newOracle)); // Track the old oracle for the comptroller - PriceOracle oldOracle = s.oracle; + PriceOracle oldOracle = oracle; // Set comptroller's oracle to newOracle - s.oracle = newOracle; + oracle = newOracle; // Emit NewPriceOracle(oldOracle, newOracle) emit NewPriceOracle(oldOracle, newOracle); @@ -95,12 +93,12 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError { * @param newCloseFactorMantissa New close factor, scaled by 1e18 * @return uint 0=success, otherwise will revert */ - function _setCloseFactor(uint newCloseFactorMantissa) external returns (uint) { + function _setCloseFactor(uint newCloseFactorMantissa) public returns (uint) { // Check caller is admin - LibAccessCheck.ensureAdmin(); + ensureAdmin(); - uint oldCloseFactorMantissa = s.closeFactorMantissa; - s.closeFactorMantissa = newCloseFactorMantissa; + uint oldCloseFactorMantissa = closeFactorMantissa; + closeFactorMantissa = newCloseFactorMantissa; emit NewCloseFactor(oldCloseFactorMantissa, newCloseFactorMantissa); return uint(Error.NO_ERROR); @@ -112,13 +110,13 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError { * @param newAccessControlAddress New address for the access control * @return uint 0=success, otherwise will revert */ - function _setAccessControl(address newAccessControlAddress) external returns (uint) { + function _setAccessControl(address newAccessControlAddress) public returns (uint) { // Check caller is admin - LibAccessCheck.ensureAdmin(); - LibAccessCheck.ensureNonzeroAddress(newAccessControlAddress); + ensureAdmin(); + ensureNonzeroAddress(newAccessControlAddress); - address oldAccessControlAddress = s.accessControl; - s.accessControl = newAccessControlAddress; + address oldAccessControlAddress = accessControl; + accessControl = newAccessControlAddress; emit NewAccessControl(oldAccessControlAddress, newAccessControlAddress); return uint(Error.NO_ERROR); @@ -131,25 +129,25 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError { * @param newCollateralFactorMantissa The new collateral factor, scaled by 1e18 * @return uint 0=success, otherwise a failure. (See ErrorReporter for details) */ - function _setCollateralFactor(VToken vToken, uint newCollateralFactorMantissa) external returns (uint) { + function _setCollateralFactor(VToken vToken, uint newCollateralFactorMantissa) public returns (uint) { // Check caller is allowed by access control manager - LibAccessCheck.ensureAllowed("_setCollateralFactor(address,uint256)"); - LibAccessCheck.ensureNonzeroAddress(address(vToken)); + ensureAllowed("_setCollateralFactor(address,uint256)"); + ensureNonzeroAddress(address(vToken)); // Verify market is listed - Market storage market = s.markets[address(vToken)]; - LibAccessCheck.ensureListed(market); + Market storage market = markets[address(vToken)]; + ensureListed(market); Exp memory newCollateralFactorExp = Exp({ mantissa: newCollateralFactorMantissa }); //-- Check collateral factor <= 0.9 - Exp memory highLimit = Exp({ mantissa: LibHelper.collateralFactorMaxMantissa }); + Exp memory highLimit = Exp({ mantissa: collateralFactorMaxMantissa }); if (lessThanExp(highLimit, newCollateralFactorExp)) { return fail(Error.INVALID_COLLATERAL_FACTOR, FailureInfo.SET_COLLATERAL_FACTOR_VALIDATION); } // If collateral factor != 0, fail if price == 0 - if (newCollateralFactorMantissa != 0 && s.oracle.getUnderlyingPrice(vToken) == 0) { + if (newCollateralFactorMantissa != 0 && oracle.getUnderlyingPrice(vToken) == 0) { return fail(Error.PRICE_ERROR, FailureInfo.SET_COLLATERAL_FACTOR_WITHOUT_PRICE); } @@ -169,15 +167,15 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError { * @param newLiquidationIncentiveMantissa New liquidationIncentive scaled by 1e18 * @return uint 0=success, otherwise a failure. (See ErrorReporter for details) */ - function _setLiquidationIncentive(uint newLiquidationIncentiveMantissa) external returns (uint) { - LibAccessCheck.ensureAllowed("_setLiquidationIncentive(uint256)"); + function _setLiquidationIncentive(uint newLiquidationIncentiveMantissa) public returns (uint) { + ensureAllowed("_setLiquidationIncentive(uint256)"); require(newLiquidationIncentiveMantissa >= 1e18, "incentive must be over 1e18"); // Save current value for use in log - uint oldLiquidationIncentiveMantissa = s.liquidationIncentiveMantissa; + uint oldLiquidationIncentiveMantissa = liquidationIncentiveMantissa; // Set liquidation incentive to new incentive - s.liquidationIncentiveMantissa = newLiquidationIncentiveMantissa; + liquidationIncentiveMantissa = newLiquidationIncentiveMantissa; // Emit event with old incentive, new incentive emit NewLiquidationIncentive(oldLiquidationIncentiveMantissa, newLiquidationIncentiveMantissa); @@ -185,11 +183,11 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError { return uint(Error.NO_ERROR); } - function _setLiquidatorContract(address newLiquidatorContract_) external { + function _setLiquidatorContract(address newLiquidatorContract_) public { // Check caller is admin - LibAccessCheck.ensureAdmin(); - address oldLiquidatorContract = s.liquidatorContract; - s.liquidatorContract = newLiquidatorContract_; + ensureAdmin(); + address oldLiquidatorContract = liquidatorContract; + liquidatorContract = newLiquidatorContract_; emit NewLiquidatorContract(oldLiquidatorContract, newLiquidatorContract_); } @@ -198,14 +196,14 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError { * @param newPauseGuardian The address of the new Pause Guardian * @return uint 0=success, otherwise a failure. (See enum Error for details) */ - function _setPauseGuardian(address newPauseGuardian) external returns (uint) { - LibAccessCheck.ensureAdmin(); - LibAccessCheck.ensureNonzeroAddress(newPauseGuardian); + function _setPauseGuardian(address newPauseGuardian) public returns (uint) { + ensureAdmin(); + ensureNonzeroAddress(newPauseGuardian); // Save current value for inclusion in log - address oldPauseGuardian = s.pauseGuardian; + address oldPauseGuardian = pauseGuardian; // Store pauseGuardian with value newPauseGuardian - s.pauseGuardian = newPauseGuardian; + pauseGuardian = newPauseGuardian; // Emit NewPauseGuardian(OldPauseGuardian, NewPauseGuardian) emit NewPauseGuardian(oldPauseGuardian, newPauseGuardian); @@ -214,13 +212,14 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError { } /** - * @notice Set the given borrow caps for the given vToken markets. Borrowing that brings total borrows to or above borrow cap will revert. + * @notice Set the given borrow caps for the given vToken market Borrowing that brings total borrows to or above borrow cap will revert. * @dev Access is controled by ACM. A borrow cap of 0 corresponds to unlimited borrowing. * @param vTokens The addresses of the markets (tokens) to change the borrow caps for * @param newBorrowCaps The new borrow cap values in underlying to be set. A value of 0 corresponds to unlimited borrowing. */ - function _setMarketBorrowCaps(VToken[] calldata vTokens, uint[] calldata newBorrowCaps) external { - LibAccessCheck.ensureAllowed("_setMarketBorrowCaps(address[],uint256[])"); + function _setMarketBorrowCaps(VToken[] memory vTokens, uint[] memory newBorrowCaps) public { + ensureAllowed("_setMarketBorrowCaps(address[],uint256[])"); + console.log("------------------kitani baar chala"); uint numMarkets = vTokens.length; uint numBorrowCaps = newBorrowCaps.length; @@ -228,19 +227,19 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError { require(numMarkets != 0 && numMarkets == numBorrowCaps, "invalid input"); for (uint i; i < numMarkets; ++i) { - s.borrowCaps[address(vTokens[i])] = newBorrowCaps[i]; + borrowCaps[address(vTokens[i])] = newBorrowCaps[i]; emit NewBorrowCap(vTokens[i], newBorrowCaps[i]); } } /** - * @notice Set the given supply caps for the given vToken markets. Supply that brings total Supply to or above supply cap will revert. - * @dev Admin function to set the supply caps. A supply cap of 0 corresponds to Minting NotAllowed. + * @notice Set the given supply caps for the given vToken market Supply that brings total Supply to or above supply cap will revert. + * @dev Admin function to set the supply cap A supply cap of 0 corresponds to Minting NotAllowed. * @param vTokens The addresses of the markets (tokens) to change the supply caps for * @param newSupplyCaps The new supply cap values in underlying to be set. A value of 0 corresponds to Minting NotAllowed. */ - function _setMarketSupplyCaps(VToken[] calldata vTokens, uint256[] calldata newSupplyCaps) external { - LibAccessCheck.ensureAllowed("_setMarketSupplyCaps(address[],uint256[])"); + function _setMarketSupplyCaps(VToken[] memory vTokens, uint256[] memory newSupplyCaps) public { + ensureAllowed("_setMarketSupplyCaps(address[],uint256[])"); uint numMarkets = vTokens.length; uint numSupplyCaps = newSupplyCaps.length; @@ -248,7 +247,7 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError { require(numMarkets != 0 && numMarkets == numSupplyCaps, "invalid input"); for (uint i; i < numMarkets; ++i) { - s.supplyCaps[address(vTokens[i])] = newSupplyCaps[i]; + supplyCaps[address(vTokens[i])] = newSupplyCaps[i]; emit NewSupplyCap(vTokens[i], newSupplyCaps[i]); } } @@ -256,10 +255,10 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError { /** * @notice Set whole protocol pause/unpause state */ - function _setProtocolPaused(bool state) external returns (bool) { - LibAccessCheck.ensureAllowed("_setProtocolPaused(bool)"); + function _setProtocolPaused(bool state) public returns (bool) { + ensureAllowed("_setProtocolPaused(bool)"); - s.protocolPaused = state; + protocolPaused = state; emit ActionProtocolPaused(state); return state; } @@ -271,11 +270,11 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError { * @param paused The new paused state (true=paused, false=unpaused) */ function _setActionsPaused( - address[] calldata markets, - LibAccessCheck.Action[] calldata actions, + address[] memory markets, + Action[] memory actions, bool paused - ) external { - LibAccessCheck.ensureAllowed("_setActionsPaused(address[],uint256[],bool)"); + ) public { + ensureAllowed("_setActionsPaused(address[],uint256[],bool)"); uint256 numMarkets = markets.length; uint256 numActions = actions.length; @@ -292,9 +291,9 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError { * @param action Action id to pause/unpause * @param paused The new paused state (true=paused, false=unpaused) */ - function setActionPausedInternal(address market, LibAccessCheck.Action action, bool paused) internal { - LibAccessCheck.ensureListed(s.markets[market]); - s._actionPaused[market][uint(action)] = paused; + function setActionPausedInternal(address market, Action action, bool paused) internal { + ensureListed(markets[market]); + _actionPaused[market][uint(action)] = paused; emit ActionPausedMarket(VToken(market), action, paused); } @@ -303,23 +302,23 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError { * @dev Admin function to set a new VAI controller * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) */ - function _setVAIController(VAIControllerInterface vaiController_) external returns (uint) { + function _setVAIController(VAIControllerInterface vaiController_) public returns (uint) { // Check caller is admin - LibAccessCheck.ensureAdmin(); - LibAccessCheck.ensureNonzeroAddress(address(vaiController_)); + ensureAdmin(); + ensureNonzeroAddress(address(vaiController_)); - VAIControllerInterface oldVaiController = s.vaiController; - s.vaiController = vaiController_; + VAIControllerInterface oldVaiController = vaiController; + vaiController = vaiController_; emit NewVAIController(oldVaiController, vaiController_); return uint(Error.NO_ERROR); } - function _setVAIMintRate(uint newVAIMintRate) external returns (uint) { + function _setVAIMintRate(uint newVAIMintRate) public returns (uint) { // Check caller is admin - LibAccessCheck.ensureAdmin(); - uint oldVAIMintRate = s.vaiMintRate; - s.vaiMintRate = newVAIMintRate; + ensureAdmin(); + uint oldVAIMintRate = vaiMintRate; + vaiMintRate = newVAIMintRate; emit NewVAIMintRate(oldVAIMintRate, newVAIMintRate); return uint(Error.NO_ERROR); @@ -331,16 +330,16 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError { * @param amount The amount of VAI to set to the account * @return The number of minted VAI by `owner` */ - function setMintedVAIOf(address owner, uint amount) external returns (uint) { - LibAccessCheck.checkProtocolPauseState(); + function setMintedVAIOf(address owner, uint amount) public returns (uint) { + checkProtocolPauseState(); // Pausing is a very serious situation - we revert to sound the alarms - require(!s.mintVAIGuardianPaused && !s.repayVAIGuardianPaused, "VAI is paused"); + require(!mintVAIGuardianPaused && !repayVAIGuardianPaused, "VAI is paused"); // Check caller is vaiController - if (msg.sender != address(s.vaiController)) { + if (msg.sender != address(vaiController)) { return fail(Error.REJECTION, FailureInfo.SET_MINTED_VAI_REJECTION); } - s.mintedVAIs[owner] = amount; + mintedVAIs[owner] = amount; return uint(Error.NO_ERROR); } @@ -348,20 +347,20 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError { address newTreasuryGuardian, address newTreasuryAddress, uint newTreasuryPercent - ) external returns (uint) { + ) public returns (uint) { // Check caller is admin - LibAccessCheck.ensureAdminOr(s.treasuryGuardian); + ensureAdminOr(treasuryGuardian); require(newTreasuryPercent < 1e18, "treasury percent cap overflow"); - LibAccessCheck.ensureNonzeroAddress(newTreasuryGuardian); + ensureNonzeroAddress(newTreasuryGuardian); - address oldTreasuryGuardian = s.treasuryGuardian; - address oldTreasuryAddress = s.treasuryAddress; - uint oldTreasuryPercent = s.treasuryPercent; + address oldTreasuryGuardian = treasuryGuardian; + address oldTreasuryAddress = treasuryAddress; + uint oldTreasuryPercent = treasuryPercent; - s.treasuryGuardian = newTreasuryGuardian; - s.treasuryAddress = newTreasuryAddress; - s.treasuryPercent = newTreasuryPercent; + treasuryGuardian = newTreasuryGuardian; + treasuryAddress = newTreasuryAddress; + treasuryPercent = newTreasuryPercent; emit NewTreasuryGuardian(oldTreasuryGuardian, newTreasuryGuardian); emit NewTreasuryAddress(oldTreasuryAddress, newTreasuryAddress); @@ -375,12 +374,12 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError { /** * @dev Set ComptrollerLens contract address */ - function _setComptrollerLens(ComptrollerLensInterface comptrollerLens_) external returns (uint) { - LibAccessCheck.ensureAdmin(); - LibAccessCheck.ensureNonzeroAddress(address(comptrollerLens_)); - address oldComptrollerLens = address(s.comptrollerLens); - s.comptrollerLens = comptrollerLens_; - emit NewComptrollerLens(oldComptrollerLens, address(s.comptrollerLens)); + function _setComptrollerLens(ComptrollerLensInterface comptrollerLens_) public returns (uint) { + ensureAdmin(); + ensureNonzeroAddress(address(comptrollerLens_)); + address oldComptrollerLens = address(comptrollerLens); + comptrollerLens = comptrollerLens_; + emit NewComptrollerLens(oldComptrollerLens, address(comptrollerLens)); return uint(Error.NO_ERROR); } @@ -390,10 +389,10 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError { * @notice Set the amount of XVS distributed per block to VAI Vault * @param venusVAIVaultRate_ The amount of XVS wei per block to distribute to VAI Vault */ - function _setVenusVAIVaultRate(uint venusVAIVaultRate_) external { - LibAccessCheck.ensureAdmin(); - uint oldVenusVAIVaultRate = s.venusVAIVaultRate; - s.venusVAIVaultRate = venusVAIVaultRate_; + function _setVenusVAIVaultRate(uint venusVAIVaultRate_) public { + ensureAdmin(); + uint oldVenusVAIVaultRate = venusVAIVaultRate; + venusVAIVaultRate = venusVAIVaultRate_; emit NewVenusVAIVaultRate(oldVenusVAIVaultRate, venusVAIVaultRate_); } @@ -403,13 +402,13 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError { * @param releaseStartBlock_ The start block of release to VAI Vault * @param minReleaseAmount_ The minimum release amount to VAI Vault */ - function _setVAIVaultInfo(address vault_, uint256 releaseStartBlock_, uint256 minReleaseAmount_) external { - LibAccessCheck.ensureAdmin(); - LibAccessCheck.ensureNonzeroAddress(vault_); + function _setVAIVaultInfo(address vault_, uint256 releaseStartBlock_, uint256 minReleaseAmount_) public { + ensureAdmin(); + ensureNonzeroAddress(vault_); - s.vaiVaultAddress = vault_; - s.releaseStartBlock = releaseStartBlock_; - s.minReleaseAmount = minReleaseAmount_; + vaiVaultAddress = vault_; + releaseStartBlock = releaseStartBlock_; + minReleaseAmount = minReleaseAmount_; emit NewVAIVaultInfo(vault_, releaseStartBlock_, minReleaseAmount_); } } diff --git a/contracts/Diamond/interfaces/IDiamondCut.sol b/contracts/Comptroller/Diamond/interfaces/IDiamondCut.sol similarity index 51% rename from contracts/Diamond/interfaces/IDiamondCut.sol rename to contracts/Comptroller/Diamond/interfaces/IDiamondCut.sol index 7869ea4d0..eeec92c41 100644 --- a/contracts/Diamond/interfaces/IDiamondCut.sol +++ b/contracts/Comptroller/Diamond/interfaces/IDiamondCut.sol @@ -1,4 +1,5 @@ -pragma solidity 0.8.13; +pragma solidity 0.5.16; +pragma experimental ABIEncoderV2; interface IDiamondCut { enum FacetCutAction { @@ -17,10 +18,7 @@ interface IDiamondCut { /// @notice Add/replace/remove any number of functions and optionally execute /// a function with delegatecall /// @param _diamondCut Contains the facet addresses and function selectors - /// @param _init The address of the contract or facet to execute _calldata - /// @param _calldata A function call, including function selector and arguments - /// _calldata is executed with delegatecall on _init - function diamondCut(FacetCut[] calldata _diamondCut, address _init, bytes calldata _calldata) external; + function diamondCut(FacetCut[] calldata _diamondCut) external; - event DiamondCut(FacetCut[] _diamondCut, address _init, bytes _calldata); + event DiamondCut(FacetCut[] _diamondCut); } diff --git a/contracts/Comptroller/Diamond/interfaces/IMarketFacet.sol b/contracts/Comptroller/Diamond/interfaces/IMarketFacet.sol new file mode 100644 index 000000000..49dd94d9b --- /dev/null +++ b/contracts/Comptroller/Diamond/interfaces/IMarketFacet.sol @@ -0,0 +1,21 @@ +pragma solidity 0.5.16; + +import "../../../Tokens/VTokens/VToken.sol"; + +interface IMarketFacet { + function isComptroller() external pure returns (bool); + + function liquidateCalculateSeizeTokens( + address vTokenBorrowed, + address vTokenCollateral, + uint actualRepayAmount + ) external view returns (uint, uint); + + function checkMembership(address account, VToken vToken) external view returns (bool); + + function enterMarkets(address[] calldata vTokens) external returns (uint[] memory); + + function exitMarket(address vToken) external returns (uint); + + function _supportMarket(VToken vToken) external returns (uint); +} diff --git a/contracts/Diamond/interfaces/IPolicyFacet.sol b/contracts/Comptroller/Diamond/interfaces/IPolicyFacet.sol similarity index 86% rename from contracts/Diamond/interfaces/IPolicyFacet.sol rename to contracts/Comptroller/Diamond/interfaces/IPolicyFacet.sol index fa1f4d52c..1e3b647d8 100644 --- a/contracts/Diamond/interfaces/IPolicyFacet.sol +++ b/contracts/Comptroller/Diamond/interfaces/IPolicyFacet.sol @@ -1,4 +1,6 @@ -pragma solidity 0.8.13; +pragma solidity 0.5.16; + +import "../../../Tokens/VTokens/VToken.sol"; interface IPolicyFacet { function mintAllowed(address vToken, address minter, uint mintAmount) external returns (uint); @@ -64,4 +66,12 @@ interface IPolicyFacet { function transferAllowed(address vToken, address src, address dst, uint transferTokens) external returns (uint); function transferVerify(address vToken, address src, address dst, uint transferTokens) external; + + function getAccountLiquidity(address account) external view returns (uint, uint, uint); + + function _setVenusSpeeds( + VToken[] calldata vTokens, + uint[] calldata supplySpeeds, + uint[] calldata borrowSpeeds + ) external; } diff --git a/contracts/Comptroller/Diamond/interfaces/IRewardFacet.sol b/contracts/Comptroller/Diamond/interfaces/IRewardFacet.sol new file mode 100644 index 000000000..9ba06aabf --- /dev/null +++ b/contracts/Comptroller/Diamond/interfaces/IRewardFacet.sol @@ -0,0 +1,46 @@ +pragma solidity 0.5.16; + +import "../../../Oracle/PriceOracle.sol"; +import "../../../Tokens/VTokens/VToken.sol"; + +interface IRewardFacet { + enum Action { + MINT, + REDEEM, + BORROW, + REPAY, + SEIZE, + LIQUIDATE, + TRANSFER, + ENTER_MARKET, + EXIT_MARKET + } + + function claimVenus(address holder) external; + + function claimVenus(address holder, VToken[] calldata vTokens) external; + + function claimVenus(address[] calldata holders, VToken[] calldata vTokens, bool borrowers, bool suppliers) external; + + function claimVenusAsCollateral(address holder) external; + + function _grantXVS(address recipient, uint amount) external ; + + function getBlockNumber() external view returns (uint); + + function getXVSAddress() external pure returns (address); + + function getXVSVTokenAddress() external pure returns (address); + + function actionPaused(address market, Action action) external view returns (bool); + + function releaseToVault() external; + + function claimVenus( + address[] calldata holders, + VToken[] calldata vTokens, + bool borrowers, + bool suppliers, + bool collateral + ) external; +} \ No newline at end of file diff --git a/contracts/Comptroller/Diamond/interfaces/ISetterFacet.sol b/contracts/Comptroller/Diamond/interfaces/ISetterFacet.sol new file mode 100644 index 000000000..e1d8d72a3 --- /dev/null +++ b/contracts/Comptroller/Diamond/interfaces/ISetterFacet.sol @@ -0,0 +1,63 @@ +pragma solidity 0.5.16; + +import "../../../Oracle/PriceOracle.sol"; +import "../../../Comptroller/ComptrollerLensInterface.sol"; +import "../../../Tokens/VAI/VAIController.sol"; + +interface ISetterFacet { + enum Action { + MINT, + REDEEM, + BORROW, + REPAY, + SEIZE, + LIQUIDATE, + TRANSFER, + ENTER_MARKET, + EXIT_MARKET + } + + function _setPriceOracle(PriceOracle newOracle) external returns (uint); + + function _setCloseFactor(uint newCloseFactorMantissa) external returns (uint); + + function _setAccessControl(address newAccessControlAddress) external returns (uint); + + function _setCollateralFactor(VToken vToken, uint newCollateralFactorMantissa) external returns (uint); + + function _setLiquidationIncentive(uint newLiquidationIncentiveMantissa) external returns (uint); + + function _setLiquidatorContract(address newLiquidatorContract_) external; + + function _setPauseGuardian(address newPauseGuardian) external returns (uint); + + function _setMarketBorrowCaps(VToken[] calldata vTokens, uint[] calldata newBorrowCaps) external; + + function _setMarketSupplyCaps(VToken[] calldata vTokens, uint256[] calldata newSupplyCaps) external; + + function _setProtocolPaused(bool state) external returns (bool); + + function _setActionsPaused( + address[] calldata markets, + Action[] calldata actions, + bool paused + ) external; + + function _setVAIController(VAIControllerInterface vaiController_) external returns (uint); + + function _setVAIMintRate(uint newVAIMintRate) external returns (uint); + + function setMintedVAIOf(address owner, uint amount) external returns (uint); + + function _setTreasuryData( + address newTreasuryGuardian, + address newTreasuryAddress, + uint newTreasuryPercent + ) external returns (uint); + + function _setComptrollerLens(ComptrollerLensInterface comptrollerLens_) external returns (uint); + + function _setVenusVAIVaultRate(uint venusVAIVaultRate_) external; + + function _setVAIVaultInfo(address vault_, uint256 releaseStartBlock_, uint256 minReleaseAmount_) external; +} \ No newline at end of file diff --git a/contracts/Diamond/Diamond.sol b/contracts/Diamond/Diamond.sol deleted file mode 100644 index d77e0390a..000000000 --- a/contracts/Diamond/Diamond.sol +++ /dev/null @@ -1,74 +0,0 @@ -pragma solidity 0.8.13; - -import { LibDiamond } from "./libraries/LibDiamond.sol"; -import { AppStorage } from "./libraries/appStorage.sol"; - -import { IDiamondCut } from "./interfaces/IDiamondCut.sol"; - -interface IUnitroller { - function admin() external view returns (address); - - function _acceptImplementation() external returns (uint); -} - -contract Diamond { - AppStorage internal s; - - constructor(address _contractOwner, address _unitrollerAddress) payable { - LibDiamond.setContractOwner(_contractOwner); - LibDiamond.setUnitrollerAddress(_unitrollerAddress); - } - - function facetCutInitilizer(address _diamondCutFacet) external { - require(s.admin == msg.sender, "Owner check"); - // Add the diamondCut external function from the diamondCutFacet - IDiamondCut.FacetCut[] memory cut = new IDiamondCut.FacetCut[](1); - bytes4[] memory functionSelectors = new bytes4[](1); - functionSelectors[0] = IDiamondCut.diamondCut.selector; - cut[0] = IDiamondCut.FacetCut({ - facetAddress: _diamondCutFacet, - action: IDiamondCut.FacetCutAction.Add, - functionSelectors: functionSelectors - }); - LibDiamond.libDiamondCut(cut, address(0), ""); - } - - function _become() external { - address unitrollerAddress = LibDiamond.getUnitrollerAddress(); - require(msg.sender == IUnitroller(unitrollerAddress).admin(), "only unitroller admin can"); - require(IUnitroller(unitrollerAddress)._acceptImplementation() == 0, "not authorized"); - } - - // Find facet for function that is called and execute the - // function if a facet is found and return any value. - fallback() external payable { - LibDiamond.DiamondStorage storage ds; - bytes32 position = LibDiamond.DIAMOND_STORAGE_POSITION; - // get diamond storage - assembly { - ds.slot := position - } - // get facet from function selector - address facet = ds.selectorToFacetAndPosition[msg.sig].facetAddress; - require(facet != address(0), "Diamond: Function does not exist"); - // Execute external function from facet using delegatecall and return any value. - assembly { - // copy function selector and any arguments - calldatacopy(0, 0, calldatasize()) - // execute function call using the facet - let result := delegatecall(gas(), facet, 0, calldatasize(), 0, 0) - // get any return value - returndatacopy(0, 0, returndatasize()) - // return any return value or error back to the caller - switch result - case 0 { - revert(0, returndatasize()) - } - default { - return(0, returndatasize()) - } - } - } - - receive() external payable {} -} diff --git a/contracts/Diamond/facets/DiamondCutFacet.sol b/contracts/Diamond/facets/DiamondCutFacet.sol deleted file mode 100644 index b023f27e4..000000000 --- a/contracts/Diamond/facets/DiamondCutFacet.sol +++ /dev/null @@ -1,23 +0,0 @@ -pragma solidity 0.8.13; - -import { IDiamondCut } from "../interfaces/IDiamondCut.sol"; -import { LibDiamond } from "../libraries/LibDiamond.sol"; -import { AppStorage } from "../libraries/appStorage.sol"; - -// Remember to add the loupe functions from DiamondLoupeFacet to the diamond. -// The loupe functions are required by the EIP2535 Diamonds standard - -contract DiamondCutFacet is IDiamondCut { - AppStorage internal s; - - /// @notice Add/replace/remove any number of functions and optionally execute - /// a function with delegatecall - /// @param _diamondCut Contains the facet addresses and function selectors - /// @param _init The address of the contract or facet to execute _calldata - /// @param _calldata A function call, including function selector and arguments - /// _calldata is executed with delegatecall on _init - function diamondCut(FacetCut[] calldata _diamondCut, address _init, bytes calldata _calldata) external override { - require(s.admin == msg.sender, "Owner check"); - LibDiamond.libDiamondCut(_diamondCut, _init, _calldata); - } -} diff --git a/contracts/Diamond/facets/DiamondLoupeFacet.sol b/contracts/Diamond/facets/DiamondLoupeFacet.sol deleted file mode 100644 index 77e08a3af..000000000 --- a/contracts/Diamond/facets/DiamondLoupeFacet.sol +++ /dev/null @@ -1,57 +0,0 @@ -pragma solidity 0.8.13; - -import { LibDiamond } from "../libraries/LibDiamond.sol"; -import { IDiamondLoupe } from "../interfaces/IDiamondLoupe.sol"; - -// The functions in DiamondLoupeFacet MUST be added to a diamond. -// The EIP-2535 Diamond standard requires these functions. - -contract DiamondLoupeFacet is IDiamondLoupe { - // Diamond Loupe Functions - //////////////////////////////////////////////////////////////////// - /// These functions are expected to be called frequently by tools. - // - // struct Facet { - // address facetAddress; - // bytes4[] functionSelectors; - // } - - /// @notice Gets all facets and their selectors. - /// @return facets_ Facet - function facets() external view override returns (Facet[] memory facets_) { - LibDiamond.DiamondStorage storage ds = LibDiamond.diamondStorage(); - uint256 numFacets = ds.facetAddresses.length; - facets_ = new Facet[](numFacets); - for (uint256 i; i < numFacets; i++) { - address facetAddress_ = ds.facetAddresses[i]; - facets_[i].facetAddress = facetAddress_; - facets_[i].functionSelectors = ds.facetFunctionSelectors[facetAddress_].functionSelectors; - } - } - - /// @notice Gets all the function selectors provided by a facet. - /// @param _facet The facet address. - /// @return facetFunctionSelectors_ - function facetFunctionSelectors( - address _facet - ) external view override returns (bytes4[] memory facetFunctionSelectors_) { - LibDiamond.DiamondStorage storage ds = LibDiamond.diamondStorage(); - facetFunctionSelectors_ = ds.facetFunctionSelectors[_facet].functionSelectors; - } - - /// @notice Get all the facet addresses used by a diamond. - /// @return facetAddresses_ - function facetAddresses() external view override returns (address[] memory facetAddresses_) { - LibDiamond.DiamondStorage storage ds = LibDiamond.diamondStorage(); - facetAddresses_ = ds.facetAddresses; - } - - /// @notice Gets the facet that supports the given selector. - /// @dev If facet is not found return address(0). - /// @param _functionSelector The function selector. - /// @return facetAddress_ The facet address. - function facetAddress(bytes4 _functionSelector) external view override returns (address facetAddress_) { - LibDiamond.DiamondStorage storage ds = LibDiamond.diamondStorage(); - facetAddress_ = ds.selectorToFacetAndPosition[_functionSelector].facetAddress; - } -} diff --git a/contracts/Diamond/facets/MarketFacet.sol b/contracts/Diamond/facets/MarketFacet.sol deleted file mode 100644 index f82f531e6..000000000 --- a/contracts/Diamond/facets/MarketFacet.sol +++ /dev/null @@ -1,332 +0,0 @@ -pragma solidity 0.8.13; - -import "../libraries/appStorage.sol"; -import "../libraries/LibHelper.sol"; -import "../libraries/LibAccessCheck.sol"; -import "../../Tokens/V0.8.13/VTokens/VToken.sol"; - -contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError { - AppStorage internal s; - - /// @notice Emitted when an account enters a market - event MarketEntered(VToken vToken, address account); - - /// @notice Emitted when an account exits a market - event MarketExited(VToken vToken, address account); - - /** - * @notice Returns the assets an account has entered - * @param account The address of the account to pull assets for - * @return A dynamic list with the assets the account has entered - */ - function getAssetsIn(address account) external view returns (VToken[] memory) { - return s.accountAssets[account]; - } - - function venusSupplierIndex(address market, address borrower) external view returns (uint) { - return s.venusSupplierIndex[market][borrower]; - } - - function venusBorrowerIndex(address market, address borrower) external view returns (uint) { - return s.venusBorrowerIndex[market][borrower]; - } - - function oracle() external view returns (PriceOracle) { - return s.oracle; - } - - function markets(address vToken) external view returns (bool, uint, bool) { - return (s.markets[vToken].isListed, s.markets[vToken].collateralFactorMantissa, s.markets[vToken].isVenus); - } - - function venusSupplyState(address vToken) external view returns (uint224, uint) { - return (s.venusSupplyState[vToken].index, s.venusSupplyState[vToken].block); - } - - function venusBorrowState(address vToken) external view returns (uint224, uint) { - return (s.venusBorrowState[vToken].index, s.venusBorrowState[vToken].block); - } - - function venusSupplySpeeds(address vToken) external view returns (uint) { - return s.venusSupplySpeeds[vToken]; - } - - function venusBorrowSpeeds(address vToken) external view returns (uint) { - return s.venusBorrowSpeeds[vToken]; - } - - function vaiController() external view returns (VAIControllerInterface) { - return s.vaiController; - } - - function comptrollerLens() external view returns (ComptrollerLensInterface) { - return s.comptrollerLens; - } - - function liquidationIncentiveMantissa() external view returns (uint) { - return s.liquidationIncentiveMantissa; - } - - function treasuryPercent() external view returns (uint) { - return s.treasuryPercent; - } - - function treasuryAddress() external view returns (address) { - return s.treasuryAddress; - } - - function treasuryGuardian() external view returns (address) { - return s.treasuryGuardian; - } - - function supplyCaps(address vToken) external view returns (uint) { - return s.supplyCaps[vToken]; - } - - function maxAssets() external view returns (uint) { - return s.maxAssets; - } - - function closeFactorMantissa() external view returns (uint) { - return s.closeFactorMantissa; - } - - function allMarkets(uint index) external view returns (VToken) { - return s.allMarkets[index]; - } - - function venusRate() external view returns (uint) { - return s.venusRate; - } - - function venusSpeeds(address token) external view returns (uint) { - return s.venusSpeeds[token]; - } - - function venusAccrued(address token) external view returns (uint) { - return s.venusAccrued[token]; - } - - function mintedVAIs(address vToken) external view returns (uint) { - return s.mintedVAIs[vToken]; - } - - function vaiMintRate() external view returns (uint) { - return s.vaiMintRate; - } - - function venusVAIVaultRate() external view returns (uint) { - return s.venusVAIVaultRate; - } - - function vaiVaultAddress() external view returns (address) { - return s.vaiVaultAddress; - } - - function releaseStartBlock() external view returns (uint256) { - return s.releaseStartBlock; - } - - function minReleaseAmount() external view returns (uint256) { - return s.minReleaseAmount; - } - - function borrowCapGuardian() external view returns (address) { - return s.borrowCapGuardian; - } - - function borrowCaps(address token) external view returns (uint) { - return s.borrowCaps[token]; - } - - function mintVAIGuardianPaused() external view returns (bool) { - return s.mintVAIGuardianPaused; - } - - function repayVAIGuardianPaused() external view returns (bool) { - return s.repayVAIGuardianPaused; - } - - function protocolPaused() external view returns (bool) { - return s.protocolPaused; - } - - function liquidatorContract() external view returns (address) { - return s.liquidatorContract; - } - - function pauseGuardian() external view returns (address) { - return s.pauseGuardian; - } - - /// @notice Indicator that this is a Comptroller contract (for inspection) - function isComptroller() external pure returns (bool) { - return true; - } - - /** - * @notice Calculate number of tokens of collateral asset to seize given an underlying amount - * @dev Used in liquidation (called in vToken.liquidateBorrowFresh) - * @param vTokenBorrowed The address of the borrowed vToken - * @param vTokenCollateral The address of the collateral vToken - * @param actualRepayAmount The amount of vTokenBorrowed underlying to convert into vTokenCollateral tokens - * @return (errorCode, number of vTokenCollateral tokens to be seized in a liquidation) - */ - function liquidateCalculateSeizeTokens( - address vTokenBorrowed, - address vTokenCollateral, - uint actualRepayAmount - ) external view returns (uint, uint) { - (uint err, uint seizeTokens) = s.comptrollerLens.liquidateCalculateSeizeTokens( - address(this), - vTokenBorrowed, - vTokenCollateral, - actualRepayAmount - ); - return (err, seizeTokens); - } - - /** - * @notice Returns whether the given account is entered in the given asset - * @param account The address of the account to check - * @param vToken The vToken to check - * @return True if the account is in the asset, otherwise false. - */ - function checkMembership(address account, VToken vToken) external view returns (bool) { - return s.markets[address(vToken)].accountMembership[account]; - } - - /** - * @notice Add assets to be included in account liquidity calculation - * @param vTokens The list of addresses of the vToken markets to be enabled - * @return Success indicator for whether each corresponding market was entered - */ - function enterMarkets(address[] calldata vTokens) external returns (uint[] memory) { - uint len = vTokens.length; - - uint[] memory results = new uint[](len); - for (uint i; i < len; ++i) { - results[i] = uint(LibHelper.addToMarketInternal(VToken(vTokens[i]), msg.sender)); - if (results[i] == 0) { - emit MarketEntered(VToken(vTokens[i]), msg.sender); - } - } - - return results; - } - - /** - * @notice Removes asset from sender's account liquidity calculation - * @dev Sender must not have an outstanding borrow balance in the asset, - * or be providing necessary collateral for an outstanding borrow. - * @param vTokenAddress The address of the asset to be removed - * @return Whether or not the account successfully exited the market - */ - function exitMarket(address vTokenAddress) external returns (uint) { - LibAccessCheck.checkActionPauseState(vTokenAddress, LibAccessCheck.Action.EXIT_MARKET); - - VToken vToken = VToken(vTokenAddress); - /* Get sender tokensHeld and amountOwed underlying from the vToken */ - (uint oErr, uint tokensHeld, uint amountOwed, ) = vToken.getAccountSnapshot(msg.sender); - require(oErr == 0, "getAccountSnapshot failed"); // semi-opaque error code - - /* Fail if the sender has a borrow balance */ - if (amountOwed != 0) { - return fail(Error.NONZERO_BORROW_BALANCE, FailureInfo.EXIT_MARKET_BALANCE_OWED); - } - - /* Fail if the sender is not permitted to redeem all of their tokens */ - uint allowed = LibHelper.redeemAllowedInternal(vTokenAddress, msg.sender, tokensHeld); - if (allowed != 0) { - return failOpaque(Error.REJECTION, FailureInfo.EXIT_MARKET_REJECTION, allowed); - } - - Market storage marketToExit = s.markets[address(vToken)]; - - /* Return true if the sender is not already ‘in’ the market */ - if (!marketToExit.accountMembership[msg.sender]) { - return uint(Error.NO_ERROR); - } - - /* Set vToken account membership to false */ - delete marketToExit.accountMembership[msg.sender]; - - /* Delete vToken from the account’s list of assets */ - // In order to delete vToken, copy last item in list to location of item to be removed, reduce length by 1 - VToken[] storage userAssetList = s.accountAssets[msg.sender]; - uint len = userAssetList.length; - uint i; - for (; i < len; ++i) { - if (userAssetList[i] == vToken) { - userAssetList[i] = userAssetList[len - 1]; - userAssetList.pop(); - break; - } - } - - // We *must* have found the asset in the list or our redundant data structure is broken - assert(i < len); - - emit MarketExited(vToken, msg.sender); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Add the market to the markets mapping and set it as listed - * @dev Admin function to set isListed and add support for the market - * @param vToken The address of the market (token) to list - * @return uint 0=success, otherwise a failure. (See enum Error for details) - */ - function _supportMarket(VToken vToken) external returns (uint) { - LibAccessCheck.ensureAllowed("_supportMarket(address)"); - - if (s.markets[address(vToken)].isListed) { - return fail(Error.MARKET_ALREADY_LISTED, FailureInfo.SUPPORT_MARKET_EXISTS); - } - - // Note that isVenus is not in active use anymore - Market storage newMarket = s.markets[address(vToken)]; - newMarket.isListed = true; - newMarket.isVenus = false; - newMarket.collateralFactorMantissa = 0; - _addMarketInternal(vToken); - _initializeMarket(address(vToken)); - - //emit MarketListed(vToken); - - return uint(Error.NO_ERROR); - } - - function _addMarketInternal(VToken vToken) internal { - for (uint i; i < s.allMarkets.length; ++i) { - require(s.allMarkets[i] != vToken, "market already added"); - } - s.allMarkets.push(vToken); - } - - function _initializeMarket(address vToken) internal { - uint blockNumber = block.number; - - VenusMarketState storage supplyState = s.venusSupplyState[vToken]; - VenusMarketState storage borrowState = s.venusBorrowState[vToken]; - - /* - * Update market state indices - */ - if (supplyState.index == 0) { - // Initialize supply state index with default value - supplyState.index = LibHelper.venusInitialIndex; - } - - if (borrowState.index == 0) { - // Initialize borrow state index with default value - borrowState.index = LibHelper.venusInitialIndex; - } - - /* - * Update market state block numbers - */ - supplyState.block = borrowState.block = blockNumber; - } -} diff --git a/contracts/Diamond/interfaces/IDiamondLoupe.sol b/contracts/Diamond/interfaces/IDiamondLoupe.sol deleted file mode 100644 index 36e8aadf1..000000000 --- a/contracts/Diamond/interfaces/IDiamondLoupe.sol +++ /dev/null @@ -1,30 +0,0 @@ -pragma solidity 0.8.13; - -interface IDiamondLoupe { - /// These functions are expected to be called frequently - /// by tools. - - struct Facet { - address facetAddress; - bytes4[] functionSelectors; - } - - /// @notice Gets all facet addresses and their four byte function selectors. - /// @return facets_ Facet - function facets() external view returns (Facet[] memory facets_); - - /// @notice Gets all the function selectors supported by a specific facet. - /// @param _facet The facet address. - /// @return facetFunctionSelectors_ - function facetFunctionSelectors(address _facet) external view returns (bytes4[] memory facetFunctionSelectors_); - - /// @notice Get all the facet addresses used by a diamond. - /// @return facetAddresses_ - function facetAddresses() external view returns (address[] memory facetAddresses_); - - /// @notice Gets the facet that supports the given selector. - /// @dev If facet is not found return address(0). - /// @param _functionSelector The function selector. - /// @return facetAddress_ The facet address. - function facetAddress(bytes4 _functionSelector) external view returns (address facetAddress_); -} diff --git a/contracts/Diamond/interfaces/IMarketFacet.sol b/contracts/Diamond/interfaces/IMarketFacet.sol deleted file mode 100644 index 3dfa56b70..000000000 --- a/contracts/Diamond/interfaces/IMarketFacet.sol +++ /dev/null @@ -1,7 +0,0 @@ -pragma solidity 0.8.13; - -interface IMarketFacet { - function enterMarkets(address[] calldata vTokens) external returns (uint[] memory); - - function exitMarket(address vToken) external returns (uint); -} diff --git a/contracts/Diamond/libraries/LibAccessCheck.sol b/contracts/Diamond/libraries/LibAccessCheck.sol deleted file mode 100644 index 725fc448a..000000000 --- a/contracts/Diamond/libraries/LibAccessCheck.sol +++ /dev/null @@ -1,82 +0,0 @@ -pragma solidity 0.8.13; - -import "../../Governance/V0.8.13/IAccessControlManager.sol"; -import "../../Tokens/V0.8.13/VTokens/VToken.sol"; -import "../libraries/appStorage.sol"; - -library LibAccessCheck { - enum Action { - MINT, - REDEEM, - BORROW, - REPAY, - SEIZE, - LIQUIDATE, - TRANSFER, - ENTER_MARKET, - EXIT_MARKET - } - - /// @notice Reverts if the protocol is paused - function checkProtocolPauseState() internal view { - AppStorage storage s = LibAppStorage.diamondStorage(); - require(!s.protocolPaused, "protocol is paused"); - } - - /// @notice Reverts if a certain action is paused on a market - function checkActionPauseState(address market, Action action) internal view { - require(!actionPaused(market, action), "action is paused"); - } - - /// @notice Reverts if the caller is not admin - function ensureAdmin() internal view { - AppStorage storage s = LibAppStorage.diamondStorage(); - require(msg.sender == s.admin, "only admin can"); - } - - /// @notice Checks the passed address is nonzero - function ensureNonzeroAddress(address someone) internal pure { - require(someone != address(0), "can't be zero address"); - } - - /// @notice Reverts if the market is not listed - function ensureListed(Market storage market) internal view { - require(market.isListed, "market not listed"); - } - - /// @notice Reverts if the caller is neither admin nor the passed address - function ensureAdminOr(address privilegedAddress) internal view { - AppStorage storage s = LibAppStorage.diamondStorage(); - require(msg.sender == s.admin || msg.sender == privilegedAddress, "access denied"); - } - - function ensureAllowed(string memory functionSig) internal view { - AppStorage storage s = LibAppStorage.diamondStorage(); - require(IAccessControlManager(s.accessControl).isAllowedToCall(msg.sender, functionSig), "access denied"); - } - - /** - * @notice Returns whether the given account is entered in the given asset - * @param account The address of the account to check - * @param vToken The vToken to check - * @return True if the account is in the asset, otherwise false. - */ - function checkMembership(address account, VToken vToken) external view returns (bool) { - AppStorage storage s = LibAppStorage.diamondStorage(); - return s.markets[address(vToken)].accountMembership[account]; - } - - /** - * @notice Checks if a certain action is paused on a market - * @param action Action id - * @param market vToken address - */ - function actionPaused(address market, Action action) public view returns (bool) { - AppStorage storage s = LibAppStorage.diamondStorage(); - return s._actionPaused[market][uint(action)]; - } - - function getBlockNumber() public view returns (uint) { - return block.number; - } -} diff --git a/contracts/Diamond/libraries/LibDiamond.sol b/contracts/Diamond/libraries/LibDiamond.sol deleted file mode 100644 index f46079b89..000000000 --- a/contracts/Diamond/libraries/LibDiamond.sol +++ /dev/null @@ -1,222 +0,0 @@ -pragma solidity 0.8.13; - -import { IDiamondCut } from "../interfaces/IDiamondCut.sol"; - -// Remember to add the loupe functions from DiamondLoupeFacet to the diamond. -// The loupe functions are required by the EIP2535 Diamonds standard - -error InitializationFunctionReverted(address _initializationContractAddress, bytes _calldata); - -library LibDiamond { - bytes32 internal constant DIAMOND_STORAGE_POSITION = keccak256("diamond.standard.diamond.storage"); - - struct FacetAddressAndPosition { - address facetAddress; - uint96 functionSelectorPosition; // position in facetFunctionSelectors.functionSelectors array - } - - struct FacetFunctionSelectors { - bytes4[] functionSelectors; - uint256 facetAddressPosition; // position of facetAddress in facetAddresses array - } - - struct DiamondStorage { - // maps function selector to the facet address and - // the position of the selector in the facetFunctionSelectors.selectors array - mapping(bytes4 => FacetAddressAndPosition) selectorToFacetAndPosition; - // maps facet addresses to function selectors - mapping(address => FacetFunctionSelectors) facetFunctionSelectors; - // facet addresses - address[] facetAddresses; - // Used to query if a contract implements an interface. - // Used to implement ERC-165. - mapping(bytes4 => bool) supportedInterfaces; - // owner of the contract - address contractOwner; - // unitroller address - address unitrollerAddress; - } - - function diamondStorage() internal pure returns (DiamondStorage storage ds) { - bytes32 position = DIAMOND_STORAGE_POSITION; - assembly { - ds.slot := position - } - } - - event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); - - event UnitrollerAddressUpdated(address indexed previousOwner, address indexed newOwner); - - function setContractOwner(address _newOwner) internal { - DiamondStorage storage ds = diamondStorage(); - address previousOwner = ds.contractOwner; - ds.contractOwner = _newOwner; - emit OwnershipTransferred(previousOwner, _newOwner); - } - - function setUnitrollerAddress(address _unitrollerAddress) internal { - DiamondStorage storage ds = diamondStorage(); - address previousUnitrollerAddress = ds.unitrollerAddress; - ds.unitrollerAddress = _unitrollerAddress; - emit OwnershipTransferred(previousUnitrollerAddress, _unitrollerAddress); - } - - function contractOwner() internal view returns (address contractOwner_) { - contractOwner_ = diamondStorage().contractOwner; - } - - function enforceIsContractOwner() internal view { - require(msg.sender == diamondStorage().contractOwner, "LibDiamond: Must be contract owner"); - } - - function getUnitrollerAddress() internal view returns (address) { - return diamondStorage().unitrollerAddress; - } - - event DiamondCut(IDiamondCut.FacetCut[] _diamondCut, address _init, bytes _calldata); - - // Internal function version of diamondCut - function libDiamondCut(IDiamondCut.FacetCut[] memory _diamondCut, address _init, bytes memory _calldata) internal { - for (uint256 facetIndex; facetIndex < _diamondCut.length; facetIndex++) { - IDiamondCut.FacetCutAction action = _diamondCut[facetIndex].action; - if (action == IDiamondCut.FacetCutAction.Add) { - addFunctions(_diamondCut[facetIndex].facetAddress, _diamondCut[facetIndex].functionSelectors); - } else if (action == IDiamondCut.FacetCutAction.Replace) { - replaceFunctions(_diamondCut[facetIndex].facetAddress, _diamondCut[facetIndex].functionSelectors); - } else if (action == IDiamondCut.FacetCutAction.Remove) { - removeFunctions(_diamondCut[facetIndex].facetAddress, _diamondCut[facetIndex].functionSelectors); - } else { - revert("LibDiamondCut: Incorrect FacetCutAction"); - } - } - emit DiamondCut(_diamondCut, _init, _calldata); - initializeDiamondCut(_init, _calldata); - } - - function addFunctions(address _facetAddress, bytes4[] memory _functionSelectors) internal { - require(_functionSelectors.length > 0, "LibDiamondCut: No selectors in facet to cut"); - DiamondStorage storage ds = diamondStorage(); - require(_facetAddress != address(0), "LibDiamondCut: Add facet can't be address(0)"); - uint96 selectorPosition = uint96(ds.facetFunctionSelectors[_facetAddress].functionSelectors.length); - // add new facet address if it does not exist - if (selectorPosition == 0) { - addFacet(ds, _facetAddress); - } - for (uint256 selectorIndex; selectorIndex < _functionSelectors.length; selectorIndex++) { - bytes4 selector = _functionSelectors[selectorIndex]; - address oldFacetAddress = ds.selectorToFacetAndPosition[selector].facetAddress; - require(oldFacetAddress == address(0), "LibDiamondCut: Can't add function that already exists"); - addFunction(ds, selector, selectorPosition, _facetAddress); - selectorPosition++; - } - } - - function replaceFunctions(address _facetAddress, bytes4[] memory _functionSelectors) internal { - require(_functionSelectors.length > 0, "LibDiamondCut: No selectors in facet to cut"); - DiamondStorage storage ds = diamondStorage(); - require(_facetAddress != address(0), "LibDiamondCut: Add facet can't be address(0)"); - uint96 selectorPosition = uint96(ds.facetFunctionSelectors[_facetAddress].functionSelectors.length); - // add new facet address if it does not exist - if (selectorPosition == 0) { - addFacet(ds, _facetAddress); - } - for (uint256 selectorIndex; selectorIndex < _functionSelectors.length; selectorIndex++) { - bytes4 selector = _functionSelectors[selectorIndex]; - address oldFacetAddress = ds.selectorToFacetAndPosition[selector].facetAddress; - require(oldFacetAddress != _facetAddress, "LibDiamondCut: Can't replace function with same function"); - removeFunction(ds, oldFacetAddress, selector); - addFunction(ds, selector, selectorPosition, _facetAddress); - selectorPosition++; - } - } - - function removeFunctions(address _facetAddress, bytes4[] memory _functionSelectors) internal { - require(_functionSelectors.length > 0, "LibDiamondCut: No selectors in facet to cut"); - DiamondStorage storage ds = diamondStorage(); - // if function does not exist then do nothing and return - require(_facetAddress == address(0), "LibDiamondCut: Remove facet address must be address(0)"); - for (uint256 selectorIndex; selectorIndex < _functionSelectors.length; selectorIndex++) { - bytes4 selector = _functionSelectors[selectorIndex]; - address oldFacetAddress = ds.selectorToFacetAndPosition[selector].facetAddress; - removeFunction(ds, oldFacetAddress, selector); - } - } - - function addFacet(DiamondStorage storage ds, address _facetAddress) internal { - enforceHasContractCode(_facetAddress, "LibDiamondCut: New facet has no code"); - ds.facetFunctionSelectors[_facetAddress].facetAddressPosition = ds.facetAddresses.length; - ds.facetAddresses.push(_facetAddress); - } - - function addFunction( - DiamondStorage storage ds, - bytes4 _selector, - uint96 _selectorPosition, - address _facetAddress - ) internal { - ds.selectorToFacetAndPosition[_selector].functionSelectorPosition = _selectorPosition; - ds.facetFunctionSelectors[_facetAddress].functionSelectors.push(_selector); - ds.selectorToFacetAndPosition[_selector].facetAddress = _facetAddress; - } - - function removeFunction(DiamondStorage storage ds, address _facetAddress, bytes4 _selector) internal { - require(_facetAddress != address(0), "LibDiamondCut: Can't remove function that doesn't exist"); - // an immutable function is a function defined directly in a diamond - require(_facetAddress != address(this), "LibDiamondCut: Can't remove immutable function"); - // replace selector with last selector, then delete last selector - uint256 selectorPosition = ds.selectorToFacetAndPosition[_selector].functionSelectorPosition; - uint256 lastSelectorPosition = ds.facetFunctionSelectors[_facetAddress].functionSelectors.length - 1; - // if not the same then replace _selector with lastSelector - if (selectorPosition != lastSelectorPosition) { - bytes4 lastSelector = ds.facetFunctionSelectors[_facetAddress].functionSelectors[lastSelectorPosition]; - ds.facetFunctionSelectors[_facetAddress].functionSelectors[selectorPosition] = lastSelector; - ds.selectorToFacetAndPosition[lastSelector].functionSelectorPosition = uint96(selectorPosition); - } - // delete the last selector - ds.facetFunctionSelectors[_facetAddress].functionSelectors.pop(); - delete ds.selectorToFacetAndPosition[_selector]; - - // if no more selectors for facet address then delete the facet address - if (lastSelectorPosition == 0) { - // replace facet address with last facet address and delete last facet address - uint256 lastFacetAddressPosition = ds.facetAddresses.length - 1; - uint256 facetAddressPosition = ds.facetFunctionSelectors[_facetAddress].facetAddressPosition; - if (facetAddressPosition != lastFacetAddressPosition) { - address lastFacetAddress = ds.facetAddresses[lastFacetAddressPosition]; - ds.facetAddresses[facetAddressPosition] = lastFacetAddress; - ds.facetFunctionSelectors[lastFacetAddress].facetAddressPosition = facetAddressPosition; - } - ds.facetAddresses.pop(); - delete ds.facetFunctionSelectors[_facetAddress].facetAddressPosition; - } - } - - function initializeDiamondCut(address _init, bytes memory _calldata) internal { - if (_init == address(0)) { - return; - } - enforceHasContractCode(_init, "LibDiamondCut: _init address has no code"); - (bool success, bytes memory error) = _init.delegatecall(_calldata); - if (!success) { - if (error.length > 0) { - // bubble up error - /// @solidity memory-safe-assembly - assembly { - let returndata_size := mload(error) - revert(add(32, error), returndata_size) - } - } else { - revert InitializationFunctionReverted(_init, _calldata); - } - } - } - - function enforceHasContractCode(address _contract, string memory _errorMessage) internal view { - uint256 contractSize; - assembly { - contractSize := extcodesize(_contract) - } - require(contractSize > 0, _errorMessage); - } -} diff --git a/contracts/Diamond/libraries/LibExponentialNoError.sol b/contracts/Diamond/libraries/LibExponentialNoError.sol deleted file mode 100644 index d4a7e8588..000000000 --- a/contracts/Diamond/libraries/LibExponentialNoError.sol +++ /dev/null @@ -1,195 +0,0 @@ -pragma solidity 0.8.13; - -/** - * @title Exponential module for storing fixed-precision decimals - * @author Compound - * @notice Exp is a struct which stores decimals with a fixed precision of 18 decimal places. - * Thus, if we wanted to store the 5.1, mantissa would store 5.1e18. That is: - * `Exp({mantissa: 5100000000000000000})`. - */ -library LibExponentialNoError { - uint internal constant expScale = 1e18; - uint internal constant doubleScale = 1e36; - uint internal constant halfExpScale = expScale / 2; - uint internal constant mantissaOne = expScale; - - struct Exp { - uint mantissa; - } - - struct Double { - uint mantissa; - } - - /** - * @dev Truncates the given exp to a whole number value. - * For example, truncate(Exp{mantissa: 15 * expScale}) = 15 - */ - function truncate(Exp memory exp) internal pure returns (uint) { - // Note: We are not using careful math here as we're performing a division that cannot fail - return exp.mantissa / expScale; - } - - /** - * @dev Multiply an Exp by a scalar, then truncate to return an unsigned integer. - */ - function mul_ScalarTruncate(Exp memory a, uint scalar) internal pure returns (uint) { - Exp memory product = mul_(a, scalar); - return truncate(product); - } - - /** - * @dev Multiply an Exp by a scalar, truncate, then add an to an unsigned integer, returning an unsigned integer. - */ - function mul_ScalarTruncateAddUInt(Exp memory a, uint scalar, uint addend) internal pure returns (uint) { - Exp memory product = mul_(a, scalar); - return add_(truncate(product), addend); - } - - /** - * @dev Checks if first Exp is less than second Exp. - */ - function lessThanExp(Exp memory left, Exp memory right) internal pure returns (bool) { - return left.mantissa < right.mantissa; - } - - /** - * @dev Checks if left Exp <= right Exp. - */ - function lessThanOrEqualExp(Exp memory left, Exp memory right) internal pure returns (bool) { - return left.mantissa <= right.mantissa; - } - - /** - * @dev Checks if left Exp > right Exp. - */ - function greaterThanExp(Exp memory left, Exp memory right) internal pure returns (bool) { - return left.mantissa > right.mantissa; - } - - /** - * @dev returns true if Exp is exactly zero - */ - function isZeroExp(Exp memory value) internal pure returns (bool) { - return value.mantissa == 0; - } - - function safe224(uint n, string memory errorMessage) internal pure returns (uint224) { - require(n < 2 ** 224, errorMessage); - return uint224(n); - } - - function safe32(uint n, string memory errorMessage) internal pure returns (uint32) { - require(n < 2 ** 32, errorMessage); - return uint32(n); - } - - function add_(Exp memory a, Exp memory b) internal pure returns (Exp memory) { - return Exp({ mantissa: add_(a.mantissa, b.mantissa) }); - } - - function add_(Double memory a, Double memory b) internal pure returns (Double memory) { - return Double({ mantissa: add_(a.mantissa, b.mantissa) }); - } - - function add_(uint a, uint b) internal pure returns (uint) { - return add_(a, b, "addition overflow"); - } - - function add_(uint a, uint b, string memory errorMessage) internal pure returns (uint) { - uint c = a + b; - require(c >= a, errorMessage); - return c; - } - - function sub_(Exp memory a, Exp memory b) internal pure returns (Exp memory) { - return Exp({ mantissa: sub_(a.mantissa, b.mantissa) }); - } - - function sub_(Double memory a, Double memory b) internal pure returns (Double memory) { - return Double({ mantissa: sub_(a.mantissa, b.mantissa) }); - } - - function sub_(uint a, uint b) internal pure returns (uint) { - return sub_(a, b, "subtraction underflow"); - } - - function sub_(uint a, uint b, string memory errorMessage) internal pure returns (uint) { - require(b <= a, errorMessage); - return a - b; - } - - function mul_(Exp memory a, Exp memory b) internal pure returns (Exp memory) { - return Exp({ mantissa: mul_(a.mantissa, b.mantissa) / expScale }); - } - - function mul_(Exp memory a, uint b) internal pure returns (Exp memory) { - return Exp({ mantissa: mul_(a.mantissa, b) }); - } - - function mul_(uint a, Exp memory b) internal pure returns (uint) { - return mul_(a, b.mantissa) / expScale; - } - - function mul_(Double memory a, Double memory b) internal pure returns (Double memory) { - return Double({ mantissa: mul_(a.mantissa, b.mantissa) / doubleScale }); - } - - function mul_(Double memory a, uint b) internal pure returns (Double memory) { - return Double({ mantissa: mul_(a.mantissa, b) }); - } - - function mul_(uint a, Double memory b) internal pure returns (uint) { - return mul_(a, b.mantissa) / doubleScale; - } - - function mul_(uint a, uint b) internal pure returns (uint) { - return mul_(a, b, "multiplication overflow"); - } - - function mul_(uint a, uint b, string memory errorMessage) internal pure returns (uint) { - if (a == 0 || b == 0) { - return 0; - } - uint c = a * b; - require(c / a == b, errorMessage); - return c; - } - - function div_(Exp memory a, Exp memory b) internal pure returns (Exp memory) { - return Exp({ mantissa: div_(mul_(a.mantissa, expScale), b.mantissa) }); - } - - function div_(Exp memory a, uint b) internal pure returns (Exp memory) { - return Exp({ mantissa: div_(a.mantissa, b) }); - } - - function div_(uint a, Exp memory b) internal pure returns (uint) { - return div_(mul_(a, expScale), b.mantissa); - } - - function div_(Double memory a, Double memory b) internal pure returns (Double memory) { - return Double({ mantissa: div_(mul_(a.mantissa, doubleScale), b.mantissa) }); - } - - function div_(Double memory a, uint b) internal pure returns (Double memory) { - return Double({ mantissa: div_(a.mantissa, b) }); - } - - function div_(uint a, Double memory b) internal pure returns (uint) { - return div_(mul_(a, doubleScale), b.mantissa); - } - - function div_(uint a, uint b) internal pure returns (uint) { - return div_(a, b, "divide by zero"); - } - - function div_(uint a, uint b, string memory errorMessage) internal pure returns (uint) { - require(b > 0, errorMessage); - return a / b; - } - - function fraction(uint a, uint b) internal pure returns (Double memory) { - return Double({ mantissa: div_(mul_(a, doubleScale), b) }); - } -} diff --git a/contracts/Diamond/libraries/appStorage.sol b/contracts/Diamond/libraries/appStorage.sol deleted file mode 100644 index f8ba0e232..000000000 --- a/contracts/Diamond/libraries/appStorage.sol +++ /dev/null @@ -1,173 +0,0 @@ -pragma solidity 0.8.13; - -import "../../Tokens/V0.8.13/VTokens/VToken.sol"; -import "../../Oracle/V0.8.13/PriceOracle.sol"; -import "../../Tokens/V0.8.13/VAI/VAIControllerInterface.sol"; -import "../../Comptroller/V0.8.13/ComptrollerLensInterface.sol"; - -struct Market { - /// @notice Whether or not this market is listed - bool isListed; - /** - * @notice Multiplier representing the most one can borrow against their collateral in this market. - * For instance, 0.9 to allow borrowing 90% of collateral value. - * Must be between 0 and 1, and stored as a mantissa. - */ - uint collateralFactorMantissa; - /// @notice Per-market mapping of "accounts in this asset" - mapping(address => bool) accountMembership; - /// @notice Whether or not this market receives XVS - bool isVenus; -} - -struct VenusMarketState { - /// @notice The market's last updated venusBorrowIndex or venusSupplyIndex - uint224 index; - /// @notice The block number the index was last updated at - uint block; -} - -struct AppStorage { - /** - * @notice Administrator for this contract - */ - address admin; - /** - * @notice Pending administrator for this contract - */ - address pendingAdmin; - /** - * @notice Active brains of Unitroller - */ - address comptrollerImplementation; - /** - * @notice Pending brains of Unitroller - */ - address pendingComptrollerImplementation; - /** - * @notice Oracle which gives the price of any given asset - */ - PriceOracle oracle; - /** - * @notice Multiplier used to calculate the maximum repayAmount when liquidating a borrow - */ - uint closeFactorMantissa; - /** - * @notice Multiplier representing the discount on collateral that a liquidator receives - */ - uint liquidationIncentiveMantissa; - /** - * @notice Max number of assets a single account can participate in (borrow or use as collateral) - */ - uint maxAssets; - /** - * @notice Per-account mapping of "assets you are in", capped by maxAssets - */ - mapping(address => VToken[]) accountAssets; - /** - * @notice Official mapping of vTokens -> Market metadata - * @dev Used e.g. to determine if a market is supported - */ - mapping(address => Market) markets; - /** - * @notice The Pause Guardian can pause certain actions as a safety mechanism. - */ - address pauseGuardian; - /// @notice Whether minting is paused (deprecated, superseded by actionPaused) - bool _mintGuardianPaused; - /// @notice Whether borrowing is paused (deprecated, superseded by actionPaused) - bool _borrowGuardianPaused; - /// @notice Whether borrowing is paused (deprecated, superseded by actionPaused) - bool transferGuardianPaused; - /// @notice Whether borrowing is paused (deprecated, superseded by actionPaused) - bool seizeGuardianPaused; - /// @notice Whether borrowing is paused (deprecated, superseded by actionPaused) - mapping(address => bool) mintGuardianPaused; - /// @notice Whether borrowing is paused (deprecated, superseded by actionPaused) - mapping(address => bool) borrowGuardianPaused; - /// @notice A list of all markets - VToken[] allMarkets; - /// @notice The rate at which the flywheel distributes XVS, per block - uint venusRate; - /// @notice The portion of venusRate that each market currently receives - mapping(address => uint) venusSpeeds; - /// @notice The Venus market supply state for each market - mapping(address => VenusMarketState) venusSupplyState; - /// @notice The Venus market borrow state for each market - mapping(address => VenusMarketState) venusBorrowState; - /// @notice The Venus supply index for each market for each supplier as of the last time they accrued XVS - mapping(address => mapping(address => uint)) venusSupplierIndex; - /// @notice The Venus borrow index for each market for each borrower as of the last time they accrued XVS - mapping(address => mapping(address => uint)) venusBorrowerIndex; - /// @notice The XVS accrued but not yet transferred to each user - mapping(address => uint) venusAccrued; - /// @notice The Address of VAIController - VAIControllerInterface vaiController; - /// @notice The minted VAI amount to each user - mapping(address => uint) mintedVAIs; - /// @notice VAI Mint Rate as a percentage - uint vaiMintRate; - /** - * @notice The Pause Guardian can pause certain actions as a safety mechanism. - */ - bool mintVAIGuardianPaused; - bool repayVAIGuardianPaused; - /** - * @notice Pause/Unpause whole protocol actions - */ - bool protocolPaused; - /// @notice The rate at which the flywheel distributes XVS to VAI Minters, per block (deprecated) - uint venusVAIRate; - /// @notice The rate at which the flywheel distributes XVS to VAI Vault, per block - /// @notice The rate at which the flywheel distributes XVS to VAI Vault, per block - uint venusVAIVaultRate; - // address of VAI Vault - address vaiVaultAddress; - // start block of release to VAI Vault - uint256 releaseStartBlock; - // minimum release amount to VAI Vault - uint256 minReleaseAmount; - /// @notice The borrowCapGuardian can set borrowCaps to any number for any market. Lowering the borrow cap could disable borrowing on the given market. - address borrowCapGuardian; - /// @notice Borrow caps enforced by borrowAllowed for each vToken address. Defaults to zero which corresponds to unlimited borrowing. - mapping(address => uint) borrowCaps; - /// @notice Treasury Guardian address - address treasuryGuardian; - /// @notice Treasury address - address treasuryAddress; - /// @notice Fee percent of accrued interest with decimal 18 - uint256 treasuryPercent; - /// @notice The portion of XVS that each contributor receives per block (deprecated) - mapping(address => uint) venusContributorSpeeds; - /// @notice Last block at which a contributor's XVS rewards have been allocated (deprecated) - mapping(address => uint) lastContributorBlock; - address liquidatorContract; - ComptrollerLensInterface comptrollerLens; - /// @notice Supply caps enforced by mintAllowed for each vToken address. Defaults to zero which corresponds to minting notAllowed - mapping(address => uint256) supplyCaps; - /// @notice AccessControlManager address - address accessControl; - /// @notice True if a certain action is paused on a certain market - mapping(address => mapping(uint => bool)) _actionPaused; - /// @notice The rate at which venus is distributed to the corresponding borrow market (per block) - /// @notice The rate at which venus is distributed to the corresponding borrow market (per block) - mapping(address => uint) venusBorrowSpeeds; - /// @notice The rate at which venus is distributed to the corresponding supply market (per block) - mapping(address => uint) venusSupplySpeeds; - /// @notice Address of the XVS token. - address XVSAddress; - /// @notice Address of the VAI token. - address VAIAddress; -} - -library LibAppStorage { - function diamondStorage() internal pure returns (AppStorage storage ds) { - assembly { - ds.slot := 0 - } - } - - function abs(int256 x) internal pure returns (uint256) { - return uint256(x >= 0 ? x : -x); - } -} diff --git a/contracts/Diamond/upgradeInitialize/DiamondInit.sol b/contracts/Diamond/upgradeInitialize/DiamondInit.sol deleted file mode 100644 index 2ce94e2cb..000000000 --- a/contracts/Diamond/upgradeInitialize/DiamondInit.sol +++ /dev/null @@ -1,63 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity 0.8.13; - -/******************************************************************************\ - -* Author: Nick Mudge (https://twitter.com/mudgen) - -* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535 - -* - -* Implementation of a diamond. - -/******************************************************************************/ - -import { LibDiamond } from "../libraries/LibDiamond.sol"; - -import { IDiamondLoupe } from "../interfaces/IDiamondLoupe.sol"; - -import { IDiamondCut } from "../interfaces/IDiamondCut.sol"; - -import { IMarketFacet } from "../interfaces/IMarketFacet.sol"; - -import { IPolicyFacet } from "../interfaces/IPolicyFacet.sol"; - -// It is expected that this contract is customized if you want to deploy your diamond - -// with data from a deployment script. Use the init function to initialize state variables - -// of your diamond. Add parameters to the init function if you need to. - -contract DiamondInit { - // You can add parameters to this function in order to pass in - - // data to set your own state variables - - function init() external { - // adding ERC165 data - - LibDiamond.DiamondStorage storage ds = LibDiamond.diamondStorage(); - - ds.supportedInterfaces[type(IMarketFacet).interfaceId] = true; - - ds.supportedInterfaces[type(IDiamondCut).interfaceId] = true; - - ds.supportedInterfaces[type(IDiamondLoupe).interfaceId] = true; - - ds.supportedInterfaces[type(IPolicyFacet).interfaceId] = true; - - // add your own state variables - - // EIP-2535 specifies that the `diamondCut` function takes two optional - - // arguments: address _init and bytes calldata _calldata - - // These arguments are used to execute an arbitrary function using delegatecall - - // in order to set state variables in the diamond during deployment or an upgrade - - // More info here: https://eips.ethereum.org/EIPS/eip-2535#diamond-interface - } -} From d4d5f30c4ce4e48f6e7aec91fac32d070f2a1d71 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Wed, 3 May 2023 16:20:15 +0530 Subject: [PATCH 074/153] refactor: deployment script for diamond proxy. --- contracts/Comptroller/ComptrollerStorage.sol | 18 ++++++++ contracts/Comptroller/Diamond/Diamond.sol | 9 +--- .../Diamond/facets/PolicyFacet.sol | 13 +----- .../Diamond/facets/SetterFacet.sol | 6 +-- .../Diamond/interfaces/IRewardFacet.sol | 4 +- .../Diamond/interfaces/ISetterFacet.sol | 8 +--- script/diamond/deploy.js | 43 ++++++------------- tests/hardhat/Fork/diamondTest.ts | 2 +- 8 files changed, 40 insertions(+), 63 deletions(-) diff --git a/contracts/Comptroller/ComptrollerStorage.sol b/contracts/Comptroller/ComptrollerStorage.sol index 491ba8615..ad54ea80f 100644 --- a/contracts/Comptroller/ComptrollerStorage.sol +++ b/contracts/Comptroller/ComptrollerStorage.sol @@ -234,3 +234,21 @@ contract ComptrollerV11Storage is ComptrollerV10Storage { //mapping(address borrower => mapping (address delegate => bool approved)) public approvedDelegates; mapping(address => mapping(address => bool)) public approvedDelegates; } + +contract ComptrollerV12Storage is ComptrollerV11Storage { + struct FacetAddressAndPosition { + address facetAddress; + uint96 functionSelectorPosition; // position in facetFunctionSelectors.functionSelectors array + } + + struct FacetFunctionSelectors { + bytes4[] functionSelectors; + uint256 facetAddressPosition; // position of facetAddress in facetAddresses array + } + + mapping(bytes4 => FacetAddressAndPosition) public selectorToFacetAndPosition; + // maps facet addresses to function selectors + mapping(address => FacetFunctionSelectors) public facetFunctionSelectors; + // facet addresses + address[] public facetAddresses; +} diff --git a/contracts/Comptroller/Diamond/Diamond.sol b/contracts/Comptroller/Diamond/Diamond.sol index 0d76ee6ac..a1ea0f45c 100644 --- a/contracts/Comptroller/Diamond/Diamond.sol +++ b/contracts/Comptroller/Diamond/Diamond.sol @@ -90,15 +90,10 @@ contract Diamond is ComptrollerV12Storage { facetAddresses.push(_facetAddress); } - function addFunction( - bytes4 _selector, - uint96 _selectorPosition, - address _facetAddress - ) internal { + function addFunction(bytes4 _selector, uint96 _selectorPosition, address _facetAddress) internal { selectorToFacetAndPosition[_selector].functionSelectorPosition = _selectorPosition; facetFunctionSelectors[_facetAddress].functionSelectors.push(_selector); selectorToFacetAndPosition[_selector].facetAddress = _facetAddress; - } function removeFunction(address _facetAddress, bytes4 _selector) internal { @@ -143,7 +138,7 @@ contract Diamond is ComptrollerV12Storage { // Find facet for function that is called and execute the // function if a facet is found and return any value. - function() external payable { + function() external payable { address facet = selectorToFacetAndPosition[msg.sig].facetAddress; console.log("--------------------facetAddress", facet); require(facet != address(0), "Diamond: Function does not exist"); diff --git a/contracts/Comptroller/Diamond/facets/PolicyFacet.sol b/contracts/Comptroller/Diamond/facets/PolicyFacet.sol index 4930ffd19..d8971071e 100644 --- a/contracts/Comptroller/Diamond/facets/PolicyFacet.sol +++ b/contracts/Comptroller/Diamond/facets/PolicyFacet.sol @@ -215,12 +215,7 @@ contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError, FacetHelpe } /* The borrower must have shortfall in order to be liquidatable */ - (Error err, , uint shortfall) = getHypotheticalAccountLiquidityInternal( - borrower, - VToken(address(0)), - 0, - 0 - ); + (Error err, , uint shortfall) = getHypotheticalAccountLiquidityInternal(borrower, VToken(address(0)), 0, 0); if (err != Error.NO_ERROR) { return uint(err); } @@ -368,11 +363,7 @@ contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError, FacetHelpe * @param supplySpeeds New XVS speed for supply * @param borrowSpeeds New XVS speed for borrow */ - function _setVenusSpeeds( - VToken[] memory vTokens, - uint[] memory supplySpeeds, - uint[] memory borrowSpeeds - ) public { + function _setVenusSpeeds(VToken[] memory vTokens, uint[] memory supplySpeeds, uint[] memory borrowSpeeds) public { ensureAdminOr(comptrollerImplementation); uint numTokens = vTokens.length; diff --git a/contracts/Comptroller/Diamond/facets/SetterFacet.sol b/contracts/Comptroller/Diamond/facets/SetterFacet.sol index 587c637d4..677c651af 100644 --- a/contracts/Comptroller/Diamond/facets/SetterFacet.sol +++ b/contracts/Comptroller/Diamond/facets/SetterFacet.sol @@ -269,11 +269,7 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetHelpe * @param actions List of action ids to pause/unpause * @param paused The new paused state (true=paused, false=unpaused) */ - function _setActionsPaused( - address[] memory markets, - Action[] memory actions, - bool paused - ) public { + function _setActionsPaused(address[] memory markets, Action[] memory actions, bool paused) public { ensureAllowed("_setActionsPaused(address[],uint256[],bool)"); uint256 numMarkets = markets.length; diff --git a/contracts/Comptroller/Diamond/interfaces/IRewardFacet.sol b/contracts/Comptroller/Diamond/interfaces/IRewardFacet.sol index 9ba06aabf..76eca54ad 100644 --- a/contracts/Comptroller/Diamond/interfaces/IRewardFacet.sol +++ b/contracts/Comptroller/Diamond/interfaces/IRewardFacet.sol @@ -24,7 +24,7 @@ interface IRewardFacet { function claimVenusAsCollateral(address holder) external; - function _grantXVS(address recipient, uint amount) external ; + function _grantXVS(address recipient, uint amount) external; function getBlockNumber() external view returns (uint); @@ -43,4 +43,4 @@ interface IRewardFacet { bool suppliers, bool collateral ) external; -} \ No newline at end of file +} diff --git a/contracts/Comptroller/Diamond/interfaces/ISetterFacet.sol b/contracts/Comptroller/Diamond/interfaces/ISetterFacet.sol index e1d8d72a3..2e79c02d6 100644 --- a/contracts/Comptroller/Diamond/interfaces/ISetterFacet.sol +++ b/contracts/Comptroller/Diamond/interfaces/ISetterFacet.sol @@ -37,11 +37,7 @@ interface ISetterFacet { function _setProtocolPaused(bool state) external returns (bool); - function _setActionsPaused( - address[] calldata markets, - Action[] calldata actions, - bool paused - ) external; + function _setActionsPaused(address[] calldata markets, Action[] calldata actions, bool paused) external; function _setVAIController(VAIControllerInterface vaiController_) external returns (uint); @@ -60,4 +56,4 @@ interface ISetterFacet { function _setVenusVAIVaultRate(uint venusVAIVaultRate_) external; function _setVAIVaultInfo(address vault_, uint256 releaseStartBlock_, uint256 minReleaseAmount_) external; -} \ No newline at end of file +} diff --git a/script/diamond/deploy.js b/script/diamond/deploy.js index 313e3b17d..417db465a 100644 --- a/script/diamond/deploy.js +++ b/script/diamond/deploy.js @@ -9,46 +9,32 @@ const ethers = hre.ethers; const Owner = "0x939bd8d64c0a9583a7dcea9933f7b21697ab6396"; -async function deployFacets(unitrollerAddress) { - const accounts = await ethers.getSigners(); - const contractOwner = accounts[0]; - - // deploy DiamondCutFacet - const DiamondCutFacet = await ethers.getContractFactory("DiamondCutFacet"); - const diamondCutFacet = await DiamondCutFacet.deploy(); - await diamondCutFacet.deployed(); - +async function deployFacets() { // deploy Diamond const Diamond = await ethers.getContractFactory("Diamond"); - const diamond = await Diamond.deploy(contractOwner.address, unitrollerAddress); + const diamond = await Diamond.deploy(); await diamond.deployed(); - // deploy DiamondInit - // DiamondInit provides a function that is called when the diamond is upgraded to initialize state variables - // Read about how the diamondCut function works here: https://eips.ethereum.org/EIPS/eip-2535#addingreplacingremoving-functions - const DiamondInit = await ethers.getContractFactory("DiamondInit"); - const diamondInit = await DiamondInit.deploy(); - await diamondInit.deployed(); - // deploy facets - const FacetNames = ["DiamondLoupeFacet", "MarketFacet", "PolicyFacet", "RewardFacet", "SetterFacet"]; + const FacetNames = ["MarketFacet", "PolicyFacet", "RewardFacet", "SetterFacet"]; const cut = []; + for (const FacetName of FacetNames) { const Facet = await ethers.getContractFactory(FacetName); const facet = await Facet.deploy(); await facet.deployed(); + const FacetInterface = await ethers.getContractAt(`I${FacetName}`, facet.address); + cut.push({ facetAddress: facet.address, action: FacetCutAction.Add, - functionSelectors: getSelectors(facet), + functionSelectors: getSelectors(FacetInterface), }); } return { - diamondCutFacet, diamond, - diamondInit, cut, }; } @@ -68,25 +54,20 @@ async function deployDiamond(unitrollerAddress) { unitrollerAdmin = signer[0]; } - const { diamondCutFacet, diamond, diamondInit, cut } = await deployFacets(unitroller.address); + const { diamond, cut } = await deployFacets(unitroller.address); await unitroller.connect(unitrollerAdmin)._setPendingImplementation(diamond.address); - await diamond.connect(unitrollerAdmin)._become(); - - const compProxy = await ethers.getContractAt("Diamond", unitroller.address); - - await compProxy.connect(unitrollerAdmin).facetCutInitilizer(diamondCutFacet.address); + await diamond.connect(unitrollerAdmin)._become(unitroller.address); // upgrade diamond with facets const diamondCut = await ethers.getContractAt("IDiamondCut", unitroller.address); - // call to init function - const functionCall = diamondInit.interface.encodeFunctionData("init"); - const tx = await diamondCut.connect(unitrollerAdmin).diamondCut(cut, diamondInit.address, functionCall); + + const tx = await diamondCut.connect(unitrollerAdmin).diamondCut(cut); const receipt = await tx.wait(); if (!receipt.status) { throw Error(`Diamond upgrade failed: ${tx.hash}`); } - return { unitroller, diamond, cut, diamondInit, diamondCutFacet }; + return { unitroller, diamond, cut }; } // We recommend this pattern to be able to use async/await everywhere diff --git a/tests/hardhat/Fork/diamondTest.ts b/tests/hardhat/Fork/diamondTest.ts index 0323f6b25..1bb4bead1 100644 --- a/tests/hardhat/Fork/diamondTest.ts +++ b/tests/hardhat/Fork/diamondTest.ts @@ -123,7 +123,7 @@ forking(26713742, () => { [vBUSD, vUSDT] = await Promise.all( [VBUSD, VUSDT].map((address: string) => { - return ethers.getContractAt("contracts/Tokens/V0.8.13/VTokens/VBep20Delegate.sol:VBep20Delegate", address); + return ethers.getContractAt("contracts/Tokens/VTokens/VBep20Delegate.sol:VBep20Delegate", address); }), ); [BUSD, USDT] = await Promise.all( From 50ecc1bcd2b9d9ee38220303f5c835f18ac1e37b Mon Sep 17 00:00:00 2001 From: defcon022 Date: Wed, 3 May 2023 17:46:04 +0530 Subject: [PATCH 075/153] refactor: removed consoles. --- contracts/Comptroller/Diamond/Diamond.sol | 4 ---- contracts/Comptroller/Diamond/facets/MarketFacet.sol | 4 ++++ contracts/Comptroller/Diamond/facets/SetterFacet.sol | 2 -- contracts/Comptroller/Diamond/interfaces/IMarketFacet.sol | 3 +++ 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/contracts/Comptroller/Diamond/Diamond.sol b/contracts/Comptroller/Diamond/Diamond.sol index a1ea0f45c..0c800f4f4 100644 --- a/contracts/Comptroller/Diamond/Diamond.sol +++ b/contracts/Comptroller/Diamond/Diamond.sol @@ -5,14 +5,12 @@ import { IDiamondCut } from "./interfaces/IDiamondCut.sol"; import "../ComptrollerStorage.sol"; import "../Unitroller.sol"; -import "hardhat/console.sol"; contract Diamond is ComptrollerV12Storage { event DiamondCut(IDiamondCut.FacetCut[] _diamondCut); function _become(Unitroller unitroller) public { require(msg.sender == unitroller.admin(), "only unitroller admin can"); - console.log("-------------------become"); require(unitroller._acceptImplementation() == 0, "not authorized"); } @@ -48,7 +46,6 @@ contract Diamond is ComptrollerV12Storage { for (uint256 selectorIndex; selectorIndex < _functionSelectors.length; selectorIndex++) { bytes4 selector = _functionSelectors[selectorIndex]; address oldFacetAddress = selectorToFacetAndPosition[selector].facetAddress; - console.log("-------------selector", oldFacetAddress, selectorIndex); require(oldFacetAddress == address(0), "LibDiamondCut: Can't add function that already exists"); addFunction(selector, selectorPosition, _facetAddress); selectorPosition++; @@ -140,7 +137,6 @@ contract Diamond is ComptrollerV12Storage { // function if a facet is found and return any value. function() external payable { address facet = selectorToFacetAndPosition[msg.sig].facetAddress; - console.log("--------------------facetAddress", facet); require(facet != address(0), "Diamond: Function does not exist"); // Execute public function from facet using delegatecall and return any value. assembly { diff --git a/contracts/Comptroller/Diamond/facets/MarketFacet.sol b/contracts/Comptroller/Diamond/facets/MarketFacet.sol index d5e7acd5c..dc153b3d0 100644 --- a/contracts/Comptroller/Diamond/facets/MarketFacet.sol +++ b/contracts/Comptroller/Diamond/facets/MarketFacet.sol @@ -15,6 +15,10 @@ contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError, FacetHelpe return true; } + function getAssetsIn(address account) external view returns (VToken[] memory) { + return accountAssets[account]; + } + /** * @notice Calculate number of tokens of collateral asset to seize given an underlying amount * @dev Used in liquidation (called in vToken.liquidateBorrowFresh) diff --git a/contracts/Comptroller/Diamond/facets/SetterFacet.sol b/contracts/Comptroller/Diamond/facets/SetterFacet.sol index 677c651af..a81bd2251 100644 --- a/contracts/Comptroller/Diamond/facets/SetterFacet.sol +++ b/contracts/Comptroller/Diamond/facets/SetterFacet.sol @@ -5,7 +5,6 @@ import "../../../Tokens/VTokens/VToken.sol"; import "../../../Utils/ErrorReporter.sol"; import "../../../Governance/IAccessControlManager.sol"; import "./FacetHelper.sol"; -import "hardhat/console.sol"; contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetHelper { /// @notice Emitted when close factor is changed by admin @@ -219,7 +218,6 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetHelpe */ function _setMarketBorrowCaps(VToken[] memory vTokens, uint[] memory newBorrowCaps) public { ensureAllowed("_setMarketBorrowCaps(address[],uint256[])"); - console.log("------------------kitani baar chala"); uint numMarkets = vTokens.length; uint numBorrowCaps = newBorrowCaps.length; diff --git a/contracts/Comptroller/Diamond/interfaces/IMarketFacet.sol b/contracts/Comptroller/Diamond/interfaces/IMarketFacet.sol index 49dd94d9b..0ee9a495b 100644 --- a/contracts/Comptroller/Diamond/interfaces/IMarketFacet.sol +++ b/contracts/Comptroller/Diamond/interfaces/IMarketFacet.sol @@ -1,6 +1,7 @@ pragma solidity 0.5.16; import "../../../Tokens/VTokens/VToken.sol"; +import "../../../Oracle/PriceOracle.sol"; interface IMarketFacet { function isComptroller() external pure returns (bool); @@ -18,4 +19,6 @@ interface IMarketFacet { function exitMarket(address vToken) external returns (uint); function _supportMarket(VToken vToken) external returns (uint); + + function getAssetsIn(address account) external view returns (VToken[] memory); } From 5c4dcb914d40f461a39f47a17776f72c2fc4261f Mon Sep 17 00:00:00 2001 From: defcon022 Date: Wed, 3 May 2023 18:04:13 +0530 Subject: [PATCH 076/153] refactor: removed all 0.8.13 version files. --- contracts/Comptroller/Diamond/Diamond.sol | 1 - .../V0.8.13/ComptrollerInterface.sol | 159 -- .../V0.8.13/ComptrollerLensInterface.sol | 26 - .../V0.8.13/IAccessControlManager.sol | 35 - .../V0.8.13/InterestRateModel.sol | 34 - contracts/Oracle/V0.8.13/PriceOracle.sol | 16 - contracts/Tokens/V0.8.13/EIP20Interface.sol | 63 - .../V0.8.13/EIP20NonStandardInterface.sol | 68 - .../V0.8.13/VAI/VAIControllerInterface.sol | 27 - contracts/Tokens/V0.8.13/VTokens/VBep20.sol | 253 --- .../Tokens/V0.8.13/VTokens/VBep20Delegate.sol | 43 - contracts/Tokens/V0.8.13/VTokens/VToken.sol | 1659 ----------------- .../V0.8.13/VTokens/VTokenInterfaces.sol | 353 ---- contracts/Utils/V0.8.13/Address.sol | 73 - contracts/Utils/V0.8.13/CarefulMath.sol | 84 - contracts/Utils/V0.8.13/Context.sol | 26 - contracts/Utils/V0.8.13/ECDSA.sol | 103 - contracts/Utils/V0.8.13/ErrorReporter.sol | 282 --- contracts/Utils/V0.8.13/Exponential.sol | 181 -- .../Utils/V0.8.13/ExponentialNoError.sol | 195 -- contracts/Utils/V0.8.13/IBEP20.sol | 76 - contracts/Utils/V0.8.13/Ownable.sol | 74 - contracts/Utils/V0.8.13/Owned.sol | 21 - contracts/Utils/V0.8.13/SafeBEP20.sol | 80 - contracts/Utils/V0.8.13/SafeCast.sol | 207 -- contracts/Utils/V0.8.13/SafeMath.sol | 163 -- contracts/Utils/V0.8.13/Tokenlock.sol | 28 - contracts/test/EvilXDelegator.sol | 84 +- contracts/test/Fauceteer.sol | 4 +- contracts/test/InterestRateModelHarness.sol | 8 +- contracts/test/VBep20MockDelegate.sol | 28 +- .../fork/vip-diamond-comptroller-mainnet.ts | 2 +- .../fork/vip-diamond-comptroller-testnet.ts | 4 +- .../hardhat/Comptroller/Diamond/XVSSpeeds.ts | 6 +- .../Comptroller/Diamond/accessControl.ts | 2 +- .../Comptroller/Diamond/assetListTest.ts | 4 +- .../Comptroller/Diamond/comptrollerTest.ts | 18 +- .../liquidateCalculateAmoutSeizeTest.ts | 4 +- .../hardhat/Comptroller/Diamond/pauseTest.ts | 4 +- 39 files changed, 84 insertions(+), 4414 deletions(-) delete mode 100644 contracts/Comptroller/V0.8.13/ComptrollerInterface.sol delete mode 100644 contracts/Comptroller/V0.8.13/ComptrollerLensInterface.sol delete mode 100644 contracts/Governance/V0.8.13/IAccessControlManager.sol delete mode 100644 contracts/InterestRateModels/V0.8.13/InterestRateModel.sol delete mode 100644 contracts/Oracle/V0.8.13/PriceOracle.sol delete mode 100644 contracts/Tokens/V0.8.13/EIP20Interface.sol delete mode 100644 contracts/Tokens/V0.8.13/EIP20NonStandardInterface.sol delete mode 100644 contracts/Tokens/V0.8.13/VAI/VAIControllerInterface.sol delete mode 100644 contracts/Tokens/V0.8.13/VTokens/VBep20.sol delete mode 100644 contracts/Tokens/V0.8.13/VTokens/VBep20Delegate.sol delete mode 100644 contracts/Tokens/V0.8.13/VTokens/VToken.sol delete mode 100644 contracts/Tokens/V0.8.13/VTokens/VTokenInterfaces.sol delete mode 100644 contracts/Utils/V0.8.13/Address.sol delete mode 100644 contracts/Utils/V0.8.13/CarefulMath.sol delete mode 100644 contracts/Utils/V0.8.13/Context.sol delete mode 100644 contracts/Utils/V0.8.13/ECDSA.sol delete mode 100644 contracts/Utils/V0.8.13/ErrorReporter.sol delete mode 100644 contracts/Utils/V0.8.13/Exponential.sol delete mode 100644 contracts/Utils/V0.8.13/ExponentialNoError.sol delete mode 100644 contracts/Utils/V0.8.13/IBEP20.sol delete mode 100644 contracts/Utils/V0.8.13/Ownable.sol delete mode 100644 contracts/Utils/V0.8.13/Owned.sol delete mode 100644 contracts/Utils/V0.8.13/SafeBEP20.sol delete mode 100644 contracts/Utils/V0.8.13/SafeCast.sol delete mode 100644 contracts/Utils/V0.8.13/SafeMath.sol delete mode 100644 contracts/Utils/V0.8.13/Tokenlock.sol diff --git a/contracts/Comptroller/Diamond/Diamond.sol b/contracts/Comptroller/Diamond/Diamond.sol index 0c800f4f4..dea4c9562 100644 --- a/contracts/Comptroller/Diamond/Diamond.sol +++ b/contracts/Comptroller/Diamond/Diamond.sol @@ -5,7 +5,6 @@ import { IDiamondCut } from "./interfaces/IDiamondCut.sol"; import "../ComptrollerStorage.sol"; import "../Unitroller.sol"; - contract Diamond is ComptrollerV12Storage { event DiamondCut(IDiamondCut.FacetCut[] _diamondCut); diff --git a/contracts/Comptroller/V0.8.13/ComptrollerInterface.sol b/contracts/Comptroller/V0.8.13/ComptrollerInterface.sol deleted file mode 100644 index 56eb0b190..000000000 --- a/contracts/Comptroller/V0.8.13/ComptrollerInterface.sol +++ /dev/null @@ -1,159 +0,0 @@ -pragma solidity 0.8.13; - -import "../../Tokens/V0.8.13/VTokens/VToken.sol"; -import "../../Oracle/V0.8.13/PriceOracle.sol"; - -abstract contract ComptrollerInterfaceG1 { - /// @notice Indicator that this is a Comptroller contract (for inspection) - bool public constant isComptroller = true; - - /*** Assets You Are In ***/ - - function enterMarkets(address[] calldata vTokens) external virtual returns (uint[] memory); - - function exitMarket(address vToken) external virtual returns (uint); - - /*** Policy Hooks ***/ - - function mintAllowed(address vToken, address minter, uint mintAmount) external virtual returns (uint); - - function mintVerify(address vToken, address minter, uint mintAmount, uint mintTokens) external virtual; - - function redeemAllowed(address vToken, address redeemer, uint redeemTokens) external virtual returns (uint); - - function redeemVerify(address vToken, address redeemer, uint redeemAmount, uint redeemTokens) external virtual; - - function borrowAllowed(address vToken, address borrower, uint borrowAmount) external virtual returns (uint); - - function borrowVerify(address vToken, address borrower, uint borrowAmount) external virtual {} - - function repayBorrowAllowed( - address vToken, - address payer, - address borrower, - uint repayAmount - ) external virtual returns (uint); - - function repayBorrowVerify( - address vToken, - address payer, - address borrower, - uint repayAmount, - uint borrowerIndex - ) external virtual; - - function liquidateBorrowAllowed( - address vTokenBorrowed, - address vTokenCollateral, - address liquidator, - address borrower, - uint repayAmount - ) external virtual returns (uint); - - function liquidateBorrowVerify( - address vTokenBorrowed, - address vTokenCollateral, - address liquidator, - address borrower, - uint repayAmount, - uint seizeTokens - ) external virtual; - - function seizeAllowed( - address vTokenCollateral, - address vTokenBorrowed, - address liquidator, - address borrower, - uint seizeTokens - ) external virtual returns (uint); - - function seizeVerify( - address vTokenCollateral, - address vTokenBorrowed, - address liquidator, - address borrower, - uint seizeTokens - ) external virtual; - - function transferAllowed( - address vToken, - address src, - address dst, - uint transferTokens - ) external virtual returns (uint); - - function transferVerify(address vToken, address src, address dst, uint transferTokens) external virtual; - - /*** Liquidity/Liquidation Calculations ***/ - - function liquidateCalculateSeizeTokens( - address vTokenBorrowed, - address vTokenCollateral, - uint repayAmount - ) external view virtual returns (uint, uint); - - function setMintedVAIOf(address owner, uint amount) external virtual returns (uint); -} - -abstract contract ComptrollerInterfaceG2 is ComptrollerInterfaceG1 { - function liquidateVAICalculateSeizeTokens( - address vTokenCollateral, - uint repayAmount - ) external view virtual returns (uint, uint); -} - -abstract contract ComptrollerInterfaceG3 is ComptrollerInterfaceG2 { - function liquidateVAICalculateSeizeTokens( - address vTokenCollateral, - uint repayAmount - ) external view virtual override returns (uint, uint) {} -} - -abstract contract ComptrollerInterfaceG4 is ComptrollerInterfaceG3 { - function getXVSAddress() public view virtual returns (address); -} - -abstract contract ComptrollerInterface is ComptrollerInterfaceG4 { - function markets(address) external view virtual returns (bool, uint); - - function oracle() external view virtual returns (PriceOracle); - - function getAccountLiquidity(address) external view virtual returns (uint, uint, uint); - - function getAssetsIn(address) external view virtual returns (VToken[] memory); - - function claimVenus(address) external virtual; - - function venusAccrued(address) external view virtual returns (uint); - - function venusSupplySpeeds(address) external view virtual returns (uint); - - function venusBorrowSpeeds(address) external view virtual returns (uint); - - function getAllMarkets() external view virtual returns (VToken[] memory); - - function venusSupplierIndex(address, address) external view virtual returns (uint); - - function venusInitialIndex() external view virtual returns (uint224); - - function venusBorrowerIndex(address, address) external view virtual returns (uint); - - function venusBorrowState(address) external view virtual returns (uint224, uint32); - - function venusSupplyState(address) external view virtual returns (uint224, uint32); - - function approvedDelegates(address borrower, address delegate) external view virtual returns (bool); -} - -interface IVAIVault { - function updatePendingRewards() external; -} - -interface IComptroller { - function liquidationIncentiveMantissa() external view returns (uint); - - /*** Treasury Data ***/ - function treasuryAddress() external view returns (address); - - function treasuryPercent() external view returns (uint); -} diff --git a/contracts/Comptroller/V0.8.13/ComptrollerLensInterface.sol b/contracts/Comptroller/V0.8.13/ComptrollerLensInterface.sol deleted file mode 100644 index 3b337c7cf..000000000 --- a/contracts/Comptroller/V0.8.13/ComptrollerLensInterface.sol +++ /dev/null @@ -1,26 +0,0 @@ -pragma solidity 0.8.13; - -import "../../Tokens/V0.8.13/VTokens/VToken.sol"; - -interface ComptrollerLensInterface { - function liquidateCalculateSeizeTokens( - address comptroller, - address vTokenBorrowed, - address vTokenCollateral, - uint actualRepayAmount - ) external view returns (uint, uint); - - function liquidateVAICalculateSeizeTokens( - address comptroller, - address vTokenCollateral, - uint actualRepayAmount - ) external view returns (uint, uint); - - function getHypotheticalAccountLiquidity( - address comptroller, - address account, - VToken vTokenModify, - uint redeemTokens, - uint borrowAmount - ) external view returns (uint, uint, uint); -} diff --git a/contracts/Governance/V0.8.13/IAccessControlManager.sol b/contracts/Governance/V0.8.13/IAccessControlManager.sol deleted file mode 100644 index 7f66c4430..000000000 --- a/contracts/Governance/V0.8.13/IAccessControlManager.sol +++ /dev/null @@ -1,35 +0,0 @@ -pragma solidity 0.8.13; - -interface IAccessControlManager { - /** - * @notice Verifies if the given account can call a praticular contract's function - * @dev Since the contract is calling itself this function, we can get contracts address with msg.sender - * @param account address (eoa or contract) for which call permissions will be checked - * @param functionSig signature e.g. "functionName(uint,bool)" - * @return false if the user account cannot call the particular contract function - * - */ - function isAllowedToCall(address account, string calldata functionSig) external view returns (bool); - - /** - * @notice Gives a function call permission to one single account - * @dev this function can be called only from Role Admin or DEFAULT_ADMIN_ROLE - * May emit a {RoleGranted} event. - * @param contractAddress address of contract for which call permissions will be granted - * @param functionSig signature e.g. "functionName(uint,bool)" - */ - function giveCallPermission(address contractAddress, string calldata functionSig, address accountToPermit) external; - - /** - * @notice Revokes an account's permission to a particular function call - * @dev this function can be called only from Role Admin or DEFAULT_ADMIN_ROLE - * May emit a {RoleRevoked} event. - * @param contractAddress address of contract for which call permissions will be revoked - * @param functionSig signature e.g. "functionName(uint,bool)" - */ - function revokeCallPermission( - address contractAddress, - string calldata functionSig, - address accountToRevoke - ) external; -} diff --git a/contracts/InterestRateModels/V0.8.13/InterestRateModel.sol b/contracts/InterestRateModels/V0.8.13/InterestRateModel.sol deleted file mode 100644 index 3cd21808a..000000000 --- a/contracts/InterestRateModels/V0.8.13/InterestRateModel.sol +++ /dev/null @@ -1,34 +0,0 @@ -pragma solidity 0.8.13; - -/** - * @title Venus's InterestRateModel Interface - * @author Venus - */ -abstract contract InterestRateModel { - /// @notice Indicator that this is an InterestRateModel contract (for inspection) - bool public constant isInterestRateModel = true; - - /** - * @notice Calculates the current borrow interest rate per block - * @param cash The total amount of cash the market has - * @param borrows The total amount of borrows the market has outstanding - * @param reserves The total amnount of reserves the market has - * @return The borrow rate per block (as a percentage, and scaled by 1e18) - */ - function getBorrowRate(uint cash, uint borrows, uint reserves) external view virtual returns (uint); - - /** - * @notice Calculates the current supply interest rate per block - * @param cash The total amount of cash the market has - * @param borrows The total amount of borrows the market has outstanding - * @param reserves The total amnount of reserves the market has - * @param reserveFactorMantissa The current reserve factor the market has - * @return The supply rate per block (as a percentage, and scaled by 1e18) - */ - function getSupplyRate( - uint cash, - uint borrows, - uint reserves, - uint reserveFactorMantissa - ) external view virtual returns (uint); -} diff --git a/contracts/Oracle/V0.8.13/PriceOracle.sol b/contracts/Oracle/V0.8.13/PriceOracle.sol deleted file mode 100644 index 3769a9c08..000000000 --- a/contracts/Oracle/V0.8.13/PriceOracle.sol +++ /dev/null @@ -1,16 +0,0 @@ -pragma solidity 0.8.13; - -import "../../Tokens/V0.8.13/VTokens/VToken.sol"; - -abstract contract PriceOracle { - /// @notice Indicator that this is a PriceOracle contract (for inspection) - bool public constant isPriceOracle = true; - - /** - * @notice Get the underlying price of a vToken asset - * @param vToken The vToken to get the underlying price of - * @return The underlying asset price mantissa (scaled by 1e18). - * Zero means the price is unavailable. - */ - function getUnderlyingPrice(VToken vToken) external view virtual returns (uint); -} diff --git a/contracts/Tokens/V0.8.13/EIP20Interface.sol b/contracts/Tokens/V0.8.13/EIP20Interface.sol deleted file mode 100644 index 27d5a8e91..000000000 --- a/contracts/Tokens/V0.8.13/EIP20Interface.sol +++ /dev/null @@ -1,63 +0,0 @@ -pragma solidity 0.8.13; - -/** - * @title BEP 20 Token Standard Interface - * https://eips.ethereum.org/EIPS/eip-20 - */ -interface EIP20Interface { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function decimals() external view returns (uint8); - - /** - * @notice Get the total number of tokens in circulation - * @return The supply of tokens - */ - function totalSupply() external view returns (uint256); - - /** - * @notice Gets the balance of the specified address - * @param owner The address from which the balance will be retrieved - * @return balance - */ - function balanceOf(address owner) external view returns (uint256 balance); - - /** - * @notice Transfer `amount` tokens from `msg.sender` to `dst` - * @param dst The address of the destination account - * @param amount The number of tokens to transfer - * @return success whether or not the transfer succeeded - */ - function transfer(address dst, uint256 amount) external returns (bool success); - - /** - * @notice Transfer `amount` tokens from `src` to `dst` - * @param src The address of the source account - * @param dst The address of the destination account - * @param amount The number of tokens to transfer - * @return success whether or not the transfer succeeded - */ - function transferFrom(address src, address dst, uint256 amount) external returns (bool success); - - /** - * @notice Approve `spender` to transfer up to `amount` from `src` - * @dev This will overwrite the approval amount for `spender` - * @param spender The address of the account which may transfer tokens - * @param amount The number of tokens that are approved (-1 means infinite) - * @return success whether or not the approval succeeded - */ - function approve(address spender, uint256 amount) external returns (bool success); - - /** - * @notice Get the current allowance from `owner` for `spender` - * @param owner The address of the account which owns the tokens to be spent - * @param spender The address of the account which may transfer tokens - * @return remaining The number of tokens allowed to be spent - */ - function allowance(address owner, address spender) external view returns (uint256 remaining); - - event Transfer(address indexed from, address indexed to, uint256 amount); - event Approval(address indexed owner, address indexed spender, uint256 amount); -} diff --git a/contracts/Tokens/V0.8.13/EIP20NonStandardInterface.sol b/contracts/Tokens/V0.8.13/EIP20NonStandardInterface.sol deleted file mode 100644 index 0df30bc79..000000000 --- a/contracts/Tokens/V0.8.13/EIP20NonStandardInterface.sol +++ /dev/null @@ -1,68 +0,0 @@ -pragma solidity 0.8.13; - -/** - * @title EIP20NonStandardInterface - * @dev Version of BEP20 with no return values for `transfer` and `transferFrom` - * See https://medium.com/coinmonks/missing-return-value-bug-at-least-130-tokens-affected-d67bf08521ca - */ -interface EIP20NonStandardInterface { - /** - * @notice Get the total number of tokens in circulation - * @return The supply of tokens - */ - function totalSupply() external view returns (uint256); - - /** - * @notice Gets the balance of the specified address - * @param owner The address from which the balance will be retrieved - * @return balance of the owner - */ - function balanceOf(address owner) external view returns (uint256 balance); - - /// - /// !!!!!!!!!!!!!! - /// !!! NOTICE !!! `transfer` does not return a value, in violation of the BEP-20 specification - /// !!!!!!!!!!!!!! - /// - - /** - * @notice Transfer `amount` tokens from `msg.sender` to `dst` - * @param dst The address of the destination account - * @param amount The number of tokens to transfer - */ - function transfer(address dst, uint256 amount) external; - - /// - /// !!!!!!!!!!!!!! - /// !!! NOTICE !!! `transferFrom` does not return a value, in violation of the BEP-20 specification - /// !!!!!!!!!!!!!! - /// - - /** - * @notice Transfer `amount` tokens from `src` to `dst` - * @param src The address of the source account - * @param dst The address of the destination account - * @param amount The number of tokens to transfer - */ - function transferFrom(address src, address dst, uint256 amount) external; - - /** - * @notice Approve `spender` to transfer up to `amount` from `src` - * @dev This will overwrite the approval amount for `spender` - * @param spender The address of the account which may transfer tokens - * @param amount The number of tokens that are approved - * @return success Whether or not the approval succeeded - */ - function approve(address spender, uint256 amount) external returns (bool success); - - /** - * @notice Get the current allowance from `owner` for `spender` - * @param owner The address of the account which owns the tokens to be spent - * @param spender The address of the account which may transfer tokens - * @return remaining The number of tokens allowed to be spent - */ - function allowance(address owner, address spender) external view returns (uint256 remaining); - - event Transfer(address indexed from, address indexed to, uint256 amount); - event Approval(address indexed owner, address indexed spender, uint256 amount); -} diff --git a/contracts/Tokens/V0.8.13/VAI/VAIControllerInterface.sol b/contracts/Tokens/V0.8.13/VAI/VAIControllerInterface.sol deleted file mode 100644 index a993e6167..000000000 --- a/contracts/Tokens/V0.8.13/VAI/VAIControllerInterface.sol +++ /dev/null @@ -1,27 +0,0 @@ -pragma solidity 0.8.13; - -import "../VTokens/VToken.sol"; - -abstract contract VAIControllerInterface { - function getVAIAddress() public view virtual returns (address); - - function getMintableVAI(address minter) public view virtual returns (uint, uint); - - function mintVAI(address minter, uint mintVAIAmount) external virtual returns (uint); - - function repayVAI(address repayer, uint repayVAIAmount) external virtual returns (uint); - - function liquidateVAI( - address borrower, - uint repayAmount, - VTokenInterface vTokenCollateral - ) external virtual returns (uint, uint); - - function _initializeVenusVAIState(uint blockNumber) external virtual returns (uint); - - function updateVenusVAIMintIndex() external virtual returns (uint); - - function calcDistributeVAIMinterVenus(address vaiMinter) external virtual returns (uint, uint, uint, uint); - - function getVAIRepayAmount(address account) public view virtual returns (uint); -} diff --git a/contracts/Tokens/V0.8.13/VTokens/VBep20.sol b/contracts/Tokens/V0.8.13/VTokens/VBep20.sol deleted file mode 100644 index 5e921e79a..000000000 --- a/contracts/Tokens/V0.8.13/VTokens/VBep20.sol +++ /dev/null @@ -1,253 +0,0 @@ -pragma solidity 0.8.13; - -import "./VToken.sol"; - -/** - * @title Venus's VBep20 Contract - * @notice vTokens which wrap an EIP-20 underlying - * @author Venus - */ -contract VBep20 is VToken, VBep20Interface { - /*** User Interface ***/ - - /** - * @notice Sender supplies assets into the market and receives vTokens in exchange - * @dev Accrues interest whether or not the operation succeeds, unless reverted - * @param mintAmount The amount of the underlying asset to supply - * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). - */ - // @custom:event Emits Transfer event - // @custom:event Emits Mint event - function mint(uint mintAmount) external override returns (uint) { - (uint err, ) = mintInternal(mintAmount); - return err; - } - - /** - * @notice Sender supplies assets into the market and receiver receives vTokens in exchange - * @dev Accrues interest whether or not the operation succeeds, unless reverted - * @param receiver The account which is receiving the vTokens - * @param mintAmount The amount of the underlying asset to supply - * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). - */ - // @custom:event Emits Transfer event - // @custom:event Emits MintBehalf event - function mintBehalf(address receiver, uint mintAmount) external override returns (uint) { - (uint err, ) = mintBehalfInternal(receiver, mintAmount); - return err; - } - - /** - * @notice Sender redeems vTokens in exchange for the underlying asset - * @dev Accrues interest whether or not the operation succeeds, unless reverted - * @param redeemTokens The number of vTokens to redeem into underlying - * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). - */ - // @custom:event Emits Redeem event on success - // @custom:event Emits Transfer event on success - // @custom:event Emits RedeemFee when fee is charged by the treasury - function redeem(uint redeemTokens) external override returns (uint) { - return redeemInternal(redeemTokens); - } - - /** - * @notice Sender redeems vTokens in exchange for a specified amount of underlying asset - * @dev Accrues interest whether or not the operation succeeds, unless reverted - * @param redeemAmount The amount of underlying to redeem - * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). - */ - // @custom:event Emits Redeem event on success - // @custom:event Emits Transfer event on success - // @custom:event Emits RedeemFee when fee is charged by the treasury - function redeemUnderlying(uint redeemAmount) external override returns (uint) { - return redeemUnderlyingInternal(redeemAmount); - } - - /** - * @notice Sender borrows assets from the protocol to their own address - * @param borrowAmount The amount of the underlying asset to borrow - * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). - */ - // @custom:event Emits Borrow event on success - function borrow(uint borrowAmount) external override returns (uint) { - address borrower = msg.sender; - address payable receiver = payable(msg.sender); - return borrowInternal(borrower, receiver, borrowAmount); - } - - /** - * @notice Sender borrows assets on behalf of some other address. This function is only available - * for senders, explicitly marked as delegates of the borrower using `comptroller.updateDelegate` - * @param borrower The borrower, on behalf of whom to borrow. - * @param borrowAmount The amount of the underlying asset to borrow - * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). - */ - // @custom:event Emits Borrow event on success - function borrowBehalf(address borrower, uint borrowAmount) external returns (uint) { - require(comptroller.approvedDelegates(borrower, msg.sender), "not an approved delegate"); - address payable receiver = payable(msg.sender); - return borrowInternal(borrower, receiver, borrowAmount); - } - - /** - * @notice Sender repays their own borrow - * @param repayAmount The amount to repay - * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). - */ - // @custom:event Emits RepayBorrow event on success - function repayBorrow(uint repayAmount) external override returns (uint) { - (uint err, ) = repayBorrowInternal(repayAmount); - return err; - } - - /** - * @notice Sender repays a borrow belonging to another borrowing account - * @param borrower The account with the debt being payed off - * @param repayAmount The amount to repay - * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). - */ - // @custom:event Emits RepayBorrow event on success - function repayBorrowBehalf(address borrower, uint repayAmount) external override returns (uint) { - (uint err, ) = repayBorrowBehalfInternal(borrower, repayAmount); - return err; - } - - /** - * @notice The sender liquidates the borrowers collateral. - * The collateral seized is transferred to the liquidator. - * @param borrower The borrower of this vToken to be liquidated - * @param repayAmount The amount of the underlying borrowed asset to repay - * @param vTokenCollateral The market in which to seize collateral from the borrower - * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). - */ - // @custom:event Emit LiquidateBorrow event on success - function liquidateBorrow( - address borrower, - uint repayAmount, - VTokenInterface vTokenCollateral - ) external override returns (uint) { - (uint err, ) = liquidateBorrowInternal(borrower, repayAmount, vTokenCollateral); - return err; - } - - /** - * @notice The sender adds to reserves. - * @param addAmount The amount of underlying tokens to add as reserves - * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). - */ - // @custom:event Emits ReservesAdded event - function _addReserves(uint addAmount) external override returns (uint) { - return _addReservesInternal(addAmount); - } - - /** - * @notice Initialize the new money market - * @param underlying_ The address of the underlying asset - * @param comptroller_ The address of the Comptroller - * @param interestRateModel_ The address of the interest rate model - * @param initialExchangeRateMantissa_ The initial exchange rate, scaled by 1e18 - * @param name_ BEP-20 name of this token - * @param symbol_ BEP-20 symbol of this token - * @param decimals_ BEP-20 decimal precision of this token - */ - function initialize( - address underlying_, - ComptrollerInterface comptroller_, - InterestRateModel interestRateModel_, - uint initialExchangeRateMantissa_, - string memory name_, - string memory symbol_, - uint8 decimals_ - ) public { - // VToken initialize does the bulk of the work - super.initialize(comptroller_, interestRateModel_, initialExchangeRateMantissa_, name_, symbol_, decimals_); - - // Set underlying and sanity check it - underlying = underlying_; - EIP20Interface(underlying).totalSupply(); - } - - /*** Safe Token ***/ - - /** - * @dev Similar to EIP20 transfer, except it handles a False result from `transferFrom` and reverts in that case. - * This will revert due to insufficient balance or insufficient allowance. - * This function returns the actual amount received, - * which may be less than `amount` if there is a fee attached to the transfer. - * - * Note: This wrapper safely handles non-standard BEP-20 tokens that do not return a value. - * See here: https://medium.com/coinmonks/missing-return-value-bug-at-least-130-tokens-affected-d67bf08521ca - */ - function doTransferIn(address from, uint amount) internal override returns (uint) { - EIP20NonStandardInterface token = EIP20NonStandardInterface(underlying); - uint balanceBefore = EIP20Interface(underlying).balanceOf(address(this)); - token.transferFrom(from, address(this), amount); - - bool success; - assembly { - switch returndatasize() - case 0 { - // This is a non-standard BEP-20 - success := not(0) // set success to true - } - case 32 { - // This is a compliant BEP-20 - returndatacopy(0, 0, 32) - success := mload(0) // Set `success = returndata` of external call - } - default { - // This is an excessively non-compliant BEP-20, revert. - revert(0, 0) - } - } - require(success, "TOKEN_TRANSFER_IN_FAILED"); - - // Calculate the amount that was *actually* transferred - uint balanceAfter = EIP20Interface(underlying).balanceOf(address(this)); - require(balanceAfter >= balanceBefore, "TOKEN_TRANSFER_IN_OVERFLOW"); - return balanceAfter - balanceBefore; // underflow already checked above, just subtract - } - - /** - * @dev Similar to EIP20 transfer, except it handles a False success from `transfer` and returns an explanatory - * error code rather than reverting. If caller has not called checked protocol's balance, this may revert due to - * insufficient cash held in this contract. If caller has checked protocol's balance prior to this call, and verified - * it is >= amount, this should not revert in normal conditions. - * - * Note: This wrapper safely handles non-standard BEP-20 tokens that do not return a value. - * See here: https://medium.com/coinmonks/missing-return-value-bug-at-least-130-tokens-affected-d67bf08521ca - */ - function doTransferOut(address payable to, uint amount) internal virtual override { - EIP20NonStandardInterface token = EIP20NonStandardInterface(underlying); - token.transfer(to, amount); - - bool success; - assembly { - switch returndatasize() - case 0 { - // This is a non-standard BEP-20 - success := not(0) // set success to true - } - case 32 { - // This is a complaint BEP-20 - returndatacopy(0, 0, 32) - success := mload(0) // Set `success = returndata` of external call - } - default { - // This is an excessively non-compliant BEP-20, revert. - revert(0, 0) - } - } - require(success, "TOKEN_TRANSFER_OUT_FAILED"); - } - - /** - * @notice Gets balance of this contract in terms of the underlying - * @dev This excludes the value of the current message, if any - * @return The quantity of underlying tokens owned by this contract - */ - function getCashPrior() internal view override returns (uint) { - EIP20Interface token = EIP20Interface(underlying); - return token.balanceOf(address(this)); - } -} diff --git a/contracts/Tokens/V0.8.13/VTokens/VBep20Delegate.sol b/contracts/Tokens/V0.8.13/VTokens/VBep20Delegate.sol deleted file mode 100644 index ce2ff916d..000000000 --- a/contracts/Tokens/V0.8.13/VTokens/VBep20Delegate.sol +++ /dev/null @@ -1,43 +0,0 @@ -pragma solidity 0.8.13; - -import "./VBep20.sol"; - -/** - * @title Venus's VBep20Delegate Contract - * @notice VTokens which wrap an EIP-20 underlying and are delegated to - * @author Venus - */ -contract VBep20Delegate is VBep20, VDelegateInterface { - /** - * @notice Construct an empty delegate - */ - constructor() public {} - - /** - * @notice Called by the delegator on a delegate to initialize it for duty - * @param data The encoded bytes data for any initialization - */ - function _becomeImplementation(bytes memory data) public override { - // Shh -- currently unused - data; - - // Shh -- we don't ever want this hook to be marked pure - if (false) { - implementation = address(0); - } - - require(msg.sender == admin, "only the admin may call _becomeImplementation"); - } - - /** - * @notice Called by the delegator on a delegate to forfeit its responsibility - */ - function _resignImplementation() public override { - // Shh -- we don't ever want this hook to be marked pure - if (false) { - implementation = address(0); - } - - require(msg.sender == admin, "only the admin may call _resignImplementation"); - } -} diff --git a/contracts/Tokens/V0.8.13/VTokens/VToken.sol b/contracts/Tokens/V0.8.13/VTokens/VToken.sol deleted file mode 100644 index 262f800cb..000000000 --- a/contracts/Tokens/V0.8.13/VTokens/VToken.sol +++ /dev/null @@ -1,1659 +0,0 @@ -pragma solidity 0.8.13; - -import "../../../Utils/V0.8.13/ErrorReporter.sol"; -import "../../../Utils/V0.8.13/Exponential.sol"; -import "../EIP20Interface.sol"; -import "../EIP20NonStandardInterface.sol"; -import "../../../InterestRateModels/V0.8.13/InterestRateModel.sol"; -import "./VTokenInterfaces.sol"; - -/** - * @title Venus's vToken Contract - * @notice Abstract base for vTokens - * @author Venus - */ -contract VToken is VTokenInterface, Exponential, TokenErrorReporter { - struct MintLocalVars { - MathError mathErr; - uint exchangeRateMantissa; - uint mintTokens; - uint totalSupplyNew; - uint accountTokensNew; - uint actualMintAmount; - } - - struct RedeemLocalVars { - MathError mathErr; - uint exchangeRateMantissa; - uint redeemTokens; - uint redeemAmount; - uint totalSupplyNew; - uint accountTokensNew; - } - - struct BorrowLocalVars { - MathError mathErr; - uint accountBorrows; - uint accountBorrowsNew; - uint totalBorrowsNew; - } - - struct RepayBorrowLocalVars { - Error err; - MathError mathErr; - uint repayAmount; - uint borrowerIndex; - uint accountBorrows; - uint accountBorrowsNew; - uint totalBorrowsNew; - uint actualRepayAmount; - } - - /*** Reentrancy Guard ***/ - - /** - * @dev Prevents a contract from calling itself, directly or indirectly. - */ - modifier nonReentrant() { - require(_notEntered, "re-entered"); - _notEntered = false; - _; - _notEntered = true; // get a gas-refund post-Istanbul - } - - /** - * @notice Transfer `amount` tokens from `msg.sender` to `dst` - * @param dst The address of the destination account - * @param amount The number of tokens to transfer - * @return Whether or not the transfer succeeded - */ - // @custom:event Emits Transfer event - function transfer(address dst, uint256 amount) external override nonReentrant returns (bool) { - return transferTokens(msg.sender, msg.sender, dst, amount) == uint(Error.NO_ERROR); - } - - /** - * @notice Transfer `amount` tokens from `src` to `dst` - * @param src The address of the source account - * @param dst The address of the destination account - * @param amount The number of tokens to transfer - * @return Whether or not the transfer succeeded - */ - // @custom:event Emits Transfer event - function transferFrom(address src, address dst, uint256 amount) external override nonReentrant returns (bool) { - return transferTokens(msg.sender, src, dst, amount) == uint(Error.NO_ERROR); - } - - /** - * @notice Approve `spender` to transfer up to `amount` from `src` - * @dev This will overwrite the approval amount for `spender` - * and is subject to issues noted [here](https://eips.ethereum.org/EIPS/eip-20#approve) - * @param spender The address of the account which may transfer tokens - * @param amount The number of tokens that are approved (-1 means infinite) - * @return Whether or not the approval succeeded - */ - // @custom:event Emits Approval event on successful approve - function approve(address spender, uint256 amount) external override returns (bool) { - address src = msg.sender; - transferAllowances[src][spender] = amount; - emit Approval(src, spender, amount); - return true; - } - - /** - * @notice Get the underlying balance of the `owner` - * @dev This also accrues interest in a transaction - * @param owner The address of the account to query - * @return The amount of underlying owned by `owner` - */ - function balanceOfUnderlying(address owner) external override returns (uint) { - Exp memory exchangeRate = Exp({ mantissa: exchangeRateCurrent() }); - (MathError mErr, uint balance) = mulScalarTruncate(exchangeRate, accountTokens[owner]); - require(mErr == MathError.NO_ERROR, "balance could not be calculated"); - return balance; - } - - /** - * @notice Returns the current total borrows plus accrued interest - * @return The total borrows with interest - */ - function totalBorrowsCurrent() external override nonReentrant returns (uint) { - require(accrueInterest() == uint(Error.NO_ERROR), "accrue interest failed"); - return totalBorrows; - } - - /** - * @notice Accrue interest to updated borrowIndex and then calculate account's borrow balance using the updated borrowIndex - * @param account The address whose balance should be calculated after updating borrowIndex - * @return The calculated balance - */ - function borrowBalanceCurrent(address account) external override nonReentrant returns (uint) { - require(accrueInterest() == uint(Error.NO_ERROR), "accrue interest failed"); - return borrowBalanceStored(account); - } - - /** - * @notice Transfers collateral tokens (this market) to the liquidator. - * @dev Will fail unless called by another vToken during the process of liquidation. - * Its absolutely critical to use msg.sender as the borrowed vToken and not a parameter. - * @param liquidator The account receiving seized collateral - * @param borrower The account having collateral seized - * @param seizeTokens The number of vTokens to seize - * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). - */ - // @custom:event Emits Transfer event - function seize( - address liquidator, - address borrower, - uint seizeTokens - ) external override nonReentrant returns (uint) { - return seizeInternal(msg.sender, liquidator, borrower, seizeTokens); - } - - /** - * @notice Begins transfer of admin rights. The newPendingAdmin must call `_acceptAdmin` to finalize the transfer. - * @dev Admin function to begin change of admin. The newPendingAdmin must call `_acceptAdmin` to finalize the transfer. - * @param newPendingAdmin New pending admin. - * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). - */ - // @custom:event Emits NewPendingAdmin event with old and new admin addresses - function _setPendingAdmin(address payable newPendingAdmin) external override returns (uint) { - // Check caller = admin - if (msg.sender != admin) { - return fail(Error.UNAUTHORIZED, FailureInfo.SET_PENDING_ADMIN_OWNER_CHECK); - } - - // Save current value, if any, for inclusion in log - address oldPendingAdmin = pendingAdmin; - - // Store pendingAdmin with value newPendingAdmin - pendingAdmin = newPendingAdmin; - - // Emit NewPendingAdmin(oldPendingAdmin, newPendingAdmin) - emit NewPendingAdmin(oldPendingAdmin, newPendingAdmin); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Accepts transfer of admin rights. msg.sender must be pendingAdmin - * @dev Admin function for pending admin to accept role and update admin - * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). - */ - // @custom:event Emits NewAdmin event on successful acceptance - // @custom:event Emits NewPendingAdmin event with null new pending admin - function _acceptAdmin() external override returns (uint) { - // Check caller is pendingAdmin - if (msg.sender != pendingAdmin) { - return fail(Error.UNAUTHORIZED, FailureInfo.ACCEPT_ADMIN_PENDING_ADMIN_CHECK); - } - - // Save current values for inclusion in log - address oldAdmin = admin; - address oldPendingAdmin = pendingAdmin; - - // Store admin with value pendingAdmin - admin = pendingAdmin; - - // Clear the pending value - pendingAdmin = payable(address(0)); - - emit NewAdmin(oldAdmin, admin); - emit NewPendingAdmin(oldPendingAdmin, pendingAdmin); - - return uint(Error.NO_ERROR); - } - - /** - * @notice accrues interest and sets a new reserve factor for the protocol using `_setReserveFactorFresh` - * @dev Admin function to accrue interest and set a new reserve factor - * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). - */ - // @custom:event Emits NewReserveFactor event - function _setReserveFactor(uint newReserveFactorMantissa) external override nonReentrant returns (uint) { - uint error = accrueInterest(); - if (error != uint(Error.NO_ERROR)) { - // accrueInterest emits logs on errors, but on top of that we want to log the fact that an attempted reserve factor change failed. - return fail(Error(error), FailureInfo.SET_RESERVE_FACTOR_ACCRUE_INTEREST_FAILED); - } - // _setReserveFactorFresh emits reserve-factor-specific logs on errors, so we don't need to. - return _setReserveFactorFresh(newReserveFactorMantissa); - } - - /** - * @notice Accrues interest and reduces reserves by transferring to admin - * @param reduceAmount Amount of reduction to reserves - * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). - */ - // @custom:event Emits ReservesReduced event - function _reduceReserves(uint reduceAmount) external override nonReentrant returns (uint) { - uint error = accrueInterest(); - if (error != uint(Error.NO_ERROR)) { - // accrueInterest emits logs on errors, but on top of that we want to log the fact that an attempted reduce reserves failed. - return fail(Error(error), FailureInfo.REDUCE_RESERVES_ACCRUE_INTEREST_FAILED); - } - // _reduceReservesFresh emits reserve-reduction-specific logs on errors, so we don't need to. - return _reduceReservesFresh(reduceAmount); - } - - /** - * @notice Get the current allowance from `owner` for `spender` - * @param owner The address of the account which owns the tokens to be spent - * @param spender The address of the account which may transfer tokens - * @return The number of tokens allowed to be spent (-1 means infinite) - */ - function allowance(address owner, address spender) external view override returns (uint256) { - return transferAllowances[owner][spender]; - } - - /** - * @notice Get the token balance of the `owner` - * @param owner The address of the account to query - * @return The number of tokens owned by `owner` - */ - function balanceOf(address owner) external view override returns (uint256) { - return accountTokens[owner]; - } - - /** - * @notice Get a snapshot of the account's balances, and the cached exchange rate - * @dev This is used by comptroller to more efficiently perform liquidity checks. - * @param account Address of the account to snapshot - * @return (possible error, token balance, borrow balance, exchange rate mantissa) - */ - function getAccountSnapshot(address account) external view override returns (uint, uint, uint, uint) { - uint vTokenBalance = accountTokens[account]; - uint borrowBalance; - uint exchangeRateMantissa; - - MathError mErr; - - (mErr, borrowBalance) = borrowBalanceStoredInternal(account); - if (mErr != MathError.NO_ERROR) { - return (uint(Error.MATH_ERROR), 0, 0, 0); - } - - (mErr, exchangeRateMantissa) = exchangeRateStoredInternal(); - if (mErr != MathError.NO_ERROR) { - return (uint(Error.MATH_ERROR), 0, 0, 0); - } - - return (uint(Error.NO_ERROR), vTokenBalance, borrowBalance, exchangeRateMantissa); - } - - /** - * @notice Returns the current per-block supply interest rate for this vToken - * @return The supply interest rate per block, scaled by 1e18 - */ - function supplyRatePerBlock() external view override returns (uint) { - return interestRateModel.getSupplyRate(getCashPrior(), totalBorrows, totalReserves, reserveFactorMantissa); - } - - /** - * @notice Returns the current per-block borrow interest rate for this vToken - * @return The borrow interest rate per block, scaled by 1e18 - */ - function borrowRatePerBlock() external view override returns (uint) { - return interestRateModel.getBorrowRate(getCashPrior(), totalBorrows, totalReserves); - } - - /** - * @notice Get cash balance of this vToken in the underlying asset - * @return The quantity of underlying asset owned by this contract - */ - function getCash() external view override returns (uint) { - return getCashPrior(); - } - - /** - * @notice Initialize the money market - * @param comptroller_ The address of the Comptroller - * @param interestRateModel_ The address of the interest rate model - * @param initialExchangeRateMantissa_ The initial exchange rate, scaled by 1e18 - * @param name_ EIP-20 name of this token - * @param symbol_ EIP-20 symbol of this token - * @param decimals_ EIP-20 decimal precision of this token - */ - function initialize( - ComptrollerInterface comptroller_, - InterestRateModel interestRateModel_, - uint initialExchangeRateMantissa_, - string memory name_, - string memory symbol_, - uint8 decimals_ - ) public { - require(msg.sender == admin, "only admin may initialize the market"); - require(accrualBlockNumber == 0 && borrowIndex == 0, "market may only be initialized once"); - - // Set initial exchange rate - initialExchangeRateMantissa = initialExchangeRateMantissa_; - require(initialExchangeRateMantissa > 0, "initial exchange rate must be greater than zero."); - - // Set the comptroller - uint err = _setComptroller(comptroller_); - require(err == uint(Error.NO_ERROR), "setting comptroller failed"); - - // Initialize block number and borrow index (block number mocks depend on comptroller being set) - accrualBlockNumber = getBlockNumber(); - borrowIndex = mantissaOne; - - // Set the interest rate model (depends on block number / borrow index) - err = _setInterestRateModelFresh(interestRateModel_); - require(err == uint(Error.NO_ERROR), "setting interest rate model failed"); - - name = name_; - symbol = symbol_; - decimals = decimals_; - - // The counter starts true to prevent changing it from zero to non-zero (i.e. smaller cost/refund) - _notEntered = true; - } - - /** - * @notice Accrue interest then return the up-to-date exchange rate - * @return Calculated exchange rate scaled by 1e18 - */ - function exchangeRateCurrent() public override nonReentrant returns (uint) { - require(accrueInterest() == uint(Error.NO_ERROR), "accrue interest failed"); - return exchangeRateStored(); - } - - /** - * @notice Applies accrued interest to total borrows and reserves - * @dev This calculates interest accrued from the last checkpointed block - * up to the current block and writes new checkpoint to storage. - */ - // @custom:event Emits AccrueInterest event - function accrueInterest() public override returns (uint) { - /* Remember the initial block number */ - uint currentBlockNumber = getBlockNumber(); - uint accrualBlockNumberPrior = accrualBlockNumber; - - /* Short-circuit accumulating 0 interest */ - if (accrualBlockNumberPrior == currentBlockNumber) { - return uint(Error.NO_ERROR); - } - - /* Read the previous values out of storage */ - uint cashPrior = getCashPrior(); - uint borrowsPrior = totalBorrows; - uint reservesPrior = totalReserves; - uint borrowIndexPrior = borrowIndex; - - /* Calculate the current borrow interest rate */ - uint borrowRateMantissa = interestRateModel.getBorrowRate(cashPrior, borrowsPrior, reservesPrior); - require(borrowRateMantissa <= borrowRateMaxMantissa, "borrow rate is absurdly high"); - - /* Calculate the number of blocks elapsed since the last accrual */ - (MathError mathErr, uint blockDelta) = subUInt(currentBlockNumber, accrualBlockNumberPrior); - require(mathErr == MathError.NO_ERROR, "could not calculate block delta"); - - /* - * Calculate the interest accumulated into borrows and reserves and the new index: - * simpleInterestFactor = borrowRate * blockDelta - * interestAccumulated = simpleInterestFactor * totalBorrows - * totalBorrowsNew = interestAccumulated + totalBorrows - * totalReservesNew = interestAccumulated * reserveFactor + totalReserves - * borrowIndexNew = simpleInterestFactor * borrowIndex + borrowIndex - */ - - Exp memory simpleInterestFactor; - uint interestAccumulated; - uint totalBorrowsNew; - uint totalReservesNew; - uint borrowIndexNew; - - (mathErr, simpleInterestFactor) = mulScalar(Exp({ mantissa: borrowRateMantissa }), blockDelta); - if (mathErr != MathError.NO_ERROR) { - return - failOpaque( - Error.MATH_ERROR, - FailureInfo.ACCRUE_INTEREST_SIMPLE_INTEREST_FACTOR_CALCULATION_FAILED, - uint(mathErr) - ); - } - - (mathErr, interestAccumulated) = mulScalarTruncate(simpleInterestFactor, borrowsPrior); - if (mathErr != MathError.NO_ERROR) { - return - failOpaque( - Error.MATH_ERROR, - FailureInfo.ACCRUE_INTEREST_ACCUMULATED_INTEREST_CALCULATION_FAILED, - uint(mathErr) - ); - } - - (mathErr, totalBorrowsNew) = addUInt(interestAccumulated, borrowsPrior); - if (mathErr != MathError.NO_ERROR) { - return - failOpaque( - Error.MATH_ERROR, - FailureInfo.ACCRUE_INTEREST_NEW_TOTAL_BORROWS_CALCULATION_FAILED, - uint(mathErr) - ); - } - - (mathErr, totalReservesNew) = mulScalarTruncateAddUInt( - Exp({ mantissa: reserveFactorMantissa }), - interestAccumulated, - reservesPrior - ); - if (mathErr != MathError.NO_ERROR) { - return - failOpaque( - Error.MATH_ERROR, - FailureInfo.ACCRUE_INTEREST_NEW_TOTAL_RESERVES_CALCULATION_FAILED, - uint(mathErr) - ); - } - - (mathErr, borrowIndexNew) = mulScalarTruncateAddUInt(simpleInterestFactor, borrowIndexPrior, borrowIndexPrior); - if (mathErr != MathError.NO_ERROR) { - return - failOpaque( - Error.MATH_ERROR, - FailureInfo.ACCRUE_INTEREST_NEW_BORROW_INDEX_CALCULATION_FAILED, - uint(mathErr) - ); - } - - ///////////////////////// - // EFFECTS & INTERACTIONS - // (No safe failures beyond this point) - - /* We write the previously calculated values into storage */ - accrualBlockNumber = currentBlockNumber; - borrowIndex = borrowIndexNew; - totalBorrows = totalBorrowsNew; - totalReserves = totalReservesNew; - - /* We emit an AccrueInterest event */ - emit AccrueInterest(cashPrior, interestAccumulated, borrowIndexNew, totalBorrowsNew); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Sets a new comptroller for the market - * @dev Admin function to set a new comptroller - * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). - */ - // @custom:event Emits NewComptroller event - function _setComptroller(ComptrollerInterface newComptroller) public override returns (uint) { - // Check caller is admin - if (msg.sender != admin) { - return fail(Error.UNAUTHORIZED, FailureInfo.SET_COMPTROLLER_OWNER_CHECK); - } - - ComptrollerInterface oldComptroller = comptroller; - // Ensure invoke comptroller.isComptroller() returns true - require(newComptroller.isComptroller(), "marker method returned false"); - // Set market's comptroller to newComptroller - comptroller = newComptroller; - - // Emit NewComptroller(oldComptroller, newComptroller) - emit NewComptroller(oldComptroller, newComptroller); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Accrues interest and updates the interest rate model using _setInterestRateModelFresh - * @dev Admin function to accrue interest and update the interest rate model - * @param newInterestRateModel The new interest rate model to use - * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). - */ - function _setInterestRateModel(InterestRateModel newInterestRateModel) public override returns (uint) { - uint error = accrueInterest(); - if (error != uint(Error.NO_ERROR)) { - // accrueInterest emits logs on errors, but on top of that we want to log the fact that an attempted change of interest rate model failed - return fail(Error(error), FailureInfo.SET_INTEREST_RATE_MODEL_ACCRUE_INTEREST_FAILED); - } - // _setInterestRateModelFresh emits interest-rate-model-update-specific logs on errors, so we don't need to. - return _setInterestRateModelFresh(newInterestRateModel); - } - - /** - * @notice Calculates the exchange rate from the underlying to the VToken - * @dev This function does not accrue interest before calculating the exchange rate - * @return Calculated exchange rate scaled by 1e18 - */ - function exchangeRateStored() public view override returns (uint) { - (MathError err, uint result) = exchangeRateStoredInternal(); - require(err == MathError.NO_ERROR, "exchangeRateStored: exchangeRateStoredInternal failed"); - return result; - } - - /** - * @notice Return the borrow balance of account based on stored data - * @param account The address whose balance should be calculated - * @return The calculated balance - */ - function borrowBalanceStored(address account) public view override returns (uint) { - (MathError err, uint result) = borrowBalanceStoredInternal(account); - require(err == MathError.NO_ERROR, "borrowBalanceStored: borrowBalanceStoredInternal failed"); - return result; - } - - /** - * @notice Transfers `tokens` tokens from `src` to `dst` by `spender` - * @dev Called by both `transfer` and `transferFrom` internally - * @param spender The address of the account performing the transfer - * @param src The address of the source account - * @param dst The address of the destination account - * @param tokens The number of tokens to transfer - * @return Whether or not the transfer succeeded - */ - function transferTokens(address spender, address src, address dst, uint tokens) internal returns (uint) { - /* Fail if transfer not allowed */ - uint allowed = comptroller.transferAllowed(address(this), src, dst, tokens); - if (allowed != 0) { - return failOpaque(Error.COMPTROLLER_REJECTION, FailureInfo.TRANSFER_COMPTROLLER_REJECTION, allowed); - } - - /* Do not allow self-transfers */ - if (src == dst) { - return fail(Error.BAD_INPUT, FailureInfo.TRANSFER_NOT_ALLOWED); - } - - /* Get the allowance, infinite for the account owner */ - uint startingAllowance = 0; - if (spender == src) { - startingAllowance = type(uint).max; - } else { - startingAllowance = transferAllowances[src][spender]; - } - - /* Do the calculations, checking for {under,over}flow */ - MathError mathErr; - uint allowanceNew; - uint srvTokensNew; - uint dstTokensNew; - - (mathErr, allowanceNew) = subUInt(startingAllowance, tokens); - if (mathErr != MathError.NO_ERROR) { - return fail(Error.MATH_ERROR, FailureInfo.TRANSFER_NOT_ALLOWED); - } - - (mathErr, srvTokensNew) = subUInt(accountTokens[src], tokens); - if (mathErr != MathError.NO_ERROR) { - return fail(Error.MATH_ERROR, FailureInfo.TRANSFER_NOT_ENOUGH); - } - - (mathErr, dstTokensNew) = addUInt(accountTokens[dst], tokens); - if (mathErr != MathError.NO_ERROR) { - return fail(Error.MATH_ERROR, FailureInfo.TRANSFER_TOO_MUCH); - } - - ///////////////////////// - // EFFECTS & INTERACTIONS - // (No safe failures beyond this point) - - accountTokens[src] = srvTokensNew; - accountTokens[dst] = dstTokensNew; - - /* Eat some of the allowance (if necessary) */ - if (startingAllowance != type(uint).max) { - transferAllowances[src][spender] = allowanceNew; - } - - /* We emit a Transfer event */ - emit Transfer(src, dst, tokens); - - comptroller.transferVerify(address(this), src, dst, tokens); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Sender supplies assets into the market and receives vTokens in exchange - * @dev Accrues interest whether or not the operation succeeds, unless reverted - * @param mintAmount The amount of the underlying asset to supply - * @return (uint, uint) An error code (0=success, otherwise a failure, see ErrorReporter.sol), and the actual mint amount. - */ - function mintInternal(uint mintAmount) internal nonReentrant returns (uint, uint) { - uint error = accrueInterest(); - if (error != uint(Error.NO_ERROR)) { - // accrueInterest emits logs on errors, but we still want to log the fact that an attempted mint failed - return (fail(Error(error), FailureInfo.MINT_ACCRUE_INTEREST_FAILED), 0); - } - // mintFresh emits the actual Mint event if successful and logs on errors, so we don't need to - return mintFresh(msg.sender, mintAmount); - } - - /** - * @notice User supplies assets into the market and receives vTokens in exchange - * @dev Assumes interest has already been accrued up to the current block - * @param minter The address of the account which is supplying the assets - * @param mintAmount The amount of the underlying asset to supply - * @return (uint, uint) An error code (0=success, otherwise a failure, see ErrorReporter.sol), and the actual mint amount. - */ - function mintFresh(address minter, uint mintAmount) internal returns (uint, uint) { - /* Fail if mint not allowed */ - uint allowed = comptroller.mintAllowed(address(this), minter, mintAmount); - if (allowed != 0) { - return (failOpaque(Error.COMPTROLLER_REJECTION, FailureInfo.MINT_COMPTROLLER_REJECTION, allowed), 0); - } - - /* Verify market's block number equals current block number */ - if (accrualBlockNumber != getBlockNumber()) { - return (fail(Error.MARKET_NOT_FRESH, FailureInfo.MINT_FRESHNESS_CHECK), 0); - } - - MintLocalVars memory vars; - - (vars.mathErr, vars.exchangeRateMantissa) = exchangeRateStoredInternal(); - if (vars.mathErr != MathError.NO_ERROR) { - return (failOpaque(Error.MATH_ERROR, FailureInfo.MINT_EXCHANGE_RATE_READ_FAILED, uint(vars.mathErr)), 0); - } - - ///////////////////////// - // EFFECTS & INTERACTIONS - // (No safe failures beyond this point) - - /* - * We call `doTransferIn` for the minter and the mintAmount. - * Note: The vToken must handle variations between BEP-20 and BNB underlying. - * `doTransferIn` reverts if anything goes wrong, since we can't be sure if - * side-effects occurred. The function returns the amount actually transferred, - * in case of a fee. On success, the vToken holds an additional `actualMintAmount` - * of cash. - */ - vars.actualMintAmount = doTransferIn(minter, mintAmount); - - /* - * We get the current exchange rate and calculate the number of vTokens to be minted: - * mintTokens = actualMintAmount / exchangeRate - */ - - (vars.mathErr, vars.mintTokens) = divScalarByExpTruncate( - vars.actualMintAmount, - Exp({ mantissa: vars.exchangeRateMantissa }) - ); - require(vars.mathErr == MathError.NO_ERROR, "MINT_EXCHANGE_CALCULATION_FAILED"); - - /* - * We calculate the new total supply of vTokens and minter token balance, checking for overflow: - * totalSupplyNew = totalSupply + mintTokens - * accountTokensNew = accountTokens[minter] + mintTokens - */ - (vars.mathErr, vars.totalSupplyNew) = addUInt(totalSupply, vars.mintTokens); - require(vars.mathErr == MathError.NO_ERROR, "MINT_NEW_TOTAL_SUPPLY_CALCULATION_FAILED"); - - (vars.mathErr, vars.accountTokensNew) = addUInt(accountTokens[minter], vars.mintTokens); - require(vars.mathErr == MathError.NO_ERROR, "MINT_NEW_ACCOUNT_BALANCE_CALCULATION_FAILED"); - - /* We write previously calculated values into storage */ - totalSupply = vars.totalSupplyNew; - accountTokens[minter] = vars.accountTokensNew; - - /* We emit a Mint event, and a Transfer event */ - emit Mint(minter, vars.actualMintAmount, vars.mintTokens); - emit Transfer(address(this), minter, vars.mintTokens); - - /* We call the defense hook */ - comptroller.mintVerify(address(this), minter, vars.actualMintAmount, vars.mintTokens); - - return (uint(Error.NO_ERROR), vars.actualMintAmount); - } - - /** - * @notice Sender supplies assets into the market and receiver receives vTokens in exchange - * @dev Accrues interest whether or not the operation succeeds, unless reverted - * @param receiver The address of the account which is receiving the vTokens - * @param mintAmount The amount of the underlying asset to supply - * @return (uint, uint) An error code (0=success, otherwise a failure, see ErrorReporter.sol), and the actual mint amount. - */ - function mintBehalfInternal(address receiver, uint mintAmount) internal nonReentrant returns (uint, uint) { - uint error = accrueInterest(); - if (error != uint(Error.NO_ERROR)) { - // accrueInterest emits logs on errors, but we still want to log the fact that an attempted mintBehalf failed - return (fail(Error(error), FailureInfo.MINT_ACCRUE_INTEREST_FAILED), 0); - } - // mintBelahfFresh emits the actual Mint event if successful and logs on errors, so we don't need to - return mintBehalfFresh(msg.sender, receiver, mintAmount); - } - - /** - * @notice Payer supplies assets into the market and receiver receives vTokens in exchange - * @dev Assumes interest has already been accrued up to the current block - * @param payer The address of the account which is paying the underlying token - * @param receiver The address of the account which is receiving vToken - * @param mintAmount The amount of the underlying asset to supply - * @return (uint, uint) An error code (0=success, otherwise a failure, see ErrorReporter.sol), and the actual mint amount. - */ - function mintBehalfFresh(address payer, address receiver, uint mintAmount) internal returns (uint, uint) { - require(receiver != address(0), "receiver is invalid"); - /* Fail if mint not allowed */ - uint allowed = comptroller.mintAllowed(address(this), receiver, mintAmount); - if (allowed != 0) { - return (failOpaque(Error.COMPTROLLER_REJECTION, FailureInfo.MINT_COMPTROLLER_REJECTION, allowed), 0); - } - - /* Verify market's block number equals current block number */ - if (accrualBlockNumber != getBlockNumber()) { - return (fail(Error.MARKET_NOT_FRESH, FailureInfo.MINT_FRESHNESS_CHECK), 0); - } - - MintLocalVars memory vars; - - (vars.mathErr, vars.exchangeRateMantissa) = exchangeRateStoredInternal(); - if (vars.mathErr != MathError.NO_ERROR) { - return (failOpaque(Error.MATH_ERROR, FailureInfo.MINT_EXCHANGE_RATE_READ_FAILED, uint(vars.mathErr)), 0); - } - - ///////////////////////// - // EFFECTS & INTERACTIONS - // (No safe failures beyond this point) - - /* - * We call `doTransferIn` for the payer and the mintAmount. - * Note: The vToken must handle variations between BEP-20 and BNB underlying. - * `doTransferIn` reverts if anything goes wrong, since we can't be sure if - * side-effects occurred. The function returns the amount actually transferred, - * in case of a fee. On success, the vToken holds an additional `actualMintAmount` - * of cash. - */ - vars.actualMintAmount = doTransferIn(payer, mintAmount); - - /* - * We get the current exchange rate and calculate the number of vTokens to be minted: - * mintTokens = actualMintAmount / exchangeRate - */ - - (vars.mathErr, vars.mintTokens) = divScalarByExpTruncate( - vars.actualMintAmount, - Exp({ mantissa: vars.exchangeRateMantissa }) - ); - require(vars.mathErr == MathError.NO_ERROR, "MINT_EXCHANGE_CALCULATION_FAILED"); - - /* - * We calculate the new total supply of vTokens and receiver token balance, checking for overflow: - * totalSupplyNew = totalSupply + mintTokens - * accountTokensNew = accountTokens[receiver] + mintTokens - */ - (vars.mathErr, vars.totalSupplyNew) = addUInt(totalSupply, vars.mintTokens); - require(vars.mathErr == MathError.NO_ERROR, "MINT_NEW_TOTAL_SUPPLY_CALCULATION_FAILED"); - - (vars.mathErr, vars.accountTokensNew) = addUInt(accountTokens[receiver], vars.mintTokens); - require(vars.mathErr == MathError.NO_ERROR, "MINT_NEW_ACCOUNT_BALANCE_CALCULATION_FAILED"); - - /* We write previously calculated values into storage */ - totalSupply = vars.totalSupplyNew; - accountTokens[receiver] = vars.accountTokensNew; - - /* We emit a MintBehalf event, and a Transfer event */ - emit MintBehalf(payer, receiver, vars.actualMintAmount, vars.mintTokens); - emit Transfer(address(this), receiver, vars.mintTokens); - - /* We call the defense hook */ - comptroller.mintVerify(address(this), receiver, vars.actualMintAmount, vars.mintTokens); - - return (uint(Error.NO_ERROR), vars.actualMintAmount); - } - - /** - * @notice Sender redeems vTokens in exchange for the underlying asset - * @dev Accrues interest whether or not the operation succeeds, unless reverted - * @param redeemTokens The number of vTokens to redeem into underlying - * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). - */ - function redeemInternal(uint redeemTokens) internal nonReentrant returns (uint) { - uint error = accrueInterest(); - if (error != uint(Error.NO_ERROR)) { - // accrueInterest emits logs on errors, but we still want to log the fact that an attempted redeem failed - return fail(Error(error), FailureInfo.REDEEM_ACCRUE_INTEREST_FAILED); - } - // redeemFresh emits redeem-specific logs on errors, so we don't need to - return redeemFresh(payable(msg.sender), redeemTokens, 0); - } - - /** - * @notice Sender redeems vTokens in exchange for a specified amount of underlying asset - * @dev Accrues interest whether or not the operation succeeds, unless reverted - * @param redeemAmount The amount of underlying to receive from redeeming vTokens - * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). - */ - function redeemUnderlyingInternal(uint redeemAmount) internal nonReentrant returns (uint) { - uint error = accrueInterest(); - if (error != uint(Error.NO_ERROR)) { - // accrueInterest emits logs on errors, but we still want to log the fact that an attempted redeem failed - return fail(Error(error), FailureInfo.REDEEM_ACCRUE_INTEREST_FAILED); - } - // redeemFresh emits redeem-specific logs on errors, so we don't need to - return redeemFresh(payable(msg.sender), 0, redeemAmount); - } - - /** - * @notice User redeems vTokens in exchange for the underlying asset - * @dev Assumes interest has already been accrued up to the current block - * @param redeemer The address of the account which is redeeming the tokens - * @param redeemTokensIn The number of vTokens to redeem into underlying (only one of redeemTokensIn or redeemAmountIn may be non-zero) - * @param redeemAmountIn The number of underlying tokens to receive from redeeming vTokens (only one of redeemTokensIn or redeemAmountIn may be non-zero) - * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). - */ - // solhint-disable-next-line code-complexity - function redeemFresh(address payable redeemer, uint redeemTokensIn, uint redeemAmountIn) internal returns (uint) { - require(redeemTokensIn == 0 || redeemAmountIn == 0, "one of redeemTokensIn or redeemAmountIn must be zero"); - - RedeemLocalVars memory vars; - - /* exchangeRate = invoke Exchange Rate Stored() */ - (vars.mathErr, vars.exchangeRateMantissa) = exchangeRateStoredInternal(); - if (vars.mathErr != MathError.NO_ERROR) { - revert("math error"); - } - - /* If redeemTokensIn > 0: */ - if (redeemTokensIn > 0) { - /* - * We calculate the exchange rate and the amount of underlying to be redeemed: - * redeemTokens = redeemTokensIn - * redeemAmount = redeemTokensIn x exchangeRateCurrent - */ - vars.redeemTokens = redeemTokensIn; - - (vars.mathErr, vars.redeemAmount) = mulScalarTruncate( - Exp({ mantissa: vars.exchangeRateMantissa }), - redeemTokensIn - ); - if (vars.mathErr != MathError.NO_ERROR) { - revert("math error"); - } - } else { - /* - * We get the current exchange rate and calculate the amount to be redeemed: - * redeemTokens = redeemAmountIn / exchangeRate - * redeemAmount = redeemAmountIn - */ - - (vars.mathErr, vars.redeemTokens) = divScalarByExpTruncate( - redeemAmountIn, - Exp({ mantissa: vars.exchangeRateMantissa }) - ); - if (vars.mathErr != MathError.NO_ERROR) { - revert("math error"); - } - - vars.redeemAmount = redeemAmountIn; - } - - /* Fail if redeem not allowed */ - uint allowed = comptroller.redeemAllowed(address(this), redeemer, vars.redeemTokens); - if (allowed != 0) { - revert("math error"); - } - - /* Verify market's block number equals current block number */ - if (accrualBlockNumber != getBlockNumber()) { - revert("math error"); - } - - /* - * We calculate the new total supply and redeemer balance, checking for underflow: - * totalSupplyNew = totalSupply - redeemTokens - * accountTokensNew = accountTokens[redeemer] - redeemTokens - */ - (vars.mathErr, vars.totalSupplyNew) = subUInt(totalSupply, vars.redeemTokens); - if (vars.mathErr != MathError.NO_ERROR) { - revert("math error"); - } - - (vars.mathErr, vars.accountTokensNew) = subUInt(accountTokens[redeemer], vars.redeemTokens); - if (vars.mathErr != MathError.NO_ERROR) { - revert("math error"); - } - - /* Fail gracefully if protocol has insufficient cash */ - if (getCashPrior() < vars.redeemAmount) { - revert("math error"); - } - - ///////////////////////// - // EFFECTS & INTERACTIONS - // (No safe failures beyond this point) - - /* We write previously calculated values into storage */ - totalSupply = vars.totalSupplyNew; - accountTokens[redeemer] = vars.accountTokensNew; - - /* - * We invoke doTransferOut for the redeemer and the redeemAmount. - * Note: The vToken must handle variations between BEP-20 and BNB underlying. - * On success, the vToken has redeemAmount less of cash. - * doTransferOut reverts if anything goes wrong, since we can't be sure if side effects occurred. - */ - - uint feeAmount; - uint remainedAmount; - if (IComptroller(address(comptroller)).treasuryPercent() != 0) { - (vars.mathErr, feeAmount) = mulUInt( - vars.redeemAmount, - IComptroller(address(comptroller)).treasuryPercent() - ); - if (vars.mathErr != MathError.NO_ERROR) { - revert("math error"); - } - - (vars.mathErr, feeAmount) = divUInt(feeAmount, 1e18); - if (vars.mathErr != MathError.NO_ERROR) { - revert("math error"); - } - - (vars.mathErr, remainedAmount) = subUInt(vars.redeemAmount, feeAmount); - if (vars.mathErr != MathError.NO_ERROR) { - revert("math error"); - } - - doTransferOut(payable(address(uint160(IComptroller(address(comptroller)).treasuryAddress()))), feeAmount); - - emit RedeemFee(redeemer, feeAmount, vars.redeemTokens); - } else { - remainedAmount = vars.redeemAmount; - } - - doTransferOut(redeemer, remainedAmount); - - /* We emit a Transfer event, and a Redeem event */ - emit Transfer(redeemer, address(this), vars.redeemTokens); - emit Redeem(redeemer, remainedAmount, vars.redeemTokens); - - /* We call the defense hook */ - comptroller.redeemVerify(address(this), redeemer, vars.redeemAmount, vars.redeemTokens); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Sender borrows assets from the protocol to their own address - * @param borrowAmount The amount of the underlying asset to borrow - * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). - */ - function borrowInternal(uint borrowAmount) internal nonReentrant returns (uint) { - address borrower = msg.sender; - address payable receiver = payable(msg.sender); - return borrowInternal(borrower, receiver, borrowAmount); - } - - /** - * @notice Receiver gets the borrow on behalf of the borrower address - * @param borrower The borrower, on behalf of whom to borrow - * @param receiver The account that would receive the funds (can be the same as the borrower) - * @param borrowAmount The amount of the underlying asset to borrow - * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). - */ - function borrowInternal( - address borrower, - address payable receiver, - uint borrowAmount - ) internal nonReentrant returns (uint) { - uint error = accrueInterest(); - if (error != uint(Error.NO_ERROR)) { - // accrueInterest emits logs on errors, but we still want to log the fact that an attempted borrow failed - return fail(Error(error), FailureInfo.BORROW_ACCRUE_INTEREST_FAILED); - } - // borrowFresh emits borrow-specific logs on errors, so we don't need to - return borrowFresh(borrower, receiver, borrowAmount); - } - - /** - * @notice Receiver gets the borrow on behalf of the borrower address - * @dev Before calling this function, ensure that the interest has been accrued - * @param borrower The borrower, on behalf of whom to borrow - * @param receiver The account that would receive the funds (can be the same as the borrower) - * @param borrowAmount The amount of the underlying asset to borrow - * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). - */ - function borrowFresh(address borrower, address payable receiver, uint borrowAmount) internal returns (uint) { - /* Fail if borrow not allowed */ - uint allowed = comptroller.borrowAllowed(address(this), borrower, borrowAmount); - if (allowed != 0) { - revert("math error"); - } - - /* Verify market's block number equals current block number */ - if (accrualBlockNumber != getBlockNumber()) { - revert("math error"); - } - - /* Fail gracefully if protocol has insufficient underlying cash */ - if (getCashPrior() < borrowAmount) { - revert("math error"); - } - - BorrowLocalVars memory vars; - - /* - * We calculate the new borrower and total borrow balances, failing on overflow: - * accountBorrowsNew = accountBorrows + borrowAmount - * totalBorrowsNew = totalBorrows + borrowAmount - */ - (vars.mathErr, vars.accountBorrows) = borrowBalanceStoredInternal(borrower); - if (vars.mathErr != MathError.NO_ERROR) { - revert("math error"); - } - - (vars.mathErr, vars.accountBorrowsNew) = addUInt(vars.accountBorrows, borrowAmount); - if (vars.mathErr != MathError.NO_ERROR) { - revert("math error"); - } - - (vars.mathErr, vars.totalBorrowsNew) = addUInt(totalBorrows, borrowAmount); - if (vars.mathErr != MathError.NO_ERROR) { - revert("math error"); - } - - ///////////////////////// - // EFFECTS & INTERACTIONS - // (No safe failures beyond this point) - - /* We write the previously calculated values into storage */ - accountBorrows[borrower].principal = vars.accountBorrowsNew; - accountBorrows[borrower].interestIndex = borrowIndex; - totalBorrows = vars.totalBorrowsNew; - - /* - * We invoke doTransferOut for the borrower and the borrowAmount. - * Note: The vToken must handle variations between BEP-20 and BNB underlying. - * On success, the vToken borrowAmount less of cash. - * doTransferOut reverts if anything goes wrong, since we can't be sure if side effects occurred. - */ - doTransferOut(receiver, borrowAmount); - - /* We emit a Borrow event */ - emit Borrow(borrower, borrowAmount, vars.accountBorrowsNew, vars.totalBorrowsNew); - - /* We call the defense hook */ - comptroller.borrowVerify(address(this), borrower, borrowAmount); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Sender repays their own borrow - * @param repayAmount The amount to repay - * @return (uint, uint) An error code (0=success, otherwise a failure, see ErrorReporter.sol), and the actual repayment amount. - */ - function repayBorrowInternal(uint repayAmount) internal nonReentrant returns (uint, uint) { - uint error = accrueInterest(); - if (error != uint(Error.NO_ERROR)) { - // accrueInterest emits logs on errors, but we still want to log the fact that an attempted borrow failed - return (fail(Error(error), FailureInfo.REPAY_BORROW_ACCRUE_INTEREST_FAILED), 0); - } - // repayBorrowFresh emits repay-borrow-specific logs on errors, so we don't need to - return repayBorrowFresh(msg.sender, msg.sender, repayAmount); - } - - /** - * @notice Sender repays a borrow belonging to another borrowing account - * @param borrower The account with the debt being payed off - * @param repayAmount The amount to repay - * @return (uint, uint) An error code (0=success, otherwise a failure, see ErrorReporter.sol), and the actual repayment amount. - */ - function repayBorrowBehalfInternal(address borrower, uint repayAmount) internal nonReentrant returns (uint, uint) { - uint error = accrueInterest(); - if (error != uint(Error.NO_ERROR)) { - // accrueInterest emits logs on errors, but we still want to log the fact that an attempted borrow failed - return (fail(Error(error), FailureInfo.REPAY_BEHALF_ACCRUE_INTEREST_FAILED), 0); - } - // repayBorrowFresh emits repay-borrow-specific logs on errors, so we don't need to - return repayBorrowFresh(msg.sender, borrower, repayAmount); - } - - /** - * @notice Borrows are repaid by another user (possibly the borrower). - * @param payer The account paying off the borrow - * @param borrower The account with the debt being payed off - * @param repayAmount The amount of undelrying tokens being returned - * @return (uint, uint) An error code (0=success, otherwise a failure, see ErrorReporter.sol), and the actual repayment amount. - */ - function repayBorrowFresh(address payer, address borrower, uint repayAmount) internal returns (uint, uint) { - /* Fail if repayBorrow not allowed */ - uint allowed = comptroller.repayBorrowAllowed(address(this), payer, borrower, repayAmount); - if (allowed != 0) { - return ( - failOpaque(Error.COMPTROLLER_REJECTION, FailureInfo.REPAY_BORROW_COMPTROLLER_REJECTION, allowed), - 0 - ); - } - - /* Verify market's block number equals current block number */ - if (accrualBlockNumber != getBlockNumber()) { - return (fail(Error.MARKET_NOT_FRESH, FailureInfo.REPAY_BORROW_FRESHNESS_CHECK), 0); - } - - RepayBorrowLocalVars memory vars; - - /* We remember the original borrowerIndex for verification purposes */ - vars.borrowerIndex = accountBorrows[borrower].interestIndex; - - /* We fetch the amount the borrower owes, with accumulated interest */ - (vars.mathErr, vars.accountBorrows) = borrowBalanceStoredInternal(borrower); - if (vars.mathErr != MathError.NO_ERROR) { - return ( - failOpaque( - Error.MATH_ERROR, - FailureInfo.REPAY_BORROW_ACCUMULATED_BALANCE_CALCULATION_FAILED, - uint(vars.mathErr) - ), - 0 - ); - } - - /* If repayAmount == -1, repayAmount = accountBorrows */ - if (repayAmount == type(uint).max) { - vars.repayAmount = vars.accountBorrows; - } else { - vars.repayAmount = repayAmount; - } - - ///////////////////////// - // EFFECTS & INTERACTIONS - // (No safe failures beyond this point) - - /* - * We call doTransferIn for the payer and the repayAmount - * Note: The vToken must handle variations between BEP-20 and BNB underlying. - * On success, the vToken holds an additional repayAmount of cash. - * doTransferIn reverts if anything goes wrong, since we can't be sure if side effects occurred. - * it returns the amount actually transferred, in case of a fee. - */ - vars.actualRepayAmount = doTransferIn(payer, vars.repayAmount); - - /* - * We calculate the new borrower and total borrow balances, failing on underflow: - * accountBorrowsNew = accountBorrows - actualRepayAmount - * totalBorrowsNew = totalBorrows - actualRepayAmount - */ - (vars.mathErr, vars.accountBorrowsNew) = subUInt(vars.accountBorrows, vars.actualRepayAmount); - require(vars.mathErr == MathError.NO_ERROR, "REPAY_BORROW_NEW_ACCOUNT_BORROW_BALANCE_CALCULATION_FAILED"); - - (vars.mathErr, vars.totalBorrowsNew) = subUInt(totalBorrows, vars.actualRepayAmount); - require(vars.mathErr == MathError.NO_ERROR, "REPAY_BORROW_NEW_TOTAL_BALANCE_CALCULATION_FAILED"); - - /* We write the previously calculated values into storage */ - accountBorrows[borrower].principal = vars.accountBorrowsNew; - accountBorrows[borrower].interestIndex = borrowIndex; - totalBorrows = vars.totalBorrowsNew; - - /* We emit a RepayBorrow event */ - emit RepayBorrow(payer, borrower, vars.actualRepayAmount, vars.accountBorrowsNew, vars.totalBorrowsNew); - - /* We call the defense hook */ - comptroller.repayBorrowVerify(address(this), payer, borrower, vars.actualRepayAmount, vars.borrowerIndex); - - return (uint(Error.NO_ERROR), vars.actualRepayAmount); - } - - /** - * @notice The sender liquidates the borrowers collateral. - * The collateral seized is transferred to the liquidator. - * @param borrower The borrower of this vToken to be liquidated - * @param vTokenCollateral The market in which to seize collateral from the borrower - * @param repayAmount The amount of the underlying borrowed asset to repay - * @return (uint, uint) An error code (0=success, otherwise a failure, see ErrorReporter.sol), and the actual repayment amount. - */ - function liquidateBorrowInternal( - address borrower, - uint repayAmount, - VTokenInterface vTokenCollateral - ) internal nonReentrant returns (uint, uint) { - uint error = accrueInterest(); - if (error != uint(Error.NO_ERROR)) { - // accrueInterest emits logs on errors, but we still want to log the fact that an attempted liquidation failed - return (fail(Error(error), FailureInfo.LIQUIDATE_ACCRUE_BORROW_INTEREST_FAILED), 0); - } - - error = vTokenCollateral.accrueInterest(); - if (error != uint(Error.NO_ERROR)) { - // accrueInterest emits logs on errors, but we still want to log the fact that an attempted liquidation failed - return (fail(Error(error), FailureInfo.LIQUIDATE_ACCRUE_COLLATERAL_INTEREST_FAILED), 0); - } - - // liquidateBorrowFresh emits borrow-specific logs on errors, so we don't need to - return liquidateBorrowFresh(payable(msg.sender), borrower, repayAmount, vTokenCollateral); - } - - /** - * @notice The liquidator liquidates the borrowers collateral. - * The collateral seized is transferred to the liquidator. - * @param borrower The borrower of this vToken to be liquidated - * @param liquidator The address repaying the borrow and seizing collateral - * @param vTokenCollateral The market in which to seize collateral from the borrower - * @param repayAmount The amount of the underlying borrowed asset to repay - * @return (uint, uint) An error code (0=success, otherwise a failure, see ErrorReporter.sol), and the actual repayment amount. - */ - // solhint-disable-next-line code-complexity - function liquidateBorrowFresh( - address liquidator, - address borrower, - uint repayAmount, - VTokenInterface vTokenCollateral - ) internal returns (uint, uint) { - /* Fail if liquidate not allowed */ - uint allowed = comptroller.liquidateBorrowAllowed( - address(this), - address(vTokenCollateral), - liquidator, - borrower, - repayAmount - ); - if (allowed != 0) { - return (failOpaque(Error.COMPTROLLER_REJECTION, FailureInfo.LIQUIDATE_COMPTROLLER_REJECTION, allowed), 0); - } - - /* Verify market's block number equals current block number */ - if (accrualBlockNumber != getBlockNumber()) { - return (fail(Error.MARKET_NOT_FRESH, FailureInfo.LIQUIDATE_FRESHNESS_CHECK), 0); - } - - /* Verify vTokenCollateral market's block number equals current block number */ - if (vTokenCollateral.accrualBlockNumber() != getBlockNumber()) { - return (fail(Error.MARKET_NOT_FRESH, FailureInfo.LIQUIDATE_COLLATERAL_FRESHNESS_CHECK), 0); - } - - /* Fail if borrower = liquidator */ - if (borrower == liquidator) { - return (fail(Error.INVALID_ACCOUNT_PAIR, FailureInfo.LIQUIDATE_LIQUIDATOR_IS_BORROWER), 0); - } - - /* Fail if repayAmount = 0 */ - if (repayAmount == 0) { - return (fail(Error.INVALID_CLOSE_AMOUNT_REQUESTED, FailureInfo.LIQUIDATE_CLOSE_AMOUNT_IS_ZERO), 0); - } - - /* Fail if repayAmount = -1 */ - if (repayAmount == type(uint).max) { - return (fail(Error.INVALID_CLOSE_AMOUNT_REQUESTED, FailureInfo.LIQUIDATE_CLOSE_AMOUNT_IS_UINT_MAX), 0); - } - - /* Fail if repayBorrow fails */ - (uint repayBorrowError, uint actualRepayAmount) = repayBorrowFresh(liquidator, borrower, repayAmount); - if (repayBorrowError != uint(Error.NO_ERROR)) { - return (fail(Error(repayBorrowError), FailureInfo.LIQUIDATE_REPAY_BORROW_FRESH_FAILED), 0); - } - - ///////////////////////// - // EFFECTS & INTERACTIONS - // (No safe failures beyond this point) - - /* We calculate the number of collateral tokens that will be seized */ - (uint amountSeizeError, uint seizeTokens) = comptroller.liquidateCalculateSeizeTokens( - address(this), - address(vTokenCollateral), - actualRepayAmount - ); - require(amountSeizeError == uint(Error.NO_ERROR), "LIQUIDATE_COMPTROLLER_CALCULATE_AMOUNT_SEIZE_FAILED"); - - /* Revert if borrower collateral token balance < seizeTokens */ - require(vTokenCollateral.balanceOf(borrower) >= seizeTokens, "LIQUIDATE_SEIZE_TOO_MUCH"); - - // If this is also the collateral, run seizeInternal to avoid re-entrancy, otherwise make an external override call - uint seizeError; - if (address(vTokenCollateral) == address(this)) { - seizeError = seizeInternal(address(this), liquidator, borrower, seizeTokens); - } else { - seizeError = vTokenCollateral.seize(liquidator, borrower, seizeTokens); - } - - /* Revert if seize tokens fails (since we cannot be sure of side effects) */ - require(seizeError == uint(Error.NO_ERROR), "token seizure failed"); - - /* We emit a LiquidateBorrow event */ - emit LiquidateBorrow(liquidator, borrower, actualRepayAmount, address(vTokenCollateral), seizeTokens); - - /* We call the defense hook */ - comptroller.liquidateBorrowVerify( - address(this), - address(vTokenCollateral), - liquidator, - borrower, - actualRepayAmount, - seizeTokens - ); - - return (uint(Error.NO_ERROR), actualRepayAmount); - } - - /** - * @notice Transfers collateral tokens (this market) to the liquidator. - * @dev Called only during an in-kind liquidation, or by liquidateBorrow during the liquidation of another vToken. - * Its absolutely critical to use msg.sender as the seizer vToken and not a parameter. - * @param seizerToken The contract seizing the collateral (i.e. borrowed vToken) - * @param liquidator The account receiving seized collateral - * @param borrower The account having collateral seized - * @param seizeTokens The number of vTokens to seize - * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). - */ - function seizeInternal( - address seizerToken, - address liquidator, - address borrower, - uint seizeTokens - ) internal returns (uint) { - /* Fail if seize not allowed */ - uint allowed = comptroller.seizeAllowed(address(this), seizerToken, liquidator, borrower, seizeTokens); - if (allowed != 0) { - return failOpaque(Error.COMPTROLLER_REJECTION, FailureInfo.LIQUIDATE_SEIZE_COMPTROLLER_REJECTION, allowed); - } - - /* Fail if borrower = liquidator */ - if (borrower == liquidator) { - return fail(Error.INVALID_ACCOUNT_PAIR, FailureInfo.LIQUIDATE_SEIZE_LIQUIDATOR_IS_BORROWER); - } - - MathError mathErr; - uint borrowerTokensNew; - uint liquidatorTokensNew; - - /* - * We calculate the new borrower and liquidator token balances, failing on underflow/overflow: - * borrowerTokensNew = accountTokens[borrower] - seizeTokens - * liquidatorTokensNew = accountTokens[liquidator] + seizeTokens - */ - (mathErr, borrowerTokensNew) = subUInt(accountTokens[borrower], seizeTokens); - if (mathErr != MathError.NO_ERROR) { - return failOpaque(Error.MATH_ERROR, FailureInfo.LIQUIDATE_SEIZE_BALANCE_DECREMENT_FAILED, uint(mathErr)); - } - - (mathErr, liquidatorTokensNew) = addUInt(accountTokens[liquidator], seizeTokens); - if (mathErr != MathError.NO_ERROR) { - return failOpaque(Error.MATH_ERROR, FailureInfo.LIQUIDATE_SEIZE_BALANCE_INCREMENT_FAILED, uint(mathErr)); - } - - ///////////////////////// - // EFFECTS & INTERACTIONS - // (No safe failures beyond this point) - - /* We write the previously calculated values into storage */ - accountTokens[borrower] = borrowerTokensNew; - accountTokens[liquidator] = liquidatorTokensNew; - - /* Emit a Transfer event */ - emit Transfer(borrower, liquidator, seizeTokens); - - /* We call the defense hook */ - comptroller.seizeVerify(address(this), seizerToken, liquidator, borrower, seizeTokens); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Sets a new reserve factor for the protocol (requires fresh interest accrual) - * @dev Admin function to set a new reserve factor - * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). - */ - function _setReserveFactorFresh(uint newReserveFactorMantissa) internal returns (uint) { - // Check caller is admin - if (msg.sender != admin) { - return fail(Error.UNAUTHORIZED, FailureInfo.SET_RESERVE_FACTOR_ADMIN_CHECK); - } - - // Verify market's block number equals current block number - if (accrualBlockNumber != getBlockNumber()) { - return fail(Error.MARKET_NOT_FRESH, FailureInfo.SET_RESERVE_FACTOR_FRESH_CHECK); - } - - // Check newReserveFactor ≤ maxReserveFactor - if (newReserveFactorMantissa > reserveFactorMaxMantissa) { - return fail(Error.BAD_INPUT, FailureInfo.SET_RESERVE_FACTOR_BOUNDS_CHECK); - } - - uint oldReserveFactorMantissa = reserveFactorMantissa; - reserveFactorMantissa = newReserveFactorMantissa; - - emit NewReserveFactor(oldReserveFactorMantissa, newReserveFactorMantissa); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Accrues interest and adds reserves by transferring from `msg.sender` - * @param addAmount Amount of addition to reserves - * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). - */ - function _addReservesInternal(uint addAmount) internal nonReentrant returns (uint) { - uint error = accrueInterest(); - if (error != uint(Error.NO_ERROR)) { - // accrueInterest emits logs on errors, but on top of that we want to log the fact that an attempted reduce reserves failed. - return fail(Error(error), FailureInfo.ADD_RESERVES_ACCRUE_INTEREST_FAILED); - } - - // _addReservesFresh emits reserve-addition-specific logs on errors, so we don't need to. - (error, ) = _addReservesFresh(addAmount); - return error; - } - - /** - * @notice Add reserves by transferring from caller - * @dev Requires fresh interest accrual - * @param addAmount Amount of addition to reserves - * @return (uint, uint) An error code (0=success, otherwise a failure (see ErrorReporter.sol for details)) and the actual amount added, net token fees - */ - function _addReservesFresh(uint addAmount) internal returns (uint, uint) { - // totalReserves + actualAddAmount - uint totalReservesNew; - uint actualAddAmount; - - // We fail gracefully unless market's block number equals current block number - if (accrualBlockNumber != getBlockNumber()) { - return (fail(Error.MARKET_NOT_FRESH, FailureInfo.ADD_RESERVES_FRESH_CHECK), actualAddAmount); - } - - ///////////////////////// - // EFFECTS & INTERACTIONS - // (No safe failures beyond this point) - - /* - * We call doTransferIn for the caller and the addAmount - * Note: The vToken must handle variations between BEP-20 and BNB underlying. - * On success, the vToken holds an additional addAmount of cash. - * doTransferIn reverts if anything goes wrong, since we can't be sure if side effects occurred. - * it returns the amount actually transferred, in case of a fee. - */ - - actualAddAmount = doTransferIn(msg.sender, addAmount); - - totalReservesNew = totalReserves + actualAddAmount; - - /* Revert on overflow */ - require(totalReservesNew >= totalReserves, "add reserves unexpected overflow"); - - // Store reserves[n+1] = reserves[n] + actualAddAmount - totalReserves = totalReservesNew; - - /* Emit NewReserves(admin, actualAddAmount, reserves[n+1]) */ - emit ReservesAdded(msg.sender, actualAddAmount, totalReservesNew); - - /* Return (NO_ERROR, actualAddAmount) */ - return (uint(Error.NO_ERROR), actualAddAmount); - } - - /** - * @notice Reduces reserves by transferring to admin - * @dev Requires fresh interest accrual - * @param reduceAmount Amount of reduction to reserves - * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). - */ - function _reduceReservesFresh(uint reduceAmount) internal returns (uint) { - // totalReserves - reduceAmount - uint totalReservesNew; - - // Check caller is admin - if (msg.sender != admin) { - return fail(Error.UNAUTHORIZED, FailureInfo.REDUCE_RESERVES_ADMIN_CHECK); - } - - // We fail gracefully unless market's block number equals current block number - if (accrualBlockNumber != getBlockNumber()) { - return fail(Error.MARKET_NOT_FRESH, FailureInfo.REDUCE_RESERVES_FRESH_CHECK); - } - - // Fail gracefully if protocol has insufficient underlying cash - if (getCashPrior() < reduceAmount) { - return fail(Error.TOKEN_INSUFFICIENT_CASH, FailureInfo.REDUCE_RESERVES_CASH_NOT_AVAILABLE); - } - - // Check reduceAmount ≤ reserves[n] (totalReserves) - if (reduceAmount > totalReserves) { - return fail(Error.BAD_INPUT, FailureInfo.REDUCE_RESERVES_VALIDATION); - } - - ///////////////////////// - // EFFECTS & INTERACTIONS - // (No safe failures beyond this point) - - totalReservesNew = totalReserves - reduceAmount; - - // Store reserves[n+1] = reserves[n] - reduceAmount - totalReserves = totalReservesNew; - - // doTransferOut reverts if anything goes wrong, since we can't be sure if side effects occurred. - doTransferOut(admin, reduceAmount); - - emit ReservesReduced(admin, reduceAmount, totalReservesNew); - - return uint(Error.NO_ERROR); - } - - /** - * @notice updates the interest rate model (requires fresh interest accrual) - * @dev Admin function to update the interest rate model - * @param newInterestRateModel the new interest rate model to use - * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). - */ - function _setInterestRateModelFresh(InterestRateModel newInterestRateModel) internal returns (uint) { - // Used to store old model for use in the event that is emitted on success - InterestRateModel oldInterestRateModel; - - // Check caller is admin - if (msg.sender != admin) { - return fail(Error.UNAUTHORIZED, FailureInfo.SET_INTEREST_RATE_MODEL_OWNER_CHECK); - } - - // We fail gracefully unless market's block number equals current block number - if (accrualBlockNumber != getBlockNumber()) { - return fail(Error.MARKET_NOT_FRESH, FailureInfo.SET_INTEREST_RATE_MODEL_FRESH_CHECK); - } - - // Track the market's current interest rate model - oldInterestRateModel = interestRateModel; - - // Ensure invoke newInterestRateModel.isInterestRateModel() returns true - require(newInterestRateModel.isInterestRateModel(), "marker method returned false"); - - // Set the interest rate model to newInterestRateModel - interestRateModel = newInterestRateModel; - - // Emit NewMarketInterestRateModel(oldInterestRateModel, newInterestRateModel) - emit NewMarketInterestRateModel(oldInterestRateModel, newInterestRateModel); - - return uint(Error.NO_ERROR); - } - - /*** Safe Token ***/ - - /** - * @dev Performs a transfer in, reverting upon failure. Returns the amount actually transferred to the protocol, in case of a fee. - * This may revert due to insufficient balance or insufficient allowance. - */ - function doTransferIn(address from, uint amount) internal virtual returns (uint) {} - - /** - * @dev Performs a transfer out, ideally returning an explanatory error code upon failure rather than reverting. - * If caller has not called checked protocol's balance, may revert due to insufficient cash held in the contract. - * If caller has checked protocol's balance, and verified it is >= amount, this should not revert in normal conditions. - */ - function doTransferOut(address payable to, uint amount) internal virtual {} - - /** - * @dev Function to simply retrieve block number - * This exists mainly for inheriting test contracts to stub this result. - */ - function getBlockNumber() internal view virtual returns (uint) { - return block.number; - } - - /** - * @notice Return the borrow balance of account based on stored data - * @param account The address whose balance should be calculated - * @return Tuple of error code and the calculated balance or 0 if error code is non-zero - */ - function borrowBalanceStoredInternal(address account) internal view returns (MathError, uint) { - /* Note: we do not assert that the market is up to date */ - MathError mathErr; - uint principalTimesIndex; - uint result; - - /* Get borrowBalance and borrowIndex */ - BorrowSnapshot storage borrowSnapshot = accountBorrows[account]; - - /* If borrowBalance = 0 then borrowIndex is likely also 0. - * Rather than failing the calculation with a division by 0, we immediately return 0 in this case. - */ - if (borrowSnapshot.principal == 0) { - return (MathError.NO_ERROR, 0); - } - - /* Calculate new borrow balance using the interest index: - * recentBorrowBalance = borrower.borrowBalance * market.borrowIndex / borrower.borrowIndex - */ - (mathErr, principalTimesIndex) = mulUInt(borrowSnapshot.principal, borrowIndex); - if (mathErr != MathError.NO_ERROR) { - return (mathErr, 0); - } - - (mathErr, result) = divUInt(principalTimesIndex, borrowSnapshot.interestIndex); - if (mathErr != MathError.NO_ERROR) { - return (mathErr, 0); - } - - return (MathError.NO_ERROR, result); - } - - /** - * @notice Calculates the exchange rate from the underlying to the vToken - * @dev This function does not accrue interest before calculating the exchange rate - * @return Tuple of error code and calculated exchange rate scaled by 1e18 - */ - function exchangeRateStoredInternal() internal view virtual returns (MathError, uint) { - uint _totalSupply = totalSupply; - if (_totalSupply == 0) { - /* - * If there are no tokens minted: - * exchangeRate = initialExchangeRate - */ - return (MathError.NO_ERROR, initialExchangeRateMantissa); - } else { - /* - * Otherwise: - * exchangeRate = (totalCash + totalBorrows - totalReserves) / totalSupply - */ - uint totalCash = getCashPrior(); - uint cashPlusBorrowsMinusReserves; - Exp memory exchangeRate; - MathError mathErr; - - (mathErr, cashPlusBorrowsMinusReserves) = addThenSubUInt(totalCash, totalBorrows, totalReserves); - if (mathErr != MathError.NO_ERROR) { - return (mathErr, 0); - } - - (mathErr, exchangeRate) = getExp(cashPlusBorrowsMinusReserves, _totalSupply); - if (mathErr != MathError.NO_ERROR) { - return (mathErr, 0); - } - - return (MathError.NO_ERROR, exchangeRate.mantissa); - } - } - - /*** Safe Token ***/ - - /** - * @notice Gets balance of this contract in terms of the underlying - * @dev This excludes the value of the current message, if any - * @return The quantity of underlying owned by this contract - */ - function getCashPrior() internal view virtual returns (uint) {} -} diff --git a/contracts/Tokens/V0.8.13/VTokens/VTokenInterfaces.sol b/contracts/Tokens/V0.8.13/VTokens/VTokenInterfaces.sol deleted file mode 100644 index 8375d06d7..000000000 --- a/contracts/Tokens/V0.8.13/VTokens/VTokenInterfaces.sol +++ /dev/null @@ -1,353 +0,0 @@ -pragma solidity 0.8.13; - -import "../../../Comptroller/V0.8.13/ComptrollerInterface.sol"; -import "../../../InterestRateModels/V0.8.13/InterestRateModel.sol"; - -contract VTokenStorage { - /** - * @notice Container for borrow balance information - * @member principal Total balance (with accrued interest), after applying the most recent balance-changing action - * @member interestIndex Global borrowIndex as of the most recent balance-changing action - */ - struct BorrowSnapshot { - uint principal; - uint interestIndex; - } - - /** - * @dev Guard variable for re-entrancy checks - */ - bool internal _notEntered; - - /** - * @notice EIP-20 token name for this token - */ - string public name; - - /** - * @notice EIP-20 token symbol for this token - */ - string public symbol; - - /** - * @notice EIP-20 token decimals for this token - */ - uint8 public decimals; - - /** - * @notice Maximum borrow rate that can ever be applied (.0005% / block) - */ - - uint internal constant borrowRateMaxMantissa = 0.0005e16; - - /** - * @notice Maximum fraction of interest that can be set aside for reserves - */ - uint internal constant reserveFactorMaxMantissa = 1e18; - - /** - * @notice Administrator for this contract - */ - address payable public admin; - - /** - * @notice Pending administrator for this contract - */ - address payable public pendingAdmin; - - /** - * @notice Contract which oversees inter-vToken operations - */ - ComptrollerInterface public comptroller; - - /** - * @notice Model which tells what the current interest rate should be - */ - InterestRateModel public interestRateModel; - - /** - * @notice Initial exchange rate used when minting the first VTokens (used when totalSupply = 0) - */ - uint internal initialExchangeRateMantissa; - - /** - * @notice Fraction of interest currently set aside for reserves - */ - uint public reserveFactorMantissa; - - /** - * @notice Block number that interest was last accrued at - */ - uint public accrualBlockNumber; - - /** - * @notice Accumulator of the total earned interest rate since the opening of the market - */ - uint public borrowIndex; - - /** - * @notice Total amount of outstanding borrows of the underlying in this market - */ - uint public totalBorrows; - - /** - * @notice Total amount of reserves of the underlying held in this market - */ - uint public totalReserves; - - /** - * @notice Total number of tokens in circulation - */ - uint public totalSupply; - - /** - * @notice Official record of token balances for each account - */ - mapping(address => uint) internal accountTokens; - - /** - * @notice Approved token transfer amounts on behalf of others - */ - mapping(address => mapping(address => uint)) internal transferAllowances; - - /** - * @notice Mapping of account addresses to outstanding borrow balances - */ - mapping(address => BorrowSnapshot) internal accountBorrows; -} - -abstract contract VTokenInterface is VTokenStorage { - /** - * @notice Indicator that this is a vToken contract (for inspection) - */ - bool public constant isVToken = true; - - /*** Market Events ***/ - - /** - * @notice Event emitted when interest is accrued - */ - event AccrueInterest(uint cashPrior, uint interestAccumulated, uint borrowIndex, uint totalBorrows); - - /** - * @notice Event emitted when tokens are minted - */ - event Mint(address minter, uint mintAmount, uint mintTokens); - - /** - * @notice Event emitted when tokens are minted behalf by payer to receiver - */ - event MintBehalf(address payer, address receiver, uint mintAmount, uint mintTokens); - - /** - * @notice Event emitted when tokens are redeemed - */ - event Redeem(address redeemer, uint redeemAmount, uint redeemTokens); - - /** - * @notice Event emitted when tokens are redeemed and fee is transferred - */ - event RedeemFee(address redeemer, uint feeAmount, uint redeemTokens); - - /** - * @notice Event emitted when underlying is borrowed - */ - event Borrow(address borrower, uint borrowAmount, uint accountBorrows, uint totalBorrows); - - /** - * @notice Event emitted when a borrow is repaid - */ - event RepayBorrow(address payer, address borrower, uint repayAmount, uint accountBorrows, uint totalBorrows); - - /** - * @notice Event emitted when a borrow is liquidated - */ - event LiquidateBorrow( - address liquidator, - address borrower, - uint repayAmount, - address vTokenCollateral, - uint seizeTokens - ); - - /*** Admin Events ***/ - - /** - * @notice Event emitted when pendingAdmin is changed - */ - event NewPendingAdmin(address oldPendingAdmin, address newPendingAdmin); - - /** - * @notice Event emitted when pendingAdmin is accepted, which means admin has been updated - */ - event NewAdmin(address oldAdmin, address newAdmin); - - /** - * @notice Event emitted when comptroller is changed - */ - event NewComptroller(ComptrollerInterface oldComptroller, ComptrollerInterface newComptroller); - - /** - * @notice Event emitted when interestRateModel is changed - */ - event NewMarketInterestRateModel(InterestRateModel oldInterestRateModel, InterestRateModel newInterestRateModel); - - /** - * @notice Event emitted when the reserve factor is changed - */ - event NewReserveFactor(uint oldReserveFactorMantissa, uint newReserveFactorMantissa); - - /** - * @notice Event emitted when the reserves are added - */ - event ReservesAdded(address benefactor, uint addAmount, uint newTotalReserves); - - /** - * @notice Event emitted when the reserves are reduced - */ - event ReservesReduced(address admin, uint reduceAmount, uint newTotalReserves); - - /** - * @notice EIP20 Transfer event - */ - event Transfer(address indexed from, address indexed to, uint amount); - - /** - * @notice EIP20 Approval event - */ - event Approval(address indexed owner, address indexed spender, uint amount); - - /** - * @notice Failure event - */ - // event Failure(uint error, uint info, uint detail); - - /*** User Interface ***/ - - function transfer(address dst, uint amount) external virtual returns (bool); - - function transferFrom(address src, address dst, uint amount) external virtual returns (bool); - - function approve(address spender, uint amount) external virtual returns (bool); - - function balanceOfUnderlying(address owner) external virtual returns (uint); - - function totalBorrowsCurrent() external virtual returns (uint); - - function borrowBalanceCurrent(address account) external virtual returns (uint); - - function seize(address liquidator, address borrower, uint seizeTokens) external virtual returns (uint); - - /*** Admin Function ***/ - function _setPendingAdmin(address payable newPendingAdmin) external virtual returns (uint); - - /*** Admin Function ***/ - function _acceptAdmin() external virtual returns (uint); - - /*** Admin Function ***/ - function _setReserveFactor(uint newReserveFactorMantissa) external virtual returns (uint); - - /*** Admin Function ***/ - function _reduceReserves(uint reduceAmount) external virtual returns (uint); - - function balanceOf(address owner) external view virtual returns (uint); - - function allowance(address owner, address spender) external view virtual returns (uint); - - function getAccountSnapshot(address account) external view virtual returns (uint, uint, uint, uint); - - function borrowRatePerBlock() external view virtual returns (uint); - - function supplyRatePerBlock() external view virtual returns (uint); - - function getCash() external view virtual returns (uint); - - function exchangeRateCurrent() public virtual returns (uint); - - function accrueInterest() public virtual returns (uint); - - /*** Admin Function ***/ - function _setComptroller(ComptrollerInterface newComptroller) public virtual returns (uint); - - /*** Admin Function ***/ - function _setInterestRateModel(InterestRateModel newInterestRateModel) public virtual returns (uint); - - function borrowBalanceStored(address account) public view virtual returns (uint); - - function exchangeRateStored() public view virtual returns (uint); -} - -contract VBep20Storage { - /** - * @notice Underlying asset for this VToken - */ - address public underlying; -} - -abstract contract VBep20Interface is VBep20Storage { - /*** User Interface ***/ - - function mint(uint mintAmount) external virtual returns (uint); - - function mintBehalf(address receiver, uint mintAmount) external virtual returns (uint); - - function redeem(uint redeemTokens) external virtual returns (uint); - - function redeemUnderlying(uint redeemAmount) external virtual returns (uint); - - function borrow(uint borrowAmount) external virtual returns (uint); - - function repayBorrow(uint repayAmount) external virtual returns (uint); - - function repayBorrowBehalf(address borrower, uint repayAmount) external virtual returns (uint); - - function liquidateBorrow( - address borrower, - uint repayAmount, - VTokenInterface vTokenCollateral - ) external virtual returns (uint); - - /*** Admin Functions ***/ - - function _addReserves(uint addAmount) external virtual returns (uint); -} - -contract VDelegationStorage { - /** - * @notice Implementation address for this contract - */ - address public implementation; -} - -abstract contract VDelegatorInterface is VDelegationStorage { - /** - * @notice Emitted when implementation is changed - */ - event NewImplementation(address oldImplementation, address newImplementation); - - /** - * @notice Called by the admin to update the implementation of the delegator - * @param implementation_ The address of the new implementation for delegation - * @param allowResign Flag to indicate whether to call _resignImplementation on the old implementation - * @param becomeImplementationData The encoded bytes data to be passed to _becomeImplementation - */ - function _setImplementation( - address implementation_, - bool allowResign, - bytes memory becomeImplementationData - ) public virtual; -} - -abstract contract VDelegateInterface is VDelegationStorage { - /** - * @notice Called by the delegator on a delegate to initialize it for duty - * @dev Should revert if any issues arise which make it unfit for delegation - * @param data The encoded bytes data for any initialization - */ - function _becomeImplementation(bytes memory data) public virtual; - - /** - * @notice Called by the delegator on a delegate to forfeit its responsibility - */ - function _resignImplementation() public virtual; -} diff --git a/contracts/Utils/V0.8.13/Address.sol b/contracts/Utils/V0.8.13/Address.sol deleted file mode 100644 index a1ed9ae9d..000000000 --- a/contracts/Utils/V0.8.13/Address.sol +++ /dev/null @@ -1,73 +0,0 @@ -pragma solidity 0.8.13; - -/** - * @dev Collection of functions related to the address type - */ -library Address { - /** - * @dev Returns true if `account` is a contract. - * - * [IMPORTANT] - * ==== - * It is unsafe to assume that an address for which this function returns - * false is an externally-owned account (EOA) and not a contract. - * - * Among others, `isContract` will return false for the following - * types of addresses: - * - * - an externally-owned account - * - a contract in construction - * - an address where a contract will be created - * - an address where a contract lived, but was destroyed - * ==== - */ - function isContract(address account) internal view returns (bool) { - // According to EIP-1052, 0x0 is the value returned for not-yet created accounts - // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned - // for accounts without code, i.e. `keccak256('')` - bytes32 codehash; - bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; - // solhint-disable-next-line no-inline-assembly - assembly { - codehash := extcodehash(account) - } - return (codehash != accountHash && codehash != 0x0); - } - - /** - * @dev Converts an `address` into `address payable`. Note that this is - * simply a type cast: the actual underlying value is not changed. - * - * _Available since v2.4.0._ - */ - function toPayable(address account) internal pure returns (address payable) { - return payable(address(uint160(account))); - } - - /** - * @dev Replacement for Solidity's `transfer`: sends `amount` wei to - * `recipient`, forwarding all available gas and reverting on errors. - * - * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost - * of certain opcodes, possibly making contracts go over the 2300 gas limit - * imposed by `transfer`, making them unable to receive funds via - * `transfer`. {sendValue} removes this limitation. - * - * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. - * - * IMPORTANT: because control is transferred to `recipient`, care must be - * taken to not create reentrancy vulnerabilities. Consider using - * {ReentrancyGuard} or the - * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. - * - * _Available since v2.4.0._ - */ - function sendValue(address payable recipient, uint256 amount) internal { - require(address(this).balance >= amount, "Address: insufficient balance"); - - // solhint-disable-next-line avoid-call-value - // solium-disable-next-line security/no-call-value - (bool success, ) = recipient.call{ value: amount }(""); - require(success, "Address: unable to send value, recipient may have reverted"); - } -} diff --git a/contracts/Utils/V0.8.13/CarefulMath.sol b/contracts/Utils/V0.8.13/CarefulMath.sol deleted file mode 100644 index baa99372b..000000000 --- a/contracts/Utils/V0.8.13/CarefulMath.sol +++ /dev/null @@ -1,84 +0,0 @@ -pragma solidity 0.8.13; - -/** - * @title Careful Math - * @author Venus - * @notice Derived from OpenZeppelin's SafeMath library - * https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/math/SafeMath.sol - */ -contract CarefulMath { - /** - * @dev Possible error codes that we can return - */ - enum MathError { - NO_ERROR, - DIVISION_BY_ZERO, - INTEGER_OVERFLOW, - INTEGER_UNDERFLOW - } - - /** - * @dev Multiplies two numbers, returns an error on overflow. - */ - function mulUInt(uint a, uint b) internal pure returns (MathError, uint) { - if (a == 0) { - return (MathError.NO_ERROR, 0); - } - - uint c = a * b; - - if (c / a != b) { - return (MathError.INTEGER_OVERFLOW, 0); - } else { - return (MathError.NO_ERROR, c); - } - } - - /** - * @dev Integer division of two numbers, truncating the quotient. - */ - function divUInt(uint a, uint b) internal pure returns (MathError, uint) { - if (b == 0) { - return (MathError.DIVISION_BY_ZERO, 0); - } - - return (MathError.NO_ERROR, a / b); - } - - /** - * @dev Subtracts two numbers, returns an error on overflow (i.e. if subtrahend is greater than minuend). - */ - function subUInt(uint a, uint b) internal pure returns (MathError, uint) { - if (b <= a) { - return (MathError.NO_ERROR, a - b); - } else { - return (MathError.INTEGER_UNDERFLOW, 0); - } - } - - /** - * @dev Adds two numbers, returns an error on overflow. - */ - function addUInt(uint a, uint b) internal pure returns (MathError, uint) { - uint c = a + b; - - if (c >= a) { - return (MathError.NO_ERROR, c); - } else { - return (MathError.INTEGER_OVERFLOW, 0); - } - } - - /** - * @dev add a and b and then subtract c - */ - function addThenSubUInt(uint a, uint b, uint c) internal pure returns (MathError, uint) { - (MathError err0, uint sum) = addUInt(a, b); - - if (err0 != MathError.NO_ERROR) { - return (err0, 0); - } - - return subUInt(sum, c); - } -} diff --git a/contracts/Utils/V0.8.13/Context.sol b/contracts/Utils/V0.8.13/Context.sol deleted file mode 100644 index ff604b6bf..000000000 --- a/contracts/Utils/V0.8.13/Context.sol +++ /dev/null @@ -1,26 +0,0 @@ -pragma solidity 0.8.13; - -/* - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with GSN meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - // Empty internal constructor, to prevent people from mistakenly deploying - // an instance of this contract, which should be used via inheritance. - constructor() internal {} - - function _msgSender() internal view returns (address payable) { - return payable(msg.sender); - } - - function _msgData() internal view returns (bytes memory) { - this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 - return msg.data; - } -} diff --git a/contracts/Utils/V0.8.13/ECDSA.sol b/contracts/Utils/V0.8.13/ECDSA.sol deleted file mode 100644 index f919fe4ff..000000000 --- a/contracts/Utils/V0.8.13/ECDSA.sol +++ /dev/null @@ -1,103 +0,0 @@ -// SPDX-License-Identifier: MIT -// Adapted from OpenZeppelin Contracts v4.3.2 (utils/cryptography/ECDSA.sol) - -// SPDX-Copyright-Text: OpenZeppelin, 2021 -// SPDX-Copyright-Text: Venus, 2021 - -pragma solidity 0.8.13; - -/** - * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. - * - * These functions can be used to verify that a message was signed by the holder - * of the private keys of a given address. - */ -contract ECDSA { - enum RecoverError { - NoError, - InvalidSignature, - InvalidSignatureLength, - InvalidSignatureS, - InvalidSignatureV - } - - function _throwError(RecoverError error) private pure { - if (error == RecoverError.NoError) { - return; // no error: do nothing - } else if (error == RecoverError.InvalidSignature) { - revert("ECDSA: invalid signature"); - } else if (error == RecoverError.InvalidSignatureLength) { - revert("ECDSA: invalid signature length"); - } else if (error == RecoverError.InvalidSignatureS) { - revert("ECDSA: invalid signature 's' value"); - } else if (error == RecoverError.InvalidSignatureV) { - revert("ECDSA: invalid signature 'v' value"); - } - } - - /** - * @dev Returns the address that signed a hashed message (`hash`) with - * `signature`. This address can then be used for verification purposes. - * - * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: - * this function rejects them by requiring the `s` value to be in the lower - * half order, and the `v` value to be either 27 or 28. - * - * IMPORTANT: `hash` _must_ be the result of a hash operation for the - * verification to be secure: it is possible to craft signatures that - * recover to arbitrary addresses for non-hashed data. A safe way to ensure - * this is by receiving a hash of the original message (which may otherwise - * be too long), and then calling {toEthSignedMessageHash} on it. - */ - function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) { - (address recovered, RecoverError error) = tryRecover(hash, v, r, s); - _throwError(error); - return recovered; - } - - /** - * @dev Returns the address that signed a hashed message (`hash`) with - * `signature` or error string. This address can then be used for verification purposes. - * - * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: - * this function rejects them by requiring the `s` value to be in the lower - * half order, and the `v` value to be either 27 or 28. - * - * IMPORTANT: `hash` _must_ be the result of a hash operation for the - * verification to be secure: it is possible to craft signatures that - * recover to arbitrary addresses for non-hashed data. A safe way to ensure - * this is by receiving a hash of the original message (which may otherwise - * be too long), and then calling {toEthSignedMessageHash} on it. - * - * Documentation for signature generation: - * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] - * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] - * - * _Available since v4.3._ - */ - function tryRecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address, RecoverError) { - // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature - // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines - // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most - // signatures from current libraries generate a unique signature with an s-value in the lower half order. - // - // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value - // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or - // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept - // these malleable signatures as well. - if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { - return (address(0), RecoverError.InvalidSignatureS); - } - if (v != 27 && v != 28) { - return (address(0), RecoverError.InvalidSignatureV); - } - - // If the signature is valid (and not malleable), return the signer address - address signer = ecrecover(hash, v, r, s); - if (signer == address(0)) { - return (address(0), RecoverError.InvalidSignature); - } - - return (signer, RecoverError.NoError); - } -} diff --git a/contracts/Utils/V0.8.13/ErrorReporter.sol b/contracts/Utils/V0.8.13/ErrorReporter.sol deleted file mode 100644 index e4b555c88..000000000 --- a/contracts/Utils/V0.8.13/ErrorReporter.sol +++ /dev/null @@ -1,282 +0,0 @@ -pragma solidity 0.8.13; - -contract ComptrollerErrorReporter { - enum Error { - NO_ERROR, - UNAUTHORIZED, - COMPTROLLER_MISMATCH, - INSUFFICIENT_SHORTFALL, - INSUFFICIENT_LIQUIDITY, - INVALID_CLOSE_FACTOR, - INVALID_COLLATERAL_FACTOR, - INVALID_LIQUIDATION_INCENTIVE, - MARKET_NOT_ENTERED, // no longer possible - MARKET_NOT_LISTED, - MARKET_ALREADY_LISTED, - MATH_ERROR, - NONZERO_BORROW_BALANCE, - PRICE_ERROR, - REJECTION, - SNAPSHOT_ERROR, - TOO_MANY_ASSETS, - TOO_MUCH_REPAY, - INSUFFICIENT_BALANCE_FOR_VAI - } - - enum FailureInfo { - ACCEPT_ADMIN_PENDING_ADMIN_CHECK, - ACCEPT_PENDING_IMPLEMENTATION_ADDRESS_CHECK, - EXIT_MARKET_BALANCE_OWED, - EXIT_MARKET_REJECTION, - SET_CLOSE_FACTOR_OWNER_CHECK, - SET_CLOSE_FACTOR_VALIDATION, - SET_COLLATERAL_FACTOR_OWNER_CHECK, - SET_COLLATERAL_FACTOR_NO_EXISTS, - SET_COLLATERAL_FACTOR_VALIDATION, - SET_COLLATERAL_FACTOR_WITHOUT_PRICE, - SET_IMPLEMENTATION_OWNER_CHECK, - SET_LIQUIDATION_INCENTIVE_OWNER_CHECK, - SET_LIQUIDATION_INCENTIVE_VALIDATION, - SET_MAX_ASSETS_OWNER_CHECK, - SET_PENDING_ADMIN_OWNER_CHECK, - SET_PENDING_IMPLEMENTATION_OWNER_CHECK, - SET_PRICE_ORACLE_OWNER_CHECK, - SUPPORT_MARKET_EXISTS, - SUPPORT_MARKET_OWNER_CHECK, - SET_PAUSE_GUARDIAN_OWNER_CHECK, - SET_VAI_MINT_RATE_CHECK, - SET_VAICONTROLLER_OWNER_CHECK, - SET_MINTED_VAI_REJECTION, - SET_TREASURY_OWNER_CHECK - } - - /** - * @dev `error` corresponds to enum Error; `info` corresponds to enum FailureInfo, and `detail` is an arbitrary - * contract-specific code that enables us to report opaque error codes from upgradeable contracts. - **/ - event Failure(uint error, uint info, uint detail); - - /** - * @dev use this when reporting a known error from the money market or a non-upgradeable collaborator - */ - function fail(Error err, FailureInfo info) internal returns (uint) { - emit Failure(uint(err), uint(info), 0); - - return uint(err); - } - - /** - * @dev use this when reporting an opaque error from an upgradeable collaborator contract - */ - function failOpaque(Error err, FailureInfo info, uint opaqueError) internal returns (uint) { - emit Failure(uint(err), uint(info), opaqueError); - - return uint(err); - } -} - -contract TokenErrorReporter { - enum Error { - NO_ERROR, - UNAUTHORIZED, - BAD_INPUT, - COMPTROLLER_REJECTION, - COMPTROLLER_CALCULATION_ERROR, - INTEREST_RATE_MODEL_ERROR, - INVALID_ACCOUNT_PAIR, - INVALID_CLOSE_AMOUNT_REQUESTED, - INVALID_COLLATERAL_FACTOR, - MATH_ERROR, - MARKET_NOT_FRESH, - MARKET_NOT_LISTED, - TOKEN_INSUFFICIENT_ALLOWANCE, - TOKEN_INSUFFICIENT_BALANCE, - TOKEN_INSUFFICIENT_CASH, - TOKEN_TRANSFER_IN_FAILED, - TOKEN_TRANSFER_OUT_FAILED, - TOKEN_PRICE_ERROR - } - - /* - * Note: FailureInfo (but not Error) is kept in alphabetical order - * This is because FailureInfo grows significantly faster, and - * the order of Error has some meaning, while the order of FailureInfo - * is entirely arbitrary. - */ - enum FailureInfo { - ACCEPT_ADMIN_PENDING_ADMIN_CHECK, - ACCRUE_INTEREST_ACCUMULATED_INTEREST_CALCULATION_FAILED, - ACCRUE_INTEREST_BORROW_RATE_CALCULATION_FAILED, - ACCRUE_INTEREST_NEW_BORROW_INDEX_CALCULATION_FAILED, - ACCRUE_INTEREST_NEW_TOTAL_BORROWS_CALCULATION_FAILED, - ACCRUE_INTEREST_NEW_TOTAL_RESERVES_CALCULATION_FAILED, - ACCRUE_INTEREST_SIMPLE_INTEREST_FACTOR_CALCULATION_FAILED, - BORROW_ACCUMULATED_BALANCE_CALCULATION_FAILED, - BORROW_ACCRUE_INTEREST_FAILED, - BORROW_CASH_NOT_AVAILABLE, - BORROW_FRESHNESS_CHECK, - BORROW_NEW_TOTAL_BALANCE_CALCULATION_FAILED, - BORROW_NEW_ACCOUNT_BORROW_BALANCE_CALCULATION_FAILED, - BORROW_MARKET_NOT_LISTED, - BORROW_COMPTROLLER_REJECTION, - LIQUIDATE_ACCRUE_BORROW_INTEREST_FAILED, - LIQUIDATE_ACCRUE_COLLATERAL_INTEREST_FAILED, - LIQUIDATE_COLLATERAL_FRESHNESS_CHECK, - LIQUIDATE_COMPTROLLER_REJECTION, - LIQUIDATE_COMPTROLLER_CALCULATE_AMOUNT_SEIZE_FAILED, - LIQUIDATE_CLOSE_AMOUNT_IS_UINT_MAX, - LIQUIDATE_CLOSE_AMOUNT_IS_ZERO, - LIQUIDATE_FRESHNESS_CHECK, - LIQUIDATE_LIQUIDATOR_IS_BORROWER, - LIQUIDATE_REPAY_BORROW_FRESH_FAILED, - LIQUIDATE_SEIZE_BALANCE_INCREMENT_FAILED, - LIQUIDATE_SEIZE_BALANCE_DECREMENT_FAILED, - LIQUIDATE_SEIZE_COMPTROLLER_REJECTION, - LIQUIDATE_SEIZE_LIQUIDATOR_IS_BORROWER, - LIQUIDATE_SEIZE_TOO_MUCH, - MINT_ACCRUE_INTEREST_FAILED, - MINT_COMPTROLLER_REJECTION, - MINT_EXCHANGE_CALCULATION_FAILED, - MINT_EXCHANGE_RATE_READ_FAILED, - MINT_FRESHNESS_CHECK, - MINT_NEW_ACCOUNT_BALANCE_CALCULATION_FAILED, - MINT_NEW_TOTAL_SUPPLY_CALCULATION_FAILED, - MINT_TRANSFER_IN_FAILED, - MINT_TRANSFER_IN_NOT_POSSIBLE, - REDEEM_ACCRUE_INTEREST_FAILED, - REDEEM_COMPTROLLER_REJECTION, - REDEEM_EXCHANGE_TOKENS_CALCULATION_FAILED, - REDEEM_EXCHANGE_AMOUNT_CALCULATION_FAILED, - REDEEM_EXCHANGE_RATE_READ_FAILED, - REDEEM_FRESHNESS_CHECK, - REDEEM_NEW_ACCOUNT_BALANCE_CALCULATION_FAILED, - REDEEM_NEW_TOTAL_SUPPLY_CALCULATION_FAILED, - REDEEM_TRANSFER_OUT_NOT_POSSIBLE, - REDUCE_RESERVES_ACCRUE_INTEREST_FAILED, - REDUCE_RESERVES_ADMIN_CHECK, - REDUCE_RESERVES_CASH_NOT_AVAILABLE, - REDUCE_RESERVES_FRESH_CHECK, - REDUCE_RESERVES_VALIDATION, - REPAY_BEHALF_ACCRUE_INTEREST_FAILED, - REPAY_BORROW_ACCRUE_INTEREST_FAILED, - REPAY_BORROW_ACCUMULATED_BALANCE_CALCULATION_FAILED, - REPAY_BORROW_COMPTROLLER_REJECTION, - REPAY_BORROW_FRESHNESS_CHECK, - REPAY_BORROW_NEW_ACCOUNT_BORROW_BALANCE_CALCULATION_FAILED, - REPAY_BORROW_NEW_TOTAL_BALANCE_CALCULATION_FAILED, - REPAY_BORROW_TRANSFER_IN_NOT_POSSIBLE, - SET_COLLATERAL_FACTOR_OWNER_CHECK, - SET_COLLATERAL_FACTOR_VALIDATION, - SET_COMPTROLLER_OWNER_CHECK, - SET_INTEREST_RATE_MODEL_ACCRUE_INTEREST_FAILED, - SET_INTEREST_RATE_MODEL_FRESH_CHECK, - SET_INTEREST_RATE_MODEL_OWNER_CHECK, - SET_MAX_ASSETS_OWNER_CHECK, - SET_ORACLE_MARKET_NOT_LISTED, - SET_PENDING_ADMIN_OWNER_CHECK, - SET_RESERVE_FACTOR_ACCRUE_INTEREST_FAILED, - SET_RESERVE_FACTOR_ADMIN_CHECK, - SET_RESERVE_FACTOR_FRESH_CHECK, - SET_RESERVE_FACTOR_BOUNDS_CHECK, - TRANSFER_COMPTROLLER_REJECTION, - TRANSFER_NOT_ALLOWED, - TRANSFER_NOT_ENOUGH, - TRANSFER_TOO_MUCH, - ADD_RESERVES_ACCRUE_INTEREST_FAILED, - ADD_RESERVES_FRESH_CHECK, - ADD_RESERVES_TRANSFER_IN_NOT_POSSIBLE, - TOKEN_GET_UNDERLYING_PRICE_ERROR, - REPAY_VAI_COMPTROLLER_REJECTION, - REPAY_VAI_FRESHNESS_CHECK, - VAI_MINT_EXCHANGE_CALCULATION_FAILED, - SFT_MINT_NEW_ACCOUNT_BALANCE_CALCULATION_FAILED, - REDEEM_FEE_CALCULATION_FAILED - } - - /** - * @dev `error` corresponds to enum Error; `info` corresponds to enum FailureInfo, and `detail` is an arbitrary - * contract-specific code that enables us to report opaque error codes from upgradeable contracts. - **/ - event Failure(uint error, uint info, uint detail); - - /** - * @dev use this when reporting a known error from the money market or a non-upgradeable collaborator - */ - function fail(Error err, FailureInfo info) internal returns (uint) { - emit Failure(uint(err), uint(info), 0); - - return uint(err); - } - - /** - * @dev use this when reporting an opaque error from an upgradeable collaborator contract - */ - function failOpaque(Error err, FailureInfo info, uint opaqueError) internal returns (uint) { - emit Failure(uint(err), uint(info), opaqueError); - - return uint(err); - } -} - -contract VAIControllerErrorReporter { - enum Error { - NO_ERROR, - UNAUTHORIZED, - REJECTION, - SNAPSHOT_ERROR, - PRICE_ERROR, - MATH_ERROR, - INSUFFICIENT_BALANCE_FOR_VAI - } - - enum FailureInfo { - SET_PENDING_ADMIN_OWNER_CHECK, - SET_PENDING_IMPLEMENTATION_OWNER_CHECK, - SET_COMPTROLLER_OWNER_CHECK, - ACCEPT_ADMIN_PENDING_ADMIN_CHECK, - ACCEPT_PENDING_IMPLEMENTATION_ADDRESS_CHECK, - VAI_MINT_REJECTION, - VAI_BURN_REJECTION, - VAI_LIQUIDATE_ACCRUE_BORROW_INTEREST_FAILED, - VAI_LIQUIDATE_ACCRUE_COLLATERAL_INTEREST_FAILED, - VAI_LIQUIDATE_COLLATERAL_FRESHNESS_CHECK, - VAI_LIQUIDATE_COMPTROLLER_REJECTION, - VAI_LIQUIDATE_COMPTROLLER_CALCULATE_AMOUNT_SEIZE_FAILED, - VAI_LIQUIDATE_CLOSE_AMOUNT_IS_UINT_MAX, - VAI_LIQUIDATE_CLOSE_AMOUNT_IS_ZERO, - VAI_LIQUIDATE_FRESHNESS_CHECK, - VAI_LIQUIDATE_LIQUIDATOR_IS_BORROWER, - VAI_LIQUIDATE_REPAY_BORROW_FRESH_FAILED, - VAI_LIQUIDATE_SEIZE_BALANCE_INCREMENT_FAILED, - VAI_LIQUIDATE_SEIZE_BALANCE_DECREMENT_FAILED, - VAI_LIQUIDATE_SEIZE_COMPTROLLER_REJECTION, - VAI_LIQUIDATE_SEIZE_LIQUIDATOR_IS_BORROWER, - VAI_LIQUIDATE_SEIZE_TOO_MUCH, - MINT_FEE_CALCULATION_FAILED, - SET_TREASURY_OWNER_CHECK - } - - /** - * @dev `error` corresponds to enum Error; `info` corresponds to enum FailureInfo, and `detail` is an arbitrary - * contract-specific code that enables us to report opaque error codes from upgradeable contracts. - **/ - event Failure(uint error, uint info, uint detail); - - /** - * @dev use this when reporting a known error from the money market or a non-upgradeable collaborator - */ - function fail(Error err, FailureInfo info) internal returns (uint) { - emit Failure(uint(err), uint(info), 0); - - return uint(err); - } - - /** - * @dev use this when reporting an opaque error from an upgradeable collaborator contract - */ - function failOpaque(Error err, FailureInfo info, uint opaqueError) internal returns (uint) { - emit Failure(uint(err), uint(info), opaqueError); - - return uint(err); - } -} diff --git a/contracts/Utils/V0.8.13/Exponential.sol b/contracts/Utils/V0.8.13/Exponential.sol deleted file mode 100644 index 304a7e870..000000000 --- a/contracts/Utils/V0.8.13/Exponential.sol +++ /dev/null @@ -1,181 +0,0 @@ -pragma solidity 0.8.13; - -import "./CarefulMath.sol"; -import "./ExponentialNoError.sol"; - -/** - * @title Exponential module for storing fixed-precision decimals - * @author Venus - * @notice Exp is a struct which stores decimals with a fixed precision of 18 decimal places. - * Thus, if we wanted to store the 5.1, mantissa would store 5.1e18. That is: - * `Exp({mantissa: 5100000000000000000})`. - */ -contract Exponential is CarefulMath, ExponentialNoError { - /** - * @dev Creates an exponential from numerator and denominator values. - * Note: Returns an error if (`num` * 10e18) > MAX_INT, - * or if `denom` is zero. - */ - function getExp(uint num, uint denom) internal pure returns (MathError, Exp memory) { - (MathError err0, uint scaledNumerator) = mulUInt(num, expScale); - if (err0 != MathError.NO_ERROR) { - return (err0, Exp({ mantissa: 0 })); - } - - (MathError err1, uint rational) = divUInt(scaledNumerator, denom); - if (err1 != MathError.NO_ERROR) { - return (err1, Exp({ mantissa: 0 })); - } - - return (MathError.NO_ERROR, Exp({ mantissa: rational })); - } - - /** - * @dev Adds two exponentials, returning a new exponential. - */ - function addExp(Exp memory a, Exp memory b) internal pure returns (MathError, Exp memory) { - (MathError error, uint result) = addUInt(a.mantissa, b.mantissa); - - return (error, Exp({ mantissa: result })); - } - - /** - * @dev Subtracts two exponentials, returning a new exponential. - */ - function subExp(Exp memory a, Exp memory b) internal pure returns (MathError, Exp memory) { - (MathError error, uint result) = subUInt(a.mantissa, b.mantissa); - - return (error, Exp({ mantissa: result })); - } - - /** - * @dev Multiply an Exp by a scalar, returning a new Exp. - */ - function mulScalar(Exp memory a, uint scalar) internal pure returns (MathError, Exp memory) { - (MathError err0, uint scaledMantissa) = mulUInt(a.mantissa, scalar); - if (err0 != MathError.NO_ERROR) { - return (err0, Exp({ mantissa: 0 })); - } - - return (MathError.NO_ERROR, Exp({ mantissa: scaledMantissa })); - } - - /** - * @dev Multiply an Exp by a scalar, then truncate to return an unsigned integer. - */ - function mulScalarTruncate(Exp memory a, uint scalar) internal pure returns (MathError, uint) { - (MathError err, Exp memory product) = mulScalar(a, scalar); - if (err != MathError.NO_ERROR) { - return (err, 0); - } - - return (MathError.NO_ERROR, truncate(product)); - } - - /** - * @dev Multiply an Exp by a scalar, truncate, then add an to an unsigned integer, returning an unsigned integer. - */ - function mulScalarTruncateAddUInt(Exp memory a, uint scalar, uint addend) internal pure returns (MathError, uint) { - (MathError err, Exp memory product) = mulScalar(a, scalar); - if (err != MathError.NO_ERROR) { - return (err, 0); - } - - return addUInt(truncate(product), addend); - } - - /** - * @dev Divide an Exp by a scalar, returning a new Exp. - */ - function divScalar(Exp memory a, uint scalar) internal pure returns (MathError, Exp memory) { - (MathError err0, uint descaledMantissa) = divUInt(a.mantissa, scalar); - if (err0 != MathError.NO_ERROR) { - return (err0, Exp({ mantissa: 0 })); - } - - return (MathError.NO_ERROR, Exp({ mantissa: descaledMantissa })); - } - - /** - * @dev Divide a scalar by an Exp, returning a new Exp. - */ - function divScalarByExp(uint scalar, Exp memory divisor) internal pure returns (MathError, Exp memory) { - /* - We are doing this as: - getExp(mulUInt(expScale, scalar), divisor.mantissa) - - How it works: - Exp = a / b; - Scalar = s; - `s / (a / b)` = `b * s / a` and since for an Exp `a = mantissa, b = expScale` - */ - (MathError err0, uint numerator) = mulUInt(expScale, scalar); - if (err0 != MathError.NO_ERROR) { - return (err0, Exp({ mantissa: 0 })); - } - return getExp(numerator, divisor.mantissa); - } - - /** - * @dev Divide a scalar by an Exp, then truncate to return an unsigned integer. - */ - function divScalarByExpTruncate(uint scalar, Exp memory divisor) internal pure returns (MathError, uint) { - (MathError err, Exp memory fraction) = divScalarByExp(scalar, divisor); - if (err != MathError.NO_ERROR) { - return (err, 0); - } - - return (MathError.NO_ERROR, truncate(fraction)); - } - - /** - * @dev Multiplies two exponentials, returning a new exponential. - */ - function mulExp(Exp memory a, Exp memory b) internal pure returns (MathError, Exp memory) { - (MathError err0, uint doubleScaledProduct) = mulUInt(a.mantissa, b.mantissa); - if (err0 != MathError.NO_ERROR) { - return (err0, Exp({ mantissa: 0 })); - } - - // We add half the scale before dividing so that we get rounding instead of truncation. - // See "Listing 6" and text above it at https://accu.org/index.php/journals/1717 - // Without this change, a result like 6.6...e-19 will be truncated to 0 instead of being rounded to 1e-18. - (MathError err1, uint doubleScaledProductWithHalfScale) = addUInt(halfExpScale, doubleScaledProduct); - if (err1 != MathError.NO_ERROR) { - return (err1, Exp({ mantissa: 0 })); - } - - (MathError err2, uint product) = divUInt(doubleScaledProductWithHalfScale, expScale); - // The only error `div` can return is MathError.DIVISION_BY_ZERO but we control `expScale` and it is not zero. - assert(err2 == MathError.NO_ERROR); - - return (MathError.NO_ERROR, Exp({ mantissa: product })); - } - - /** - * @dev Multiplies two exponentials given their mantissas, returning a new exponential. - */ - function mulExp(uint a, uint b) internal pure returns (MathError, Exp memory) { - return mulExp(Exp({ mantissa: a }), Exp({ mantissa: b })); - } - - /** - * @dev Multiplies three exponentials, returning a new exponential. - */ - function mulExp3(Exp memory a, Exp memory b, Exp memory c) internal pure returns (MathError, Exp memory) { - (MathError err, Exp memory ab) = mulExp(a, b); - if (err != MathError.NO_ERROR) { - return (err, ab); - } - return mulExp(ab, c); - } - - /** - * @dev Divides two exponentials, returning a new exponential. - * (a/scale) / (b/scale) = (a/scale) * (scale/b) = a/b, - * which we can scale as an Exp by calling getExp(a.mantissa, b.mantissa) - */ - function divExp(Exp memory a, Exp memory b) internal pure returns (MathError, Exp memory) { - return getExp(a.mantissa, b.mantissa); - } -} diff --git a/contracts/Utils/V0.8.13/ExponentialNoError.sol b/contracts/Utils/V0.8.13/ExponentialNoError.sol deleted file mode 100644 index 9036400b6..000000000 --- a/contracts/Utils/V0.8.13/ExponentialNoError.sol +++ /dev/null @@ -1,195 +0,0 @@ -pragma solidity 0.8.13; - -/** - * @title Exponential module for storing fixed-precision decimals - * @author Compound - * @notice Exp is a struct which stores decimals with a fixed precision of 18 decimal places. - * Thus, if we wanted to store the 5.1, mantissa would store 5.1e18. That is: - * `Exp({mantissa: 5100000000000000000})`. - */ -contract ExponentialNoError { - uint internal constant expScale = 1e18; - uint internal constant doubleScale = 1e36; - uint internal constant halfExpScale = expScale / 2; - uint internal constant mantissaOne = expScale; - - struct Exp { - uint mantissa; - } - - struct Double { - uint mantissa; - } - - /** - * @dev Truncates the given exp to a whole number value. - * For example, truncate(Exp{mantissa: 15 * expScale}) = 15 - */ - function truncate(Exp memory exp) internal pure returns (uint) { - // Note: We are not using careful math here as we're performing a division that cannot fail - return exp.mantissa / expScale; - } - - /** - * @dev Multiply an Exp by a scalar, then truncate to return an unsigned integer. - */ - function mul_ScalarTruncate(Exp memory a, uint scalar) internal pure returns (uint) { - Exp memory product = mul_(a, scalar); - return truncate(product); - } - - /** - * @dev Multiply an Exp by a scalar, truncate, then add an to an unsigned integer, returning an unsigned integer. - */ - function mul_ScalarTruncateAddUInt(Exp memory a, uint scalar, uint addend) internal pure returns (uint) { - Exp memory product = mul_(a, scalar); - return add_(truncate(product), addend); - } - - /** - * @dev Checks if first Exp is less than second Exp. - */ - function lessThanExp(Exp memory left, Exp memory right) internal pure returns (bool) { - return left.mantissa < right.mantissa; - } - - /** - * @dev Checks if left Exp <= right Exp. - */ - function lessThanOrEqualExp(Exp memory left, Exp memory right) internal pure returns (bool) { - return left.mantissa <= right.mantissa; - } - - /** - * @dev Checks if left Exp > right Exp. - */ - function greaterThanExp(Exp memory left, Exp memory right) internal pure returns (bool) { - return left.mantissa > right.mantissa; - } - - /** - * @dev returns true if Exp is exactly zero - */ - function isZeroExp(Exp memory value) internal pure returns (bool) { - return value.mantissa == 0; - } - - function safe224(uint n, string memory errorMessage) internal pure returns (uint224) { - require(n < 2 ** 224, errorMessage); - return uint224(n); - } - - function safe32(uint n, string memory errorMessage) internal pure returns (uint32) { - require(n < 2 ** 32, errorMessage); - return uint32(n); - } - - function add_(Exp memory a, Exp memory b) internal pure returns (Exp memory) { - return Exp({ mantissa: add_(a.mantissa, b.mantissa) }); - } - - function add_(Double memory a, Double memory b) internal pure returns (Double memory) { - return Double({ mantissa: add_(a.mantissa, b.mantissa) }); - } - - function add_(uint a, uint b) internal pure returns (uint) { - return add_(a, b, "addition overflow"); - } - - function add_(uint a, uint b, string memory errorMessage) internal pure returns (uint) { - uint c = a + b; - require(c >= a, errorMessage); - return c; - } - - function sub_(Exp memory a, Exp memory b) internal pure returns (Exp memory) { - return Exp({ mantissa: sub_(a.mantissa, b.mantissa) }); - } - - function sub_(Double memory a, Double memory b) internal pure returns (Double memory) { - return Double({ mantissa: sub_(a.mantissa, b.mantissa) }); - } - - function sub_(uint a, uint b) internal pure returns (uint) { - return sub_(a, b, "subtraction underflow"); - } - - function sub_(uint a, uint b, string memory errorMessage) internal pure returns (uint) { - require(b <= a, errorMessage); - return a - b; - } - - function mul_(Exp memory a, Exp memory b) internal pure returns (Exp memory) { - return Exp({ mantissa: mul_(a.mantissa, b.mantissa) / expScale }); - } - - function mul_(Exp memory a, uint b) internal pure returns (Exp memory) { - return Exp({ mantissa: mul_(a.mantissa, b) }); - } - - function mul_(uint a, Exp memory b) internal pure returns (uint) { - return mul_(a, b.mantissa) / expScale; - } - - function mul_(Double memory a, Double memory b) internal pure returns (Double memory) { - return Double({ mantissa: mul_(a.mantissa, b.mantissa) / doubleScale }); - } - - function mul_(Double memory a, uint b) internal pure returns (Double memory) { - return Double({ mantissa: mul_(a.mantissa, b) }); - } - - function mul_(uint a, Double memory b) internal pure returns (uint) { - return mul_(a, b.mantissa) / doubleScale; - } - - function mul_(uint a, uint b) internal pure returns (uint) { - return mul_(a, b, "multiplication overflow"); - } - - function mul_(uint a, uint b, string memory errorMessage) internal pure returns (uint) { - if (a == 0 || b == 0) { - return 0; - } - uint c = a * b; - require(c / a == b, errorMessage); - return c; - } - - function div_(Exp memory a, Exp memory b) internal pure returns (Exp memory) { - return Exp({ mantissa: div_(mul_(a.mantissa, expScale), b.mantissa) }); - } - - function div_(Exp memory a, uint b) internal pure returns (Exp memory) { - return Exp({ mantissa: div_(a.mantissa, b) }); - } - - function div_(uint a, Exp memory b) internal pure returns (uint) { - return div_(mul_(a, expScale), b.mantissa); - } - - function div_(Double memory a, Double memory b) internal pure returns (Double memory) { - return Double({ mantissa: div_(mul_(a.mantissa, doubleScale), b.mantissa) }); - } - - function div_(Double memory a, uint b) internal pure returns (Double memory) { - return Double({ mantissa: div_(a.mantissa, b) }); - } - - function div_(uint a, Double memory b) internal pure returns (uint) { - return div_(mul_(a, doubleScale), b.mantissa); - } - - function div_(uint a, uint b) internal pure returns (uint) { - return div_(a, b, "divide by zero"); - } - - function div_(uint a, uint b, string memory errorMessage) internal pure returns (uint) { - require(b > 0, errorMessage); - return a / b; - } - - function fraction(uint a, uint b) internal pure returns (Double memory) { - return Double({ mantissa: div_(mul_(a, doubleScale), b) }); - } -} diff --git a/contracts/Utils/V0.8.13/IBEP20.sol b/contracts/Utils/V0.8.13/IBEP20.sol deleted file mode 100644 index 4e990eb34..000000000 --- a/contracts/Utils/V0.8.13/IBEP20.sol +++ /dev/null @@ -1,76 +0,0 @@ -pragma solidity 0.8.13; - -/** - * @dev Interface of the BEP20 standard as defined in the EIP. Does not include - * the optional functions; to access them see {BEP20Detailed}. - */ -interface IBEP20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} diff --git a/contracts/Utils/V0.8.13/Ownable.sol b/contracts/Utils/V0.8.13/Ownable.sol deleted file mode 100644 index 49d9f17ef..000000000 --- a/contracts/Utils/V0.8.13/Ownable.sol +++ /dev/null @@ -1,74 +0,0 @@ -pragma solidity 0.8.13; - -import "./Context.sol"; - -/** - * @dev Contract module which provides a basic access control mechanism, where - * there is an account (an owner) that can be granted exclusive access to - * specific functions. - * - * By default, the owner account will be the one that deploys the contract. This - * can later be changed with {transferOwnership}. - * - * This module is used through inheritance. It will make available the modifier - * `onlyOwner`, which can be applied to your functions to restrict their use to - * the owner. - */ -abstract contract Ownable is Context { - address private _owner; - - event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); - - /** - * @dev Initializes the contract setting the deployer as the initial owner. - */ - constructor() internal { - address msgSender = _msgSender(); - _owner = msgSender; - emit OwnershipTransferred(address(0), msgSender); - } - - /** - * @dev Returns the address of the current owner. - */ - function owner() public view returns (address) { - return _owner; - } - - /** - * @dev Throws if called by any account other than the owner. - */ - modifier onlyOwner() { - require(_owner == _msgSender(), "Ownable: caller is not the owner"); - _; - } - - /** - * @dev Leaves the contract without owner. It will not be possible to call - * `onlyOwner` functions anymore. Can only be called by the current owner. - * - * NOTE: Renouncing ownership will leave the contract without an owner, - * thereby removing any functionality that is only available to the owner. - */ - function renounceOwnership() public onlyOwner { - emit OwnershipTransferred(_owner, address(0)); - _owner = address(0); - } - - /** - * @dev Transfers ownership of the contract to a new account (`newOwner`). - * Can only be called by the current owner. - */ - function transferOwnership(address newOwner) public onlyOwner { - _transferOwnership(newOwner); - } - - /** - * @dev Transfers ownership of the contract to a new account (`newOwner`). - */ - function _transferOwnership(address newOwner) internal { - require(newOwner != address(0), "Ownable: new owner is the zero address"); - emit OwnershipTransferred(_owner, newOwner); - _owner = newOwner; - } -} diff --git a/contracts/Utils/V0.8.13/Owned.sol b/contracts/Utils/V0.8.13/Owned.sol deleted file mode 100644 index aef4726dd..000000000 --- a/contracts/Utils/V0.8.13/Owned.sol +++ /dev/null @@ -1,21 +0,0 @@ -pragma solidity 0.8.13; - -contract Owned { - address public owner; - - event OwnershipTransferred(address indexed _from, address indexed _to); - - constructor() public { - owner = msg.sender; - } - - modifier onlyOwner() { - require(msg.sender == owner, "Should be owner"); - _; - } - - function transferOwnership(address newOwner) public onlyOwner { - owner = newOwner; - emit OwnershipTransferred(owner, newOwner); - } -} diff --git a/contracts/Utils/V0.8.13/SafeBEP20.sol b/contracts/Utils/V0.8.13/SafeBEP20.sol deleted file mode 100644 index 41ccd3808..000000000 --- a/contracts/Utils/V0.8.13/SafeBEP20.sol +++ /dev/null @@ -1,80 +0,0 @@ -pragma solidity 0.8.13; - -import "./SafeMath.sol"; -import "./IBEP20.sol"; -import "./Address.sol"; - -/** - * @title SafeBEP20 - * @dev Wrappers around BEP20 operations that throw on failure (when the token - * contract returns false). Tokens that return no value (and instead revert or - * throw on failure) are also supported, non-reverting calls are assumed to be - * successful. - * To use this library you can add a `using SafeBEP20 for BEP20;` statement to your contract, - * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. - */ -library SafeBEP20 { - using SafeMath for uint256; - using Address for address; - - function safeTransfer(IBEP20 token, address to, uint256 value) internal { - callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); - } - - function safeTransferFrom(IBEP20 token, address from, address to, uint256 value) internal { - callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); - } - - function safeApprove(IBEP20 token, address spender, uint256 value) internal { - // safeApprove should only be called when setting an initial allowance, - // or when resetting it to zero. To increase and decrease it, use - // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' - // solhint-disable-next-line max-line-length - require( - (value == 0) || (token.allowance(address(this), spender) == 0), - "SafeBEP20: approve from non-zero to non-zero allowance" - ); - callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); - } - - function safeIncreaseAllowance(IBEP20 token, address spender, uint256 value) internal { - uint256 newAllowance = token.allowance(address(this), spender).add(value); - callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); - } - - function safeDecreaseAllowance(IBEP20 token, address spender, uint256 value) internal { - uint256 newAllowance = token.allowance(address(this), spender).sub( - value, - "SafeBEP20: decreased allowance below zero" - ); - callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); - } - - /** - * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement - * on the return value: the return value is optional (but if data is returned, it must not be false). - * @param token The token targeted by the call. - * @param data The call data (encoded using abi.encode or one of its variants). - */ - function callOptionalReturn(IBEP20 token, bytes memory data) private { - // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since - // we're implementing it ourselves. - - // A Solidity high level call has three parts: - // 1. The target address is checked to verify it contains contract code - // 2. The call itself is made, and success asserted - // 3. The return value is decoded, which in turn checks the size of the returned data. - // solhint-disable-next-line max-line-length - require(address(token).isContract(), "SafeBEP20: call to non-contract"); - - // solhint-disable-next-line avoid-low-level-calls - (bool success, bytes memory returndata) = address(token).call(data); - require(success, "SafeBEP20: low-level call failed"); - - if (returndata.length > 0) { - // Return data is optional - // solhint-disable-next-line max-line-length - require(abi.decode(returndata, (bool)), "SafeBEP20: BEP20 operation did not succeed"); - } - } -} diff --git a/contracts/Utils/V0.8.13/SafeCast.sol b/contracts/Utils/V0.8.13/SafeCast.sol deleted file mode 100644 index 540a54ef9..000000000 --- a/contracts/Utils/V0.8.13/SafeCast.sol +++ /dev/null @@ -1,207 +0,0 @@ -pragma solidity 0.8.13; - -/** - * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow - * checks. - * - * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can - * easily result in undesired exploitation or bugs, since developers usually - * assume that overflows raise errors. `SafeCast` restores this intuition by - * reverting the transaction when such an operation overflows. - * - * Using this library instead of the unchecked operations eliminates an entire - * class of bugs, so it's recommended to use it always. - * - * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing - * all math on `uint256` and `int256` and then downcasting. - */ -library SafeCast { - /** - * @dev Returns the downcasted uint128 from uint256, reverting on - * overflow (when the input is greater than largest uint128). - * - * Counterpart to Solidity's `uint128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - */ - function toUint128(uint256 value) internal pure returns (uint128) { - require(value < 2 ** 128, "SafeCast: value doesn't fit in 128 bits"); - return uint128(value); - } - - /** - * @dev Returns the downcasted uint64 from uint256, reverting on - * overflow (when the input is greater than largest uint64). - * - * Counterpart to Solidity's `uint64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - */ - function toUint64(uint256 value) internal pure returns (uint64) { - require(value < 2 ** 64, "SafeCast: value doesn't fit in 64 bits"); - return uint64(value); - } - - /** - * @dev Returns the downcasted uint32 from uint256, reverting on - * overflow (when the input is greater than largest uint32). - * - * Counterpart to Solidity's `uint32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - */ - function toUint32(uint256 value) internal pure returns (uint32) { - require(value < 2 ** 32, "SafeCast: value doesn't fit in 32 bits"); - return uint32(value); - } - - /** - * @dev Returns the downcasted uint16 from uint256, reverting on - * overflow (when the input is greater than largest uint16). - * - * Counterpart to Solidity's `uint16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - */ - function toUint16(uint256 value) internal pure returns (uint16) { - require(value < 2 ** 16, "SafeCast: value doesn't fit in 16 bits"); - return uint16(value); - } - - /** - * @dev Returns the downcasted uint8 from uint256, reverting on - * overflow (when the input is greater than largest uint8). - * - * Counterpart to Solidity's `uint8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - */ - function toUint8(uint256 value) internal pure returns (uint8) { - require(value < 2 ** 8, "SafeCast: value doesn't fit in 8 bits"); - return uint8(value); - } - - /** - * @dev Converts a signed int256 into an unsigned uint256. - * - * Requirements: - * - * - input must be greater than or equal to 0. - */ - function toUint256(int256 value) internal pure returns (uint256) { - require(value >= 0, "SafeCast: value must be positive"); - return uint256(value); - } - - /** - * @dev Returns the downcasted int128 from int256, reverting on - * overflow (when the input is less than smallest int128 or - * greater than largest int128). - * - * Counterpart to Solidity's `int128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - * - * _Available since v3.1._ - */ - function toInt128(int256 value) internal pure returns (int128) { - require(value >= -2 ** 127 && value < 2 ** 127, "SafeCast: value doesn't fit in 128 bits"); - return int128(value); - } - - /** - * @dev Returns the downcasted int64 from int256, reverting on - * overflow (when the input is less than smallest int64 or - * greater than largest int64). - * - * Counterpart to Solidity's `int64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - * - * _Available since v3.1._ - */ - function toInt64(int256 value) internal pure returns (int64) { - require(value >= -2 ** 63 && value < 2 ** 63, "SafeCast: value doesn't fit in 64 bits"); - return int64(value); - } - - /** - * @dev Returns the downcasted int32 from int256, reverting on - * overflow (when the input is less than smallest int32 or - * greater than largest int32). - * - * Counterpart to Solidity's `int32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - * - * _Available since v3.1._ - */ - function toInt32(int256 value) internal pure returns (int32) { - require(value >= -2 ** 31 && value < 2 ** 31, "SafeCast: value doesn't fit in 32 bits"); - return int32(value); - } - - /** - * @dev Returns the downcasted int16 from int256, reverting on - * overflow (when the input is less than smallest int16 or - * greater than largest int16). - * - * Counterpart to Solidity's `int16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - * - * _Available since v3.1._ - */ - function toInt16(int256 value) internal pure returns (int16) { - require(value >= -2 ** 15 && value < 2 ** 15, "SafeCast: value doesn't fit in 16 bits"); - return int16(value); - } - - /** - * @dev Returns the downcasted int8 from int256, reverting on - * overflow (when the input is less than smallest int8 or - * greater than largest int8). - * - * Counterpart to Solidity's `int8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - * - * _Available since v3.1._ - */ - function toInt8(int256 value) internal pure returns (int8) { - require(value >= -2 ** 7 && value < 2 ** 7, "SafeCast: value doesn't fit in 8 bits"); - return int8(value); - } - - /** - * @dev Converts an unsigned uint256 into a signed int256. - * - * Requirements: - * - * - input must be less than or equal to maxInt256. - */ - function toInt256(uint256 value) internal pure returns (int256) { - require(value < 2 ** 255, "SafeCast: value doesn't fit in an int256"); - return int256(value); - } -} diff --git a/contracts/Utils/V0.8.13/SafeMath.sol b/contracts/Utils/V0.8.13/SafeMath.sol deleted file mode 100644 index 2225efbd9..000000000 --- a/contracts/Utils/V0.8.13/SafeMath.sol +++ /dev/null @@ -1,163 +0,0 @@ -pragma solidity 0.8.13; - -/** - * @dev Wrappers over Solidity's arithmetic operations with added overflow - * checks. - * - * Arithmetic operations in Solidity wrap on overflow. This can easily result - * in bugs, because programmers usually assume that an overflow raises an - * error, which is the standard behavior in high level programming languages. - * `SafeMath` restores this intuition by reverting the transaction when an - * operation overflows. - * - * Using this library instead of the unchecked operations eliminates an entire - * class of bugs, so it's recommended to use it always. - */ -library SafeMath { - /** - * @dev Returns the addition of two unsigned integers, reverting on - * overflow. - * - * Counterpart to Solidity's `+` operator. - * - * Requirements: - * - Addition cannot overflow. - */ - function add(uint256 a, uint256 b) internal pure returns (uint256) { - return add(a, b, "SafeMath: addition overflow"); - } - - /** - * @dev Returns the subtraction of two unsigned integers, reverting with custom message on - * overflow (when the result is negative). - * - * Counterpart to Solidity's `-` operator. - * - * Requirements: - * - Subtraction cannot overflow. - */ - function add(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { - uint256 c = a + b; - require(c >= a, errorMessage); - - return c; - } - - /** - * @dev Returns the subtraction of two unsigned integers, reverting on - * overflow (when the result is negative). - * - * Counterpart to Solidity's `-` operator. - * - * Requirements: - * - Subtraction cannot overflow. - */ - function sub(uint256 a, uint256 b) internal pure returns (uint256) { - return sub(a, b, "SafeMath: subtraction overflow"); - } - - /** - * @dev Returns the subtraction of two unsigned integers, reverting with custom message on - * overflow (when the result is negative). - * - * Counterpart to Solidity's `-` operator. - * - * Requirements: - * - Subtraction cannot overflow. - */ - function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { - require(b <= a, errorMessage); - uint256 c = a - b; - - return c; - } - - /** - * @dev Returns the multiplication of two unsigned integers, reverting on - * overflow. - * - * Counterpart to Solidity's `*` operator. - * - * Requirements: - * - Multiplication cannot overflow. - */ - function mul(uint256 a, uint256 b) internal pure returns (uint256) { - // Gas optimization: this is cheaper than requiring 'a' not being zero, but the - // benefit is lost if 'b' is also tested. - // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 - if (a == 0) { - return 0; - } - - uint256 c = a * b; - require(c / a == b, "SafeMath: multiplication overflow"); - - return c; - } - - /** - * @dev Returns the integer division of two unsigned integers. Reverts on - * division by zero. The result is rounded towards zero. - * - * Counterpart to Solidity's `/` operator. Note: this function uses a - * `revert` opcode (which leaves remaining gas untouched) while Solidity - * uses an invalid opcode to revert (consuming all remaining gas). - * - * Requirements: - * - The divisor cannot be zero. - */ - function div(uint256 a, uint256 b) internal pure returns (uint256) { - return div(a, b, "SafeMath: division by zero"); - } - - /** - * @dev Returns the integer division of two unsigned integers. Reverts with custom message on - * division by zero. The result is rounded towards zero. - * - * Counterpart to Solidity's `/` operator. Note: this function uses a - * `revert` opcode (which leaves remaining gas untouched) while Solidity - * uses an invalid opcode to revert (consuming all remaining gas). - * - * Requirements: - * - The divisor cannot be zero. - */ - function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { - // Solidity only automatically asserts when dividing by 0 - require(b > 0, errorMessage); - uint256 c = a / b; - // assert(a == b * c + a % b); // There is no case in which this doesn't hold - - return c; - } - - /** - * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), - * Reverts when dividing by zero. - * - * Counterpart to Solidity's `%` operator. This function uses a `revert` - * opcode (which leaves remaining gas untouched) while Solidity uses an - * invalid opcode to revert (consuming all remaining gas). - * - * Requirements: - * - The divisor cannot be zero. - */ - function mod(uint256 a, uint256 b) internal pure returns (uint256) { - return mod(a, b, "SafeMath: modulo by zero"); - } - - /** - * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), - * Reverts with custom message when dividing by zero. - * - * Counterpart to Solidity's `%` operator. This function uses a `revert` - * opcode (which leaves remaining gas untouched) while Solidity uses an - * invalid opcode to revert (consuming all remaining gas). - * - * Requirements: - * - The divisor cannot be zero. - */ - function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { - require(b != 0, errorMessage); - return a % b; - } -} diff --git a/contracts/Utils/V0.8.13/Tokenlock.sol b/contracts/Utils/V0.8.13/Tokenlock.sol deleted file mode 100644 index de3c0d267..000000000 --- a/contracts/Utils/V0.8.13/Tokenlock.sol +++ /dev/null @@ -1,28 +0,0 @@ -pragma solidity 0.8.13; - -import "./Owned.sol"; - -contract Tokenlock is Owned { - /// @notice Indicates if token is locked - uint8 internal isLocked = 0; - - event Freezed(); - event UnFreezed(); - - modifier validLock() { - require(isLocked == 0, "Token is locked"); - _; - } - - function freeze() public onlyOwner { - isLocked = 1; - - emit Freezed(); - } - - function unfreeze() public onlyOwner { - isLocked = 0; - - emit UnFreezed(); - } -} diff --git a/contracts/test/EvilXDelegator.sol b/contracts/test/EvilXDelegator.sol index 152175039..4ba3bb6a5 100644 --- a/contracts/test/EvilXDelegator.sol +++ b/contracts/test/EvilXDelegator.sol @@ -1,6 +1,6 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; -import "../Tokens/V0.8.13/VTokens/VTokenInterfaces.sol"; +import "../Tokens/VTokens/VTokenInterfaces.sol"; /** * @title Venus's VBep20Delegator Contract @@ -34,7 +34,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface bytes memory becomeImplementationData ) public { // Creator of the contract is admin during initialization - admin = payable(msg.sender); + admin = msg.sender; // First delegate gets to initialize the delegator (i.e. storage contract) delegateTo( @@ -68,7 +68,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface address implementation_, bool allowResign, bytes memory becomeImplementationData - ) public override { + ) public { require(msg.sender == admin, "VBep20Delegator::_setImplementation: Caller must be admin"); if (allowResign) { @@ -89,7 +89,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @param mintAmount The amount of the underlying asset to supply * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) */ - function mint(uint256 mintAmount) external override returns (uint256) { + function mint(uint256 mintAmount) external returns (uint256) { bytes memory data = delegateToImplementation(abi.encodeWithSignature("mint(uint256)", mintAmount)); return abi.decode(data, (uint256)); } @@ -100,7 +100,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @param mintAmount The amount of the underlying asset to supply * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) */ - function mintBehalf(address receiver, uint256 mintAmount) external override returns (uint256) { + function mintBehalf(address receiver, uint256 mintAmount) external returns (uint256) { bytes memory data = delegateToImplementation( abi.encodeWithSignature("mintBehalf(address,uint256)", receiver, mintAmount) ); @@ -113,7 +113,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @param redeemTokens The number of vTokens to redeem into underlying * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) */ - function redeem(uint256 redeemTokens) external override returns (uint256) { + function redeem(uint256 redeemTokens) external returns (uint256) { bytes memory data = delegateToImplementation(abi.encodeWithSignature("redeem(uint256)", redeemTokens)); return abi.decode(data, (uint256)); } @@ -124,7 +124,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @param redeemAmount The amount of underlying to redeem * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) */ - function redeemUnderlying(uint256 redeemAmount) external override returns (uint256) { + function redeemUnderlying(uint256 redeemAmount) external returns (uint256) { bytes memory data = delegateToImplementation( abi.encodeWithSignature("redeemUnderlying(uint256)", redeemAmount) ); @@ -136,7 +136,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @param borrowAmount The amount of the underlying asset to borrow * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) */ - function borrow(uint256 borrowAmount) external override returns (uint256) { + function borrow(uint256 borrowAmount) external returns (uint256) { bytes memory data = delegateToImplementation(abi.encodeWithSignature("borrow(uint256)", borrowAmount)); return abi.decode(data, (uint256)); } @@ -146,7 +146,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @param repayAmount The amount to repay * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) */ - function repayBorrow(uint256 repayAmount) external override returns (uint256) { + function repayBorrow(uint256 repayAmount) external returns (uint256) { bytes memory data = delegateToImplementation(abi.encodeWithSignature("repayBorrow(uint256)", repayAmount)); return abi.decode(data, (uint256)); } @@ -157,7 +157,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @param repayAmount The amount to repay * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) */ - function repayBorrowBehalf(address borrower, uint256 repayAmount) external override returns (uint256) { + function repayBorrowBehalf(address borrower, uint256 repayAmount) external returns (uint256) { bytes memory data = delegateToImplementation( abi.encodeWithSignature("repayBorrowBehalf(address,uint256)", borrower, repayAmount) ); @@ -176,7 +176,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface address borrower, uint256 repayAmount, VTokenInterface vTokenCollateral - ) external override returns (uint256) { + ) external returns (uint256) { bytes memory data = delegateToImplementation( abi.encodeWithSignature("liquidateBorrow(address,uint256,address)", borrower, repayAmount, vTokenCollateral) ); @@ -189,7 +189,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @param amount The number of tokens to transfer * @return Whether or not the transfer succeeded */ - function transfer(address dst, uint256 amount) external override returns (bool) { + function transfer(address dst, uint256 amount) external returns (bool) { bytes memory data = delegateToImplementation(abi.encodeWithSignature("transfer(address,uint256)", dst, amount)); return abi.decode(data, (bool)); } @@ -201,7 +201,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @param amount The number of tokens to transfer * @return Whether or not the transfer succeeded */ - function transferFrom(address src, address dst, uint256 amount) external override returns (bool) { + function transferFrom(address src, address dst, uint256 amount) external returns (bool) { bytes memory data = delegateToImplementation( abi.encodeWithSignature("transferFrom(address,address,uint256)", src, dst, amount) ); @@ -216,7 +216,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @param amount The number of tokens that are approved (-1 means infinite) * @return Whether or not the approval succeeded */ - function approve(address spender, uint256 amount) external override returns (bool) { + function approve(address spender, uint256 amount) external returns (bool) { bytes memory data = delegateToImplementation( abi.encodeWithSignature("approve(address,uint256)", spender, amount) ); @@ -229,7 +229,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @param spender The address of the account which may transfer tokens * @return The number of tokens allowed to be spent (-1 means infinite) */ - function allowance(address owner, address spender) external view override returns (uint256) { + function allowance(address owner, address spender) external view returns (uint256) { bytes memory data = delegateToViewImplementation( abi.encodeWithSignature("allowance(address,address)", owner, spender) ); @@ -241,7 +241,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @param owner The address of the account to query * @return The number of tokens owned by `owner` */ - function balanceOf(address owner) external view override returns (uint256) { + function balanceOf(address owner) external view returns (uint256) { bytes memory data = delegateToViewImplementation(abi.encodeWithSignature("balanceOf(address)", owner)); return abi.decode(data, (uint256)); } @@ -252,7 +252,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @param owner The address of the account to query * @return The amount of underlying owned by `owner` */ - function balanceOfUnderlying(address owner) external override returns (uint256) { + function balanceOfUnderlying(address owner) external returns (uint256) { bytes memory data = delegateToImplementation(abi.encodeWithSignature("balanceOfUnderlying(address)", owner)); return abi.decode(data, (uint256)); } @@ -263,7 +263,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @param account Address of the account to snapshot * @return (possible error, token balance, borrow balance, exchange rate mantissa) */ - function getAccountSnapshot(address account) external view override returns (uint256, uint256, uint256, uint256) { + function getAccountSnapshot(address account) external view returns (uint256, uint256, uint256, uint256) { bytes memory data = delegateToViewImplementation( abi.encodeWithSignature("getAccountSnapshot(address)", account) ); @@ -274,7 +274,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @notice Returns the current per-block borrow interest rate for this vToken * @return The borrow interest rate per block, scaled by 1e18 */ - function borrowRatePerBlock() external view override returns (uint256) { + function borrowRatePerBlock() external view returns (uint256) { bytes memory data = delegateToViewImplementation(abi.encodeWithSignature("borrowRatePerBlock()")); return abi.decode(data, (uint256)); } @@ -283,7 +283,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @notice Returns the current per-block supply interest rate for this vToken * @return The supply interest rate per block, scaled by 1e18 */ - function supplyRatePerBlock() external view override returns (uint256) { + function supplyRatePerBlock() external view returns (uint256) { bytes memory data = delegateToViewImplementation(abi.encodeWithSignature("supplyRatePerBlock()")); return abi.decode(data, (uint256)); } @@ -292,7 +292,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @notice Returns the current total borrows plus accrued interest * @return The total borrows with interest */ - function totalBorrowsCurrent() external override returns (uint256) { + function totalBorrowsCurrent() external returns (uint256) { bytes memory data = delegateToImplementation(abi.encodeWithSignature("totalBorrowsCurrent()")); return abi.decode(data, (uint256)); } @@ -302,7 +302,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @param account The address whose balance should be calculated after updating borrowIndex * @return The calculated balance */ - function borrowBalanceCurrent(address account) external override returns (uint256) { + function borrowBalanceCurrent(address account) external returns (uint256) { bytes memory data = delegateToImplementation(abi.encodeWithSignature("borrowBalanceCurrent(address)", account)); return abi.decode(data, (uint256)); } @@ -312,7 +312,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @param account The address whose balance should be calculated * @return The calculated balance */ - function borrowBalanceStored(address account) public view override returns (uint256) { + function borrowBalanceStored(address account) public view returns (uint256) { bytes memory data = delegateToViewImplementation( abi.encodeWithSignature("borrowBalanceStored(address)", account) ); @@ -323,7 +323,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @notice Accrue interest then return the up-to-date exchange rate * @return Calculated exchange rate scaled by 1e18 */ - function exchangeRateCurrent() public override returns (uint256) { + function exchangeRateCurrent() public returns (uint256) { bytes memory data = delegateToImplementation(abi.encodeWithSignature("exchangeRateCurrent()")); return abi.decode(data, (uint256)); } @@ -333,7 +333,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @dev This function does not accrue interest before calculating the exchange rate * @return Calculated exchange rate scaled by 1e18 */ - function exchangeRateStored() public view override returns (uint256) { + function exchangeRateStored() public view returns (uint256) { bytes memory data = delegateToViewImplementation(abi.encodeWithSignature("exchangeRateStored()")); return abi.decode(data, (uint256)); } @@ -342,7 +342,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @notice Get cash balance of this vToken in the underlying asset * @return The quantity of underlying asset owned by this contract */ - function getCash() external view override returns (uint256) { + function getCash() external view returns (uint256) { bytes memory data = delegateToViewImplementation(abi.encodeWithSignature("getCash()")); return abi.decode(data, (uint256)); } @@ -352,7 +352,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @dev This calculates interest accrued from the last checkpointed block * up to the current block and writes new checkpoint to storage. */ - function accrueInterest() public override returns (uint256) { + function accrueInterest() public returns (uint256) { bytes memory data = delegateToImplementation(abi.encodeWithSignature("accrueInterest()")); return abi.decode(data, (uint256)); } @@ -366,7 +366,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @param seizeTokens The number of vTokens to seize * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) */ - function seize(address liquidator, address borrower, uint256 seizeTokens) external override returns (uint256) { + function seize(address liquidator, address borrower, uint256 seizeTokens) external returns (uint256) { bytes memory data = delegateToImplementation( abi.encodeWithSignature("seize(address,address,uint256)", liquidator, borrower, seizeTokens) ); @@ -381,7 +381,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @param newPendingAdmin New pending admin. * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) */ - function _setPendingAdmin(address payable newPendingAdmin) external override returns (uint256) { + function _setPendingAdmin(address payable newPendingAdmin) external returns (uint256) { bytes memory data = delegateToImplementation( abi.encodeWithSignature("_setPendingAdmin(address)", newPendingAdmin) ); @@ -393,7 +393,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @dev Admin function to set a new comptroller * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) */ - function _setComptroller(ComptrollerInterface newComptroller) public override returns (uint256) { + function _setComptroller(ComptrollerInterface newComptroller) public returns (uint256) { bytes memory data = delegateToImplementation( abi.encodeWithSignature("_setComptroller(address)", newComptroller) ); @@ -405,7 +405,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @dev Admin function to accrue interest and set a new reserve factor * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) */ - function _setReserveFactor(uint256 newReserveFactorMantissa) external override returns (uint256) { + function _setReserveFactor(uint256 newReserveFactorMantissa) external returns (uint256) { bytes memory data = delegateToImplementation( abi.encodeWithSignature("_setReserveFactor(uint256)", newReserveFactorMantissa) ); @@ -417,7 +417,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @dev Admin function for pending admin to accept role and update admin * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) */ - function _acceptAdmin() external override returns (uint256) { + function _acceptAdmin() external returns (uint256) { bytes memory data = delegateToImplementation(abi.encodeWithSignature("_acceptAdmin()")); return abi.decode(data, (uint256)); } @@ -427,7 +427,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @param addAmount Amount of reserves to add * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) */ - function _addReserves(uint256 addAmount) external override returns (uint256) { + function _addReserves(uint256 addAmount) external returns (uint256) { bytes memory data = delegateToImplementation(abi.encodeWithSignature("_addReserves(uint256)", addAmount)); return abi.decode(data, (uint256)); } @@ -437,7 +437,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @param reduceAmount Amount of reduction to reserves * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) */ - function _reduceReserves(uint256 reduceAmount) external override returns (uint256) { + function _reduceReserves(uint256 reduceAmount) external returns (uint256) { bytes memory data = delegateToImplementation(abi.encodeWithSignature("_reduceReserves(uint256)", reduceAmount)); return abi.decode(data, (uint256)); } @@ -448,7 +448,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @param newInterestRateModel the new interest rate model to use * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) */ - function _setInterestRateModel(InterestRateModel newInterestRateModel) public override returns (uint256) { + function _setInterestRateModel(InterestRateModel newInterestRateModel) public returns (uint256) { bytes memory data = delegateToImplementation( abi.encodeWithSignature("_setInterestRateModel(address)", newInterestRateModel) ); @@ -466,7 +466,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface (bool success, bytes memory returnData) = callee.delegatecall(data); assembly { if eq(success, 0) { - revert(add(returnData, 0x20), returndatasize()) + revert(add(returnData, 0x20), returndatasize) } } return returnData; @@ -495,7 +495,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface ); assembly { if eq(success, 0) { - revert(add(returnData, 0x20), returndatasize()) + revert(add(returnData, 0x20), returndatasize) } } return abi.decode(returnData, (bytes)); @@ -505,7 +505,7 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface * @notice Delegates execution to an implementation contract * @dev It returns to the external caller whatever the implementation returns or forwards reverts */ - fallback() external payable { + function() external payable { require(msg.value == 0, "VBep20Delegator:fallback: cannot send value to fallback"); // delegate all other functions to current implementation @@ -513,14 +513,14 @@ contract EvilXDelegator is VTokenInterface, VBep20Interface, VDelegatorInterface assembly { let free_mem_ptr := mload(0x40) - returndatacopy(free_mem_ptr, 0, returndatasize()) + returndatacopy(free_mem_ptr, 0, returndatasize) switch success case 0 { - revert(free_mem_ptr, returndatasize()) + revert(free_mem_ptr, returndatasize) } default { - return(free_mem_ptr, returndatasize()) + return(free_mem_ptr, returndatasize) } } } diff --git a/contracts/test/Fauceteer.sol b/contracts/test/Fauceteer.sol index d3b449c2f..2b2e1fdb1 100644 --- a/contracts/test/Fauceteer.sol +++ b/contracts/test/Fauceteer.sol @@ -1,6 +1,6 @@ -pragma solidity 0.8.13; +pragma solidity 0.5.16; -import "../Tokens/V0.8.13/EIP20NonStandardInterface.sol"; +import "../Tokens/EIP20NonStandardInterface.sol"; /** * @title Fauceteer diff --git a/contracts/test/InterestRateModelHarness.sol b/contracts/test/InterestRateModelHarness.sol index 618f443f9..0f5490fb9 100644 --- a/contracts/test/InterestRateModelHarness.sol +++ b/contracts/test/InterestRateModelHarness.sol @@ -1,6 +1,6 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; -import "../InterestRateModels/V0.8.13/InterestRateModel.sol"; +import "../InterestRateModels/InterestRateModel.sol"; /** * @title An Interest Rate Model for tests that can be instructed to return a failure instead of doing a calculation @@ -23,7 +23,7 @@ contract InterestRateModelHarness is InterestRateModel { borrowRate = borrowRate_; } - function getBorrowRate(uint _cash, uint _borrows, uint _reserves) public view override returns (uint) { + function getBorrowRate(uint _cash, uint _borrows, uint _reserves) public view returns (uint) { _cash; // unused _borrows; // unused _reserves; // unused @@ -36,7 +36,7 @@ contract InterestRateModelHarness is InterestRateModel { uint _borrows, uint _reserves, uint _reserveFactor - ) external view override returns (uint) { + ) external view returns (uint) { _cash; // unused _borrows; // unused _reserves; // unused diff --git a/contracts/test/VBep20MockDelegate.sol b/contracts/test/VBep20MockDelegate.sol index b3d80a085..17625202c 100644 --- a/contracts/test/VBep20MockDelegate.sol +++ b/contracts/test/VBep20MockDelegate.sol @@ -1,6 +1,6 @@ -pragma solidity 0.8.13; +pragma solidity 0.5.16; -import "../Tokens/V0.8.13/VTokens/VToken.sol"; +import "../Tokens/VTokens/VToken.sol"; /** * @title Venus's VBep20 Contract @@ -78,7 +78,7 @@ contract VBep20MockDelegate is VToken, VBep20Interface { * @param mintAmount The amount of the underlying asset to supply * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) */ - function mint(uint mintAmount) external override returns (uint) { + function mint(uint mintAmount) external returns (uint) { (uint err, ) = mintInternal(mintAmount); return err; } @@ -90,7 +90,7 @@ contract VBep20MockDelegate is VToken, VBep20Interface { * @param mintAmount The amount of the underlying asset to supply * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) */ - function mintBehalf(address receiver, uint mintAmount) external override returns (uint) { + function mintBehalf(address receiver, uint mintAmount) external returns (uint) { (uint err, ) = mintBehalfInternal(receiver, mintAmount); return err; } @@ -101,7 +101,7 @@ contract VBep20MockDelegate is VToken, VBep20Interface { * @param redeemTokens The number of vTokens to redeem into underlying * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) */ - function redeem(uint redeemTokens) external override returns (uint) { + function redeem(uint redeemTokens) external returns (uint) { return redeemInternal(redeemTokens); } @@ -111,7 +111,7 @@ contract VBep20MockDelegate is VToken, VBep20Interface { * @param redeemAmount The amount of underlying to redeem * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) */ - function redeemUnderlying(uint redeemAmount) external override returns (uint) { + function redeemUnderlying(uint redeemAmount) external returns (uint) { return redeemUnderlyingInternal(redeemAmount); } @@ -120,7 +120,7 @@ contract VBep20MockDelegate is VToken, VBep20Interface { * @param borrowAmount The amount of the underlying asset to borrow * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) */ - function borrow(uint borrowAmount) external override returns (uint) { + function borrow(uint borrowAmount) external returns (uint) { return borrowInternal(borrowAmount); } @@ -129,7 +129,7 @@ contract VBep20MockDelegate is VToken, VBep20Interface { * @param repayAmount The amount to repay * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) */ - function repayBorrow(uint repayAmount) external override returns (uint) { + function repayBorrow(uint repayAmount) external returns (uint) { (uint err, ) = repayBorrowInternal(repayAmount); return err; } @@ -140,7 +140,7 @@ contract VBep20MockDelegate is VToken, VBep20Interface { * @param repayAmount The amount to repay * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) */ - function repayBorrowBehalf(address borrower, uint repayAmount) external override returns (uint) { + function repayBorrowBehalf(address borrower, uint repayAmount) external returns (uint) { (uint err, ) = repayBorrowBehalfInternal(borrower, repayAmount); return err; } @@ -157,7 +157,7 @@ contract VBep20MockDelegate is VToken, VBep20Interface { address borrower, uint repayAmount, VTokenInterface vTokenCollateral - ) external override returns (uint) { + ) external returns (uint) { (uint err, ) = liquidateBorrowInternal(borrower, repayAmount, vTokenCollateral); return err; } @@ -167,7 +167,7 @@ contract VBep20MockDelegate is VToken, VBep20Interface { * @param addAmount The amount fo underlying token to add as reserves * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) */ - function _addReserves(uint addAmount) external override returns (uint) { + function _addReserves(uint addAmount) external returns (uint) { return _addReservesInternal(addAmount); } @@ -178,7 +178,7 @@ contract VBep20MockDelegate is VToken, VBep20Interface { * @dev This excludes the value of the current message, if any * @return The quantity of underlying tokens owned by this contract */ - function getCashPrior() internal view override returns (uint) { + function getCashPrior() internal view returns (uint) { EIP20Interface token = EIP20Interface(underlying); return token.balanceOf(address(this)); } @@ -192,7 +192,7 @@ contract VBep20MockDelegate is VToken, VBep20Interface { * Note: This wrapper safely handles non-standard BEP-20 tokens that do not return a value. * See here: https://medium.com/coinmonks/missing-return-value-bug-at-least-130-tokens-affected-d67bf08521ca */ - function doTransferIn(address from, uint amount) internal override returns (uint) { + function doTransferIn(address from, uint amount) internal returns (uint) { EIP20NonStandardInterface token = EIP20NonStandardInterface(underlying); uint balanceBefore = EIP20Interface(underlying).balanceOf(address(this)); token.transferFrom(from, address(this), amount); @@ -231,7 +231,7 @@ contract VBep20MockDelegate is VToken, VBep20Interface { * Note: This wrapper safely handles non-standard BEP-20 tokens that do not return a value. * See here: https://medium.com/coinmonks/missing-return-value-bug-at-least-130-tokens-affected-d67bf08521ca */ - function doTransferOut(address payable to, uint amount) internal override { + function doTransferOut(address payable to, uint amount) internal { EIP20NonStandardInterface token = EIP20NonStandardInterface(underlying); token.transfer(to, amount); diff --git a/script/hardhat/fork/vip-diamond-comptroller-mainnet.ts b/script/hardhat/fork/vip-diamond-comptroller-mainnet.ts index aa9e1ed88..694c1f35c 100644 --- a/script/hardhat/fork/vip-diamond-comptroller-mainnet.ts +++ b/script/hardhat/fork/vip-diamond-comptroller-mainnet.ts @@ -140,7 +140,7 @@ forking(29043847, async () => { [vBUSD, vUSDT] = await Promise.all( [VBUSD, VUSDT].map((address: string) => { - return ethers.getContractAt("contracts/Tokens/V0.8.13/VTokens/VBep20Delegate.sol:VBep20Delegate", address); + return ethers.getContractAt("contracts/Tokens/VTokens/VBep20Delegate.sol:VBep20Delegate", address); }), ); [BUSD, USDT] = await Promise.all( diff --git a/script/hardhat/fork/vip-diamond-comptroller-testnet.ts b/script/hardhat/fork/vip-diamond-comptroller-testnet.ts index f9e442abb..fcb5025e1 100644 --- a/script/hardhat/fork/vip-diamond-comptroller-testnet.ts +++ b/script/hardhat/fork/vip-diamond-comptroller-testnet.ts @@ -129,7 +129,7 @@ forking(29043847, async () => { [vBUSD, vUSDT] = await Promise.all( [VBUSD, VUSDT].map((address: string) => { - return ethers.getContractAt("contracts/Tokens/V0.8.13/VTokens/VBep20Delegate.sol:VBep20Delegate", address); + return ethers.getContractAt("contracts/Tokens/VTokens/VBep20Delegate.sol:VBep20Delegate", address); }), ); @@ -439,7 +439,7 @@ forking(29043847, async () => { [vBUSD, vUSDT] = await Promise.all( [VBUSD, VUSDT].map((address: string) => { - return ethers.getContractAt("contracts/Tokens/V0.8.13/VTokens/VBep20Delegate.sol:VBep20Delegate", address); + return ethers.getContractAt("contracts/Tokens/VTokens/VBep20Delegate.sol:VBep20Delegate", address); }), ); diff --git a/tests/hardhat/Comptroller/Diamond/XVSSpeeds.ts b/tests/hardhat/Comptroller/Diamond/XVSSpeeds.ts index e43dc3174..5b24a07e8 100644 --- a/tests/hardhat/Comptroller/Diamond/XVSSpeeds.ts +++ b/tests/hardhat/Comptroller/Diamond/XVSSpeeds.ts @@ -22,10 +22,10 @@ describe("Comptroller", () => { comptrollerProxy = await ethers.getContractAt("Comptroller", comptroller.address); accessControl = await smock.fake( - "contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager", + "contracts/Governance/IAccessControlManager.sol:IAccessControlManager", ); - vToken1 = await smock.fake("contracts/Tokens/V0.8.13/VTokens/VToken.sol:VToken"); - vToken2 = await smock.fake("contracts/Tokens/V0.8.13/VTokens/VToken.sol:VToken"); + vToken1 = await smock.fake("contracts/Tokens/VTokens/VToken.sol:VToken"); + vToken2 = await smock.fake("contracts/Tokens/VTokens/VToken.sol:VToken"); accessControl.isAllowedToCall.returns(true); vToken1.isVToken.returns(true); diff --git a/tests/hardhat/Comptroller/Diamond/accessControl.ts b/tests/hardhat/Comptroller/Diamond/accessControl.ts index e405e9695..cf0e7488d 100644 --- a/tests/hardhat/Comptroller/Diamond/accessControl.ts +++ b/tests/hardhat/Comptroller/Diamond/accessControl.ts @@ -21,7 +21,7 @@ describe("Comptroller", () => { user = signers[1]; userAddress = await user.getAddress(); accessControl = await smock.fake( - "contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager", + "contracts/Governance/IAccessControlManager.sol:IAccessControlManager", ); const result = await deployDiamond(""); comptroller = result.unitroller; diff --git a/tests/hardhat/Comptroller/Diamond/assetListTest.ts b/tests/hardhat/Comptroller/Diamond/assetListTest.ts index 52d8c7713..055a3631f 100644 --- a/tests/hardhat/Comptroller/Diamond/assetListTest.ts +++ b/tests/hardhat/Comptroller/Diamond/assetListTest.ts @@ -47,14 +47,14 @@ describe("Comptroller: assetListTest", () => { async function assetListFixture(): Promise { const accessControl = await smock.fake( - "contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager", + "contracts/Governance/IAccessControlManager.sol:IAccessControlManager", ); // const ComptrollerFactory = await smock.mock("Comptroller"); const ComptrollerLensFactory = await smock.mock("ComptrollerLens"); const result = await deployDiamond(""); comptroller = result.unitroller; const comptrollerLens = await ComptrollerLensFactory.deploy(); - const oracle = await smock.fake("contracts/Oracle/V0.8.13/PriceOracle.sol:PriceOracle"); + const oracle = await smock.fake("contracts/Oracle/PriceOracle.sol:PriceOracle"); accessControl.isAllowedToCall.returns(true); comptrollerProxy = await ethers.getContractAt("Comptroller", comptroller.address); await comptrollerProxy._setAccessControl(accessControl.address); diff --git a/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts b/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts index da2041731..a7155cce0 100644 --- a/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts +++ b/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts @@ -31,9 +31,9 @@ type SimpleComptrollerFixture = { }; async function deploySimpleComptroller(): Promise { - const oracle = await smock.fake("contracts/Oracle/V0.8.13/PriceOracle.sol:PriceOracle"); + const oracle = await smock.fake("contracts/Oracle/PriceOracle.sol:PriceOracle"); const accessControl = await smock.fake( - "contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager", + "contracts/Governance/IAccessControlManager.sol:IAccessControlManager", ); accessControl.isAllowedToCall.returns(true); const ComptrollerLensFactory = await smock.mock("ComptrollerLens"); @@ -146,7 +146,7 @@ describe("Comptroller", () => { async function deploy(): Promise { const contracts = await deploySimpleComptroller(); - const newOracle = await smock.fake("contracts/Oracle/V0.8.13/PriceOracle.sol:PriceOracle"); + const newOracle = await smock.fake("contracts/Oracle/PriceOracle.sol:PriceOracle"); // comptrollerProxy = await ethers.getContractAt("Comptroller", contracts.comptroller); return { ...contracts, newOracle }; } @@ -233,7 +233,7 @@ describe("Comptroller", () => { async function deploy(): Promise { const contracts = await deploySimpleComptroller(); - const vToken = await smock.fake("contracts/Tokens/V0.8.13/VTokens/VToken.sol:VToken"); + const vToken = await smock.fake("contracts/Tokens/VTokens/VToken.sol:VToken"); vToken.comptroller.returns(contracts.comptroller.address); vToken.isVToken.returns(true); return { vToken, ...contracts }; @@ -283,9 +283,9 @@ describe("Comptroller", () => { async function deploy(): Promise { const contracts = await deploySimpleComptroller(); - const vToken1 = await smock.fake("contracts/Tokens/V0.8.13/VTokens/VToken.sol:VToken"); - const vToken2 = await smock.fake("contracts/Tokens/V0.8.13/VTokens/VToken.sol:VToken"); - const token = await smock.fake("contracts/Tokens/V0.8.13/EIP20Interface.sol:EIP20Interface"); + const vToken1 = await smock.fake("contracts/Tokens/VTokens/VToken.sol:VToken"); + const vToken2 = await smock.fake("contracts/Tokens/VTokens/VToken.sol:VToken"); + const token = await smock.fake("contracts/Tokens/EIP20Interface.sol:EIP20Interface"); return { ...contracts, vToken1, vToken2, token }; } @@ -335,7 +335,7 @@ describe("Comptroller", () => { async function deploy(): Promise { const contracts = await deploySimpleComptroller(); - const vToken = await smock.fake("contracts/Tokens/V0.8.13/VTokens/VToken.sol:VToken"); + const vToken = await smock.fake("contracts/Tokens/VTokens/VToken.sol:VToken"); await contracts.comptrollerProxy._supportMarket(vToken.address); return { ...contracts, vToken }; } @@ -384,7 +384,7 @@ describe("Comptroller", () => { }); it("reverts if market is not listed", async () => { - const someVToken = await smock.fake("contracts/Tokens/V0.8.13/VTokens/VToken.sol:VToken"); + const someVToken = await smock.fake("contracts/Tokens/VTokens/VToken.sol:VToken"); await expect( comptrollerProxy.mintAllowed(someVToken.address, await root.getAddress(), convertToUnit("1", 18)), ).to.be.revertedWith("market not listed"); diff --git a/tests/hardhat/Comptroller/Diamond/liquidateCalculateAmoutSeizeTest.ts b/tests/hardhat/Comptroller/Diamond/liquidateCalculateAmoutSeizeTest.ts index a3840714b..d9c1c08d1 100644 --- a/tests/hardhat/Comptroller/Diamond/liquidateCalculateAmoutSeizeTest.ts +++ b/tests/hardhat/Comptroller/Diamond/liquidateCalculateAmoutSeizeTest.ts @@ -59,7 +59,7 @@ describe("Comptroller", () => { async function liquidateFixture(): Promise { const accessControl = await smock.fake( - "contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager", + "contracts/Governance/IAccessControlManager.sol:IAccessControlManager", ); // const ComptrollerFactory = await smock.mock("Comptroller"); const ComptrollerLensFactory = await smock.mock("ComptrollerLens"); @@ -67,7 +67,7 @@ describe("Comptroller", () => { const comptroller = result.unitroller; comptrollerProxy = await ethers.getContractAt("Comptroller", comptroller.address); const comptrollerLens = await ComptrollerLensFactory.deploy(); - const oracle = await smock.fake("contracts/Oracle/V0.8.13/PriceOracle.sol:PriceOracle"); + const oracle = await smock.fake("contracts/Oracle/PriceOracle.sol:PriceOracle"); accessControl.isAllowedToCall.returns(true); await comptrollerProxy._setAccessControl(accessControl.address); await comptrollerProxy._setComptrollerLens(comptrollerLens.address); diff --git a/tests/hardhat/Comptroller/Diamond/pauseTest.ts b/tests/hardhat/Comptroller/Diamond/pauseTest.ts index a279572e8..575219b65 100644 --- a/tests/hardhat/Comptroller/Diamond/pauseTest.ts +++ b/tests/hardhat/Comptroller/Diamond/pauseTest.ts @@ -24,13 +24,13 @@ type PauseFixture = { async function pauseFixture(): Promise { const accessControl = await smock.fake( - "contracts/Governance/V0.8.13/IAccessControlManager.sol:IAccessControlManager", + "contracts/Governance/IAccessControlManager.sol:IAccessControlManager", ); const result = await deployDiamond(""); const comptrollerDeployment = result.unitroller; const comptroller = await ethers.getContractAt("Comptroller", comptrollerDeployment.address); await comptroller._setAccessControl(accessControl.address); - const oracle = await smock.fake("contracts/Oracle/V0.8.13/PriceOracle.sol:PriceOracle"); + const oracle = await smock.fake("contracts/Oracle/PriceOracle.sol:PriceOracle"); accessControl.isAllowedToCall.returns(true); await comptroller._setPriceOracle(oracle.address); From 363552b2bd895794296eec01026d143df4ec4a96 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Thu, 4 May 2023 17:12:58 +0530 Subject: [PATCH 077/153] refactor: revert new version in tests contracts. --- contracts/test/BEP20.sol | 76 ++++++----- contracts/test/Const.sol | 12 +- contracts/test/Counter.sol | 2 +- contracts/test/EvilToken.sol | 18 +-- contracts/test/FalseMarker.sol | 2 +- contracts/test/FaucetToken.sol | 16 ++- contracts/test/Fauceteer.sol | 2 +- contracts/test/FeeToken.sol | 30 ++--- contracts/test/MathHelpers.sol | 2 +- contracts/test/MockDeflationaryToken.sol | 26 ++-- contracts/test/MockMCD.sol | 2 +- contracts/test/RefreshSpeedsProxy.sol | 2 +- contracts/test/Structs.sol | 2 +- contracts/test/VBep20MockDelegate.sol | 4 +- contracts/test/WBNB.sol | 8 +- contracts/test/WBTC.sol | 157 +++++++++++------------ contracts/test/XVSVaultHarness.sol | 2 +- 17 files changed, 187 insertions(+), 176 deletions(-) diff --git a/contracts/test/BEP20.sol b/contracts/test/BEP20.sol index 11f45b002..b82a87acf 100644 --- a/contracts/test/BEP20.sol +++ b/contracts/test/BEP20.sol @@ -1,4 +1,6 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; + +import "../Utils/SafeMath.sol"; interface BEP20Base { event Approval(address indexed owner, address indexed spender, uint256 value); @@ -13,16 +15,16 @@ interface BEP20Base { function balanceOf(address who) external view returns (uint256); } -abstract contract BEP20 is BEP20Base { - function transfer(address to, uint256 value) external virtual returns (bool); +contract BEP20 is BEP20Base { + function transfer(address to, uint256 value) external returns (bool); - function transferFrom(address from, address to, uint256 value) external virtual returns (bool); + function transferFrom(address from, address to, uint256 value) external returns (bool); } -abstract contract BEP20NS is BEP20Base { - function transfer(address to, uint256 value) external virtual; +contract BEP20NS is BEP20Base { + function transfer(address to, uint256 value) external; - function transferFrom(address from, address to, uint256 value) external virtual; + function transferFrom(address from, address to, uint256 value) external; } /** @@ -31,6 +33,8 @@ abstract contract BEP20NS is BEP20Base { * See https://github.com/ethereum/EIPs/issues/20 */ contract StandardToken is BEP20 { + using SafeMath for uint256; + string public name; string public symbol; uint8 public decimals; @@ -38,7 +42,12 @@ contract StandardToken is BEP20 { mapping(address => mapping(address => uint256)) public allowance; mapping(address => uint256) public balanceOf; - constructor(uint256 _initialAmount, string memory _tokenName, uint8 _decimalUnits, string memory _tokenSymbol) { + constructor( + uint256 _initialAmount, + string memory _tokenName, + uint8 _decimalUnits, + string memory _tokenSymbol + ) public { totalSupply = _initialAmount; balanceOf[msg.sender] = _initialAmount; name = _tokenName; @@ -46,17 +55,17 @@ contract StandardToken is BEP20 { decimals = _decimalUnits; } - function transfer(address dst, uint256 amount) external virtual override returns (bool) { - balanceOf[msg.sender] = balanceOf[msg.sender] - amount; - balanceOf[dst] = balanceOf[dst] + amount; + function transfer(address dst, uint256 amount) external returns (bool) { + balanceOf[msg.sender] = balanceOf[msg.sender].sub(amount, "Insufficient balance"); + balanceOf[dst] = balanceOf[dst].add(amount, "Balance overflow"); emit Transfer(msg.sender, dst, amount); return true; } - function transferFrom(address src, address dst, uint256 amount) external virtual override returns (bool) { - allowance[src][msg.sender] = allowance[src][msg.sender] - amount; - balanceOf[src] = balanceOf[src] - amount; - balanceOf[dst] = balanceOf[dst] + amount; + function transferFrom(address src, address dst, uint256 amount) external returns (bool) { + allowance[src][msg.sender] = allowance[src][msg.sender].sub(amount, "Insufficient allowance"); + balanceOf[src] = balanceOf[src].sub(amount, "Insufficient balance"); + balanceOf[dst] = balanceOf[dst].add(amount, "Balance overflow"); emit Transfer(src, dst, amount); return true; } @@ -74,6 +83,8 @@ contract StandardToken is BEP20 { * See https://medium.com/coinmonks/missing-return-value-bug-at-least-130-tokens-affected-d67bf08521ca */ contract NonStandardToken is BEP20NS { + using SafeMath for uint256; + string public name; uint8 public decimals; string public symbol; @@ -81,7 +92,12 @@ contract NonStandardToken is BEP20NS { mapping(address => mapping(address => uint256)) public allowance; mapping(address => uint256) public balanceOf; - constructor(uint256 _initialAmount, string memory _tokenName, uint8 _decimalUnits, string memory _tokenSymbol) { + constructor( + uint256 _initialAmount, + string memory _tokenName, + uint8 _decimalUnits, + string memory _tokenSymbol + ) public { totalSupply = _initialAmount; balanceOf[msg.sender] = _initialAmount; name = _tokenName; @@ -89,16 +105,16 @@ contract NonStandardToken is BEP20NS { decimals = _decimalUnits; } - function transfer(address dst, uint256 amount) external override { - balanceOf[msg.sender] = balanceOf[msg.sender] - amount; - balanceOf[dst] = balanceOf[dst] + amount; + function transfer(address dst, uint256 amount) external { + balanceOf[msg.sender] = balanceOf[msg.sender].sub(amount, "Insufficient balance"); + balanceOf[dst] = balanceOf[dst].add(amount, "Balance overflow"); emit Transfer(msg.sender, dst, amount); } - function transferFrom(address src, address dst, uint256 amount) external override { - allowance[src][msg.sender] = allowance[src][msg.sender] - amount; - balanceOf[src] = balanceOf[src] - amount; - balanceOf[dst] = balanceOf[dst] + amount; + function transferFrom(address src, address dst, uint256 amount) external { + allowance[src][msg.sender] = allowance[src][msg.sender].sub(amount, "Insufficient allowance"); + balanceOf[src] = balanceOf[src].sub(amount, "Insufficient balance"); + balanceOf[dst] = balanceOf[dst].add(amount, "Balance overflow"); emit Transfer(src, dst, amount); } @@ -135,25 +151,25 @@ contract BEP20Harness is StandardToken { balanceOf[_account] = _amount; } - function transfer(address dst, uint256 amount) external override returns (bool success) { + function transfer(address dst, uint256 amount) external returns (bool success) { // Added for testing purposes if (failTransferToAddresses[dst]) { return false; } - balanceOf[msg.sender] = balanceOf[msg.sender] - amount; - balanceOf[dst] = balanceOf[dst] + amount; + balanceOf[msg.sender] = balanceOf[msg.sender].sub(amount, "Insufficient balance"); + balanceOf[dst] = balanceOf[dst].add(amount, "Balance overflow"); emit Transfer(msg.sender, dst, amount); return true; } - function transferFrom(address src, address dst, uint256 amount) external override returns (bool success) { + function transferFrom(address src, address dst, uint256 amount) external returns (bool success) { // Added for testing purposes if (failTransferFromAddresses[src]) { return false; } - allowance[src][msg.sender] = allowance[src][msg.sender] - amount; - balanceOf[src] = balanceOf[src] - amount; - balanceOf[dst] = balanceOf[dst] + amount; + allowance[src][msg.sender] = allowance[src][msg.sender].sub(amount, "Insufficient allowance"); + balanceOf[src] = balanceOf[src].sub(amount, "Insufficient balance"); + balanceOf[dst] = balanceOf[dst].add(amount, "Balance overflow"); emit Transfer(src, dst, amount); return true; } diff --git a/contracts/test/Const.sol b/contracts/test/Const.sol index a9ef4856a..200894304 100644 --- a/contracts/test/Const.sol +++ b/contracts/test/Const.sol @@ -1,16 +1,16 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; contract ConstBase { uint public constant C = 1; - function c() public pure virtual returns (uint) { + function c() public pure returns (uint) { return 1; } - function ADD(uint a) public view virtual returns (uint) { + function ADD(uint a) public view returns (uint) { // tells compiler to accept view instead of pure if (false) { - C + block.timestamp; + C + now; } return a + C; } @@ -18,14 +18,14 @@ contract ConstBase { function add(uint a) public view returns (uint) { // tells compiler to accept view instead of pure if (false) { - C + block.timestamp; + C + now; } return a + c(); } } contract ConstSub is ConstBase { - function c() public pure override returns (uint) { + function c() public pure returns (uint) { return 2; } } diff --git a/contracts/test/Counter.sol b/contracts/test/Counter.sol index 5e15b2a9a..7522bb2aa 100644 --- a/contracts/test/Counter.sol +++ b/contracts/test/Counter.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; contract Counter { uint public count; diff --git a/contracts/test/EvilToken.sol b/contracts/test/EvilToken.sol index 195ad2c29..6b0f4ead3 100644 --- a/contracts/test/EvilToken.sol +++ b/contracts/test/EvilToken.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; import "./FaucetToken.sol"; @@ -15,7 +15,7 @@ contract EvilToken is FaucetToken { string memory _tokenName, uint8 _decimalUnits, string memory _tokenSymbol - ) FaucetToken(_initialAmount, _tokenName, _decimalUnits, _tokenSymbol) { + ) public FaucetToken(_initialAmount, _tokenName, _decimalUnits, _tokenSymbol) { fail = true; } @@ -23,23 +23,23 @@ contract EvilToken is FaucetToken { fail = _fail; } - function transfer(address dst, uint256 amount) external override returns (bool) { + function transfer(address dst, uint256 amount) external returns (bool) { if (fail) { return false; } - balanceOf[msg.sender] = balanceOf[msg.sender] - amount; - balanceOf[dst] = balanceOf[dst] + amount; + balanceOf[msg.sender] = balanceOf[msg.sender].sub(amount); + balanceOf[dst] = balanceOf[dst].add(amount); emit Transfer(msg.sender, dst, amount); return true; } - function transferFrom(address src, address dst, uint256 amount) external override returns (bool) { + function transferFrom(address src, address dst, uint256 amount) external returns (bool) { if (fail) { return false; } - balanceOf[src] = balanceOf[src] - amount; - balanceOf[dst] = balanceOf[dst] + amount; - allowance[src][msg.sender] = allowance[src][msg.sender] - amount; + balanceOf[src] = balanceOf[src].sub(amount); + balanceOf[dst] = balanceOf[dst].add(amount); + allowance[src][msg.sender] = allowance[src][msg.sender].sub(amount); emit Transfer(src, dst, amount); return true; } diff --git a/contracts/test/FalseMarker.sol b/contracts/test/FalseMarker.sol index 1dde52588..792ec5aa2 100644 --- a/contracts/test/FalseMarker.sol +++ b/contracts/test/FalseMarker.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; contract FalseMarkerMethodComptroller { bool public constant isComptroller = false; diff --git a/contracts/test/FaucetToken.sol b/contracts/test/FaucetToken.sol index 7ba842720..60f944b91 100644 --- a/contracts/test/FaucetToken.sol +++ b/contracts/test/FaucetToken.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; import "./BEP20.sol"; @@ -13,7 +13,7 @@ contract FaucetToken is StandardToken { string memory _tokenName, uint8 _decimalUnits, string memory _tokenSymbol - ) StandardToken(_initialAmount, _tokenName, _decimalUnits, _tokenSymbol) {} + ) public StandardToken(_initialAmount, _tokenName, _decimalUnits, _tokenSymbol) {} function allocateTo(address _owner, uint256 value) public { balanceOf[_owner] += value; @@ -33,7 +33,7 @@ contract FaucetNonStandardToken is NonStandardToken { string memory _tokenName, uint8 _decimalUnits, string memory _tokenSymbol - ) NonStandardToken(_initialAmount, _tokenName, _decimalUnits, _tokenSymbol) {} + ) public NonStandardToken(_initialAmount, _tokenName, _decimalUnits, _tokenSymbol) {} function allocateTo(address _owner, uint256 value) public { balanceOf[_owner] += value; @@ -48,6 +48,8 @@ contract FaucetNonStandardToken is NonStandardToken { * @notice A test token that is malicious and tries to re-enter callers */ contract FaucetTokenReEntrantHarness { + using SafeMath for uint256; + event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); @@ -68,7 +70,7 @@ contract FaucetTokenReEntrantHarness { string memory _tokenSymbol, bytes memory _reEntryCallData, string memory _reEntryFun - ) { + ) public { totalSupply_ = _initialAmount; balanceOf_[msg.sender] = _initialAmount; name = _tokenName; @@ -131,7 +133,7 @@ contract FaucetTokenReEntrantHarness { uint256 amount ) public reEnter("transferFrom") returns (bool success) { _transfer(src, dst, amount); - _approve(src, msg.sender, allowance_[src][msg.sender] - amount); + _approve(src, msg.sender, allowance_[src][msg.sender].sub(amount)); return true; } @@ -144,8 +146,8 @@ contract FaucetTokenReEntrantHarness { function _transfer(address src, address dst, uint256 amount) internal { require(dst != address(0), "dst should be valid address"); - balanceOf_[src] = balanceOf_[src] - amount; - balanceOf_[dst] = balanceOf_[dst] + amount; + balanceOf_[src] = balanceOf_[src].sub(amount); + balanceOf_[dst] = balanceOf_[dst].add(amount); emit Transfer(src, dst, amount); } } diff --git a/contracts/test/Fauceteer.sol b/contracts/test/Fauceteer.sol index 2b2e1fdb1..9c456e986 100644 --- a/contracts/test/Fauceteer.sol +++ b/contracts/test/Fauceteer.sol @@ -1,4 +1,4 @@ -pragma solidity 0.5.16; +pragma solidity ^0.5.16; import "../Tokens/EIP20NonStandardInterface.sol"; diff --git a/contracts/test/FeeToken.sol b/contracts/test/FeeToken.sol index 97f18c30c..7a450d258 100644 --- a/contracts/test/FeeToken.sol +++ b/contracts/test/FeeToken.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; import "./FaucetToken.sol"; @@ -18,28 +18,28 @@ contract FeeToken is FaucetToken { string memory _tokenSymbol, uint _basisPointFee, address _owner - ) FaucetToken(_initialAmount, _tokenName, _decimalUnits, _tokenSymbol) { + ) public FaucetToken(_initialAmount, _tokenName, _decimalUnits, _tokenSymbol) { basisPointFee = _basisPointFee; owner = _owner; } - function transfer(address dst, uint amount) public override returns (bool) { - uint fee = (amount * basisPointFee) / 10000; - uint net = amount - fee; - balanceOf[owner] = balanceOf[owner] + fee; - balanceOf[msg.sender] = balanceOf[msg.sender] - amount; - balanceOf[dst] = balanceOf[dst] + net; + function transfer(address dst, uint amount) public returns (bool) { + uint fee = amount.mul(basisPointFee).div(10000); + uint net = amount.sub(fee); + balanceOf[owner] = balanceOf[owner].add(fee); + balanceOf[msg.sender] = balanceOf[msg.sender].sub(amount); + balanceOf[dst] = balanceOf[dst].add(net); emit Transfer(msg.sender, dst, amount); return true; } - function transferFrom(address src, address dst, uint amount) public override returns (bool) { - uint fee = (amount * basisPointFee) / 10000; - uint net = amount / fee; - balanceOf[owner] = balanceOf[owner] + fee; - balanceOf[src] = balanceOf[src] / amount; - balanceOf[dst] = balanceOf[dst] + net; - allowance[src][msg.sender] = allowance[src][msg.sender] - amount; + function transferFrom(address src, address dst, uint amount) public returns (bool) { + uint fee = amount.mul(basisPointFee).div(10000); + uint net = amount.sub(fee); + balanceOf[owner] = balanceOf[owner].add(fee); + balanceOf[src] = balanceOf[src].sub(amount); + balanceOf[dst] = balanceOf[dst].add(net); + allowance[src][msg.sender] = allowance[src][msg.sender].sub(amount); emit Transfer(src, dst, amount); return true; } diff --git a/contracts/test/MathHelpers.sol b/contracts/test/MathHelpers.sol index 0d14af8ac..3c4125cc5 100644 --- a/contracts/test/MathHelpers.sol +++ b/contracts/test/MathHelpers.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; contract MathHelpers { /* diff --git a/contracts/test/MockDeflationaryToken.sol b/contracts/test/MockDeflationaryToken.sol index ce34b2885..47d0274b8 100644 --- a/contracts/test/MockDeflationaryToken.sol +++ b/contracts/test/MockDeflationaryToken.sol @@ -1,6 +1,10 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; + +import "../Utils/SafeMath.sol"; contract DeflatingERC20 { + using SafeMath for uint; + string public constant name = "Deflating Test Token"; string public constant symbol = "DTT"; uint8 public constant decimals = 18; @@ -16,7 +20,7 @@ contract DeflatingERC20 { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); - constructor(uint _totalSupply) { + constructor(uint _totalSupply) public { uint chainId; assembly { chainId := chainid() @@ -34,14 +38,14 @@ contract DeflatingERC20 { } function _mint(address to, uint value) internal { - totalSupply = totalSupply + value; - balanceOf[to] = balanceOf[to] + value; + totalSupply = totalSupply.add(value); + balanceOf[to] = balanceOf[to].add(value); emit Transfer(address(0), to, value); } function _burn(address from, uint value) internal { - balanceOf[from] = balanceOf[from] - value; - totalSupply = totalSupply - value; + balanceOf[from] = balanceOf[from].sub(value); + totalSupply = totalSupply.sub(value); emit Transfer(from, address(0), value); } @@ -53,9 +57,9 @@ contract DeflatingERC20 { function _transfer(address from, address to, uint value) private { uint burnAmount = value / 100; _burn(from, burnAmount); - uint transferAmount = value - burnAmount; - balanceOf[from] = balanceOf[from] - transferAmount; - balanceOf[to] = balanceOf[to] + transferAmount; + uint transferAmount = value.sub(burnAmount); + balanceOf[from] = balanceOf[from].sub(transferAmount); + balanceOf[to] = balanceOf[to].add(transferAmount); emit Transfer(from, to, transferAmount); } @@ -70,8 +74,8 @@ contract DeflatingERC20 { } function transferFrom(address from, address to, uint value) external returns (bool) { - if (allowance[from][msg.sender] != type(uint).max) { - allowance[from][msg.sender] = allowance[from][msg.sender] - value; + if (allowance[from][msg.sender] != uint(-1)) { + allowance[from][msg.sender] = allowance[from][msg.sender].sub(value); } _transfer(from, to, value); return true; diff --git a/contracts/test/MockMCD.sol b/contracts/test/MockMCD.sol index aa5baeade..1d3a5e994 100644 --- a/contracts/test/MockMCD.sol +++ b/contracts/test/MockMCD.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; contract MockPot { uint public dsr; // the Dai Savings Rate diff --git a/contracts/test/RefreshSpeedsProxy.sol b/contracts/test/RefreshSpeedsProxy.sol index 5478740a6..d46932a83 100644 --- a/contracts/test/RefreshSpeedsProxy.sol +++ b/contracts/test/RefreshSpeedsProxy.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; interface IComptroller { function refreshVenusSpeeds() external; diff --git a/contracts/test/Structs.sol b/contracts/test/Structs.sol index 5a8610939..57267f870 100644 --- a/contracts/test/Structs.sol +++ b/contracts/test/Structs.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; contract Structs { struct Outer { diff --git a/contracts/test/VBep20MockDelegate.sol b/contracts/test/VBep20MockDelegate.sol index 17625202c..fe9520f4a 100644 --- a/contracts/test/VBep20MockDelegate.sol +++ b/contracts/test/VBep20MockDelegate.sol @@ -1,4 +1,4 @@ -pragma solidity 0.5.16; +pragma solidity ^0.5.16; import "../Tokens/VTokens/VToken.sol"; @@ -121,7 +121,7 @@ contract VBep20MockDelegate is VToken, VBep20Interface { * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) */ function borrow(uint borrowAmount) external returns (uint) { - return borrowInternal(borrowAmount); + return borrowInternal(msg.sender, msg.sender, borrowAmount); } /** diff --git a/contracts/test/WBNB.sol b/contracts/test/WBNB.sol index 411e442e7..b8c5aad92 100644 --- a/contracts/test/WBNB.sol +++ b/contracts/test/WBNB.sol @@ -6,7 +6,7 @@ *Submitted for verification at Bscscan.com on 2020-09-03 */ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; contract WBNB { string public name = "Wrapped BNB"; @@ -21,7 +21,7 @@ contract WBNB { mapping(address => uint) public balanceOf; mapping(address => mapping(address => uint)) public allowance; - receive() external payable { + function() external payable { deposit(); } @@ -33,7 +33,7 @@ contract WBNB { function withdraw(uint wad) public { require(balanceOf[msg.sender] >= wad); balanceOf[msg.sender] -= wad; - payable(msg.sender).transfer(wad); + msg.sender.transfer(wad); emit Withdrawal(msg.sender, wad); } @@ -50,7 +50,7 @@ contract WBNB { function transferFrom(address src, address dst, uint wad) public returns (bool) { require(balanceOf[src] >= wad); - if (src != msg.sender && allowance[src][msg.sender] != type(uint).max) { + if (src != msg.sender && allowance[src][msg.sender] != uint(-1)) { require(allowance[src][msg.sender] >= wad); allowance[src][msg.sender] -= wad; } diff --git a/contracts/test/WBTC.sol b/contracts/test/WBTC.sol index 5eb334060..c8234c15d 100644 --- a/contracts/test/WBTC.sol +++ b/contracts/test/WBTC.sol @@ -2,7 +2,7 @@ *Submitted for verification at BscScan.io on 2018-11-24 */ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; // File: openzeppelin-solidity/contracts/token/BEP20/BEP20Basic.sol @@ -11,12 +11,12 @@ pragma solidity 0.8.13; * @dev Simpler version of BEP20 interface * See https://github.com/ethereum/EIPs/issues/179 */ -abstract contract BEP20Basic { - function totalSupply() public view virtual returns (uint256); +contract BEP20Basic { + function totalSupply() public view returns (uint256); - function balanceOf(address _who) public view virtual returns (uint256); + function balanceOf(address _who) public view returns (uint256); - function transfer(address _to, uint256 _value) public virtual returns (bool); + function transfer(address _to, uint256 _value) public returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); } @@ -88,7 +88,7 @@ contract BasivToken is BEP20Basic { /** * @dev Total number of tokens in existence */ - function totalSupply() public view override returns (uint256) { + function totalSupply() public view returns (uint256) { return totalSupply_; } @@ -97,7 +97,7 @@ contract BasivToken is BEP20Basic { * @param _to The address to transfer to. * @param _value The amount to be transferred. */ - function transfer(address _to, uint256 _value) public virtual override returns (bool) { + function transfer(address _to, uint256 _value) public returns (bool) { require(_value <= balances[msg.sender], ""); require(_to != address(0), ""); @@ -112,7 +112,7 @@ contract BasivToken is BEP20Basic { * @param _owner The address to query the the balance of. * @return An uint256 representing the amount owned by the passed address. */ - function balanceOf(address _owner) public view override returns (uint256) { + function balanceOf(address _owner) public view returns (uint256) { return balances[_owner]; } } @@ -123,12 +123,12 @@ contract BasivToken is BEP20Basic { * @title BEP20 interface * @dev see https://github.com/ethereum/EIPs/issues/20 */ -abstract contract BEP20 is BEP20Basic { - function allowance(address _owner, address _spender) public view virtual returns (uint256); +contract BEP20 is BEP20Basic { + function allowance(address _owner, address _spender) public view returns (uint256); - function transferFrom(address _from, address _to, uint256 _value) public virtual returns (bool); + function transferFrom(address _from, address _to, uint256 _value) public returns (bool); - function approve(address _spender, uint256 _value) public virtual returns (bool); + function approve(address _spender, uint256 _value) public returns (bool); event Approval(address indexed owner, address indexed spender, uint256 value); } @@ -143,7 +143,6 @@ abstract contract BEP20 is BEP20Basic { * Based on code by FirstBlood: https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol */ contract StandardToken is BEP20, BasivToken { - using SafeMath for uint256; mapping(address => mapping(address => uint256)) internal allowed; /** @@ -152,7 +151,7 @@ contract StandardToken is BEP20, BasivToken { * @param _to address The address which you want to transfer to * @param _value uint256 the amount of tokens to be transferred */ - function transferFrom(address _from, address _to, uint256 _value) public virtual override returns (bool) { + function transferFrom(address _from, address _to, uint256 _value) public returns (bool) { require(_value <= balances[_from], ""); require(_value <= allowed[_from][msg.sender], ""); require(_to != address(0), ""); @@ -173,7 +172,7 @@ contract StandardToken is BEP20, BasivToken { * @param _spender The address which will spend the funds. * @param _value The amount of tokens to be spent. */ - function approve(address _spender, uint256 _value) public virtual override returns (bool) { + function approve(address _spender, uint256 _value) public returns (bool) { allowed[msg.sender][_spender] = _value; emit Approval(msg.sender, _spender, _value); return true; @@ -185,7 +184,7 @@ contract StandardToken is BEP20, BasivToken { * @param _spender address The address which will spend the funds. * @return A uint256 specifying the amount of tokens still available for the spender. */ - function allowance(address _owner, address _spender) public view override returns (uint256) { + function allowance(address _owner, address _spender) public view returns (uint256) { return allowed[_owner][_spender]; } @@ -198,7 +197,7 @@ contract StandardToken is BEP20, BasivToken { * @param _spender The address which will spend the funds. * @param _addedValue The amount of tokens to increase the allowance by. */ - function increaseApproval(address _spender, uint256 _addedValue) public virtual returns (bool) { + function increaseApproval(address _spender, uint256 _addedValue) public returns (bool) { allowed[msg.sender][_spender] = (allowed[msg.sender][_spender].add(_addedValue)); emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]); return true; @@ -213,7 +212,7 @@ contract StandardToken is BEP20, BasivToken { * @param _spender The address which will spend the funds. * @param _subtractedValue The amount of tokens to decrease the allowance by. */ - function decreaseApproval(address _spender, uint256 _subtractedValue) public virtual returns (bool) { + function decreaseApproval(address _spender, uint256 _subtractedValue) public returns (bool) { uint256 oldValue = allowed[msg.sender][_spender]; if (_subtractedValue >= oldValue) { allowed[msg.sender][_spender] = 0; @@ -233,17 +232,17 @@ contract StandardToken is BEP20, BasivToken { * All the operations are done using the smallest and indivisible token unit, * just as on BSC all the operations are done in wei. */ -// abstract contract DetailedBEP20 is BEP20 { -// string public name; -// string public symbol; -// uint8 public decimals; - -// constructor(string memory _name, string memory _symbol, uint8 _decimals) public { -// name = _name; -// symbol = _symbol; -// decimals = _decimals; -// } -// } +contract DetailedBEP20 is BEP20 { + string public name; + string public symbol; + uint8 public decimals; + + constructor(string memory _name, string memory _symbol, uint8 _decimals) public { + name = _name; + symbol = _symbol; + decimals = _decimals; + } +} // File: openzeppelin-solidity/contracts/ownership/Ownable.sol @@ -280,7 +279,7 @@ contract Ownable { * It will not be possible to call the functions with the `onlyOwner` * modifier anymore. */ - function renounceOwnership() public virtual onlyOwner { + function renounceOwnership() public onlyOwner { emit OwnershipRenounced(owner); owner = address(0); } @@ -289,7 +288,7 @@ contract Ownable { * @dev Allows the current owner to transfer control of the contract to a newOwner. * @param _newOwner The address to transfer ownership to. */ - function transferOwnership(address _newOwner) public virtual onlyOwner { + function transferOwnership(address _newOwner) public onlyOwner { _transferOwnership(_newOwner); } @@ -312,8 +311,6 @@ contract Ownable { * Based on code by TokenMarketNet: https://github.com/TokenMarketNet/ico/blob/master/contracts/MintableToken.sol */ contract MintableToken is StandardToken, Ownable { - using SafeMath for uint256; - event Mint(address indexed to, uint256 amount); event MintFinished(); @@ -347,7 +344,7 @@ contract MintableToken is StandardToken, Ownable { * @dev Function to stop minting new tokens. * @return True if the operation was successful. */ - function finishMinting() public virtual onlyOwner canMint returns (bool) { + function finishMinting() public onlyOwner canMint returns (bool) { mintingFinished = true; emit MintFinished(); return true; @@ -361,15 +358,13 @@ contract MintableToken is StandardToken, Ownable { * @dev Token that can be irreversibly burned (destroyed). */ contract BurnableToken is BasivToken { - using SafeMath for uint256; - event Burn(address indexed burner, uint256 value); /** * @dev Burns a specific amount of tokens. * @param _value The amount of token to be burned. */ - function burn(uint256 _value) public virtual { + function burn(uint256 _value) public { _burn(msg.sender, _value); } @@ -437,29 +432,23 @@ contract Pausable is Ownable { * @dev StandardToken modified with pausable transfers. **/ contract PausableToken is StandardToken, Pausable { - function transfer( - address _to, - uint256 _value - ) public override(BEP20Basic, BasivToken) whenNotPaused returns (bool) { + function transfer(address _to, uint256 _value) public whenNotPaused returns (bool) { return super.transfer(_to, _value); } - function transferFrom(address _from, address _to, uint256 _value) public override whenNotPaused returns (bool) { + function transferFrom(address _from, address _to, uint256 _value) public whenNotPaused returns (bool) { return super.transferFrom(_from, _to, _value); } - function approve(address _spender, uint256 _value) public override whenNotPaused returns (bool) { + function approve(address _spender, uint256 _value) public whenNotPaused returns (bool) { return super.approve(_spender, _value); } - function increaseApproval(address _spender, uint _addedValue) public override whenNotPaused returns (bool success) { + function increaseApproval(address _spender, uint _addedValue) public whenNotPaused returns (bool success) { return super.increaseApproval(_spender, _addedValue); } - function decreaseApproval( - address _spender, - uint _subtractedValue - ) public override whenNotPaused returns (bool success) { + function decreaseApproval(address _spender, uint _subtractedValue) public whenNotPaused returns (bool success) { return super.decreaseApproval(_spender, _subtractedValue); } } @@ -486,7 +475,7 @@ contract Claimable is Ownable { * @dev Allows the current owner to set the pendingOwner address. * @param newOwner The address to transfer ownership to. */ - function transferOwnership(address newOwner) public override onlyOwner { + function transferOwnership(address newOwner) public onlyOwner { pendingOwner = newOwner; } @@ -546,38 +535,38 @@ contract CanReclaimToken is Ownable { // File: contracts/utils/OwnableContract.sol // empty block is used as this contract just inherits others. -// contract OwnableContract is CanReclaimToken, Claimable { - -// } /* solhint-disable-line no-empty-blocks */ - -// // File: contracts/token/WBTC.sol - -// contract WBTVToken is -// StandardToken, -// DetailedBEP20("Wrapped BTC", "WBTC", 8), -// MintableToken, -// BurnableToken, -// PausableToken, -// OwnableContract -// { -// function burn(uint value) public override onlyOwner { -// super.burn(value); -// } - -// function finishMinting() public onlyOwner override returns (bool) { -// return false; -// } - -// function renounceOwnership() public override onlyOwner { -// revert("renouncing ownership is blocked"); -// } - -// /** -// * @dev Arbitrarily adds tokens to any account -// */ -// function allocateTo(address _owner, uint256 value) public { -// balances[_owner] += value; -// totalSupply_ += value; -// emit Transfer(address(this), _owner, value); -// } -// } +contract OwnableContract is CanReclaimToken, Claimable { + +} /* solhint-disable-line no-empty-blocks */ + +// File: contracts/token/WBTC.sol + +contract WBTVToken is + StandardToken, + DetailedBEP20("Wrapped BTC", "WBTC", 8), + MintableToken, + BurnableToken, + PausableToken, + OwnableContract +{ + function burn(uint value) public onlyOwner { + super.burn(value); + } + + function finishMinting() public onlyOwner returns (bool) { + return false; + } + + function renounceOwnership() public onlyOwner { + revert("renouncing ownership is blocked"); + } + + /** + * @dev Arbitrarily adds tokens to any account + */ + function allocateTo(address _owner, uint256 value) public { + balances[_owner] += value; + totalSupply_ += value; + emit Transfer(address(this), _owner, value); + } +} diff --git a/contracts/test/XVSVaultHarness.sol b/contracts/test/XVSVaultHarness.sol index ec5a4b5d1..579cae0c8 100644 --- a/contracts/test/XVSVaultHarness.sol +++ b/contracts/test/XVSVaultHarness.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; contract XVSVaultHarness { constructor() public {} From f8f4eebcced9da8dfa97554eeaf6e4860dbc1902 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Thu, 4 May 2023 17:48:53 +0530 Subject: [PATCH 078/153] refactor: revert all tests changes and added cut params for mainnet. --- contracts/test/VBNBHarness.sol.archive | 10 +- .../comptroller/cut-params-mainnet.json | 115 ++++++++++++++++++ ...ut-params.json => cut-params-testnet.json} | 0 .../fork/vip-diamond-comptroller-mainnet.ts | 5 +- .../fork/vip-diamond-comptroller-testnet.ts | 2 +- .../liquidateCalculateAmoutSeizeTest.ts | 4 +- .../hardhat/Comptroller/Diamond/pauseTest.ts | 4 +- tests/hardhat/Comptroller/XVSSpeeds.ts | 8 +- tests/hardhat/Comptroller/accessControl.ts | 4 +- tests/hardhat/Comptroller/assetListTest.ts | 12 +- tests/hardhat/Comptroller/comptrollerTest.ts | 20 ++- .../liquidateCalculateAmountSeizeTest.ts | 23 ++-- tests/hardhat/Comptroller/pauseTest.ts | 8 +- .../DelegateBorrowers/SwapDebtDelegate.ts | 10 +- tests/hardhat/EvilXToken.ts | 12 +- tests/hardhat/Fork/swapTest.ts | 2 +- tests/hardhat/Lens/Rewards.ts | 4 +- .../Liquidator/liquidatorHarnessTest.ts | 4 +- tests/hardhat/Liquidator/liquidatorTest.ts | 8 +- .../Liquidator/restrictedLiquidations.ts | 2 +- tests/hardhat/Swap/swapTest.ts | 2 +- tests/hardhat/VAI/VAIController.ts | 4 +- 22 files changed, 172 insertions(+), 91 deletions(-) create mode 100644 script/deploy/comptroller/cut-params-mainnet.json rename script/deploy/comptroller/{cut-params.json => cut-params-testnet.json} (100%) diff --git a/contracts/test/VBNBHarness.sol.archive b/contracts/test/VBNBHarness.sol.archive index 259ae85d6..ffba1a3c1 100644 --- a/contracts/test/VBNBHarness.sol.archive +++ b/contracts/test/VBNBHarness.sol.archive @@ -1,4 +1,4 @@ -pragma solidity 0.8.13; +pragma solidity ^0.5.16; import "../Tokens/VTokens/VBNB.sol"; import "./ComptrollerScenario.sol"; @@ -19,19 +19,19 @@ contract VBNBHarness is VBNB { address payable admin_ ) public VBNB(comptroller_, interestRateModel_, initialExchangeRateMantissa, name_, symbol_, decimals_, admin_) {} - function doTransferOut(address payable to, uint amount) internal override { + function doTransferOut(address payable to, uint amount) internal { require(failTransferToAddresses[to] == false, "TOKEN_TRANSFER_OUT_FAILED"); return super.doTransferOut(to, amount); } - function exchangeRateStoredInternal() internal view override returns (MathError, uint) { + function exchangeRateStoredInternal() internal view returns (MathError, uint) { if (harnessExchangeRate != 0) { return (MathError.NO_ERROR, harnessExchangeRate); } return super.exchangeRateStoredInternal(); } - function getBlockNumber() internal view override returns (uint) { + function getBlockNumber() internal view returns (uint) { return blockNumber; } @@ -188,7 +188,7 @@ contract VBNBScenario is VBNB { // no-op } - function getBlockNumber() internal view override returns (uint) { + function getBlockNumber() internal view returns (uint) { ComptrollerScenario comptrollerScenario = ComptrollerScenario(address(comptroller)); return comptrollerScenario.blockNumber(); } diff --git a/script/deploy/comptroller/cut-params-mainnet.json b/script/deploy/comptroller/cut-params-mainnet.json new file mode 100644 index 000000000..cac75543f --- /dev/null +++ b/script/deploy/comptroller/cut-params-mainnet.json @@ -0,0 +1,115 @@ +{ + "cutParams": [ + ["0xaEf95dd426ea05CD96A7F3af4f290842f883d0A2", 0, ["0xcdffacc6", "0x52ef6b2c", "0xadfca15e", "0x7a0ed627"]], + [ + "", + 0, + [ + "0xa76b3fda", + "0x52d84d1e", + "0x21af4569", + "0x4a584432", + "0x929fe9a1", + "0xe8755446", + "0xd3270f99", + "0xc2998238", + "0xede4edd0", + "0xabfceffc", + "0x007e3dd2", + "0xc488847b", + "0x4ada90af", + "0x9bb27d62", + "0x8e8f294b", + "0x94b2294b", + "0x0db4b4e5", + "0x4088c73e", + "0x2bc7e29e", + "0x7dc0d1d0", + "0x24a3d622", + "0x425fad58", + "0x719f701b", + "0x76551383", + "0x02c3bcbb", + "0xc5f956af", + "0xb2eafc39", + "0x04ef9d58", + "0x9254f5e5", + "0xbec04f72", + "0x7d172bd5", + "0x8a7dc165", + "0xbbb8864a", + "0xe37d4b79", + "0x08e0225c", + "0x879c2e1d", + "0x1abcaa77", + "0x41a18d2c", + "0x5dd3fc9d", + "0xb8324c7c", + "0xfa6331d8" + ] + ], + [ + "", + 0, + [ + "0xead1a8a0", + "0xda3d454c", + "0x5c778605", + "0x5ec88c79", + "0x5fc7e71e", + "0x47ef3b3b", + "0x4ef4c3e1", + "0x41c728b9", + "0xeabe7d91", + "0x51dff989", + "0x24008a62", + "0x1ededc91", + "0xd02f7351", + "0x6d35bf91", + "0xbdcdc258", + "0x6a56947e" + ] + ], + [ + "", + 0, + [ + "0xa7604b41", + "0xe85a2960", + "0x70bf66f0", + "0x86df31ee", + "0xadcd5fb9", + "0xd09c54ba", + "0x7858524d", + "0x42cbb15c", + "0xbf32442d", + "0xededbae6", + "0xddfd287e" + ] + ], + [ + "", + 0, + [ + "0xf519fc30", + "0x2b5d790c", + "0x317b0b77", + "0xe4028eee", + "0x9bf34cbb", + "0x4fd42e17", + "0xbb857450", + "0x607ef6c1", + "0x51a485e4", + "0x5f5af1aa", + "0x55ee1fe1", + "0x2a6a6065", + "0xd24febad", + "0x9cfdd9e6", + "0x2ec04124", + "0x4e0853db", + "0x6662c7c9", + "0xfd51a3ad" + ] + ] + ] +} diff --git a/script/deploy/comptroller/cut-params.json b/script/deploy/comptroller/cut-params-testnet.json similarity index 100% rename from script/deploy/comptroller/cut-params.json rename to script/deploy/comptroller/cut-params-testnet.json diff --git a/script/hardhat/fork/vip-diamond-comptroller-mainnet.ts b/script/hardhat/fork/vip-diamond-comptroller-mainnet.ts index 694c1f35c..9a3c90e93 100644 --- a/script/hardhat/fork/vip-diamond-comptroller-mainnet.ts +++ b/script/hardhat/fork/vip-diamond-comptroller-mainnet.ts @@ -1,11 +1,10 @@ import { impersonateAccount } from "@nomicfoundation/hardhat-network-helpers"; import { expect } from "chai"; -import { parseUnits } from "ethers/lib/utils"; import { ethers } from "hardhat"; import { VBep20 } from "../../../typechain"; -import { cutParams as params } from "../../deploy/comptroller/cut-params.json"; -import { forking, pretendExecutingVip, testVip } from "./vip-framework"; +import { cutParams as params } from "../../deploy/comptroller/cut-params-mainnet.json"; +import { forking, testVip } from "./vip-framework"; import { ProposalType } from "./vip-framework/types"; import { makeProposal } from "./vip-framework/utils"; diff --git a/script/hardhat/fork/vip-diamond-comptroller-testnet.ts b/script/hardhat/fork/vip-diamond-comptroller-testnet.ts index fcb5025e1..39c6cdb8b 100644 --- a/script/hardhat/fork/vip-diamond-comptroller-testnet.ts +++ b/script/hardhat/fork/vip-diamond-comptroller-testnet.ts @@ -4,7 +4,7 @@ import { parseUnits } from "ethers/lib/utils"; import { ethers } from "hardhat"; import { VBep20 } from "../../../typechain"; -import { cutParams as params } from "../../deploy/comptroller/cut-params.json"; +import { cutParams as params } from "../../deploy/comptroller/cut-params-testnet.json"; import { forking, pretendExecutingVip, testVip } from "./vip-framework"; import { ProposalType } from "./vip-framework/types"; import { makeProposal } from "./vip-framework/utils"; diff --git a/tests/hardhat/Comptroller/Diamond/liquidateCalculateAmoutSeizeTest.ts b/tests/hardhat/Comptroller/Diamond/liquidateCalculateAmoutSeizeTest.ts index d9c1c08d1..bed155af4 100644 --- a/tests/hardhat/Comptroller/Diamond/liquidateCalculateAmoutSeizeTest.ts +++ b/tests/hardhat/Comptroller/Diamond/liquidateCalculateAmoutSeizeTest.ts @@ -58,9 +58,7 @@ describe("Comptroller", () => { } async function liquidateFixture(): Promise { - const accessControl = await smock.fake( - "contracts/Governance/IAccessControlManager.sol:IAccessControlManager", - ); + const accessControl = await smock.fake("IAccessControlManager"); // const ComptrollerFactory = await smock.mock("Comptroller"); const ComptrollerLensFactory = await smock.mock("ComptrollerLens"); const result = await deployDiamond(""); diff --git a/tests/hardhat/Comptroller/Diamond/pauseTest.ts b/tests/hardhat/Comptroller/Diamond/pauseTest.ts index 575219b65..449395f51 100644 --- a/tests/hardhat/Comptroller/Diamond/pauseTest.ts +++ b/tests/hardhat/Comptroller/Diamond/pauseTest.ts @@ -23,9 +23,7 @@ type PauseFixture = { }; async function pauseFixture(): Promise { - const accessControl = await smock.fake( - "contracts/Governance/IAccessControlManager.sol:IAccessControlManager", - ); + const accessControl = await smock.fake("IAccessControlManager"); const result = await deployDiamond(""); const comptrollerDeployment = result.unitroller; const comptroller = await ethers.getContractAt("Comptroller", comptrollerDeployment.address); diff --git a/tests/hardhat/Comptroller/XVSSpeeds.ts b/tests/hardhat/Comptroller/XVSSpeeds.ts index 51dd61203..2502d339a 100644 --- a/tests/hardhat/Comptroller/XVSSpeeds.ts +++ b/tests/hardhat/Comptroller/XVSSpeeds.ts @@ -17,11 +17,9 @@ describe("Comptroller", () => { beforeEach(async () => { const ComptrollerFactory = await smock.mock("Comptroller"); comptroller = await ComptrollerFactory.deploy(); - accessControl = await smock.fake( - "contracts/Governance/IAccessControlManager.sol:IAccessControlManager", - ); - vToken1 = await smock.fake("contracts/Tokens/VTokens/VToken.sol:VToken"); - vToken2 = await smock.fake("contracts/Tokens/VTokens/VToken.sol:VToken"); + accessControl = await smock.fake("IAccessControlManager"); + vToken1 = await smock.fake("VToken"); + vToken2 = await smock.fake("VToken"); await accessControl.isAllowedToCall.returns(true); await vToken1.isVToken.returns(true); diff --git a/tests/hardhat/Comptroller/accessControl.ts b/tests/hardhat/Comptroller/accessControl.ts index 822674848..6aa1e0ba8 100644 --- a/tests/hardhat/Comptroller/accessControl.ts +++ b/tests/hardhat/Comptroller/accessControl.ts @@ -20,9 +20,7 @@ describe("Comptroller", () => { userAddress = await user.getAddress(); const ComptrollerFactory = await smock.mock("Comptroller"); comptroller = await ComptrollerFactory.deploy(); - accessControl = await smock.fake( - "contracts/Governance/IAccessControlManager.sol:IAccessControlManager", - ); + accessControl = await smock.fake("IAccessControlManager"); }); describe("_setAccessControlManager", () => { diff --git a/tests/hardhat/Comptroller/assetListTest.ts b/tests/hardhat/Comptroller/assetListTest.ts index 0af1ca601..6757bb03a 100644 --- a/tests/hardhat/Comptroller/assetListTest.ts +++ b/tests/hardhat/Comptroller/assetListTest.ts @@ -44,14 +44,12 @@ describe("assetListTest", () => { }; async function assetListFixture(): Promise { - const accessControl = await smock.fake( - "contracts/Governance/IAccessControlManager.sol:IAccessControlManager", - ); + const accessControl = await smock.fake("IAccessControlManager"); const ComptrollerFactory = await smock.mock("Comptroller"); const ComptrollerLensFactory = await smock.mock("ComptrollerLens"); const comptroller = await ComptrollerFactory.deploy(); const comptrollerLens = await ComptrollerLensFactory.deploy(); - const oracle = await smock.fake("contracts/Oracle/PriceOracle.sol:PriceOracle"); + const oracle = await smock.fake("PriceOracle"); accessControl.isAllowedToCall.returns(true); await comptroller._setAccessControl(accessControl.address); await comptroller._setComptrollerLens(comptrollerLens.address); @@ -59,9 +57,7 @@ describe("assetListTest", () => { const names = ["OMG", "ZRX", "BAT", "sketch"]; const [OMG, ZRX, BAT, SKT] = await Promise.all( names.map(async name => { - const vToken = await smock.fake( - "contracts/Tokens/VTokens/VBep20Immutable.sol:VBep20Immutable", - ); + const vToken = await smock.fake("VBep20Immutable"); if (name !== "sketch") { await comptroller._supportMarket(vToken.address); } @@ -229,7 +225,7 @@ describe("assetListTest", () => { describe("entering from borrowAllowed", () => { beforeEach(async () => { - BAT.borrowIndex.returns(convertToUnit(1, 18)); + await BAT.borrowIndex.returns(convertToUnit(1, 18)); }); it("enters when called by a vtoken", async () => { diff --git a/tests/hardhat/Comptroller/comptrollerTest.ts b/tests/hardhat/Comptroller/comptrollerTest.ts index eb554a72f..1a0ff798d 100644 --- a/tests/hardhat/Comptroller/comptrollerTest.ts +++ b/tests/hardhat/Comptroller/comptrollerTest.ts @@ -29,10 +29,8 @@ type SimpleComptrollerFixture = { }; async function deploySimpleComptroller(): Promise { - const oracle = await smock.fake("contracts/Oracle/PriceOracle.sol:PriceOracle"); - const accessControl = await smock.fake( - "contracts/Governance/IAccessControlManager.sol:IAccessControlManager", - ); + const oracle = await smock.fake("PriceOracle"); + const accessControl = await smock.fake("IAccessControlManager"); accessControl.isAllowedToCall.returns(true); const ComptrollerLensFactory = await smock.mock("ComptrollerLens"); const ComptrollerFactory = await smock.mock("Comptroller"); @@ -135,7 +133,7 @@ describe("Comptroller", () => { async function deploy(): Promise { const contracts = await deploySimpleComptroller(); - const newOracle = await smock.fake("contracts/Oracle/PriceOracle.sol:PriceOracle"); + const newOracle = await smock.fake("PriceOracle"); return { ...contracts, newOracle }; } @@ -216,7 +214,7 @@ describe("Comptroller", () => { async function deploy(): Promise { const contracts = await deploySimpleComptroller(); - const vToken = await smock.fake("contracts/Tokens/VTokens/VToken.sol:VToken"); + const vToken = await smock.fake("VToken"); vToken.comptroller.returns(contracts.comptroller.address); vToken.isVToken.returns(true); return { vToken, ...contracts }; @@ -265,9 +263,9 @@ describe("Comptroller", () => { async function deploy(): Promise { const contracts = await deploySimpleComptroller(); - const vToken1 = await smock.fake("contracts/Tokens/VTokens/VToken.sol:VToken"); - const vToken2 = await smock.fake("contracts/Tokens/VTokens/VToken.sol:VToken"); - const token = await smock.fake("contracts/Tokens/EIP20Interface.sol:EIP20Interface"); + const vToken1 = await smock.fake("VToken"); + const vToken2 = await smock.fake("VToken"); + const token = await smock.fake("EIP20Interface"); return { ...contracts, vToken1, vToken2, token }; } @@ -316,7 +314,7 @@ describe("Comptroller", () => { async function deploy(): Promise { const contracts = await deploySimpleComptroller(); - const vToken = await smock.fake("contracts/Tokens/VTokens/VToken.sol:VToken"); + const vToken = await smock.fake("VToken"); await contracts.comptroller._supportMarket(vToken.address); return { ...contracts, vToken }; } @@ -365,7 +363,7 @@ describe("Comptroller", () => { }); it("reverts if market is not listed", async () => { - const someVToken = await smock.fake("contracts/Tokens/VTokens/VToken.sol:VToken"); + const someVToken = await smock.fake("VToken"); await expect( comptroller.mintAllowed(someVToken.address, await root.getAddress(), convertToUnit("1", 18)), ).to.be.revertedWith("market not listed"); diff --git a/tests/hardhat/Comptroller/liquidateCalculateAmountSeizeTest.ts b/tests/hardhat/Comptroller/liquidateCalculateAmountSeizeTest.ts index 6e3950a2e..c127128a7 100644 --- a/tests/hardhat/Comptroller/liquidateCalculateAmountSeizeTest.ts +++ b/tests/hardhat/Comptroller/liquidateCalculateAmountSeizeTest.ts @@ -55,26 +55,20 @@ describe("Comptroller", () => { } async function liquidateFixture(): Promise { - const accessControl = await smock.fake( - "contracts/Governance/IAccessControlManager.sol:IAccessControlManager", - ); + const accessControl = await smock.fake("IAccessControlManager"); const ComptrollerFactory = await smock.mock("Comptroller"); const ComptrollerLensFactory = await smock.mock("ComptrollerLens"); const comptroller = await ComptrollerFactory.deploy(); const comptrollerLens = await ComptrollerLensFactory.deploy(); - const oracle = await smock.fake("contracts/Oracle/PriceOracle.sol:PriceOracle"); + const oracle = await smock.fake("PriceOracle"); accessControl.isAllowedToCall.returns(true); await comptroller._setAccessControl(accessControl.address); await comptroller._setComptrollerLens(comptrollerLens.address); await comptroller._setPriceOracle(oracle.address); await comptroller._setLiquidationIncentive(convertToUnit("1.1", 18)); - const vTokenBorrowed = await smock.fake( - "contracts/Tokens/VTokens/VBep20Immutable.sol:VBep20Immutable", - ); - const vTokenCollateral = await smock.fake( - "contracts/Tokens/VTokens/VBep20Immutable.sol:VBep20Immutable", - ); + const vTokenBorrowed = await smock.fake("VBep20Immutable"); + const vTokenCollateral = await smock.fake("VBep20Immutable"); return { comptroller, comptrollerLens, oracle, vTokenBorrowed, vTokenCollateral }; } @@ -113,13 +107,16 @@ describe("Comptroller", () => { }); it("fails if the repayAmount causes overflow ", async () => { - await expect(calculateSeizeTokens(comptroller, vTokenBorrowed, vTokenCollateral, constants.MaxUint256)).to.be - .reverted; + await expect( + calculateSeizeTokens(comptroller, vTokenBorrowed, vTokenCollateral, constants.MaxUint256), + ).to.be.revertedWith("multiplication overflow"); }); it("fails if the borrowed asset price causes overflow ", async () => { setOraclePrice(vTokenBorrowed, constants.MaxUint256); - await expect(calculateSeizeTokens(comptroller, vTokenBorrowed, vTokenCollateral, repayAmount)).to.be.reverted; + await expect(calculateSeizeTokens(comptroller, vTokenBorrowed, vTokenCollateral, repayAmount)).to.be.revertedWith( + "multiplication overflow", + ); }); it("reverts if it fails to calculate the exchange rate", async () => { diff --git a/tests/hardhat/Comptroller/pauseTest.ts b/tests/hardhat/Comptroller/pauseTest.ts index 05b774ba7..3d24f6339 100644 --- a/tests/hardhat/Comptroller/pauseTest.ts +++ b/tests/hardhat/Comptroller/pauseTest.ts @@ -26,20 +26,18 @@ type PauseFixture = { }; async function pauseFixture(): Promise { - const accessControl = await smock.fake( - "contracts/Governance/IAccessControlManager.sol:IAccessControlManager", - ); + const accessControl = await smock.fake("IAccessControlManager"); const ComptrollerFactory = await smock.mock("Comptroller"); const comptroller = await ComptrollerFactory.deploy(); await comptroller._setAccessControl(accessControl.address); - const oracle = await smock.fake("contracts/Oracle/PriceOracle.sol:PriceOracle"); + const oracle = await smock.fake("PriceOracle"); accessControl.isAllowedToCall.returns(true); await comptroller._setPriceOracle(oracle.address); const names = ["OMG", "ZRX", "BAT", "sketch"]; const [OMG, ZRX, BAT, SKT] = await Promise.all( names.map(async name => { - const vToken = await smock.fake("contracts/Tokens/VTokens/VBep20Immutable.sol:VBep20Immutable"); + const vToken = await smock.fake("VBep20Immutable"); if (name !== "sketch") { await comptroller._supportMarket(vToken.address); } diff --git a/tests/hardhat/DelegateBorrowers/SwapDebtDelegate.ts b/tests/hardhat/DelegateBorrowers/SwapDebtDelegate.ts index 21280492b..165649953 100644 --- a/tests/hardhat/DelegateBorrowers/SwapDebtDelegate.ts +++ b/tests/hardhat/DelegateBorrowers/SwapDebtDelegate.ts @@ -42,13 +42,13 @@ describe("assetListTest", () => { beforeEach(async () => { [owner, borrower] = await ethers.getSigners(); - priceOracle = await smock.fake("contracts/Oracle/PriceOracle.sol:PriceOracle"); - comptroller = await smock.fake("contracts/Comptroller/Comptroller.sol:Comptroller"); - foo = await smock.fake("IERC20Upgradeable"); + priceOracle = await smock.fake("PriceOracle"); + comptroller = await smock.fake("Comptroller"); + foo = await smock.fake("IERC20Upgradeable"); bar = await smock.fake("IERC20Upgradeable"); - vFoo = await smock.fake("contracts/Tokens/VTokens/VBep20.sol:VBep20"); - vBar = await smock.fake("contracts/Tokens/VTokens/VBep20.sol:VBep20"); + vFoo = await smock.fake("VBep20"); + vBar = await smock.fake("VBep20"); vFoo.underlying.returns(foo.address); vBar.underlying.returns(bar.address); diff --git a/tests/hardhat/EvilXToken.ts b/tests/hardhat/EvilXToken.ts index d1f6fa7c4..88852ed96 100644 --- a/tests/hardhat/EvilXToken.ts +++ b/tests/hardhat/EvilXToken.ts @@ -13,9 +13,7 @@ describe("Evil Token test", async () => { beforeEach(async () => { const [root, account1] = await ethers.getSigners(); - const accessControlMock = await smock.fake( - "contracts/Governance/IAccessControlManager.sol:IAccessControlManager", - ); + const accessControlMock = await smock.fake("IAccessControlManager"); accessControlMock.isAllowedToCall.returns(true); user = account1; @@ -83,9 +81,7 @@ describe("Evil Token test", async () => { const vDelegatee1 = await vDelegatee1Factory.deploy(); await vDelegatee1.deployed(); - const vDelegator1Factory = await ethers.getContractFactory( - "contracts/Tokens/VTokens/VBep20Delegator.sol:VBep20Delegator", - ); + const vDelegator1Factory = await ethers.getContractFactory("VBep20Delegator"); const vDelegator1 = await vDelegator1Factory.deploy( underlying1.address, unitroller.address, @@ -114,9 +110,7 @@ describe("Evil Token test", async () => { const vDelegatee2 = await vDelegatee2Factory.deploy(); await vDelegatee2.deployed(); - const vDelegator2Factory = await ethers.getContractFactory( - "contracts/Tokens/VTokens/VBep20Delegator.sol:VBep20Delegator", - ); + const vDelegator2Factory = await ethers.getContractFactory("VBep20Delegator"); const vDelegator2 = await vDelegator2Factory.deploy( underlying2.address, unitroller.address, diff --git a/tests/hardhat/Fork/swapTest.ts b/tests/hardhat/Fork/swapTest.ts index deb785f40..a8b0dd42a 100644 --- a/tests/hardhat/Fork/swapTest.ts +++ b/tests/hardhat/Fork/swapTest.ts @@ -84,7 +84,7 @@ async function configureVtoken(underlyingToken: FaucetToken | VBep20Immutable, n const interestRateModel = await InterstRateModel.deploy(parseUnits("1", 12)); await interestRateModel.deployed(); - const vTokenFactory = await ethers.getContractFactory("contracts/Tokens/VTokens/VBep20Immutable.sol:VBep20Immutable"); + const vTokenFactory = await ethers.getContractFactory("VBep20Immutable"); const vToken = await vTokenFactory.deploy( underlyingToken.address, comptroller.address, diff --git a/tests/hardhat/Lens/Rewards.ts b/tests/hardhat/Lens/Rewards.ts index dba3822d8..f8e8f5125 100644 --- a/tests/hardhat/Lens/Rewards.ts +++ b/tests/hardhat/Lens/Rewards.ts @@ -27,8 +27,8 @@ type RewardsFixtire = { }; const rewardsFixture = async (): Promise => { - vBUSD = await smock.fake("contracts/Tokens/VTokens/VToken.sol:VToken"); - vWBTC = await smock.fake("contracts/Tokens/VTokens/VToken.sol:VToken"); + vBUSD = await smock.fake("VToken"); + vWBTC = await smock.fake("VToken"); XVS = await smock.fake("FaucetToken"); const venusLensFactory = await smock.mock("VenusLens"); venusLens = await venusLensFactory.deploy(); diff --git a/tests/hardhat/Liquidator/liquidatorHarnessTest.ts b/tests/hardhat/Liquidator/liquidatorHarnessTest.ts index 7bf235f24..fd8bd34e1 100644 --- a/tests/hardhat/Liquidator/liquidatorHarnessTest.ts +++ b/tests/hardhat/Liquidator/liquidatorHarnessTest.ts @@ -33,9 +33,7 @@ async function deployLiquidator(): Promise { const comptroller = await smock.fake("Comptroller"); comptroller.liquidationIncentiveMantissa.returns(announcedIncentive); const vBnb = await smock.fake("MockVBNB"); - const vTokenCollateral = await smock.fake( - "contracts/Tokens/VTokens/VBep20Immutable.sol:VBep20Immutable", - ); + const vTokenCollateral = await smock.fake("VBep20Immutable"); const Liquidator = await smock.mock("LiquidatorHarness"); const liquidator = await upgrades.deployProxy(Liquidator, [treasuryPercent], { diff --git a/tests/hardhat/Liquidator/liquidatorTest.ts b/tests/hardhat/Liquidator/liquidatorTest.ts index 2d6d5910c..c1b66a985 100644 --- a/tests/hardhat/Liquidator/liquidatorTest.ts +++ b/tests/hardhat/Liquidator/liquidatorTest.ts @@ -48,12 +48,8 @@ async function deployLiquidator(): Promise { const borrowedUnderlying = await FaucetToken.deploy(convertToBigInt("100", 18), "USD", 18, "USD"); const vai = await FaucetToken.deploy(convertToBigInt("100", 18), "VAI", 18, "VAI"); const vaiController = await smock.fake("VAIController"); - const vTokenBorrowed = await smock.fake( - "contracts/Tokens/VTokens/VBep20Immutable.sol:VBep20Immutable", - ); - const vTokenCollateral = await smock.fake( - "contracts/Tokens/VTokens/VBep20Immutable.sol:VBep20Immutable", - ); + const vTokenBorrowed = await smock.fake("VBep20Immutable"); + const vTokenCollateral = await smock.fake("VBep20Immutable"); comptroller.liquidationIncentiveMantissa.returns(announcedIncentive); comptroller.vaiController.returns(vaiController.address); diff --git a/tests/hardhat/Liquidator/restrictedLiquidations.ts b/tests/hardhat/Liquidator/restrictedLiquidations.ts index 6b55b2758..9ceded1f8 100644 --- a/tests/hardhat/Liquidator/restrictedLiquidations.ts +++ b/tests/hardhat/Liquidator/restrictedLiquidations.ts @@ -24,7 +24,7 @@ async function deployLiquidator(): Promise { const comptroller = await smock.fake("Comptroller"); comptroller.liquidationIncentiveMantissa.returns(convertToBigInt("1.1", 18)); const vBnb = await smock.fake("MockVBNB"); - const vBep20 = await smock.fake("contracts/Tokens/VTokens/VBep20Immutable.sol:VBep20Immutable"); + const vBep20 = await smock.fake("VBep20Immutable"); const Liquidator = await smock.mock("Liquidator"); const liquidator = await upgrades.deployProxy(Liquidator, [treasuryPercentMantissa], { diff --git a/tests/hardhat/Swap/swapTest.ts b/tests/hardhat/Swap/swapTest.ts index 1d492dd5b..d1483e203 100644 --- a/tests/hardhat/Swap/swapTest.ts +++ b/tests/hardhat/Swap/swapTest.ts @@ -49,7 +49,7 @@ type SwapFixture = { }; async function deploySwapContract(): Promise { - const vToken = await smock.fake("contracts/Tokens/VTokens/VBep20Immutable.sol:VBep20Immutable"); + const vToken = await smock.fake("VBep20Immutable"); const wBNBFactory = await smock.mock("WBNB"); const wBNB = await wBNBFactory.deploy(); const pancakeFactory = await smock.fake("IPancakeSwapV2Factory"); diff --git a/tests/hardhat/VAI/VAIController.ts b/tests/hardhat/VAI/VAIController.ts index fcfae3c78..ccace5b46 100644 --- a/tests/hardhat/VAI/VAIController.ts +++ b/tests/hardhat/VAI/VAIController.ts @@ -536,9 +536,7 @@ describe("VAIController", async () => { }); it("emits NewAccessControl event", async () => { - const newAccessControl = await smock.fake( - "contracts/Governance/IAccessControlManager.sol:IAccessControlManager", - ); + const newAccessControl = await smock.fake("IAccessControlManager"); const tx = await vaiController.setAccessControl(newAccessControl.address); await expect(tx) .to.emit(vaiController, "NewAccessControl") From 9f4d17dda91f701bc7a1398adb4896798f875e85 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Fri, 5 May 2023 14:43:04 +0530 Subject: [PATCH 079/153] refactor: added comments to the diamond proxy. --- contracts/Comptroller/ComptrollerStorage.sol | 6 +-- contracts/Comptroller/Diamond/Diamond.sol | 41 ++++++++++++++++++++ 2 files changed, 44 insertions(+), 3 deletions(-) diff --git a/contracts/Comptroller/ComptrollerStorage.sol b/contracts/Comptroller/ComptrollerStorage.sol index ad54ea80f..af242087c 100644 --- a/contracts/Comptroller/ComptrollerStorage.sol +++ b/contracts/Comptroller/ComptrollerStorage.sol @@ -246,9 +246,9 @@ contract ComptrollerV12Storage is ComptrollerV11Storage { uint256 facetAddressPosition; // position of facetAddress in facetAddresses array } - mapping(bytes4 => FacetAddressAndPosition) public selectorToFacetAndPosition; + mapping(bytes4 => FacetAddressAndPosition) selectorToFacetAndPosition; // maps facet addresses to function selectors - mapping(address => FacetFunctionSelectors) public facetFunctionSelectors; + mapping(address => FacetFunctionSelectors) facetFunctionSelectors; // facet addresses - address[] public facetAddresses; + address[] facetAddresses; } diff --git a/contracts/Comptroller/Diamond/Diamond.sol b/contracts/Comptroller/Diamond/Diamond.sol index dea4c9562..24e21ed3d 100644 --- a/contracts/Comptroller/Diamond/Diamond.sol +++ b/contracts/Comptroller/Diamond/Diamond.sol @@ -8,16 +8,28 @@ import "../Unitroller.sol"; contract Diamond is ComptrollerV12Storage { event DiamondCut(IDiamondCut.FacetCut[] _diamondCut); + /** + * @notice Call _acceptImplementation to accept the diamond proxy as new implementaion. + * @param unitroller Address of the unitroller. + */ function _become(Unitroller unitroller) public { require(msg.sender == unitroller.admin(), "only unitroller admin can"); require(unitroller._acceptImplementation() == 0, "not authorized"); } + /** + * @notice To add function selectors to the facets' mapping. + * @param _diamondCut IDiamondCut contains facets address, action and function selectors. + */ function diamondCut(IDiamondCut.FacetCut[] memory _diamondCut) public { require(msg.sender == admin, "only unitroller admin can"); libDiamondCut(_diamondCut); } + /** + * @notice To add function selectors to the facets' mapping. + * @param _diamondCut IDiamondCut contains facets address, action and function selectors. + */ function libDiamondCut(IDiamondCut.FacetCut[] memory _diamondCut) internal { for (uint256 facetIndex; facetIndex < _diamondCut.length; facetIndex++) { IDiamondCut.FacetCutAction action = _diamondCut[facetIndex].action; @@ -34,6 +46,11 @@ contract Diamond is ComptrollerV12Storage { emit DiamondCut(_diamondCut); } + /** + * @notice Add function selectors to the facet's address mapping. + * @param _facetAddress Address of the facet. + * @param _functionSelectors Array of function selectors need to add in the mapping. + */ function addFunctions(address _facetAddress, bytes4[] memory _functionSelectors) internal { require(_functionSelectors.length > 0, "LibDiamondCut: No selectors in facet to cut"); require(_facetAddress != address(0), "LibDiamondCut: Add facet can't be address(0)"); @@ -51,6 +68,11 @@ contract Diamond is ComptrollerV12Storage { } } + /** + * @notice Replace function selectors to the facet's address mapping. + * @param _facetAddress Address of the facet. + * @param _functionSelectors Array of function selectors need to replace in the mapping. + */ function replaceFunctions(address _facetAddress, bytes4[] memory _functionSelectors) internal { require(_functionSelectors.length > 0, "LibDiamondCut: No selectors in facet to cut"); require(_facetAddress != address(0), "LibDiamondCut: Add facet can't be address(0)"); @@ -69,6 +91,11 @@ contract Diamond is ComptrollerV12Storage { } } + /** + * @notice Remove function selectors to the facet's address mapping. + * @param _facetAddress Address of the facet. + * @param _functionSelectors Array of function selectors need to remove in the mapping. + */ function removeFunctions(address _facetAddress, bytes4[] memory _functionSelectors) internal { require(_functionSelectors.length > 0, "LibDiamondCut: No selectors in facet to cut"); // if function does not exist then do nothing and return @@ -80,18 +107,32 @@ contract Diamond is ComptrollerV12Storage { } } + /** + * @notice Add new facet to the proxy. + * @param _facetAddress Address of the facet. + */ function addFacet(address _facetAddress) internal { enforceHasContractCode(_facetAddress, "Diamond: New facet has no code"); facetFunctionSelectors[_facetAddress].facetAddressPosition = facetAddresses.length; facetAddresses.push(_facetAddress); } + /** + * @notice Add function selector to the facet's address mapping. + * @param _facetAddress Address of the facet. + * @param _functionSelectors Array of function selectors need to add in the mapping. + */ function addFunction(bytes4 _selector, uint96 _selectorPosition, address _facetAddress) internal { selectorToFacetAndPosition[_selector].functionSelectorPosition = _selectorPosition; facetFunctionSelectors[_facetAddress].functionSelectors.push(_selector); selectorToFacetAndPosition[_selector].facetAddress = _facetAddress; } + /** + * @notice Remove function selector to the facet's address mapping. + * @param _facetAddress Address of the facet. + * @param _functionSelectors Array of function selectors need to remove in the mapping. + */ function removeFunction(address _facetAddress, bytes4 _selector) internal { require(_facetAddress != address(0), "LibDiamondCut: Can't remove function that doesn't exist"); // an immutable function is a function defined directly in a diamond From c7406bdd69ccf2bf9dcfb4d761c75667444669ce Mon Sep 17 00:00:00 2001 From: defcon022 Date: Fri, 5 May 2023 15:08:36 +0530 Subject: [PATCH 080/153] refactor: minor change in hardhat config. --- hardhat.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hardhat.config.ts b/hardhat.config.ts index 56221c0c8..d8eb26764 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -148,7 +148,7 @@ function isFork() { allowUnlimitedContractSize: false, loggingEnabled: false, forking: { - url: `https://tame-white-dinghy.bsc.discover.quiknode.pro/${process.env.QUICK_NODE_KEY}/`, + url: process.env.BSC_ARCHIVE_NODE || "", blockNumber: 21068448, }, accounts: { From 22e3887988c0475a83d499898994a96f7b086a26 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Fri, 5 May 2023 15:38:39 +0530 Subject: [PATCH 081/153] fix: lint errors. --- contracts/Comptroller/ComptrollerStorage.sol | 6 +++--- contracts/Comptroller/Diamond/Diamond.sol | 5 +++-- script/hardhat/fork/vip-diamond-comptroller-mainnet.ts | 5 +---- script/hardhat/fork/vip-diamond-comptroller-testnet.ts | 9 ++------- 4 files changed, 9 insertions(+), 16 deletions(-) diff --git a/contracts/Comptroller/ComptrollerStorage.sol b/contracts/Comptroller/ComptrollerStorage.sol index af242087c..d9491b9e0 100644 --- a/contracts/Comptroller/ComptrollerStorage.sol +++ b/contracts/Comptroller/ComptrollerStorage.sol @@ -246,9 +246,9 @@ contract ComptrollerV12Storage is ComptrollerV11Storage { uint256 facetAddressPosition; // position of facetAddress in facetAddresses array } - mapping(bytes4 => FacetAddressAndPosition) selectorToFacetAndPosition; + mapping(bytes4 => FacetAddressAndPosition) internal selectorToFacetAndPosition; // maps facet addresses to function selectors - mapping(address => FacetFunctionSelectors) facetFunctionSelectors; + mapping(address => FacetFunctionSelectors) internal facetFunctionSelectors; // facet addresses - address[] facetAddresses; + address[] internal facetAddresses; } diff --git a/contracts/Comptroller/Diamond/Diamond.sol b/contracts/Comptroller/Diamond/Diamond.sol index 24e21ed3d..6411da282 100644 --- a/contracts/Comptroller/Diamond/Diamond.sol +++ b/contracts/Comptroller/Diamond/Diamond.sol @@ -119,8 +119,9 @@ contract Diamond is ComptrollerV12Storage { /** * @notice Add function selector to the facet's address mapping. + * @param _selector funciton selector need to be added. + * @param _selectorPosition funciton selector position. * @param _facetAddress Address of the facet. - * @param _functionSelectors Array of function selectors need to add in the mapping. */ function addFunction(bytes4 _selector, uint96 _selectorPosition, address _facetAddress) internal { selectorToFacetAndPosition[_selector].functionSelectorPosition = _selectorPosition; @@ -131,7 +132,7 @@ contract Diamond is ComptrollerV12Storage { /** * @notice Remove function selector to the facet's address mapping. * @param _facetAddress Address of the facet. - * @param _functionSelectors Array of function selectors need to remove in the mapping. + * @param _selector function selectors need to remove in the mapping. */ function removeFunction(address _facetAddress, bytes4 _selector) internal { require(_facetAddress != address(0), "LibDiamondCut: Can't remove function that doesn't exist"); diff --git a/script/hardhat/fork/vip-diamond-comptroller-mainnet.ts b/script/hardhat/fork/vip-diamond-comptroller-mainnet.ts index 9a3c90e93..4de3fc979 100644 --- a/script/hardhat/fork/vip-diamond-comptroller-mainnet.ts +++ b/script/hardhat/fork/vip-diamond-comptroller-mainnet.ts @@ -105,9 +105,7 @@ const initMainnetUser = async (user: string) => { }; forking(29043847, async () => { - let USDT: ethers.contract; let BUSD: ethers.contract; - let usdtHolder: ethers.Signer; let busdHolder: ethers.Signer; let vBUSD: ethers.contract; let vUSDT: ethers.contract; @@ -135,14 +133,13 @@ forking(29043847, async () => { diamondUnitroller = await ethers.getContractAt("Comptroller", unitroller.address); busdHolder = await initMainnetUser("0xf977814e90da44bfa03b6295a0616a897441acec"); - usdtHolder = await initMainnetUser("0xc444949e0054A23c44Fc45789738bdF64aed2391"); [vBUSD, vUSDT] = await Promise.all( [VBUSD, VUSDT].map((address: string) => { return ethers.getContractAt("contracts/Tokens/VTokens/VBep20Delegate.sol:VBep20Delegate", address); }), ); - [BUSD, USDT] = await Promise.all( + [BUSD] = await Promise.all( [vBUSD, vUSDT].map(async (vToken: VBep20) => { const underlying = await vToken.underlying(); return ethers.getContractAt("IERC20Upgradeable", underlying); diff --git a/script/hardhat/fork/vip-diamond-comptroller-testnet.ts b/script/hardhat/fork/vip-diamond-comptroller-testnet.ts index 39c6cdb8b..5b03fa5e6 100644 --- a/script/hardhat/fork/vip-diamond-comptroller-testnet.ts +++ b/script/hardhat/fork/vip-diamond-comptroller-testnet.ts @@ -101,7 +101,6 @@ forking(29043847, async () => { venusBorrowSpeeds, venusSupplySpeeds; - let USDT: ethers.contract; let BUSD: ethers.contract; let usdtHolder: ethers.Signer; let busdHolder: ethers.Signer; @@ -133,7 +132,7 @@ forking(29043847, async () => { }), ); - [BUSD, USDT] = await Promise.all( + [BUSD] = await Promise.all( [vBUSD, vUSDT].map(async (vToken: VBep20) => { const underlying = await vToken.underlying(); return ethers.getContractAt("IERC20Upgradeable", underlying); @@ -410,9 +409,7 @@ forking(29043847, async () => { forking(29043847, async () => { let owner, unitroller; - let USDT: ethers.contract; let BUSD: ethers.contract; - let usdtHolder: ethers.Signer; let busdHolder: ethers.Signer; let vBUSD: ethers.contract; let vUSDT: ethers.contract; @@ -435,15 +432,13 @@ forking(29043847, async () => { busdHolder = await initMainnetUser("0xC825AD791A6046991e3706b6342970f6d87e4888"); - usdtHolder = await initMainnetUser("0xa0747a72C329377C2CE4F0F3165197B3a5359EfE"); - [vBUSD, vUSDT] = await Promise.all( [VBUSD, VUSDT].map((address: string) => { return ethers.getContractAt("contracts/Tokens/VTokens/VBep20Delegate.sol:VBep20Delegate", address); }), ); - [BUSD, USDT] = await Promise.all( + [BUSD] = await Promise.all( [vBUSD, vUSDT].map(async (vToken: VBep20) => { const underlying = await vToken.underlying(); return ethers.getContractAt("IERC20Upgradeable", underlying); From 3ab26f21fa9c196bd3917902044c25193e93a95a Mon Sep 17 00:00:00 2001 From: defcon022 Date: Fri, 12 May 2023 11:35:14 +0530 Subject: [PATCH 082/153] refactor: diamond tests. --- .../facets/{FacetHelper.sol => FacetBase.sol} | 2 +- .../Diamond/facets/MarketFacet.sol | 4 +- .../Diamond/facets/PolicyFacet.sol | 4 +- .../Diamond/facets/RewardFacet.sol | 15 +- .../Diamond/facets/SetterFacet.sol | 4 +- contracts/Tokens/VTokens/VToken.sol | 11 - .../hardhat/Comptroller/Diamond/XVSSpeeds.ts | 54 ++--- .../Comptroller/Diamond/accessControl.ts | 38 ++-- .../Comptroller/Diamond/assetListTest.ts | 62 +++--- .../Comptroller/Diamond/comptrollerTest.ts | 203 +++++++++--------- .../liquidateCalculateAmoutSeizeTest.ts | 53 ++--- .../hardhat/Comptroller/Diamond/pauseTest.ts | 9 +- .../Comptroller/Diamond/scripts/deploy.ts | 15 +- .../Comptroller/Diamond/scripts/diamond.ts | 6 +- tests/hardhat/Fork/diamondTest.ts | 5 +- 15 files changed, 226 insertions(+), 259 deletions(-) rename contracts/Comptroller/Diamond/facets/{FacetHelper.sol => FacetBase.sol} (99%) rename script/diamond/deploy.js => tests/hardhat/Comptroller/Diamond/scripts/deploy.ts (86%) rename script/diamond/diamond.js => tests/hardhat/Comptroller/Diamond/scripts/diamond.ts (94%) diff --git a/contracts/Comptroller/Diamond/facets/FacetHelper.sol b/contracts/Comptroller/Diamond/facets/FacetBase.sol similarity index 99% rename from contracts/Comptroller/Diamond/facets/FacetHelper.sol rename to contracts/Comptroller/Diamond/facets/FacetBase.sol index c0034e351..da900f281 100644 --- a/contracts/Comptroller/Diamond/facets/FacetHelper.sol +++ b/contracts/Comptroller/Diamond/facets/FacetBase.sol @@ -5,7 +5,7 @@ import "../../../Utils/ExponentialNoError.sol"; import "../../../Comptroller/ComptrollerStorage.sol"; import "../../../Governance/IAccessControlManager.sol"; -contract FacetHelper is ComptrollerV12Storage { +contract FacetBase is ComptrollerV12Storage { /// @notice The initial Venus index for a market uint224 public constant venusInitialIndex = 1e36; // closeFactorMantissa must be strictly greater than this value diff --git a/contracts/Comptroller/Diamond/facets/MarketFacet.sol b/contracts/Comptroller/Diamond/facets/MarketFacet.sol index dc153b3d0..5d4837181 100644 --- a/contracts/Comptroller/Diamond/facets/MarketFacet.sol +++ b/contracts/Comptroller/Diamond/facets/MarketFacet.sol @@ -1,9 +1,9 @@ pragma solidity 0.5.16; -import "./FacetHelper.sol"; +import "./FacetBase.sol"; import "../../../Tokens/VTokens/VToken.sol"; -contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError, FacetHelper { +contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase { /// @notice Emitted when an account enters a market event MarketEntered(VToken vToken, address account); diff --git a/contracts/Comptroller/Diamond/facets/PolicyFacet.sol b/contracts/Comptroller/Diamond/facets/PolicyFacet.sol index d8971071e..a05e8a256 100644 --- a/contracts/Comptroller/Diamond/facets/PolicyFacet.sol +++ b/contracts/Comptroller/Diamond/facets/PolicyFacet.sol @@ -1,10 +1,10 @@ pragma solidity 0.5.16; import "../../../Utils/ErrorReporter.sol"; -import "./FacetHelper.sol"; +import "./FacetBase.sol"; import "../../../Tokens/VTokens/VToken.sol"; -contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError, FacetHelper { +contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase { /// @notice Emitted when a new borrow-side XVS speed is calculated for a market event VenusBorrowSpeedUpdated(VToken indexed vToken, uint newSpeed); diff --git a/contracts/Comptroller/Diamond/facets/RewardFacet.sol b/contracts/Comptroller/Diamond/facets/RewardFacet.sol index 71d3504b9..888404568 100644 --- a/contracts/Comptroller/Diamond/facets/RewardFacet.sol +++ b/contracts/Comptroller/Diamond/facets/RewardFacet.sol @@ -3,7 +3,7 @@ pragma solidity 0.5.16; import "../../../Oracle/PriceOracle.sol"; import "../../../Tokens/VTokens/VToken.sol"; import "../../../Utils/ErrorReporter.sol"; -import "./FacetHelper.sol"; +import "./FacetBase.sol"; import "../../../Governance/IAccessControlManager.sol"; interface IXVS { @@ -14,7 +14,7 @@ interface IXVS { function approve(address spender, uint rawAmount) external returns (bool); } -contract RewardFacet is ComptrollerErrorReporter, ExponentialNoError, FacetHelper { +contract RewardFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase { /// @notice Emitted when Venus is granted by admin event VenusGranted(address recipient, uint amount); @@ -140,17 +140,6 @@ contract RewardFacet is ComptrollerErrorReporter, ExponentialNoError, FacetHelpe return 0x151B1e2635A717bcDc836ECd6FbB62B674FE3E1D; } - /** - * @notice Checks if a certain action is paused on a market - * @param action Action id - * @param market vToken address - */ - function actionPaused(address market, Action action) public view returns (bool) { - return _actionPaused[market][uint(action)]; - } - - /*** VAI functions ***/ - /** * @notice Transfer XVS to VAI Vault */ diff --git a/contracts/Comptroller/Diamond/facets/SetterFacet.sol b/contracts/Comptroller/Diamond/facets/SetterFacet.sol index a81bd2251..a67509b88 100644 --- a/contracts/Comptroller/Diamond/facets/SetterFacet.sol +++ b/contracts/Comptroller/Diamond/facets/SetterFacet.sol @@ -4,9 +4,9 @@ import "../../../Oracle/PriceOracle.sol"; import "../../../Tokens/VTokens/VToken.sol"; import "../../../Utils/ErrorReporter.sol"; import "../../../Governance/IAccessControlManager.sol"; -import "./FacetHelper.sol"; +import "./FacetBase.sol"; -contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetHelper { +contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase { /// @notice Emitted when close factor is changed by admin event NewCloseFactor(uint oldCloseFactorMantissa, uint newCloseFactorMantissa); diff --git a/contracts/Tokens/VTokens/VToken.sol b/contracts/Tokens/VTokens/VToken.sol index fab8abf63..d103c02a4 100644 --- a/contracts/Tokens/VTokens/VToken.sol +++ b/contracts/Tokens/VTokens/VToken.sol @@ -962,17 +962,6 @@ contract VToken is VTokenInterface, Exponential, TokenErrorReporter { return uint(Error.NO_ERROR); } - /** - * @notice Sender borrows assets from the protocol to their own address - * @param borrowAmount The amount of the underlying asset to borrow - * @return uint Returns 0 on success, otherwise returns a failure code (see ErrorReporter.sol for details). - */ - function borrowInternal(uint borrowAmount) internal nonReentrant returns (uint) { - address borrower = msg.sender; - address payable receiver = msg.sender; - return borrowInternal(borrower, receiver, borrowAmount); - } - /** * @notice Receiver gets the borrow on behalf of the borrower address * @param borrower The borrower, on behalf of whom to borrow diff --git a/tests/hardhat/Comptroller/Diamond/XVSSpeeds.ts b/tests/hardhat/Comptroller/Diamond/XVSSpeeds.ts index 5b24a07e8..e42aa9e9b 100644 --- a/tests/hardhat/Comptroller/Diamond/XVSSpeeds.ts +++ b/tests/hardhat/Comptroller/Diamond/XVSSpeeds.ts @@ -1,26 +1,26 @@ -import { FakeContract, MockContract, smock } from "@defi-wonderland/smock"; +import { FakeContract, smock } from "@defi-wonderland/smock"; import chai from "chai"; import { ethers, network } from "hardhat"; import { convertToUnit } from "../../../../helpers/utils"; -import { Comptroller, IAccessControlManager, VToken } from "../../../../typechain"; +import { Comptroller, IAccessControlManager, Unitroller, VToken } from "../../../../typechain"; +import { deployDiamond } from "./scripts/deploy"; -const { deployDiamond } = require("../../../../script/diamond/deploy"); const { expect } = chai; chai.use(smock.matchers); describe("Comptroller", () => { - let comptroller: MockContract; - let comptrollerProxy: MockContract; + let unitroller: Unitroller; + let comptroller: Comptroller; let accessControl: FakeContract; let vToken1: FakeContract; let vToken2: FakeContract; beforeEach(async () => { const result = await deployDiamond(""); - comptroller = result.unitroller; + unitroller = result.unitroller; - comptrollerProxy = await ethers.getContractAt("Comptroller", comptroller.address); + comptroller = await ethers.getContractAt("Comptroller", unitroller.address); accessControl = await smock.fake( "contracts/Governance/IAccessControlManager.sol:IAccessControlManager", ); @@ -32,15 +32,15 @@ describe("Comptroller", () => { vToken2.isVToken.returns(true); vToken1.borrowIndex.returns(convertToUnit(0.7, 18)); - await comptrollerProxy._setAccessControl(accessControl.address); - await comptrollerProxy._supportMarket(vToken1.address); - await comptrollerProxy._supportMarket(vToken2.address); + await comptroller._setAccessControl(accessControl.address); + await comptroller._supportMarket(vToken1.address); + await comptroller._supportMarket(vToken2.address); }); describe("_initializeMarket", () => { it("Supply and borrow state after initializing the market in the pool", async () => { - const borrowRate = await comptrollerProxy.venusSupplyState(vToken1.address); - const supplyRate = await comptrollerProxy.venusBorrowState(vToken1.address); + const borrowRate = await comptroller.venusSupplyState(vToken1.address); + const supplyRate = await comptroller.venusBorrowState(vToken1.address); expect(supplyRate.index).equal(convertToUnit(1, 36)); expect(borrowRate.index).equal(convertToUnit(1, 36)); }); @@ -49,7 +49,7 @@ describe("Comptroller", () => { describe("_setVenusSpeeds", async () => { it("Revert on invalid supplySpeeds input", async () => { await expect( - comptrollerProxy._setVenusSpeeds( + comptroller._setVenusSpeeds( [vToken1.address, vToken2.address], [convertToUnit(1, 15)], [convertToUnit(1, 15), convertToUnit(1, 15)], @@ -59,7 +59,7 @@ describe("Comptroller", () => { it("Revert on invalid borrowSpeeds input", async () => { await expect( - comptrollerProxy._setVenusSpeeds( + comptroller._setVenusSpeeds( [vToken1.address, vToken2.address], [convertToUnit(1, 15), convertToUnit(1, 15)], [convertToUnit(1, 15)], @@ -70,25 +70,25 @@ describe("Comptroller", () => { it("Revert for unlisted market", async () => { const [unListedMarket] = await ethers.getSigners(); await expect( - comptrollerProxy._setVenusSpeeds([unListedMarket.address], [convertToUnit(1, 16)], [convertToUnit(1, 15)]), + comptroller._setVenusSpeeds([unListedMarket.address], [convertToUnit(1, 16)], [convertToUnit(1, 15)]), ).to.be.revertedWith("market not listed"); }); it("Revert on invalid borrowSpeeds input", async () => { - await comptrollerProxy._setVenusSpeeds( + await comptroller._setVenusSpeeds( [vToken1.address, vToken2.address], [convertToUnit(1, 16), convertToUnit(1, 18)], [convertToUnit(1, 20), convertToUnit(1, 22)], ); - const token1SupplySpeed = await comptrollerProxy.venusSupplySpeeds(vToken1.address); - const token1BorrowSpeed = await comptrollerProxy.venusBorrowSpeeds(vToken1.address); + const token1SupplySpeed = await comptroller.venusSupplySpeeds(vToken1.address); + const token1BorrowSpeed = await comptroller.venusBorrowSpeeds(vToken1.address); expect(token1SupplySpeed).equal(convertToUnit(1, 16)); expect(token1BorrowSpeed).equal(convertToUnit(1, 20)); - const token2SupplySpeed = await comptrollerProxy.venusSupplySpeeds(vToken2.address); - const token2BorrowSpeed = await comptrollerProxy.venusBorrowSpeeds(vToken2.address); + const token2SupplySpeed = await comptroller.venusSupplySpeeds(vToken2.address); + const token2BorrowSpeed = await comptroller.venusBorrowSpeeds(vToken2.address); expect(token2SupplySpeed).equal(convertToUnit(1, 18)); expect(token2BorrowSpeed).equal(convertToUnit(1, 22)); @@ -96,28 +96,28 @@ describe("Comptroller", () => { it("Updating non-zero speeds after setting it zero", async () => { // Setting the initial speeds - await comptrollerProxy._setVenusSpeeds([vToken1.address], [convertToUnit(1, 16)], [convertToUnit(1, 20)]); + await comptroller._setVenusSpeeds([vToken1.address], [convertToUnit(1, 16)], [convertToUnit(1, 20)]); // Mining 1000 blocks await network.provider.send("hardhat_mine", ["0x3e8", "0x3c"]); // Updating the speeds to zero - await comptrollerProxy._setVenusSpeeds([vToken1.address], [0], [0]); + await comptroller._setVenusSpeeds([vToken1.address], [0], [0]); // latest Block const blockNumber1 = await ethers.provider.getBlock("latest"); // Mining 1000 blocks await network.provider.send("hardhat_mine", ["0x3e8", "0x3c"]); // Getting the last block for the updated speeds - const supplySpeedBlock1 = await comptrollerProxy.venusSupplyState(vToken1.address); - const borrowSpeedBlock1 = await comptrollerProxy.venusBorrowState(vToken1.address); + const supplySpeedBlock1 = await comptroller.venusSupplyState(vToken1.address); + const borrowSpeedBlock1 = await comptroller.venusBorrowState(vToken1.address); // Updating the speeds to non-zero - await comptrollerProxy._setVenusSpeeds([vToken1.address], [convertToUnit(1, 16)], [convertToUnit(1, 20)]); + await comptroller._setVenusSpeeds([vToken1.address], [convertToUnit(1, 16)], [convertToUnit(1, 20)]); // Getting the last block for the updated speeds - const supplySpeedBlock2 = await comptrollerProxy.venusSupplyState(vToken1.address); - const borrowSpeedBlock2 = await comptrollerProxy.venusBorrowState(vToken1.address); + const supplySpeedBlock2 = await comptroller.venusSupplyState(vToken1.address); + const borrowSpeedBlock2 = await comptroller.venusBorrowState(vToken1.address); // latest Block const blockNumber2 = await ethers.provider.getBlock("latest"); diff --git a/tests/hardhat/Comptroller/Diamond/accessControl.ts b/tests/hardhat/Comptroller/Diamond/accessControl.ts index cf0e7488d..c22c71fe8 100644 --- a/tests/hardhat/Comptroller/Diamond/accessControl.ts +++ b/tests/hardhat/Comptroller/Diamond/accessControl.ts @@ -1,20 +1,20 @@ -import { FakeContract, MockContract, smock } from "@defi-wonderland/smock"; +import { FakeContract, smock } from "@defi-wonderland/smock"; import chai from "chai"; import { Signer, constants } from "ethers"; import { ethers } from "hardhat"; import { Comptroller, Comptroller__factory, IAccessControlManager } from "../../../typechain"; +import { deployDiamond } from "./scripts/deploy"; -const { deployDiamond } = require("../../../../script/diamond/deploy"); const { expect } = chai; chai.use(smock.matchers); describe("Comptroller", () => { let user: Signer; let userAddress: string; - let comptroller: MockContract; + let unitroller: Comptroller; let accessControl: FakeContract; - let comptrollerProxy: MockContract; + let comptroller: Comptroller; beforeEach(async () => { const signers = await ethers.getSigners(); @@ -24,35 +24,35 @@ describe("Comptroller", () => { "contracts/Governance/IAccessControlManager.sol:IAccessControlManager", ); const result = await deployDiamond(""); - comptroller = result.unitroller; - comptrollerProxy = await ethers.getContractAt("Comptroller", comptroller.address); + unitroller = result.unitroller; + comptroller = await ethers.getContractAt("Comptroller", unitroller.address); }); describe("_setAccessControlManager", () => { it("Reverts if called by non-admin", async () => { - expect(comptrollerProxy.connect(user)._setAccessControl(userAddress)).to.be.revertedWith("only admin can"); + expect(comptroller.connect(user)._setAccessControl(userAddress)).to.be.revertedWith("only admin can"); }); it("Reverts if ACM is zero address", async () => { - expect(comptrollerProxy._setAccessControl(constants.AddressZero)).to.be.revertedWith("can't be zero address"); + expect(comptroller._setAccessControl(constants.AddressZero)).to.be.revertedWith("can't be zero address"); }); it("Sets ACM address in storage", async () => { - expect(await comptrollerProxy._setAccessControl(accessControl.address)) - .to.emit(comptroller, "NewAccessControl") + expect(await comptroller._setAccessControl(accessControl.address)) + .to.emit(unitroller, "NewAccessControl") .withArgs(constants.AddressZero, accessControl.address); }); }); describe("Access Control", () => { beforeEach(async () => { - await comptrollerProxy._setAccessControl(accessControl.address); + await comptroller._setAccessControl(accessControl.address); }); describe("setCollateralFactor", () => { it("Should have AccessControl", async () => { await expect( - comptrollerProxy.connect(user)._setCollateralFactor(ethers.constants.AddressZero, 0), + comptroller.connect(user)._setCollateralFactor(ethers.constants.AddressZero, 0), ).to.be.revertedWith("access denied"); expect(accessControl.isAllowedToCall).to.be.calledOnceWith( userAddress, @@ -62,13 +62,13 @@ describe("Comptroller", () => { }); describe("setLiquidationIncentive", () => { it("Should have AccessControl", async () => { - await expect(comptrollerProxy.connect(user)._setLiquidationIncentive(0)).to.be.revertedWith("access denied"); + await expect(comptroller.connect(user)._setLiquidationIncentive(0)).to.be.revertedWith("access denied"); expect(accessControl.isAllowedToCall).to.be.calledOnceWith(userAddress, "_setLiquidationIncentive(uint256)"); }); }); describe("setMarketBorrowCaps", () => { it("Should have AccessControl", async () => { - await expect(comptrollerProxy.connect(user)._setMarketBorrowCaps([], [])).to.be.revertedWith("access denied"); + await expect(comptroller.connect(user)._setMarketBorrowCaps([], [])).to.be.revertedWith("access denied"); expect(accessControl.isAllowedToCall).to.be.calledOnceWith( userAddress, @@ -78,7 +78,7 @@ describe("Comptroller", () => { }); describe("setMarketSupplyCaps", () => { it("Should have AccessControl", async () => { - await expect(comptrollerProxy.connect(user)._setMarketSupplyCaps([], [])).to.be.revertedWith("access denied"); + await expect(comptroller.connect(user)._setMarketSupplyCaps([], [])).to.be.revertedWith("access denied"); expect(accessControl.isAllowedToCall).to.be.calledOnceWith( userAddress, "_setMarketSupplyCaps(address[],uint256[])", @@ -87,15 +87,13 @@ describe("Comptroller", () => { }); describe("setProtocolPaused", () => { it("Should have AccessControl", async () => { - await expect(comptrollerProxy.connect(user)._setProtocolPaused(true)).to.be.revertedWith("access denied"); + await expect(comptroller.connect(user)._setProtocolPaused(true)).to.be.revertedWith("access denied"); expect(accessControl.isAllowedToCall).to.be.calledOnceWith(userAddress, "_setProtocolPaused(bool)"); }); }); describe("setActionsPaused", () => { it("Should have AccessControl", async () => { - await expect(comptrollerProxy.connect(user)._setActionsPaused([], [], true)).to.be.revertedWith( - "access denied", - ); + await expect(comptroller.connect(user)._setActionsPaused([], [], true)).to.be.revertedWith("access denied"); expect(accessControl.isAllowedToCall).to.be.calledOnceWith( userAddress, "_setActionsPaused(address[],uint256[],bool)", @@ -104,7 +102,7 @@ describe("Comptroller", () => { }); describe("supportMarket", () => { it("Should have AccessControl", async () => { - await expect(comptrollerProxy.connect(user)._supportMarket(ethers.constants.AddressZero)).to.be.revertedWith( + await expect(comptroller.connect(user)._supportMarket(ethers.constants.AddressZero)).to.be.revertedWith( "access denied", ); expect(accessControl.isAllowedToCall).to.be.calledOnceWith(userAddress, "_supportMarket(address)"); diff --git a/tests/hardhat/Comptroller/Diamond/assetListTest.ts b/tests/hardhat/Comptroller/Diamond/assetListTest.ts index 055a3631f..75559d1e7 100644 --- a/tests/hardhat/Comptroller/Diamond/assetListTest.ts +++ b/tests/hardhat/Comptroller/Diamond/assetListTest.ts @@ -11,11 +11,11 @@ import { ComptrollerLens__factory, IAccessControlManager, PriceOracle, + Unitroller, VBep20Immutable, } from "../../../../typechain"; import { ComptrollerErrorReporter } from "../../util/Errors"; - -const { deployDiamond } = require("../../../../script/diamond/deploy"); +import { deployDiamond } from "./scripts/deploy"; const { expect } = chai; chai.use(smock.matchers); @@ -25,8 +25,8 @@ const { Error } = ComptrollerErrorReporter; describe("Comptroller: assetListTest", () => { let root: Signer; // eslint-disable-line @typescript-eslint/no-unused-vars let customer: Signer; - let comptroller: MockContract; - let comptrollerProxy: MockContract; + let unitroller: Unitroller; + let comptroller: Comptroller; let OMG: FakeContract; let ZRX: FakeContract; let BAT: FakeContract; @@ -34,7 +34,7 @@ describe("Comptroller: assetListTest", () => { let allTokens: FakeContract[]; type AssetListFixture = { - comptroller: MockContract; + unitroller: MockContract; comptrollerLens: MockContract; oracle: FakeContract; OMG: FakeContract; @@ -52,14 +52,14 @@ describe("Comptroller: assetListTest", () => { // const ComptrollerFactory = await smock.mock("Comptroller"); const ComptrollerLensFactory = await smock.mock("ComptrollerLens"); const result = await deployDiamond(""); - comptroller = result.unitroller; + unitroller = result.unitroller; const comptrollerLens = await ComptrollerLensFactory.deploy(); const oracle = await smock.fake("contracts/Oracle/PriceOracle.sol:PriceOracle"); accessControl.isAllowedToCall.returns(true); - comptrollerProxy = await ethers.getContractAt("Comptroller", comptroller.address); - await comptrollerProxy._setAccessControl(accessControl.address); - await comptrollerProxy._setComptrollerLens(comptrollerLens.address); - await comptrollerProxy._setPriceOracle(oracle.address); + comptroller = await ethers.getContractAt("Comptroller", unitroller.address); + await comptroller._setAccessControl(accessControl.address); + await comptroller._setComptrollerLens(comptrollerLens.address); + await comptroller._setPriceOracle(oracle.address); const names = ["OMG", "ZRX", "BAT", "sketch"]; const [OMG, ZRX, BAT, SKT] = await Promise.all( names.map(async name => { @@ -67,13 +67,13 @@ describe("Comptroller: assetListTest", () => { "contracts/Tokens/VTokens/VBep20Immutable.sol:VBep20Immutable", ); if (name !== "sketch") { - await comptrollerProxy._supportMarket(vToken.address); + await comptroller._supportMarket(vToken.address); } return vToken; }), ); const allTokens = [OMG, ZRX, BAT, SKT]; - return { comptroller, comptrollerLens, oracle, OMG, ZRX, BAT, SKT, allTokens, names }; + return { unitroller, comptrollerLens, oracle, OMG, ZRX, BAT, SKT, allTokens, names }; } function configure({ oracle, allTokens, names }: AssetListFixture) { @@ -90,14 +90,14 @@ describe("Comptroller: assetListTest", () => { [root, customer] = await ethers.getSigners(); const contracts = await loadFixture(assetListFixture); configure(contracts); - ({ comptroller, OMG, ZRX, BAT, SKT, allTokens } = contracts); + ({ unitroller, OMG, ZRX, BAT, SKT, allTokens } = contracts); }); async function checkMarkets(expectedTokens: FakeContract[]) { // eslint-disable-next-line prefer-const for (let token of allTokens) { const isExpected = expectedTokens.some(e => e == token); - expect(await comptrollerProxy.checkMembership(await customer.getAddress(), token.address)).to.equal(isExpected); + expect(await comptroller.checkMembership(await customer.getAddress(), token.address)).to.equal(isExpected); } } @@ -106,10 +106,10 @@ describe("Comptroller: assetListTest", () => { expectedTokens: FakeContract[], expectedErrors: ComptrollerErrorReporter.Error[] | null = null, ) { - const reply = await comptrollerProxy.connect(customer).callStatic.enterMarkets(enterTokens.map(t => t.address)); - const receipt = await comptrollerProxy.connect(customer).enterMarkets(enterTokens.map(t => t.address)); + const reply = await comptroller.connect(customer).callStatic.enterMarkets(enterTokens.map(t => t.address)); + const receipt = await comptroller.connect(customer).enterMarkets(enterTokens.map(t => t.address)); - const assetsIn = await comptrollerProxy.getAssetsIn(await customer.getAddress()); + const assetsIn = await comptroller.getAssetsIn(await customer.getAddress()); const expectedErrors_ = expectedErrors || enterTokens.map(_ => Error.NO_ERROR); @@ -117,7 +117,7 @@ describe("Comptroller: assetListTest", () => { expect(tokenReply).to.equal(expectedErrors_[i]); }); - expect(receipt).to.emit(comptroller, "MarketEntered"); + expect(receipt).to.emit(unitroller, "MarketEntered"); expect(assetsIn).to.deep.equal(expectedTokens.map(t => t.address)); await checkMarkets(expectedTokens); @@ -126,7 +126,7 @@ describe("Comptroller: assetListTest", () => { } async function enterAndExpectRejection(enterTokens: FakeContract[], expectedReason: string = "") { - await expect(comptrollerProxy.connect(customer).enterMarkets(enterTokens.map(t => t.address))).to.be.revertedWith( + await expect(comptroller.connect(customer).enterMarkets(enterTokens.map(t => t.address))).to.be.revertedWith( expectedReason, ); } @@ -136,9 +136,9 @@ describe("Comptroller: assetListTest", () => { expectedTokens: FakeContract[], expectedError: ComptrollerErrorReporter.Error = Error.NO_ERROR, ) { - const reply = await comptrollerProxy.connect(customer).callStatic.exitMarket(exitToken.address); - const receipt = await comptrollerProxy.connect(customer).exitMarket(exitToken.address); - const assetsIn = await comptrollerProxy.getAssetsIn(await customer.getAddress()); + const reply = await comptroller.connect(customer).callStatic.exitMarket(exitToken.address); + const receipt = await comptroller.connect(customer).exitMarket(exitToken.address); + const assetsIn = await comptroller.getAssetsIn(await customer.getAddress()); expect(reply).to.equal(expectedError); expect(assetsIn).to.deep.equal(expectedTokens.map(t => t.address)); @@ -151,7 +151,7 @@ describe("Comptroller: assetListTest", () => { it("properly emits events", async () => { const tx1 = await enterAndCheckMarkets([OMG], [OMG]); const tx2 = await enterAndCheckMarkets([OMG], [OMG]); - expect(tx1).to.emit(comptroller, "MarketEntered").withArgs(OMG.address, customer); + expect(tx1).to.emit(unitroller, "MarketEntered").withArgs(OMG.address, customer); const tx2Value = await tx2.wait(); expect(tx2Value.events?.length).to.be.equals(1); }); @@ -169,7 +169,7 @@ describe("Comptroller: assetListTest", () => { it("the market must be listed for add to succeed", async () => { await enterAndExpectRejection([SKT], "market not listed"); - await comptrollerProxy._supportMarket(SKT.address); + await comptroller._supportMarket(SKT.address); await enterAndCheckMarkets([SKT], [SKT]); }); @@ -242,9 +242,9 @@ describe("Comptroller: assetListTest", () => { it("enters when called by a vtoken", async () => { await setBalance(await BAT.wallet.getAddress(), 10n ** 18n); - await comptrollerProxy.connect(BAT.wallet).borrowAllowed(BAT.address, await customer.getAddress(), 1); + await comptroller.connect(BAT.wallet).borrowAllowed(BAT.address, await customer.getAddress(), 1); - const assetsIn = await comptrollerProxy.getAssetsIn(await customer.getAddress()); + const assetsIn = await comptroller.getAssetsIn(await customer.getAddress()); expect(assetsIn).to.deep.equal([BAT.address]); @@ -253,10 +253,10 @@ describe("Comptroller: assetListTest", () => { it("reverts when called by not a vtoken", async () => { await expect( - comptrollerProxy.connect(customer).borrowAllowed(BAT.address, await customer.getAddress(), 1), + comptroller.connect(customer).borrowAllowed(BAT.address, await customer.getAddress(), 1), ).to.be.revertedWith("sender must be vToken"); - const assetsIn = await comptrollerProxy.getAssetsIn(await customer.getAddress()); + const assetsIn = await comptroller.getAssetsIn(await customer.getAddress()); expect(assetsIn).to.deep.equal([]); @@ -265,12 +265,12 @@ describe("Comptroller: assetListTest", () => { it("adds to the asset list only once", async () => { await setBalance(await BAT.wallet.getAddress(), 10n ** 18n); - await comptrollerProxy.connect(BAT.wallet).borrowAllowed(BAT.address, await customer.getAddress(), 1); + await comptroller.connect(BAT.wallet).borrowAllowed(BAT.address, await customer.getAddress(), 1); await enterAndCheckMarkets([BAT], [BAT]); - await comptrollerProxy.connect(BAT.wallet).borrowAllowed(BAT.address, await customer.getAddress(), 1); - const assetsIn = await comptrollerProxy.getAssetsIn(await customer.getAddress()); + await comptroller.connect(BAT.wallet).borrowAllowed(BAT.address, await customer.getAddress(), 1); + const assetsIn = await comptroller.getAssetsIn(await customer.getAddress()); expect(assetsIn).to.deep.equal([BAT.address]); }); }); diff --git a/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts b/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts index a7155cce0..62e562b98 100644 --- a/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts +++ b/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts @@ -9,15 +9,14 @@ import { Comptroller, ComptrollerLens, ComptrollerLens__factory, - Comptroller__factory, EIP20Interface, IAccessControlManager, PriceOracle, + Unitroller, VToken, } from "../../../../typechain"; import { ComptrollerErrorReporter } from "../../util/Errors"; - -const { deployDiamond } = require("../../../../script/diamond/deploy"); +import { deployDiamond } from "./scripts/deploy"; const { expect } = chai; chai.use(smock.matchers); @@ -26,8 +25,8 @@ type SimpleComptrollerFixture = { oracle: FakeContract; accessControl: FakeContract; comptrollerLens: MockContract; - comptroller: MockContract; - comptrollerProxy: MockContract; + unitroller: Unitroller; + comptroller: Comptroller; }; async function deploySimpleComptroller(): Promise { @@ -39,24 +38,24 @@ async function deploySimpleComptroller(): Promise { const ComptrollerLensFactory = await smock.mock("ComptrollerLens"); // const ComptrollerFactory = await smock.mock("Comptroller"); const result = await deployDiamond(""); - const comptroller = result.unitroller; - const comptrollerProxy = await ethers.getContractAt("Comptroller", comptroller.address); + const unitroller = result.unitroller; + const comptroller = await ethers.getContractAt("Comptroller", unitroller.address); const comptrollerLens = await ComptrollerLensFactory.deploy(); - await comptrollerProxy._setAccessControl(accessControl.address); - await comptrollerProxy._setComptrollerLens(comptrollerLens.address); - await comptrollerProxy._setPriceOracle(oracle.address); - await comptrollerProxy._setLiquidationIncentive(convertToUnit("1", 18)); - return { oracle, comptrollerProxy, comptroller, comptrollerLens, accessControl }; + await comptroller._setAccessControl(accessControl.address); + await comptroller._setComptrollerLens(comptrollerLens.address); + await comptroller._setPriceOracle(oracle.address); + await comptroller._setLiquidationIncentive(convertToUnit("1", 18)); + return { oracle, comptroller, unitroller, comptrollerLens, accessControl }; } function configureOracle(oracle: FakeContract) { oracle.getUnderlyingPrice.returns(convertToUnit(1, 18)); } -async function configureVToken(vToken: FakeContract, comptroller: MockContract) { +async function configureVToken(vToken: FakeContract, unitroller: MockContract) { const result = await deployDiamond(""); - comptroller = result.unitroller; - vToken.comptroller.returns(comptroller.address); + unitroller = result.unitroller; + vToken.comptroller.returns(unitroller.address); vToken.isVToken.returns(true); vToken.exchangeRateStored.returns(convertToUnit("2", 18)); vToken.totalSupply.returns(convertToUnit("1000000", 18)); @@ -73,55 +72,55 @@ describe("Comptroller", () => { describe("constructor", () => { it("on success it sets admin to creator and pendingAdmin is unset", async () => { - const { comptrollerProxy } = await loadFixture(deploySimpleComptroller); - expect(await comptrollerProxy.admin()).to.equal(await root.getAddress()); - expect(await comptrollerProxy.pendingAdmin()).to.equal(constants.AddressZero); + const { comptroller } = await loadFixture(deploySimpleComptroller); + expect(await comptroller.admin()).to.equal(await root.getAddress()); + expect(await comptroller.pendingAdmin()).to.equal(constants.AddressZero); }); }); describe("_setLiquidationIncentive", () => { - let comptroller: MockContract; - let comptrollerProxy: MockContract; + let unitroller: Unitroller; + let comptroller: Comptroller; const initialIncentive = convertToUnit("1", 18); const validIncentive = convertToUnit("1.1", 18); const tooSmallIncentive = convertToUnit("0.99999", 18); beforeEach(async () => { - ({ comptroller } = await loadFixture(deploySimpleComptroller)); - comptrollerProxy = await ethers.getContractAt("Comptroller", comptroller.address); + ({ unitroller } = await loadFixture(deploySimpleComptroller)); + comptroller = await ethers.getContractAt("Comptroller", unitroller.address); }); it("fails if incentive is less than 1e18", async () => { - await expect(comptrollerProxy._setLiquidationIncentive(tooSmallIncentive)).to.be.revertedWith( + await expect(comptroller._setLiquidationIncentive(tooSmallIncentive)).to.be.revertedWith( "incentive must be over 1e18", ); }); it("accepts a valid incentive and emits a NewLiquidationIncentive event", async () => { - expect(await comptrollerProxy.callStatic._setLiquidationIncentive(validIncentive)).to.equal( + expect(await comptroller.callStatic._setLiquidationIncentive(validIncentive)).to.equal( ComptrollerErrorReporter.Error.NO_ERROR, ); - expect(await comptrollerProxy._setLiquidationIncentive(validIncentive)) - .to.emit(comptroller, "NewLiquidationIncentive") + expect(await comptroller._setLiquidationIncentive(validIncentive)) + .to.emit(unitroller, "NewLiquidationIncentive") .withArgs(initialIncentive, validIncentive); - expect(await comptrollerProxy.liquidationIncentiveMantissa()).to.equal(validIncentive); + expect(await comptroller.liquidationIncentiveMantissa()).to.equal(validIncentive); }); }); describe("Non zero address check", () => { - let comptroller: MockContract; - let comptrollerProxy: MockContract; + let unitroller: Unitroller; + let comptroller: Comptroller; beforeEach(async () => { - ({ comptroller } = await loadFixture(deploySimpleComptroller)); - comptrollerProxy = await ethers.getContractAt("Comptroller", comptroller.address); + ({ unitroller } = await loadFixture(deploySimpleComptroller)); + comptroller = await ethers.getContractAt("Comptroller", unitroller.address); }); type FuncNames = keyof Comptroller["functions"]; function testZeroAddress(funcName: Func, args: Parameters) { it(funcName, async () => { - await expect(comptrollerProxy[funcName](...args)).to.be.revertedWith("can't be zero address"); + await expect(comptroller[funcName](...args)).to.be.revertedWith("can't be zero address"); }); } testZeroAddress("_setPriceOracle", [constants.AddressZero]); @@ -135,8 +134,8 @@ describe("Comptroller", () => { }); describe("_setPriceOracle", () => { - let comptroller: MockContract; - let comptrollerProxy: MockContract; + let unitroller: Unitroller; + let comptroller: Comptroller; let oracle: FakeContract; let newOracle: FakeContract; @@ -147,85 +146,85 @@ describe("Comptroller", () => { async function deploy(): Promise { const contracts = await deploySimpleComptroller(); const newOracle = await smock.fake("contracts/Oracle/PriceOracle.sol:PriceOracle"); - // comptrollerProxy = await ethers.getContractAt("Comptroller", contracts.comptroller); + // comptroller = await ethers.getContractAt("Comptroller", contracts.unitroller); return { ...contracts, newOracle }; } beforeEach(async () => { - ({ comptrollerProxy, oracle, newOracle } = await loadFixture(deploy)); + ({ comptroller, oracle, newOracle } = await loadFixture(deploy)); }); it("fails if called by non-admin", async () => { - await expect(comptrollerProxy.connect(accounts[0])._setPriceOracle(oracle.address)).to.be.revertedWith( + await expect(comptroller.connect(accounts[0])._setPriceOracle(oracle.address)).to.be.revertedWith( "only admin can", ); - expect(await comptrollerProxy.oracle()).to.equal(oracle.address); + expect(await comptroller.oracle()).to.equal(oracle.address); }); it("accepts a valid price oracle and emits a NewPriceOracle event", async () => { - expect(await comptrollerProxy._setPriceOracle(newOracle.address)) - .to.emit(comptroller, "NewPriceOracle") + expect(await comptroller._setPriceOracle(newOracle.address)) + .to.emit(unitroller, "NewPriceOracle") .withArgs(oracle.address, newOracle.address); - expect(await comptrollerProxy.oracle()).to.equal(newOracle.address); + expect(await comptroller.oracle()).to.equal(newOracle.address); }); }); describe("_setComptrollerLens", () => { - let comptroller: MockContract; - let comptrollerProxy: MockContract; + let unitroller: Unitroller; + let comptroller: Comptroller; let comptrollerLens: MockContract; type Contracts = { - comptroller: MockContract; - comptrollerProxy: MockContract; + unitroller: Unitroller; + comptroller: Comptroller; comptrollerLens: MockContract; }; async function deploy(): Promise { // const ComptrollerFactory = await smock.mock("Comptroller"); const result = await deployDiamond(""); - comptroller = result.unitroller; - const comptrollerProxy = await ethers.getContractAt("Comptroller", comptroller.address); + unitroller = result.unitroller; + const comptroller = await ethers.getContractAt("Comptroller", unitroller.address); const ComptrollerLensFactory = await smock.mock("ComptrollerLens"); const comptrollerLens = await ComptrollerLensFactory.deploy(); - return { comptrollerProxy, comptrollerLens }; + return { unitroller, comptroller, comptrollerLens }; } beforeEach(async () => { - ({ comptrollerProxy, comptrollerLens } = await loadFixture(deploy)); + ({ comptroller, comptrollerLens } = await loadFixture(deploy)); }); it("fails if not called by admin", async () => { - await expect( - comptrollerProxy.connect(accounts[0])._setComptrollerLens(comptrollerLens.address), - ).to.be.revertedWith("only admin can"); + await expect(comptroller.connect(accounts[0])._setComptrollerLens(comptrollerLens.address)).to.be.revertedWith( + "only admin can", + ); }); it("should fire an event", async () => { - const { comptrollerProxy, comptrollerLens } = await loadFixture(deploy); - const oldComptrollerLensAddress = await comptrollerProxy.comptrollerLens(); - expect(await comptrollerProxy._setComptrollerLens(comptrollerLens.address)) - .to.emit(comptroller, "NewComptrollerLens") + const { comptroller, comptrollerLens } = await loadFixture(deploy); + const oldComptrollerLensAddress = await comptroller.comptrollerLens(); + expect(await comptroller._setComptrollerLens(comptrollerLens.address)) + .to.emit(unitroller, "NewComptrollerLens") .withArgs(oldComptrollerLensAddress, comptrollerLens.address); }); }); describe("_setCloseFactor", () => { - let comptrollerProxy: MockContract; + let comptroller: Comptroller; beforeEach(async () => { - ({ comptrollerProxy } = await loadFixture(deploySimpleComptroller)); + ({ comptroller } = await loadFixture(deploySimpleComptroller)); }); it("fails if not called by admin", async () => { - await expect(comptrollerProxy.connect(accounts[0])._setCloseFactor(1)).to.be.revertedWith("only admin can"); + await expect(comptroller.connect(accounts[0])._setCloseFactor(1)).to.be.revertedWith("only admin can"); }); }); describe("_setCollateralFactor", () => { const half = convertToUnit("0.5", 18); - let comptroller: MockContract; - let comptrollerProxy: MockContract; + let unitroller: Unitroller; + let comptroller: Comptroller; let vToken: FakeContract; let oracle: FakeContract; @@ -240,19 +239,19 @@ describe("Comptroller", () => { } beforeEach(async () => { - ({ comptrollerProxy, oracle, vToken } = await loadFixture(deploy)); + ({ comptroller, oracle, vToken } = await loadFixture(deploy)); configureOracle(oracle); }); it("fails if asset is not listed", async () => { - await expect(comptrollerProxy._setCollateralFactor(vToken.address, half)).to.be.revertedWith("market not listed"); + await expect(comptroller._setCollateralFactor(vToken.address, half)).to.be.revertedWith("market not listed"); }); it("fails if factor is set without an underlying price", async () => { - await comptrollerProxy._supportMarket(vToken.address); + await comptroller._supportMarket(vToken.address); oracle.getUnderlyingPrice.returns(0); - expect(await comptrollerProxy._setCollateralFactor(vToken.address, half)) - .to.emit(comptroller, "Failure") + expect(await comptroller._setCollateralFactor(vToken.address, half)) + .to.emit(unitroller, "Failure") .withArgs( ComptrollerErrorReporter.Error.PRICE_ERROR, ComptrollerErrorReporter.FailureInfo.SET_COLLATERAL_FACTOR_WITHOUT_PRICE, @@ -260,16 +259,16 @@ describe("Comptroller", () => { }); it("succeeds and sets market", async () => { - await comptrollerProxy._supportMarket(vToken.address); - expect(await comptrollerProxy._setCollateralFactor(vToken.address, half)) - .to.emit(comptroller, "NewCollateralFactor") + await comptroller._supportMarket(vToken.address); + expect(await comptroller._setCollateralFactor(vToken.address, half)) + .to.emit(unitroller, "NewCollateralFactor") .withArgs(vToken.address, "0", half); }); }); describe("_supportMarket", () => { - let comptroller: MockContract; - let comptrollerProxy: MockContract; + let unitroller: Unitroller; + let comptroller: Comptroller; let oracle: FakeContract; let vToken1: FakeContract; let vToken2: FakeContract; @@ -290,28 +289,28 @@ describe("Comptroller", () => { } beforeEach(async () => { - ({ comptrollerProxy, oracle, vToken1, vToken2, token } = await loadFixture(deploy)); + ({ comptroller, oracle, vToken1, vToken2, token } = await loadFixture(deploy)); configureOracle(oracle); - configureVToken(vToken1, comptroller); - configureVToken(vToken2, comptroller); + configureVToken(vToken1, unitroller); + configureVToken(vToken2, unitroller); }); // it("fails if asset is not a VToken", async () => { - // await expect(comptrollerProxy._supportMarket(token.address)).to.be.reverted; + // await expect(comptroller._supportMarket(token.address)).to.be.reverted; // }); it("succeeds and sets market", async () => { - expect(await comptrollerProxy._supportMarket(vToken1.address)) - .to.emit(comptroller, "MarketListed") + expect(await comptroller._supportMarket(vToken1.address)) + .to.emit(unitroller, "MarketListed") .withArgs(vToken1.address); }); it("cannot list a market a second time", async () => { - const tx1 = await comptrollerProxy._supportMarket(vToken1.address); - const tx2 = await comptrollerProxy._supportMarket(vToken1.address); - expect(tx1).to.emit(comptrollerProxy, "MarketListed").withArgs(vToken1.address); + const tx1 = await comptroller._supportMarket(vToken1.address); + const tx2 = await comptroller._supportMarket(vToken1.address); + expect(tx1).to.emit(comptroller, "MarketListed").withArgs(vToken1.address); expect(tx2) - .to.emit(comptroller, "Failure") + .to.emit(unitroller, "Failure") .withArgs( ComptrollerErrorReporter.Error.MARKET_ALREADY_LISTED, ComptrollerErrorReporter.FailureInfo.SUPPORT_MARKET_EXISTS, @@ -319,16 +318,16 @@ describe("Comptroller", () => { }); it("can list two different markets", async () => { - const tx1 = await comptrollerProxy._supportMarket(vToken1.address); - const tx2 = await comptrollerProxy._supportMarket(vToken2.address); - expect(tx1).to.emit(comptrollerProxy, "MarketListed").withArgs(vToken1.address); - expect(tx2).to.emit(comptroller, "MarketListed").withArgs(vToken2.address); + const tx1 = await comptroller._supportMarket(vToken1.address); + const tx2 = await comptroller._supportMarket(vToken2.address); + expect(tx1).to.emit(comptroller, "MarketListed").withArgs(vToken1.address); + expect(tx2).to.emit(unitroller, "MarketListed").withArgs(vToken2.address); }); }); describe("Hooks", () => { - let comptroller: MockContract; - let comptrollerProxy: MockContract; + let unitroller: Unitroller; + let comptroller: Comptroller; let vToken: FakeContract; type Contracts = SimpleComptrollerFixture & { vToken: FakeContract }; @@ -336,19 +335,19 @@ describe("Comptroller", () => { async function deploy(): Promise { const contracts = await deploySimpleComptroller(); const vToken = await smock.fake("contracts/Tokens/VTokens/VToken.sol:VToken"); - await contracts.comptrollerProxy._supportMarket(vToken.address); + await contracts.comptroller._supportMarket(vToken.address); return { ...contracts, vToken }; } beforeEach(async () => { - ({ comptrollerProxy, vToken } = await loadFixture(deploy)); - configureVToken(vToken, comptroller); + ({ comptroller, vToken } = await loadFixture(deploy)); + configureVToken(vToken, unitroller); }); describe("mintAllowed", () => { beforeEach(async () => { - ({ comptrollerProxy, vToken } = await loadFixture(deploy)); - configureVToken(vToken, comptroller); + ({ comptroller, vToken } = await loadFixture(deploy)); + configureVToken(vToken, unitroller); }); it("allows minting if cap is not reached", async () => { @@ -359,9 +358,9 @@ describe("Comptroller", () => { vToken.totalSupply.returns(currentVTokenSupply); vToken.exchangeRateStored.returns(exchangeRate); - await comptrollerProxy._setMarketSupplyCaps([vToken.address], [cap]); + await comptroller._setMarketSupplyCaps([vToken.address], [cap]); expect( - await comptrollerProxy.callStatic.mintAllowed( + await comptroller.callStatic.mintAllowed( vToken.address, await root.getAddress(), convertToUnit("0.9999", 18), @@ -377,33 +376,33 @@ describe("Comptroller", () => { vToken.totalSupply.returns(currentVTokenSupply); vToken.exchangeRateStored.returns(exchangeRate); - await comptrollerProxy._setMarketSupplyCaps([vToken.address], [cap]); + await comptroller._setMarketSupplyCaps([vToken.address], [cap]); await expect( - comptrollerProxy.mintAllowed(vToken.address, await root.getAddress(), convertToUnit("1.01", 18)), + comptroller.mintAllowed(vToken.address, await root.getAddress(), convertToUnit("1.01", 18)), ).to.be.revertedWith("market supply cap reached"); }); it("reverts if market is not listed", async () => { const someVToken = await smock.fake("contracts/Tokens/VTokens/VToken.sol:VToken"); await expect( - comptrollerProxy.mintAllowed(someVToken.address, await root.getAddress(), convertToUnit("1", 18)), + comptroller.mintAllowed(someVToken.address, await root.getAddress(), convertToUnit("1", 18)), ).to.be.revertedWith("market not listed"); }); }); describe("redeemVerify", () => { it("should allow you to redeem 0 underlying for 0 tokens", async () => { - await comptrollerProxy.redeemVerify(vToken.address, await accounts[0].getAddress(), 0, 0); + await comptroller.redeemVerify(vToken.address, await accounts[0].getAddress(), 0, 0); }); it("should allow you to redeem 5 underlyig for 5 tokens", async () => { - await comptrollerProxy.redeemVerify(vToken.address, await accounts[0].getAddress(), 5, 5); + await comptroller.redeemVerify(vToken.address, await accounts[0].getAddress(), 5, 5); }); it("should not allow you to redeem 5 underlying for 0 tokens", async () => { - await expect( - comptrollerProxy.redeemVerify(vToken.address, await accounts[0].getAddress(), 5, 0), - ).to.be.revertedWith("redeemTokens zero"); + await expect(comptroller.redeemVerify(vToken.address, await accounts[0].getAddress(), 5, 0)).to.be.revertedWith( + "redeemTokens zero", + ); }); }); }); diff --git a/tests/hardhat/Comptroller/Diamond/liquidateCalculateAmoutSeizeTest.ts b/tests/hardhat/Comptroller/Diamond/liquidateCalculateAmoutSeizeTest.ts index bed155af4..a6bb85de6 100644 --- a/tests/hardhat/Comptroller/Diamond/liquidateCalculateAmoutSeizeTest.ts +++ b/tests/hardhat/Comptroller/Diamond/liquidateCalculateAmoutSeizeTest.ts @@ -9,14 +9,12 @@ import { Comptroller, ComptrollerLens, ComptrollerLens__factory, - Comptroller__factory, IAccessControlManager, PriceOracle, VBep20Immutable, } from "../../../../typechain"; import { ComptrollerErrorReporter } from "../../util/Errors"; - -const { deployDiamond } = require("../../../../script/diamond/deploy"); +import { deployDiamond } from "./scripts/deploy"; const { expect } = chai; chai.use(smock.matchers); @@ -26,12 +24,12 @@ const collateralPrice = convertToUnit(1, 18); const repayAmount = convertToUnit(1, 18); async function calculateSeizeTokens( - comptrollerProxy: MockContract, + comptroller: Comptroller, vTokenBorrowed: FakeContract, vTokenCollateral: FakeContract, repayAmount: BigNumberish, ) { - return comptrollerProxy.liquidateCalculateSeizeTokens(vTokenBorrowed.address, vTokenCollateral.address, repayAmount); + return comptroller.liquidateCalculateSeizeTokens(vTokenBorrowed.address, vTokenCollateral.address, repayAmount); } function rando(min: number, max: number): number { @@ -39,14 +37,13 @@ function rando(min: number, max: number): number { } describe("Comptroller", () => { - let comptroller: MockContract; //eslint-disable-line - let comptrollerProxy: MockContract; + let comptroller: Comptroller; let oracle: FakeContract; let vTokenBorrowed: FakeContract; let vTokenCollateral: FakeContract; type LiquidateFixture = { - comptrollerProxy: MockContract; + comptroller: Comptroller; comptrollerLens: MockContract; oracle: FakeContract; vTokenBorrowed: FakeContract; @@ -62,15 +59,15 @@ describe("Comptroller", () => { // const ComptrollerFactory = await smock.mock("Comptroller"); const ComptrollerLensFactory = await smock.mock("ComptrollerLens"); const result = await deployDiamond(""); - const comptroller = result.unitroller; - comptrollerProxy = await ethers.getContractAt("Comptroller", comptroller.address); + const unitroller = result.unitroller; + comptroller = await ethers.getContractAt("Comptroller", unitroller.address); const comptrollerLens = await ComptrollerLensFactory.deploy(); const oracle = await smock.fake("contracts/Oracle/PriceOracle.sol:PriceOracle"); accessControl.isAllowedToCall.returns(true); - await comptrollerProxy._setAccessControl(accessControl.address); - await comptrollerProxy._setComptrollerLens(comptrollerLens.address); - await comptrollerProxy._setPriceOracle(oracle.address); - await comptrollerProxy._setLiquidationIncentive(convertToUnit("1.1", 18)); + await comptroller._setAccessControl(accessControl.address); + await comptroller._setComptrollerLens(comptrollerLens.address); + await comptroller._setPriceOracle(oracle.address); + await comptroller._setLiquidationIncentive(convertToUnit("1.1", 18)); const vTokenBorrowed = await smock.fake( "contracts/Tokens/VTokens/VBep20Immutable.sol:VBep20Immutable", @@ -79,13 +76,13 @@ describe("Comptroller", () => { "contracts/Tokens/VTokens/VBep20Immutable.sol:VBep20Immutable", ); - return { comptrollerProxy, comptrollerLens, oracle, vTokenBorrowed, vTokenCollateral }; + return { comptroller, comptrollerLens, oracle, vTokenBorrowed, vTokenCollateral }; } - async function configure({ comptrollerProxy, vTokenCollateral, oracle, vTokenBorrowed }: LiquidateFixture) { + async function configure({ comptroller, vTokenCollateral, oracle, vTokenBorrowed }: LiquidateFixture) { oracle.getUnderlyingPrice.returns(0); for (const vToken of [vTokenBorrowed, vTokenCollateral]) { - vToken.comptroller.returns(comptrollerProxy.address); + vToken.comptroller.returns(comptroller.address); vToken.isVToken.returns(true); } @@ -97,33 +94,32 @@ describe("Comptroller", () => { beforeEach(async () => { const contracts = await loadFixture(liquidateFixture); await configure(contracts); - ({ comptrollerProxy, vTokenBorrowed, oracle, vTokenCollateral } = contracts); + ({ comptroller, vTokenBorrowed, oracle, vTokenCollateral } = contracts); }); describe("liquidateCalculateAmountSeize", () => { it("fails if borrowed asset price is 0", async () => { setOraclePrice(vTokenBorrowed, 0); - const [err, result] = await calculateSeizeTokens(comptrollerProxy, vTokenBorrowed, vTokenCollateral, repayAmount); + const [err, result] = await calculateSeizeTokens(comptroller, vTokenBorrowed, vTokenCollateral, repayAmount); expect(err).to.equal(ComptrollerErrorReporter.Error.PRICE_ERROR); expect(result).to.equal(0); }); it("fails if collateral asset price is 0", async () => { setOraclePrice(vTokenCollateral, 0); - const [err, result] = await calculateSeizeTokens(comptrollerProxy, vTokenBorrowed, vTokenCollateral, repayAmount); + const [err, result] = await calculateSeizeTokens(comptroller, vTokenBorrowed, vTokenCollateral, repayAmount); expect(err).to.equal(ComptrollerErrorReporter.Error.PRICE_ERROR); expect(result).to.equal(0); }); it("fails if the repayAmount causes overflow ", async () => { - await expect(calculateSeizeTokens(comptrollerProxy, vTokenBorrowed, vTokenCollateral, constants.MaxUint256)).to.be + await expect(calculateSeizeTokens(comptroller, vTokenBorrowed, vTokenCollateral, constants.MaxUint256)).to.be .reverted; }); it("fails if the borrowed asset price causes overflow ", async () => { setOraclePrice(vTokenBorrowed, constants.MaxUint256); - await expect(calculateSeizeTokens(comptrollerProxy, vTokenBorrowed, vTokenCollateral, repayAmount)).to.be - .reverted; + await expect(calculateSeizeTokens(comptroller, vTokenBorrowed, vTokenCollateral, repayAmount)).to.be.reverted; }); it("reverts if it fails to calculate the exchange rate", async () => { @@ -131,7 +127,7 @@ describe("Comptroller", () => { ethers.provider.getBlockNumber(); /// TODO: Somehow the error message does not get propagated into the resulting tx. Smock bug? await expect( - comptrollerProxy.liquidateCalculateSeizeTokens(vTokenBorrowed.address, vTokenCollateral.address, repayAmount), + comptroller.liquidateCalculateSeizeTokens(vTokenBorrowed.address, vTokenCollateral.address, repayAmount), ).to.be.reverted; // revertedWith("exchangeRateStored: exchangeRateStoredInternal failed"); }); @@ -150,18 +146,13 @@ describe("Comptroller", () => { setOraclePrice(vTokenCollateral, collateralPrice); setOraclePrice(vTokenBorrowed, borrowedPrice); - await comptrollerProxy._setLiquidationIncentive(liquidationIncentive); + await comptroller._setLiquidationIncentive(liquidationIncentive); vTokenCollateral.exchangeRateStored.returns(exchangeRate); const seizeAmount = (repayAmount * liquidationIncentive * borrowedPrice) / collateralPrice; const seizeTokens = seizeAmount / exchangeRate; - const [err, result] = await calculateSeizeTokens( - comptrollerProxy, - vTokenBorrowed, - vTokenCollateral, - repayAmount, - ); + const [err, result] = await calculateSeizeTokens(comptroller, vTokenBorrowed, vTokenCollateral, repayAmount); expect(err).to.equal(ComptrollerErrorReporter.Error.NO_ERROR); expect(Number(result)).to.be.approximately(Number(seizeTokens), 1e7); }); diff --git a/tests/hardhat/Comptroller/Diamond/pauseTest.ts b/tests/hardhat/Comptroller/Diamond/pauseTest.ts index 449395f51..8a04670a5 100644 --- a/tests/hardhat/Comptroller/Diamond/pauseTest.ts +++ b/tests/hardhat/Comptroller/Diamond/pauseTest.ts @@ -4,15 +4,14 @@ import chai from "chai"; import { ethers } from "hardhat"; import { Comptroller, IAccessControlManager, PriceOracle, VBep20Immutable } from "../../../../typechain"; - -const { deployDiamond } = require("../../../../script/diamond/deploy"); +import { deployDiamond } from "./scripts/deploy"; const { expect } = chai; chai.use(smock.matchers); type PauseFixture = { accessControl: FakeContract; - comptroller: MockContract; + comptroller: Comptroller; oracle: FakeContract; OMG: FakeContract; ZRX: FakeContract; @@ -25,8 +24,8 @@ type PauseFixture = { async function pauseFixture(): Promise { const accessControl = await smock.fake("IAccessControlManager"); const result = await deployDiamond(""); - const comptrollerDeployment = result.unitroller; - const comptroller = await ethers.getContractAt("Comptroller", comptrollerDeployment.address); + const unitroller = result.unitroller; + const comptroller = await ethers.getContractAt("Comptroller", unitroller.address); await comptroller._setAccessControl(accessControl.address); const oracle = await smock.fake("contracts/Oracle/PriceOracle.sol:PriceOracle"); diff --git a/script/diamond/deploy.js b/tests/hardhat/Comptroller/Diamond/scripts/deploy.ts similarity index 86% rename from script/diamond/deploy.js rename to tests/hardhat/Comptroller/Diamond/scripts/deploy.ts index 417db465a..8ecbffa74 100644 --- a/script/diamond/deploy.js +++ b/tests/hardhat/Comptroller/Diamond/scripts/deploy.ts @@ -1,10 +1,11 @@ -const hre = require("hardhat"); -const { impersonateAccount } = require("@nomicfoundation/hardhat-network-helpers"); +import { impersonateAccount } from "@nomicfoundation/hardhat-network-helpers"; +import hre from "hardhat"; + +import { Unitroller__factory } from "../../../../../typechain"; +import { FacetCutAction, getSelectors } from "./diamond"; require("dotenv").config(); -const { Unitroller__factory } = require("../../typechain"); -const { getSelectors, FacetCutAction } = require("./diamond.js"); const ethers = hre.ethers; const Owner = "0x939bd8d64c0a9583a7dcea9933f7b21697ab6396"; @@ -17,7 +18,7 @@ async function deployFacets() { // deploy facets const FacetNames = ["MarketFacet", "PolicyFacet", "RewardFacet", "SetterFacet"]; - const cut = []; + const cut: any = []; for (const FacetName of FacetNames) { const Facet = await ethers.getContractFactory(FacetName); @@ -54,7 +55,7 @@ async function deployDiamond(unitrollerAddress) { unitrollerAdmin = signer[0]; } - const { diamond, cut } = await deployFacets(unitroller.address); + const { diamond, cut } = await deployFacets(); await unitroller.connect(unitrollerAdmin)._setPendingImplementation(diamond.address); await diamond.connect(unitrollerAdmin)._become(unitroller.address); @@ -73,7 +74,7 @@ async function deployDiamond(unitrollerAddress) { // We recommend this pattern to be able to use async/await everywhere // and properly handle errors. if (require.main === module) { - deployDiamond() + deployDiamond("") .then(() => process.exit(0)) .catch(error => { console.error(error); diff --git a/script/diamond/diamond.js b/tests/hardhat/Comptroller/Diamond/scripts/diamond.ts similarity index 94% rename from script/diamond/diamond.js rename to tests/hardhat/Comptroller/Diamond/scripts/diamond.ts index dcda0ea5f..88849533c 100644 --- a/script/diamond/diamond.js +++ b/tests/hardhat/Comptroller/Diamond/scripts/diamond.ts @@ -1,9 +1,11 @@ +import { ethers } from "hardhat"; + const FacetCutAction = { Add: 0, Replace: 1, Remove: 2 }; // get function selectors from ABI -function getSelectors(contract) { +function getSelectors(contract: any) { const signatures = Object.keys(contract.interface.functions); - const selectors = signatures.reduce((acc, val) => { + const selectors: any = signatures.reduce((acc: any, val) => { if (val !== "init(bytes)") { acc.push(contract.interface.getSighash(val)); } diff --git a/tests/hardhat/Fork/diamondTest.ts b/tests/hardhat/Fork/diamondTest.ts index 1bb4bead1..32f92933e 100644 --- a/tests/hardhat/Fork/diamondTest.ts +++ b/tests/hardhat/Fork/diamondTest.ts @@ -5,9 +5,8 @@ import chai from "chai"; import { parseUnits } from "ethers/lib/utils"; import { ethers, network } from "hardhat"; -import { VBep20, VToken__factory, XVS__factory } from "../../../typechain"; - -const { deployDiamond } = require("../../../script/diamond/deploy"); +import { VBep20 } from "../../../typechain"; +import { deployDiamond } from "../Comptroller/Diamond/scripts/deploy"; const { expect } = chai; chai.use(smock.matchers); From de2cb913988a2f6ad0852a59b9ed2cb38a788f09 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Fri, 12 May 2023 12:04:46 +0530 Subject: [PATCH 083/153] refactor: move some common code. --- .../Diamond/facets/FacetHelper.sol | 112 +++++++++++++++++ .../Diamond/facets/PolicyFacet.sol | 114 +----------------- .../Diamond/facets/RewardFacet.sol | 109 +---------------- .../Diamond/interfaces/IRewardFacet.sol | 15 +-- .../Diamond/interfaces/ISetterFacet.sol | 19 +-- 5 files changed, 126 insertions(+), 243 deletions(-) create mode 100644 contracts/Comptroller/Diamond/facets/FacetHelper.sol diff --git a/contracts/Comptroller/Diamond/facets/FacetHelper.sol b/contracts/Comptroller/Diamond/facets/FacetHelper.sol new file mode 100644 index 000000000..58ba414fc --- /dev/null +++ b/contracts/Comptroller/Diamond/facets/FacetHelper.sol @@ -0,0 +1,112 @@ +pragma solidity 0.5.16; + +import "../../../Utils/ExponentialNoError.sol"; +import "./FacetBase.sol"; + +contract FacetHelper is ComptrollerErrorReporter, ExponentialNoError, FacetBase { + /** + * @notice Accrue XVS to the market by updating the borrow index + * @param vToken The market whose borrow index to update + */ + function updateVenusBorrowIndex(address vToken, ExponentialNoError.Exp memory marketBorrowIndex) internal { + VenusMarketState storage borrowState = venusBorrowState[vToken]; + uint borrowSpeed = venusBorrowSpeeds[vToken]; + uint blockNumber = block.number; + uint deltaBlocks = sub_(uint(blockNumber), uint(borrowState.block)); + if (deltaBlocks > 0 && borrowSpeed > 0) { + uint borrowAmount = div_(VToken(vToken).totalBorrows(), marketBorrowIndex); + uint venusAccrued = mul_(deltaBlocks, borrowSpeed); + Double memory ratio = borrowAmount > 0 ? fraction(venusAccrued, borrowAmount) : Double({ mantissa: 0 }); + borrowState.index = safe224( + add_(Double({ mantissa: borrowState.index }), ratio).mantissa, + "new index exceeds 224 bits" + ); + borrowState.block = uint32(blockNumber); + } else if (deltaBlocks > 0) { + borrowState.block = uint32(blockNumber); + } + } + + /** + * @notice Accrue XVS to the market by updating the supply index + * @param vToken The market whose supply index to update + */ + function updateVenusSupplyIndex(address vToken) internal { + VenusMarketState storage supplyState = venusSupplyState[vToken]; + uint supplySpeed = venusSupplySpeeds[vToken]; + uint blockNumber = block.number; + + uint deltaBlocks = sub_(uint(blockNumber), uint(supplyState.block)); + if (deltaBlocks > 0 && supplySpeed > 0) { + uint supplyTokens = VToken(vToken).totalSupply(); + uint venusAccrued = mul_(deltaBlocks, supplySpeed); + Double memory ratio = supplyTokens > 0 ? fraction(venusAccrued, supplyTokens) : Double({ mantissa: 0 }); + supplyState.index = safe224( + add_(Double({ mantissa: supplyState.index }), ratio).mantissa, + "new index exceeds 224 bits" + ); + supplyState.block = uint32(blockNumber); + } else if (deltaBlocks > 0) { + supplyState.block = uint32(blockNumber); + } + } + + /** + * @notice Calculate XVS accrued by a supplier and possibly transfer it to them + * @param vToken The market in which the supplier is interacting + * @param supplier The address of the supplier to distribute XVS to + */ + function distributeSupplierVenus(address vToken, address supplier) internal { + if (address(vaiVaultAddress) != address(0)) { + // releaseToVault(); + } + uint supplyIndex = venusSupplyState[vToken].index; + uint supplierIndex = venusSupplierIndex[vToken][supplier]; + // Update supplier's index to the current index since we are distributing accrued XVS + venusSupplierIndex[vToken][supplier] = supplyIndex; + if (supplierIndex == 0 && supplyIndex >= venusInitialIndex) { + // Covers the case where users supplied tokens before the market's supply state index was set. + // Rewards the user with XVS accrued from the start of when supplier rewards were first + // set for the market. + supplierIndex = venusInitialIndex; + } + // Calculate change in the cumulative sum of the XVS per vToken accrued + Double memory deltaIndex = Double({ mantissa: sub_(supplyIndex, supplierIndex) }); + // Multiply of supplierTokens and supplierDelta + uint supplierDelta = mul_(VToken(vToken).balanceOf(supplier), deltaIndex); + // Addition of supplierAccrued and supplierDelta + venusAccrued[supplier] = add_(venusAccrued[supplier], supplierDelta); + // emit DistributedSupplierVenus(VToken(vToken), supplier, supplierDelta, supplyIndex); + } + + /** + * @notice Calculate XVS accrued by a borrower and possibly transfer it to them + * @dev Borrowers will not begin to accrue until after the first interaction with the protocol. + * @param vToken The market in which the borrower is interacting + * @param borrower The address of the borrower to distribute XVS to + */ + function distributeBorrowerVenus( + address vToken, + address borrower, + ExponentialNoError.Exp memory marketBorrowIndex + ) internal { + if (address(vaiVaultAddress) != address(0)) { + // releaseToVault(); + } + uint borrowIndex = venusBorrowState[vToken].index; + uint borrowerIndex = venusBorrowerIndex[vToken][borrower]; + // Update borrowers's index to the current index since we are distributing accrued XVS + venusBorrowerIndex[vToken][borrower] = borrowIndex; + if (borrowerIndex == 0 && borrowIndex >= venusInitialIndex) { + // Covers the case where users borrowed tokens before the market's borrow state index was set. + // Rewards the user with XVS accrued from the start of when borrower rewards were first + // set for the market. + borrowerIndex = venusInitialIndex; + } + // Calculate change in the cumulative sum of the XVS per borrowed unit accrued + Double memory deltaIndex = Double({ mantissa: sub_(borrowIndex, borrowerIndex) }); + uint borrowerDelta = mul_(div_(VToken(vToken).borrowBalanceStored(borrower), marketBorrowIndex), deltaIndex); + venusAccrued[borrower] = add_(venusAccrued[borrower], borrowerDelta); + // emit DistributedBorrowerVenus(VToken(vToken), borrower, borrowerDelta, borrowIndex); + } +} diff --git a/contracts/Comptroller/Diamond/facets/PolicyFacet.sol b/contracts/Comptroller/Diamond/facets/PolicyFacet.sol index a05e8a256..edb56b60d 100644 --- a/contracts/Comptroller/Diamond/facets/PolicyFacet.sol +++ b/contracts/Comptroller/Diamond/facets/PolicyFacet.sol @@ -1,10 +1,10 @@ pragma solidity 0.5.16; import "../../../Utils/ErrorReporter.sol"; -import "./FacetBase.sol"; +import "./FacetHelper.sol"; import "../../../Tokens/VTokens/VToken.sol"; -contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase { +contract PolicyFacet is FacetHelper { /// @notice Emitted when a new borrow-side XVS speed is calculated for a market event VenusBorrowSpeedUpdated(VToken indexed vToken, uint newSpeed); @@ -72,7 +72,7 @@ contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase * @param redeemTokens The number of tokens being redeemed */ // solhint-disable-next-line no-unused-vars - function redeemVerify(address vToken, address redeemer, uint redeemAmount, uint redeemTokens) public { + function redeemVerify(address vToken, address redeemer, uint redeemAmount, uint redeemTokens) public pure { require(redeemTokens != 0 || redeemAmount == 0, "redeemTokens zero"); } @@ -199,7 +199,7 @@ contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase address liquidator, address borrower, uint repayAmount - ) public returns (uint) { + ) public view returns (uint) { checkProtocolPauseState(); // if we want to pause liquidating to vTokenCollateral, we should pause seizing @@ -404,110 +404,4 @@ contract PolicyFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase emit VenusBorrowSpeedUpdated(vToken, borrowSpeed); } } - - /** - * @notice Accrue XVS to the market by updating the borrow index - * @param vToken The market whose borrow index to update - */ - function updateVenusBorrowIndex(address vToken, ExponentialNoError.Exp memory marketBorrowIndex) internal { - VenusMarketState storage borrowState = venusBorrowState[vToken]; - uint borrowSpeed = venusBorrowSpeeds[vToken]; - uint blockNumber = block.number; - uint deltaBlocks = sub_(uint(blockNumber), uint(borrowState.block)); - if (deltaBlocks > 0 && borrowSpeed > 0) { - uint borrowAmount = div_(VToken(vToken).totalBorrows(), marketBorrowIndex); - uint venusAccrued = mul_(deltaBlocks, borrowSpeed); - Double memory ratio = borrowAmount > 0 ? fraction(venusAccrued, borrowAmount) : Double({ mantissa: 0 }); - borrowState.index = safe224( - add_(Double({ mantissa: borrowState.index }), ratio).mantissa, - "new index exceeds 224 bits" - ); - borrowState.block = uint32(blockNumber); - } else if (deltaBlocks > 0) { - borrowState.block = uint32(blockNumber); - } - } - - /** - * @notice Accrue XVS to the market by updating the supply index - * @param vToken The market whose supply index to update - */ - function updateVenusSupplyIndex(address vToken) internal { - VenusMarketState storage supplyState = venusSupplyState[vToken]; - uint supplySpeed = venusSupplySpeeds[vToken]; - uint blockNumber = block.number; - - uint deltaBlocks = sub_(uint(blockNumber), uint(supplyState.block)); - if (deltaBlocks > 0 && supplySpeed > 0) { - uint supplyTokens = VToken(vToken).totalSupply(); - uint venusAccrued = mul_(deltaBlocks, supplySpeed); - Double memory ratio = supplyTokens > 0 ? fraction(venusAccrued, supplyTokens) : Double({ mantissa: 0 }); - supplyState.index = safe224( - add_(Double({ mantissa: supplyState.index }), ratio).mantissa, - "new index exceeds 224 bits" - ); - supplyState.block = uint32(blockNumber); - } else if (deltaBlocks > 0) { - supplyState.block = uint32(blockNumber); - } - } - - /** - * @notice Calculate XVS accrued by a supplier and possibly transfer it to them - * @param vToken The market in which the supplier is interacting - * @param supplier The address of the supplier to distribute XVS to - */ - function distributeSupplierVenus(address vToken, address supplier) internal { - if (address(vaiVaultAddress) != address(0)) { - // releaseToVault(); - } - uint supplyIndex = venusSupplyState[vToken].index; - uint supplierIndex = venusSupplierIndex[vToken][supplier]; - // Update supplier's index to the current index since we are distributing accrued XVS - venusSupplierIndex[vToken][supplier] = supplyIndex; - if (supplierIndex == 0 && supplyIndex >= venusInitialIndex) { - // Covers the case where users supplied tokens before the market's supply state index was set. - // Rewards the user with XVS accrued from the start of when supplier rewards were first - // set for the market. - supplierIndex = venusInitialIndex; - } - // Calculate change in the cumulative sum of the XVS per vToken accrued - Double memory deltaIndex = Double({ mantissa: sub_(supplyIndex, supplierIndex) }); - // Multiply of supplierTokens and supplierDelta - uint supplierDelta = mul_(VToken(vToken).balanceOf(supplier), deltaIndex); - // Addition of supplierAccrued and supplierDelta - venusAccrued[supplier] = add_(venusAccrued[supplier], supplierDelta); - // emit DistributedSupplierVenus(VToken(vToken), supplier, supplierDelta, supplyIndex); - } - - /** - * @notice Calculate XVS accrued by a borrower and possibly transfer it to them - * @dev Borrowers will not begin to accrue until after the first interaction with the protocol. - * @param vToken The market in which the borrower is interacting - * @param borrower The address of the borrower to distribute XVS to - */ - function distributeBorrowerVenus( - address vToken, - address borrower, - ExponentialNoError.Exp memory marketBorrowIndex - ) internal { - if (address(vaiVaultAddress) != address(0)) { - // releaseToVault(); - } - uint borrowIndex = venusBorrowState[vToken].index; - uint borrowerIndex = venusBorrowerIndex[vToken][borrower]; - // Update borrowers's index to the current index since we are distributing accrued XVS - venusBorrowerIndex[vToken][borrower] = borrowIndex; - if (borrowerIndex == 0 && borrowIndex >= venusInitialIndex) { - // Covers the case where users borrowed tokens before the market's borrow state index was set. - // Rewards the user with XVS accrued from the start of when borrower rewards were first - // set for the market. - borrowerIndex = venusInitialIndex; - } - // Calculate change in the cumulative sum of the XVS per borrowed unit accrued - Double memory deltaIndex = Double({ mantissa: sub_(borrowIndex, borrowerIndex) }); - uint borrowerDelta = mul_(div_(VToken(vToken).borrowBalanceStored(borrower), marketBorrowIndex), deltaIndex); - venusAccrued[borrower] = add_(venusAccrued[borrower], borrowerDelta); - // emit DistributedBorrowerVenus(VToken(vToken), borrower, borrowerDelta, borrowIndex); - } } diff --git a/contracts/Comptroller/Diamond/facets/RewardFacet.sol b/contracts/Comptroller/Diamond/facets/RewardFacet.sol index 888404568..5ed92a509 100644 --- a/contracts/Comptroller/Diamond/facets/RewardFacet.sol +++ b/contracts/Comptroller/Diamond/facets/RewardFacet.sol @@ -3,8 +3,8 @@ pragma solidity 0.5.16; import "../../../Oracle/PriceOracle.sol"; import "../../../Tokens/VTokens/VToken.sol"; import "../../../Utils/ErrorReporter.sol"; -import "./FacetBase.sol"; import "../../../Governance/IAccessControlManager.sol"; +import "./FacetHelper.sol"; interface IXVS { function balanceOf(address account) external view returns (uint); @@ -14,7 +14,7 @@ interface IXVS { function approve(address spender, uint rawAmount) external returns (bool); } -contract RewardFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase { +contract RewardFacet is FacetHelper { /// @notice Emitted when Venus is granted by admin event VenusGranted(address recipient, uint amount); @@ -219,109 +219,4 @@ contract RewardFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase venusAccrued[holder] = grantXVSInternal(holder, venusAccrued[holder], shortfall, collateral); } } - - /** - * @notice Accrue XVS to the market by updating the borrow index - * @param vToken The market whose borrow index to update - */ - function updateVenusBorrowIndex(address vToken, ExponentialNoError.Exp memory marketBorrowIndex) internal { - VenusMarketState storage borrowState = venusBorrowState[vToken]; - uint borrowSpeed = venusBorrowSpeeds[vToken]; - uint blockNumber = block.number; - uint deltaBlocks = sub_(uint(blockNumber), uint(borrowState.block)); - if (deltaBlocks > 0 && borrowSpeed > 0) { - uint borrowAmount = div_(VToken(vToken).totalBorrows(), marketBorrowIndex); - uint venusAccrued = mul_(deltaBlocks, borrowSpeed); - Double memory ratio = borrowAmount > 0 ? fraction(venusAccrued, borrowAmount) : Double({ mantissa: 0 }); - borrowState.index = safe224( - add_(Double({ mantissa: borrowState.index }), ratio).mantissa, - "new index exceeds 224 bits" - ); - borrowState.block = uint32(blockNumber); - } else if (deltaBlocks > 0) { - borrowState.block = uint32(blockNumber); - } - } - - /** - * @notice Accrue XVS to the market by updatiSng the supply index - * @param vToken The market whose supply index to update - */ - function updateVenusSupplyIndex(address vToken) internal { - VenusMarketState storage supplyState = venusSupplyState[vToken]; - uint supplySpeed = venusSupplySpeeds[vToken]; - uint blockNumber = block.number; - uint deltaBlocks = sub_(uint(blockNumber), uint(supplyState.block)); - if (deltaBlocks > 0 && supplySpeed > 0) { - uint supplyTokens = VToken(vToken).totalSupply(); - uint venusAccrued = mul_(deltaBlocks, supplySpeed); - Double memory ratio = supplyTokens > 0 ? fraction(venusAccrued, supplyTokens) : Double({ mantissa: 0 }); - supplyState.index = safe224( - add_(Double({ mantissa: supplyState.index }), ratio).mantissa, - "new index exceeds 224 bits" - ); - supplyState.block = uint32(blockNumber); - } else if (deltaBlocks > 0) { - supplyState.block = uint32(blockNumber); - } - } - - /** - * @notice Calculate XVS accrued by a supplier and possibly transfer it to them - * @param vToken The market in which the supplier is interacting - * @param supplier The address of the supplier to distribute XVS to - */ - function distributeSupplierVenus(address vToken, address supplier) internal { - if (address(vaiVaultAddress) != address(0)) { - // releaseToVault(); - } - uint supplyIndex = venusSupplyState[vToken].index; - uint supplierIndex = venusSupplierIndex[vToken][supplier]; - // Update supplier's index to the current index since we are distributing accrued XVS - venusSupplierIndex[vToken][supplier] = supplyIndex; - if (supplierIndex == 0 && supplyIndex >= venusInitialIndex) { - // Covers the case where users supplied tokens before the market's supply state index was set. - // Rewards the user with XVS accrued from the start of when supplier rewards were first - // set for the market. - supplierIndex = venusInitialIndex; - } - // Calculate change in the cumulative sum of the XVS per vToken accrued - Double memory deltaIndex = Double({ mantissa: sub_(supplyIndex, supplierIndex) }); - // Multiply of supplierTokens and supplierDelta - uint supplierDelta = mul_(VToken(vToken).balanceOf(supplier), deltaIndex); - // Addition of supplierAccrued and supplierDelta - venusAccrued[supplier] = add_(venusAccrued[supplier], supplierDelta); - // emit DistributedSupplierVenus(VToken(vToken), supplier, supplierDelta, supplyIndex); - } - - /** - * @notice Calculate XVS accrued by a borrower and possibly transfer it to them - * @dev Borrowers will not begin to accrue until after the first interaction with the protocol. - * @param vToken The market in which the borrower is interacting - * @param borrower The address of the borrower to distribute XVS to - */ - function distributeBorrowerVenus( - address vToken, - address borrower, - ExponentialNoError.Exp memory marketBorrowIndex - ) internal { - if (address(vaiVaultAddress) != address(0)) { - // releaseToVault(); - } - uint borrowIndex = venusBorrowState[vToken].index; - uint borrowerIndex = venusBorrowerIndex[vToken][borrower]; - // Update borrowers's index to the current index since we are distributing accrued XVS - venusBorrowerIndex[vToken][borrower] = borrowIndex; - if (borrowerIndex == 0 && borrowIndex >= venusInitialIndex) { - // Covers the case where users borrowed tokens before the market's borrow state index was set. - // Rewards the user with XVS accrued from the start of when borrower rewards were first - // set for the market. - borrowerIndex = venusInitialIndex; - } - // Calculate change in the cumulative sum of the XVS per borrowed unit accrued - Double memory deltaIndex = Double({ mantissa: sub_(borrowIndex, borrowerIndex) }); - uint borrowerDelta = mul_(div_(VToken(vToken).borrowBalanceStored(borrower), marketBorrowIndex), deltaIndex); - venusAccrued[borrower] = add_(venusAccrued[borrower], borrowerDelta); - // emit DistributedBorrowerVenus(VToken(vToken), borrower, borrowerDelta, borrowIndex); - } } diff --git a/contracts/Comptroller/Diamond/interfaces/IRewardFacet.sol b/contracts/Comptroller/Diamond/interfaces/IRewardFacet.sol index 76eca54ad..ccbe8fda0 100644 --- a/contracts/Comptroller/Diamond/interfaces/IRewardFacet.sol +++ b/contracts/Comptroller/Diamond/interfaces/IRewardFacet.sol @@ -2,20 +2,9 @@ pragma solidity 0.5.16; import "../../../Oracle/PriceOracle.sol"; import "../../../Tokens/VTokens/VToken.sol"; +import "../../ComptrollerStorage.sol"; interface IRewardFacet { - enum Action { - MINT, - REDEEM, - BORROW, - REPAY, - SEIZE, - LIQUIDATE, - TRANSFER, - ENTER_MARKET, - EXIT_MARKET - } - function claimVenus(address holder) external; function claimVenus(address holder, VToken[] calldata vTokens) external; @@ -32,7 +21,7 @@ interface IRewardFacet { function getXVSVTokenAddress() external pure returns (address); - function actionPaused(address market, Action action) external view returns (bool); + function actionPaused(address market, ComptrollerV12Storage.Action action) external view returns (bool); function releaseToVault() external; diff --git a/contracts/Comptroller/Diamond/interfaces/ISetterFacet.sol b/contracts/Comptroller/Diamond/interfaces/ISetterFacet.sol index 2e79c02d6..dc18e50c6 100644 --- a/contracts/Comptroller/Diamond/interfaces/ISetterFacet.sol +++ b/contracts/Comptroller/Diamond/interfaces/ISetterFacet.sol @@ -3,20 +3,9 @@ pragma solidity 0.5.16; import "../../../Oracle/PriceOracle.sol"; import "../../../Comptroller/ComptrollerLensInterface.sol"; import "../../../Tokens/VAI/VAIController.sol"; +import "../../ComptrollerStorage.sol"; interface ISetterFacet { - enum Action { - MINT, - REDEEM, - BORROW, - REPAY, - SEIZE, - LIQUIDATE, - TRANSFER, - ENTER_MARKET, - EXIT_MARKET - } - function _setPriceOracle(PriceOracle newOracle) external returns (uint); function _setCloseFactor(uint newCloseFactorMantissa) external returns (uint); @@ -37,7 +26,11 @@ interface ISetterFacet { function _setProtocolPaused(bool state) external returns (bool); - function _setActionsPaused(address[] calldata markets, Action[] calldata actions, bool paused) external; + function _setActionsPaused( + address[] calldata markets, + ComptrollerV12Storage.Action[] calldata actions, + bool paused + ) external; function _setVAIController(VAIControllerInterface vaiController_) external returns (uint); From 0a0df6067f7595709915dd32fae4fa4269517b65 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Fri, 12 May 2023 12:30:46 +0530 Subject: [PATCH 084/153] refactor: added comments. --- contracts/Comptroller/Diamond/facets/FacetHelper.sol | 3 +++ contracts/Comptroller/Diamond/facets/MarketFacet.sol | 3 +++ contracts/Comptroller/Diamond/facets/PolicyFacet.sol | 3 +++ contracts/Comptroller/Diamond/facets/RewardFacet.sol | 4 +++- contracts/Comptroller/Diamond/facets/SetterFacet.sol | 3 +++ 5 files changed, 15 insertions(+), 1 deletion(-) diff --git a/contracts/Comptroller/Diamond/facets/FacetHelper.sol b/contracts/Comptroller/Diamond/facets/FacetHelper.sol index 58ba414fc..48336f7bd 100644 --- a/contracts/Comptroller/Diamond/facets/FacetHelper.sol +++ b/contracts/Comptroller/Diamond/facets/FacetHelper.sol @@ -3,6 +3,9 @@ pragma solidity 0.5.16; import "../../../Utils/ExponentialNoError.sol"; import "./FacetBase.sol"; +/** + * @dev This contract contains internal functions used in RewardFacet and PolicyFacet + */ contract FacetHelper is ComptrollerErrorReporter, ExponentialNoError, FacetBase { /** * @notice Accrue XVS to the market by updating the borrow index diff --git a/contracts/Comptroller/Diamond/facets/MarketFacet.sol b/contracts/Comptroller/Diamond/facets/MarketFacet.sol index 5d4837181..805a878e5 100644 --- a/contracts/Comptroller/Diamond/facets/MarketFacet.sol +++ b/contracts/Comptroller/Diamond/facets/MarketFacet.sol @@ -3,6 +3,9 @@ pragma solidity 0.5.16; import "./FacetBase.sol"; import "../../../Tokens/VTokens/VToken.sol"; +/** + * @dev This facet contains all the methods related to the market's management in the pool + */ contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase { /// @notice Emitted when an account enters a market event MarketEntered(VToken vToken, address account); diff --git a/contracts/Comptroller/Diamond/facets/PolicyFacet.sol b/contracts/Comptroller/Diamond/facets/PolicyFacet.sol index edb56b60d..410eddcf9 100644 --- a/contracts/Comptroller/Diamond/facets/PolicyFacet.sol +++ b/contracts/Comptroller/Diamond/facets/PolicyFacet.sol @@ -4,6 +4,9 @@ import "../../../Utils/ErrorReporter.sol"; import "./FacetHelper.sol"; import "../../../Tokens/VTokens/VToken.sol"; +/** + * @dev This facet contains all the hooks used while transferring the assets + */ contract PolicyFacet is FacetHelper { /// @notice Emitted when a new borrow-side XVS speed is calculated for a market event VenusBorrowSpeedUpdated(VToken indexed vToken, uint newSpeed); diff --git a/contracts/Comptroller/Diamond/facets/RewardFacet.sol b/contracts/Comptroller/Diamond/facets/RewardFacet.sol index 5ed92a509..b3f895db7 100644 --- a/contracts/Comptroller/Diamond/facets/RewardFacet.sol +++ b/contracts/Comptroller/Diamond/facets/RewardFacet.sol @@ -13,7 +13,9 @@ interface IXVS { function approve(address spender, uint rawAmount) external returns (bool); } - +/** + * @dev This facet contains all the methods related to the reward functionality + */ contract RewardFacet is FacetHelper { /// @notice Emitted when Venus is granted by admin event VenusGranted(address recipient, uint amount); diff --git a/contracts/Comptroller/Diamond/facets/SetterFacet.sol b/contracts/Comptroller/Diamond/facets/SetterFacet.sol index a67509b88..44e6d96d7 100644 --- a/contracts/Comptroller/Diamond/facets/SetterFacet.sol +++ b/contracts/Comptroller/Diamond/facets/SetterFacet.sol @@ -6,6 +6,9 @@ import "../../../Utils/ErrorReporter.sol"; import "../../../Governance/IAccessControlManager.sol"; import "./FacetBase.sol"; +/** + * @dev This facet contains all the setters for the states + */ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase { /// @notice Emitted when close factor is changed by admin event NewCloseFactor(uint oldCloseFactorMantissa, uint newCloseFactorMantissa); From 582ae8912c74f4f18f01aa1a85d601f1c88488af Mon Sep 17 00:00:00 2001 From: defcon022 Date: Tue, 16 May 2023 20:27:51 +0530 Subject: [PATCH 085/153] refactor: added tests for diamond cut methods. --- .../Diamond/facets/RewardFacet.sol | 3 +- contracts/test/DiamondHarness.sol | 12 ++ contracts/test/DiamondHarnessInterface.sol | 20 +++ tests/hardhat/Comptroller/Diamond/diamond.ts | 124 ++++++++++++++++++ 4 files changed, 158 insertions(+), 1 deletion(-) create mode 100644 contracts/test/DiamondHarness.sol create mode 100644 contracts/test/DiamondHarnessInterface.sol create mode 100644 tests/hardhat/Comptroller/Diamond/diamond.ts diff --git a/contracts/Comptroller/Diamond/facets/RewardFacet.sol b/contracts/Comptroller/Diamond/facets/RewardFacet.sol index b3f895db7..f4af1ce49 100644 --- a/contracts/Comptroller/Diamond/facets/RewardFacet.sol +++ b/contracts/Comptroller/Diamond/facets/RewardFacet.sol @@ -13,8 +13,9 @@ interface IXVS { function approve(address spender, uint rawAmount) external returns (bool); } + /** - * @dev This facet contains all the methods related to the reward functionality + * @dev This facet contains all the methods related to the reward functionality */ contract RewardFacet is FacetHelper { /// @notice Emitted when Venus is granted by admin diff --git a/contracts/test/DiamondHarness.sol b/contracts/test/DiamondHarness.sol new file mode 100644 index 000000000..d4a0bdf84 --- /dev/null +++ b/contracts/test/DiamondHarness.sol @@ -0,0 +1,12 @@ +pragma solidity ^0.5.16; +pragma experimental ABIEncoderV2; + +import "../Comptroller/Diamond/Diamond.sol"; + +contract DiamondHarness is Diamond { + function getFacetAddress(bytes4 sig) public view returns (address) { + address facet = selectorToFacetAndPosition[sig].facetAddress; + require(facet != address(0), "Diamond: Function does not exist"); + return facet; + } +} diff --git a/contracts/test/DiamondHarnessInterface.sol b/contracts/test/DiamondHarnessInterface.sol new file mode 100644 index 000000000..efb99795a --- /dev/null +++ b/contracts/test/DiamondHarnessInterface.sol @@ -0,0 +1,20 @@ +pragma solidity ^0.5.16; +pragma experimental ABIEncoderV2; + +contract DiamondHarnessInterface { + enum FacetCutAction { + Add, + Replace, + Remove + } + + struct FacetCut { + address facetAddress; + FacetCutAction action; + bytes4[] functionSelectors; + } + + function getFacetAddress(bytes4 sig) public view returns (address); + + function diamondCut(FacetCut[] calldata _diamondCut) external; +} diff --git a/tests/hardhat/Comptroller/Diamond/diamond.ts b/tests/hardhat/Comptroller/Diamond/diamond.ts new file mode 100644 index 000000000..87c0bc9d2 --- /dev/null +++ b/tests/hardhat/Comptroller/Diamond/diamond.ts @@ -0,0 +1,124 @@ +import { expect } from "chai"; +import { ethers } from "hardhat"; + +import { FacetCutAction, getSelectors } from "./scripts/diamond"; + +describe("Comptroller", async () => { + let diamond; + let unitroller; + let unitrollerAdmin; + let facetCutParams; + let diamondHarness; + let facet; + + before(async () => { + const UnitrollerFactory = await ethers.getContractFactory("Unitroller"); + unitroller = await UnitrollerFactory.deploy(); + const signer = await ethers.getSigners(); + unitrollerAdmin = signer[0]; + + const diamondFactory = await ethers.getContractFactory("DiamondHarness"); + diamond = await diamondFactory.deploy(); + + await unitroller.connect(unitrollerAdmin)._setPendingImplementation(diamond.address); + await diamond.connect(unitrollerAdmin)._become(unitroller.address); + + const Facet = await ethers.getContractFactory("MarketFacet"); + facet = await Facet.deploy(); + await facet.deployed(); + + const FacetInterface = await ethers.getContractAt("IMarketFacet", facet.address); + + diamondHarness = await ethers.getContractAt("DiamondHarnessInterface", unitroller.address); + facetCutParams = [ + { + facetAddress: facet.address, + action: FacetCutAction.Add, + functionSelectors: getSelectors(FacetInterface), + }, + ]; + }); + + it("Revert on check for the function selector", async () => { + await expect(diamondHarness.getFacetAddress("0xa76b3fda")).to.be.revertedWith("Diamond: Function does not exist"); + await expect(diamondHarness.getFacetAddress("0x929fe9a1")).to.be.revertedWith("Diamond: Function does not exist"); + await expect(diamondHarness.getFacetAddress("0xc2998238")).to.be.revertedWith("Diamond: Function does not exist"); + await expect(diamondHarness.getFacetAddress("0xede4edd0")).to.be.revertedWith("Diamond: Function does not exist"); + await expect(diamondHarness.getFacetAddress("0xabfceffc")).to.be.revertedWith("Diamond: Function does not exist"); + await expect(diamondHarness.getFacetAddress("0x007e3dd2")).to.be.revertedWith("Diamond: Function does not exist"); + await expect(diamondHarness.getFacetAddress("0xc488847b")).to.be.revertedWith("Diamond: Function does not exist"); + }); + + it("Add Facet and function selectors to proxy", async () => { + await diamondHarness.connect(unitrollerAdmin).diamondCut(facetCutParams); + + expect(await diamondHarness.getFacetAddress("0xa76b3fda")).to.equal(facet.address); + expect(await diamondHarness.getFacetAddress("0x929fe9a1")).to.equal(facet.address); + expect(await diamondHarness.getFacetAddress("0xc2998238")).to.equal(facet.address); + expect(await diamondHarness.getFacetAddress("0xede4edd0")).to.equal(facet.address); + expect(await diamondHarness.getFacetAddress("0xabfceffc")).to.equal(facet.address); + expect(await diamondHarness.getFacetAddress("0x007e3dd2")).to.equal(facet.address); + expect(await diamondHarness.getFacetAddress("0xc488847b")).to.equal(facet.address); + }); + + it("Remove function selector from facet mapping", async () => { + facetCutParams = [ + { + facetAddress: ethers.constants.AddressZero, + action: FacetCutAction.Remove, + functionSelectors: ["0xa76b3fda", "0x929fe9a1"], + }, + ]; + await diamondHarness.connect(unitrollerAdmin).diamondCut(facetCutParams); + + await expect(diamondHarness.getFacetAddress("0xa76b3fda")).to.be.revertedWith("Diamond: Function does not exist"); + await expect(diamondHarness.getFacetAddress("0x929fe9a1")).to.be.revertedWith("Diamond: Function does not exist"); + expect(await diamondHarness.getFacetAddress("0xc2998238")).to.equal(facet.address); + expect(await diamondHarness.getFacetAddress("0xede4edd0")).to.equal(facet.address); + expect(await diamondHarness.getFacetAddress("0xabfceffc")).to.equal(facet.address); + expect(await diamondHarness.getFacetAddress("0x007e3dd2")).to.equal(facet.address); + expect(await diamondHarness.getFacetAddress("0xc488847b")).to.equal(facet.address); + }); + + it("Replace the function from facet mapping", async () => { + const Facet = await ethers.getContractFactory("PolicyFacet"); + const newFacet = await Facet.deploy(); + await newFacet.deployed(); + + facetCutParams = [ + { + facetAddress: newFacet.address, + action: FacetCutAction.Replace, + functionSelectors: ["0xc2998238", "0xede4edd0", "0xabfceffc"], + }, + ]; + await diamondHarness.connect(unitrollerAdmin).diamondCut(facetCutParams); + + await expect(diamondHarness.getFacetAddress("0xa76b3fda")).to.be.revertedWith("Diamond: Function does not exist"); + await expect(diamondHarness.getFacetAddress("0x929fe9a1")).to.be.revertedWith("Diamond: Function does not exist"); + expect(await diamondHarness.getFacetAddress("0xc2998238")).to.equal(newFacet.address); + expect(await diamondHarness.getFacetAddress("0xede4edd0")).to.equal(newFacet.address); + expect(await diamondHarness.getFacetAddress("0xabfceffc")).to.equal(newFacet.address); + expect(await diamondHarness.getFacetAddress("0x007e3dd2")).to.equal(facet.address); + expect(await diamondHarness.getFacetAddress("0xc488847b")).to.equal(facet.address); + }); + + it("Remove all functions", async () => { + facetCutParams = [ + { + facetAddress: ethers.constants.AddressZero, + action: FacetCutAction.Remove, + functionSelectors: ["0xc2998238", "0xede4edd0", "0xabfceffc", "0x007e3dd2", "0xc488847b"], + }, + ]; + await diamondHarness.connect(unitrollerAdmin).diamondCut(facetCutParams); + + await expect(diamondHarness.getFacetAddress("0xa76b3fda")).to.be.revertedWith("Diamond: Function does not exist"); + await expect(diamondHarness.getFacetAddress("0x929fe9a1")).to.be.revertedWith("Diamond: Function does not exist"); + await expect(diamondHarness.getFacetAddress("0xc2998238")).to.be.revertedWith("Diamond: Function does not exist"); + await expect(diamondHarness.getFacetAddress("0xede4edd0")).to.be.revertedWith("Diamond: Function does not exist"); + await expect(diamondHarness.getFacetAddress("0xabfceffc")).to.be.revertedWith("Diamond: Function does not exist"); + await expect(diamondHarness.getFacetAddress("0x007e3dd2")).to.be.revertedWith("Diamond: Function does not exist"); + await expect(diamondHarness.getFacetAddress("0xc488847b")).to.be.revertedWith("Diamond: Function does not exist"); + }); +}); From cc5c43378ceb79f298d8ce58bfa1f3ea6adb2f3f Mon Sep 17 00:00:00 2001 From: defcon022 Date: Tue, 16 May 2023 23:06:08 +0530 Subject: [PATCH 086/153] refactor: VEN-1452 script to generate cut params. --- .../comptroller/facet-cut-params-generator.ts | 104 ++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 script/deploy/comptroller/facet-cut-params-generator.ts diff --git a/script/deploy/comptroller/facet-cut-params-generator.ts b/script/deploy/comptroller/facet-cut-params-generator.ts new file mode 100644 index 000000000..e20fa164b --- /dev/null +++ b/script/deploy/comptroller/facet-cut-params-generator.ts @@ -0,0 +1,104 @@ +import fs from "fs"; +import { ethers } from "hardhat"; + +import { FacetCutAction, getSelectors } from "../../../tests/hardhat/Comptroller/Diamond/scripts/diamond"; + +// Insert the addresses of the deployed facets to generate thecut params according for the same. +const facetsAddresses = { + MarketFacet: "", + PolicyFacet: "", + RewardFacet: "", + SetterFacet: "", +}; + +// Set actions to the cut params to perform +// i.e. Add, Remove, Replace function selectors in the mapping. +const facetsActions = { + MarketFacet: FacetCutAction.Add, + PolicyFacet: FacetCutAction.Add, + RewardFacet: FacetCutAction.Add, + SetterFacet: FacetCutAction.Add, +}; + +// Set interfaces for the setters to generate function selectors from +const FacetsInterfaces = { + MarketFacet: "IMarketFacet", + PolicyFacet: "IPolicyFacet", + RewardFacet: "IRewardFacet", + SetterFacet: "ISetterFacet", +}; + +// Facets for which cute params need to generate +const FacetNames = ["MarketFacet", "PolicyFacet", "RewardFacet", "SetterFacet"]; + +// Name of the file to write the cut-params +const jsonFileName = "cur-params-test"; + +async function generateCutParams() { + const cut: any = []; + + for (const FacetName of FacetNames) { + const FacetInterface = await ethers.getContractAt(FacetsInterfaces[FacetName], facetsAddresses[FacetName]); + + switch (facetsActions[FacetName]) { + case FacetCutAction.Add: + cut.push({ + facetAddress: facetsAddresses[FacetName], + action: FacetCutAction.Add, + functionSelectors: getSelectors(FacetInterface), + }); + break; + case FacetCutAction.Remove: + cut.push({ + facetAddress: ethers.constants.AddressZero, + action: FacetCutAction.Remove, + functionSelectors: getSelectors(FacetInterface), + }); + break; + case FacetCutAction.Replace: + cut.push({ + facetAddress: facetsAddresses[FacetName], + action: FacetCutAction.Replace, + functionSelectors: getSelectors(FacetInterface), + }); + break; + default: + break; + } + } + + function getFunctionSelector(selectors: any) { + const functionSelector: any = []; + for (let i = 0; i < selectors.length; i++) { + if (selectors[i][0] == "0") { + functionSelector.push(selectors[i]); + } else { + break; + } + } + return functionSelector; + } + + function makeCutParam(cut: any) { + const cutParams = []; + for (let i = 0; i < cut.length; i++) { + const arr: any = new Array(3); + arr[0] = cut[i].facetAddress; + arr[1] = cut[i].action; + arr[2] = getFunctionSelector(cut[i].functionSelectors); + cutParams.push(arr); + } + return cutParams; + } + const cutParams = { cutParams: makeCutParam(cut) }; + + fs.writeFileSync(`./${jsonFileName}.json`, JSON.stringify(cutParams, null, 4)); + return cutParams; +} + +generateCutParams() + .then(() => process.exit(0)) + .catch(error => { + console.error(error); + process.exit(1); + }); From 9d714c95249cb803cfb4c6cab5f64fb82f639c3b Mon Sep 17 00:00:00 2001 From: defcon022 Date: Thu, 18 May 2023 13:39:32 +0530 Subject: [PATCH 087/153] refactor: moved vips to vips repo. --- .../comptroller/cut-params-mainnet.json | 115 ---- .../comptroller/cut-params-testnet.json | 115 ---- .../comptroller/facet-cut-params-generator.ts | 5 + .../fork/vip-diamond-comptroller-mainnet.ts | 359 ------------- .../fork/vip-diamond-comptroller-testnet.ts | 504 ------------------ 5 files changed, 5 insertions(+), 1093 deletions(-) delete mode 100644 script/deploy/comptroller/cut-params-mainnet.json delete mode 100644 script/deploy/comptroller/cut-params-testnet.json delete mode 100644 script/hardhat/fork/vip-diamond-comptroller-mainnet.ts delete mode 100644 script/hardhat/fork/vip-diamond-comptroller-testnet.ts diff --git a/script/deploy/comptroller/cut-params-mainnet.json b/script/deploy/comptroller/cut-params-mainnet.json deleted file mode 100644 index cac75543f..000000000 --- a/script/deploy/comptroller/cut-params-mainnet.json +++ /dev/null @@ -1,115 +0,0 @@ -{ - "cutParams": [ - ["0xaEf95dd426ea05CD96A7F3af4f290842f883d0A2", 0, ["0xcdffacc6", "0x52ef6b2c", "0xadfca15e", "0x7a0ed627"]], - [ - "", - 0, - [ - "0xa76b3fda", - "0x52d84d1e", - "0x21af4569", - "0x4a584432", - "0x929fe9a1", - "0xe8755446", - "0xd3270f99", - "0xc2998238", - "0xede4edd0", - "0xabfceffc", - "0x007e3dd2", - "0xc488847b", - "0x4ada90af", - "0x9bb27d62", - "0x8e8f294b", - "0x94b2294b", - "0x0db4b4e5", - "0x4088c73e", - "0x2bc7e29e", - "0x7dc0d1d0", - "0x24a3d622", - "0x425fad58", - "0x719f701b", - "0x76551383", - "0x02c3bcbb", - "0xc5f956af", - "0xb2eafc39", - "0x04ef9d58", - "0x9254f5e5", - "0xbec04f72", - "0x7d172bd5", - "0x8a7dc165", - "0xbbb8864a", - "0xe37d4b79", - "0x08e0225c", - "0x879c2e1d", - "0x1abcaa77", - "0x41a18d2c", - "0x5dd3fc9d", - "0xb8324c7c", - "0xfa6331d8" - ] - ], - [ - "", - 0, - [ - "0xead1a8a0", - "0xda3d454c", - "0x5c778605", - "0x5ec88c79", - "0x5fc7e71e", - "0x47ef3b3b", - "0x4ef4c3e1", - "0x41c728b9", - "0xeabe7d91", - "0x51dff989", - "0x24008a62", - "0x1ededc91", - "0xd02f7351", - "0x6d35bf91", - "0xbdcdc258", - "0x6a56947e" - ] - ], - [ - "", - 0, - [ - "0xa7604b41", - "0xe85a2960", - "0x70bf66f0", - "0x86df31ee", - "0xadcd5fb9", - "0xd09c54ba", - "0x7858524d", - "0x42cbb15c", - "0xbf32442d", - "0xededbae6", - "0xddfd287e" - ] - ], - [ - "", - 0, - [ - "0xf519fc30", - "0x2b5d790c", - "0x317b0b77", - "0xe4028eee", - "0x9bf34cbb", - "0x4fd42e17", - "0xbb857450", - "0x607ef6c1", - "0x51a485e4", - "0x5f5af1aa", - "0x55ee1fe1", - "0x2a6a6065", - "0xd24febad", - "0x9cfdd9e6", - "0x2ec04124", - "0x4e0853db", - "0x6662c7c9", - "0xfd51a3ad" - ] - ] - ] -} diff --git a/script/deploy/comptroller/cut-params-testnet.json b/script/deploy/comptroller/cut-params-testnet.json deleted file mode 100644 index ea0aa2ff7..000000000 --- a/script/deploy/comptroller/cut-params-testnet.json +++ /dev/null @@ -1,115 +0,0 @@ -{ - "cutParams": [ - ["0xaEf95dd426ea05CD96A7F3af4f290842f883d0A2", 0, ["0xcdffacc6", "0x52ef6b2c", "0xadfca15e", "0x7a0ed627"]], - [ - "0x38e9cb9215c9d6E4F8761914C1213C12394Cbd9f", - 0, - [ - "0xa76b3fda", - "0x52d84d1e", - "0x21af4569", - "0x4a584432", - "0x929fe9a1", - "0xe8755446", - "0xd3270f99", - "0xc2998238", - "0xede4edd0", - "0xabfceffc", - "0x007e3dd2", - "0xc488847b", - "0x4ada90af", - "0x9bb27d62", - "0x8e8f294b", - "0x94b2294b", - "0x0db4b4e5", - "0x4088c73e", - "0x2bc7e29e", - "0x7dc0d1d0", - "0x24a3d622", - "0x425fad58", - "0x719f701b", - "0x76551383", - "0x02c3bcbb", - "0xc5f956af", - "0xb2eafc39", - "0x04ef9d58", - "0x9254f5e5", - "0xbec04f72", - "0x7d172bd5", - "0x8a7dc165", - "0xbbb8864a", - "0xe37d4b79", - "0x08e0225c", - "0x879c2e1d", - "0x1abcaa77", - "0x41a18d2c", - "0x5dd3fc9d", - "0xb8324c7c", - "0xfa6331d8" - ] - ], - [ - "0x9008De0F2172710c3c80BfAAB7A9A7e69C8e8353", - 0, - [ - "0xead1a8a0", - "0xda3d454c", - "0x5c778605", - "0x5ec88c79", - "0x5fc7e71e", - "0x47ef3b3b", - "0x4ef4c3e1", - "0x41c728b9", - "0xeabe7d91", - "0x51dff989", - "0x24008a62", - "0x1ededc91", - "0xd02f7351", - "0x6d35bf91", - "0xbdcdc258", - "0x6a56947e" - ] - ], - [ - "0xA2Da6C4891474822EF28F1a7B7D10Ff629D9f322", - 0, - [ - "0xa7604b41", - "0xe85a2960", - "0x70bf66f0", - "0x86df31ee", - "0xadcd5fb9", - "0xd09c54ba", - "0x7858524d", - "0x42cbb15c", - "0xbf32442d", - "0xededbae6", - "0xddfd287e" - ] - ], - [ - "0xd1ce1369964c33080826A3d9F98C3549E6Aa425e", - 0, - [ - "0xf519fc30", - "0x2b5d790c", - "0x317b0b77", - "0xe4028eee", - "0x9bf34cbb", - "0x4fd42e17", - "0xbb857450", - "0x607ef6c1", - "0x51a485e4", - "0x5f5af1aa", - "0x55ee1fe1", - "0x2a6a6065", - "0xd24febad", - "0x9cfdd9e6", - "0x2ec04124", - "0x4e0853db", - "0x6662c7c9", - "0xfd51a3ad" - ] - ] - ] -} diff --git a/script/deploy/comptroller/facet-cut-params-generator.ts b/script/deploy/comptroller/facet-cut-params-generator.ts index e20fa164b..1cbad2a68 100644 --- a/script/deploy/comptroller/facet-cut-params-generator.ts +++ b/script/deploy/comptroller/facet-cut-params-generator.ts @@ -3,6 +3,11 @@ import { ethers } from "hardhat"; import { FacetCutAction, getSelectors } from "../../../tests/hardhat/Comptroller/Diamond/scripts/diamond"; +/** + * This script is used to generate the cut-params which will be used in diamond proxy vip + * to add diamond facets + */ + // Insert the addresses of the deployed facets to generate thecut params according for the same. const facetsAddresses = { MarketFacet: "", diff --git a/script/hardhat/fork/vip-diamond-comptroller-mainnet.ts b/script/hardhat/fork/vip-diamond-comptroller-mainnet.ts deleted file mode 100644 index 4de3fc979..000000000 --- a/script/hardhat/fork/vip-diamond-comptroller-mainnet.ts +++ /dev/null @@ -1,359 +0,0 @@ -import { impersonateAccount } from "@nomicfoundation/hardhat-network-helpers"; -import { expect } from "chai"; -import { ethers } from "hardhat"; - -import { VBep20 } from "../../../typechain"; -import { cutParams as params } from "../../deploy/comptroller/cut-params-mainnet.json"; -import { forking, testVip } from "./vip-framework"; -import { ProposalType } from "./vip-framework/types"; -import { makeProposal } from "./vip-framework/utils"; - -const UNITROLLER = "0xfD36E2c2a6789Db23113685031d7F16329158384"; - -const DIAMOND_CUT_FACET = ""; -const DIAMOND = ""; -const DIAMOND_INIT = ""; -const cutParams = params; - -export const vipDiamond = () => { - const meta = { - version: "v1", - title: "VIP-105 Comptroller Diamond proxy", - description: ``, - forDescription: - "I agree that Venus Protocol should proceed with the upgrading the Comptroller contract with diamond proxy", - againstDescription: "I do not think that Venus Protocol should proceed with the Comptroller contract upgradation", - abstainDescription: "I am indifferent to whether Venus Protocol proceeds with the Comptroller upgradation or not", - }; - - const initFunctionEncode = "0xe1c7392a"; - - return makeProposal( - [ - { - target: UNITROLLER, - signature: "_setPendingImplementation(address)", - params: [DIAMOND], - }, - { - target: DIAMOND, - signature: "_become()", - params: [], - }, - { - target: UNITROLLER, - signature: "facetCutInitilizer(address)", - params: [DIAMOND_CUT_FACET], - }, - { - target: UNITROLLER, - signature: "diamondCut((address,uint8,bytes4[])[],address,bytes)", - params: [cutParams, DIAMOND_INIT, initFunctionEncode], - }, - ], - meta, - ProposalType.REGULAR, - ); -}; - -forking(29043847, async () => { - testVip("VIP-Diamond TRON Contract Migration", vipDiamond()); -}); - -let owner, - unitroller, - // layout variables - oracle, - maxAssets, - closeFactorMantissa, - liquidationIncentiveMantissa, - allMarkets, - venusRate, - venusSpeeds, - venusSupplyState, - venusBorrowState, - venusAccrued, - vaiMintRate, - vaiController, - mintedVAIs, - mintVAIGuardianPaused, - repayVAIGuardianPaused, - protocolPaused, - venusVAIVaultRate, - vaiVaultAddress, - releaseStartBlock, - minReleaseAmount, - treasuryGuardian, - treasuryAddress, - treasuryPercent, - liquidatorContract, - comptrollerLens, - market, - venusSupplierIndex, - venusBorrowerIndex, - venusBorrowSpeeds, - venusSupplySpeeds; - -const Owner = "0x939bd8d64c0a9583a7dcea9933f7b21697ab6396"; -const zeroAddr = "0x0000000000000000000000000000000000000000"; -const VBUSD = "0x95c78222B3D6e262426483D42CfA53685A67Ab9D"; -const VUSDT = "0xfD5840Cd36d94D7229439859C0112a4185BC0255"; - -const initMainnetUser = async (user: string) => { - await impersonateAccount(user); - return ethers.getSigner(user); -}; - -forking(29043847, async () => { - let BUSD: ethers.contract; - let busdHolder: ethers.Signer; - let vBUSD: ethers.contract; - let vUSDT: ethers.contract; - let diamondUnitroller; - - if (process.env.FORK_MAINNET === "true") { - before(async () => { - /** - * sending gas cost to owner - * */ - // await pretendExecutingVip(vipDiamond()); - - await impersonateAccount(Owner); - owner = await ethers.getSigner(Owner); - const [signer] = await ethers.getSigners(); - await signer.sendTransaction({ - to: owner.address, - value: ethers.BigNumber.from("10000000000000000000"), - data: undefined, - }); - - // unitroller without diamond - unitroller = await ethers.getContractAt("Comptroller", UNITROLLER); - - diamondUnitroller = await ethers.getContractAt("Comptroller", unitroller.address); - - busdHolder = await initMainnetUser("0xf977814e90da44bfa03b6295a0616a897441acec"); - - [vBUSD, vUSDT] = await Promise.all( - [VBUSD, VUSDT].map((address: string) => { - return ethers.getContractAt("contracts/Tokens/VTokens/VBep20Delegate.sol:VBep20Delegate", address); - }), - ); - [BUSD] = await Promise.all( - [vBUSD, vUSDT].map(async (vToken: VBep20) => { - const underlying = await vToken.underlying(); - return ethers.getContractAt("IERC20Upgradeable", underlying); - }), - ); - }); - - describe("Verify Storage slots before vip execution ", async () => { - // These tests checks the storage collision of comptroller while updating it via diamond. - describe("Diamond deployed successfully", async () => { - it("Owner of Diamond unitroller contract should match", async () => { - const UnitrollerAdmin = await unitroller.admin(); - const pendingAdmin = await unitroller.pendingAdmin(); - expect(UnitrollerAdmin.toLowerCase()).to.equal(Owner.toLowerCase()); - expect(pendingAdmin.toLowerCase()).to.equal(zeroAddr); - }); - - it("Diamond Unitroller Implementation (comptroller) should match the diamond Proxy Address", async () => { - const comptrollerImplementation = await unitroller.comptrollerImplementation(); - const pendingComptrollerImplementation = await unitroller.pendingComptrollerImplementation(); - expect(comptrollerImplementation.toLowerCase()).to.equal( - "0xc934A1b15b30E9b515D8A87b5054432B9b965131".toLowerCase(), - ); - expect(pendingComptrollerImplementation.toLowerCase()).to.equal(zeroAddr); - }); - }); - - describe("Verify storage layout", async () => { - it("verify all the state before and after upgrade", async () => { - oracle = await unitroller.oracle(); - - maxAssets = await unitroller.maxAssets(); - - closeFactorMantissa = await unitroller.closeFactorMantissa(); - - liquidationIncentiveMantissa = await unitroller.liquidationIncentiveMantissa(); - - allMarkets = await unitroller.allMarkets(0); - - venusRate = await unitroller.venusRate(); - - venusSpeeds = await unitroller.venusSpeeds(BUSD.address); - - venusSupplyState = await unitroller.venusSupplyState(BUSD.address); - - venusBorrowState = await unitroller.venusBorrowState(BUSD.address); - - venusAccrued = await unitroller.venusAccrued(BUSD.address); - - vaiMintRate = await unitroller.vaiMintRate(); - - vaiController = await unitroller.vaiController(); - - mintedVAIs = await unitroller.mintedVAIs(busdHolder.address); - unitroller.minte; - - mintVAIGuardianPaused = await unitroller.mintVAIGuardianPaused(); - - repayVAIGuardianPaused = await unitroller.repayVAIGuardianPaused(); - - protocolPaused = await unitroller.protocolPaused(); - - venusVAIVaultRate = await unitroller.venusVAIVaultRate(); - - vaiVaultAddress = await unitroller.vaiVaultAddress(); - - releaseStartBlock = await unitroller.releaseStartBlock(); - - minReleaseAmount = await unitroller.minReleaseAmount(); - - treasuryGuardian = await unitroller.treasuryGuardian(); - - treasuryAddress = await unitroller.treasuryAddress(); - - treasuryPercent = await unitroller.treasuryPercent(); - - liquidatorContract = await unitroller.liquidatorContract(); - - comptrollerLens = await unitroller.comptrollerLens(); - - market = await unitroller.markets(vBUSD.address); - - venusBorrowerIndex = await unitroller.venusBorrowerIndex(vBUSD.address, busdHolder.address); - - venusSupplierIndex = await unitroller.venusSupplierIndex(vBUSD.address, busdHolder.address); - - venusBorrowSpeeds = await unitroller.venusBorrowSpeeds(vUSDT.address); - venusSupplySpeeds = await unitroller.venusSupplySpeeds(vUSDT.address); - }); - }); - }); - - testVip("VIP-Diamond TRON Contract Migration", vipDiamond()); - - describe("Verify Storage slots after vip execution ", async () => { - // These tests checks the storage collision of comptroller while updating it via diamond. - describe("Diamond deployed successfully", async () => { - it("Owner of Diamond unitroller contract should match", async () => { - const diamondUnitrollerAdmin = await diamondUnitroller.admin(); - const pendingAdmin = await diamondUnitroller.pendingAdmin(); - expect(diamondUnitrollerAdmin.toLowerCase()).to.equal(Owner.toLowerCase()); - expect(pendingAdmin.toLowerCase()).to.equal(zeroAddr); - }); - - it("Diamond Unitroller Implementation (comptroller) should match the diamond Proxy Address", async () => { - const comptrollerImplementation = await diamondUnitroller.comptrollerImplementation(); - const pendingComptrollerImplementation = await diamondUnitroller.pendingComptrollerImplementation(); - expect(comptrollerImplementation.toLowerCase()).to.equal(DIAMOND.toLowerCase()); - expect(pendingComptrollerImplementation.toLowerCase()).to.equal(zeroAddr); - }); - }); - - describe("Verify storage layout", async () => { - it("verify all the state before and after upgrade", async () => { - const oracelUpgrade = await diamondUnitroller.oracle(); - expect(oracle).to.equal(oracelUpgrade); - - const maxAssetsAfterUpgrade = await diamondUnitroller.maxAssets(); - expect(maxAssets).to.equal(maxAssetsAfterUpgrade); - - const closeFactorMantissaAfterUpgrade = await diamondUnitroller.closeFactorMantissa(); - expect(closeFactorMantissa).to.equal(closeFactorMantissaAfterUpgrade); - - const liquidationIncentiveMantissaAfterUpgrade = await diamondUnitroller.liquidationIncentiveMantissa(); - expect(liquidationIncentiveMantissa).to.equal(liquidationIncentiveMantissaAfterUpgrade); - - const allMarketsAfterUpgrade = await diamondUnitroller.allMarkets(0); - expect(allMarkets).to.equal(allMarketsAfterUpgrade); - - const venusRateAfterUpgrade = await diamondUnitroller.venusRate(); - expect(venusRate).to.equal(venusRateAfterUpgrade); - - const venusSpeedsAfterUpgrade = await diamondUnitroller.venusSpeeds(BUSD.address); - expect(venusSpeeds).to.equal(venusSpeedsAfterUpgrade); - - const venusSupplyStateAfterUpgrade = await diamondUnitroller.venusSupplyState(BUSD.address); - expect(venusSupplyState.index.toString()).to.equal(venusSupplyStateAfterUpgrade.index.toString()); - - const venusBorrowStateAfterUpgrade = await diamondUnitroller.venusBorrowState(BUSD.address); - expect(venusBorrowState.index.toString()).to.equal(venusBorrowStateAfterUpgrade.index.toString()); - - const venusAccruedAfterUpgrade = await diamondUnitroller.venusAccrued(BUSD.address); - expect(venusAccrued).to.equal(venusAccruedAfterUpgrade); - - const vaiMintRateAfterUpgrade = await diamondUnitroller.vaiMintRate(); - expect(vaiMintRate).to.equal(vaiMintRateAfterUpgrade); - - const vaiControllerUpgrade = await diamondUnitroller.vaiController(); - expect(vaiControllerUpgrade).to.equal(vaiController); - - const mintedVAIsUpgrade = await diamondUnitroller.mintedVAIs(busdHolder.address); - expect(mintedVAIsUpgrade).to.equal(mintedVAIs); - - const mintVAIGuardianPausedUpgrade = await diamondUnitroller.mintVAIGuardianPaused(); - expect(mintVAIGuardianPausedUpgrade).to.equal(mintVAIGuardianPaused); - - const repayVAIGuardianPausedUpgrade = await diamondUnitroller.repayVAIGuardianPaused(); - expect(repayVAIGuardianPausedUpgrade).to.equal(repayVAIGuardianPaused); - - const protocolPausedUpgrade = await diamondUnitroller.protocolPaused(); - expect(protocolPausedUpgrade).to.equal(protocolPaused); - - const venusVAIVaultRateUpgrade = await diamondUnitroller.venusVAIVaultRate(); - expect(venusVAIVaultRateUpgrade).to.equal(venusVAIVaultRate); - - const vaiVaultAddressUpgrade = await diamondUnitroller.vaiVaultAddress(); - expect(vaiVaultAddressUpgrade).to.equal(vaiVaultAddress); - - const releaseStartBlockUpgrade = await diamondUnitroller.releaseStartBlock(); - expect(releaseStartBlockUpgrade).to.equal(releaseStartBlock); - - const minReleaseAmountUpgrade = await diamondUnitroller.minReleaseAmount(); - expect(minReleaseAmountUpgrade).to.equal(minReleaseAmount); - - const treasuryGuardianUpgrade = await diamondUnitroller.treasuryGuardian(); - expect(treasuryGuardian).to.equal(treasuryGuardianUpgrade); - - const treasuryAddressUpgrade = await diamondUnitroller.treasuryAddress(); - expect(treasuryAddress).to.equal(treasuryAddressUpgrade); - - const treasuryPercentUpgrade = await diamondUnitroller.treasuryPercent(); - expect(treasuryPercent).to.equal(treasuryPercentUpgrade); - - const liquidatorContractUpgrade = await diamondUnitroller.liquidatorContract(); - expect(liquidatorContract).to.equal(liquidatorContractUpgrade); - - const comptrollerLensUpgrade = await diamondUnitroller.comptrollerLens(); - expect(comptrollerLens).to.equal(comptrollerLensUpgrade); - - // cheking all public mappings - const marketUpgrade = await diamondUnitroller.markets(vBUSD.address); - expect(market.collateralFactorMantissa).to.equal(marketUpgrade.collateralFactorMantissa); - expect(market.isListed).to.equal(marketUpgrade.isListed); - expect(market.isVenus).to.equal(marketUpgrade.isVenus); - - const venusBorrowerIndexUpgrade = await diamondUnitroller.venusBorrowerIndex( - vBUSD.address, - busdHolder.address, - ); - expect(venusBorrowerIndex).to.equal(venusBorrowerIndexUpgrade); - - const venusSupplierIndexUpgrade = await diamondUnitroller.venusSupplierIndex( - vBUSD.address, - busdHolder.address, - ); - expect(venusSupplierIndex).to.equal(venusSupplierIndexUpgrade); - - const venusBorrowSpeedsUpgrade = await diamondUnitroller.venusBorrowSpeeds(vUSDT.address); - const venusSupplySpeedsUpgrade = await diamondUnitroller.venusSupplySpeeds(vUSDT.address); - - expect(venusBorrowSpeeds).to.equal(venusBorrowSpeedsUpgrade); - expect(venusSupplySpeeds).to.equal(venusSupplySpeedsUpgrade); - }); - }); - }); - } -}); diff --git a/script/hardhat/fork/vip-diamond-comptroller-testnet.ts b/script/hardhat/fork/vip-diamond-comptroller-testnet.ts deleted file mode 100644 index 5b03fa5e6..000000000 --- a/script/hardhat/fork/vip-diamond-comptroller-testnet.ts +++ /dev/null @@ -1,504 +0,0 @@ -import { impersonateAccount } from "@nomicfoundation/hardhat-network-helpers"; -import { expect } from "chai"; -import { parseUnits } from "ethers/lib/utils"; -import { ethers } from "hardhat"; - -import { VBep20 } from "../../../typechain"; -import { cutParams as params } from "../../deploy/comptroller/cut-params-testnet.json"; -import { forking, pretendExecutingVip, testVip } from "./vip-framework"; -import { ProposalType } from "./vip-framework/types"; -import { makeProposal } from "./vip-framework/utils"; - -const UNITROLLER = "0x94d1820b2D1c7c7452A163983Dc888CEC546b77D"; -const DIAMOND_CUT_FACET = "0x69Ca940186C29b6a9D64e1Be1C59fb7A466354E2"; -const DIAMOND = "0xF6A9DBc8453EB8b1528B6Cd3f08eC632134f831F"; -const DIAMOND_INIT = "0x6D7f7Ed4EbD3A1807d5fe8EE70c155bcAc8174Af"; -const cutParams = params; - -export const vipDiamond = () => { - const meta = { - version: "v1", - title: "VIP-105 Comptroller Diamond proxy", - description: ``, - forDescription: - "I agree that Venus Protocol should proceed with the upgrading the Comptroller contract with diamond proxy", - againstDescription: "I do not think that Venus Protocol should proceed with the Comptroller contract upgradation", - abstainDescription: "I am indifferent to whether Venus Protocol proceeds with the Comptroller upgradation or not", - }; - - const initFunctionEncode = "0xe1c7392a"; - - return makeProposal( - [ - { - target: UNITROLLER, - signature: "_setPendingImplementation(address)", - params: [DIAMOND], - }, - { - target: DIAMOND, - signature: "_become()", - params: [], - }, - { - target: UNITROLLER, - signature: "facetCutInitilizer(address)", - params: [DIAMOND_CUT_FACET], - }, - { - target: UNITROLLER, - signature: "diamondCut((address,uint8,bytes4[])[],address,bytes)", - params: [cutParams, DIAMOND_INIT, initFunctionEncode], - }, - ], - meta, - ProposalType.REGULAR, - ); -}; - -const Owner = "0xce10739590001705F7FF231611ba4A48B2820327"; -const zeroAddr = "0x0000000000000000000000000000000000000000"; -const VBUSD = "0x08e0A5575De71037aE36AbfAfb516595fE68e5e4"; -const VUSDT = "0xb7526572FFE56AB9D7489838Bf2E18e3323b441A"; - -const initMainnetUser = async (user: string) => { - await impersonateAccount(user); - return ethers.getSigner(user); -}; - -forking(29043847, async () => { - let owner, - unitroller, - // layout variables - oracle, - maxAssets, - closeFactorMantissa, - liquidationIncentiveMantissa, - allMarkets, - venusRate, - venusSpeeds, - venusSupplyState, - venusBorrowState, - venusAccrued, - vaiMintRate, - vaiController, - mintedVAIs, - mintVAIGuardianPaused, - repayVAIGuardianPaused, - protocolPaused, - venusVAIVaultRate, - vaiVaultAddress, - releaseStartBlock, - minReleaseAmount, - treasuryGuardian, - treasuryAddress, - treasuryPercent, - liquidatorContract, - comptrollerLens, - market, - venusSupplierIndex, - venusBorrowerIndex, - venusBorrowSpeeds, - venusSupplySpeeds; - - let BUSD: ethers.contract; - let usdtHolder: ethers.Signer; - let busdHolder: ethers.Signer; - let vBUSD: ethers.contract; - let vUSDT: ethers.contract; - let diamondUnitroller; - - before(async () => { - unitroller = await ethers.getContractAt("Comptroller", UNITROLLER); - - diamondUnitroller = await ethers.getContractAt("Comptroller", unitroller.address); - - await impersonateAccount(Owner); - owner = await ethers.getSigner(Owner); - const [signer] = await ethers.getSigners(); - await signer.sendTransaction({ - to: owner.address, - value: ethers.BigNumber.from("10000000000000000000"), - data: undefined, - }); - - busdHolder = await initMainnetUser("0xC825AD791A6046991e3706b6342970f6d87e4888"); - - usdtHolder = await initMainnetUser("0xa0747a72C329377C2CE4F0F3165197B3a5359EfE"); - - [vBUSD, vUSDT] = await Promise.all( - [VBUSD, VUSDT].map((address: string) => { - return ethers.getContractAt("contracts/Tokens/VTokens/VBep20Delegate.sol:VBep20Delegate", address); - }), - ); - - [BUSD] = await Promise.all( - [vBUSD, vUSDT].map(async (vToken: VBep20) => { - const underlying = await vToken.underlying(); - return ethers.getContractAt("IERC20Upgradeable", underlying); - }), - ); - }); - - describe("Verify Storage slots before vip execution", async () => { - // These tests checks the storage collision of comptroller while updating it via diamond. - describe("Diamond deployed successfully before vip execution", async () => { - it("Owner of Diamond unitroller contract should match", async () => { - const UnitrollerAdmin = await unitroller.admin(); - const pendingAdmin = await unitroller.pendingAdmin(); - expect(UnitrollerAdmin.toLowerCase()).to.equal(Owner.toLowerCase()); - expect(pendingAdmin.toLowerCase()).to.equal(zeroAddr); - }); - - it("Diamond Unitroller Implementation (comptroller) should match the diamond Proxy Address", async () => { - const comptrollerImplementation = await unitroller.comptrollerImplementation(); - const pendingComptrollerImplementation = await unitroller.pendingComptrollerImplementation(); - expect(comptrollerImplementation.toLowerCase()).to.equal( - "0xc934A1b15b30E9b515D8A87b5054432B9b965131".toLowerCase(), - ); - expect(pendingComptrollerImplementation.toLowerCase()).to.equal(zeroAddr); - }); - }); - - describe("Verify storage layout before vip execution", async () => { - it("verify all the state before and after upgrade", async () => { - oracle = await unitroller.oracle(); - - maxAssets = await unitroller.maxAssets(); - - closeFactorMantissa = await unitroller.closeFactorMantissa(); - - liquidationIncentiveMantissa = await unitroller.liquidationIncentiveMantissa(); - - allMarkets = await unitroller.allMarkets(0); - - venusRate = await unitroller.venusRate(); - - venusSpeeds = await unitroller.venusSpeeds(BUSD.address); - - venusSupplyState = await unitroller.venusSupplyState(BUSD.address); - - venusBorrowState = await unitroller.venusBorrowState(BUSD.address); - - venusAccrued = await unitroller.venusAccrued(BUSD.address); - - vaiMintRate = await unitroller.vaiMintRate(); - - vaiController = await unitroller.vaiController(); - - mintedVAIs = await unitroller.mintedVAIs(busdHolder.address); - unitroller.minte; - - mintVAIGuardianPaused = await unitroller.mintVAIGuardianPaused(); - - repayVAIGuardianPaused = await unitroller.repayVAIGuardianPaused(); - - protocolPaused = await unitroller.protocolPaused(); - - venusVAIVaultRate = await unitroller.venusVAIVaultRate(); - - vaiVaultAddress = await unitroller.vaiVaultAddress(); - - releaseStartBlock = await unitroller.releaseStartBlock(); - - minReleaseAmount = await unitroller.minReleaseAmount(); - - treasuryGuardian = await unitroller.treasuryGuardian(); - - treasuryAddress = await unitroller.treasuryAddress(); - - treasuryPercent = await unitroller.treasuryPercent(); - - liquidatorContract = await unitroller.liquidatorContract(); - - comptrollerLens = await unitroller.comptrollerLens(); - - // cheking all public mappings - market = await unitroller.markets(vBUSD.address); - - venusBorrowerIndex = await unitroller.venusBorrowerIndex(vBUSD.address, busdHolder.address); - - venusSupplierIndex = await unitroller.venusSupplierIndex(vBUSD.address, busdHolder.address); - - venusBorrowSpeeds = await unitroller.venusBorrowSpeeds(vUSDT.address); - venusSupplySpeeds = await unitroller.venusSupplySpeeds(vUSDT.address); - }); - }); - }); - - testVip("VIP-Diamond TRON Contract Migration", vipDiamond()); - - describe("Verify Storage slots after VIP execution", async () => { - // These tests checks the storage collision of comptroller while updating it via diamond. - describe("Diamond deployed successfully after VIP execution", async () => { - it("Owner of Diamond unitroller contract should match", async () => { - const diamondUnitrollerAdmin = await diamondUnitroller.admin(); - const pendingAdmin = await diamondUnitroller.pendingAdmin(); - expect(diamondUnitrollerAdmin.toLowerCase()).to.equal(Owner.toLowerCase()); - expect(pendingAdmin.toLowerCase()).to.equal(zeroAddr); - }); - - it("Diamond Unitroller Implementation (comptroller) should match the diamond Proxy Address", async () => { - const comptrollerImplementation = await diamondUnitroller.comptrollerImplementation(); - const pendingComptrollerImplementation = await diamondUnitroller.pendingComptrollerImplementation(); - expect(comptrollerImplementation.toLowerCase()).to.equal(DIAMOND.toLowerCase()); - expect(pendingComptrollerImplementation.toLowerCase()).to.equal(zeroAddr); - }); - }); - - describe("Verify storage layout after VIP execution", async () => { - it("verify all the state before and after upgrade", async () => { - const oracelUpgrade = await diamondUnitroller.oracle(); - expect(oracle).to.equal(oracelUpgrade); - - const maxAssetsAfterUpgrade = await diamondUnitroller.maxAssets(); - expect(maxAssets).to.equal(maxAssetsAfterUpgrade); - - const closeFactorMantissaAfterUpgrade = await diamondUnitroller.closeFactorMantissa(); - expect(closeFactorMantissa).to.equal(closeFactorMantissaAfterUpgrade); - - const liquidationIncentiveMantissaAfterUpgrade = await diamondUnitroller.liquidationIncentiveMantissa(); - expect(liquidationIncentiveMantissa).to.equal(liquidationIncentiveMantissaAfterUpgrade); - - const allMarketsAfterUpgrade = await diamondUnitroller.allMarkets(0); - expect(allMarkets).to.equal(allMarketsAfterUpgrade); - - const venusRateAfterUpgrade = await diamondUnitroller.venusRate(); - expect(venusRate).to.equal(venusRateAfterUpgrade); - - const venusSpeedsAfterUpgrade = await diamondUnitroller.venusSpeeds(BUSD.address); - expect(venusSpeeds).to.equal(venusSpeedsAfterUpgrade); - - const venusSupplyStateAfterUpgrade = await diamondUnitroller.venusSupplyState(BUSD.address); - expect(venusSupplyState.index.toString()).to.equal(venusSupplyStateAfterUpgrade.index.toString()); - - const venusBorrowStateAfterUpgrade = await diamondUnitroller.venusBorrowState(BUSD.address); - expect(venusBorrowState.index.toString()).to.equal(venusBorrowStateAfterUpgrade.index.toString()); - - const venusAccruedAfterUpgrade = await diamondUnitroller.venusAccrued(BUSD.address); - expect(venusAccrued).to.equal(venusAccruedAfterUpgrade); - - const vaiMintRateAfterUpgrade = await diamondUnitroller.vaiMintRate(); - expect(vaiMintRate).to.equal(vaiMintRateAfterUpgrade); - - const vaiControllerUpgrade = await diamondUnitroller.vaiController(); - expect(vaiControllerUpgrade).to.equal(vaiController); - - const mintedVAIsUpgrade = await diamondUnitroller.mintedVAIs(busdHolder.address); - expect(mintedVAIsUpgrade).to.equal(mintedVAIs); - - const mintVAIGuardianPausedUpgrade = await diamondUnitroller.mintVAIGuardianPaused(); - expect(mintVAIGuardianPausedUpgrade).to.equal(mintVAIGuardianPaused); - - const repayVAIGuardianPausedUpgrade = await diamondUnitroller.repayVAIGuardianPaused(); - expect(repayVAIGuardianPausedUpgrade).to.equal(repayVAIGuardianPaused); - - const protocolPausedUpgrade = await diamondUnitroller.protocolPaused(); - expect(protocolPausedUpgrade).to.equal(protocolPaused); - - const venusVAIVaultRateUpgrade = await diamondUnitroller.venusVAIVaultRate(); - expect(venusVAIVaultRateUpgrade).to.equal(venusVAIVaultRate); - - const vaiVaultAddressUpgrade = await diamondUnitroller.vaiVaultAddress(); - expect(vaiVaultAddressUpgrade).to.equal(vaiVaultAddress); - - const releaseStartBlockUpgrade = await diamondUnitroller.releaseStartBlock(); - expect(releaseStartBlockUpgrade).to.equal(releaseStartBlock); - - const minReleaseAmountUpgrade = await diamondUnitroller.minReleaseAmount(); - expect(minReleaseAmountUpgrade).to.equal(minReleaseAmount); - - const treasuryGuardianUpgrade = await diamondUnitroller.treasuryGuardian(); - expect(treasuryGuardian).to.equal(treasuryGuardianUpgrade); - - const treasuryAddressUpgrade = await diamondUnitroller.treasuryAddress(); - expect(treasuryAddress).to.equal(treasuryAddressUpgrade); - - const treasuryPercentUpgrade = await diamondUnitroller.treasuryPercent(); - expect(treasuryPercent).to.equal(treasuryPercentUpgrade); - - const liquidatorContractUpgrade = await diamondUnitroller.liquidatorContract(); - expect(liquidatorContract).to.equal(liquidatorContractUpgrade); - - const comptrollerLensUpgrade = await diamondUnitroller.comptrollerLens(); - expect(comptrollerLens).to.equal(comptrollerLensUpgrade); - - // cheking all public mappings - const marketUpgrade = await diamondUnitroller.markets(vBUSD.address); - expect(market.collateralFactorMantissa).to.equal(marketUpgrade.collateralFactorMantissa); - expect(market.isListed).to.equal(marketUpgrade.isListed); - expect(market.isVenus).to.equal(marketUpgrade.isVenus); - - const venusBorrowerIndexUpgrade = await diamondUnitroller.venusBorrowerIndex(vBUSD.address, busdHolder.address); - expect(venusBorrowerIndex).to.equal(venusBorrowerIndexUpgrade); - - const venusSupplierIndexUpgrade = await diamondUnitroller.venusSupplierIndex(vBUSD.address, busdHolder.address); - expect(venusSupplierIndex).to.equal(venusSupplierIndexUpgrade); - - const venusBorrowSpeedsUpgrade = await diamondUnitroller.venusBorrowSpeeds(vUSDT.address); - const venusSupplySpeedsUpgrade = await diamondUnitroller.venusSupplySpeeds(vUSDT.address); - - expect(venusBorrowSpeeds).to.equal(venusBorrowSpeedsUpgrade); - expect(venusSupplySpeeds).to.equal(venusSupplySpeedsUpgrade); - }); - }); - }); - - describe("Verify states of diamond Contract", () => { - describe("Diamond setters", () => { - it("setting market supply cap", async () => { - const currentSupplyCap = (await diamondUnitroller.supplyCaps(vBUSD.address)).toString(); - await diamondUnitroller.connect(owner)._setMarketSupplyCaps([vBUSD.address], [parseUnits("100000", 18)]); - expect(await diamondUnitroller.supplyCaps(vBUSD.address)).to.equals(parseUnits("100000", 18)); - await diamondUnitroller.connect(owner)._setMarketSupplyCaps([vBUSD.address], [parseUnits(currentSupplyCap, 0)]); - expect(await diamondUnitroller.supplyCaps(vBUSD.address)).to.equals(parseUnits(currentSupplyCap, 0)); - }); - - it("setting close factor", async () => { - const currentCloseFactor = (await diamondUnitroller.closeFactorMantissa()).toString(); - await diamondUnitroller.connect(owner)._setCloseFactor(parseUnits("10000", 18)); - expect(await diamondUnitroller.closeFactorMantissa()).to.equals(parseUnits("10000", 18)); - await diamondUnitroller.connect(owner)._setCloseFactor(parseUnits(currentCloseFactor, 0)); - expect(await diamondUnitroller.closeFactorMantissa()).to.equals(parseUnits(currentCloseFactor, 0)); - }); - - it("setting setting Liquidation Incentive", async () => { - await diamondUnitroller.connect(owner)._setLiquidationIncentive(parseUnits("13", 17)); - expect(await diamondUnitroller.liquidationIncentiveMantissa()).to.equal(parseUnits("13", 17)); - - await diamondUnitroller.connect(owner)._setLiquidationIncentive(parseUnits("11", 17)); - expect(await diamondUnitroller.liquidationIncentiveMantissa()).to.equal(parseUnits("11", 17)); - }); - - it("setting Pause Guardian", async () => { - const currentPauseGuardia = (await diamondUnitroller.pauseGuardian()).toString(); - - await diamondUnitroller.connect(owner)._setPauseGuardian(owner.address); - expect(await diamondUnitroller.pauseGuardian()).to.equal(owner.address); - - await diamondUnitroller.connect(owner)._setPauseGuardian(currentPauseGuardia); - expect(await diamondUnitroller.pauseGuardian()).to.equal(currentPauseGuardia); - }); - - it("setting market borrow cap", async () => { - const currentBorrowCap = (await diamondUnitroller.borrowCaps(vUSDT.address)).toString(); - await diamondUnitroller.connect(owner)._setMarketBorrowCaps([vUSDT.address], [parseUnits("10000", 18)]); - expect(await diamondUnitroller.borrowCaps(vUSDT.address)).to.equal(parseUnits("10000", 18)); - - await diamondUnitroller.connect(owner)._setMarketBorrowCaps([vUSDT.address], [currentBorrowCap]); - expect(await diamondUnitroller.borrowCaps(vUSDT.address)).to.equal(currentBorrowCap); - }); - - it("pausing mint action in vUSDT", async () => { - expect(await diamondUnitroller.connect(owner)._setActionsPaused([vBUSD.address], [0], true)).to.emit( - vBUSD, - "ActionPausedMarket", - ); - await BUSD.connect(busdHolder).approve(vBUSD.address, 1200); - await expect(vBUSD.connect(usdtHolder).mint(1000)).to.be.revertedWith("action is paused"); - - expect(await diamondUnitroller.connect(owner)._setActionsPaused([vBUSD.address], [0], false)).to.emit( - vBUSD, - "ActionPausedMarket", - ); - expect(await vBUSD.connect(busdHolder).mint(10)).to.be.emit(vBUSD, "Mint"); - }); - }); - }); -}); - -forking(29043847, async () => { - let owner, unitroller; - let BUSD: ethers.contract; - let busdHolder: ethers.Signer; - let vBUSD: ethers.contract; - let vUSDT: ethers.contract; - let diamondUnitroller; - - before(async () => { - pretendExecutingVip(vipDiamond()); - unitroller = await ethers.getContractAt("Comptroller", UNITROLLER); - - diamondUnitroller = await ethers.getContractAt("Comptroller", unitroller.address); - - await impersonateAccount(Owner); - owner = await ethers.getSigner(Owner); - const [signer] = await ethers.getSigners(); - await signer.sendTransaction({ - to: owner.address, - value: ethers.BigNumber.from("10000000000000000000"), - data: undefined, - }); - - busdHolder = await initMainnetUser("0xC825AD791A6046991e3706b6342970f6d87e4888"); - - [vBUSD, vUSDT] = await Promise.all( - [VBUSD, VUSDT].map((address: string) => { - return ethers.getContractAt("contracts/Tokens/VTokens/VBep20Delegate.sol:VBep20Delegate", address); - }), - ); - - [BUSD] = await Promise.all( - [vBUSD, vUSDT].map(async (vToken: VBep20) => { - const underlying = await vToken.underlying(); - return ethers.getContractAt("IERC20Upgradeable", underlying); - }), - ); - }); - - describe("Diamond Hooks", () => { - it("Diamond Unitroller Implementation (comptroller) should match the diamond Proxy Address", async () => { - const comptrollerImplementation = await diamondUnitroller.comptrollerImplementation(); - const pendingComptrollerImplementation = await diamondUnitroller.pendingComptrollerImplementation(); - expect(comptrollerImplementation.toLowerCase()).to.equal(DIAMOND.toLowerCase()); - expect(pendingComptrollerImplementation.toLowerCase()).to.equal(zeroAddr); - }); - it("mint vToken vBUSD", async () => { - const vBUSDBalance = await BUSD.balanceOf(vBUSD.address); - const busdHolerBalance = await BUSD.balanceOf(busdHolder.address); - - await BUSD.connect(busdHolder).approve(vBUSD.address, parseUnits("1100", 18)); - expect(await vBUSD.connect(busdHolder).mint(parseUnits("1000", 18))).to.emit(vBUSD, "Mint"); - - const newvBUSDBalance = await BUSD.balanceOf(vBUSD.address); - const newBusdHolerBalance = await BUSD.balanceOf(busdHolder.address); - - expect(newvBUSDBalance).greaterThan(vBUSDBalance); - expect(newBusdHolerBalance).lessThan(busdHolerBalance); - }); - - it("redeem vToken", async () => { - const vBUSDUserBal = await vBUSD.connect(busdHolder).balanceOf(busdHolder.address); - const BUSDBal = await BUSD.connect(busdHolder).balanceOf(busdHolder.address); - - expect(await vBUSD.connect(busdHolder).redeem(1000)).to.emit(vBUSD, "Redeem"); - - const newBUSDBal = await BUSD.connect(busdHolder).balanceOf(busdHolder.address); - const newBUSDUserBal = await vBUSD.connect(busdHolder).balanceOf(busdHolder.address); - - expect(newBUSDUserBal).to.equal(vBUSDUserBal.sub(1000)); - expect(newBUSDBal).greaterThan(BUSDBal); - }); - - it("borrow vToken", async () => { - const busdUserBal = await BUSD.balanceOf(busdHolder.address); - - expect(await vBUSD.connect(busdHolder).borrow(1000)).to.emit(vBUSD, "Borrow"); - - expect((await BUSD.balanceOf(busdHolder.address)).toString()).to.equal(busdUserBal.add(1000)); - }); - - it("Repay vToken", async () => { - const busdUserBal = await BUSD.balanceOf(busdHolder.address); - - expect(await vBUSD.connect(busdHolder).borrow(1000)).to.emit(vBUSD, "Borrow"); - - expect((await BUSD.balanceOf(busdHolder.address)).toString()).to.equal(busdUserBal.add(1000)); - - expect(await vBUSD.connect(busdHolder).repayBorrow(1000)).to.emit(vBUSD, "RepayBorrow"); - - const balanceAfterRepay = await BUSD.balanceOf(busdHolder.address); - expect(balanceAfterRepay).to.equal(busdUserBal); - }); - }); -}); From 16311ecaa43ccd7b94fe2c2f18d036270d0a2b77 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Wed, 7 Jun 2023 12:25:50 +0530 Subject: [PATCH 088/153] refactor: xvs rewards methods. --- .../Diamond/facets/PolicyFacet.sol | 4 +- .../Diamond/facets/RewardFacet.sol | 60 +-------------- .../{FacetHelper.sol => XVSRewardsHelper.sol} | 74 +++++++++++++++++-- .../Comptroller/Diamond/interfaces/IXVS.sol | 9 +++ 4 files changed, 83 insertions(+), 64 deletions(-) rename contracts/Comptroller/Diamond/facets/{FacetHelper.sol => XVSRewardsHelper.sol} (71%) create mode 100644 contracts/Comptroller/Diamond/interfaces/IXVS.sol diff --git a/contracts/Comptroller/Diamond/facets/PolicyFacet.sol b/contracts/Comptroller/Diamond/facets/PolicyFacet.sol index 410eddcf9..f31673a2b 100644 --- a/contracts/Comptroller/Diamond/facets/PolicyFacet.sol +++ b/contracts/Comptroller/Diamond/facets/PolicyFacet.sol @@ -1,13 +1,13 @@ pragma solidity 0.5.16; import "../../../Utils/ErrorReporter.sol"; -import "./FacetHelper.sol"; +import "./XVSRewardsHelper.sol"; import "../../../Tokens/VTokens/VToken.sol"; /** * @dev This facet contains all the hooks used while transferring the assets */ -contract PolicyFacet is FacetHelper { +contract PolicyFacet is XVSRewardsHelper { /// @notice Emitted when a new borrow-side XVS speed is calculated for a market event VenusBorrowSpeedUpdated(VToken indexed vToken, uint newSpeed); diff --git a/contracts/Comptroller/Diamond/facets/RewardFacet.sol b/contracts/Comptroller/Diamond/facets/RewardFacet.sol index f4af1ce49..48a808e9c 100644 --- a/contracts/Comptroller/Diamond/facets/RewardFacet.sol +++ b/contracts/Comptroller/Diamond/facets/RewardFacet.sol @@ -4,26 +4,16 @@ import "../../../Oracle/PriceOracle.sol"; import "../../../Tokens/VTokens/VToken.sol"; import "../../../Utils/ErrorReporter.sol"; import "../../../Governance/IAccessControlManager.sol"; -import "./FacetHelper.sol"; - -interface IXVS { - function balanceOf(address account) external view returns (uint); - - function transfer(address dst, uint rawAmount) external returns (bool); - - function approve(address spender, uint rawAmount) external returns (bool); -} +import "./XVSRewardsHelper.sol"; +import "../interfaces/IXVS.sol"; /** * @dev This facet contains all the methods related to the reward functionality */ -contract RewardFacet is FacetHelper { +contract RewardFacet is XVSRewardsHelper { /// @notice Emitted when Venus is granted by admin event VenusGranted(address recipient, uint amount); - /// @notice Emitted when XVS is distributed to VAI Vault - event DistributedVAIVaultVenus(uint amount); - /** * @notice Claim all the xvs accrued by holder in all markets and VAI * @param holder The address to claim XVS for @@ -127,14 +117,6 @@ contract RewardFacet is FacetHelper { return block.number; } - /** - * @notice Return the address of the XVS token - * @return The address of XVS - */ - function getXVSAddress() public pure returns (address) { - return 0xcF6BB5389c92Bdda8a3747Ddb454cB7a64626C63; - } - /** * @notice Return the address of the XVS vToken * @return The address of XVS vToken @@ -143,42 +125,6 @@ contract RewardFacet is FacetHelper { return 0x151B1e2635A717bcDc836ECd6FbB62B674FE3E1D; } - /** - * @notice Transfer XVS to VAI Vault - */ - function releaseToVault() public { - if (releaseStartBlock == 0 || getBlockNumber() < releaseStartBlock) { - return; - } - - uint256 xvsBalance = IXVS(getXVSAddress()).balanceOf(address(this)); - if (xvsBalance == 0) { - return; - } - - uint256 actualAmount; - uint256 deltaBlocks = sub_(getBlockNumber(), releaseStartBlock); - // releaseAmount = venusVAIVaultRate * deltaBlocks - uint256 _releaseAmount = mul_(venusVAIVaultRate, deltaBlocks); - - if (xvsBalance >= _releaseAmount) { - actualAmount = _releaseAmount; - } else { - actualAmount = xvsBalance; - } - - if (actualAmount < minReleaseAmount) { - return; - } - - releaseStartBlock = getBlockNumber(); - - IXVS(getXVSAddress()).transfer(vaiVaultAddress, actualAmount); - emit DistributedVAIVaultVenus(actualAmount); - - IVAIVault(vaiVaultAddress).updatePendingRewards(); - } - /** * @notice Claim all xvs accrued by the holders * @param holders The addresses to claim XVS for diff --git a/contracts/Comptroller/Diamond/facets/FacetHelper.sol b/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol similarity index 71% rename from contracts/Comptroller/Diamond/facets/FacetHelper.sol rename to contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol index 48336f7bd..32521c401 100644 --- a/contracts/Comptroller/Diamond/facets/FacetHelper.sol +++ b/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol @@ -1,12 +1,32 @@ pragma solidity 0.5.16; import "../../../Utils/ExponentialNoError.sol"; +import "../interfaces/IXVS.sol"; import "./FacetBase.sol"; /** * @dev This contract contains internal functions used in RewardFacet and PolicyFacet */ -contract FacetHelper is ComptrollerErrorReporter, ExponentialNoError, FacetBase { +contract XVSRewardsHelper is ComptrollerErrorReporter, ExponentialNoError, FacetBase { + /// @notice Emitted when XVS is distributed to VAI Vault + event DistributedVAIVaultVenus(uint amount); + + /// @notice Emitted when XVS is distributed to a borrower + event DistributedBorrowerVenus( + VToken indexed vToken, + address indexed borrower, + uint venusDelta, + uint venusBorrowIndex + ); + + /// @notice Emitted when XVS is distributed to a supplier + event DistributedSupplierVenus( + VToken indexed vToken, + address indexed supplier, + uint venusDelta, + uint venusSupplyIndex + ); + /** * @notice Accrue XVS to the market by updating the borrow index * @param vToken The market whose borrow index to update @@ -61,7 +81,7 @@ contract FacetHelper is ComptrollerErrorReporter, ExponentialNoError, FacetBase */ function distributeSupplierVenus(address vToken, address supplier) internal { if (address(vaiVaultAddress) != address(0)) { - // releaseToVault(); + releaseToVault(); } uint supplyIndex = venusSupplyState[vToken].index; uint supplierIndex = venusSupplierIndex[vToken][supplier]; @@ -79,7 +99,7 @@ contract FacetHelper is ComptrollerErrorReporter, ExponentialNoError, FacetBase uint supplierDelta = mul_(VToken(vToken).balanceOf(supplier), deltaIndex); // Addition of supplierAccrued and supplierDelta venusAccrued[supplier] = add_(venusAccrued[supplier], supplierDelta); - // emit DistributedSupplierVenus(VToken(vToken), supplier, supplierDelta, supplyIndex); + emit DistributedSupplierVenus(VToken(vToken), supplier, supplierDelta, supplyIndex); } /** @@ -94,7 +114,7 @@ contract FacetHelper is ComptrollerErrorReporter, ExponentialNoError, FacetBase ExponentialNoError.Exp memory marketBorrowIndex ) internal { if (address(vaiVaultAddress) != address(0)) { - // releaseToVault(); + releaseToVault(); } uint borrowIndex = venusBorrowState[vToken].index; uint borrowerIndex = venusBorrowerIndex[vToken][borrower]; @@ -110,6 +130,50 @@ contract FacetHelper is ComptrollerErrorReporter, ExponentialNoError, FacetBase Double memory deltaIndex = Double({ mantissa: sub_(borrowIndex, borrowerIndex) }); uint borrowerDelta = mul_(div_(VToken(vToken).borrowBalanceStored(borrower), marketBorrowIndex), deltaIndex); venusAccrued[borrower] = add_(venusAccrued[borrower], borrowerDelta); - // emit DistributedBorrowerVenus(VToken(vToken), borrower, borrowerDelta, borrowIndex); + emit DistributedBorrowerVenus(VToken(vToken), borrower, borrowerDelta, borrowIndex); + } + + /** + * @notice Transfer XVS to VAI Vault + */ + function releaseToVault() public { + if (releaseStartBlock == 0 || getBlockNumber() < releaseStartBlock) { + return; + } + + uint256 xvsBalance = IXVS(getXVSAddress()).balanceOf(address(this)); + if (xvsBalance == 0) { + return; + } + + uint256 actualAmount; + uint256 deltaBlocks = sub_(getBlockNumber(), releaseStartBlock); + // releaseAmount = venusVAIVaultRate * deltaBlocks + uint256 _releaseAmount = mul_(venusVAIVaultRate, deltaBlocks); + + if (xvsBalance >= _releaseAmount) { + actualAmount = _releaseAmount; + } else { + actualAmount = xvsBalance; + } + + if (actualAmount < minReleaseAmount) { + return; + } + + releaseStartBlock = getBlockNumber(); + + IXVS(getXVSAddress()).transfer(vaiVaultAddress, actualAmount); + emit DistributedVAIVaultVenus(actualAmount); + + IVAIVault(vaiVaultAddress).updatePendingRewards(); + } + + /** + * @notice Return the address of the XVS token + * @return The address of XVS + */ + function getXVSAddress() public pure returns (address) { + return 0xcF6BB5389c92Bdda8a3747Ddb454cB7a64626C63; } } diff --git a/contracts/Comptroller/Diamond/interfaces/IXVS.sol b/contracts/Comptroller/Diamond/interfaces/IXVS.sol new file mode 100644 index 000000000..14d90a6b5 --- /dev/null +++ b/contracts/Comptroller/Diamond/interfaces/IXVS.sol @@ -0,0 +1,9 @@ +pragma solidity 0.5.16; + +interface IXVS { + function balanceOf(address account) external view returns (uint); + + function transfer(address dst, uint rawAmount) external returns (bool); + + function approve(address spender, uint rawAmount) external returns (bool); +} From 5cdaa2632cf88e98986231cf01bc97e8f0ce11a8 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Wed, 7 Jun 2023 13:22:07 +0530 Subject: [PATCH 089/153] fix: pr comments, used external instead of public --- contracts/Comptroller/Comptroller.sol | 2 +- .../Comptroller/Diamond/facets/FacetBase.sol | 12 +----- .../Diamond/facets/MarketFacet.sol | 20 ++++++---- .../Diamond/facets/PolicyFacet.sol | 36 +++++++++-------- .../Diamond/facets/RewardFacet.sol | 11 +---- .../Diamond/facets/SetterFacet.sol | 40 +++++++++---------- .../Diamond/interfaces/IPolicyFacet.sol | 2 +- 7 files changed, 58 insertions(+), 65 deletions(-) diff --git a/contracts/Comptroller/Comptroller.sol b/contracts/Comptroller/Comptroller.sol index 6a15067ba..c5088dcb7 100644 --- a/contracts/Comptroller/Comptroller.sol +++ b/contracts/Comptroller/Comptroller.sol @@ -101,7 +101,7 @@ contract Comptroller is ComptrollerV11Storage, ComptrollerInterfaceG2, Comptroll /// @notice Emitted when Venus is granted by admin event VenusGranted(address recipient, uint amount); - /// @notice Emitted whe ComptrollerLens address is changed + /// @notice Emitted when ComptrollerLens address is changed event NewComptrollerLens(address oldComptrollerLens, address newComptrollerLens); /// @notice Emitted when supply cap for a vToken is changed diff --git a/contracts/Comptroller/Diamond/facets/FacetBase.sol b/contracts/Comptroller/Diamond/facets/FacetBase.sol index da900f281..62249e5a0 100644 --- a/contracts/Comptroller/Diamond/facets/FacetBase.sol +++ b/contracts/Comptroller/Diamond/facets/FacetBase.sol @@ -1,7 +1,7 @@ pragma solidity 0.5.16; + import "../../../Tokens/VTokens/VToken.sol"; import "../../../Utils/ErrorReporter.sol"; -import "../../../Utils/ExponentialNoError.sol"; import "../../../Comptroller/ComptrollerStorage.sol"; import "../../../Governance/IAccessControlManager.sol"; @@ -49,16 +49,6 @@ contract FacetBase is ComptrollerV12Storage { require(IAccessControlManager(accessControl).isAllowedToCall(msg.sender, functionSig), "access denied"); } - /** - * @notice Returns whether the given account is entered in the given asset - * @param account The address of the account to check - * @param vToken The vToken to check - * @return True if the account is in the asset, otherwise false. - */ - function checkMembership(address account, VToken vToken) external view returns (bool) { - return markets[address(vToken)].accountMembership[account]; - } - /** * @notice Checks if a certain action is paused on a market * @param action Action id diff --git a/contracts/Comptroller/Diamond/facets/MarketFacet.sol b/contracts/Comptroller/Diamond/facets/MarketFacet.sol index 805a878e5..81bec35f8 100644 --- a/contracts/Comptroller/Diamond/facets/MarketFacet.sol +++ b/contracts/Comptroller/Diamond/facets/MarketFacet.sol @@ -7,6 +7,9 @@ import "../../../Tokens/VTokens/VToken.sol"; * @dev This facet contains all the methods related to the market's management in the pool */ contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase { + /// @notice Emitted when an admin supports a market + event MarketListed(VToken vToken); + /// @notice Emitted when an account enters a market event MarketEntered(VToken vToken, address account); @@ -34,7 +37,7 @@ contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase address vTokenBorrowed, address vTokenCollateral, uint actualRepayAmount - ) public view returns (uint, uint) { + ) external view returns (uint, uint) { (uint err, uint seizeTokens) = comptrollerLens.liquidateCalculateSeizeTokens( address(this), vTokenBorrowed, @@ -50,7 +53,7 @@ contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase * @param vToken The vToken to check * @return True if the account is in the asset, otherwise false. */ - function checkMembership(address account, VToken vToken) public view returns (bool) { + function checkMembership(address account, VToken vToken) external view returns (bool) { return markets[address(vToken)].accountMembership[account]; } @@ -59,7 +62,7 @@ contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase * @param vTokens The list of addresses of the vToken markets to be enabled * @return Success indicator for whether each corresponding market was entered */ - function enterMarkets(address[] memory vTokens) public returns (uint[] memory) { + function enterMarkets(address[] calldata vTokens) external returns (uint[] memory) { uint len = vTokens.length; uint[] memory results = new uint[](len); @@ -80,7 +83,7 @@ contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase * @param vTokenAddress The address of the asset to be removed * @return Whether or not the account successfully exited the market */ - function exitMarket(address vTokenAddress) public returns (uint) { + function exitMarket(address vTokenAddress) external returns (uint) { checkActionPauseState(vTokenAddress, Action.EXIT_MARKET); VToken vToken = VToken(vTokenAddress); @@ -117,7 +120,7 @@ contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase for (; i < len; ++i) { if (userAssetList[i] == vToken) { userAssetList[i] = userAssetList[len - 1]; - userAssetList.pop(); + userAssetList.length--; break; } } @@ -136,22 +139,25 @@ contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase * @param vToken The address of the market (token) to list * @return uint 0=success, otherwise a failure. (See enum Error for details) */ - function _supportMarket(VToken vToken) public returns (uint) { + function _supportMarket(VToken vToken) external returns (uint) { ensureAllowed("_supportMarket(address)"); if (markets[address(vToken)].isListed) { return fail(Error.MARKET_ALREADY_LISTED, FailureInfo.SUPPORT_MARKET_EXISTS); } + vToken.isVToken(); // Sanity check to make sure its really a VToken + // Note that isVenus is not in active use anymore Market storage newMarket = markets[address(vToken)]; newMarket.isListed = true; newMarket.isVenus = false; newMarket.collateralFactorMantissa = 0; + _addMarketInternal(vToken); _initializeMarket(address(vToken)); - //emit MarketListed(vToken); + emit MarketListed(vToken); return uint(Error.NO_ERROR); } diff --git a/contracts/Comptroller/Diamond/facets/PolicyFacet.sol b/contracts/Comptroller/Diamond/facets/PolicyFacet.sol index f31673a2b..f936ddc79 100644 --- a/contracts/Comptroller/Diamond/facets/PolicyFacet.sol +++ b/contracts/Comptroller/Diamond/facets/PolicyFacet.sol @@ -21,7 +21,7 @@ contract PolicyFacet is XVSRewardsHelper { * @param mintAmount The amount of underlying being supplied to the market in exchange for tokens * @return 0 if the mint is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) */ - function mintAllowed(address vToken, address minter, uint mintAmount) public returns (uint) { + function mintAllowed(address vToken, address minter, uint mintAmount) external returns (uint) { // Pausing is a very serious situation - we revert to sound the alarms checkProtocolPauseState(); checkActionPauseState(vToken, Action.MINT); @@ -42,7 +42,7 @@ contract PolicyFacet is XVSRewardsHelper { return uint(Error.NO_ERROR); } - function mintVerify(address vToken, address minter, uint actualMintAmount, uint mintTokens) public {} + function mintVerify(address vToken, address minter, uint actualMintAmount, uint mintTokens) external {} /** * @notice Checks if the account should be allowed to redeem tokens in the given market @@ -51,7 +51,7 @@ contract PolicyFacet is XVSRewardsHelper { * @param redeemTokens The number of vTokens to exchange for the underlying asset in the market * @return 0 if the redeem is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) */ - function redeemAllowed(address vToken, address redeemer, uint redeemTokens) public returns (uint) { + function redeemAllowed(address vToken, address redeemer, uint redeemTokens) external returns (uint) { checkProtocolPauseState(); checkActionPauseState(vToken, Action.REDEEM); @@ -75,7 +75,7 @@ contract PolicyFacet is XVSRewardsHelper { * @param redeemTokens The number of tokens being redeemed */ // solhint-disable-next-line no-unused-vars - function redeemVerify(address vToken, address redeemer, uint redeemAmount, uint redeemTokens) public pure { + function redeemVerify(address vToken, address redeemer, uint redeemAmount, uint redeemTokens) external pure { require(redeemTokens != 0 || redeemAmount == 0, "redeemTokens zero"); } @@ -86,7 +86,7 @@ contract PolicyFacet is XVSRewardsHelper { * @param borrowAmount The amount of underlying the account would borrow * @return 0 if the borrow is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) */ - function borrowAllowed(address vToken, address borrower, uint borrowAmount) public returns (uint) { + function borrowAllowed(address vToken, address borrower, uint borrowAmount) external returns (uint) { // Pausing is a very serious situation - we revert to sound the alarms checkProtocolPauseState(); checkActionPauseState(vToken, Action.BORROW); @@ -143,7 +143,7 @@ contract PolicyFacet is XVSRewardsHelper { * @param borrowAmount The amount of the underlying asset requested to borrow */ // solhint-disable-next-line no-unused-vars - function borrowVerify(address vToken, address borrower, uint borrowAmount) public {} + function borrowVerify(address vToken, address borrower, uint borrowAmount) external {} /** * @notice Checks if the account should be allowed to repay a borrow in the given market @@ -160,7 +160,7 @@ contract PolicyFacet is XVSRewardsHelper { address borrower, // solhint-disable-next-line no-unused-vars uint repayAmount - ) public returns (uint) { + ) external returns (uint) { checkProtocolPauseState(); checkActionPauseState(vToken, Action.REPAY); ensureListed(markets[vToken]); @@ -186,7 +186,7 @@ contract PolicyFacet is XVSRewardsHelper { address borrower, uint actualRepayAmount, uint borrowerIndex - ) public {} + ) external {} /** * @notice Checks if the liquidation should be allowed to occur @@ -202,7 +202,7 @@ contract PolicyFacet is XVSRewardsHelper { address liquidator, address borrower, uint repayAmount - ) public view returns (uint) { + ) external view returns (uint) { checkProtocolPauseState(); // if we want to pause liquidating to vTokenCollateral, we should pause seizing @@ -248,7 +248,7 @@ contract PolicyFacet is XVSRewardsHelper { address borrower, uint actualRepayAmount, uint seizeTokens - ) public {} + ) external {} /** * @notice Checks if the seizing of assets should be allowed to occur @@ -264,7 +264,7 @@ contract PolicyFacet is XVSRewardsHelper { address liquidator, address borrower, uint seizeTokens // solhint-disable-line no-unused-vars - ) public returns (uint) { + ) external returns (uint) { // Pausing is a very serious situation - we revert to sound the alarms checkProtocolPauseState(); checkActionPauseState(vTokenCollateral, Action.SEIZE); @@ -302,7 +302,7 @@ contract PolicyFacet is XVSRewardsHelper { address liquidator, address borrower, uint seizeTokens - ) public {} + ) external {} /** * @notice Checks if the account should be allowed to transfer tokens in the given market @@ -312,7 +312,7 @@ contract PolicyFacet is XVSRewardsHelper { * @param transferTokens The number of vTokens to transfer * @return 0 if the transfer is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) */ - function transferAllowed(address vToken, address src, address dst, uint transferTokens) public returns (uint) { + function transferAllowed(address vToken, address src, address dst, uint transferTokens) external returns (uint) { // Pausing is a very serious situation - we revert to sound the alarms checkProtocolPauseState(); checkActionPauseState(vToken, Action.TRANSFER); @@ -340,7 +340,7 @@ contract PolicyFacet is XVSRewardsHelper { * @param transferTokens The number of vTokens to transfer */ // solhint-disable-next-line no-unused-vars - function transferVerify(address vToken, address src, address dst, uint transferTokens) public {} + function transferVerify(address vToken, address src, address dst, uint transferTokens) external {} /** * @notice Determine the current account liquidity wrt collateral requirements @@ -348,7 +348,7 @@ contract PolicyFacet is XVSRewardsHelper { account liquidity in excess of collateral requirements, * account shortfall below collateral requirements) */ - function getAccountLiquidity(address account) public view returns (uint, uint, uint) { + function getAccountLiquidity(address account) external view returns (uint, uint, uint) { (Error err, uint liquidity, uint shortfall) = getHypotheticalAccountLiquidityInternal( account, VToken(address(0)), @@ -366,7 +366,11 @@ contract PolicyFacet is XVSRewardsHelper { * @param supplySpeeds New XVS speed for supply * @param borrowSpeeds New XVS speed for borrow */ - function _setVenusSpeeds(VToken[] memory vTokens, uint[] memory supplySpeeds, uint[] memory borrowSpeeds) public { + function _setVenusSpeeds( + VToken[] calldata vTokens, + uint[] calldata supplySpeeds, + uint[] calldata borrowSpeeds + ) external { ensureAdminOr(comptrollerImplementation); uint numTokens = vTokens.length; diff --git a/contracts/Comptroller/Diamond/facets/RewardFacet.sol b/contracts/Comptroller/Diamond/facets/RewardFacet.sol index 48a808e9c..484468497 100644 --- a/contracts/Comptroller/Diamond/facets/RewardFacet.sol +++ b/contracts/Comptroller/Diamond/facets/RewardFacet.sol @@ -1,9 +1,6 @@ pragma solidity 0.5.16; -import "../../../Oracle/PriceOracle.sol"; import "../../../Tokens/VTokens/VToken.sol"; -import "../../../Utils/ErrorReporter.sol"; -import "../../../Governance/IAccessControlManager.sol"; import "./XVSRewardsHelper.sol"; import "../interfaces/IXVS.sol"; @@ -48,7 +45,7 @@ contract RewardFacet is XVSRewardsHelper { * @notice Claim all the xvs accrued by holder in all markets, a shorthand for `claimVenus` with collateral set to `true` * @param holder The address to claim XVS for */ - function claimVenusAsCollateral(address holder) public { + function claimVenusAsCollateral(address holder) external { address[] memory holders = new address[](1); holders[0] = holder; claimVenus(holders, allMarkets, true, true, true); @@ -106,17 +103,13 @@ contract RewardFacet is XVSRewardsHelper { * @param recipient The address of the recipient to transfer XVS to * @param amount The amount of XVS to (possibly) transfer */ - function _grantXVS(address recipient, uint amount) public { + function _grantXVS(address recipient, uint amount) external { ensureAdminOr(comptrollerImplementation); uint amountLeft = grantXVSInternal(recipient, amount, 0, false); require(amountLeft == 0, "insufficient xvs for grant"); emit VenusGranted(recipient, amount); } - function getBlockNumber() public view returns (uint) { - return block.number; - } - /** * @notice Return the address of the XVS vToken * @return The address of XVS vToken diff --git a/contracts/Comptroller/Diamond/facets/SetterFacet.sol b/contracts/Comptroller/Diamond/facets/SetterFacet.sol index 44e6d96d7..523f6e72c 100644 --- a/contracts/Comptroller/Diamond/facets/SetterFacet.sol +++ b/contracts/Comptroller/Diamond/facets/SetterFacet.sol @@ -3,7 +3,6 @@ pragma solidity 0.5.16; import "../../../Oracle/PriceOracle.sol"; import "../../../Tokens/VTokens/VToken.sol"; import "../../../Utils/ErrorReporter.sol"; -import "../../../Governance/IAccessControlManager.sol"; import "./FacetBase.sol"; /** @@ -46,7 +45,7 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase /// @notice Emitted when liquidator adress is changed event NewLiquidatorContract(address oldLiquidatorContract, address newLiquidatorContract); - /// @notice Emitted whe ComptrollerLens address is changed + /// @notice Emitted when ComptrollerLens address is changed event NewComptrollerLens(address oldComptrollerLens, address newComptrollerLens); /// @notice Emitted when supply cap for a vToken is changed @@ -72,7 +71,7 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase * @dev Admin function to set a new price oracle * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) */ - function _setPriceOracle(PriceOracle newOracle) public returns (uint) { + function _setPriceOracle(PriceOracle newOracle) external returns (uint) { // Check caller is admin ensureAdmin(); ensureNonzeroAddress(address(newOracle)); @@ -95,7 +94,7 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase * @param newCloseFactorMantissa New close factor, scaled by 1e18 * @return uint 0=success, otherwise will revert */ - function _setCloseFactor(uint newCloseFactorMantissa) public returns (uint) { + function _setCloseFactor(uint newCloseFactorMantissa) external returns (uint) { // Check caller is admin ensureAdmin(); @@ -112,7 +111,7 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase * @param newAccessControlAddress New address for the access control * @return uint 0=success, otherwise will revert */ - function _setAccessControl(address newAccessControlAddress) public returns (uint) { + function _setAccessControl(address newAccessControlAddress) external returns (uint) { // Check caller is admin ensureAdmin(); ensureNonzeroAddress(newAccessControlAddress); @@ -131,7 +130,7 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase * @param newCollateralFactorMantissa The new collateral factor, scaled by 1e18 * @return uint 0=success, otherwise a failure. (See ErrorReporter for details) */ - function _setCollateralFactor(VToken vToken, uint newCollateralFactorMantissa) public returns (uint) { + function _setCollateralFactor(VToken vToken, uint newCollateralFactorMantissa) external returns (uint) { // Check caller is allowed by access control manager ensureAllowed("_setCollateralFactor(address,uint256)"); ensureNonzeroAddress(address(vToken)); @@ -169,7 +168,7 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase * @param newLiquidationIncentiveMantissa New liquidationIncentive scaled by 1e18 * @return uint 0=success, otherwise a failure. (See ErrorReporter for details) */ - function _setLiquidationIncentive(uint newLiquidationIncentiveMantissa) public returns (uint) { + function _setLiquidationIncentive(uint newLiquidationIncentiveMantissa) external returns (uint) { ensureAllowed("_setLiquidationIncentive(uint256)"); require(newLiquidationIncentiveMantissa >= 1e18, "incentive must be over 1e18"); @@ -185,7 +184,7 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase return uint(Error.NO_ERROR); } - function _setLiquidatorContract(address newLiquidatorContract_) public { + function _setLiquidatorContract(address newLiquidatorContract_) external { // Check caller is admin ensureAdmin(); address oldLiquidatorContract = liquidatorContract; @@ -198,7 +197,7 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase * @param newPauseGuardian The address of the new Pause Guardian * @return uint 0=success, otherwise a failure. (See enum Error for details) */ - function _setPauseGuardian(address newPauseGuardian) public returns (uint) { + function _setPauseGuardian(address newPauseGuardian) external returns (uint) { ensureAdmin(); ensureNonzeroAddress(newPauseGuardian); @@ -219,7 +218,7 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase * @param vTokens The addresses of the markets (tokens) to change the borrow caps for * @param newBorrowCaps The new borrow cap values in underlying to be set. A value of 0 corresponds to unlimited borrowing. */ - function _setMarketBorrowCaps(VToken[] memory vTokens, uint[] memory newBorrowCaps) public { + function _setMarketBorrowCaps(VToken[] calldata vTokens, uint[] calldata newBorrowCaps) external { ensureAllowed("_setMarketBorrowCaps(address[],uint256[])"); uint numMarkets = vTokens.length; @@ -239,7 +238,7 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase * @param vTokens The addresses of the markets (tokens) to change the supply caps for * @param newSupplyCaps The new supply cap values in underlying to be set. A value of 0 corresponds to Minting NotAllowed. */ - function _setMarketSupplyCaps(VToken[] memory vTokens, uint256[] memory newSupplyCaps) public { + function _setMarketSupplyCaps(VToken[] calldata vTokens, uint256[] calldata newSupplyCaps) external { ensureAllowed("_setMarketSupplyCaps(address[],uint256[])"); uint numMarkets = vTokens.length; @@ -256,7 +255,7 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase /** * @notice Set whole protocol pause/unpause state */ - function _setProtocolPaused(bool state) public returns (bool) { + function _setProtocolPaused(bool state) external returns (bool) { ensureAllowed("_setProtocolPaused(bool)"); protocolPaused = state; @@ -270,7 +269,7 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase * @param actions List of action ids to pause/unpause * @param paused The new paused state (true=paused, false=unpaused) */ - function _setActionsPaused(address[] memory markets, Action[] memory actions, bool paused) public { + function _setActionsPaused(address[] calldata markets, Action[] calldata actions, bool paused) external { ensureAllowed("_setActionsPaused(address[],uint256[],bool)"); uint256 numMarkets = markets.length; @@ -299,7 +298,7 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase * @dev Admin function to set a new VAI controller * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) */ - function _setVAIController(VAIControllerInterface vaiController_) public returns (uint) { + function _setVAIController(VAIControllerInterface vaiController_) external returns (uint) { // Check caller is admin ensureAdmin(); ensureNonzeroAddress(address(vaiController_)); @@ -311,7 +310,7 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase return uint(Error.NO_ERROR); } - function _setVAIMintRate(uint newVAIMintRate) public returns (uint) { + function _setVAIMintRate(uint newVAIMintRate) external returns (uint) { // Check caller is admin ensureAdmin(); uint oldVAIMintRate = vaiMintRate; @@ -327,7 +326,7 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase * @param amount The amount of VAI to set to the account * @return The number of minted VAI by `owner` */ - function setMintedVAIOf(address owner, uint amount) public returns (uint) { + function setMintedVAIOf(address owner, uint amount) external returns (uint) { checkProtocolPauseState(); // Pausing is a very serious situation - we revert to sound the alarms @@ -344,12 +343,13 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase address newTreasuryGuardian, address newTreasuryAddress, uint newTreasuryPercent - ) public returns (uint) { + ) external returns (uint) { // Check caller is admin ensureAdminOr(treasuryGuardian); require(newTreasuryPercent < 1e18, "treasury percent cap overflow"); ensureNonzeroAddress(newTreasuryGuardian); + ensureNonzeroAddress(newTreasuryAddress); address oldTreasuryGuardian = treasuryGuardian; address oldTreasuryAddress = treasuryAddress; @@ -371,7 +371,7 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase /** * @dev Set ComptrollerLens contract address */ - function _setComptrollerLens(ComptrollerLensInterface comptrollerLens_) public returns (uint) { + function _setComptrollerLens(ComptrollerLensInterface comptrollerLens_) external returns (uint) { ensureAdmin(); ensureNonzeroAddress(address(comptrollerLens_)); address oldComptrollerLens = address(comptrollerLens); @@ -386,7 +386,7 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase * @notice Set the amount of XVS distributed per block to VAI Vault * @param venusVAIVaultRate_ The amount of XVS wei per block to distribute to VAI Vault */ - function _setVenusVAIVaultRate(uint venusVAIVaultRate_) public { + function _setVenusVAIVaultRate(uint venusVAIVaultRate_) external { ensureAdmin(); uint oldVenusVAIVaultRate = venusVAIVaultRate; venusVAIVaultRate = venusVAIVaultRate_; @@ -399,7 +399,7 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase * @param releaseStartBlock_ The start block of release to VAI Vault * @param minReleaseAmount_ The minimum release amount to VAI Vault */ - function _setVAIVaultInfo(address vault_, uint256 releaseStartBlock_, uint256 minReleaseAmount_) public { + function _setVAIVaultInfo(address vault_, uint256 releaseStartBlock_, uint256 minReleaseAmount_) external { ensureAdmin(); ensureNonzeroAddress(vault_); diff --git a/contracts/Comptroller/Diamond/interfaces/IPolicyFacet.sol b/contracts/Comptroller/Diamond/interfaces/IPolicyFacet.sol index 1e3b647d8..e3b103245 100644 --- a/contracts/Comptroller/Diamond/interfaces/IPolicyFacet.sol +++ b/contracts/Comptroller/Diamond/interfaces/IPolicyFacet.sol @@ -9,7 +9,7 @@ interface IPolicyFacet { function redeemAllowed(address vToken, address redeemer, uint redeemTokens) external returns (uint); - function redeemVerify(address vToken, address redeemer, uint redeemAmount, uint redeemTokens) external; + function redeemVerify(address vToken, address redeemer, uint redeemAmount, uint redeemTokens) external pure; function borrowAllowed(address vToken, address borrower, uint borrowAmount) external returns (uint); From 53a4dec8c9eac735959eb1d8e4c8f9f8205e2b5b Mon Sep 17 00:00:00 2001 From: defcon022 Date: Wed, 7 Jun 2023 13:36:28 +0530 Subject: [PATCH 090/153] fix: pr comments, undo unwanted changes --- script/hardhat/fork/vip-99.ts | 4 +--- script/hardhat/fork/vip-framework/index.ts | 15 ++++----------- 2 files changed, 5 insertions(+), 14 deletions(-) diff --git a/script/hardhat/fork/vip-99.ts b/script/hardhat/fork/vip-99.ts index c275cb8b4..c4c3fc47f 100644 --- a/script/hardhat/fork/vip-99.ts +++ b/script/hardhat/fork/vip-99.ts @@ -91,10 +91,8 @@ forking(25918391, () => { forking(25918391, () => { let comptroller: Comptroller; let busd: IERC20Upgradeable; - let usdc: IERC20Upgradeable; // eslint-disable-line let usdt: IERC20Upgradeable; let btc: IERC20Upgradeable; - let eth: IERC20Upgradeable; // eslint-disable-line let vBUSD: VBep20Delegate; let vUSDC: VBep20Delegate; let vUSDT: VBep20Delegate; @@ -110,7 +108,7 @@ forking(25918391, () => { return ethers.getContractAt("VBep20Delegate", address); }), ); - [busd, usdc, usdt, btc, eth] = await Promise.all( + [busd, , usdt, btc] = await Promise.all( [vBUSD, vUSDC, vUSDT, vBTC, vETH].map(async (vToken: VBep20) => { const underlying = await vToken.underlying(); return ethers.getContractAt("IERC20Upgradeable", underlying); diff --git a/script/hardhat/fork/vip-framework/index.ts b/script/hardhat/fork/vip-framework/index.ts index 6d568eb3c..e59a031be 100644 --- a/script/hardhat/fork/vip-framework/index.ts +++ b/script/hardhat/fork/vip-framework/index.ts @@ -7,19 +7,13 @@ import { ethers } from "hardhat"; import { Proposal } from "./types"; import { getCalldatas, initMainnetUser, setForkBlock } from "./utils"; -let DEFAULT_PROPOSER_ADDRESS = "0x55A9f5374Af30E3045FB491f1da3C2E8a74d168D"; +const DEFAULT_PROPOSER_ADDRESS = "0x55A9f5374Af30E3045FB491f1da3C2E8a74d168D"; const DEFAULT_SUPPORTER_ADDRESS = "0xc444949e0054a23c44fc45789738bdf64aed2391"; -let GOVERNOR_PROXY = "0x2d56dC077072B53571b8252008C60e945108c75a"; -let NORMAL_TIMELOCK = "0x939bD8d64c0A9583A7Dcea9933f7b21697ab6396"; +const GOVERNOR_PROXY = "0x2d56dC077072B53571b8252008C60e945108c75a"; +const NORMAL_TIMELOCK = "0x939bD8d64c0A9583A7Dcea9933f7b21697ab6396"; const NORMAL_TIMELOCK_DELAY = 172800; const VOTING_PERIOD = 28800; -if (process.env.FORK_TESTNET === "true") { - DEFAULT_PROPOSER_ADDRESS = "0x2Ce1d0ffD7E869D9DF33e28552b12DdDed326706"; - GOVERNOR_PROXY = "0x5573422a1a59385c247ec3a66b93b7c08ec2f8f2"; - NORMAL_TIMELOCK = "0xce10739590001705F7FF231611ba4A48B2820327"; -} - export const forking = (blockNumber: number, fn: () => void) => { describe(`At block #${blockNumber}`, () => { before(async () => { @@ -90,7 +84,6 @@ export const testVip = (description: string, proposal: Proposal, options: Testin let proposalId: number; it("can be proposed", async () => { - await mine(150); const { targets, signatures, values, meta } = proposal; const proposalIdBefore = await governorProxy.callStatic.proposalCount(); let tx; @@ -109,7 +102,7 @@ export const testVip = (description: string, proposal: Proposal, options: Testin }); it("should be voteable", async () => { - await mine(150); + await mine(); await expect(governorProxy.connect(proposer).castVote(proposalId, 1)).to.emit(governorProxy, "VoteCast"); await expect(governorProxy.connect(supporter).castVote(proposalId, 1)).to.emit(governorProxy, "VoteCast"); }); From 68ef09b6792c90d85d908f0428c79305165fd09d Mon Sep 17 00:00:00 2001 From: defcon022 Date: Fri, 9 Jun 2023 19:04:04 +0530 Subject: [PATCH 091/153] fix: pr comments --- contracts/Comptroller/Diamond/Diamond.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/Comptroller/Diamond/Diamond.sol b/contracts/Comptroller/Diamond/Diamond.sol index 6411da282..4fc20b27c 100644 --- a/contracts/Comptroller/Diamond/Diamond.sol +++ b/contracts/Comptroller/Diamond/Diamond.sol @@ -69,7 +69,7 @@ contract Diamond is ComptrollerV12Storage { } /** - * @notice Replace function selectors to the facet's address mapping. + * @notice Replace facet's address mapping for function selectors i.e selectors already associate to any other existing facet. * @param _facetAddress Address of the facet. * @param _functionSelectors Array of function selectors need to replace in the mapping. */ @@ -162,7 +162,7 @@ contract Diamond is ComptrollerV12Storage { facetFunctionSelectors[lastFacetAddress].facetAddressPosition = facetAddressPosition; } facetAddresses.pop(); - delete facetFunctionSelectors[_facetAddress].facetAddressPosition; + delete facetFunctionSelectors[_facetAddress]; } } From fc2835eaa675c12d5833f8169674d531d04ce3e9 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Wed, 14 Jun 2023 11:41:53 +0530 Subject: [PATCH 092/153] refactor: removed comptroller.sol dependency --- .../Comptroller/ComptrollerInterface.sol | 5 ++++ contracts/Lens/ComptrollerLens.sol | 27 ++++++++++++------- contracts/Lens/SnapshotLens.sol | 12 ++++----- contracts/Tokens/VAI/VAIController.sol | 6 +++-- .../Tokens/VAI/VAIControllerInterface.sol | 2 +- 5 files changed, 32 insertions(+), 20 deletions(-) diff --git a/contracts/Comptroller/ComptrollerInterface.sol b/contracts/Comptroller/ComptrollerInterface.sol index c8695bc86..19628d533 100644 --- a/contracts/Comptroller/ComptrollerInterface.sol +++ b/contracts/Comptroller/ComptrollerInterface.sol @@ -2,6 +2,7 @@ pragma solidity ^0.5.16; import "../Tokens/VTokens/VToken.sol"; import "../Oracle/PriceOracle.sol"; +import "../Tokens/VAI/VAIControllerInterface.sol"; contract ComptrollerInterfaceG1 { /// @notice Indicator that this is a Comptroller contract (for inspection) @@ -138,6 +139,10 @@ contract ComptrollerInterface is ComptrollerInterfaceG4 { function venusSupplyState(address) external view returns (uint224, uint32); function approvedDelegates(address borrower, address delegate) external view returns (bool); + + function vaiController() external view returns (VAIControllerInterface); + + function liquidationIncentiveMantissa() external view returns (uint); } interface IVAIVault { diff --git a/contracts/Lens/ComptrollerLens.sol b/contracts/Lens/ComptrollerLens.sol index b5a296a47..77f0502d3 100644 --- a/contracts/Lens/ComptrollerLens.sol +++ b/contracts/Lens/ComptrollerLens.sol @@ -6,7 +6,8 @@ import "../Tokens/VTokens/VToken.sol"; import "../Tokens/EIP20Interface.sol"; import "../Oracle/PriceOracle.sol"; import "../Utils/ErrorReporter.sol"; -import "../Comptroller/Comptroller.sol"; +import "../Comptroller/ComptrollerInterface.sol"; +import "../Comptroller/ComptrollerLensInterface.sol"; import "../Tokens/VAI/VAIControllerInterface.sol"; contract ComptrollerLens is ComptrollerLensInterface, ComptrollerErrorReporter, ExponentialNoError { @@ -43,8 +44,12 @@ contract ComptrollerLens is ComptrollerLensInterface, ComptrollerErrorReporter, uint actualRepayAmount ) external view returns (uint, uint) { /* Read oracle prices for borrowed and collateral markets */ - uint priceBorrowedMantissa = Comptroller(comptroller).oracle().getUnderlyingPrice(VToken(vTokenBorrowed)); - uint priceCollateralMantissa = Comptroller(comptroller).oracle().getUnderlyingPrice(VToken(vTokenCollateral)); + uint priceBorrowedMantissa = ComptrollerInterface(comptroller).oracle().getUnderlyingPrice( + VToken(vTokenBorrowed) + ); + uint priceCollateralMantissa = ComptrollerInterface(comptroller).oracle().getUnderlyingPrice( + VToken(vTokenCollateral) + ); if (priceBorrowedMantissa == 0 || priceCollateralMantissa == 0) { return (uint(Error.PRICE_ERROR), 0); } @@ -62,7 +67,7 @@ contract ComptrollerLens is ComptrollerLensInterface, ComptrollerErrorReporter, Exp memory ratio; numerator = mul_( - Exp({ mantissa: Comptroller(comptroller).liquidationIncentiveMantissa() }), + Exp({ mantissa: ComptrollerInterface(comptroller).liquidationIncentiveMantissa() }), Exp({ mantissa: priceBorrowedMantissa }) ); denominator = mul_(Exp({ mantissa: priceCollateralMantissa }), Exp({ mantissa: exchangeRateMantissa })); @@ -87,7 +92,9 @@ contract ComptrollerLens is ComptrollerLensInterface, ComptrollerErrorReporter, ) external view returns (uint, uint) { /* Read oracle prices for borrowed and collateral markets */ uint priceBorrowedMantissa = 1e18; // Note: this is VAI - uint priceCollateralMantissa = Comptroller(comptroller).oracle().getUnderlyingPrice(VToken(vTokenCollateral)); + uint priceCollateralMantissa = ComptrollerInterface(comptroller).oracle().getUnderlyingPrice( + VToken(vTokenCollateral) + ); if (priceCollateralMantissa == 0) { return (uint(Error.PRICE_ERROR), 0); } @@ -105,7 +112,7 @@ contract ComptrollerLens is ComptrollerLensInterface, ComptrollerErrorReporter, Exp memory ratio; numerator = mul_( - Exp({ mantissa: Comptroller(comptroller).liquidationIncentiveMantissa() }), + Exp({ mantissa: ComptrollerInterface(comptroller).liquidationIncentiveMantissa() }), Exp({ mantissa: priceBorrowedMantissa }) ); denominator = mul_(Exp({ mantissa: priceCollateralMantissa }), Exp({ mantissa: exchangeRateMantissa })); @@ -137,7 +144,7 @@ contract ComptrollerLens is ComptrollerLensInterface, ComptrollerErrorReporter, uint oErr; // For each asset the account is in - VToken[] memory assets = Comptroller(comptroller).getAssetsIn(account); + VToken[] memory assets = ComptrollerInterface(comptroller).getAssetsIn(account); uint assetsCount = assets.length; for (uint i = 0; i < assetsCount; ++i) { VToken asset = assets[i]; @@ -150,12 +157,12 @@ contract ComptrollerLens is ComptrollerLensInterface, ComptrollerErrorReporter, // semi-opaque error code, we assume NO_ERROR == 0 is invariant between upgrades return (uint(Error.SNAPSHOT_ERROR), 0, 0); } - (, uint collateralFactorMantissa, ) = Comptroller(comptroller).markets(address(asset)); + (, uint collateralFactorMantissa) = ComptrollerInterface(comptroller).markets(address(asset)); vars.collateralFactor = Exp({ mantissa: collateralFactorMantissa }); vars.exchangeRate = Exp({ mantissa: vars.exchangeRateMantissa }); // Get the normalized price of the asset - vars.oraclePriceMantissa = Comptroller(comptroller).oracle().getUnderlyingPrice(asset); + vars.oraclePriceMantissa = ComptrollerInterface(comptroller).oracle().getUnderlyingPrice(asset); if (vars.oraclePriceMantissa == 0) { return (uint(Error.PRICE_ERROR), 0, 0); } @@ -194,7 +201,7 @@ contract ComptrollerLens is ComptrollerLensInterface, ComptrollerErrorReporter, } } - VAIControllerInterface vaiController = Comptroller(comptroller).vaiController(); + VAIControllerInterface vaiController = ComptrollerInterface(comptroller).vaiController(); if (address(vaiController) != address(0)) { vars.sumBorrowPlusEffects = add_(vars.sumBorrowPlusEffects, vaiController.getVAIRepayAmount(account)); diff --git a/contracts/Lens/SnapshotLens.sol b/contracts/Lens/SnapshotLens.sol index d44d94a02..9bad3b7fc 100644 --- a/contracts/Lens/SnapshotLens.sol +++ b/contracts/Lens/SnapshotLens.sol @@ -3,7 +3,7 @@ pragma experimental ABIEncoderV2; import "../Tokens/VTokens/VToken.sol"; import "../Utils/SafeMath.sol"; -import "../Comptroller/Comptroller.sol"; +import "../Comptroller/ComptrollerInterface.sol"; import "../Tokens/EIP20Interface.sol"; import "../Tokens/VTokens/VBep20.sol"; @@ -55,7 +55,7 @@ contract SnapshotLens is ExponentialNoError { address comptrollerAddress ) public returns (AccountSnapshot[] memory) { // For each asset the account is in - VToken[] memory assets = Comptroller(comptrollerAddress).getAllMarkets(); + VToken[] memory assets = ComptrollerInterface(comptrollerAddress).getAllMarkets(); AccountSnapshot[] memory accountSnapshots = new AccountSnapshot[](assets.length); for (uint256 i = 0; i < assets.length; ++i) { accountSnapshots[i] = getAccountSnapshot(account, comptrollerAddress, assets[i]); @@ -64,7 +64,7 @@ contract SnapshotLens is ExponentialNoError { } function isACollateral(address account, address asset, address comptrollerAddress) public view returns (bool) { - VToken[] memory assetsAsCollateral = Comptroller(comptrollerAddress).getAssetsIn(account); + VToken[] memory assetsAsCollateral = ComptrollerInterface(comptrollerAddress).getAssetsIn(account); for (uint256 j = 0; j < assetsAsCollateral.length; ++j) { if (address(assetsAsCollateral[j]) == asset) { return true; @@ -87,13 +87,11 @@ contract SnapshotLens is ExponentialNoError { require(oErr == 0, "Snapshot Error"); vars.exchangeRate = Exp({ mantissa: vars.exchangeRateMantissa }); - Comptroller comptrollerInstance = Comptroller(comptrollerAddress); - - (, uint collateralFactorMantissa, ) = comptrollerInstance.markets(address(vToken)); + (, uint collateralFactorMantissa) = ComptrollerInterface(comptrollerAddress).markets(address(vToken)); vars.collateralFactor = Exp({ mantissa: collateralFactorMantissa }); // Get the normalized price of the asset - vars.oraclePriceMantissa = comptrollerInstance.oracle().getUnderlyingPrice(vToken); + vars.oraclePriceMantissa = ComptrollerInterface(comptrollerAddress).oracle().getUnderlyingPrice(vToken); vars.oraclePrice = Exp({ mantissa: vars.oraclePriceMantissa }); // Pre-compute a conversion factor from tokens -> bnb (normalized price value) diff --git a/contracts/Tokens/VAI/VAIController.sol b/contracts/Tokens/VAI/VAIController.sol index 2f472d884..ea4abed40 100644 --- a/contracts/Tokens/VAI/VAIController.sol +++ b/contracts/Tokens/VAI/VAIController.sol @@ -4,7 +4,7 @@ import "../../Oracle/PriceOracle.sol"; import "../../Utils/ErrorReporter.sol"; import "../../Utils/Exponential.sol"; import "../../Comptroller/ComptrollerStorage.sol"; -import "../../Comptroller/Comptroller.sol"; +import "../../Comptroller/ComptrollerInterface.sol"; import "../../Governance/IAccessControlManager.sol"; import "../VTokens/VToken.sol"; import "./VAIControllerStorage.sol"; @@ -455,7 +455,9 @@ contract VAIController is VAIControllerStorageG2, VAIControllerErrorReporter, Ex return (uint(Error.MATH_ERROR), 0); } - (, uint collateralFactorMantissa, ) = Comptroller(address(comptroller)).markets(address(enteredMarkets[i])); + (, uint collateralFactorMantissa) = ComptrollerInterface(address(comptroller)).markets( + address(enteredMarkets[i]) + ); (vars.mErr, vars.marketSupply) = mulUInt(vars.marketSupply, collateralFactorMantissa); if (vars.mErr != MathError.NO_ERROR) { return (uint(Error.MATH_ERROR), 0); diff --git a/contracts/Tokens/VAI/VAIControllerInterface.sol b/contracts/Tokens/VAI/VAIControllerInterface.sol index 9a305f3f8..6cbb7bee8 100644 --- a/contracts/Tokens/VAI/VAIControllerInterface.sol +++ b/contracts/Tokens/VAI/VAIControllerInterface.sol @@ -1,6 +1,6 @@ pragma solidity ^0.5.16; -import "../VTokens/VToken.sol"; +import "../VTokens/VTokenInterfaces.sol"; contract VAIControllerInterface { function getVAIAddress() public view returns (address); From 2371c988098a4d5867f8b82d27d65fef1b9992d8 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Thu, 15 Jun 2023 14:26:03 +0530 Subject: [PATCH 093/153] test: moved tests to diamond folder --- tests/hardhat/Comptroller/XVSSpeeds.ts | 123 ------ tests/hardhat/Comptroller/accessControl.ts | 110 ----- tests/hardhat/Comptroller/assetListTest.ts | 264 ------------ tests/hardhat/Comptroller/comptrollerTest.ts | 387 ------------------ .../liquidateCalculateAmountSeizeTest.ts | 156 ------- tests/hardhat/Comptroller/pauseTest.ts | 124 ------ tests/hardhat/Comptroller/verifyStorage.ts | 174 -------- 7 files changed, 1338 deletions(-) delete mode 100644 tests/hardhat/Comptroller/XVSSpeeds.ts delete mode 100644 tests/hardhat/Comptroller/accessControl.ts delete mode 100644 tests/hardhat/Comptroller/assetListTest.ts delete mode 100644 tests/hardhat/Comptroller/comptrollerTest.ts delete mode 100644 tests/hardhat/Comptroller/liquidateCalculateAmountSeizeTest.ts delete mode 100644 tests/hardhat/Comptroller/pauseTest.ts delete mode 100644 tests/hardhat/Comptroller/verifyStorage.ts diff --git a/tests/hardhat/Comptroller/XVSSpeeds.ts b/tests/hardhat/Comptroller/XVSSpeeds.ts deleted file mode 100644 index 2502d339a..000000000 --- a/tests/hardhat/Comptroller/XVSSpeeds.ts +++ /dev/null @@ -1,123 +0,0 @@ -import { FakeContract, MockContract, smock } from "@defi-wonderland/smock"; -import chai from "chai"; -import { ethers, network } from "hardhat"; - -import { Comptroller, Comptroller__factory, IAccessControlManager, VToken } from "../../../typechain"; -import { convertToUnit } from "./../../../helpers/utils"; - -const { expect } = chai; -chai.use(smock.matchers); - -describe("Comptroller", () => { - let comptroller: MockContract; - let accessControl: FakeContract; - let vToken1: FakeContract; - let vToken2: FakeContract; - - beforeEach(async () => { - const ComptrollerFactory = await smock.mock("Comptroller"); - comptroller = await ComptrollerFactory.deploy(); - accessControl = await smock.fake("IAccessControlManager"); - vToken1 = await smock.fake("VToken"); - vToken2 = await smock.fake("VToken"); - - await accessControl.isAllowedToCall.returns(true); - await vToken1.isVToken.returns(true); - await vToken2.isVToken.returns(true); - await vToken1.borrowIndex.returns(convertToUnit(0.7, 18)); - - await comptroller._setAccessControl(accessControl.address); - await comptroller._supportMarket(vToken1.address); - await comptroller._supportMarket(vToken2.address); - }); - - describe("_initializeMarket", () => { - it("Supply and borrow state after initializing the market in the pool", async () => { - const supplyRate = await (await comptroller.venusSupplyState(vToken1.address)).toString().split(",")[0]; - const borrowRate = await (await comptroller.venusBorrowState(vToken1.address)).toString().split(",")[0]; - - expect(supplyRate).equal(convertToUnit(1, 36)); - expect(borrowRate).equal(convertToUnit(1, 36)); - }); - }); - - describe("_setVenusSpeeds", async () => { - it("Revert on invalid supplySpeeds input", async () => { - await expect( - comptroller._setVenusSpeeds( - [vToken1.address, vToken2.address], - [convertToUnit(1, 15)], - [convertToUnit(1, 15), convertToUnit(1, 15)], - ), - ).to.be.revertedWith("Comptroller::_setVenusSpeeds invalid input"); - }); - - it("Revert on invalid borrowSpeeds input", async () => { - await expect( - comptroller._setVenusSpeeds( - [vToken1.address, vToken2.address], - [convertToUnit(1, 15), convertToUnit(1, 15)], - [convertToUnit(1, 15)], - ), - ).to.be.revertedWith("Comptroller::_setVenusSpeeds invalid input"); - }); - - it("Revert for unlisted market", async () => { - const [unListedMarket] = await ethers.getSigners(); - await expect( - comptroller._setVenusSpeeds([unListedMarket.address], [convertToUnit(1, 16)], [convertToUnit(1, 15)]), - ).to.be.revertedWith("market not listed"); - }); - - it("Revert on invalid borrowSpeeds input", async () => { - await comptroller._setVenusSpeeds( - [vToken1.address, vToken2.address], - [convertToUnit(1, 16), convertToUnit(1, 18)], - [convertToUnit(1, 20), convertToUnit(1, 22)], - ); - - const token1SupplySpeed = await comptroller.venusSupplySpeeds(vToken1.address); - const token1BorrowSpeed = await comptroller.venusBorrowSpeeds(vToken1.address); - - expect(token1SupplySpeed).equal(convertToUnit(1, 16)); - expect(token1BorrowSpeed).equal(convertToUnit(1, 20)); - - const token2SupplySpeed = await comptroller.venusSupplySpeeds(vToken2.address); - const token2BorrowSpeed = await comptroller.venusBorrowSpeeds(vToken2.address); - - expect(token2SupplySpeed).equal(convertToUnit(1, 18)); - expect(token2BorrowSpeed).equal(convertToUnit(1, 22)); - }); - - it("Updating non-zero speeds after setting it zero", async () => { - // Setting the initial speeds - await comptroller._setVenusSpeeds([vToken1.address], [convertToUnit(1, 16)], [convertToUnit(1, 20)]); - - // Mining 1000 blocks - await network.provider.send("hardhat_mine", ["0x3e8", "0x3c"]); - - // Updating the speeds to zero - await comptroller._setVenusSpeeds([vToken1.address], [0], [0]); - - // latest Block - const blockNumber1 = await ethers.provider.getBlock("latest"); - // Mining 1000 blocks - await network.provider.send("hardhat_mine", ["0x3e8", "0x3c"]); - // Getting the last block for the updated speeds - const supplySpeedBlock1 = await (await comptroller.venusSupplyState(vToken1.address)).toString().split(",")[1]; - const borrowSpeedBlock1 = await (await comptroller.venusBorrowState(vToken1.address)).toString().split(",")[1]; - - // Updating the speeds to non-zero - await comptroller._setVenusSpeeds([vToken1.address], [convertToUnit(1, 16)], [convertToUnit(1, 20)]); - - // Getting the last block for the updated speeds - const supplySpeedBlock2 = await (await comptroller.venusSupplyState(vToken1.address)).toString().split(",")[1]; - const borrowSpeedBlock2 = await (await comptroller.venusBorrowState(vToken1.address)).toString().split(",")[1]; - // latest Block - const blockNumber2 = await ethers.provider.getBlock("latest"); - - expect(blockNumber2.number - blockNumber1.number).equal(Number(supplySpeedBlock2) - Number(supplySpeedBlock1)); - expect(blockNumber2.number - blockNumber1.number).equal(Number(borrowSpeedBlock2) - Number(borrowSpeedBlock1)); - }); - }); -}); diff --git a/tests/hardhat/Comptroller/accessControl.ts b/tests/hardhat/Comptroller/accessControl.ts deleted file mode 100644 index c5cb27ad4..000000000 --- a/tests/hardhat/Comptroller/accessControl.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { FakeContract, MockContract, smock } from "@defi-wonderland/smock"; -import chai from "chai"; -import { Signer, constants } from "ethers"; -import { ethers } from "hardhat"; - -import { Comptroller, Comptroller__factory, IAccessControlManager } from "../../../typechain"; - -const { expect } = chai; -chai.use(smock.matchers); - -describe("Comptroller", () => { - let user: Signer; - let userAddress: string; - let comptroller: MockContract; - let accessControl: FakeContract; - - beforeEach(async () => { - const signers = await ethers.getSigners(); - user = signers[1]; - userAddress = await user.getAddress(); - const ComptrollerFactory = await smock.mock("Comptroller"); - comptroller = await ComptrollerFactory.deploy(); - accessControl = await smock.fake("IAccessControlManager"); - }); - - describe("_setAccessControlManager", () => { - it("Reverts if called by non-admin", async () => { - await expect(comptroller.connect(user)._setAccessControl(accessControl.address)).to.be.revertedWith( - "only admin can", - ); - }); - - it("Reverts if ACM is zero address", async () => { - await expect(comptroller._setAccessControl(constants.AddressZero)).to.be.revertedWith("can't be zero address"); - }); - - it("Sets ACM address in storage", async () => { - await expect(await comptroller._setAccessControl(accessControl.address)) - .to.emit(comptroller, "NewAccessControl") - .withArgs(constants.AddressZero, accessControl.address); - expect(await comptroller.getVariable("accessControl")).to.equal(accessControl.address); - }); - }); - - describe("Access Control", () => { - beforeEach(async () => { - await comptroller._setAccessControl(accessControl.address); - }); - - describe("setCollateralFactor", () => { - it("Should have AccessControl", async () => { - await expect( - comptroller.connect(user)._setCollateralFactor(ethers.constants.AddressZero, 0), - ).to.be.revertedWith("access denied"); - expect(accessControl.isAllowedToCall).to.be.calledOnceWith( - userAddress, - "_setCollateralFactor(address,uint256)", - ); - }); - }); - describe("setLiquidationIncentive", () => { - it("Should have AccessControl", async () => { - await expect(comptroller.connect(user)._setLiquidationIncentive(0)).to.be.revertedWith("access denied"); - expect(accessControl.isAllowedToCall).to.be.calledOnceWith(userAddress, "_setLiquidationIncentive(uint256)"); - }); - }); - describe("setMarketBorrowCaps", () => { - it("Should have AccessControl", async () => { - await expect(comptroller.connect(user)._setMarketBorrowCaps([], [])).to.be.revertedWith("access denied"); - - expect(accessControl.isAllowedToCall).to.be.calledOnceWith( - userAddress, - "_setMarketBorrowCaps(address[],uint256[])", - ); - }); - }); - describe("setMarketSupplyCaps", () => { - it("Should have AccessControl", async () => { - await expect(comptroller.connect(user)._setMarketSupplyCaps([], [])).to.be.revertedWith("access denied"); - expect(accessControl.isAllowedToCall).to.be.calledOnceWith( - userAddress, - "_setMarketSupplyCaps(address[],uint256[])", - ); - }); - }); - describe("setProtocolPaused", () => { - it("Should have AccessControl", async () => { - await expect(comptroller.connect(user)._setProtocolPaused(true)).to.be.revertedWith("access denied"); - expect(accessControl.isAllowedToCall).to.be.calledOnceWith(userAddress, "_setProtocolPaused(bool)"); - }); - }); - describe("setActionsPaused", () => { - it("Should have AccessControl", async () => { - await expect(comptroller.connect(user)._setActionsPaused([], [], true)).to.be.revertedWith("access denied"); - expect(accessControl.isAllowedToCall).to.be.calledOnceWith( - userAddress, - "_setActionsPaused(address[],uint256[],bool)", - ); - }); - }); - describe("supportMarket", () => { - it("Should have AccessControl", async () => { - await expect(comptroller.connect(user)._supportMarket(ethers.constants.AddressZero)).to.be.revertedWith( - "access denied", - ); - expect(accessControl.isAllowedToCall).to.be.calledOnceWith(userAddress, "_supportMarket(address)"); - }); - }); - }); -}); diff --git a/tests/hardhat/Comptroller/assetListTest.ts b/tests/hardhat/Comptroller/assetListTest.ts deleted file mode 100644 index fa891d534..000000000 --- a/tests/hardhat/Comptroller/assetListTest.ts +++ /dev/null @@ -1,264 +0,0 @@ -import { FakeContract, MockContract, smock } from "@defi-wonderland/smock"; -import { loadFixture, setBalance } from "@nomicfoundation/hardhat-network-helpers"; -import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers"; -import chai from "chai"; -import { ethers } from "hardhat"; - -import { convertToUnit } from "../../../helpers/utils"; -import { - Comptroller, - ComptrollerLens, - ComptrollerLens__factory, - Comptroller__factory, - IAccessControlManager, - PriceOracle, - VBep20Immutable, -} from "../../../typechain"; -import { ComptrollerErrorReporter } from "../util/Errors"; - -const { expect } = chai; -chai.use(smock.matchers); - -const { Error } = ComptrollerErrorReporter; - -describe("assetListTest", () => { - let root: SignerWithAddress; // eslint-disable-line @typescript-eslint/no-unused-vars - let customer: SignerWithAddress; - let comptroller: MockContract; - let OMG: FakeContract; - let ZRX: FakeContract; - let BAT: FakeContract; - let SKT: FakeContract; - let allTokens: FakeContract[]; - - type AssetListFixture = { - comptroller: MockContract; - comptrollerLens: MockContract; - oracle: FakeContract; - OMG: FakeContract; - ZRX: FakeContract; - BAT: FakeContract; - SKT: FakeContract; - allTokens: FakeContract[]; - names: string[]; - }; - - async function assetListFixture(): Promise { - const accessControl = await smock.fake("IAccessControlManager"); - const ComptrollerFactory = await smock.mock("Comptroller"); - const ComptrollerLensFactory = await smock.mock("ComptrollerLens"); - const comptroller = await ComptrollerFactory.deploy(); - const comptrollerLens = await ComptrollerLensFactory.deploy(); - const oracle = await smock.fake("PriceOracle"); - accessControl.isAllowedToCall.returns(true); - await comptroller._setAccessControl(accessControl.address); - await comptroller._setComptrollerLens(comptrollerLens.address); - await comptroller._setPriceOracle(oracle.address); - const names = ["OMG", "ZRX", "BAT", "sketch"]; - const [OMG, ZRX, BAT, SKT] = await Promise.all( - names.map(async name => { - const vToken = await smock.fake("VBep20Immutable"); - if (name !== "sketch") { - await comptroller._supportMarket(vToken.address); - } - return vToken; - }), - ); - const allTokens = [OMG, ZRX, BAT, SKT]; - return { comptroller, comptrollerLens, oracle, OMG, ZRX, BAT, SKT, allTokens, names }; - } - - function configure({ oracle, allTokens, names }: AssetListFixture) { - oracle.getUnderlyingPrice.returns(convertToUnit("0.5", 18)); - allTokens.map((vToken, i) => { - vToken.isVToken.returns(true); - vToken.symbol.returns(names[i]); - vToken.name.returns(names[i]); - vToken.getAccountSnapshot.returns([0, 0, 0, 0]); - }); - } - - beforeEach(async () => { - [root, customer] = await ethers.getSigners(); - const contracts = await loadFixture(assetListFixture); - configure(contracts); - ({ comptroller, OMG, ZRX, BAT, SKT, allTokens } = contracts); - }); - - async function checkMarkets(expectedTokens: FakeContract[]) { - // eslint-disable-next-line prefer-const - for (let token of allTokens) { - const isExpected = expectedTokens.some(e => e == token); - expect(await comptroller.checkMembership(customer.address, token.address)).to.equal(isExpected); - } - } - - async function enterAndCheckMarkets( - enterTokens: FakeContract[], - expectedTokens: FakeContract[], - expectedErrors: ComptrollerErrorReporter.Error[] | null = null, - ) { - const reply = await comptroller.connect(customer).callStatic.enterMarkets(enterTokens.map(t => t.address)); - const receipt = await comptroller.connect(customer).enterMarkets(enterTokens.map(t => t.address)); - const assetsIn = await comptroller.getAssetsIn(customer.address); - - const expectedErrors_ = expectedErrors || enterTokens.map(_ => Error.NO_ERROR); - - reply.forEach((tokenReply, i) => { - expect(tokenReply).to.equal(expectedErrors_[i]); - }); - expect(assetsIn).to.deep.equal(expectedTokens.map(t => t.address)); - - await checkMarkets(expectedTokens); - - return receipt; - } - - async function enterAndExpectRejection(enterTokens: FakeContract[], expectedReason: string = "") { - await expect(comptroller.connect(customer).enterMarkets(enterTokens.map(t => t.address))).to.be.revertedWith( - expectedReason, - ); - } - - async function exitAndCheckMarkets( - exitToken: FakeContract, - expectedTokens: FakeContract[], - expectedError: ComptrollerErrorReporter.Error = Error.NO_ERROR, - ) { - const reply = await comptroller.connect(customer).callStatic.exitMarket(exitToken.address); - const receipt = await comptroller.connect(customer).exitMarket(exitToken.address); - const assetsIn = await comptroller.getAssetsIn(customer.address); - expect(reply).to.equal(expectedError); - expect(assetsIn).to.deep.equal(expectedTokens.map(t => t.address)); - await checkMarkets(expectedTokens); - return receipt; - } - - describe("enterMarkets", () => { - it("properly emits events", async () => { - const tx1 = await enterAndCheckMarkets([OMG], [OMG]); - const tx2 = await enterAndCheckMarkets([OMG], [OMG]); - await expect(tx1).to.emit(comptroller, "MarketEntered").withArgs(OMG.address, customer.address); - console.log("D"); - expect((await tx2.wait()).events).to.be.empty; - }); - - it("adds to the asset list only once", async () => { - await enterAndCheckMarkets([OMG], [OMG]); - await enterAndCheckMarkets([OMG], [OMG]); - await enterAndCheckMarkets([ZRX, BAT, OMG], [OMG, ZRX, BAT]); - await enterAndCheckMarkets([ZRX, OMG], [OMG, ZRX, BAT]); - await enterAndCheckMarkets([ZRX], [OMG, ZRX, BAT]); - await enterAndCheckMarkets([OMG], [OMG, ZRX, BAT]); - await enterAndCheckMarkets([ZRX], [OMG, ZRX, BAT]); - await enterAndCheckMarkets([BAT], [OMG, ZRX, BAT]); - }); - - it("the market must be listed for add to succeed", async () => { - await enterAndExpectRejection([SKT], "market not listed"); - await comptroller._supportMarket(SKT.address); - await enterAndCheckMarkets([SKT], [SKT]); - }); - - it("returns a list of codes mapping to user's ultimate membership in given addresses", async () => { - await enterAndCheckMarkets([OMG, ZRX, BAT], [OMG, ZRX, BAT], [Error.NO_ERROR, Error.NO_ERROR, Error.NO_ERROR]); - await enterAndExpectRejection([OMG, SKT], "market not listed"); - }); - }); - - describe("exitMarket", () => { - it("doesn't let you exit if you have a borrow balance", async () => { - await enterAndCheckMarkets([OMG], [OMG]); - OMG.getAccountSnapshot.returns([0, 1, 2, 1]); - - await exitAndCheckMarkets(OMG, [OMG], Error.NONZERO_BORROW_BALANCE); - }); - - it("rejects unless redeem allowed", async () => { - await enterAndCheckMarkets([OMG, BAT], [OMG, BAT]); - // We need to borrow at least 2, otherwise our borrow balance in USD gets truncated - // when multiplied by price=0.5 - BAT.getAccountSnapshot.returns([0, 0, 2, 1]); - - // BAT has a negative balance and there's no supply, thus account should be underwater - await exitAndCheckMarkets(OMG, [OMG, BAT], Error.REJECTION); - }); - - it("accepts when you're not in the market already", async () => { - await enterAndCheckMarkets([OMG, BAT], [OMG, BAT]); - - // Not in ZRX, should exit fine - await exitAndCheckMarkets(ZRX, [OMG, BAT], Error.NO_ERROR); - }); - - it("properly removes when there's only one asset", async () => { - await enterAndCheckMarkets([OMG], [OMG]); - await exitAndCheckMarkets(OMG, [], Error.NO_ERROR); - }); - - it("properly removes when there's only two assets, removing the first", async () => { - await enterAndCheckMarkets([OMG, BAT], [OMG, BAT]); - await exitAndCheckMarkets(OMG, [BAT], Error.NO_ERROR); - }); - - it("properly removes when there's only two assets, removing the second", async () => { - await enterAndCheckMarkets([OMG, BAT], [OMG, BAT]); - await exitAndCheckMarkets(BAT, [OMG], Error.NO_ERROR); - }); - - it("properly removes when there's only three assets, removing the first", async () => { - await enterAndCheckMarkets([OMG, BAT, ZRX], [OMG, BAT, ZRX]); - await exitAndCheckMarkets(OMG, [ZRX, BAT], Error.NO_ERROR); - }); - - it("properly removes when there's only three assets, removing the second", async () => { - await enterAndCheckMarkets([OMG, BAT, ZRX], [OMG, BAT, ZRX]); - await exitAndCheckMarkets(BAT, [OMG, ZRX], Error.NO_ERROR); - }); - - it("properly removes when there's only three assets, removing the third", async () => { - await enterAndCheckMarkets([OMG, BAT, ZRX], [OMG, BAT, ZRX]); - await exitAndCheckMarkets(ZRX, [OMG, BAT], Error.NO_ERROR); - }); - }); - - describe("entering from borrowAllowed", () => { - beforeEach(async () => { - await BAT.borrowIndex.returns(convertToUnit(1, 18)); - }); - - it("enters when called by a vtoken", async () => { - await setBalance(await BAT.wallet.getAddress(), 10n ** 18n); - await comptroller.connect(BAT.wallet).borrowAllowed(BAT.address, customer.address, 1); - - const assetsIn = await comptroller.getAssetsIn(customer.address); - - expect(assetsIn).to.deep.equal([BAT.address]); - - await checkMarkets([BAT]); - }); - - it("reverts when called by not a vtoken", async () => { - await expect(comptroller.connect(customer).borrowAllowed(BAT.address, customer.address, 1)).to.be.revertedWith( - "sender must be vToken", - ); - - const assetsIn = await comptroller.getAssetsIn(customer.address); - - expect(assetsIn).to.deep.equal([]); - - await checkMarkets([]); - }); - - it("adds to the asset list only once", async () => { - await setBalance(await BAT.wallet.getAddress(), 10n ** 18n); - await comptroller.connect(BAT.wallet).borrowAllowed(BAT.address, customer.address, 1); - - await enterAndCheckMarkets([BAT], [BAT]); - - await comptroller.connect(BAT.wallet).borrowAllowed(BAT.address, customer.address, 1); - const assetsIn = await comptroller.getAssetsIn(customer.address); - expect(assetsIn).to.deep.equal([BAT.address]); - }); - }); -}); diff --git a/tests/hardhat/Comptroller/comptrollerTest.ts b/tests/hardhat/Comptroller/comptrollerTest.ts deleted file mode 100644 index ce278f279..000000000 --- a/tests/hardhat/Comptroller/comptrollerTest.ts +++ /dev/null @@ -1,387 +0,0 @@ -import { FakeContract, MockContract, smock } from "@defi-wonderland/smock"; -import { loadFixture } from "@nomicfoundation/hardhat-network-helpers"; -import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers"; -import chai from "chai"; -import { constants } from "ethers"; -import { ethers } from "hardhat"; - -import { convertToUnit } from "../../../helpers/utils"; -import { - Comptroller, - ComptrollerLens, - ComptrollerLens__factory, - Comptroller__factory, - EIP20Interface, - IAccessControlManager, - PriceOracle, - VToken, -} from "../../../typechain"; -import { ComptrollerErrorReporter } from "../util/Errors"; - -const { expect } = chai; -chai.use(smock.matchers); - -type SimpleComptrollerFixture = { - oracle: FakeContract; - accessControl: FakeContract; - comptrollerLens: MockContract; - comptroller: MockContract; -}; - -async function deploySimpleComptroller(): Promise { - const oracle = await smock.fake("PriceOracle"); - const accessControl = await smock.fake("IAccessControlManager"); - accessControl.isAllowedToCall.returns(true); - const ComptrollerLensFactory = await smock.mock("ComptrollerLens"); - const ComptrollerFactory = await smock.mock("Comptroller"); - const comptroller = await ComptrollerFactory.deploy(); - const comptrollerLens = await ComptrollerLensFactory.deploy(); - await comptroller._setAccessControl(accessControl.address); - await comptroller._setComptrollerLens(comptrollerLens.address); - await comptroller._setPriceOracle(oracle.address); - await comptroller._setLiquidationIncentive(convertToUnit("1", 18)); - return { oracle, comptroller, comptrollerLens, accessControl }; -} - -function configureOracle(oracle: FakeContract) { - oracle.getUnderlyingPrice.returns(convertToUnit(1, 18)); -} - -function configureVToken(vToken: FakeContract, comptroller: MockContract) { - vToken.comptroller.returns(comptroller.address); - vToken.isVToken.returns(true); - vToken.exchangeRateStored.returns(convertToUnit("2", 18)); - vToken.totalSupply.returns(convertToUnit("1000000", 18)); - vToken.totalBorrows.returns(convertToUnit("900000", 18)); -} - -describe("Comptroller", () => { - let root: SignerWithAddress; - let accounts: SignerWithAddress[]; - - before(async () => { - [root, ...accounts] = await ethers.getSigners(); - }); - - describe("constructor", () => { - it("on success it sets admin to creator and pendingAdmin is unset", async () => { - const { comptroller } = await loadFixture(deploySimpleComptroller); - expect(await comptroller.admin()).to.equal(root.address); - expect(await comptroller.pendingAdmin()).to.equal(constants.AddressZero); - }); - }); - - describe("_setLiquidationIncentive", () => { - let comptroller: MockContract; - const initialIncentive = convertToUnit("1", 18); - const validIncentive = convertToUnit("1.1", 18); - const tooSmallIncentive = convertToUnit("0.99999", 18); - - beforeEach(async () => { - ({ comptroller } = await loadFixture(deploySimpleComptroller)); - }); - - it("fails if incentive is less than 1e18", async () => { - await expect(comptroller._setLiquidationIncentive(tooSmallIncentive)).to.be.revertedWith( - "incentive must be over 1e18", - ); - }); - - it("accepts a valid incentive and emits a NewLiquidationIncentive event", async () => { - expect(await comptroller.callStatic._setLiquidationIncentive(validIncentive)).to.equal( - ComptrollerErrorReporter.Error.NO_ERROR, - ); - await expect(await comptroller._setLiquidationIncentive(validIncentive)) - .to.emit(comptroller, "NewLiquidationIncentive") - .withArgs(initialIncentive, validIncentive); - expect(await comptroller.liquidationIncentiveMantissa()).to.equal(validIncentive); - }); - }); - - describe("Non zero address check", () => { - let comptroller: MockContract; - - beforeEach(async () => { - ({ comptroller } = await loadFixture(deploySimpleComptroller)); - }); - - type FuncNames = keyof Comptroller["functions"]; - - function testZeroAddress(funcName: Func, args: Parameters) { - it(funcName, async () => { - await expect(comptroller[funcName](...args)).to.be.revertedWith("can't be zero address"); - }); - } - testZeroAddress("_setPriceOracle", [constants.AddressZero]); - testZeroAddress("_setCollateralFactor", [constants.AddressZero, 0]); - testZeroAddress("_setPauseGuardian", [constants.AddressZero]); - testZeroAddress("_setVAIController", [constants.AddressZero]); - testZeroAddress("_setTreasuryData", [constants.AddressZero, constants.AddressZero, 0]); - testZeroAddress("_setComptrollerLens", [constants.AddressZero]); - testZeroAddress("_setVAIVaultInfo", [constants.AddressZero, 0, 0]); - testZeroAddress("_setVenusSpeeds", [[constants.AddressZero], [0], [0]]); - }); - - describe("_setPriceOracle", () => { - let comptroller: MockContract; - let oracle: FakeContract; - let newOracle: FakeContract; - - type Contracts = SimpleComptrollerFixture & { - newOracle: FakeContract; - }; - - async function deploy(): Promise { - const contracts = await deploySimpleComptroller(); - const newOracle = await smock.fake("PriceOracle"); - return { ...contracts, newOracle }; - } - - beforeEach(async () => { - ({ comptroller, oracle, newOracle } = await loadFixture(deploy)); - }); - - it("fails if called by non-admin", async () => { - await expect(comptroller.connect(accounts[0])._setPriceOracle(oracle.address)).to.be.revertedWith( - "only admin can", - ); - expect(await comptroller.oracle()).to.equal(oracle.address); - }); - - it("accepts a valid price oracle and emits a NewPriceOracle event", async () => { - await expect(await comptroller._setPriceOracle(newOracle.address)) - .to.emit(comptroller, "NewPriceOracle") - .withArgs(oracle.address, newOracle.address); - expect(await comptroller.oracle()).to.equal(newOracle.address); - }); - }); - - describe("_setComptrollerLens", () => { - let comptroller: MockContract; - let comptrollerLens: MockContract; - - type Contracts = { - comptrollerLens: MockContract; - comptroller: MockContract; - }; - - async function deploy(): Promise { - const ComptrollerFactory = await smock.mock("Comptroller"); - const comptroller = await ComptrollerFactory.deploy(); - const ComptrollerLensFactory = await smock.mock("ComptrollerLens"); - const comptrollerLens = await ComptrollerLensFactory.deploy(); - return { comptroller, comptrollerLens }; - } - - beforeEach(async () => { - ({ comptroller, comptrollerLens } = await loadFixture(deploy)); - }); - - it("fails if not called by admin", async () => { - await expect(comptroller.connect(accounts[0])._setComptrollerLens(comptrollerLens.address)).to.be.revertedWith( - "only admin can", - ); - }); - - it("should fire an event", async () => { - const { comptroller, comptrollerLens } = await loadFixture(deploy); - const oldComptrollerLensAddress = await comptroller.comptrollerLens(); - await expect(await comptroller._setComptrollerLens(comptrollerLens.address)) - .to.emit(comptroller, "NewComptrollerLens") - .withArgs(oldComptrollerLensAddress, comptrollerLens.address); - }); - }); - - describe("_setCloseFactor", () => { - let comptroller: MockContract; - - beforeEach(async () => { - ({ comptroller } = await loadFixture(deploySimpleComptroller)); - }); - - it("fails if not called by admin", async () => { - await expect(comptroller.connect(accounts[0])._setCloseFactor(1)).to.be.revertedWith("only admin can"); - }); - }); - - describe("_setCollateralFactor", () => { - const half = convertToUnit("0.5", 18); - let comptroller: MockContract; - let vToken: FakeContract; - let oracle: FakeContract; - - type Contracts = SimpleComptrollerFixture & { vToken: FakeContract }; - - async function deploy(): Promise { - const contracts = await deploySimpleComptroller(); - const vToken = await smock.fake("VToken"); - vToken.comptroller.returns(contracts.comptroller.address); - vToken.isVToken.returns(true); - return { vToken, ...contracts }; - } - - beforeEach(async () => { - ({ comptroller, oracle, vToken } = await loadFixture(deploy)); - configureOracle(oracle); - }); - - it("fails if asset is not listed", async () => { - await expect(comptroller._setCollateralFactor(vToken.address, half)).to.be.revertedWith("market not listed"); - }); - - it("fails if factor is set without an underlying price", async () => { - await comptroller._supportMarket(vToken.address); - oracle.getUnderlyingPrice.returns(0); - await expect(await comptroller._setCollateralFactor(vToken.address, half)) - .to.emit(comptroller, "Failure") - .withArgs( - ComptrollerErrorReporter.Error.PRICE_ERROR, - ComptrollerErrorReporter.FailureInfo.SET_COLLATERAL_FACTOR_WITHOUT_PRICE, - 0, - ); - }); - - it("succeeds and sets market", async () => { - await comptroller._supportMarket(vToken.address); - await expect(await comptroller._setCollateralFactor(vToken.address, half)) - .to.emit(comptroller, "NewCollateralFactor") - .withArgs(vToken.address, "0", half); - }); - }); - - describe("_supportMarket", () => { - let comptroller: MockContract; - let oracle: FakeContract; - let vToken1: FakeContract; - let vToken2: FakeContract; - let token: FakeContract; - - type Contracts = SimpleComptrollerFixture & { - vToken1: FakeContract; - vToken2: FakeContract; - token: FakeContract; - }; - - async function deploy(): Promise { - const contracts = await deploySimpleComptroller(); - const vToken1 = await smock.fake("VToken"); - const vToken2 = await smock.fake("VToken"); - const token = await smock.fake("EIP20Interface"); - return { ...contracts, vToken1, vToken2, token }; - } - - beforeEach(async () => { - ({ comptroller, oracle, vToken1, vToken2, token } = await loadFixture(deploy)); - configureOracle(oracle); - configureVToken(vToken1, comptroller); - configureVToken(vToken2, comptroller); - }); - - it("fails if asset is not a VToken", async () => { - await expect(comptroller._supportMarket(token.address)).to.be.reverted; - }); - - it("succeeds and sets market", async () => { - await expect(await comptroller._supportMarket(vToken1.address)) - .to.emit(comptroller, "MarketListed") - .withArgs(vToken1.address); - }); - - it("cannot list a market a second time", async () => { - const tx1 = await comptroller._supportMarket(vToken1.address); - const tx2 = await comptroller._supportMarket(vToken1.address); - await expect(tx1).to.emit(comptroller, "MarketListed").withArgs(vToken1.address); - await expect(tx2) - .to.emit(comptroller, "Failure") - .withArgs( - ComptrollerErrorReporter.Error.MARKET_ALREADY_LISTED, - ComptrollerErrorReporter.FailureInfo.SUPPORT_MARKET_EXISTS, - 0, - ); - }); - - it("can list two different markets", async () => { - const tx1 = await comptroller._supportMarket(vToken1.address); - const tx2 = await comptroller._supportMarket(vToken2.address); - await expect(tx1).to.emit(comptroller, "MarketListed").withArgs(vToken1.address); - await expect(tx2).to.emit(comptroller, "MarketListed").withArgs(vToken2.address); - }); - }); - - describe("Hooks", () => { - let comptroller: MockContract; - let vToken: FakeContract; - - type Contracts = SimpleComptrollerFixture & { vToken: FakeContract }; - - async function deploy(): Promise { - const contracts = await deploySimpleComptroller(); - const vToken = await smock.fake("VToken"); - await contracts.comptroller._supportMarket(vToken.address); - return { ...contracts, vToken }; - } - - beforeEach(async () => { - ({ comptroller, vToken } = await loadFixture(deploy)); - configureVToken(vToken, comptroller); - }); - - describe("mintAllowed", () => { - beforeEach(async () => { - ({ comptroller, vToken } = await loadFixture(deploy)); - configureVToken(vToken, comptroller); - }); - - it("allows minting if cap is not reached", async () => { - const cap = convertToUnit("1001", 18); - const currentVTokenSupply = convertToUnit("500", 18); - const exchangeRate = convertToUnit("2", 18); - // underlying supply = currentVTokenSupply * exchangeRate = 1000 - - vToken.totalSupply.returns(currentVTokenSupply); - vToken.exchangeRateStored.returns(exchangeRate); - await comptroller._setMarketSupplyCaps([vToken.address], [cap]); - expect( - await comptroller.callStatic.mintAllowed(vToken.address, root.address, convertToUnit("0.9999", 18)), - ).to.equal(0); // 0 means "no error" - }); - - it("reverts if supply cap reached", async () => { - const cap = convertToUnit("1001", 18); - const currentVTokenSupply = convertToUnit("500", 18); - const exchangeRate = convertToUnit("2", 18); - // underlying supply = currentVTokenSupply * exchangeRate = 1000 - - vToken.totalSupply.returns(currentVTokenSupply); - vToken.exchangeRateStored.returns(exchangeRate); - await comptroller._setMarketSupplyCaps([vToken.address], [cap]); - await expect( - comptroller.mintAllowed(vToken.address, root.address, convertToUnit("1.01", 18)), - ).to.be.revertedWith("market supply cap reached"); - }); - - it("reverts if market is not listed", async () => { - const someVToken = await smock.fake("VToken"); - await expect( - comptroller.mintAllowed(someVToken.address, root.address, convertToUnit("1", 18)), - ).to.be.revertedWith("market not listed"); - }); - }); - - describe("redeemVerify", () => { - it("should allow you to redeem 0 underlying for 0 tokens", async () => { - await comptroller.redeemVerify(vToken.address, accounts[0].address, 0, 0); - }); - - it("should allow you to redeem 5 underlyig for 5 tokens", async () => { - await comptroller.redeemVerify(vToken.address, accounts[0].address, 5, 5); - }); - - it("should not allow you to redeem 5 underlying for 0 tokens", async () => { - await expect(comptroller.redeemVerify(vToken.address, accounts[0].address, 5, 0)).to.be.revertedWith( - "redeemTokens zero", - ); - }); - }); - }); -}); diff --git a/tests/hardhat/Comptroller/liquidateCalculateAmountSeizeTest.ts b/tests/hardhat/Comptroller/liquidateCalculateAmountSeizeTest.ts deleted file mode 100644 index 16dda1a25..000000000 --- a/tests/hardhat/Comptroller/liquidateCalculateAmountSeizeTest.ts +++ /dev/null @@ -1,156 +0,0 @@ -import { FakeContract, MockContract, smock } from "@defi-wonderland/smock"; -import { loadFixture } from "@nomicfoundation/hardhat-network-helpers"; -import chai from "chai"; -import { BigNumberish, constants } from "ethers"; - -import { convertToUnit } from "../../../helpers/utils"; -import { - Comptroller, - ComptrollerLens, - ComptrollerLens__factory, - Comptroller__factory, - IAccessControlManager, - PriceOracle, - VBep20Immutable, -} from "../../../typechain"; -import { ComptrollerErrorReporter } from "../util/Errors"; - -const { expect } = chai; -chai.use(smock.matchers); - -const borrowedPrice = convertToUnit(2, 10); -const collateralPrice = convertToUnit(1, 18); -const repayAmount = convertToUnit(1, 18); - -async function calculateSeizeTokens( - comptroller: MockContract, - vTokenBorrowed: FakeContract, - vTokenCollateral: FakeContract, - repayAmount: BigNumberish, -) { - return comptroller.liquidateCalculateSeizeTokens(vTokenBorrowed.address, vTokenCollateral.address, repayAmount); -} - -function rando(min: number, max: number): number { - return Math.floor(Math.random() * (max - min)) + min; -} - -describe("Comptroller", () => { - let comptroller: MockContract; - let oracle: FakeContract; - let vTokenBorrowed: FakeContract; - let vTokenCollateral: FakeContract; - - type LiquidateFixture = { - comptroller: MockContract; - comptrollerLens: MockContract; - oracle: FakeContract; - vTokenBorrowed: FakeContract; - vTokenCollateral: FakeContract; - }; - - function setOraclePrice(vToken: FakeContract, price: BigNumberish) { - oracle.getUnderlyingPrice.whenCalledWith(vToken.address).returns(price); - } - - async function liquidateFixture(): Promise { - const accessControl = await smock.fake("IAccessControlManager"); - const ComptrollerFactory = await smock.mock("Comptroller"); - const ComptrollerLensFactory = await smock.mock("ComptrollerLens"); - const comptroller = await ComptrollerFactory.deploy(); - const comptrollerLens = await ComptrollerLensFactory.deploy(); - const oracle = await smock.fake("PriceOracle"); - accessControl.isAllowedToCall.returns(true); - await comptroller._setAccessControl(accessControl.address); - await comptroller._setComptrollerLens(comptrollerLens.address); - await comptroller._setPriceOracle(oracle.address); - await comptroller._setLiquidationIncentive(convertToUnit("1.1", 18)); - - const vTokenBorrowed = await smock.fake("VBep20Immutable"); - const vTokenCollateral = await smock.fake("VBep20Immutable"); - - return { comptroller, comptrollerLens, oracle, vTokenBorrowed, vTokenCollateral }; - } - - async function configure({ comptroller, vTokenCollateral, oracle, vTokenBorrowed }: LiquidateFixture) { - oracle.getUnderlyingPrice.returns(0); - for (const vToken of [vTokenBorrowed, vTokenCollateral]) { - vToken.comptroller.returns(comptroller.address); - vToken.isVToken.returns(true); - } - - vTokenCollateral.exchangeRateStored.returns(5e9); - oracle.getUnderlyingPrice.whenCalledWith(vTokenCollateral.address).returns(collateralPrice); - oracle.getUnderlyingPrice.whenCalledWith(vTokenBorrowed.address).returns(borrowedPrice); - } - - beforeEach(async () => { - const contracts = await loadFixture(liquidateFixture); - await configure(contracts); - ({ comptroller, vTokenBorrowed, oracle, vTokenCollateral } = contracts); - }); - - describe("liquidateCalculateAmountSeize", () => { - it("fails if borrowed asset price is 0", async () => { - setOraclePrice(vTokenBorrowed, 0); - const [err, result] = await calculateSeizeTokens(comptroller, vTokenBorrowed, vTokenCollateral, repayAmount); - expect(err).to.equal(ComptrollerErrorReporter.Error.PRICE_ERROR); - expect(result).to.equal(0); - }); - - it("fails if collateral asset price is 0", async () => { - setOraclePrice(vTokenCollateral, 0); - const [err, result] = await calculateSeizeTokens(comptroller, vTokenBorrowed, vTokenCollateral, repayAmount); - expect(err).to.equal(ComptrollerErrorReporter.Error.PRICE_ERROR); - expect(result).to.equal(0); - }); - - it("fails if the repayAmount causes overflow ", async () => { - await expect( - calculateSeizeTokens(comptroller, vTokenBorrowed, vTokenCollateral, constants.MaxUint256), - ).to.be.revertedWith("multiplication overflow"); - }); - - it("fails if the borrowed asset price causes overflow ", async () => { - setOraclePrice(vTokenBorrowed, constants.MaxUint256); - await expect(calculateSeizeTokens(comptroller, vTokenBorrowed, vTokenCollateral, repayAmount)).to.be.revertedWith( - "multiplication overflow", - ); - }); - - it("reverts if it fails to calculate the exchange rate", async () => { - vTokenCollateral.exchangeRateStored.reverts("exchangeRateStored: exchangeRateStoredInternal failed"); - /// TODO: Somehow the error message does not get propagated into the resulting tx. Smock bug? - await expect( - comptroller.liquidateCalculateSeizeTokens(vTokenBorrowed.address, vTokenCollateral.address, repayAmount), - ).to.be.reverted; // revertedWith("exchangeRateStored: exchangeRateStoredInternal failed"); - }); - - [ - [1e18, 1e18, 1e18, 1e18, 1e18], - [2e18, 1e18, 1e18, 1e18, 1e18], - [2e18, 2e18, 1.42e18, 1.3e18, 2.45e18], - [2.789e18, 5.230480842e18, 771.32e18, 1.3e18, 10002.45e18], - [7.009232529961056e24, 2.5278726317240445e24, 2.6177112093242585e23, 1179713989619784000, 7.790468414639561e24], - [rando(0, 1e25), rando(0, 1e25), rando(1, 1e25), rando(1e18, 1.5e18), rando(0, 1e25)], - ].forEach(testCase => { - it(`returns the correct value for ${testCase}`, async () => { - const [exchangeRate, borrowedPrice, collateralPrice, liquidationIncentive, repayAmount] = testCase.map(x => - BigInt(x), - ); - - setOraclePrice(vTokenCollateral, collateralPrice); - setOraclePrice(vTokenBorrowed, borrowedPrice); - await comptroller._setLiquidationIncentive(liquidationIncentive); - vTokenCollateral.exchangeRateStored.returns(exchangeRate); - - const seizeAmount = (repayAmount * liquidationIncentive * borrowedPrice) / collateralPrice; - const seizeTokens = seizeAmount / exchangeRate; - - const [err, result] = await calculateSeizeTokens(comptroller, vTokenBorrowed, vTokenCollateral, repayAmount); - expect(err).to.equal(ComptrollerErrorReporter.Error.NO_ERROR); - expect(Number(result)).to.be.approximately(Number(seizeTokens), 1e7); - }); - }); - }); -}); diff --git a/tests/hardhat/Comptroller/pauseTest.ts b/tests/hardhat/Comptroller/pauseTest.ts deleted file mode 100644 index 3d24f6339..000000000 --- a/tests/hardhat/Comptroller/pauseTest.ts +++ /dev/null @@ -1,124 +0,0 @@ -import { FakeContract, MockContract, smock } from "@defi-wonderland/smock"; -import { loadFixture } from "@nomicfoundation/hardhat-network-helpers"; -import chai from "chai"; - -import { - Comptroller, - Comptroller__factory, - IAccessControlManager, - PriceOracle, - VBep20Immutable, -} from "../../../typechain"; - -const { expect } = chai; -chai.use(smock.matchers); - -type PauseFixture = { - accessControl: FakeContract; - comptroller: MockContract; - oracle: FakeContract; - OMG: FakeContract; - ZRX: FakeContract; - BAT: FakeContract; - SKT: FakeContract; - allTokens: FakeContract[]; - names: string[]; -}; - -async function pauseFixture(): Promise { - const accessControl = await smock.fake("IAccessControlManager"); - const ComptrollerFactory = await smock.mock("Comptroller"); - const comptroller = await ComptrollerFactory.deploy(); - await comptroller._setAccessControl(accessControl.address); - const oracle = await smock.fake("PriceOracle"); - - accessControl.isAllowedToCall.returns(true); - await comptroller._setPriceOracle(oracle.address); - const names = ["OMG", "ZRX", "BAT", "sketch"]; - const [OMG, ZRX, BAT, SKT] = await Promise.all( - names.map(async name => { - const vToken = await smock.fake("VBep20Immutable"); - if (name !== "sketch") { - await comptroller._supportMarket(vToken.address); - } - return vToken; - }), - ); - const allTokens = [OMG, ZRX, BAT]; - return { accessControl, comptroller, oracle, OMG, ZRX, BAT, SKT, allTokens, names }; -} - -function configure({ accessControl, allTokens, names }: PauseFixture) { - accessControl.isAllowedToCall.reset(); - accessControl.isAllowedToCall.returns(true); - allTokens.map((vToken, i) => { - vToken.isVToken.returns(true); - vToken.symbol.returns(names[i]); - vToken.name.returns(names[i]); - vToken.getAccountSnapshot.returns([0, 0, 0, 0]); - }); -} - -describe("Comptroller", () => { - let comptroller: MockContract; - let OMG: FakeContract; - let ZRX: FakeContract; - let BAT: FakeContract; - let SKT: FakeContract; - - beforeEach(async () => { - const contracts = await loadFixture(pauseFixture); - configure(contracts); - ({ comptroller, OMG, ZRX, BAT, SKT } = contracts); - }); - - describe("_setActionsPaused", () => { - it("reverts if the market is not listed", async () => { - await expect(comptroller._setActionsPaused([SKT.address], [1], true)).to.be.revertedWith("market not listed"); - }); - - it("does nothing if the actions list is empty", async () => { - await comptroller._setActionsPaused([OMG.address, ZRX.address], [], true); - expect(await comptroller.actionPaused(OMG.address, 1)).to.equal(false); - expect(await comptroller.actionPaused(ZRX.address, 2)).to.equal(false); - }); - - it("does nothing if the markets list is empty", async () => { - await comptroller._setActionsPaused([], [1, 2, 3, 4, 5], true); - expect(await comptroller.actionPaused(OMG.address, 1)).to.equal(false); - expect(await comptroller.actionPaused(ZRX.address, 2)).to.equal(false); - }); - - it("can pause one action on several markets", async () => { - await comptroller._setActionsPaused([OMG.address, BAT.address], [1], true); - expect(await comptroller.actionPaused(OMG.address, 1)).to.equal(true); - expect(await comptroller.actionPaused(ZRX.address, 1)).to.equal(false); - expect(await comptroller.actionPaused(BAT.address, 1)).to.equal(true); - }); - - it("can pause several actions on one market", async () => { - await comptroller._setActionsPaused([OMG.address], [3, 5, 6], true); - expect(await comptroller.actionPaused(OMG.address, 3)).to.equal(true); - expect(await comptroller.actionPaused(OMG.address, 4)).to.equal(false); - expect(await comptroller.actionPaused(OMG.address, 5)).to.equal(true); - expect(await comptroller.actionPaused(OMG.address, 6)).to.equal(true); - }); - - it("can pause and unpause several actions on several markets", async () => { - await comptroller._setActionsPaused([OMG.address, BAT.address, ZRX.address], [3, 4, 5, 6], true); - await comptroller._setActionsPaused([ZRX.address, BAT.address], [3, 5], false); - expect(await comptroller.actionPaused(OMG.address, 3)).to.equal(true); - expect(await comptroller.actionPaused(OMG.address, 4)).to.equal(true); - expect(await comptroller.actionPaused(OMG.address, 5)).to.equal(true); - expect(await comptroller.actionPaused(OMG.address, 6)).to.equal(true); - expect(await comptroller.actionPaused(ZRX.address, 3)).to.equal(false); - expect(await comptroller.actionPaused(ZRX.address, 4)).to.equal(true); - expect(await comptroller.actionPaused(ZRX.address, 5)).to.equal(false); - expect(await comptroller.actionPaused(ZRX.address, 6)).to.equal(true); - expect(await comptroller.actionPaused(BAT.address, 3)).to.equal(false); - expect(await comptroller.actionPaused(BAT.address, 4)).to.equal(true); - expect(await comptroller.actionPaused(BAT.address, 5)).to.equal(false); - expect(await comptroller.actionPaused(BAT.address, 6)).to.equal(true); - }); - }); -}); diff --git a/tests/hardhat/Comptroller/verifyStorage.ts b/tests/hardhat/Comptroller/verifyStorage.ts deleted file mode 100644 index c69d59109..000000000 --- a/tests/hardhat/Comptroller/verifyStorage.ts +++ /dev/null @@ -1,174 +0,0 @@ -import { expect } from "chai"; -import { ethers } from "hardhat"; - -import { Comptroller__factory } from "./../../../typechain"; - -const helpers = require("@nomicfoundation/hardhat-network-helpers"); - -const Owner = "0x939bd8d64c0a9583a7dcea9933f7b21697ab6396"; -const Unitroller = "0xfD36E2c2a6789Db23113685031d7F16329158384"; -const zeroAddr = "0x0000000000000000000000000000000000000000"; -const prevComp = "0xae8ba50ee0a0e55ec21bf4ffe2c48d2fdf52d3e6"; -const BUSD = "0x95c78222B3D6e262426483D42CfA53685A67Ab9D"; - -let owner, - comptrollerV1, - comptrollerV2, - unitroller, - maxAssets, - closeFactorMantissa, - liquidationIncentiveMantissa, - venusRate, - venusSupplyState, - venusBorrowState, - venusAccrued, - vaiMintRate, - supplyCaps, - venusSpeeds; - -describe("Verify Storage Collison", () => { - // These tests checks the storage collision of comptroller while updating it. - // Using mainnet comptroller fork to verify it. - if (process.env.FORK_MAINNET === "true") { - before("Get Deployed Contract", async () => { - /* - * Forking mainnet - * */ - await helpers.impersonateAccount(Owner); - owner = await ethers.getSigner(Owner); - - /** - * sending gas cost to owner - * */ - const [signer] = await ethers.getSigners(); - console.log("-- Sending gas cost to owner addr --"); - await signer.sendTransaction({ - to: owner.address, - value: ethers.BigNumber.from("10000000000000000000"), - data: undefined, - }); - - unitroller = await ethers.getContractAt("contracts/Comptroller/Unitroller.sol:Unitroller", Unitroller, owner); - }); - describe("should match old admin address", async () => { - it("Owner of unitroller deployed contract should match", async () => { - const unitrollerAdmin = await unitroller.admin(); - const pendingAdmin = await unitroller.pendingAdmin(); - - expect(unitrollerAdmin.toLowerCase()).to.equal(Owner); - expect(pendingAdmin.toLowerCase()).to.equal(zeroAddr); - }); - - it("should match old Comptroller Address", async () => { - const comptrollerImplementation = await unitroller.comptrollerImplementation(); - const pendingComptrollerImplementation = await unitroller.pendingComptrollerImplementation(); - - expect(comptrollerImplementation.toLowerCase()).to.equal(prevComp); - expect(pendingComptrollerImplementation.toLowerCase()).to.equal(zeroAddr); - }); - }); - - describe("save initial states of Comptroller Storage", async () => { - it("Save all version 1 state", async () => { - const [signer] = await ethers.getSigners(); - const compBySigner = Comptroller__factory.connect(unitroller.address, signer); - - maxAssets = await compBySigner.maxAssets(); - closeFactorMantissa = await compBySigner.closeFactorMantissa(); - liquidationIncentiveMantissa = await compBySigner.liquidationIncentiveMantissa(); - await compBySigner.allMarkets(0); - await compBySigner.markets(BUSD); - venusRate = await compBySigner.venusRate(); - venusSpeeds = await compBySigner.venusSpeeds(BUSD); - venusSupplyState = await compBySigner.venusSupplyState(BUSD); - venusBorrowState = await compBySigner.venusBorrowState(BUSD); - venusAccrued = await compBySigner.venusAccrued(BUSD); - vaiMintRate = await compBySigner.vaiMintRate(); - supplyCaps = await compBySigner.supplyCaps(BUSD); - }); - }); - describe("deploy updatedComprtroller and verify previous states", async () => { - it("deploy updatedComptroller", async () => { - const ComptrollerV1 = await ethers.getContractFactory( - "contracts/Comptroller/UpdatedComptroller.sol:UpdatedComptroller", - ); - comptrollerV1 = await ComptrollerV1.deploy(); - await comptrollerV1.deployed(); - await unitroller.connect(owner)._setPendingImplementation(comptrollerV1.address); - await comptrollerV1.connect(owner)._become(unitroller.address); - }); - - it("verify all version 1 state", async () => { - const [signer] = await ethers.getSigners(); - const compBySigner = Comptroller__factory.connect(unitroller.address, signer); - - const maxAssetsV1 = await compBySigner.maxAssets(); - const closeFactorMantissaV1 = await compBySigner.closeFactorMantissa(); - const liquidationIncentiveMantissaV1 = await compBySigner.liquidationIncentiveMantissa(); - const allMarketsV1 = await compBySigner.allMarkets(0); - const venusRateV1 = await compBySigner.venusRate(); - const venusSpeedsV1 = await compBySigner.venusSpeeds(BUSD); - const venusSupplyStateV1 = await compBySigner.venusSupplyState(BUSD); - const venusBorrowStateV1 = await compBySigner.venusBorrowState(BUSD); - const venusAccruedV1 = await compBySigner.venusAccrued(BUSD); - const vaiMintRateV1 = await compBySigner.vaiMintRate(); - const supplyCapsV1 = await compBySigner.supplyCaps(BUSD); - const venusSupplySpeedsV1 = await compBySigner.venusSupplySpeeds(BUSD); - - expect(maxAssets).to.equal(maxAssetsV1); - expect(liquidationIncentiveMantissa).to.equal(liquidationIncentiveMantissaV1); - expect(closeFactorMantissa).to.equal(closeFactorMantissaV1); - expect(allMarketsV1).to.equal(allMarketsV1); - expect(venusRate).to.equal(venusRateV1); - expect(venusSpeedsV1).to.equal(0); - expect(venusSupplyState.index.toString()).to.equal(venusSupplyStateV1.index.toString()); - expect(venusBorrowState.index.toString()).to.equal(venusBorrowStateV1.index.toString()); - expect(venusAccrued).to.equal(venusAccruedV1); - expect(vaiMintRate).to.equal(vaiMintRateV1); - expect(supplyCaps).to.equal(supplyCapsV1); - expect(venusSpeeds.toString()).to.equal(venusSupplySpeedsV1.toString()); - }); - }); - - describe("deploy Comptroller and verify previous states", async () => { - it("deploy updatedComptroller", async () => { - const ComptrollerV2 = await ethers.getContractFactory("contracts/Comptroller/Comptroller.sol:Comptroller"); - comptrollerV2 = await ComptrollerV2.deploy(); - await comptrollerV2.deployed(); - await unitroller.connect(owner)._setPendingImplementation(comptrollerV2.address); - await comptrollerV2.connect(owner)._become(unitroller.address); - }); - - it("verify all version 2 state", async () => { - const [signer] = await ethers.getSigners(); - const compBySigner = Comptroller__factory.connect(unitroller.address, signer); - - const maxAssetsV2 = await compBySigner.maxAssets(); - const closeFactorMantissaV2 = await compBySigner.closeFactorMantissa(); - const liquidationIncentiveMantissaV2 = await compBySigner.liquidationIncentiveMantissa(); - const allMarketsV2 = await compBySigner.allMarkets(0); - const venusRateV2 = await compBySigner.venusRate(); - const venusSpeedsV2 = await compBySigner.venusSpeeds(BUSD); - const venusSupplyStateV2 = await compBySigner.venusSupplyState(BUSD); - const venusBorrowStateV2 = await compBySigner.venusBorrowState(BUSD); - const venusAccruedV2 = await compBySigner.venusAccrued(BUSD); - const vaiMintRateV2 = await compBySigner.vaiMintRate(); - const supplyCapsV2 = await compBySigner.supplyCaps(BUSD); - const venusSupplySpeedsV2 = await compBySigner.venusSupplySpeeds(BUSD); - - expect(maxAssets).to.equal(maxAssetsV2); - expect(liquidationIncentiveMantissa).to.equal(liquidationIncentiveMantissaV2); - expect(closeFactorMantissa).to.equal(closeFactorMantissaV2); - expect(allMarketsV2).to.equal(allMarketsV2); - expect(venusRate).to.equal(venusRateV2); - expect(venusSpeedsV2).to.equal(0); - expect(venusSupplyState.index.toString()).to.equal(venusSupplyStateV2.index.toString()); - expect(venusBorrowState.index.toString()).to.equal(venusBorrowStateV2.index.toString()); - expect(venusAccrued).to.equal(venusAccruedV2); - expect(vaiMintRate).to.equal(vaiMintRateV2); - expect(supplyCaps).to.equal(supplyCapsV2); - expect(venusSpeeds.toString()).to.equal(venusSupplySpeedsV2.toString()); - }); - }); - } -}); From b254f90a6ba421cb67a1fb4db38b4225640df720 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Thu, 15 Jun 2023 14:30:08 +0530 Subject: [PATCH 094/153] test: added mock comptroller for tests --- contracts/test/ComptrollerHarness.sol | 434 +------------------------ contracts/test/ComptrollerMock.sol | 30 ++ contracts/test/ComptrollerScenario.sol | 12 +- 3 files changed, 40 insertions(+), 436 deletions(-) create mode 100644 contracts/test/ComptrollerMock.sol diff --git a/contracts/test/ComptrollerHarness.sol b/contracts/test/ComptrollerHarness.sol index 4b2c3bbe8..15f1655bf 100644 --- a/contracts/test/ComptrollerHarness.sol +++ b/contracts/test/ComptrollerHarness.sol @@ -1,26 +1,15 @@ pragma solidity ^0.5.16; -import "../Comptroller/Comptroller.sol"; +import "./ComptrollerMock.sol"; import "../Oracle/PriceOracle.sol"; +import "../Comptroller/Unitroller.sol"; -contract ComptrollerKovan is Comptroller { - function getXVSAddress() public view returns (address) { - return 0x61460874a7196d6a22D1eE4922473664b3E95270; - } -} - -contract ComptrollerRopsten is Comptroller { - function getXVSAddress() public view returns (address) { - return 0x1Fe16De955718CFAb7A44605458AB023838C2793; - } -} - -contract ComptrollerHarness is Comptroller { +contract ComptrollerHarness is ComptrollerMock { address internal xvsAddress; address internal vXVSAddress; uint public blockNumber; - constructor() public Comptroller() {} + constructor() public ComptrollerMock() {} function setVenusSupplyState(address vToken, uint224 index, uint32 blockNumber_) public { venusSupplyState[vToken].index = index; @@ -40,18 +29,10 @@ contract ComptrollerHarness is Comptroller { xvsAddress = xvsAddress_; } - function getXVSAddress() public view returns (address) { - return xvsAddress; - } - function setXVSVTokenAddress(address vXVSAddress_) public { vXVSAddress = vXVSAddress_; } - function getXVSVTokenAddress() public view returns (address) { - return vXVSAddress; - } - /** * @notice Set the amount of XVS distributed per block * @param venusRate_ The amount of XVS wei per block to distribute @@ -189,413 +170,6 @@ contract ComptrollerHarness is Comptroller { } } -contract ComptrollerBorked { - function _become(Unitroller unitroller) public { - require(msg.sender == unitroller.admin(), "only unitroller admin can change brains"); - unitroller._acceptImplementation(); - } -} - -contract BoolComptroller is ComptrollerInterface { - bool internal allowMint = true; - bool internal allowRedeem = true; - bool internal allowBorrow = true; - bool internal allowRepayBorrow = true; - bool internal allowLiquidateBorrow = true; - bool internal allowSeize = true; - bool internal allowTransfer = true; - - bool internal verifyMint = true; - bool internal verifyRedeem = true; - bool internal verifyBorrow = true; - bool internal verifyRepayBorrow = true; - bool internal verifyLiquidateBorrow = true; - bool internal verifySeize = true; - bool internal verifyTransfer = true; - uint public liquidationIncentiveMantissa = 11e17; - bool internal failCalculateSeizeTokens; - uint internal calculatedSeizeTokens; - - bool public protocolPaused = false; - - mapping(address => uint) public mintedVAIs; - bool internal vaiFailCalculateSeizeTokens; - uint internal vaiCalculatedSeizeTokens; - - uint internal noError = 0; - uint internal opaqueError = noError + 11; // an arbitrary, opaque error code - - address public treasuryGuardian; - address public treasuryAddress; - uint public treasuryPercent; - address public liquidatorContract; - - /*** Assets You Are In ***/ - - function enterMarkets(address[] calldata _vTokens) external returns (uint[] memory) { - _vTokens; - uint[] memory ret; - return ret; - } - - function exitMarket(address _vToken) external returns (uint) { - _vToken; - return noError; - } - - /*** Policy Hooks ***/ - - function mintAllowed(address _vToken, address _minter, uint _mintAmount) external returns (uint) { - _vToken; - _minter; - _mintAmount; - return allowMint ? noError : opaqueError; - } - - function mintVerify(address _vToken, address _minter, uint _mintAmount, uint _mintTokens) external { - _vToken; - _minter; - _mintAmount; - _mintTokens; - require(verifyMint, "mintVerify rejected mint"); - } - - function redeemAllowed(address _vToken, address _redeemer, uint _redeemTokens) external returns (uint) { - _vToken; - _redeemer; - _redeemTokens; - return allowRedeem ? noError : opaqueError; - } - - function redeemVerify(address _vToken, address _redeemer, uint _redeemAmount, uint _redeemTokens) external { - _vToken; - _redeemer; - _redeemAmount; - _redeemTokens; - require(verifyRedeem, "redeemVerify rejected redeem"); - } - - function borrowAllowed(address _vToken, address _borrower, uint _borrowAmount) external returns (uint) { - _vToken; - _borrower; - _borrowAmount; - return allowBorrow ? noError : opaqueError; - } - - function borrowVerify(address _vToken, address _borrower, uint _borrowAmount) external { - _vToken; - _borrower; - _borrowAmount; - require(verifyBorrow, "borrowVerify rejected borrow"); - } - - function repayBorrowAllowed( - address _vToken, - address _payer, - address _borrower, - uint _repayAmount - ) external returns (uint) { - _vToken; - _payer; - _borrower; - _repayAmount; - return allowRepayBorrow ? noError : opaqueError; - } - - function repayBorrowVerify( - address _vToken, - address _payer, - address _borrower, - uint _repayAmount, - uint _borrowerIndex - ) external { - _vToken; - _payer; - _borrower; - _repayAmount; - _borrowerIndex; - require(verifyRepayBorrow, "repayBorrowVerify rejected repayBorrow"); - } - - function _setLiquidatorContract(address liquidatorContract_) external { - liquidatorContract = liquidatorContract_; - } - - function liquidateBorrowAllowed( - address _vTokenBorrowed, - address _vTokenCollateral, - address _liquidator, - address _borrower, - uint _repayAmount - ) external returns (uint) { - _vTokenBorrowed; - _vTokenCollateral; - _borrower; - _repayAmount; - if (liquidatorContract != address(0) && liquidatorContract != _liquidator) { - return opaqueError; - } - return allowLiquidateBorrow ? noError : opaqueError; - } - - function liquidateBorrowVerify( - address _vTokenBorrowed, - address _vTokenCollateral, - address _liquidator, - address _borrower, - uint _repayAmount, - uint _seizeTokens - ) external { - _vTokenBorrowed; - _vTokenCollateral; - _liquidator; - _borrower; - _repayAmount; - _seizeTokens; - require(verifyLiquidateBorrow, "liquidateBorrowVerify rejected liquidateBorrow"); - } - - function seizeAllowed( - address _vTokenCollateral, - address _vTokenBorrowed, - address _borrower, - address _liquidator, - uint _seizeTokens - ) external returns (uint) { - _vTokenCollateral; - _vTokenBorrowed; - _liquidator; - _borrower; - _seizeTokens; - return allowSeize ? noError : opaqueError; - } - - function seizeVerify( - address _vTokenCollateral, - address _vTokenBorrowed, - address _liquidator, - address _borrower, - uint _seizeTokens - ) external { - _vTokenCollateral; - _vTokenBorrowed; - _liquidator; - _borrower; - _seizeTokens; - require(verifySeize, "seizeVerify rejected seize"); - } - - function transferAllowed( - address _vToken, - address _src, - address _dst, - uint _transferTokens - ) external returns (uint) { - _vToken; - _src; - _dst; - _transferTokens; - return allowTransfer ? noError : opaqueError; - } - - function transferVerify(address _vToken, address _src, address _dst, uint _transferTokens) external { - _vToken; - _src; - _dst; - _transferTokens; - require(verifyTransfer, "transferVerify rejected transfer"); - } - - /*** Special Liquidation Calculation ***/ - - function liquidateCalculateSeizeTokens( - address _vTokenBorrowed, - address _vTokenCollateral, - uint _repayAmount - ) external view returns (uint, uint) { - _vTokenBorrowed; - _vTokenCollateral; - _repayAmount; - return failCalculateSeizeTokens ? (opaqueError, 0) : (noError, calculatedSeizeTokens); - } - - /*** Special Liquidation Calculation ***/ - - function liquidateVAICalculateSeizeTokens( - address _vTokenCollateral, - uint _repayAmount - ) external view returns (uint, uint) { - _vTokenCollateral; - _repayAmount; - return vaiFailCalculateSeizeTokens ? (opaqueError, 0) : (noError, vaiCalculatedSeizeTokens); - } - - /**** Mock Settors ****/ - - /*** Policy Hooks ***/ - - function setMintAllowed(bool allowMint_) public { - allowMint = allowMint_; - } - - function setMintVerify(bool verifyMint_) public { - verifyMint = verifyMint_; - } - - function setRedeemAllowed(bool allowRedeem_) public { - allowRedeem = allowRedeem_; - } - - function setRedeemVerify(bool verifyRedeem_) public { - verifyRedeem = verifyRedeem_; - } - - function setBorrowAllowed(bool allowBorrow_) public { - allowBorrow = allowBorrow_; - } - - function setBorrowVerify(bool verifyBorrow_) public { - verifyBorrow = verifyBorrow_; - } - - function setRepayBorrowAllowed(bool allowRepayBorrow_) public { - allowRepayBorrow = allowRepayBorrow_; - } - - function setRepayBorrowVerify(bool verifyRepayBorrow_) public { - verifyRepayBorrow = verifyRepayBorrow_; - } - - function setLiquidateBorrowAllowed(bool allowLiquidateBorrow_) public { - allowLiquidateBorrow = allowLiquidateBorrow_; - } - - function setLiquidateBorrowVerify(bool verifyLiquidateBorrow_) public { - verifyLiquidateBorrow = verifyLiquidateBorrow_; - } - - function setSeizeAllowed(bool allowSeize_) public { - allowSeize = allowSeize_; - } - - function setSeizeVerify(bool verifySeize_) public { - verifySeize = verifySeize_; - } - - function setTransferAllowed(bool allowTransfer_) public { - allowTransfer = allowTransfer_; - } - - function setTransferVerify(bool verifyTransfer_) public { - verifyTransfer = verifyTransfer_; - } - - /*** Liquidity/Liquidation Calculations ***/ - function setAnnouncedLiquidationIncentiveMantissa(uint mantissa_) external { - liquidationIncentiveMantissa = mantissa_; - } - - /*** Liquidity/Liquidation Calculations ***/ - - function setCalculatedSeizeTokens(uint seizeTokens_) public { - calculatedSeizeTokens = seizeTokens_; - } - - function setFailCalculateSeizeTokens(bool shouldFail) public { - failCalculateSeizeTokens = shouldFail; - } - - function setVAICalculatedSeizeTokens(uint vaiSeizeTokens_) public { - vaiCalculatedSeizeTokens = vaiSeizeTokens_; - } - - function setVAIFailCalculateSeizeTokens(bool vaiShouldFail) public { - vaiFailCalculateSeizeTokens = vaiShouldFail; - } - - function harnessSetMintedVAIOf(address owner, uint amount) external returns (uint) { - mintedVAIs[owner] = amount; - return noError; - } - - // function mintedVAIs(address owner) external pure returns (uint) { - // owner; - // return 1e18; - // } - - function setMintedVAIOf(address owner, uint amount) external returns (uint) { - owner; - amount; - return noError; - } - - function vaiMintRate() external pure returns (uint) { - return 1e18; - } - - function setTreasuryData(address treasuryGuardian_, address treasuryAddress_, uint treasuryPercent_) external { - treasuryGuardian = treasuryGuardian_; - treasuryAddress = treasuryAddress_; - treasuryPercent = treasuryPercent_; - } - - function _setMarketSupplyCaps(VToken[] calldata vTokens, uint[] calldata newSupplyCaps) external {} - - /*** Functions from ComptrollerInterface not implemented by BoolComptroller ***/ - - function markets(address) external view returns (bool, uint) { - revert(); - } - - function oracle() external view returns (PriceOracle) { - revert(); - } - - function getAccountLiquidity(address) external view returns (uint, uint, uint) { - revert(); - } - - function getAssetsIn(address) external view returns (VToken[] memory) { - revert(); - } - - function claimVenus(address) external { - revert(); - } - - function venusAccrued(address) external view returns (uint) { - revert(); - } - - function venusSpeeds(address) external view returns (uint) { - revert(); - } - - function getAllMarkets() external view returns (VToken[] memory) { - revert(); - } - - function venusSupplierIndex(address, address) external view returns (uint) { - revert(); - } - - function venusInitialIndex() external view returns (uint224) { - revert(); - } - - function venusBorrowerIndex(address, address) external view returns (uint) { - revert(); - } - - function venusBorrowState(address) external view returns (uint224, uint32) { - revert(); - } - - function venusSupplyState(address) external view returns (uint224, uint32) { - revert(); - } -} - contract EchoTypesComptroller is UnitrollerAdminStorage { function stringy(string memory s) public pure returns (string memory) { return s; diff --git a/contracts/test/ComptrollerMock.sol b/contracts/test/ComptrollerMock.sol new file mode 100644 index 000000000..2a7f44e5c --- /dev/null +++ b/contracts/test/ComptrollerMock.sol @@ -0,0 +1,30 @@ +pragma solidity ^0.5.16; + +import "../Comptroller/Diamond/facets/MarketFacet.sol"; +import "../Comptroller/Diamond/facets/PolicyFacet.sol"; +import "../Comptroller/Diamond/facets/RewardFacet.sol"; +import "../Comptroller/Diamond/facets/SetterFacet.sol"; +import "../Comptroller/Unitroller.sol"; + +// This contract contains all methods of Comptroller implementation in different facets at one place for testing purpose +// This contract does not have diamond functionality(i.e delegate call to facets methods) +contract ComptrollerMock is MarketFacet, PolicyFacet, RewardFacet, SetterFacet { + constructor() public { + admin = msg.sender; + } + + function _become(Unitroller unitroller) public { + require(msg.sender == unitroller.admin(), "only unitroller admin can"); + require(unitroller._acceptImplementation() == 0, "not authorized"); + } + + function _setComptrollerLens(ComptrollerLensInterface comptrollerLens_) external returns (uint) { + ensureAdmin(); + ensureNonzeroAddress(address(comptrollerLens_)); + address oldComptrollerLens = address(comptrollerLens); + comptrollerLens = comptrollerLens_; + emit NewComptrollerLens(oldComptrollerLens, address(comptrollerLens)); + + return uint(Error.NO_ERROR); + } +} diff --git a/contracts/test/ComptrollerScenario.sol b/contracts/test/ComptrollerScenario.sol index 8c247aa3c..5333c7891 100644 --- a/contracts/test/ComptrollerScenario.sol +++ b/contracts/test/ComptrollerScenario.sol @@ -1,21 +1,21 @@ pragma solidity ^0.5.16; -import "../Comptroller/Comptroller.sol"; +import "./ComptrollerMock.sol"; -contract ComptrollerScenario is Comptroller { +contract ComptrollerScenario is ComptrollerMock { uint public blockNumber; address public xvsAddress; address public vaiAddress; - constructor() public Comptroller() {} + constructor() public ComptrollerMock() {} function setXVSAddress(address xvsAddress_) public { xvsAddress = xvsAddress_; } - function getXVSAddress() public view returns (address) { - return xvsAddress; - } + // function getXVSAddress() public view returns (address) { + // return xvsAddress; + // } function setVAIAddress(address vaiAddress_) public { vaiAddress = vaiAddress_; From 11041cfd65f78b324593e38ef85bfc54a22d8425 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Thu, 15 Jun 2023 14:31:12 +0530 Subject: [PATCH 095/153] test: refactored tests to use mock comptroller instead of comptroller --- script/hardhat/fork/govUpdateTest.ts | 6 +-- script/hardhat/fork/vaiStabilityFeeTest.ts | 6 +-- script/hardhat/fork/vip-101.ts | 10 ++--- script/hardhat/fork/vip-103.ts | 2 +- script/hardhat/fork/vip-104.ts | 10 ++--- script/hardhat/fork/vip-98.ts | 6 +-- script/hardhat/fork/vip-99.ts | 6 +-- script/hardhat/fork/vip-framework/utils.ts | 2 +- .../hardhat/Comptroller/Diamond/XVSSpeeds.ts | 6 +-- .../Comptroller/Diamond/accessControl.ts | 8 ++-- .../Comptroller/Diamond/assetListTest.ts | 10 ++--- .../Comptroller/Diamond/comptrollerTest.ts | 42 +++++++++---------- .../liquidateCalculateAmoutSeizeTest.ts | 11 +++-- .../hardhat/Comptroller/Diamond/pauseTest.ts | 10 ++--- .../DelegateBorrowers/SwapDebtDelegate.ts | 6 +-- tests/hardhat/Fork/diamondTest.ts | 4 +- tests/hardhat/Fork/swapTest.ts | 8 ++-- tests/hardhat/Lens/Rewards.ts | 13 +++--- .../Liquidator/liquidatorHarnessTest.ts | 6 +-- tests/hardhat/Liquidator/liquidatorTest.ts | 6 +-- .../Liquidator/restrictedLiquidations.ts | 6 +-- tests/hardhat/Unitroller/unitrollerTest.ts | 8 ++-- tests/hardhat/VAI/VAIController.ts | 11 +++-- 23 files changed, 102 insertions(+), 101 deletions(-) diff --git a/script/hardhat/fork/govUpdateTest.ts b/script/hardhat/fork/govUpdateTest.ts index 0d06697cb..5335ef45a 100644 --- a/script/hardhat/fork/govUpdateTest.ts +++ b/script/hardhat/fork/govUpdateTest.ts @@ -4,7 +4,7 @@ import { expect } from "chai"; import { parseUnits } from "ethers/lib/utils"; import { ethers } from "hardhat"; -import { Comptroller, GovernorBravoDelegate, IAccessControlManager } from "../../../typechain"; +import { ComptrollerInterface, GovernorBravoDelegate, IAccessControlManager } from "../../../typechain"; import { TimelockInterface } from "../../../typechain/contracts/Governance/GovernorAlpha2.sol"; import { getCalldatas, setForkBlock } from "./vip-framework/utils"; @@ -51,7 +51,7 @@ const PROPOSAL_TYPES = { CRITICAL: 2, }; -let comptrollerProxy: Comptroller; +let comptrollerProxy: ComptrollerInterface; let accessControl: IAccessControlManager; let governorProxy: GovernorBravoDelegate; let proposer: SignerWithAddress; @@ -74,7 +74,7 @@ const governanceFixture = async (): Promise => { governorAdmin = await initMainnetUser("0x1c2cac6ec528c20800b2fe734820d87b581eaa6b", ethers.utils.parseEther("1.0")); aclAdmin = await initMainnetUser(NORMAL_VIP_TIMELOCK, ethers.utils.parseEther("1.0")); - comptrollerProxy = await ethers.getContractAt("Comptroller", COMPTROLLER_PROXY_MAINNET); + comptrollerProxy = await ethers.getContractAt("ComptrollerInterface", COMPTROLLER_PROXY_MAINNET); const Timelock = await ethers.getContractFactory("Timelock"); timeLockFastTrack = await Timelock.deploy(GOVERNOR_PROXY_MAINNET, TIMELOCK_DELAYS_MAINNET.FAST_TRACK); timeLockCritical = await Timelock.deploy(GOVERNOR_PROXY_MAINNET, TIMELOCK_DELAYS_MAINNET.CRITICAL); diff --git a/script/hardhat/fork/vaiStabilityFeeTest.ts b/script/hardhat/fork/vaiStabilityFeeTest.ts index d995d5278..285200b33 100644 --- a/script/hardhat/fork/vaiStabilityFeeTest.ts +++ b/script/hardhat/fork/vaiStabilityFeeTest.ts @@ -5,7 +5,7 @@ import { BigNumber, BigNumberish } from "ethers"; import { parseEther, parseUnits } from "ethers/lib/utils"; import { ethers, network } from "hardhat"; -import { Comptroller, Comptroller__factory, VAIController, VAIController__factory } from "../../../typechain"; +import { ComptrollerMock, Comptroller__factory, VAIController, VAIController__factory } from "../../../typechain"; import { forking, testVip } from "./vip-framework"; import GOVERNOR_V3_ABI from "./vip-framework/abi/governorV3Abi.json"; import { initMainnetUser } from "./vip-framework/utils"; @@ -122,7 +122,7 @@ forking(24265539, () => { describe("VIP-80 Post-upgrade behavior", async () => { const BLOCKS_PER_YEAR = 10512000n; const interestPerBlock = parseUnits("0.01", 18).div(BLOCKS_PER_YEAR); - let comptroller: Comptroller; + let comptroller: ComptrollerMock; let vaiController: VAIController; let vaiUser: SignerWithAddress; @@ -132,7 +132,7 @@ forking(24265539, () => { }; const postUpgradeFixture = async () => { - comptroller = await ethers.getContractAt("Comptroller", COMPTROLLER_PROXY); + comptroller = await ethers.getContractAt("ComptrollerMock", COMPTROLLER_PROXY); vaiController = await ethers.getContractAt("VAIController", VAI_CONTROLLER_PROXY); const someVaiUserAddress = "0x5c062b3b0486f61789d680cae37909b92c0dacc5"; vaiUser = await initMainnetUser(someVaiUserAddress, parseEther("1.0")); diff --git a/script/hardhat/fork/vip-101.ts b/script/hardhat/fork/vip-101.ts index 5cb7cf2b7..78407f704 100644 --- a/script/hardhat/fork/vip-101.ts +++ b/script/hardhat/fork/vip-101.ts @@ -2,7 +2,7 @@ import { expect } from "chai"; import { parseUnits } from "ethers/lib/utils"; import { ethers } from "hardhat"; -import { Comptroller } from "../../../typechain"; +import { ComptrollerInterface } from "../../../typechain"; import { forking, pretendExecutingVip, testVip } from "./vip-framework"; import { ProposalType } from "./vip-framework/types"; import { makeProposal } from "./vip-framework/utils"; @@ -70,10 +70,10 @@ const vip101 = () => { }; forking(26107552, () => { - let comptroller: Comptroller; + let comptroller: ComptrollerInterface; before(async () => { - comptroller = await ethers.getContractAt("Comptroller", COMPTROLLER); + comptroller = await ethers.getContractAt("ComptrollerInterface", COMPTROLLER); }); describe("PRE-VIP behavior", async () => { @@ -114,10 +114,10 @@ forking(26107552, () => { }); forking(26107552, () => { - let comptroller: Comptroller; + let comptroller: ComptrollerInterface; before(async () => { - comptroller = await ethers.getContractAt("Comptroller", COMPTROLLER); + comptroller = await ethers.getContractAt("ComptrollerInterface", COMPTROLLER); await pretendExecutingVip(vip101()); }); diff --git a/script/hardhat/fork/vip-103.ts b/script/hardhat/fork/vip-103.ts index 781869480..90155b1be 100644 --- a/script/hardhat/fork/vip-103.ts +++ b/script/hardhat/fork/vip-103.ts @@ -78,7 +78,7 @@ forking(26544741, () => { let comptroller: any; before(async () => { - comptroller = await ethers.getContractAt("Comptroller", COMPTROLLER); + comptroller = await ethers.getContractAt("ComptrollerInterface", COMPTROLLER); await pretendExecutingVip(vip103()); }); diff --git a/script/hardhat/fork/vip-104.ts b/script/hardhat/fork/vip-104.ts index 9ae333069..a1463668f 100644 --- a/script/hardhat/fork/vip-104.ts +++ b/script/hardhat/fork/vip-104.ts @@ -2,7 +2,7 @@ import { expect } from "chai"; import { parseUnits } from "ethers/lib/utils"; import { ethers } from "hardhat"; -import { Comptroller } from "../../../typechain"; +import { ComptrollerInterface } from "../../../typechain"; import COMPTROLLER_ABI from "./vip-104/comptroller.json"; import { forking, pretendExecutingVip, testVip } from "./vip-framework"; import { ProposalType } from "./vip-framework/types"; @@ -73,10 +73,10 @@ export const vip104 = () => { }; forking(26881099, () => { - let comptroller: Comptroller; + let comptroller: ComptrollerInterface; before(async () => { - comptroller = await ethers.getContractAt("Comptroller", COMPTROLLER); + comptroller = await ethers.getContractAt("ComptrollerInterface", COMPTROLLER); }); describe("Pre-VIP behavior", async () => { @@ -130,10 +130,10 @@ forking(26881099, () => { }); forking(26881099, () => { - let comptroller: Comptroller; + let comptroller: ComptrollerInterface; before(async () => { - comptroller = await ethers.getContractAt("Comptroller", COMPTROLLER); + comptroller = await ethers.getContractAt("ComptrollerInterface", COMPTROLLER); await pretendExecutingVip(vip104()); }); diff --git a/script/hardhat/fork/vip-98.ts b/script/hardhat/fork/vip-98.ts index 62ebcade6..96b261071 100644 --- a/script/hardhat/fork/vip-98.ts +++ b/script/hardhat/fork/vip-98.ts @@ -2,7 +2,7 @@ import { expect } from "chai"; import { parseUnits } from "ethers/lib/utils"; import { ethers } from "hardhat"; -import { Comptroller, IERC20Upgradeable, PriceOracle, VBep20 } from "../../../typechain"; +import { ComptrollerInterface, IERC20Upgradeable, PriceOracle, VBep20 } from "../../../typechain"; import { forking, pretendExecutingVip, testVip } from "./vip-framework"; import { ProposalType } from "./vip-framework/types"; import { makeProposal } from "./vip-framework/utils"; @@ -144,14 +144,14 @@ forking(25892445, () => { }); forking(25892445, () => { - let comptroller: Comptroller; + let comptroller: ComptrollerInterface; let trx: IERC20Upgradeable; let vTrxOld: VBep20; let vTrx: VBep20; let oracle: PriceOracle; before(async () => { - comptroller = await ethers.getContractAt("Comptroller", COMPTROLLER); + comptroller = await ethers.getContractAt("ComptrollerInterface", COMPTROLLER); const oracleAddress = await comptroller.oracle(); oracle = await ethers.getContractAt("PriceOracle", oracleAddress); trx = await ethers.getContractAt("IERC20Upgradeable", NEW_TRX); diff --git a/script/hardhat/fork/vip-99.ts b/script/hardhat/fork/vip-99.ts index c4c3fc47f..7b0f09fde 100644 --- a/script/hardhat/fork/vip-99.ts +++ b/script/hardhat/fork/vip-99.ts @@ -5,7 +5,7 @@ import { parseEther, parseUnits } from "ethers/lib/utils"; import { ethers } from "hardhat"; import { - Comptroller, + ComptrollerMock, IERC20Upgradeable, PriceOracle, SwapDebtDelegate, @@ -89,7 +89,7 @@ forking(25918391, () => { // Ressetting the fork to prevent oracle prices from getting stale forking(25918391, () => { - let comptroller: Comptroller; + let comptroller: ComptrollerMock; let busd: IERC20Upgradeable; let usdt: IERC20Upgradeable; let btc: IERC20Upgradeable; @@ -102,7 +102,7 @@ forking(25918391, () => { let oracle: PriceOracle; before(async () => { - comptroller = await ethers.getContractAt("Comptroller", COMPTROLLER); + comptroller = await ethers.getContractAt("ComptrollerMock", COMPTROLLER); [vBUSD, vUSDC, vUSDT, vBTC, vETH] = await Promise.all( [VBUSD, VUSDC, VUSDT, VBTC, VETH].map((address: string) => { return ethers.getContractAt("VBep20Delegate", address); diff --git a/script/hardhat/fork/vip-framework/utils.ts b/script/hardhat/fork/vip-framework/utils.ts index a649ad4a4..6c3b281ca 100644 --- a/script/hardhat/fork/vip-framework/utils.ts +++ b/script/hardhat/fork/vip-framework/utils.ts @@ -69,7 +69,7 @@ export const setMaxStalePeriodInOracle = async ( comptrollerAddress: string, maxStalePeriodInSeconds: number = 31536000 /* 1 year */, ) => { - const comptroller = await ethers.getContractAt("Comptroller", comptrollerAddress); + const comptroller = await ethers.getContractAt("ComptrollerInterface", comptrollerAddress); const oracle = await ethers.getContractAt("VenusChainlinkOracle", await comptroller.oracle()); const oracleAdmin = await initMainnetUser(await oracle.admin(), ethers.utils.parseEther("1.0")); diff --git a/tests/hardhat/Comptroller/Diamond/XVSSpeeds.ts b/tests/hardhat/Comptroller/Diamond/XVSSpeeds.ts index e42aa9e9b..892c6ed73 100644 --- a/tests/hardhat/Comptroller/Diamond/XVSSpeeds.ts +++ b/tests/hardhat/Comptroller/Diamond/XVSSpeeds.ts @@ -3,7 +3,7 @@ import chai from "chai"; import { ethers, network } from "hardhat"; import { convertToUnit } from "../../../../helpers/utils"; -import { Comptroller, IAccessControlManager, Unitroller, VToken } from "../../../../typechain"; +import { ComptrollerMock, IAccessControlManager, Unitroller, VToken } from "../../../../typechain"; import { deployDiamond } from "./scripts/deploy"; const { expect } = chai; @@ -11,7 +11,7 @@ chai.use(smock.matchers); describe("Comptroller", () => { let unitroller: Unitroller; - let comptroller: Comptroller; + let comptroller: ComptrollerMock; let accessControl: FakeContract; let vToken1: FakeContract; let vToken2: FakeContract; @@ -20,7 +20,7 @@ describe("Comptroller", () => { const result = await deployDiamond(""); unitroller = result.unitroller; - comptroller = await ethers.getContractAt("Comptroller", unitroller.address); + comptroller = await ethers.getContractAt("ComptrollerMock", unitroller.address); accessControl = await smock.fake( "contracts/Governance/IAccessControlManager.sol:IAccessControlManager", ); diff --git a/tests/hardhat/Comptroller/Diamond/accessControl.ts b/tests/hardhat/Comptroller/Diamond/accessControl.ts index c22c71fe8..b65f99e55 100644 --- a/tests/hardhat/Comptroller/Diamond/accessControl.ts +++ b/tests/hardhat/Comptroller/Diamond/accessControl.ts @@ -3,7 +3,7 @@ import chai from "chai"; import { Signer, constants } from "ethers"; import { ethers } from "hardhat"; -import { Comptroller, Comptroller__factory, IAccessControlManager } from "../../../typechain"; +import { ComptrollerMock, IAccessControlManager } from "../../../typechain"; import { deployDiamond } from "./scripts/deploy"; const { expect } = chai; @@ -12,9 +12,9 @@ chai.use(smock.matchers); describe("Comptroller", () => { let user: Signer; let userAddress: string; - let unitroller: Comptroller; + let unitroller: ComptrollerMock; let accessControl: FakeContract; - let comptroller: Comptroller; + let comptroller: ComptrollerMock; beforeEach(async () => { const signers = await ethers.getSigners(); @@ -25,7 +25,7 @@ describe("Comptroller", () => { ); const result = await deployDiamond(""); unitroller = result.unitroller; - comptroller = await ethers.getContractAt("Comptroller", unitroller.address); + comptroller = await ethers.getContractAt("ComptrollerMock", unitroller.address); }); describe("_setAccessControlManager", () => { diff --git a/tests/hardhat/Comptroller/Diamond/assetListTest.ts b/tests/hardhat/Comptroller/Diamond/assetListTest.ts index 75559d1e7..c3a87ff59 100644 --- a/tests/hardhat/Comptroller/Diamond/assetListTest.ts +++ b/tests/hardhat/Comptroller/Diamond/assetListTest.ts @@ -6,9 +6,9 @@ import { ethers } from "hardhat"; import { convertToUnit } from "../../../../helpers/utils"; import { - Comptroller, ComptrollerLens, ComptrollerLens__factory, + ComptrollerMock, IAccessControlManager, PriceOracle, Unitroller, @@ -26,7 +26,7 @@ describe("Comptroller: assetListTest", () => { let root: Signer; // eslint-disable-line @typescript-eslint/no-unused-vars let customer: Signer; let unitroller: Unitroller; - let comptroller: Comptroller; + let comptroller: ComptrollerMock; let OMG: FakeContract; let ZRX: FakeContract; let BAT: FakeContract; @@ -34,7 +34,7 @@ describe("Comptroller: assetListTest", () => { let allTokens: FakeContract[]; type AssetListFixture = { - unitroller: MockContract; + unitroller: MockContract; comptrollerLens: MockContract; oracle: FakeContract; OMG: FakeContract; @@ -49,14 +49,14 @@ describe("Comptroller: assetListTest", () => { const accessControl = await smock.fake( "contracts/Governance/IAccessControlManager.sol:IAccessControlManager", ); - // const ComptrollerFactory = await smock.mock("Comptroller"); + // const ComptrollerFactory = await smock.mock("ComptrollerMock"); const ComptrollerLensFactory = await smock.mock("ComptrollerLens"); const result = await deployDiamond(""); unitroller = result.unitroller; const comptrollerLens = await ComptrollerLensFactory.deploy(); const oracle = await smock.fake("contracts/Oracle/PriceOracle.sol:PriceOracle"); accessControl.isAllowedToCall.returns(true); - comptroller = await ethers.getContractAt("Comptroller", unitroller.address); + comptroller = await ethers.getContractAt("ComptrollerMock", unitroller.address); await comptroller._setAccessControl(accessControl.address); await comptroller._setComptrollerLens(comptrollerLens.address); await comptroller._setPriceOracle(oracle.address); diff --git a/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts b/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts index 62e562b98..37df1e34e 100644 --- a/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts +++ b/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts @@ -6,9 +6,9 @@ import { ethers } from "hardhat"; import { convertToUnit } from "../../../../helpers/utils"; import { - Comptroller, ComptrollerLens, ComptrollerLens__factory, + ComptrollerMock, EIP20Interface, IAccessControlManager, PriceOracle, @@ -26,7 +26,7 @@ type SimpleComptrollerFixture = { accessControl: FakeContract; comptrollerLens: MockContract; unitroller: Unitroller; - comptroller: Comptroller; + comptroller: ComptrollerMock; }; async function deploySimpleComptroller(): Promise { @@ -36,10 +36,10 @@ async function deploySimpleComptroller(): Promise { ); accessControl.isAllowedToCall.returns(true); const ComptrollerLensFactory = await smock.mock("ComptrollerLens"); - // const ComptrollerFactory = await smock.mock("Comptroller"); + // const ComptrollerFactory = await smock.mock("ComptrollerMock"); const result = await deployDiamond(""); const unitroller = result.unitroller; - const comptroller = await ethers.getContractAt("Comptroller", unitroller.address); + const comptroller = await ethers.getContractAt("ComptrollerMock", unitroller.address); const comptrollerLens = await ComptrollerLensFactory.deploy(); await comptroller._setAccessControl(accessControl.address); await comptroller._setComptrollerLens(comptrollerLens.address); @@ -52,7 +52,7 @@ function configureOracle(oracle: FakeContract) { oracle.getUnderlyingPrice.returns(convertToUnit(1, 18)); } -async function configureVToken(vToken: FakeContract, unitroller: MockContract) { +async function configureVToken(vToken: FakeContract, unitroller: MockContract) { const result = await deployDiamond(""); unitroller = result.unitroller; vToken.comptroller.returns(unitroller.address); @@ -80,14 +80,14 @@ describe("Comptroller", () => { describe("_setLiquidationIncentive", () => { let unitroller: Unitroller; - let comptroller: Comptroller; + let comptroller: ComptrollerMock; const initialIncentive = convertToUnit("1", 18); const validIncentive = convertToUnit("1.1", 18); const tooSmallIncentive = convertToUnit("0.99999", 18); beforeEach(async () => { ({ unitroller } = await loadFixture(deploySimpleComptroller)); - comptroller = await ethers.getContractAt("Comptroller", unitroller.address); + comptroller = await ethers.getContractAt("ComptrollerMock", unitroller.address); }); it("fails if incentive is less than 1e18", async () => { @@ -109,16 +109,16 @@ describe("Comptroller", () => { describe("Non zero address check", () => { let unitroller: Unitroller; - let comptroller: Comptroller; + let comptroller: ComptrollerMock; beforeEach(async () => { ({ unitroller } = await loadFixture(deploySimpleComptroller)); - comptroller = await ethers.getContractAt("Comptroller", unitroller.address); + comptroller = await ethers.getContractAt("ComptrollerMock", unitroller.address); }); - type FuncNames = keyof Comptroller["functions"]; + type FuncNames = keyof ComptrollerMock["functions"]; - function testZeroAddress(funcName: Func, args: Parameters) { + function testZeroAddress(funcName: Func, args: Parameters) { it(funcName, async () => { await expect(comptroller[funcName](...args)).to.be.revertedWith("can't be zero address"); }); @@ -135,7 +135,7 @@ describe("Comptroller", () => { describe("_setPriceOracle", () => { let unitroller: Unitroller; - let comptroller: Comptroller; + let comptroller: ComptrollerMock; let oracle: FakeContract; let newOracle: FakeContract; @@ -146,7 +146,7 @@ describe("Comptroller", () => { async function deploy(): Promise { const contracts = await deploySimpleComptroller(); const newOracle = await smock.fake("contracts/Oracle/PriceOracle.sol:PriceOracle"); - // comptroller = await ethers.getContractAt("Comptroller", contracts.unitroller); + // comptroller = await ethers.getContractAt("ComptrollerMock", contracts.unitroller); return { ...contracts, newOracle }; } @@ -171,20 +171,20 @@ describe("Comptroller", () => { describe("_setComptrollerLens", () => { let unitroller: Unitroller; - let comptroller: Comptroller; + let comptroller: ComptrollerMock; let comptrollerLens: MockContract; type Contracts = { unitroller: Unitroller; - comptroller: Comptroller; + comptroller: ComptrollerMock; comptrollerLens: MockContract; }; async function deploy(): Promise { - // const ComptrollerFactory = await smock.mock("Comptroller"); + // const ComptrollerFactory = await smock.mock("ComptrollerMock"); const result = await deployDiamond(""); unitroller = result.unitroller; - const comptroller = await ethers.getContractAt("Comptroller", unitroller.address); + const comptroller = await ethers.getContractAt("ComptrollerMock", unitroller.address); const ComptrollerLensFactory = await smock.mock("ComptrollerLens"); const comptrollerLens = await ComptrollerLensFactory.deploy(); return { unitroller, comptroller, comptrollerLens }; @@ -210,7 +210,7 @@ describe("Comptroller", () => { }); describe("_setCloseFactor", () => { - let comptroller: Comptroller; + let comptroller: ComptrollerMock; beforeEach(async () => { ({ comptroller } = await loadFixture(deploySimpleComptroller)); @@ -224,7 +224,7 @@ describe("Comptroller", () => { describe("_setCollateralFactor", () => { const half = convertToUnit("0.5", 18); let unitroller: Unitroller; - let comptroller: Comptroller; + let comptroller: ComptrollerMock; let vToken: FakeContract; let oracle: FakeContract; @@ -268,7 +268,7 @@ describe("Comptroller", () => { describe("_supportMarket", () => { let unitroller: Unitroller; - let comptroller: Comptroller; + let comptroller: ComptrollerMock; let oracle: FakeContract; let vToken1: FakeContract; let vToken2: FakeContract; @@ -327,7 +327,7 @@ describe("Comptroller", () => { describe("Hooks", () => { let unitroller: Unitroller; - let comptroller: Comptroller; + let comptroller: ComptrollerMock; let vToken: FakeContract; type Contracts = SimpleComptrollerFixture & { vToken: FakeContract }; diff --git a/tests/hardhat/Comptroller/Diamond/liquidateCalculateAmoutSeizeTest.ts b/tests/hardhat/Comptroller/Diamond/liquidateCalculateAmoutSeizeTest.ts index a6bb85de6..30e0287cf 100644 --- a/tests/hardhat/Comptroller/Diamond/liquidateCalculateAmoutSeizeTest.ts +++ b/tests/hardhat/Comptroller/Diamond/liquidateCalculateAmoutSeizeTest.ts @@ -6,9 +6,9 @@ import { ethers } from "hardhat"; import { convertToUnit } from "../../../../helpers/utils"; import { - Comptroller, ComptrollerLens, ComptrollerLens__factory, + ComptrollerMock, IAccessControlManager, PriceOracle, VBep20Immutable, @@ -24,7 +24,7 @@ const collateralPrice = convertToUnit(1, 18); const repayAmount = convertToUnit(1, 18); async function calculateSeizeTokens( - comptroller: Comptroller, + comptroller: ComptrollerMock, vTokenBorrowed: FakeContract, vTokenCollateral: FakeContract, repayAmount: BigNumberish, @@ -37,13 +37,13 @@ function rando(min: number, max: number): number { } describe("Comptroller", () => { - let comptroller: Comptroller; + let comptroller: ComptrollerMock; let oracle: FakeContract; let vTokenBorrowed: FakeContract; let vTokenCollateral: FakeContract; type LiquidateFixture = { - comptroller: Comptroller; + comptroller: ComptrollerMock; comptrollerLens: MockContract; oracle: FakeContract; vTokenBorrowed: FakeContract; @@ -56,11 +56,10 @@ describe("Comptroller", () => { async function liquidateFixture(): Promise { const accessControl = await smock.fake("IAccessControlManager"); - // const ComptrollerFactory = await smock.mock("Comptroller"); const ComptrollerLensFactory = await smock.mock("ComptrollerLens"); const result = await deployDiamond(""); const unitroller = result.unitroller; - comptroller = await ethers.getContractAt("Comptroller", unitroller.address); + comptroller = await ethers.getContractAt("ComptrollerMock", unitroller.address); const comptrollerLens = await ComptrollerLensFactory.deploy(); const oracle = await smock.fake("contracts/Oracle/PriceOracle.sol:PriceOracle"); accessControl.isAllowedToCall.returns(true); diff --git a/tests/hardhat/Comptroller/Diamond/pauseTest.ts b/tests/hardhat/Comptroller/Diamond/pauseTest.ts index 8a04670a5..a9d62cd7b 100644 --- a/tests/hardhat/Comptroller/Diamond/pauseTest.ts +++ b/tests/hardhat/Comptroller/Diamond/pauseTest.ts @@ -3,7 +3,7 @@ import { loadFixture } from "@nomicfoundation/hardhat-network-helpers"; import chai from "chai"; import { ethers } from "hardhat"; -import { Comptroller, IAccessControlManager, PriceOracle, VBep20Immutable } from "../../../../typechain"; +import { ComptrollerMock, IAccessControlManager, PriceOracle, VBep20Immutable } from "../../../../typechain"; import { deployDiamond } from "./scripts/deploy"; const { expect } = chai; @@ -11,7 +11,7 @@ chai.use(smock.matchers); type PauseFixture = { accessControl: FakeContract; - comptroller: Comptroller; + comptroller: ComptrollerMock; oracle: FakeContract; OMG: FakeContract; ZRX: FakeContract; @@ -25,7 +25,7 @@ async function pauseFixture(): Promise { const accessControl = await smock.fake("IAccessControlManager"); const result = await deployDiamond(""); const unitroller = result.unitroller; - const comptroller = await ethers.getContractAt("Comptroller", unitroller.address); + const comptroller = await ethers.getContractAt("ComptrollerMock", unitroller.address); await comptroller._setAccessControl(accessControl.address); const oracle = await smock.fake("contracts/Oracle/PriceOracle.sol:PriceOracle"); @@ -56,8 +56,8 @@ function configure({ accessControl, allTokens, names }: PauseFixture) { }); } -describe("Comptroller", () => { - let comptroller: MockContract; +describe("ComptrollerMock", () => { + let comptroller: MockContract; let OMG: FakeContract; let ZRX: FakeContract; let BAT: FakeContract; diff --git a/tests/hardhat/DelegateBorrowers/SwapDebtDelegate.ts b/tests/hardhat/DelegateBorrowers/SwapDebtDelegate.ts index 165649953..c18963989 100644 --- a/tests/hardhat/DelegateBorrowers/SwapDebtDelegate.ts +++ b/tests/hardhat/DelegateBorrowers/SwapDebtDelegate.ts @@ -6,7 +6,7 @@ import { parseUnits } from "ethers/lib/utils"; import { ethers, upgrades } from "hardhat"; import { - Comptroller, + ComptrollerMock, IERC20Upgradeable, PriceOracle, SwapDebtDelegate, @@ -23,7 +23,7 @@ describe("assetListTest", () => { let owner: SignerWithAddress; let borrower: SignerWithAddress; let priceOracle: FakeContract; - let comptroller: FakeContract; + let comptroller: FakeContract; let foo: FakeContract; let bar: FakeContract; let vFoo: FakeContract; @@ -44,7 +44,7 @@ describe("assetListTest", () => { [owner, borrower] = await ethers.getSigners(); priceOracle = await smock.fake("PriceOracle"); - comptroller = await smock.fake("Comptroller"); + comptroller = await smock.fake("ComptrollerMock"); foo = await smock.fake("IERC20Upgradeable"); bar = await smock.fake("IERC20Upgradeable"); vFoo = await smock.fake("VBep20"); diff --git a/tests/hardhat/Fork/diamondTest.ts b/tests/hardhat/Fork/diamondTest.ts index 32f92933e..2aab7e3a9 100644 --- a/tests/hardhat/Fork/diamondTest.ts +++ b/tests/hardhat/Fork/diamondTest.ts @@ -107,7 +107,7 @@ forking(26713742, () => { }); // unitroller without diamond - unitroller = await ethers.getContractAt("Comptroller", UNITROLLER); + unitroller = await ethers.getContractAt("ComptrollerMock", UNITROLLER); // deploy Diamond const result = await deployDiamond(UNITROLLER); @@ -115,7 +115,7 @@ forking(26713742, () => { diamondProxy = result.diamond; // unitroller with diamond - diamondUnitroller = await ethers.getContractAt("Comptroller", diamondUnitroller.address); + diamondUnitroller = await ethers.getContractAt("ComptrollerMock", diamondUnitroller.address); busdHolder = await initMainnetUser("0xf977814e90da44bfa03b6295a0616a897441acec"); usdtHolder = await initMainnetUser("0xc444949e0054A23c44Fc45789738bdF64aed2391"); diff --git a/tests/hardhat/Fork/swapTest.ts b/tests/hardhat/Fork/swapTest.ts index f0a0e49e6..ff2a00ca6 100644 --- a/tests/hardhat/Fork/swapTest.ts +++ b/tests/hardhat/Fork/swapTest.ts @@ -6,10 +6,10 @@ import { parseUnits } from "ethers/lib/utils"; import { ethers } from "hardhat"; import { - Comptroller, ComptrollerLens, ComptrollerLens__factory, - Comptroller__factory, + ComptrollerMock, + ComptrollerMock__factory, FaucetToken, FaucetToken__factory, IAccessControlManager, @@ -47,7 +47,7 @@ let admin: SignerWithAddress; let oracle: FakeContract; let accessControl: FakeContract; let comptrollerLens: MockContract; -let comptroller: MockContract; +let comptroller: MockContract; const SWAP_AMOUNT = 100; const MIN_AMOUNT_OUT = 90; @@ -66,7 +66,7 @@ async function deploySimpleComptroller() { accessControl = await smock.fake("IAccessControlManager"); accessControl.isAllowedToCall.returns(true); const ComptrollerLensFactory = await smock.mock("ComptrollerLens"); - const ComptrollerFactory = await smock.mock("Comptroller"); + const ComptrollerFactory = await smock.mock("ComptrollerMock"); comptroller = await ComptrollerFactory.deploy(); comptrollerLens = await ComptrollerLensFactory.deploy(); await comptroller._setAccessControl(accessControl.address); diff --git a/tests/hardhat/Lens/Rewards.ts b/tests/hardhat/Lens/Rewards.ts index f8e8f5125..80d6cd9c4 100644 --- a/tests/hardhat/Lens/Rewards.ts +++ b/tests/hardhat/Lens/Rewards.ts @@ -1,13 +1,16 @@ import { FakeContract, MockContract, smock } from "@defi-wonderland/smock"; import { loadFixture, mineUpTo } from "@nomicfoundation/hardhat-network-helpers"; -import { expect } from "chai"; +import chai from "chai"; import { BigNumber, Signer } from "ethers"; import { ethers } from "hardhat"; import { convertToUnit } from "../../../helpers/utils"; -import { Comptroller, FaucetToken, VToken, VenusLens, VenusLens__factory } from "../../../typechain"; +import { ComptrollerMock, FaucetToken, VToken, VenusLens, VenusLens__factory } from "../../../typechain"; -let comptroller: FakeContract; +const { expect } = chai; +chai.use(smock.matchers); + +let comptroller: FakeContract; let vBUSD: FakeContract; let vWBTC: FakeContract; let XVS: FakeContract; @@ -18,7 +21,7 @@ let startBlock: number; const VENUS_ACCRUED = convertToUnit(10, 18); type RewardsFixtire = { - comptroller: FakeContract; + comptroller: FakeContract; vBUSD: FakeContract; vWBTC: FakeContract; XVS: FakeContract; @@ -32,7 +35,7 @@ const rewardsFixture = async (): Promise => { XVS = await smock.fake("FaucetToken"); const venusLensFactory = await smock.mock("VenusLens"); venusLens = await venusLensFactory.deploy(); - comptroller = await smock.fake("Comptroller"); + comptroller = await smock.fake("ComptrollerMock"); const startBlock = await ethers.provider.getBlockNumber(); diff --git a/tests/hardhat/Liquidator/liquidatorHarnessTest.ts b/tests/hardhat/Liquidator/liquidatorHarnessTest.ts index fd8bd34e1..9623a0d6f 100644 --- a/tests/hardhat/Liquidator/liquidatorHarnessTest.ts +++ b/tests/hardhat/Liquidator/liquidatorHarnessTest.ts @@ -6,7 +6,7 @@ import { ethers, upgrades } from "hardhat"; import { convertToBigInt } from "../../../helpers/utils"; import { - Comptroller, + ComptrollerMock, LiquidatorHarness, LiquidatorHarness__factory, MockVBNB, @@ -21,7 +21,7 @@ const announcedIncentive = convertToBigInt("1.1", 18); const treasuryPercent = convertToBigInt("0.05", 18); type LiquidatorFixture = { - comptroller: FakeContract; + comptroller: FakeContract; vTokenCollateral: FakeContract; liquidator: MockContract; vBnb: FakeContract; @@ -30,7 +30,7 @@ type LiquidatorFixture = { async function deployLiquidator(): Promise { const [, treasury] = await ethers.getSigners(); - const comptroller = await smock.fake("Comptroller"); + const comptroller = await smock.fake("ComptrollerMock"); comptroller.liquidationIncentiveMantissa.returns(announcedIncentive); const vBnb = await smock.fake("MockVBNB"); const vTokenCollateral = await smock.fake("VBep20Immutable"); diff --git a/tests/hardhat/Liquidator/liquidatorTest.ts b/tests/hardhat/Liquidator/liquidatorTest.ts index c1b66a985..3816ebb00 100644 --- a/tests/hardhat/Liquidator/liquidatorTest.ts +++ b/tests/hardhat/Liquidator/liquidatorTest.ts @@ -7,7 +7,7 @@ import { ethers, upgrades } from "hardhat"; import { convertToBigInt } from "../../../helpers/utils"; import { - Comptroller, + ComptrollerMock, FaucetToken, FaucetToken__factory, Liquidator, @@ -29,7 +29,7 @@ const treasuryShare = 181n; // seizeTokens * treasuryPercent / announcedIncentiv const liquidatorShare = seizeTokens - treasuryShare; type LiquidatorFixture = { - comptroller: FakeContract; + comptroller: FakeContract; borrowedUnderlying: MockContract; vai: MockContract; vaiController: FakeContract; @@ -42,7 +42,7 @@ type LiquidatorFixture = { async function deployLiquidator(): Promise { const [, treasury] = await ethers.getSigners(); - const comptroller = await smock.fake("Comptroller"); + const comptroller = await smock.fake("ComptrollerMock"); const vBnb = await smock.fake("MockVBNB"); const FaucetToken = await smock.mock("FaucetToken"); const borrowedUnderlying = await FaucetToken.deploy(convertToBigInt("100", 18), "USD", 18, "USD"); diff --git a/tests/hardhat/Liquidator/restrictedLiquidations.ts b/tests/hardhat/Liquidator/restrictedLiquidations.ts index 9ceded1f8..3590f92c6 100644 --- a/tests/hardhat/Liquidator/restrictedLiquidations.ts +++ b/tests/hardhat/Liquidator/restrictedLiquidations.ts @@ -5,7 +5,7 @@ import chai from "chai"; import { ethers, upgrades } from "hardhat"; import { convertToBigInt } from "../../../helpers/utils"; -import { Comptroller, Liquidator, Liquidator__factory, MockVBNB, VBep20Immutable } from "../../../typechain"; +import { ComptrollerMock, Liquidator, Liquidator__factory, MockVBNB, VBep20Immutable } from "../../../typechain"; const { expect } = chai; chai.use(smock.matchers); @@ -13,7 +13,7 @@ chai.use(smock.matchers); type LiquidatorFixture = { vBep20: FakeContract; vBnb: FakeContract; - comptroller: FakeContract; + comptroller: FakeContract; liquidator: MockContract; }; @@ -21,7 +21,7 @@ async function deployLiquidator(): Promise { const [, treasury] = await ethers.getSigners(); const treasuryPercentMantissa = convertToBigInt("0.05", 18); - const comptroller = await smock.fake("Comptroller"); + const comptroller = await smock.fake("ComptrollerMock"); comptroller.liquidationIncentiveMantissa.returns(convertToBigInt("1.1", 18)); const vBnb = await smock.fake("MockVBNB"); const vBep20 = await smock.fake("VBep20Immutable"); diff --git a/tests/hardhat/Unitroller/unitrollerTest.ts b/tests/hardhat/Unitroller/unitrollerTest.ts index 371770542..fd58a5e62 100644 --- a/tests/hardhat/Unitroller/unitrollerTest.ts +++ b/tests/hardhat/Unitroller/unitrollerTest.ts @@ -6,8 +6,8 @@ import { ContractTransaction, constants } from "ethers"; import { ethers } from "hardhat"; import { - Comptroller, - Comptroller__factory, + ComptrollerMock, + ComptrollerMock__factory, EchoTypesComptroller, EchoTypesComptroller__factory, Unitroller, @@ -22,10 +22,10 @@ describe("Unitroller", () => { let root: SignerWithAddress; let accounts: SignerWithAddress[]; let unitroller: MockContract; - let brains: MockContract; + let brains: MockContract; async function unitrollerFixture() { - const ComptrollerFactory = await smock.mock("Comptroller"); + const ComptrollerFactory = await smock.mock("ComptrollerMock"); const UnitrollerFactory = await smock.mock("Unitroller"); brains = await ComptrollerFactory.deploy(); unitroller = await UnitrollerFactory.deploy(); diff --git a/tests/hardhat/VAI/VAIController.ts b/tests/hardhat/VAI/VAIController.ts index 6b3004ea7..07eb22c2a 100644 --- a/tests/hardhat/VAI/VAIController.ts +++ b/tests/hardhat/VAI/VAIController.ts @@ -5,9 +5,9 @@ import { BigNumber, Wallet, constants } from "ethers"; import { ethers } from "hardhat"; import { - Comptroller, ComptrollerLens__factory, - Comptroller__factory, + ComptrollerMock, + ComptrollerMock__factory, IAccessControlManager, VAIControllerHarness__factory, } from "../../../typechain"; @@ -31,7 +31,7 @@ const BLOCKS_PER_YEAR = 1000; interface ComptrollerFixture { usdt: BEP20Harness; accessControl: FakeContract; - comptroller: MockContract; + comptroller: MockContract; priceOracle: SimplePriceOracle; vai: VAIScenario; vaiController: MockContract; @@ -45,7 +45,7 @@ describe("VAIController", async () => { let treasuryGuardian: Wallet; let treasuryAddress: Wallet; let accessControl: FakeContract; - let comptroller: MockContract; + let comptroller: MockContract; let priceOracle: SimplePriceOracle; let vai: VAIScenario; let vaiController: MockContract; @@ -70,7 +70,7 @@ describe("VAIController", async () => { ); accessControl.isAllowedToCall.returns(true); - const ComptrollerFactory = await smock.mock("Comptroller"); + const ComptrollerFactory = await smock.mock("ComptrollerMock"); const comptroller = await ComptrollerFactory.deploy(); const priceOracleFactory = await ethers.getContractFactory("SimplePriceOracle"); @@ -90,7 +90,6 @@ describe("VAIController", async () => { const ComptrollerLensFactory = await smock.mock("ComptrollerLens"); const comptrollerLens = await ComptrollerLensFactory.deploy(); - await comptroller._setComptrollerLens(comptrollerLens.address); await comptroller._setAccessControl(accessControl.address); await comptroller._setVAIController(vaiController.address); From 4c1222b8088dda3469f819a1db5740579fdf3235 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Thu, 15 Jun 2023 14:31:45 +0530 Subject: [PATCH 096/153] refactor: added missing view methods --- .../Diamond/facets/MarketFacet.sol | 28 +++++++++++++++++++ .../Diamond/facets/PolicyFacet.sol | 25 +++++++++++++++++ .../Diamond/interfaces/IMarketFacet.sol | 7 +++++ .../Diamond/interfaces/IPolicyFacet.sol | 7 +++++ 4 files changed, 67 insertions(+) diff --git a/contracts/Comptroller/Diamond/facets/MarketFacet.sol b/contracts/Comptroller/Diamond/facets/MarketFacet.sol index 81bec35f8..dc4505fe0 100644 --- a/contracts/Comptroller/Diamond/facets/MarketFacet.sol +++ b/contracts/Comptroller/Diamond/facets/MarketFacet.sol @@ -25,6 +25,15 @@ contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase return accountAssets[account]; } + /** + * @notice Return all of the markets + * @dev The automatic getter may be used to access an individual market. + * @return The list of market addresses + */ + function getAllMarkets() external view returns (VToken[] memory) { + return allMarkets; + } + /** * @notice Calculate number of tokens of collateral asset to seize given an underlying amount * @dev Used in liquidation (called in vToken.liquidateBorrowFresh) @@ -47,6 +56,25 @@ contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase return (err, seizeTokens); } + /** + * @notice Calculate number of tokens of collateral asset to seize given an underlying amount + * @dev Used in liquidation (called in vToken.liquidateBorrowFresh) + * @param vTokenCollateral The address of the collateral vToken + * @param actualRepayAmount The amount of vTokenBorrowed underlying to convert into vTokenCollateral tokens + * @return (errorCode, number of vTokenCollateral tokens to be seized in a liquidation) + */ + function liquidateVAICalculateSeizeTokens( + address vTokenCollateral, + uint actualRepayAmount + ) external view returns (uint, uint) { + (uint err, uint seizeTokens) = comptrollerLens.liquidateVAICalculateSeizeTokens( + address(this), + vTokenCollateral, + actualRepayAmount + ); + return (err, seizeTokens); + } + /** * @notice Returns whether the given account is entered in the given asset * @param account The address of the account to check diff --git a/contracts/Comptroller/Diamond/facets/PolicyFacet.sol b/contracts/Comptroller/Diamond/facets/PolicyFacet.sol index f936ddc79..257b79178 100644 --- a/contracts/Comptroller/Diamond/facets/PolicyFacet.sol +++ b/contracts/Comptroller/Diamond/facets/PolicyFacet.sol @@ -359,6 +359,31 @@ contract PolicyFacet is XVSRewardsHelper { return (uint(err), liquidity, shortfall); } + /** + * @notice Determine what the account liquidity would be if the given amounts were redeemed/borrowed + * @param vTokenModify The market to hypothetically redeem/borrow in + * @param account The account to determine liquidity for + * @param redeemTokens The number of tokens to hypothetically redeem + * @param borrowAmount The amount of underlying to hypothetically borrow + * @return (possible error code (semi-opaque), + hypothetical account liquidity in excess of collateral requirements, + * hypothetical account shortfall below collateral requirements) + */ + function getHypotheticalAccountLiquidity( + address account, + address vTokenModify, + uint redeemTokens, + uint borrowAmount + ) external view returns (uint, uint, uint) { + (Error err, uint liquidity, uint shortfall) = getHypotheticalAccountLiquidityInternal( + account, + VToken(vTokenModify), + redeemTokens, + borrowAmount + ); + return (uint(err), liquidity, shortfall); + } + // setter functionality /** * @notice Set XVS speed for a single market diff --git a/contracts/Comptroller/Diamond/interfaces/IMarketFacet.sol b/contracts/Comptroller/Diamond/interfaces/IMarketFacet.sol index 0ee9a495b..7c0288a54 100644 --- a/contracts/Comptroller/Diamond/interfaces/IMarketFacet.sol +++ b/contracts/Comptroller/Diamond/interfaces/IMarketFacet.sol @@ -12,6 +12,11 @@ interface IMarketFacet { uint actualRepayAmount ) external view returns (uint, uint); + function liquidateVAICalculateSeizeTokens( + address vTokenCollateral, + uint actualRepayAmount + ) external view returns (uint, uint); + function checkMembership(address account, VToken vToken) external view returns (bool); function enterMarkets(address[] calldata vTokens) external returns (uint[] memory); @@ -21,4 +26,6 @@ interface IMarketFacet { function _supportMarket(VToken vToken) external returns (uint); function getAssetsIn(address account) external view returns (VToken[] memory); + + function getAllMarkets() external view returns (VToken[] memory); } diff --git a/contracts/Comptroller/Diamond/interfaces/IPolicyFacet.sol b/contracts/Comptroller/Diamond/interfaces/IPolicyFacet.sol index e3b103245..7178694b7 100644 --- a/contracts/Comptroller/Diamond/interfaces/IPolicyFacet.sol +++ b/contracts/Comptroller/Diamond/interfaces/IPolicyFacet.sol @@ -69,6 +69,13 @@ interface IPolicyFacet { function getAccountLiquidity(address account) external view returns (uint, uint, uint); + function getHypotheticalAccountLiquidity( + address account, + address vTokenModify, + uint redeemTokens, + uint borrowAmount + ) external view returns (uint, uint, uint); + function _setVenusSpeeds( VToken[] calldata vTokens, uint[] calldata supplySpeeds, From 3edb97925f84b1123e9475acc173a6cb48d8047f Mon Sep 17 00:00:00 2001 From: defcon022 Date: Thu, 15 Jun 2023 17:12:15 +0530 Subject: [PATCH 097/153] refactor: ven-1580 removed comptroller.sol --- contracts/Comptroller/Comptroller.sol | 1581 ------------------------- deploy/001-comptroller.ts | 2 +- deploy/004-support-markets.ts | 2 +- 3 files changed, 2 insertions(+), 1583 deletions(-) delete mode 100644 contracts/Comptroller/Comptroller.sol diff --git a/contracts/Comptroller/Comptroller.sol b/contracts/Comptroller/Comptroller.sol deleted file mode 100644 index c5088dcb7..000000000 --- a/contracts/Comptroller/Comptroller.sol +++ /dev/null @@ -1,1581 +0,0 @@ -pragma solidity ^0.5.16; - -import "../Oracle/PriceOracle.sol"; -import "../Tokens/VTokens/VToken.sol"; -import "../Utils/ErrorReporter.sol"; -import "../Tokens/XVS/XVS.sol"; -import "../Tokens/VAI/VAI.sol"; -import "../Governance/IAccessControlManager.sol"; -import "./ComptrollerLensInterface.sol"; -import "./ComptrollerInterface.sol"; -import "./ComptrollerStorage.sol"; -import "./Unitroller.sol"; - -/** - * @title Venus's Comptroller Contract - * @author Venus - */ -contract Comptroller is ComptrollerV11Storage, ComptrollerInterfaceG2, ComptrollerErrorReporter, ExponentialNoError { - /// @notice Emitted when an admin supports a market - event MarketListed(VToken vToken); - - /// @notice Emitted when an account enters a market - event MarketEntered(VToken vToken, address account); - - /// @notice Emitted when an account exits a market - event MarketExited(VToken vToken, address account); - - /// @notice Emitted when close factor is changed by admin - event NewCloseFactor(uint oldCloseFactorMantissa, uint newCloseFactorMantissa); - - /// @notice Emitted when a collateral factor is changed by admin - event NewCollateralFactor(VToken vToken, uint oldCollateralFactorMantissa, uint newCollateralFactorMantissa); - - /// @notice Emitted when liquidation incentive is changed by admin - event NewLiquidationIncentive(uint oldLiquidationIncentiveMantissa, uint newLiquidationIncentiveMantissa); - - /// @notice Emitted when price oracle is changed - event NewPriceOracle(PriceOracle oldPriceOracle, PriceOracle newPriceOracle); - - /// @notice Emitted when VAI Vault info is changed - event NewVAIVaultInfo(address vault_, uint releaseStartBlock_, uint releaseInterval_); - - /// @notice Emitted when pause guardian is changed - event NewPauseGuardian(address oldPauseGuardian, address newPauseGuardian); - - /// @notice Emitted when an action is paused on a market - event ActionPausedMarket(VToken indexed vToken, Action indexed action, bool pauseState); - - /// @notice Emitted when Venus VAI Vault rate is changed - event NewVenusVAIVaultRate(uint oldVenusVAIVaultRate, uint newVenusVAIVaultRate); - - /// @notice Emitted when a new borrow-side XVS speed is calculated for a market - event VenusBorrowSpeedUpdated(VToken indexed vToken, uint newSpeed); - - /// @notice Emitted when a new supply-side XVS speed is calculated for a market - event VenusSupplySpeedUpdated(VToken indexed vToken, uint newSpeed); - - /// @notice Emitted when XVS is distributed to a supplier - event DistributedSupplierVenus( - VToken indexed vToken, - address indexed supplier, - uint venusDelta, - uint venusSupplyIndex - ); - - /// @notice Emitted when XVS is distributed to a borrower - event DistributedBorrowerVenus( - VToken indexed vToken, - address indexed borrower, - uint venusDelta, - uint venusBorrowIndex - ); - - /// @notice Emitted when XVS is distributed to VAI Vault - event DistributedVAIVaultVenus(uint amount); - - /// @notice Emitted when VAIController is changed - event NewVAIController(VAIControllerInterface oldVAIController, VAIControllerInterface newVAIController); - - /// @notice Emitted when VAI mint rate is changed by admin - event NewVAIMintRate(uint oldVAIMintRate, uint newVAIMintRate); - - /// @notice Emitted when protocol state is changed by admin - event ActionProtocolPaused(bool state); - - /// @notice Emitted when borrow cap for a vToken is changed - event NewBorrowCap(VToken indexed vToken, uint newBorrowCap); - - /// @notice Emitted when treasury guardian is changed - event NewTreasuryGuardian(address oldTreasuryGuardian, address newTreasuryGuardian); - - /// @notice Emitted when treasury address is changed - event NewTreasuryAddress(address oldTreasuryAddress, address newTreasuryAddress); - - /// @notice Emitted when treasury percent is changed - event NewTreasuryPercent(uint oldTreasuryPercent, uint newTreasuryPercent); - - // @notice Emitted when liquidator adress is changed - event NewLiquidatorContract(address oldLiquidatorContract, address newLiquidatorContract); - - /// @notice Emitted when Venus is granted by admin - event VenusGranted(address recipient, uint amount); - - /// @notice Emitted when ComptrollerLens address is changed - event NewComptrollerLens(address oldComptrollerLens, address newComptrollerLens); - - /// @notice Emitted when supply cap for a vToken is changed - event NewSupplyCap(VToken indexed vToken, uint newSupplyCap); - - /// @notice Emitted when access control address is changed by admin - event NewAccessControl(address oldAccessControlAddress, address newAccessControlAddress); - - /// @notice Emitted when the borrowing delegate rights are updated for an account - event DelegateUpdated(address borrower, address delegate, bool allowDelegatedBorrows); - - /// @notice The initial Venus index for a market - uint224 public constant venusInitialIndex = 1e36; - - // closeFactorMantissa must be strictly greater than this value - uint internal constant closeFactorMinMantissa = 0.05e18; // 0.05 - - // closeFactorMantissa must not exceed this value - uint internal constant closeFactorMaxMantissa = 0.9e18; // 0.9 - - // No collateralFactorMantissa may exceed this value - uint internal constant collateralFactorMaxMantissa = 0.9e18; // 0.9 - - constructor() public { - admin = msg.sender; - } - - /// @notice Reverts if the protocol is paused - function checkProtocolPauseState() private view { - require(!protocolPaused, "protocol is paused"); - } - - /// @notice Reverts if a certain action is paused on a market - function checkActionPauseState(address market, Action action) private view { - require(!actionPaused(market, action), "action is paused"); - } - - /// @notice Reverts if the caller is not admin - function ensureAdmin() private view { - require(msg.sender == admin, "only admin can"); - } - - /// @notice Checks the passed address is nonzero - function ensureNonzeroAddress(address someone) private pure { - require(someone != address(0), "can't be zero address"); - } - - /// @notice Reverts if the market is not listed - function ensureListed(Market storage market) private view { - require(market.isListed, "market not listed"); - } - - /// @notice Reverts if the caller is neither admin nor the passed address - function ensureAdminOr(address privilegedAddress) private view { - require(msg.sender == admin || msg.sender == privilegedAddress, "access denied"); - } - - function ensureAllowed(string memory functionSig) private view { - require(IAccessControlManager(accessControl).isAllowedToCall(msg.sender, functionSig), "access denied"); - } - - /*** Assets You Are In ***/ - - /** - * @notice Returns the assets an account has entered - * @param account The address of the account to pull assets for - * @return A dynamic list with the assets the account has entered - */ - function getAssetsIn(address account) external view returns (VToken[] memory) { - return accountAssets[account]; - } - - /** - * @notice Returns whether the given account is entered in the given asset - * @param account The address of the account to check - * @param vToken The vToken to check - * @return True if the account is in the asset, otherwise false. - */ - function checkMembership(address account, VToken vToken) external view returns (bool) { - return markets[address(vToken)].accountMembership[account]; - } - - /** - * @notice Add assets to be included in account liquidity calculation - * @param vTokens The list of addresses of the vToken markets to be enabled - * @return Success indicator for whether each corresponding market was entered - */ - function enterMarkets(address[] calldata vTokens) external returns (uint[] memory) { - uint len = vTokens.length; - - uint[] memory results = new uint[](len); - for (uint i; i < len; ++i) { - results[i] = uint(addToMarketInternal(VToken(vTokens[i]), msg.sender)); - } - - return results; - } - - /** - * @notice Add the market to the borrower's "assets in" for liquidity calculations - * @param vToken The market to enter - * @param borrower The address of the account to modify - * @return Success indicator for whether the market was entered - */ - function addToMarketInternal(VToken vToken, address borrower) internal returns (Error) { - checkActionPauseState(address(vToken), Action.ENTER_MARKET); - - Market storage marketToJoin = markets[address(vToken)]; - ensureListed(marketToJoin); - - if (marketToJoin.accountMembership[borrower]) { - // already joined - return Error.NO_ERROR; - } - - // survived the gauntlet, add to list - // NOTE: we store these somewhat redundantly as a significant optimization - // this avoids having to iterate through the list for the most common use cases - // that is, only when we need to perform liquidity checks - // and not whenever we want to check if an account is in a particular market - marketToJoin.accountMembership[borrower] = true; - accountAssets[borrower].push(vToken); - - emit MarketEntered(vToken, borrower); - - return Error.NO_ERROR; - } - - /** - * @notice Removes asset from sender's account liquidity calculation - * @dev Sender must not have an outstanding borrow balance in the asset, - * or be providing necessary collateral for an outstanding borrow. - * @param vTokenAddress The address of the asset to be removed - * @return Whether or not the account successfully exited the market - */ - function exitMarket(address vTokenAddress) external returns (uint) { - checkActionPauseState(vTokenAddress, Action.EXIT_MARKET); - - VToken vToken = VToken(vTokenAddress); - /* Get sender tokensHeld and amountOwed underlying from the vToken */ - (uint oErr, uint tokensHeld, uint amountOwed, ) = vToken.getAccountSnapshot(msg.sender); - require(oErr == 0, "getAccountSnapshot failed"); // semi-opaque error code - - /* Fail if the sender has a borrow balance */ - if (amountOwed != 0) { - return fail(Error.NONZERO_BORROW_BALANCE, FailureInfo.EXIT_MARKET_BALANCE_OWED); - } - - /* Fail if the sender is not permitted to redeem all of their tokens */ - uint allowed = redeemAllowedInternal(vTokenAddress, msg.sender, tokensHeld); - if (allowed != 0) { - return failOpaque(Error.REJECTION, FailureInfo.EXIT_MARKET_REJECTION, allowed); - } - - Market storage marketToExit = markets[address(vToken)]; - - /* Return true if the sender is not already ‘in’ the market */ - if (!marketToExit.accountMembership[msg.sender]) { - return uint(Error.NO_ERROR); - } - - /* Set vToken account membership to false */ - delete marketToExit.accountMembership[msg.sender]; - - /* Delete vToken from the account’s list of assets */ - // In order to delete vToken, copy last item in list to location of item to be removed, reduce length by 1 - VToken[] storage userAssetList = accountAssets[msg.sender]; - uint len = userAssetList.length; - uint i; - for (; i < len; ++i) { - if (userAssetList[i] == vToken) { - userAssetList[i] = userAssetList[len - 1]; - userAssetList.length--; - break; - } - } - - // We *must* have found the asset in the list or our redundant data structure is broken - assert(i < len); - - emit MarketExited(vToken, msg.sender); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Grants or revokes the borrowing delegate rights to / from an account. - * If allowed, the delegate will be able to borrow funds on behalf of the sender. - * Upon a delegated borrow, the delegate will receive the funds, and the borrower - * will see the debt on their account. - * @param delegate The address to update the rights for - * @param allowBorrows Whether to grant (true) or revoke (false) the rights - */ - function updateDelegate(address delegate, bool allowBorrows) external { - _updateDelegate(msg.sender, delegate, allowBorrows); - } - - function _updateDelegate(address borrower, address delegate, bool allowBorrows) internal { - approvedDelegates[borrower][delegate] = allowBorrows; - emit DelegateUpdated(borrower, delegate, allowBorrows); - } - - /*** Policy Hooks ***/ - - /** - * @notice Checks if the account should be allowed to mint tokens in the given market - * @param vToken The market to verify the mint against - * @param minter The account which would get the minted tokens - * @param mintAmount The amount of underlying being supplied to the market in exchange for tokens - * @return 0 if the mint is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) - */ - function mintAllowed(address vToken, address minter, uint mintAmount) external returns (uint) { - // Pausing is a very serious situation - we revert to sound the alarms - checkProtocolPauseState(); - checkActionPauseState(vToken, Action.MINT); - ensureListed(markets[vToken]); - - uint256 supplyCap = supplyCaps[vToken]; - require(supplyCap != 0, "market supply cap is 0"); - - uint256 vTokenSupply = VToken(vToken).totalSupply(); - Exp memory exchangeRate = Exp({ mantissa: VToken(vToken).exchangeRateStored() }); - uint256 nextTotalSupply = mul_ScalarTruncateAddUInt(exchangeRate, vTokenSupply, mintAmount); - require(nextTotalSupply <= supplyCap, "market supply cap reached"); - - // Keep the flywheel moving - updateVenusSupplyIndex(vToken); - distributeSupplierVenus(vToken, minter); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Validates mint and reverts on rejection. May emit logs. - * @param vToken Asset being minted - * @param minter The address minting the tokens - * @param actualMintAmount The amount of the underlying asset being minted - * @param mintTokens The number of tokens being minted - */ - function mintVerify(address vToken, address minter, uint actualMintAmount, uint mintTokens) external {} - - /** - * @notice Checks if the account should be allowed to redeem tokens in the given market - * @param vToken The market to verify the redeem against - * @param redeemer The account which would redeem the tokens - * @param redeemTokens The number of vTokens to exchange for the underlying asset in the market - * @return 0 if the redeem is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) - */ - function redeemAllowed(address vToken, address redeemer, uint redeemTokens) external returns (uint) { - checkProtocolPauseState(); - checkActionPauseState(vToken, Action.REDEEM); - - uint allowed = redeemAllowedInternal(vToken, redeemer, redeemTokens); - if (allowed != uint(Error.NO_ERROR)) { - return allowed; - } - - // Keep the flywheel moving - updateVenusSupplyIndex(vToken); - distributeSupplierVenus(vToken, redeemer); - - return uint(Error.NO_ERROR); - } - - function redeemAllowedInternal(address vToken, address redeemer, uint redeemTokens) internal view returns (uint) { - ensureListed(markets[vToken]); - - /* If the redeemer is not 'in' the market, then we can bypass the liquidity check */ - if (!markets[vToken].accountMembership[redeemer]) { - return uint(Error.NO_ERROR); - } - - /* Otherwise, perform a hypothetical liquidity check to guard against shortfall */ - (Error err, , uint shortfall) = getHypotheticalAccountLiquidityInternal( - redeemer, - VToken(vToken), - redeemTokens, - 0 - ); - if (err != Error.NO_ERROR) { - return uint(err); - } - if (shortfall != 0) { - return uint(Error.INSUFFICIENT_LIQUIDITY); - } - - return uint(Error.NO_ERROR); - } - - /** - * @notice Validates redeem and reverts on rejection. May emit logs. - * @param vToken Asset being redeemed - * @param redeemer The address redeeming the tokens - * @param redeemAmount The amount of the underlying asset being redeemed - * @param redeemTokens The number of tokens being redeemed - */ - // solhint-disable-next-line no-unused-vars - function redeemVerify(address vToken, address redeemer, uint redeemAmount, uint redeemTokens) external { - require(redeemTokens != 0 || redeemAmount == 0, "redeemTokens zero"); - } - - /** - * @notice Checks if the account should be allowed to borrow the underlying asset of the given market - * @param vToken The market to verify the borrow against - * @param borrower The account which would borrow the asset - * @param borrowAmount The amount of underlying the account would borrow - * @return 0 if the borrow is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) - */ - function borrowAllowed(address vToken, address borrower, uint borrowAmount) external returns (uint) { - // Pausing is a very serious situation - we revert to sound the alarms - checkProtocolPauseState(); - checkActionPauseState(vToken, Action.BORROW); - - ensureListed(markets[vToken]); - - if (!markets[vToken].accountMembership[borrower]) { - // only vTokens may call borrowAllowed if borrower not in market - require(msg.sender == vToken, "sender must be vToken"); - - // attempt to add borrower to the market - Error err = addToMarketInternal(VToken(vToken), borrower); - if (err != Error.NO_ERROR) { - return uint(err); - } - } - - if (oracle.getUnderlyingPrice(VToken(vToken)) == 0) { - return uint(Error.PRICE_ERROR); - } - - uint borrowCap = borrowCaps[vToken]; - // Borrow cap of 0 corresponds to unlimited borrowing - if (borrowCap != 0) { - uint nextTotalBorrows = add_(VToken(vToken).totalBorrows(), borrowAmount); - require(nextTotalBorrows < borrowCap, "market borrow cap reached"); - } - - (Error err, , uint shortfall) = getHypotheticalAccountLiquidityInternal( - borrower, - VToken(vToken), - 0, - borrowAmount - ); - if (err != Error.NO_ERROR) { - return uint(err); - } - if (shortfall != 0) { - return uint(Error.INSUFFICIENT_LIQUIDITY); - } - - // Keep the flywheel moving - Exp memory borrowIndex = Exp({ mantissa: VToken(vToken).borrowIndex() }); - updateVenusBorrowIndex(vToken, borrowIndex); - distributeBorrowerVenus(vToken, borrower, borrowIndex); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Validates borrow and reverts on rejection. May emit logs. - * @param vToken Asset whose underlying is being borrowed - * @param borrower The address borrowing the underlying - * @param borrowAmount The amount of the underlying asset requested to borrow - */ - function borrowVerify(address vToken, address borrower, uint borrowAmount) external {} - - /** - * @notice Checks if the account should be allowed to repay a borrow in the given market - * @param vToken The market to verify the repay against - * @param payer The account which would repay the asset - * @param borrower The account which borrowed the asset - * @param repayAmount The amount of the underlying asset the account would repay - * @return 0 if the repay is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) - */ - function repayBorrowAllowed( - address vToken, - // solhint-disable-next-line no-unused-vars - address payer, - address borrower, - // solhint-disable-next-line no-unused-vars - uint repayAmount - ) external returns (uint) { - checkProtocolPauseState(); - checkActionPauseState(vToken, Action.REPAY); - ensureListed(markets[vToken]); - - // Keep the flywheel moving - Exp memory borrowIndex = Exp({ mantissa: VToken(vToken).borrowIndex() }); - updateVenusBorrowIndex(vToken, borrowIndex); - distributeBorrowerVenus(vToken, borrower, borrowIndex); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Validates repayBorrow and reverts on rejection. May emit logs. - * @param vToken Asset being repaid - * @param payer The address repaying the borrow - * @param borrower The address of the borrower - * @param actualRepayAmount The amount of underlying being repaid - */ - function repayBorrowVerify( - address vToken, - address payer, - address borrower, - uint actualRepayAmount, - uint borrowerIndex - ) external {} - - /** - * @notice Checks if the liquidation should be allowed to occur - * @param vTokenBorrowed Asset which was borrowed by the borrower - * @param vTokenCollateral Asset which was used as collateral and will be seized - * @param liquidator The address repaying the borrow and seizing the collateral - * @param borrower The address of the borrower - * @param repayAmount The amount of underlying being repaid - */ - function liquidateBorrowAllowed( - address vTokenBorrowed, - address vTokenCollateral, - address liquidator, - address borrower, - uint repayAmount - ) external returns (uint) { - checkProtocolPauseState(); - - // if we want to pause liquidating to vTokenCollateral, we should pause seizing - checkActionPauseState(vTokenBorrowed, Action.LIQUIDATE); - - if (liquidatorContract != address(0) && liquidator != liquidatorContract) { - return uint(Error.UNAUTHORIZED); - } - - ensureListed(markets[vTokenCollateral]); - if (address(vTokenBorrowed) != address(vaiController)) { - ensureListed(markets[vTokenBorrowed]); - } - - /* The borrower must have shortfall in order to be liquidatable */ - (Error err, , uint shortfall) = getHypotheticalAccountLiquidityInternal(borrower, VToken(0), 0, 0); - if (err != Error.NO_ERROR) { - return uint(err); - } - if (shortfall == 0) { - return uint(Error.INSUFFICIENT_SHORTFALL); - } - - /* The liquidator may not repay more than what is allowed by the closeFactor */ - uint borrowBalance; - if (address(vTokenBorrowed) != address(vaiController)) { - borrowBalance = VToken(vTokenBorrowed).borrowBalanceStored(borrower); - } else { - borrowBalance = vaiController.getVAIRepayAmount(borrower); - } - // maxClose = multipy of closeFactorMantissa and borrowBalance - if (repayAmount > mul_ScalarTruncate(Exp({ mantissa: closeFactorMantissa }), borrowBalance)) { - return uint(Error.TOO_MUCH_REPAY); - } - - return uint(Error.NO_ERROR); - } - - /** - * @notice Validates liquidateBorrow and reverts on rejection. May emit logs. - * @param vTokenBorrowed Asset which was borrowed by the borrower - * @param vTokenCollateral Asset which was used as collateral and will be seized - * @param liquidator The address repaying the borrow and seizing the collateral - * @param borrower The address of the borrower - * @param actualRepayAmount The amount of underlying being repaid - * @param seizeTokens The amount of collateral token that will be seized - */ - function liquidateBorrowVerify( - address vTokenBorrowed, - address vTokenCollateral, - address liquidator, - address borrower, - uint actualRepayAmount, - uint seizeTokens - ) external {} - - /** - * @notice Checks if the seizing of assets should be allowed to occur - * @param vTokenCollateral Asset which was used as collateral and will be seized - * @param vTokenBorrowed Asset which was borrowed by the borrower - * @param liquidator The address repaying the borrow and seizing the collateral - * @param borrower The address of the borrower - * @param seizeTokens The number of collateral tokens to seize - */ - function seizeAllowed( - address vTokenCollateral, - address vTokenBorrowed, - address liquidator, - address borrower, - uint seizeTokens // solhint-disable-line no-unused-vars - ) external returns (uint) { - // Pausing is a very serious situation - we revert to sound the alarms - checkProtocolPauseState(); - checkActionPauseState(vTokenCollateral, Action.SEIZE); - - // We've added VAIController as a borrowed token list check for seize - ensureListed(markets[vTokenCollateral]); - if (address(vTokenBorrowed) != address(vaiController)) { - ensureListed(markets[vTokenBorrowed]); - } - - if (VToken(vTokenCollateral).comptroller() != VToken(vTokenBorrowed).comptroller()) { - return uint(Error.COMPTROLLER_MISMATCH); - } - - // Keep the flywheel moving - updateVenusSupplyIndex(vTokenCollateral); - distributeSupplierVenus(vTokenCollateral, borrower); - distributeSupplierVenus(vTokenCollateral, liquidator); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Validates seize and reverts on rejection. May emit logs. - * @param vTokenCollateral Asset which was used as collateral and will be seized - * @param vTokenBorrowed Asset which was borrowed by the borrower - * @param liquidator The address repaying the borrow and seizing the collateral - * @param borrower The address of the borrower - * @param seizeTokens The number of collateral tokens to seize - */ - function seizeVerify( - address vTokenCollateral, - address vTokenBorrowed, - address liquidator, - address borrower, - uint seizeTokens - ) external {} - - /** - * @notice Checks if the account should be allowed to transfer tokens in the given market - * @param vToken The market to verify the transfer against - * @param src The account which sources the tokens - * @param dst The account which receives the tokens - * @param transferTokens The number of vTokens to transfer - * @return 0 if the transfer is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) - */ - function transferAllowed(address vToken, address src, address dst, uint transferTokens) external returns (uint) { - // Pausing is a very serious situation - we revert to sound the alarms - checkProtocolPauseState(); - checkActionPauseState(vToken, Action.TRANSFER); - - // Currently the only consideration is whether or not - // the src is allowed to redeem this many tokens - uint allowed = redeemAllowedInternal(vToken, src, transferTokens); - if (allowed != uint(Error.NO_ERROR)) { - return allowed; - } - - // Keep the flywheel moving - updateVenusSupplyIndex(vToken); - distributeSupplierVenus(vToken, src); - distributeSupplierVenus(vToken, dst); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Validates transfer and reverts on rejection. May emit logs. - * @param vToken Asset being transferred - * @param src The account which sources the tokens - * @param dst The account which receives the tokens - * @param transferTokens The number of vTokens to transfer - */ - function transferVerify(address vToken, address src, address dst, uint transferTokens) external {} - - /** - * @notice Determine the current account liquidity wrt collateral requirements - * @return (possible error code (semi-opaque), - account liquidity in excess of collateral requirements, - * account shortfall below collateral requirements) - */ - function getAccountLiquidity(address account) external view returns (uint, uint, uint) { - (Error err, uint liquidity, uint shortfall) = getHypotheticalAccountLiquidityInternal(account, VToken(0), 0, 0); - - return (uint(err), liquidity, shortfall); - } - - /** - * @notice Determine what the account liquidity would be if the given amounts were redeemed/borrowed - * @param vTokenModify The market to hypothetically redeem/borrow in - * @param account The account to determine liquidity for - * @param redeemTokens The number of tokens to hypothetically redeem - * @param borrowAmount The amount of underlying to hypothetically borrow - * @return (possible error code (semi-opaque), - hypothetical account liquidity in excess of collateral requirements, - * hypothetical account shortfall below collateral requirements) - */ - function getHypotheticalAccountLiquidity( - address account, - address vTokenModify, - uint redeemTokens, - uint borrowAmount - ) external view returns (uint, uint, uint) { - (Error err, uint liquidity, uint shortfall) = getHypotheticalAccountLiquidityInternal( - account, - VToken(vTokenModify), - redeemTokens, - borrowAmount - ); - return (uint(err), liquidity, shortfall); - } - - /** - * @notice Determine what the account liquidity would be if the given amounts were redeemed/borrowed - * @param vTokenModify The market to hypothetically redeem/borrow in - * @param account The account to determine liquidity for - * @param redeemTokens The number of tokens to hypothetically redeem - * @param borrowAmount The amount of underlying to hypothetically borrow - * @dev Note that we calculate the exchangeRateStored for each collateral vToken using stored data, - * without calculating accumulated interest. - * @return (possible error code, - hypothetical account liquidity in excess of collateral requirements, - * hypothetical account shortfall below collateral requirements) - */ - function getHypotheticalAccountLiquidityInternal( - address account, - VToken vTokenModify, - uint redeemTokens, - uint borrowAmount - ) internal view returns (Error, uint, uint) { - (uint err, uint liquidity, uint shortfall) = comptrollerLens.getHypotheticalAccountLiquidity( - address(this), - account, - vTokenModify, - redeemTokens, - borrowAmount - ); - return (Error(err), liquidity, shortfall); - } - - /** - * @notice Calculate number of tokens of collateral asset to seize given an underlying amount - * @dev Used in liquidation (called in vToken.liquidateBorrowFresh) - * @param vTokenBorrowed The address of the borrowed vToken - * @param vTokenCollateral The address of the collateral vToken - * @param actualRepayAmount The amount of vTokenBorrowed underlying to convert into vTokenCollateral tokens - * @return (errorCode, number of vTokenCollateral tokens to be seized in a liquidation) - */ - function liquidateCalculateSeizeTokens( - address vTokenBorrowed, - address vTokenCollateral, - uint actualRepayAmount - ) external view returns (uint, uint) { - (uint err, uint seizeTokens) = comptrollerLens.liquidateCalculateSeizeTokens( - address(this), - vTokenBorrowed, - vTokenCollateral, - actualRepayAmount - ); - return (err, seizeTokens); - } - - /** - * @notice Calculate number of tokens of collateral asset to seize given an underlying amount - * @dev Used in liquidation (called in vToken.liquidateBorrowFresh) - * @param vTokenCollateral The address of the collateral vToken - * @param actualRepayAmount The amount of vTokenBorrowed underlying to convert into vTokenCollateral tokens - * @return (errorCode, number of vTokenCollateral tokens to be seized in a liquidation) - */ - function liquidateVAICalculateSeizeTokens( - address vTokenCollateral, - uint actualRepayAmount - ) external view returns (uint, uint) { - (uint err, uint seizeTokens) = comptrollerLens.liquidateVAICalculateSeizeTokens( - address(this), - vTokenCollateral, - actualRepayAmount - ); - return (err, seizeTokens); - } - - /*** Admin Functions ***/ - - /** - * @notice Sets a new price oracle for the comptroller - * @dev Admin function to set a new price oracle - * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) - */ - function _setPriceOracle(PriceOracle newOracle) external returns (uint) { - // Check caller is admin - ensureAdmin(); - ensureNonzeroAddress(address(newOracle)); - - // Track the old oracle for the comptroller - PriceOracle oldOracle = oracle; - - // Set comptroller's oracle to newOracle - oracle = newOracle; - - // Emit NewPriceOracle(oldOracle, newOracle) - emit NewPriceOracle(oldOracle, newOracle); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Sets the closeFactor used when liquidating borrows - * @dev Admin function to set closeFactor - * @param newCloseFactorMantissa New close factor, scaled by 1e18 - * @return uint 0=success, otherwise will revert - */ - function _setCloseFactor(uint newCloseFactorMantissa) external returns (uint) { - // Check caller is admin - ensureAdmin(); - - uint oldCloseFactorMantissa = closeFactorMantissa; - closeFactorMantissa = newCloseFactorMantissa; - emit NewCloseFactor(oldCloseFactorMantissa, newCloseFactorMantissa); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Sets the address of the access control of this contract - * @dev Admin function to set the access control address - * @param newAccessControlAddress New address for the access control - * @return uint 0=success, otherwise will revert - */ - function _setAccessControl(address newAccessControlAddress) external returns (uint) { - // Check caller is admin - ensureAdmin(); - ensureNonzeroAddress(newAccessControlAddress); - - address oldAccessControlAddress = accessControl; - accessControl = newAccessControlAddress; - emit NewAccessControl(oldAccessControlAddress, accessControl); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Sets the collateralFactor for a market - * @dev Restricted function to set per-market collateralFactor - * @param vToken The market to set the factor on - * @param newCollateralFactorMantissa The new collateral factor, scaled by 1e18 - * @return uint 0=success, otherwise a failure. (See ErrorReporter for details) - */ - function _setCollateralFactor(VToken vToken, uint newCollateralFactorMantissa) external returns (uint) { - // Check caller is allowed by access control manager - ensureAllowed("_setCollateralFactor(address,uint256)"); - ensureNonzeroAddress(address(vToken)); - - // Verify market is listed - Market storage market = markets[address(vToken)]; - ensureListed(market); - - Exp memory newCollateralFactorExp = Exp({ mantissa: newCollateralFactorMantissa }); - - // Check collateral factor <= 0.9 - Exp memory highLimit = Exp({ mantissa: collateralFactorMaxMantissa }); - if (lessThanExp(highLimit, newCollateralFactorExp)) { - return fail(Error.INVALID_COLLATERAL_FACTOR, FailureInfo.SET_COLLATERAL_FACTOR_VALIDATION); - } - - // If collateral factor != 0, fail if price == 0 - if (newCollateralFactorMantissa != 0 && oracle.getUnderlyingPrice(vToken) == 0) { - return fail(Error.PRICE_ERROR, FailureInfo.SET_COLLATERAL_FACTOR_WITHOUT_PRICE); - } - - // Set market's collateral factor to new collateral factor, remember old value - uint oldCollateralFactorMantissa = market.collateralFactorMantissa; - market.collateralFactorMantissa = newCollateralFactorMantissa; - - // Emit event with asset, old collateral factor, and new collateral factor - emit NewCollateralFactor(vToken, oldCollateralFactorMantissa, newCollateralFactorMantissa); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Sets liquidationIncentive - * @dev Admin function to set liquidationIncentive - * @param newLiquidationIncentiveMantissa New liquidationIncentive scaled by 1e18 - * @return uint 0=success, otherwise a failure. (See ErrorReporter for details) - */ - function _setLiquidationIncentive(uint newLiquidationIncentiveMantissa) external returns (uint) { - ensureAllowed("_setLiquidationIncentive(uint256)"); - - require(newLiquidationIncentiveMantissa >= 1e18, "incentive must be over 1e18"); - - // Save current value for use in log - uint oldLiquidationIncentiveMantissa = liquidationIncentiveMantissa; - - // Set liquidation incentive to new incentive - liquidationIncentiveMantissa = newLiquidationIncentiveMantissa; - - // Emit event with old incentive, new incentive - emit NewLiquidationIncentive(oldLiquidationIncentiveMantissa, newLiquidationIncentiveMantissa); - - return uint(Error.NO_ERROR); - } - - function _setLiquidatorContract(address newLiquidatorContract_) external { - // Check caller is admin - ensureAdmin(); - address oldLiquidatorContract = liquidatorContract; - liquidatorContract = newLiquidatorContract_; - emit NewLiquidatorContract(oldLiquidatorContract, newLiquidatorContract_); - } - - /** - * @notice Add the market to the markets mapping and set it as listed - * @dev Admin function to set isListed and add support for the market - * @param vToken The address of the market (token) to list - * @return uint 0=success, otherwise a failure. (See enum Error for details) - */ - function _supportMarket(VToken vToken) external returns (uint) { - ensureAllowed("_supportMarket(address)"); - - if (markets[address(vToken)].isListed) { - return fail(Error.MARKET_ALREADY_LISTED, FailureInfo.SUPPORT_MARKET_EXISTS); - } - - vToken.isVToken(); // Sanity check to make sure its really a VToken - - // Note that isVenus is not in active use anymore - markets[address(vToken)] = Market({ isListed: true, isVenus: false, collateralFactorMantissa: 0 }); - - _addMarketInternal(vToken); - _initializeMarket(address(vToken)); - - emit MarketListed(vToken); - - return uint(Error.NO_ERROR); - } - - function _addMarketInternal(VToken vToken) internal { - for (uint i; i < allMarkets.length; ++i) { - require(allMarkets[i] != vToken, "market already added"); - } - allMarkets.push(vToken); - } - - function _initializeMarket(address vToken) internal { - uint32 blockNumber = safe32(getBlockNumber(), "block number exceeds 32 bits"); - - VenusMarketState storage supplyState = venusSupplyState[vToken]; - VenusMarketState storage borrowState = venusBorrowState[vToken]; - - /* - * Update market state indices - */ - if (supplyState.index == 0) { - // Initialize supply state index with default value - supplyState.index = venusInitialIndex; - } - - if (borrowState.index == 0) { - // Initialize borrow state index with default value - borrowState.index = venusInitialIndex; - } - - /* - * Update market state block numbers - */ - supplyState.block = borrowState.block = blockNumber; - } - - /** - * @notice Admin function to change the Pause Guardian - * @param newPauseGuardian The address of the new Pause Guardian - * @return uint 0=success, otherwise a failure. (See enum Error for details) - */ - function _setPauseGuardian(address newPauseGuardian) external returns (uint) { - ensureAdmin(); - ensureNonzeroAddress(newPauseGuardian); - - // Save current value for inclusion in log - address oldPauseGuardian = pauseGuardian; - - // Store pauseGuardian with value newPauseGuardian - pauseGuardian = newPauseGuardian; - - // Emit NewPauseGuardian(OldPauseGuardian, NewPauseGuardian) - emit NewPauseGuardian(oldPauseGuardian, newPauseGuardian); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Set the given borrow caps for the given vToken markets. Borrowing that brings total borrows to or above borrow cap will revert. - * @dev Access is controled by ACM. A borrow cap of 0 corresponds to unlimited borrowing. - * @param vTokens The addresses of the markets (tokens) to change the borrow caps for - * @param newBorrowCaps The new borrow cap values in underlying to be set. A value of 0 corresponds to unlimited borrowing. - */ - function _setMarketBorrowCaps(VToken[] calldata vTokens, uint[] calldata newBorrowCaps) external { - ensureAllowed("_setMarketBorrowCaps(address[],uint256[])"); - - uint numMarkets = vTokens.length; - uint numBorrowCaps = newBorrowCaps.length; - - require(numMarkets != 0 && numMarkets == numBorrowCaps, "invalid input"); - - for (uint i; i < numMarkets; ++i) { - borrowCaps[address(vTokens[i])] = newBorrowCaps[i]; - emit NewBorrowCap(vTokens[i], newBorrowCaps[i]); - } - } - - /** - * @notice Set the given supply caps for the given vToken markets. Supply that brings total Supply to or above supply cap will revert. - * @dev Admin function to set the supply caps. A supply cap of 0 corresponds to Minting NotAllowed. - * @param vTokens The addresses of the markets (tokens) to change the supply caps for - * @param newSupplyCaps The new supply cap values in underlying to be set. A value of 0 corresponds to Minting NotAllowed. - */ - function _setMarketSupplyCaps(VToken[] calldata vTokens, uint256[] calldata newSupplyCaps) external { - ensureAllowed("_setMarketSupplyCaps(address[],uint256[])"); - - uint numMarkets = vTokens.length; - uint numSupplyCaps = newSupplyCaps.length; - - require(numMarkets != 0 && numMarkets == numSupplyCaps, "invalid input"); - - for (uint i; i < numMarkets; ++i) { - supplyCaps[address(vTokens[i])] = newSupplyCaps[i]; - emit NewSupplyCap(vTokens[i], newSupplyCaps[i]); - } - } - - /** - * @notice Set whole protocol pause/unpause state - */ - function _setProtocolPaused(bool state) external returns (bool) { - ensureAllowed("_setProtocolPaused(bool)"); - - protocolPaused = state; - emit ActionProtocolPaused(state); - return state; - } - - /** - * @notice Pause/unpause certain actions - * @param markets Markets to pause/unpause the actions on - * @param actions List of action ids to pause/unpause - * @param paused The new paused state (true=paused, false=unpaused) - */ - function _setActionsPaused(address[] calldata markets, Action[] calldata actions, bool paused) external { - ensureAllowed("_setActionsPaused(address[],uint256[],bool)"); - - uint256 numMarkets = markets.length; - uint256 numActions = actions.length; - for (uint marketIdx; marketIdx < numMarkets; ++marketIdx) { - for (uint actionIdx; actionIdx < numActions; ++actionIdx) { - setActionPausedInternal(markets[marketIdx], actions[actionIdx], paused); - } - } - } - - /** - * @dev Pause/unpause an action on a market - * @param market Market to pause/unpause the action on - * @param action Action id to pause/unpause - * @param paused The new paused state (true=paused, false=unpaused) - */ - function setActionPausedInternal(address market, Action action, bool paused) internal { - ensureListed(markets[market]); - _actionPaused[market][uint(action)] = paused; - emit ActionPausedMarket(VToken(market), action, paused); - } - - /** - * @notice Sets a new VAI controller - * @dev Admin function to set a new VAI controller - * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) - */ - function _setVAIController(VAIControllerInterface vaiController_) external returns (uint) { - // Check caller is admin - ensureAdmin(); - ensureNonzeroAddress(address(vaiController_)); - - VAIControllerInterface oldVaiController = vaiController; - vaiController = vaiController_; - emit NewVAIController(oldVaiController, vaiController_); - - return uint(Error.NO_ERROR); - } - - function _setVAIMintRate(uint newVAIMintRate) external returns (uint) { - // Check caller is admin - ensureAdmin(); - uint oldVAIMintRate = vaiMintRate; - vaiMintRate = newVAIMintRate; - emit NewVAIMintRate(oldVAIMintRate, newVAIMintRate); - - return uint(Error.NO_ERROR); - } - - function _setTreasuryData( - address newTreasuryGuardian, - address newTreasuryAddress, - uint newTreasuryPercent - ) external returns (uint) { - // Check caller is admin - ensureAdminOr(treasuryGuardian); - - require(newTreasuryPercent < 1e18, "treasury percent cap overflow"); - ensureNonzeroAddress(newTreasuryGuardian); - ensureNonzeroAddress(newTreasuryAddress); - - address oldTreasuryGuardian = treasuryGuardian; - address oldTreasuryAddress = treasuryAddress; - uint oldTreasuryPercent = treasuryPercent; - - treasuryGuardian = newTreasuryGuardian; - treasuryAddress = newTreasuryAddress; - treasuryPercent = newTreasuryPercent; - - emit NewTreasuryGuardian(oldTreasuryGuardian, newTreasuryGuardian); - emit NewTreasuryAddress(oldTreasuryAddress, newTreasuryAddress); - emit NewTreasuryPercent(oldTreasuryPercent, newTreasuryPercent); - - return uint(Error.NO_ERROR); - } - - function _become(Unitroller unitroller) external { - require(msg.sender == unitroller.admin(), "only unitroller admin can"); - require(unitroller._acceptImplementation() == 0, "not authorized"); - } - - /*** Venus Distribution ***/ - - function setVenusSpeedInternal(VToken vToken, uint supplySpeed, uint borrowSpeed) internal { - ensureListed(markets[address(vToken)]); - - if (venusSupplySpeeds[address(vToken)] != supplySpeed) { - // Supply speed updated so let's update supply state to ensure that - // 1. XVS accrued properly for the old speed, and - // 2. XVS accrued at the new speed starts after this block. - - updateVenusSupplyIndex(address(vToken)); - // Update speed and emit event - venusSupplySpeeds[address(vToken)] = supplySpeed; - emit VenusSupplySpeedUpdated(vToken, supplySpeed); - } - - if (venusBorrowSpeeds[address(vToken)] != borrowSpeed) { - // Borrow speed updated so let's update borrow state to ensure that - // 1. XVS accrued properly for the old speed, and - // 2. XVS accrued at the new speed starts after this block. - Exp memory borrowIndex = Exp({ mantissa: vToken.borrowIndex() }); - updateVenusBorrowIndex(address(vToken), borrowIndex); - - // Update speed and emit event - venusBorrowSpeeds[address(vToken)] = borrowSpeed; - emit VenusBorrowSpeedUpdated(vToken, borrowSpeed); - } - } - - /** - * @dev Set ComptrollerLens contract address - */ - function _setComptrollerLens(ComptrollerLensInterface comptrollerLens_) external returns (uint) { - ensureAdmin(); - ensureNonzeroAddress(address(comptrollerLens_)); - address oldComptrollerLens = address(comptrollerLens); - comptrollerLens = comptrollerLens_; - emit NewComptrollerLens(oldComptrollerLens, address(comptrollerLens)); - - return uint(Error.NO_ERROR); - } - - /** - * @notice Accrue XVS to the market by updating the supply index - * @param vToken The market whose supply index to update - */ - function updateVenusSupplyIndex(address vToken) internal { - VenusMarketState storage supplyState = venusSupplyState[vToken]; - uint supplySpeed = venusSupplySpeeds[vToken]; - uint32 blockNumber = safe32(getBlockNumber(), "block number exceeds 32 bits"); - uint deltaBlocks = sub_(uint(blockNumber), uint(supplyState.block)); - if (deltaBlocks > 0 && supplySpeed > 0) { - uint supplyTokens = VToken(vToken).totalSupply(); - uint venusAccrued = mul_(deltaBlocks, supplySpeed); - Double memory ratio = supplyTokens > 0 ? fraction(venusAccrued, supplyTokens) : Double({ mantissa: 0 }); - supplyState.index = safe224( - add_(Double({ mantissa: supplyState.index }), ratio).mantissa, - "new index exceeds 224 bits" - ); - supplyState.block = blockNumber; - } else if (deltaBlocks > 0) { - supplyState.block = blockNumber; - } - } - - /** - * @notice Accrue XVS to the market by updating the borrow index - * @param vToken The market whose borrow index to update - */ - function updateVenusBorrowIndex(address vToken, Exp memory marketBorrowIndex) internal { - VenusMarketState storage borrowState = venusBorrowState[vToken]; - uint borrowSpeed = venusBorrowSpeeds[vToken]; - uint32 blockNumber = safe32(getBlockNumber(), "block number exceeds 32 bits"); - uint deltaBlocks = sub_(uint(blockNumber), uint(borrowState.block)); - if (deltaBlocks > 0 && borrowSpeed > 0) { - uint borrowAmount = div_(VToken(vToken).totalBorrows(), marketBorrowIndex); - uint venusAccrued = mul_(deltaBlocks, borrowSpeed); - Double memory ratio = borrowAmount > 0 ? fraction(venusAccrued, borrowAmount) : Double({ mantissa: 0 }); - borrowState.index = safe224( - add_(Double({ mantissa: borrowState.index }), ratio).mantissa, - "new index exceeds 224 bits" - ); - borrowState.block = blockNumber; - } else if (deltaBlocks > 0) { - borrowState.block = blockNumber; - } - } - - /** - * @notice Calculate XVS accrued by a supplier and possibly transfer it to them - * @param vToken The market in which the supplier is interacting - * @param supplier The address of the supplier to distribute XVS to - */ - function distributeSupplierVenus(address vToken, address supplier) internal { - if (address(vaiVaultAddress) != address(0)) { - releaseToVault(); - } - - uint supplyIndex = venusSupplyState[vToken].index; - uint supplierIndex = venusSupplierIndex[vToken][supplier]; - - // Update supplier's index to the current index since we are distributing accrued XVS - venusSupplierIndex[vToken][supplier] = supplyIndex; - - if (supplierIndex == 0 && supplyIndex >= venusInitialIndex) { - // Covers the case where users supplied tokens before the market's supply state index was set. - // Rewards the user with XVS accrued from the start of when supplier rewards were first - // set for the market. - supplierIndex = venusInitialIndex; - } - - // Calculate change in the cumulative sum of the XVS per vToken accrued - Double memory deltaIndex = Double({ mantissa: sub_(supplyIndex, supplierIndex) }); - - // Multiply of supplierTokens and supplierDelta - uint supplierDelta = mul_(VToken(vToken).balanceOf(supplier), deltaIndex); - - // Addition of supplierAccrued and supplierDelta - venusAccrued[supplier] = add_(venusAccrued[supplier], supplierDelta); - - emit DistributedSupplierVenus(VToken(vToken), supplier, supplierDelta, supplyIndex); - } - - /** - * @notice Calculate XVS accrued by a borrower and possibly transfer it to them - * @dev Borrowers will not begin to accrue until after the first interaction with the protocol. - * @param vToken The market in which the borrower is interacting - * @param borrower The address of the borrower to distribute XVS to - */ - function distributeBorrowerVenus(address vToken, address borrower, Exp memory marketBorrowIndex) internal { - if (address(vaiVaultAddress) != address(0)) { - releaseToVault(); - } - - uint borrowIndex = venusBorrowState[vToken].index; - uint borrowerIndex = venusBorrowerIndex[vToken][borrower]; - - // Update borrowers's index to the current index since we are distributing accrued XVS - venusBorrowerIndex[vToken][borrower] = borrowIndex; - - if (borrowerIndex == 0 && borrowIndex >= venusInitialIndex) { - // Covers the case where users borrowed tokens before the market's borrow state index was set. - // Rewards the user with XVS accrued from the start of when borrower rewards were first - // set for the market. - borrowerIndex = venusInitialIndex; - } - - // Calculate change in the cumulative sum of the XVS per borrowed unit accrued - Double memory deltaIndex = Double({ mantissa: sub_(borrowIndex, borrowerIndex) }); - - uint borrowerDelta = mul_(div_(VToken(vToken).borrowBalanceStored(borrower), marketBorrowIndex), deltaIndex); - - venusAccrued[borrower] = add_(venusAccrued[borrower], borrowerDelta); - - emit DistributedBorrowerVenus(VToken(vToken), borrower, borrowerDelta, borrowIndex); - } - - /** - * @notice Claim all the xvs accrued by holder in all markets and VAI - * @param holder The address to claim XVS for - */ - function claimVenus(address holder) public { - return claimVenus(holder, allMarkets); - } - - /** - * @notice Claim all the xvs accrued by holder in the specified markets - * @param holder The address to claim XVS for - * @param vTokens The list of markets to claim XVS in - */ - function claimVenus(address holder, VToken[] memory vTokens) public { - address[] memory holders = new address[](1); - holders[0] = holder; - claimVenus(holders, vTokens, true, true); - } - - /** - * @notice Claim all xvs accrued by the holders - * @param holders The addresses to claim XVS for - * @param vTokens The list of markets to claim XVS in - * @param borrowers Whether or not to claim XVS earned by borrowing - * @param suppliers Whether or not to claim XVS earned by supplying - */ - function claimVenus(address[] memory holders, VToken[] memory vTokens, bool borrowers, bool suppliers) public { - claimVenus(holders, vTokens, borrowers, suppliers, false); - } - - /** - * @notice Claim all xvs accrued by the holders - * @param holders The addresses to claim XVS for - * @param vTokens The list of markets to claim XVS in - * @param borrowers Whether or not to claim XVS earned by borrowing - * @param suppliers Whether or not to claim XVS earned by supplying - * @param collateral Whether or not to use XVS earned as collateral, only takes effect when the holder has a shortfall - */ - function claimVenus( - address[] memory holders, - VToken[] memory vTokens, - bool borrowers, - bool suppliers, - bool collateral - ) public { - uint j; - uint256 holdersLength = holders.length; - for (uint i; i < vTokens.length; ++i) { - VToken vToken = vTokens[i]; - ensureListed(markets[address(vToken)]); - if (borrowers) { - Exp memory borrowIndex = Exp({ mantissa: vToken.borrowIndex() }); - updateVenusBorrowIndex(address(vToken), borrowIndex); - for (j = 0; j < holdersLength; ++j) { - distributeBorrowerVenus(address(vToken), holders[j], borrowIndex); - } - } - if (suppliers) { - updateVenusSupplyIndex(address(vToken)); - for (j = 0; j < holdersLength; ++j) { - distributeSupplierVenus(address(vToken), holders[j]); - } - } - } - - for (j = 0; j < holdersLength; ++j) { - address holder = holders[j]; - // If there is a positive shortfall, the XVS reward is accrued, - // but won't be granted to this holder - (, , uint shortfall) = getHypotheticalAccountLiquidityInternal(holder, VToken(0), 0, 0); - venusAccrued[holder] = grantXVSInternal(holder, venusAccrued[holder], shortfall, collateral); - } - } - - /** - * @notice Claim all the xvs accrued by holder in all markets, a shorthand for `claimVenus` with collateral set to `true` - * @param holder The address to claim XVS for - */ - function claimVenusAsCollateral(address holder) external { - address[] memory holders = new address[](1); - holders[0] = holder; - claimVenus(holders, allMarkets, true, true, true); - } - - /** - * @notice Transfer XVS to the user with user's shortfall considered - * @dev Note: If there is not enough XVS, we do not perform the transfer all. - * @param user The address of the user to transfer XVS to - * @param amount The amount of XVS to (possibly) transfer - * @param shortfall The shortfall of the user - * @param collateral Whether or not we will use user's venus reward as collateral to pay off the debt - * @return The amount of XVS which was NOT transferred to the user - */ - function grantXVSInternal(address user, uint amount, uint shortfall, bool collateral) internal returns (uint) { - // If the user is blacklisted, they can't get XVS rewards - require( - user != 0xEF044206Db68E40520BfA82D45419d498b4bc7Bf && - user != 0x7589dD3355DAE848FDbF75044A3495351655cB1A && - user != 0x33df7a7F6D44307E1e5F3B15975b47515e5524c0 && - user != 0x24e77E5b74B30b026E9996e4bc3329c881e24968, - "Blacklisted" - ); - - XVS xvs = XVS(getXVSAddress()); - - if (amount == 0 || amount > xvs.balanceOf(address(this))) { - return amount; - } - - if (shortfall == 0) { - xvs.transfer(user, amount); - return 0; - } - // If user's bankrupt and doesn't use pending xvs as collateral, don't grant - // anything, otherwise, we will transfer the pending xvs as collateral to - // vXVS token and mint vXVS for the user. - // - // If mintBehalf failed, don't grant any xvs - require(collateral, "bankrupt accounts can only collateralize their pending xvs rewards"); - - xvs.approve(getXVSVTokenAddress(), amount); - require( - VBep20Interface(getXVSVTokenAddress()).mintBehalf(user, amount) == uint(Error.NO_ERROR), - "mint behalf error during collateralize xvs" - ); - - // set venusAccrue[user] to 0 - return 0; - } - - /*** Venus Distribution Admin ***/ - - /** - * @notice Transfer XVS to the recipient - * @dev Note: If there is not enough XVS, we do not perform the transfer all. - * @param recipient The address of the recipient to transfer XVS to - * @param amount The amount of XVS to (possibly) transfer - */ - function _grantXVS(address recipient, uint amount) external { - ensureAdminOr(comptrollerImplementation); - uint amountLeft = grantXVSInternal(recipient, amount, 0, false); - require(amountLeft == 0, "insufficient xvs for grant"); - emit VenusGranted(recipient, amount); - } - - /** - * @notice Set the amount of XVS distributed per block to VAI Vault - * @param venusVAIVaultRate_ The amount of XVS wei per block to distribute to VAI Vault - */ - function _setVenusVAIVaultRate(uint venusVAIVaultRate_) external { - ensureAdmin(); - - uint oldVenusVAIVaultRate = venusVAIVaultRate; - venusVAIVaultRate = venusVAIVaultRate_; - emit NewVenusVAIVaultRate(oldVenusVAIVaultRate, venusVAIVaultRate_); - } - - /** - * @notice Set the VAI Vault infos - * @param vault_ The address of the VAI Vault - * @param releaseStartBlock_ The start block of release to VAI Vault - * @param minReleaseAmount_ The minimum release amount to VAI Vault - */ - function _setVAIVaultInfo(address vault_, uint256 releaseStartBlock_, uint256 minReleaseAmount_) external { - ensureAdmin(); - ensureNonzeroAddress(vault_); - - vaiVaultAddress = vault_; - releaseStartBlock = releaseStartBlock_; - minReleaseAmount = minReleaseAmount_; - emit NewVAIVaultInfo(vault_, releaseStartBlock_, minReleaseAmount_); - } - - /** - * @notice Set XVS speed for a single market - * @param vTokens The market whose XVS speed to update - * @param supplySpeeds New XVS speed for supply - * @param borrowSpeeds New XVS speed for borrow - */ - function _setVenusSpeeds( - VToken[] calldata vTokens, - uint[] calldata supplySpeeds, - uint[] calldata borrowSpeeds - ) external { - ensureAdminOr(comptrollerImplementation); - - uint numTokens = vTokens.length; - require( - numTokens == supplySpeeds.length && numTokens == borrowSpeeds.length, - "Comptroller::_setVenusSpeeds invalid input" - ); - - for (uint i; i < numTokens; ++i) { - ensureNonzeroAddress(address(vTokens[i])); - setVenusSpeedInternal(vTokens[i], supplySpeeds[i], borrowSpeeds[i]); - } - } - - /** - * @notice Return all of the markets - * @dev The automatic getter may be used to access an individual market. - * @return The list of market addresses - */ - function getAllMarkets() external view returns (VToken[] memory) { - return allMarkets; - } - - function getBlockNumber() public view returns (uint) { - return block.number; - } - - /** - * @notice Return the address of the XVS token - * @return The address of XVS - */ - function getXVSAddress() public view returns (address) { - return 0xcF6BB5389c92Bdda8a3747Ddb454cB7a64626C63; - } - - /** - * @notice Return the address of the XVS vToken - * @return The address of XVS vToken - */ - function getXVSVTokenAddress() public view returns (address) { - return 0x151B1e2635A717bcDc836ECd6FbB62B674FE3E1D; - } - - /** - * @notice Checks if a certain action is paused on a market - * @param action Action id - * @param market vToken address - */ - function actionPaused(address market, Action action) public view returns (bool) { - return _actionPaused[market][uint(action)]; - } - - /*** VAI functions ***/ - - /** - * @notice Set the minted VAI amount of the `owner` - * @param owner The address of the account to set - * @param amount The amount of VAI to set to the account - * @return The number of minted VAI by `owner` - */ - function setMintedVAIOf(address owner, uint amount) external returns (uint) { - checkProtocolPauseState(); - - // Pausing is a very serious situation - we revert to sound the alarms - require(!mintVAIGuardianPaused && !repayVAIGuardianPaused, "VAI is paused"); - // Check caller is vaiController - if (msg.sender != address(vaiController)) { - return fail(Error.REJECTION, FailureInfo.SET_MINTED_VAI_REJECTION); - } - mintedVAIs[owner] = amount; - - return uint(Error.NO_ERROR); - } - - /** - * @notice Transfer XVS to VAI Vault - */ - function releaseToVault() public { - if (releaseStartBlock == 0 || getBlockNumber() < releaseStartBlock) { - return; - } - - XVS xvs = XVS(getXVSAddress()); - - uint256 xvsBalance = xvs.balanceOf(address(this)); - if (xvsBalance == 0) { - return; - } - - uint256 actualAmount; - uint256 deltaBlocks = sub_(getBlockNumber(), releaseStartBlock); - // releaseAmount = venusVAIVaultRate * deltaBlocks - uint256 _releaseAmount = mul_(venusVAIVaultRate, deltaBlocks); - - if (xvsBalance >= _releaseAmount) { - actualAmount = _releaseAmount; - } else { - actualAmount = xvsBalance; - } - - if (actualAmount < minReleaseAmount) { - return; - } - - releaseStartBlock = getBlockNumber(); - - xvs.transfer(vaiVaultAddress, actualAmount); - emit DistributedVAIVaultVenus(actualAmount); - - IVAIVault(vaiVaultAddress).updatePendingRewards(); - } -} diff --git a/deploy/001-comptroller.ts b/deploy/001-comptroller.ts index d7c4b79b1..05c7e12c8 100644 --- a/deploy/001-comptroller.ts +++ b/deploy/001-comptroller.ts @@ -14,7 +14,7 @@ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { autoMine: true, }); - await deploy("Comptroller", { + await deploy("ComptrollerMock", { from: deployer, log: true, autoMine: true, diff --git a/deploy/004-support-markets.ts b/deploy/004-support-markets.ts index 8fdb77b68..dda36f019 100644 --- a/deploy/004-support-markets.ts +++ b/deploy/004-support-markets.ts @@ -10,7 +10,7 @@ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { const vETH = await deployments.get("vETH"); const comptrollerDeployment = await deployments.get("Comptroller"); - const comptroller = await ethers.getContractAt("Comptroller", comptrollerDeployment.address); + const comptroller = await ethers.getContractAt("ComptrollerMock", comptrollerDeployment.address); await comptroller.connect(deployerSigner)._supportMarket(vUSDC.address); await comptroller.connect(deployerSigner)._supportMarket(vETH.address); From 9ef6b75b0bcd1198d89043d35ab6d51c7af8e141 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Wed, 21 Jun 2023 11:13:17 +0530 Subject: [PATCH 098/153] fix: ven-1619 1.1 unnecessary immutable function --- contracts/Comptroller/Diamond/Diamond.sol | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/contracts/Comptroller/Diamond/Diamond.sol b/contracts/Comptroller/Diamond/Diamond.sol index 4fc20b27c..4b3d68dd5 100644 --- a/contracts/Comptroller/Diamond/Diamond.sol +++ b/contracts/Comptroller/Diamond/Diamond.sol @@ -136,8 +136,7 @@ contract Diamond is ComptrollerV12Storage { */ function removeFunction(address _facetAddress, bytes4 _selector) internal { require(_facetAddress != address(0), "LibDiamondCut: Can't remove function that doesn't exist"); - // an immutable function is a function defined directly in a diamond - require(_facetAddress != address(this), "LibDiamondCut: Can't remove immutable function"); + // replace selector with last selector, then delete last selector uint256 selectorPosition = selectorToFacetAndPosition[_selector].functionSelectorPosition; uint256 lastSelectorPosition = facetFunctionSelectors[_facetAddress].functionSelectors.length - 1; From b5f701f47397866fc068fd3107aa44c05267e131 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Wed, 21 Jun 2023 11:24:36 +0530 Subject: [PATCH 099/153] fix: ven-1619 2.1 added missing methods --- .../Diamond/facets/MarketFacet.sol | 20 +++++++++++++++++++ .../Diamond/interfaces/IMarketFacet.sol | 2 ++ 2 files changed, 22 insertions(+) diff --git a/contracts/Comptroller/Diamond/facets/MarketFacet.sol b/contracts/Comptroller/Diamond/facets/MarketFacet.sol index dc4505fe0..0281fd382 100644 --- a/contracts/Comptroller/Diamond/facets/MarketFacet.sol +++ b/contracts/Comptroller/Diamond/facets/MarketFacet.sol @@ -16,6 +16,9 @@ contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase /// @notice Emitted when an account exits a market event MarketExited(VToken vToken, address account); + /// @notice Emitted when the borrowing delegate rights are updated for an account + event DelegateUpdated(address borrower, address delegate, bool allowDelegatedBorrows); + /// @notice Indicator that this is a Comptroller contract (for inspection) function isComptroller() public pure returns (bool) { return true; @@ -190,6 +193,23 @@ contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase return uint(Error.NO_ERROR); } + /** + * @notice Grants or revokes the borrowing delegate rights to / from an account. + * If allowed, the delegate will be able to borrow funds on behalf of the sender. + * Upon a delegated borrow, the delegate will receive the funds, and the borrower + * will see the debt on their account. + * @param delegate The address to update the rights for + * @param allowBorrows Whether to grant (true) or revoke (false) the rights + */ + function updateDelegate(address delegate, bool allowBorrows) external { + _updateDelegate(msg.sender, delegate, allowBorrows); + } + + function _updateDelegate(address borrower, address delegate, bool allowBorrows) internal { + approvedDelegates[borrower][delegate] = allowBorrows; + emit DelegateUpdated(borrower, delegate, allowBorrows); + } + function _addMarketInternal(VToken vToken) internal { for (uint i; i < allMarkets.length; ++i) { require(allMarkets[i] != vToken, "market already added"); diff --git a/contracts/Comptroller/Diamond/interfaces/IMarketFacet.sol b/contracts/Comptroller/Diamond/interfaces/IMarketFacet.sol index 7c0288a54..992568f87 100644 --- a/contracts/Comptroller/Diamond/interfaces/IMarketFacet.sol +++ b/contracts/Comptroller/Diamond/interfaces/IMarketFacet.sol @@ -28,4 +28,6 @@ interface IMarketFacet { function getAssetsIn(address account) external view returns (VToken[] memory); function getAllMarkets() external view returns (VToken[] memory); + + function updateDelegate(address delegate, bool allowBorrows) external; } From 022580156da867e6f0e15f33da5b2bda332670f4 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Wed, 21 Jun 2023 12:04:25 +0530 Subject: [PATCH 100/153] fix: ven-1619 2.2, 2.3 moved MarketEntered event --- contracts/Comptroller/Diamond/Diamond.sol | 2 +- contracts/Comptroller/Diamond/facets/FacetBase.sol | 7 ++++++- contracts/Comptroller/Diamond/facets/MarketFacet.sol | 8 +------- tests/hardhat/Comptroller/Diamond/assetListTest.ts | 2 +- 4 files changed, 9 insertions(+), 10 deletions(-) diff --git a/contracts/Comptroller/Diamond/Diamond.sol b/contracts/Comptroller/Diamond/Diamond.sol index 4b3d68dd5..93dc70cc2 100644 --- a/contracts/Comptroller/Diamond/Diamond.sol +++ b/contracts/Comptroller/Diamond/Diamond.sol @@ -98,7 +98,7 @@ contract Diamond is ComptrollerV12Storage { */ function removeFunctions(address _facetAddress, bytes4[] memory _functionSelectors) internal { require(_functionSelectors.length > 0, "LibDiamondCut: No selectors in facet to cut"); - // if function does not exist then do nothing and return + // if function does not exist then do nothing and revert require(_facetAddress == address(0), "LibDiamondCut: Remove facet address must be address(0)"); for (uint256 selectorIndex; selectorIndex < _functionSelectors.length; selectorIndex++) { bytes4 selector = _functionSelectors[selectorIndex]; diff --git a/contracts/Comptroller/Diamond/facets/FacetBase.sol b/contracts/Comptroller/Diamond/facets/FacetBase.sol index 62249e5a0..44518f56c 100644 --- a/contracts/Comptroller/Diamond/facets/FacetBase.sol +++ b/contracts/Comptroller/Diamond/facets/FacetBase.sol @@ -6,6 +6,9 @@ import "../../../Comptroller/ComptrollerStorage.sol"; import "../../../Governance/IAccessControlManager.sol"; contract FacetBase is ComptrollerV12Storage { + /// @notice Emitted when an account enters a market + event MarketEntered(VToken vToken, address account); + /// @notice The initial Venus index for a market uint224 public constant venusInitialIndex = 1e36; // closeFactorMantissa must be strictly greater than this value @@ -111,7 +114,9 @@ contract FacetBase is ComptrollerV12Storage { // and not whenever we want to check if an account is in a particular market marketToJoin.accountMembership[borrower] = true; accountAssets[borrower].push(vToken); - // emit MarketEntered(vToken, borrower); + + emit MarketEntered(vToken, borrower); + return ComptrollerErrorReporter.Error.NO_ERROR; } diff --git a/contracts/Comptroller/Diamond/facets/MarketFacet.sol b/contracts/Comptroller/Diamond/facets/MarketFacet.sol index 0281fd382..33c807ac1 100644 --- a/contracts/Comptroller/Diamond/facets/MarketFacet.sol +++ b/contracts/Comptroller/Diamond/facets/MarketFacet.sol @@ -10,9 +10,6 @@ contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase /// @notice Emitted when an admin supports a market event MarketListed(VToken vToken); - /// @notice Emitted when an account enters a market - event MarketEntered(VToken vToken, address account); - /// @notice Emitted when an account exits a market event MarketExited(VToken vToken, address account); @@ -98,10 +95,7 @@ contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase uint[] memory results = new uint[](len); for (uint i; i < len; ++i) { - results[i] = uint(addToMarketInternal(VToken(vTokens[i]), msg.sender)); - if (results[i] == 0) { - emit MarketEntered(VToken(vTokens[i]), msg.sender); - } + addToMarketInternal(VToken(vTokens[i]), msg.sender); } return results; diff --git a/tests/hardhat/Comptroller/Diamond/assetListTest.ts b/tests/hardhat/Comptroller/Diamond/assetListTest.ts index c3a87ff59..3d74e3043 100644 --- a/tests/hardhat/Comptroller/Diamond/assetListTest.ts +++ b/tests/hardhat/Comptroller/Diamond/assetListTest.ts @@ -153,7 +153,7 @@ describe("Comptroller: assetListTest", () => { const tx2 = await enterAndCheckMarkets([OMG], [OMG]); expect(tx1).to.emit(unitroller, "MarketEntered").withArgs(OMG.address, customer); const tx2Value = await tx2.wait(); - expect(tx2Value.events?.length).to.be.equals(1); + expect(tx2Value.events?.length).to.be.equals(0); }); it("adds to the asset list only once", async () => { From 8f5eeb5ec7492342144c6cda7df079821cb0bb45 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Wed, 21 Jun 2023 12:55:08 +0530 Subject: [PATCH 101/153] fix: ven-1619 3.1 re-entrancy check in claimVenus --- contracts/Comptroller/Diamond/facets/RewardFacet.sol | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/contracts/Comptroller/Diamond/facets/RewardFacet.sol b/contracts/Comptroller/Diamond/facets/RewardFacet.sol index 484468497..8e8368ec8 100644 --- a/contracts/Comptroller/Diamond/facets/RewardFacet.sol +++ b/contracts/Comptroller/Diamond/facets/RewardFacet.sol @@ -158,7 +158,16 @@ contract RewardFacet is XVSRewardsHelper { // If there is a positive shortfall, the XVS reward is accrued, // but won't be granted to this holder (, , uint shortfall) = getHypotheticalAccountLiquidityInternal(holder, VToken(address(0)), 0, 0); - venusAccrued[holder] = grantXVSInternal(holder, venusAccrued[holder], shortfall, collateral); + + uint256 value = venusAccrued[holder]; + venusAccrued[holder] = 0; + + uint256 returnAmount = grantXVSInternal(holder, value, shortfall, collateral); + + // returnAmount can only be positive if balance of xvsAddress is less than grant amount(venusAccrued[holder]) + if (returnAmount != 0) { + venusAccrued[holder] = returnAmount; + } } } } From c2560727fd688e6c18ec80a3a5a3587a56b42b30 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Wed, 21 Jun 2023 13:50:36 +0530 Subject: [PATCH 102/153] fix: ven-1619 3.3 shadowed variables in _setActionsPaused --- .../Comptroller/Diamond/facets/SetterFacet.sol | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/contracts/Comptroller/Diamond/facets/SetterFacet.sol b/contracts/Comptroller/Diamond/facets/SetterFacet.sol index 523f6e72c..c118bec91 100644 --- a/contracts/Comptroller/Diamond/facets/SetterFacet.sol +++ b/contracts/Comptroller/Diamond/facets/SetterFacet.sol @@ -265,18 +265,18 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase /** * @notice Pause/unpause certain actions - * @param markets Markets to pause/unpause the actions on - * @param actions List of action ids to pause/unpause - * @param paused The new paused state (true=paused, false=unpaused) + * @param markets_ Markets to pause/unpause the actions on + * @param actions_ List of action ids to pause/unpause + * @param paused_ The new paused state (true=paused, false=unpaused) */ - function _setActionsPaused(address[] calldata markets, Action[] calldata actions, bool paused) external { + function _setActionsPaused(address[] calldata markets_, Action[] calldata actions_, bool paused_) external { ensureAllowed("_setActionsPaused(address[],uint256[],bool)"); - uint256 numMarkets = markets.length; - uint256 numActions = actions.length; + uint256 numMarkets = markets_.length; + uint256 numActions = actions_.length; for (uint marketIdx; marketIdx < numMarkets; ++marketIdx) { for (uint actionIdx; actionIdx < numActions; ++actionIdx) { - setActionPausedInternal(markets[marketIdx], actions[actionIdx], paused); + setActionPausedInternal(markets_[marketIdx], actions_[actionIdx], paused_); } } } From d12981f2cbb3962d170d0348ede45a07457419b5 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Wed, 21 Jun 2023 14:08:47 +0530 Subject: [PATCH 103/153] feat: ven-1619 3.4 added view methods for facets states --- contracts/Comptroller/Diamond/Diamond.sol | 4 ++-- contracts/Comptroller/Diamond/DiamondLens.sol | 24 +++++++++++++++++++ contracts/test/DiamondHarnessInterface.sol | 15 ++++++++++++ tests/hardhat/Comptroller/Diamond/diamond.ts | 23 ++++++++++++++++++ 4 files changed, 64 insertions(+), 2 deletions(-) create mode 100644 contracts/Comptroller/Diamond/DiamondLens.sol diff --git a/contracts/Comptroller/Diamond/Diamond.sol b/contracts/Comptroller/Diamond/Diamond.sol index 93dc70cc2..0c162591d 100644 --- a/contracts/Comptroller/Diamond/Diamond.sol +++ b/contracts/Comptroller/Diamond/Diamond.sol @@ -2,10 +2,10 @@ pragma solidity 0.5.16; pragma experimental ABIEncoderV2; import { IDiamondCut } from "./interfaces/IDiamondCut.sol"; -import "../ComptrollerStorage.sol"; +import "./DiamondLens.sol"; import "../Unitroller.sol"; -contract Diamond is ComptrollerV12Storage { +contract Diamond is DiamondLens { event DiamondCut(IDiamondCut.FacetCut[] _diamondCut); /** diff --git a/contracts/Comptroller/Diamond/DiamondLens.sol b/contracts/Comptroller/Diamond/DiamondLens.sol new file mode 100644 index 000000000..687a0e777 --- /dev/null +++ b/contracts/Comptroller/Diamond/DiamondLens.sol @@ -0,0 +1,24 @@ +pragma solidity 0.5.16; +pragma experimental ABIEncoderV2; + +import "../ComptrollerStorage.sol"; + +contract DiamondLens is ComptrollerV12Storage { + function getFacetFunctionSelectors(address _facet) external view returns (bytes4[] memory _facetFunctionSelectors) { + _facetFunctionSelectors = facetFunctionSelectors[_facet].functionSelectors; + } + + function getFacetPosition(address _facet) external view returns (uint256) { + return facetFunctionSelectors[_facet].facetAddressPosition; + } + + function getAllFacetAddresses() external view returns (address[] memory facetAddresses_) { + facetAddresses_ = facetAddresses; + } + + function getFacetAddressAndPosition( + bytes4 _functionSelector + ) external view returns (ComptrollerV12Storage.FacetAddressAndPosition memory) { + return selectorToFacetAndPosition[_functionSelector]; + } +} diff --git a/contracts/test/DiamondHarnessInterface.sol b/contracts/test/DiamondHarnessInterface.sol index efb99795a..bf9b73f35 100644 --- a/contracts/test/DiamondHarnessInterface.sol +++ b/contracts/test/DiamondHarnessInterface.sol @@ -14,7 +14,22 @@ contract DiamondHarnessInterface { bytes4[] functionSelectors; } + struct FacetAddressAndPosition { + address facetAddress; + uint96 functionSelectorPosition; + } + function getFacetAddress(bytes4 sig) public view returns (address); function diamondCut(FacetCut[] calldata _diamondCut) external; + + function getFacetFunctionSelectors(address _facet) external view returns (bytes4[] memory _facetFunctionSelectors); + + function getFacetPosition(address _facet) external view returns (uint256); + + function getAllFacetAddresses() external view returns (address[] memory facetAddresses_); + + function getFacetAddressAndPosition( + bytes4 _functionSelector + ) external view returns (FacetAddressAndPosition memory); } diff --git a/tests/hardhat/Comptroller/Diamond/diamond.ts b/tests/hardhat/Comptroller/Diamond/diamond.ts index 87c0bc9d2..188687f77 100644 --- a/tests/hardhat/Comptroller/Diamond/diamond.ts +++ b/tests/hardhat/Comptroller/Diamond/diamond.ts @@ -61,6 +61,29 @@ describe("Comptroller", async () => { expect(await diamondHarness.getFacetAddress("0xc488847b")).to.equal(facet.address); }); + it("Get all facet function selectors by facet address", async () => { + const functionSelectors = await diamondHarness.getFacetFunctionSelectors(facetCutParams[0].facetAddress); + expect(functionSelectors).to.deep.equal(facetCutParams[0].functionSelectors); + }); + + it("Get facet position by facet address", async () => { + const facetPosition = await diamondHarness.getFacetPosition(facetCutParams[0].facetAddress); + expect(facetPosition).to.equal(0); + }); + + it("Get all facet addresses", async () => { + const facetsAddress = await diamondHarness.getAllFacetAddresses(); + expect(facetsAddress[0]).to.equal(facetCutParams[0].facetAddress); + }); + + it("Get facet address and position by function selector", async () => { + const facetsAddressAndPosition = await diamondHarness.getFacetAddressAndPosition( + facetCutParams[0].functionSelectors[1], + ); + expect(facetsAddressAndPosition.facetAddress).to.equal(facetCutParams[0].facetAddress); + expect(facetsAddressAndPosition.functionSelectorPosition).to.equal(1); + }); + it("Remove function selector from facet mapping", async () => { facetCutParams = [ { From 579b11b9e71b4c520f515196bee954f38a41dc85 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Wed, 21 Jun 2023 17:43:48 +0530 Subject: [PATCH 104/153] refactor: ven-1619 3.4 added view methods for facets states --- contracts/Comptroller/Diamond/Diamond.sol | 41 ++++++++++++++++++- contracts/Comptroller/Diamond/DiamondLens.sol | 24 ----------- 2 files changed, 39 insertions(+), 26 deletions(-) delete mode 100644 contracts/Comptroller/Diamond/DiamondLens.sol diff --git a/contracts/Comptroller/Diamond/Diamond.sol b/contracts/Comptroller/Diamond/Diamond.sol index 0c162591d..dfe914ec6 100644 --- a/contracts/Comptroller/Diamond/Diamond.sol +++ b/contracts/Comptroller/Diamond/Diamond.sol @@ -2,10 +2,10 @@ pragma solidity 0.5.16; pragma experimental ABIEncoderV2; import { IDiamondCut } from "./interfaces/IDiamondCut.sol"; -import "./DiamondLens.sol"; +import "../ComptrollerStorage.sol"; import "../Unitroller.sol"; -contract Diamond is DiamondLens { +contract Diamond is ComptrollerV12Storage { event DiamondCut(IDiamondCut.FacetCut[] _diamondCut); /** @@ -26,6 +26,43 @@ contract Diamond is DiamondLens { libDiamondCut(_diamondCut); } + /** + * @notice Get all function selectors mapped to the facet address + * @param _facet Address of the facet + * @return _facetFunctionSelectors Array of function selectors + */ + function getFacetFunctionSelectors(address _facet) external view returns (bytes4[] memory _facetFunctionSelectors) { + _facetFunctionSelectors = facetFunctionSelectors[_facet].functionSelectors; + } + + /** + * @notice Get facet position in the facetFunctionSelectors through facet address + * @param _facet Address of the facet + * @return Position of the facet + */ + function getFacetPosition(address _facet) external view returns (uint256) { + return facetFunctionSelectors[_facet].facetAddressPosition; + } + + /** + * @notice Get all facet addresses + * @return Array of facet addresses + */ + function getAllFacetAddresses() external view returns (address[] memory facetAddresses_) { + facetAddresses_ = facetAddresses; + } + + /** + * @notice Get facet address and position through function selector + * @param _functionSelector function selector + * @return FacetAddressAndPosition facet address and position + */ + function getFacetAddressAndPosition( + bytes4 _functionSelector + ) external view returns (ComptrollerV12Storage.FacetAddressAndPosition memory) { + return selectorToFacetAndPosition[_functionSelector]; + } + /** * @notice To add function selectors to the facets' mapping. * @param _diamondCut IDiamondCut contains facets address, action and function selectors. diff --git a/contracts/Comptroller/Diamond/DiamondLens.sol b/contracts/Comptroller/Diamond/DiamondLens.sol deleted file mode 100644 index 687a0e777..000000000 --- a/contracts/Comptroller/Diamond/DiamondLens.sol +++ /dev/null @@ -1,24 +0,0 @@ -pragma solidity 0.5.16; -pragma experimental ABIEncoderV2; - -import "../ComptrollerStorage.sol"; - -contract DiamondLens is ComptrollerV12Storage { - function getFacetFunctionSelectors(address _facet) external view returns (bytes4[] memory _facetFunctionSelectors) { - _facetFunctionSelectors = facetFunctionSelectors[_facet].functionSelectors; - } - - function getFacetPosition(address _facet) external view returns (uint256) { - return facetFunctionSelectors[_facet].facetAddressPosition; - } - - function getAllFacetAddresses() external view returns (address[] memory facetAddresses_) { - facetAddresses_ = facetAddresses; - } - - function getFacetAddressAndPosition( - bytes4 _functionSelector - ) external view returns (ComptrollerV12Storage.FacetAddressAndPosition memory) { - return selectorToFacetAndPosition[_functionSelector]; - } -} From a46b20594e86d09e73f9049205ed8cec57f39896 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Wed, 21 Jun 2023 18:11:22 +0530 Subject: [PATCH 105/153] fix: docgen issue --- contracts/Comptroller/Diamond/Diamond.sol | 2 +- contracts/test/XVSVaultHarness.sol | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/Comptroller/Diamond/Diamond.sol b/contracts/Comptroller/Diamond/Diamond.sol index dfe914ec6..ed0e5ef9f 100644 --- a/contracts/Comptroller/Diamond/Diamond.sol +++ b/contracts/Comptroller/Diamond/Diamond.sol @@ -46,7 +46,7 @@ contract Diamond is ComptrollerV12Storage { /** * @notice Get all facet addresses - * @return Array of facet addresses + * @return facetAddresses_ Array of facet addresses */ function getAllFacetAddresses() external view returns (address[] memory facetAddresses_) { facetAddresses_ = facetAddresses; diff --git a/contracts/test/XVSVaultHarness.sol b/contracts/test/XVSVaultHarness.sol index 579cae0c8..f22c8e6ec 100644 --- a/contracts/test/XVSVaultHarness.sol +++ b/contracts/test/XVSVaultHarness.sol @@ -4,7 +4,7 @@ contract XVSVaultHarness { constructor() public {} // solhint-disable-next-line no-unused-vars - function getPriorVotes(address account, uint256 blockNumber, uint256 votePower) external view returns (uint256) { + function getPriorVotes(address account, uint256 blockNumber, uint256 votePower) external pure returns (uint256) { return votePower; } } From 05ff7979ea182867dea39c104a3e09a8d60c3401 Mon Sep 17 00:00:00 2001 From: defcon022 Date: Wed, 28 Jun 2023 14:10:44 +0530 Subject: [PATCH 106/153] fix: ven-1630 check for market not as collateral --- contracts/Comptroller/Diamond/facets/PolicyFacet.sol | 9 ++++++++- contracts/Utils/ErrorReporter.sol | 3 ++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/contracts/Comptroller/Diamond/facets/PolicyFacet.sol b/contracts/Comptroller/Diamond/facets/PolicyFacet.sol index 257b79178..33ec5c94b 100644 --- a/contracts/Comptroller/Diamond/facets/PolicyFacet.sol +++ b/contracts/Comptroller/Diamond/facets/PolicyFacet.sol @@ -269,8 +269,15 @@ contract PolicyFacet is XVSRewardsHelper { checkProtocolPauseState(); checkActionPauseState(vTokenCollateral, Action.SEIZE); + Market storage market = markets[vTokenCollateral]; + // We've added VAIController as a borrowed token list check for seize - ensureListed(markets[vTokenCollateral]); + ensureListed(market); + + if (!market.accountMembership[borrower]) { + return uint(Error.MARKET_NOT_COLLATERAL); + } + if (address(vTokenBorrowed) != address(vaiController)) { ensureListed(markets[vTokenBorrowed]); } diff --git a/contracts/Utils/ErrorReporter.sol b/contracts/Utils/ErrorReporter.sol index 9a3191e8f..03a1d30f5 100644 --- a/contracts/Utils/ErrorReporter.sol +++ b/contracts/Utils/ErrorReporter.sol @@ -20,7 +20,8 @@ contract ComptrollerErrorReporter { SNAPSHOT_ERROR, TOO_MANY_ASSETS, TOO_MUCH_REPAY, - INSUFFICIENT_BALANCE_FOR_VAI + INSUFFICIENT_BALANCE_FOR_VAI, + MARKET_NOT_COLLATERAL } enum FailureInfo { From f285dd133d422de7289be384cb4cc888c655f107 Mon Sep 17 00:00:00 2001 From: Debugger022 Date: Tue, 4 Jul 2023 21:06:02 +0530 Subject: [PATCH 107/153] fix: ven-1699 pve001 --- .../Comptroller/Diamond/facets/FacetBase.sol | 56 ++++++++++++++++++- .../Diamond/facets/SetterFacet.sol | 3 +- .../Diamond/facets/XVSRewardsHelper.sol | 51 +---------------- 3 files changed, 57 insertions(+), 53 deletions(-) diff --git a/contracts/Comptroller/Diamond/facets/FacetBase.sol b/contracts/Comptroller/Diamond/facets/FacetBase.sol index 44518f56c..bccae77a3 100644 --- a/contracts/Comptroller/Diamond/facets/FacetBase.sol +++ b/contracts/Comptroller/Diamond/facets/FacetBase.sol @@ -1,14 +1,19 @@ pragma solidity 0.5.16; -import "../../../Tokens/VTokens/VToken.sol"; +import "../interfaces/IXVS.sol"; import "../../../Utils/ErrorReporter.sol"; +import "../../../Tokens/VTokens/VToken.sol"; +import "../../../Utils/ExponentialNoError.sol"; import "../../../Comptroller/ComptrollerStorage.sol"; import "../../../Governance/IAccessControlManager.sol"; -contract FacetBase is ComptrollerV12Storage { +contract FacetBase is ComptrollerV12Storage, ExponentialNoError { /// @notice Emitted when an account enters a market event MarketEntered(VToken vToken, address account); + /// @notice Emitted when XVS is distributed to VAI Vault + event DistributedVAIVaultVenus(uint amount); + /// @notice The initial Venus index for a market uint224 public constant venusInitialIndex = 1e36; // closeFactorMantissa must be strictly greater than this value @@ -61,10 +66,57 @@ contract FacetBase is ComptrollerV12Storage { return _actionPaused[market][uint(action)]; } + /** + * @notice Get the latest block number + */ function getBlockNumber() public view returns (uint) { return block.number; } + /** + * @notice Transfer XVS to VAI Vault + */ + function releaseToVault() public { + if (releaseStartBlock == 0 || getBlockNumber() < releaseStartBlock) { + return; + } + + uint256 xvsBalance = IXVS(getXVSAddress()).balanceOf(address(this)); + if (xvsBalance == 0) { + return; + } + + uint256 actualAmount; + uint256 deltaBlocks = sub_(getBlockNumber(), releaseStartBlock); + // releaseAmount = venusVAIVaultRate * deltaBlocks + uint256 _releaseAmount = mul_(venusVAIVaultRate, deltaBlocks); + + if (xvsBalance >= _releaseAmount) { + actualAmount = _releaseAmount; + } else { + actualAmount = xvsBalance; + } + + if (actualAmount < minReleaseAmount) { + return; + } + + releaseStartBlock = getBlockNumber(); + + IXVS(getXVSAddress()).transfer(vaiVaultAddress, actualAmount); + emit DistributedVAIVaultVenus(actualAmount); + + IVAIVault(vaiVaultAddress).updatePendingRewards(); + } + + /** + * @notice Return the address of the XVS token + * @return The address of XVS + */ + function getXVSAddress() public pure returns (address) { + return 0xcF6BB5389c92Bdda8a3747Ddb454cB7a64626C63; + } + /** * @notice Determine what the account liquidity would be if the given amounts were redeemed/borrowed * @param vTokenModify The market to hypothetically redeem/borrow in diff --git a/contracts/Comptroller/Diamond/facets/SetterFacet.sol b/contracts/Comptroller/Diamond/facets/SetterFacet.sol index c118bec91..67ae396b9 100644 --- a/contracts/Comptroller/Diamond/facets/SetterFacet.sol +++ b/contracts/Comptroller/Diamond/facets/SetterFacet.sol @@ -381,13 +381,13 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase return uint(Error.NO_ERROR); } - /** /** * @notice Set the amount of XVS distributed per block to VAI Vault * @param venusVAIVaultRate_ The amount of XVS wei per block to distribute to VAI Vault */ function _setVenusVAIVaultRate(uint venusVAIVaultRate_) external { ensureAdmin(); + releaseToVault(); uint oldVenusVAIVaultRate = venusVAIVaultRate; venusVAIVaultRate = venusVAIVaultRate_; emit NewVenusVAIVaultRate(oldVenusVAIVaultRate, venusVAIVaultRate_); @@ -402,6 +402,7 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase function _setVAIVaultInfo(address vault_, uint256 releaseStartBlock_, uint256 minReleaseAmount_) external { ensureAdmin(); ensureNonzeroAddress(vault_); + releaseToVault(); vaiVaultAddress = vault_; releaseStartBlock = releaseStartBlock_; diff --git a/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol b/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol index 32521c401..f19fdee20 100644 --- a/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol +++ b/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol @@ -1,16 +1,11 @@ pragma solidity 0.5.16; -import "../../../Utils/ExponentialNoError.sol"; -import "../interfaces/IXVS.sol"; import "./FacetBase.sol"; /** * @dev This contract contains internal functions used in RewardFacet and PolicyFacet */ -contract XVSRewardsHelper is ComptrollerErrorReporter, ExponentialNoError, FacetBase { - /// @notice Emitted when XVS is distributed to VAI Vault - event DistributedVAIVaultVenus(uint amount); - +contract XVSRewardsHelper is ComptrollerErrorReporter, FacetBase { /// @notice Emitted when XVS is distributed to a borrower event DistributedBorrowerVenus( VToken indexed vToken, @@ -132,48 +127,4 @@ contract XVSRewardsHelper is ComptrollerErrorReporter, ExponentialNoError, Facet venusAccrued[borrower] = add_(venusAccrued[borrower], borrowerDelta); emit DistributedBorrowerVenus(VToken(vToken), borrower, borrowerDelta, borrowIndex); } - - /** - * @notice Transfer XVS to VAI Vault - */ - function releaseToVault() public { - if (releaseStartBlock == 0 || getBlockNumber() < releaseStartBlock) { - return; - } - - uint256 xvsBalance = IXVS(getXVSAddress()).balanceOf(address(this)); - if (xvsBalance == 0) { - return; - } - - uint256 actualAmount; - uint256 deltaBlocks = sub_(getBlockNumber(), releaseStartBlock); - // releaseAmount = venusVAIVaultRate * deltaBlocks - uint256 _releaseAmount = mul_(venusVAIVaultRate, deltaBlocks); - - if (xvsBalance >= _releaseAmount) { - actualAmount = _releaseAmount; - } else { - actualAmount = xvsBalance; - } - - if (actualAmount < minReleaseAmount) { - return; - } - - releaseStartBlock = getBlockNumber(); - - IXVS(getXVSAddress()).transfer(vaiVaultAddress, actualAmount); - emit DistributedVAIVaultVenus(actualAmount); - - IVAIVault(vaiVaultAddress).updatePendingRewards(); - } - - /** - * @notice Return the address of the XVS token - * @return The address of XVS - */ - function getXVSAddress() public pure returns (address) { - return 0xcF6BB5389c92Bdda8a3747Ddb454cB7a64626C63; - } } From 4598d0082f6fb5cd76c0c3a10f8062a01b5a15b9 Mon Sep 17 00:00:00 2001 From: Debugger022 Date: Tue, 4 Jul 2023 21:06:54 +0530 Subject: [PATCH 108/153] fix: ven-1699 n1 --- contracts/Comptroller/Diamond/interfaces/IDiamondCut.sol | 2 -- 1 file changed, 2 deletions(-) diff --git a/contracts/Comptroller/Diamond/interfaces/IDiamondCut.sol b/contracts/Comptroller/Diamond/interfaces/IDiamondCut.sol index eeec92c41..d3af9e704 100644 --- a/contracts/Comptroller/Diamond/interfaces/IDiamondCut.sol +++ b/contracts/Comptroller/Diamond/interfaces/IDiamondCut.sol @@ -19,6 +19,4 @@ interface IDiamondCut { /// a function with delegatecall /// @param _diamondCut Contains the facet addresses and function selectors function diamondCut(FacetCut[] calldata _diamondCut) external; - - event DiamondCut(FacetCut[] _diamondCut); } From 13c0a929948bb36e8a64d041ba58f26d5893101f Mon Sep 17 00:00:00 2001 From: Debugger022 Date: Tue, 4 Jul 2023 21:07:03 +0530 Subject: [PATCH 109/153] fix: ven-1699 n2 --- contracts/Comptroller/Diamond/facets/MarketFacet.sol | 4 +--- contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol | 4 ++-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/contracts/Comptroller/Diamond/facets/MarketFacet.sol b/contracts/Comptroller/Diamond/facets/MarketFacet.sol index 33c807ac1..4ddd2d982 100644 --- a/contracts/Comptroller/Diamond/facets/MarketFacet.sol +++ b/contracts/Comptroller/Diamond/facets/MarketFacet.sol @@ -212,8 +212,6 @@ contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase } function _initializeMarket(address vToken) internal { - uint blockNumber = block.number; - VenusMarketState storage supplyState = venusSupplyState[vToken]; VenusMarketState storage borrowState = venusBorrowState[vToken]; @@ -233,6 +231,6 @@ contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase /* * Update market state block numbers */ - supplyState.block = borrowState.block = uint32(blockNumber); + supplyState.block = borrowState.block = uint32(getBlockNumber()); } } diff --git a/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol b/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol index f19fdee20..cb605f413 100644 --- a/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol +++ b/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol @@ -29,7 +29,7 @@ contract XVSRewardsHelper is ComptrollerErrorReporter, FacetBase { function updateVenusBorrowIndex(address vToken, ExponentialNoError.Exp memory marketBorrowIndex) internal { VenusMarketState storage borrowState = venusBorrowState[vToken]; uint borrowSpeed = venusBorrowSpeeds[vToken]; - uint blockNumber = block.number; + uint blockNumber = getBlockNumber(); uint deltaBlocks = sub_(uint(blockNumber), uint(borrowState.block)); if (deltaBlocks > 0 && borrowSpeed > 0) { uint borrowAmount = div_(VToken(vToken).totalBorrows(), marketBorrowIndex); @@ -52,7 +52,7 @@ contract XVSRewardsHelper is ComptrollerErrorReporter, FacetBase { function updateVenusSupplyIndex(address vToken) internal { VenusMarketState storage supplyState = venusSupplyState[vToken]; uint supplySpeed = venusSupplySpeeds[vToken]; - uint blockNumber = block.number; + uint blockNumber = getBlockNumber(); uint deltaBlocks = sub_(uint(blockNumber), uint(supplyState.block)); if (deltaBlocks > 0 && supplySpeed > 0) { From b5ef58e71e0a3e99146b8062a89074daaa6cd048 Mon Sep 17 00:00:00 2001 From: Debugger022 Date: Tue, 4 Jul 2023 21:07:26 +0530 Subject: [PATCH 110/153] fix: ven-1699 pve002 --- contracts/Comptroller/Diamond/facets/FacetBase.sol | 8 +++++--- contracts/Comptroller/Diamond/facets/RewardFacet.sol | 10 ++++++---- contracts/Comptroller/Diamond/interfaces/IXVS.sol | 9 --------- 3 files changed, 11 insertions(+), 16 deletions(-) delete mode 100644 contracts/Comptroller/Diamond/interfaces/IXVS.sol diff --git a/contracts/Comptroller/Diamond/facets/FacetBase.sol b/contracts/Comptroller/Diamond/facets/FacetBase.sol index bccae77a3..c9ed1e482 100644 --- a/contracts/Comptroller/Diamond/facets/FacetBase.sol +++ b/contracts/Comptroller/Diamond/facets/FacetBase.sol @@ -1,11 +1,11 @@ pragma solidity 0.5.16; -import "../interfaces/IXVS.sol"; import "../../../Utils/ErrorReporter.sol"; import "../../../Tokens/VTokens/VToken.sol"; import "../../../Utils/ExponentialNoError.sol"; import "../../../Comptroller/ComptrollerStorage.sol"; import "../../../Governance/IAccessControlManager.sol"; +import "../../../Utils/SafeBEP20.sol"; contract FacetBase is ComptrollerV12Storage, ExponentialNoError { /// @notice Emitted when an account enters a market @@ -14,6 +14,8 @@ contract FacetBase is ComptrollerV12Storage, ExponentialNoError { /// @notice Emitted when XVS is distributed to VAI Vault event DistributedVAIVaultVenus(uint amount); + using SafeBEP20 for IBEP20; + /// @notice The initial Venus index for a market uint224 public constant venusInitialIndex = 1e36; // closeFactorMantissa must be strictly greater than this value @@ -81,7 +83,7 @@ contract FacetBase is ComptrollerV12Storage, ExponentialNoError { return; } - uint256 xvsBalance = IXVS(getXVSAddress()).balanceOf(address(this)); + uint256 xvsBalance = IBEP20(getXVSAddress()).balanceOf(address(this)); if (xvsBalance == 0) { return; } @@ -103,7 +105,7 @@ contract FacetBase is ComptrollerV12Storage, ExponentialNoError { releaseStartBlock = getBlockNumber(); - IXVS(getXVSAddress()).transfer(vaiVaultAddress, actualAmount); + IBEP20(getXVSAddress()).safeTransfer(vaiVaultAddress, actualAmount); emit DistributedVAIVaultVenus(actualAmount); IVAIVault(vaiVaultAddress).updatePendingRewards(); diff --git a/contracts/Comptroller/Diamond/facets/RewardFacet.sol b/contracts/Comptroller/Diamond/facets/RewardFacet.sol index 8e8368ec8..e777a5c7f 100644 --- a/contracts/Comptroller/Diamond/facets/RewardFacet.sol +++ b/contracts/Comptroller/Diamond/facets/RewardFacet.sol @@ -2,7 +2,6 @@ pragma solidity 0.5.16; import "../../../Tokens/VTokens/VToken.sol"; import "./XVSRewardsHelper.sol"; -import "../interfaces/IXVS.sol"; /** * @dev This facet contains all the methods related to the reward functionality @@ -11,6 +10,8 @@ contract RewardFacet is XVSRewardsHelper { /// @notice Emitted when Venus is granted by admin event VenusGranted(address recipient, uint amount); + using SafeBEP20 for IBEP20; + /** * @notice Claim all the xvs accrued by holder in all markets and VAI * @param holder The address to claim XVS for @@ -70,12 +71,12 @@ contract RewardFacet is XVSRewardsHelper { "Blacklisted" ); - if (amount == 0 || amount > IXVS(getXVSAddress()).balanceOf(address(this))) { + if (amount == 0 || amount > IBEP20(getXVSAddress()).balanceOf(address(this))) { return amount; } if (shortfall == 0) { - IXVS(getXVSAddress()).transfer(user, amount); + IBEP20(getXVSAddress()).safeTransfer(user, amount); return 0; } // If user's bankrupt and doesn't use pending xvs as collateral, don't grant @@ -85,7 +86,8 @@ contract RewardFacet is XVSRewardsHelper { // If mintBehalf failed, don't grant any xvs require(collateral, "bankrupt accounts can only collateralize their pending xvs rewards"); - IXVS(getXVSAddress()).approve(getXVSVTokenAddress(), amount); + IBEP20(getXVSAddress()).safeApprove(getXVSVTokenAddress(), 0); + IBEP20(getXVSAddress()).safeApprove(getXVSVTokenAddress(), amount); require( VBep20Interface(getXVSVTokenAddress()).mintBehalf(user, amount) == uint(Error.NO_ERROR), "mint behalf error during collateralize xvs" diff --git a/contracts/Comptroller/Diamond/interfaces/IXVS.sol b/contracts/Comptroller/Diamond/interfaces/IXVS.sol deleted file mode 100644 index 14d90a6b5..000000000 --- a/contracts/Comptroller/Diamond/interfaces/IXVS.sol +++ /dev/null @@ -1,9 +0,0 @@ -pragma solidity 0.5.16; - -interface IXVS { - function balanceOf(address account) external view returns (uint); - - function transfer(address dst, uint rawAmount) external returns (bool); - - function approve(address spender, uint rawAmount) external returns (bool); -} From 94bc2e414e33ebf6c05d35c1605dcbd48fa932f5 Mon Sep 17 00:00:00 2001 From: Debugger022 Date: Fri, 7 Jul 2023 17:02:59 +0530 Subject: [PATCH 111/153] fix: VEN-1686 --- contracts/Comptroller/Diamond/facets/SetterFacet.sol | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/contracts/Comptroller/Diamond/facets/SetterFacet.sol b/contracts/Comptroller/Diamond/facets/SetterFacet.sol index 67ae396b9..a36506b77 100644 --- a/contracts/Comptroller/Diamond/facets/SetterFacet.sol +++ b/contracts/Comptroller/Diamond/facets/SetterFacet.sol @@ -387,7 +387,9 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase */ function _setVenusVAIVaultRate(uint venusVAIVaultRate_) external { ensureAdmin(); - releaseToVault(); + if (vaiVaultAddress != address(0)) { + releaseToVault(); + } uint oldVenusVAIVaultRate = venusVAIVaultRate; venusVAIVaultRate = venusVAIVaultRate_; emit NewVenusVAIVaultRate(oldVenusVAIVaultRate, venusVAIVaultRate_); @@ -402,7 +404,9 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase function _setVAIVaultInfo(address vault_, uint256 releaseStartBlock_, uint256 minReleaseAmount_) external { ensureAdmin(); ensureNonzeroAddress(vault_); - releaseToVault(); + if (vaiVaultAddress != address(0)) { + releaseToVault(); + } vaiVaultAddress = vault_; releaseStartBlock = releaseStartBlock_; From c57d257e081823d153421467b323b3a385943e49 Mon Sep 17 00:00:00 2001 From: Debugger022 Date: Tue, 11 Jul 2023 21:52:21 +0530 Subject: [PATCH 112/153] fix: enter markets return empty array --- contracts/Comptroller/Diamond/facets/MarketFacet.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/Comptroller/Diamond/facets/MarketFacet.sol b/contracts/Comptroller/Diamond/facets/MarketFacet.sol index 4ddd2d982..0b87c3dc1 100644 --- a/contracts/Comptroller/Diamond/facets/MarketFacet.sol +++ b/contracts/Comptroller/Diamond/facets/MarketFacet.sol @@ -95,7 +95,7 @@ contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase uint[] memory results = new uint[](len); for (uint i; i < len; ++i) { - addToMarketInternal(VToken(vTokens[i]), msg.sender); + results[i] = uint(addToMarketInternal(VToken(vTokens[i]), msg.sender)); } return results; From e762a5d7f83f378a041053a2b9f4b8e68b72d8be Mon Sep 17 00:00:00 2001 From: Debugger022 Date: Thu, 20 Jul 2023 19:07:36 +0530 Subject: [PATCH 113/153] fix: gas-01 --- contracts/Comptroller/Diamond/Diamond.sol | 9 +++++---- .../Comptroller/Diamond/facets/XVSRewardsHelper.sol | 12 ++++++------ 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/contracts/Comptroller/Diamond/Diamond.sol b/contracts/Comptroller/Diamond/Diamond.sol index ed0e5ef9f..7d7a4ef44 100644 --- a/contracts/Comptroller/Diamond/Diamond.sol +++ b/contracts/Comptroller/Diamond/Diamond.sol @@ -89,7 +89,7 @@ contract Diamond is ComptrollerV12Storage { * @param _functionSelectors Array of function selectors need to add in the mapping. */ function addFunctions(address _facetAddress, bytes4[] memory _functionSelectors) internal { - require(_functionSelectors.length > 0, "LibDiamondCut: No selectors in facet to cut"); + require(_functionSelectors.length != 0, "LibDiamondCut: No selectors in facet to cut"); require(_facetAddress != address(0), "LibDiamondCut: Add facet can't be address(0)"); uint96 selectorPosition = uint96(facetFunctionSelectors[_facetAddress].functionSelectors.length); // add new facet address if it does not exist @@ -111,7 +111,7 @@ contract Diamond is ComptrollerV12Storage { * @param _functionSelectors Array of function selectors need to replace in the mapping. */ function replaceFunctions(address _facetAddress, bytes4[] memory _functionSelectors) internal { - require(_functionSelectors.length > 0, "LibDiamondCut: No selectors in facet to cut"); + require(_functionSelectors.length != 0, "LibDiamondCut: No selectors in facet to cut"); require(_facetAddress != address(0), "LibDiamondCut: Add facet can't be address(0)"); uint96 selectorPosition = uint96(facetFunctionSelectors[_facetAddress].functionSelectors.length); // add new facet address if it does not exist @@ -134,7 +134,8 @@ contract Diamond is ComptrollerV12Storage { * @param _functionSelectors Array of function selectors need to remove in the mapping. */ function removeFunctions(address _facetAddress, bytes4[] memory _functionSelectors) internal { - require(_functionSelectors.length > 0, "LibDiamondCut: No selectors in facet to cut"); + uint256 functionSelectorsLength = _functionSelectors.length; + require(functionSelectorsLength != 0, "LibDiamondCut: No selectors in facet to cut"); // if function does not exist then do nothing and revert require(_facetAddress == address(0), "LibDiamondCut: Remove facet address must be address(0)"); for (uint256 selectorIndex; selectorIndex < _functionSelectors.length; selectorIndex++) { @@ -207,7 +208,7 @@ contract Diamond is ComptrollerV12Storage { assembly { contractSize := extcodesize(_contract) } - require(contractSize > 0, _errorMessage); + require(contractSize != 0, _errorMessage); } // Find facet for function that is called and execute the diff --git a/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol b/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol index cb605f413..7c86a9a0e 100644 --- a/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol +++ b/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol @@ -31,16 +31,16 @@ contract XVSRewardsHelper is ComptrollerErrorReporter, FacetBase { uint borrowSpeed = venusBorrowSpeeds[vToken]; uint blockNumber = getBlockNumber(); uint deltaBlocks = sub_(uint(blockNumber), uint(borrowState.block)); - if (deltaBlocks > 0 && borrowSpeed > 0) { + if (deltaBlocks != 0 && borrowSpeed != 0) { uint borrowAmount = div_(VToken(vToken).totalBorrows(), marketBorrowIndex); uint venusAccrued = mul_(deltaBlocks, borrowSpeed); - Double memory ratio = borrowAmount > 0 ? fraction(venusAccrued, borrowAmount) : Double({ mantissa: 0 }); + Double memory ratio = borrowAmount != 0 ? fraction(venusAccrued, borrowAmount) : Double({ mantissa: 0 }); borrowState.index = safe224( add_(Double({ mantissa: borrowState.index }), ratio).mantissa, "new index exceeds 224 bits" ); borrowState.block = uint32(blockNumber); - } else if (deltaBlocks > 0) { + } else if (deltaBlocks != 0) { borrowState.block = uint32(blockNumber); } } @@ -55,16 +55,16 @@ contract XVSRewardsHelper is ComptrollerErrorReporter, FacetBase { uint blockNumber = getBlockNumber(); uint deltaBlocks = sub_(uint(blockNumber), uint(supplyState.block)); - if (deltaBlocks > 0 && supplySpeed > 0) { + if (deltaBlocks != 0 && supplySpeed != 0) { uint supplyTokens = VToken(vToken).totalSupply(); uint venusAccrued = mul_(deltaBlocks, supplySpeed); - Double memory ratio = supplyTokens > 0 ? fraction(venusAccrued, supplyTokens) : Double({ mantissa: 0 }); + Double memory ratio = supplyTokens != 0 ? fraction(venusAccrued, supplyTokens) : Double({ mantissa: 0 }); supplyState.index = safe224( add_(Double({ mantissa: supplyState.index }), ratio).mantissa, "new index exceeds 224 bits" ); supplyState.block = uint32(blockNumber); - } else if (deltaBlocks > 0) { + } else if (deltaBlocks != 0) { supplyState.block = uint32(blockNumber); } } From b3503c2cf5dcd9e3997c7ad9695eda8390ad550e Mon Sep 17 00:00:00 2001 From: Debugger022 Date: Thu, 20 Jul 2023 19:12:43 +0530 Subject: [PATCH 114/153] fix: gas-02 --- contracts/Comptroller/Diamond/Diamond.sol | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/contracts/Comptroller/Diamond/Diamond.sol b/contracts/Comptroller/Diamond/Diamond.sol index 7d7a4ef44..21dcab40d 100644 --- a/contracts/Comptroller/Diamond/Diamond.sol +++ b/contracts/Comptroller/Diamond/Diamond.sol @@ -68,7 +68,8 @@ contract Diamond is ComptrollerV12Storage { * @param _diamondCut IDiamondCut contains facets address, action and function selectors. */ function libDiamondCut(IDiamondCut.FacetCut[] memory _diamondCut) internal { - for (uint256 facetIndex; facetIndex < _diamondCut.length; facetIndex++) { + uint256 diamondCutLength = _diamondCut.length; + for (uint256 facetIndex; facetIndex < diamondCutLength; ++facetIndex) { IDiamondCut.FacetCutAction action = _diamondCut[facetIndex].action; if (action == IDiamondCut.FacetCutAction.Add) { addFunctions(_diamondCut[facetIndex].facetAddress, _diamondCut[facetIndex].functionSelectors); @@ -96,12 +97,13 @@ contract Diamond is ComptrollerV12Storage { if (selectorPosition == 0) { addFacet(_facetAddress); } - for (uint256 selectorIndex; selectorIndex < _functionSelectors.length; selectorIndex++) { + uint256 functionSelectorsLength = _functionSelectors.length; + for (uint256 selectorIndex; selectorIndex < functionSelectorsLength; ++selectorIndex) { bytes4 selector = _functionSelectors[selectorIndex]; address oldFacetAddress = selectorToFacetAndPosition[selector].facetAddress; require(oldFacetAddress == address(0), "LibDiamondCut: Can't add function that already exists"); addFunction(selector, selectorPosition, _facetAddress); - selectorPosition++; + ++selectorPosition; } } @@ -118,13 +120,14 @@ contract Diamond is ComptrollerV12Storage { if (selectorPosition == 0) { addFacet(_facetAddress); } - for (uint256 selectorIndex; selectorIndex < _functionSelectors.length; selectorIndex++) { + uint256 functionSelectorsLength = _functionSelectors.length; + for (uint256 selectorIndex; selectorIndex < functionSelectorsLength; ++selectorIndex) { bytes4 selector = _functionSelectors[selectorIndex]; address oldFacetAddress = selectorToFacetAndPosition[selector].facetAddress; require(oldFacetAddress != _facetAddress, "LibDiamondCut: Can't replace function with same function"); removeFunction(oldFacetAddress, selector); addFunction(selector, selectorPosition, _facetAddress); - selectorPosition++; + ++selectorPosition; } } @@ -138,7 +141,7 @@ contract Diamond is ComptrollerV12Storage { require(functionSelectorsLength != 0, "LibDiamondCut: No selectors in facet to cut"); // if function does not exist then do nothing and revert require(_facetAddress == address(0), "LibDiamondCut: Remove facet address must be address(0)"); - for (uint256 selectorIndex; selectorIndex < _functionSelectors.length; selectorIndex++) { + for (uint256 selectorIndex; selectorIndex < functionSelectorsLength; ++selectorIndex) { bytes4 selector = _functionSelectors[selectorIndex]; address oldFacetAddress = selectorToFacetAndPosition[selector].facetAddress; removeFunction(oldFacetAddress, selector); From 0aea270798c1dc7e74293c8de9adc02f2bbb2cf9 Mon Sep 17 00:00:00 2001 From: Debugger022 Date: Thu, 20 Jul 2023 19:15:29 +0530 Subject: [PATCH 115/153] fix: gas-06 --- contracts/Comptroller/Diamond/facets/MarketFacet.sol | 3 ++- contracts/Comptroller/Diamond/facets/RewardFacet.sol | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/contracts/Comptroller/Diamond/facets/MarketFacet.sol b/contracts/Comptroller/Diamond/facets/MarketFacet.sol index 0b87c3dc1..5f6f0e492 100644 --- a/contracts/Comptroller/Diamond/facets/MarketFacet.sol +++ b/contracts/Comptroller/Diamond/facets/MarketFacet.sol @@ -205,7 +205,8 @@ contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase } function _addMarketInternal(VToken vToken) internal { - for (uint i; i < allMarkets.length; ++i) { + uint256 allMarketsLength = allMarkets.length; + for (uint i; i < allMarketsLength; ++i) { require(allMarkets[i] != vToken, "market already added"); } allMarkets.push(vToken); diff --git a/contracts/Comptroller/Diamond/facets/RewardFacet.sol b/contracts/Comptroller/Diamond/facets/RewardFacet.sol index e777a5c7f..b019a1aba 100644 --- a/contracts/Comptroller/Diamond/facets/RewardFacet.sol +++ b/contracts/Comptroller/Diamond/facets/RewardFacet.sol @@ -137,7 +137,8 @@ contract RewardFacet is XVSRewardsHelper { ) public { uint j; uint256 holdersLength = holders.length; - for (uint i; i < vTokens.length; ++i) { + uint256 vTokensLength = vTokens.length; + for (uint i; i < vTokensLength; ++i) { VToken vToken = vTokens[i]; ensureListed(markets[address(vToken)]); if (borrowers) { From 0f769e1366bf0de2f09f63496fb5c6b162382c66 Mon Sep 17 00:00:00 2001 From: Debugger022 Date: Thu, 20 Jul 2023 22:20:06 +0530 Subject: [PATCH 116/153] fix : vd-004 --- .../Diamond/facets/SetterFacet.sol | 74 +++++++++++++++---- 1 file changed, 61 insertions(+), 13 deletions(-) diff --git a/contracts/Comptroller/Diamond/facets/SetterFacet.sol b/contracts/Comptroller/Diamond/facets/SetterFacet.sol index a36506b77..5426215dc 100644 --- a/contracts/Comptroller/Diamond/facets/SetterFacet.sol +++ b/contracts/Comptroller/Diamond/facets/SetterFacet.sol @@ -66,12 +66,24 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase /// @notice Emitted when Venus VAI Vault rate is changed event NewVenusVAIVaultRate(uint oldVenusVAIVaultRate, uint newVenusVAIVaultRate); + modifier compareAddress(address oldAddress, address newAddress) { + require(oldAddress != newAddress, "old address is same as new address"); + _; + } + + modifier compareValue(uint256 oldValue, uint256 newValue) { + require(oldValue != newValue, "old value is same as new value"); + _; + } + /** * @notice Sets a new price oracle for the comptroller * @dev Admin function to set a new price oracle * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) */ - function _setPriceOracle(PriceOracle newOracle) external returns (uint) { + function _setPriceOracle( + PriceOracle newOracle + ) external compareAddress(address(oracle), address(newOracle)) returns (uint) { // Check caller is admin ensureAdmin(); ensureNonzeroAddress(address(newOracle)); @@ -94,11 +106,14 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase * @param newCloseFactorMantissa New close factor, scaled by 1e18 * @return uint 0=success, otherwise will revert */ - function _setCloseFactor(uint newCloseFactorMantissa) external returns (uint) { + function _setCloseFactor( + uint newCloseFactorMantissa + ) external compareValue(closeFactorMantissa, newCloseFactorMantissa) returns (uint) { // Check caller is admin ensureAdmin(); uint oldCloseFactorMantissa = closeFactorMantissa; + closeFactorMantissa = newCloseFactorMantissa; emit NewCloseFactor(oldCloseFactorMantissa, newCloseFactorMantissa); @@ -111,12 +126,15 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase * @param newAccessControlAddress New address for the access control * @return uint 0=success, otherwise will revert */ - function _setAccessControl(address newAccessControlAddress) external returns (uint) { + function _setAccessControl( + address newAccessControlAddress + ) external compareAddress(accessControl, newAccessControlAddress) returns (uint) { // Check caller is admin ensureAdmin(); ensureNonzeroAddress(newAccessControlAddress); address oldAccessControlAddress = accessControl; + accessControl = newAccessControlAddress; emit NewAccessControl(oldAccessControlAddress, newAccessControlAddress); @@ -130,7 +148,14 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase * @param newCollateralFactorMantissa The new collateral factor, scaled by 1e18 * @return uint 0=success, otherwise a failure. (See ErrorReporter for details) */ - function _setCollateralFactor(VToken vToken, uint newCollateralFactorMantissa) external returns (uint) { + function _setCollateralFactor( + VToken vToken, + uint newCollateralFactorMantissa + ) + external + compareValue(markets[address(vToken)].collateralFactorMantissa, newCollateralFactorMantissa) + returns (uint) + { // Check caller is allowed by access control manager ensureAllowed("_setCollateralFactor(address,uint256)"); ensureNonzeroAddress(address(vToken)); @@ -168,7 +193,9 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase * @param newLiquidationIncentiveMantissa New liquidationIncentive scaled by 1e18 * @return uint 0=success, otherwise a failure. (See ErrorReporter for details) */ - function _setLiquidationIncentive(uint newLiquidationIncentiveMantissa) external returns (uint) { + function _setLiquidationIncentive( + uint newLiquidationIncentiveMantissa + ) external compareValue(liquidationIncentiveMantissa, newLiquidationIncentiveMantissa) returns (uint) { ensureAllowed("_setLiquidationIncentive(uint256)"); require(newLiquidationIncentiveMantissa >= 1e18, "incentive must be over 1e18"); @@ -184,7 +211,9 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase return uint(Error.NO_ERROR); } - function _setLiquidatorContract(address newLiquidatorContract_) external { + function _setLiquidatorContract( + address newLiquidatorContract_ + ) external compareAddress(liquidatorContract, newLiquidatorContract_) { // Check caller is admin ensureAdmin(); address oldLiquidatorContract = liquidatorContract; @@ -197,7 +226,9 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase * @param newPauseGuardian The address of the new Pause Guardian * @return uint 0=success, otherwise a failure. (See enum Error for details) */ - function _setPauseGuardian(address newPauseGuardian) external returns (uint) { + function _setPauseGuardian( + address newPauseGuardian + ) external compareAddress(pauseGuardian, newPauseGuardian) returns (uint) { ensureAdmin(); ensureNonzeroAddress(newPauseGuardian); @@ -298,7 +329,9 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase * @dev Admin function to set a new VAI controller * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) */ - function _setVAIController(VAIControllerInterface vaiController_) external returns (uint) { + function _setVAIController( + VAIControllerInterface vaiController_ + ) external compareAddress(address(vaiController), address(vaiController_)) returns (uint) { // Check caller is admin ensureAdmin(); ensureNonzeroAddress(address(vaiController_)); @@ -310,7 +343,7 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase return uint(Error.NO_ERROR); } - function _setVAIMintRate(uint newVAIMintRate) external returns (uint) { + function _setVAIMintRate(uint newVAIMintRate) external compareValue(vaiMintRate, newVAIMintRate) returns (uint) { // Check caller is admin ensureAdmin(); uint oldVAIMintRate = vaiMintRate; @@ -339,11 +372,18 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase return uint(Error.NO_ERROR); } + //---- function _setTreasuryData( address newTreasuryGuardian, address newTreasuryAddress, uint newTreasuryPercent - ) external returns (uint) { + ) + external + compareAddress(treasuryGuardian, newTreasuryGuardian) + compareAddress(treasuryAddress, newTreasuryAddress) + compareValue(treasuryPercent, newTreasuryPercent) + returns (uint) + { // Check caller is admin ensureAdminOr(treasuryGuardian); @@ -371,7 +411,9 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase /** * @dev Set ComptrollerLens contract address */ - function _setComptrollerLens(ComptrollerLensInterface comptrollerLens_) external returns (uint) { + function _setComptrollerLens( + ComptrollerLensInterface comptrollerLens_ + ) external compareAddress(address(comptrollerLens), address(comptrollerLens_)) returns (uint) { ensureAdmin(); ensureNonzeroAddress(address(comptrollerLens_)); address oldComptrollerLens = address(comptrollerLens); @@ -385,7 +427,9 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase * @notice Set the amount of XVS distributed per block to VAI Vault * @param venusVAIVaultRate_ The amount of XVS wei per block to distribute to VAI Vault */ - function _setVenusVAIVaultRate(uint venusVAIVaultRate_) external { + function _setVenusVAIVaultRate( + uint venusVAIVaultRate_ + ) external compareValue(venusVAIVaultRate, venusVAIVaultRate_) { ensureAdmin(); if (vaiVaultAddress != address(0)) { releaseToVault(); @@ -401,7 +445,11 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase * @param releaseStartBlock_ The start block of release to VAI Vault * @param minReleaseAmount_ The minimum release amount to VAI Vault */ - function _setVAIVaultInfo(address vault_, uint256 releaseStartBlock_, uint256 minReleaseAmount_) external { + function _setVAIVaultInfo( + address vault_, + uint256 releaseStartBlock_, + uint256 minReleaseAmount_ + ) external compareAddress(vaiVaultAddress, vault_) { ensureAdmin(); ensureNonzeroAddress(vault_); if (vaiVaultAddress != address(0)) { From 9198069a14960e2b3f69a329369c6c90aa92fbac Mon Sep 17 00:00:00 2001 From: Debugger022 Date: Fri, 21 Jul 2023 20:30:55 +0530 Subject: [PATCH 117/153] tests: vd-004 --- .../Comptroller/Diamond/accessControl.ts | 19 +- .../Comptroller/Diamond/comptrollerTest.ts | 192 ++++++++++++++++-- tests/hardhat/EvilXToken.ts | 3 +- 3 files changed, 192 insertions(+), 22 deletions(-) diff --git a/tests/hardhat/Comptroller/Diamond/accessControl.ts b/tests/hardhat/Comptroller/Diamond/accessControl.ts index b65f99e55..9d9ebe757 100644 --- a/tests/hardhat/Comptroller/Diamond/accessControl.ts +++ b/tests/hardhat/Comptroller/Diamond/accessControl.ts @@ -42,6 +42,13 @@ describe("Comptroller", () => { .to.emit(unitroller, "NewAccessControl") .withArgs(constants.AddressZero, accessControl.address); }); + + it("should revert on same value", async () => { + await comptroller._setAccessControl(accessControl.address); + await expect(comptroller._setAccessControl(accessControl.address)).to.be.revertedWith( + "old address is same as new address", + ); + }); }); describe("Access Control", () => { @@ -52,20 +59,28 @@ describe("Comptroller", () => { describe("setCollateralFactor", () => { it("Should have AccessControl", async () => { await expect( - comptroller.connect(user)._setCollateralFactor(ethers.constants.AddressZero, 0), + comptroller.connect(user)._setCollateralFactor(ethers.constants.AddressZero, 1), ).to.be.revertedWith("access denied"); expect(accessControl.isAllowedToCall).to.be.calledOnceWith( userAddress, "_setCollateralFactor(address,uint256)", ); }); + + it("Should revert for same values", async () => { + await expect(comptroller._setCollateralFactor(ethers.constants.AddressZero, 0)).to.be.revertedWith( + "old value is same as new value", + ); + }); }); + describe("setLiquidationIncentive", () => { it("Should have AccessControl", async () => { - await expect(comptroller.connect(user)._setLiquidationIncentive(0)).to.be.revertedWith("access denied"); + await expect(comptroller.connect(user)._setLiquidationIncentive(1)).to.be.revertedWith("access denied"); expect(accessControl.isAllowedToCall).to.be.calledOnceWith(userAddress, "_setLiquidationIncentive(uint256)"); }); }); + describe("setMarketBorrowCaps", () => { it("Should have AccessControl", async () => { await expect(comptroller.connect(user)._setMarketBorrowCaps([], [])).to.be.revertedWith("access denied"); diff --git a/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts b/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts index 37df1e34e..157243e33 100644 --- a/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts +++ b/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts @@ -65,11 +65,20 @@ async function configureVToken(vToken: FakeContract, unitroller: MockCon describe("Comptroller", () => { let root: Signer; let accounts: Signer[]; + let comptroller: ComptrollerMock; before(async () => { [root, ...accounts] = await ethers.getSigners(); }); + type FuncNames = keyof ComptrollerMock["functions"]; + + function testZeroAddress(funcName: Func, args: Parameters) { + it(funcName, async () => { + await expect(comptroller[funcName](...args)).to.be.revertedWith("can't be zero address"); + }); + } + describe("constructor", () => { it("on success it sets admin to creator and pendingAdmin is unset", async () => { const { comptroller } = await loadFixture(deploySimpleComptroller); @@ -105,9 +114,16 @@ describe("Comptroller", () => { .withArgs(initialIncentive, validIncentive); expect(await comptroller.liquidationIncentiveMantissa()).to.equal(validIncentive); }); + + it("should revert on same values", async () => { + await comptroller._setLiquidationIncentive(validIncentive); + await expect(comptroller._setLiquidationIncentive(validIncentive)).to.be.revertedWith( + "old value is same as new value", + ); + }); }); - describe("Non zero address check", () => { + describe("_setVenusVAIVaultRate", () => { let unitroller: Unitroller; let comptroller: ComptrollerMock; @@ -116,21 +132,131 @@ describe("Comptroller", () => { comptroller = await ethers.getContractAt("ComptrollerMock", unitroller.address); }); - type FuncNames = keyof ComptrollerMock["functions"]; + it("should revert on same values", async () => { + await expect(comptroller._setVenusVAIVaultRate(0)).to.be.revertedWith("old value is same as new value"); + }); + }); + + describe("_setVAIVaultInfo", () => { + let unitroller: Unitroller; + let comptroller: ComptrollerMock; - function testZeroAddress(funcName: Func, args: Parameters) { - it(funcName, async () => { - await expect(comptroller[funcName](...args)).to.be.revertedWith("can't be zero address"); - }); - } - testZeroAddress("_setPriceOracle", [constants.AddressZero]); - testZeroAddress("_setCollateralFactor", [constants.AddressZero, 0]); - testZeroAddress("_setPauseGuardian", [constants.AddressZero]); - testZeroAddress("_setVAIController", [constants.AddressZero]); - testZeroAddress("_setTreasuryData", [constants.AddressZero, constants.AddressZero, 0]); - testZeroAddress("_setComptrollerLens", [constants.AddressZero]); - testZeroAddress("_setVAIVaultInfo", [constants.AddressZero, 0, 0]); - testZeroAddress("_setVenusSpeeds", [[constants.AddressZero], [0], [0]]); + beforeEach(async () => { + ({ unitroller } = await loadFixture(deploySimpleComptroller)); + comptroller = await ethers.getContractAt("ComptrollerMock", unitroller.address); + }); + + it("should revert on same values", async () => { + await expect(comptroller._setVAIVaultInfo(constants.AddressZero, 0, 0)).to.be.revertedWith( + "old address is same as new address", + ); + await comptroller._setVAIVaultInfo(accounts[0].address, 0, 0); + testZeroAddress("_setVAIVaultInfo", [constants.AddressZero, 0, 0]); + }); + }); + + describe("_setVAIController", () => { + let unitroller: Unitroller; + let comptroller: ComptrollerMock; + + beforeEach(async () => { + ({ unitroller } = await loadFixture(deploySimpleComptroller)); + comptroller = await ethers.getContractAt("ComptrollerMock", unitroller.address); + }); + + it("should revert on same values", async () => { + await expect(comptroller._setVAIController(constants.AddressZero)).to.be.revertedWith( + "old address is same as new address", + ); + await comptroller._setVAIController(accounts[0].address); + testZeroAddress("_setVAIController", [constants.AddressZero]); + }); + }); + + describe("_setVAIMintRate", () => { + let unitroller: Unitroller; + let comptroller: ComptrollerMock; + + beforeEach(async () => { + ({ unitroller } = await loadFixture(deploySimpleComptroller)); + comptroller = await ethers.getContractAt("ComptrollerMock", unitroller.address); + }); + + it("should revert on same values", async () => { + await expect(comptroller._setVAIMintRate(0)).to.be.revertedWith("old value is same as new value"); + }); + }); + + describe("_setLiquidatorContract", () => { + let unitroller: Unitroller; + let comptroller: ComptrollerMock; + + beforeEach(async () => { + ({ unitroller } = await loadFixture(deploySimpleComptroller)); + comptroller = await ethers.getContractAt("ComptrollerMock", unitroller.address); + }); + + it("should revert on same values", async () => { + await expect(comptroller._setLiquidatorContract(constants.AddressZero)).to.be.revertedWith( + "old address is same as new address", + ); + }); + }); + + describe("_setPauseGuardian", () => { + let unitroller: Unitroller; + let comptroller: ComptrollerMock; + + beforeEach(async () => { + ({ unitroller } = await loadFixture(deploySimpleComptroller)); + comptroller = await ethers.getContractAt("ComptrollerMock", unitroller.address); + }); + + it("should revert on same values", async () => { + await expect(comptroller._setPauseGuardian(constants.AddressZero)).to.be.revertedWith( + "old address is same as new address", + ); + await comptroller._setPauseGuardian(accounts[0].address); + testZeroAddress("_setPauseGuardian", [constants.AddressZero]); + }); + }); + + describe("_setTreasuryData", () => { + let unitroller: Unitroller; + let comptroller: ComptrollerMock; + + beforeEach(async () => { + ({ unitroller } = await loadFixture(deploySimpleComptroller)); + comptroller = await ethers.getContractAt("ComptrollerMock", unitroller.address); + }); + + it("should revert on same values", async () => { + await expect(comptroller._setTreasuryData(constants.AddressZero, constants.AddressZero, 0)).to.be.revertedWith( + "old address is same as new address", + ); + await expect(comptroller._setTreasuryData(accounts[0].address, constants.AddressZero, 0)).to.be.revertedWith( + "old address is same as new address", + ); + await expect(comptroller._setTreasuryData(accounts[0].address, accounts[1].address, 0)).to.be.revertedWith( + "old value is same as new value", + ); + await comptroller._setTreasuryData(accounts[0].address, accounts[0].address, 1); + testZeroAddress("_setTreasuryData", [constants.AddressZero, accounts[1].address, 0]); + testZeroAddress("_setTreasuryData", [accounts[0].address, accounts[1].address, 0]); + }); + }); + + describe("_setVenusSpeeds", () => { + let unitroller: Unitroller; + + beforeEach(async () => { + ({ unitroller } = await loadFixture(deploySimpleComptroller)); + comptroller = await ethers.getContractAt("ComptrollerMock", unitroller.address); + }); + + it("ensure non zero address for venus speeds", async () => { + testZeroAddress("_setVenusSpeeds", [[constants.AddressZero], [0], [0]]); + }); }); describe("_setPriceOracle", () => { @@ -155,7 +281,7 @@ describe("Comptroller", () => { }); it("fails if called by non-admin", async () => { - await expect(comptroller.connect(accounts[0])._setPriceOracle(oracle.address)).to.be.revertedWith( + await expect(comptroller.connect(accounts[0])._setPriceOracle(newOracle.address)).to.be.revertedWith( "only admin can", ); expect(await comptroller.oracle()).to.equal(oracle.address); @@ -167,6 +293,13 @@ describe("Comptroller", () => { .withArgs(oracle.address, newOracle.address); expect(await comptroller.oracle()).to.equal(newOracle.address); }); + + it("Should revert on same values", async () => { + await expect(comptroller._setPriceOracle(oracle.address)).to.be.revertedWith( + "old address is same as new address", + ); + testZeroAddress("_setPriceOracle", [constants.AddressZero]); + }); }); describe("_setComptrollerLens", () => { @@ -207,6 +340,15 @@ describe("Comptroller", () => { .to.emit(unitroller, "NewComptrollerLens") .withArgs(oldComptrollerLensAddress, comptrollerLens.address); }); + + it("should revert on same value", async () => { + const { comptroller, comptrollerLens } = await loadFixture(deploy); + await comptroller._setComptrollerLens(comptrollerLens.address); + await expect(comptroller._setComptrollerLens(comptrollerLens.address)).to.be.revertedWith( + "old address is same as new address", + ); + testZeroAddress("_setComptrollerLens", [constants.AddressZero]); + }); }); describe("_setCloseFactor", () => { @@ -219,6 +361,10 @@ describe("Comptroller", () => { it("fails if not called by admin", async () => { await expect(comptroller.connect(accounts[0])._setCloseFactor(1)).to.be.revertedWith("only admin can"); }); + + it("should revert on same values", async () => { + await expect(comptroller._setCloseFactor(0)).to.be.revertedWith("old value is same as new value"); + }); }); describe("_setCollateralFactor", () => { @@ -264,6 +410,14 @@ describe("Comptroller", () => { .to.emit(unitroller, "NewCollateralFactor") .withArgs(vToken.address, "0", half); }); + + it("should revert on same values", async () => { + await comptroller._supportMarket(vToken.address); + await comptroller._setCollateralFactor(vToken.address, half); + await expect(comptroller._setCollateralFactor(vToken.address, half)).to.be.revertedWith( + "old value is same as new value", + ); + }); }); describe("_supportMarket", () => { @@ -295,9 +449,9 @@ describe("Comptroller", () => { configureVToken(vToken2, unitroller); }); - // it("fails if asset is not a VToken", async () => { - // await expect(comptroller._supportMarket(token.address)).to.be.reverted; - // }); + it("fails if asset is not a VToken", async () => { + await expect(comptroller._supportMarket(token.address)).to.be.reverted; + }); it("succeeds and sets market", async () => { expect(await comptroller._supportMarket(vToken1.address)) diff --git a/tests/hardhat/EvilXToken.ts b/tests/hardhat/EvilXToken.ts index 88852ed96..4d94b71c0 100644 --- a/tests/hardhat/EvilXToken.ts +++ b/tests/hardhat/EvilXToken.ts @@ -155,8 +155,9 @@ describe("Evil Token test", async () => { await vDelegator3.deployed(); vToken3 = await ethers.getContractAt("EvilXToken", vDelegator3.address); - await unitroller._supportMarket(vToken3.address); + + await unitroller._setCollateralFactor(vToken3.address, convertToUnit(cf2, 18)); await unitroller._setCollateralFactor(vToken3.address, convertToUnit(cf3, 18)); await priceOracle.setUnderlyingPrice(vToken2.address, convertToUnit(up3, 18)); From 53a08eb7b0d2ad567842660d76a5a7dc9a0d8a34 Mon Sep 17 00:00:00 2001 From: Debugger022 Date: Mon, 24 Jul 2023 17:13:33 +0530 Subject: [PATCH 118/153] fix: ven-1757 vai-01 unnecesary remnant casting --- contracts/Tokens/VAI/VAIController.sol | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/contracts/Tokens/VAI/VAIController.sol b/contracts/Tokens/VAI/VAIController.sol index d918b43f1..97e1ec4aa 100644 --- a/contracts/Tokens/VAI/VAIController.sol +++ b/contracts/Tokens/VAI/VAIController.sol @@ -450,9 +450,7 @@ contract VAIController is VAIControllerStorageG2, VAIControllerErrorReporter, Ex return (uint(Error.MATH_ERROR), 0); } - (, uint collateralFactorMantissa) = ComptrollerInterface(address(comptroller)).markets( - address(enteredMarkets[i]) - ); + (, uint collateralFactorMantissa) = comptroller.markets(address(enteredMarkets[i])); (vars.mErr, vars.marketSupply) = mulUInt(vars.marketSupply, collateralFactorMantissa); if (vars.mErr != MathError.NO_ERROR) { return (uint(Error.MATH_ERROR), 0); From c797f14e8fba2aed8de3bb917a0721f6ec3080ae Mon Sep 17 00:00:00 2001 From: Debugger022 Date: Mon, 24 Jul 2023 17:15:20 +0530 Subject: [PATCH 119/153] fix: ven-1759 ddc-04 diamond loupe methods --- contracts/Comptroller/Diamond/Diamond.sol | 19 +++++++++++++++++++ contracts/test/DiamondHarnessInterface.sol | 7 +++++++ tests/hardhat/Comptroller/Diamond/diamond.ts | 5 +++++ 3 files changed, 31 insertions(+) diff --git a/contracts/Comptroller/Diamond/Diamond.sol b/contracts/Comptroller/Diamond/Diamond.sol index 21dcab40d..a5c4091d6 100644 --- a/contracts/Comptroller/Diamond/Diamond.sol +++ b/contracts/Comptroller/Diamond/Diamond.sol @@ -8,6 +8,11 @@ import "../Unitroller.sol"; contract Diamond is ComptrollerV12Storage { event DiamondCut(IDiamondCut.FacetCut[] _diamondCut); + struct Facet { + address facetAddress; + bytes4[] functionSelectors; + } + /** * @notice Call _acceptImplementation to accept the diamond proxy as new implementaion. * @param unitroller Address of the unitroller. @@ -63,6 +68,20 @@ contract Diamond is ComptrollerV12Storage { return selectorToFacetAndPosition[_functionSelector]; } + /** + * @notice Get all facets address and their function selector + * @return facets Array of Facet + */ + function getAllFacets() external view returns (Facet[] memory facets) { + uint facetsLength = facetAddresses.length; + facets = new Facet[](facetsLength); + for (uint256 i; i < facetsLength; ++i) { + address facetAddress = facetAddresses[i]; + facets[i].facetAddress = facetAddress; + facets[i].functionSelectors = facetFunctionSelectors[facetAddress].functionSelectors; + } + } + /** * @notice To add function selectors to the facets' mapping. * @param _diamondCut IDiamondCut contains facets address, action and function selectors. diff --git a/contracts/test/DiamondHarnessInterface.sol b/contracts/test/DiamondHarnessInterface.sol index bf9b73f35..0e5ac29b0 100644 --- a/contracts/test/DiamondHarnessInterface.sol +++ b/contracts/test/DiamondHarnessInterface.sol @@ -19,6 +19,11 @@ contract DiamondHarnessInterface { uint96 functionSelectorPosition; } + struct Facet { + address facetAddress; + bytes4[] functionSelectors; + } + function getFacetAddress(bytes4 sig) public view returns (address); function diamondCut(FacetCut[] calldata _diamondCut) external; @@ -29,6 +34,8 @@ contract DiamondHarnessInterface { function getAllFacetAddresses() external view returns (address[] memory facetAddresses_); + function getAllFacets() external view returns (Facet[] memory facets); + function getFacetAddressAndPosition( bytes4 _functionSelector ) external view returns (FacetAddressAndPosition memory); diff --git a/tests/hardhat/Comptroller/Diamond/diamond.ts b/tests/hardhat/Comptroller/Diamond/diamond.ts index 188687f77..803d29251 100644 --- a/tests/hardhat/Comptroller/Diamond/diamond.ts +++ b/tests/hardhat/Comptroller/Diamond/diamond.ts @@ -76,6 +76,11 @@ describe("Comptroller", async () => { expect(facetsAddress[0]).to.equal(facetCutParams[0].facetAddress); }); + it("Get all facets address and their selectors", async () => { + const facets = await diamondHarness.getAllFacets(); + expect(facets[0].facetAddress).to.equal(facetCutParams[0].facetAddress); + }); + it("Get facet address and position by function selector", async () => { const facetsAddressAndPosition = await diamondHarness.getFacetAddressAndPosition( facetCutParams[0].functionSelectors[1], From 6982bc5b621b7b59cbc46796e925aa3bf9b54718 Mon Sep 17 00:00:00 2001 From: Debugger022 Date: Wed, 26 Jul 2023 20:11:59 +0530 Subject: [PATCH 120/153] fix: removed unwanted checks from setTreasuryData --- .../Diamond/facets/SetterFacet.sol | 8 +----- .../Comptroller/Diamond/comptrollerTest.ts | 25 ------------------- 2 files changed, 1 insertion(+), 32 deletions(-) diff --git a/contracts/Comptroller/Diamond/facets/SetterFacet.sol b/contracts/Comptroller/Diamond/facets/SetterFacet.sol index 5426215dc..bbbb90393 100644 --- a/contracts/Comptroller/Diamond/facets/SetterFacet.sol +++ b/contracts/Comptroller/Diamond/facets/SetterFacet.sol @@ -377,13 +377,7 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase address newTreasuryGuardian, address newTreasuryAddress, uint newTreasuryPercent - ) - external - compareAddress(treasuryGuardian, newTreasuryGuardian) - compareAddress(treasuryAddress, newTreasuryAddress) - compareValue(treasuryPercent, newTreasuryPercent) - returns (uint) - { + ) external returns (uint) { // Check caller is admin ensureAdminOr(treasuryGuardian); diff --git a/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts b/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts index 157243e33..15560e882 100644 --- a/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts +++ b/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts @@ -221,31 +221,6 @@ describe("Comptroller", () => { }); }); - describe("_setTreasuryData", () => { - let unitroller: Unitroller; - let comptroller: ComptrollerMock; - - beforeEach(async () => { - ({ unitroller } = await loadFixture(deploySimpleComptroller)); - comptroller = await ethers.getContractAt("ComptrollerMock", unitroller.address); - }); - - it("should revert on same values", async () => { - await expect(comptroller._setTreasuryData(constants.AddressZero, constants.AddressZero, 0)).to.be.revertedWith( - "old address is same as new address", - ); - await expect(comptroller._setTreasuryData(accounts[0].address, constants.AddressZero, 0)).to.be.revertedWith( - "old address is same as new address", - ); - await expect(comptroller._setTreasuryData(accounts[0].address, accounts[1].address, 0)).to.be.revertedWith( - "old value is same as new value", - ); - await comptroller._setTreasuryData(accounts[0].address, accounts[0].address, 1); - testZeroAddress("_setTreasuryData", [constants.AddressZero, accounts[1].address, 0]); - testZeroAddress("_setTreasuryData", [accounts[0].address, accounts[1].address, 0]); - }); - }); - describe("_setVenusSpeeds", () => { let unitroller: Unitroller; From 7417d8f4b17eb156dd44a8b4d8eb6dbf3e6e4015 Mon Sep 17 00:00:00 2001 From: Debugger022 Date: Wed, 26 Jul 2023 20:20:43 +0530 Subject: [PATCH 121/153] fix: ven-1759 ddc-04 --- contracts/Comptroller/ComptrollerStorage.sol | 10 +- contracts/Comptroller/Diamond/Diamond.sol | 190 +++++++++---------- contracts/test/DiamondHarness.sol | 2 +- contracts/test/DiamondHarnessInterface.sol | 12 +- tests/hardhat/Comptroller/Diamond/diamond.ts | 12 +- 5 files changed, 111 insertions(+), 115 deletions(-) diff --git a/contracts/Comptroller/ComptrollerStorage.sol b/contracts/Comptroller/ComptrollerStorage.sol index d9491b9e0..a2fcb550f 100644 --- a/contracts/Comptroller/ComptrollerStorage.sol +++ b/contracts/Comptroller/ComptrollerStorage.sol @@ -238,17 +238,17 @@ contract ComptrollerV11Storage is ComptrollerV10Storage { contract ComptrollerV12Storage is ComptrollerV11Storage { struct FacetAddressAndPosition { address facetAddress; - uint96 functionSelectorPosition; // position in facetFunctionSelectors.functionSelectors array + uint96 functionSelectorPosition; // position in _facetFunctionSelectors.functionSelectors array } struct FacetFunctionSelectors { bytes4[] functionSelectors; - uint256 facetAddressPosition; // position of facetAddress in facetAddresses array + uint256 facetAddressPosition; // position of facetAddress in _facetAddresses array } - mapping(bytes4 => FacetAddressAndPosition) internal selectorToFacetAndPosition; + mapping(bytes4 => FacetAddressAndPosition) internal _selectorToFacetAndPosition; // maps facet addresses to function selectors - mapping(address => FacetFunctionSelectors) internal facetFunctionSelectors; + mapping(address => FacetFunctionSelectors) internal _facetFunctionSelectors; // facet addresses - address[] internal facetAddresses; + address[] internal _facetAddresses; } diff --git a/contracts/Comptroller/Diamond/Diamond.sol b/contracts/Comptroller/Diamond/Diamond.sol index a5c4091d6..ec554b969 100644 --- a/contracts/Comptroller/Diamond/Diamond.sol +++ b/contracts/Comptroller/Diamond/Diamond.sol @@ -24,204 +24,204 @@ contract Diamond is ComptrollerV12Storage { /** * @notice To add function selectors to the facets' mapping. - * @param _diamondCut IDiamondCut contains facets address, action and function selectors. + * @param diamondCut_ IDiamondCut contains facets address, action and function selectors. */ - function diamondCut(IDiamondCut.FacetCut[] memory _diamondCut) public { + function diamondCut(IDiamondCut.FacetCut[] memory diamondCut_) public { require(msg.sender == admin, "only unitroller admin can"); - libDiamondCut(_diamondCut); + libDiamondCut(diamondCut_); } /** * @notice Get all function selectors mapped to the facet address - * @param _facet Address of the facet - * @return _facetFunctionSelectors Array of function selectors + * @param facet Address of the facet + * @return selectors Array of function selectors */ - function getFacetFunctionSelectors(address _facet) external view returns (bytes4[] memory _facetFunctionSelectors) { - _facetFunctionSelectors = facetFunctionSelectors[_facet].functionSelectors; + function facetFunctionSelectors(address facet) external view returns (bytes4[] memory) { + return _facetFunctionSelectors[facet].functionSelectors; } /** - * @notice Get facet position in the facetFunctionSelectors through facet address - * @param _facet Address of the facet + * @notice Get facet position in the _facetFunctionSelectors through facet address + * @param facet Address of the facet * @return Position of the facet */ - function getFacetPosition(address _facet) external view returns (uint256) { - return facetFunctionSelectors[_facet].facetAddressPosition; + function facetPosition(address facet) external view returns (uint256) { + return _facetFunctionSelectors[facet].facetAddressPosition; } /** * @notice Get all facet addresses - * @return facetAddresses_ Array of facet addresses + * @return facetAddresses Array of facet addresses */ - function getAllFacetAddresses() external view returns (address[] memory facetAddresses_) { - facetAddresses_ = facetAddresses; + function facetAddresses() external view returns (address[] memory) { + return _facetAddresses; } /** * @notice Get facet address and position through function selector - * @param _functionSelector function selector + * @param functionSelector function selector * @return FacetAddressAndPosition facet address and position */ - function getFacetAddressAndPosition( - bytes4 _functionSelector + function facetAddress( + bytes4 functionSelector ) external view returns (ComptrollerV12Storage.FacetAddressAndPosition memory) { - return selectorToFacetAndPosition[_functionSelector]; + return _selectorToFacetAndPosition[functionSelector]; } /** * @notice Get all facets address and their function selector - * @return facets Array of Facet + * @return facets_ Array of Facet */ - function getAllFacets() external view returns (Facet[] memory facets) { - uint facetsLength = facetAddresses.length; - facets = new Facet[](facetsLength); + function facets() external view returns (Facet[] memory facets_) { + uint facetsLength = _facetAddresses.length; + facets_ = new Facet[](facetsLength); for (uint256 i; i < facetsLength; ++i) { - address facetAddress = facetAddresses[i]; - facets[i].facetAddress = facetAddress; - facets[i].functionSelectors = facetFunctionSelectors[facetAddress].functionSelectors; + address facet = _facetAddresses[i]; + facets_[i].facetAddress = facet; + facets_[i].functionSelectors = _facetFunctionSelectors[facet].functionSelectors; } } /** * @notice To add function selectors to the facets' mapping. - * @param _diamondCut IDiamondCut contains facets address, action and function selectors. + * @param diamondCut_ IDiamondCut contains facets address, action and function selectors. */ - function libDiamondCut(IDiamondCut.FacetCut[] memory _diamondCut) internal { - uint256 diamondCutLength = _diamondCut.length; + function libDiamondCut(IDiamondCut.FacetCut[] memory diamondCut_) internal { + uint256 diamondCutLength = diamondCut_.length; for (uint256 facetIndex; facetIndex < diamondCutLength; ++facetIndex) { - IDiamondCut.FacetCutAction action = _diamondCut[facetIndex].action; + IDiamondCut.FacetCutAction action = diamondCut_[facetIndex].action; if (action == IDiamondCut.FacetCutAction.Add) { - addFunctions(_diamondCut[facetIndex].facetAddress, _diamondCut[facetIndex].functionSelectors); + addFunctions(diamondCut_[facetIndex].facetAddress, diamondCut_[facetIndex].functionSelectors); } else if (action == IDiamondCut.FacetCutAction.Replace) { - replaceFunctions(_diamondCut[facetIndex].facetAddress, _diamondCut[facetIndex].functionSelectors); + replaceFunctions(diamondCut_[facetIndex].facetAddress, diamondCut_[facetIndex].functionSelectors); } else if (action == IDiamondCut.FacetCutAction.Remove) { - removeFunctions(_diamondCut[facetIndex].facetAddress, _diamondCut[facetIndex].functionSelectors); + removeFunctions(diamondCut_[facetIndex].facetAddress, diamondCut_[facetIndex].functionSelectors); } else { revert("LibDiamondCut: Incorrect FacetCutAction"); } } - emit DiamondCut(_diamondCut); + emit DiamondCut(diamondCut_); } /** * @notice Add function selectors to the facet's address mapping. - * @param _facetAddress Address of the facet. - * @param _functionSelectors Array of function selectors need to add in the mapping. + * @param facetAddress Address of the facet. + * @param functionSelectors Array of function selectors need to add in the mapping. */ - function addFunctions(address _facetAddress, bytes4[] memory _functionSelectors) internal { - require(_functionSelectors.length != 0, "LibDiamondCut: No selectors in facet to cut"); - require(_facetAddress != address(0), "LibDiamondCut: Add facet can't be address(0)"); - uint96 selectorPosition = uint96(facetFunctionSelectors[_facetAddress].functionSelectors.length); + function addFunctions(address facetAddress, bytes4[] memory functionSelectors) internal { + require(functionSelectors.length != 0, "LibDiamondCut: No selectors in facet to cut"); + require(facetAddress != address(0), "LibDiamondCut: Add facet can't be address(0)"); + uint96 selectorPosition = uint96(_facetFunctionSelectors[facetAddress].functionSelectors.length); // add new facet address if it does not exist if (selectorPosition == 0) { - addFacet(_facetAddress); + addFacet(facetAddress); } - uint256 functionSelectorsLength = _functionSelectors.length; + uint256 functionSelectorsLength = functionSelectors.length; for (uint256 selectorIndex; selectorIndex < functionSelectorsLength; ++selectorIndex) { - bytes4 selector = _functionSelectors[selectorIndex]; - address oldFacetAddress = selectorToFacetAndPosition[selector].facetAddress; + bytes4 selector = functionSelectors[selectorIndex]; + address oldFacetAddress = _selectorToFacetAndPosition[selector].facetAddress; require(oldFacetAddress == address(0), "LibDiamondCut: Can't add function that already exists"); - addFunction(selector, selectorPosition, _facetAddress); + addFunction(selector, selectorPosition, facetAddress); ++selectorPosition; } } /** * @notice Replace facet's address mapping for function selectors i.e selectors already associate to any other existing facet. - * @param _facetAddress Address of the facet. - * @param _functionSelectors Array of function selectors need to replace in the mapping. + * @param facetAddress Address of the facet. + * @param functionSelectors Array of function selectors need to replace in the mapping. */ - function replaceFunctions(address _facetAddress, bytes4[] memory _functionSelectors) internal { - require(_functionSelectors.length != 0, "LibDiamondCut: No selectors in facet to cut"); - require(_facetAddress != address(0), "LibDiamondCut: Add facet can't be address(0)"); - uint96 selectorPosition = uint96(facetFunctionSelectors[_facetAddress].functionSelectors.length); + function replaceFunctions(address facetAddress, bytes4[] memory functionSelectors) internal { + require(functionSelectors.length != 0, "LibDiamondCut: No selectors in facet to cut"); + require(facetAddress != address(0), "LibDiamondCut: Add facet can't be address(0)"); + uint96 selectorPosition = uint96(_facetFunctionSelectors[facetAddress].functionSelectors.length); // add new facet address if it does not exist if (selectorPosition == 0) { - addFacet(_facetAddress); + addFacet(facetAddress); } - uint256 functionSelectorsLength = _functionSelectors.length; + uint256 functionSelectorsLength = functionSelectors.length; for (uint256 selectorIndex; selectorIndex < functionSelectorsLength; ++selectorIndex) { - bytes4 selector = _functionSelectors[selectorIndex]; - address oldFacetAddress = selectorToFacetAndPosition[selector].facetAddress; - require(oldFacetAddress != _facetAddress, "LibDiamondCut: Can't replace function with same function"); + bytes4 selector = functionSelectors[selectorIndex]; + address oldFacetAddress = _selectorToFacetAndPosition[selector].facetAddress; + require(oldFacetAddress != facetAddress, "LibDiamondCut: Can't replace function with same function"); removeFunction(oldFacetAddress, selector); - addFunction(selector, selectorPosition, _facetAddress); + addFunction(selector, selectorPosition, facetAddress); ++selectorPosition; } } /** * @notice Remove function selectors to the facet's address mapping. - * @param _facetAddress Address of the facet. - * @param _functionSelectors Array of function selectors need to remove in the mapping. + * @param facetAddress Address of the facet. + * @param functionSelectors Array of function selectors need to remove in the mapping. */ - function removeFunctions(address _facetAddress, bytes4[] memory _functionSelectors) internal { - uint256 functionSelectorsLength = _functionSelectors.length; + function removeFunctions(address facetAddress, bytes4[] memory functionSelectors) internal { + uint256 functionSelectorsLength = functionSelectors.length; require(functionSelectorsLength != 0, "LibDiamondCut: No selectors in facet to cut"); // if function does not exist then do nothing and revert - require(_facetAddress == address(0), "LibDiamondCut: Remove facet address must be address(0)"); + require(facetAddress == address(0), "LibDiamondCut: Remove facet address must be address(0)"); for (uint256 selectorIndex; selectorIndex < functionSelectorsLength; ++selectorIndex) { - bytes4 selector = _functionSelectors[selectorIndex]; - address oldFacetAddress = selectorToFacetAndPosition[selector].facetAddress; + bytes4 selector = functionSelectors[selectorIndex]; + address oldFacetAddress = _selectorToFacetAndPosition[selector].facetAddress; removeFunction(oldFacetAddress, selector); } } /** * @notice Add new facet to the proxy. - * @param _facetAddress Address of the facet. + * @param facetAddress Address of the facet. */ - function addFacet(address _facetAddress) internal { - enforceHasContractCode(_facetAddress, "Diamond: New facet has no code"); - facetFunctionSelectors[_facetAddress].facetAddressPosition = facetAddresses.length; - facetAddresses.push(_facetAddress); + function addFacet(address facetAddress) internal { + enforceHasContractCode(facetAddress, "Diamond: New facet has no code"); + _facetFunctionSelectors[facetAddress].facetAddressPosition = _facetAddresses.length; + _facetAddresses.push(facetAddress); } /** * @notice Add function selector to the facet's address mapping. - * @param _selector funciton selector need to be added. - * @param _selectorPosition funciton selector position. - * @param _facetAddress Address of the facet. + * @param selector funciton selector need to be added. + * @param selectorPosition funciton selector position. + * @param facetAddress Address of the facet. */ - function addFunction(bytes4 _selector, uint96 _selectorPosition, address _facetAddress) internal { - selectorToFacetAndPosition[_selector].functionSelectorPosition = _selectorPosition; - facetFunctionSelectors[_facetAddress].functionSelectors.push(_selector); - selectorToFacetAndPosition[_selector].facetAddress = _facetAddress; + function addFunction(bytes4 selector, uint96 selectorPosition, address facetAddress) internal { + _selectorToFacetAndPosition[selector].functionSelectorPosition = selectorPosition; + _facetFunctionSelectors[facetAddress].functionSelectors.push(selector); + _selectorToFacetAndPosition[selector].facetAddress = facetAddress; } /** * @notice Remove function selector to the facet's address mapping. - * @param _facetAddress Address of the facet. - * @param _selector function selectors need to remove in the mapping. + * @param facetAddress Address of the facet. + * @param selector function selectors need to remove in the mapping. */ - function removeFunction(address _facetAddress, bytes4 _selector) internal { - require(_facetAddress != address(0), "LibDiamondCut: Can't remove function that doesn't exist"); + function removeFunction(address facetAddress, bytes4 selector) internal { + require(facetAddress != address(0), "LibDiamondCut: Can't remove function that doesn't exist"); // replace selector with last selector, then delete last selector - uint256 selectorPosition = selectorToFacetAndPosition[_selector].functionSelectorPosition; - uint256 lastSelectorPosition = facetFunctionSelectors[_facetAddress].functionSelectors.length - 1; - // if not the same then replace _selector with lastSelector + uint256 selectorPosition = _selectorToFacetAndPosition[selector].functionSelectorPosition; + uint256 lastSelectorPosition = _facetFunctionSelectors[facetAddress].functionSelectors.length - 1; + // if not the same then replace selector with lastSelector if (selectorPosition != lastSelectorPosition) { - bytes4 lastSelector = facetFunctionSelectors[_facetAddress].functionSelectors[lastSelectorPosition]; - facetFunctionSelectors[_facetAddress].functionSelectors[selectorPosition] = lastSelector; - selectorToFacetAndPosition[lastSelector].functionSelectorPosition = uint96(selectorPosition); + bytes4 lastSelector = _facetFunctionSelectors[facetAddress].functionSelectors[lastSelectorPosition]; + _facetFunctionSelectors[facetAddress].functionSelectors[selectorPosition] = lastSelector; + _selectorToFacetAndPosition[lastSelector].functionSelectorPosition = uint96(selectorPosition); } // delete the last selector - facetFunctionSelectors[_facetAddress].functionSelectors.pop(); - delete selectorToFacetAndPosition[_selector]; + _facetFunctionSelectors[facetAddress].functionSelectors.pop(); + delete _selectorToFacetAndPosition[selector]; // if no more selectors for facet address then delete the facet address if (lastSelectorPosition == 0) { // replace facet address with last facet address and delete last facet address - uint256 lastFacetAddressPosition = facetAddresses.length - 1; - uint256 facetAddressPosition = facetFunctionSelectors[_facetAddress].facetAddressPosition; + uint256 lastFacetAddressPosition = _facetAddresses.length - 1; + uint256 facetAddressPosition = _facetFunctionSelectors[facetAddress].facetAddressPosition; if (facetAddressPosition != lastFacetAddressPosition) { - address lastFacetAddress = facetAddresses[lastFacetAddressPosition]; - facetAddresses[facetAddressPosition] = lastFacetAddress; - facetFunctionSelectors[lastFacetAddress].facetAddressPosition = facetAddressPosition; + address lastFacetAddress = _facetAddresses[lastFacetAddressPosition]; + _facetAddresses[facetAddressPosition] = lastFacetAddress; + _facetFunctionSelectors[lastFacetAddress].facetAddressPosition = facetAddressPosition; } - facetAddresses.pop(); - delete facetFunctionSelectors[_facetAddress]; + _facetAddresses.pop(); + delete _facetFunctionSelectors[facetAddress]; } } @@ -236,7 +236,7 @@ contract Diamond is ComptrollerV12Storage { // Find facet for function that is called and execute the // function if a facet is found and return any value. function() external payable { - address facet = selectorToFacetAndPosition[msg.sig].facetAddress; + address facet = _selectorToFacetAndPosition[msg.sig].facetAddress; require(facet != address(0), "Diamond: Function does not exist"); // Execute public function from facet using delegatecall and return any value. assembly { diff --git a/contracts/test/DiamondHarness.sol b/contracts/test/DiamondHarness.sol index d4a0bdf84..eb80c1dd7 100644 --- a/contracts/test/DiamondHarness.sol +++ b/contracts/test/DiamondHarness.sol @@ -5,7 +5,7 @@ import "../Comptroller/Diamond/Diamond.sol"; contract DiamondHarness is Diamond { function getFacetAddress(bytes4 sig) public view returns (address) { - address facet = selectorToFacetAndPosition[sig].facetAddress; + address facet = _selectorToFacetAndPosition[sig].facetAddress; require(facet != address(0), "Diamond: Function does not exist"); return facet; } diff --git a/contracts/test/DiamondHarnessInterface.sol b/contracts/test/DiamondHarnessInterface.sol index 0e5ac29b0..4f7cf9ce0 100644 --- a/contracts/test/DiamondHarnessInterface.sol +++ b/contracts/test/DiamondHarnessInterface.sol @@ -28,15 +28,13 @@ contract DiamondHarnessInterface { function diamondCut(FacetCut[] calldata _diamondCut) external; - function getFacetFunctionSelectors(address _facet) external view returns (bytes4[] memory _facetFunctionSelectors); + function facetFunctionSelectors(address _facet) external view returns (bytes4[] memory _facetFunctionSelectors); - function getFacetPosition(address _facet) external view returns (uint256); + function facetPosition(address _facet) external view returns (uint256); - function getAllFacetAddresses() external view returns (address[] memory facetAddresses_); + function facetAddresses() external view returns (address[] memory facetAddresses_); - function getAllFacets() external view returns (Facet[] memory facets); + function facets() external view returns (Facet[] memory facets); - function getFacetAddressAndPosition( - bytes4 _functionSelector - ) external view returns (FacetAddressAndPosition memory); + function facetAddress(bytes4 _functionSelector) external view returns (FacetAddressAndPosition memory); } diff --git a/tests/hardhat/Comptroller/Diamond/diamond.ts b/tests/hardhat/Comptroller/Diamond/diamond.ts index 803d29251..7f14cbef5 100644 --- a/tests/hardhat/Comptroller/Diamond/diamond.ts +++ b/tests/hardhat/Comptroller/Diamond/diamond.ts @@ -62,29 +62,27 @@ describe("Comptroller", async () => { }); it("Get all facet function selectors by facet address", async () => { - const functionSelectors = await diamondHarness.getFacetFunctionSelectors(facetCutParams[0].facetAddress); + const functionSelectors = await diamondHarness.facetFunctionSelectors(facetCutParams[0].facetAddress); expect(functionSelectors).to.deep.equal(facetCutParams[0].functionSelectors); }); it("Get facet position by facet address", async () => { - const facetPosition = await diamondHarness.getFacetPosition(facetCutParams[0].facetAddress); + const facetPosition = await diamondHarness.facetPosition(facetCutParams[0].facetAddress); expect(facetPosition).to.equal(0); }); it("Get all facet addresses", async () => { - const facetsAddress = await diamondHarness.getAllFacetAddresses(); + const facetsAddress = await diamondHarness.facetAddresses(); expect(facetsAddress[0]).to.equal(facetCutParams[0].facetAddress); }); it("Get all facets address and their selectors", async () => { - const facets = await diamondHarness.getAllFacets(); + const facets = await diamondHarness.facets(); expect(facets[0].facetAddress).to.equal(facetCutParams[0].facetAddress); }); it("Get facet address and position by function selector", async () => { - const facetsAddressAndPosition = await diamondHarness.getFacetAddressAndPosition( - facetCutParams[0].functionSelectors[1], - ); + const facetsAddressAndPosition = await diamondHarness.facetAddress(facetCutParams[0].functionSelectors[1]); expect(facetsAddressAndPosition.facetAddress).to.equal(facetCutParams[0].facetAddress); expect(facetsAddressAndPosition.functionSelectorPosition).to.equal(1); }); From 3909ff70220671bebbb49e62f00d640168fca894 Mon Sep 17 00:00:00 2001 From: Debugger022 Date: Thu, 3 Aug 2023 14:12:48 +0530 Subject: [PATCH 122/153] refactor: netspec comments --- contracts/Comptroller/Diamond/Diamond.sol | 54 ++++++++++--------- .../Comptroller/Diamond/facets/FacetBase.sol | 8 +++ .../Diamond/facets/MarketFacet.sol | 17 +++--- .../Diamond/facets/PolicyFacet.sol | 16 ++++++ .../Diamond/facets/RewardFacet.sol | 6 +-- .../Diamond/facets/SetterFacet.sol | 44 ++++++++++++--- .../Diamond/facets/XVSRewardsHelper.sol | 2 +- 7 files changed, 106 insertions(+), 41 deletions(-) diff --git a/contracts/Comptroller/Diamond/Diamond.sol b/contracts/Comptroller/Diamond/Diamond.sol index ec554b969..93f253931 100644 --- a/contracts/Comptroller/Diamond/Diamond.sol +++ b/contracts/Comptroller/Diamond/Diamond.sol @@ -6,6 +6,7 @@ import "../ComptrollerStorage.sol"; import "../Unitroller.sol"; contract Diamond is ComptrollerV12Storage { + /// @notice Emitted when functions are added, replaced or removed to facets event DiamondCut(IDiamondCut.FacetCut[] _diamondCut); struct Facet { @@ -14,8 +15,8 @@ contract Diamond is ComptrollerV12Storage { } /** - * @notice Call _acceptImplementation to accept the diamond proxy as new implementaion. - * @param unitroller Address of the unitroller. + * @notice Call _acceptImplementation to accept the diamond proxy as new implementaion + * @param unitroller Address of the unitroller */ function _become(Unitroller unitroller) public { require(msg.sender == unitroller.admin(), "only unitroller admin can"); @@ -23,8 +24,8 @@ contract Diamond is ComptrollerV12Storage { } /** - * @notice To add function selectors to the facets' mapping. - * @param diamondCut_ IDiamondCut contains facets address, action and function selectors. + * @notice To add function selectors to the facets' mapping + * @param diamondCut_ IDiamondCut contains facets address, action and function selectors */ function diamondCut(IDiamondCut.FacetCut[] memory diamondCut_) public { require(msg.sender == admin, "only unitroller admin can"); @@ -83,8 +84,8 @@ contract Diamond is ComptrollerV12Storage { } /** - * @notice To add function selectors to the facets' mapping. - * @param diamondCut_ IDiamondCut contains facets address, action and function selectors. + * @notice To add function selectors to the facets' mapping + * @param diamondCut_ IDiamondCut contains facets address, action and function selectors */ function libDiamondCut(IDiamondCut.FacetCut[] memory diamondCut_) internal { uint256 diamondCutLength = diamondCut_.length; @@ -104,9 +105,9 @@ contract Diamond is ComptrollerV12Storage { } /** - * @notice Add function selectors to the facet's address mapping. - * @param facetAddress Address of the facet. - * @param functionSelectors Array of function selectors need to add in the mapping. + * @notice Add function selectors to the facet's address mapping + * @param facetAddress Address of the facet + * @param functionSelectors Array of function selectors need to add in the mapping */ function addFunctions(address facetAddress, bytes4[] memory functionSelectors) internal { require(functionSelectors.length != 0, "LibDiamondCut: No selectors in facet to cut"); @@ -127,9 +128,9 @@ contract Diamond is ComptrollerV12Storage { } /** - * @notice Replace facet's address mapping for function selectors i.e selectors already associate to any other existing facet. - * @param facetAddress Address of the facet. - * @param functionSelectors Array of function selectors need to replace in the mapping. + * @notice Replace facet's address mapping for function selectors i.e selectors already associate to any other existing facet + * @param facetAddress Address of the facet + * @param functionSelectors Array of function selectors need to replace in the mapping */ function replaceFunctions(address facetAddress, bytes4[] memory functionSelectors) internal { require(functionSelectors.length != 0, "LibDiamondCut: No selectors in facet to cut"); @@ -151,9 +152,9 @@ contract Diamond is ComptrollerV12Storage { } /** - * @notice Remove function selectors to the facet's address mapping. - * @param facetAddress Address of the facet. - * @param functionSelectors Array of function selectors need to remove in the mapping. + * @notice Remove function selectors to the facet's address mapping + * @param facetAddress Address of the facet + * @param functionSelectors Array of function selectors need to remove in the mapping */ function removeFunctions(address facetAddress, bytes4[] memory functionSelectors) internal { uint256 functionSelectorsLength = functionSelectors.length; @@ -168,8 +169,8 @@ contract Diamond is ComptrollerV12Storage { } /** - * @notice Add new facet to the proxy. - * @param facetAddress Address of the facet. + * @notice Add new facet to the proxy + * @param facetAddress Address of the facet */ function addFacet(address facetAddress) internal { enforceHasContractCode(facetAddress, "Diamond: New facet has no code"); @@ -178,10 +179,10 @@ contract Diamond is ComptrollerV12Storage { } /** - * @notice Add function selector to the facet's address mapping. - * @param selector funciton selector need to be added. - * @param selectorPosition funciton selector position. - * @param facetAddress Address of the facet. + * @notice Add function selector to the facet's address mapping + * @param selector funciton selector need to be added + * @param selectorPosition funciton selector position + * @param facetAddress Address of the facet */ function addFunction(bytes4 selector, uint96 selectorPosition, address facetAddress) internal { _selectorToFacetAndPosition[selector].functionSelectorPosition = selectorPosition; @@ -190,9 +191,9 @@ contract Diamond is ComptrollerV12Storage { } /** - * @notice Remove function selector to the facet's address mapping. - * @param facetAddress Address of the facet. - * @param selector function selectors need to remove in the mapping. + * @notice Remove function selector to the facet's address mapping + * @param facetAddress Address of the facet + * @param selector function selectors need to remove in the mapping */ function removeFunction(address facetAddress, bytes4 selector) internal { require(facetAddress != address(0), "LibDiamondCut: Can't remove function that doesn't exist"); @@ -225,6 +226,11 @@ contract Diamond is ComptrollerV12Storage { } } + /** + * @dev Ensure that the given address has contract code deployed + * @param _contract The address to check for contract code + * @param _errorMessage The error message to display if the contract code is not deployed + */ function enforceHasContractCode(address _contract, string memory _errorMessage) internal view { uint256 contractSize; assembly { diff --git a/contracts/Comptroller/Diamond/facets/FacetBase.sol b/contracts/Comptroller/Diamond/facets/FacetBase.sol index c9ed1e482..83347282f 100644 --- a/contracts/Comptroller/Diamond/facets/FacetBase.sol +++ b/contracts/Comptroller/Diamond/facets/FacetBase.sol @@ -55,6 +55,7 @@ contract FacetBase is ComptrollerV12Storage, ExponentialNoError { require(msg.sender == admin || msg.sender == privilegedAddress, "access denied"); } + /// @notice Checks the caller is allowed to call the specified fuction function ensureAllowed(string memory functionSig) internal view { require(IAccessControlManager(accessControl).isAllowedToCall(msg.sender, functionSig), "access denied"); } @@ -174,6 +175,13 @@ contract FacetBase is ComptrollerV12Storage, ExponentialNoError { return ComptrollerErrorReporter.Error.NO_ERROR; } + /** + * @notice Checks for the user is allowed to redeem tokens + * @param vToken Address of the market + * @param redeemer Address of the user + * @param redeemTokens Amount of tokens to redeem + * @return Success indicator for redeem is allowed or not + */ function redeemAllowedInternal(address vToken, address redeemer, uint redeemTokens) internal view returns (uint) { ensureListed(markets[vToken]); /* If the redeemer is not 'in' the market, then we can bypass the liquidity check */ diff --git a/contracts/Comptroller/Diamond/facets/MarketFacet.sol b/contracts/Comptroller/Diamond/facets/MarketFacet.sol index 5f6f0e492..441eebb2f 100644 --- a/contracts/Comptroller/Diamond/facets/MarketFacet.sol +++ b/contracts/Comptroller/Diamond/facets/MarketFacet.sol @@ -21,13 +21,18 @@ contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase return true; } + /** + * @notice Returns the assets an account has entered + * @param account The address of the account to pull assets for + * @return A dynamic list with the assets the account has entered + */ function getAssetsIn(address account) external view returns (VToken[] memory) { return accountAssets[account]; } /** * @notice Return all of the markets - * @dev The automatic getter may be used to access an individual market. + * @dev The automatic getter may be used to access an individual market * @return The list of market addresses */ function getAllMarkets() external view returns (VToken[] memory) { @@ -79,7 +84,7 @@ contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase * @notice Returns whether the given account is entered in the given asset * @param account The address of the account to check * @param vToken The vToken to check - * @return True if the account is in the asset, otherwise false. + * @return True if the account is in the asset, otherwise false */ function checkMembership(address account, VToken vToken) external view returns (bool) { return markets[address(vToken)].accountMembership[account]; @@ -104,7 +109,7 @@ contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase /** * @notice Removes asset from sender's account liquidity calculation * @dev Sender must not have an outstanding borrow balance in the asset, - * or be providing necessary collateral for an outstanding borrow. + * or be providing necessary collateral for an outstanding borrow * @param vTokenAddress The address of the asset to be removed * @return Whether or not the account successfully exited the market */ @@ -188,10 +193,10 @@ contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase } /** - * @notice Grants or revokes the borrowing delegate rights to / from an account. - * If allowed, the delegate will be able to borrow funds on behalf of the sender. + * @notice Grants or revokes the borrowing delegate rights to / from an account + * If allowed, the delegate will be able to borrow funds on behalf of the sender * Upon a delegated borrow, the delegate will receive the funds, and the borrower - * will see the debt on their account. + * will see the debt on their account * @param delegate The address to update the rights for * @param allowBorrows Whether to grant (true) or revoke (false) the rights */ diff --git a/contracts/Comptroller/Diamond/facets/PolicyFacet.sol b/contracts/Comptroller/Diamond/facets/PolicyFacet.sol index 33ec5c94b..1bc620769 100644 --- a/contracts/Comptroller/Diamond/facets/PolicyFacet.sol +++ b/contracts/Comptroller/Diamond/facets/PolicyFacet.sol @@ -42,6 +42,13 @@ contract PolicyFacet is XVSRewardsHelper { return uint(Error.NO_ERROR); } + /** + * @notice Validates mint and reverts on rejection. May emit logs. + * @param vToken Asset being minted + * @param minter The address minting the tokens + * @param actualMintAmount The amount of the underlying asset being minted + * @param mintTokens The number of tokens being minted + */ function mintVerify(address vToken, address minter, uint actualMintAmount, uint mintTokens) external {} /** @@ -241,6 +248,15 @@ contract PolicyFacet is XVSRewardsHelper { return uint(Error.NO_ERROR); } + /** + * @notice Validates liquidateBorrow and reverts on rejection. May emit logs. + * @param vTokenBorrowed Asset which was borrowed by the borrower + * @param vTokenCollateral Asset which was used as collateral and will be seized + * @param liquidator The address repaying the borrow and seizing the collateral + * @param borrower The address of the borrower + * @param actualRepayAmount The amount of underlying being repaid + * @param seizeTokens The amount of collateral token that will be seized + */ function liquidateBorrowVerify( address vTokenBorrowed, address vTokenCollateral, diff --git a/contracts/Comptroller/Diamond/facets/RewardFacet.sol b/contracts/Comptroller/Diamond/facets/RewardFacet.sol index b019a1aba..3c68cc285 100644 --- a/contracts/Comptroller/Diamond/facets/RewardFacet.sol +++ b/contracts/Comptroller/Diamond/facets/RewardFacet.sol @@ -54,7 +54,7 @@ contract RewardFacet is XVSRewardsHelper { /** * @notice Transfer XVS to the user with user's shortfall considered - * @dev Note: If there is not enough XVS, we do not perform the transfer all. + * @dev Note: If there is not enough XVS, we do not perform the transfer all * @param user The address of the user to transfer XVS to * @param amount The amount of XVS to (possibly) transfer * @param shortfall The shortfall of the user @@ -81,7 +81,7 @@ contract RewardFacet is XVSRewardsHelper { } // If user's bankrupt and doesn't use pending xvs as collateral, don't grant // anything, otherwise, we will transfer the pending xvs as collateral to - // vXVS token and mint vXVS for the user. + // vXVS token and mint vXVS for the user // // If mintBehalf failed, don't grant any xvs require(collateral, "bankrupt accounts can only collateralize their pending xvs rewards"); @@ -101,7 +101,7 @@ contract RewardFacet is XVSRewardsHelper { /** * @notice Transfer XVS to the recipient - * @dev Note: If there is not enough XVS, we do not perform the transfer all. + * @dev Note: If there is not enough XVS, we do not perform the transfer all * @param recipient The address of the recipient to transfer XVS to * @param amount The amount of XVS to (possibly) transfer */ diff --git a/contracts/Comptroller/Diamond/facets/SetterFacet.sol b/contracts/Comptroller/Diamond/facets/SetterFacet.sol index bbbb90393..891b4d035 100644 --- a/contracts/Comptroller/Diamond/facets/SetterFacet.sol +++ b/contracts/Comptroller/Diamond/facets/SetterFacet.sol @@ -66,11 +66,21 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase /// @notice Emitted when Venus VAI Vault rate is changed event NewVenusVAIVaultRate(uint oldVenusVAIVaultRate, uint newVenusVAIVaultRate); + /** + * @notice Compare two addresses to ensure they are different + * @param oldAddress The original address to compare + * @param newAddress The new address to compare + */ modifier compareAddress(address oldAddress, address newAddress) { require(oldAddress != newAddress, "old address is same as new address"); _; } + /** + * @notice Compare two values to ensure they are different + * @param oldValue The original value to compare + * @param newValue The new value to compare + */ modifier compareValue(uint256 oldValue, uint256 newValue) { require(oldValue != newValue, "old value is same as new value"); _; @@ -211,6 +221,11 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase return uint(Error.NO_ERROR); } + /** + * @notice Update the address of the liquidator contract + * @dev Admin function to set liquidator contract + * @param newLiquidatorContract_ The new address of the liquidator contract + */ function _setLiquidatorContract( address newLiquidatorContract_ ) external compareAddress(liquidatorContract, newLiquidatorContract_) { @@ -244,10 +259,10 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase } /** - * @notice Set the given borrow caps for the given vToken market Borrowing that brings total borrows to or above borrow cap will revert. - * @dev Access is controled by ACM. A borrow cap of 0 corresponds to unlimited borrowing. + * @notice Set the given borrow caps for the given vToken market Borrowing that brings total borrows to or above borrow cap will revert + * @dev Access is controled by ACM. A borrow cap of 0 corresponds to unlimited borrowing * @param vTokens The addresses of the markets (tokens) to change the borrow caps for - * @param newBorrowCaps The new borrow cap values in underlying to be set. A value of 0 corresponds to unlimited borrowing. + * @param newBorrowCaps The new borrow cap values in underlying to be set. A value of 0 corresponds to unlimited borrowing */ function _setMarketBorrowCaps(VToken[] calldata vTokens, uint[] calldata newBorrowCaps) external { ensureAllowed("_setMarketBorrowCaps(address[],uint256[])"); @@ -264,10 +279,10 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase } /** - * @notice Set the given supply caps for the given vToken market Supply that brings total Supply to or above supply cap will revert. - * @dev Admin function to set the supply cap A supply cap of 0 corresponds to Minting NotAllowed. + * @notice Set the given supply caps for the given vToken market Supply that brings total Supply to or above supply cap will revert + * @dev Admin function to set the supply cap A supply cap of 0 corresponds to Minting NotAllowed * @param vTokens The addresses of the markets (tokens) to change the supply caps for - * @param newSupplyCaps The new supply cap values in underlying to be set. A value of 0 corresponds to Minting NotAllowed. + * @param newSupplyCaps The new supply cap values in underlying to be set. A value of 0 corresponds to Minting NotAllowed */ function _setMarketSupplyCaps(VToken[] calldata vTokens, uint256[] calldata newSupplyCaps) external { ensureAllowed("_setMarketSupplyCaps(address[],uint256[])"); @@ -285,6 +300,8 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase /** * @notice Set whole protocol pause/unpause state + * @param state The new state (true=paused, false=unpaused) + * @return bool The updated state of the protocol */ function _setProtocolPaused(bool state) external returns (bool) { ensureAllowed("_setProtocolPaused(bool)"); @@ -343,6 +360,11 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase return uint(Error.NO_ERROR); } + /** + * @notice Set the VAI mint rate + * @param newVAIMintRate The new VAI mint rate to be set + * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) + */ function _setVAIMintRate(uint newVAIMintRate) external compareValue(vaiMintRate, newVAIMintRate) returns (uint) { // Check caller is admin ensureAdmin(); @@ -372,7 +394,13 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase return uint(Error.NO_ERROR); } - //---- + /** + * @notice Set the treasury data. + * @param newTreasuryGuardian The new address of the treasury guardian to be set + * @param newTreasuryAddress The new address of the treasury to be set + * @param newTreasuryPercent The new treasury percent to be set + * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) + */ function _setTreasuryData( address newTreasuryGuardian, address newTreasuryAddress, @@ -404,6 +432,8 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase /** * @dev Set ComptrollerLens contract address + * @param comptrollerLens_ The new ComptrollerLens contract address to be set + * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) */ function _setComptrollerLens( ComptrollerLensInterface comptrollerLens_ diff --git a/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol b/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol index 7c86a9a0e..c4adb89d9 100644 --- a/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol +++ b/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol @@ -99,7 +99,7 @@ contract XVSRewardsHelper is ComptrollerErrorReporter, FacetBase { /** * @notice Calculate XVS accrued by a borrower and possibly transfer it to them - * @dev Borrowers will not begin to accrue until after the first interaction with the protocol. + * @dev Borrowers will not begin to accrue until after the first interaction with the protocol * @param vToken The market in which the borrower is interacting * @param borrower The address of the borrower to distribute XVS to */ From 6d0a33c3087701593b1470cace558baedaa3e6d1 Mon Sep 17 00:00:00 2001 From: Debugger022 Date: Fri, 4 Aug 2023 10:51:25 +0530 Subject: [PATCH 123/153] fix: ven-1795 n-01 n-03 n-09 --- contracts/Comptroller/ComptrollerStorage.sol | 8 ++++---- contracts/Comptroller/Diamond/Diamond.sol | 3 +-- contracts/Comptroller/Diamond/facets/FacetBase.sol | 11 +++++------ contracts/Comptroller/Diamond/facets/MarketFacet.sol | 3 +-- contracts/Comptroller/Diamond/facets/PolicyFacet.sol | 4 +--- contracts/Comptroller/Diamond/facets/RewardFacet.sol | 5 +++-- contracts/Comptroller/Diamond/facets/SetterFacet.sol | 8 ++++---- .../Comptroller/Diamond/facets/XVSRewardsHelper.sol | 2 +- .../Comptroller/Diamond/interfaces/IMarketFacet.sol | 3 +-- .../Comptroller/Diamond/interfaces/IPolicyFacet.sol | 2 +- .../Comptroller/Diamond/interfaces/IRewardFacet.sol | 5 ++--- .../Comptroller/Diamond/interfaces/ISetterFacet.sol | 9 +++++---- 12 files changed, 29 insertions(+), 34 deletions(-) diff --git a/contracts/Comptroller/ComptrollerStorage.sol b/contracts/Comptroller/ComptrollerStorage.sol index a2fcb550f..b17e38b00 100644 --- a/contracts/Comptroller/ComptrollerStorage.sol +++ b/contracts/Comptroller/ComptrollerStorage.sol @@ -1,9 +1,9 @@ pragma solidity ^0.5.16; -import "../Tokens/VTokens/VToken.sol"; -import "../Oracle/PriceOracle.sol"; -import "../Tokens/VAI/VAIControllerInterface.sol"; -import "./ComptrollerLensInterface.sol"; +import { VToken } from "../Tokens/VTokens/VToken.sol"; +import { PriceOracle } from "../Oracle/PriceOracle.sol"; +import { VAIControllerInterface } from "../Tokens/VAI/VAIControllerInterface.sol"; +import { ComptrollerLensInterface } from "./ComptrollerLensInterface.sol"; contract UnitrollerAdminStorage { /** diff --git a/contracts/Comptroller/Diamond/Diamond.sol b/contracts/Comptroller/Diamond/Diamond.sol index 93f253931..0dd5972ad 100644 --- a/contracts/Comptroller/Diamond/Diamond.sol +++ b/contracts/Comptroller/Diamond/Diamond.sol @@ -2,8 +2,7 @@ pragma solidity 0.5.16; pragma experimental ABIEncoderV2; import { IDiamondCut } from "./interfaces/IDiamondCut.sol"; -import "../ComptrollerStorage.sol"; -import "../Unitroller.sol"; +import { Unitroller, ComptrollerV12Storage } from "../Unitroller.sol"; contract Diamond is ComptrollerV12Storage { /// @notice Emitted when functions are added, replaced or removed to facets diff --git a/contracts/Comptroller/Diamond/facets/FacetBase.sol b/contracts/Comptroller/Diamond/facets/FacetBase.sol index 83347282f..fa4d2740d 100644 --- a/contracts/Comptroller/Diamond/facets/FacetBase.sol +++ b/contracts/Comptroller/Diamond/facets/FacetBase.sol @@ -1,11 +1,10 @@ pragma solidity 0.5.16; -import "../../../Utils/ErrorReporter.sol"; -import "../../../Tokens/VTokens/VToken.sol"; -import "../../../Utils/ExponentialNoError.sol"; -import "../../../Comptroller/ComptrollerStorage.sol"; -import "../../../Governance/IAccessControlManager.sol"; -import "../../../Utils/SafeBEP20.sol"; +import { VToken, ComptrollerErrorReporter, ExponentialNoError } from "../../../Tokens/VTokens/VToken.sol"; +import { IVAIVault } from "../../../Comptroller/ComptrollerInterface.sol"; +import { ComptrollerV12Storage } from "../../../Comptroller/ComptrollerStorage.sol"; +import { IAccessControlManager } from "../../../Governance/IAccessControlManager.sol"; +import { SafeBEP20, IBEP20 } from "../../../Utils/SafeBEP20.sol"; contract FacetBase is ComptrollerV12Storage, ExponentialNoError { /// @notice Emitted when an account enters a market diff --git a/contracts/Comptroller/Diamond/facets/MarketFacet.sol b/contracts/Comptroller/Diamond/facets/MarketFacet.sol index 441eebb2f..8ad4dd590 100644 --- a/contracts/Comptroller/Diamond/facets/MarketFacet.sol +++ b/contracts/Comptroller/Diamond/facets/MarketFacet.sol @@ -1,7 +1,6 @@ pragma solidity 0.5.16; -import "./FacetBase.sol"; -import "../../../Tokens/VTokens/VToken.sol"; +import { FacetBase, VToken, ComptrollerErrorReporter, ExponentialNoError } from "./FacetBase.sol"; /** * @dev This facet contains all the methods related to the market's management in the pool diff --git a/contracts/Comptroller/Diamond/facets/PolicyFacet.sol b/contracts/Comptroller/Diamond/facets/PolicyFacet.sol index 1bc620769..82f144b70 100644 --- a/contracts/Comptroller/Diamond/facets/PolicyFacet.sol +++ b/contracts/Comptroller/Diamond/facets/PolicyFacet.sol @@ -1,8 +1,6 @@ pragma solidity 0.5.16; -import "../../../Utils/ErrorReporter.sol"; -import "./XVSRewardsHelper.sol"; -import "../../../Tokens/VTokens/VToken.sol"; +import { XVSRewardsHelper, VToken } from "./XVSRewardsHelper.sol"; /** * @dev This facet contains all the hooks used while transferring the assets diff --git a/contracts/Comptroller/Diamond/facets/RewardFacet.sol b/contracts/Comptroller/Diamond/facets/RewardFacet.sol index 3c68cc285..12b332062 100644 --- a/contracts/Comptroller/Diamond/facets/RewardFacet.sol +++ b/contracts/Comptroller/Diamond/facets/RewardFacet.sol @@ -1,7 +1,8 @@ pragma solidity 0.5.16; -import "../../../Tokens/VTokens/VToken.sol"; -import "./XVSRewardsHelper.sol"; +import { XVSRewardsHelper, VToken } from "./XVSRewardsHelper.sol"; +import { SafeBEP20, IBEP20 } from "../../../Utils/SafeBEP20.sol"; +import { VBep20Interface } from "../../../Tokens/VTokens/VTokenInterfaces.sol"; /** * @dev This facet contains all the methods related to the reward functionality diff --git a/contracts/Comptroller/Diamond/facets/SetterFacet.sol b/contracts/Comptroller/Diamond/facets/SetterFacet.sol index 891b4d035..1c86886d0 100644 --- a/contracts/Comptroller/Diamond/facets/SetterFacet.sol +++ b/contracts/Comptroller/Diamond/facets/SetterFacet.sol @@ -1,9 +1,9 @@ pragma solidity 0.5.16; -import "../../../Oracle/PriceOracle.sol"; -import "../../../Tokens/VTokens/VToken.sol"; -import "../../../Utils/ErrorReporter.sol"; -import "./FacetBase.sol"; +import { PriceOracle } from "../../../Oracle/PriceOracle.sol"; +import { ComptrollerLensInterface } from "../../ComptrollerLensInterface.sol"; +import { VAIControllerInterface } from "../../../Tokens/VAI/VAIControllerInterface.sol"; +import { FacetBase, VToken, ComptrollerErrorReporter, ExponentialNoError } from "./FacetBase.sol"; /** * @dev This facet contains all the setters for the states diff --git a/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol b/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol index c4adb89d9..f20aaf664 100644 --- a/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol +++ b/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol @@ -1,6 +1,6 @@ pragma solidity 0.5.16; -import "./FacetBase.sol"; +import { FacetBase, ComptrollerErrorReporter, VToken, ExponentialNoError } from "./FacetBase.sol"; /** * @dev This contract contains internal functions used in RewardFacet and PolicyFacet diff --git a/contracts/Comptroller/Diamond/interfaces/IMarketFacet.sol b/contracts/Comptroller/Diamond/interfaces/IMarketFacet.sol index 992568f87..fa4d2d11a 100644 --- a/contracts/Comptroller/Diamond/interfaces/IMarketFacet.sol +++ b/contracts/Comptroller/Diamond/interfaces/IMarketFacet.sol @@ -1,7 +1,6 @@ pragma solidity 0.5.16; -import "../../../Tokens/VTokens/VToken.sol"; -import "../../../Oracle/PriceOracle.sol"; +import { VToken } from "../../../Tokens/VTokens/VToken.sol"; interface IMarketFacet { function isComptroller() external pure returns (bool); diff --git a/contracts/Comptroller/Diamond/interfaces/IPolicyFacet.sol b/contracts/Comptroller/Diamond/interfaces/IPolicyFacet.sol index 7178694b7..10b4fe49b 100644 --- a/contracts/Comptroller/Diamond/interfaces/IPolicyFacet.sol +++ b/contracts/Comptroller/Diamond/interfaces/IPolicyFacet.sol @@ -1,6 +1,6 @@ pragma solidity 0.5.16; -import "../../../Tokens/VTokens/VToken.sol"; +import { VToken } from "../../../Tokens/VTokens/VToken.sol"; interface IPolicyFacet { function mintAllowed(address vToken, address minter, uint mintAmount) external returns (uint); diff --git a/contracts/Comptroller/Diamond/interfaces/IRewardFacet.sol b/contracts/Comptroller/Diamond/interfaces/IRewardFacet.sol index ccbe8fda0..2d8492cd0 100644 --- a/contracts/Comptroller/Diamond/interfaces/IRewardFacet.sol +++ b/contracts/Comptroller/Diamond/interfaces/IRewardFacet.sol @@ -1,8 +1,7 @@ pragma solidity 0.5.16; -import "../../../Oracle/PriceOracle.sol"; -import "../../../Tokens/VTokens/VToken.sol"; -import "../../ComptrollerStorage.sol"; +import { VToken } from "../../../Tokens/VTokens/VToken.sol"; +import { ComptrollerV12Storage } from "../../ComptrollerStorage.sol"; interface IRewardFacet { function claimVenus(address holder) external; diff --git a/contracts/Comptroller/Diamond/interfaces/ISetterFacet.sol b/contracts/Comptroller/Diamond/interfaces/ISetterFacet.sol index dc18e50c6..0da2a0f5d 100644 --- a/contracts/Comptroller/Diamond/interfaces/ISetterFacet.sol +++ b/contracts/Comptroller/Diamond/interfaces/ISetterFacet.sol @@ -1,9 +1,10 @@ pragma solidity 0.5.16; -import "../../../Oracle/PriceOracle.sol"; -import "../../../Comptroller/ComptrollerLensInterface.sol"; -import "../../../Tokens/VAI/VAIController.sol"; -import "../../ComptrollerStorage.sol"; +import { PriceOracle } from "../../../Oracle/PriceOracle.sol"; +import { VToken } from "../../../Tokens/VTokens/VToken.sol"; +import { ComptrollerV12Storage } from "../../ComptrollerStorage.sol"; +import { VAIControllerInterface } from "../../../Tokens/VAI/VAIController.sol"; +import { ComptrollerLensInterface } from "../../../Comptroller/ComptrollerLensInterface.sol"; interface ISetterFacet { function _setPriceOracle(PriceOracle newOracle) external returns (uint); From 0387b3415d86d1c4bcb278ab9f3b9f5e9de0d854 Mon Sep 17 00:00:00 2001 From: Debugger022 Date: Fri, 4 Aug 2023 10:51:52 +0530 Subject: [PATCH 124/153] fix: ven-1795 n-04 --- contracts/Comptroller/ComptrollerStorage.sol | 2 ++ contracts/Comptroller/Diamond/Diamond.sol | 2 ++ contracts/Comptroller/Diamond/facets/FacetBase.sol | 2 ++ contracts/Comptroller/Diamond/facets/MarketFacet.sol | 2 ++ contracts/Comptroller/Diamond/facets/PolicyFacet.sol | 2 ++ contracts/Comptroller/Diamond/facets/RewardFacet.sol | 2 ++ contracts/Comptroller/Diamond/facets/SetterFacet.sol | 2 ++ contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol | 2 ++ contracts/Comptroller/Diamond/interfaces/IDiamondCut.sol | 2 ++ contracts/Comptroller/Diamond/interfaces/IMarketFacet.sol | 2 ++ contracts/Comptroller/Diamond/interfaces/IPolicyFacet.sol | 2 ++ contracts/Comptroller/Diamond/interfaces/IRewardFacet.sol | 2 ++ contracts/Comptroller/Diamond/interfaces/ISetterFacet.sol | 2 ++ 13 files changed, 26 insertions(+) diff --git a/contracts/Comptroller/ComptrollerStorage.sol b/contracts/Comptroller/ComptrollerStorage.sol index b17e38b00..dbbf9bd7e 100644 --- a/contracts/Comptroller/ComptrollerStorage.sol +++ b/contracts/Comptroller/ComptrollerStorage.sol @@ -1,3 +1,5 @@ +// SPDX-License-Identifier: BSD-3-Clause + pragma solidity ^0.5.16; import { VToken } from "../Tokens/VTokens/VToken.sol"; diff --git a/contracts/Comptroller/Diamond/Diamond.sol b/contracts/Comptroller/Diamond/Diamond.sol index 0dd5972ad..ca5ffa104 100644 --- a/contracts/Comptroller/Diamond/Diamond.sol +++ b/contracts/Comptroller/Diamond/Diamond.sol @@ -1,3 +1,5 @@ +// SPDX-License-Identifier: BSD-3-Clause + pragma solidity 0.5.16; pragma experimental ABIEncoderV2; diff --git a/contracts/Comptroller/Diamond/facets/FacetBase.sol b/contracts/Comptroller/Diamond/facets/FacetBase.sol index fa4d2740d..270b4b1e0 100644 --- a/contracts/Comptroller/Diamond/facets/FacetBase.sol +++ b/contracts/Comptroller/Diamond/facets/FacetBase.sol @@ -1,3 +1,5 @@ +// SPDX-License-Identifier: BSD-3-Clause + pragma solidity 0.5.16; import { VToken, ComptrollerErrorReporter, ExponentialNoError } from "../../../Tokens/VTokens/VToken.sol"; diff --git a/contracts/Comptroller/Diamond/facets/MarketFacet.sol b/contracts/Comptroller/Diamond/facets/MarketFacet.sol index 8ad4dd590..a35a28d82 100644 --- a/contracts/Comptroller/Diamond/facets/MarketFacet.sol +++ b/contracts/Comptroller/Diamond/facets/MarketFacet.sol @@ -1,3 +1,5 @@ +// SPDX-License-Identifier: BSD-3-Clause + pragma solidity 0.5.16; import { FacetBase, VToken, ComptrollerErrorReporter, ExponentialNoError } from "./FacetBase.sol"; diff --git a/contracts/Comptroller/Diamond/facets/PolicyFacet.sol b/contracts/Comptroller/Diamond/facets/PolicyFacet.sol index 82f144b70..92d6a2a5e 100644 --- a/contracts/Comptroller/Diamond/facets/PolicyFacet.sol +++ b/contracts/Comptroller/Diamond/facets/PolicyFacet.sol @@ -1,3 +1,5 @@ +// SPDX-License-Identifier: BSD-3-Clause + pragma solidity 0.5.16; import { XVSRewardsHelper, VToken } from "./XVSRewardsHelper.sol"; diff --git a/contracts/Comptroller/Diamond/facets/RewardFacet.sol b/contracts/Comptroller/Diamond/facets/RewardFacet.sol index 12b332062..c70ddb617 100644 --- a/contracts/Comptroller/Diamond/facets/RewardFacet.sol +++ b/contracts/Comptroller/Diamond/facets/RewardFacet.sol @@ -1,3 +1,5 @@ +// SPDX-License-Identifier: BSD-3-Clause + pragma solidity 0.5.16; import { XVSRewardsHelper, VToken } from "./XVSRewardsHelper.sol"; diff --git a/contracts/Comptroller/Diamond/facets/SetterFacet.sol b/contracts/Comptroller/Diamond/facets/SetterFacet.sol index 1c86886d0..8f5489218 100644 --- a/contracts/Comptroller/Diamond/facets/SetterFacet.sol +++ b/contracts/Comptroller/Diamond/facets/SetterFacet.sol @@ -1,3 +1,5 @@ +// SPDX-License-Identifier: BSD-3-Clause + pragma solidity 0.5.16; import { PriceOracle } from "../../../Oracle/PriceOracle.sol"; diff --git a/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol b/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol index f20aaf664..a4b6cc646 100644 --- a/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol +++ b/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol @@ -1,3 +1,5 @@ +// SPDX-License-Identifier: BSD-3-Clause + pragma solidity 0.5.16; import { FacetBase, ComptrollerErrorReporter, VToken, ExponentialNoError } from "./FacetBase.sol"; diff --git a/contracts/Comptroller/Diamond/interfaces/IDiamondCut.sol b/contracts/Comptroller/Diamond/interfaces/IDiamondCut.sol index d3af9e704..75b06563e 100644 --- a/contracts/Comptroller/Diamond/interfaces/IDiamondCut.sol +++ b/contracts/Comptroller/Diamond/interfaces/IDiamondCut.sol @@ -1,3 +1,5 @@ +// SPDX-License-Identifier: BSD-3-Clause + pragma solidity 0.5.16; pragma experimental ABIEncoderV2; diff --git a/contracts/Comptroller/Diamond/interfaces/IMarketFacet.sol b/contracts/Comptroller/Diamond/interfaces/IMarketFacet.sol index fa4d2d11a..13b71af35 100644 --- a/contracts/Comptroller/Diamond/interfaces/IMarketFacet.sol +++ b/contracts/Comptroller/Diamond/interfaces/IMarketFacet.sol @@ -1,3 +1,5 @@ +// SPDX-License-Identifier: BSD-3-Clause + pragma solidity 0.5.16; import { VToken } from "../../../Tokens/VTokens/VToken.sol"; diff --git a/contracts/Comptroller/Diamond/interfaces/IPolicyFacet.sol b/contracts/Comptroller/Diamond/interfaces/IPolicyFacet.sol index 10b4fe49b..d4c9e088a 100644 --- a/contracts/Comptroller/Diamond/interfaces/IPolicyFacet.sol +++ b/contracts/Comptroller/Diamond/interfaces/IPolicyFacet.sol @@ -1,3 +1,5 @@ +// SPDX-License-Identifier: BSD-3-Clause + pragma solidity 0.5.16; import { VToken } from "../../../Tokens/VTokens/VToken.sol"; diff --git a/contracts/Comptroller/Diamond/interfaces/IRewardFacet.sol b/contracts/Comptroller/Diamond/interfaces/IRewardFacet.sol index 2d8492cd0..77fe98b18 100644 --- a/contracts/Comptroller/Diamond/interfaces/IRewardFacet.sol +++ b/contracts/Comptroller/Diamond/interfaces/IRewardFacet.sol @@ -1,3 +1,5 @@ +// SPDX-License-Identifier: BSD-3-Clause + pragma solidity 0.5.16; import { VToken } from "../../../Tokens/VTokens/VToken.sol"; diff --git a/contracts/Comptroller/Diamond/interfaces/ISetterFacet.sol b/contracts/Comptroller/Diamond/interfaces/ISetterFacet.sol index 0da2a0f5d..2160fb244 100644 --- a/contracts/Comptroller/Diamond/interfaces/ISetterFacet.sol +++ b/contracts/Comptroller/Diamond/interfaces/ISetterFacet.sol @@ -1,3 +1,5 @@ +// SPDX-License-Identifier: BSD-3-Clause + pragma solidity 0.5.16; import { PriceOracle } from "../../../Oracle/PriceOracle.sol"; From 553334311197cce028da3031fe8ce2b281f6898e Mon Sep 17 00:00:00 2001 From: Debugger022 Date: Fri, 4 Aug 2023 11:06:17 +0530 Subject: [PATCH 125/153] fix: ven-1795 n-05 --- contracts/Comptroller/Diamond/facets/FacetBase.sol | 4 ++-- contracts/Comptroller/Diamond/facets/MarketFacet.sol | 6 +++--- contracts/Comptroller/Diamond/facets/PolicyFacet.sol | 4 ++-- contracts/Comptroller/Diamond/facets/RewardFacet.sol | 2 +- contracts/Comptroller/Diamond/facets/SetterFacet.sol | 6 +++--- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/contracts/Comptroller/Diamond/facets/FacetBase.sol b/contracts/Comptroller/Diamond/facets/FacetBase.sol index 270b4b1e0..397edddea 100644 --- a/contracts/Comptroller/Diamond/facets/FacetBase.sol +++ b/contracts/Comptroller/Diamond/facets/FacetBase.sol @@ -10,10 +10,10 @@ import { SafeBEP20, IBEP20 } from "../../../Utils/SafeBEP20.sol"; contract FacetBase is ComptrollerV12Storage, ExponentialNoError { /// @notice Emitted when an account enters a market - event MarketEntered(VToken vToken, address account); + event MarketEntered(VToken indexed vToken, address indexed account); /// @notice Emitted when XVS is distributed to VAI Vault - event DistributedVAIVaultVenus(uint amount); + event DistributedVAIVaultVenus(uint256 amount); using SafeBEP20 for IBEP20; diff --git a/contracts/Comptroller/Diamond/facets/MarketFacet.sol b/contracts/Comptroller/Diamond/facets/MarketFacet.sol index a35a28d82..9905bacf9 100644 --- a/contracts/Comptroller/Diamond/facets/MarketFacet.sol +++ b/contracts/Comptroller/Diamond/facets/MarketFacet.sol @@ -9,13 +9,13 @@ import { FacetBase, VToken, ComptrollerErrorReporter, ExponentialNoError } from */ contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase { /// @notice Emitted when an admin supports a market - event MarketListed(VToken vToken); + event MarketListed(VToken indexed vToken); /// @notice Emitted when an account exits a market - event MarketExited(VToken vToken, address account); + event MarketExited(VToken indexed vToken, address indexed account); /// @notice Emitted when the borrowing delegate rights are updated for an account - event DelegateUpdated(address borrower, address delegate, bool allowDelegatedBorrows); + event DelegateUpdated(address indexed borrower, address indexed delegate, bool allowDelegatedBorrows); /// @notice Indicator that this is a Comptroller contract (for inspection) function isComptroller() public pure returns (bool) { diff --git a/contracts/Comptroller/Diamond/facets/PolicyFacet.sol b/contracts/Comptroller/Diamond/facets/PolicyFacet.sol index 92d6a2a5e..677aebbe5 100644 --- a/contracts/Comptroller/Diamond/facets/PolicyFacet.sol +++ b/contracts/Comptroller/Diamond/facets/PolicyFacet.sol @@ -9,10 +9,10 @@ import { XVSRewardsHelper, VToken } from "./XVSRewardsHelper.sol"; */ contract PolicyFacet is XVSRewardsHelper { /// @notice Emitted when a new borrow-side XVS speed is calculated for a market - event VenusBorrowSpeedUpdated(VToken indexed vToken, uint newSpeed); + event VenusBorrowSpeedUpdated(VToken indexed vToken, uint256 newSpeed); /// @notice Emitted when a new supply-side XVS speed is calculated for a market - event VenusSupplySpeedUpdated(VToken indexed vToken, uint newSpeed); + event VenusSupplySpeedUpdated(VToken indexed vToken, uint256 newSpeed); /** * @notice Checks if the account should be allowed to mint tokens in the given market diff --git a/contracts/Comptroller/Diamond/facets/RewardFacet.sol b/contracts/Comptroller/Diamond/facets/RewardFacet.sol index c70ddb617..4bd866e05 100644 --- a/contracts/Comptroller/Diamond/facets/RewardFacet.sol +++ b/contracts/Comptroller/Diamond/facets/RewardFacet.sol @@ -11,7 +11,7 @@ import { VBep20Interface } from "../../../Tokens/VTokens/VTokenInterfaces.sol"; */ contract RewardFacet is XVSRewardsHelper { /// @notice Emitted when Venus is granted by admin - event VenusGranted(address recipient, uint amount); + event VenusGranted(address indexed recipient, uint256 amount); using SafeBEP20 for IBEP20; diff --git a/contracts/Comptroller/Diamond/facets/SetterFacet.sol b/contracts/Comptroller/Diamond/facets/SetterFacet.sol index 8f5489218..75964438c 100644 --- a/contracts/Comptroller/Diamond/facets/SetterFacet.sol +++ b/contracts/Comptroller/Diamond/facets/SetterFacet.sol @@ -24,7 +24,7 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase event NewPriceOracle(PriceOracle oldPriceOracle, PriceOracle newPriceOracle); /// @notice Emitted when borrow cap for a vToken is changed - event NewBorrowCap(VToken indexed vToken, uint newBorrowCap); + event NewBorrowCap(VToken indexed vToken, uint256 newBorrowCap); /// @notice Emitted when VAIController is changed event NewVAIController(VAIControllerInterface oldVAIController, VAIControllerInterface newVAIController); @@ -51,7 +51,7 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase event NewComptrollerLens(address oldComptrollerLens, address newComptrollerLens); /// @notice Emitted when supply cap for a vToken is changed - event NewSupplyCap(VToken indexed vToken, uint newSupplyCap); + event NewSupplyCap(VToken indexed vToken, uint256 newSupplyCap); /// @notice Emitted when access control address is changed by admin event NewAccessControl(address oldAccessControlAddress, address newAccessControlAddress); @@ -63,7 +63,7 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase event ActionPausedMarket(VToken indexed vToken, Action indexed action, bool pauseState); /// @notice Emitted when VAI Vault info is changed - event NewVAIVaultInfo(address vault_, uint releaseStartBlock_, uint releaseInterval_); + event NewVAIVaultInfo(address indexed vault_, uint256 releaseStartBlock_, uint256 releaseInterval_); /// @notice Emitted when Venus VAI Vault rate is changed event NewVenusVAIVaultRate(uint oldVenusVAIVaultRate, uint newVenusVAIVaultRate); From 847afd7f04dd3961eee11b359f0fc5502ea6fd50 Mon Sep 17 00:00:00 2001 From: Debugger022 Date: Fri, 4 Aug 2023 11:19:51 +0530 Subject: [PATCH 126/153] fix: ven-1795 n-06 --- contracts/Comptroller/ComptrollerStorage.sol | 38 +++--- contracts/Comptroller/Diamond/Diamond.sol | 2 +- .../Comptroller/Diamond/facets/FacetBase.sol | 26 ++-- .../Diamond/facets/MarketFacet.sol | 44 +++--- .../Diamond/facets/PolicyFacet.sol | 121 +++++++++-------- .../Diamond/facets/RewardFacet.sol | 19 ++- .../Diamond/facets/SetterFacet.sol | 128 +++++++++--------- .../Diamond/facets/XVSRewardsHelper.sol | 42 +++--- .../Diamond/interfaces/IMarketFacet.sol | 14 +- .../Diamond/interfaces/IPolicyFacet.sol | 55 ++++---- .../Diamond/interfaces/IRewardFacet.sol | 4 +- .../Diamond/interfaces/ISetterFacet.sol | 28 ++-- 12 files changed, 273 insertions(+), 248 deletions(-) diff --git a/contracts/Comptroller/ComptrollerStorage.sol b/contracts/Comptroller/ComptrollerStorage.sol index dbbf9bd7e..0ee8b0c01 100644 --- a/contracts/Comptroller/ComptrollerStorage.sol +++ b/contracts/Comptroller/ComptrollerStorage.sol @@ -38,17 +38,17 @@ contract ComptrollerV1Storage is UnitrollerAdminStorage { /** * @notice Multiplier used to calculate the maximum repayAmount when liquidating a borrow */ - uint public closeFactorMantissa; + uint256 public closeFactorMantissa; /** * @notice Multiplier representing the discount on collateral that a liquidator receives */ - uint public liquidationIncentiveMantissa; + uint256 public liquidationIncentiveMantissa; /** * @notice Max number of assets a single account can participate in (borrow or use as collateral) */ - uint public maxAssets; + uint256 public maxAssets; /** * @notice Per-account mapping of "assets you are in", capped by maxAssets @@ -63,7 +63,7 @@ contract ComptrollerV1Storage is UnitrollerAdminStorage { * For instance, 0.9 to allow borrowing 90% of collateral value. * Must be between 0 and 1, and stored as a mantissa. */ - uint collateralFactorMantissa; + uint256 collateralFactorMantissa; /// @notice Per-market mapping of "accounts in this asset" mapping(address => bool) accountMembership; /// @notice Whether or not this market receives XVS @@ -105,10 +105,10 @@ contract ComptrollerV1Storage is UnitrollerAdminStorage { VToken[] public allMarkets; /// @notice The rate at which the flywheel distributes XVS, per block - uint public venusRate; + uint256 public venusRate; /// @notice The portion of venusRate that each market currently receives - mapping(address => uint) public venusSpeeds; + mapping(address => uint256) public venusSpeeds; /// @notice The Venus market supply state for each market mapping(address => VenusMarketState) public venusSupplyState; @@ -117,22 +117,22 @@ contract ComptrollerV1Storage is UnitrollerAdminStorage { mapping(address => VenusMarketState) public venusBorrowState; /// @notice The Venus supply index for each market for each supplier as of the last time they accrued XVS - mapping(address => mapping(address => uint)) public venusSupplierIndex; + mapping(address => mapping(address => uint256)) public venusSupplierIndex; /// @notice The Venus borrow index for each market for each borrower as of the last time they accrued XVS - mapping(address => mapping(address => uint)) public venusBorrowerIndex; + mapping(address => mapping(address => uint256)) public venusBorrowerIndex; /// @notice The XVS accrued but not yet transferred to each user - mapping(address => uint) public venusAccrued; + mapping(address => uint256) public venusAccrued; /// @notice The Address of VAIController VAIControllerInterface public vaiController; /// @notice The minted VAI amount to each user - mapping(address => uint) public mintedVAIs; + mapping(address => uint256) public mintedVAIs; /// @notice VAI Mint Rate as a percentage - uint public vaiMintRate; + uint256 public vaiMintRate; /** * @notice The Pause Guardian can pause certain actions as a safety mechanism. @@ -146,12 +146,12 @@ contract ComptrollerV1Storage is UnitrollerAdminStorage { bool public protocolPaused; /// @notice The rate at which the flywheel distributes XVS to VAI Minters, per block (deprecated) - uint private venusVAIRate; + uint256 private venusVAIRate; } contract ComptrollerV2Storage is ComptrollerV1Storage { /// @notice The rate at which the flywheel distributes XVS to VAI Vault, per block - uint public venusVAIVaultRate; + uint256 public venusVAIVaultRate; // address of VAI Vault address public vaiVaultAddress; @@ -168,7 +168,7 @@ contract ComptrollerV3Storage is ComptrollerV2Storage { address public borrowCapGuardian; /// @notice Borrow caps enforced by borrowAllowed for each vToken address. Defaults to zero which corresponds to unlimited borrowing. - mapping(address => uint) public borrowCaps; + mapping(address => uint256) public borrowCaps; } contract ComptrollerV4Storage is ComptrollerV3Storage { @@ -184,10 +184,10 @@ contract ComptrollerV4Storage is ComptrollerV3Storage { contract ComptrollerV5Storage is ComptrollerV4Storage { /// @notice The portion of XVS that each contributor receives per block (deprecated) - mapping(address => uint) private venusContributorSpeeds; + mapping(address => uint256) private venusContributorSpeeds; /// @notice Last block at which a contributor's XVS rewards have been allocated (deprecated) - mapping(address => uint) private lastContributorBlock; + mapping(address => uint256) private lastContributorBlock; } contract ComptrollerV6Storage is ComptrollerV5Storage { @@ -220,15 +220,15 @@ contract ComptrollerV9Storage is ComptrollerV8Storage { } /// @notice True if a certain action is paused on a certain market - mapping(address => mapping(uint => bool)) internal _actionPaused; + mapping(address => mapping(uint256 => bool)) internal _actionPaused; } contract ComptrollerV10Storage is ComptrollerV9Storage { /// @notice The rate at which venus is distributed to the corresponding borrow market (per block) - mapping(address => uint) public venusBorrowSpeeds; + mapping(address => uint256) public venusBorrowSpeeds; /// @notice The rate at which venus is distributed to the corresponding supply market (per block) - mapping(address => uint) public venusSupplySpeeds; + mapping(address => uint256) public venusSupplySpeeds; } contract ComptrollerV11Storage is ComptrollerV10Storage { diff --git a/contracts/Comptroller/Diamond/Diamond.sol b/contracts/Comptroller/Diamond/Diamond.sol index ca5ffa104..56a54f02c 100644 --- a/contracts/Comptroller/Diamond/Diamond.sol +++ b/contracts/Comptroller/Diamond/Diamond.sol @@ -75,7 +75,7 @@ contract Diamond is ComptrollerV12Storage { * @return facets_ Array of Facet */ function facets() external view returns (Facet[] memory facets_) { - uint facetsLength = _facetAddresses.length; + uint256 facetsLength = _facetAddresses.length; facets_ = new Facet[](facetsLength); for (uint256 i; i < facetsLength; ++i) { address facet = _facetAddresses[i]; diff --git a/contracts/Comptroller/Diamond/facets/FacetBase.sol b/contracts/Comptroller/Diamond/facets/FacetBase.sol index 397edddea..218a0417e 100644 --- a/contracts/Comptroller/Diamond/facets/FacetBase.sol +++ b/contracts/Comptroller/Diamond/facets/FacetBase.sol @@ -136,10 +136,10 @@ contract FacetBase is ComptrollerV12Storage, ExponentialNoError { function getHypotheticalAccountLiquidityInternal( address account, VToken vTokenModify, - uint redeemTokens, - uint borrowAmount - ) internal view returns (ComptrollerErrorReporter.Error, uint, uint) { - (uint err, uint liquidity, uint shortfall) = comptrollerLens.getHypotheticalAccountLiquidity( + uint256 redeemTokens, + uint256 borrowAmount + ) internal view returns (Error, uint256, uint256) { + (uint256 err, uint256 liquidity, uint256 shortfall) = comptrollerLens.getHypotheticalAccountLiquidity( address(this), account, vTokenModify, @@ -183,25 +183,29 @@ contract FacetBase is ComptrollerV12Storage, ExponentialNoError { * @param redeemTokens Amount of tokens to redeem * @return Success indicator for redeem is allowed or not */ - function redeemAllowedInternal(address vToken, address redeemer, uint redeemTokens) internal view returns (uint) { + function redeemAllowedInternal( + address vToken, + address redeemer, + uint256 redeemTokens + ) internal view returns (uint256) { ensureListed(markets[vToken]); /* If the redeemer is not 'in' the market, then we can bypass the liquidity check */ if (!markets[vToken].accountMembership[redeemer]) { - return uint(ComptrollerErrorReporter.Error.NO_ERROR); + return uint256(Error.NO_ERROR); } /* Otherwise, perform a hypothetical liquidity check to guard against shortfall */ - (ComptrollerErrorReporter.Error err, , uint shortfall) = getHypotheticalAccountLiquidityInternal( + (Error err, , uint256 shortfall) = getHypotheticalAccountLiquidityInternal( redeemer, VToken(vToken), redeemTokens, 0 ); - if (err != ComptrollerErrorReporter.Error.NO_ERROR) { - return uint(err); + if (err != Error.NO_ERROR) { + return uint256(err); } if (shortfall != 0) { - return uint(ComptrollerErrorReporter.Error.INSUFFICIENT_LIQUIDITY); + return uint256(Error.INSUFFICIENT_LIQUIDITY); } - return uint(ComptrollerErrorReporter.Error.NO_ERROR); + return uint256(Error.NO_ERROR); } } diff --git a/contracts/Comptroller/Diamond/facets/MarketFacet.sol b/contracts/Comptroller/Diamond/facets/MarketFacet.sol index 9905bacf9..b184799c5 100644 --- a/contracts/Comptroller/Diamond/facets/MarketFacet.sol +++ b/contracts/Comptroller/Diamond/facets/MarketFacet.sol @@ -51,9 +51,9 @@ contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase function liquidateCalculateSeizeTokens( address vTokenBorrowed, address vTokenCollateral, - uint actualRepayAmount - ) external view returns (uint, uint) { - (uint err, uint seizeTokens) = comptrollerLens.liquidateCalculateSeizeTokens( + uint256 actualRepayAmount + ) external view returns (uint256, uint256) { + (uint256 err, uint256 seizeTokens) = comptrollerLens.liquidateCalculateSeizeTokens( address(this), vTokenBorrowed, vTokenCollateral, @@ -71,9 +71,9 @@ contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase */ function liquidateVAICalculateSeizeTokens( address vTokenCollateral, - uint actualRepayAmount - ) external view returns (uint, uint) { - (uint err, uint seizeTokens) = comptrollerLens.liquidateVAICalculateSeizeTokens( + uint256 actualRepayAmount + ) external view returns (uint256, uint256) { + (uint256 err, uint256 seizeTokens) = comptrollerLens.liquidateVAICalculateSeizeTokens( address(this), vTokenCollateral, actualRepayAmount @@ -96,12 +96,12 @@ contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase * @param vTokens The list of addresses of the vToken markets to be enabled * @return Success indicator for whether each corresponding market was entered */ - function enterMarkets(address[] calldata vTokens) external returns (uint[] memory) { - uint len = vTokens.length; + function enterMarkets(address[] calldata vTokens) external returns (uint256[] memory) { + uint256 len = vTokens.length; - uint[] memory results = new uint[](len); - for (uint i; i < len; ++i) { - results[i] = uint(addToMarketInternal(VToken(vTokens[i]), msg.sender)); + uint256[] memory results = new uint256[](len); + for (uint256 i; i < len; ++i) { + results[i] = uint256(addToMarketInternal(VToken(vTokens[i]), msg.sender)); } return results; @@ -114,12 +114,12 @@ contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase * @param vTokenAddress The address of the asset to be removed * @return Whether or not the account successfully exited the market */ - function exitMarket(address vTokenAddress) external returns (uint) { + function exitMarket(address vTokenAddress) external returns (uint256) { checkActionPauseState(vTokenAddress, Action.EXIT_MARKET); VToken vToken = VToken(vTokenAddress); /* Get sender tokensHeld and amountOwed underlying from the vToken */ - (uint oErr, uint tokensHeld, uint amountOwed, ) = vToken.getAccountSnapshot(msg.sender); + (uint256 oErr, uint256 tokensHeld, uint256 amountOwed, ) = vToken.getAccountSnapshot(msg.sender); require(oErr == 0, "getAccountSnapshot failed"); // semi-opaque error code /* Fail if the sender has a borrow balance */ @@ -128,7 +128,7 @@ contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase } /* Fail if the sender is not permitted to redeem all of their tokens */ - uint allowed = redeemAllowedInternal(vTokenAddress, msg.sender, tokensHeld); + uint256 allowed = redeemAllowedInternal(vTokenAddress, msg.sender, tokensHeld); if (allowed != 0) { return failOpaque(Error.REJECTION, FailureInfo.EXIT_MARKET_REJECTION, allowed); } @@ -137,7 +137,7 @@ contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase /* Return true if the sender is not already ‘in’ the market */ if (!marketToExit.accountMembership[msg.sender]) { - return uint(Error.NO_ERROR); + return uint256(Error.NO_ERROR); } /* Set vToken account membership to false */ @@ -146,8 +146,8 @@ contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase /* Delete vToken from the account’s list of assets */ // In order to delete vToken, copy last item in list to location of item to be removed, reduce length by 1 VToken[] storage userAssetList = accountAssets[msg.sender]; - uint len = userAssetList.length; - uint i; + uint256 len = userAssetList.length; + uint256 i; for (; i < len; ++i) { if (userAssetList[i] == vToken) { userAssetList[i] = userAssetList[len - 1]; @@ -161,16 +161,16 @@ contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase emit MarketExited(vToken, msg.sender); - return uint(Error.NO_ERROR); + return uint256(Error.NO_ERROR); } /** * @notice Add the market to the markets mapping and set it as listed * @dev Admin function to set isListed and add support for the market * @param vToken The address of the market (token) to list - * @return uint 0=success, otherwise a failure. (See enum Error for details) + * @return uint256 0=success, otherwise a failure. (See enum Error for details) */ - function _supportMarket(VToken vToken) external returns (uint) { + function _supportMarket(VToken vToken) external returns (uint256) { ensureAllowed("_supportMarket(address)"); if (markets[address(vToken)].isListed) { @@ -190,7 +190,7 @@ contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase emit MarketListed(vToken); - return uint(Error.NO_ERROR); + return uint256(Error.NO_ERROR); } /** @@ -212,7 +212,7 @@ contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase function _addMarketInternal(VToken vToken) internal { uint256 allMarketsLength = allMarkets.length; - for (uint i; i < allMarketsLength; ++i) { + for (uint256 i; i < allMarketsLength; ++i) { require(allMarkets[i] != vToken, "market already added"); } allMarkets.push(vToken); diff --git a/contracts/Comptroller/Diamond/facets/PolicyFacet.sol b/contracts/Comptroller/Diamond/facets/PolicyFacet.sol index 677aebbe5..e6c44634f 100644 --- a/contracts/Comptroller/Diamond/facets/PolicyFacet.sol +++ b/contracts/Comptroller/Diamond/facets/PolicyFacet.sol @@ -21,7 +21,7 @@ contract PolicyFacet is XVSRewardsHelper { * @param mintAmount The amount of underlying being supplied to the market in exchange for tokens * @return 0 if the mint is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) */ - function mintAllowed(address vToken, address minter, uint mintAmount) external returns (uint) { + function mintAllowed(address vToken, address minter, uint256 mintAmount) external returns (uint256) { // Pausing is a very serious situation - we revert to sound the alarms checkProtocolPauseState(); checkActionPauseState(vToken, Action.MINT); @@ -39,7 +39,7 @@ contract PolicyFacet is XVSRewardsHelper { updateVenusSupplyIndex(vToken); distributeSupplierVenus(vToken, minter); - return uint(Error.NO_ERROR); + return uint256(Error.NO_ERROR); } /** @@ -49,7 +49,7 @@ contract PolicyFacet is XVSRewardsHelper { * @param actualMintAmount The amount of the underlying asset being minted * @param mintTokens The number of tokens being minted */ - function mintVerify(address vToken, address minter, uint actualMintAmount, uint mintTokens) external {} + function mintVerify(address vToken, address minter, uint256 actualMintAmount, uint256 mintTokens) external {} /** * @notice Checks if the account should be allowed to redeem tokens in the given market @@ -58,12 +58,12 @@ contract PolicyFacet is XVSRewardsHelper { * @param redeemTokens The number of vTokens to exchange for the underlying asset in the market * @return 0 if the redeem is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) */ - function redeemAllowed(address vToken, address redeemer, uint redeemTokens) external returns (uint) { + function redeemAllowed(address vToken, address redeemer, uint256 redeemTokens) external returns (uint256) { checkProtocolPauseState(); checkActionPauseState(vToken, Action.REDEEM); - uint allowed = redeemAllowedInternal(vToken, redeemer, redeemTokens); - if (allowed != uint(Error.NO_ERROR)) { + uint256 allowed = redeemAllowedInternal(vToken, redeemer, redeemTokens); + if (allowed != uint256(Error.NO_ERROR)) { return allowed; } @@ -71,7 +71,7 @@ contract PolicyFacet is XVSRewardsHelper { updateVenusSupplyIndex(vToken); distributeSupplierVenus(vToken, redeemer); - return uint(Error.NO_ERROR); + return uint256(Error.NO_ERROR); } /** @@ -82,7 +82,7 @@ contract PolicyFacet is XVSRewardsHelper { * @param redeemTokens The number of tokens being redeemed */ // solhint-disable-next-line no-unused-vars - function redeemVerify(address vToken, address redeemer, uint redeemAmount, uint redeemTokens) external pure { + function redeemVerify(address vToken, address redeemer, uint256 redeemAmount, uint256 redeemTokens) external pure { require(redeemTokens != 0 || redeemAmount == 0, "redeemTokens zero"); } @@ -93,7 +93,7 @@ contract PolicyFacet is XVSRewardsHelper { * @param borrowAmount The amount of underlying the account would borrow * @return 0 if the borrow is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) */ - function borrowAllowed(address vToken, address borrower, uint borrowAmount) external returns (uint) { + function borrowAllowed(address vToken, address borrower, uint256 borrowAmount) external returns (uint256) { // Pausing is a very serious situation - we revert to sound the alarms checkProtocolPauseState(); checkActionPauseState(vToken, Action.BORROW); @@ -107,32 +107,32 @@ contract PolicyFacet is XVSRewardsHelper { // attempt to add borrower to the market Error err = addToMarketInternal(VToken(vToken), borrower); if (err != Error.NO_ERROR) { - return uint(err); + return uint256(err); } } if (oracle.getUnderlyingPrice(VToken(vToken)) == 0) { - return uint(Error.PRICE_ERROR); + return uint256(Error.PRICE_ERROR); } - uint borrowCap = borrowCaps[vToken]; + uint256 borrowCap = borrowCaps[vToken]; // Borrow cap of 0 corresponds to unlimited borrowing if (borrowCap != 0) { - uint nextTotalBorrows = add_(VToken(vToken).totalBorrows(), borrowAmount); + uint256 nextTotalBorrows = add_(VToken(vToken).totalBorrows(), borrowAmount); require(nextTotalBorrows < borrowCap, "market borrow cap reached"); } - (Error err, , uint shortfall) = getHypotheticalAccountLiquidityInternal( + (Error err, , uint256 shortfall) = getHypotheticalAccountLiquidityInternal( borrower, VToken(vToken), 0, borrowAmount ); if (err != Error.NO_ERROR) { - return uint(err); + return uint256(err); } if (shortfall != 0) { - return uint(Error.INSUFFICIENT_LIQUIDITY); + return uint256(Error.INSUFFICIENT_LIQUIDITY); } // Keep the flywheel moving @@ -140,7 +140,7 @@ contract PolicyFacet is XVSRewardsHelper { updateVenusBorrowIndex(vToken, borrowIndex); distributeBorrowerVenus(vToken, borrower, borrowIndex); - return uint(Error.NO_ERROR); + return uint256(Error.NO_ERROR); } /** @@ -150,7 +150,7 @@ contract PolicyFacet is XVSRewardsHelper { * @param borrowAmount The amount of the underlying asset requested to borrow */ // solhint-disable-next-line no-unused-vars - function borrowVerify(address vToken, address borrower, uint borrowAmount) external {} + function borrowVerify(address vToken, address borrower, uint256 borrowAmount) external {} /** * @notice Checks if the account should be allowed to repay a borrow in the given market @@ -166,8 +166,8 @@ contract PolicyFacet is XVSRewardsHelper { address payer, address borrower, // solhint-disable-next-line no-unused-vars - uint repayAmount - ) external returns (uint) { + uint256 repayAmount + ) external returns (uint256) { checkProtocolPauseState(); checkActionPauseState(vToken, Action.REPAY); ensureListed(markets[vToken]); @@ -177,7 +177,7 @@ contract PolicyFacet is XVSRewardsHelper { updateVenusBorrowIndex(vToken, borrowIndex); distributeBorrowerVenus(vToken, borrower, borrowIndex); - return uint(Error.NO_ERROR); + return uint256(Error.NO_ERROR); } /** @@ -191,8 +191,8 @@ contract PolicyFacet is XVSRewardsHelper { address vToken, address payer, address borrower, - uint actualRepayAmount, - uint borrowerIndex + uint256 actualRepayAmount, + uint256 borrowerIndex ) external {} /** @@ -208,15 +208,15 @@ contract PolicyFacet is XVSRewardsHelper { address vTokenCollateral, address liquidator, address borrower, - uint repayAmount - ) external view returns (uint) { + uint256 repayAmount + ) external view returns (uint256) { checkProtocolPauseState(); // if we want to pause liquidating to vTokenCollateral, we should pause seizing checkActionPauseState(vTokenBorrowed, Action.LIQUIDATE); if (liquidatorContract != address(0) && liquidator != liquidatorContract) { - return uint(Error.UNAUTHORIZED); + return uint256(Error.UNAUTHORIZED); } ensureListed(markets[vTokenCollateral]); @@ -225,16 +225,16 @@ contract PolicyFacet is XVSRewardsHelper { } /* The borrower must have shortfall in order to be liquidatable */ - (Error err, , uint shortfall) = getHypotheticalAccountLiquidityInternal(borrower, VToken(address(0)), 0, 0); + (Error err, , uint256 shortfall) = getHypotheticalAccountLiquidityInternal(borrower, VToken(address(0)), 0, 0); if (err != Error.NO_ERROR) { - return uint(err); + return uint256(err); } if (shortfall == 0) { - return uint(Error.INSUFFICIENT_SHORTFALL); + return uint256(Error.INSUFFICIENT_SHORTFALL); } /* The liquidator may not repay more than what is allowed by the closeFactor */ - uint borrowBalance; + uint256 borrowBalance; if (address(vTokenBorrowed) != address(vaiController)) { borrowBalance = VToken(vTokenBorrowed).borrowBalanceStored(borrower); } else { @@ -242,10 +242,10 @@ contract PolicyFacet is XVSRewardsHelper { } //-- maxClose = multipy of closeFactorMantissa and borrowBalance if (repayAmount > mul_ScalarTruncate(Exp({ mantissa: closeFactorMantissa }), borrowBalance)) { - return uint(Error.TOO_MUCH_REPAY); + return uint256(Error.TOO_MUCH_REPAY); } - return uint(Error.NO_ERROR); + return uint256(Error.NO_ERROR); } /** @@ -262,8 +262,8 @@ contract PolicyFacet is XVSRewardsHelper { address vTokenCollateral, address liquidator, address borrower, - uint actualRepayAmount, - uint seizeTokens + uint256 actualRepayAmount, + uint256 seizeTokens ) external {} /** @@ -279,8 +279,8 @@ contract PolicyFacet is XVSRewardsHelper { address vTokenBorrowed, address liquidator, address borrower, - uint seizeTokens // solhint-disable-line no-unused-vars - ) external returns (uint) { + uint256 seizeTokens // solhint-disable-line no-unused-vars + ) external returns (uint256) { // Pausing is a very serious situation - we revert to sound the alarms checkProtocolPauseState(); checkActionPauseState(vTokenCollateral, Action.SEIZE); @@ -291,7 +291,7 @@ contract PolicyFacet is XVSRewardsHelper { ensureListed(market); if (!market.accountMembership[borrower]) { - return uint(Error.MARKET_NOT_COLLATERAL); + return uint256(Error.MARKET_NOT_COLLATERAL); } if (address(vTokenBorrowed) != address(vaiController)) { @@ -299,7 +299,7 @@ contract PolicyFacet is XVSRewardsHelper { } if (VToken(vTokenCollateral).comptroller() != VToken(vTokenBorrowed).comptroller()) { - return uint(Error.COMPTROLLER_MISMATCH); + return uint256(Error.COMPTROLLER_MISMATCH); } // Keep the flywheel moving @@ -307,7 +307,7 @@ contract PolicyFacet is XVSRewardsHelper { distributeSupplierVenus(vTokenCollateral, borrower); distributeSupplierVenus(vTokenCollateral, liquidator); - return uint(Error.NO_ERROR); + return uint256(Error.NO_ERROR); } /** @@ -324,7 +324,7 @@ contract PolicyFacet is XVSRewardsHelper { address vTokenBorrowed, address liquidator, address borrower, - uint seizeTokens + uint256 seizeTokens ) external {} /** @@ -335,15 +335,20 @@ contract PolicyFacet is XVSRewardsHelper { * @param transferTokens The number of vTokens to transfer * @return 0 if the transfer is allowed, otherwise a semi-opaque error code (See ErrorReporter.sol) */ - function transferAllowed(address vToken, address src, address dst, uint transferTokens) external returns (uint) { + function transferAllowed( + address vToken, + address src, + address dst, + uint256 transferTokens + ) external returns (uint256) { // Pausing is a very serious situation - we revert to sound the alarms checkProtocolPauseState(); checkActionPauseState(vToken, Action.TRANSFER); // Currently the only consideration is whether or not // the src is allowed to redeem this many tokens - uint allowed = redeemAllowedInternal(vToken, src, transferTokens); - if (allowed != uint(Error.NO_ERROR)) { + uint256 allowed = redeemAllowedInternal(vToken, src, transferTokens); + if (allowed != uint256(Error.NO_ERROR)) { return allowed; } @@ -352,7 +357,7 @@ contract PolicyFacet is XVSRewardsHelper { distributeSupplierVenus(vToken, src); distributeSupplierVenus(vToken, dst); - return uint(Error.NO_ERROR); + return uint256(Error.NO_ERROR); } /** @@ -363,7 +368,7 @@ contract PolicyFacet is XVSRewardsHelper { * @param transferTokens The number of vTokens to transfer */ // solhint-disable-next-line no-unused-vars - function transferVerify(address vToken, address src, address dst, uint transferTokens) external {} + function transferVerify(address vToken, address src, address dst, uint256 transferTokens) external {} /** * @notice Determine the current account liquidity wrt collateral requirements @@ -371,15 +376,15 @@ contract PolicyFacet is XVSRewardsHelper { account liquidity in excess of collateral requirements, * account shortfall below collateral requirements) */ - function getAccountLiquidity(address account) external view returns (uint, uint, uint) { - (Error err, uint liquidity, uint shortfall) = getHypotheticalAccountLiquidityInternal( + function getAccountLiquidity(address account) external view returns (uint256, uint256, uint256) { + (Error err, uint256 liquidity, uint256 shortfall) = getHypotheticalAccountLiquidityInternal( account, VToken(address(0)), 0, 0 ); - return (uint(err), liquidity, shortfall); + return (uint256(err), liquidity, shortfall); } /** @@ -395,16 +400,16 @@ contract PolicyFacet is XVSRewardsHelper { function getHypotheticalAccountLiquidity( address account, address vTokenModify, - uint redeemTokens, - uint borrowAmount - ) external view returns (uint, uint, uint) { - (Error err, uint liquidity, uint shortfall) = getHypotheticalAccountLiquidityInternal( + uint256 redeemTokens, + uint256 borrowAmount + ) external view returns (uint256, uint256, uint256) { + (Error err, uint256 liquidity, uint256 shortfall) = getHypotheticalAccountLiquidityInternal( account, VToken(vTokenModify), redeemTokens, borrowAmount ); - return (uint(err), liquidity, shortfall); + return (uint256(err), liquidity, shortfall); } // setter functionality @@ -416,24 +421,24 @@ contract PolicyFacet is XVSRewardsHelper { */ function _setVenusSpeeds( VToken[] calldata vTokens, - uint[] calldata supplySpeeds, - uint[] calldata borrowSpeeds + uint256[] calldata supplySpeeds, + uint256[] calldata borrowSpeeds ) external { ensureAdminOr(comptrollerImplementation); - uint numTokens = vTokens.length; + uint256 numTokens = vTokens.length; require( numTokens == supplySpeeds.length && numTokens == borrowSpeeds.length, "Comptroller::_setVenusSpeeds invalid input" ); - for (uint i; i < numTokens; ++i) { + for (uint256 i; i < numTokens; ++i) { ensureNonzeroAddress(address(vTokens[i])); setVenusSpeedInternal(vTokens[i], supplySpeeds[i], borrowSpeeds[i]); } } - function setVenusSpeedInternal(VToken vToken, uint supplySpeed, uint borrowSpeed) internal { + function setVenusSpeedInternal(VToken vToken, uint256 supplySpeed, uint256 borrowSpeed) internal { ensureListed(markets[address(vToken)]); if (venusSupplySpeeds[address(vToken)] != supplySpeed) { diff --git a/contracts/Comptroller/Diamond/facets/RewardFacet.sol b/contracts/Comptroller/Diamond/facets/RewardFacet.sol index 4bd866e05..6702eb6d9 100644 --- a/contracts/Comptroller/Diamond/facets/RewardFacet.sol +++ b/contracts/Comptroller/Diamond/facets/RewardFacet.sol @@ -64,7 +64,12 @@ contract RewardFacet is XVSRewardsHelper { * @param collateral Whether or not we will use user's venus reward as collateral to pay off the debt * @return The amount of XVS which was NOT transferred to the user */ - function grantXVSInternal(address user, uint amount, uint shortfall, bool collateral) internal returns (uint) { + function grantXVSInternal( + address user, + uint256 amount, + uint256 shortfall, + bool collateral + ) internal returns (uint256) { // If the user is blacklisted, they can't get XVS rewards require( user != 0xEF044206Db68E40520BfA82D45419d498b4bc7Bf && @@ -92,7 +97,7 @@ contract RewardFacet is XVSRewardsHelper { IBEP20(getXVSAddress()).safeApprove(getXVSVTokenAddress(), 0); IBEP20(getXVSAddress()).safeApprove(getXVSVTokenAddress(), amount); require( - VBep20Interface(getXVSVTokenAddress()).mintBehalf(user, amount) == uint(Error.NO_ERROR), + VBep20Interface(getXVSVTokenAddress()).mintBehalf(user, amount) == uint256(Error.NO_ERROR), "mint behalf error during collateralize xvs" ); @@ -108,9 +113,9 @@ contract RewardFacet is XVSRewardsHelper { * @param recipient The address of the recipient to transfer XVS to * @param amount The amount of XVS to (possibly) transfer */ - function _grantXVS(address recipient, uint amount) external { + function _grantXVS(address recipient, uint256 amount) external { ensureAdminOr(comptrollerImplementation); - uint amountLeft = grantXVSInternal(recipient, amount, 0, false); + uint256 amountLeft = grantXVSInternal(recipient, amount, 0, false); require(amountLeft == 0, "insufficient xvs for grant"); emit VenusGranted(recipient, amount); } @@ -138,10 +143,10 @@ contract RewardFacet is XVSRewardsHelper { bool suppliers, bool collateral ) public { - uint j; + uint256 j; uint256 holdersLength = holders.length; uint256 vTokensLength = vTokens.length; - for (uint i; i < vTokensLength; ++i) { + for (uint256 i; i < vTokensLength; ++i) { VToken vToken = vTokens[i]; ensureListed(markets[address(vToken)]); if (borrowers) { @@ -163,7 +168,7 @@ contract RewardFacet is XVSRewardsHelper { address holder = holders[j]; // If there is a positive shortfall, the XVS reward is accrued, // but won't be granted to this holder - (, , uint shortfall) = getHypotheticalAccountLiquidityInternal(holder, VToken(address(0)), 0, 0); + (, , uint256 shortfall) = getHypotheticalAccountLiquidityInternal(holder, VToken(address(0)), 0, 0); uint256 value = venusAccrued[holder]; venusAccrued[holder] = 0; diff --git a/contracts/Comptroller/Diamond/facets/SetterFacet.sol b/contracts/Comptroller/Diamond/facets/SetterFacet.sol index 75964438c..5448b053e 100644 --- a/contracts/Comptroller/Diamond/facets/SetterFacet.sol +++ b/contracts/Comptroller/Diamond/facets/SetterFacet.sol @@ -10,15 +10,19 @@ import { FacetBase, VToken, ComptrollerErrorReporter, ExponentialNoError } from /** * @dev This facet contains all the setters for the states */ -contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase { +contract SetterFacet is ComptrollerErrorReporter, FacetBase { /// @notice Emitted when close factor is changed by admin - event NewCloseFactor(uint oldCloseFactorMantissa, uint newCloseFactorMantissa); + event NewCloseFactor(uint256 oldCloseFactorMantissa, uint256 newCloseFactorMantissa); /// @notice Emitted when a collateral factor is changed by admin - event NewCollateralFactor(VToken vToken, uint oldCollateralFactorMantissa, uint newCollateralFactorMantissa); + event NewCollateralFactor( + VToken indexed vToken, + uint256 oldCollateralFactorMantissa, + uint256 newCollateralFactorMantissa + ); /// @notice Emitted when liquidation incentive is changed by admin - event NewLiquidationIncentive(uint oldLiquidationIncentiveMantissa, uint newLiquidationIncentiveMantissa); + event NewLiquidationIncentive(uint256 oldLiquidationIncentiveMantissa, uint256 newLiquidationIncentiveMantissa); /// @notice Emitted when price oracle is changed event NewPriceOracle(PriceOracle oldPriceOracle, PriceOracle newPriceOracle); @@ -30,7 +34,7 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase event NewVAIController(VAIControllerInterface oldVAIController, VAIControllerInterface newVAIController); /// @notice Emitted when VAI mint rate is changed by admin - event NewVAIMintRate(uint oldVAIMintRate, uint newVAIMintRate); + event NewVAIMintRate(uint256 oldVAIMintRate, uint256 newVAIMintRate); /// @notice Emitted when protocol state is changed by admin event ActionProtocolPaused(bool state); @@ -42,7 +46,7 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase event NewTreasuryAddress(address oldTreasuryAddress, address newTreasuryAddress); /// @notice Emitted when treasury percent is changed - event NewTreasuryPercent(uint oldTreasuryPercent, uint newTreasuryPercent); + event NewTreasuryPercent(uint256 oldTreasuryPercent, uint256 newTreasuryPercent); /// @notice Emitted when liquidator adress is changed event NewLiquidatorContract(address oldLiquidatorContract, address newLiquidatorContract); @@ -66,7 +70,7 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase event NewVAIVaultInfo(address indexed vault_, uint256 releaseStartBlock_, uint256 releaseInterval_); /// @notice Emitted when Venus VAI Vault rate is changed - event NewVenusVAIVaultRate(uint oldVenusVAIVaultRate, uint newVenusVAIVaultRate); + event NewVenusVAIVaultRate(uint256 oldVenusVAIVaultRate, uint256 newVenusVAIVaultRate); /** * @notice Compare two addresses to ensure they are different @@ -91,11 +95,11 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase /** * @notice Sets a new price oracle for the comptroller * @dev Admin function to set a new price oracle - * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) + * @return uint256 0=success, otherwise a failure (see ErrorReporter.sol for details) */ function _setPriceOracle( PriceOracle newOracle - ) external compareAddress(address(oracle), address(newOracle)) returns (uint) { + ) external compareAddress(address(oracle), address(newOracle)) returns (uint256) { // Check caller is admin ensureAdmin(); ensureNonzeroAddress(address(newOracle)); @@ -109,38 +113,38 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase // Emit NewPriceOracle(oldOracle, newOracle) emit NewPriceOracle(oldOracle, newOracle); - return uint(Error.NO_ERROR); + return uint256(Error.NO_ERROR); } /** * @notice Sets the closeFactor used when liquidating borrows * @dev Admin function to set closeFactor * @param newCloseFactorMantissa New close factor, scaled by 1e18 - * @return uint 0=success, otherwise will revert + * @return uint256 0=success, otherwise will revert */ function _setCloseFactor( - uint newCloseFactorMantissa - ) external compareValue(closeFactorMantissa, newCloseFactorMantissa) returns (uint) { + uint256 newCloseFactorMantissa + ) external compareValue(closeFactorMantissa, newCloseFactorMantissa) returns (uint256) { // Check caller is admin ensureAdmin(); - uint oldCloseFactorMantissa = closeFactorMantissa; + uint256 oldCloseFactorMantissa = closeFactorMantissa; closeFactorMantissa = newCloseFactorMantissa; emit NewCloseFactor(oldCloseFactorMantissa, newCloseFactorMantissa); - return uint(Error.NO_ERROR); + return uint256(Error.NO_ERROR); } /** * @notice Sets the address of the access control of this contract * @dev Admin function to set the access control address * @param newAccessControlAddress New address for the access control - * @return uint 0=success, otherwise will revert + * @return uint256 0=success, otherwise will revert */ function _setAccessControl( address newAccessControlAddress - ) external compareAddress(accessControl, newAccessControlAddress) returns (uint) { + ) external compareAddress(accessControl, newAccessControlAddress) returns (uint256) { // Check caller is admin ensureAdmin(); ensureNonzeroAddress(newAccessControlAddress); @@ -150,7 +154,7 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase accessControl = newAccessControlAddress; emit NewAccessControl(oldAccessControlAddress, newAccessControlAddress); - return uint(Error.NO_ERROR); + return uint256(Error.NO_ERROR); } /** @@ -158,15 +162,15 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase * @dev Restricted function to set per-market collateralFactor * @param vToken The market to set the factor on * @param newCollateralFactorMantissa The new collateral factor, scaled by 1e18 - * @return uint 0=success, otherwise a failure. (See ErrorReporter for details) + * @return uint256 0=success, otherwise a failure. (See ErrorReporter for details) */ function _setCollateralFactor( VToken vToken, - uint newCollateralFactorMantissa + uint256 newCollateralFactorMantissa ) external compareValue(markets[address(vToken)].collateralFactorMantissa, newCollateralFactorMantissa) - returns (uint) + returns (uint256) { // Check caller is allowed by access control manager ensureAllowed("_setCollateralFactor(address,uint256)"); @@ -179,7 +183,7 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase Exp memory newCollateralFactorExp = Exp({ mantissa: newCollateralFactorMantissa }); //-- Check collateral factor <= 0.9 - Exp memory highLimit = Exp({ mantissa: collateralFactorMaxMantissa }); + Exp memory highLimit = Exp({ mantissa: COLLATERAL_FACTOR_MAX_MANTISSA }); if (lessThanExp(highLimit, newCollateralFactorExp)) { return fail(Error.INVALID_COLLATERAL_FACTOR, FailureInfo.SET_COLLATERAL_FACTOR_VALIDATION); } @@ -190,37 +194,37 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase } // Set market's collateral factor to new collateral factor, remember old value - uint oldCollateralFactorMantissa = market.collateralFactorMantissa; + uint256 oldCollateralFactorMantissa = market.collateralFactorMantissa; market.collateralFactorMantissa = newCollateralFactorMantissa; // Emit event with asset, old collateral factor, and new collateral factor emit NewCollateralFactor(vToken, oldCollateralFactorMantissa, newCollateralFactorMantissa); - return uint(Error.NO_ERROR); + return uint256(Error.NO_ERROR); } /** * @notice Sets liquidationIncentive * @dev Admin function to set liquidationIncentive * @param newLiquidationIncentiveMantissa New liquidationIncentive scaled by 1e18 - * @return uint 0=success, otherwise a failure. (See ErrorReporter for details) + * @return uint256 0=success, otherwise a failure. (See ErrorReporter for details) */ function _setLiquidationIncentive( - uint newLiquidationIncentiveMantissa - ) external compareValue(liquidationIncentiveMantissa, newLiquidationIncentiveMantissa) returns (uint) { + uint256 newLiquidationIncentiveMantissa + ) external compareValue(liquidationIncentiveMantissa, newLiquidationIncentiveMantissa) returns (uint256) { ensureAllowed("_setLiquidationIncentive(uint256)"); require(newLiquidationIncentiveMantissa >= 1e18, "incentive must be over 1e18"); // Save current value for use in log - uint oldLiquidationIncentiveMantissa = liquidationIncentiveMantissa; + uint256 oldLiquidationIncentiveMantissa = liquidationIncentiveMantissa; // Set liquidation incentive to new incentive liquidationIncentiveMantissa = newLiquidationIncentiveMantissa; // Emit event with old incentive, new incentive emit NewLiquidationIncentive(oldLiquidationIncentiveMantissa, newLiquidationIncentiveMantissa); - return uint(Error.NO_ERROR); + return uint256(Error.NO_ERROR); } /** @@ -241,11 +245,11 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase /** * @notice Admin function to change the Pause Guardian * @param newPauseGuardian The address of the new Pause Guardian - * @return uint 0=success, otherwise a failure. (See enum Error for details) + * @return uint256 0=success, otherwise a failure. (See enum Error for details) */ function _setPauseGuardian( address newPauseGuardian - ) external compareAddress(pauseGuardian, newPauseGuardian) returns (uint) { + ) external compareAddress(pauseGuardian, newPauseGuardian) returns (uint256) { ensureAdmin(); ensureNonzeroAddress(newPauseGuardian); @@ -257,7 +261,7 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase // Emit NewPauseGuardian(OldPauseGuardian, NewPauseGuardian) emit NewPauseGuardian(oldPauseGuardian, newPauseGuardian); - return uint(Error.NO_ERROR); + return uint256(Error.NO_ERROR); } /** @@ -266,15 +270,15 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase * @param vTokens The addresses of the markets (tokens) to change the borrow caps for * @param newBorrowCaps The new borrow cap values in underlying to be set. A value of 0 corresponds to unlimited borrowing */ - function _setMarketBorrowCaps(VToken[] calldata vTokens, uint[] calldata newBorrowCaps) external { + function _setMarketBorrowCaps(VToken[] calldata vTokens, uint256[] calldata newBorrowCaps) external { ensureAllowed("_setMarketBorrowCaps(address[],uint256[])"); - uint numMarkets = vTokens.length; - uint numBorrowCaps = newBorrowCaps.length; + uint256 numMarkets = vTokens.length; + uint256 numBorrowCaps = newBorrowCaps.length; require(numMarkets != 0 && numMarkets == numBorrowCaps, "invalid input"); - for (uint i; i < numMarkets; ++i) { + for (uint256 i; i < numMarkets; ++i) { borrowCaps[address(vTokens[i])] = newBorrowCaps[i]; emit NewBorrowCap(vTokens[i], newBorrowCaps[i]); } @@ -289,12 +293,12 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase function _setMarketSupplyCaps(VToken[] calldata vTokens, uint256[] calldata newSupplyCaps) external { ensureAllowed("_setMarketSupplyCaps(address[],uint256[])"); - uint numMarkets = vTokens.length; - uint numSupplyCaps = newSupplyCaps.length; + uint256 numMarkets = vTokens.length; + uint256 numSupplyCaps = newSupplyCaps.length; require(numMarkets != 0 && numMarkets == numSupplyCaps, "invalid input"); - for (uint i; i < numMarkets; ++i) { + for (uint256 i; i < numMarkets; ++i) { supplyCaps[address(vTokens[i])] = newSupplyCaps[i]; emit NewSupplyCap(vTokens[i], newSupplyCaps[i]); } @@ -324,8 +328,8 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase uint256 numMarkets = markets_.length; uint256 numActions = actions_.length; - for (uint marketIdx; marketIdx < numMarkets; ++marketIdx) { - for (uint actionIdx; actionIdx < numActions; ++actionIdx) { + for (uint256 marketIdx; marketIdx < numMarkets; ++marketIdx) { + for (uint256 actionIdx; actionIdx < numActions; ++actionIdx) { setActionPausedInternal(markets_[marketIdx], actions_[actionIdx], paused_); } } @@ -339,18 +343,18 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase */ function setActionPausedInternal(address market, Action action, bool paused) internal { ensureListed(markets[market]); - _actionPaused[market][uint(action)] = paused; + _actionPaused[market][uint256(action)] = paused; emit ActionPausedMarket(VToken(market), action, paused); } /** * @notice Sets a new VAI controller * @dev Admin function to set a new VAI controller - * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) + * @return uint256 0=success, otherwise a failure (see ErrorReporter.sol for details) */ function _setVAIController( VAIControllerInterface vaiController_ - ) external compareAddress(address(vaiController), address(vaiController_)) returns (uint) { + ) external compareAddress(address(vaiController), address(vaiController_)) returns (uint256) { // Check caller is admin ensureAdmin(); ensureNonzeroAddress(address(vaiController_)); @@ -359,22 +363,24 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase vaiController = vaiController_; emit NewVAIController(oldVaiController, vaiController_); - return uint(Error.NO_ERROR); + return uint256(Error.NO_ERROR); } /** * @notice Set the VAI mint rate * @param newVAIMintRate The new VAI mint rate to be set - * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) + * @return uint256 0=success, otherwise a failure (see ErrorReporter.sol for details) */ - function _setVAIMintRate(uint newVAIMintRate) external compareValue(vaiMintRate, newVAIMintRate) returns (uint) { + function _setVAIMintRate( + uint256 newVAIMintRate + ) external compareValue(vaiMintRate, newVAIMintRate) returns (uint256) { // Check caller is admin ensureAdmin(); - uint oldVAIMintRate = vaiMintRate; + uint256 oldVAIMintRate = vaiMintRate; vaiMintRate = newVAIMintRate; emit NewVAIMintRate(oldVAIMintRate, newVAIMintRate); - return uint(Error.NO_ERROR); + return uint256(Error.NO_ERROR); } /** @@ -383,7 +389,7 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase * @param amount The amount of VAI to set to the account * @return The number of minted VAI by `owner` */ - function setMintedVAIOf(address owner, uint amount) external returns (uint) { + function setMintedVAIOf(address owner, uint256 amount) external returns (uint256) { checkProtocolPauseState(); // Pausing is a very serious situation - we revert to sound the alarms @@ -393,7 +399,7 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase return fail(Error.REJECTION, FailureInfo.SET_MINTED_VAI_REJECTION); } mintedVAIs[owner] = amount; - return uint(Error.NO_ERROR); + return uint256(Error.NO_ERROR); } /** @@ -401,13 +407,13 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase * @param newTreasuryGuardian The new address of the treasury guardian to be set * @param newTreasuryAddress The new address of the treasury to be set * @param newTreasuryPercent The new treasury percent to be set - * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) + * @return uint256 0=success, otherwise a failure (see ErrorReporter.sol for details) */ function _setTreasuryData( address newTreasuryGuardian, address newTreasuryAddress, - uint newTreasuryPercent - ) external returns (uint) { + uint256 newTreasuryPercent + ) external returns (uint256) { // Check caller is admin ensureAdminOr(treasuryGuardian); @@ -417,7 +423,7 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase address oldTreasuryGuardian = treasuryGuardian; address oldTreasuryAddress = treasuryAddress; - uint oldTreasuryPercent = treasuryPercent; + uint256 oldTreasuryPercent = treasuryPercent; treasuryGuardian = newTreasuryGuardian; treasuryAddress = newTreasuryAddress; @@ -427,7 +433,7 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase emit NewTreasuryAddress(oldTreasuryAddress, newTreasuryAddress); emit NewTreasuryPercent(oldTreasuryPercent, newTreasuryPercent); - return uint(Error.NO_ERROR); + return uint256(Error.NO_ERROR); } /*** Venus Distribution ***/ @@ -435,18 +441,18 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase /** * @dev Set ComptrollerLens contract address * @param comptrollerLens_ The new ComptrollerLens contract address to be set - * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) + * @return uint256 0=success, otherwise a failure (see ErrorReporter.sol for details) */ function _setComptrollerLens( ComptrollerLensInterface comptrollerLens_ - ) external compareAddress(address(comptrollerLens), address(comptrollerLens_)) returns (uint) { + ) external compareAddress(address(comptrollerLens), address(comptrollerLens_)) returns (uint256) { ensureAdmin(); ensureNonzeroAddress(address(comptrollerLens_)); address oldComptrollerLens = address(comptrollerLens); comptrollerLens = comptrollerLens_; emit NewComptrollerLens(oldComptrollerLens, address(comptrollerLens)); - return uint(Error.NO_ERROR); + return uint256(Error.NO_ERROR); } /** @@ -454,13 +460,13 @@ contract SetterFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase * @param venusVAIVaultRate_ The amount of XVS wei per block to distribute to VAI Vault */ function _setVenusVAIVaultRate( - uint venusVAIVaultRate_ + uint256 venusVAIVaultRate_ ) external compareValue(venusVAIVaultRate, venusVAIVaultRate_) { ensureAdmin(); if (vaiVaultAddress != address(0)) { releaseToVault(); } - uint oldVenusVAIVaultRate = venusVAIVaultRate; + uint256 oldVenusVAIVaultRate = venusVAIVaultRate; venusVAIVaultRate = venusVAIVaultRate_; emit NewVenusVAIVaultRate(oldVenusVAIVaultRate, venusVAIVaultRate_); } diff --git a/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol b/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol index a4b6cc646..2a3139121 100644 --- a/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol +++ b/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol @@ -12,16 +12,16 @@ contract XVSRewardsHelper is ComptrollerErrorReporter, FacetBase { event DistributedBorrowerVenus( VToken indexed vToken, address indexed borrower, - uint venusDelta, - uint venusBorrowIndex + uint256 venusDelta, + uint256 venusBorrowIndex ); /// @notice Emitted when XVS is distributed to a supplier event DistributedSupplierVenus( VToken indexed vToken, address indexed supplier, - uint venusDelta, - uint venusSupplyIndex + uint256 venusDelta, + uint256 venusSupplyIndex ); /** @@ -30,12 +30,12 @@ contract XVSRewardsHelper is ComptrollerErrorReporter, FacetBase { */ function updateVenusBorrowIndex(address vToken, ExponentialNoError.Exp memory marketBorrowIndex) internal { VenusMarketState storage borrowState = venusBorrowState[vToken]; - uint borrowSpeed = venusBorrowSpeeds[vToken]; - uint blockNumber = getBlockNumber(); - uint deltaBlocks = sub_(uint(blockNumber), uint(borrowState.block)); + uint256 borrowSpeed = venusBorrowSpeeds[vToken]; + uint256 blockNumber = getBlockNumber(); + uint256 deltaBlocks = sub_(uint256(blockNumber), uint256(borrowState.block)); if (deltaBlocks != 0 && borrowSpeed != 0) { - uint borrowAmount = div_(VToken(vToken).totalBorrows(), marketBorrowIndex); - uint venusAccrued = mul_(deltaBlocks, borrowSpeed); + uint256 borrowAmount = div_(VToken(vToken).totalBorrows(), marketBorrowIndex); + uint256 venusAccrued = mul_(deltaBlocks, borrowSpeed); Double memory ratio = borrowAmount != 0 ? fraction(venusAccrued, borrowAmount) : Double({ mantissa: 0 }); borrowState.index = safe224( add_(Double({ mantissa: borrowState.index }), ratio).mantissa, @@ -53,14 +53,14 @@ contract XVSRewardsHelper is ComptrollerErrorReporter, FacetBase { */ function updateVenusSupplyIndex(address vToken) internal { VenusMarketState storage supplyState = venusSupplyState[vToken]; - uint supplySpeed = venusSupplySpeeds[vToken]; - uint blockNumber = getBlockNumber(); + uint256 supplySpeed = venusSupplySpeeds[vToken]; + uint256 blockNumber = getBlockNumber(); - uint deltaBlocks = sub_(uint(blockNumber), uint(supplyState.block)); + uint256 deltaBlocks = sub_(uint256(blockNumber), uint256(supplyState.block)); if (deltaBlocks != 0 && supplySpeed != 0) { - uint supplyTokens = VToken(vToken).totalSupply(); - uint venusAccrued = mul_(deltaBlocks, supplySpeed); - Double memory ratio = supplyTokens != 0 ? fraction(venusAccrued, supplyTokens) : Double({ mantissa: 0 }); + uint256 supplyTokens = VToken(vToken).totalSupply(); + uint256 accruedVenus = mul_(deltaBlocks, supplySpeed); + Double memory ratio = supplyTokens != 0 ? fraction(accruedVenus, supplyTokens) : Double({ mantissa: 0 }); supplyState.index = safe224( add_(Double({ mantissa: supplyState.index }), ratio).mantissa, "new index exceeds 224 bits" @@ -80,8 +80,8 @@ contract XVSRewardsHelper is ComptrollerErrorReporter, FacetBase { if (address(vaiVaultAddress) != address(0)) { releaseToVault(); } - uint supplyIndex = venusSupplyState[vToken].index; - uint supplierIndex = venusSupplierIndex[vToken][supplier]; + uint256 supplyIndex = venusSupplyState[vToken].index; + uint256 supplierIndex = venusSupplierIndex[vToken][supplier]; // Update supplier's index to the current index since we are distributing accrued XVS venusSupplierIndex[vToken][supplier] = supplyIndex; if (supplierIndex == 0 && supplyIndex >= venusInitialIndex) { @@ -93,7 +93,7 @@ contract XVSRewardsHelper is ComptrollerErrorReporter, FacetBase { // Calculate change in the cumulative sum of the XVS per vToken accrued Double memory deltaIndex = Double({ mantissa: sub_(supplyIndex, supplierIndex) }); // Multiply of supplierTokens and supplierDelta - uint supplierDelta = mul_(VToken(vToken).balanceOf(supplier), deltaIndex); + uint256 supplierDelta = mul_(VToken(vToken).balanceOf(supplier), deltaIndex); // Addition of supplierAccrued and supplierDelta venusAccrued[supplier] = add_(venusAccrued[supplier], supplierDelta); emit DistributedSupplierVenus(VToken(vToken), supplier, supplierDelta, supplyIndex); @@ -113,8 +113,8 @@ contract XVSRewardsHelper is ComptrollerErrorReporter, FacetBase { if (address(vaiVaultAddress) != address(0)) { releaseToVault(); } - uint borrowIndex = venusBorrowState[vToken].index; - uint borrowerIndex = venusBorrowerIndex[vToken][borrower]; + uint256 borrowIndex = venusBorrowState[vToken].index; + uint256 borrowerIndex = venusBorrowerIndex[vToken][borrower]; // Update borrowers's index to the current index since we are distributing accrued XVS venusBorrowerIndex[vToken][borrower] = borrowIndex; if (borrowerIndex == 0 && borrowIndex >= venusInitialIndex) { @@ -125,7 +125,7 @@ contract XVSRewardsHelper is ComptrollerErrorReporter, FacetBase { } // Calculate change in the cumulative sum of the XVS per borrowed unit accrued Double memory deltaIndex = Double({ mantissa: sub_(borrowIndex, borrowerIndex) }); - uint borrowerDelta = mul_(div_(VToken(vToken).borrowBalanceStored(borrower), marketBorrowIndex), deltaIndex); + uint256 borrowerDelta = mul_(div_(VToken(vToken).borrowBalanceStored(borrower), marketBorrowIndex), deltaIndex); venusAccrued[borrower] = add_(venusAccrued[borrower], borrowerDelta); emit DistributedBorrowerVenus(VToken(vToken), borrower, borrowerDelta, borrowIndex); } diff --git a/contracts/Comptroller/Diamond/interfaces/IMarketFacet.sol b/contracts/Comptroller/Diamond/interfaces/IMarketFacet.sol index 13b71af35..684d76f21 100644 --- a/contracts/Comptroller/Diamond/interfaces/IMarketFacet.sol +++ b/contracts/Comptroller/Diamond/interfaces/IMarketFacet.sol @@ -10,21 +10,21 @@ interface IMarketFacet { function liquidateCalculateSeizeTokens( address vTokenBorrowed, address vTokenCollateral, - uint actualRepayAmount - ) external view returns (uint, uint); + uint256 actualRepayAmount + ) external view returns (uint256, uint256); function liquidateVAICalculateSeizeTokens( address vTokenCollateral, - uint actualRepayAmount - ) external view returns (uint, uint); + uint256 actualRepayAmount + ) external view returns (uint256, uint256); function checkMembership(address account, VToken vToken) external view returns (bool); - function enterMarkets(address[] calldata vTokens) external returns (uint[] memory); + function enterMarkets(address[] calldata vTokens) external returns (uint256[] memory); - function exitMarket(address vToken) external returns (uint); + function exitMarket(address vToken) external returns (uint256); - function _supportMarket(VToken vToken) external returns (uint); + function _supportMarket(VToken vToken) external returns (uint256); function getAssetsIn(address account) external view returns (VToken[] memory); diff --git a/contracts/Comptroller/Diamond/interfaces/IPolicyFacet.sol b/contracts/Comptroller/Diamond/interfaces/IPolicyFacet.sol index d4c9e088a..d6f82a288 100644 --- a/contracts/Comptroller/Diamond/interfaces/IPolicyFacet.sol +++ b/contracts/Comptroller/Diamond/interfaces/IPolicyFacet.sol @@ -5,31 +5,31 @@ pragma solidity 0.5.16; import { VToken } from "../../../Tokens/VTokens/VToken.sol"; interface IPolicyFacet { - function mintAllowed(address vToken, address minter, uint mintAmount) external returns (uint); + function mintAllowed(address vToken, address minter, uint256 mintAmount) external returns (uint256); - function mintVerify(address vToken, address minter, uint mintAmount, uint mintTokens) external; + function mintVerify(address vToken, address minter, uint256 mintAmount, uint256 mintTokens) external; - function redeemAllowed(address vToken, address redeemer, uint redeemTokens) external returns (uint); + function redeemAllowed(address vToken, address redeemer, uint256 redeemTokens) external returns (uint256); - function redeemVerify(address vToken, address redeemer, uint redeemAmount, uint redeemTokens) external pure; + function redeemVerify(address vToken, address redeemer, uint256 redeemAmount, uint256 redeemTokens) external pure; - function borrowAllowed(address vToken, address borrower, uint borrowAmount) external returns (uint); + function borrowAllowed(address vToken, address borrower, uint256 borrowAmount) external returns (uint256); - function borrowVerify(address vToken, address borrower, uint borrowAmount) external; + function borrowVerify(address vToken, address borrower, uint256 borrowAmount) external; function repayBorrowAllowed( address vToken, address payer, address borrower, - uint repayAmount - ) external returns (uint); + uint256 repayAmount + ) external returns (uint256); function repayBorrowVerify( address vToken, address payer, address borrower, - uint repayAmount, - uint borrowerIndex + uint256 repayAmount, + uint256 borrowerIndex ) external; function liquidateBorrowAllowed( @@ -37,16 +37,16 @@ interface IPolicyFacet { address vTokenCollateral, address liquidator, address borrower, - uint repayAmount - ) external returns (uint); + uint256 repayAmount + ) external returns (uint256); function liquidateBorrowVerify( address vTokenBorrowed, address vTokenCollateral, address liquidator, address borrower, - uint repayAmount, - uint seizeTokens + uint256 repayAmount, + uint256 seizeTokens ) external; function seizeAllowed( @@ -54,33 +54,38 @@ interface IPolicyFacet { address vTokenBorrowed, address liquidator, address borrower, - uint seizeTokens - ) external returns (uint); + uint256 seizeTokens + ) external returns (uint256); function seizeVerify( address vTokenCollateral, address vTokenBorrowed, address liquidator, address borrower, - uint seizeTokens + uint256 seizeTokens ) external; - function transferAllowed(address vToken, address src, address dst, uint transferTokens) external returns (uint); + function transferAllowed( + address vToken, + address src, + address dst, + uint256 transferTokens + ) external returns (uint256); - function transferVerify(address vToken, address src, address dst, uint transferTokens) external; + function transferVerify(address vToken, address src, address dst, uint256 transferTokens) external; - function getAccountLiquidity(address account) external view returns (uint, uint, uint); + function getAccountLiquidity(address account) external view returns (uint256, uint256, uint256); function getHypotheticalAccountLiquidity( address account, address vTokenModify, - uint redeemTokens, - uint borrowAmount - ) external view returns (uint, uint, uint); + uint256 redeemTokens, + uint256 borrowAmount + ) external view returns (uint256, uint256, uint256); function _setVenusSpeeds( VToken[] calldata vTokens, - uint[] calldata supplySpeeds, - uint[] calldata borrowSpeeds + uint256[] calldata supplySpeeds, + uint256[] calldata borrowSpeeds ) external; } diff --git a/contracts/Comptroller/Diamond/interfaces/IRewardFacet.sol b/contracts/Comptroller/Diamond/interfaces/IRewardFacet.sol index 77fe98b18..7eb04c6c4 100644 --- a/contracts/Comptroller/Diamond/interfaces/IRewardFacet.sol +++ b/contracts/Comptroller/Diamond/interfaces/IRewardFacet.sol @@ -14,9 +14,9 @@ interface IRewardFacet { function claimVenusAsCollateral(address holder) external; - function _grantXVS(address recipient, uint amount) external; + function _grantXVS(address recipient, uint256 amount) external; - function getBlockNumber() external view returns (uint); + function getBlockNumber() external view returns (uint256); function getXVSAddress() external pure returns (address); diff --git a/contracts/Comptroller/Diamond/interfaces/ISetterFacet.sol b/contracts/Comptroller/Diamond/interfaces/ISetterFacet.sol index 2160fb244..953a70a77 100644 --- a/contracts/Comptroller/Diamond/interfaces/ISetterFacet.sol +++ b/contracts/Comptroller/Diamond/interfaces/ISetterFacet.sol @@ -9,21 +9,21 @@ import { VAIControllerInterface } from "../../../Tokens/VAI/VAIController.sol"; import { ComptrollerLensInterface } from "../../../Comptroller/ComptrollerLensInterface.sol"; interface ISetterFacet { - function _setPriceOracle(PriceOracle newOracle) external returns (uint); + function _setPriceOracle(PriceOracle newOracle) external returns (uint256); - function _setCloseFactor(uint newCloseFactorMantissa) external returns (uint); + function _setCloseFactor(uint256 newCloseFactorMantissa) external returns (uint256); - function _setAccessControl(address newAccessControlAddress) external returns (uint); + function _setAccessControl(address newAccessControlAddress) external returns (uint256); - function _setCollateralFactor(VToken vToken, uint newCollateralFactorMantissa) external returns (uint); + function _setCollateralFactor(VToken vToken, uint256 newCollateralFactorMantissa) external returns (uint256); - function _setLiquidationIncentive(uint newLiquidationIncentiveMantissa) external returns (uint); + function _setLiquidationIncentive(uint256 newLiquidationIncentiveMantissa) external returns (uint256); function _setLiquidatorContract(address newLiquidatorContract_) external; - function _setPauseGuardian(address newPauseGuardian) external returns (uint); + function _setPauseGuardian(address newPauseGuardian) external returns (uint256); - function _setMarketBorrowCaps(VToken[] calldata vTokens, uint[] calldata newBorrowCaps) external; + function _setMarketBorrowCaps(VToken[] calldata vTokens, uint256[] calldata newBorrowCaps) external; function _setMarketSupplyCaps(VToken[] calldata vTokens, uint256[] calldata newSupplyCaps) external; @@ -35,21 +35,21 @@ interface ISetterFacet { bool paused ) external; - function _setVAIController(VAIControllerInterface vaiController_) external returns (uint); + function _setVAIController(VAIControllerInterface vaiController_) external returns (uint256); - function _setVAIMintRate(uint newVAIMintRate) external returns (uint); + function _setVAIMintRate(uint256 newVAIMintRate) external returns (uint256); - function setMintedVAIOf(address owner, uint amount) external returns (uint); + function setMintedVAIOf(address owner, uint256 amount) external returns (uint256); function _setTreasuryData( address newTreasuryGuardian, address newTreasuryAddress, - uint newTreasuryPercent - ) external returns (uint); + uint256 newTreasuryPercent + ) external returns (uint256); - function _setComptrollerLens(ComptrollerLensInterface comptrollerLens_) external returns (uint); + function _setComptrollerLens(ComptrollerLensInterface comptrollerLens_) external returns (uint256); - function _setVenusVAIVaultRate(uint venusVAIVaultRate_) external; + function _setVenusVAIVaultRate(uint256 venusVAIVaultRate_) external; function _setVAIVaultInfo(address vault_, uint256 releaseStartBlock_, uint256 minReleaseAmount_) external; } From 4596c2b7693d16a08ae6b1c3f8a5c39240cd33d7 Mon Sep 17 00:00:00 2001 From: Debugger022 Date: Fri, 4 Aug 2023 11:42:01 +0530 Subject: [PATCH 127/153] fix: ven-1795 n-07 --- contracts/Comptroller/Diamond/facets/FacetBase.sol | 4 ++-- contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/contracts/Comptroller/Diamond/facets/FacetBase.sol b/contracts/Comptroller/Diamond/facets/FacetBase.sol index 218a0417e..56bba58b0 100644 --- a/contracts/Comptroller/Diamond/facets/FacetBase.sol +++ b/contracts/Comptroller/Diamond/facets/FacetBase.sol @@ -67,13 +67,13 @@ contract FacetBase is ComptrollerV12Storage, ExponentialNoError { * @param market vToken address */ function actionPaused(address market, Action action) public view returns (bool) { - return _actionPaused[market][uint(action)]; + return _actionPaused[market][uint256(action)]; } /** * @notice Get the latest block number */ - function getBlockNumber() public view returns (uint) { + function getBlockNumber() public view returns (uint256) { return block.number; } diff --git a/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol b/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol index 2a3139121..79199ca32 100644 --- a/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol +++ b/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol @@ -35,8 +35,8 @@ contract XVSRewardsHelper is ComptrollerErrorReporter, FacetBase { uint256 deltaBlocks = sub_(uint256(blockNumber), uint256(borrowState.block)); if (deltaBlocks != 0 && borrowSpeed != 0) { uint256 borrowAmount = div_(VToken(vToken).totalBorrows(), marketBorrowIndex); - uint256 venusAccrued = mul_(deltaBlocks, borrowSpeed); - Double memory ratio = borrowAmount != 0 ? fraction(venusAccrued, borrowAmount) : Double({ mantissa: 0 }); + uint256 accruedVenus = mul_(deltaBlocks, borrowSpeed); + Double memory ratio = borrowAmount != 0 ? fraction(accruedVenus, borrowAmount) : Double({ mantissa: 0 }); borrowState.index = safe224( add_(Double({ mantissa: borrowState.index }), ratio).mantissa, "new index exceeds 224 bits" From b0f39a178720d36a570d28b1f8e6aea838dd4fea Mon Sep 17 00:00:00 2001 From: Debugger022 Date: Fri, 4 Aug 2023 11:44:10 +0530 Subject: [PATCH 128/153] fix: ven-1795 n-08 --- contracts/Comptroller/Diamond/facets/FacetBase.sol | 8 ++++---- contracts/Comptroller/Diamond/facets/MarketFacet.sol | 4 ++-- contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol | 8 ++++---- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/contracts/Comptroller/Diamond/facets/FacetBase.sol b/contracts/Comptroller/Diamond/facets/FacetBase.sol index 56bba58b0..1ba7a3395 100644 --- a/contracts/Comptroller/Diamond/facets/FacetBase.sol +++ b/contracts/Comptroller/Diamond/facets/FacetBase.sol @@ -18,13 +18,13 @@ contract FacetBase is ComptrollerV12Storage, ExponentialNoError { using SafeBEP20 for IBEP20; /// @notice The initial Venus index for a market - uint224 public constant venusInitialIndex = 1e36; + uint224 public constant VENUS_INITIAL_INDEX = 1e36; // closeFactorMantissa must be strictly greater than this value - uint internal constant closeFactorMinMantissa = 0.05e18; // 0.05 + uint256 internal constant CLOSE_FACTOR_MIN_MANTISSA = 0.05e18; // 0.05 // closeFactorMantissa must not exceed this value - uint internal constant closeFactorMaxMantissa = 0.9e18; // 0.9 + uint256 internal constant CLOSE_FACTOR_MAX_MANTISSA = 0.9e18; // 0.9 // No collateralFactorMantissa may exceed this value - uint internal constant collateralFactorMaxMantissa = 0.9e18; // 0.9 + uint256 internal constant COLLATERAL_FACTOR_MAX_MANTISSA = 0.9e18; // 0.9 /// @notice Reverts if the protocol is paused function checkProtocolPauseState() internal view { diff --git a/contracts/Comptroller/Diamond/facets/MarketFacet.sol b/contracts/Comptroller/Diamond/facets/MarketFacet.sol index b184799c5..055b5c6c5 100644 --- a/contracts/Comptroller/Diamond/facets/MarketFacet.sol +++ b/contracts/Comptroller/Diamond/facets/MarketFacet.sol @@ -227,12 +227,12 @@ contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase */ if (supplyState.index == 0) { // Initialize supply state index with default value - supplyState.index = venusInitialIndex; + supplyState.index = VENUS_INITIAL_INDEX; } if (borrowState.index == 0) { // Initialize borrow state index with default value - borrowState.index = venusInitialIndex; + borrowState.index = VENUS_INITIAL_INDEX; } /* diff --git a/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol b/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol index 79199ca32..15e11e528 100644 --- a/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol +++ b/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol @@ -84,11 +84,11 @@ contract XVSRewardsHelper is ComptrollerErrorReporter, FacetBase { uint256 supplierIndex = venusSupplierIndex[vToken][supplier]; // Update supplier's index to the current index since we are distributing accrued XVS venusSupplierIndex[vToken][supplier] = supplyIndex; - if (supplierIndex == 0 && supplyIndex >= venusInitialIndex) { + if (supplierIndex == 0 && supplyIndex >= VENUS_INITIAL_INDEX) { // Covers the case where users supplied tokens before the market's supply state index was set. // Rewards the user with XVS accrued from the start of when supplier rewards were first // set for the market. - supplierIndex = venusInitialIndex; + supplierIndex = VENUS_INITIAL_INDEX; } // Calculate change in the cumulative sum of the XVS per vToken accrued Double memory deltaIndex = Double({ mantissa: sub_(supplyIndex, supplierIndex) }); @@ -117,11 +117,11 @@ contract XVSRewardsHelper is ComptrollerErrorReporter, FacetBase { uint256 borrowerIndex = venusBorrowerIndex[vToken][borrower]; // Update borrowers's index to the current index since we are distributing accrued XVS venusBorrowerIndex[vToken][borrower] = borrowIndex; - if (borrowerIndex == 0 && borrowIndex >= venusInitialIndex) { + if (borrowerIndex == 0 && borrowIndex >= VENUS_INITIAL_INDEX) { // Covers the case where users borrowed tokens before the market's borrow state index was set. // Rewards the user with XVS accrued from the start of when borrower rewards were first // set for the market. - borrowerIndex = venusInitialIndex; + borrowerIndex = VENUS_INITIAL_INDEX; } // Calculate change in the cumulative sum of the XVS per borrowed unit accrued Double memory deltaIndex = Double({ mantissa: sub_(borrowIndex, borrowerIndex) }); From 4c72287e635fa387e966647ebc445a17e2ab3892 Mon Sep 17 00:00:00 2001 From: Debugger022 Date: Fri, 4 Aug 2023 12:30:07 +0530 Subject: [PATCH 129/153] fix: ven-1795 test for n-08 --- contracts/Comptroller/Diamond/facets/FacetBase.sol | 12 ++++++------ tests/hardhat/Lens/Rewards.ts | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/contracts/Comptroller/Diamond/facets/FacetBase.sol b/contracts/Comptroller/Diamond/facets/FacetBase.sol index 1ba7a3395..fbf72e0fd 100644 --- a/contracts/Comptroller/Diamond/facets/FacetBase.sol +++ b/contracts/Comptroller/Diamond/facets/FacetBase.sol @@ -138,7 +138,7 @@ contract FacetBase is ComptrollerV12Storage, ExponentialNoError { VToken vTokenModify, uint256 redeemTokens, uint256 borrowAmount - ) internal view returns (Error, uint256, uint256) { + ) internal view returns (ComptrollerErrorReporter.Error, uint256, uint256) { (uint256 err, uint256 liquidity, uint256 shortfall) = comptrollerLens.getHypotheticalAccountLiquidity( address(this), account, @@ -191,21 +191,21 @@ contract FacetBase is ComptrollerV12Storage, ExponentialNoError { ensureListed(markets[vToken]); /* If the redeemer is not 'in' the market, then we can bypass the liquidity check */ if (!markets[vToken].accountMembership[redeemer]) { - return uint256(Error.NO_ERROR); + return uint256(ComptrollerErrorReporter.Error.NO_ERROR); } /* Otherwise, perform a hypothetical liquidity check to guard against shortfall */ - (Error err, , uint256 shortfall) = getHypotheticalAccountLiquidityInternal( + (ComptrollerErrorReporter.Error err, , uint256 shortfall) = getHypotheticalAccountLiquidityInternal( redeemer, VToken(vToken), redeemTokens, 0 ); - if (err != Error.NO_ERROR) { + if (err != ComptrollerErrorReporter.Error.NO_ERROR) { return uint256(err); } if (shortfall != 0) { - return uint256(Error.INSUFFICIENT_LIQUIDITY); + return uint256(ComptrollerErrorReporter.Error.INSUFFICIENT_LIQUIDITY); } - return uint256(Error.NO_ERROR); + return uint256(ComptrollerErrorReporter.Error.NO_ERROR); } } diff --git a/tests/hardhat/Lens/Rewards.ts b/tests/hardhat/Lens/Rewards.ts index 80d6cd9c4..a76df87fa 100644 --- a/tests/hardhat/Lens/Rewards.ts +++ b/tests/hardhat/Lens/Rewards.ts @@ -43,7 +43,7 @@ const rewardsFixture = async (): Promise => { comptroller.getAllMarkets.returns([vBUSD.address, vWBTC.address]); comptroller.getXVSAddress.returns(XVS.address); comptroller.venusAccrued.returns(VENUS_ACCRUED); - comptroller.venusInitialIndex.returns(convertToUnit(1, 18)); + comptroller.VENUS_INITIAL_INDEX.returns(convertToUnit(1, 18)); comptroller.venusSupplySpeeds.returns(convertToUnit(0.5, 18)); comptroller.venusBorrowSpeeds.returns(convertToUnit(0.5, 18)); comptroller.venusSupplierIndex.returns(convertToUnit(1, 18)); From 4c72e43e1e1264f274c9d5507a690366bb12af18 Mon Sep 17 00:00:00 2001 From: Debugger022 Date: Fri, 4 Aug 2023 13:22:44 +0530 Subject: [PATCH 130/153] fix: ven-1795 n-10 --- contracts/Comptroller/Diamond/Diamond.sol | 5 +++-- .../Comptroller/Diamond/facets/FacetBase.sol | 22 +++++++++---------- .../Diamond/facets/MarketFacet.sol | 4 ++-- .../Diamond/facets/RewardFacet.sol | 2 +- .../Diamond/facets/SetterFacet.sol | 4 ++-- .../Diamond/facets/XVSRewardsHelper.sol | 12 ++++------ 6 files changed, 23 insertions(+), 26 deletions(-) diff --git a/contracts/Comptroller/Diamond/Diamond.sol b/contracts/Comptroller/Diamond/Diamond.sol index 56a54f02c..7237bebaa 100644 --- a/contracts/Comptroller/Diamond/Diamond.sol +++ b/contracts/Comptroller/Diamond/Diamond.sol @@ -74,14 +74,15 @@ contract Diamond is ComptrollerV12Storage { * @notice Get all facets address and their function selector * @return facets_ Array of Facet */ - function facets() external view returns (Facet[] memory facets_) { + function facets() external view returns (Facet[] memory) { uint256 facetsLength = _facetAddresses.length; - facets_ = new Facet[](facetsLength); + Facet[] memory facets_ = new Facet[](facetsLength); for (uint256 i; i < facetsLength; ++i) { address facet = _facetAddresses[i]; facets_[i].facetAddress = facet; facets_[i].functionSelectors = _facetFunctionSelectors[facet].functionSelectors; } + return facets_; } /** diff --git a/contracts/Comptroller/Diamond/facets/FacetBase.sol b/contracts/Comptroller/Diamond/facets/FacetBase.sol index fbf72e0fd..e813ed1a5 100644 --- a/contracts/Comptroller/Diamond/facets/FacetBase.sol +++ b/contracts/Comptroller/Diamond/facets/FacetBase.sol @@ -8,7 +8,7 @@ import { ComptrollerV12Storage } from "../../../Comptroller/ComptrollerStorage.s import { IAccessControlManager } from "../../../Governance/IAccessControlManager.sol"; import { SafeBEP20, IBEP20 } from "../../../Utils/SafeBEP20.sol"; -contract FacetBase is ComptrollerV12Storage, ExponentialNoError { +contract FacetBase is ComptrollerV12Storage, ExponentialNoError, ComptrollerErrorReporter { /// @notice Emitted when an account enters a market event MarketEntered(VToken indexed vToken, address indexed account); @@ -138,7 +138,7 @@ contract FacetBase is ComptrollerV12Storage, ExponentialNoError { VToken vTokenModify, uint256 redeemTokens, uint256 borrowAmount - ) internal view returns (ComptrollerErrorReporter.Error, uint256, uint256) { + ) internal view returns (Error, uint256, uint256) { (uint256 err, uint256 liquidity, uint256 shortfall) = comptrollerLens.getHypotheticalAccountLiquidity( address(this), account, @@ -146,7 +146,7 @@ contract FacetBase is ComptrollerV12Storage, ExponentialNoError { redeemTokens, borrowAmount ); - return (ComptrollerErrorReporter.Error(err), liquidity, shortfall); + return (Error(err), liquidity, shortfall); } /** @@ -155,13 +155,13 @@ contract FacetBase is ComptrollerV12Storage, ExponentialNoError { * @param borrower The address of the account to modify * @return Success indicator for whether the market was entered */ - function addToMarketInternal(VToken vToken, address borrower) internal returns (ComptrollerErrorReporter.Error) { + function addToMarketInternal(VToken vToken, address borrower) internal returns (Error) { checkActionPauseState(address(vToken), Action.ENTER_MARKET); Market storage marketToJoin = markets[address(vToken)]; ensureListed(marketToJoin); if (marketToJoin.accountMembership[borrower]) { // already joined - return ComptrollerErrorReporter.Error.NO_ERROR; + return Error.NO_ERROR; } // survived the gauntlet, add to list // NOTE: we store these somewhat redundantly as a significant optimization @@ -173,7 +173,7 @@ contract FacetBase is ComptrollerV12Storage, ExponentialNoError { emit MarketEntered(vToken, borrower); - return ComptrollerErrorReporter.Error.NO_ERROR; + return Error.NO_ERROR; } /** @@ -191,21 +191,21 @@ contract FacetBase is ComptrollerV12Storage, ExponentialNoError { ensureListed(markets[vToken]); /* If the redeemer is not 'in' the market, then we can bypass the liquidity check */ if (!markets[vToken].accountMembership[redeemer]) { - return uint256(ComptrollerErrorReporter.Error.NO_ERROR); + return uint256(Error.NO_ERROR); } /* Otherwise, perform a hypothetical liquidity check to guard against shortfall */ - (ComptrollerErrorReporter.Error err, , uint256 shortfall) = getHypotheticalAccountLiquidityInternal( + (Error err, , uint256 shortfall) = getHypotheticalAccountLiquidityInternal( redeemer, VToken(vToken), redeemTokens, 0 ); - if (err != ComptrollerErrorReporter.Error.NO_ERROR) { + if (err != Error.NO_ERROR) { return uint256(err); } if (shortfall != 0) { - return uint256(ComptrollerErrorReporter.Error.INSUFFICIENT_LIQUIDITY); + return uint256(Error.INSUFFICIENT_LIQUIDITY); } - return uint256(ComptrollerErrorReporter.Error.NO_ERROR); + return uint256(Error.NO_ERROR); } } diff --git a/contracts/Comptroller/Diamond/facets/MarketFacet.sol b/contracts/Comptroller/Diamond/facets/MarketFacet.sol index 055b5c6c5..5fa0fed6a 100644 --- a/contracts/Comptroller/Diamond/facets/MarketFacet.sol +++ b/contracts/Comptroller/Diamond/facets/MarketFacet.sol @@ -2,12 +2,12 @@ pragma solidity 0.5.16; -import { FacetBase, VToken, ComptrollerErrorReporter, ExponentialNoError } from "./FacetBase.sol"; +import { FacetBase, VToken } from "./FacetBase.sol"; /** * @dev This facet contains all the methods related to the market's management in the pool */ -contract MarketFacet is ComptrollerErrorReporter, ExponentialNoError, FacetBase { +contract MarketFacet is FacetBase { /// @notice Emitted when an admin supports a market event MarketListed(VToken indexed vToken); diff --git a/contracts/Comptroller/Diamond/facets/RewardFacet.sol b/contracts/Comptroller/Diamond/facets/RewardFacet.sol index 6702eb6d9..45ab1c9f8 100644 --- a/contracts/Comptroller/Diamond/facets/RewardFacet.sol +++ b/contracts/Comptroller/Diamond/facets/RewardFacet.sol @@ -113,7 +113,7 @@ contract RewardFacet is XVSRewardsHelper { * @param recipient The address of the recipient to transfer XVS to * @param amount The amount of XVS to (possibly) transfer */ - function _grantXVS(address recipient, uint256 amount) external { + function grantXVS(address recipient, uint256 amount) external { ensureAdminOr(comptrollerImplementation); uint256 amountLeft = grantXVSInternal(recipient, amount, 0, false); require(amountLeft == 0, "insufficient xvs for grant"); diff --git a/contracts/Comptroller/Diamond/facets/SetterFacet.sol b/contracts/Comptroller/Diamond/facets/SetterFacet.sol index 5448b053e..b6cdc2323 100644 --- a/contracts/Comptroller/Diamond/facets/SetterFacet.sol +++ b/contracts/Comptroller/Diamond/facets/SetterFacet.sol @@ -5,12 +5,12 @@ pragma solidity 0.5.16; import { PriceOracle } from "../../../Oracle/PriceOracle.sol"; import { ComptrollerLensInterface } from "../../ComptrollerLensInterface.sol"; import { VAIControllerInterface } from "../../../Tokens/VAI/VAIControllerInterface.sol"; -import { FacetBase, VToken, ComptrollerErrorReporter, ExponentialNoError } from "./FacetBase.sol"; +import { FacetBase, VToken } from "./FacetBase.sol"; /** * @dev This facet contains all the setters for the states */ -contract SetterFacet is ComptrollerErrorReporter, FacetBase { +contract SetterFacet is FacetBase { /// @notice Emitted when close factor is changed by admin event NewCloseFactor(uint256 oldCloseFactorMantissa, uint256 newCloseFactorMantissa); diff --git a/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol b/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol index 15e11e528..387c23df4 100644 --- a/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol +++ b/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol @@ -2,12 +2,12 @@ pragma solidity 0.5.16; -import { FacetBase, ComptrollerErrorReporter, VToken, ExponentialNoError } from "./FacetBase.sol"; +import { FacetBase, VToken } from "./FacetBase.sol"; /** * @dev This contract contains internal functions used in RewardFacet and PolicyFacet */ -contract XVSRewardsHelper is ComptrollerErrorReporter, FacetBase { +contract XVSRewardsHelper is FacetBase { /// @notice Emitted when XVS is distributed to a borrower event DistributedBorrowerVenus( VToken indexed vToken, @@ -28,7 +28,7 @@ contract XVSRewardsHelper is ComptrollerErrorReporter, FacetBase { * @notice Accrue XVS to the market by updating the borrow index * @param vToken The market whose borrow index to update */ - function updateVenusBorrowIndex(address vToken, ExponentialNoError.Exp memory marketBorrowIndex) internal { + function updateVenusBorrowIndex(address vToken, Exp memory marketBorrowIndex) internal { VenusMarketState storage borrowState = venusBorrowState[vToken]; uint256 borrowSpeed = venusBorrowSpeeds[vToken]; uint256 blockNumber = getBlockNumber(); @@ -105,11 +105,7 @@ contract XVSRewardsHelper is ComptrollerErrorReporter, FacetBase { * @param vToken The market in which the borrower is interacting * @param borrower The address of the borrower to distribute XVS to */ - function distributeBorrowerVenus( - address vToken, - address borrower, - ExponentialNoError.Exp memory marketBorrowIndex - ) internal { + function distributeBorrowerVenus(address vToken, address borrower, Exp memory marketBorrowIndex) internal { if (address(vaiVaultAddress) != address(0)) { releaseToVault(); } From cfaa69aea6ef1d55c7fc4e457780ca83cd58add1 Mon Sep 17 00:00:00 2001 From: Debugger022 Date: Fri, 4 Aug 2023 13:25:02 +0530 Subject: [PATCH 131/153] fix: ven-1795 l-02 --- contracts/Comptroller/Diamond/facets/SetterFacet.sol | 2 +- tests/hardhat/Comptroller/Diamond/accessControl.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/Comptroller/Diamond/facets/SetterFacet.sol b/contracts/Comptroller/Diamond/facets/SetterFacet.sol index b6cdc2323..9d611091a 100644 --- a/contracts/Comptroller/Diamond/facets/SetterFacet.sol +++ b/contracts/Comptroller/Diamond/facets/SetterFacet.sol @@ -324,7 +324,7 @@ contract SetterFacet is FacetBase { * @param paused_ The new paused state (true=paused, false=unpaused) */ function _setActionsPaused(address[] calldata markets_, Action[] calldata actions_, bool paused_) external { - ensureAllowed("_setActionsPaused(address[],uint256[],bool)"); + ensureAllowed("_setActionsPaused(address[],uint8[],bool)"); uint256 numMarkets = markets_.length; uint256 numActions = actions_.length; diff --git a/tests/hardhat/Comptroller/Diamond/accessControl.ts b/tests/hardhat/Comptroller/Diamond/accessControl.ts index 9d9ebe757..2790a3ddd 100644 --- a/tests/hardhat/Comptroller/Diamond/accessControl.ts +++ b/tests/hardhat/Comptroller/Diamond/accessControl.ts @@ -111,7 +111,7 @@ describe("Comptroller", () => { await expect(comptroller.connect(user)._setActionsPaused([], [], true)).to.be.revertedWith("access denied"); expect(accessControl.isAllowedToCall).to.be.calledOnceWith( userAddress, - "_setActionsPaused(address[],uint256[],bool)", + "_setActionsPaused(address[],uint8[],bool)", ); }); }); From 0aa7e177fd47cbcb2c22fd8ea66a304ee7692868 Mon Sep 17 00:00:00 2001 From: Debugger022 Date: Fri, 4 Aug 2023 13:27:12 +0530 Subject: [PATCH 132/153] fix: ven-1795 l-06 --- contracts/Comptroller/Diamond/facets/PolicyFacet.sol | 2 +- contracts/Comptroller/Diamond/facets/RewardFacet.sol | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/contracts/Comptroller/Diamond/facets/PolicyFacet.sol b/contracts/Comptroller/Diamond/facets/PolicyFacet.sol index e6c44634f..9179e43dd 100644 --- a/contracts/Comptroller/Diamond/facets/PolicyFacet.sol +++ b/contracts/Comptroller/Diamond/facets/PolicyFacet.sol @@ -424,7 +424,7 @@ contract PolicyFacet is XVSRewardsHelper { uint256[] calldata supplySpeeds, uint256[] calldata borrowSpeeds ) external { - ensureAdminOr(comptrollerImplementation); + ensureAdmin(); uint256 numTokens = vTokens.length; require( diff --git a/contracts/Comptroller/Diamond/facets/RewardFacet.sol b/contracts/Comptroller/Diamond/facets/RewardFacet.sol index 45ab1c9f8..336d4d853 100644 --- a/contracts/Comptroller/Diamond/facets/RewardFacet.sol +++ b/contracts/Comptroller/Diamond/facets/RewardFacet.sol @@ -113,8 +113,8 @@ contract RewardFacet is XVSRewardsHelper { * @param recipient The address of the recipient to transfer XVS to * @param amount The amount of XVS to (possibly) transfer */ - function grantXVS(address recipient, uint256 amount) external { - ensureAdminOr(comptrollerImplementation); + function _grantXVS(address recipient, uint256 amount) external { + ensureAdmin(); uint256 amountLeft = grantXVSInternal(recipient, amount, 0, false); require(amountLeft == 0, "insufficient xvs for grant"); emit VenusGranted(recipient, amount); From 50761a0573b019e6f59269f4ef45821dae955523 Mon Sep 17 00:00:00 2001 From: Debugger022 Date: Fri, 4 Aug 2023 13:47:19 +0530 Subject: [PATCH 133/153] fix: ven-1795 n-02 --- contracts/Comptroller/Diamond/Diamond.sol | 2 +- contracts/Comptroller/Diamond/facets/MarketFacet.sol | 3 ++- contracts/Comptroller/Diamond/facets/PolicyFacet.sol | 4 +++- contracts/Comptroller/Diamond/facets/RewardFacet.sol | 3 ++- contracts/Comptroller/Diamond/facets/SetterFacet.sol | 3 ++- contracts/Comptroller/Diamond/interfaces/IPolicyFacet.sol | 2 +- 6 files changed, 11 insertions(+), 6 deletions(-) diff --git a/contracts/Comptroller/Diamond/Diamond.sol b/contracts/Comptroller/Diamond/Diamond.sol index 7237bebaa..86d991267 100644 --- a/contracts/Comptroller/Diamond/Diamond.sol +++ b/contracts/Comptroller/Diamond/Diamond.sol @@ -6,7 +6,7 @@ pragma experimental ABIEncoderV2; import { IDiamondCut } from "./interfaces/IDiamondCut.sol"; import { Unitroller, ComptrollerV12Storage } from "../Unitroller.sol"; -contract Diamond is ComptrollerV12Storage { +contract Diamond is IDiamondCut, ComptrollerV12Storage { /// @notice Emitted when functions are added, replaced or removed to facets event DiamondCut(IDiamondCut.FacetCut[] _diamondCut); diff --git a/contracts/Comptroller/Diamond/facets/MarketFacet.sol b/contracts/Comptroller/Diamond/facets/MarketFacet.sol index 5fa0fed6a..9dc4755ae 100644 --- a/contracts/Comptroller/Diamond/facets/MarketFacet.sol +++ b/contracts/Comptroller/Diamond/facets/MarketFacet.sol @@ -2,12 +2,13 @@ pragma solidity 0.5.16; +import { IMarketFacet } from "../interfaces/IMarketFacet.sol"; import { FacetBase, VToken } from "./FacetBase.sol"; /** * @dev This facet contains all the methods related to the market's management in the pool */ -contract MarketFacet is FacetBase { +contract MarketFacet is IMarketFacet, FacetBase { /// @notice Emitted when an admin supports a market event MarketListed(VToken indexed vToken); diff --git a/contracts/Comptroller/Diamond/facets/PolicyFacet.sol b/contracts/Comptroller/Diamond/facets/PolicyFacet.sol index 9179e43dd..5a304308b 100644 --- a/contracts/Comptroller/Diamond/facets/PolicyFacet.sol +++ b/contracts/Comptroller/Diamond/facets/PolicyFacet.sol @@ -2,12 +2,14 @@ pragma solidity 0.5.16; +import { IPolicyFacet } from "../interfaces/IPolicyFacet.sol"; + import { XVSRewardsHelper, VToken } from "./XVSRewardsHelper.sol"; /** * @dev This facet contains all the hooks used while transferring the assets */ -contract PolicyFacet is XVSRewardsHelper { +contract PolicyFacet is IPolicyFacet, XVSRewardsHelper { /// @notice Emitted when a new borrow-side XVS speed is calculated for a market event VenusBorrowSpeedUpdated(VToken indexed vToken, uint256 newSpeed); diff --git a/contracts/Comptroller/Diamond/facets/RewardFacet.sol b/contracts/Comptroller/Diamond/facets/RewardFacet.sol index 336d4d853..e059e16a7 100644 --- a/contracts/Comptroller/Diamond/facets/RewardFacet.sol +++ b/contracts/Comptroller/Diamond/facets/RewardFacet.sol @@ -2,6 +2,7 @@ pragma solidity 0.5.16; +import { IRewardFacet } from "../interfaces/IRewardFacet.sol"; import { XVSRewardsHelper, VToken } from "./XVSRewardsHelper.sol"; import { SafeBEP20, IBEP20 } from "../../../Utils/SafeBEP20.sol"; import { VBep20Interface } from "../../../Tokens/VTokens/VTokenInterfaces.sol"; @@ -9,7 +10,7 @@ import { VBep20Interface } from "../../../Tokens/VTokens/VTokenInterfaces.sol"; /** * @dev This facet contains all the methods related to the reward functionality */ -contract RewardFacet is XVSRewardsHelper { +contract RewardFacet is IRewardFacet, XVSRewardsHelper { /// @notice Emitted when Venus is granted by admin event VenusGranted(address indexed recipient, uint256 amount); diff --git a/contracts/Comptroller/Diamond/facets/SetterFacet.sol b/contracts/Comptroller/Diamond/facets/SetterFacet.sol index 9d611091a..fc094fcdf 100644 --- a/contracts/Comptroller/Diamond/facets/SetterFacet.sol +++ b/contracts/Comptroller/Diamond/facets/SetterFacet.sol @@ -2,6 +2,7 @@ pragma solidity 0.5.16; +import { ISetterFacet } from "../interfaces/ISetterFacet.sol"; import { PriceOracle } from "../../../Oracle/PriceOracle.sol"; import { ComptrollerLensInterface } from "../../ComptrollerLensInterface.sol"; import { VAIControllerInterface } from "../../../Tokens/VAI/VAIControllerInterface.sol"; @@ -10,7 +11,7 @@ import { FacetBase, VToken } from "./FacetBase.sol"; /** * @dev This facet contains all the setters for the states */ -contract SetterFacet is FacetBase { +contract SetterFacet is ISetterFacet, FacetBase { /// @notice Emitted when close factor is changed by admin event NewCloseFactor(uint256 oldCloseFactorMantissa, uint256 newCloseFactorMantissa); diff --git a/contracts/Comptroller/Diamond/interfaces/IPolicyFacet.sol b/contracts/Comptroller/Diamond/interfaces/IPolicyFacet.sol index d6f82a288..728ba5562 100644 --- a/contracts/Comptroller/Diamond/interfaces/IPolicyFacet.sol +++ b/contracts/Comptroller/Diamond/interfaces/IPolicyFacet.sol @@ -38,7 +38,7 @@ interface IPolicyFacet { address liquidator, address borrower, uint256 repayAmount - ) external returns (uint256); + ) external view returns (uint256); function liquidateBorrowVerify( address vTokenBorrowed, From fd07edd871d4f1199e6676910351b6d2f8c5a760 Mon Sep 17 00:00:00 2001 From: Debugger022 Date: Fri, 4 Aug 2023 17:59:47 +0530 Subject: [PATCH 134/153] revert: ven-1795 changes for n-08 --- contracts/Comptroller/Diamond/facets/FacetBase.sol | 8 ++++---- contracts/Comptroller/Diamond/facets/MarketFacet.sol | 4 ++-- contracts/Comptroller/Diamond/facets/SetterFacet.sol | 2 +- contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol | 8 ++++---- tests/hardhat/Lens/Rewards.ts | 2 +- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/contracts/Comptroller/Diamond/facets/FacetBase.sol b/contracts/Comptroller/Diamond/facets/FacetBase.sol index e813ed1a5..44891e625 100644 --- a/contracts/Comptroller/Diamond/facets/FacetBase.sol +++ b/contracts/Comptroller/Diamond/facets/FacetBase.sol @@ -18,13 +18,13 @@ contract FacetBase is ComptrollerV12Storage, ExponentialNoError, ComptrollerErro using SafeBEP20 for IBEP20; /// @notice The initial Venus index for a market - uint224 public constant VENUS_INITIAL_INDEX = 1e36; + uint224 public constant venusInitialIndex = 1e36; // closeFactorMantissa must be strictly greater than this value - uint256 internal constant CLOSE_FACTOR_MIN_MANTISSA = 0.05e18; // 0.05 + uint256 internal constant closeFactorMinMantissa = 0.05e18; // 0.05 // closeFactorMantissa must not exceed this value - uint256 internal constant CLOSE_FACTOR_MAX_MANTISSA = 0.9e18; // 0.9 + uint256 internal constant closeFactorMaxMantissa = 0.9e18; // 0.9 // No collateralFactorMantissa may exceed this value - uint256 internal constant COLLATERAL_FACTOR_MAX_MANTISSA = 0.9e18; // 0.9 + uint256 internal constant collateralFactorMaxMantissa = 0.9e18; // 0.9 /// @notice Reverts if the protocol is paused function checkProtocolPauseState() internal view { diff --git a/contracts/Comptroller/Diamond/facets/MarketFacet.sol b/contracts/Comptroller/Diamond/facets/MarketFacet.sol index 9dc4755ae..ceacb7930 100644 --- a/contracts/Comptroller/Diamond/facets/MarketFacet.sol +++ b/contracts/Comptroller/Diamond/facets/MarketFacet.sol @@ -228,12 +228,12 @@ contract MarketFacet is IMarketFacet, FacetBase { */ if (supplyState.index == 0) { // Initialize supply state index with default value - supplyState.index = VENUS_INITIAL_INDEX; + supplyState.index = venusInitialIndex; } if (borrowState.index == 0) { // Initialize borrow state index with default value - borrowState.index = VENUS_INITIAL_INDEX; + borrowState.index = venusInitialIndex; } /* diff --git a/contracts/Comptroller/Diamond/facets/SetterFacet.sol b/contracts/Comptroller/Diamond/facets/SetterFacet.sol index fc094fcdf..241230bec 100644 --- a/contracts/Comptroller/Diamond/facets/SetterFacet.sol +++ b/contracts/Comptroller/Diamond/facets/SetterFacet.sol @@ -184,7 +184,7 @@ contract SetterFacet is ISetterFacet, FacetBase { Exp memory newCollateralFactorExp = Exp({ mantissa: newCollateralFactorMantissa }); //-- Check collateral factor <= 0.9 - Exp memory highLimit = Exp({ mantissa: COLLATERAL_FACTOR_MAX_MANTISSA }); + Exp memory highLimit = Exp({ mantissa: collateralFactorMaxMantissa }); if (lessThanExp(highLimit, newCollateralFactorExp)) { return fail(Error.INVALID_COLLATERAL_FACTOR, FailureInfo.SET_COLLATERAL_FACTOR_VALIDATION); } diff --git a/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol b/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol index 387c23df4..82fb819ec 100644 --- a/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol +++ b/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol @@ -84,11 +84,11 @@ contract XVSRewardsHelper is FacetBase { uint256 supplierIndex = venusSupplierIndex[vToken][supplier]; // Update supplier's index to the current index since we are distributing accrued XVS venusSupplierIndex[vToken][supplier] = supplyIndex; - if (supplierIndex == 0 && supplyIndex >= VENUS_INITIAL_INDEX) { + if (supplierIndex == 0 && supplyIndex >= venusInitialIndex) { // Covers the case where users supplied tokens before the market's supply state index was set. // Rewards the user with XVS accrued from the start of when supplier rewards were first // set for the market. - supplierIndex = VENUS_INITIAL_INDEX; + supplierIndex = venusInitialIndex; } // Calculate change in the cumulative sum of the XVS per vToken accrued Double memory deltaIndex = Double({ mantissa: sub_(supplyIndex, supplierIndex) }); @@ -113,11 +113,11 @@ contract XVSRewardsHelper is FacetBase { uint256 borrowerIndex = venusBorrowerIndex[vToken][borrower]; // Update borrowers's index to the current index since we are distributing accrued XVS venusBorrowerIndex[vToken][borrower] = borrowIndex; - if (borrowerIndex == 0 && borrowIndex >= VENUS_INITIAL_INDEX) { + if (borrowerIndex == 0 && borrowIndex >= venusInitialIndex) { // Covers the case where users borrowed tokens before the market's borrow state index was set. // Rewards the user with XVS accrued from the start of when borrower rewards were first // set for the market. - borrowerIndex = VENUS_INITIAL_INDEX; + borrowerIndex = venusInitialIndex; } // Calculate change in the cumulative sum of the XVS per borrowed unit accrued Double memory deltaIndex = Double({ mantissa: sub_(borrowIndex, borrowerIndex) }); diff --git a/tests/hardhat/Lens/Rewards.ts b/tests/hardhat/Lens/Rewards.ts index a76df87fa..80d6cd9c4 100644 --- a/tests/hardhat/Lens/Rewards.ts +++ b/tests/hardhat/Lens/Rewards.ts @@ -43,7 +43,7 @@ const rewardsFixture = async (): Promise => { comptroller.getAllMarkets.returns([vBUSD.address, vWBTC.address]); comptroller.getXVSAddress.returns(XVS.address); comptroller.venusAccrued.returns(VENUS_ACCRUED); - comptroller.VENUS_INITIAL_INDEX.returns(convertToUnit(1, 18)); + comptroller.venusInitialIndex.returns(convertToUnit(1, 18)); comptroller.venusSupplySpeeds.returns(convertToUnit(0.5, 18)); comptroller.venusBorrowSpeeds.returns(convertToUnit(0.5, 18)); comptroller.venusSupplierIndex.returns(convertToUnit(1, 18)); From b745623f6bb95b978b8bd3c62fac6fcff5ac277d Mon Sep 17 00:00:00 2001 From: Debugger022 Date: Mon, 28 Aug 2023 19:48:05 +0530 Subject: [PATCH 135/153] fix: ven-1887 ven-08 --- contracts/Comptroller/Diamond/Diamond.sol | 3 ++- .../Diamond/facets/MarketFacet.sol | 2 +- .../Diamond/facets/PolicyFacet.sol | 1 + .../Diamond/facets/RewardFacet.sol | 3 ++- .../Diamond/facets/SetterFacet.sol | 19 +++++++++++-------- 5 files changed, 17 insertions(+), 11 deletions(-) diff --git a/contracts/Comptroller/Diamond/Diamond.sol b/contracts/Comptroller/Diamond/Diamond.sol index 86d991267..3cb4d294b 100644 --- a/contracts/Comptroller/Diamond/Diamond.sol +++ b/contracts/Comptroller/Diamond/Diamond.sol @@ -25,7 +25,8 @@ contract Diamond is IDiamondCut, ComptrollerV12Storage { } /** - * @notice To add function selectors to the facets' mapping + * @notice To add function selectors to the facet's mapping + * @dev Allows the contract admin to add function selectors * @param diamondCut_ IDiamondCut contains facets address, action and function selectors */ function diamondCut(IDiamondCut.FacetCut[] memory diamondCut_) public { diff --git a/contracts/Comptroller/Diamond/facets/MarketFacet.sol b/contracts/Comptroller/Diamond/facets/MarketFacet.sol index ceacb7930..36ef33b17 100644 --- a/contracts/Comptroller/Diamond/facets/MarketFacet.sol +++ b/contracts/Comptroller/Diamond/facets/MarketFacet.sol @@ -167,7 +167,7 @@ contract MarketFacet is IMarketFacet, FacetBase { /** * @notice Add the market to the markets mapping and set it as listed - * @dev Admin function to set isListed and add support for the market + * @dev Allows a privileged role to add and list markets to the Comptroller * @param vToken The address of the market (token) to list * @return uint256 0=success, otherwise a failure. (See enum Error for details) */ diff --git a/contracts/Comptroller/Diamond/facets/PolicyFacet.sol b/contracts/Comptroller/Diamond/facets/PolicyFacet.sol index 5a304308b..f17af7544 100644 --- a/contracts/Comptroller/Diamond/facets/PolicyFacet.sol +++ b/contracts/Comptroller/Diamond/facets/PolicyFacet.sol @@ -417,6 +417,7 @@ contract PolicyFacet is IPolicyFacet, XVSRewardsHelper { // setter functionality /** * @notice Set XVS speed for a single market + * @dev Allows the contract admin to set XVS speed for a market * @param vTokens The market whose XVS speed to update * @param supplySpeeds New XVS speed for supply * @param borrowSpeeds New XVS speed for borrow diff --git a/contracts/Comptroller/Diamond/facets/RewardFacet.sol b/contracts/Comptroller/Diamond/facets/RewardFacet.sol index e059e16a7..773422125 100644 --- a/contracts/Comptroller/Diamond/facets/RewardFacet.sol +++ b/contracts/Comptroller/Diamond/facets/RewardFacet.sol @@ -110,7 +110,8 @@ contract RewardFacet is IRewardFacet, XVSRewardsHelper { /** * @notice Transfer XVS to the recipient - * @dev Note: If there is not enough XVS, we do not perform the transfer all + * @dev Allows the contract admin to transfer XVS to any recipient based on the recipient's shortfall + * Note: If there is not enough XVS, we do not perform the transfer all * @param recipient The address of the recipient to transfer XVS to * @param amount The amount of XVS to (possibly) transfer */ diff --git a/contracts/Comptroller/Diamond/facets/SetterFacet.sol b/contracts/Comptroller/Diamond/facets/SetterFacet.sol index 241230bec..16c323e0e 100644 --- a/contracts/Comptroller/Diamond/facets/SetterFacet.sol +++ b/contracts/Comptroller/Diamond/facets/SetterFacet.sol @@ -95,7 +95,7 @@ contract SetterFacet is ISetterFacet, FacetBase { /** * @notice Sets a new price oracle for the comptroller - * @dev Admin function to set a new price oracle + * @dev Allows the contract admin to set a new price oracle used by the Comptroller * @return uint256 0=success, otherwise a failure (see ErrorReporter.sol for details) */ function _setPriceOracle( @@ -119,7 +119,7 @@ contract SetterFacet is ISetterFacet, FacetBase { /** * @notice Sets the closeFactor used when liquidating borrows - * @dev Admin function to set closeFactor + * @dev Allows the contract admin to set the closeFactor used to liquidate borrows * @param newCloseFactorMantissa New close factor, scaled by 1e18 * @return uint256 0=success, otherwise will revert */ @@ -139,7 +139,7 @@ contract SetterFacet is ISetterFacet, FacetBase { /** * @notice Sets the address of the access control of this contract - * @dev Admin function to set the access control address + * @dev Allows the contract admin to set the address of access control of this contract * @param newAccessControlAddress New address for the access control * @return uint256 0=success, otherwise will revert */ @@ -160,7 +160,7 @@ contract SetterFacet is ISetterFacet, FacetBase { /** * @notice Sets the collateralFactor for a market - * @dev Restricted function to set per-market collateralFactor + * @dev Allows a privileged role to set the collateralFactorMantissa * @param vToken The market to set the factor on * @param newCollateralFactorMantissa The new collateral factor, scaled by 1e18 * @return uint256 0=success, otherwise a failure. (See ErrorReporter for details) @@ -206,7 +206,7 @@ contract SetterFacet is ISetterFacet, FacetBase { /** * @notice Sets liquidationIncentive - * @dev Admin function to set liquidationIncentive + * @dev Allows a privileged role to set the liquidationIncentiveMantissa * @param newLiquidationIncentiveMantissa New liquidationIncentive scaled by 1e18 * @return uint256 0=success, otherwise a failure. (See ErrorReporter for details) */ @@ -230,7 +230,7 @@ contract SetterFacet is ISetterFacet, FacetBase { /** * @notice Update the address of the liquidator contract - * @dev Admin function to set liquidator contract + * @dev Allows the contract admin to update the address of liquidator contract * @param newLiquidatorContract_ The new address of the liquidator contract */ function _setLiquidatorContract( @@ -245,6 +245,7 @@ contract SetterFacet is ISetterFacet, FacetBase { /** * @notice Admin function to change the Pause Guardian + * @dev Allows the contract admin to change the Pause Guardian * @param newPauseGuardian The address of the new Pause Guardian * @return uint256 0=success, otherwise a failure. (See enum Error for details) */ @@ -267,7 +268,7 @@ contract SetterFacet is ISetterFacet, FacetBase { /** * @notice Set the given borrow caps for the given vToken market Borrowing that brings total borrows to or above borrow cap will revert - * @dev Access is controled by ACM. A borrow cap of 0 corresponds to unlimited borrowing + * @dev Allows a privileged role to set the borrowing cap for a vToken market. A borrow cap of 0 corresponds to unlimited borrowing * @param vTokens The addresses of the markets (tokens) to change the borrow caps for * @param newBorrowCaps The new borrow cap values in underlying to be set. A value of 0 corresponds to unlimited borrowing */ @@ -287,7 +288,7 @@ contract SetterFacet is ISetterFacet, FacetBase { /** * @notice Set the given supply caps for the given vToken market Supply that brings total Supply to or above supply cap will revert - * @dev Admin function to set the supply cap A supply cap of 0 corresponds to Minting NotAllowed + * @dev Allows a privileged role to set the supply cap for a vToken. A supply cap of 0 corresponds to Minting NotAllowed * @param vTokens The addresses of the markets (tokens) to change the supply caps for * @param newSupplyCaps The new supply cap values in underlying to be set. A value of 0 corresponds to Minting NotAllowed */ @@ -307,6 +308,7 @@ contract SetterFacet is ISetterFacet, FacetBase { /** * @notice Set whole protocol pause/unpause state + * @dev Allows a privileged role to pause/unpause protocol * @param state The new state (true=paused, false=unpaused) * @return bool The updated state of the protocol */ @@ -320,6 +322,7 @@ contract SetterFacet is ISetterFacet, FacetBase { /** * @notice Pause/unpause certain actions + * @dev Allows a privileged role to pause/unpause the protocol action state * @param markets_ Markets to pause/unpause the actions on * @param actions_ List of action ids to pause/unpause * @param paused_ The new paused state (true=paused, false=unpaused) From 0e24ded96aeea3ac7aaac56daa9b0e9fab228452 Mon Sep 17 00:00:00 2001 From: Debugger022 Date: Mon, 28 Aug 2023 19:50:17 +0530 Subject: [PATCH 136/153] fix: ven-1887 ven-12 --- contracts/Comptroller/Diamond/facets/MarketFacet.sol | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/contracts/Comptroller/Diamond/facets/MarketFacet.sol b/contracts/Comptroller/Diamond/facets/MarketFacet.sol index 36ef33b17..a51f286a5 100644 --- a/contracts/Comptroller/Diamond/facets/MarketFacet.sol +++ b/contracts/Comptroller/Diamond/facets/MarketFacet.sol @@ -74,8 +74,9 @@ contract MarketFacet is IMarketFacet, FacetBase { address vTokenCollateral, uint256 actualRepayAmount ) external view returns (uint256, uint256) { - (uint256 err, uint256 seizeTokens) = comptrollerLens.liquidateVAICalculateSeizeTokens( + (uint256 err, uint256 seizeTokens) = comptrollerLens.liquidateCalculateSeizeTokens( address(this), + vaiController.getVAIAddress(), vTokenCollateral, actualRepayAmount ); From c60497ab220cb483b75df242ffd4fe08439a438e Mon Sep 17 00:00:00 2001 From: Debugger022 Date: Mon, 28 Aug 2023 20:52:48 +0530 Subject: [PATCH 137/153] fix: ven-1887 ven-04 --- .../Diamond/facets/SetterFacet.sol | 13 ++++++++++++- .../Comptroller/Diamond/comptrollerTest.ts | 19 ++++++++++++++++++- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/contracts/Comptroller/Diamond/facets/SetterFacet.sol b/contracts/Comptroller/Diamond/facets/SetterFacet.sol index 16c323e0e..6fb88d815 100644 --- a/contracts/Comptroller/Diamond/facets/SetterFacet.sol +++ b/contracts/Comptroller/Diamond/facets/SetterFacet.sol @@ -129,8 +129,18 @@ contract SetterFacet is ISetterFacet, FacetBase { // Check caller is admin ensureAdmin(); - uint256 oldCloseFactorMantissa = closeFactorMantissa; + Exp memory newCloseFactorExp = Exp({ mantissa: newCloseFactorMantissa }); + + //-- Check close factor <= 0.9 + Exp memory highLimit = Exp({ mantissa: closeFactorMaxMantissa }); + //-- Check close factor >= 0.05 + Exp memory lowLimit = Exp({ mantissa: closeFactorMinMantissa }); + if (lessThanExp(highLimit, newCloseFactorExp) && greaterThanExp(lowLimit, newCloseFactorExp)) { + return fail(Error.INVALID_CLOSE_FACTOR, FailureInfo.SET_CLOSE_FACTOR_VALIDATION); + } + + uint256 oldCloseFactorMantissa = closeFactorMantissa; closeFactorMantissa = newCloseFactorMantissa; emit NewCloseFactor(oldCloseFactorMantissa, newCloseFactorMantissa); @@ -238,6 +248,7 @@ contract SetterFacet is ISetterFacet, FacetBase { ) external compareAddress(liquidatorContract, newLiquidatorContract_) { // Check caller is admin ensureAdmin(); + ensureNonzeroAddress(newLiquidatorContract_); address oldLiquidatorContract = liquidatorContract; liquidatorContract = newLiquidatorContract_; emit NewLiquidatorContract(oldLiquidatorContract, newLiquidatorContract_); diff --git a/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts b/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts index 15560e882..ecb1e658e 100644 --- a/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts +++ b/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts @@ -201,6 +201,13 @@ describe("Comptroller", () => { "old address is same as new address", ); }); + + it("should revert on zero address", async () => { + await comptroller._setLiquidatorContract(accounts[0].address); + await expect(comptroller._setLiquidatorContract(constants.AddressZero)).to.be.revertedWith( + "can't be zero address", + ); + }); }); describe("_setPauseGuardian", () => { @@ -328,7 +335,8 @@ describe("Comptroller", () => { describe("_setCloseFactor", () => { let comptroller: ComptrollerMock; - + let unitroller: Unitroller; + beforeEach(async () => { ({ comptroller } = await loadFixture(deploySimpleComptroller)); }); @@ -340,6 +348,15 @@ describe("Comptroller", () => { it("should revert on same values", async () => { await expect(comptroller._setCloseFactor(0)).to.be.revertedWith("old value is same as new value"); }); + + it("fails if factor is set out of range", async () => { + expect(await comptroller._setCloseFactor(convertToUnit(1, 18))) + .to.emit(unitroller, "Failure") + .withArgs( + ComptrollerErrorReporter.Error.INVALID_CLOSE_FACTOR, + ComptrollerErrorReporter.FailureInfo.SET_CLOSE_FACTOR_VALIDATION, + ); + }); }); describe("_setCollateralFactor", () => { From d09d8d37d7892609120403806b188be7b36f7d66 Mon Sep 17 00:00:00 2001 From: Debugger022 Date: Mon, 28 Aug 2023 21:13:30 +0530 Subject: [PATCH 138/153] fix: lint --- tests/hardhat/Comptroller/Diamond/comptrollerTest.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts b/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts index ecb1e658e..511860552 100644 --- a/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts +++ b/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts @@ -336,7 +336,7 @@ describe("Comptroller", () => { describe("_setCloseFactor", () => { let comptroller: ComptrollerMock; let unitroller: Unitroller; - + beforeEach(async () => { ({ comptroller } = await loadFixture(deploySimpleComptroller)); }); From fa26e52206ef47ea59728f90da9cb409149f574a Mon Sep 17 00:00:00 2001 From: Debugger022 Date: Fri, 1 Sep 2023 15:21:21 +0530 Subject: [PATCH 139/153] fix: replaced And operator with OR while checking cutoff --- contracts/Comptroller/Diamond/facets/SetterFacet.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/Comptroller/Diamond/facets/SetterFacet.sol b/contracts/Comptroller/Diamond/facets/SetterFacet.sol index 6fb88d815..d90a320fd 100644 --- a/contracts/Comptroller/Diamond/facets/SetterFacet.sol +++ b/contracts/Comptroller/Diamond/facets/SetterFacet.sol @@ -136,7 +136,7 @@ contract SetterFacet is ISetterFacet, FacetBase { //-- Check close factor >= 0.05 Exp memory lowLimit = Exp({ mantissa: closeFactorMinMantissa }); - if (lessThanExp(highLimit, newCloseFactorExp) && greaterThanExp(lowLimit, newCloseFactorExp)) { + if (lessThanExp(highLimit, newCloseFactorExp) || greaterThanExp(lowLimit, newCloseFactorExp)) { return fail(Error.INVALID_CLOSE_FACTOR, FailureInfo.SET_CLOSE_FACTOR_VALIDATION); } From 547f77f32dba3921e6c8e25c8476e91c72a942ef Mon Sep 17 00:00:00 2001 From: Debugger022 Date: Mon, 4 Sep 2023 17:24:47 +0530 Subject: [PATCH 140/153] refactor: netspec comments --- contracts/Comptroller/Diamond/Diamond.sol | 5 +++++ contracts/Comptroller/Diamond/facets/FacetBase.sol | 5 +++++ contracts/Comptroller/Diamond/facets/MarketFacet.sol | 3 +++ contracts/Comptroller/Diamond/facets/PolicyFacet.sol | 3 +++ contracts/Comptroller/Diamond/facets/RewardFacet.sol | 3 +++ contracts/Comptroller/Diamond/facets/SetterFacet.sol | 3 +++ contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol | 5 ++++- 7 files changed, 26 insertions(+), 1 deletion(-) diff --git a/contracts/Comptroller/Diamond/Diamond.sol b/contracts/Comptroller/Diamond/Diamond.sol index 3cb4d294b..1fe6bdd4c 100644 --- a/contracts/Comptroller/Diamond/Diamond.sol +++ b/contracts/Comptroller/Diamond/Diamond.sol @@ -6,6 +6,11 @@ pragma experimental ABIEncoderV2; import { IDiamondCut } from "./interfaces/IDiamondCut.sol"; import { Unitroller, ComptrollerV12Storage } from "../Unitroller.sol"; + /** + * @title Diamond + * @author Venus + * @notice This contract contains functions related to facets + */ contract Diamond is IDiamondCut, ComptrollerV12Storage { /// @notice Emitted when functions are added, replaced or removed to facets event DiamondCut(IDiamondCut.FacetCut[] _diamondCut); diff --git a/contracts/Comptroller/Diamond/facets/FacetBase.sol b/contracts/Comptroller/Diamond/facets/FacetBase.sol index 44891e625..66336a7cb 100644 --- a/contracts/Comptroller/Diamond/facets/FacetBase.sol +++ b/contracts/Comptroller/Diamond/facets/FacetBase.sol @@ -8,6 +8,11 @@ import { ComptrollerV12Storage } from "../../../Comptroller/ComptrollerStorage.s import { IAccessControlManager } from "../../../Governance/IAccessControlManager.sol"; import { SafeBEP20, IBEP20 } from "../../../Utils/SafeBEP20.sol"; +/** + * @title FacetBase + * @author Venus + * @notice This facet contract contains functions related to access and checks + */ contract FacetBase is ComptrollerV12Storage, ExponentialNoError, ComptrollerErrorReporter { /// @notice Emitted when an account enters a market event MarketEntered(VToken indexed vToken, address indexed account); diff --git a/contracts/Comptroller/Diamond/facets/MarketFacet.sol b/contracts/Comptroller/Diamond/facets/MarketFacet.sol index a51f286a5..01c36901b 100644 --- a/contracts/Comptroller/Diamond/facets/MarketFacet.sol +++ b/contracts/Comptroller/Diamond/facets/MarketFacet.sol @@ -6,7 +6,10 @@ import { IMarketFacet } from "../interfaces/IMarketFacet.sol"; import { FacetBase, VToken } from "./FacetBase.sol"; /** + * @title MarketFacet + * @author Venus * @dev This facet contains all the methods related to the market's management in the pool + * @notice This facet contract contains functions regarding markets */ contract MarketFacet is IMarketFacet, FacetBase { /// @notice Emitted when an admin supports a market diff --git a/contracts/Comptroller/Diamond/facets/PolicyFacet.sol b/contracts/Comptroller/Diamond/facets/PolicyFacet.sol index f17af7544..2b0e3d50e 100644 --- a/contracts/Comptroller/Diamond/facets/PolicyFacet.sol +++ b/contracts/Comptroller/Diamond/facets/PolicyFacet.sol @@ -7,7 +7,10 @@ import { IPolicyFacet } from "../interfaces/IPolicyFacet.sol"; import { XVSRewardsHelper, VToken } from "./XVSRewardsHelper.sol"; /** + * @title PolicyFacet + * @author Venus * @dev This facet contains all the hooks used while transferring the assets + * @notice This facet contract contains all the external pre-hook functions related to vToken */ contract PolicyFacet is IPolicyFacet, XVSRewardsHelper { /// @notice Emitted when a new borrow-side XVS speed is calculated for a market diff --git a/contracts/Comptroller/Diamond/facets/RewardFacet.sol b/contracts/Comptroller/Diamond/facets/RewardFacet.sol index 773422125..6e2888a7b 100644 --- a/contracts/Comptroller/Diamond/facets/RewardFacet.sol +++ b/contracts/Comptroller/Diamond/facets/RewardFacet.sol @@ -8,7 +8,10 @@ import { SafeBEP20, IBEP20 } from "../../../Utils/SafeBEP20.sol"; import { VBep20Interface } from "../../../Tokens/VTokens/VTokenInterfaces.sol"; /** + * @title RewardFacet + * @author Venus * @dev This facet contains all the methods related to the reward functionality + * @notice This facet contract provides the external functions related to all claims and rewards of the protocol */ contract RewardFacet is IRewardFacet, XVSRewardsHelper { /// @notice Emitted when Venus is granted by admin diff --git a/contracts/Comptroller/Diamond/facets/SetterFacet.sol b/contracts/Comptroller/Diamond/facets/SetterFacet.sol index d90a320fd..561b75240 100644 --- a/contracts/Comptroller/Diamond/facets/SetterFacet.sol +++ b/contracts/Comptroller/Diamond/facets/SetterFacet.sol @@ -9,7 +9,10 @@ import { VAIControllerInterface } from "../../../Tokens/VAI/VAIControllerInterfa import { FacetBase, VToken } from "./FacetBase.sol"; /** + * @title SetterFacet + * @author Venus * @dev This facet contains all the setters for the states + * @notice This facet contract contains all the configurational setter functions */ contract SetterFacet is ISetterFacet, FacetBase { /// @notice Emitted when close factor is changed by admin diff --git a/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol b/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol index 82fb819ec..2beb058f3 100644 --- a/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol +++ b/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol @@ -4,8 +4,11 @@ pragma solidity 0.5.16; import { FacetBase, VToken } from "./FacetBase.sol"; -/** + /** + * @title XVSRewardsHelper + * @author Venus * @dev This contract contains internal functions used in RewardFacet and PolicyFacet + * @notice This facet contract contains the shared functions used by the RewardFacet and PolicyFacet */ contract XVSRewardsHelper is FacetBase { /// @notice Emitted when XVS is distributed to a borrower From cf9c7cb74519ae8fc8c99add9997f63087ac2f96 Mon Sep 17 00:00:00 2001 From: Debugger022 Date: Thu, 7 Sep 2023 19:43:54 +0530 Subject: [PATCH 141/153] feat: force liquidation implementation --- contracts/Comptroller/ComptrollerStorage.sol | 4 + contracts/Comptroller/Diamond/Diamond.sol | 6 +- .../Comptroller/Diamond/facets/FacetBase.sol | 4 +- .../Diamond/facets/PolicyFacet.sol | 20 +- .../Diamond/facets/SetterFacet.sol | 12 ++ .../Diamond/interfaces/IRewardFacet.sol | 4 +- .../Diamond/interfaces/ISetterFacet.sol | 6 +- .../Comptroller/Diamond/comptrollerTest.ts | 197 ++++++++++++++++++ 8 files changed, 237 insertions(+), 16 deletions(-) diff --git a/contracts/Comptroller/ComptrollerStorage.sol b/contracts/Comptroller/ComptrollerStorage.sol index 0ee8b0c01..15cd903ad 100644 --- a/contracts/Comptroller/ComptrollerStorage.sol +++ b/contracts/Comptroller/ComptrollerStorage.sol @@ -238,6 +238,10 @@ contract ComptrollerV11Storage is ComptrollerV10Storage { } contract ComptrollerV12Storage is ComptrollerV11Storage { + mapping(address => bool) public isForcedLiquidationEnabled; +} + +contract ComptrollerV13Storage is ComptrollerV12Storage { struct FacetAddressAndPosition { address facetAddress; uint96 functionSelectorPosition; // position in _facetFunctionSelectors.functionSelectors array diff --git a/contracts/Comptroller/Diamond/Diamond.sol b/contracts/Comptroller/Diamond/Diamond.sol index 86d991267..020edb35f 100644 --- a/contracts/Comptroller/Diamond/Diamond.sol +++ b/contracts/Comptroller/Diamond/Diamond.sol @@ -4,9 +4,9 @@ pragma solidity 0.5.16; pragma experimental ABIEncoderV2; import { IDiamondCut } from "./interfaces/IDiamondCut.sol"; -import { Unitroller, ComptrollerV12Storage } from "../Unitroller.sol"; +import { Unitroller, ComptrollerV13Storage } from "../Unitroller.sol"; -contract Diamond is IDiamondCut, ComptrollerV12Storage { +contract Diamond is IDiamondCut, ComptrollerV13Storage { /// @notice Emitted when functions are added, replaced or removed to facets event DiamondCut(IDiamondCut.FacetCut[] _diamondCut); @@ -66,7 +66,7 @@ contract Diamond is IDiamondCut, ComptrollerV12Storage { */ function facetAddress( bytes4 functionSelector - ) external view returns (ComptrollerV12Storage.FacetAddressAndPosition memory) { + ) external view returns (ComptrollerV13Storage.FacetAddressAndPosition memory) { return _selectorToFacetAndPosition[functionSelector]; } diff --git a/contracts/Comptroller/Diamond/facets/FacetBase.sol b/contracts/Comptroller/Diamond/facets/FacetBase.sol index 44891e625..37e42f6ba 100644 --- a/contracts/Comptroller/Diamond/facets/FacetBase.sol +++ b/contracts/Comptroller/Diamond/facets/FacetBase.sol @@ -4,11 +4,11 @@ pragma solidity 0.5.16; import { VToken, ComptrollerErrorReporter, ExponentialNoError } from "../../../Tokens/VTokens/VToken.sol"; import { IVAIVault } from "../../../Comptroller/ComptrollerInterface.sol"; -import { ComptrollerV12Storage } from "../../../Comptroller/ComptrollerStorage.sol"; +import { ComptrollerV13Storage } from "../../../Comptroller/ComptrollerStorage.sol"; import { IAccessControlManager } from "../../../Governance/IAccessControlManager.sol"; import { SafeBEP20, IBEP20 } from "../../../Utils/SafeBEP20.sol"; -contract FacetBase is ComptrollerV12Storage, ExponentialNoError, ComptrollerErrorReporter { +contract FacetBase is ComptrollerV13Storage, ExponentialNoError, ComptrollerErrorReporter { /// @notice Emitted when an account enters a market event MarketEntered(VToken indexed vToken, address indexed account); diff --git a/contracts/Comptroller/Diamond/facets/PolicyFacet.sol b/contracts/Comptroller/Diamond/facets/PolicyFacet.sol index 5a304308b..c41e1d5f5 100644 --- a/contracts/Comptroller/Diamond/facets/PolicyFacet.sol +++ b/contracts/Comptroller/Diamond/facets/PolicyFacet.sol @@ -222,8 +222,20 @@ contract PolicyFacet is IPolicyFacet, XVSRewardsHelper { } ensureListed(markets[vTokenCollateral]); + + uint256 borrowBalance; if (address(vTokenBorrowed) != address(vaiController)) { ensureListed(markets[vTokenBorrowed]); + borrowBalance = VToken(vTokenBorrowed).borrowBalanceStored(borrower); + } else { + borrowBalance = vaiController.getVAIRepayAmount(borrower); + } + + if (isForcedLiquidationEnabled[vTokenBorrowed]) { + if (repayAmount > borrowBalance) { + return uint(Error.TOO_MUCH_REPAY); + } + return uint(Error.NO_ERROR); } /* The borrower must have shortfall in order to be liquidatable */ @@ -235,13 +247,7 @@ contract PolicyFacet is IPolicyFacet, XVSRewardsHelper { return uint256(Error.INSUFFICIENT_SHORTFALL); } - /* The liquidator may not repay more than what is allowed by the closeFactor */ - uint256 borrowBalance; - if (address(vTokenBorrowed) != address(vaiController)) { - borrowBalance = VToken(vTokenBorrowed).borrowBalanceStored(borrower); - } else { - borrowBalance = vaiController.getVAIRepayAmount(borrower); - } + // The liquidator may not repay more than what is allowed by the closeFactor //-- maxClose = multipy of closeFactorMantissa and borrowBalance if (repayAmount > mul_ScalarTruncate(Exp({ mantissa: closeFactorMantissa }), borrowBalance)) { return uint256(Error.TOO_MUCH_REPAY); diff --git a/contracts/Comptroller/Diamond/facets/SetterFacet.sol b/contracts/Comptroller/Diamond/facets/SetterFacet.sol index 241230bec..8e5471872 100644 --- a/contracts/Comptroller/Diamond/facets/SetterFacet.sol +++ b/contracts/Comptroller/Diamond/facets/SetterFacet.sol @@ -73,6 +73,9 @@ contract SetterFacet is ISetterFacet, FacetBase { /// @notice Emitted when Venus VAI Vault rate is changed event NewVenusVAIVaultRate(uint256 oldVenusVAIVaultRate, uint256 newVenusVAIVaultRate); + /// @notice Emitted when force liquidation enabled for a market + event IsForcedLiquidationEnabledUpdated(address indexed vToken, bool enable); + /** * @notice Compare two addresses to ensure they are different * @param oldAddress The original address to compare @@ -494,4 +497,13 @@ contract SetterFacet is ISetterFacet, FacetBase { minReleaseAmount = minReleaseAmount_; emit NewVAIVaultInfo(vault_, releaseStartBlock_, minReleaseAmount_); } + + function _setForcedLiquidation(address vTokenBorrowed, bool enable) external { + ensureAllowed("setForcedLiquidation(address,bool)"); + if (vTokenBorrowed != address(vaiController)) { + ensureListed(markets[vTokenBorrowed]); + } + isForcedLiquidationEnabled[address(vTokenBorrowed)] = enable; + emit IsForcedLiquidationEnabledUpdated(vTokenBorrowed, enable); + } } diff --git a/contracts/Comptroller/Diamond/interfaces/IRewardFacet.sol b/contracts/Comptroller/Diamond/interfaces/IRewardFacet.sol index 7eb04c6c4..28bce9f9f 100644 --- a/contracts/Comptroller/Diamond/interfaces/IRewardFacet.sol +++ b/contracts/Comptroller/Diamond/interfaces/IRewardFacet.sol @@ -3,7 +3,7 @@ pragma solidity 0.5.16; import { VToken } from "../../../Tokens/VTokens/VToken.sol"; -import { ComptrollerV12Storage } from "../../ComptrollerStorage.sol"; +import { ComptrollerV13Storage } from "../../ComptrollerStorage.sol"; interface IRewardFacet { function claimVenus(address holder) external; @@ -22,7 +22,7 @@ interface IRewardFacet { function getXVSVTokenAddress() external pure returns (address); - function actionPaused(address market, ComptrollerV12Storage.Action action) external view returns (bool); + function actionPaused(address market, ComptrollerV13Storage.Action action) external view returns (bool); function releaseToVault() external; diff --git a/contracts/Comptroller/Diamond/interfaces/ISetterFacet.sol b/contracts/Comptroller/Diamond/interfaces/ISetterFacet.sol index 953a70a77..abb5ad0f4 100644 --- a/contracts/Comptroller/Diamond/interfaces/ISetterFacet.sol +++ b/contracts/Comptroller/Diamond/interfaces/ISetterFacet.sol @@ -4,7 +4,7 @@ pragma solidity 0.5.16; import { PriceOracle } from "../../../Oracle/PriceOracle.sol"; import { VToken } from "../../../Tokens/VTokens/VToken.sol"; -import { ComptrollerV12Storage } from "../../ComptrollerStorage.sol"; +import { ComptrollerV13Storage } from "../../ComptrollerStorage.sol"; import { VAIControllerInterface } from "../../../Tokens/VAI/VAIController.sol"; import { ComptrollerLensInterface } from "../../../Comptroller/ComptrollerLensInterface.sol"; @@ -31,7 +31,7 @@ interface ISetterFacet { function _setActionsPaused( address[] calldata markets, - ComptrollerV12Storage.Action[] calldata actions, + ComptrollerV13Storage.Action[] calldata actions, bool paused ) external; @@ -52,4 +52,6 @@ interface ISetterFacet { function _setVenusVAIVaultRate(uint256 venusVAIVaultRate_) external; function _setVAIVaultInfo(address vault_, uint256 releaseStartBlock_, uint256 minReleaseAmount_) external; + + function _setForcedLiquidation(address vToken, bool enable) external; } diff --git a/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts b/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts index 15560e882..41ef45d25 100644 --- a/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts +++ b/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts @@ -13,6 +13,7 @@ import { IAccessControlManager, PriceOracle, Unitroller, + VAIController, VToken, } from "../../../../typechain"; import { ComptrollerErrorReporter } from "../../util/Errors"; @@ -395,6 +396,63 @@ describe("Comptroller", () => { }); }); + describe("_setForcedLiquidation", async () => { + let comptroller: MockContract; + let vToken: FakeContract; + let accessControl: FakeContract; + + type Contracts = SimpleComptrollerFixture & { vToken: FakeContract }; + + async function deploy(): Promise { + const contracts = await deploySimpleComptroller(); + const vToken = await smock.fake("VToken"); + await contracts.comptroller._supportMarket(vToken.address); + return { ...contracts, vToken }; + } + + beforeEach(async () => { + ({ comptroller, vToken, accessControl } = await loadFixture(deploy)); + configureVToken(vToken, comptroller); + }); + + it("fails if asset is not listed", async () => { + const someVToken = await smock.fake("VToken"); + await expect(comptroller._setForcedLiquidation(someVToken.address, true)).to.be.revertedWith("market not listed"); + }); + + it("fails if ACM does not allow the call", async () => { + accessControl.isAllowedToCall.returns(false); + await expect(comptroller._setForcedLiquidation(vToken.address, true)).to.be.revertedWith("access denied"); + accessControl.isAllowedToCall.returns(true); + }); + + it("sets forced liquidation", async () => { + await comptroller._setForcedLiquidation(vToken.address, true); + expect(await comptroller.isForcedLiquidationEnabled(vToken.address)).to.be.true; + + await comptroller._setForcedLiquidation(vToken.address, false); + expect(await comptroller.isForcedLiquidationEnabled(vToken.address)).to.be.false; + }); + + it("sets forced liquidation for VAI, even though it is not a listed market", async () => { + const vaiController = await smock.fake("VAIController"); + await comptroller._setVAIController(vaiController.address); + await comptroller._setForcedLiquidation(vaiController.address, true); + expect(await comptroller.isForcedLiquidationEnabled(vaiController.address)).to.be.true; + + await comptroller._setForcedLiquidation(vaiController.address, false); + expect(await comptroller.isForcedLiquidationEnabled(vaiController.address)).to.be.false; + }); + + it("emits IsForcedLiquidationEnabledUpdated event", async () => { + const tx1 = await comptroller._setForcedLiquidation(vToken.address, true); + await expect(tx1).to.emit(comptroller, "IsForcedLiquidationEnabledUpdated").withArgs(vToken.address, true); + + const tx2 = await comptroller._setForcedLiquidation(vToken.address, false); + await expect(tx2).to.emit(comptroller, "IsForcedLiquidationEnabledUpdated").withArgs(vToken.address, false); + }); + }); + describe("_supportMarket", () => { let unitroller: Unitroller; let comptroller: ComptrollerMock; @@ -534,5 +592,144 @@ describe("Comptroller", () => { ); }); }); + + describe("liquidateBorrowAllowed", async () => { + const generalTests = () => { + it("reverts if borrowed market is not listed", async () => { + const someVToken = await smock.fake("VToken"); + await expect( + comptroller.liquidateBorrowAllowed( + someVToken.address, + vToken.address, + accounts[0].address, + root.address, + convertToUnit("1", 18), + ), + ).to.be.revertedWith("market not listed"); + }); + + it("reverts if collateral market is not listed", async () => { + const someVToken = await smock.fake("VToken"); + await expect( + comptroller.liquidateBorrowAllowed( + vToken.address, + someVToken.address, + accounts[0].address, + root.address, + convertToUnit("1", 18), + ), + ).to.be.revertedWith("market not listed"); + }); + + it("does not revert if borrowed vToken is VAIController", async () => { + const vaiController = await smock.fake("VAIController"); + await comptroller._setVAIController(vaiController.address); + await expect( + comptroller.liquidateBorrowAllowed( + vaiController.address, + vToken.address, + accounts[0].address, + root.address, + convertToUnit("1", 18), + ), + ).to.not.be.revertedWith("market not listed"); + }); + }; + + describe("isForcedLiquidationEnabled == true", async () => { + beforeEach(async () => { + await comptroller._setForcedLiquidation(vToken.address, true); + }); + + generalTests(); + + it("allows liquidations without shortfall", async () => { + vToken.borrowBalanceStored.returns(convertToUnit("100", 18)); + const errCode = await comptroller.callStatic.liquidateBorrowAllowed( + vToken.address, + vToken.address, + accounts[0].address, + root.address, + convertToUnit("1", 18), + ); + expect(errCode).to.equal(0); + }); + + it("allows to repay 100% of the borrow", async () => { + vToken.borrowBalanceStored.returns(convertToUnit("1", 18)); + const errCode = await comptroller.callStatic.liquidateBorrowAllowed( + vToken.address, + vToken.address, + accounts[0].address, + root.address, + convertToUnit("1", 18), + ); + expect(errCode).to.equal(0); + }); + + it("fails with TOO_MUCH_REPAY if trying to repay > borrowed amount", async () => { + vToken.borrowBalanceStored.returns(convertToUnit("0.99", 18)); + const errCode = await comptroller.callStatic.liquidateBorrowAllowed( + vToken.address, + vToken.address, + accounts[0].address, + root.address, + convertToUnit("1", 18), + ); + expect(errCode).to.equal(17); + }); + + it("checks the shortfall if isForcedLiquidationEnabled is set back to false", async () => { + await comptroller._setForcedLiquidation(vToken.address, false); + vToken.borrowBalanceStored.returns(convertToUnit("100", 18)); + const errCode = await comptroller.callStatic.liquidateBorrowAllowed( + vToken.address, + vToken.address, + accounts[0].address, + root.address, + convertToUnit("1", 18), + ); + expect(errCode).to.equal(3); + }); + }); + + describe("isForcedLiquidationEnabled == false", async () => { + let comptrollerLens: FakeContract; + + beforeEach(async () => { + comptrollerLens = await smock.fake("ComptrollerLens"); + await comptroller._setComptrollerLens(comptrollerLens.address); + await comptroller._setCloseFactor(convertToUnit("0.5", 18)); + }); + + generalTests(); + + it("fails if borrower has 0 shortfall", async () => { + vToken.borrowBalanceStored.returns(convertToUnit("100", 18)); + comptrollerLens.getHypotheticalAccountLiquidity.returns([0, 1, 0]); + const errCode = await comptroller.callStatic.liquidateBorrowAllowed( + vToken.address, + vToken.address, + accounts[0].address, + root.address, + convertToUnit("1", 18), + ); + expect(errCode).to.equal(3); + }); + + it("succeeds if borrower has nonzero shortfall", async () => { + vToken.borrowBalanceStored.returns(convertToUnit("100", 18)); + comptrollerLens.getHypotheticalAccountLiquidity.returns([0, 0, 1]); + const errCode = await comptroller.callStatic.liquidateBorrowAllowed( + vToken.address, + vToken.address, + accounts[0].address, + root.address, + convertToUnit("1", 18), + ); + expect(errCode).to.equal(0); + }); + }); + }); }); }); From c563562ae9cc9dd11012f9cd13245d56c79fc939 Mon Sep 17 00:00:00 2001 From: Debugger022 Date: Fri, 8 Sep 2023 16:01:43 +0530 Subject: [PATCH 142/153] Revert "fix: ven-1887 ven-12" This reverts commit 0e24ded96aeea3ac7aaac56daa9b0e9fab228452. --- contracts/Comptroller/Diamond/facets/MarketFacet.sol | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/contracts/Comptroller/Diamond/facets/MarketFacet.sol b/contracts/Comptroller/Diamond/facets/MarketFacet.sol index 01c36901b..4209cafb5 100644 --- a/contracts/Comptroller/Diamond/facets/MarketFacet.sol +++ b/contracts/Comptroller/Diamond/facets/MarketFacet.sol @@ -77,9 +77,8 @@ contract MarketFacet is IMarketFacet, FacetBase { address vTokenCollateral, uint256 actualRepayAmount ) external view returns (uint256, uint256) { - (uint256 err, uint256 seizeTokens) = comptrollerLens.liquidateCalculateSeizeTokens( + (uint256 err, uint256 seizeTokens) = comptrollerLens.liquidateVAICalculateSeizeTokens( address(this), - vaiController.getVAIAddress(), vTokenCollateral, actualRepayAmount ); From a34816aedbd76aa3c6ee113e5d8fa8413124c941 Mon Sep 17 00:00:00 2001 From: Debugger022 Date: Fri, 8 Sep 2023 16:06:10 +0530 Subject: [PATCH 143/153] fix: lint --- contracts/Comptroller/Diamond/Diamond.sol | 2 +- contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/Comptroller/Diamond/Diamond.sol b/contracts/Comptroller/Diamond/Diamond.sol index 1fe6bdd4c..21ceef7c3 100644 --- a/contracts/Comptroller/Diamond/Diamond.sol +++ b/contracts/Comptroller/Diamond/Diamond.sol @@ -6,7 +6,7 @@ pragma experimental ABIEncoderV2; import { IDiamondCut } from "./interfaces/IDiamondCut.sol"; import { Unitroller, ComptrollerV12Storage } from "../Unitroller.sol"; - /** +/** * @title Diamond * @author Venus * @notice This contract contains functions related to facets diff --git a/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol b/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol index 2beb058f3..f2318eba8 100644 --- a/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol +++ b/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol @@ -4,7 +4,7 @@ pragma solidity 0.5.16; import { FacetBase, VToken } from "./FacetBase.sol"; - /** +/** * @title XVSRewardsHelper * @author Venus * @dev This contract contains internal functions used in RewardFacet and PolicyFacet From df08df4332e781c571a59b5c136438e0dd5961ab Mon Sep 17 00:00:00 2001 From: Debugger022 <104391977+Debugger022@users.noreply.github.com> Date: Fri, 8 Sep 2023 16:14:49 +0530 Subject: [PATCH 144/153] [VEN-1887]: Quantstamp audit fix for comptroller diamond proxy (#328) * fix: ven-1887 ven-08 * fix: ven-1887 ven-12 * fix: ven-1887 ven-04 * fix: lint * fix: replaced And operator with OR while checking cutoff * refactor: netspec comments * Revert "fix: ven-1887 ven-12" This reverts commit 0e24ded96aeea3ac7aaac56daa9b0e9fab228452. * fix: lint --- contracts/Comptroller/Diamond/Diamond.sol | 8 ++++- .../Comptroller/Diamond/facets/FacetBase.sol | 5 +++ .../Diamond/facets/MarketFacet.sol | 5 ++- .../Diamond/facets/PolicyFacet.sol | 4 +++ .../Diamond/facets/RewardFacet.sol | 6 +++- .../Diamond/facets/SetterFacet.sol | 35 ++++++++++++++----- .../Diamond/facets/XVSRewardsHelper.sol | 3 ++ .../Comptroller/Diamond/comptrollerTest.ts | 17 +++++++++ 8 files changed, 71 insertions(+), 12 deletions(-) diff --git a/contracts/Comptroller/Diamond/Diamond.sol b/contracts/Comptroller/Diamond/Diamond.sol index 86d991267..21ceef7c3 100644 --- a/contracts/Comptroller/Diamond/Diamond.sol +++ b/contracts/Comptroller/Diamond/Diamond.sol @@ -6,6 +6,11 @@ pragma experimental ABIEncoderV2; import { IDiamondCut } from "./interfaces/IDiamondCut.sol"; import { Unitroller, ComptrollerV12Storage } from "../Unitroller.sol"; +/** + * @title Diamond + * @author Venus + * @notice This contract contains functions related to facets + */ contract Diamond is IDiamondCut, ComptrollerV12Storage { /// @notice Emitted when functions are added, replaced or removed to facets event DiamondCut(IDiamondCut.FacetCut[] _diamondCut); @@ -25,7 +30,8 @@ contract Diamond is IDiamondCut, ComptrollerV12Storage { } /** - * @notice To add function selectors to the facets' mapping + * @notice To add function selectors to the facet's mapping + * @dev Allows the contract admin to add function selectors * @param diamondCut_ IDiamondCut contains facets address, action and function selectors */ function diamondCut(IDiamondCut.FacetCut[] memory diamondCut_) public { diff --git a/contracts/Comptroller/Diamond/facets/FacetBase.sol b/contracts/Comptroller/Diamond/facets/FacetBase.sol index 44891e625..66336a7cb 100644 --- a/contracts/Comptroller/Diamond/facets/FacetBase.sol +++ b/contracts/Comptroller/Diamond/facets/FacetBase.sol @@ -8,6 +8,11 @@ import { ComptrollerV12Storage } from "../../../Comptroller/ComptrollerStorage.s import { IAccessControlManager } from "../../../Governance/IAccessControlManager.sol"; import { SafeBEP20, IBEP20 } from "../../../Utils/SafeBEP20.sol"; +/** + * @title FacetBase + * @author Venus + * @notice This facet contract contains functions related to access and checks + */ contract FacetBase is ComptrollerV12Storage, ExponentialNoError, ComptrollerErrorReporter { /// @notice Emitted when an account enters a market event MarketEntered(VToken indexed vToken, address indexed account); diff --git a/contracts/Comptroller/Diamond/facets/MarketFacet.sol b/contracts/Comptroller/Diamond/facets/MarketFacet.sol index ceacb7930..4209cafb5 100644 --- a/contracts/Comptroller/Diamond/facets/MarketFacet.sol +++ b/contracts/Comptroller/Diamond/facets/MarketFacet.sol @@ -6,7 +6,10 @@ import { IMarketFacet } from "../interfaces/IMarketFacet.sol"; import { FacetBase, VToken } from "./FacetBase.sol"; /** + * @title MarketFacet + * @author Venus * @dev This facet contains all the methods related to the market's management in the pool + * @notice This facet contract contains functions regarding markets */ contract MarketFacet is IMarketFacet, FacetBase { /// @notice Emitted when an admin supports a market @@ -167,7 +170,7 @@ contract MarketFacet is IMarketFacet, FacetBase { /** * @notice Add the market to the markets mapping and set it as listed - * @dev Admin function to set isListed and add support for the market + * @dev Allows a privileged role to add and list markets to the Comptroller * @param vToken The address of the market (token) to list * @return uint256 0=success, otherwise a failure. (See enum Error for details) */ diff --git a/contracts/Comptroller/Diamond/facets/PolicyFacet.sol b/contracts/Comptroller/Diamond/facets/PolicyFacet.sol index 5a304308b..2b0e3d50e 100644 --- a/contracts/Comptroller/Diamond/facets/PolicyFacet.sol +++ b/contracts/Comptroller/Diamond/facets/PolicyFacet.sol @@ -7,7 +7,10 @@ import { IPolicyFacet } from "../interfaces/IPolicyFacet.sol"; import { XVSRewardsHelper, VToken } from "./XVSRewardsHelper.sol"; /** + * @title PolicyFacet + * @author Venus * @dev This facet contains all the hooks used while transferring the assets + * @notice This facet contract contains all the external pre-hook functions related to vToken */ contract PolicyFacet is IPolicyFacet, XVSRewardsHelper { /// @notice Emitted when a new borrow-side XVS speed is calculated for a market @@ -417,6 +420,7 @@ contract PolicyFacet is IPolicyFacet, XVSRewardsHelper { // setter functionality /** * @notice Set XVS speed for a single market + * @dev Allows the contract admin to set XVS speed for a market * @param vTokens The market whose XVS speed to update * @param supplySpeeds New XVS speed for supply * @param borrowSpeeds New XVS speed for borrow diff --git a/contracts/Comptroller/Diamond/facets/RewardFacet.sol b/contracts/Comptroller/Diamond/facets/RewardFacet.sol index e059e16a7..6e2888a7b 100644 --- a/contracts/Comptroller/Diamond/facets/RewardFacet.sol +++ b/contracts/Comptroller/Diamond/facets/RewardFacet.sol @@ -8,7 +8,10 @@ import { SafeBEP20, IBEP20 } from "../../../Utils/SafeBEP20.sol"; import { VBep20Interface } from "../../../Tokens/VTokens/VTokenInterfaces.sol"; /** + * @title RewardFacet + * @author Venus * @dev This facet contains all the methods related to the reward functionality + * @notice This facet contract provides the external functions related to all claims and rewards of the protocol */ contract RewardFacet is IRewardFacet, XVSRewardsHelper { /// @notice Emitted when Venus is granted by admin @@ -110,7 +113,8 @@ contract RewardFacet is IRewardFacet, XVSRewardsHelper { /** * @notice Transfer XVS to the recipient - * @dev Note: If there is not enough XVS, we do not perform the transfer all + * @dev Allows the contract admin to transfer XVS to any recipient based on the recipient's shortfall + * Note: If there is not enough XVS, we do not perform the transfer all * @param recipient The address of the recipient to transfer XVS to * @param amount The amount of XVS to (possibly) transfer */ diff --git a/contracts/Comptroller/Diamond/facets/SetterFacet.sol b/contracts/Comptroller/Diamond/facets/SetterFacet.sol index 241230bec..561b75240 100644 --- a/contracts/Comptroller/Diamond/facets/SetterFacet.sol +++ b/contracts/Comptroller/Diamond/facets/SetterFacet.sol @@ -9,7 +9,10 @@ import { VAIControllerInterface } from "../../../Tokens/VAI/VAIControllerInterfa import { FacetBase, VToken } from "./FacetBase.sol"; /** + * @title SetterFacet + * @author Venus * @dev This facet contains all the setters for the states + * @notice This facet contract contains all the configurational setter functions */ contract SetterFacet is ISetterFacet, FacetBase { /// @notice Emitted when close factor is changed by admin @@ -95,7 +98,7 @@ contract SetterFacet is ISetterFacet, FacetBase { /** * @notice Sets a new price oracle for the comptroller - * @dev Admin function to set a new price oracle + * @dev Allows the contract admin to set a new price oracle used by the Comptroller * @return uint256 0=success, otherwise a failure (see ErrorReporter.sol for details) */ function _setPriceOracle( @@ -119,7 +122,7 @@ contract SetterFacet is ISetterFacet, FacetBase { /** * @notice Sets the closeFactor used when liquidating borrows - * @dev Admin function to set closeFactor + * @dev Allows the contract admin to set the closeFactor used to liquidate borrows * @param newCloseFactorMantissa New close factor, scaled by 1e18 * @return uint256 0=success, otherwise will revert */ @@ -129,8 +132,18 @@ contract SetterFacet is ISetterFacet, FacetBase { // Check caller is admin ensureAdmin(); - uint256 oldCloseFactorMantissa = closeFactorMantissa; + Exp memory newCloseFactorExp = Exp({ mantissa: newCloseFactorMantissa }); + + //-- Check close factor <= 0.9 + Exp memory highLimit = Exp({ mantissa: closeFactorMaxMantissa }); + //-- Check close factor >= 0.05 + Exp memory lowLimit = Exp({ mantissa: closeFactorMinMantissa }); + if (lessThanExp(highLimit, newCloseFactorExp) || greaterThanExp(lowLimit, newCloseFactorExp)) { + return fail(Error.INVALID_CLOSE_FACTOR, FailureInfo.SET_CLOSE_FACTOR_VALIDATION); + } + + uint256 oldCloseFactorMantissa = closeFactorMantissa; closeFactorMantissa = newCloseFactorMantissa; emit NewCloseFactor(oldCloseFactorMantissa, newCloseFactorMantissa); @@ -139,7 +152,7 @@ contract SetterFacet is ISetterFacet, FacetBase { /** * @notice Sets the address of the access control of this contract - * @dev Admin function to set the access control address + * @dev Allows the contract admin to set the address of access control of this contract * @param newAccessControlAddress New address for the access control * @return uint256 0=success, otherwise will revert */ @@ -160,7 +173,7 @@ contract SetterFacet is ISetterFacet, FacetBase { /** * @notice Sets the collateralFactor for a market - * @dev Restricted function to set per-market collateralFactor + * @dev Allows a privileged role to set the collateralFactorMantissa * @param vToken The market to set the factor on * @param newCollateralFactorMantissa The new collateral factor, scaled by 1e18 * @return uint256 0=success, otherwise a failure. (See ErrorReporter for details) @@ -206,7 +219,7 @@ contract SetterFacet is ISetterFacet, FacetBase { /** * @notice Sets liquidationIncentive - * @dev Admin function to set liquidationIncentive + * @dev Allows a privileged role to set the liquidationIncentiveMantissa * @param newLiquidationIncentiveMantissa New liquidationIncentive scaled by 1e18 * @return uint256 0=success, otherwise a failure. (See ErrorReporter for details) */ @@ -230,7 +243,7 @@ contract SetterFacet is ISetterFacet, FacetBase { /** * @notice Update the address of the liquidator contract - * @dev Admin function to set liquidator contract + * @dev Allows the contract admin to update the address of liquidator contract * @param newLiquidatorContract_ The new address of the liquidator contract */ function _setLiquidatorContract( @@ -238,6 +251,7 @@ contract SetterFacet is ISetterFacet, FacetBase { ) external compareAddress(liquidatorContract, newLiquidatorContract_) { // Check caller is admin ensureAdmin(); + ensureNonzeroAddress(newLiquidatorContract_); address oldLiquidatorContract = liquidatorContract; liquidatorContract = newLiquidatorContract_; emit NewLiquidatorContract(oldLiquidatorContract, newLiquidatorContract_); @@ -245,6 +259,7 @@ contract SetterFacet is ISetterFacet, FacetBase { /** * @notice Admin function to change the Pause Guardian + * @dev Allows the contract admin to change the Pause Guardian * @param newPauseGuardian The address of the new Pause Guardian * @return uint256 0=success, otherwise a failure. (See enum Error for details) */ @@ -267,7 +282,7 @@ contract SetterFacet is ISetterFacet, FacetBase { /** * @notice Set the given borrow caps for the given vToken market Borrowing that brings total borrows to or above borrow cap will revert - * @dev Access is controled by ACM. A borrow cap of 0 corresponds to unlimited borrowing + * @dev Allows a privileged role to set the borrowing cap for a vToken market. A borrow cap of 0 corresponds to unlimited borrowing * @param vTokens The addresses of the markets (tokens) to change the borrow caps for * @param newBorrowCaps The new borrow cap values in underlying to be set. A value of 0 corresponds to unlimited borrowing */ @@ -287,7 +302,7 @@ contract SetterFacet is ISetterFacet, FacetBase { /** * @notice Set the given supply caps for the given vToken market Supply that brings total Supply to or above supply cap will revert - * @dev Admin function to set the supply cap A supply cap of 0 corresponds to Minting NotAllowed + * @dev Allows a privileged role to set the supply cap for a vToken. A supply cap of 0 corresponds to Minting NotAllowed * @param vTokens The addresses of the markets (tokens) to change the supply caps for * @param newSupplyCaps The new supply cap values in underlying to be set. A value of 0 corresponds to Minting NotAllowed */ @@ -307,6 +322,7 @@ contract SetterFacet is ISetterFacet, FacetBase { /** * @notice Set whole protocol pause/unpause state + * @dev Allows a privileged role to pause/unpause protocol * @param state The new state (true=paused, false=unpaused) * @return bool The updated state of the protocol */ @@ -320,6 +336,7 @@ contract SetterFacet is ISetterFacet, FacetBase { /** * @notice Pause/unpause certain actions + * @dev Allows a privileged role to pause/unpause the protocol action state * @param markets_ Markets to pause/unpause the actions on * @param actions_ List of action ids to pause/unpause * @param paused_ The new paused state (true=paused, false=unpaused) diff --git a/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol b/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol index 82fb819ec..f2318eba8 100644 --- a/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol +++ b/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol @@ -5,7 +5,10 @@ pragma solidity 0.5.16; import { FacetBase, VToken } from "./FacetBase.sol"; /** + * @title XVSRewardsHelper + * @author Venus * @dev This contract contains internal functions used in RewardFacet and PolicyFacet + * @notice This facet contract contains the shared functions used by the RewardFacet and PolicyFacet */ contract XVSRewardsHelper is FacetBase { /// @notice Emitted when XVS is distributed to a borrower diff --git a/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts b/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts index 15560e882..511860552 100644 --- a/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts +++ b/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts @@ -201,6 +201,13 @@ describe("Comptroller", () => { "old address is same as new address", ); }); + + it("should revert on zero address", async () => { + await comptroller._setLiquidatorContract(accounts[0].address); + await expect(comptroller._setLiquidatorContract(constants.AddressZero)).to.be.revertedWith( + "can't be zero address", + ); + }); }); describe("_setPauseGuardian", () => { @@ -328,6 +335,7 @@ describe("Comptroller", () => { describe("_setCloseFactor", () => { let comptroller: ComptrollerMock; + let unitroller: Unitroller; beforeEach(async () => { ({ comptroller } = await loadFixture(deploySimpleComptroller)); @@ -340,6 +348,15 @@ describe("Comptroller", () => { it("should revert on same values", async () => { await expect(comptroller._setCloseFactor(0)).to.be.revertedWith("old value is same as new value"); }); + + it("fails if factor is set out of range", async () => { + expect(await comptroller._setCloseFactor(convertToUnit(1, 18))) + .to.emit(unitroller, "Failure") + .withArgs( + ComptrollerErrorReporter.Error.INVALID_CLOSE_FACTOR, + ComptrollerErrorReporter.FailureInfo.SET_CLOSE_FACTOR_VALIDATION, + ); + }); }); describe("_setCollateralFactor", () => { From 9af2d4ab1159770c76c50292e7d53025b06c47a3 Mon Sep 17 00:00:00 2001 From: Debugger022 <104391977+Debugger022@users.noreply.github.com> Date: Fri, 8 Sep 2023 16:22:41 +0530 Subject: [PATCH 145/153] Revert "[VEN-1887]: Quantstamp audit fix for comptroller diamond proxy (#328)" (#337) This reverts commit df08df4332e781c571a59b5c136438e0dd5961ab. --- contracts/Comptroller/Diamond/Diamond.sol | 8 +---- .../Comptroller/Diamond/facets/FacetBase.sol | 5 --- .../Diamond/facets/MarketFacet.sol | 5 +-- .../Diamond/facets/PolicyFacet.sol | 4 --- .../Diamond/facets/RewardFacet.sol | 6 +--- .../Diamond/facets/SetterFacet.sol | 35 +++++-------------- .../Diamond/facets/XVSRewardsHelper.sol | 3 -- .../Comptroller/Diamond/comptrollerTest.ts | 17 --------- 8 files changed, 12 insertions(+), 71 deletions(-) diff --git a/contracts/Comptroller/Diamond/Diamond.sol b/contracts/Comptroller/Diamond/Diamond.sol index 21ceef7c3..86d991267 100644 --- a/contracts/Comptroller/Diamond/Diamond.sol +++ b/contracts/Comptroller/Diamond/Diamond.sol @@ -6,11 +6,6 @@ pragma experimental ABIEncoderV2; import { IDiamondCut } from "./interfaces/IDiamondCut.sol"; import { Unitroller, ComptrollerV12Storage } from "../Unitroller.sol"; -/** - * @title Diamond - * @author Venus - * @notice This contract contains functions related to facets - */ contract Diamond is IDiamondCut, ComptrollerV12Storage { /// @notice Emitted when functions are added, replaced or removed to facets event DiamondCut(IDiamondCut.FacetCut[] _diamondCut); @@ -30,8 +25,7 @@ contract Diamond is IDiamondCut, ComptrollerV12Storage { } /** - * @notice To add function selectors to the facet's mapping - * @dev Allows the contract admin to add function selectors + * @notice To add function selectors to the facets' mapping * @param diamondCut_ IDiamondCut contains facets address, action and function selectors */ function diamondCut(IDiamondCut.FacetCut[] memory diamondCut_) public { diff --git a/contracts/Comptroller/Diamond/facets/FacetBase.sol b/contracts/Comptroller/Diamond/facets/FacetBase.sol index 66336a7cb..44891e625 100644 --- a/contracts/Comptroller/Diamond/facets/FacetBase.sol +++ b/contracts/Comptroller/Diamond/facets/FacetBase.sol @@ -8,11 +8,6 @@ import { ComptrollerV12Storage } from "../../../Comptroller/ComptrollerStorage.s import { IAccessControlManager } from "../../../Governance/IAccessControlManager.sol"; import { SafeBEP20, IBEP20 } from "../../../Utils/SafeBEP20.sol"; -/** - * @title FacetBase - * @author Venus - * @notice This facet contract contains functions related to access and checks - */ contract FacetBase is ComptrollerV12Storage, ExponentialNoError, ComptrollerErrorReporter { /// @notice Emitted when an account enters a market event MarketEntered(VToken indexed vToken, address indexed account); diff --git a/contracts/Comptroller/Diamond/facets/MarketFacet.sol b/contracts/Comptroller/Diamond/facets/MarketFacet.sol index 4209cafb5..ceacb7930 100644 --- a/contracts/Comptroller/Diamond/facets/MarketFacet.sol +++ b/contracts/Comptroller/Diamond/facets/MarketFacet.sol @@ -6,10 +6,7 @@ import { IMarketFacet } from "../interfaces/IMarketFacet.sol"; import { FacetBase, VToken } from "./FacetBase.sol"; /** - * @title MarketFacet - * @author Venus * @dev This facet contains all the methods related to the market's management in the pool - * @notice This facet contract contains functions regarding markets */ contract MarketFacet is IMarketFacet, FacetBase { /// @notice Emitted when an admin supports a market @@ -170,7 +167,7 @@ contract MarketFacet is IMarketFacet, FacetBase { /** * @notice Add the market to the markets mapping and set it as listed - * @dev Allows a privileged role to add and list markets to the Comptroller + * @dev Admin function to set isListed and add support for the market * @param vToken The address of the market (token) to list * @return uint256 0=success, otherwise a failure. (See enum Error for details) */ diff --git a/contracts/Comptroller/Diamond/facets/PolicyFacet.sol b/contracts/Comptroller/Diamond/facets/PolicyFacet.sol index 2b0e3d50e..5a304308b 100644 --- a/contracts/Comptroller/Diamond/facets/PolicyFacet.sol +++ b/contracts/Comptroller/Diamond/facets/PolicyFacet.sol @@ -7,10 +7,7 @@ import { IPolicyFacet } from "../interfaces/IPolicyFacet.sol"; import { XVSRewardsHelper, VToken } from "./XVSRewardsHelper.sol"; /** - * @title PolicyFacet - * @author Venus * @dev This facet contains all the hooks used while transferring the assets - * @notice This facet contract contains all the external pre-hook functions related to vToken */ contract PolicyFacet is IPolicyFacet, XVSRewardsHelper { /// @notice Emitted when a new borrow-side XVS speed is calculated for a market @@ -420,7 +417,6 @@ contract PolicyFacet is IPolicyFacet, XVSRewardsHelper { // setter functionality /** * @notice Set XVS speed for a single market - * @dev Allows the contract admin to set XVS speed for a market * @param vTokens The market whose XVS speed to update * @param supplySpeeds New XVS speed for supply * @param borrowSpeeds New XVS speed for borrow diff --git a/contracts/Comptroller/Diamond/facets/RewardFacet.sol b/contracts/Comptroller/Diamond/facets/RewardFacet.sol index 6e2888a7b..e059e16a7 100644 --- a/contracts/Comptroller/Diamond/facets/RewardFacet.sol +++ b/contracts/Comptroller/Diamond/facets/RewardFacet.sol @@ -8,10 +8,7 @@ import { SafeBEP20, IBEP20 } from "../../../Utils/SafeBEP20.sol"; import { VBep20Interface } from "../../../Tokens/VTokens/VTokenInterfaces.sol"; /** - * @title RewardFacet - * @author Venus * @dev This facet contains all the methods related to the reward functionality - * @notice This facet contract provides the external functions related to all claims and rewards of the protocol */ contract RewardFacet is IRewardFacet, XVSRewardsHelper { /// @notice Emitted when Venus is granted by admin @@ -113,8 +110,7 @@ contract RewardFacet is IRewardFacet, XVSRewardsHelper { /** * @notice Transfer XVS to the recipient - * @dev Allows the contract admin to transfer XVS to any recipient based on the recipient's shortfall - * Note: If there is not enough XVS, we do not perform the transfer all + * @dev Note: If there is not enough XVS, we do not perform the transfer all * @param recipient The address of the recipient to transfer XVS to * @param amount The amount of XVS to (possibly) transfer */ diff --git a/contracts/Comptroller/Diamond/facets/SetterFacet.sol b/contracts/Comptroller/Diamond/facets/SetterFacet.sol index 561b75240..241230bec 100644 --- a/contracts/Comptroller/Diamond/facets/SetterFacet.sol +++ b/contracts/Comptroller/Diamond/facets/SetterFacet.sol @@ -9,10 +9,7 @@ import { VAIControllerInterface } from "../../../Tokens/VAI/VAIControllerInterfa import { FacetBase, VToken } from "./FacetBase.sol"; /** - * @title SetterFacet - * @author Venus * @dev This facet contains all the setters for the states - * @notice This facet contract contains all the configurational setter functions */ contract SetterFacet is ISetterFacet, FacetBase { /// @notice Emitted when close factor is changed by admin @@ -98,7 +95,7 @@ contract SetterFacet is ISetterFacet, FacetBase { /** * @notice Sets a new price oracle for the comptroller - * @dev Allows the contract admin to set a new price oracle used by the Comptroller + * @dev Admin function to set a new price oracle * @return uint256 0=success, otherwise a failure (see ErrorReporter.sol for details) */ function _setPriceOracle( @@ -122,7 +119,7 @@ contract SetterFacet is ISetterFacet, FacetBase { /** * @notice Sets the closeFactor used when liquidating borrows - * @dev Allows the contract admin to set the closeFactor used to liquidate borrows + * @dev Admin function to set closeFactor * @param newCloseFactorMantissa New close factor, scaled by 1e18 * @return uint256 0=success, otherwise will revert */ @@ -132,18 +129,8 @@ contract SetterFacet is ISetterFacet, FacetBase { // Check caller is admin ensureAdmin(); - Exp memory newCloseFactorExp = Exp({ mantissa: newCloseFactorMantissa }); - - //-- Check close factor <= 0.9 - Exp memory highLimit = Exp({ mantissa: closeFactorMaxMantissa }); - //-- Check close factor >= 0.05 - Exp memory lowLimit = Exp({ mantissa: closeFactorMinMantissa }); - - if (lessThanExp(highLimit, newCloseFactorExp) || greaterThanExp(lowLimit, newCloseFactorExp)) { - return fail(Error.INVALID_CLOSE_FACTOR, FailureInfo.SET_CLOSE_FACTOR_VALIDATION); - } - uint256 oldCloseFactorMantissa = closeFactorMantissa; + closeFactorMantissa = newCloseFactorMantissa; emit NewCloseFactor(oldCloseFactorMantissa, newCloseFactorMantissa); @@ -152,7 +139,7 @@ contract SetterFacet is ISetterFacet, FacetBase { /** * @notice Sets the address of the access control of this contract - * @dev Allows the contract admin to set the address of access control of this contract + * @dev Admin function to set the access control address * @param newAccessControlAddress New address for the access control * @return uint256 0=success, otherwise will revert */ @@ -173,7 +160,7 @@ contract SetterFacet is ISetterFacet, FacetBase { /** * @notice Sets the collateralFactor for a market - * @dev Allows a privileged role to set the collateralFactorMantissa + * @dev Restricted function to set per-market collateralFactor * @param vToken The market to set the factor on * @param newCollateralFactorMantissa The new collateral factor, scaled by 1e18 * @return uint256 0=success, otherwise a failure. (See ErrorReporter for details) @@ -219,7 +206,7 @@ contract SetterFacet is ISetterFacet, FacetBase { /** * @notice Sets liquidationIncentive - * @dev Allows a privileged role to set the liquidationIncentiveMantissa + * @dev Admin function to set liquidationIncentive * @param newLiquidationIncentiveMantissa New liquidationIncentive scaled by 1e18 * @return uint256 0=success, otherwise a failure. (See ErrorReporter for details) */ @@ -243,7 +230,7 @@ contract SetterFacet is ISetterFacet, FacetBase { /** * @notice Update the address of the liquidator contract - * @dev Allows the contract admin to update the address of liquidator contract + * @dev Admin function to set liquidator contract * @param newLiquidatorContract_ The new address of the liquidator contract */ function _setLiquidatorContract( @@ -251,7 +238,6 @@ contract SetterFacet is ISetterFacet, FacetBase { ) external compareAddress(liquidatorContract, newLiquidatorContract_) { // Check caller is admin ensureAdmin(); - ensureNonzeroAddress(newLiquidatorContract_); address oldLiquidatorContract = liquidatorContract; liquidatorContract = newLiquidatorContract_; emit NewLiquidatorContract(oldLiquidatorContract, newLiquidatorContract_); @@ -259,7 +245,6 @@ contract SetterFacet is ISetterFacet, FacetBase { /** * @notice Admin function to change the Pause Guardian - * @dev Allows the contract admin to change the Pause Guardian * @param newPauseGuardian The address of the new Pause Guardian * @return uint256 0=success, otherwise a failure. (See enum Error for details) */ @@ -282,7 +267,7 @@ contract SetterFacet is ISetterFacet, FacetBase { /** * @notice Set the given borrow caps for the given vToken market Borrowing that brings total borrows to or above borrow cap will revert - * @dev Allows a privileged role to set the borrowing cap for a vToken market. A borrow cap of 0 corresponds to unlimited borrowing + * @dev Access is controled by ACM. A borrow cap of 0 corresponds to unlimited borrowing * @param vTokens The addresses of the markets (tokens) to change the borrow caps for * @param newBorrowCaps The new borrow cap values in underlying to be set. A value of 0 corresponds to unlimited borrowing */ @@ -302,7 +287,7 @@ contract SetterFacet is ISetterFacet, FacetBase { /** * @notice Set the given supply caps for the given vToken market Supply that brings total Supply to or above supply cap will revert - * @dev Allows a privileged role to set the supply cap for a vToken. A supply cap of 0 corresponds to Minting NotAllowed + * @dev Admin function to set the supply cap A supply cap of 0 corresponds to Minting NotAllowed * @param vTokens The addresses of the markets (tokens) to change the supply caps for * @param newSupplyCaps The new supply cap values in underlying to be set. A value of 0 corresponds to Minting NotAllowed */ @@ -322,7 +307,6 @@ contract SetterFacet is ISetterFacet, FacetBase { /** * @notice Set whole protocol pause/unpause state - * @dev Allows a privileged role to pause/unpause protocol * @param state The new state (true=paused, false=unpaused) * @return bool The updated state of the protocol */ @@ -336,7 +320,6 @@ contract SetterFacet is ISetterFacet, FacetBase { /** * @notice Pause/unpause certain actions - * @dev Allows a privileged role to pause/unpause the protocol action state * @param markets_ Markets to pause/unpause the actions on * @param actions_ List of action ids to pause/unpause * @param paused_ The new paused state (true=paused, false=unpaused) diff --git a/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol b/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol index f2318eba8..82fb819ec 100644 --- a/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol +++ b/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol @@ -5,10 +5,7 @@ pragma solidity 0.5.16; import { FacetBase, VToken } from "./FacetBase.sol"; /** - * @title XVSRewardsHelper - * @author Venus * @dev This contract contains internal functions used in RewardFacet and PolicyFacet - * @notice This facet contract contains the shared functions used by the RewardFacet and PolicyFacet */ contract XVSRewardsHelper is FacetBase { /// @notice Emitted when XVS is distributed to a borrower diff --git a/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts b/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts index 511860552..15560e882 100644 --- a/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts +++ b/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts @@ -201,13 +201,6 @@ describe("Comptroller", () => { "old address is same as new address", ); }); - - it("should revert on zero address", async () => { - await comptroller._setLiquidatorContract(accounts[0].address); - await expect(comptroller._setLiquidatorContract(constants.AddressZero)).to.be.revertedWith( - "can't be zero address", - ); - }); }); describe("_setPauseGuardian", () => { @@ -335,7 +328,6 @@ describe("Comptroller", () => { describe("_setCloseFactor", () => { let comptroller: ComptrollerMock; - let unitroller: Unitroller; beforeEach(async () => { ({ comptroller } = await loadFixture(deploySimpleComptroller)); @@ -348,15 +340,6 @@ describe("Comptroller", () => { it("should revert on same values", async () => { await expect(comptroller._setCloseFactor(0)).to.be.revertedWith("old value is same as new value"); }); - - it("fails if factor is set out of range", async () => { - expect(await comptroller._setCloseFactor(convertToUnit(1, 18))) - .to.emit(unitroller, "Failure") - .withArgs( - ComptrollerErrorReporter.Error.INVALID_CLOSE_FACTOR, - ComptrollerErrorReporter.FailureInfo.SET_CLOSE_FACTOR_VALIDATION, - ); - }); }); describe("_setCollateralFactor", () => { From 0af25d43cebb5e197ae5f445320a3e760596f048 Mon Sep 17 00:00:00 2001 From: Debugger022 Date: Sat, 9 Sep 2023 14:44:08 +0530 Subject: [PATCH 146/153] refactor: optimized code --- .../Comptroller/Diamond/facets/FacetBase.sol | 11 ++++++-- .../Diamond/facets/MarketFacet.sol | 6 +++-- .../Diamond/facets/PolicyFacet.sol | 5 +--- .../Diamond/facets/RewardFacet.sol | 8 +++--- .../Diamond/facets/SetterFacet.sol | 6 ++--- .../Diamond/facets/XVSRewardsHelper.sol | 26 +++++++------------ .../Diamond/interfaces/IRewardFacet.sol | 4 --- contracts/Tokens/VAI/VAIController.sol | 2 +- contracts/test/ComptrollerHarness.sol | 2 +- contracts/test/ComptrollerScenario.sol | 2 +- contracts/test/VAIControllerHarness.sol | 2 +- .../hardhat/Comptroller/Diamond/XVSSpeeds.ts | 4 +-- .../Comptroller/Diamond/comptrollerTest.ts | 4 +-- 13 files changed, 38 insertions(+), 44 deletions(-) diff --git a/contracts/Comptroller/Diamond/facets/FacetBase.sol b/contracts/Comptroller/Diamond/facets/FacetBase.sol index 37e42f6ba..d96e73d23 100644 --- a/contracts/Comptroller/Diamond/facets/FacetBase.sol +++ b/contracts/Comptroller/Diamond/facets/FacetBase.sol @@ -73,14 +73,21 @@ contract FacetBase is ComptrollerV13Storage, ExponentialNoError, ComptrollerErro /** * @notice Get the latest block number */ - function getBlockNumber() public view returns (uint256) { + function getBlockNumber() internal view returns (uint256) { return block.number; } + /** + * @notice Get the latest block number with the safe32 check + */ + function getBlockNumberAsUint32() internal view returns (uint32) { + return safe32(getBlockNumber(), "block # > 32 bits"); + } + /** * @notice Transfer XVS to VAI Vault */ - function releaseToVault() public { + function releaseToVault() internal { if (releaseStartBlock == 0 || getBlockNumber() < releaseStartBlock) { return; } diff --git a/contracts/Comptroller/Diamond/facets/MarketFacet.sol b/contracts/Comptroller/Diamond/facets/MarketFacet.sol index ceacb7930..09ed56590 100644 --- a/contracts/Comptroller/Diamond/facets/MarketFacet.sol +++ b/contracts/Comptroller/Diamond/facets/MarketFacet.sol @@ -214,12 +214,14 @@ contract MarketFacet is IMarketFacet, FacetBase { function _addMarketInternal(VToken vToken) internal { uint256 allMarketsLength = allMarkets.length; for (uint256 i; i < allMarketsLength; ++i) { - require(allMarkets[i] != vToken, "market already added"); + require(allMarkets[i] != vToken, "already added"); } allMarkets.push(vToken); } function _initializeMarket(address vToken) internal { + uint32 blockNumber = getBlockNumberAsUint32(); + VenusMarketState storage supplyState = venusSupplyState[vToken]; VenusMarketState storage borrowState = venusBorrowState[vToken]; @@ -239,6 +241,6 @@ contract MarketFacet is IMarketFacet, FacetBase { /* * Update market state block numbers */ - supplyState.block = borrowState.block = uint32(getBlockNumber()); + supplyState.block = borrowState.block = blockNumber; } } diff --git a/contracts/Comptroller/Diamond/facets/PolicyFacet.sol b/contracts/Comptroller/Diamond/facets/PolicyFacet.sol index c41e1d5f5..dd99d9b2e 100644 --- a/contracts/Comptroller/Diamond/facets/PolicyFacet.sol +++ b/contracts/Comptroller/Diamond/facets/PolicyFacet.sol @@ -435,10 +435,7 @@ contract PolicyFacet is IPolicyFacet, XVSRewardsHelper { ensureAdmin(); uint256 numTokens = vTokens.length; - require( - numTokens == supplySpeeds.length && numTokens == borrowSpeeds.length, - "Comptroller::_setVenusSpeeds invalid input" - ); + require(numTokens == supplySpeeds.length && numTokens == borrowSpeeds.length, "invalid input"); for (uint256 i; i < numTokens; ++i) { ensureNonzeroAddress(address(vTokens[i])); diff --git a/contracts/Comptroller/Diamond/facets/RewardFacet.sol b/contracts/Comptroller/Diamond/facets/RewardFacet.sol index e059e16a7..1e50158d7 100644 --- a/contracts/Comptroller/Diamond/facets/RewardFacet.sol +++ b/contracts/Comptroller/Diamond/facets/RewardFacet.sol @@ -93,16 +93,16 @@ contract RewardFacet is IRewardFacet, XVSRewardsHelper { // vXVS token and mint vXVS for the user // // If mintBehalf failed, don't grant any xvs - require(collateral, "bankrupt accounts can only collateralize their pending xvs rewards"); + require(collateral, "bankrupt"); IBEP20(getXVSAddress()).safeApprove(getXVSVTokenAddress(), 0); IBEP20(getXVSAddress()).safeApprove(getXVSVTokenAddress(), amount); require( VBep20Interface(getXVSVTokenAddress()).mintBehalf(user, amount) == uint256(Error.NO_ERROR), - "mint behalf error during collateralize xvs" + "mint behalf error" ); - // set venusAccrue[user] to 0 + // set venusAccrued[user] to 0 return 0; } @@ -117,7 +117,7 @@ contract RewardFacet is IRewardFacet, XVSRewardsHelper { function _grantXVS(address recipient, uint256 amount) external { ensureAdmin(); uint256 amountLeft = grantXVSInternal(recipient, amount, 0, false); - require(amountLeft == 0, "insufficient xvs for grant"); + require(amountLeft == 0, "no xvs"); emit VenusGranted(recipient, amount); } diff --git a/contracts/Comptroller/Diamond/facets/SetterFacet.sol b/contracts/Comptroller/Diamond/facets/SetterFacet.sol index 8e5471872..a87a13106 100644 --- a/contracts/Comptroller/Diamond/facets/SetterFacet.sol +++ b/contracts/Comptroller/Diamond/facets/SetterFacet.sol @@ -218,7 +218,7 @@ contract SetterFacet is ISetterFacet, FacetBase { ) external compareValue(liquidationIncentiveMantissa, newLiquidationIncentiveMantissa) returns (uint256) { ensureAllowed("_setLiquidationIncentive(uint256)"); - require(newLiquidationIncentiveMantissa >= 1e18, "incentive must be over 1e18"); + require(newLiquidationIncentiveMantissa >= 1e18, "incentive < 1e18"); // Save current value for use in log uint256 oldLiquidationIncentiveMantissa = liquidationIncentiveMantissa; @@ -421,7 +421,7 @@ contract SetterFacet is ISetterFacet, FacetBase { // Check caller is admin ensureAdminOr(treasuryGuardian); - require(newTreasuryPercent < 1e18, "treasury percent cap overflow"); + require(newTreasuryPercent < 1e18, "percent >= 100%"); ensureNonzeroAddress(newTreasuryGuardian); ensureNonzeroAddress(newTreasuryAddress); @@ -499,7 +499,7 @@ contract SetterFacet is ISetterFacet, FacetBase { } function _setForcedLiquidation(address vTokenBorrowed, bool enable) external { - ensureAllowed("setForcedLiquidation(address,bool)"); + ensureAllowed("_setForcedLiquidation(address,bool)"); if (vTokenBorrowed != address(vaiController)) { ensureListed(markets[vTokenBorrowed]); } diff --git a/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol b/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol index 82fb819ec..1a04d3205 100644 --- a/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol +++ b/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol @@ -31,19 +31,16 @@ contract XVSRewardsHelper is FacetBase { function updateVenusBorrowIndex(address vToken, Exp memory marketBorrowIndex) internal { VenusMarketState storage borrowState = venusBorrowState[vToken]; uint256 borrowSpeed = venusBorrowSpeeds[vToken]; - uint256 blockNumber = getBlockNumber(); - uint256 deltaBlocks = sub_(uint256(blockNumber), uint256(borrowState.block)); + uint32 blockNumber = getBlockNumberAsUint32(); + uint256 deltaBlocks = sub_(blockNumber, borrowState.block); if (deltaBlocks != 0 && borrowSpeed != 0) { uint256 borrowAmount = div_(VToken(vToken).totalBorrows(), marketBorrowIndex); uint256 accruedVenus = mul_(deltaBlocks, borrowSpeed); Double memory ratio = borrowAmount != 0 ? fraction(accruedVenus, borrowAmount) : Double({ mantissa: 0 }); - borrowState.index = safe224( - add_(Double({ mantissa: borrowState.index }), ratio).mantissa, - "new index exceeds 224 bits" - ); - borrowState.block = uint32(blockNumber); + borrowState.index = safe224(add_(Double({ mantissa: borrowState.index }), ratio).mantissa, "224"); + borrowState.block = blockNumber; } else if (deltaBlocks != 0) { - borrowState.block = uint32(blockNumber); + borrowState.block = blockNumber; } } @@ -54,20 +51,17 @@ contract XVSRewardsHelper is FacetBase { function updateVenusSupplyIndex(address vToken) internal { VenusMarketState storage supplyState = venusSupplyState[vToken]; uint256 supplySpeed = venusSupplySpeeds[vToken]; - uint256 blockNumber = getBlockNumber(); + uint32 blockNumber = getBlockNumberAsUint32(); - uint256 deltaBlocks = sub_(uint256(blockNumber), uint256(supplyState.block)); + uint256 deltaBlocks = sub_(blockNumber, supplyState.block); if (deltaBlocks != 0 && supplySpeed != 0) { uint256 supplyTokens = VToken(vToken).totalSupply(); uint256 accruedVenus = mul_(deltaBlocks, supplySpeed); Double memory ratio = supplyTokens != 0 ? fraction(accruedVenus, supplyTokens) : Double({ mantissa: 0 }); - supplyState.index = safe224( - add_(Double({ mantissa: supplyState.index }), ratio).mantissa, - "new index exceeds 224 bits" - ); - supplyState.block = uint32(blockNumber); + supplyState.index = safe224(add_(Double({ mantissa: supplyState.index }), ratio).mantissa, "224"); + supplyState.block = blockNumber; } else if (deltaBlocks != 0) { - supplyState.block = uint32(blockNumber); + supplyState.block = blockNumber; } } diff --git a/contracts/Comptroller/Diamond/interfaces/IRewardFacet.sol b/contracts/Comptroller/Diamond/interfaces/IRewardFacet.sol index 28bce9f9f..db2dbcc00 100644 --- a/contracts/Comptroller/Diamond/interfaces/IRewardFacet.sol +++ b/contracts/Comptroller/Diamond/interfaces/IRewardFacet.sol @@ -16,16 +16,12 @@ interface IRewardFacet { function _grantXVS(address recipient, uint256 amount) external; - function getBlockNumber() external view returns (uint256); - function getXVSAddress() external pure returns (address); function getXVSVTokenAddress() external pure returns (address); function actionPaused(address market, ComptrollerV13Storage.Action action) external view returns (bool); - function releaseToVault() external; - function claimVenus( address[] calldata holders, VToken[] calldata vTokens, diff --git a/contracts/Tokens/VAI/VAIController.sol b/contracts/Tokens/VAI/VAIController.sol index 97e1ec4aa..442e44e52 100644 --- a/contracts/Tokens/VAI/VAIController.sol +++ b/contracts/Tokens/VAI/VAIController.sol @@ -753,7 +753,7 @@ contract VAIController is VAIControllerStorageG2, VAIControllerErrorReporter, Ex emit NewVAIMintCap(old, _mintCap); } - function getBlockNumber() public view returns (uint) { + function getBlockNumber() internal view returns (uint) { return block.number; } diff --git a/contracts/test/ComptrollerHarness.sol b/contracts/test/ComptrollerHarness.sol index 15f1655bf..3bfef64af 100644 --- a/contracts/test/ComptrollerHarness.sol +++ b/contracts/test/ComptrollerHarness.sol @@ -138,7 +138,7 @@ contract ComptrollerHarness is ComptrollerMock { blockNumber = number; } - function getBlockNumber() public view returns (uint) { + function getBlockNumber() internal view returns (uint) { return blockNumber; } diff --git a/contracts/test/ComptrollerScenario.sol b/contracts/test/ComptrollerScenario.sol index 5333c7891..5663dc805 100644 --- a/contracts/test/ComptrollerScenario.sol +++ b/contracts/test/ComptrollerScenario.sol @@ -39,7 +39,7 @@ contract ComptrollerScenario is ComptrollerMock { blockNumber = number; } - function getBlockNumber() public view returns (uint) { + function getBlockNumber() internal view returns (uint) { return blockNumber; } diff --git a/contracts/test/VAIControllerHarness.sol b/contracts/test/VAIControllerHarness.sol index 2332c013c..f5139fede 100644 --- a/contracts/test/VAIControllerHarness.sol +++ b/contracts/test/VAIControllerHarness.sol @@ -56,7 +56,7 @@ contract VAIControllerHarness is VAIController { blocksPerYear = number; } - function getBlockNumber() public view returns (uint) { + function getBlockNumber() internal view returns (uint) { return blockNumber; } diff --git a/tests/hardhat/Comptroller/Diamond/XVSSpeeds.ts b/tests/hardhat/Comptroller/Diamond/XVSSpeeds.ts index 892c6ed73..6b31f18c1 100644 --- a/tests/hardhat/Comptroller/Diamond/XVSSpeeds.ts +++ b/tests/hardhat/Comptroller/Diamond/XVSSpeeds.ts @@ -54,7 +54,7 @@ describe("Comptroller", () => { [convertToUnit(1, 15)], [convertToUnit(1, 15), convertToUnit(1, 15)], ), - ).to.be.revertedWith("Comptroller::_setVenusSpeeds invalid input"); + ).to.be.revertedWith("invalid input"); }); it("Revert on invalid borrowSpeeds input", async () => { @@ -64,7 +64,7 @@ describe("Comptroller", () => { [convertToUnit(1, 15), convertToUnit(1, 15)], [convertToUnit(1, 15)], ), - ).to.be.revertedWith("Comptroller::_setVenusSpeeds invalid input"); + ).to.be.revertedWith("invalid input"); }); it("Revert for unlisted market", async () => { diff --git a/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts b/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts index 41ef45d25..4a1ab8fac 100644 --- a/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts +++ b/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts @@ -101,9 +101,7 @@ describe("Comptroller", () => { }); it("fails if incentive is less than 1e18", async () => { - await expect(comptroller._setLiquidationIncentive(tooSmallIncentive)).to.be.revertedWith( - "incentive must be over 1e18", - ); + await expect(comptroller._setLiquidationIncentive(tooSmallIncentive)).to.be.revertedWith("incentive < 1e18"); }); it("accepts a valid incentive and emits a NewLiquidationIncentive event", async () => { From b4ddc09dd38eb3eebd650ede4db6b9d984b046c5 Mon Sep 17 00:00:00 2001 From: Debugger022 Date: Sat, 9 Sep 2023 17:39:15 +0530 Subject: [PATCH 147/153] fix: resolved conflicts --- contracts/Comptroller/Diamond/Diamond.sol | 8 ++++- .../Comptroller/Diamond/facets/FacetBase.sol | 5 +++ .../Diamond/facets/MarketFacet.sol | 5 ++- .../Diamond/facets/PolicyFacet.sol | 4 +++ .../Diamond/facets/RewardFacet.sol | 6 +++- .../Diamond/facets/SetterFacet.sol | 35 ++++++++++++++----- .../Diamond/facets/XVSRewardsHelper.sol | 3 ++ .../Comptroller/Diamond/comptrollerTest.ts | 17 +++++++++ 8 files changed, 71 insertions(+), 12 deletions(-) diff --git a/contracts/Comptroller/Diamond/Diamond.sol b/contracts/Comptroller/Diamond/Diamond.sol index 020edb35f..fba759594 100644 --- a/contracts/Comptroller/Diamond/Diamond.sol +++ b/contracts/Comptroller/Diamond/Diamond.sol @@ -6,6 +6,11 @@ pragma experimental ABIEncoderV2; import { IDiamondCut } from "./interfaces/IDiamondCut.sol"; import { Unitroller, ComptrollerV13Storage } from "../Unitroller.sol"; +/** + * @title Diamond + * @author Venus + * @notice This contract contains functions related to facets + */ contract Diamond is IDiamondCut, ComptrollerV13Storage { /// @notice Emitted when functions are added, replaced or removed to facets event DiamondCut(IDiamondCut.FacetCut[] _diamondCut); @@ -25,7 +30,8 @@ contract Diamond is IDiamondCut, ComptrollerV13Storage { } /** - * @notice To add function selectors to the facets' mapping + * @notice To add function selectors to the facet's mapping + * @dev Allows the contract admin to add function selectors * @param diamondCut_ IDiamondCut contains facets address, action and function selectors */ function diamondCut(IDiamondCut.FacetCut[] memory diamondCut_) public { diff --git a/contracts/Comptroller/Diamond/facets/FacetBase.sol b/contracts/Comptroller/Diamond/facets/FacetBase.sol index d96e73d23..6ab134440 100644 --- a/contracts/Comptroller/Diamond/facets/FacetBase.sol +++ b/contracts/Comptroller/Diamond/facets/FacetBase.sol @@ -8,6 +8,11 @@ import { ComptrollerV13Storage } from "../../../Comptroller/ComptrollerStorage.s import { IAccessControlManager } from "../../../Governance/IAccessControlManager.sol"; import { SafeBEP20, IBEP20 } from "../../../Utils/SafeBEP20.sol"; +/** + * @title FacetBase + * @author Venus + * @notice This facet contract contains functions related to access and checks + */ contract FacetBase is ComptrollerV13Storage, ExponentialNoError, ComptrollerErrorReporter { /// @notice Emitted when an account enters a market event MarketEntered(VToken indexed vToken, address indexed account); diff --git a/contracts/Comptroller/Diamond/facets/MarketFacet.sol b/contracts/Comptroller/Diamond/facets/MarketFacet.sol index 09ed56590..835abcab8 100644 --- a/contracts/Comptroller/Diamond/facets/MarketFacet.sol +++ b/contracts/Comptroller/Diamond/facets/MarketFacet.sol @@ -6,7 +6,10 @@ import { IMarketFacet } from "../interfaces/IMarketFacet.sol"; import { FacetBase, VToken } from "./FacetBase.sol"; /** + * @title MarketFacet + * @author Venus * @dev This facet contains all the methods related to the market's management in the pool + * @notice This facet contract contains functions regarding markets */ contract MarketFacet is IMarketFacet, FacetBase { /// @notice Emitted when an admin supports a market @@ -167,7 +170,7 @@ contract MarketFacet is IMarketFacet, FacetBase { /** * @notice Add the market to the markets mapping and set it as listed - * @dev Admin function to set isListed and add support for the market + * @dev Allows a privileged role to add and list markets to the Comptroller * @param vToken The address of the market (token) to list * @return uint256 0=success, otherwise a failure. (See enum Error for details) */ diff --git a/contracts/Comptroller/Diamond/facets/PolicyFacet.sol b/contracts/Comptroller/Diamond/facets/PolicyFacet.sol index dd99d9b2e..43f2c9316 100644 --- a/contracts/Comptroller/Diamond/facets/PolicyFacet.sol +++ b/contracts/Comptroller/Diamond/facets/PolicyFacet.sol @@ -7,7 +7,10 @@ import { IPolicyFacet } from "../interfaces/IPolicyFacet.sol"; import { XVSRewardsHelper, VToken } from "./XVSRewardsHelper.sol"; /** + * @title PolicyFacet + * @author Venus * @dev This facet contains all the hooks used while transferring the assets + * @notice This facet contract contains all the external pre-hook functions related to vToken */ contract PolicyFacet is IPolicyFacet, XVSRewardsHelper { /// @notice Emitted when a new borrow-side XVS speed is calculated for a market @@ -423,6 +426,7 @@ contract PolicyFacet is IPolicyFacet, XVSRewardsHelper { // setter functionality /** * @notice Set XVS speed for a single market + * @dev Allows the contract admin to set XVS speed for a market * @param vTokens The market whose XVS speed to update * @param supplySpeeds New XVS speed for supply * @param borrowSpeeds New XVS speed for borrow diff --git a/contracts/Comptroller/Diamond/facets/RewardFacet.sol b/contracts/Comptroller/Diamond/facets/RewardFacet.sol index 1e50158d7..5a417cb4b 100644 --- a/contracts/Comptroller/Diamond/facets/RewardFacet.sol +++ b/contracts/Comptroller/Diamond/facets/RewardFacet.sol @@ -8,7 +8,10 @@ import { SafeBEP20, IBEP20 } from "../../../Utils/SafeBEP20.sol"; import { VBep20Interface } from "../../../Tokens/VTokens/VTokenInterfaces.sol"; /** + * @title RewardFacet + * @author Venus * @dev This facet contains all the methods related to the reward functionality + * @notice This facet contract provides the external functions related to all claims and rewards of the protocol */ contract RewardFacet is IRewardFacet, XVSRewardsHelper { /// @notice Emitted when Venus is granted by admin @@ -110,7 +113,8 @@ contract RewardFacet is IRewardFacet, XVSRewardsHelper { /** * @notice Transfer XVS to the recipient - * @dev Note: If there is not enough XVS, we do not perform the transfer all + * @dev Allows the contract admin to transfer XVS to any recipient based on the recipient's shortfall + * Note: If there is not enough XVS, we do not perform the transfer all * @param recipient The address of the recipient to transfer XVS to * @param amount The amount of XVS to (possibly) transfer */ diff --git a/contracts/Comptroller/Diamond/facets/SetterFacet.sol b/contracts/Comptroller/Diamond/facets/SetterFacet.sol index a87a13106..9d11dd55e 100644 --- a/contracts/Comptroller/Diamond/facets/SetterFacet.sol +++ b/contracts/Comptroller/Diamond/facets/SetterFacet.sol @@ -9,7 +9,10 @@ import { VAIControllerInterface } from "../../../Tokens/VAI/VAIControllerInterfa import { FacetBase, VToken } from "./FacetBase.sol"; /** + * @title SetterFacet + * @author Venus * @dev This facet contains all the setters for the states + * @notice This facet contract contains all the configurational setter functions */ contract SetterFacet is ISetterFacet, FacetBase { /// @notice Emitted when close factor is changed by admin @@ -98,7 +101,7 @@ contract SetterFacet is ISetterFacet, FacetBase { /** * @notice Sets a new price oracle for the comptroller - * @dev Admin function to set a new price oracle + * @dev Allows the contract admin to set a new price oracle used by the Comptroller * @return uint256 0=success, otherwise a failure (see ErrorReporter.sol for details) */ function _setPriceOracle( @@ -122,7 +125,7 @@ contract SetterFacet is ISetterFacet, FacetBase { /** * @notice Sets the closeFactor used when liquidating borrows - * @dev Admin function to set closeFactor + * @dev Allows the contract admin to set the closeFactor used to liquidate borrows * @param newCloseFactorMantissa New close factor, scaled by 1e18 * @return uint256 0=success, otherwise will revert */ @@ -132,8 +135,18 @@ contract SetterFacet is ISetterFacet, FacetBase { // Check caller is admin ensureAdmin(); - uint256 oldCloseFactorMantissa = closeFactorMantissa; + Exp memory newCloseFactorExp = Exp({ mantissa: newCloseFactorMantissa }); + + //-- Check close factor <= 0.9 + Exp memory highLimit = Exp({ mantissa: closeFactorMaxMantissa }); + //-- Check close factor >= 0.05 + Exp memory lowLimit = Exp({ mantissa: closeFactorMinMantissa }); + if (lessThanExp(highLimit, newCloseFactorExp) || greaterThanExp(lowLimit, newCloseFactorExp)) { + return fail(Error.INVALID_CLOSE_FACTOR, FailureInfo.SET_CLOSE_FACTOR_VALIDATION); + } + + uint256 oldCloseFactorMantissa = closeFactorMantissa; closeFactorMantissa = newCloseFactorMantissa; emit NewCloseFactor(oldCloseFactorMantissa, newCloseFactorMantissa); @@ -142,7 +155,7 @@ contract SetterFacet is ISetterFacet, FacetBase { /** * @notice Sets the address of the access control of this contract - * @dev Admin function to set the access control address + * @dev Allows the contract admin to set the address of access control of this contract * @param newAccessControlAddress New address for the access control * @return uint256 0=success, otherwise will revert */ @@ -163,7 +176,7 @@ contract SetterFacet is ISetterFacet, FacetBase { /** * @notice Sets the collateralFactor for a market - * @dev Restricted function to set per-market collateralFactor + * @dev Allows a privileged role to set the collateralFactorMantissa * @param vToken The market to set the factor on * @param newCollateralFactorMantissa The new collateral factor, scaled by 1e18 * @return uint256 0=success, otherwise a failure. (See ErrorReporter for details) @@ -209,7 +222,7 @@ contract SetterFacet is ISetterFacet, FacetBase { /** * @notice Sets liquidationIncentive - * @dev Admin function to set liquidationIncentive + * @dev Allows a privileged role to set the liquidationIncentiveMantissa * @param newLiquidationIncentiveMantissa New liquidationIncentive scaled by 1e18 * @return uint256 0=success, otherwise a failure. (See ErrorReporter for details) */ @@ -233,7 +246,7 @@ contract SetterFacet is ISetterFacet, FacetBase { /** * @notice Update the address of the liquidator contract - * @dev Admin function to set liquidator contract + * @dev Allows the contract admin to update the address of liquidator contract * @param newLiquidatorContract_ The new address of the liquidator contract */ function _setLiquidatorContract( @@ -241,6 +254,7 @@ contract SetterFacet is ISetterFacet, FacetBase { ) external compareAddress(liquidatorContract, newLiquidatorContract_) { // Check caller is admin ensureAdmin(); + ensureNonzeroAddress(newLiquidatorContract_); address oldLiquidatorContract = liquidatorContract; liquidatorContract = newLiquidatorContract_; emit NewLiquidatorContract(oldLiquidatorContract, newLiquidatorContract_); @@ -248,6 +262,7 @@ contract SetterFacet is ISetterFacet, FacetBase { /** * @notice Admin function to change the Pause Guardian + * @dev Allows the contract admin to change the Pause Guardian * @param newPauseGuardian The address of the new Pause Guardian * @return uint256 0=success, otherwise a failure. (See enum Error for details) */ @@ -270,7 +285,7 @@ contract SetterFacet is ISetterFacet, FacetBase { /** * @notice Set the given borrow caps for the given vToken market Borrowing that brings total borrows to or above borrow cap will revert - * @dev Access is controled by ACM. A borrow cap of 0 corresponds to unlimited borrowing + * @dev Allows a privileged role to set the borrowing cap for a vToken market. A borrow cap of 0 corresponds to unlimited borrowing * @param vTokens The addresses of the markets (tokens) to change the borrow caps for * @param newBorrowCaps The new borrow cap values in underlying to be set. A value of 0 corresponds to unlimited borrowing */ @@ -290,7 +305,7 @@ contract SetterFacet is ISetterFacet, FacetBase { /** * @notice Set the given supply caps for the given vToken market Supply that brings total Supply to or above supply cap will revert - * @dev Admin function to set the supply cap A supply cap of 0 corresponds to Minting NotAllowed + * @dev Allows a privileged role to set the supply cap for a vToken. A supply cap of 0 corresponds to Minting NotAllowed * @param vTokens The addresses of the markets (tokens) to change the supply caps for * @param newSupplyCaps The new supply cap values in underlying to be set. A value of 0 corresponds to Minting NotAllowed */ @@ -310,6 +325,7 @@ contract SetterFacet is ISetterFacet, FacetBase { /** * @notice Set whole protocol pause/unpause state + * @dev Allows a privileged role to pause/unpause protocol * @param state The new state (true=paused, false=unpaused) * @return bool The updated state of the protocol */ @@ -323,6 +339,7 @@ contract SetterFacet is ISetterFacet, FacetBase { /** * @notice Pause/unpause certain actions + * @dev Allows a privileged role to pause/unpause the protocol action state * @param markets_ Markets to pause/unpause the actions on * @param actions_ List of action ids to pause/unpause * @param paused_ The new paused state (true=paused, false=unpaused) diff --git a/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol b/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol index 1a04d3205..76eda442a 100644 --- a/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol +++ b/contracts/Comptroller/Diamond/facets/XVSRewardsHelper.sol @@ -5,7 +5,10 @@ pragma solidity 0.5.16; import { FacetBase, VToken } from "./FacetBase.sol"; /** + * @title XVSRewardsHelper + * @author Venus * @dev This contract contains internal functions used in RewardFacet and PolicyFacet + * @notice This facet contract contains the shared functions used by the RewardFacet and PolicyFacet */ contract XVSRewardsHelper is FacetBase { /// @notice Emitted when XVS is distributed to a borrower diff --git a/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts b/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts index 4a1ab8fac..b66797fe5 100644 --- a/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts +++ b/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts @@ -200,6 +200,13 @@ describe("Comptroller", () => { "old address is same as new address", ); }); + + it("should revert on zero address", async () => { + await comptroller._setLiquidatorContract(accounts[0].address); + await expect(comptroller._setLiquidatorContract(constants.AddressZero)).to.be.revertedWith( + "can't be zero address", + ); + }); }); describe("_setPauseGuardian", () => { @@ -327,6 +334,7 @@ describe("Comptroller", () => { describe("_setCloseFactor", () => { let comptroller: ComptrollerMock; + let unitroller: Unitroller; beforeEach(async () => { ({ comptroller } = await loadFixture(deploySimpleComptroller)); @@ -339,6 +347,15 @@ describe("Comptroller", () => { it("should revert on same values", async () => { await expect(comptroller._setCloseFactor(0)).to.be.revertedWith("old value is same as new value"); }); + + it("fails if factor is set out of range", async () => { + expect(await comptroller._setCloseFactor(convertToUnit(1, 18))) + .to.emit(unitroller, "Failure") + .withArgs( + ComptrollerErrorReporter.Error.INVALID_CLOSE_FACTOR, + ComptrollerErrorReporter.FailureInfo.SET_CLOSE_FACTOR_VALIDATION, + ); + }); }); describe("_setCollateralFactor", () => { From 35b5517efac7618203782cfb6ff4f4dc0a8e0345 Mon Sep 17 00:00:00 2001 From: Debugger022 Date: Mon, 11 Sep 2023 20:21:30 +0530 Subject: [PATCH 148/153] fix: pr comments --- .solhint.json | 2 +- contracts/Comptroller/ComptrollerStorage.sol | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.solhint.json b/.solhint.json index a13d85bca..f9d6f7110 100644 --- a/.solhint.json +++ b/.solhint.json @@ -1,7 +1,7 @@ { "extends": "solhint:recommended", "rules": { - "code-complexity": ["error", 8], + "code-complexity": ["error", 9], "compiler-version": ["error", ">=0.5.0"], "const-name-snakecase": "off", "constructor-syntax": "error", diff --git a/contracts/Comptroller/ComptrollerStorage.sol b/contracts/Comptroller/ComptrollerStorage.sol index 15cd903ad..048b390e0 100644 --- a/contracts/Comptroller/ComptrollerStorage.sol +++ b/contracts/Comptroller/ComptrollerStorage.sol @@ -105,10 +105,10 @@ contract ComptrollerV1Storage is UnitrollerAdminStorage { VToken[] public allMarkets; /// @notice The rate at which the flywheel distributes XVS, per block - uint256 public venusRate; + uint256 internal venusRate; /// @notice The portion of venusRate that each market currently receives - mapping(address => uint256) public venusSpeeds; + mapping(address => uint256) internal venusSpeeds; /// @notice The Venus market supply state for each market mapping(address => VenusMarketState) public venusSupplyState; From 032cc8e227207932d7159d3437b7502229cff1e4 Mon Sep 17 00:00:00 2001 From: Debugger022 Date: Mon, 11 Sep 2023 20:48:10 +0530 Subject: [PATCH 149/153] fix: updated yarn.lock --- .yarn/install-state.gz | Bin 1442486 -> 1499997 bytes yarn.lock | 68 +---------------------------------------- 2 files changed, 1 insertion(+), 67 deletions(-) diff --git a/.yarn/install-state.gz b/.yarn/install-state.gz index 511be22f6a4aa078daf341a0239d7d9d3ff3c887..525fc484c56f554201b8e114b6102820427ab79a 100644 GIT binary patch literal 1499997 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 z z>SDKZp!CeXGiH*;`)tO-+M6!l#5!Jqw-72qFMaRks#Sf6)Wm->NN&XXbPv4#+ycDsaf*}>C=Rfc;?ylU`Y(POiZg|1-=u<7FWT4Yu?~PH*zrWIT|Wc4 z<>d)ca*y4zT=xm(a~fkRSyApV*U@-&zP)(yXtA>crA6hbsrAPE>gRm{FPY=?@#ts# zY70Wy0a5e8^t}`=i&L|8ESb*w2TdrN{nN1+bZ?rnu9`5jd| z_)hWQet~!u%3CwrjP&$zsHKxo^)%ywV=ZqZVa6|0!3O ze^##(==`n78EB11DwH}}Ry|!k(GNt^h8qn$U>EF$G6#X5{3W*MSWybq7}{y5z@b6c z_*4#f)3$)I7T+N{CRpcD>LEJd%IWJ#+W#*WL7=E@j^eMypgX?;s! zaDc?BP!VBuP`gGL1TZ_FT7Ivb&!dhS3(w1@{N!~}KEK}6&;2SbdNj#>Bp`U(tHW6P z)vU_)RkcA>IdHN7$d&`l9Uiz^E$@J|Sg>p*=$ufXt)GJ{E(w6EY%?i$# zzx(24%)AbDtE^~{XIS>EC*U>`{JKQc{;OG)K^Lm&?UM%38iqAti@gn?auR<`&NZ3) z)fz~x_+_4x z&H0i-RQc5FptI9u=`4_@thc2bXJ^*{G6~UAz>11TA_7A5S5<2Rby5<<0F(nTO#V-a zD!q{YbAJJ|tVwUSg%^jZQ0YmK$(Jd0 zUi*D>fHdQ!_NL@qa$=+L5Vix7L{VZ{2miFsC?7%#-qW|m0}{R!T-0!xN9rm~|5E~; zzx|89>3>{*)BpV2|G@X&fBb#_-L;b+fB3_n|HSkB{Xf@K-b+HF^pGZ3dnxr~kK{>#{>`{TGs_!7jCs7en50wcLZ{tzQ zpjYp*`Hx>M(g)b=uP%{Elc_92mc$1NBjtcPM_g6J>7`!@J$(|p^;J_MQGG7HzD*AD{HydK z5YNCJ)ClOH)TrTJ)+s=lAQO@~hiA`v9rXPj5)om&*SGdNd$@UnUieh@WA(+QQpa~B zLFfJaYMlMlp#1R_u~>uX#JB5F%fPphI}~%6+Q-Y#y)H*b`((bI-8L=K$UuPvHQ9>+xq?el|l%_)_rR#NZXQ(QBbdf>GXpBpLjX{^3VV9_j~?L|J&dH_TT-l z|J!|X10VnYpBeH1+Z>e>tIYpv9`tCS8*}jvis1JG0@cW_Cr?e#OPqZLg$KgX*+or8 zsvzoxkWW%|DZf-hz@abQ(GSU&&Uc+!75`?FQv9vW7X5&)znJh+6r*U9BC~Dw|9BkQ ziAsrr0A*=c?}7+upLgo7`s97TQ#s6sYVPwQoD;HGkYT8%#?aETk({!2rB`s|@QI&3 z4pfG`M_-^4^c=Te4E3BqrPh{nPSxUy&JGap?#EtkkX1xN&C4DS1^4@ILp~3{SKIq7 zqw-{tWE}0Rvg;N#B+u15&_Q;hTaZ`lpaDNkZM+ntAxU)L_&>1^|IL5=aC(UpB?m1K0xS?pLiJ!fBl;I-pM>>@$zLdDV}G(IJ(ON@{N>UVm|6m|uMk z$VARrmDE0ECiN96XJyH4%Al_ZD&aAwQa3b$e^y1{4e!tohMMtVcRR4k1I$sQ z`mQxfYEN45#HpkqFsmii0B8Tz&S_fefMFLw0oVyppTSXT>Q{Me&t7X_?5C1Gn$(nEO!-Y&GhT-m)3Osug~4-uo9F6Yv3k?uEa&Ht@iurg z`54L3rZ9a!@1Twxny6kyLg0pyO-h)Db|`H2b#EWd>0{EBCQ9L3PJKMT8XzhBa;@J^ z7@9I~fSO+QAoA{D=}clit-(K)3-{hiKy3X)6e@p}ljCTEa+`*UH7sd$=Om6}Az06< zBwM)Z`pR)SxS{Qufu4Z+t1V-x3ig$pIXc87g^7n+PV6*xj+k>1*w?iX$sk?Mme;S_ z;o6U|P3)5ne0wjv1hvAB<&!K673Y@vNiR9M9f11cEoLogvIafBTzEvu0Y&{NTa<$( zTJion_0m*pjk-NLI;;01HT&ndzN9ih)sAZp+q@MdK7j#VVnh`j*B5`Txi8!ZX-xLA z%En21^rRC!c}-Sn|JBrlQM5WqWJbX>*dcsHKV{BH9*XqjnF((aN0VZ#?K%ZXMu@5c zgND>8`1lmCkrtO{l^FCST}I<45W-Hhj|TM6&NK|(xpADB@XOmnYDwSwz*B0GuNmtfc4ri=%+*BRe0xWrB_x3a-s79tjdG>Bvi8I1_@lq{U;pmsfB*Y`_z(Qi{ndZ{U;p-RJ#v5g)8CHY?Z5o&pZ;fq zCkYy4B&^SEP=RF2b&c&(2*AR8SgN^P^0f7Cvo zOKk-;SdJ3t6uIg0=4_Q&QkDKZ&!>OKJM5DMK1G@FlAT8egqJ#_BQ?Z4brwj|f|aTs zIY5@|E!S9OQX88?qvNdSO8ls|yKVK_9^Es)1;%b_+f;?v%Xhr*K9!$dd=Fscm*nkr zf|i2-rgJaHf(GY6J=Ist?XP3V_sWLFdp#pBcxVN(u&syj0FquMwD<($0f{xfHBASX zSrf+rT+GCm3G7G!D^*?Gc;YG5tL$ovYUD_hV9 zaW!4lph|upaebSzU~A5n<@!hUQo=Y|vD6`lERjxAj1m;yt9YTxz`3FkOObEBYJY)% zk8HkNk296gB;{i ziUAWTWgBk;eD`YWQdv|=-)dhKNbnU!C~ps?fAt}X^v~Hn%@Xv(z)&HC`<_Gxgf2V9~?I&!@ju zc$5*^G^Z;-dx!;L6^_AXX|(F(KVHQ=!0=6>Q+6>Q9u=$QAnN*enU(XrUfFi=6RWD{ zv8K-y@?bO;CDh{fk_!0-vQLa#e)7lvV5Px2tO_}jgA<5J3VX3pZj-etr)@i+pLE9* zMvfrSLrfzLQ{NfaF+p92#9SfNfMClM_A=-YR)BM$ZMeuZY z1iqH6LexV@Ue^tdfXDu*nrRcNQ>gq6)}m|tVsr$4v%9)iev0rCC#bdnt2=8Zu8ow` zBB}LR=}^iPOGlX#jSByD)>;Ch)BaLyCXnpW*iTh4In^n;gNR9|*Pt>8!Bb-sf=?u2 z+v{QtzWnNV#vb9T7vjsER4uP;OPyiE>`r#c$XcPZzGQO8_mku<$7&Y!Efp5An%Bh6 zc>gl|-W444*vK{w&L@3P%~$Tw|lZOec9|?gN7^4bi6)c z73HhTXa?ULNlV1$A*C(Er~o5daC592nh&Sxx11dGp!^`We`*0KI;gBh@Yql(hR12@ z7Gqgt5825Cm`YTT?#Dh2oP=y>A}a8WIN3lxpNaK+wLl=X5M&%s;D9*|3;+YC{kT%Z zOF3iPFLget(Vjr$Pm-3T(P|!&j>1=sa)Vv?b!EYt-cf_3PKbEcw_euYLrGF;J{Zpf zVvp8X%5ht0>WmktVKn|BJ(aS;JeTx;WQ-Vsv!U3j%f#=Eq+FE|)lnsK4(+C>_a7Yr zlPXF;4zi3+P&Z~YH0fE6KoDIgF=n>tdInCVY_vyV>-@*&2IrWt9mbX zU4UWnD4?vkmQ$Qn@eq)*J7opiGejEBp-jyCFCWV}9+kIDSq+e`@|<2BR7g2f>nhvv zlif)DRGn+to(MaQGEa(rDV&LibRJaz)W(B^30@*+?`Yt%gVB`BAbf*CHs9ylU0!e9 zL7y9MuBCr%ibW7LkJ`e$DI}{VHurX311JNezh+G&k?SkqKpAmpadeV8td+8w$1zi= zU>x`e-jei=&ptUZJUS^f9`-uK~eLi4-CRm za!!E=XDP#*kJpom0MUZ1*A6Es)e z>3GslJF9OU1NahDU@R}^h98*6CL{QKExpuox+mfggjV7Z0C%FK^lJR4WV`3NvBle~ zjwyARlKuQB0Dc8WakBJXBI;lVI$K7q4E$uvCTU}o3zUo1Sr_(`cJ~0v5w&o5j1bD7 z85ep=SqY)V0b1HQ9|!*wM2KV#*Y(rt+t%CQeQ>~&g{C5Ad>tz5pWdj_)y4Q4h^tGN zozL0Y#0jGew}PjjRJc(WE;3yZ(A$D=J5nrC83`g9Xs|d(O;F@TE#-G+Qs+gQrT(qn zXeB)-IXvPpej-mI22gub#64`F!VhM{as@4_=fJ`}{G&GwZ0IBZbOI46e@Vg1YAUZG z{rcswgRQ}h@;TTJfYL`cI%NZUn(*qYBI)n%7TqbnTE*odtKd_gj)=s=P|pt1ll>YU z{@7GRNzncwo~{LQ6n62#qb8Yq-fC*uvUv&C*EW5DH7`=3jsI3fj0MXi_&nt+2gcU{NV+O;c2yy;Ju! zM+P&o{?lMO+!RN#BGo>W*WnwABOW@h?xuOU#%P<-*5)P%0z zCaaP+$v$>4%=DLU2>wv zJ!DAlD_G$|Iuh>ytUoR6JJs}%kI54?$AkQlTS*Wg-_N-4DW@a#)M*-!3njKMagk$ zfUENg^-VS|5QjRbiX#|*{9x1|)~bE;l|Q>ZnjKTH@h}>**Xl&eO;WJyUd@>(rb+aiDB4 zcSOq9Elu15HWWv(?BKz6Uy%;qodDJ2btGz{Yu=&5d&xQFx2a9)VkTQKJO`yE>r2A< zVJ(1y($pAa**0hWCW+(iTYYaEW)8{U7KYU9nJQoZO$2@NL{_(*-xRuTd{bVHZMLYm zE^qZBma9VtuoSjv#;LbA2b0tfcoDd1o~QR0sf`~#LD#ZLlmnx`07Z+zqWo#N`r<{i z8IVy{Am0RfSPxr?BqAGO#ZW$_#k)^LKQQI(f`8`J|WoqA!C;7j1I2*QuP=hy6)e*q-Ol*b@; zah9zT$q{V7q$I_1PDi(lE^107y(P0eeutO359P>LVNUe1gL-0>Lk_5m+k6} zY1u{%D-JI@pgi^wDGHrlDUN_ea%I>5I#?UY{=8%8-3F~%9ruDc4g)kb#{~Re0b<8N zf~HZ2SSYz;9;4wkDd5cjBgofEN~8hc&DwkbrHXcJ?p=Oi)DDbvWx^oUK3a=AskJoR z0UmuH?@VP&P%v?A=BsaU0w?~N59JN$pY1yxzt`uI!uoSyf>M{jR|N&UiSNDoK@U*0 zIe4@I-qdv*qgCdo)SA=j0pO#a9GR_Tt#S#B>b#Q+oZRIJEqa>`;Gt#Qt9sF^jTT_I zE2Ju+-`l`f4vLnvlQ`V{HP6eYZ&6uQ^<|0-f3ld)?n|>Rw!!pDk$@|swmnL(x=+~Q zo+s-&Dtkp&_k7)s-n`2GQ+3W!1BZ=l{5(5fn93KOui2eapWv+t2hguO6wx@3uRYzP zCMPf2o7hV>%1M!++W{v(Dt6(l-;8#??OKFSYp`hl)*NxVGd;kwXv;Majx9QfM$-@~ z7!RFTs0mH#+Rz;#QC4)IvkUn?A=NjgHaj^@GH}^Wd2{+Ni{b6nQH15l9ay$I^JS$j zXP7N<_X00&7(i{^R3Nv_B&RPTpU-(=AE-URrsqgzFE%OJ0>{SD#Ue4z%QUjl)7a6b z@uXOYKx)pbi`}dQtPq_ZvbVqs2`q9_uXzvVp*U8` zoMpbZx&-wivq@=f_f2Ifus%i1QAw#^ix|R&fKR0kTY9RikfjFk$rhiEYn2`NrCZ84 zWJTURTFgks=65S0osUDMhBY?1L&SlDej7~HUS$fU@=7@pPcLfH9|9MTVh_9eyUsV+ z4eDw0pMwTe$Y$~PB5!)mrqa%eW=$4H*#nhm7o=L-B@=tnavNYUY^!2GDA)B63 zv&ms_q#*;@yR$9j8&@{tk@>r)-H8uG{?nFVJ1ng$A5VL(>B5yqEOCsE)7M6goAb!q z%O(KKW<^!&%$x?jd9CRH z(nmN1igIQ-W9++R!;bX!xC#KePh~`rm5TBdRfJiBt@EDFszC7UBVM77e!V-KDLYaMt&e4CbS3FnC-0p3h1XV#msLk1 z&ucV8_L06rSRiV-9eG&JS%}UH@gO~Tmm{v{MJ3rcY$5)(5cj)RzY2#)LVM*iAKiA-8D=);@1Jh*4noQ0OY~9tFdob&bu;21h)e?aS@mo~P)q`q~ec z4+J!`a|=Gzm`!VWjwH!ddsh?8R-gz>HiQ+v2!a&5Wl5yT&JB^f+2;0G_PrI5v(hN* zvgWXQ)<5j5{xxGKzn19Dh7{L-mmy5DrPwCvJkPpT&@7RaELFG`BXSmRbKv9R+)JXI(K6t`aZMf!_Hl8U0F9y`M#q$Q!@>c5>fmy>8Y6xWz{$bFHX! zIa^nAj2u}N=>1ZOtiy5O|I?Tl}MZ>vNLXE3DF!xn3-4ETt75X zd1vE3f%i!?1J@YGslX~g&Cq+IJB+tOE-%!0L|UZ?045@27m=!s?E)OJj*wM!j0b=k z6;aBCIg&#%#mf5<^d5JC83eTb*z3-ANKPgl69ld~m9k;4v&D%>x%Sc+Y!ZQ3L;cq$ zP>l0T9n#2^_Ite__0G_};M#O2)&cQsxz>asiH`!IWKEkj8<9?Q96B1pDlo)(-$rf6 z0_!Eia~vXrgBDJnYw10gcEp=~KpDhht=vQpEl)Cx>%yE(wdmtc*v z zk<{b0D>d6CzmU4X{gSf5SGqm3M493;SZMZcQBQb~7Pr|oPrDDS!BuZ|ahAj4#KmsT z;)f_m65!AO&)^Yw5l5h z2mBXFbm~peyfD5HqRSc=5_%b`j0vdrTn!{gEhv5fl|VLPeDibp8;>;#b!(H zS#Jb*K{5&&$4lOT+9{llcWOcyoN?Fu?72g^Qo>$VGTcv-F7~lMhoi;nNk2x%$SMGc zRMuW^a$e6XTXvo)_>S+|T6P9q4nltQJB}(CI`GDSn`Gmc)o`r}M5mX7pMSLQ3G(Zh z_1HJ0SzCQx4U;kKp%M59S+>C^2;CAK9Qv_moPz!l7qUhrzV+mU-E(=NUU1c=DOV8{ z2G0+Hl-g7Fq6!jSVWW>~Yg>0T-3F~Dm)bCdkR5I^6YFG_ozhPDDiuG-Ou8C5TFyIl zq3eRw!JQJm2N{Z29>U<9RjuNlz-`= zbGnJMxf8EodUqMwFh}N73?MNQsRx%D0t7$q30L}}gP3)`b_%2j%_;o9pw@_!uar#6 zx6V(zpzG?)UVzp2%qMGx{MIWVtiA`>o|Pd{k@_k})eDf1Qaq1Gn$P|?$-Y^QlsV{{Bu zNm-{7q8s^zKOGLu7v*_@GfA-q9$J8L9)0b!`WRPmF~v&7{DQ@ZZ9KP>wQB6nzEqBcrpJw}) z5CpWG_d2KWACWITn@V-J^_kML4PO*DyZ4?PiIns_r36$HmCRIRa!Gop9Rugo&}3tR6nIA_BzJ9P7mOn8S=|b! zosuB)bUK}>VFu9HZxHP<$vq+;S%(&-Uk~{0yx?7SmKIaM*5J5VDx^jJLjBahkm;3m z5xLRv0o0#F9{pM~M^@6J43Cepk0L;IMlD{7sW^NI(Oe>WO0PSbV9&5!hESrkUS7A?(FRF)IbY3GWag|IQ4mNm&&nu!_*c2ONsxty#z}bxKb>NVZLC&$1 zk!WGB3p`fWzOPzS-LkX!etAnbUA5*Mw=Cf8RkaLCVBJveRKifFc5~wD+!~7wIy5p9p(2uP31IYUmscVCEB&QnUVwk0Oz(svri}glIcM|U?~#lAFS zBq^l?W(_!$nwFTS5Fl^#Aq}Wv%2slqYm<=d%)iyQqw-Yr=7+kIm%V@!cfdyykVP2C zivU*(SxS}ej}!TlKf++Q+E@EzT~_7b*%#hi*pUs+g4^TFhpM4Ua+94jIR3tpON`aM z>PzferFz#9{fi#JOOB65^eyrvc~S-YvRZ=7GhNH`cVueX%(ae)ki(VyHNnw0TF5>5_HVEhgkD9yDSt} z-T-O>$&T8}1A3evAf`+@us|T7UFDlm9Nc<)yj1L0RcC&;Mi;6!Qisjwlly=6zR|x% zP8wO9uL#5jo)QT6^`tJ|B3*Ya_LfF--o)`Hd3-y#KMGcA!)ms|)8(piVk3=EkXQ{} z?rY-jew`S6B3Omu1%UB&XCFaaA1`!R!h749IUOXQCdeYI6dO=USflahXFdR$f?D}K z9GDVy<&s08>M?miS~`21N+na8ge7JCF-@^7YNkAPvZ$Pn1ieEw2^32~X0{hbFIDE( zsuz+}hhuW;XO&UzVEy9st;S^U-5EuO7uZqN~E=)CgFClH@n zHrZ9YKG+<@$KiN(n#8~$-K8}(i^!xD4Hx#1J(EKFh7StCs@*(+cNm~q7L}=-jvuME zeC;Ef6yc*|A!Vry2uBa?e6m+anBL##Ys?|{ur24El3P#Zr7CNm`i#)dD*%X@$k~m- zs~nqys@-X?Z0Bj(==mg+cM9!ea+BPl@mp5aRL@=+olT+aPgBdHJTqx4QbX`8N!4KQ zsvU%JW;$0kl;jwVP+w=1qZG)fC*zLMoBggIueq~Ol2e)8SsCyb>2IX&5S4xPtfFux zZKyBoSU}^1M}YK_)7}89fJOY|HLYz1XC^?Ap8~01 znh%IVtZ%|ePCa?5noKFatyVc<;NRrEC9qU7qH})tP!6Yfc&HaV2nw!1%b>m~wTZJU zyhzJcid)Vu?~|4C$Ui)kT}RU4285)Nfn${~#tz8}v2E#5#{!#Q9=+ciGU|V>%w+`~ z$)$HtB~&{GRbC$Zsc@p+==$q&t)-6w(Z%6RULCtD>2+TUi6%ON=_p!KdVES(tPh}e zJ5klIdgBaNX^O+*ZT9Eo`P+pvMKZ4*DD z5UMK29hswpijX9)e6BVcJi0bQNi8A=q$eFW6 zbov+ixC$`Tr4BZny)>(K6~?PdrjuE~TJjSaZJJGGgHy^wzb`&2LSoo2RzjuHsLKcp}6RKDXXM=z+NvptK! zmLZr@rKUMvm6L`h4b}Z*SA(=pcor4fxodYMpU~;G>{{ds9VV2?15WFFkP`nB1l=tO zCD&>p;0?rTJkKVmeGbhP6(^Ns>o;F&%>xXRGU9EDYILLwoze9I1O-LOzn#zFWQ(A` z0G`eHCkDLsQ{JgEgT}v<$Td3A@!EUiJ&!j!Xix}vGFr)|-=;EY%R#)RLHSxTph!VS zKQRTG2`X)SnOBcIxF@ME)$gEmxvWph#!q5z&!9KQnRMW*g%=4r1k^byNF1Exza#lJ zX8e)gnB6S^4#(lP*&d|?qL*U46KY{V z-lV+VW*LJ2Enue83gb?-fA>BDT*LcL@77vP{!h~7RJHNS>2JNg(oK~SVy7W<$T18vrLeo_t@mSTI~?lmzY zCA(_G3AHqANk~C8E;yZ>bQ~b#JE~_tn)M}Ar*buVh~3K;d2ZciUMye_Ro1e918gB% zfx2lr^b=T#D+ow&S12Ke!%2?TjW{|f$O*THy+_Oc*lJf> zlag|Ns(OGf&$f_z3-ufk?T2ce!8l4SHSO0av46TO9~qY;tT8*=dR+~PrJ?b(z5(}q zGFeOr(rNPil)x`C)iop{AC9}dD9j@%oPUrIoH!X0$fuH6%VI+PDnMD0C7dV!@h$#& zSVu$&=J9sG>r&bEIHVAj)6!L?z7{hq|8n9((-C_fk3u=l^xim1xtLT=eYF!Po?t%b z(!X`jW#<8ZYFws?p~z1KLrF2`XZE>6&JF@;-NL_;f!y>c5kO`hU*Vv~=wiR(+0I*0 zYI!GdMV2^68m=m2x^+N2uh{eJ$DO7d71hhq?@DGs&Y%|iMEs_pe&Z$$T|)W*U{E(5 zF9;MAl(Dz8t^PQM6vEHrr6&REbM{CUsuw@keOmJIGxahg*a0)I%m?O-VXm zc9Emwdh#eZEQ$yxWhV$^+h&_$8rL?iKF7-q881VEn(Kb`#t9b}vXsK!n-W5@q9r`H zo|*RK>opL3sY=e46m^oswqvs`Kh8@5#B_0$T&SH(0AGIPdvyZ`D07Sn1;slj+kAS( z7o92`8s|VIU?hcjzN1?S%jlP2l3h*&Ii2oI^A$t-ctiEr+$Muj$UF{$UIeX{d2@{LNN-`Aa7=+O zvVxL?O%f_a4O`Vt%FKEc+OXZ*Yj`ibA2#{2!duh6nkqm$h=d{q3CZJ9EVmY!AO+p# zULabdru|e6aTTJ1zQa=;)Nu1wkg%axH(2EH%1Sv09?&+EnV&BV=%(a%AmaJ12?jrR zNX{f15=aBL-2t^%?zPjT)Y(NIuG4uuh4&dv_3+s5JmuCWPTAok-y~I?sT|*uouyu= zR!GZBrOciswrrbN)ms=s-NRX}VE)hBMg47_DdpJnbnOQK4DZwR^~kE^KJn5??c&5Q zzqUy3wRyK~6{l2JPIsTb*xVW6)~KZpr68h5F?jO4*_swU$M~(E!k<1A8%66I`?Ml_mgkn77L! zd}V_v#W=iv8%}3=#pT88On1&7z`=W)U(I}(>dcGRW*nlmod3K7C~4?Jubti&k()1ARGS5x9rWmVme)!=$0kvIWJ z9#0x_H&Zh+R*a~bL* z8NSP+S3ZN2!>Z~uMBrgx6@w}emW=at<;qsdRef`l#{$E$jE`lhvA}u9+X1GEJe)C2 zKqG6!SEviL0^Ib9n@Y4*UxcEu+dH+gWs}KGVHa5@=zgoLJBN%MbQE_9fCKkR()h%K zbBGCS9V@l~SXktuN1Z<}4yvBNciL@xm;4xV<<=DEBes+0UfSJ}&dEanT>0*LHS!iY zR%W{+Kl0_55g&@2*=3ojmZH{_tTV9-Bz9E01#_{JI0<$E<=7NXBPYNSJlTuNJO}ky z**a=CgAB3?$CreBhEDTCm$;gw4mwHcNc%D!kUw-<;@J8&Ke>@xX3PUVSQJW!k3YB7 zHQ8YLKP$Hw_6;{Rwib z=MWTe0*z(Bf{KarE9@`oil7|FR@Mn9 zF!_k?q{r?YgdQBvwwT@g!KZrh^C=R(i4k%L&g@sCr&vKN6>xMU)W~Ogoz_b)d?*zo zpXSK;ywu$yZ3^8o%4yrDDYR6jT(UODQB6xducE?a?*$4Savtma zzJfu@38%=&6R|3ySY==7nV>{EMcTRi>N`DVY++qx_kBy5`_0#-nt5mI)+SL#+*o(+ zhCgP*Ov$KkAfYeCnlxyWxc@zyw3wbyE&qgojI=7ZX5xAXRv7MVt_1leVSpH-Wx@IX}%Cqujz17 zJvAOu_Jv~3fd*4+ZOb$DCau{@I7;pq;4jxigOP2hGfuDnS+2xCIE0n?e@1n?_Es` zwqEllX0exY<+po#DpVx%0Kb$UZ;s6AT&8&X27QwI!hI3883i?ueC*|9rSah#?PFsR zn+c`bRb9Hs+>-~AaYn{ew(9}!`J*pu>m@MYuqaH@om!!Y;Z>0^tF+G`04IKeJsglq z650A?0DqE|NcZ9kN(FC84K)HQu^&U;BM9pE(5|Q2W&DUd^6J!nTc z7DrE_IWEb`Wdpd{*^2>**IOIv&g$HePRh~^RJ5~5;C0u63{?)Y#WFP!P=$K&U$tmt zGl;?CSPZaA@02}hj?i#Y4kP6bH4F={Z=oVg)T~?aUFk*5%7_5}I(-)dv)@7$bEor8nQ{;F4zM3bxKtR|cOcw6$Q<(0-! zr!Cty7YC@sy3Ngeyd;O1uFYt5WJktM80xhdb&0djv9GwDT(mf(s8anQsj)$b=@M&f zy?ketE28$~cnJs&OlkBO-`nd5`o=rV z$bZe|;KGt1=pb;BG}1NgnvKZHHsqQ0r*rJ?3YaP{LMqY!&Z#IB1vqudkv7%Q0Et5a z-f|K$mdIZtEo&~X{<4y$mRD6`jxXYM=uJ!@nKB;}9)B;VMai9%>?>AUpqdOg^Adpi zi5Lk6cyvqW!6c!1DrzyVn4s){0+{J`R4Fki z9UYcd#}6!Fnj6;cyRJfgTC zTKOJzZ4zsHr^kdOz|`!>jK*7l3}PoRRml!b09uK<476(zf0T6KI}%mMp|*OXCM9g) zPcxebsK~})P3?6*26&w{mE&=6&neqY)|O6t9&+#HzDnh^CusYU2u;r3>Vr(N12CjM z!Uh*#*(rs-z(!N$H@;`0*q1dVRuvKs^_pH?Xe8mV1dcui?L4QK92CcjnLNPQr8zOE zFx~kG3q^tgJGa_4In?M$m1zQN@xrAa#W5za(86#!`pQ01xKm4H@3mHQ!X#Kz44G`y zzuMKxkzcEpS3j+5WvQS)vD_iP#+RTPz9MRb5`va@iIi=H;>X$P(MX7j_~opm30q;4 zgowaAhEC>AZ@wUekYvJ0HrwPb#f0JnaZqva+ht#?O5z2Iu<23#xB2_0OQ-Pkcl(ar z8y*MNWuRO4Q<3PGd+(!I-ZF0SbsS6v7O;mLfuiz#i5{;qpw(f^cHNHIM*>e!%k_9C zK}}8#H9bd=yfOF~_4T(Kkt5NGem_&CoH$<(C!FYB2cMU0XYv}PcwK8Rwb)H>MJb!C z6xw4Gl7;S4VwHf1%ewe=rmU+H9Cc49PP_y~6RLwgA?cIeiqbn#mB?UC8Kie5h0_4s z93ZMWP18BGdOh1vXy0j%YEeWEP{FIFi7q^Widbb+qFPXU#QuH1uB%(KJk?aBuLdur zZV~1*z8VR^84Kdq8}kovb0&8ZP1$YZ`i81Ra5dN1(2h<$cNApzU6d5_e}_n({N4ZnlN) zoGxFs7oC3zu9P3UE1bq^>?XLRT$hPyrBjoqG^#x}FSH=+IWfuCf5){%et>WBwnCPq zax&S;+6j8gb19cRQC*JcaHbNg>df|fYzv5*WRFuT@mRzJ2W@?elweMRn~iPWQ*$Yt zs?ep*zWM}Q73G{ixg1mbptR-*lLJ@ z=P&D%^Oub3b0?9KImrfFaZ1>`SbftqDeT@R5`iTQW@-N3G?<%#s8vWvdia*V$ra)8bN&c9P7i*|Jja!9}?*& zUWi86Me3n+7*zEyAeI`Hlf>s1m4!&CQ`6YU$~l~%?fGq}0T?)X&g$n#EfW<9*eWk? z5~Jf}i#!b~T-iQ{{yI}>>UBj?f>&P$u%_%{bdHPVWvl0hblxs&TnKcUEhj2(>3>>9 zN?o>2)C^i#(9W~V=a6NV?Z0d1sRX7v^wsN0whIC5JC|;itrWg^?vOJXWd|imct>WGMzJX#Mc&H#q2CFU=HlsGPgRJrufv})A6Oo$Y^xx&Uxe9WqRFU$Qg0-s- zh7s-(e_3(cM21S0>_ixFmQ+p$aQ(2{pCn2dBd_;iTVjKM-K*RlmVpGYDO>Bit?i@Q z1_!PbW!9UL^ft$CyGx~Q?W2Hn;2Evxm*Z1pN@pMQp;+3}83VbrYyc&hq_X9y(kw}r z#F=j`M-iY=aPxRpHC_rINg<-C51ZDZxW&6RaL>!ah~Z+#SJ|PXWyauW66EKx0P>d3 zDQ-9=mLQlYNBI(<$|vJ$a1cR2tXNgmJ<@w8{o$Zij6+Mt8#Jg_v{ER1LV5X=$!pw`Nz^tifDCo zjE)mzOC1ChB8UOv2s65n701Dx8g}+rrUXZ?d&ls~?BWr0zx6Ko`w?WyW%Em`&g|aa zoI6JPju>U$@+b+JTV}BP~ux(ducCVsPO5d z^ssSA!`-IJLt=c@DQ%CQb{auY`%6uB#GhJ*Xr3g&0KAtz0F8)Q&9a@4oV+Lv=T4O> zcC&$~nJxAJ!$D99{OJ&@BLHM|zJq$`M_R?`_io}0&^`XJm~5l#nZRl=23O6Y6D!=K0kI;rI=kV8gul-kL7 za!Plm>spPe71$IhqadjI^RmEMy%Md>{9q!m98z|;<&XV1zMtLE2&g0Fct@UrnksQG z@7BRT!XgwIrt+7|x8p^UlE$1iT?TTPa_) zbd{#<{DF;b-fG&>p@^#|EjN#MPGRyUTL{g2%kR!;S{$nAd?hCNp1!KCD(5GS*5aJN z4!$Dk10}ROBJ}Vgc$G0aDlj@nfBx_@c$UFdADoP=I^Vjo%HocsuKbm?C9@vIm@83V z8xbmSic@}7zXe^;-xDz4$Pfo^sW@KZ(8=cVCxEL_VZt0KoQ9lM0#T_~uHYn_C!Jis zKz&Lg9f`CAzGAW*-mxW_f|*s+9@J)@El$Cg_My{NAnkpevn;`mLQb}!a_+iVC@|$^ zsY4IbTD+-Q?@b;V*P+96Me$yBQXZ8r>aE6`r6*Q zT#g&t4k)ZpxQ)>g_ve_7g6 z{4Fhs8*i9^z!WdCe-vCUfq=jpcvTVjJoFM|Qkc`Qb{zr*XL2eE$aHy2M)j<2+m>ji z+0eRIkJR1G`vP!;6P!P3O68eg)veNA-81ifx(+>n;ta0ltY|Xze463NO4PNTGA+zTEjJQQ9rJ9E|@2;Jq`}_(=EjW&f-qGsew^#FK zxl9y0(we@afCCxssZ0I9#j5fQ03NU?Rpux9FhfXcq!U4-rHEk$YhsbkU=x+6Ud=Zi z$H{&mNDI&gR*TV`w6uvOMNd^oeVkN2C+JQ1=easTQQ$`9?>~qzhWX(5B~#GZBWSe4 zaRs_1=Sb`UZ5^FI$7cv3cg~(#^{9M;H$ zD+zQKlRJ7`oZ3k&F;S)|6aLuzq+%t{IV*o{3;52C{3#m1wv)Bu;irO#+dQpVd~%kM zb43pNR6Vw*4oH+%SeK1gdrcj5 z2F$!&FR!Gj%goMQA+FC!#%a1IblVH+oHZLM6nIT*0~?qTa9(26#yvYT)8*`e2?00J zNotNaA?HpK^0{StXHVpe$~Zb(e&xwY(7?n5BzjEj)i<1^EpH{Tn!VS^GTM!`ElXzU zUR+L68d+(%qr7xqYpLz4$oM0=t;U_@?I~!t8l&~*lJGuMUDdLW-_JpF6+lg#Wqt8- zx=NsX-Vw3*u?~E4;rv!*r`qgq(@b(Y;9DfIWc`!#%oh>ZmR)+V$DnJ}w}se2N~)7( zgkECH27>7PMACEK<^9opEnqv2pM|%#@a%NTwmomBTbBAKVS=Q*y_5jJIV3xbB^yXZ zVn0gJ49VGoy?30bu6o=pd=*Xj*R!H{U z6qo%7AOswpaPG~0u<%ltZfHETs9d8Zkgenh8WTQ7ZKCwe0A@#i$_be14Dm;mL$OR* zr53YHDiv_Pc9HYwuaZ^1|7kZ?!yA5Bw<$%>9pApdO}$CJdo}W@Z=CFPculPOa^BS| zMt$kNyXcMyI*7xm&?GJCJ$!!m3SDhcUP!vMD~e)U;lL^OaZ(ZW zYJHML$&%8FC_5Bt5`iY^Njh088$$^}J_bL_-91f7R?x$1``)PyRgO7%RgEQzn`n=h z-%yKLn*W)=v(-CBPG*0;nW;{l)61&4{;1zl4iLc9Qv$sA?)0i+FrR+ELv=GkA|ac1 z(NjI9UNw{|;pY(Tqvlo3lug2NBCPW($y;oDkAHLk=F;ZwCpC3ghm7bBjlb?FEcU~dbig7!&x{``MZF0t(8P=MRK&UfQ zaF)z}=Ko~}e4P`stMD{0U(XK-xsh$z%thxPRUCs3FUw0(uuu$2`jW5YWfA&4moiz$itK-kU><*V{$=cH%{%4;ILg4=S58I**FJT^#aOu^hqC)HcQjjMoT$N_0Jri$#*-d z4n1BWi;|QUmqp?2dzqTEO;XuGA%~RvO zsCY)R-f%oGdbOrT>9{S9WmhqCc!JG5FXqOTuKPacE;8YJjq5(;RFdUH-o>jTz7Ejz z(~_OA-~^>Y9@K)oilOCuw1-|J3$J++<>j5|dsUZ@s(&jG8-MnKJ+@3nCc2PZdj+bJ zECH|DU?kJVt19!WmzP&x>K5}IKvBAfd&Q+Ne+Pj-&R0sDAo0qc_oA+!FZh1R=aOga z!vo8|S4o!!n7?W2TzbvU;vV3Pb6eZ$OOC(3KHlF@#L8gGgerEH>Khh`Y{#Q(Sx7J0 zLKlVB&ef@ZSsA09l4p+^5Ns4>2EcJeXiqS2DtgAt=(+P<)GrcIIY$Hl#~U)6PnfDh zEO3$2m&(1kCKC_9^hauW=A$4`uO=OJIo$)%>SB{U)bUfBj!K&2sV} z#%m(ldjV6nV@*H!j%eeo?Q&j(B>mkR9AW&l2V?Kg5$Vq{cMT)e0jAgoolAU*_qJB~ zn~$>aXs)iCAv@S#74#%gf-Jv^uX>&1wPg3Yb=T$Gyfal&!`8i#^+M?Om~1hF>%ier zXUs+g5G^Ss7;xeQgT%G5t<6`uoOptWOu=F@QL$(q9_m>M1;pwR^&;64gFA(c=_Y$G%$B`n>v_Q{5~79Mu3ZF2mgU2tmnCOeQbxTT*E3V|6aZhOfC*dX#L z0xM7cf_T1N^)CMC$%7zDsGQ8H4dy;BjRD=fpt1h3mKPnSn}G&fhB z%YSL<2SR(p9a2w{Bd%Ysc6)qZy(tKl_mcgG`&u%4&s#+;^N5KW4+1}@xB>XAG%CMU zRhFQ=_K`ia0CC~1a{qPxIX5>@rtu?o-pI5V=W zG6dy9d;Q$EuTMOkqyq-^8QI{$&sSm=X@Ele5Svh}+W?asl zO4H<}f;FlNwqU|LWP6r#vzOym;}xgry1_dRY!{3`%8S=s#)0L`2HT2fYi{YixSVxR zL>+d)INb73wGFe8q!x}Ej_Jy|tCIzst@U#Nf!M-tzbcoH?6B^z)Gce(I33FRs|ptG zB3mxFii){#KESH%1)H%xca!ViwHgcdO|(;(Y@|=GOpta~;6M<2Y}}AUiI-b@O6gc~ zUcmG27U%!TSr+#oRo#~Z(JvC>yg#PI&`dfVy^eZPI>DJ)FYEchZ>quDk~#ulkSec- z(<9=lI=yDQ9gh(ehqp9b#io?@L{c$$#)f0Ds;x#={LtdK^9bYB>xEl zm4RxF{MuOVw!Iydt6+ts2dS>n6l*GSweA(AtUCiL+bePw3eO|mYFXSfN0)Bi6YilCyZ1^EDBrd+@e<_h0eFNi(KA7 z`F9o=({VO)K$2_DbB8@S@E3fH|?5mF1 z)<1f({K~P(Y5Fc_f&34Q;FwZ^UGFh~LtR(zkbQ4Q2!s)1xcW19YL@N4ybAU2jv%{{ zoffwKgjYe0Y<6_5SId|T4ivExsNP3X>GDFZs2d=S*tESvmtXW=-6O|1n2BDntZ-i0iVz3Rk)dwd?sbYY7Qi?bn#a3 z)Lb~7Cgyxl>*Z-hIEfmH>DiM2nRYd5_RLhS3Z?_V<4df)@bir-fjO}{ZCGmvZZ+JT zCsOx@AkoRYKaC!56s7CWPmLfpAMY|bMo0B$eLK|(^zxRB*u2NU9_sZY!<{c>0BobAgI%R-^Cc3*Asj_sb<}PgJy!!sAQBnq6 zC1mP-k;EmHvK?eQUx^7Nrbt8VswGT(dM~P5divS+;}YS1h|&aRRg(b=UMg(`;RHvI zuB2+&t>fr{0}dMEH61(e6bwK2-gcL_3*Ns4Vh2yBk0`ae3KMGPNE75p@MZM2vv({} zTBUGrO2YO11uR|X*rO~~8eKDp&+7;+r;0jHON=|52~@5j(}h?k*4d% zIz|zU!CF$v@gL=mbPXySCmOnStV-ftzj9*#6`Agn1f3jBB^b-!RSKS158m3{sHI1w zjzp%E^>Wt8s#0pE6~nzGoR9O4N)(ZkDek502FgK z={s1j{5XFA9Oft3$BN`vmYP7X_oY+qrN6%X|t8HH7DMW zhsG;5^(Dc7-l$MxsU@82qs#T%9-YcTM$^D@CjpgZdu#=flf4XGiay2s>1J@lmseip zdJJh1sxU3;6bA@S^5wzI1j4D&ApCO8~y4i>xC_NYSub8AT_7k6dw55_z)x#&}g$?;M za^icP1#C=tI@x&Z?Y1aSzSrhMvcscxu&$dSP)txDJ?GQ$SSbaGFVck`H7VJVOLvk- zE+Lh!8i-E5=r=IF{5bRDT_iYElpgY70zJ^j+8yM0qzvSN5vMU5F^-$#b z6AqURl(qz5O_J@4#9kXl!RVQydCR#c1auAJbM@i#}y zIkW8EGO`W4c*`mgsAs5N%GyySErm}tEe@Q0??aSl=@Rw&InPjlmQA$OBc1oHn$x4yWUa8FnLj*NSxL~zQbr?weLEceQ z`_4yD&yfx^=paMBEnl~o8RB(2*V3~PS-pNqiq(VJC7q?)GI^5*R2;n zztzj?DC#+EF(q2^(Ct;y6{RkFwQ}mbD&>2oO^gAKi>@gcBP**e{UnuI&8DS~cUT`0 zNuj)S71gyk)6Uw$Lj`W_)dMMyLMI2;>AU?|)8SCjf}&U!t+y{j!w40~NrU0m5yW!K zQMJRkpfjQQ~)%HdAPvr z4@HrP65i^b@*~7mg4Cp>z<$sqLkn(27>HEQr&qO#{JE?2=h9Qmxu3KICJT#m-t+qUYu zLXVW1MVF#}Y?*;@IsD#^sllQ&+|SU0QVd#J=6VNP0aJl$_<5}X08|NhC3sQwOpW7w zXUD1zMc$;EZ`F;`5SJeeAkpXXj!LbN<{Z+eoCrA#aK#I*4(kEq*=w4fo2v-LlCrGF z>Xiwa67_Ue(p`@Yr6>E#kK7^|6znL7LM7G!!zjUTU0IG%b1q;wmLzkAa%SB2lO?)y zwV~g!6%`HRouIp@m5r%PCU3l7XW^@mKK+OjyeS|@$&6?mP$~sy>d&QBQfwJ>UKI+W zCsMWWPd{IN*`pBy1$MWO9=CFoo1LI5+)%4Jnv@B6&IG7(qVb4BiQCZEzMp~jOI00F z11O!fET%wE#s*pGTgT z16|oQ(S|w@?G1YOv6|hFGHkw0kxl1{m*WhkaAH_t|C=p@wbi|#WD&vI0#vV7wLPY7 z9sRjNCyL8v8%MF`+t*P+kjhsUPt{(~c1*Wg1DyuxC6_el2m=3CgI8s&_|=a+RlkXj zbs60D+AY7%j6@1mXcLj`JwuV*HU^vJH5zPHl*Toz&NBeGsGp<)@QmT1{REx;rowmQY_z)ApV9=Q(b1b=60Hi-;G|M7GO1q3HD!>S zqhOz7AC$ckl9LL*8nS%+rKRaKU(Bny*8-_J6c8Wl zfAY?2nsSx}YG+yLVzeu?YZH?BQnv=5ZH4X6-Apc&u(PKr@x;=ABW7V&9eMs^Y+~9gFQviAQ z`HG3lTXW*zwRmHssaNqr797A}`3urM#4aG{Rz3zGro2{sY%pYC0VhhsHlT=P*SiYR zLT^HnFGUH3U=21FYc_l*y|w=&eaQVaWhq|$3j zDK}I4|CD|eo~urCud^r{Z^frV@lgP*fr?)X)Fs@OHllJ`?=J^P^+Jjgk|5weUMJw| z>I^8(Y7RMN0`9nMa6%0068MIE*+8X<@%jwEqzD_x0I3Nvh*Lb7g!kONFN{P6x zW$LC@^%|tgO+{}G*r9+b`KAu>lA09`QW3P?xG)_K* zbx0J*+SI3}@bfJ^?=FwlcS$@nWS?q`pell1Ncr}EI5uTnD{8VK1Ob)E=dUWk_v;!TN54JDM!2s)Tv7tK=0q1KpMI zOs8b)T`HL%Rd$Cl-`c^NQvsQL)$FPn)B7FXz&CEQvPB(+oLWm>Dgb#YOJ5yGK?Q77 zHX-4GO&G`&oTp5j9!2;Cz9a?|rA>#!gVuo@H(h76mLGg9hpg#DLP5OL$+EJ3%$2n$ zm7s;u2XNN3X1{D^$R;ol^;7m<6(K)*ZM&8yu5Jj#%z#DlhZMPo#TunXUFP<#nn5+0Bvc;24C5^8=LJ0 z{-r}>(;z&&Z*!_H2)U?f)Q9BXI`Kx5>_0}yE&LjJMqcDAg9{||%7F)E zXeG=$;0O=}$++HAj-$>YCH&)D&dbSg-|LxpZ{V(ytDbj`7ib{zblbAL>YXH|v$iVx z0)==d+sh^%ZwS@LWw-06^K&I{BUmFs&?wPR-^j^ky9hd}mRdB4dk;tEiY2kM%GB|2 z-zL&OghxwHEj85U(4@;4;HOfmtB4ux+z_DG2!-`Yy2(&bmj~Ej@ea!3DCFCFbxv%) z^4;St=u~60f|im(kj=%ua5jT zF;(OHt;x#^=JQ_r>9$Lp$sr6nVjBD&`$s;^!RVpdd((MrXt&F24q)`{?P8irp(xR! z9;Cf7wgSt(d^?ngTSc`Ax+9#DQgp@{>uONWWaEg08}pX$!-l6kA#h00KC;s5TmD~` z?!`)yUB?xuFKt2mLo!G4^WTKVX4b6tX6`+wyDBq6B0&-aN^TT0Y#q?hM%TU+fL^Mg zR!DOR6QZm%1|UqVI&m^TA$eB08|XmaoW_ z5N#@sspxosj6)}DyNdK>WwjR@mOks1}-imzQ^rNzTw*+niH^+mZK* z_Q-F6Ct}ABawj{VFS^&)n>zQ*^D{RK-V_&H$}?Y9hD7QOz}P37s^@Hxko;%f+Ecbb zTrLuEZ|W?Y)_E$T)@d3h;Q&&O3)u5w8z2qje{zPQLC!;8&c>7++fxmkY>aCvBlKDn z+1L#{>()qN)0$6^Chl>hTD3F9)PcRU*KHjx5C2?pB^yq`%<^PnR-BxGF811h?;O#+ zVmd&nAooOC^ww!hncZ_Iwt!{ALbr5vs#ciIYp>M7wGJ`m5tcbuk@ zq;H7#Jqh3Me(LBFHu~m$-uAL#GYuocm^5&kl;vLN`qDCDtCWg!qUT-$yjD06@e~XT z$FrREq!%8zP##C|HgXMuQV7Vj8abN<|PSEfuJWug<56Bwi$-mKuQ=#@iEu|<=Vl_*>u+I-vL3-XNlM8R7@ zyE6_FPkAJZWJ*GJc;7j<1SCGXRw;hI@1t&ck9@cMnoDQajWGYa=;*B_HJ|e5^}CCf za~a{7c%rFsm!0X(>LKRXCQ(rbJOe~>h!~8hE_7(#S{uv{OqSe@*aEAE`Aj~}?r2Xz z#a-V$rA0-@+CUK&1Bmf1hza$cKlaUXe(uv8BpOPZ+Hf^vbclYO+@3-&5O_K`pz#qF= zb4khN2l2q%cFP3Vwt0O)6kSETBZux%>4N?=^S888Pd43(D1C2#^iGk4`RbV;Q!}vV z2JSK?b`dGBUQHek@{bc&q`;_&g)uiu#Rc zl^fZqVQR~~bAZhH@nKE`3ru0_nION96w~NpBei6zj*qk5%HwG#c;VL2fvNsNN&+oe z-U7@SMfH3!(|Q1R9ss}02lv&M<`v9bM3MlIjn&A@nC#+m zW_aKsG^|UCq1xj$@!|_$RL_&N93Ct7zfYN(;>7JeS9cOI?m%FE_AAM3JT61PlzV3m z1ap8KF*5YxR-$Ywf9>;i$=l|Fgd+eHwhk>PW+7S%>MJybnV&(_iYq<)0zU+ zwyEqt+GQ}evRS@28`KF0uZ77ZP2%lq#ff+@ZCN^{4 z@>?v9oIHZ*IYqYY*F3U3&Ba83H2%zP;>EP`JdRp`O9)&R;Q1)Hd+Xv5m?B@!r8Loe zem>G6SLa1Hr%ahj3Sl}emubFj^vltLu3G7A2}d^5CNuxUrr8ckppr#Vy7K*@lFFO2 z=n<4319J2<%G`$GZ!%Er;*A_#q@A(c zFlnBCmDR?X5++soOr0|apm5YY#h}5Bu-3>~+DR}R_i~-4Rwo?Y%>o}nf%&&Y^-@tMC_NnKl3#P=1}n25<)!lI z6hv&C1$d=AYQ+Y}R(iiY<{Sr_nRHV%-zYq%UfyjgHr_NdbtG5tqOwY&Amu78dnBuX z-A6v|cG@4(Isu8;a#yVi9Y8Y1Dc_eMv&7t&Rl)e)D(OohjBz~6gNu2Y9 z(4=_6$IgFQHVd%D1W8R@E7O5kIVtb0AUoVFw&Em5RWK9UjS#uy(;(IBWhU+^`E!Bp zx1{8(v>-tbhV8+AERS$0QBEj2(|uW(Z!H ziBvDIow=ZqT-m(cq|Q6{Ss|M9^cwR`#dpjny}5fzEji6}NmEjrAoso&G5neEa<7$+ zQ~qv(Ds&Y9f7w5xt`nqhV+ia$lYq~F(;)U7oP|_%@_W*MzGG0?M|o>GOZI8)8oZ)o zZt9%MI)yQdI9#6D@Ax`4OIz(u?ZDb$zmLbat@eD(aua@UCS2{H#fS2DvOq&bwbqfZ z8Q3>H96l2L5z7YuaoCa{UFT8eEPOnNXZ!w!U5(Rq5AK|E_m14YMA4RKN}N=CeZfp0 zx)(cPucXQKStbtGV)wG3w_-h{^h_=v$Roi_xm^s@EF>S*01gz*(ZL4~ zxc%6yZ$TdL&_^le;LvTKN@!U*18@L*)v|%Zn@J>I-x8$W3CAs5dsDd>zw?p{jHkwU zF73Q+Slk9uNzN^)edKG%5lfEDvJcwL%dxLR%zdd`?Li~cLXdUd%>;5(ptYUgA@^4T zB1g%0Ced0haEUv^iG%P$O4WSzBC=8`Wt)~yyi|#0MmLH^TL!{ZVXbX9+Z6m>@+DX3 z3`%?xhH?}!sunlZoc}#Y*aoK!pJB{bq*vvtUc0NC+(Q&PVuzpOuNmU7ySx>Hv$W(ZBp% zUnJ6**3ms)Eso{O+uN;{*rX=meP6}73%t)2{>hC(+n<`?U1?2W262$Q@uCg_m%)lt zYPS65`)%Dij}7>gHV-e?Eu|=cvps8W(o`a)odtzq>-3-ok%>sqo*rTf`7dK3uG7#| ze+uada=B|Q$2Cxl9CHfT7Py~RnnH`D3|b%dmNBYw{TmKBy`wm$BQeOOjZ) zkR>gp0zwITgPik^+WNda+wb>&WE_T7!PV_&mnx!?C(_gy2*G?NH;yiORylcXR$isl zaJ-IuhKn7~yik;U##aM6Mee52``c2{#Ls&oXbw%082?Pwt-c&)yFmg6`aL0wO)VU*Jtp*khh-#xfYYb1jQhmEg(9`YcP)C9sYu1jrU)Isx~cjj!oe9=!oxZ{;C+LAld11mp9 zEcu$9%Jq0t9i3Ret1iomiDwUCLH7GqA-c*ij@91F0`Wx7SM^hBL7?kLm~IPh*$L{M zx(1(t=bQ+eBdI5DR-?oH+j7GzeHN&Ko!1(Sv*ucrnRLP$6N8xq&I0r83fj*QjK}59 z%yHF~p-#6KOuwg(v9#O8`Xb;ug+MSdkJS9qRP7`jsq?Qke3x-~%5?1aH-+_(#2+~4jrML8HMi~_+EjC48my{JHab#RzP=+i_+=&Uwp({A1SV|EoEJNPR&N+arwY4$H(PGSgI?f-Jo9_7 zzQx}fU?gYyDOaD_LFeoX1tHw!7kt&=>q?R2UbYEjq?gau>zF{k$@H7(o9D`IiwT59 z*X6r;m<4K;i`$RsH*$bhGNxV)!bO)83E7>KjquxL*7&_I4ldR)&^B%8Cfq1-FSgce z3jQ1dSBHUo!^00~G%2%gBa09|PFeYE+e@%7pYVQv^5kE2>B8>%$hwAD=&zW4(H^m}flYG$Ezw*+s~ z0<AXD;{uY#nxE9cr>nEQv!&S?rkH8o z=si0bRH}c8aVgxYE4n5EHijR~5V@aKJtVqzF(&oqZ0!9^<>$u5Z}k*(8mNrghAzGk zJxO{BIpzVW4`sI@E|mY_6hL3X#*|etI&)~Ox=l$vIj;#`QPiY~X3isN06_^MkLsr+vdF*EGX>{n#$=-)kA; z$umb4x~qCm%F)*Us@WHCVhnU{q}x+#3c7lm%0`Tz(($l~y;A@K_y7P}7 z+ZLX}T0+7+Mv@hCy%zrCCih+Ylg5fECe<#2w)y@$1y;J5D=*k1=~wxYVwsUD_Wu+( zlkzZeJ8^{6v^~yeDqG-Oe{3GB*U4S??kV(N@s^*Xl1@<$`p$uzsg3eGr<{$%mSgHV zX6>`#8i+x*B3bFZY%Pt%46<@#-$-##o?pw-HZ{sfsYKy3K^XBdAzfQMId;E~dbm|b z%n83nzsT?w`kp|{R8+YLdiQyL2@2jovhbDPWsH;vOI+lb7pk>iOTfGkk?HgXpHHvV z-vqd|BZ0g`+Mi>htX_j&PRk-&Dx-4sPFkT`_1XlvpM;Zqy^S-=O9?U|o|sua6KWhA z$zX|ck)A9(^nUUF*w~MMc(Xa7FB#=n7h3K}b{ zx2nrXXV55Jb5mM5R0Q56kq637N5aGU))bb;NkEq-Re6R5lbt+wJcXVb?jnfE*L^B> z9=G<7J>Q;yx)b%Dx6{H)B3phgZky1hn7mb|GxM2gF!0-2zZvL0qw*dTjd?B7)Z%$^ z$i^s5tUV1|N|?K~{5K0TsYjni|J4vYU~uF(=ac1ke5`aRJ>^H`GjRh>U`cg$p^abO zk&aZZRv^iYS3-X)ImN0~uux*}_>QMqtSiMmi`@iAlD)l%jSvbavkfb0F9+V_s-;Z4 zk|dDDZBlU=dw;XUhav8Ry=E8_V057l+?M`MGb*|zG%fo8X7%P$)m_`$C^vI&z9IH4 z5C6yFNR4-<770{It_eK7SzjjPa6w!(N|pj!Kj8lG2Q9$5Vj}JNWVvuux?UO?S^}o^ zxFu&$jI=*dRC|vSasKkTd&%zsBJ^vj??@wxG~~JkCm=*Th83qshcuMIIw|O zhY)~%Wa7mCcJmdO^U>9HT$~$ezlr`vXYi}p_gayg8YS=AAZ(8Ii`(x>g?wRl+9ZGY1_JITCbo3}$qZ8FymApJYv;>17T@ixscMOyI?V$kWKx3$p3u zu9_m_>DvB_&3oPs<|DNk!2NS5S{T9S6Em2d2d(XZmE6Ky?vD*b01R1;9Dsh=f`#IO z*?3Rq&(4HBbN!QXsh<6+p%-D{BJrGTiBl6?mv|%v5~C!qQDRAap%29Tg=gjTl9j_E zz}QS43T!R6xyHX)%VcM`1fU;NuJ_0b>L${;yTNxk;>=j9J*@3F42P?X>?o;Z6mQX= zBj|*F1TW~W7){>vaYo+5B4M-#qf0AxwmVOCDR2e6&nD zTW-@cea0X2ncL7*=!iIj&TI>U`qKb*P6o+$-<0w)vQkNx^IJX-nsVUcb=>dirYg*E}=CwQ=&Ti*M%z0d0&Tp z=7cF|Jb*nH+d9h-nQL`xZjEpkYG7{nK5+q|(Yq!vU(_Qx(Igip1+g4rqZd?or=Sh4 zolJhNQX^zQlgjctl`ljX+T`wV8n%1>wHJLE407 zKg%%()%fw_vILFVQ3N5XLY&J{Yj1CGJc6CA?>vW`_Nf_t=lBN~=Y=V@0}m#S-KVwa zeEB_)GG{%p<7+GL+f*|PulQ6@x7D!?1I;S)u6g!V8=Ooi!J8EAIirEQ1PACV=3DGZ zZlA_RM;_Xrv6FPUQY9OWxRa#J!#d+1NhQIK{<<^Ax|y~f zqOA%Fd7vyc5=e5V%ladCD#4A@&82BYiDc1!Na>hb75g}sSaCL;`eRScDXr?}Ee!4l z7U*-GgC`U58pGuE(K;;fmWrP!*b}6O5U>;vI{0BF-c9v4$L9NT@TZTqL(2I!^*TY2 zV+!qHpfUjS!*n({cN6U8A-MdU1QSEW}(n`UVF{)5&_+K6f(jmFMa*l}wPH z6re3JQ42_#NMPG51H2ryX}WyM9Ev6DTWjdA8OLdTGLK?hX0rj}LCT!&o0I$CVWkA2 zX+51m8NCQ`WTamOZQg9tiI6F4`~6K`UwOWi{^8LMN(y;sT{OG_qvWS{vkE2_VrFr&L(y^W}Y%?|P+xyH5C!LG;86c9Ig3zds6Z!8G~ex79R;4tYJv zGdB_Nd}Uf2E~Sq1J?D9`rpoU+QWT{knCMWQ=0Iz3g5Ko3FuY>h5YV%*%1P|DOOlcc z1uDq@f(@SUz`m#tay&W((;x@hXsmqnE7x+9ZWEzZsHxU#I+>1q(`TuIOS3BhXrp>^ z=VFe5lLCAvZ7vBKsn!Dw6B#dx<2~T?<1_uH)+qvDPw<@$YI0_0-b<;-PKp+JOq7L^ z~gaHaoa$(=^zUM$gMg25;o6q*3anA~Ez$ zA){4OIv;oB+A;d6HYXxX&gzoXk`P8~a-!w$IN~_vJLiruQvQ~nD#Y?XDWBjUiS@il zAqHdzvU6$9IhraT-3fU)pj;u}B=J3vX`3}fEE=aKOldgz7b*T30pwY44}0^cmogSI zW*Pj@ZR>RPbvh8xd++uyHNcY3Ylm64q0_UQmsMkd2J1tjFbUyFAkqh7E@97O7II!% zVTPOuWJ`cU3Wp~Tjsw$V7qe7zEQ<=zsTT8`KdV<%8&{@ADQ-{hMpnoIx6fmD2^`T? z8p1wH07FtEqr26jeePmQ5k3fq_rsf7R-Vn}@tr7<@3-aSS|7c+XWc2`&RF z$ru5?nRM3jXyo+dFKea8_P$JpS%`V&7Asm+FL;pmYkf5rpU6IIUd``KUK21=MkLJE z4s!lPo?${rfY#l&-0vKdGKV~DA`@6|0k>#$c_(+-nUWjVOU^6nT2FbNR}L@B6FI^UnkKM{AW2wD<%ie;wZ7}k8w#p&1kd`2E-k>Vn6({gcH2< zqP4R$eUdCv#}}h#LlVn9(Wn1dD&P4Yr>@~-7{Hg4vDcTZwxfEM&teQ{hX{kNd_ke*udL> zlN^CsF=qwdwDj;SCd#wIejSi`4zfuNaWYc-0wh@Xel&)jF(pAIYV6S31bYQia*xT` z(PH^(r880R#u84w@?ukC%jNE4*96WX%xHQ9iKX7BUb8bvU2OC#NN@n`Vx}VJ+r6Z8 zcvj5r`$!E@-n}>ZrDIn1`SPx6ia_l^crH>~fG|Iqk6TBhwlC5rXHDzk6H+&K#8za)H^LF*XipY>A9A5L3mrk5;ZSP=jeu$IuX7CuWfE1$QLgHamI z0T3+FPE{NCvu7Ey91}YB?@3!Kq9=#CK(M`)Aj;JFDJ--qH{~Udf;D)*1p7I$B&RLU zgoSZ%eZH(KxREx7hY3Eu${;t4m2(DH;^GGvPS0b4N)P$L@$NVj3lYUVC^J#OG?a1j z`hpkR2Lvy?==#HD@U0wiT>Me2Y@9^t)^TZBw5yabQilgOh40 zOHip)6<1A}GnNAGYe&_B-sMRsX{@CfWN!8G%6z4fDRI@fH1(UB8OL`o*S{1Z=Ufgf z4vXWzTu62Yz4|W!_Da@=fmX#;vroQQN68Vc$$g{F2dKf&gFrvWO|DKu^C1=cMNRft zb0U*qY-XG+-%Wi}Uf;aYHr7NrnF)A4@2WAOSG02-z4ZFm{UeKOL!3`h3AP?zQLzo* zR;G%!f1U)?r#fOuaKV{k;?|!DH6h8qqs_IRP6ddyeu5L2 zHf`{ay2=EAFT{kWnmFAD1@dyyXxEymBCsgv4qGZwI4O5$UQKO{%%`Qs9jl2|`%VB# zK()VUk>3($Kpi!%PV-%kj9-y=?p5?I9eN9bIE|-(c1J-m6@=zICUc_^>}A&6{{sC0)W_;R+Vn zEzbd|leQ9lfCQnO=j$!_`Vtxrey`VE0?4N(b{VEopZ7Rm(5)ak@7F>NcP2BvP!}a1%*kspcY%#+--^uTarjkoVbb=WaO5E=-BBxRm*qLy^NTc^TpVU=?4zSL&ItZBdE z!PcB|$6=mWvjmnWCk{~4mE6Vcx~^+Zv*pvd)M=A6*odv1hhF`kJpE;26Wut+s&X5x zxodn{{AVjynAa$1O3}Pm>sNI<-M<~Wq)Ntu`6#b5PG=WUNb_y?+4Inc4XA_WVv3;v zSY2#f`14~k5%6G>=bql=wcOuhVZZTB_KWOCA$SX@xjcK`ls)uuIi=Gyo|1sLlFn`{ znopeyhFEH89zmY&dMw!Y9r&I0bDmSQ6k%Dk4|>>cz7% z4El5*Q~o%< zd&Ye%0mP=vBY~@6hnvp5r+u70Oypdkj=6h2rk~H@CM@r~> z#t-GG+#7cEtb>!tqu4IU;Ev2jjukih*C{Z zd&~7$h>r&GQ1tVg2*hmNeo7+xwFWL9wL6&?Ft6<1*Btm%b;|TS3Og63Bm+ft?i+U=buAkW+Kc1Ia*dD}t z%Z}ElKC*JNq>+$dGvG+Ynd*11g?CPu=AE3Xs4UtE+x0;aa5_0-8z1>)2}w)B&Q2sI zw=w^X)bm^BBngvwA{?BF-<}Ir4EeAtpTEz{UvNdnw{d(C08G+1fv+}(Oa@aG?&SD$ zu=0=t2_OEAl$Db~Es+Ge1)KyXw70C_wQ&yB<7>Kp{+5D|t9l4pr3Y>}@I_Q?scqT$ z!~$KcK(g`O2!5=iT)mG(&K#2`0Y>?CP3{`$k(9X#7fU5Wdyf9a{sgLxo?Cd^8Cmtm zYF3oLG<1U1!?*Po9O*|;rHIn`yXHjY`v&0|9hhmi+|8od<9DDNFA;7~%%1F3(az36TNK^7x(6r6H5fXlC?#&b0jJT; zXl*M`+yDkIB1L0ERq`$Nyhz^0dlLLgTjk3Ox$`yd#_8vKNW?K#2Siu)56fx2Cy2fK z0!PW|pps&er56K?;5{DHD=(pz!dX*O zZzYdtIRJ+$m%CkRB)8;Fax?i})(wN?2ux14 zFDL7558}R!$;EpPzCYia-em%^g_OMQkMNN@N&DUaI#4o5Rp&i;;5QgDG$8EN4PSG< z_ux|2lV>G}YohZ#6O7$UQ>sm;4Ts>|86(A!x)SXZvy!n*HjYbA)W*s!*si7xm(naa z;5IkR-9Zv(*L2rl=w9xbSoabr07Jff5_4R~;9Bo~G+To?ET)$M^;_Z~wphRlrq5$1 z)mG@Dj7v0LHO=;Z!*-){tx86-;N=TZWMY+>lcGwWWy+ONV2$MzOU4PKNC(L-d1iM) zlm|o9SPnd=K=8xqYwM;jPzCb6E|RJj*a+s;Yt6O39zG1!_rrezpaSAZ4^fpSZTVKC z=SWDrNb=kXT)QHSkl0zA z>IJ9ebJ={OYrSa6ocS*^4Wn+K;QTEur4Fzz@f}5)KqBb*1i{F%-!z zrhB04og#$pyJ;kLNATp%f#snJhv!zlu`_jcTekpTFkR>EnHM-ZA+gUIRwMD1{EcNb|uFYIMMKE zXyXO9(6?jwk;-W21+vnQv5ZSca0gxz36$+~u*ZzY!OmQ=ZV5&Sbp%yr^#l- zBW#{Q(6>N*Q_ux$1eGWJ1;OSV2L(4KZ8J0M=fLsJzc4{cg-YUT$wN5F+1cUBYe_wu zd$b~sjK{=kGsz$)NS0IEJ`j-4=BbYzM6#LWE=PqX_6%!&L_gUC>PB9RiKboM&F)_w z^t4OkG!$%39j3c<76<)z1}gWhiEt|01wQ!Iio>%a-i&iw*j$n67 zuWM|WJ%n6_!8x6cB)P;O7c{YTGciN4DOGF_?%{3zJ!H6M8*Ps!BmtBM&1O!GbOjqO zc{`60?ziT>UsFzOAKP7DH2HKQT9w*xO}tQG(HJjR>6zRY*pl)hmyj6lU5jBYTCUk`v0=9y$ShcB$8g-3VL|@5EuV8~E8+J6a8LqrlIcrb zRoso>92x|)0c`iK>^f-GicE%_7dRV*@9a4gKO^)$*;)bM}D)D_H2xtGAIg)rW%y={y0Zjb@5gkv^dxEAs%XdC`_s@6RbkTcDE8fco{ z9!u?M2u*%*3N7+lZ&AH2sw09l#W&_Sfxy)GH;zxqh9-4(9Civ6B4E$MSr@{CqzhWA zNAiGXvN}nbF45IiHq|Es(%j<|Rk<5WpnZ~;?S{h=t8qsj zV#-wH+D4Lq!5VjM0_q^K9QJ1(|JS4Pd2vF5Y`3I5vWn30qbLJJVS!)K{KtXPRZ%cd2N5nfB&a9o$Pg z9ckw6$pUPF$PSKIY~*~IFY>CPgPY{0r@(+0LE7Cv`rZx z5(GFs`>}pct~$S@JpIAsD52W+4N>X16gFooGwI8vN z)OvqZn=%}GFb5yI7b<*Ol&MBuEE!GVhb;Gc;$Wp7n^McJCW+rv#q`XkB2~ZaKBt<$ zRythxmn@`GXXoL5sF3PVT75EQ4#!gEOxyofn@J|B_c7?5nk0Kf*YiO$$Ja>dngdvy ze00l$ovxdx+n^2K`1Rz$=y*IDc`K#fJr&p>agwsdrd$eN{({9{_>}*FFnO2x<)1A< z!jRmCAGe*uW8zS!fSrD>U%SCd| zk|9_ociZ{7A)dm%*Ib5}_H^UIPlV3yK&=D4ZL_s{q88*enP<|=#I_>~LrRz%6k*4t zs}w`QhQVzKD)y$@)d*lG;4pZx&~XJT@ay_mYvoa1rE+PgxF^Y%x2K*;LfF_i3*~49 zim-Qs-z|%+KCmnZMBq3fe@+DwO503tXJ3%rG0DJJ;xb6$Ne@C?%T_h zDbcLV8(1eSxq>ehWb|C_$*CO3;aaTuP=Zq#Bxy3syBT=2{MUs{2>lF;N%}Z}1sl1n zqZi+9VqrdVND|08(GD$#gpuUb^9oiY9{c<#6j<$#)wt=k(VxGV4{6sZ_kdjNsrzaC zlAD`6hnMDi>uAxdXb5GTuJSSyyc3y6Dx$nG4X*raA&=wMr?7f2CT~aviBo6dc~P<3 zhRS6_IL~Y_q}?fU&O|4ICQXe99}h+@Z)(!~iOJ;fyG!{J1>3S&4o5PDaUB>eiJRqK16Ei3>SWMG8zu}P~m6ELlH&EJ-R!zSzN1MD)NfIXK zKTsqo~}xav%+kOI;LnMSF@l?~B{JT$c%Uj#aK7=Rw0WOV*5& zCX!fIl}MZK8^equ57=nl_rs`PGEODS%JvK{p2?LR%#{N^Q|J?p%EcjXbC+k_CT}Df z%$h?Wa?*0Z`&J&(iK}OADK6YRj(ivEj^vu2^C3?q3u|#$Dvmca226u|pU9A;o>YEF@-bf%)Aw+aAY)ja;6} zDp}%rR*p!P$#qQ3<61;Zpd)gkwltY)are^9J_0lom=}uM`7C{J6F%U(Ri?aoue03yQ2SERGp7yeCs2QWaBcog zN^(*(x+4ekzm7|mjI{FgqUVRX*kDZtb-l+2G5et3&c*GVLL|fZQ0cDps6qkvBTK%bQbSAabwv^}GEH z8AidG8rqC7I4X&WkAWV;MaHTK>GVR46mdmK67Tg?;uMys;O2AX z&<3vNwk4;IBCkw%SULoQ#|gD^3o0pBa(%6$AGPn8Ct~?B7$GpNMB3*iPnY6qP*$L0 zo?&vRNb;Ieu&BuYq<&k!TCiOka%L*r0ECwMzj{BxBl%%{Nt6xh-w?j;a!8!q>FrJh zf_FfEJYb5pQJ%V0!>dTho9DUeU>Y$e+~c&R4qTYt+mpz1O!>7kru%3srtqYpyAXyA ze4&VarEYn;0xi%o*C4O+45G&#N}lnWPO2KLKLUl9LwJ*I1C5u0ED699F*2He-HAH?@q$;x#cHVDXc0=@I27*#+gVdcoO^%x8omhC-1dxe{x zUY8@-a&G;%O+yuTOiewXQuX0tyV8tM%ue}CiTM3-9q0uIBHJNwGE>rb{-G=D^fTWM z*!{4F6XQqz(wPfo-88v61@*ZyAWSViuA0{J4hjlsq=0Pfywp^8_pUP#MSsUcC+C0N zlkR1%j}E?g%XwVh4@5QSK76tqIGh(;eV(UD86HTau*`C`GmP9E?660XyTW zZHIdkyz(ysZ!yL;v~g=W4+AqfZv;PYu6dr$$9XwxLGa6+SaZM7~`ck=gYyq-7G_uc|!W;e5pSNU-v zv=9&oR^q$0&hXK@@8)D9r%C@U=rUo1jg%fwvZ{IM!=G!i1oF1Z5lINT7IsQsmMERp z9q!jVvm<|K;$IvWso=`mdu{=iuwCW+>DCY9i*r!#J=n@G>p{VgTSf9%>fX-n%dw+^SfDtjS?Has5j)?UiY9Qb>y+IpHEGH-`oSH&BlTL)sgd>XN^gZ zXAzia`CzYwczPN}fmd!0U!XybZzUR#%$*N0l^}IsP_e;LX2t^CJxDQmgRf2wx!mnM z9@PZ7d6t#vS$B1b$Hwz$psrh4v@nDAwsBL+f!i-8o=?&5b7(nTq|{H^q?W|E$J)-7 z+Qh&(IgGFZ513)8-GcG@@!Dv+r%9X5&fI2gjqF}CnEQy1KICvydrxzX19Q%D_`TS~ zAfv$Td$5G}mBk!+`EBHlVn7(o=XRe@$pn?u{+ySLQfoD3D9vY@Ts&G=Do3yDmtvPa zP>$EEGk=?rQxrh@v9iLvE{8wIHxXNNZM{i+v%8w@c_ml&aVBu_+CKSG9o&+%I36ks z91m&aBrvW>Xm9?rvE`yhTrjCP3u!V_I|kNL7cY4d!!pI;kmWxHVjTJ1gBD$Dd6LC1 zYk@2Wqdp{TB@)Pzc zbBh3ACgZ8)zEWJ9YnLgXI@QiQa*s# z_n?rp8P82bRuTTsbt==?T!t&KsC>9_ID;JzIA=Lbr#C7rwxpyaf(yKp)c`4t@B=I9o#5V!b zNr}zD;x1c6;>l~$l*62d7!^sCI|(kfUF7&vr&|2(yx&&i^GOA4iJ0KjN!{(Ey?fC8F@IeTqI`)HR16nG z*}4(6>xhXz;ZNsXlzWv$(L7#OK?L-s)B?H1?(1iOa+e5W4(C=v!&~C&hx(LYl!`mC zE#HViIbVAgv5mIAY0!O=cn~<>?MY=>0a{!Tm`NT5#M@OSkZ1>)M&u2nOzvxzH2u1JzzAWE*}++X4ArL@?LQ-jEAMT0vuLWDw9 z7mxjL-oxca(E2rMs_QH2{%ffPF-m1OFCk}dzY0kL~+@+FWnI^CX?uygKAe)};!SMo-R>J)Q% z+UJQenYR=q{uS^{%I$0k2;k5rCB#SoHh;jvH6nRx(~CC7p^n&-Ml96Yrp;Gz8qY`b zc;m=?AQ~rX?NCkdZocnVYvTtW?tJQQ}NR;gi9lUdqvys zqD1hXfh+p? z<`RYu8H90mGq3r(?r|TO5zKyGhPRFB^c_F#ZhfAB>1Kr0^XnG&2nc35 z4IF+`wUvRKl$6igQFKd}_e&}x_cz9VmH(9{gk5g}U&Gf!7&=aL>lxcQIa5QVBqli_ z2YntE9QsPi8bR6TT`a(KRsb5$+mfK^lH?NsN1-o2>5{)9&_GrypxZ+sbwyu;@ za|iHFw3B8Ys;`HR+O#Fp2VVki_-{6fY^rU9%*SCuW^X0ABfw%gN==nt`H8-n>r&0V z)Ex5~+@x2LsARsD!r>&5&A4k$*tFz&USj4Eh+*~#%vsO7Q}Qi6wWp_$IC`48+C(wo zIm$35mC}Orz1X5nmLQ&*Fl;?GQRsZheOylx0^!GNvYb&B_FckLiF2Kt86mpH`z&{j zhU`F$4`j>(HDT;u3Gm)zY(7e7_An-<(rXT19`$GUGTG#uY73U~C*OkS!FZCQe5a z>zYqgIY^?N#o;9rxV%+Oa}?g5JQ>o(Puets>EoP~CR##qZtIp)}aB|7p*-7-7 z{fQ}GO6FD*x&YwsI%!cIh`A|N@)=Vi?S>ZP5`1jxVm+mPwE37cnVQfLO6b?TT7T9u zmricN_Qk~O;OrUPG@)K6W*9mz9Ox5eo}f~l`~0itN59R{qe?xGxkM9fr9Y3(f)>Zi zXKt4u2VY7>Di7;^q>gVR@!H%arlM$X@bxB8HYrspcYmvwP=T zRdK-z>K#l79OOi-+JOta4mi$J%2b_G9Fb&NTjl5F#j?u{qR0QBlw$`sDZ$=nzRezV z^gNI9W@4ipAoc9b$j`ct3ul529c6e5Nf;@~$~{i*3DVbJW~EL#L6tIuie7#qZRX~zeLSm>FT(sJt4H&vQiK8*ZL zgKq10VqTu?&TM_q?911GVYB4Blm;7E_gy`eb*r|*wkzY3TJsl@NxOac6t7oM!^$f> zf&KN_g7AWu)e1d7AMGcRKDo~@AmIQNV;fNVHPFRsfsL=|j+A1dAVu9tnC@r+N*pS; z4idI9n$EkQm{+p4&)d524+k{NTUI-fbkedCfvSR4rEyR=psrI&MT0L@a?-c#iB|Y? z%s#6>WuR^swo^CEZ6k+5)hGq=*j^r?CrMW#o?HQJr|IwB3M%5dd(Xw&_42r7=6H}Q zNxU_^4)Raryz4BOgA8S>8`CJK@KMgWbWEc+M15 zWUqA9!pzC}xM`%~dUBrMk+(6Z1>*xIz)!gH90U~@36eD`#TZzUWZM|{&JtaI`!Xjy zwnB8%I@O|MA32XZMfbeXfjauqQEhu3!mi=@7K=Rje%8Or2b65{&{UCKOM$|@{Y-ig zw0Yk@3yXY(d~UYksEq-e{(tJ=psxK2{8gDeNReyLOZNwdCebDv=QCsK;psIe+55AhV z-hqhu20J@3fNRpHSW_*|^g5FV_uTDUhvBt2UTb9&rQN`X@Non9NnG=FwO_x+{WfH{vZrTdzQnsfflhf;b+>^|s{B?9K+ zZ&W3gT=pPP9vQjkWW%4wDr52ObD2?~lh24;@X`HtDga4?Ig0Z}sGX!c7H*2~ZY49f zjJkK8c-b7iWvyVlo8)1oi`kx7Fu|o`^99VkjLfL$P&sN=fOAXqJw%|(ZU^3Av30h7 z>2%6=EPuOZ1rGarmB)}C?7Vi4wG_GbYHQw>Hx!=*PuIyJt(Ut zAseP_f)1hdfSDlqjjo(|QSsPw-BJqdD`C`>wU3>`hB@-~wVoQ4;lal+|1bq=ukEol zPjj&{js#l_9Ps zUa$@(s-e(9lXM#Y5t^FMyI{j?e^Z&H`;;i#l>n1sYMYJg%8~laAH?$8XqD#ar0lJj zowAfn+#t@9%Y(SZK=8C(zwijw2AXCIe?+OB(R}V<(sGoe?N^R23Rv)!9y|wuH=!^P zQUyedE4eC2=_W)D(XGULsYxJ!qsZYKpYs(chD)5%nx{1Jmoxu4pFQ~XGYrdL&m|wE zs-HWhfH`4m8>_ZSa5bk~fXpBwLidT%+o3`_53SZu>pj7BXKl7HUrfnSJUc*OVtiVO&hR>OAFqeoTs(mRc(a7cVofHNgJX zYrQnF*5uilV#GW({k6v3?tJsGo0;_8_wq%Q5j21Y{_tg>*vpaoOJ&J1Zt1-2#-ep0 z0bZ1zE#a%K9v1GiNsoD5?s3q~?PAh=k<@z%$M3b7j)}@L;ZOy>pR(vJTLS%%uhi@| z$`iT6-%GSGXO@uX%i?^&|9U9;OgE3U_HhZyeNPpQLZfq@%op(UZnZwd_<}mAiA&;1;#e-)?M18!NM^WJ z`7a!d3C-icIwk0rTdB*C8}=HFUfi;hd&ZAAmPoac-i6?oT*gFp+Tdu9JRFl+URLmU z*Maq9`}x`GR^MN@eeso4JrB`NGxlX4n7XK1h#y)@?qN=IkQ8e>lZq)pmkT`(X^Oc- zsQfLRdz`vX`X3pe5qVxK--%-qn)^KVgIdUM5yk$-b9TP5<)XntbjkG}Grv=M|D<2+ z?onf8JE8$^_kdfcTgpCVLfAc0Q74opLgvIwDFzOk5-d2AqH{mnx+X?X=sJjH>+F(A z=DC+W1+eWHZEzgEN9fs#C9$D7l|}S?{%oll``o>^+z4 zq&9Y>R!h`bEBmc<#CBsDt)O5}rxAsxZM_f|o}YR#`Hd@f9OA}f z@wmxrxtOo+er_%alYR0hZH0IJh1uAd2SAG}g$~HiEhhP2&p8$(>3t zJ!tlF&APP*kvxJWN@DULW3{kP8$H*VM-4FwA*QDQBkpkXTxGL!O zOje5dR9D8KD{5LkemnY#RJ4wZ~*4Da!)1PKi+oRHW0V+v?^sj;#^X-w~>`!?}l%EU|^e+{=h~!Ah^y zt&dtiUNtG={AekCf0+TK60%Hfo=yd1Itb9Ea?SlI(YxhF*V-0}KdD9%%o3R>Z{?jn zNkg}b5tyf$ee5faGP&Gt9<33*5Ynn8=atb&e>bWwMYqNfK3T~G6a|aqHrjW;xh~Px zwCzeUCH2q?S#Uqz$r^Cs$m2baD;4aU(4Yq^uIu{b^(3<11hdM|XwR|G2rPd}O=c3< zjd=%I!6b;*mB>%civuCeDg)N}by>3`y>U^fVcWBQrQub#U7ISfCOEjQ%aT%crnQ@M z&B7oEI7f}?xD#jpn*e%^O233P%O?!2Qeh`oT4`5Nrg-P+OKJH))#{1Y?SVf1!+ht# z!ITxot_sF(+q@4f6y8(Mk>_rMSi(~x-xCER z+!cE{Uc`mumgJB1VJ`j=teRM&U-r!o{>S+%c04;znhP<;w(52Vc~kBS?jOW~hy3bx(I^zJ?A67lKB+=BB2BQuTckX|iO7 zoc&$1Op`JwBHt-5qaJx!anN^;9 z$^)XYW9cS37dyC1Lv5Xi^XD!vWe&MD(q7YD#-l0Ccj~VEbcob!b~|nF;^?N}u{b;( zj6za(%~L>Bxk|ohJvl4iv>90OaMZL!eosA^{Mqc16`LC-1-O z(ovoQDRB$Fxh2=Rc5CAJjN}%WHq~?K1mzR|1_^kTqTJ7c`zp9b#A-*}L_P`hos;YL z{IYqZILk5Pe~2ogKQXESoJ!@gqQeS)0ZDj^V@KV910qan(S!8LbloB&WxG5N?X_lQ z?&3g^FP1uyo>9uFBt2>wdGv+>7eZ0$(Zo!aq502)ep1f=vMo)3Zl~3zKvZ~V*)JLb zl=YI?o^jDkN<_~?JIA$=c5)M#Ts$8KlAO&a6=l-);Ea?n9n>wn-Pg-#;#1wA1t9fb zrSQcFG&xQd59XO`r8C)!bEJN)@HD+SIyn}d1pidr5 zPn{B+@x7&=m@+;U$$nL5CB>{ydXMda^j9?(iDc_GIlI;y0)|g3+nvCB8&|g-o{TbC z_|YKxYCl5PXe!(CDTyes(Y5#pB6Yq8JBK5xcAY`m!^^XrKR+Hq8^Jr06Zz#iDm;}& zZE}%yn$A0~f&gWZ&26zVwauf z7;PVP`0RxTiL|_anK)5Yr(anc*!JF*Vj4YrVrcV|gJ6h9GbJEt=1O3>B$4DZp;1#N z;RL%;P)Vkp*gxC}ymm%6CVT;M{o$g!ptz-m#4$}xO8FEwc*~8!v%y-e zS}Ss2;K^m=uo*O^+}&7`B^c$k<~bb7U#r-Qv6y{0BqN-)r0&Dk7O|kzNzTHg{+)xh zt`dpcxN8TE4fML3wP>o7?MTjmKUGqlzJHKy{`jjY8$=nDl7rgL#N++(;`W)x?Uwi& zB)iqhULISn47&Al*#loo7h+RKXznlNxXe0cQNE`7%~So#;;^K)=vePoOH%G9+V-GG zl6x8~H1sg+Su@kqy-L%`h?Z&N%7c1Nq1NxbE}jH-c2&Syr5_QoB9a6>+lENa3o?Az z3z+5D-N)BK?|k{jKFuo$CJ$_Xu)$LR57s=%?g_xi;Db$VB6IHa_l?uw=f!ba#>XdN zHL=}OG~bVITN1%qb|$vb$C^Y!yg9`nUCl#~PCQ6Hnr!v!wQ5qdJr{>vcq+gk9ce=| zddG|kUiMFK(4PVGor{S^NX zU9VNw{`OqR-A>g=!g;x< zXGwLkmo4JbEGs1Pr(}DqLk51FM$b$X6LChl=#`Uv3Z`JzBM*b@r=NvN!zt9B){z4K z-C3IH0CfG}lsKlldtSpa2f*_kJ@cpKyqzfVdBF>`yKXg#_4CAv0M&r5jYdyEHsj?z z*_;Ma;3KDcHj1~tv_9yf5p)p&ndd`qo0iUn{xE;nNmj3axjjjY%kyi^Znp2PJc8u~ zNvac{?3=V`>0zVv9Q4Aucc`%~ZYG2YB8dou+_*Ib7zRHR$JBVgaveq3GVMig;~Z*{6BH4nGX7o30|vy zW|E(AWD;Y_IJ?yM+iQVwX#)i>VMr@8e}zvVZM@kk>!|LTJ>R5UDPW-$Si!W(8zfI)G*;|)H zg2t9UpS$Ib=PqfKaW&fs*c;YqGJpWX!yx#EhR#gv#BvvD z+c)*$YMmBvduTonuDF9a%$7HE^4NK>?`9?ki3IeM&PI2T(8T&tc6}Ko{I~bGG;9?S=t3X*b|C$P3e(Kvx6D&d3MxhzY zDDuEXb1;d?O19IySmetgUrx0xqSsLkwvX9$LI7~8bO;pBWxP=ZR{HEM$zwVw&=Q*| z9>+xQ;6pIl^IEUH_3bsGnex)hQ?eG=64{fCxF5e32{;73sP%cqR&8-O%Re=h!#+%6 zjc>p8dI=CeXyyTr0BPd+Go6aeBZp=bu+=qZdopMVnw8uM?c9(LV*e?j zI-@Adk>j$9mkP}hI;b3R>3)_}tis?lc-wNiugTy~_coORb2;K!uL&RnVx#0#t2cEJ zH5=>o9lI*HD0PL2+D@k#>4bC0Fu!hgVb`a;)W{t&C50VRf$1ff+o4%o&)E1KAbM2$ z^O{STZEUu4vCI}uPzjtEk%7k>pBEpP>mX4n?l?E=^M?%5Wv$>rXg_LEDgmH%c$-*7 zby=>Ywt1L+Cqbu-ZC~L+8UMC7J#g-!p{h%Z8Ty{nB%6}k!qB@cKY#pslnv=Ft^BH95|uqM^S(To)GY~6Ij+5!RzVlsUz5BO#BsA0ubMXr&gk(eYDZN@wKs(h zP38BcfJ;w(vez|#x%fdTE8b?n>$mfE(1`vT{7Il-dH*7q`ULjqbjp9N{MFE0s*WYzqagD^a$ zwP1ejfMzw0E@>lGQ%Z=`jP{po&d#$#t$PeFc4d?`1BpUqYD)c1q;I0Qsm$`8(VwmS z8TGuT#g@7Qp{kl%STPW|`I^-!ql^hrH4lAIC40ckfT%WEYQ#HS`WsNWcl@`!T*xZ1 z^9go;E&Od%h^Fi14n!^~kb%1f0mo&<9D1KA7jq?Ow=ZR#dnUcEN}gG@aiP_a$I2Bb zRmGgtp-GTCpQ7dr+`m^^=`9s#K*^TKyq7kH@!+);Cu?I{>3g$ZpWT4 z1XSX}JU?C&Et3>4xx-1eH!Bm}60Vx0P8J2>lPH4elUkQcZ<6_CI=}@ovC7gDU9rVX z0kJQa&%V#&l8~FqZ?pe3v)fD^r;Yxa$lAkp91}c#i}{J>$vt~YGF4?W@hKE&?frha zRh!ez=y~lYhi9Kg+E1;264`t6N_#2_q*pvFE*J^qZP|)y+t}aHfk}!@86OnYewzUz zQ=&wwzn7(9OY&eQbKfef-6qg$ayi{26|xOv8F1i!J%LiSuS|FrMLDm@MqaK5i^@E$ zHMt(d$^B1(IdQy9TFA%B83}A>SSnNAd}4-0`<&~8&f}RP#iN{OCa()LWs~Q%NXo|R zv)shnJwGOe4jY8L-p+(BZ`@62fz3P;pVwOty5droCwhzr8JQW2e@&1~XzDz5KCSU2 zk~^<*Uy%L@Z_>VLHeBwqf&A#jmP{~@fnbS~Vno8+*1Mr-hg|NQuEe`#A9kTntJ*ve^9Nrev}Ch|r|e6YVs}%G z=#z_AuGu!H^Fyz`^m%i%FP(KVHdYdJAs!~2xtY09xu`ZMYxAm)i&Uw&=4X)9%Vg&NGA~#e= zVPsv6pJH3CV+Wn+eqh|xkBw|(;et!(t?){ zHTOcOyFW7F~y zN#yyccP=bAWjgOESEnZ2Q=o53&!CycFySOhmd`>HWw&XaoRgAYKlxjU1U+UIE7c4< z%xRe|9V6?pOAAgTLUVnTHv@z&X`{BylY>((2MC$+e3Ifw2v5NXpniG+$z${S2GAI< zvs9;tv6pd9fOs;&W}c3JNb-YZF%~bag_-&1!oVs877LJ;{C{vU$$vAi`-)D(E^udb zmvXOb6a-9a`ZAs;3Vwe%&s`7ZfOclWVFX?ilF!ttsr6}4q@E=Mmx#5S@Gm@dRuWkH z^v+mPVd`w_u9JDqab0Yu?gH_bI&I-tQi1c){Wx;y+Q<+1cq6h-Wlh9*X28gHFvnG# z(*T(}KTY)Dq8pj>NG zIIT%5mtxkgokv@Sh&GW7U z1J9&=1LvY#22H+mWltmix`Y#1;B`mCx18`+cQp_pPj3m%Y{3>gf<={G(B+&62*4$g z2kxh+n>Y$R`TIGoi5@9FIK`Bs35#mVvsN<`GpG6piM_$#$!mo64oq14yaCI4=tNqR zhcO|{LRs?6Cq=pY4EDhflCg8$bN|}$966?WtytIW?+g^DW7_+@f1E5HW8Y&{`OX>+ zdwGw2H>+yq@j!>}mNt`^g)4gQm==NEI0%T9rX&vnbI<>T0?@V632wCD5WE$2QU z*0Cy>KRjK+23*$i-Cu>*K62)yn}uugASDsAupi@KMCQvD*^A1n% zg|nKaF&?XvH6NYU0fQ#@o%u3Xp8p#BiTIU5gxl=Qe1u<1={M&b1ei?-B-peEv-z9e zcDEEZIvklOUfW~mZZfpsyljlKENV5&UG%Y8wvsm>Ka@jRl2(+Qdg@A?5u^ z)L*Llxs;>_%HrCI#|?DBnNNCZ*AznYo)IiPZDL0bJ_CSj5L^R%?hiA(-S&UD(Yz&@r zKB*z+GAxz}Ox_M0(WKpk3<`($4M&ZQD$h<%kxIi%=@O9mjs%-40pz|DYbT4}Ir~*j z?Mw|4ym1?kkAd)-7_+l|;TxFa^YU?c@P`JjJD-yqkH0P;5?sDp3gVMoGOJALEd!x$ z4}M9Mr5BX*nR9isSlDx+_<5gPG<=04aGs%1|bLsqzJ_ph1POEn=pl7D6 zvfJ3O(3mTBsu^(e1Jq5%T6JPB^rd9SoLvGX$DyVD-Q~M`mV{Bk>=HlFL-fNNm#w^P z8>GA-62iOY>6Nl1&oIIDJoUEr{A}wK)ClZ5;(i4&7C6Fs_oFJH{~+hrnS3?$QGC~ zNFdN_>a3I!i?(H|0=&}(e}2>WvLXv&N7a1wYJ;jM+>aUYI>q3nOGttAHxOaca!saAu-J+hwoNeSre%5U?ic>;vsfv_=smIE!WaoNA$or5oO0VfC z?darm%H|8NTApiIx>lXZPTO!f8v_6ZKmNSyLGXPmYroZz3m;~ozr_3DuUZ_f1sJjye zk|XzHO7J_Ug79jnJj|KKSn}RPXd_Qd$oPChW}HNa+7^^Dsp^6(llsmY^viwm~ z<3&Zohr!`hUd3czRtva6*Ap0k4q#k$&|cOy6A`@>OV%mZyxn}H zltmi&liW?3``(ZJJ0Cr*P3Jb@1`9ngBf<2!t>$;a{$?^8`#HdLHhn?dCvEy!)99Eu zYjSnViw@!^BlO4go2d~30EG~z^77}x6u%M_UBI4<54nq(`YW9^qa^m5; z{>Yliu}KU#)!WM&Qu=@Lhu2)nm40xx$Hg zoezBeC_77AvuKRxx;?e|GfH%kMBj|NwwVhsCepW^Eo)DuJiG_qoe7fDjxYNqH3VPe z(UR8GoiZ4rC-$4F>oIk%0pUR7d_JTP7SaK4Oza*F7fZ{b_i_L8=O73G=oyR!6rXT^t?=ei{_@cWc z`8$N4pR(>q%sj}nC62(9+|7IJH4)s$Qb^asfJn5D3)df5$|1fB*uP2(J?=4tO! zzJlj#1?I4adXe=*@U#fLa4qB5VcH!aY(F*6>ATF`QfE_b4Zs`>@Bcy*-cPX8#}?)_ zp&gIz`(fwoFdkw7pK$S!iw*wNPT#@krHp^)y!}*a9A839~8Y4^^=o;+hACbzF^puDdP-Z^HY8*PJ6HSPKu<=m*d{e$) zD`Q5XJor6#trxOQHL)GS>`ZR@rTTItP4A69wy;fRD47q}k*NYZF@7I1B^?Q>Uc|tu z9~ds3Qg=>LyHjyY7@kl}O0(drK+y$Z_bc?ro-E0wA9~KgY?Ee4Dw{o5DRo7F9{aw; zfQRG6s}V_yX`y1eF}p0XVNhDW)N4dv=EeL3+h>Joa~F_5tyl&-omA^`&T@iNAa{1M zj=P7Xb!)(Xu1`whL2efTx z6fbYVresJ@c}S1@RO5$~GAB_RI{#08s;ILjHRb&;C&hhh^2~g5cu*3So?~#7BJ=Pr zQn-%9AC@mQ5=p*6@vNobyo951rS2$!DUbLxU8PHx!i``@%IsS^xbGZst@iN!Y3M}( z#apRj&-rt+Nuc>oN|2*Wzcd>x47XgQsgNh?Wv%O+Q>u)ie{bLUV~mz^%Cgg!5X}fa zUm~z|3f|kOb-&oOCnd6cM?6>l8G{p3U>~c^{Kgce7zA%I$CEvFAD_A$bKT&U#8r$V=$=Uf;IM5v^xEefDi>!X=6-{ae(&JNF8xevU^Sy%z@{b-*;ha zC4dVdJCSXj27SgWxQy#rvQD1)muIoU3qjt`d!=+7NfXHi$9~(;Oi{Oxhs;k2P#F(B zi2SYGSu@Vm-nR*DenpPFq4uYoV0J@&jm?n>Ryl{~c<3M9a#Uh4H_UU^nI<{k&tFZs za>fge9t`vnHq9g66eA#T9=%@4XZtkmhdG78*tk(NX| zyk_ETo&5im3`Qp`LH0sHRu6}bTE3J9lf?3opKa-ZW@aKOfRZKy;8v}snawqOMIFMCa<~}4i6g9(o|y)E zu5BNQ1ynf#v)Pha3aWa0A_4GiG=og|wiMSZwYZnSXyYEed?=&K;z}bqz~;D<_uF@s4JPoNc(kow+exPFba;}k zm;9xL(8;s*T29#1(U#V?1SP${%b-42Hm_{Yak4(PTFW5~r!cmwnG=aw3+ASD_KuIIr8lN@|{R+uzW;CbJyk+5;;Q& zg88~t zHxJW$DFoWU%;cK$&y2RZ2OD!zK>7lzeK=(kOW!3q^UrOxSWm%!pPd zOGofkw@9@d!A+@C`dl(O{C<{PfM>q=)dGqsRuYN?Tpaw5i!FVg6sK?*F79lv@L+4D znKA_El>B?U)iMu0)?u7IU&QNj`2|W;rOn$X`Wpm=Afs3x@ZngH%$ff@R95p($4*80yA#Zlise_??1FG5GT9)8Ty@3*|XjdgjB z?HA#k#%=29yZ~9}w7?abpee*}a3_%On9bB0otmOuJT!=p{M<977auwNk zx4=*DJs~COJdb=U$_HdvhGX`mj+yqRz3S9XrGZarh4&T-v<*~BQCe~f2`+YGhSkCZ zut7QfN#V5EthmTj)SmU+48RiogN@CbUvA|eJ)x7X_r}g;IjVr9io)u`s(OIMk)M(0 z^Rf3q|H`M$Ee$}QXxIXQYYvNtb0+0<4qgOx?>yUFoutZl-D-P`oRpuEC^%arT`5VX;AogKNUM8W3c#!))D9ELjJ86nBAkxvx-L&~d)2jM2&lbsp2)%cA_rD!`8@N-QzKMZCGGztEd)oRcod7oW2aG?4 z;z}bWh%g_)s4*q(nCY-nW3~3Xmm%Pku+8vi=5kF5cTFr}u+7Cfpz^^?&#k35M!u4K z8`O-H86?0oC70z%m7iR~Gl|v^C*rd2o=CgoF|ci5y*?c!dcs+Gtf?AGujy3TtOzqN z&e_(>;p={=ilj>EtW(+B*sy+#&;^j`@PWDeo%UvCG~qnCC9(O))1iNEE%VE-QK#NT z>fDih*TiN5SgBL?$p#wun(AAtHnrDxkrJG&D50qZwc1I%KeFU<_iVNPIf4f|mGnLD zgy>gOXYt-Uw|}cbQbEKRIQwdot$|&J_h?BZZjQvMl`C*7KkGFg5fvjZEE$2`c5-O0 zwLKQ3n*GEKMw?*rls@HlUdIzecUK6_v(T$|uB%oGMWH*yF)=sjQO+=D$SA*TA?OD#X) zbhq7iok3vY#bBA4^NwxyT4b0w&?m63J%^h}%g0NFae50lV||elC$R>@@;MJ4Ai-a2 zAiCb-P<`*EHrFYzCmC2pnkcB=b6MdT5St`WuzBrb2O{Ydq+)K$>UNmjT^y75vDJ?1 zns5IGBjKWnx${PME+-~e@hmOSKG7`B^T=m-atdzO&F~GkXEqf$$xG&2l)mG#GW;a| z8LTxJR?T_r2{?H=RSFFno4HI|d3vOhK|(z8JIbAyzVl3>z2*Wr790%DZ%te#`!p-d z6KMj)+N?$|?V^%!rYpKT3y)dM!-+Fh5c2PmH%)pXk1bE03JY88nX=@A}oI?4H-7{E+;ZWDX$T-{px-w?q$^d|T%zs>ZVGV{-X_Yw|eg57`?%ep0n?9qCV6(h6Qp2X6o4>}n{!PR=QZRki zG(IEGM4H60AhYEw>xo>S97!7qM=hA)76+AGUpYCGNTHBg4RwBihlQl%n4Y+LTMl8q zu)9HAMRIP4Uy=pN`M6BpcD-MPkqCG-CSM znLwo@<=UXKy{z_pSDJ)aUG1Pf$7nEjoU*AI&dnh)|1^j9W`Dar$$0D=W^A`S>Hg(; zkoB`{Hz9=wnk-cNuiM14luc8Skwz@wR$DWAg*p4=&59V6>~mOqP7<=xnq!h2epN>X z8ls`esm!pby;jGTK#~_dhK*U^XbOWj|6`dlS9MslDIb(m4{X`z^BB_vCCikrWsf34 z4GJT7etcerZMFmeYVJ>Y3=n3!k!FKJ39{yrxrsVtL39W8JWb{^p~ya+!d>s#b|n1+ z%!|}f`acLN_B|OyZ!YCckl?*&$>(r@D^n5+Ss4!Idu@h|eCZjnxuY&580L8f#Sl_7 z8{dY}MM}lv-g?UZB#=bb#w>0lPr=s2BH0$?NCQ1}!_B5*d$yWQ9l#vtinmdK>ofQI z#P0juP0~}Wq_{3Z&nmE$K8I9=B1X)^}Wme_&g6P$iuGdD7#kjq^i$spv! z*n=n1Oz`mo*0_KLzc0D@+-ypWH)R@y*|Yi!7on7=wdFPz4LThQ&HrBiM>Swe$SfD} zfXw{zJj5eeJf|%PCAE#^y_1395`4gb=HBy1Qb#9arm`T}dl^xj!NWvMyo5x;oY!{# zbYHijUofikgHc1GA`l>uK*3sZEH^GuC*R{j7viW%G%BU=bJC;8aeWgQdJ>+^>%cPf zf#;y6V-ZUi$!gUI@J&f&ADH$0XP8uut+i!+4c??db`Ro(CM15VT>T!bKJqvM{g~Ya zPo}!cZ{MCLNUK{L>4|gvF;9XhbVE}l<{@nQGDW<|1FTO`7Tg~?B92S`SVhOqPWQ#n zrT|Dua4SaxtKy8xZ+gI}j`$9#)DyiDB+P_~p62c>tFao{iloi6CB3Fx;rNy!OUz1L zx>DxA$)nh4J5?UZb;%W<>p14d=BUx%WqxI9Vd~96hJ)FO-Ij8fAj?KT7Pm0*)&A@G zQ?Ci#LLAEl?#a;FcjS(m&^Rp}+r9EfcGFz>vL zb4(ANlJXdO?Tb&mcMrPCXOLpD>|x1P2W7K(b}hHHyW|pU)OBQcPc^{r>8%Lle5I1eZQsd`HzLx%jhO(4CzU~h#AJqvKuS>WMEOiAFJbAPGh4KL zo%7=IYm&L?s6S+Z=UOaqbEismPEyvv$LsV2C3Nj65q z1d^5oS|+er`I6uyjrD0|AN1LyZknfw^+!s$6ZHN|VdZpWiGar;O8sC+oIx z0MX`WoW{o{#ZFPN4~}sYF4j?!x%mORjC7(nGrvOmCkeg1SO9Q_QR}(QIB-di0f2Ti z_jf7uq8Gm;o^R}K^Hipp?TIZVTA7Wg_+jXgY?E+W4B)3kEo`U4z=|pUD$q_SLidLf1&!5(=Y{Z23;nI=7gqjOlpE^KVwunSprc@1Q{tQ@+(mp zt+13HH0RKK>Xh!QzFMc}7Em~-KBPkV_)z9~{-!Jmqs`E{2lRjBu4sY<lwRW&&Dh*x$m|aPfcea{XRrOnKXk=`JbfEjml2# z*7hBW$a%x< zJj78wCaR~Y5}wku+fwkIrt2RolBFC~UaGozVRs_wOb+5>r#=UGY-8VQY`xOb88_W> zO~}Ags@Mk--oXKmq#tAA&qF${a^SWp_8z~58~V4l7Lo&5q%7356V~nXm4X?~n}k&2 z!%rE^oJ(g&l4>b`sDG(?DCGuB+8oF$SiV}0`tAS}CWautdTYx!Ocn(-Kk_cJ-@u>_ z=1Dg2>jGEvqc4i%1FbbrbgIpO&S`5(S;+e}->VOWk5+8%+fsv={z7SqmuSh4(RQ%X z+^t)l8kebu@&yxBZdf_LH+d${IrSjttjqUbZVl_#K!{$^oN9Yxi2=A3;*>$#c^-=! z*G3Nh&ZR=J{$UH{)A0btB?~geGes6mOn3vM6KVLTCZ1DJ!fGEnD#vycYVG zowRnAh|{f8UBBa)P_l4(tf=72HSOaZL$*Z?^jqx5&<&f{K#hJav=@BN)0P&p&q1}U z5wO4~EK#}F$~M5s(Sj;hqFmobiqnbnWU8-0TiyqrksB*eb~20gJX$7o4*;&qt&{}z0G5K&T#E|jeN!mWt?W5rse1KlZ@#uE zP*qr|3=%jIie`>eH?r0^^FwM;uWHI*+p(37OirQtEw6z*pY^17(#BzrXY%a~np35G zNd}^=YR&v%NX@Rmz#^OgP|fns5IOB9pv}^Zz_7af8Phd*2BGfh<=iL~3G) z#Cq?D!U@+w5oFa%o}8BKaT%q&U;Z?Ur$@KxK5;bzMw7)Dboa~mC25x+!d3m{1Mtz< zv|_1=>#+^2OoH6GirUjjtUTiKWE%3u8c4BFe9mJflvr+jx)xM1_mA#7&9q&2i)WH8 zbg&SGd;|{Unvo9-0NhMgZ_Mx+D|<>+YU3by8CUFNYj8DsxKw|pW6}g-tkA)ZXRqy! zywLn=$(mL84P*urEc83fl9OImqmRqzQy2AkQy3(sr3CwGT63cJr@)f_YSi|D|hoO47= zC?yvnf9tKQ=A^GqJLR?tKAi|iF6d5Wj7|e`$*LLGv0!q&2^J8>e=%(A z7zlLJjO1TU*Y`Q;&84a*@`*kg=-4eP61@<5Zd}%UW?QKVcdfR~ABNf-Dc_VcmL(IR z4yVPAZZncUQ;_7pCcy?BLWtV_2_*T0&w4Wm(z9W@OX;3^^qwz%5un~!9jau4WnLSo z8yl)bfFKjSl&!=M^3@%N1NYu|0Kx3(L!D^?GoGU8s$;g zTAY9vTBgE;7o;%&nqHDe+( z$nqP#ea!smr0RoNy&qI3(9Y(hPUkIIIe2CXa9eBiFkh*Clg~G*`J=U)u_8*#LB2@+ z@}X7bj4L^aR0LDuJmy6`7>|q%&RX5#M`hG(Ia9N64*1XcO5JehP^I43HSGebvH9~T z@Lm%pK}JK0Ym~aPERq^_qF0#5)Zaky)mWX58DGRyuqpXc3awb9wP#pf7$wq91TQaj z%Ex@hQR=W4iK&f@Q&Le-XFic~AebviXvyWb0h@DS3n$k;Id6HiQ`$ih@Y3f_Om1Bv znn=LNW48*E`!02z-*Or-=d(O=#KhcA4}pKoRYCc&ZZXkV9t(ow?5nS9is|d8tTnB3 z3TvX2WHZ;=C(&IFK0Xqew=-A94p)0}K9jx|y}CiGTJ>0B7&{=G+b1-oe8+ws&sp4C zwx$zoXbn)MrME?wW6d#tRZ-i4s9Lr+(AB#$yG-cJrwUek^66R$+w7Cz9Aw*k*xaut zPvjx;H2BLfH%{28I^y7!cv#J|7#@vV`%WW=K>~lNIPAzy0!F}vs zQX%enfOBfs3|G_v^4s#hnksC1`V%){S(sbO#WI$^r^>^@4pw7jReBEA8j-5_^MOICT?g| z2c7J={=CfQ#IL-h&DXkdm(HC|D)F?yi2?baN!nPu*rdQS(a>jOt)cxP_XnJm5aAC(6_YJ|@!Fi^!)! zx)tvN1uSXh4(2p2{5QGTJ?-4DCuf?&Xl`_cl?})DyWSKr#9GCzR53}*^NNgz$h|F} zDg9-WLPQ(nN7+NZMxU#3XkJaN>)fk5lDrpahO@{tDaUPSq>U-{My_chMKavSfGZF? z$AK#~4#EBaAE_Q$>226^EXSt=9ah26cn(!A2+!6)aOAc%$ovtDj6!#i~$jhm{)|0#)>RrRpP9m|Ta`Tm8C-*Hk z>7v|_pb+6ar-g5;4bh5@D|N}nD2oQknHa39+llnk?`uIV>MJSSs;*+ZHy%UUv@^vNN=lI!(^!vM0}PbeKMCNr}@Z zkd;`NVl6On>%jyMf<)rbM^}=dZ*B49#RVK(>{IfRahT3Nz2#PnD81^V-mTQUa>GvK zw>M`Vn~j>sPc2_f+)_5!rpkx6=@}$?zT}P6&pg$qM3&U5w$?dxGy_+kbT7l;fo-gw z&9Mm_yz;qnlHPJKMAi;+dKlzsPv|F+u5ApsQyUe>Em2H$HV7ANrjv<+N&QLZ)?kwN zY)~!14~Z%p=*d!Pr84^R?YS^cQnRF%)ttO**NRc$b?RvgeRi{(9LRuo%gA3~AQMh41{%3E#ePPiNp)-&I$@q=u?bYdZQ7q)Va zq2%3D+`&6CD!lSA&ie@BDUX1>u6%%kMv3eTMV6aixjoOvEG)(Al zzhxapX7_ov0pu?+5TahGbn=Bo$DpB3wv#G$KF76O3&t~{61+GhX2R=&f?h$n_SQ&T{CqWM$!9 zTi8N7Z-|7z_2gxeJa!$akps|pI`om?oQw9#Y^lqsC?C?II+IpYD*xo+K>qwtF>TM2 zSPcdB+VzPR-JD&AzKA3}=nD&vtI^Dr9D{Q@EiJRE#W2bH)gWdIQWaa?85A?ysBC!r zOXrnEbC3oxX~taL)K4a8IO|urMQ#(9B>;tT$-v0D!PjO2YDXV_D9eJJL6XGDu-EEp z+c!Fw)Y7R-vFa0U(5uSb;B%SC^0eFsV+2ZR%Z*@uZDPwpwdS(_n*dq64qv_&BUP4d zb4g6vKryV{(o;#e=fCC!rfMTQ;D6q(RrS!moC!$iGU1QX{Dn5eYV@^u6~w%(LvWvWHaHK z%htW5it9F9X69@`DtumY)1S^0F(Hh5M&NH57V9tM^-(opK^@ov#OsUa8d>nBXERS& zH+tp8XJNIMxSL<%IJ1SJ#r70;48V?sl4i+QuSfdM45!lA9P^L%mM_9P_I0)602{5-=w zg*@0%uFN@mK|FL^lz6$RRzbL_-x?BaKNMWS*}>{F1acWzPMpSVoh7K`CG?Vb+%DLH zOUW0s8=#Prn=3eI(j|zGhJi9z+WrJ`_F{W3#8q>`W(5C{$bvjcgCNCu;wGyhI~xz3 z+?&URE+h^4Yc|Yf%c1u-F5C6H{#5lm@@+cuqtd2a#P|;{jGzOrjEIAU za2Axy$KD#weNn1mX(gF;+fLV&5Fhj(gsn%5vIpDbB`tXpl9iqK02R`=A1kpMi6lwh zmI8Av#$rjOMAcdVULbqJR4K)X>cU^nrVUv-RBfTgL{|}U51(m9I!)wA<+yG=*>y4g zRecg_df2k^1z*g;4}|6QN4f0RVs|P90$F-f(9|U?Ft}ce+xg+S_(y7k?V0MQ6Lv(N zO%SP88C`&dhEGRYqAHf!BOo>qc2^fXx*jPWYLk1B(~Kq8l@frDz!6nL^kp%d=$(gX z<%}o;W!&k7Btt{mhCE$B3o?A44N&mEMk3yZtXO&b&R*@x^N*alqY4F>+^z9s0O z-dNPu>o~r;5jpgVgk}->4w$10em-SbL9FNzGIJ-B*iwg_$4Z;-6u1uCA$uOti6oSZ ze5-&0bSd_xiaqCVYMR*=-L72vmK(CCNNuZGMe<>a)!Lgv<-@&{VUrC7(B>M`26S{P19{fx4|k96T!6ABX?Es6&YdciX}GwXs+IVq)x z9h}Cy9wggWOrSMsVC0ojv#~)0L3061)Jr@i!I}JyR!J`SIvas)Ymx!~kmulCJBFoO zzM)$n2`%}JcGPb0t*P{J$!PNHdJLNyTltCKfaAkO4ZF1k;iRs>Cs9Xq_TKDw5+JCd zlPtwrzfo0gCS{h4&TqPVib))FYdaq)EFuxhBu1ZCDpNfIE=mbH*j_D{Pmq{OYiV6_ z04cRy2~)Ym#ZDO2cT5Vp9id!&Mw86L$iMFFV}_l!k&nMO!q*+sDHqVVGihTv(SvPI z7D2z0!c#2dtngE&X*w?(EypcocRoPR8)WWo5>l$2sR~P~zSUSX`JV4zeq^^7jzzU5 zmux|EYvUGv&9#|-2c%GcOzoA2o=+C25L9|_Zxwhc(56&6CPfkD$DaJT=QkdMPuT{M zmK^A6fnq9s$H(;LDfoV_>Z&^c($PO=Dir(UJm#Sfx0D5VR4@c-?GDRZjY zlh!X)7usDdMSsd@>?>k)i!GOTR2Q(@H9wG0j#9sExw3OA$fUH3Tx$MyE>P}GP!Pm% zQ_N}- zxs@I?L7qOLk|PQE`157;>Pf`Az~HyKjwwVEitik}oZ06^XiMdTBc3uzXU}LL_+?q= zd*SA>oyRz}cY=nJi4*6~gq$bA9&aU?joa`lM_9uoK`$w$jO*3SnlIkjIUsrXc0hx; zzRMC#3eIya4RA8zgOW%He4p%r=QO~>JNMXiPsuMhmYQ9D z>N0T#?MeO3_)jG@f^?7N{EBd{9rl^@&-$M^X5}okmV)!TAi?4gr1rj24c*i96*qli z97=^i5^2PJ*isYjcv1qbA5-#Cntq!_^RZE+G$@}F-vSq=ZU5+6*aOVvoirY%yhzJN zy8&eKcPaa`lIU7vLm!Q~;Dz1W^3;q9uCjEsc%RfsO}iz61tIZy)0TdHgqMrJOY6zH zQ_$Zk;u>~6YiVRZNq;$KN4Z%g{;-BS?1}C^1g>ZgrY0y7Hor$iV_BtEE#G-eN&n?=b9 z9+>BZNgp4PBp3F=a~h}8DzPVIm>UHZG6AE$VWmm0ewtb z7NtoTNs^O+_-=fh_hk{}EPmp9);_}5mgVDs$O(dUuFau|;4*EVgqRckbj&t(YBPWe z^^@kACxNSu*-7_C*GQNeb{HPLOy1)4u{nk9_PFo?V2A3pTW}4l%nkGXbNWB zfp%BG`N?@Em`$Z>xS3nax8c?O$W3WP{Tpj6mT;2#UaQ^&Ddr>!$Tp|{qwxN*k-0jh zqCEOMnWXazgni0_FO?yY&(s@_dp9tF_0eCw`arPcu<7LoX-7SoG{qpr-tl>6^@dH|>i&>tNpmh|(o{t$o*~6fx?S(&-=xorD>L&BJ}2ks~+DX9YFcG+mkkD*SV;A~Ib`oS0Qn0pVYiLM%mCZqAXamiF+=ON6X^&~GIg>M4Kn6% ze40CZ-jtg-AB6T&#pDb1lx0kf6M<46zCB6)n6>GSl%KKU=#)ehNDc&?p4 ztHG`Gc&Ui&8&MS$+p`wl1Nc(LzqrcRUGnWggDGLFZ=vy5Ab60Ux+vjt$N+t;@;tjf z;*o1Fgpo|i3xwg;iBM`FSVBo7&xfqFvnu3X$ZhK zmoitq@0v%<_nFun6v_|j>iOb4OFvS`i5bl-4=~N=3C0|?u$J=!3$laJraqZ2p4`b` z4wO^+TKk70^w=6_7HlW*GtCN8yl2Jkf?Xm&-&k8Fo0OOWxjE}4`{@4;byDV#k4SPhdpn6WOzO7sFGmo1a{|{I{!+Q8nKtK= z&xwrpk)QIB1`U?~*v_h=Ssy5MS0ua?z-UQGaS3Dz`!7-Jk1?6`ysy#}n_<>kNf9%y z1j##k7b%5ust0k#+pa#DkMnyTc1V-Afksmm7U5jA3 zqb6?b?Ao>~rse|iZ@zbOWDYUFQ68|0f`go164Vh4#yFG}H^b;;_|$AGL%g7uJiObb zP8rVUfy-}zd5&8ZURYoc`15V4WrD8>PmB_JH)2m32xfF6Y~8lX=1j@21OW#@~!1A2mVE{Bz9o&QtbI9z^wQ_2MKem9|e9-mnYw4*BqIFD<14MJ-^K#i6BzGpZ zu8=0Bni`vTcIMVCrC4W=dnVr^1_jdBH+*O{-Ix@0+T(*Jgv zH6?dz%{RJHH!pAR2!L*ANQI!^!KpGKCwPw5q&iaC)~db()-Q=JWnbdoJee0TvwS-i zoEi=>qZ~@|2j4+MEg2|3AZecWT}rbzaVL)i&4+gHieSmIHbE>{y4qbl5;zx~RV!~~ zTyuL#L`oVPX8?vJ$5KY6``8GOtVSdZxPwiurQ-4Z{bDqb zdQg`mXF{gje~Ki$ZBs+4{e$<(z$LqIBjU2qQwEJZPX2TAo`(=1N|T!BPpz;l@&aqg z)RM`UquZubmie4C09e-C4^hmGTcf>(93-qTM$TIaXUz|7kB-fZiXTTA6ib)t1X#BaZ_8_=E{AmWr0a| zX|3(C)JZk1In6hh+&*0RwN|nSy=?djdZ15D8uFSNWugsR>Z0yLx+}QVkj`3OjfY+- zAh)N}oeI|Ow*0OfH`9wR(B@1MI;M##pR=GCOCrv{nJMcgew}wfDlMd>I)n$!te44M z0OodZkGm<2%uFTb%Ob&jUibdy9kY3t>hn;xK(xGz{8M^?49D`awKCq8FU$>k!}8K= z$~7x*6o{rJ$KS@*B=hFPZmQEgfi>l%jj@+%*11(zFz?RPKE*G|0%}JUYQu&GXulkk8>LMG@wE@XmS^ik!^4R5A^f=IkPTqY>S9jp z#bWH#Bdv9p*CH8|-L3DM`}1NuR;sDu!qF4DgB^3JkXL6i-keF-eUgS}%AGq>^n5cq zx|gY@LeHL>QOJFP2n3si5R07Ob_cbHB#6gU!R90B)mI;s8}rC6!=>%Y*{QO2DS9zQ zrNb5h4G4moM5i|svoG~Nyx6~lWqY&NnNvW*dF_OlsN#KQmW#`j&&|-E^LBPuOxJZj1Ge+jc*Z z5|VhRFt1<*#f@b$BTUcUbv-rNvU7&M?OZK^J@*8E z4(bk^(J#)q___o@zOSrY^79T8iH51!s`Jr5Tf|fcSpWP)Q5tPs72adNDewNay_RT9 zx+|rZ{_j`ploh4xwoY*Y>3O!8^7bYatb#Mu#le1P9~WmXX02^lKgBP&xq76eN?n@B zw79rWwY!4-^E%g>Vm^Vk_G^~}6Er$Tp0(dR?8v@>^fuA?Ugiz%e4K;C z*Of0?id2p~6D{N%+DXhWq5X%diz@SGp77R?5Hozwefy60D;}K13;F?j%U$J_94I%F-}~yT;r)E3+Uz#VF-cDDTy5&sDwzEpyhyA&m~ow_Nu|0g$b}FeP#mmwh*drU zHGhOq#>4^m`2eh4lk`&k-I%9AgwK~ZNrY!@&+`*!Y$Z{?j-{-Rl>~dfHoj+KbX;1Y`%Rngw6wdt!Fu`YlbxjfCPuNUXU*b?Md!SY$sjh*aJ zy;-McVT6^Ce3-|`DD>5}I+!9)e2?=&m$B#5dLe8%T=*koh1=#P_{}J>fQ$ z*#e`7ZXq?_!oKxVGrohFBen7AcO&MUnT!3gRGLJeG>@HQ4=+bJ|9;kXe-fnx2KKbP zd}gRIhvv4JzJ4?~f@GKc@Bzh+%@Z2*ic@=9pjf^yCBuG@FnSGG4e1EI zCtx<4$qf*9gx^kQTy#vPq(QS$z{nl@05@S`1Uv`tB|#_uPK(u(D;iJe?_}ZZa6z;Uw9-8~%QqS}PwT7kW!s!7A66UCW1Vus{wj!fx4expNov z(WzY2{`RnMl&3&QIh9iCn^t`{yqqLJ@=d1h3kLCS&7=2{h|JLsT9~I>Y)$Y@T-;a9 z#4WefW+wyek`GIYA-R?~M% zC7R+XFg+)ofAM`kH4T!JkAn^!%1&U=neso;%xV=mUTvz6Y_chml}c>bV5_9wR9|E$ z?_gA2+-?Uy_bdg)WAmULSVQ9}^%=TMR3=@@t=tNFZT7wnS!%C5MGcA^j4s0FuRi%X zji%HB{(RrJTNlhZ?l}X!6s@_5=2?=j%k`pS;aWfI5l|THvf^9b(|R&VKSnOe9Pn3O zr3axylCj%(RXmF>{g$i7EHCkpr7b6@MXUeLbD_$~XODHumDd!Mn@A)jPBa#G4ZjsX zF5i*W31tTo&LhC7h;J!xi#D66Rq8ZcFWO9Ca~30m@sqs|13q?D8eU8{Xn+O@0TP&N;!UAG!n69<;nHoJY>LdkwAj2QtclEJz;B+>rRi}dYTU3C{n&3!%6-V5&BfvvOqThErds&XZ(Gh2y640YmF{^S zUQXZ1257cm*m|>nGU1S++oi3zD0X$iD3}^P}XFmmd7NGD!zvF=%pbTk^$g%Wk}#!|6tY zfFqt39E&AOCCr!zcHfjviGULw&9BL6wmy*>IT<0D9%Q*r^V>wrV=oKeeD7P|Ht>N5 zkP`pfYPaT@s*hR0sg&dLgRUpFk*(7JKS030e&r7)TdDV}E?PKc=KQUR6A#9^iS9fK z>enU$o#<9W!qkr|vow0*7j45}*EM%-G2Tonxj#iG#OBjww{D*;b2a0~Q$PThc z2czAY29F{==}>26=vi!d;IApO;Zf?HpbS^hudgJJB$b>rSCy(K)YSQu0o$R^Ls+7pu&jlucH z`pnDTf)?_3s8+4W1Y8X+`*}G9hs{S3ZSa2Ca`>o}*YX9et@Xm!xEb)B`7*DF$Ihq959y)vn(}) z$h#Gv0BN+#mpR_U^rt#695LsU4DJhIk#AxllQ4iCrV^l!5X6^yFNZzw_P4Z@8=uq~ z$d%H`Dlm_!jh;j@**rlFC9Iv_ZwEgw-Yv}?Hsrn_G%Vgp)z(|z0Y&A)pnM5jDhCPv98Q5d!#uzHqMq2%dVSC7g)82Wow!LUuR(@s!dKm=qD|Ir=0YZ$G+ZLtaZv=OQIRmZvSCa5!xze9K5ha# z)n#GVOvE(NRTG@QIvLHg7Vuw!QD^FdGhwL_zh}Z^$NnlMvX^#7jt*-EjMSv}0D%;| z98v7-sgaZaO|d&3De0!vdDN;)zr&5d`^oQL8z*!=3O9FwyXAxDbtHmZDTtVL0QJ-e zPy05{ZW2DGJJ zr#N{hgQSBV*gg0nBer7qc--^%1`y_ZT&3&+2b?g=z( zd*YegArKD6*!h~N!T5?%;hW#blu;p-Kl&Um+juPZPgA)hAo4?A!*O$lJ(>5;`!8e4 z7qT;>!2OgaqElm#g+0aI0;+kOt#SbUOp-di#L@|*EQ%wCm@g@7cojb-V@06B$Lz~Nl! zZ{$-3AMb&LUnQgWT+&&~7`Hy$oOj~Yz4g)DE_Ae$b zZ!7sQmU$*sNea0DzRymK)P8(o)x;d)xvi%Z5NJs1F$b2W*JF;z)qPE|94aHh@` zGj+fjB!$j~R`mfeD$kzNfT=*q;#!ju%Q_eL`ZZn&Hb60B;FeD@@6-}=cH#Y;pKUpa zm|;PmirFtu0aXSEX-?&Ee5q@9hNsl}0{EYxffNFwQ*f|Ek&mzje6pIyj^|X?YE){i zx3-HD6wfE&0ADI6^fF6aD3qxApZ7GWyN%KaKja8?yACWK*8rVF4efj4-SZgL!AlXM zn{yN{Og>}oM|~(!Iae$J-rijW=u(Ujd_LO$`KkP3E(>znxQC9?G`;K5f@juF7JzNd z%4_e_F;Y)-9kL(lBge53@ZL>r1oKavw(Xj7N62M+d7kz=xMN^_+8!Q&A)|}CINf}M zOnmM@r7M{CtyTM!@xk*ge_q=nciJ9Pz(8Q|#0>mqPK@lPe>Pbi4Oshj3QCIkWhSYZ zfGAWYDWV{}C8)Ot%iVPSN&e@9F53QLbMDfGj`sB0kxXRD3t4G<3|=**UMd4pb09Ao`;l^bqFiF(E^pt|l<@}?#u zN{=6r`ZnP|clcra8_1BbwB)NLHW;T&Q!3}6L#FZ+2e|1bQCHJ@MLm;&$}?b;Q)r4Q!~VnYKKDR`x_)-mgxyNpc~6wfab*XGF+b19 z&UEuOW~+}~$@{gkw;tLB=dITISn(yF^9u7^H%86|SY#p@woJc*ZW{Dj&*z2*9?mp8 ze@&TNs*cl24$_o$boq~SOtBx|WBBBW5mZ)A^>2G~!#WG~#Oj#^^K8YfS&q3OFN&?| zgp?PhObErQJf@>9B9pggM&kxiRkIU zm2ji02j(W+nMb73N)dgiRkV?IQyuy+$(yyznEP>;0sCP&|9eP(CZ+{*erWnO*@7Io zb$$&)Hnm8ym@dV&5%*1@o*0~{iXvF{*L%Y&c!!cRw|!ajkyDAZz;=?m_C-{M!_Io? zzOujWhekcNVgUa1O;B-?eLhuA0^WH5>xl`NyGXv(wy8G9jtq%$kS{on4M!kfx~JMB z?4HC+$iW(LU+}cC`X44{sUw#4&I4(Mn$AuqR?Oocou7wtl9%0>C~QFS|Fi3x8$uerB(je z#xG+#Qvgi^k9^&&8{%;yQ$94woQ2dKw-xC{ilqPcQ{F}ZQZOz*3u*N6Jk8?WO~pF$ z%uG{fOJwJI>DbbM-uGv>Vx7aeQV2_Rnr!eLXubJloPCm0E)-T`o6bTXB~O)~$@A~A zQa!`d&DQ=v9!@ejas~5uT5Y=oa?E>PNI)rV$Gq=@vMU|DPRZYroJBUPvN=~Ki77^2 zt%e};k-XTJvb-jG=0#k_c3XncC8>Ar?s=Yb*_I?;u9XDD8F{T(|-F8foK)4eko%vHOwV{_SzXAv2;O_J05C5yNP9j&x* zC_c>BxhV^4rL(;&sZHN0=j}r;!Vud?w&oP>%#{-4mWNsoLRRuE4u?r_J9K$U({fLa zV|6}RO-pEdPUZ8jA@{pqjl`FYH|vp!WVzjS948c-R1wML2jgswneAQ~*Ip^7asd)Y zj+Yn;IcB7gq^aP;_JEba37l3Q3npu7>Ok4Gmyyb4`BJrgQus?Dnp(&>%T9;^mucR< z$Px3Ri)K0YWNN2L*+0@Nd8-rsc<(SVvlhu76q(tp;LCtYH=8>*^>)+v3{06QYaht} zsh(0SkcD`XbJ?uDd2RugbQ<1+mef}I3)}|G=$ZE<9QkFG^Swbhx3{Pkk|SJ zeBE8>-AQ%4J}!h?-Z31b*5Xpakw-v6w@p2^YY?|=QgPBjN-36WN%-$v^xJ0LZA!s+ z8Psn9>PeQ#1X9U!*%y5RUS6f`O^GF8Xrktygke@_qB1P}C{n=0_N){?A_ zzrL$0SKaUV3l`zU+&dryxM6ucr*EDTU}BDyM}DK{Na&hA0eXpaHapfUu_AwXp@-QM zMew16>r?LL`6g0-{hLmbJGhSvn*6cf<=>THO(cf)y}Y@fCE;93MMX*btoaAPlUe8! zk>1a^5lMDV(H0nDg%`0pC3x^Lt>DYxAX#&jW!_wzd_4+I7Ts7#H+ze3w|LP4;g`Vv zUd`mD^*XeBQ*_KVFn%|`f_qQiSrAli5TRL$GcM{)7qtEeO$QAIIv)eNK&#GrA!(+DnJ(?bhg z`HRpSw8F(_ekxaSBzXyxv35K1#e>R%@HbOACK8QDKn}=x5jzlp*?T#%{L9) zv?P^hkwE*M&v4n@Cad|;jIRYYlEtV?HKBbdTe3|bJeC?c7eC+~$b^FzK_Jo_NEVFr zCatF+S>H0M$wlMn)!A0&Ur}r%!vE+lGf+6Zk$nFA=5yWg*+s*0kg=BL{?w-pShNFw;py)!j>tHKkgPeC3`CwICr1xqm;VO&OD8OVDfQ zs11|gw;uZszLJ-`*z`I|ym(GYmga0vVZup#)8uLQt9r7fnSYSr&fR-@*?CU%{%#r( z^O2Hg`f3__Fe*+q;jPn>E;qYA^m~P{?%afgvG0I%ZWDC==q3@CM zFONByt2O~xah_&#`7!}u-|1qPC(apIRYa0EU;oHySrVXf_SJkzTW?F0*wGfYD@kEW zy_r%R4W5ES((y(d_O#=-4*N#7Bi5D(c^9MVTp2iST9j?V1eh5alm>FcS21Z_N|d%T zWzv8#bijZ?9j~C^Tbk1EsU3ax(e3rU=ZS&9iH&U3oln)+ur#eo3$_WO8q+UR zCU_-XeI#E_4nH}ZEVa>H0^tdoYKU9d#B|$pvkVqH9-9`zJ|&Z~;?Ta#0V!jJBb6AR zlf3-vE49e>z0_Op5`yPY<{7~N2`+Fy12OrM{>+K{;{`@q~K4eM6Mw+}czG(^qle)DI!7}GWw7pok z>=dA;9>g}b66}9z2z6rWDVtdXPDvAeN=$snp5_2`!)or#dB?fsOOo-km0i|E8l2wL zt`}v&lm5--qBC8kb@1hMT%1gT8P^<+XG!r`HRbv2(@AD9Nl_mdBemi_NVg|aolh&a z_nO~;r8#l|5oY34&-A@g~x{2y*UIihjfcr8M@ z6b>!b@>~AmwqIM#VCT8kZc=UNqRc9Cy7lw}0k_G-XFe|*Y(Y;6BCOk2Lbw5|U5AHX zEZ@3ur0y{v4F;!Fs7sR%nryKiqZmEgWovpiuH^^2nm2M7I?N#0yfg>)D=C&FuPt>A zz@3K^uxHJoGg&;xq*9x(oL8ie3D1UNjPXr=c;|k~rTpcC6aaTgXPSO|L+EJMR?wU~ zmCtr=9cyjnu}l1c3KKsbd!kP{I^=mHe$F{ANn&~MR-kSAZVc44$8uxT46mZ?TFhBf zgr@jMw&HR(Sgn6Gxew&-gPGrJr+|y)aVLHswJw-sluT@^f!b!m94$75+M8IE*fDlO zzKD4zp9RXb?jjdA%g75$tVbnhYV_cRANUThBb4aggN{YVg_Tb7oer@o?wKibVaElw z1>CBHHly4z3#u*k!-Oa`1#u_a(jO%fPX1eG&ibJl)nPs>=zlx;8 z!UwTvc1+2Qr^)q?bF72Ge5ZPl&*#iFop=IL`)!6dNsRM>A!d@WQxH3MPK~K7lJ_q1e>z9D28logZ!XVoW}TF| zU<3s>Y>9pQ<1{|}t@Vf&!m@*P&BfkUKerQGf2n#1hIwhHSWNE`&bLfpFMxYpS)$~Z z*^?l-m0Xd_h%7^jIT{l~b2@s%9SB|OqMGf!xo^ve}=vxKJgW}vb_;2O+ zQ2ilwd?5YhkK7oDZUEIe@U6+FFDDMv{*yaT$!ewa^%Q7J_4mD1w|ltx;K2$xr5bh%b{rdTLZ1n-NXBy4A6^s!Of#2ucYWC^(2)PSKC{lJ1{_# zvX!xT;%!Ra1JMY=n4U3y{-c~fbUnyY5 zYr_|nk~6|&UpGnbAaIqm6&#%C98k}O2PMc%D{#PS(qO!GV$`O)dA;=Q_Ukqnm|LZ(M7Zt6%((;Qn8AL72;Y+zx8boKxrALWi}YB|c+T?(vREYK zD`@RJ7VGA_{?ozhV9ex|mRbujYD-~7%J?lW+d&Bo-)Anll&MT(FD?o*b8?Gp)^H7j z_GLx6ITtf=hJeq?Smq$xy|euZa>^GDhCLFNUwX+)K>qWSr4Ah4JU6P;Ib|PJ+l$L* zuNLTXA1-BEseILn#&Wn{6bo}*oB2oAgGpFe*aRfUolGW!(gOR2ZN;l-wln|iEkSgU z$Gx{3DOJxo=YuN!!xnQ*UWQCs$ zFNUY(L;3|tr{|~Nft0u!#x%(8;-$JUc4reqRc?9SyyM-n0jj_NBpS|Y@DRfp#Dja7 zFy>WXwR3N>r|U5%;BKfJ6NX8$)jHi9BZjM-^YTsu7~a%Hntm%u0_!C~-j{ihk0kKoVyUZtGt4WV5^|hKd z0HAA)T)26`E7!8+J8y%Cb0Qo#+w+blbl~UQ%K0HRB{EOmQa)qA9oMU*;BP3abApU> z12>C={4m#^j~tHga%Vowtl*UUqwG2lCD=fbO617zrkTT>cT`k^K>{Q zF8r=(u^%Tri9DH9wZx9>egr?*IJ+xrof%pq4Vzk|rd?(EYCM zG0l*}mimS=v9XVo1aigrppdH!QsXW>c4k}-XNn9%%QuKAbyFVTW)qxgLK5r2=O)#X zo-e)5KKFWHmtI{b*idWfJJ#D<^jmB6XGx#kI_F=42GT~tZ-NpXuYTlQ2M-SbIQg8v zgR3>>O3OKNe4dwOm7ghg<~`v2CzqdRY72IpBpu0Galgt{4d&e$2wkQ7>UHb$PF(bw z4UCUHAtbfZb__J?eCAIoXA}J~dt^8`7IiKex&)7zy#}V8+lsjnG~cjEKIVP7Sa~l& ztvmBpyGWnrk73Oyzo~Y%lC_xc)LIF+RvX%`y+d2OeJK|bE|7ax_B1ztqNG3$WQ$$C zmnTxPp6TJEY~P8co!zQ@9$`-V0AjC(^hKvr%3=K?`xwL_?F|b>C4xP1#|0z z=OQ4hccX;VsH^Q~3tx$UO$wkBGEwv&gu3)tx17E_g_@O<`>E}z#I&$7gq2-ozWQjZ&?pK%9q1{cmpJ8Lf=E`NDk8Yr(grV}6wRh+0zM@ipxEpzI z@42q*bgaFf17m3|ieaJ?E5u~tl?*@i3E?KF`U$pV#!33~?^w*J<<- zP@^qnQG(SZvTApgnEWo|bS%hcO78vug=8c8fyrK{jelmu zh(4P$`y!kr@Y>Wtx#)e`bS;UE=3r3x&won_eCL$R3-6mT6_+JX>Atya<=af+bRzn! zm2Iim>@jul4)0Kcl0FUWbM99KXFfJA>&f$t%S#Kw$(uLbLXJ5INvz_jlHX>d?FO)s zhY}Iel9IdgjH}1w0^#yD18^Rs7msa1P&X2Xfm7akC-Xof^hX_H`tl!1%G6SMfFw%~G64MBU+9Ws`kPmH6W*K4V<=eo zJvPb(WQzmqWIeKPxm6pP)GAM}EAJ(L$xh#KkDYuc3xVK)R-1HyvOeIag#5HebE3PY z9tOi-jy&O<_gY^=q&K%=-wCHrH4@2nd-CqEyjgOZk9-{9r{};ZWXX~PmMh5t`?l1? zWiNq00h8g9J@PyMuqWIxp`3wkvIo|Z=it%t0_OpRWrCDo{Z!e+gsV0K-c3n(k*+zc zg{~Mo!gZtSKyiFoUYVSrAuWz%!JJUy-#1lUf@q%(!sH>?Xcd@jN|jzZfb-sD zI**g&+5ODbUtn_gS-{>c_pyT#9uma^bAyO;nfDWdTHDJ~ycxolK23_B`(Z!LW7A0K zpvDr!kn55{E=MUCE2nSMncZ`w7$S1}nBD~?#KZ! zQ@&Vcoy(JyM1M+bL*ZbjmSd57mTVhTrn9`}o%aJmS(BgxmCs=2TrDd-wT?+gHrI=~ zATFWfm>QIJ#Ti7#pu#4a1=)jB={3*!G_w>lrog2Xd*?mzkx6I?B1LlSDR&kmpa7cu z0V>6Z{gG#>Ni$LjS0WmJwU9c_74+1~W}GNluV49yd^sFR7i6iD8dFQ;SM=v1W96tH zc-AV+*|<1Wj;;j3_`s6v@W1m%GLO{Sv~Lf!tk0Qk+@3!P7I_spjc~W&iQm zT~J^jLdg%3%UPx8)z}dcg}egGgJY7D*&$l@)V#g8hD}X&XA{oEBB4}eZHw}uh@QX_ zXp4mK;D#iXyf!-WCNH}Xhk-edg)y!iL5x4sM3qmRW%e&H5L4hZBRJ9NDe5 z2S@I%W}5y@ZsfvHw7g0$(?E*p`7ASyldH5LQBJ2XsWC-zioabqeEReu^SzBLbW{Tc z0uSjRyoRHxRj<deb6caKbJc&;`dR@-^FNOwvp>A9JaK zuD^!#xdtEF%fugKApa3^&OO`p@xJ|;-ZMc3GQLx=<`@{HB@O2j=fFK(BVcmyEY1Yx zEL286R*0QL->7Y?>tm)(Q7F~ZwXll0s=r{(G>`7%r=q!L+7RsXeyLQ<66QfSHR++# zk~k6SUIeL+#WA;_2RY!#eaAt-O25eUiIq1Bdefo|a-L>uR)P4lR-`DmCl-4Oh~-}= zo~;N>;^WVmXf`?;eI}w z#vOmtjhw>3Q#l!}Zd3kJDGxAoqW(YSU(iu5`Fo!eq_5VBQ^5`L-neYT~kJ*u>lKIM|5q$1B7I2W{9y zIhfq85L0saFa7a)3T2#eEvd+IUjlRpWw{vpye>4G4^9!R7ILiKmN#35gJ1E(MnjGd zP#j513E#*`%OD(*?D|j~VZylT`Y@|}P>ZFNMFp2@wai6GH&_lHyH)4Kcln5mvXxu} zjG6dCPJ565#Q~14%%y-23nlu!s+J`%V8_(A#)aD0AA0I4a{ee?U27H+kO>p6Rw|Mw zs+#Jr;yvH%5YZ`{T{;pvTjYVd(63h48{MriU)F(fugK)4rqAD>d1;>X$|j(luIyvq z?a?@-x?pm{d}se)7dC~-B)u128@YpHp*|3jw4v$Nfoug zwW(%FN+Y2Vy3V~O5}vG`yZNvvLoP~9`*RTtY+Ej@N(NaMmy{g@^6!2Fs<5j+Tupx)=HNT70X`>kV94TMz?cq>OPe5@X@?_&E$#m+B z+!CRwWdsu0EW1%rlPIYeJye*ckNI!nT1udNhQbTSq@`a%KBk%)%*+?yk0sScvfvc> zd6akcq+(3qye(cG+f6ts2Q5EgDY=ySq-B#&n1h!9f0fT=Uh*+!_F{+ZWQ8XPtZ7(h{;qGf*+?q6&Cu+Ti0&)t~d`#4XuTRuLug;9& z$q6L<610^cMC#7Upce3)OYcT3v=$LCbDAdmHm7Bj#e9n$eSmAi#ioM~O5Q1k=M*V< zA{cL!%JR7r5R6!;;+j3Wh%3JNi*|?rtv^Y4q4OKv9-4$X34zJIw#Uqd11+%n8n$ST z*FEUIa9z_Kr+~5A;-P@>j9gRzw?8XWvJW4SaY4#}$EWWp4ufnIMw^yz>Z%*VFGuOI z+iEDDdhsO*+kdtN!Gsg16{1A??Y_%ILp0AUe`VqScY(u$7C?&Vna{*TtAEluKkc9f z3o*V*uy}d%22x@^s168;=E84A%X#h=Qt}%T{tv=l$01p7<95);ON)w8>G6Yu3bx_k>Pm#5TkgT0lowp zwOUonL1V3vpQBC2NaZ7qIyn&={o(vlpR6n(Nv|CgT(l(<*>;lu52LPk{FW1*b+`T0 zmwr%%o&(|nE?BQ}{zmam{;;X~qP6XF{dz+O{(qM-FFA?VK<4z3tpDfZ&`3LPYcjM; z1d}f>tITWqYkQzp7T z3Z1wK@6I0ZWm`zy0Ht=b|2)@3Eja2qYP7oBCZQ`ox(>HGV#61n2+0+=P?H7lr+!(I zq*f;6sh^vue4-qhm~SZz6m~Y=gS40YiN#GRr9J;Ry&jITVsB+qZ}ag(TFJ%qtC`Zy|mLk?rY__lH5m5lmpE(OJB$^N~u?v)A)N;X%V~(<>xe`8h3&Kqk z_%`j_NzuPbyM)sHu}#J`Kxg($;`F5tDr&m5iSEyaU0R!pNt55n=myD)1l?v)p$O@@ zxH%3;mI2jQimIEB!T0k+PQ0e&+XmG|FqmhP4yTw!qG`cC-8Z(frKU}zbR#qyfH(h$ zcL7MjFwC|n9HBNZrtk~X&!sXYfuzLefGHBPdF>7B;ibu*C`drHQ+oO=P8knvCACf~ zam{^BF_)y1=)vOKqU5&)ZqjG3cXa0d>R{&M+4P#JV%)6eKcswpLak3VgEq{}mF>Md zc@a8835bC^GnXo?n53(YU{JoDNqg)}_s`b-!d00rWeWQw;j#lJXtV0ij@*vby>0rw z*Igt(EA2cGb0VwVh0nHad5IPcOIGDhqN3yzsIgNFq79L+Y^F7(B;SrA(Q!lz#%DD| z-{T45*oE>Pu>=vAfl2WCWi(-wb2d3Yb;S)C1hsovwW9G&cx)$b73Ol;sI#vLoPJq; z3~hq_BX?>0WW@u!XjmRMdja_=cWa-Au69xqk|U8sA}Qpfce_9*bjOTNe zZo(&*@4SAxYpKMOt&$)Sca#D#^DHFAETEy`C-kODcx!v#er%HPjJcCInMC@GBv`5ipu<{B zK*1%EF*oVWsm#gFtzzo<)aq6qr4H2lUDmfCnV^ojbob82KVZ2Tz;t%OHB7qr+HN^- z0MZ{z_ktk1uGuyF26rvXWad{Ws4vj)N0FtZF4e5mJ`yO;u{v20;TInyvnWstHj zKr)~4M18ha2@M-pX;S6uj3Suj-sTxI7&`)yQljJ9=)32+j)$=z(I-ZV(?;Pf!OmhM z^_e|4EZOQMfEAE%kUQaTq3!uStCEQ5lU<2ac_$m-RDcO-Ko*M&VuTsp(!Mp~ko z=@y-a66uuyyx3F?aJ#R7Mhi8(lvAHW`{W;oPl(vJ1&=2M*d%M@kKa282FVTgb}pgK z+e><&*3}tD6i!9)fzbwn|5JUFZfSOk-myl;2>86a)FoWYk4O{idLhd{SN*`II#C+Tv24wpZ69 z_%#)mteDHS84wT}NT?e4Z5z$OT)>5D>)`+{6lQCwG`Al<$~okP`85}ruy)`IzY=LO zKg`@_N&es)dOd4uyWNsju{h56#I4KUX!af!NSQ{wtB~L~m5Jv@)+Udbx)F1OZ4FLk zxcw$OQJ|%1FtwFoeX=TNqnRt$W=_Ek@+O5uuN!heXQN-4BEDpZYemzJk!1+FwM_2K zjpq0Mu-H9|XXl{#yt$~2uX6r7p(k1K4jLymXrncifJH#vq5P@`N9U;xv2mYyMDjOB zSW>!ueFLx$ES!1@30!$ni30h&Y-&?Hv%bFIpt&MH(}E{OYij3|w)uga%1*5+tDbWLhQHS z9`qFGv+X7&$?y*=4dA3kHP1fjEfNB}yJ$tF;bNcT168Ubq%Er43+Dm_G5ts&1XCH3UBTqj; zoVXwwQxSdoQH<*q-oQID32}C>czWMwTpgR_pxR|qi z7%luP>PAYHM-EF~ef~rcVLrFMc7W!tNs66zl1TW;5N`|p75g{$vF4m}#mm=R2{0x^ z=VhBE%}$=m!(&`V5!KeLA2I{4%an5 z@8oZAS0!WcVF{4vB~ih|U`BPb#@)rqHswq1sYcL=bd$$jD#%tASdF@k`$}!h;3yTr ziXi+kLkOmRf?^-RA*Uv1sy2+LeYJAFQuqukVH@NGwsE5xJ^22_awiU^uSVya8+a+a z^IB;}1a9WMQI1G47D%aonWvrjljLd<*TrE6pFsLBKg^{$1I6;cijYqIdiO3E+9m^^ zro8Vw)jY(`9Y^TJHV?L35b6iMTR{q3%ZpB^4>H=8{0oNF;Oy3)yQ(!nEK!7Tdpk-) zWac?#i4_U?PD(5##5li&>*qOs;oUHZfB6IJ}H-3-D~n;i*niPz*`&r;L5a%Q?5NI5T;cE^uj7Z3td zu!J-UK^uswnFEaSpYz2Z_wzkV;QmS!OLXQP&=Z4fs;nLay-Q?=E zQ34G&welb&MRT)a4mv^=m zo~!VY>zM2;)QJ;SzU<bGz=PHc92H?p6D!qpG5G)&Uqe7lP@F@t?JTJW;V#nH(k z$f6FRL7ohHf7dtV+b=e^@yCN>j@)0b5!v+7u6c5@^UneiCH&`R!G|9^@i8NJ9IQ>X zzPKz}W*h$SUBVVynOHL<%=?>?5>v^fFeWoS@mEUO+iof0qN0-LyRh2K0fQ0pBS};W z<%t#-A;6n(VsZ$jYVzIzXXH^V?HQkzE(^JaC*^S7P){{E%YCzf9{;(W=w}$w+OW^TbGp|42Lo$P z92>%6V2I79;5X6|`Nbn2FgZ0~YP!ps2VXw_I0+zUW-n#BRC5bea*ex3F0r+-m4rF* z{1p4o29)ISooHhOC&@b+ER={^vY8?9wo}c_H z#_kDJd3FiwK^=*h22(jWo9AZJJmrIBa}>#ig1otr!Yk?Q#3SGooka68;9^jdP--wg zXgb}i6&|x9TK3BQlm)d_>RY7>W-y(wJGpB&e4ulS_oWyLhD~6jg&+X=er%XGWk((+ z88A7_E8t~r%1Y*o7s9Y7GlB$@Jzq1igT4I2T70AbAv9emAs@BfW$RPP4q1?)s>f!Y?)}tp4U8$@eyZCgX5J!ZE&(f+roP@A^%V#k% zKky`uW62dn%1EV_;5sez6|6p6O=gfaN}a|smd5(o)i{)j@^fbLu+~vXel>zP6irfG z&1X+le{s5*I`alQw|C-r&V1fys`oXq^FWoeA0&KS6|~pO&ZnqgFY= z%6+mfBVhlt9!j``Dl+8qIUqwX9imAIdW zkk2)0Gl2~&B79O$a`&K25-3pOiUBc!vde}t3eBt^%0>%J&Htp@eNoKn7R$cFkV9C+ z8$Jk*e-rDx$q<>y@gS@4!Amo#qL=;%)wp2xlz7IdiT!W>%5qP+`877Do5iJcVx%4X z8c<;uGqJ#&ELAXhjxtkjbM1tcEZK-6r6e`?Hq&6zP{=&7qIptSX}0jGq;v}<4P&zT%RQ;HE%iTezQIO1hi2!I4HM;_QW~6`9%H`TjXa8X zvk=$LlqrInNFv3&w!@Fy_T)N~3=2^~Hf0OX>+Y%@I^`-7m` z%H}AwW7#6mxVX{X%rue)`_*X6tF&`JRPem9nCfZXl7J$|La~t#aU46tSqcv?p}mCvc3rDd@;R(K&9dyRk|y4lI`Xlr z$tl79ZUTC6Cyv4rjC}{7~niA?}1gkzl9P{<*!)zOeEVPg}-;jG|f}fq`+?vF-so3xHPQE0lmJq~X zmrcNB^{>}cE8lQ*Sh;r=sE8_)dRqa*&eeM>HwOD*BOz4gyT8#``aVq3U;LNLTWG!` zqHm!3<$VSgh1^McYj~%b~dzZY9vV7hv%jD zw&kHjXMStN^_=ySlJ?gGw5C=$OB^UybP$(8zs-?+$#?CE21tB1$<-7q!8+k5v7u`XpUXcnYAKG08F{_=GlQC8qd7Q}`jaEqBUJ(zUS|KBJF!Ltg zA07t}BfmhZR?dV(wa@(ZU=%wO51=1J#UNoF+|D=?^^Y?NLAX;Px%!j-wrK3sldlH(AByPM z1}WN8HWQK8)NLp%v^or+alWon!kYuwW6{Ygk`$`yi@&BxgoVShL1k$!ROheL0GOX$m zyg#Ny#1xB&+d)t-sf{aIIaj5k9{{-9_*E4+rW=69qJdi1^D0NiuXOTiz?6N7OExg<6cUCLpDIMtRN zH_E3aO6P$TA9xGiy0KUGqS=*}Nv#ocR-!XAZT+~|)NK^KG6HK_u97QV1@z)cXS>fn#q)bS(&KWX@mMlxV zb=8(TIn)R7oi*x8bUn(zY26u>@iG3o0J1!R>6Z;voHY6tK!xpKIbaYSUUIJ)TioAO z(J_BI=vbCaiEyaH_hghUwVTmm(Dza9dY1W)e2JiyE{%MkNnaIxcPaH#45NBSDkAv| zJ|;As0yuz^4BNpH9J#j<2w-rzTt31xr;G~}sT(xt`?0InU1T#oIU;~0ZCuP>j*S6z z4`D}AB_u-6zLnj1N`_P?IUB6TQ9k#B?>*x$+O?>GS{-}9WN-&R=(QZ!7JWQan4I>- zP%B`I?isNuZmnc&#Z#um3)L;+44*~2hT>;YKh<*n+y-~@Nxz;z)qDtcfr(zvZl`iC zQ4uOrNh`0-w(qtJTNH}qg}j@gT7nqPvO-B@Ncm;fyVQC|YPrjXWgr1Jl4mS*n~WH) zjkSqomXw0S66BNHkvo0_FmEw6o;N*tiU zSq@`;VrFgwH83@?QxWnaDkLtg(ho=6oOi26BPp-8%@aiy+-kBsGkrx0e5&=q2q8CQ zSge_Mg+r%+IdT~Tn3(bq8q06+SDz>7B2P4NH@Gz~k~G(hcW@x;p6Wg*kVd%nU((M# zerF;7@X_&K0N^XN?*Q9M2rUuudAL?`8vX zViQCO?rl8X;ENBoZV{*ZtK{+$U&Sft$e?iY>-jhG6 z^FQ_=^ETy$WZaaV79D0iq^5P-dU69kyWN_ zdh>)<);#5aym<={n)*5=8Zflx&TB6-2PEa680;xDE~vEETtFB zTT{r(xW~koAeYB95t|FBqTG|9yB)Q2pTIu7oXvYJk8J@nXuZMNxl3hDPMEJ2YyBeo zlc=&bhbIY!=R|4~WZS(we7OMU$mYdT5S`8sB^hhIGpME>)>GuowHN3{%!vm{AzFII zMPHJ*+3Q1Ygr4drU?u>gNARGq)020m%YN+amtIS2PYSo>nHSF_AHAPQm?#oNvR&y^ zxde=dEtWeNDYXOZ`m@eL0*-No1qN%NxP6H-Y%htDrlx*)BkFb>sD_{IamsXeke}_k zM3ng$*a1&V#tmq^CB7B&Am<&odJ${WVjULTG#N`ahV3kE7?o?Hcj_!c3n|`q zCH8|c_)#1w?(c1JD!1@-VQ1@dTphJXC@K+JdhJ4N@0$Dnq(oK+%y4yXtxSobb<23q zWRI=ds#>G%Jvqp)22S(^EqxrC-wDsNDcU}KNrieKRG#~_5Y5@&#a<>^&Nb~l$~SEj3k8nw zgG@0Vrq8}3-vm=8E#xFi>wy$Ix^sfiGkrvY)goKTf#hrwZ7a&?YL=){+E^Xw*K885 zC40dlUzqI0oEL5LCl4ksFX!srIIfL$@^Q+=yJ#Cy0d1)|8%q98M<>+R9jAgJ$U{Ss7}-+u+o&Fi!zxh&NNH=w^tEJ=HgW8YPBcL{ze1NaH)~C!kX)h3<{)vsfct^u{N|jyD(ybMp10dAmIub=y@+7>(Ywm``0!uv z87DM2N=NAZSlN-0C1FfxbK}i=o~4BR==vq8Xjc+z*jTgjPbGbuYniX-Pg2p(?@gwq z{ryvD!OPj1vmV>}^CT?NwIv;1x{c={f|DgZ8)m4kU>7RX?hH==P7_`OQ;o zJF7dE`$4}!vq_U7)oRk)%WQs#bbGCtr!1z<|0JW}@-l%fTOX|%a}ARTWWMC6^I#SH zrg%!IA_ezpAFZStuKlhXK|$q8(ef;f-Dv63=Lvov{R09b*nUqb<_AyQCbd+jZGl`= z!cwdynsmFJ*ZFbKN|5O){S)UIcOa)C=Z(tBD}~ZtS*+i-=A7d^d;KWZ{{d~Oy#-vof$XnC73<`$is2 zuxcLCmTdW)d&zt;KXxb*IF=1n-XaPPK+5sj$F3>YIxMH{`R>8}3xzT4!KZw&+mus| zW@no{uNH`XKE>XiW4v9=AiEjdZcXYu$^{~E;Y!u@2mwceoCTH+kiU33u{N zBE@CcOsGEPdJt)zdIDZT2B+-g@l88#!34h#@NBd7=<=K*Me1Qjf%yiCt zC+{bKlT+eM-Yv<-S2i{IrYJzvCua(67oZm{T^2E|B z9rT?E_rbOJ%&l=SYUkl94a%3YY>M*7!@A$wDhy=Ra;t_zp(U3@H+^L?f8^1nD#kC{ z=?%1Ysmc;cR?=lG3G&4fd*`Jm+!A|Eg+!ASgPojrDRbE)nlLe69pW80ZuUSD4L0{3 z5?(m*Ad5apTFLr%62Y$l90bxwe)Awpq#;K{oS5QP#yYtwDXVr2jgQfd?4OXEXSitn zjRy`k z7LYP1N(mI~VJ$olNQFEK4o?d8)EUQH&eSuL7Fsb)=T+bLD)5I>syRg6xE8;KH3^3e;r2J0YNdyVgVFbVQHA)F;|{VvL-(9^8Hr5aqQ z?o(&BZKbN(p4us-^rzBI?3kJQXp0KpQ+u#BMp?oI&&@M3^`SAMWlpx3xz5@b?f<+# zbiIH}RMq{`XMRU5u<_owoX%k!voH_femJwGCsJ!^oau&ge`8Zq`^WwaLf?gnJLlu) z^bMA9U|!H#%7~kXWGY$CdDonHmQ-^e7P_7w?OYwk7RZ>x-NB$t z!r8X+Ha~Y#_Eut3>ZE4jZ%*NEo&B_lKh?Yt#NaW7H=bOI(PV7;N&t=aKW%}PV^gOK zaFm&)z3GjGV@s)XkWC{)m!G+A=(Qi{S;SLY{edalL?rwrzJe1tQd;K#zNx^k;Pm`m z-sywQGV@^7S6=-oCx5M@Tu}=nN=_=F3IP(i583tWCw;ox488Ja6V#KktgI&BZN&gC zA)K$aLq7^R7F=Yclr$;&CNgZPpgzm61W6Jm+HQr=7WM36UZ}++zA%km#3W+TDQaz! zy|jhP;Q(wQCA^!r1-Q<%AWIed`%DA3G9Ta`W*s5{cf!4F8<&;CUOAmjypbuz9D{KD z%+1g>pT^86CFirD+$5qhBP7o#x?DOn^ zdXiWTZeSr&fuyu5_5*o8=z#rh4kytX9Ul@u{Vm-J8P-bNOT5(rWI*XXQ6+!M7G+Ph zkle$U?(4z4qT`J)m!ghYTjCvOw-rHydgej^i}n@Q7QlpvLlXP6mmtIn@^DkBco8Ls9Ska5Ax*&>Leeas4Ls<*e%bv|b@XTgvBxF1to>ioH? zjbg9pWE3{o{3UX5Y`c;-5`8WUDdVAJchS_XCFeZUq`!ci1dEgaIVg89wraGo0=F}{ z+ZcWBY6y}7=hJC;Wb+`Ie53Siw}x>`@?Ab7hhA#$OTgnuUd&GqlJFo?zcW_$kWnb|%`<1-j5;>7>ue)tX&%q-- zZ$DqAGm_GoTWA^Pz;I6^9h$VXqY1wy4Rh}kUtk6ZNzuobe79m+Ev<|~67YzQ)dx6g zD-f{=MZk9p9LZUx<-R5q25S3 zQ$z{;I9ibg$nOvHr0qKvsd1iB?h@f9eehx}{8t0Mrfc+jRTd(IahMo!^$*xxGk zg9KCW2DQweu}DtVzVwo+W6o0&`Fu1Mqu)V9jl}K4Po8xd9a%m(F7aJ98!yK7eVDNY zv#%uis|O9B-U_4BeZG^A=-#$dvxZNw(t2V3;bUX;@+;5HzjKgaNcQYJ!+du0Y?>G5Om1eJf@R{rFERkccu z`Jtc2Gd*X^yvWcaKQmBoyNk=%kDb zMVe1~-)ES5tK^q9#-1Rx!OmpiGZ1+RN+Ct`cc@5&{sEfGGn0fqNZlBz9N zN(MvQ7mcvI19&J`L6sP38b_gfZIaHH%$c&d13De6=1rDK1pi2sY&5>Nxp;g#x^$Ao zZoU@8vNHM(OsP3#&MAv%SbJq4KdkO|)?7!B9-g0#>TaQs+{35oaP-ojHzLsdPM+udyQ0v0yA#*K#HJLO3ZHBhSRGRUU#hRTsoPh+Fe!OKZMQvU?Fv4Kcb ztFy2)be-IZo9MyE4l2KkH1j!^CRme=6@&qXHh1$oX~`#Ed`ZuUgwsn0<+ZJH6Hm!W z+xC($&M{1apmR6q1yIe?>wa<3r&J6-I}?To;uaspR-@HkZm11+P>GvQ7U)3YC|~w4 zHB;Oz`;%MjGVb|86XxlIGOq$ZxP%Y_!s$X}<|$1T!#cq@&(w8;oadXmTYur=2%IWx z%>MhmO5-o*;S0F?*hmM^yt&&C^Onn-PmTSh@@;_=XE3t9W^#0L;q474z%@o+SDwM^ zf^07j67CdvXf0qVCCRAHgaWpP0pm17O(BR9r&&j5W?A!nUkZgOpPSWk+=44#k1jT14kJD4$>hJp<6s#}TcE2_Kj)i$?%G2vfxOop! z`487T^3s9HPxXItrtNii8N<&EnwoN!W|bn%u{9;nkpf{$&9Ifmajy85T=1HRo!79M zKx$|YWDVYAp91WaSW;>)R>Zk3*NUgqYt^Rn_zC7>9g=@S^E*K5rpbOMPq(~f%lwpu z=5dss(5@>uQHRQj=1JX1D&0!mv-)HAcIJCo>rNF*qJ=$%xWHU`76B&?Uh=#76vdgO z)VX2M-DINrDU$cbTYRM>NwTVAsx0NJjZ82`0O>)aLH+T?ue6+yb0IzS zRDzoJUPLg_@DFT_q-@89T66PvDschZ&DG^6NhY;2>y1B?E!EVR*y-O1vexYjum>qn*bc5JXe2g>qi86~gju?BgLgLjpg zTz+8Q@}bciOgn;N^F$9oPNpGLgTtZH1l(UL{+MQ>e zD^Jmp0QsyrW2MW#?A)VK#)B7*EAaSDk_<2pXtJkwufzOyn3%9)FuWN@GAHjV+^8VK zT5RQTkW^()Cec?n{yLIyDM(LwlJu3{UE0yG8kh?=uMJ+!$vpY1`#KD!&xU7{$C+x5 zQu0(JA&9AaT%*Q`i7DtVEYe@jlL1LkQ*xt8rX|o4nmV*GY>fp*fND=U9#}U|V$8Ga zxY5%~%k#eI{up9@(g_>%%|2w38XH}^U^z$m#U$H;?!UdS7?iu7IV-BGl#2G1sx+>% zSe^`)yq+{hFf|D4J+N|2iHK_0e_J+kXUqv#C}hiVPg>9aW7D9sDY3D1yvYm&fmj?w zDBZsTUbQ(B@JI&8pD`+BPnuLr)X~yo;wlb#3JxmMHZga{AB4iNJ&mdYfse!~Yf^jH zEH)&XQx*o&PQ!=al3PwJv4X(a< zgSPM(BiNtRO5K+&0X>bWx5V=)84Y2c#YKQuFtyI!N+B*aMFLN-&vlNCT(t&bBVTVb zjy&u)bEew(k0|Kg_AsuQE%n>5PU0>~>CGMYNOnxcM8;`hF~>k&rA?ceh|Z#DW_8cy z++nL#`EG$GRq(E<`x4zgpp!u=m9i~X)yTCbP2?lwvjt$}_B1R^tkSu96A!%BN{shz z!e9d1-sqxrx@)Xi^Lz#)p8l@EWLyo%8f>*js*K`p$fChWHOVdkDW9eXwi3#_tW6Xr zKF5dNbqeVmh<(f1xu{#m4{aApd&ZLCgYj-FZ2IcUkF#`RrkPVrqRFIoqhp*}XJ;|VqtjG<5SSSZ zHVwP+$`L8Hm*W`Je0~#{-6#62u^UzjQ{Q5PcFuE1^tJeyoSAsG zCftm+B_8B|wcN_oj)5lk>toQ^2qH3hOVkct2>PBL!7fEXj?-SN-YI|X9Q2f}{e3k^ zb?-jPF2Tr_BN=8H6X05&{0{XW?QC3$8wuSBO5e$zC%+=!o9JSSmB1X<4380i3XUf^ z19#|#)ZZh(!ri6d13@pm)Se`|*8&c2Tk>M0+w@~=7-?s1*!oF`r6;>kcWt_1sm+dw z!$(;~KFPni)Q5cAOF#qpjL`cN5T!E9CnNHltoH;j&na#|mJOY7vxN|N1?b?Iq(<=n zrAE$Jkxro3dGftV`8Js&P3Vq!)```@X%<=REuTJS@Lt<<^LS$1Nq;FWT1h$u>r#s8 z25uCmYmLuR*)vPn7P%9ciLU$1iQMy{g^aH;+26IHP5YFp3h|1d%hO8J%k%S1?L1+h zfz>3q|FHyt5&w@up^jOW(W#?zB4_pBGs&4oZOC-4Q{xDDSX5d=Ra&mou7zNAm^gNw>CxVzLBf;FsS|8Qu z6cYO&Gl#o@f0*xyJmomf4>eFqE_dp&-YEeSWtM|L`M zr0&TpOfHf{ZDO7Y@`pZ7EhQ)WJ?BP6rLhsHA>nj?^crplc-p?_~(_z#s~U*^@q1~tHxYspkl zlj^4Js{-XPg=Jj%?%GCVa_4*@c{sQ}5wlirZ~g*o#z_)PbnVZt1xq9No`xThTsuZ&aYqP+t*h_>vO|IWyDzC@@-%QndOp!X zr*v<@Btrp_D16z22@;`+azS3s!i*Us3+EbLmUm80;B+SZC;H(zp>y2ZQWkif@LdAc zTJ{LHS^hHHc*{?=t8)gwNL3fPvOYfFUf9#RHpi9H!i z_pF^)FinomQ{D*y?s?tM&Ek<6<4mkSxFmIraqXR-Jq8<(;4_?`I~DEyap&EcZ7s@x zl_GI)h*8>(Ny30E3FGIwmEtbd&oyajoJ@$5RTgxuB-(Yi;GG&eB?%MZpvMJ+W<9VH z`!WY0pZ6QwI`vf2`@;STg(cPS&V!5qY|5~HK9-6U95VZTZlBDY8Gq^)`aw_atlt(tP1fNZ^8Z;E+5v6mrxqT$mvBq%jrM z^=Q!NYfqMm6P@$I@)J|buF7kQYzbX+o>xa+HtP$dvF@a_aa+8Ir`!G<7h3yZ9;O3p ziy6A8*kSxX!1spx?MdHA+@ACha%g<0Ek*oz?Z?4=MxS{Q%(~MbMJ|bt{(m5L#FE4xN z@7L&QB=}D=eWn5lt*;H)9Q(1UagUVliFPUO*=$&3CIi0oe6{Q0mS&@Dsi?*}#pWl7EMU$L49<|+8uorP9C=mg+=~d44{EW*= z`XkJ-llz;NJY#B3XWpM)l;enDyax_U0Xhu8bFp~wjE~MzUT{Lv!I62(1>4A(lKu}w zA~qT9a0rE5ju0KH1(pcK=ZL=^la7IXVtzPG`_IUO0_1nr4jp-{+m`D1 zYHX8#I@iFb)5vka5+m6j*mK)wuXjd(oAhNH^?+dGWm7Hf#Jm{%JZ`_e$pv8ax~HOK zb_cz`MdOiZZj!tC-@3Cp+Y7UUX{G0!6Xq<~v<%d^PbLWo1c`^oo}@ZfA;|t;ZbK>9 zS?ifsQO+Xqs%9D1Tb>DZma{YhMlSt^@Ihzb4R~Y}lY$ocund2P`2ha#Lbj|X_dIZB zUDE|0tIpJClu53!P2A1swh4hQkD61!#^5Mn?gX+$_kn&SE{*Dub?|=Qc|JkP z2bs*{CF9CykyWC_4qfwBA0baTY2fZe=#zJnk}epb-CXMuQ3$55@62os?E0!DJ=Mx> z?pbm^id$arCX9~ckAUqrkvI=NzYUG_wx1%ve^`t7jLU1NmIAAsmR5EOzopxzSxr*7 zgwHn%I>Z(!cq43`UrN$1zj2X~Im=msVL*9?~#yEM! zuDN|yT?Pr&9EyC0Ctrt7(a25353{-BZRXZ5(q^A3N4zPRUrotn;vB`;Jg_fM=9irZ zjY2f^JGD7M15yzw3m&_gmrWf!n`GFBDLahYs4mZLju>_f8cCcj-)W=KZb^S({Y7ds zPf#`Wx~wDTiXR=_bENVo4>Etfareua==_!rrX?F_@xI9aL4J=3M-D#cN+|n6*MG<4 zQ#!&YwQY*LrpkO7w14(|v83Wagz2osR%CAVbRxwQV4EI|cBsxZG8TNP*sc^u{fj(>kZudQTH&U0ST`&sdxZ%%jtk$CwK3!Pr-W zrMlUBg3)@ES^dl0e4;292*s~xwx#xH`mU*O@?7sT(I6n;yCpVOAM`{Ij)u=*_njM) z($nn1Uf>nLcFffP#wz0iLlge&DP-P@Fj6VTNZk!_sdPf~VT_~gw0}&ur#<*2VDrtd zG<*X|at3}P#KHf|QwbcKyct%ek3$Z;!mzMTeI z4+wqd8lb;xp0J18EdU-%LNbj+%@W~ih^8OLS-Y00eS(xRWSn*t z-Vzi-;gq6kOCmmUvQqmDL-*sQ?zK}fDqEgQFg*k9G{VoSt}_ zl(CpnB~%AaXm;n0yg{VW6qNL0@COaUhxtEsYf0;CPBii`0ZGMko*a%mo9PLbEaEVb%@5nL!aANwB8(zteAIQK-(;*dwkVn0Gy6#!t#y%==Gp zo;I5c@7;~Ho`NKSn!0=4Hiud*QA4XB2c#Fx>G_$!!THa0=klQ!+5Zc!Jn5jN62@8C z?9gmU&WY8RHB$MpS@EGnYEvhH@+~(@?ti)e=V^hE_v}G&)W%6559Rqhp*Pr)F>Rau z*7BQLI6>s^O3{2MD2~$&3O;z)P9h@ zbuBlKfh5}KXK`#y-X@U|G?hqk?{u(eCMc-ppR}5B)02AROuWpO^!H@d%EbnHQKRr6A7jqIOF6=+OQm7D8sTBynz43e~hD zUy3kADyY}yHv4mSz~inh5%zYSZ?})o^2kT-*^;VY0=#$)4trXwZu`6cQZ)S&?hEUc zBV((g<&ZACV2$BT@&~1D*J_#1B-_RZE|otG_%k=381)x~&7 z(e4wY&1BHR3yER39Z;jAoI5*ljDhL>26E5Gr7G_w#Z;?ofqWzIhtpGjXNe;{WcJ=q z0iuPSDk^X^pL9!5$AG=s$3TdJjgA^WB8`^$%g;NC<7TfgsM&(8?n6*pBG-}6qV5Wy zy{=P!DJiQIM+-gLhHd2X=UL}z41Rw;;n%a`Lm?^;wl$uo1f6ov?F}b{FvGI9eKa!QlnCeJLK5{M7cn-kjTTl&|?m6k8m0_fP3ns zqgE@u8^k;IO;hcoK$%!IA(kAbxqQ^}1g520tX!U%by_~)hzPWh5&YOOZ$FKmyruOg zczxJVN`gHv&hyEeay0MzK6l2Nd`Vqv!i>+|pQ(C}80jo#0)!Isa(73qdQ00p;!=A*+!7Sb zv~K47%KNacX(`O4KM&=RF3ImNMJ`JTf*!q+c%NTBO>JGcp`o7S3^z<{+@64|z2$I{ z(z~X`c1MEEVh^b%bosLLFkjEboLLzrnil701nDKqzhp!YS}06h^OciNzZ7UUrGTDm zO0R!|AcB4pSbOdSi?_)EI=>}<4_Mk{=ZUu~gXaJ+pR*QQziDt-OWaIa)BoE<&OGhp zsp~7vQT~?;%ZUKOna04?NTKOL1xK!S9|2U2aDl3DXSb1yPIe~{ zoasnTPRWOHSlXUWJ7r0|nGiJFA`fV_ba>qJ&2{mx3Yf64kSgK5UTa1q;Zurg1Jaw! zgAe!#j!xxx&(=qi(E<`LwM0o_4TdpH$@tdHxC3YH%CID1-rMpxnnF5ZJis{ci)FzI=cw9kf@-XPM%xpM;x+K({rupL1HhV$dtV-Qe&oh>DZrh6 zY;oev63^|me>Ia=NN(Ki49&KF+X~*At89<5?A8xYhM{!27?L#tBY>d2Rtg)^K`>)( zph?MDMrlWRUF7xUsMF96cD?r!ZTUH{^^u=23FD&&TW?oK9Z9;}*=MI{=Ge#&G5`jn;zfss@_#ft^umc| z%6J%`ZV5F@Vg-l6N_d3*hAw>W+s9}9Asm!%iSbjdN5p|dmK-TC~5j3Du*%MF`v4TRT)vVfjR~{TY zu&o7ce?ZhDYUaW*L|aVWyPdAwiY-MdH)M3L#MGe^OgU=`oVcp{stz^?-Snx@)GiE3 z)({xpy55|vJ~~RfR#VOp{q{VMM1WS7lncZ$=E3Xg%9~1vypO=&83ohO>9^l(rZXE4 z9Mmhk$Heh!gTDuXsR02!h?(=mi_~u8Y=A(U`vUb+o92Se25bfC<_R#!!AMf!Nwc(4 z8fLV)6;U*=wqJV!In6U%>HF5+_<|VMJ!QJ4%u-8BrHF4&m{w*EO^SdkdGsJr3-V(Y z&J)R(&XdpBj38M)9C4Gt)T<=o#`muJ%=<(D*V;s)Yk>I17V>66Xv1@}x@+b~sW0by zls_eL0NPrz(N+fDU|5jofremrO7pS$zgSkaNZh8Qlr8V=oyj5x9nQy1&OG-zX^i1? z0=sjcYBuMdL@%}DMv*8G{XFLj0jmgRrQ=?jIajtx+7p0+-gWBqq<3q;~?)fDjV#?+I^rTm)jC4?Z-HPC@e9*hktZ} zav~bRqkzD@c2*L<1KR?Ks@-M#k2$p5b(n`xnA`?mmo*n470X83J`elMM_A0fcp&KA zV?gH&Pad4{=7xVZa+~wKa2DCDJtbMPSS{qg8|bSZ4W3F+2>jUUMHH;dhbMo|wb^)! zmVUCvZRIXF%_iu!yotfDDV+I&_54(D51Arne8zC>Qntm8p(~YQHdu@vt`UYtBK7|S zs9~2)zl`*;U)kwS`4~L>d_ZKx?yO_|C^QAHQBidyfh}9 z%gAoW*SFI|*JEN$wvhm!y|I3ZgN`E*WRW<%Olx&tuhkM*@=Km=(pXNz@lINe{Qqpz zBf0E({yCx?KZEScMhf*WkH}Knq}Xfadq1OrZ%NttEB4f^RZB1PJX8|&WOK-EQQfKR zioZbV%myAOP_~{cDF_Db#6+)U5k&i52LcE9$(smZJ|{D@Ex>|T+0n0i>kM;)z7mD- z9D}Kr(--nSNSD0(o{Vze~uX)KnBs0ClR{)uE(1PyLl zNp_+0ni;HDDZJxnCf+;XXG&^#fogQ>jo=eqhb8fk#T@9f6wMorUx87g;se}mlh(DS&1v&L6z)t*xz_h> zN+8>$q{M<$ebZJx%M-;iqxcuM}F5@D}!Z_+EcDA?9kSv zB$fw*gZtZPHBKor-t%sx7&xg13%r*4ayNNqo=jgUOyqo)@z-I9uzGp6wadI7FY-P& zig_T&!qtwSsbLKYs`ayJx5%}1d*DP9PNl&X5T39=_3t`!3$71IPBXpj?v6cTeERjO zcHB4LbtCeN^evuJXTe>2Qh@Gz(%fhLfCNLlRMk0U!ELc zwx#Qp>hU1r@fotbJInIYtJ2aMI^G;}$}<3gIQTXpI=|vzO@KlG*gus zcnU3>IRGv1mts;Kt zZ!?ojgk|-kYFU;f_QBZ5t=x|1WLMpE91Ur7@7S_nLijAz|BGKE|fw)apoXqrPZP zkRyK7&KDgcf?F1kORzuhfw4~>RpL=12a_Lc0&{xIZXCbh-@LpaIKI9+Rccaw{->Eb zQh)1_vjh$e~*vYl`#dFue}IQD7bSN?dABB;F@} zU54r^z1lF&ZCKEb*s&bjPeO7}<}0g!ypae0k9fzER~vx)AaWeXoItfEXBj~tF9TCb z?}2%i(8QLzU&U)V^=*+Io9f~tQW!Xxx@DW>h?nkpuF^XBQ%UG^;$vd?t}=MJG+?k$ z8|DI!Bg&}YEj}~VAnF+!bmC{ChKY@;JfW=} zcP*RD>zHW+CyC%MBx&UJEt>QdQ>l{{mPcy8N;X>hTRTn2#m&ZUujl{p!& zkv!fTi^3~}9(3Ci zV|m}KNx7Y5dt?4EuDvAt*A#AKNmGvw-B`%(SzvWt=#`(Ry{h&=f zV|b;sUU4rl_mf4`ORIFriyA_td9jT=00}b zb{7=icpN5uC-^sS0$u2T)-D!O0}QO=8dm)%9EVN z9dCZpdQY;fg3j`4vdw!1p2F267T6pIA2Hh9SI!9f3-%)ON|Fh!;M?&SCQR#rF}I*p z<+|+_e}m`EPP-~^%R3Hs%Nxl>$S+;`0CT2XqN; z;=R0PlH|8@{<*vzq|sBUI4(IbCJmjhA}@#CT>qEK7NeFL3>;Ujq@GLA+Dtw@zvW$1 z_`kK@ds4p$ZeK|%i*XmDSn_l3ck=pr1r-TW)5;Zy=leVn>eh7Sv^a8a_Nz##Ic95M zU|W-vlBmsQ7CTD#H-TqNHa{f5Y6hwLV8_&{aJt?TQKXl61Y!1t3WVkQ9MHfqmaBXO zkZ6L%*8~3B?s6g6bFfyc;{mcu-oru9WUdj{8O%k-?J4PvJVa-Xb8`Yse%D*7*kC%t z%s^l5A=AStIe;kJ^l^03&a+4Sc)hJdNmI_wM_KS|&$k?OK=&Nmt8uC$GxlysG1C2g zD#BjN4ihKF)Re15_*>EHa+_T$7i;iw3*!*|JIEd|n}PAd{@(!-GLxTLcyH~O40u;{1XR_AhD z6Z!Ij&fHQ$CaJX{Xm;O1@0`kHSH&H`Pv_;^8@;}*9%B-KmwS&imiB8x6lEt$$g2VrR2^v0q>Mu7bg!6CQ0IF z%39(g`CGx3DYwk9bE*i}Q{xGKI1S7XdRaF|*~3yw3X^3w5G&(|Hz*_!Tt7~KCviWo zXAk^e{)dF;?(|Jo4@y{45U?ob z?t++|O7_jYOgha2NGZ`MjOBXd4Riku!aOKCKSgq-mOs&6*b-clb*N#L?_#oIsxN0@ zE~9K3G{gY&?%HR|!am&;1QZ-Jrx@O!`tBr^Pr@KmDj!B{Bq(-{+@`G? zpDP$YAS?A8XDOoS$xKK)`9>-3v^~DOvy1C2-)E3Ce>i3E-t1V~oSlC3Ta6*Tzt;Rg zj7>d}b+=GAl8Ct2Btx_lasI=yr_){XGz&p)y|ExZS}FMgx=i9hGeV+$)rbV;9&xKa z=_#3e&Lh8;n5fW{yFIN*`hj~7b$51?IreW3ZSYf|%>0&85c`p?@4r(ScqrnuU~_^C z0Ta}h*NUbu!I2e_5I31N&Pe5ye}8XGugsvf-QEMr@Nc*Fe2yB@zH1WecP&leZ{M?S zPlC^6RTppf2<{(L$)=Uvyb+kO3dNg1AU&Vl{KK^W=uf>vtgkZ%o9n}#KVTf?!C7D3 zt7DwXtFYtEAlr6*Cw8m(e^@{gw)e*-_p>nOSOW$JBiehmgh~~FGl!29EcWD5AX5ZO zy5%&C^7D9orMOW~jKD?i=E2OSbB~;OeD7VufGH37ocTvJLYlXt;JmNI8Gb#vPZ#A@ zG6Mt$n3xbh_=5d{qdDs2hyYMPufGze%;BP~nK+NUpO2nm?&5WJzVkhN9fpzi=r;xP zUF?gyl#pM>CBflGV?c+*GUcbzm6^PU_1nt3=3=E(67$o;Iqhwl)~O$75($=z*OK?h zH5W3pjy79_na^{t(36ww&-{-oR~}Zb^35}@^4A9v53Rq%?bYS2(5uwzPzs+ z?;=Gf-9O2w zi!Wb(;+z|i+Bfete|yl>PN|kio*VoUi_3vX8M|08LT1|Y7g9+b+F{F_AeQ{UFLu30 zEe;wbry37dvomM8{p6HJd5{CtTI2qJs^1P>YR0_#j-#EYpGq)#d-I1^;y#AGy_wu6+F$grPp)=U9}*XmxfY7lIYSqkYA$Q? z8aeWrBfD|}3z%GxcFCke|2aV-Rea8prAj3hQJq9HnIdUtqhZRCIj@C08IL#75gN)Tq+m%xPqF`T z;Ut#xm30d}2{ydrCr7(mn#|?cU`FnHxxC!AW@Ph=LTga+hasPr6(o*UootqPo7nfV zx%ZIDGV3V)g@bX1$>5y)$@!c+t;HSLbNk!jdlo;L#vk0DV_rpzfg(dqIy^L7$G?#i(%T_eOhdM>on z7!EhYw!~a^BoFOpZr}$&6TMaJWV-iiS{6@9&*#aizM-NQ9h|uOLaxBuOrbK>NaSW$ zyg#+OG0#jhGUk>mRUQ3HQd+AU`Z>cKHHGm%u|M6KRuB0;EMmiIalF4?&PQQgRCSe^I$ zsE;iJ`{LE~;>7xASjtm;kl^IAF}A%Z`nD}{C(b;TpaQD7_de6nu=gY`r1%pf2-)Tz zp~Mi#%Fkdo6uh2bVjq5?ih7O&p9wRcN&(HSq|GF15c);E-bu<6I5?=dFN!~UmR5uCx3|Ms0X=~HAGv>Hy^mIYmNrBv0SBRt?e;}-i*ug4)in*LU_qr zd4{R(yLl0D)gq`F^nI3I#(}ao(Qnz4xc6jf`1>+XdQ0SJ#xT1&Jkc#dKd7kFb(J(K zGqbzfqe%)bQK@CLiF>G%Fl8JE4 zC-!88MHe}rd!BEE?L?*|jJK`)cUcKqinhm2pz@a^E^a1yuruij8YK4W@h#NVOa4*H zk|~Lc3fZP<`}W1mkq_D%`17Qy%s+Y_x;J!E5^@~ciE~IUDX!{;d3zk!vu%V79`?Ej z-{aSVt_G20?4iOfsnYeCXhu1pqlUbi?0qYBY+7QZ z$X*(_Ng5WZ>Fwr_KFRSH8e4)@c><&;eh+1F9>Fs^rEiX5D~r|BycGakw%$uNPWIqGfLPKu;2WXJiduxfoC?59?!j`xPyEXCzhRD zd)`}u$V?Yxp?00>m2-CfEdoR_fFJu(Igbwo222e)g^AvY;i=6Mu|LcZUFDYhG*D@l z;!teY+(@(L01IzKN$$@EQ{ddrP%oEt3(BH!Jf)KQbVz3kZ-FtXLG$SM!0h6(q!NV+ zIA5K%I;QQ_rq2P-4O`u|cG;>-ybpXG=X>+3H!Yux>2o-=>6b*mIkDo=F#gy*Ov!0B z0~^8H#K>yKB&00F`#-Jxcdh*Y}o{NH#0U88%bmOD}`hd9)!QUy}=z|b++z4rX2(k+oZCh)3jzNi| zC&A=zT7y??QiV4c4`J%Ng=!mXWuKBa-Vk%q=%E zDMP*AQGFAg)^az^U79&YFzV?jYW?KZuCITS)6Va9>l^EVlAtMpFgUT=pwZ&fsSIcFs8oBXbTRH7Vfp-MK(1%wNrU zIw0Fodnb^{`I|>v@+u-PI~ktKr_G2|F_i1d)uj}uw-p?1+i!v$bcz3skz34**}hf3 z@`8qW)RosRSwE_zi!{Iet5n!0rtAullUN#6%FGlJKBiwHbx>cBNOEOz=QG(T3CI)s z-+RsLY6jmAnW3D5B*1;@`M(+uDl+!L!~x&Q9keX+%a^r?QcOcSdJGOsYlBb8n8#1Y zRS!BRzzEG=ZBw`(HeLc)kd;nG2MMeT!%*$o7MRg4Vl$IYphm&D9C+J_;`U+2gb8yb z9L;pc98tuN0dh+U2+JD@Dsym@ZE1EDiG1+r%fyz{9fRmoMD*E`Zz*v9%L=|G9{JOy z{WgQ0+wE;oi&T=!5$hle0`9YAi z2Xjg80``Jgc_!VRJ2RG<_q4}7N=C?D1m7t(t5!$z2W_9&9-FGl&S#xj62SqeD)-9{ z*4lu^fr&gC-OitqJW(EN_>U#Cm`APt0`)KU$|4L8l&5 z(Dzp(ky^dB+v}NIq)Bjoa=wpNghzC=-E=PhG3VnYQ@*>w>n`03q~eIOj&xQT-sN)I z3q5dW`a|`Oi`>q`YFT$8h;rze)L)IB!26`)+zIpYat}=;JKw~!+|O=xEO+GAnBA@k zM~JZMRA@P9;)O`>q>#Kt%JsuR?$*c4;n5x&P7E)>toot7^c!~NI0aT+N?$^wGM0Yj`*1{vm}G- zNhppqnz zP;0JiMDIH7+%O@D0E4{7t$d=$HXLm4g4>cv@HnZ2u1u`w5ontWkpQp=^((s1XZ;sy zO7S?+lr(fcl6kJV>_V>qxozY+zeJZ3cCXypoLMeb(>q@t%38yugOt@-J;HTg1T@wQ zwnoWkP#bZ9zH;h8Yr@wFYH@4U;x!T9DqD>F8OLBjB)5b}?O}1Al5=~aZhrqeaj$+> zf>NKcS<9Q+sI2ybv{N3qG2aW7Z^URZ^O9CXC;hL3T1IXu84Xrh7BH)_cA`s^u+&#^ z!`D?vP2NlGc(HZH!nt1VqA5@ZQOyA0<4l~PqD+gEly<%}7uRl|uXOR|AoxeaDsePb z$i~0Q`lvoJ|LWz}eN}9pWh#E1`6H0>T6<*ntb1MwlMyC_7Isqjy$SpQDk)x)*;evX zJ25mHJ)L6A`u$Wn35+oA(&n&o+cmU=at53$nwijAqLz!{?%p1Bk(s}dsn5_77gL@{WZ;(^c>6JU0|8?Y& zrECraOsryJ+RKz`!Rqb7OJlvZPAfmzcJM`5h?@oq^0b|JlAngaXJGUFr~*5M^}Q9% z?k#QFRX-ybJ9Xtol_fW3(59rJ;*otkBm!%5T#`m{qf+o&X*I~2;DH6F;p-B1ZaLSE z-HtU~!MZqmg4j;>;m*|!1W;0aO>|@twwL}<>j@&(jhHQerOJ~UGRS3Thhhzt^zTjP zW+d7N?eP-iVUrueSY^W#nNsrR3g4-uuM`a@-=!20xlDIyoaOi$?v;55p}-2z&|+T3 zqp8ZMm3|*;&6@AIB@NLcqiXvV@s@8BPIo)rkBa`cZ3M0+&ZaDjof8|uB*Y;zU!Bswjrl0#h75es`#oeNvKdEP;5 z<0#=#+nO6^p}cB5DVn!L0ParGiD+5lEj}=WM(#>d`bN1sIU=ti`Gr$}-PPPToTMb5 z!OS4pC7}FX4%5lfaXV|PKHnYx;kI5;9p1GurOL0ml8^4amMOI#DL$rvH3dx|+I2rt zBj8rE`$++rV1xh=*vUr7I_5HcDOAp!Q1VH(I%$(1L2r906^&+)bCx2B7Rxx7+vvl@ z6Q`MoDV6dR5`Oi!mkVaiR++EaW9_`dZzdx-!!GN8X}Us)HSKIlT~DN-FZ)bAd{jHxVWH^Tkoyw7oj* z{6Sl=X2=F9c^5&K<0kr^n|)en`!0k&m(nmL0r@D+;bb}!Lsin3svuFbv03b<2wz4l2i&Pi_8rZquUBw2oCcb>eT>a|1{U}v70Gs0t18y*G=EuNQFub6W^ z4EqLfZ1A@t1o3?6XkgU<4#7TlZCn$)Y zd@RAvAaPfbH#A-Az?nSbYW^ilBN6PCc2X{+^2w=5{q?+rZLo4q+sHYgdcQjz6pOO6 zb;Ka;WVOl>uw1IMcF;$hXeT6DC&|)XpW32OIwx`VCVvTCCOoVp6ON6TPCjscQfeN0 zyY`D|x59mzdQNDoi3@s zGE$~)By^0+a(q&CPe^kK+dExF^~zkCG9fSLH3|6(2ukAV<}7bcU~)hL`g{hzqdY$M z&G?RW^=9Ed$Bu4Yx86pSH9_opbJ+K`umI)3{t;X%{)Vjdoi-8kL2ZJJoX$?0*;63- zHeKJf*cNz!Dk>3I@Vje6Hq$1=vnooSpq0+*`L)BcqN7f4S%rO5DO+_~y0k-cxl=7X zIaqn2v{7z;XbtM_31$51%W1`pu)n!2%;z|%GEE?yF`*&l(RYd;>yJA(+rLnt=#1t3 z+%;utIX|Br9Q&?JA4b07$uT=wYUYNVAdOJVq>|{RG&-p)7W^xX6sn-$TUdE1qE zk)T{6|9e3$ z^tnrm<3r{r6>I$uU0;x2^aN0iw}9gg{18cdbs*6mdod^f*n5{{U6SNFuVf@d14;2B zQIrN6^+XdkEaQ?9nb1t8fd+a8nngxLc9&RPr>v>~Ui3J65j~o|&-bY!Q95X7Rv5Ga z-3?Tqv-kgJMz}9`U%uAESLS<5g>O0>r5;8qjkMzk?oRv}Re6r*3husSd4l~E1l$~2 z$)6#L5(_Ed%yp8E7rBuL%?m!3>Tyy8%cGdpt$#H|<0)LZ-SMZ0B{^_g!N)4A=_qsR z6~=q!Hyj{z+YSV%>y&O|c6gH05an{uSYeq#B-x$EryW6YSJ&T2&b_n5pCv!TRV>Sz z&bK9n?bub71u54_m$TcB`e>YIJ3Ec2O$AdEVMC)PKgp$}xjUkq5Q6y&3?XZt&Twj= zrq#kXCQ&<4T@oAQ8cIM}@@ispZU)P?Des_4hpYeK2IUO&F4mOHyu2vvAHZ6#%MQ^I zJPm-OGIDML%0}ML^khkrmP`2IqQNh*wZz+y<B+vX(2 z>%cEpo#g=dj;{7<@E5p@Bzo?fBB8PuHqo1sY7gCGsZK`MVaVaxAuo3l-;S}kDz{B3 zEqqBnq-rfvRf1okHMMTtZd8qYir%_gj<;nYa1czAYv#*t4cZ#)dd_fV{z!Z3pXpB zD_F)w`N=2h2=2TM%K9Pjd<@RIi-PX7kvXbfzWS_yb^zU{WFHj|$&!a_u7*a(Lbv~_ z3I~`pa(-39KIO641EbcHL+{Eyx70%GnR+Rfkdo6Odn+yr1l+PHv~lF19NC+$klM>fHsV8n1^vN2;PcFDj|UvFQ4-^Q2V@tY)G|m6|FDSl~eG~XvJK&Pvjxh)i-ijn~>fcJ7_%sg%kUmsQz70sXdAreZ6_HL_xMm4xjBu}5rAgR0`O zFjM^7r0g|*tvMaT@W{K)7tJ+AzQ<9_aelf>V^wva-3a3G#G(pu{!yV_0=l29@D6!9 zL?My4A6Aie4LB%xWtB@UrF?fXmDKn4<{Q1X7M!V3zZV-sZYpc4R%%+Vmk=wprByV( zg>wS;`-r_?{=PViy4D-xD4qIAqms_m?z*9^ss{7Tg}>F^yB`j2x{X z>mnOb9(M<~)jckNdeU!@q&%fTS~sx$Gu%QHI#h>&3B1NZq=Dt z?1DJASMvu*qR<;*hm6Vh4!&bjo8SSNXfNyP{0hPB$bL#I=&=l{rC71@R1ts+bbqko z2Vs`)7PwAT@Jp~Ne~;jD$Y7zEeQn!j#}enH`cl&;d6kQ+2O%Y=zqYHP>exNhZxR&` zg@Yyc>vWWe;fa2;lMn~)Ri-92P;^hX_mEusHPI&xpv zTInkGwJ%MkO7x)592y?yvt?`wjwRhvs;Q{f6aY-7&t`91Ebp%4Yl}efuX&$Md7|yU z7AZmf2TDEeqrAivO9eU{oGE5#S1($esL?RElW+g9Kf8GE#KqCiz((gmG|sO5Q+#t2 zi;P3cLT9b-)Dn-1Qir`7V*DCwKPvTh!Q*&s!0Ria_bQi1{gjdIODAq-cH@!~p5rtQ z^+|cxM#qN(%7ai&a;d_R?mjevBd$Mcun^dlZsGIVr)n;Cm>Zf>NN>-vasn!7udW7) zyix~(z{1C{H>dvIIahzVOWf#jUZgwMk#^1me#wk}F^Cy=-V6^0yYB&9IoLQFz^LkiPP^jI0xZ4QSB0{K>JUPJWlb~Fb+aem&LfLbZw5?Dvuo^{w#3l1lU+RW)A?cM6mpY|()Mu6m?#_0N$w?(y_7C|%ZK>E)X#zVa&|it zRP_fho-FEz7^@mhsHUcjs#jlYEq)&rV-zv8cG0heYy?8-dQB8XuumPYof~QP^EwQd zuWT7IpX!^C!K~9kj6`Hcw$}{>r&OA^zx*NqyI$YX*(TU2T29^Y02TIj+x~V=sy@b{ zgc#L2d7y?^k}IS+i1-p;2oiF_B^Ms5Ld@;bn<9rK=yPo|rSdkl7SoB%+FRXbP1r)b zOJ@pR!mAtP#o>SDtlzPHN~+|nlKIx@?tF1*72*`H1Y!WU3h$l|AjF!)k)$9!*j$?m z9WjV&vUX&BP9hcIL_ghIys2kJsRmKIRaMs8hbr8uYs7H@1jPAzq-;s2DX6J#=if>L zRl-sS>*$g~bOqk@STogt_Ei%uXP1VDj$ZEB3Rxs$b{$BH>Y1l~-f2yJgOQa#dnBAc zPYB=W*!(E%I5b9fj4V%#ta`YP1MYFNU2aV^YQOfq$qxFX);MRBcty(qiVYsF8;BpP z-n#OtYjh5ES=(GA_I7N%+_B*2QIw^7+VklxzK{|Y z9NROdccx~WpAr*~!_K`V^x@7Gr_MDMd5FF0vPSUlx=x53q*Hyn^pIR1@OIvA zVDSpHUeYv5eSY0=F7>wUr-W1mfC4Q{7wttV=mEm2=5@d~)4wgWbiomBB`E&||ra_r#L5hD)JBJe1>ubMWW?n5lY zqGja8g_%<6f!=TECM*x7v*@Oj+0}; z@hVOSHSKgzBrO_{IOoTr3McSZqL%N&(Z1yDk&3AOr=w6eHNmk>rKMQ&OG=>L2M2=B zY7ZdGTyp}TdoJOMdstp^Y#S~LtE@H-T{cVhyHnG99bQf=Rgnc9C9D495(&pE)kg=p zcj^D)z`ZD})PhpYU*MgY&_dBU#7B!*_nyL|?rfTw~U8rg*^)AU)ynxm< z#+af2%BoUBIIEt=qdrs`nyc%2FOlNaD|Gta9({}fK10+iVUh|W1f?H^g%;oP)N@!< zh{IYn=`}4}*SI7W&kl`E{ha5;=L(?)V13OB^$FrLVdDV)9g|{A|E3k3IX6K$!9_>y z+x^a`zI=nzB9h`tV+cnT1PC(V-T> z5e#$U8;Y`zQSMS0lUTuJA#tiDc`7Im#Bsjygd`<-b#W|p9CFj4NDQ(2+B}^k!fb~{ z|ANOsuWH>*u`7xj)fn8}ERI@9smJ& z@y3Xshstk4yjbfVrEn4{P!G30KxLACc`V_lDA|f!6V}=@*x)22a-gR4j$p$>Q|5r+ z(CT+kLMAyU_R%KQGu8a$y(l09hAfk`L%tju5Ke7GC!bWQdDknQzi`oScdCM}qj(Qk zlLH$x%XP)x6e%+~!aX(2v*J#mJ>W6;wh^^&{alM89Qq8L>Vn&MBW9V5+}0u7lBP(> z93Qc1m`-E>>@I3oX$}ZLxK+(|II7i~+Gk3?lV@#lwA~3|X&R!=m2AZV0hB)2>$Wk& z)!UDQ>*UOpvqjxXwc)r&t?OF?*47xxc7|=n*A_;2xwk`Lx(tZgaBQNZ`zUg>RAd4} ze0Ug34>(Ks4R6YWd%Ci0*r*gBPJRJ8w*1w(ChDs6`cQ7`)#?W3(VBb6RFOnRbnpW;S2_-u4wzGKY@l6I$GmxZ5N}pU-;RJx zYsNdL4o06+m8EEM#(*zwOr%nMT8l$dU#TZ)Tkc{Yt-1! znKnmO^9N7+NPzK@?%|mA8UWu{p$yFylnbyXX{v&QIyEA&Uzv6Vh+&-kEOhg~c@lY6yYBX~f89`e*7&-Tm zVk}+UjvEmOd_4o&5ci%($q!R`zhZ92B?hg9rSQ94Q)-UPl2nI&)~rLI5`y*udzi7RBy>rx4GbeH1oE- z1qoW?Bk`H3}1rzAaofXx64lKBv6Gb7l5{hK>Sp-Pq}PL<$F@M0cPCyt8?m)wzS}? zvhQU5E{)7Ye+jscZA(1(8JlWJohP ztkNBABui62cv?;yrrH*Y z!^IXO=*{(Z(zIPIsn&=6NIMfliv@=#mlmBK{VetCoyxW=c901td+6m^I0vUcvWnkM z4(3uTq)0gC>qZ0E*81s)pEKYdJP5({;Hqt@OC`J%ZV^AMzLv^_Y9e=%lA=W*M}t=q zeI-{MRCplyZZ!awo|-wou~7RaS3}-1bOY`~fA+mcjLq-EmLH6^8R@8Dx3V zffoeICzUY|ievk_cn3VOn{}z9eg&mI?}7sdsa?oQWG6AG|4HiRZ98Ttp#{%t4G}DMx5>$$W~ISMJY@J3aOZj$DiQ% zA1b5^C<)tljnUBc$WBQ>&LZ>u9jV^i=w$2MKG}I|Oz!Y^kk?%?zN<6#sw{axmRlH_ zwPt&qQ>&k#KMNOG&cs#}AM`jt3e`QOc91I%t?f7|P6K7>1VhDv>!VH0n36B=rdjdR z$+HC3R20E;6P;qQ*mrGR9d!J%WwQCj&%I3OpnE9GohDtVTE+<&WCgN9D9EULQtPh)8KZ2C_v&8~! zbNSs(HV{Trv7QXpO^syz{7RK`2Q^6iS`In(iUm!|n1=^~N%9VBq=_NoOf`+~k>q8LI%Ksb!|7uSQ^; zMQ)h%@sm@TTt9gZ{SqVtQ4&Zl1RA;=st5`hkQ2}UR~3oZU{mRA$$YwO-|io5ovEdg zs4EUsa^uz)(TY-Z&E|#_ehDi?n<1y2QlbbKx!@`X-)A;|?VOckAqi`WYbmXR9r?Pb zw$^W3X_L}arKT)n>{c9gNRi<2HIe@lefL*PBV^&=Di#R>=JMMtIRIDYJwV#jR+3|* z;=2t84#jle-rq%GtR595lD%r~PRY8gGz+q=Tt1~KcOB4eJCs|#l!MwTB#@L{_qkmG z_D0ADdhHNvDX9cH#hrZquDhYDdsT zL~-{B=+X;{Bvpmn5~VmO#5cW8*MpBxQ*({fk#n_9a0mHvk6DW#o7roHV{16^GY+5j=>oP3D;J3;e+c9}j^e=h+y+P94wd@* za>w$N#l+F{qJ*pcA+dM|JH%P&0A%t2GH^PQ;V zR6ImKUq#LcS3Hh`0>RD(1+z9WjavVBldfUb74C!iBFJzgJB?GqN%)cR^2!h7s_-%H zI~JQAnYN_SGk;Ekd*3fW)WP{IVJ{{D*jMbpo6LxX}B15HO=gN4_YkhZtF#mwM89Rv-VxZ<~vpPq4_WOQT5eJzF}6((w>8h ze?{g^pRZKRB1ei7HL7!C`HodhS^~||xGqVj^%eDz8mGW&fK5;e5gvBwq7b2gMF>xg)v_9P3^qTbo0zt*ebr97`l|6U=UxFMtl&;$%LgrV_(D-EZB?nJxwj8LI;-Zo(jp z- zuq8{$)4s71-MRKUxD@>^RST_M$uYhxAMfUWdwyLlePq${?oQ)b;+)BEz7%SfmPsa& zx1!mpi}kZRo+wH=?4&AZOzz7NK-_M_gtqNdM5aWw?3N3u!+Uth8XTl74Z5Y8ziLKg zgM#<|)Q(JuzA2tATV+FYy`buBrQ+qFOkEZ$aR^|>gshVt7* zfth@Be_dL@-4=eR51O8#pCbxAK#=yn{A zOkZh1q??zp-4ccDB4HDSho8-@LhBMht*%A>I{R*>DF9%i0Pc=wL;E199z}IyOMru! z3Ei$UDq5)M8`aj(%9c;?x_R$%3;DQfobp!5+8}K`2lW+o67EPQgoS%|xsoRYc34|a zXEKG|*Cv%x0}$aMXCOJ^FYXx;x1AMst9(r-ZIES`Hi2c+4W6VinGG_Y=~7G9v#&ks zYs;1bK%Jssno=gp;dIdHGx1@#0m}Z*0SPI{{#Ht`8 zieT>$zxB{YAvYavIf`oBa%*|)tA`8E(5Kw#i0^=h=rou=t+JndUvAwXT^XQnEoPR| zj3h@FG)OA$6+YVEIKQafK`^IHq0FULuTyEQ?iBuYbG51D2hbkmik&4SbA+kR^br}F zZ)lw8N#iDm4su{kFYoT&SmNQW9Xa5q}gU4>N4^ zSY}J&xujHWPv>oWQlavuXV^aTqp!7MNU{Av*pk8RzNYRv>Ix|x_uO)=x~7DeuC@-h zQ$$B8wjo0D9*_E66i!)nJF?Y~1~jWtS|PQ|Es;7z!N`4G#jmc#sokl;9S_#fzPO_+meEfV z3g^Wp(3Zb+ohqMZM`r;u`MNUeUlX)VN7omY?CYF$ejtgh5n{lXhIo_?K|Gb|=Pm}x z(`_rxI**6iQ-|nnCqZkeM>!lo(GSb1#Df!+X<~))kj^m5;Vo1lEHB zVrngKu+@f2g}R~L;?%mrG}YX6*HX+xqrvH=L8HeyVFzcZeU@<}0qZ z5v-*LUi=h7w^BWN7apn@EiWMWoPSgV=Q>WgoJ=j-y}BIE5BSQf1Z4mhxu>W0bktE) zO;epTkDK)!DKCN0pL{96%kytFU7uHiWuNZzb&3CQ&D%wQ87nblmlpnhbt$ma$ttn~ z18%!MM-9fKjHaJEA@;WTYVQ8>5SOAzm;OzDLH^l$>3Y#mml2<3?^975z`c>^)Dr7# z@p|U1=szKu$H4!|5qVx&qpH8Qc+|;BPmaO8+i>T<`G5Y&Z~nXa>D%@7k6(ZKc6{@H ze469OPv8IWKRde9GqOyZj%qSr(z!2JqXrO{l=41`9Pkh{witsZZp^JfiH6SE;+=!#sC28BWAEf%zih1WCx%d?nTp~0{pSYgKe}!(;cAlIrfZ%Fd z`$(|94H%vo;V=OVZbx~d|cZZ0c&c`iBIQ!gfMPm3^C&km|}&Y1v%W37g| zPOdtoDifv5rc@$n%ZjUp^oyzwLo}+wde+RGTMh6d66)t;nKf-6Rpq(!_d!fy4ci7)CZ+oEJgT6^5dPyUp04PJNv}%lym%*-SDz>UI7_i{ zXZR)tamC(f(LYwm#Q$q4Cp9OzN5ADPtxVICDf>y62fcTzI72evZOuep@l@TT4O#HK zH-L;O#)!lr2J^UKqWY*tFVhuo`Msda#;5MY|NH$Qzg<>UE>~##{(>&M^Ijfev?sTC zJSz|fhAgLEU{&FCeg2-~a6$bJcY&)r&ah({Zd=_AFD;14@sDJFE)hp_5E1y9vPA%} z!8ZD}slor|pZ?}wtgn9<&o_JhDRKNMar`N9{B4QjPf`0%QTy*r)cz;G`DdTL`+)oZ z>tB8S&5D>^-JGF1AvO=4C=b;L(uZUbweQgJcMkWm@}ZQO;$F8NXR%gD)m*7HPOb$X zO$l7L3J3^S=GNpw+_5T?bInyHg1SJWq>3#MHSS{W?h$Uj1a}#;+FMc`?)y+A!%??N zGq(*0=TS-*6%Bdsy;M5pdA&-`Jd{fcQr=n#P8)UP0iN~@57DORqHZb6<%In)tSIjC zeJJcqD`AdqSD~42@Tj!6l%OI|yi=2@SB?+|B1A`QWuF{C1!c0f-EPiZo51@hy)y3P zOo8NJDB$QjBbBi+!GK#f`NsWC9m{OLIpHXVZx1$?#&BNWNy!@|u< zv-G4TI??2iibZJAI#SJyQ-YP=ydhX=0O7sgoNuzL1B$CU-dmn{U@!rQqkhUM-|o0_ zI9w*+s}PQ;Z)-cv@vk1O63&+&VQ)7!RmyQkO3MQdDDPZZbv*~2u9?a2Hh?Ztm)F9?6khehw)d2^u<&0j-R>{$> z|GszS%4U9*EMnE4Pe6q+n_Rsw9VL89D^tr8*t+cx?XibW0%=I9c$&lZLgbw{r%oy_ zuwpj#d8T7Sf4yYlb*zvK^fh!l%nrF~ZRt`ciL7(G@vK;Z&YF?Gr@X2-!TX(W&F@kO z=5oo)osCCe^sdqLM{vlD|s|Y2INU5HzF(efH1UEcj;;>$>ZjNd%LB6 zKkvTm)LIXw^HhGH&#I$UvgZ!SyPN`r&24kHTszJdmNt(D1jCO0=r>n%`xUreGt_fV z^|8WTG9RjOh@6C8b%6QK3uLwCqqQ7QBb`ceko~ww{2#8EEj3-`zHyEDXn-%?LduT> zYO7MMpjC96U~#qZfl)C3S07` z?sac>!$Bi@iXTUDgCyyUcx}n|dxfK*C+~E(cq-FBd5c|_b=B>-(OE7g!MJlPZ6PY| zb|*@Y=L}V2Ni)vKB_|q!%bZV6{nC4eqgd1`YlEpT{VfbldSC5x z$``cNX{XUeT;8i>bn2M5Yh`#+Wu0L7EJLpm^`}LX)fQQiu{M$_fo)KwRAahGn@q4B?vc6SU|ZB$a(G0 zeSp>7`AH7AxIr3HX7il(;w~#5sv1t$?20CR63q~ zOgYhBQz-{hriVKJF4fhQrKl4{p0U()>C=}Wt7&%qHziT$#Lol?_)jPez{ zc*p=yK(D{5cQ;(|hx#Ed&g-Ufc@&?$K#WfhYkCzY2{flz7KGlP9GWsOU|~JZ#xFt$ zaMzf|lam^}H5ybNR`a-9(fsZfLF*)9B~d^k3M3pn7WY-8+<|>VbL!+>Y3oi@=4onS z1mGBtWGe^w;!EGeb3ILk2Q`#LjFRz)Eow(_TAQ_5R+QiYnk&CtLX8Z}Q7AiYx|2ou z`-Cj&g`v`o$sjCQNH0{J+?@O-y#TdTYOf>_kZU1q^HM9H*}09|JGo~~n1%yoqDd#Y zNRTBl6EmH;pS@8rZ52GQG6VH6 z$K_Oua45^_kcRxB3K`Xfbx)T2GC9-Wz1O{;gQ^E)dxjH^gy#GZ1BxpW+=`^^!Y2K? z;?k4yeq7pEGpX`YNW66q_53a^U9#Se94Fo)@la)ct=6xqlr16do*(|-#B8Gx=s4^L zT#-7}>J86j$6i!1WXP!+wZ)@=19&F&!Bvi}l9i!pDl|SgcR6&bxv^CCw>YdQ5hvjCesE#DiV zEGEv1=T>*!58at59AiX$cO^$uy?3jd|Bkq$M88{Q9I`3jW;jyOnEsB-WQKG;8q}X9 zf%{c5wI>DDIoUyP+wPMRm)8vwx$#FXK6Z8WQ_RB!drFX{9WptkNDAi+{k zsaJ&EuCDUb$EmiLmkEzO)WUBZ+4Nls}G~Jr~DyZgI9OeAf1n<13E5|?>GQlnM)JG4xCrC zg`;pvTBvR{F10gaCp0&1U*}eGKP5{`fq8j2GI9YYx_r2`>kj4Z8lr8MzKlCrRX=dR zR=J4G#>bV_|5nNr(T_b90@wi5DTpG8GW4LH>1apg#7 zB5Gjm>N~$uT`+MQKaD(G!j_iXqIDXz*{0NaLqu4vkWD-u1SL>trB2`bSfGN$uNxGL z0L?Rlkssw`R7B!`Qoc2{)4tpks?Hi2U@N)@lv#c>xul$A3V}_52w*W#s0pFqsJ*I~ zyPr}p-M_f09;kktOgrwjH{izb?a~Qw?{=X{3Yp5Sv#y2J z?JNgaJ1d7)WoUbDx4zO!RS!^G7SIHCwC#85QIr&6q@qgu(2)dqcJQ_-7|b9ikdd%_ zb1N3{zql)E8JM*8o!RT0JW***3CL=a#^SL4I#kDeSY;jv2*RxH+SjEXfT2k{cl{ry z-ZM*qZ1)11(iHvRHj)d0t5dhiq!Tu&Wxk21491jNbiG=KP-lXDIPfd%|87Z~6nw<| zhf0Tn5k%Ep9L_3xWJ(W;N-$hBWMhw|sqkNpkcZ*j7ppi0K}icyoHW}!deKOtzqDmP z{eibTI!(d(#Rbv_z=bbB()#a-N)FP)Y)OWP_HLlU9l3p zN-2&;&XccKp6&Xegw!G5^&(2wR9I9#zTM>(JE}9uO`s-|!=I%{*BQoV)E}HvFx5k)WVg{D zk)J2r@JLwv!2|4;lD)}`pL4r9N}ebRM3q!~(1~YvZ>3oH1vOH;4}z;(IQ>J?g!j=n z8ZVXQHlW;RY{yX>5z^I5HbH|wE~9dbjXY5Cq98oO7KC3%I7v>l9O?1@@)r~gbNQ!Q zley9lEOK#S23PmANlyJiUiDJmRTlw!c&Y{X&?Y6=_MNDb$Ul3%Swu-)J|{R(M+iGe z0tn%y)>6{`-H17K(Hj0Jpu+LNaCaLsG$OjBZ51Y414^cF{0?#P>FDu2y0)ZBzP~Cs zbG<6DxAD)2iqbdr$Ca;G9GxnIqP?QF%PFhSORke|2wt_D%g2<{{OmB4d-QkePN#;h z7whe=QOh&f(PbgQDSZY?ev@@!Q=`O@BPdHDs{?wQ`&k^^ zB-p%MX(KsSvX)+cfdVye%rmoVpF;X}>_ zf7Zpmo9cy-#<$K9+dx;kTXX9@w~}s^3FJj)qs!xNl_m(w)%~!;q$oP%C#$1LTC#It zfKLfH*%eia>1nz?R2%eLs186%_}z2G^<^g~09e&_*cy<|*mZet`SOXx#4#2#9$A&= z-MCIF^_3Np667Hu#Q}6VB>KI4-tMXp-#N=Sk@0-QLgv1<6v*oZWGK?Pmw#)k({qI= zUM(&L6qWvt(1(6>Mmwlw*F6qryVOzkfCwit`A;Qm9#sX&azK~ls;Rn2y{H|J-+I)csc?A8Dx|);14IMz}O7V`(SXXTX*xZ%P8Oy)B;| z4}-%B%41o38c6I{Ib@x)ftC(f&(|W)PDrw1B*GQqrd!HsgIo;{^HntP8e09np+yG< zp-zZ&cMuY!QRpoBI5{9NA9l76o12#s@t1`-?l>25~nCInvKw>f(F}NNG4ktQsfA`e8xTHi-N&&$c}JUw;uucXVvL81i_3e zuhWfXu5$jmwox*?FJ+>Rlf^$cJ7If)bh2VqMcIRtajwdZ3iXCTF?I>HJI|o}~44xMxzs zO;Px(2gB9dfIye=(e-H{ zODVPksJtB7Zt$)Q3~mOM5HC1sD`w6QBh(k5sQ6b6bqe9=^-x!|#<$;xTHA*!>7py{ z4tZ|gK=$lZX6d}_K}y;oPP?F?a>{2ar@Z&9-vhrN6h=nWv$jm9;Z<=LV&n%oC#wPl zK%-VuAuf!WRjLMPH(Pl`-XeTIPnXOzBXUJ_-XDU}W2h(>%P&OvCpI-XEnGm2jACm% zYSOOit^$`!?lmx{xg^esxpFzGnh@34lJj%&|10asPtH1na+?n`VR9a&o{6IS{5gQm z$BqYINAYlyxbNcDgM;sxUFA^qY->HEA(=GpL;nKu^qnYRDzWF7a#$|+8u^H-NZcwP za)UI2pq>J9+mYqDohp8S?ryays(nXZKQD{ST9)>_Jkb3NK9t=K$=0`}(Ih`A z73^9Y->NSzS$IK(u2G6_?fW^OBBa%~l*BWSpahu5Zdb5R9Zsx!DmB$uy57ZV!Q@mC z-Srw#DN7M43k^yIaH-PI3J{#5JsKDSgmj2Ew~r8Vv+x9)@XDP=`$%+{k;M!&*C+hY zU{&$ETeY%BZu4wLO-0_{6={kr@=A7}ms_mUAFo<#;}H*Q{Noa^JJ>reuezHiUG#do zN&&jd)Eb?dvVbHd|7%HE?Jl`^Q|fh7;Q6KacdZfb9lCtevDpeaJhI=EX$|Ob>&!tx zdzlMmX2IgXA`Ja<2q{!{>4%UY~C5_>9rZB6hg! z$DJe3>SuY!;#iJM`4Dw>QDE=zpWm_A;}FL4#=n5~1)$gTjH7x5{BdiVZVl=M+x(%N zQw`D`a!^jS|F50*tEPN*ORc%d$8lCDSySNXdCOr9&RKEuwyJ{Kx(7!hl&i;`d@Y?+ z*L%ub$~#fUUy9b>Ti_;Q6zAx7M4SXTfB=r@HB|suB@u(os1KXkiwd<-N0x1K=^_Y_ zY$YdE_q{{qt!adkvJF#Ey_$}zs?0+8cCSWFjLdteD!SyU$Bul9p@?I4aV+^9Q`KWU z@B*J;b;sGxp1DRt+CUv{BJNAJaqAB6d5b4E<2avCGPf_NcOA*i9V+gaE{Onv)@{E` zjZH~byes=JQ#Z~x>*dHpDzT0>o&Vnv7xe73X9Uo3-;kect6ek0OQpbjY=!)UFT~fTAl#4AkmK;Dpu4b0{kSudioei-S)7$QiPYLtVy0^0nxgk61oA23gdl- zYn0xb08YYTSr0ZQUR#V0@8u3NH$dVY@^H#}@Pvl$GfAwLx{4BKsKL)IkBv`xC{=$? z8*rRC%RFuS#7(Dy$CNV;1ElYqR=(YS%TlX>xB{@Z+uH~s(l&VlLwyAoVAWC75o}wh zDg8I>)$$j0Kc!H*J0(;G(c~e9BTidAOpp}dSQZ~|Jt?bgx|n}I7`fypN3*2q>h7$) zw!=N@H;Wa)kHnS%EaY$IQLfu%&Fb_~4>WC4oBu_FS!C8`)_=F!#7n{KrVRSFg|Efvayr6e4fx8@2VnBr&h+>yt+(al6QsGlg#Tx|78Es{kDlWwZ}V?7~$V zdTo*m-k4dZs&EA*Q*$wzAftAw1Mg#~#xhel8M{05D(0>Pk}i~7Yu>`EEgt|xkfJV8 zmlt{Yb!M|?NkH11!b)^X>PZud$z{kS; z$KBLCY_v!dQLu|E_o2S_*rQW$A%+3#zJ-X7N1<0myP6yRsz`JhEBq`{c~|;EZS(yq zlBAJ^eH+QsWF0H~$DG`@N*&eRGa@Wdk?$mNgCDzjp{fKOd&p_gJ)Ku;)6Xgtup!DAs)aJpGKuk)4GmR zl6X`kddDTpjufH$2T9DQ;51h6^HVKj;u!~y+GYt%`K-z@P|nZ8a-OKIFooZrA4xH8 zsh^c*P`X}M7>fmEe-^<+q2&T#xQA+Y5lK`Xb5YI(R7ubLM5`&FBllf`6p#d9C|w@- zMA;xe*a01Y!#q~Yd6Ga*g;Gy))N$TGwX7Wghs_ko%^-sgvHPhksN7XYD2J85a>CjD zYw6MoNDUn-JXzII-=G4ctQ`rOlx{ z1v?+uaci0GR)$1k&#Bg5L@6$vV=S$2r?-G0RGTytxj&6t(Hyl9tVa#g-N$9mre2xr zQy^tGK)FIH$5Ly!FEFBV z-Up*)_uZnpfAke4Sk^7Z;#_F6+Fy!tUaNT8pezJ?c{)>u0pLw{BXuf0jv6vO zJq&L32kGD{7x1U9ucRUkG!*dIE@xN5>}zE`sVlo1DTmq#pqJ_PnH_6oNBCe{I!dAf zsEeaUio2Y;tHMrF9b2#Fq`1Dvu^5(uz@Sbk@1DnT%HV5Knj`@nQiry>G4-+K$|q40 zs#tgyUXTmJQavdrsePy5qASG-$h@a2`1UX#$p(N#PLJ&kVlZIHiY#_l)MC1M`jb(`3A^5f`hb;1>s}q0PWBSt`)8DT>ravvf z{%Mu!@6jq1utd!aWo(wdKaN%RK8@45FPrQozf+-cl4T)+RIQyfLZ)B`RR?j)u?=tX z)^CMGx*y}E#1Pq$1PF=gkAiJkaSpB+87=XSd=bF0#)&&GJ1D`Izvi2*rcO|~Qd%Ne z_3X~XbG$hnNs7GAe^in#yllB(6khzu!+9k4UIvV&C0zI`1a)p6a>nfzX`LvBCU=9EP0?yORuV}4uz4kavA!RTlOpcvADCq=GSelQv>6yg$2J( z#<1#g$yFY5_Z3n*hJ>a6j;=*hDbi5nyB~st!ddb7FKQ0|)l4c<~f`E#R3q{>6 z-Xmonr&-Mu&V+94@(M3`EooYy={%&VY2k! z?|wAhq4>MQCy2+?_*K^qBb*qC0IB*_t|0H&x4Q;k&s3DP9X%a)YNOba({@l3RY*~K z?Nq{!V?t#muTmvnJ2c$<@p+hE9hB-f!a*uLn!w-{MkU+K1SWP(S72 z0oJ7uoiibgmw9d!Et!)slLE)h3$;(F*EQ-1r-j^zTVt0=S;aNoa*i|^(D?+cC844c z1tfB(@F3|fAw7yc$Bnpn7w4d~omq8YvDj974e;Xr1%-0Bo^ztBznAbJ$9aect=^Pv z=dW|^Bqyq9*|pd8NO7*Vl*90=EEfT_Q{Zw_9h?s@-S9?mTwErT86l;Y0}kepP|x|( z<2y@wB<+xmlfsj!O|2j+mnRk59lSX{$x`8W$+A4Di%B;?*E3ZL;=`4KtfH*SscwBJ z$0C0iWFEym_m00M;Y@8OEhsr~9FIfi+!UgAxsrxB;4(ZM%efGBsX^Y-;2nv}_|PHbFL*-rh7tj$e*gYX)WKnmh=pmQgHPL54 z?aHC=&~e3Gq-=QgWxX5*@Nyn~>9x7lXMOU@`HiQmK~k``?y{3y4ZsOyI8eaWQRY&k zG^kZeMbOVodjsnkP9SH<4bKN`QTa<0_b-3n=cRl5%ZD3=xydc#Q)!`mxC*K9C_lR? z4X)0k05OlpQi=4=QKYhWr0SsEqJ7$fwk7sxu_WP@3$RFL4fNP9(zQ_1FQ;y?TS2vJ zxdAYmJIGyj+zF^;1|1!4^&d6hr3zU3EjT3-n4C7v2Z+FAVlO0|KEMSZl*_H$(^A}P z*(yB*=mgiLbzDBA<59wCGOVBY)dccOr*aA|2@gA5l3YXyFsE5nyTjJDatsxPCnU|J zY-)drvRX6{Ih z?Ym_P2mtcZOQqWmqsSyv%%*s(y}w6huYH}Rz6mH+M>7H6a`;N7qx>R# z4-Vy>+?0JowN*C^Zrg5|Vu6jWaii>uoN=@p!~Kr8x#_ ztt+P%i><`u$C1V4RUN@g6C`uUyswX|XwH#36+a((*_I?>iDM)HOkou7H4~8)ZmysY zC5P9DPFdn^rxMpK`#g`3P9x>r;tfgyUjzWZ2dU&Bw5hW<$-@&QEY%BKps$?Z5j;#i zr(U7`>aeFhUiIi#(r3GFeNa9m1C_IH$v`Hx$<-K&cxkaJD-uNIvDmD%fZHEufj?qa z;|$7Lev0-Pa%F&*H!zrzz%)hlprAV`eeBvW0ve_k95nwLvHW1`B1P>sOoNiYeYB&WtH{i`ks#DJT ztWu-+Hnx6&cS;6OOS^Fea3>Hu4UuvIQWe8cvQzWycx*d1xi{k0HUN!&bFltJkR#KQRbt|+W zvue9ga|L|udK8>eL+;bP(?_@9JeReO(s-je?ck#Wsmm?NM!8TTD&dS$Srd*$$?y*A zHev#J)?V1H?&Nle3{)V`Um@JvA1^QoG3#(WCm}haW0*!OUO&NxwL5;`Yq_qZM@&|S z9zfq?pQ~ubwcQ)!UffAHF-@telZK~RZoZ0+dUNGqQC9QZTs*LUc4rVOpD}B?#@9|K zDa2&$uxEkJZkL-XrAB!|PdkIjWeICaa!PSI6KFv*)6vvimM1o|92wb#wjp)oCK0^4 zplNA%XaId@MHh=?h%;>6Z>dV40C15`r8au_%ZHM_HZYg2OiIr>WOAR7OWoA6CwEav zZZj!oAUvKm$N(KVxVs57Vj`U+!WeDNUUw+pf)B+_pHcTu4Vhq>7x^z1^#BM7T6nLFd1+ zxt_C-JYc`23C`_C21Ox-jLP(Hu$+3;w?Jk)58YKYT?fF9Zz!*) zor8y?G^{O$5fhwI+`E5*Wu+EU0g2FQA{a-tKldZ;==95;!s32|SDoIwAu%4uwED?^@B{ zI_93mWjZ3mOBYW~Z zH-ISbq|4ROke84e(J^u`aYFvA1DPI zP3)JuM`3=Gd<U_E=>om zhch|%Ok!l;)F|u2yFFRSY^}q}Z8yAJ@>`~U7V5EoQ0|Ce7m#E=hRM$TymfdZ*FQRE z0aU5N9E)YCo>a3y$7+Nh3hwXec9v^R5t^!`y}MtkN%nQJDIkpn1!c83s; z&V@FLvm1d2ulIBXnzQfhh)7B~KOK-rAi59oCUC=clrt;>?*)#F6topbP)jBDrl_lY zKljjFo+3W@>p<@}X}z;uaBMEaOW^BEHtv13(C^)!O@F4cMz+wq+PxRmlbvEUae1_w zn;UHb6mCK2U7^d=p$Q;$Mx?1q`qbz2Zse@)5IM7#HCC> z-_^6`n)+7V`qeUKhlLxzNf$2%PCJyASG3q<0}zz>&eq zB*!~ux)r^rSgKw4FfQOKL7lG#l+opKP_u#1Y{&Cs$yK1M7A+1S;mgoZ{?*tDgzSb$R?8sFka`#q^IrG-CiC9ux z88$|rz$2gy7ll75O<=l--+9L)J&)930$R0eLSla7ERY*Er36>uazn-qJPELmB0;W* zyr1Kh%JK^TpM>Szg^Nc%WIvFpfE4b4EmHZdsV>n0-11yNZxxq$h$Q%>_;VTI?{QrY z8$M>%=CT!P5|cwOd_UiPa)(?B%)C@_w|0!x6{*S{RW1T3>D~#rmMVq3`cm^Nj!bl0 zmlnO*^}lS9R}@m$SZ@RK)@qFiB6E&!HbJWf=RT@F2QfjLN~Jvj%9Rkyao5V`AYvJAMesZ@ z;ts!pxH%gryAU(facW$bwuEB)^CIA@G(RqZyKRfv%H}Fxnb&7s? zoPY39CqVOUDI`GDWMJ(Z+HrD{k^_#%TzOTO=QQfH0lBn!=vf;{b+yDY79(JSyM`^$ zblF3FoyTF#{ZZCR^Hg9;O?)zhUl34y@@aLXqh@yHz_AEr_66Fw90_s7Nnup&MLh4~ zbNVjG?3VLkc4i_wiv&KTitNW zU!GP^`rU_23uV;f`jWA>zZ7OoiFyS=REeVcbSdXi%|&pfRYaBavQ*K!h?~IGp{@h5 z?+prtD>6ev7^Mw3!6lq=th1$AQr(kxHub!1M1J49x$fZGAwbY3nz+D40QG67y!CcV zI>+ci1LWqh8JV=qB$O22A(te(uFr{YAB>(RA5%PXxRWo*a2q+UCzKS(m|^d?x4IOz zIy96b#w%Ju%;Um>Z3w=EsixToc+mi|tzhisDlf4gw@bT%@$;sF)JmRs(mr(DX6gG$ zCi{moWZzbyxvoW^2OTIewRE2nh3&;kof1HZkbJg^El%reKB&&gU|8;ox_BfmuBHM! zIuwxG2xKa|HTf+>g>5_VV;HIx4rBi51`z1#=|_ShfRa7Z3* zD3G+ht1W-tZxCi3NP%KVtgmFQW;d1d#eHonT36O$JAdh_OT7NYYvxxRBvdYy z8jAiI&awKLeB;%K6We>-K9p-D=%F3KELL#=D(U>efsJT{Lj~4{rJ^4{QI~3=f~@w|MiT2@`cy@ zYd_7;uX+CKZ@>DE&;FNR{oAk7SN*HM`0C(a<*Rt(4!DoyMAD5FEgG9LS`<%2pJUhq z0|Y7f0}6BX1>o6DCzmRR)IO)SkP3C}>>N{fQR^hGVB~Kqp57a%#2QX~PNJ9&g0*HQ zq5R^Fb5`4_R!Pjr;GiM=chmX;p-p2`TE-*Ki_I?NZzl1_gnsh z`~9I${DpV^Yd_EbKkxhqC`_!=FBg2f44W^oAWKMcEO{s*V1=0hI}{|(r4UE$H9O@} zu4X-!KQ-HGI*WapM@~m@v6{9=U}kQbz4qhsrV%_JE}yn*zkKJsPwJV6B&&b#L3ws- z==(VNTp9!2Tf;AR69IOvQfWUU*mc*zKDk7ArEf%vn%o1GE{lmBB7xJ6hKfnIzR1HUL;W@Y)j|DS({Y(owp;RdEE)Lqbr-~msh$-zL2~4@@j!>FQ2{Xr%bR0 zsdGggLkwWP`&NAJYpHA5!cXdSfUW7Plj51xX%SPp@3*KFR?A#5>80r@{C5CxZcv_z z34aLOT-VRJdjI(Q{k_Th|J?JZTm28l^Yxb^_pkg2f4as0>ObG&ll$BFSN*udE|Cli zF}0LHa+HfrO+iH)k`|ll1n9$l^-FR;mniY+wp-(;^0YPlyZCjKo<)%f=9DA~1(9f^@tNBm=%Xj{9p>Or-${@+P(KPmU6t3=KvL_gZy!;|+ z*ftKG1YM1Chx*Vi&@Lk-klIaKxkC->is}e8_}mmOd}|6U>&7$(rJzMJL5fngkXh>a zi+BC1w66S{GwFW1$?#a3@#FLljP1v~bZnJHeDa2-%gQ`K9g!#RSP>OBLl)W6Egaz5 z>nd^|9+hWG!Y!&O79MymQ?hj~YCv+j${&5#|NQ57{lnM4`}T`(`qzG(f8#QNp}7)WR}Rh0kOoBp%sKmNFX z_`>`BwIAZ&%**Fr9G~;@B!)?0dMWtZl_&r&fN15R+Oh6a*%tms2lh2mua9omr}~Tf zkh=x7W{V0&!{@46VG>rjqMoG*4cj$DSPFpK>R{>z_;yt&m4yDq%RMILgKH*t<(0*D zLkC1@D;RpJXO6+S{_~;cBCmA3g&6)8F3hXZu&H(y-58y}+h9;-%ck+PN^zRkUYpjo zQzaBzu4z*69{G>H+&}**Qh(_M|Jo1ok7VcT;~rn?s!*77oDNQ7QDJ6gs(A_8X}HmR z%iD3`LW1tjc6ZCI)%&ZLXt#Y{UPV-jYOJR#ac*F**QKcuok$sVNv(2Mf26)S0o3>6 zmvyun8g|o$^fFu7K^b;ESnGh^o}% zneJDm{Gg$4cciOk0T;2=ZHF}7RHA$*IQ)#Tzy0)wujl*eufAQw3hMLA{_lT3zF)r| zKmK<9etiAgKa3ye@4x)wf9=QmH*a?0X6Ja_Pkq<(_IbWXdd2-+zA0$1$XsojUigDl zc4#Cy&Riec3F4Agc3a@Rvd^^$6_e%o>w8QIMJd|2-n!H7bb!{a zI#1qrdNhosB7bFI7qv-V#f@KS&z&5w{*KrEKm7E%zuiCDfcow4_cz~t`Gx=55B3W; zJ$)mp$nP|i;;`p@G`sma)&woN!bUX%WSZ{!R%MP= zrQ>q}A;3Xe1iU-fo@~*(gSA~#buznEnSHACOMc4v-0NPythpS=rQ&+VDwiUzyxEm0 zj^rqG*Y9lw5|Wdpvnov6fG-iSsEXX z8|?c4vfzx!@~^Yzc^dw%*hO0FM%`&Zxn?t5h~o^SRS-ukcoOuz8f zYhbpY-+F$}@)Gn;nNjyFR*AzEQDEaL3W;#2-mZ?F6szZv6zb~9t18QM`~1ykT3oiP zFZa?OS9zD}Xq_*s7aUNk>-?=nHxG9kpp{@C(fu-!AC{ad<@4%>!j$hL|A)L)#bK07 zYv|vu2!|Y*`bvc-e(TpmOq+3QUg}%v$dd9ej!RKPqRO21{x3=K?Wg-k-v8&$ zII+e4TpRg`4fCW|{86736j9fyCCJ{oSpW~`+xQ^-i8gHGKk^WlwbU`2LgPyARN$7p zb}lM7^w2lYq3_z)&c_PINvS%$y+{53bXw9anb*dF8jU+WAxN0IJ~kvdQsbZ)b-HDX z{8|S%_&Afp&F0`CE5@KC=DS{3CufRlk4@_Vul7eR3-i!F3Ho2DI?yD!fBrS)l%R~ME19qs}ALq#i( za^IwX?fZs5Ve)r95WPxYQm`BN|I<7F7eDMjjBkJZdj9tN{mmXf?4K%giZq_-H=lm@ zg%|#7Kg%!N@b($6r_T|d+JKU7ye={7N_dh4V@)z^7DuhG0#7JrIC$V1O*j3|UMppx z>~?Ml#cooq>r&HSBiOCUk?@UX#qU=*w>*(KZ$X;#qC0NrTXD_gdG46+GwkI zeXD!BLOy;;S;Jcv9W*6s z-qU`1*Tzpmbv{*{bPE9xqy?qET7w&|)yX-=$gBRHZ<>1N3vc?@eu`hX(f8kc&*?r6 zg5%+O%r!hvx~V>yRG~$#f^6C9-~cnf9wryFq4*`a=RjO^$z|>ldz&X zROb)3PW@B>Rl2>(KjuQMyZ8G7kN>hTd#^*^TXmWi&r1j29M-h`)_#bftO{Rp;n0Q9 zmH1U@G+lam4*QwwmBE^{)p^fLCDnH;>vg!$l6dm&&jFndB{QoEAzjC@1Rxma&+qvk z{rLUYe?5Np>GSLTpT7Hk|M=tA`}^O1_sw7Z?(1)V`@^U2fBfy&fB267_)_ZrwV&$W zQlXXq{NAP3pGs6H4?*2Om0KkUUb$_8&vt+7;$S_=b@8p9XE>3GGN?UHfRVq zr667NoUZ+ZCKK5=UxTXmq;zbqVXbaM%?Z8cy1$&2Xc>El7U0gOxGZsgkLPfZqydwb zfh0dY%;v+3Qw-t?q0d;-EIKY%ttzQs_p6m#*M-h17?i_NsAsKr>#hka8sh)j3%xY` znD@^G`H%ncyKN)&C!qG{ABFgD|N8t=gY8#-h+jr%$KR~Qfpz_TRA7Ge`hLK@*HF8E zpVj%Aj9Z0At@4zucO5a@W&j0S(mj=h?zs8TbxSW|Qqs;`(xWP3`SM3~AT4Udt4RN9 z+OqfqD%I5VOIF&e=Gky;@9JuCx9J6ZsPV5997lg@cOy|e@5}9(zE(Rm(o6H9q>H7~ z>$8X*&}|0cyq|7IX-F1Ut>EHeQ}&$TdC+-_b(?pbf9sq6N1q}2m%{k3{0M)3&%Z!s zA80(@a+J7QJ|4aG!Ts1_`oGS_Ll+fc6di?^%}4_}W@!++PNLM8`Sr7MNa&(~C9 zbP``v^2)NKIPcD(xtR%_>VrN&cxvzM|20K7Cy41$(t?*>jRdzM+0^et)%$l1%}tgP zSmUR+{Aa%9pPFm`(AWJXLg}yk?EaR@y8IWMGrn%804cVZwUH3_Qn#s-If#DGLk0g( zA{->YUQSKBRQx_D-c{gNzC54$4&?3TOQNcvW*{lH_*UtV4|o9}sBnm7`~X>^;FjD{ z%D=qB>3WoZI5oePbq8os2s3h6q=$m`x?E$|zNgMTRm)+L+}n#ubwsiAeu?Nl(SIecBrFi10Z_91(7(OMmsJG{t9DW6 zZ3lfJ381j|T6vjsjLbR5h*Yl4MHPpj&Tj7LP*LQ<$qllv3G>ep8GOW!Ihz%Px;eXF zfB#^Ugt{K*VpWVmuYX0`3Z^J#j;<(# z4-$fL$~W56ts}sitRS_Cv>7Y<0zJ{M*C=PCQHMR}ERUCC$spX;P9=Re7`0F@E>x>M zjMNh12}ZHIZlvdrHut){d*8jEx6VcHJ$5(Q6sKbOuh`%5@5=T6Y*uTg0|#4Ge~!L{}@WazeCl z2a{_M9J-=xY~(1O5&;tM#IIrp?ZKHH^`L^-=s*c{;VyeRnUl7VVCYtGq?}pW(%h4MX|E$$zZLG z-#0zOiwnY0u$KJX5Agb||LTYK;p5GsvwM%^jXnNiwl@kdtwvNz{np;#-Vp77N5=sY zxCsM9gG>>=fwX-ZL3>*6;+O%ku(%N1RWdTz00bcB=FU!;HDbM75SCkLWa#f1jHqU( z@3r=RJsZO$enbpuX4Kxq@_M0Vo5DHSz{n64IMFH*sMfga(YJQ5Xx$ycXw%@3qK_Dg z$=bSNBQ&tmZZRX?qaI&es>#vn%PT$_g3_Ct`|>~Al*=P-9hI%v=O*gUXP;-J)BMzx32o?{!=_l#Z5Gtk{cd9921FYcz&I z!!4deJ+4MSDz9$jkn#Ri=0aX@Va7Bo`eF1gdWSs%x6rA+xaqVj&|#^V<`fUN2#}*k zPZ_vn?*4FqNA~McE>*LLbS-DsYl|EUzfD416>Sn~FB+-VYA8Wu%sceAteygu43C|B zJpI#Ads8g6*`JD6Znt*5`S|{A`?Ti65AWZ(S#|ewBgqI#?i%t(XkrDHp0U+XnSmwqa5*ueR7FP?B;^G$EupaG2(O8W;eo1?B ziepgkf$EFfOpX->{qv&8*FBB{I(A(F`%9*FIOOjzOE%>wuFPfzej8TnzhM*@#f>#$ zNSj1#XM9%lpToBWg~j!FOd+?D5$`uEp;9z+So&c)Ht<)~lA%hdm7ksMU%l6^zIl^< z?@@d)%l1pOmI`vTi^48JV8nee$+nz7R~kgC7ADj+7$Mn-_klfKt8~@SwbI1~f*5@) zD6B2y$I)_ z5p_Z?d+CkQe+wUJCpCu2E4nHuQm-pWv^A=mdnZ(^hB!>e{m2{()1tL52KnNy65Up- z+>G(ea+tH>nk&|EH2F-5cw~spppr51x!F+|9GRiv5hj?TDHzD%w_HSHguDy2mVWDB zMccI;4eaHo<{IH|E<`IXklc3X%e?+-zW=n|{pnUzzVo=dIVC_Oa||jRaVSt~k2shS z95F8RJhf*;9`yOw$jsDMH$t!46(ea{Qcjp!#bx%Qq*h33O+5wLhBYdao}PKGlqp0~ zxUKH=HYw?*s$kt(4i&?Zj2f=yQg}WI;^DE8HCzBO{cY{8S;l2<|K*8KJ#}F|-)7vJ z>pPF*mj#67oA^}zUvU2#_(P(cWii6V6&S+{<+Uk{h>57um6qB%w|!1)-r{s*_K~D_ zrVsS0{GdU04MkB@_Z2$&R$kGHKFu?0q3ITa;u7sesnZU;uJ@68xuayOz=WRxM!qpN zgLaiYj$%8sqgs(QzZI`qtpmgT&b0Fw=_Fd^Q7%2}g09LoQ9&e{)gUaDvx_<}D#{M-6?>lpjqV|Zg9yQjSS8BY_)roP)@ehAw4xjwo|(G(a3 zJS){M`Y+|eeI!c@4&7X)g8%e80&*eawnfV*tqUCEXb)oBnpbH6Qb4W081+Uj8YcCR z^%&VO*vs~MJqe47VVY?g^bkvQT^rJdiq#*Ms>fCh=h05VKI4Z-MUF|pC7LNvD)^;U z9$6 ztmWdc%6l965rx=@UZMz-hS-WYVm7lquCW%MJCDLKy>0=?C)7iO=Mp%l_Lg=Sc;NXDo%UCV6x36T=l%q#7so&r6A}kMn!*=&}+;gol;s%$MJeqJQEgL3V;}^ z(%m&N*LGw#f!lJ;zMngEo{l;mKEC*Iq?Y^w>#U8*f`f|nlXLb(jT~UrH zoTmR5`0yfX;+R_djE2MF564APfo(V%PmG5J{f|artqw&+VSs*~gFYhxTBOkhF{7hJ zp&BnTij!Nq&NKn5pW%X`&J4$(YS(CoI7+%Wrq`bCl`buS=?v^QyoGF71qRd#xw!X__lea64V$uV7wk(XRpM$5cDO< z4S)3L1LqxBntCqn#Cdkeqa#42Smse@TpaPik-NemBEuG|TM-v-=(K5Ur%!FR7&!o1 z@f>;wPb*f*RiSd@itBv4O!Gf|InB53C+<9cpYJFB^~;k>`*iF0)PJQI*pNEiRn)>O zU<@smFhnh36|`b2xMb=X2KvQ#fftTX_rNjB+K5d3c3nUN^+S8SA{0sKsL|65)XSBY z&{k3MqOb?OY))pm`khx)Ex=*8091??suF}jvcKyCiU71ft&2W+s%~0b^xSbqREHU^ zqb1=S5(1$rYa!-ul?QvSlr;BK>D`L=bUjl2>2g`n?SZ6o!v3J=ewpU~_B_qswvP`V z7R6pSqxQW=@n`z%%5#+;!VxII>*d{AC}rewl#mB9w*}orVvDkm2IO3OSdR7+LaW+B zpcc`Xh=Of%BMQr+89nraLQZ{SUPPI4<)$bTa56N)&RCGFzs$4N>w@D7gv>mLJ^CM7 z_1KOoe^yIHm$2utO)`U%k&OZRF-l?sp`+`tI@4H0$FECm(<1Fh2U`>}I@XAKURFcG zMy6(z89NK)GS5F#`E&1qyLHd#&JO;ovkxsKPWeR1T2k_wMc-+w^%E<=gLNW3tZpEl zJH^Ab2+c9R4-GNV~ifDfV-Yo z&g%A@`FJH#e1XyPJ_@&75l6)1Z1({nXw;9RfE7oL)U_(5?n=9o7_y#&I-jOwJ&4U+ znQYQEoiVL((JC>wTIpJJ`e3v+DU7_Ludl!R@#7zF#prtv+pW5g^5v1unaMFOUS{3!!1-}PzOK69ILB|DjyD5Q|sPj12%9eQX5iWzLV*!CA3P#*zW`Fzr`}yPB z_0ZnFX}3Vuy+`jAH0^#m?Lbo-u2xr@dd=POGC?cB%;TX2{zG+HAqAlgTyt7N2gael zj>TVemio6|a95#EafR{No?G!{90(!z064@v(1`@)WgD_!W321#p#oK-fl-sI&`LQ7 z9(Wm-+^XFvI2pKpFe1zW4-vX0^@NJ479Dwmy<9_andjGE>0%&?WSvfFp;tWM_VPz< z6R#cZ+@M#dLR;^k6n~lDe|=eX{r1g#^XVqwy7NeW38-m&egf1kJf2_1jXqU~jz)!H z`mvBeur3~*6b<^I8{Av!j+6!0BJeD8Kve+bOINGbTd%Jy|6<>zlweqEXzV>Krb`>>z_H1zW2zzvWx%f zz7T%`e{2xjao!Ht9&eB2kx~n8V#2Atp-tF0dZW!ynZ%&KoO$equdKy@rgNxFfA?$x z16yRy1+6tfF5FG_1viW1ebp&7=4=Vxd80>=8+IrJ$~VJ+pk- zGIQhf^3Ef8^M>iUQ|74#*Hg7E$kORL$PvRVi&bMWK5gW0d{bh{NU2W>L2FjL$va!5 zn~-MLA1WXj{GSCWIn{Rv?0OAyaoSEo4m}c6%!1MaeUm66_LjmV*N%w}>lMGjSKU(N zKF*15Jk0}2&a^vc&F1lBtz5PHP$KR#nL>_9$xKTeb>QiCnjURx2Ru7anLX;BCTTO_ zm^>P0Hr*m$(_qL~46WGw-R-04dk@?#ob}udlb@Bta4D)Nb!d>>6m`J1s?iMF8pd3h z>U0G8JSG!$8E(e20-qC@@8V^OAd$M*FeoFfxsaH@-T%(g}#*&q;Ab zU8^9yo#~M2i+hH>Eu9g9H$&+X7uqFkOAp~?ZvXi??>-F5w%WHhi#qN+gtwTId5Y8S za~-ZhPk#epRyBwyEPEK=C)`qj8Nii(kF@S=eJLWX2wn^)^tW6lAzFwW>i|*#$6*8t$6)y@ek~G7ab;!>gVNfbk)k& z1X%I2f@_T^i}3*|@T#S}ao^Dpg6xyR&Z;yh=_eyn!Od^HUKchF$5Yp8tG$pQKz>PV zA@&_`M-7H69N~+OfVN_0B#n~-(W!vDx6!)= zJw~IlG1ep$uGdxy$BW!(SCoPG>beH$Pahv%siMF4z`fd&T>rX?9uGQw#R?21?QoOU z5lWJG#Ug@o5i4>Xl+3c#8&r*vIGa;S(BR?LC!mNSii@=g=68L$<)^elae56N;uh`d zQT#zzac-MfhC&-Jbm7GIk!YOA!iWOnx2SA|7BgKe&3h`eME@0|H;#l#sAyyfans~2 zx|lHP)}RX4a!4s`EVN^X9h`3o#^TtL`{)&CnxcOtO+2diYvz$IllxZ?>ltY zvJU%H))9lly{7x*hOoJE5;qsZXhQ6TL!)FZdcg`OynmTHbPl{JI$F5m+Kus3EDA9T zzqURxP#aXDFTHH!D8Ev$LTk!ySwFmKtIY8Kel6Qk`oe^k)?#fhqX?|+Dca#Vkj7m= z=_Vg-YLQJpoY;s0^j;1+xGeIGLML#^==A8~9s;S(DWWBD4X*&7QpY!k11E&|J?ILb zxWJjil@|Txr%L&oWt8_FyU!VS|L|4&>eE-_tM9aLKYjI=qj2+4zy9#m8~yjEum0bs zTD*K}=Kqhc{=cvKS3l~{-s;cL!TG)s-64iSvtHny=bdMs8cs-U0WWBlekGHj3vg}IqD01+Ee%N<|Cy81K>#V1 zq$mT#AsQB`kJK0G^LD}2iq^;Gv>@A>7VkqmX3+0h9vFB%5&O-bMWG&k{PgB#b@jc+ z?v;Cr{8N23MI|`9nl!L47g7;tunC7i%$~CXOyPV^aVjh69sl&*gpLJx7q|hboHe`t z@}oY0AR z)z(osqQ6slYGBSBXI~f~cTLMsHhZDUZ18|@_=PC*;`MA!pK-ye3-{H6Dzk6^LSY!|Qu?YitK5zkIsWOb+cXP;J^F(y=Keqb z+7aX7vpUchMj4N88aMkT?mV_%&UyNr*4M;iVCRnhkX1wzUaT5Wp`0bSq+JkA=SUqJ zA=fQJdHAh~tSXq6Cgd4b2^%#9yi5Y79!+>8RRL9GnIbjFA_dvds2#C)*(LR|uo1Xc zT8nFPoVlE*7^H8}Wra2)l!`)HrK=#*0@q4AMR3|Ew0P$23u17Os!+#G8uwD)D9hzS zuxW?{%CvCkPg?kVf@-xl3?4-KCaR7;!|>Z;&A-xge|z)f^WLL)mEz7%vuh{r@05co zG#U;8F<}`Y>a&B>K&=$DvqbZc$chn48I5u|-}2CYq78 z8O|8d+^Fc(n|2M3p^^T}dFcO3{cBibfZM0mQ`Mlcd)QM&dh0J z{*2z(JomFZB#T_m@e7>d3Ati3;B&1NavDPRD2$5LDJ5vbh?**;g+^CH5T``|AF-va zFk&^t+Db+NH)O@t7c<(6%Zjd9pKiT~F*_^Z`-9Xu_KXe{j)9to4^xZ13SVMm8LJ>m zPP}sVr)~$|vZ0);Rqof)eo~&TdXv4ya62x3ChMC7cE0g8cPs*!kWA`Pp>t zDHhvjUj)t;Dk4(YZ4Y2N-D1a<%{DxkIdKQiDfw*|=7p1o~;iQ=z*Z6FrGU%yx6PUZR9oQJ} zrs*o;KopqUS@4Z$u*$*KsqUI=#`7n7GTy z^}1)3Tqh59>%#cHcVTOXEvlPc#H;XVIy0GqA zdpQ-MqSBKayA2W1-6suwN~jI_~S>gal5%w?>&6iapl`o9h^w3$PUoheOs-l`ta`g_t%TPsWW#S{K4kQ(&FCXX;7q zatK{$z$`s}b|T3kP%#k1V6qHi|1a*CY|$!i!aT)Os^n(vd`rc#rlH2B|^9n?MT&^2)6k51CG8#0;*tmwCO6whe_(`QEqV4pAEG_R| z7k+(3D^ckI&5;(6baNg%?6!qViU=b%9Gx40%KQkpb0;r8KzaJhdqZoWq*>pGkn!GJ zxe5j)jkp&5>_Sai$oS|{$3pqqj6zr6TUC5K={Q1}OujlVJB11Pj%6R1RVk`?Sk9v|d-P7D*ap47@>O zso74Mj<8@DQM&~9RiWVsCCqvikFZ76bD7k`uG zFkf5>{${*=^Y97N0e_3C-g)f4oYQmR`=qU;MTRD%7Y|5NJkPda@<8q!2dgav?UFu3 z`yB-sryvr!E;nV3g4%?|ubnP=++?-v75Efl_^FjL9U3Dl@i&tNX;XKi*mPExhDK|- zR!$mhf+%No0{7gt+l0bAjd^PpEU;ZV(#>wHM3q@7$qs$Eoyuu=G;=*5(yA#F>DS+h zS`-*}I*)J%?E}IbS`JBjTKhn8d6SmaZ>#8lVy7F> zy{#Ekj?_AF6E(^ZZ7egB;tIYUN^0wRYG_ad-s4nGWX>C6nn>z*t8M1Q){wxdNk|wy zXNM)$#;KOV%0dUI)__B~HRyRAl{H7#Xq3WA{9#|G=D5{_3B+z4{!xZ;@x=|0?K~usF4cbM*pjIOUdI z+osix78y4RJ##6RF&@Ss$#eI@nMW;6L=06EQMH_@R}cxzcpr*5OyGd)6(u5JS^?N= z!OeC%DrBxaS(;7cPqU-dJG3XuxqQ*Ww!2WsqFDwxMDYPv?XX4Ll;br#)NIxs(#X0; zGbPL`)7-~-zNF-)b(p_Xu7=lKaLz($t0T6X)P` zK4VtrD4`Du?B%rA)}hrsPz<0XJJh5XK%}NnKERd9nhTzyv5#j1xSTt5K zL+v{Lwec|BLiG;k4nw58?$&@8CHl{Ng|;2_6QT+ZE=r1}0lVt=8k^T(<|XbHv=x;s z=@tVH2@Q$0W^@sX$dA=t5-zfyj$!VIIugSg`|eQx-7V|YY}0S-d8Mg;_wl=CZ|&1N zkJ{Cs%RaGFp$**rxSJN~o0+&Tmahb{jKCF44&^T)#YHh5Q~`pn7g639cBw}_Y@;Hv z4K|R3nBnVif*e@Rpggc5CuXY{?X^xtR~ z(HCL`{h~NJ&JdBV%b(Ms;H~G1$FO zHWAt9RBzbHS)&jN;$>Pnn{A{hy(UcO+G_HvkL&wC-JH;SkK6S)$$#_6QF}sfS(C2^ z)9Z(_MehZ}sqd|LmKgk471|skQ--z-@jiulmL#30dY7a?DMWyqG(l3Khfdb5M_%;r zxwQpo2l_Qcyy)p^-cEBPpm;rcNCgS6(xGVLY>~Dwj@*gMi`poYrq9oMgRi-;e7!z=xH-S~9>*`|*MDX_LYLWuAiSM8wl3%w zh;tZ2pSYjr+IJ#ns{hi$OLlIBl1Q0#SGt>S3d~~1O#9N<8ugAJLTJV(?GGDplM!DL zSZs2h~sNv(+{|Y z(lX^T$SICe9V!D2AzX!%xR96@&k*6)4ieLMA`B>m8Ct&)YK)2{UVF?znz zoXI6@21^sEU(MneA6AN4m`+=qrF*uE1hI#k@`6tHSuEyRH>3-JJQG6a3{LeEP6%Hgw*3P+yyDeVpiEse5?s zAR)=Nw{py2y$puRwIP6jo^ZMQr19BPMs3MO`*R9xv z&}g7lbJK}a1({tOUa3s5MjL(`+)aeE6*5l)bC}g@RJst5nK@5IjxuRv-?m*ftG=GA z|9Hz>_TIyGy`1$=Sy=Q)10$ThI!(RPN3lkyB%oCuvAnGqwofFXG}0?oWX`tsf(VEp zN;F1~LU)=&p+bz&V(T;)6~U7-OjAxb>2jQ>>2Gx$5*JQ`dc1ZG&RoPnXMl>SH)LT% zg)D8$6-x}HEJP?qz@j8|0s*-UIqt)%bun;1!a`G2=y7S_>o7 z<}}KpI7k6*LcbOF1?7=^Q1U3)A1X<9!&Mts8cKqjLS_YyoHRQWvgo5~p{7g_M;IuJ zfSMEpiHI*nkmNeiOFw|&Y82B8%eaE>+73!v4i$D&jp$=SrKVEl-R8NI6TDWKQ>@d+ zqD0Y)$Sy@QRteGUY$8sdZct5xjK&m{HthGJc^2gyy?cepBM$U46a5eU&A0D<{J!6Y zS$7`DS0~tSFJvj)&G|^!`KAy9aJH91U)t|;??p`1lF3#-7D28<$h&wr zNb0Wq>;!+^|MKZ3#Jcw&zBaiy zAXJMNXL_`yrUr8gBW#@14Oh)BF024tg7CD~GIy@jy$B>@x~>^(q7UV&U!)-G@oICl zLiCgz6>7muu^W`*OjDl1lRzx_C=sMnXs+laG~BlUWlX(uc$cE~q8Zf)ngz{t7YI#p z_iPJ?C4*xQ9IjRtp{^ydYiz7PJGsBnFMn7cKE1g)!}lJ^S7+GKgD`EtL6>=XoB zIsezv^hH?5=`-d_2T?%~<=D`X+fvLeTR*29>ooIN44T?#jA(QKc$h}xYF4~VL? z+Hc$=WTyUnR6+548lpHY!rB}*B&!gb0@aWM5wdM6 z=axQwHlq8&Uh=;po$$~;0o*m0xn#q zDt+TBV}rJdD8PuOp^%NhFkNz-jOx8md&;ChRB^?>!=Cue&`4voJw#7i5Zd$m2xO-w zayJBn?a&5&VKkU4ChaFKpQ2x4CZeLa5(|-gCkojx2U=p1Nom2EV)STEBkuG+ zbX+Jil%BM+y#AJgl)-#xDoMnJLa89o6*SWZUa-T|BPenSfLOssr5}A^nG3`1B_dO` zvPJs$2AD$pb2y18r=|f^RL(mWyn;1M({M|}eV|r;)jnB6U`j-|QUZ)4i58Q>L7y*X z_SafhKRm2|ztv-T?~!|1jQlvGE;Q6mhv|Zg+fciq2wnx|75p)1977b}lt2-IhcLP$ z{)9Z9GW<}E(6`e~v|_EnD|F)i6_Su6Brj1vP|&{&2x;}T6c(c%caS3HwHUcC0U>U{ zN-)td_^t{OX-T7nk8I}BhShXL0Z4}{z1YOEsE@581cq3RNFxI5>26d^ulk}jvptS^`t!kYwbA-1diPB;44wjED?y1@pBqQ^k#Y%F(8~GfeHA4B>~U)& z!ilOI0r%Jt(xnpkGNF_-T5t5f1>aAl&V)8*Z|Lz9=0}MTLy3haYgJNOxgR0@V7k=+ zX`d-j?R10_w=$flLDV1E(P%=&q)E(5e{JIvtbnUOM101ger&F)M86&HzyG0qSP%Qh zcjFdhy7TCLIjipTZ68voBP>N{BR-bKE*-Z~$dU+I8zBm?*W(fs@Jp%q;LRv0{PjiBmM3Yyvp zltL+7^`J4aY$=~b3m2ZAiyyOlMHjQneq(++ggmsGl`1u^`W?fi2?x#*lSOd`qdyP> zajkHQFp@StL;fMA1&AVrr{3!_bZmtgxy?tB{h0%V3mI${N9KtgKDBny!o4_4A138MjCsLl{Pj)XZ`&*Lzkh+lw|ThlzX_ zGbsyM{1=yjF=I1Ld3O{(Qk>QUZEqB)*`Er=g$|lA+h#0K`QaGZh^>kqk+y@6#aQvm zK)e)}%=Oeh_fEwPw1N}-m{9jFNrAmlZk5pbDL*^ezx(lrZ$C86?8A8f;ihcwoyYRJ zquujahNwqP+CeyI7$aW2#i@ixsor+Bav;0Vi}iS=;tZ`JHlm(RdybvaD(AXJl%Sfp zMME+{*Ec6*6jS#(aQ^M7G+Fq?D99*^9;NG~Y;$cp_@y-P-Fw)snE6@7!Yc!utq}yTp58fU}Uw7MtX;>Z9stt-S}l7 z)L`e)J&Go9A-SiEG*$HcOTF^D_prU3&ZkazOMuW9Cwi;AvNI>Hz8aAPaYv4{!T8$q zrO?bc=^mYBBYlFwGddcA19f$zgq6fL-AoP}S?wsn{NB*I>T4|O`BDAOKqQTXLd%PM zt4%|}JzXE3`V{99R?z|@9ogKml_{%B!jg7&)c!rf!$|~bIZalWVzNQJ2)l9vQ`G=e zy^2}gN8GtJCSf=|0?m%DAr#S;m=n&f`-R8j?;lT(AKtznf81|w8ff2p0AHI}n_O<- zG)UG)LsUD%phKr*PPdU3O`%U}bgo^}F+|jVD92g-wcEX2aI};1Ns2e{Wo8~cFG3^?Yje;whJXRB? zWQ+Pe7A=OtBRy#aK+$O|4vf?pR>oy2#-Z%7$)G5}edFo^WeTV>4AV2s>VqPVwNmWnwslIF~p2xgT%FZP|#F1$#{v97X(>E>LUW8 zW1%mR@a}Teq5_}sCQy_TA@JI1qO5ujQBL8dJgQl2wT)2pbT1l#r!?E1{$^X3X?1cy-l;UkW0DS9jZ;_n;6R(pIK+R@EZ4{ntWYudYFR*L zxsb2}+q=Nex+EF37lK5k}VM=`A{!64=tyN6=#)Nnc~mv6H(>U;OUlTP_fu?uBlh zIp2BsUX%4p6z=1hV~(|g$7gBcekf!!QlSCH*5Qg+RkXsMMjv0O1e*~%Z{%S)KnnEp z6nx%Asi)I#9%C-Of_RJGvrZw6T93I?rVN%iefsnJ4}ZMv5O?2kd~MtI(#1mdR3s47Ppqdw`Ecg&Hc-5T+y?FK z1_MH20@RUa>?rvTZ716AjG~I$D7Ay`8=5eAF1?P$4Xa}a44lChTa2EOou?8=EBeKW zq)R?kTq-jqfZi2Igyy5HrO3OifDzUBO0X-0C5|E7qMuuuc*X7}Ac@|9Mnf~*gt0Y3 z%6mk*;4nw@xPo9!y#@{l9r^4QW?vpWBJ+~Yd2&& zgvJ7gWm;_s4~2%f!eZH#K)onTHua4^PpX?!Iy;j`?n4W`1AeKI5@O!s zOJO#93`+F3hHtsXNAnMd>M=qg8RXp!>brCn3YlbWGtI0b=hUu_iicQ;DnzF%)p`%{1%ruoGH@*koB=HcuXb0Ug0{k8WCrng5@J1Wy8lDGd?FzG%dS354_hf+{M?YzUpSEMxXX+0xP;C*)l5QRI1B9wTxkLA9>8BeNHO)+ERyPoq>x@xsi^WIA1z7mJ>=u4+p zYogCVb$AJi4@J>)E-Li$m^h}Ken!4n6R|5U45)Cs+6RRPf;Po(q|`Qmo<7FFee6~F zI-pzK1#Lo9EVi6Ljj9OM1$P(1voqs>t}vCiz$Ok#!WMdWD&ItC#gtmsID{gWxMQn& zZa1~S6)wx>S`ly5AjVXO_Rv_`=|dl}40dq#s%8I=mY1y21ISh+vFL`fGm=SlGkhgZN z@NQ#EQgWduq9lJ%9IE&$K2!ukHto?HZ3C^6B=jowlCRnrzx#H5I^`G-=a;v%#O^zM zuhnGKOgS^qTdQj=l+r{147ZO05mrxV#2q}fK*DAM@MG)!&CCjl1KQk!zA)iOU0SCV zCM0D1#W_vig6jj$AyyZIco;p0icMOiilGR7U2pZKKooi<20o2iuTKSB5#fP(h(KPI9Yn zB47Djb;E_c!LU3zL5iAifH?3faQ=A|8(iZ)>@)&Nu0vJtM0`cXYf?f&P|1PGFN+A_Y z`VIjb!PcpGAv}vcEaEZOO1M?oc*;>MOez8ukSNEF7$@Y}(Oa81Fe3DVHfj*7v1dhV z#^`SbXMi}}$as~yEeh0Xp@@{)-i&B`z*zu;naY`Mb%eVvs(96J{70(IALjZ5t+}By zb?3o*S+Dvi^QZls6+T*~@FY)tB$9XZ?N?7_o)$`3=wY_xwDX0((X`4@OiwGmSrN&O zE)uMHQ$Z*w2Mo**3TiRCa0-?XdRs^B4<6G3b5U>B6tu2Ew}K7YLLR>3VrzvC60U_^ z@FR7P-J1A_=$ZhDQYa1ftD9-)78)iX$6C6wWf8gS*kc*Aqm?ViL^E%D3KI(2vs)qB zSVhhe!cLr6yfC-^*CWdLjo9j^_ss7%`^~%g_O{&hy+`u8ZQT=E(#FPE$i_Sn0aa$# zNC{DECn((rMp%RK0b*Xlmr>L|c{J6xT}d&J2G@i=#zxsc(ym0MlJeSCWUGPBo16mH zLqP$LHh9Vjgk}Ws6$fAFU>wZ1HYJOI1OY+1+6Y07Mi1Y8;AV#VH{~wv!750iY$Fgl zHHu`T9cK~eK`lHWIL7T?#|IG|UGa?61W@d>PPw!pHJ518FI@Y5?wb*wvl@r+m=mAZm*h>Gx+^XUX&{zt zqj+J!x2$PK5%ke67tm~&V@-?6a8J~*Yp9RB?M9X)^uICL{}WzL_a4wMXS;kk+a?46 zAI`o4ati#446cP^4;MGiSoC-=8eXF2q0lleNZL*U;;bavq0l#yp3+VF!@2rgZY)IE zHhQ$;d_}{#L=}?rNHzwZ9?t>u!v1Fge*gcPP$6!-=?9PJ#T89_L- z3zQ?Hk8X3eCU8;nP#Cgkk0X1GepgI5RchQT2Y(os3ZTLbPzF<|9JQ||u0Byl#`Qxy zNJ;lajojAO)OS(>QF)a5C=3_6ke1j;i@lgw3-zos&gkf?F0|6>fmW^&eVRq{kGQ6C z`?;>yGdarpXFLjTP3wi)jboIAEb7J$-fBV2%WVGBquSUvZ$7Sn|M4bAy7%~9;dFc! z2AsmIs0yMlfzkjPgax6`_ChMoml0^iDU7*AOG5zeemWdO??|C~`_}HC&b> z+^L1g35+Qm?s49y9GVK=yht8KpHC^ti(R^#6~NR0m$m3AP^|GOTMlpxDtTy*RRtzt zN#Q3NY?NPV*9m9+nv%t4GuBV2$%q+KUF1i>v_Rl9n2si-5ndleMH)SXf>2J-2e)l5 z^ZJJ`=k?ETKHXB3yZ0Dg=QeykpYj=x3&$}vMF<1?U%JdFF|kfV;%yF8=AeD-^fP-8 zOXaU9oggDCO&d#;Y;t$Cn_#>~(oWQ$Q&c?hdK+OSt9`Nk5J0l@!eP>$?6u9BM40fT zUaL33E8h#}76mDYpoz8Gw!Mir2}ol5OsT78%IrDYO7Nh?1*}0QF0uP7su&8?#tTUA=9ri{fIc5@k(2~%< zn|^NQHC-?_9kvLN0t1Na>x!xyVB4i zAz-u1R7@24)XZH=XMQn)+4ml|mx9@k2N}xeerW>)0S#o>t5TU#ejkfI$h-wNyB6P( z45cCo!7DVaFwF)Kcwv$fGx26AuHf;E-|7&i@MZi>`R2pJw{PFys+zd>$i1eSoTwua%%*2N)9U1p{Dt=-SIbkR zsb7^c0+vWxJGAf)3|tVmvaHa3maJFw))4ib{qhzc1S4gT0Z^C3_SF~1uokT!HzYg^Hjtpfe63^rF67z}vF3iY#pc2m zU-iQ_8kB8B;u8B8fsQaR?`_(@8aVHq-#DUHPZ7-GB+_!LQ0h^v(cFvWhim@)&G&D{ zhxgyNPvaKCz4zF?7IZ64K{)HoW=C~GTuSYN_!^*|YPR$>VR4p~jau3SEj>1NxU_qR zVwI^ylF0L7iwb3me~8N&YE6XE6eRVtFvR4!HMKp9dPUAXg-FVa`WH)?J_0RSG_9a< ztgzbXiRoJ@C5np}fm3uVD;IXr?#zMRsnm98wm@Y1z|cuFRsgF}=%t5AqO%F*SwAtd zK*!uuUOq?BcSiAr{GzY&*FQXbSo6nm^Ah&XBlp^!`Vl!LPKR+#T7T~iDqX3<4x1YS1R8H+T-o?D#mI?FAYctdQacDngm zYxJD%s4avguyZKgYiEgVaD=EG-;l@Nl+(;WiLw8zjr=u#{Pvl-ywd)B@3H%0PBX&h z<*7?YOSm>gZUr+De60_UV5P8w)*o#!I}AkRl*GGmnB`ntL9x#S&_Mf0Nxxcw%;gGR zxX72`WzkUJ(CZ1s(O)IpLQVcw!lGHd2w&RKuJ^FkXuv0mN!IHf^yW%=8^x6*0;WA! zgeh6!qL!;D);UbrO4}#Ab!|6c*t&6&(U-=IdzXf@umHrzIb%?;6V25hAORq>iv%S*l)o|!q}gi+7%dw*c!uI@d0*I6y!)JLfqr;o)rldEjF zuV}9DhjC^W>opvK+7f}25?j-HM}jtEjIclhqI3c@ z+yvSs4mNS5Y+)JjCLvAxsk$Tlns6H`i~a_?6gy~HSTv}oat*^`V-YKmq3l?-*0qVu z4BLx-7!+4%Jya?!6oyps5~W}6*07>bXw#UkL3^_SUx+e-p{U9*jg zMRVAIRV8xEy3k*b!<{pj@z{E=0aln3zPD69QUQ=7M+AyC$znLGv@b3p4nDd9OPpB?S)XaD66RGG z%2I3CAInq}q7-4#Ek`Y=_HL&2$2~i>?(uuo2yT>7J>`GGwW0(x<7t%Ow|elts3jE? zc3bd6p?E0T>h-jJl#RRc^eEaahM>t&&F9VfU;gytvkBKx{Ce|teR%k|Zz+D=dj!Ai zef8hCZ^9F~p#Y0Z^|VL8vMng{C~N8OG*QBaDM4$Tx5a>?kQfDC$;E2zV?rf*-j-5% zN8J?f8j=3fi$AGvR{U7AbuO}TH^+~O=07hOAatv7y}C%iJA`1kL`hzoj&fnqRdfo{ z(F#%qn)=G&qh_#C$)%K|z-*$17J_d)4nP1~K%~Dtp!BX^iGpZcT!{kD7HuX}nK=y zGSKJF7$9~?eH6AST=4{lqe0MbZ<1Uu8n3i2BlH!Y^ zo-&y@*U&no3`F55;o>8l!oYGU7_Q2TzZe6jdym@}8}|4&xyK0|i6*9mHgME`VDA=a z<4I^l>zNBWhXEgRt?D2eoT|b>Mp+phy|55$EqJ<>!ewNpjFT3{UFcS5VMPH)XG9BPSGcaZ#EmnJfpx>R#fiM z7LP}pP0XV7sQ02$5Jl>O2K1l`D!VTJfCQ5et74^_)(ZRxYvt=*>Ths=fB3MzUH@?l zG~IdZUY;60$)loU(u58(F`Yt83T%5kn9gH2(+$Tb9G*iYOZLu+SI6C*5c_J$)G}Pk zYtGe6f|{goPN;hTEKtMT^XA$+@y_eW!2VAg{_M4w*NQ(aRKBy*?t+5vP zK_4MhKY=}3q1W4SeNK)YcUOH&=Po&i(}W!HdP!s85|E=Y3k9K>m6@8+1N4Z>fQCau zkwkTrtF%39p%HmPC~mZFO|6dDJbp4Gc{tq%W(w;z6d5Tg3-rWMnj zhwjVGnm!*MY7tjaV4A{3g!FJ_&^^K7l+YLcP&EANKNLD9wlbdnp%iN{ZOj$H@>5@3 z5^|R)sw1DF9Yi7+LOH46YmR(Tc2x8!8y1>Q`>|@dX4Iuni&wDz9vb_JqHd~01s7-s z?pzyBKk%s%=nvaPD?$;v@U9lR9ss!P5l9uY7wHklRk9MDFT0dNO!n9iY-jACAFa`H znv@&0Ad;=09rS+lQyt;+3F0foqxT-bFDJHq?sJWG;&+iTE)bK)`;O zm;Sa}S18O)GwPO#p03k~(g&14lQD0vYtV3g9CK&&Eral za+Wro=10(bX-cZ%5*Dpn8*Wp6A|7z{2Y_X)Wf9#`Sn}Ll3RH#&s*FM&NwhsDJ&9nh zg5{|&60~)XT4=~HILht{jq1obY0pPR)rq}LZ&|d`GhEG4cslj2`oXG6X-Ob+T{Xx5 z<$1e4^tbQdfB&%Gy#4fw%Fmt0@nr{ddXyl~V#=-;htLcaS)op=rO$82wlG;1qgGz% zs9#vy;PzsS3O~^bt_iH5&Rax61Y!dHWTDXU2E@cN&f>zovR{)v)#D!K)Ok9l?P4$)8{P)lEJ3jnHv-$0Z_QQ97xur#Z=V83w z(LJ{_@9wpXPK~7v_!dPjLma2mNKEAxv^M-{2M|`}s&i`_tf{b4%+`R=1BXAQfs0 zD2kYzs3zrFa|)!pLuUuEUtiE%Ou3ah#BO$`WYjCPS1lXuZEYm%Uy!zouGoYTod|8Q zlnXob=dV0R(@T5CyEiwRuI@Z`m$L}_v||a`dM-RuXYZ5~3tmU;6!MJ1=59B9*b`#! z`lqM|N9g*kf~0TMk|}*F7EM~+6z=w-OnqV-)te{_f`85CF%dCE^;H|D3kN8Ap(b{v zuCx9eb1AZ?be7zOZR1hBjwvMvst@j$(r20VJ-J$!oq(BIv>c)joFeKD!_v+RrA z1TBLg4y9B_DUzNKKgBJys4^EQg=0^oju2=-wo^Mt$zla!m(%FSjfh>q+^O1~P&u>s zzxgDjhoHR@r!cOen#YNMaEok2I$zwSw=lGdX#ySQ91R;3AcsL?yDJ-Ig&y4N23#*< z@vdbqdZ-BG53%u#{O&Z$_J9F8dh8d}?S3x){N z(?Ptk7jqgH^Z+RJ+*Dv0Z@8|Ch7Jeql+kGCRQ@Oqtp#d!^z({V{Y7r2Y*53I8z+4W zPs8pSJ%rqlh_Vy46g&&&Hv0TbhS6MMcBhm&vlyS}Dw?L(2;b^rKjmm9Nr?@{|=hyGMzIF-4nFrgDPDB#865brI0)=rDz zq&ETETkjSQ>1KD%RH6`BjK~?7JhF%fJ=e%sh)>btk6rGl`b3Sh7x%Iq@goYtlJ$13 zWO6CE%3Q-P;wBn}iA%eqUZ9*F{DI*17%>T6!1^_znX4~-BI*GF@Q6Tr7W-fLDR?nD zid_Qj8WkmL$V_=W9@gUtKDA;svL$gHn($6@{#ildw&vE~w>dwokGJ;fy@&Bt**rUi z`cXYv9O_II5XAQ=%`rvmP)M?Lf$fPc>Y8F4TJ-&NVItp95>mgWPU>>g!7Cl@@5T{q z#oSLDCbiair=$<`r-)vkp}^BxyPijgX(uNTt6is^;F35=IrLn=TX{teg*awt^wJ<7 z9k~fWRh{grr^^H74PnlsV#GP>z~z+#ebWZAEE>zS2yK9t&`&2J^$q%hpZ5~}hw=X1 z$4~9u&9lUN59DhTY*W%ua^$FwQd}20tmPEv>D`-v>7sbKDqAi3wrVG%G3;zAbG&JCKfUsF)>N*xNYSg{MpjLCgyyJlD<7iO6HwrcR7sg&$1 z!U@=;n=$B97XyUC)UH@K^qSb;(FQ9v9~&@Qlwf-BGOc97%bMPRPm2OV;#L#;gd~ou zq-tw~lT?(r@H+h23I4n9ZeQozdkkOILkz-^iXE&D(t>x&{4;9MRxirn)$N&CD+3lC zkuEXzcwN!pr7WfNbgE#DfDYL!uFUha~)sAst7XqXdZvagBn_69;ZEbIHngvr>SPPS@n{ zCDP`gFYR4~wpp$)ix>zZipm5&o9%vn^ZrqsxBbz@bgO#p&I9?{1S?%&9#7k(67~|& z4nxbIv+Y!uQW+Nw75&CYF#;V(+6=S?b0&ZK6TO0_t=cYo3o(d9goxC4$3S-q)^Zsv znohsGAHo~ct+}Ui&JgjtolTf$Pn;?_|R$-HxV8rxi z(jr#O#^J;Z9vQ9jW!%^rH@!mQBr$KgC~DY63}jf2Dy9OtAlcMr$(rh)>S1mt-;bX@ zym|NSt=N3;VSLp;IJU0wif$9Es(6-`$XuDgVf|xgW>E6Sp9r}FjlJ-senrP{qF8J# zNG!uAnIew$p^XOoiVO+QBL0buLqN>etpTONe)I*Nvl;WMKj27!<8meNS2qKhol=-3!@*ltb(3FgSeEYC(dVSw{@UDFv z?z6gp(z^0>jmmJ#$(+p%E(t}c!eORwL*@KYsV`OQUtSHz4WG6?>%t|BjBI7*QjI6n9+K& z1u=o?tdiSC%NYrOOhuJxIafArYY!><3P&$WWWqUKt)%kIvJiDrO7y!7^piN8QifA} zyWX<@+sF6sUa{V}_sG4xiha^v6T|1$uxc+WC+M}RqT2|$1f}#MO06{EsG|#~_O&Ps zxZOGE3L1+bs3WQ^>_<=wB4<4X>ht4ij~GG`;C^tP7y47uXk(b_f`~W>_o% zU1@}AV=`hSg)WRjWg0Hsn>Lrm1xM*hJ`3)SOwO*_mQA~6*QPnvOF2ZWa?tOHD;O_m ztsmm-gBCnYr7I=kN=~II(c;om+BN$A_Q!W`C?9Tb-|Sl_|Mwof*Sd2SmevXon|Bx7 zK)bFgVx79`S!onGxBg=Gxbcp2XCx@LxX%<9NnYzpAdnuJN{PGXg*rJwpViS~5WJ1S zb2h3UR45spHdci`WIXe=gcwgvF*iRHp|lrW0@4WM21Ee_hp-eiCgHBD#Vo|zw37?c zYXTICObOAlS*Y_ zN`!?O?AGfc*rW*8OkKxO)p5k6Fv~SqFGq*yF+ld1$?h8L3_9-kAmHWlTg9Zkz!5wB^_XjWp3iawB{VZj;L6ukDk&ZOVF-p)ssKXwq3ialEy_x%`k3atK!}|}P@DF`^v(f6_<9F4H zc%IjiBZtg|gq%-5UXF@%i{o^?cN&H|>wF?uJI+gXIIqZcM2$M;t))iBfi`1@ z{cU}>*iz8XbG3{6GJ@`AlX=^&${+3AlBB7K<;TL(+o=rRo_pf*J}-!wSmu%_CgFB~h3tabjjl z@!l4qQ>f6>c?t-#!970H_$fx|8VAzdapfYCF|a0bCG9I#0`HPNu^=$6Sv|X6(Q_xg z@yW~_tW=C9F;q30k~!%sw_^KkI^VDkN|X;zvDAhNT8b9A4y^#i#!^`(LLRwl<)gn8 z%F$ymbOw(rR{HvsG2J@Zzw@xYKB3-n%t+mo!<4Zh($@3@oT`^(hceLAN2ZK;mBkKz z4P8&~;f^*rWu0btoQo~Y!F0rw1;nl55+XybrsFg~z10iVJAgly z$f%tJ>^1aOs4p$9s4(8xi%uCjw)Ictu_N(^MOfAIj9_pGrB8F zDUyG4$(N70u5hAm)BF@=+ zUFIBPtvSc|q1~I@M-Sn}YdwD#UhDdY(t+2?-k}LQD-nlkr={(KyL=8QwfpH`Vx0DB zC6?TSGFlS=13PLzY;Ln(00E=3a;fK$}DFG1Su%Wg`-BTwkx;izZ_u#xc%8T_{2} zh)Qk|?1;CP>zofoNOr!jNL5Mg=rVyyy)s6 zT6KXEQ#G6$Az9@*#q2J8QBeWMoKD$E;W+Kt#(B|!-V+KuesUKlsM#_97Mopdn!ho# zpV!@)ee?j{%xrv}SrIy|fPmH6#5=fWl%7sN+f$j_BNZf;P^MzwnnkhRTg8dpDV(C< zz}emqm&*sc8msZ4O5G@d2nH#tPG!v@@`lfg=RQIlKs)dFtKHNJ+aW-C{5pkoJlEl< zVb_6Wxlu$K81H)YDXAL~WlzE!CqUz2wz>$C6O+-NRdlwSV|}IRim8+k674fo3{GS( z8@N-HgW5A>p;H)tBh$XCJn-ldd^gc*;R-*9*Cn&*Cm2}2Ih^C0mZM;JiOZv%=skr} zk+V8I9K8po(TgpbUBUcRHxGo|JPWYUR8kc(D3}#SDb#8S2MHq-I|N|F72Rm-dcn%Y z%&1PGN_k~?lrxOy?1?+&p*dnLYpEml;+H0T^wBCt7CwZD)`G%XR5TmS<+E!e)lwV% zPty%<*BYg?iXKe>(|T<%O{)o3cx1(E&G0{elMcq(>ZrQkX=Q%!5Z+23zDU5((~TgT z*J?-&0V%EZRJKdiQc(w)@)XMv@|D^b{j?4*+>FEy663hyY2jImg{P-wK_HjwCog&^ znBTnCshh6r3Fk5z{-!C@$6~yD^#Zl4>0d9gIPvj<(s#gVekjx`Woaq|Ay$rJb{qYr zsV$j27R+9p7k!W<$UE}to(li1ourkG)LE{a@a%=B(xeg_1NtJSQrDhbS`PZ|t|t?p z*OyNp{<5C-=TG-!`5!%czc_CCSpc!>-|4FYHrKiPfZ>p^m|nSCAY?ucrFQSdIZtz3 za|i*N(`YCs8>qoFjm!5g zM!^*p5(ryKyBq7cNz@bfbMd5jfLF~bRJa!Xw*YENjqAoagx7ubM`aUV>p=@DCH5l! z#p+iu9X>LmrCA&+n29thLAGNCG>=6=hXfTdvdko4>ZtcgvO@J#05= z^_xzq)`Odf+loYYx*nA5#s7sS`wo$wBL%6Ftq{DTOxD#hZ16~*||5Pw0ef$M-Ma!+BlQK0rXP%1--?{3VI zf?{+W`)38j7ku=lfcSlTzL!rQJa%uB`Wq(of4q=ZWnS*OqE+D5wl2BiQ|Qw2mhP5< ztPy6;B}`#ckNdH$qVw2pS$cqu<}t^#LMx&PMoTdlgmyOClp=3?P9=YB7i9GnpAhE= z$|{B%ieI$}-J=KZUENvB%~wMsuxycg(KtwV&yxBJ~7oD_*qlJk%$0ICe zjR451t`}oH75JvHovfgS+j=%V*_cV0CDN-h1vW+WvQUSuA`2A#X`9kom`c#j*6>bD zj;fMa5l1jHWFZ#jMjZF<9(}hf{n3MWEg1b~rd>FD5$8E3>thHoD4LA9DSj*Mh`t)z zD?Oq}z8WnsffP~x0y>Ey7HlFmt}PQ7KM>SLCLe*CQF_ofSjCCtk4pruAjzG(W4gm{ z1VMf!A_I>ew%h4+Z*qrp>k04GBoH-D>!(6o^a}O`SC1Xs0U&toX^f2(3iHZL8Fez! z$IE4=FIq}=QHJ0L?!)K4GSLsFFykksM`-9%d4OE5c)qz+WAc@wJN--&_7l|eNO!w} zG@QfDlv)7};}k<_(-1uaJqq$@0H&#WmOiq;ehpn27(o>W2`pSza%nEeNjEc{-NRvH zK4!qWs%IEZx!%M5!}z?~*Y)&HQ^unQ@7B`Qy|%PQWpe$<+%w<-9qV*{S;e`8>2aq( z3ytNR*PuGe6uX5&Y;voL6>gD;dQP?}kQ^Q@gV;O+Y`dAsS|>_B1G_51;D(sL=%o`T zpcL?b6J>!%592SVmp1eliP9n7?Px4Q`vy^05vyu5C3?PN?5siU^lai?7WirLrXVQ3 zLqBZLHmrp8W=3gVp!HnvqBE-J%Zi)L&~E}b9Ef8mbvPP}XAq^-TVJ`1aH$ersL^z! zo%b<8q-YwmHG#sIOGR5dWt^%7Z|H33O$k(M0V6#@#^|&rf-={f+8yO61zQg7hHwjJ z2er<|xM`y?8;+ptIdZ*nng96t!;kmwYaTpk*J4rkdOp}Qz1kXxs8@__ZQ9>CmhJ{g zy|PWV3%T=#Ma-~+(H24zl-AOl#4wA5a{#;v;ebPw)y2xpunV^k;c_iby^ct>ezF&2 z%tZv7_KLYF>i(5Bw?29pZN;|@d7CZ)!O&h_|h8h*@8eKB}SXJtyN1U+={c9T)vu=taqQO8d z_=@2jswtwZU9TsWSGh1nKb`e^RG5jUH7f3v(HEvF$nF9veVz#mL6ZbTkMWEs{Rz66 z#&3#61)?*=5}7uq@Mh>kys91k-RO5K3?Dse?yjpN>)sq-?JZHT%oc z`nRv2@7WhUdgQJpz;7i>CLd`s4a@NK-;chPgiKm#DSj`oRz{{cBJ0UH91XVkp&Ic$ z{ax3mTLf|Ry;xFYYL!D0o*(!+bB8$;J{oUK{@}1o=wJ9>zq8v-S>dlmE%?#n_KPC4 z|L4dB+gEAX+3nJ3;5}mW`Jw{GQc7czI8)Mct23^}fh!$%Zij^(s2H{ujfs?}BT|RS znIMQ8=PbH-N8{O2I1%dhWoke-{_Gn2t#~P}E&R4=1N^lbIzD>bt}So=TMC_uH;7;I zqC&{YiyK%a0g#W4N30GTvlqMu9?yN{SFz=x05XTpxOd3gZVY+V4c!d!Mg3MfnqwFa1(Qz}(N>tdy ztcZl)wg`JyDp|IIXf9k*C~(Dm&Xx4LilxWgofcxM(h@#GP7f3*+85ds5=v+0kRi>G(*jD3R3b z{zQ#XkD}iZFiu9vWoZ?QR(Bl8wPrPq3w&y|c01iO;h2-#b_#u{EC7FmiAhn{ z9$lI-fzS}U#@7%4Tx;7K>V$kyNIbhnWd7zr@WW~!pT2x;;~vm`^x(bMk&12!LgI>2 zE>zNIeP{M4@RjdQPMi0dUG|qi8<8h6;=! z39i&LA%otAQfU}Leh@vr>w%!66dKnkvmpJtTywzul2SRkVXiCGiD2jt&E#n)_f>{j znaj4NM;uZ6P)M1hGtKuxlUJK&X%I4(AbL&5xgGjGf-tW3pqwXoWGbEY5x>J5duRe zlk2_~s#eM3!7L`}iuek8ezj5zbwRn%%`}Tk+l4fHPaNe5-MLNWF*dmR$)cCa0-MgG zTcuoM_&w!73^N-=Bv%~|B>YH@w5WAYNE=*9VMrimh62YZF>ubh=m%`0R@4oVOrpC; zdmA4Eg-JaEKAn1nEV`eqj|9eu8fD^8iOPJguIP)j$=9l#p1++A{`0v)eX+H9nd~=N z*>h8lZu?!cg$Ix3FJ?J@m)y6Sv%D4Pb6vjEbgAzZKwPV!v0at&sHZ{BQRKjj!CUPa zPeF)S{iHl|Y(yKC`YChtTSG2(4vOi3TO0HoTAfH82(7~1HC=PqGCd~_*Ba4r&IJoc zxEgnl)`f6zpjLlHs)G08*pS|9?p`K)N87!jo1lSA7-eW)^@Pf*Udc)TXVY7{G-kb9 z8hSa4Rp?f9)K5BGXY^w@%EaOSm$Uqv_a^w!1NrU*E3CT}lVcrg6;h7TuzMaSqzKN_ z3xT9k&CCkL|k3VPSij3s3nR4 zeNqywBE;{{4cz+SE{}cm&|U9X-y$=& zxOFtG64Q_7N#bm7(YMd#7hJ;+gq*VSNK~fK7~429G877V^iI@8!A{^7!m-|9=9_*d z5r87J*Bs4<8?_@}smTc_GS=jTY_CSyjXu*6Fc!-bU>IkBvx}~a(#{ra&=@uxFhz#8 zXsoxIHv|9#KS%Q@x@>JjswmD;>PA3XHKal3U}cs-Y(8m{&-+(pmBF04VcsH{ze zEzHK7#cCwSL0_Q@+DF%OrvLV49*0d}`@Eh$Jb%4=O!44Rd~dgIy9Bm(pqQY$LiH16 z)gINqu(dzYg3#ETJ={q0{Ax}SA3bi@bAJEosXS*eLqpYYj|_s5ZF7~cRB%MqmSSNNa1-HB zmas<^uJ3^DgU!dOO*Bi1oT|8}X^7spj>|`{nvyxR(u6&gL5d!{^p-3PQ^c)N+d56V z(YK4WSF=#3U&9>H3(ag7cB)*@tdnR2rzmDuBz3rj&C_2l$c)aP1`U60t@N$$6%LM6 zgbMTuexSo;_t20n;UlFnac5sC_iO0PEqhI#19#)&`Aw9kiBdx%d{Kti zwiePB{9K!}OJoXqLE*#-Cu-S2rW=OMFu-25#xZQ0^*SOHatJv#J(l-#4V$#BKxM&+@dg@ zO*hdAP|v9SB9?`|n-8))*^srqI zp8T8nSRm_&ObcNOdlapLmGEXykYg>ht=FAejLw`ADRC=h1f0YzMnaDK91 znJS^dcbZ)qmFEiTG0;nf1(X%ATqqP-J()n9)1u)F6uHE(dWyLr(yLWhD2Fe2lF&}* z%b41GR`DeuJ?}(3wZ5-Xh6+oHhsP(zb_J>uw0f6bmxIGHir4{aJc?=xN4S;`irq)& z#}w^0VrVvKC)0)R1yZ{yqKewQwA|>)8qbFL+bSCNlJrkPVR{pV_8X7ZzoVh?USIix zN9`Bwj7Z(R;9nCsDQA!O9IIF8(h~0Ih_GG*-h)`da(06#S*j~Kh?M{%mfSSpD<5c4 z=_$H?-6{4Nq|%kesb59eNC`^&*eWP{E0W->mV*MBMpIb~^}j6a zQH0K5tc3Q)q2U$({^`rpm+zauM^GO;aMzmdw|n#|jzvd1$`}Hh#cohTG6ENScaD`! zhzR}*Q)^j>HhYJs>^a^-%%aiS-0`LC6Sa|+1A{XaCP*tD#yye-b85T+ah%z$o;{b| zHzp`S*e7z*drV>!!s_I7TU><(MT-Zo_9b?2!)QOy;8euV7iB(6q@Obetl&lNSF2G8 zOzV7NBd)O(GzPZRc?uAGfF3R?QaXOhQ6TpH$}lw-(M#2PZ$Sn9HlAKiCkxC7v)s!i1Ugfh|ca- zDXg`WhHj63C(`wT$B|n+jiMHU!SC9v;Pm&w3q}jZ6k|1q`dyJo?zNS$uJie~0Pdql z?h0`IH?3}A!!7uS5m_@h>m{0wgv=a@KY<0(i&ly=^kG-fvN)kp(pMNGH0+@!XYy%59hBCthJ)&<tx>=vMDj)Q8G% zNahA&Z*$)FryzvKdObx20Rzs2yC;_R=yHaj>e)uDJ*YbT%mFC(-w-|^(=@w8zrR? z-Nd-I>W^b0SKqLF_mmMT=W?b$gkEOa=pc%sH`_6iAH_g@@N1(^a4XR%LRx(W9<3u@ zI~#xhaeaDfU;cVuWAwp8cip7vtzLg1c+p;(270Cd7KMX~jL1-{^#)WwLU7*D&E`4Jj#JQSTqVeERA0SWiE+yZvtu9=j{>O|NM+W5}yD zkb(^&RzjH8b3WNC$6RPCB0TTwPWqgLeT;@!NO4nLAPl1P$Kfh9lqk>ay`4iQyPD?d z!4)yo`yTTHpH@P64ozz+q7`=hRmejDNkI#Fo#uMZ$4|_0tIZx2;^*v>a%iO=t>;jz zfGqksW+G)a$iK5eY!vxoijiwqt1&Af_Bpjinx058dk8!UqY8N{$9BTJ=6-)O5c{@G zfBGZl7f*M4${#&+S6wXoihWnaP%nrbEp7UAq&s_|wLr`~4zw`sfgF*JPD8VH^j#P) z29mfbQG{zmMK%0i^{)gkskYwY;sX!Wy2Q0dGzdWjZm8&<;3~OMpM8UU2ZOAD8&WYa zQKJp#ISa$frNn?h*ur7JVq8P#SbwQTK>}baEpdwLiZL9r?xC3I6@Js0p-ihmsY@t# zVmnTEsW)P&n_#%67D&7r*Z=NcKYgD6`uXlAee}q^XD8Jv*RoSIeeOvs*c1-IjGN}l zI5;Ubte?PvW9wKXYBcTW$mfao=B99ue7_Px=Z;f@3(4hze`vv>H=n7!isSZnFF?*eO_{ zi=Aga7#X+6jCjY$$y81g+2oaaE^1E}_-f8A)H$zRjK6Q6KexX=-8ZRu^w7OGrJD-W z5K*%k%34ENUC=zaFtw65@-Vh+w zMV(OpD2HS^BpftqJtFPA=)#9B&_6!S#JD~Q5RavCUyTDOx;t#s;585m4$3g3}rya+lVM zj{!xPMLCeTv4WY9*dRq{$b-?3h~8ImjYUyprbjc!s&TLi9}P>s;I5mL7ZR}^o&!{E zQawU&h<9kYqKlPI?+PZAVmH&*rUb=s3}dNGOM7;lhcqflyH@m+a|lt!iQxU_Y~AUX zx`r%Hs`3>3#yQvv5#sYr9`^UBV0{!P{qz6iq5Ji78+Sc)A3caynDnL)I~RJ@8=pYu zkC-aoqKC6d%Syb@H`s%x(6SX8;gPffmpAOl6ajJm)te3R4UFlcCPoX-S|JvjmlwJb zlTiG0Cc;K2C;@lp5EuCS40HY>y4F*1b+m46opMcm%(u>iNektef6wjwV$8< z_0z|>K7VK*=i7DLmmfaeZP0l1Fy0<6y+EddSZ_)zZU3%p9NuQ=01{l{=g+d?BO zkWq{B8s}YF?E)`aU?OFiPM?Sn()5BMRAD-cd6~G0Pq_0%N+maDqcmIuv2l*Ugb+-g zH@Byvk0DS)OR1|iq5>73UXAifI(-Am2LW}$HOw+u%ua093;B0_xu}6Zeo~_OLt$<# z%>URGEh2}}k;p)f!Ef$CEQP17Q9vH4fSU8$^nU#G!}Hjme)>4u5r=)5-v9o6`#isI zU!Oj%uR>FQe)@iW_;KAgwR!Ns-lpI3GT{xeVSS%Qr24qA!P-Gg0UL<4>cp>%J|y4> zZrm-4C-122P+%8AD-##Au-b}UWF%Lsv;ly`4o#p&kA~>Frm_vh_bi5}i-UbHV0sPK zc$ZskfJDmlB0*WG#c|%y_0`%J7{yFYn6j9{uQv8#IV>>+;c16;soicwoG_1_pQ}rm zQ4!K$-db0(+5`c^c`;;M(~ZSe`A7lOZ@$U@sQ>!-@9W1Omjd>iUeC99{q)n1fBej8 z|NS1xM~~_CEz~aJkrxxLk`Eun5cp!KuNhhNh>uDEm_k6c=fPN2;y7 z(bJ)OA+Vd32XU+j^uqa!ih~w)-iY8+Hdz&ZGG2!?m~jpmu04`Mmnmgo+^Nk0grd5z ziG3Dr2~BF1A?D@;5Z-0B|M)tv@`HLG_^UZc)oPJ>B ztEgBGS~?U>VsE)duAx*7Yf`Qdh<8Ofe^`Z2#&6;IMp=+pTWl~!rK2uJ0@82VEeq9? zxdXL5CG{eROq-0pY{pa+c$6yF^#TtFte}L-r~;hc%+cE2P}vo^S(Vy;5n2VlE?z&V zOT?7gxFa}P6sLYZZyhk4zV2SMW?-*%Ki35 z&gb5_)Pu+Eil)8l)p?Azt{pHU4cJw0AxK))

AKXIhcB3Gr=kdt@)2^xbiEifZ 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𗸃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

I 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PW%Gh(GA35SHsIP&x@M} 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 z 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�BoG9Eo)#1mGgs6GC;9q)-<4BS;@2Ffk@=K>9Yy8 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

gpzn6P_mwW2lshr0?PuEm=bG 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%0D~`!>hCg=C>WtT#Zwgv?)~+N{Ff% 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®9U3sJ_%}2aS|x1U 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ℑ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%0DSHo}*pMLWuR89GAx7(J==xw-v3MQWu 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

CbxighG+4@HQ34UAgglS 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˃C|KVUx4-e@T+{eh{x%Ao??3&{L;4d!c{8Rv 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�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 P8IZkFXGTAN+P1;+wuM`%=Ha12_hI_uTt zk?+#7$mQtgRu!xq-7-wG`bI_x{9jOouVtN#(t$OgYUBJ_^?+ZfnbEJhV9y5H(c7r1 zGBm1fg{rauWE`X|>QzC(qq0rKkdv0*`xWwOMxjY&aqU&yRcaos%c6Dh1ZfS01 zR)urP)I@MnxBWPKTKvja?cuZ6j}CShe$Tfax{Gr>XFhg6uBY?S*WY-57UK^UoF?!i z)*^NMBBMb`Yfc-bm9pioETugeql0s+cDfXf>X>d~IO+KPL)7VWmqkutK7 zmWnV!JZgPp5-#oD&YIc;9gSm|AMm2P_0U~kboIRG>if6oWF2CpFiyT|rT}BNj?Zn` zwHupE_D+zzNc+y&KGa*~OZ5`StWuI)rK|dpDYXO4ywp40ecgr`E)x10I?LZGlo(0% z2|)1OGf7m|%V(bZAuYOF58dUWv+pw8kG}rKd$;Ihppd-k6OG)YT~##_WU5UVR0eBE zO?ES@yt0(&x?Fqh*gVoEOH5;m&qc)r ze2SuSGwC{|l6+w9oV=!kbTvC$U$^$2c?3sE1!3L&*WZAGunn>lb|xm%_~&-H>o`W0 z11_;Nb#Phv=qy4r|!X&Br5S zi14!A=~6J6mCt1t!)4Z&j4h&XsZYtI>1Ma|6u0z}q<58$GPik@97iu@Hsg5LmZwWr zhV?5BohnvIN6k9AGPGn=dz1m`oYVG@2!VdFJE5V zQr~*uE{Il=9^j7=t;et5yNJJZ(4n28=0#$cI-GStyjo1U*j4LYYe{;_)=4phh0vVr z*^((Ux7>UUI=i!0zCmnB?@Lw(x3kMOD1$xZM~JrkiI+yLT6QZzkU$&HeQ+UkReP#@ zaSQ_wP!+!RbI5-66T<3HD`Wb`O9=>`eZ}3ZYf7`*ka-R9F_`Z80@qJ)+ zveG}Oo=vYI?U8gw98h;9dmtC`r5{egoXH?US_foOX&gV^>>{#wjl$+x71GJ6?NGhb zvPhRQ&D^=Wl9D8=hAMUkIp2}z2B7Wkzxf7=pc%*Lq`;5@d2Egp#ekih{M6fDn|#-n zI%TT_7}GMMw^f?9#s(=>7wML6>6e<}O;V>$-6ZS|shPV!Qk%gv4kAd9>G^ zw3^NkZ<{>SQYTFlRGnm|B$nlxY`j3UG3pGcsVRF&HI{tn_<4|6se4{R8=t3xj( zsQSuL1w)&q5zZL&K+f^{}Rd2BLvbaEYCws>9Vx~N+dW8pbnwcE2~3*#Z@hM@`^fD%8O zyyW@LG8E~CmaJ+7{%k-7Tx6`7Gg7jYM%^+Jdy(#~YOxxj&rJtW9|s+`>QjnR%wG<^ z#Yzfgrsn#BYnj<3F%t5qTY?QlNw6B9kHFHTSa|mC+^^U7uU%B$df2Wc_IK}&+~3LF z(RY6Fh+)MlCnpj`F94QMInBB&Od@BvAI1S`)XGFV6+eD7p2p z{dg$(2Vb=}q`#`#1V>u0V}`&0_$sGiKZA=Ew4ifVHfVN!wQd-k+P0hSkF0)xX8RIyJSV4*% z!!WQr@T-29tV`{jTkXw-yhb~=JG1>(p71*#z2=!7zIxlPI$l0poD|-AvBq%x9%3z$5`cMHyUVAUM%c`q(Sw8NLzg?L*7Hhj_w!Hcx|(MAG4{y(fMYi zqS2BqDI~X7l^LvQHCDEBb}iWC`N(qEO-;vHa;R^`vb8QOpl`uuVnbD7mA>zceQ zsp>uDz+QaMJh&%|wKi;bE#%&D?3j z^<#9s*AWwdKJPAFVd;K!6}pVTa*Z*J%nL*_VxFTOn`zqN3(p6(kLl=?WuWU|*9JCV z;axiM@9w`nYAeRk)<`xEsj{_gA2~;rR>q{M)oYfe&ffvzOuf)D7#!+%8z@v zZS&M=aLT+J>&C>GfBu-+v7g`c#xl8s^JLc}iGmLnNnE9hDg(wI97Z}iH07k}8( z^W@d8#mH|PL2JpX)WbQaDq)#Ovp5UC;-ynHjdN`L9qQ1pO87WwQ-?TxmDKf&=dR#e zKh95>)kiPVD|VAzRSB*{R)kH=YYf&@b;6Y?VJg|Mkm>+Da=w%;iSgzX!Myag`{IpDr)dGmQ%Xewp30iaw*|4Fk-^n%_y3EHyWNz1Wj z-@yNo*I=D3dvv)o%*!)kF8B$i=6{2vvX+q8TDtlx($q;?&RDXOW-ui@MS!!-$lrhm zvkQ#KATSMaSUC!Wa|Oq(ALs0&@#gjO`)diH1}_gRkgp2B+JJGT+#P$j7Pk^9Ug*~w z!l^JWKnI2cDa-0T%W_E$ZWQl^#E-!bQ#@!$c>ojxia3;|;>avCb=yg2Y)h$cP7kK2 z^Xx8JKlT90Cl?R~5pQ2Z-+44At3+T7c+57px8x`Jtc6T9hJ4n+U3JNQOUKBb;8~@) zx>HYW$`9%BkSHk2bwFN_SV_pHLzt3Pxnd&(kLnjhFH8xhU)1*iwpz9_nkRSHS`u#- z$$6uR8GzVFI&?9Guk27SGw`r2;Ckw^au18JIN873S+_F_ptsm-6pV1)$RMHsOm)#5 zV42dnbgJ{M;LDWO+dcnt-~V#GRdRh;ZM?bv{{5S;B;@+ywcG(Nbl+|~j92@3!l{qv zDZGfm5j;?tfEZ9SnUUZH%9*TaFMHe+Nx~*eKPi|B#_w5zGxB!pOO-F1b^Fr9CCZv8kvEQ;x{&F61x6uzzizLFzg zNN!Y#_>(4hWiJ`PmZC3~NVxY}V^??ys~3jaCi!Dk<6%~^k^vi%o}>wu2g|ih5+Z@o zl%Z%zcyVs5Bpx<<0AY-}rk@8?a7KCQU3K*Qu`?gr_^7&1m>e*1$PGb~U}U6*Z=v(i zS`ua-Aa)Ub23NXT@?&=3SIfdDCN|w}leVlXw_xH1HY=nq5J3S;n_heFDF+b`&~tZ5g?hAH)N+IVXkOmU5Asy zkiL!(=u**^ij`!BnzO4-eFe%69^T^GBnqh125ibtBpAG;Zy2*YMz_x8fIwt8OD?KS zvX<>+U&wwxW|mLCcVIab5|_?z0L4U=)`m{|i<5t_+W8#(}CH~K0A?2(&Su?93@mkBkEl_v$Zk`*TW z5a>d}sqA|q(STk~N5tp3fx5QoR9Aw}ZT*BPT?!$dFu@<^&T`?k)=Gf|MNT2$u_lUy z6+Fw45dba9+K6XpRt|~g; z1H;Eua?LRkDMsJX)d8DQc~6w&q&B$I>DDk~!t-H`W=cxU?>UGAUiyQ?_K*qyC!Ael z&ByN13Rnf>NzDep$64bcJ*rbuATleDRUg~xx40z_SyY-D+G3BR@JpF z$=(EkE8Q=ixm6a(c2o6y0Dx(La$P=UI$mr%{+1-Lg7t)Iu0EouU{dci!F$Rm7jQ4Y z$WuYOw|qnOv7?;Fq0`nt!Ho-%$9%`o#(Yh{o*uE^I?a4=nfiPHeCss*{}-r!_uqZ` z9_0IP;m5b|<6HRgCxIVcO86wm3Pm-=vrUFu5|8Skh0eAavalpE6X8Q9jyS8Mh(Ib_ zEUhF3+O&??*^5N@m)yjNoT<9W${Ng%k#I_r(QGcd!|y{~`Z`tf=fraB$2m{y>z7|X zjP>k`CK0P^g6^yy(7@7lcTGkC#i@hAL^F0IRPIcA@MR{#M#(zGBALlosuNgsx5;ON z#FtU6G2LaRpZOy+Yg(&-6OqR8NlC1{Y%6_Cf&wUutn?#8y|)L3$FzR(3s3I76BJR3 zRa1vur0dY8V|mV^8&J~!BA1!~tRsNPMP!yXEcw9f+_O$BfCg&&Fd>1K5ZK=U2OiANZOUR-d+{;?J!KrAt;*1y43(^n^!9@2yiqY z=dga5Dse@5sPv`=@j*~zb!~Fq$l%x=b1jh=v0M&aohVr?YHk5Pwq(VZ8k}pWSG%JA zuJ-z?7vtGcM6$lPfAi+D9sJhActzgPom|J>%YIbTyL4g;T!D~0%ZOFhzSXDcp&2HX zUS*IHhn%iwl)bD;pheO`A5E8NG5QEp$@=bSWbz2UACvGhRBGfE@X3EpaWsrRwOXQz zs$09LjA3ZyGTgQNVI*b(tZXMxkelT0)8tF1nhL|4gmG4x`mNXN;l4e;|Ks)SyY2h!F+yEb zoZol|ue3tH+bflxqE|`;mI0CoFSyM>EP4iy6_O+jmFLot`pg^bs*;o~7YWjYO%fgV zA&^szORBF2HIR$f;6GHbAU8N-uT%S%tMZ&HMYnRf%6=%uwoCCogN4t0`o@oQS}VUy zx|lD&=wH3LdPxmas11~xH)~)!=d8*0P<@1C_d~NxplQS0dS?OUEj>_J6r5oNV5!`S z;8;!mhjO5*up{`}wz{#?T66M)U3NmFj0Xidpj$OkMdoGe8Ku~RO+S5QC&-#$?<$LV zkb31+JC?L2jm%RAyHldS=Fvi8`nFj5b@(c0aMc8vRYC%a8|lQ&qh1oYQmjPu2dq|( z#||Pmc%SOb4pNH%p-PXlm$QN9)NSGny8MdGkmg$ngoq+xau5o*p-xpFbw*WACBe&H zTsldE#WFP94h~kNic*-7K2#;ZzMM7M)t#Eiz>r(Ag{r~Q-LgntWloDbgu%5=oLGJghg$n;L>E!$oqp40eExEoVu4x5)26s-y{7qKZf6 zAZG_PvNI*tr~tw7og5ZGMYZ>QH^mhB#H&dkz~$X)^lmBPd&@5jU}g7r|NXa~#DC|W z#FI!=v+xwFYJkJNTqg=J-2)9fODW1?3tq1+1;dg%p7g&{C7Hq07GcW-olz3@njT?E z=ED?eg!}GU#F5}FyNxZw86&(^47^lUKK+^}@#C#qmMSu_IwpDeY~AI`J=iu`M{cPN z$@kOR!a!@a z+X(A|?ckpgU9P#yY*(iRpl@|ZfQO1oUJYx0*KJ8^bJQlQ3i(=8=MVX}HRRJv zIo2r{{nB`T|Ljfc&zHZHgT3v*T{)mgC$p3E)5~KYn-6A12&l&RwPR&xneIOuaRV>4p zbw|AnJC*dy>qS*)FVXc14;~8$wq#FMdVZIzhL7Ffp6TLue(m?i%jYj2UjOdnfBpUD z|6}hxel^RkEI)LWn8hkqvAQ92YtVoO914iw@rEM-InrF?2OOIbtT2fek<20*&_5;D zE$_Ye-g~vwEjJbPTQ?%JGVb?fgC)MG?T(T8`ZnK%K)})ri1_Y zy4bjz|AR8hsz`*<^XNc~%BCj1s%auE%a6;{e6#p04!Qs}U z|F_IB=QHyg58YLj7JKSJeu(fOrtAl}jqoSUb@q0VHIr8zjFHGPIdFN=5FS33Y|D~E zGi+7;lu)1CC9Iu7+RQGLj+9(u)}?mvg>a$PNw`!dI6#4P-%bQ7S_~ukbEo^QALq12 z{*LEwp6oAPyg1g#lc6@`&tE@(_4ZnmSJRPZ>|#4B;l%d2UfDY#_YcE<;z?C zckMv1Wmwn<>;ULlT15p{IdsSJJ}w`PODU^0md8#cV}7e0jU+w^{n-_Pn#+YOmfrzwmmy@xcArh;-_3V*x7J{y>)LV6mevfEas+ zSIdgN zpw47#0VQn7Z0`QykDyQs)C$3XaeSE2OC#!C0t;-&hElhFVCK!&imquQ1ef*ZWsa^d z>G~Ed?pcE5&Kd0l&8hRmEvOSX-S9%7uo6aC{17W4MICv8)_a{y``Lv3#$$Y5_FC{y z?$>AQk1x{sjR)>Z4X8O;96m~;xtu3Fn+zmnVCRkw$4Xcr2=RVScPV_kuc#(FaMqOk zd2x<~K@0@mjED`5bF zRst%<#j~`yYV?`_pStp=1grA)3lv5`bt-Q)kdtPHFS43kNrn#0XGljiRUdAZ7`hp< z{s_k@yMF!fqx+qB4Jc{~rh7@epG(Ak`1aZT>n}cg<}STlZ#!&P5B1~eP(MCEl#O%p zCZr>>03ykyP;zSk*uvpP--kbM3^fb>U`rOcAZBY73M-h%Yt zg}e(%4;El_^z14$o9UT4t~ZSlHK4X~_g9aDY*`YNTy(am0@|TYeXpb(Qikjvr7{8MvZjT!2GpjXSJQ)nz`5;9-wO6 zyTA4kAdV2K>T9~nk$tMm%GCr)o@ZF5S0|?~_^}5r!@PSZMygnigbn5JMueFVJbRu+ z%OW{Ro;WqjF1dF#2Su6eC8rMA$yl$XiuS^Yw-L|4{MIvl+IoL@zaU`!#ZrIBY8U;v zw;sK#g1zM=YF8d$2O6j9u|O*7q+K0k#~REL3Z+oYH1TAC1WjTs%gZUp`N|^`EQb6O z0GkpOnd(E$=@2Z)o=gTwcZpG|@=dI+tQLuY5U2{vio=uIh&=o5AJGo9J#Tfyra;Jw zYOUTq_YO;8SiG9zdCUkz>~_~?$-xkxdE6ZY`POdJhwkMIfjg_(vNiTF;52G_pnWn1 zDA~h~P3H-UYz;?H1yX}-`MZBqPXYJuHtkl+=w(*OI&&ZSePw9&D-Vz)WjH|A#9!IV zGF>d=1x8^BupU+?AJ{Dr0!eHxL{%;w7-6$4y*NC)9*)e*n=vc@BZ=Qs4J+Wi7x?QLTeJqce;)=1T1x>t5m*9 zVLHSP{VdQ=wiyTqOizXZ=QLiof?iPBG8LHysr|BS$ERa7amTxd{Rf3F($O8 zu&LwSKcT1CnpjE8$e4p5Ktxc#Owv^@Z^?pzBW(Fu+EIBwK6&YyGdc%d(1p_SmCxOk z%uSl!QW~2Q(q^7!k_S>5QI+7^sO>_)GDgCXltZR5cmL#Z>6^9Yg9ioXwLt|Ezm(Tu zGTz8tQ(YgM)Nhi`7`CyJvT{PRAVp(hOKQ9T!ZLKZ@!_?xf7<5tx9n*w31;x(TaEuv zzTj;neN2K}W-Z+PQ=k6q#}BUL?($x9YsadsT)5P1q2fvgR3|v!WmBO@M?{lQMYYm3&0hTcFVN8v=j;A zvsr;=Hfr=ueJzlGa)*WfwaGT-2jPsK_y*jC7 z_}+I#r10E-c;jKaSZ?)c_~6Lp-Jc(z|1i93I9LtXy@Fss=)4^}p)*;40`vFu$_tqRQgfDt%;KfFiXqF@+48GticK$XwtXVo78(kp=E zp`uyIyZ{xJ%10}|(1)7Y;!}UAuAE3XDz;aryuJHp4@3p7iCJZ4;J#I-fG}jKND78I zPr8xq#E2!4#L{)nRTxPX<$KRN_h~bWlO&d#NlZ&uyVTI)DK&QQ)XFP0On_}u70Wb1 zt~Wlj1A0w&|D2wpHUn3(UgNPkoYLO9 zYgX%`lYo*36U+fs-+7QZi;kF$Gui6qPu<^8K>~6MK?-*lE^)VhoYPh(cz%BEib$L@ zINcliC5SY^r8>^aDJhY$UDcmT6jJ-Iam{OFbh_;ykl?O%PX+RC;N}3nTjit;3Hn>d|*Ka&C0Ms z!m987?w>zacGvapaH=x&71E#=h88Z}iNU-gl#V=~nIHB|Tyn-6JWf)@bTdoUWS&UB zbb7$-#Kfnl;4Hfu3Quz+^iz|Ic5yHGE^_2ZnY-S3~jyl?xOa_O8a zZ6K_Ukm?HRhOvIx*7^hRCkWHIRP*56&QX9KlS7kn_DAfs>$GlpX8LVc4JnX)*l zjA}ta5>sX!LYkTS+%su!>u6I#X7MCk=l?|Aq;^uF15W{o$LvS-$Z^)c(=KD_kivw- zGmsEe#06j9-7iU}kqUwvefUys%8=-|+CJ=(x~_wViu=jNYB^XT&m43ZN;r>j4oN+* zFwdQPw|<=Se7;#Pe{r>4JgG5n13QYu(>3}a}9 z6dz&)2^%SD_w1ncuCu*=z=psop$;@I9Pom@$7aypo z8Nl|HfUA4W-dNUdSQfvJ3*aHOwZ=|Z>ZXelsh&(cgAT+1%7H;V^Q@dFH_&NkAHbLM zjl``V=d5n|<+JDGTES#%Oq5Q$%8U{;)=eC%T0nukPj;)_gh>Qz@LUzI%T;9XMlP>u z0Gj|%Ri+yzTunJ+jhy*cq6S&CM9psEc{j7II(T9Rz?!gWd6{mr^*dB$gr|3H&5ap4n^b>_zqVq(0|J zU6+#+1kmzeP5{7GzKSdyvm~#Rbc9027jNG7R}9w$eZBFxU2R-9r^fY1=(Gq_*t!LFO;<^c zXq~&lG8<*U%1v5XhoXS)rFx1C>)4ja7-9If5=zGoNB4JzTFk6!GWm3{USO~coKCOo z604B>sq3kW_shzst0nVXeAiOlzz$u?)T7XSz>cMw3K~wJvaL>JxKf%d5g?^99?ZD) zDL_&~c8;_ZAWcqCo5|;A6}h9jgr&ML>&{aWI}UQno93e8fM6uhZqDoNx8J_JI4HUG zh+Qc4gO8v3Z?qtM^8O1C(1QS;21zt97@X3qU=;J02PW0p8)L-L)E>ny zVH$}Q>dq#E*AZo)PJ9OP1?gUcW^}y*Sl4$`3_6!)GGUmae}t24Lyqb0U;GHwDJtE7 zi8@)mCv&g}n?RbR79}$=hf1K32YZy*nhr_Dd~?I_90&XC>txjsQ!oy~NvPWkiu z^@|s;zkG7P=JWeCF3odpJ$x6--#)eRo9EJ>y#K<-2(>Djh_maUq(FjL#8pLP1P>ln z?Uz#fS0i7JnYn>P@3#h#1Y2j9LF5Mktty_bp^mZwpy`a)~*y?#j@mEKOY6(_;JoC{o7^{JO_}@YGLSv zE74S&4~P`l%j|H^+S+VpkRRcRr6u6L^%s@|r9th*rv{1=3S6nFBUzU2mdG&Rcu-WL zfK0j_`C}B7BIzK~N`7H{FpH{a`PEaw`*-@VQ{gAS|92mY_or9B$H#xrL*7`59?FzM zuWJD?)dp%WbwWdN)nB4R z(U~heBW-wpb5q&$FHEcO#hGdeE+xNV`*s^sfy*AHnYZKA1e} zVDiZap~QfTtB)SgzNVQB7-^MkXj-l-s8TOhd$f#ab2!~qP?v3@?@bMk;4%4=l4O&% zbk=RLhj_xf7#?-_nC%9eR1`uzL^eyHdBHv1F8O?F$XKz_*B;f9&!>(=+;I%DY;RJF zv{h%!OSg&gmf2-9QxYy;ki58o`ksmMJ_Z@YvN01eB_|n*v7l5{2rUl4#RagJu8M;M zNz7@g%l_P7{VV8R-g*G99v_C&@!>zW4#1gx)Dss+F^@V9k8OCqZpb6Ox##7dA zUS&R8Yo2&0Yp^z&iqN95Q5VAUUX?B1n^mIlc|u8llwfdH7U zrbrS*St^9}P7;C)3xQ?JKdE}Vyn&G=`8yFWVu)5F|;<_sw$n4 zVWC9n0KPNywYT(bd7?IY&s)da>{lQ}W7zBDPts&zWUN}EbZff75UuzgQ;>AXjMJIX zcelnjvrBZ-&S9o&QV}Tt%$ByUUe8{0AsrOh6?GDXuG+Xk$^mePdbl;{#FWoudP)Rt zGm0ibsiiQlBJoy%@q1X^#rKxUI3+t3_OmS~(>9Oda}Vk^MewRDwRAzhorxix7s!vs z^Ut5H`zO76tK^sO| ze}pfm^ZX>~3;_ADI(qtWQscWxefZu+keTjj32Ey5*)gk04Q!`M#h{Yw!ag}fELoX^ zTqEmPDL^f$J%an;C!?`fSAvo5rh0AJcZ5iMk69Ahb*uVjZw|~n?A1* za8qzPK7m&oSha_%NOBu~&4g&PZ!?oA#M+wVM#>+Hv_-na4#qA`a#3TjjjC$4Wa}so zQgw)IA}&cGE(u8a5xwg7)jsBik&%=y^XgU4R|R6H%y8?WyT}arY5brZddMcRTXWFC`!TRxvPrSRF;$uxWvv+wC!I{(Oq&o{23u@dprNkLhPS#evSrug zf<3f}(j?A|Ud%``fihcdVXOry0&P~p`F1goHG0l8GO&WxJRkwr$(wsx5I%Vz%dLJHbP}CQi+{6DZ3HEAkEXji_LGb)M&Z zBlTO)E+ELQ2kZ(2aVM?s$5r=p45Chte)?>Eb$aBbU1a1mCqLjA`mS3x38Tv4EEwJN zIZz_IwafAymq)K=!y%`$cH;iw7GwpntG6g)wM^J>THW&5@%iHP=tu9;;FEp-`l5gP)+2Xi^?lf* zXCG&eUUwGi7@aN@+@2(=RY?{A2}KGke6XIc4(j_kLk1}TlBUv5(LqAz6 z%pU(>`!^ZmL1+exL7Ed;&S_b8Gp2~ zSM5r+RtOk0N#HuE`wAjEx;h_HV2*+misU|Vv|1?&ZJ$_ttcjF@s%3~Y>hlUi8qk^L zCI|M~+l?k}FdUH4jO7u9Ds9=WTU9pR+e@oQ7AkI)q=N0_SaurNVFN&YXbH#vhe zwZTgwN@iuyS1{1XYTXuvk{GCq)q6?ff=Z??u*+!t7%3|!xJrZr+u5NhePss6MfiDl zt}dWW-_R;%;v&ZRFqpjseUnY+1eK2JZgEWTbQzYk^UbAhQY+y^mn8E%9Wcv zIaAulxa4#~+dK>o)+T!ycpL)&QDPF3$ZYL>%w9Txb+a}7o-(&7WTP40*>w&!!=escJcUK+Vo^ z0d9J0GgvhV1VR>hvdGCaAGA_;9NjO^tVM`{9Y!Anipr@HJAhts9JPr-y%SkRxz^=s z*N8gW(8EO5?{27xOeNpyeK<7Sm!sZZr^|50jh4z zf-W2WBdvd@R)y8P?TxSw%PFd<0%h1KYg1bt2`YDR!BqL24c2ve7s1LqDAsIGmRS&gD&)wpstQKk->Q*CN} z+&YFRJ;RQpUp3acX0}de5qy7i56uXHfTR`^$3n0+sMlAM?vqoareiY<`TeQ`Q$=V% zuw*y6(ePi;LN<0=_zO@}nup&eaOvRWxbG`&7%eh_Q>Fa z*b1WL`HZfcA@tp-Gg{Wrc1vZL#jdU@xOMEVnL2gK=eKU(GXu*;twnA83&MT(FMkB} zr*cTnsoCEHHjwCHrG2r`aMg@=F!&%_cwhE$ef&c;bACd^RXu*Cn;VPPbvv}z&f zl+{ZBv}B!8mUT$bEJ1r6MWhMDa&7ns`#)Qm$v;KiKnqIg%$8MvoHtcVAfIQc+CT@( zV4nB#lceZU?&VPX9;~?IO`0QLr5F~tfrS3oMOwfiU;nCpbCN`Q*<_pi|RQ&>#2zUSL$B>(qVnHZFp>|7y z)$#6Xrr%r5PnkU2!!RH>9;hi{68Q3Q0qNN>y0syjGTxQ#Lu^qqhu?CM@>ZihCv0_j z85+x`G|HkjLY|AMHHC3*O(uD6fjdIgoZe)HB{q5HGFhU+9cH}2xi-2eokRlk?zLF8 zeNHA8lncO|iw9ac17Qs_E&((zJ%DxeXLTN>%HV^A(TU*Xf7^>UWS#Sw_VwL(-R|ht zBY6e#x)bDmm~xP+CuN^RcBD*RN$`XXW#_Ss(mLdU{8FnQLrNnMWD?QQ;3I3N4!l1U z9S&=O>}w#r)Shi<2LqkFj5c%(-s*T4>PpPABS|t+sqOAx`}AmHkW)Rs*?4#{zfrv* za$PI{2twK#^2t_%X%AVBWJz5{tFFz+Mk|mhBhy+XebV2Zys!nU)KS${Gu2t+HJjOz zY+=K_$dOz}j;&aG_pg8NWA~frW4B7-H#l7wPvetKX3M}M%DExV1?W%Y73ua$RwK#3 zN-BiaK^hFW$<-EEI`TvYlnu{D;4g*95?s2_k~m@HhuQ$L>1bJSP*smGEzgR*`!|kW z@Zoft=QGPuDtIPXUVN?zdp1G0@e)R1>uC=;AFHrv9h&MN3uH3z=mOd0Y+AdJ|yr}TmdXW}8w?Ix=zr!k$$ zI);T9p449)*-~J#F#A^X5-TW48`oF3H1OP=FYj+X5x=TB@U4gKss_6|X|O*;rS+{f zWAFa$k5Ce+Gi!oMFKrNqmzri&V&H?+oRiUW$SI9HxFs@nfD@@?$dIphmYeGh@?m@} z0G}-hC)U&&>i9e=ws)CiAOn)K(YDq-LAgX-(FU^lS%V#vtS(o;b%}YZhYuK6<-kMo z+LpMi?m{oE+8TNWIO%CR@Z0J9TDQc;!n3O+&v^16$x$d$l%tjx;x+>4UG&#=uw*1~ znq!JYzr8iMX5uz;EkAvTBMmGlOrWeH2h|&z#h|i1VPPsLXgeY=VWu99d;Cv ztRxns$wI^v1Y0~YD!GuQ$=ZWzU_GIWl)hkBWKTnq0bow)5Q{RWrO(<*P3m~+Ef5E- z7Tvi==8s;qFE4JaZ#-mIZmd6CYW5+P+GEf`{CEBoS^XzJ`s}^|_`i7ZWd9mYYCM!| zdO#Sqd(-5R$`0=;t&$6bs9f- z^{KOMIEeM-?%zGmeUjP;g081yQH)F8Se+&{#>O)frKur+p&dF6mx8eK%R??y#olF5 z37}FWY%Cs$h-FkB58!58pZ{Cndc(z`)OG)b6j^x$aK6|R|dxWsadLy=^?HCR_XZZ|> zAz2r!ZhHvGNe6SmNPrxEUIZ&c*g988t1*tbCa6tF-A0(LA?T&LWGk{eG{)!>Qx`Nu z$*A)~=I1yOhcR7f$oW-z6sm#QnW+=GnM^cEdOjXbN1V-jj5WJ7TII3|(%>(;xMZri z>S1bQy!F71nhmjQWbJ3*JviPMlguQV>Y8Qo%^=~UWJ?&?H5mB$AoJynR|Mp4J!n^f zQ9J>ohY0;%w-s!f3_o>;XJ6xKcUpV{;sMFXeyB5^U`upXV=J!$GpZyrS&J+=1;_+s zDIgb_6qPFPC|~4r3*MTMVMww7j0>hQ>#`k&4_o&w-TnKI!HVVkj+*Z~Y93KXjqg$3 z&_&&r+r|!moMzp_!EnhVEik;jJ2T zDvu1=1GY?X%z9_A<{N8jmLOw-<#oIiRk;`XUh+K6U~p4a9@RbRPof-T8n{8+%WM#K zHtkYi{axYPtyAmwnf^gD{YPlCbh;<;ss&Y)Rens&?PE5+K@iqVCh%7(=H4Exl2{?G{gF_yq*n)3qb3c$O_ zAaOAsm5t>3jKyZF0fcuRn?JgGbg(o{vE zfeNWviDY4OC=$(0xytzsQ~|+0@A<#*?Csmn-#q#J{`DXK@(H2!)!U0+%Nvj16{D~Z zU4!F8xCSd4t6?DN=qHh=<(J5Cw<6;`TVYy@_0C&orE1Gy^QJ>Omt<+#md`p@FwLZr zMwCMCAtQQNZf#ZhO0wDKqFR}#_C*U|jLV1Mmkd=>xcd)2eFQ3G1^S%KITn5>No#J_0A(f1TTAy`QSUU?5DguE#dblAWRib+& z1(tGUiHcxU$Ok(NQbJymm%Yj&Vv=do4BIbA>;^a)XOnzLq+M`aCKzZIwB*8x=2^RT zYh8@8+iBwjd1`sq+(30R|q>C5OtV7arYZV%Y2}@Y>Yb4-iV`PFp8dUe##<{@1ouV+ebrc%RnZai$Hx z^2P}h_b%tUk_>Fos&uoe!N;2fN^@(g2yz_KlYlH)tk1aR5$V8(E?r8?eiv5Tt;g)D zwx&C2Yd%6*kg;R|q1JyjLZ;Y-+=EnuR3wzy!=zRAngQ-RF{df|HmqGEF=ck7pgPGt z*l}^~su~s&Q1=Te5@&1PuwI7WgRjVqrpPi@p91u|)Vxlm$)S2lnA)oo3NYhmf?n_g zGfRf1DHco~(_}x*;Sg2;zlDskp`pxO0#V4OHdIqhfx;3siCrIle@5Px$)y%T`GV1*?RH$x_|PE_Tu@}LV0pL^7H-t zDxh+*<`n9Vo)zt_&09T~%6~x)IxT6Hk3AqsE{Ng-_jr8%r&ce}6N@HJsg0yK2}kn! zt;Vs)VNtmx7Li?6xpfa*u@wbNND@7uU^ETgWeEQ#*ovW&W0 z@u2nIhw7v^Lsiu?>JOyO|AsZ{O0>pr>1!W?;UGLGgPA(X4Vo}^p!zb*sI|)dw6Dyc zy$%jsj6NSmq2o-9Z~Zvu6f~Z-7k_kRK8Vr&@FDO{Zxhr zgqz&>899uC)+3Z<+iz!^2WiuH%V8}d@Jd95-@ToAc4 z>k022cVP~FOe336M`Q&5N7d7IJ8~hW1|M3LPEBIn$-QBbxhE849W{xtHr0FP*<*)k z3dfll10*DutbST+kAj;3H-MzM<1DE*QgM~V6}kWJKl=3HZ?;qN(uhx8N)E#{xu55) zCMQ55d$+22Fhpxe`%98}qe?`lwpIxoqooCTY{p6czB381Xz779`5)_4ldZHQ`~xRZ zO_Nt^=#s*=+7xX&cR!e*yY0#EZPU+P7>fl*4UBYN;M{8Xnq&^3H`}P$z^ndBa45;l zFBj*!#3aSwqai!RAyZCbeueG#?YmTXqkLtH^zdcjhg=33^CHtdHMp;1)soT*}O`^OlZl?C250{%AQY*M60X%T(-aakB>gkT4ejIKH65C zj_VpQVNY*#mm@zVA0y9^w8ILc=Agf9NC+^0mMoC>ar3KZ33km~LV)XJ9m7R=vB`Ni z)dlx=&~9gYUXq6=CXnIy+`IqeBh=h(FwQ2v)=GGaAy=c4hmhtPr5K&}0^7j%dCrfe9}~1hR<`c=?H;2Rrw*hnBwZ{i$Bd@)q)=4L+{{{CVXdkoO9xne&uWhrlo}j? z+45o5b=8%C$Yf2FRt{z^napl-+~!N#(=3g%VC$n6YdZVF-FWD(7B!huQPYD2{^l4v z5A7T0!H|5f<(gEiTK|$H~C<*Wd=qmG@MQm8C5-AYEP>x#q(1=@I+_v5Q zXCEW*M_-*9Z;Px%Gh^JGB9B_^Y*&3=2y%iVeU&W1Cc=&?yJHAmqQlHgO@uA^%|mX+ugLrWYSV~NhHzXbKnoGM8Ickl_g8!+d*Qj@;ieAG3!>= zg{m1hs?sw#_QWo=M0w9_sq^^g%p=uiVQD7HbO@xC^Hu;-tL%^!T$NYY&K4-Wfn%^h zFneWnYD`@=Iw}?uxLjNn?4h?0+ff3k@M{kH)hWZ!3}qiCGEd{ zZtnqo5qF#1$Ovji2bwZuRTTs=9yVp$fS5tA-x;dq2oKWbxIA{LLC$iH zHy*_+a*pW(-R@7`f8o)szm%YBV(z-esM}T#ktai>QW%#eUx1-l9ICD_r*6diB4PcIM%%)^!XTn14B) zS8~66V(Kt%su4G{YzaB>TtfZhcK_Kgp6u86FWWVnw_6Y1Rl^!{GOT%oiw?*DPIOGv z(Ik~j=k+ZxL?uhTf-u2eP9+ip{9>g|J)37VR@%~0YdS(KCISWw&~y!01l$)aBz7_C zh8$!GE9E9}KQ?V`z!gWRf&N@rB=J3dV7Q)2ay*D?bE;bsb5xI(q?U@rh~YDKfpDQ? zvLKUm+#U-yDs$3YDi04T%z%_>A=Psm*WHpwF)wSjH07cpdw?ZgjJngT7*wwUs{b4SCaS;TeKQ0U));5h>~nuPd!EMkX4 z8Ee~aOsZrkz(Z$#q@^gmGjdS`U^Hp(v0L+uu!DCp(=|=d?(nus5_l2jNfZfkX@m>~+S0!O#pM;RNNf!I2$D2eBeQkRs8^dSLzc*nQ4oK!cZ(XLX% zBA>^kqNm78Vhstxiw{ZJczTrtftK$6i-$zGKl$x3U;O0vkIVm`@~?kV06-EBtqg@I zT^ppP1D%>7aEk@wl=}deJQ#^J9l0G|E`Lf%>@;bD65~urTh}_w7UL`e2Dy;3Nlu<= zfr>F{d@P@z@=kjX0^ZU^_*q!`*7{}_g<_w-c>eZ6&g#~K_Gc6NAA!EucSY{(^1>ub zW55pprebR%3QJm)iM4haBl&$@>=bEb23Wg{ELF5PtWNIaCS6#P&@gYJDx2VcRgS{M z=o;cA5(VA=IF%prjJ#-XBaD^j1U@bMVMWp3_g*^s;ibWX3I|y8JC_K3%wU^Fm}VzP z_li6Nj;W*X-HaeuaZto)^pLvJgWnY?y!6SAB}MhLq$QxS0}8pO9%|KgS*QEY#@xbe z>(qsqD&x$B&gFL_eB64_t}4R1lOpVIgc{y|`4QCcW^Tl3SpgBv0}=fQi-YG@@<9K6n|KM^dC_T~b4~h2Sm~)TEps8rG~jjbjqwzCnX#b_O~Q2}*-5E!c9T2_0G9N(>Ip z0qzaO`s2ohvE9cBTbBq?0^*KCakD$;N+(bh#?J2=8f)mZ+-6i+$)U&<uD|<73J5f&kp3DPL7-Hf+2X$a(E3tURaSKmYC?SfZ_r*}A`kYBwIftFBu1#knAK_v^hA_z_KYMCHW!x-Wo52r~OB^Q8COMhbm*o9{ z`oyH=3PWv5>ymZc>T^^ZWo9kQi?Fn#xNCR@+|*+TiohKqdataTS=EpF-Q-?y-h#aQ z3YOUHJdv_zkp#~m$dI9gd|VTQTATNW&drijChIl9XxXEsf-3wrMr~ISj#@pa$rH;f zGvhY2l^xTTyxNnU>WgwL?>-t^p2v0JYJJ#Wd|w~-^7Z`U#d`8i6ZPV#_SPeL<`v#ew#P(;o~<(1VnYRIc^`MEM><%BY|)_?nRvmxRQ5=cR&qJyq=*OS z8~@RDb)U2Bu8wMo4Cj%{!Eh?(XmNYu%IeYeD)rj6lYGE}Q)NIi68uj)<`CoqF?D^* zZ(4bbLc#?<60ArVCJxf@IBMdX3WlLJeDri*i!8pq|6=bK>#LU8=da$b`%P+o(q{Yo z%31ua$MGVrn5Xfn|7Kiy|Ak*auBg;P?Mi+@0gss&>@^)&OJ`DdV1`Xi63}_(Y(2-8 z1JK?yE&9MBC&(9NtcCS`8HF4t;bGze%oxBu&;^~o!VjY3JFxh} zQ@fe?lh`(IjUkDN3c*w4G zWPNZT`^oz+{QBEp&95pwtusc|>;zZ~bYF*tMM0XERINN4yLk>3af(p32r{uYNJ4QgI2KxJxo4h{cwf{yn?!R+9iT@Q z2D94swy9b(o7`_43&L30)_0k6h4Ri%IS-Y3^`c?gx|n73l!eF`1Z)Rm5drwqV=1J&X`sHL7E&j1vr0Bs*o$i z-u=(VjIaq6?B5lTwxge0g+VD1+6UM^Bx`pk@oy<#O3*jD!n#{(sI!A{ns7f}ohj74 zWLesE{9CJ4bxtsKK@wK`99bfDDtenxaaT7u=dwV@1EqAvaeCpG9eMhozJ3-E-?eNgQjy#3xcBiRN-z)Z zndee7Q*(F!>!&~a@q??X5OZ`g!7r7kbcYb9Z53`+^lfEB73G4g^N>8kWF z(Pd&7XYg}hys|3dRfo^~=`7Ev4X_;cV~4x*Hss!-BK*m`E9PI+3f*{&Pif)zlop>L`qv9EI<(5)ZmG@XBGy?w^E`r_r2 z{^IrPm+!q$ug&j{PWEsiZf0SUWjdc77SP-bk%f<5`Bo?4a6OV28}5ruN9Q#RaklH2@c%kE-Z0nB?h zWb+lE+tPumdo*?L$a9^^xDczm@#CE4_Yc3C-=DuZ0{b&H3gY9>~5 z`s(@HYnxTRo^ithH&g+%8r4`z+%zgnGXPw6l-IUuT3Uo#kO&}wU|h(?EGF`Ht+K!= zpmtW}RAc>KD)eN<0z(MnWOpkRENA%xVymMa!k64vbNb%9$iCmJ1i7_kJGY=vGClxE z#{x|6+Y|x94NYdJcKDMHOR82sVXm1fv8JbloW? zV|neS;t$!+<_{*-KF#mq`X7bO5?Ar+v`oZ; zsca%&S@Huzdo;(wr5RxzA~<#so5uL5YpR)57HoLf8V9R4s^iVebmDx}a_h%AcYH8r z^YzRA%ePn0=&cTkJ%CvacpJKIK}kJYue&~WWL`Susj$5)BO^Gm|w>k-%rwc zvmflx_kzz4Polj@gk*boFn_2b$TfJB*5qF^B=rR~gnbk_7&p0c)KxnyW?NfSfWI7@ zuO6&a)*@5pi-ustn5BMHV*z@1j&4hs8{i2A=Oo{M zCQB(cL^Z5#?X+Ta?;hDQX$)RF@0b&RaV=<39_rMFQ8A_#n(RTN#d`Jk$23$Ft8+5Y zZC~24)4)$wRFji>q0W5|fzJa3!^>@yWS&f~#)ihggfh|w65&i8%?=qdL6s;LDF=#75m}=;yDI=(_l+{sXbr-9|@-Av=@0(_DU37Qd zc-XG^S*EA?13yds`Oz)6Hk&*c6T4AYmc059sV1{d=~IHLl2y-ySK-hslR-_=l7XZV zqpNQCTQahrlYbH%!9v=|)u9_JV6GZzGWp>=3t&rG*8_cu$(I!Dg~BHpDauhT1JCN= zuPZTFm!htU0Y;q#m67(B*Mm`ck5;yF= z%S}TjNw(|-1c61U;~8XsJ`4Kc%kkpLm+j4^ed>*e?aFe?PwNNEO@DrL%WWj-!(=}J z^{UwfhB9c9p)T`4>usv1C>qA2ExS~b-=fs$Oa|W@0EMp7bMcbA);$QcJ16MPQ4PPG z95&(WD*ge_szy+~P^28Te#)1k-+RGD+3%82^xG{5S71$apFzNTPw6bssw2hV9f{k6Sj&x}}-&z>&|}kkIeZb#Pv8pa0Qk zPneE9`J6FujOi_ z3|%@WDaewbf?G}X7elfKTSk{)XvsA;A~xw@rXdx%93?3oCP7?(N?C!V-2L_AeoEr3 zs$;B{G**vN5Dh)S1-`T-4FwE#KD1P0&=Ho`)G$9)?O9z_(Q=t2i^QbvpXf-Uj;9u= z@s@|IJbjrlgIkQ;-@xL095h zWx0|~B_Jb3jH4$BM%C1`zbBc}^TtC~*4Z=+BY1WfEuhV8uZjWL*eo5g>OeL}Hp^j;I%RPe0`PA@CQ@Xp>UK8yt~JBM zND6!bFyXU~7t+L45VHi%+Dv|{*hgnnu?3*$Y3u#%Z@&2as6~A8jJ0~NMSF2Ybn6kk zvJ3rb7y5^}Ao53D%?N;}$a)WI{!B9SVas)xIv8zsUC22IoKvA6IU3vtyNv2I+5{7} z@A7$U_MRv$(-gvSF}BHoCCOww$!ZhaZX``a&K_&XuIMZhee1_LN9kwn&6EA2eRl1r znYlL-rV7(K;KAm>HsP!o9c_@p$?{DG10hRY&-lusk?0*kWB9Oko&3@|yw0bj^0%b1 zFnx#(G%GuX9w0^PK=nE95Z~p3a9m3es6IUH2wyuQrK%%5odN=+SZ%ts_crdG09;8B zXwQ@+7RgpLs?h-447GGP@}H|)6}YM&0ji{i}Y@4HrXuchBFDIG*2zG~x2kN9oJ?J70*Cu;5=A9(dn%9I8;&?Khj;Ki%u zQu3GytOdAW4BS%vS5{Fhw2@6`qME#=qvlx|gDuo2p~({y*mB*jqqp&7x(6mH7uS_f^Ix)7t1Z2PJ+VYJPBehhqYT`Xb=w9927*Feb#i- z`w|kKfXo2)l_IK@e#8p1s34N*l8V7rZB#C6Wa;cOrLILOSI$BBF41C?@?K8J=QWD`~tvz%_eMqJ!;6DVfl+Q8P?aV}8|5mc+(H{hgQYIP8;P5e93L2N}&nh-~0Lf^ZD8Oa=m!*_5JF4^ZLav){`&ppI;n9-gpqN#JUgLR{cY? zt$u`V>6*P+)kk$Mt=gG;h?ZA{5)hP2f<6(wa8OktL!RxiUU-I^rz z9_bd3Rq2N9ou@Xk7g23mOR75yoA+R;6(3a!D>G#^%I`LlG(Z7UezqYoleI!s_ZD9$ z8xAU6({erw`GfKL#p`<=L^6*T9s0K(yQ>m#A&+y=%%g!6Ae~gBPuEpi!Bm%l-y32=Vck8nSOBq|6N-7w;sDIslJ|g zbN%&s^J7@~fAeDqvZSt#o!Jw>y>xptf7b%KVh-U7Wb2T;B}MPGvpn7m(9sAFy4|Cf zfL9^}ZJ28`hqs0qUvYPsQ`kaFS$*t)(sC5 z+&X_7(z>z6*kbfzTTQBV9d04=h@F8=VMg8!07bG}%~`98b{E;#v8N0_)DS^3`1>kH zlqYOoEdjZzTj!&lTR+aZZu8CC`{%Ddd-CP;`S#hBQ*Sl&!@K;}^;iNg=0UXJ_huF8 z?Wmg&%f!Q3BvD7mFKXo)hBY$w(ZoSqs8Xj^sUKi@_AMh!FZgh{!dh~GiDRkCQ9eXN z=jQ4I%cbY@skeK7>a7d(Q3v~GdG(7Gn+_WUr=lXZ#58K(2n^y_kUp17Nox5~Oeele z(^GX(8R%iXibqORNup_*3)9qa7ol&5pPEiZTVVi9@X`0wbKH0T$GiT+2{>AvpV2<8 zVC>!0NT*%Rme%joT<&4|B+@ew(f}ol^6Nua(JCa@Oxq#|-FcG$@>RO?((`EYV^G05 zQDmqLFm=u4Zj2&C7zls&e}07aV=}|h#4xssw%D|R=w9;lC05p+Y}_~8Xcb0NPEtdc z3X^0F1F^mCxmJ|ZwrQ4u$>6#n&8R`Lkmi2uUTPd}5*>(!DkfYq)Pbe#!YG`}l)e+u z^wwi`5lzbpIhO}Q&bJO<-$&Em#Atf_RbjecyqW-Wkc>Da-K2cb$uEVc||w-UhIH&1rJLp^IrZXM9@#CDYP`|uy-#Vp`$;JwjmPID`%GQEl zPRz&(xGFpfvJaa@K6k46kPD%r4(lo#05uDg>`@3zc~!MN*0tb_DKg6=^;(Tww`7Ud zEc01ZKsZKFLuE6@ox953)xtk`qAvxCwnJf7s_}+}>4QtVr%|;@AOX(yCRZIZqQnB! zA7^Ft6LoN{GR(lbUsl#RWr*hOxe1TS$^(!kt%@%dpYe;-eyt91%gnbNT^pAjP2Yh; zf9o;3Nc8b^ClDV<`1#hE_3r=r^bur&yZ`%9!2JK`Bf$J(K%*sT4R@v`Pg!Lq-@&e` zaqe+dHH@ti{oc%|ZBh~hw8#~B%NB*Wx6=%1H>mw?W=M!p)|o~%|29OG^AQ+%E5`RQ z107b~|5F7p=N8pvoEk^@`Pz0cHt1KX70mby@NF$KUve&0lbckA7&goDOlH-{@^C@= z&RtEcL!Cvw%_e8mrjqN-%=>OxOoiz zN!+x&VSUnPuTzE)L@Zr*n0fBa`|)`F@@0E9pR7NA{^n9V^VWlRRYAF)6qFxfYl6!4 z+5S){57?fyldu+X)&d)3<)Y$W5?O4PkRN+XhP0)IIk=T0pwwFB1O;p$qi+>-df&Yq zr=sppi8FvW0J*ro3I)9l3~P~6hTkTg%Was3K(H^0c;48p24#u0HaW=f!LG{#KwdHM zK>nGdl%HgL5=>?SC+WtvE-T^$n)JjS!lgvvCD>FX%RSt|CDQWzgsbvrms1>%netcl z4?p?jjojRR`F`#F&fEJoAg>o%^*0{8E9P3>oXoZS1DRdy7E{P_ARcTe>$}>g8(4rB z<n1Y^Hj$Z%Yz3He zp&|wkl$S^$=ahKk$GN^ve*4)M{TgS=CN!%{B_by~9p^fIL|O}?!J znJ7U3JJf$yGQ>7?z`q3^litATYWM?&ZTVlQNf@ljD$L|nKT|F`XNx*4ljiJB>BDC5 zcPru@4dwwr`dh6Vt~(jrt~4bWGWlSewy8vD*V!`!#sur=qZ4HrItH`Ig9T^?NX+W} z0MzF>)a)^Yh}8)Tg41r!z7__$j+IAH^)|nygFntR_{NX(Eqnja>~Gf;R@~G{t-*a6C5~nxxZZs;#OR^~~gwpuF;dpAo$4+Y%2@ z^Kk6EQd=z9A>CoQSJ+Z>QNz-=&MS+grV9EBsRHm-_?}g5KNeWMS&avP8bl@cS2=k} zn67u$)rb%-siIGBw)`p!iF7d&Qk?W4@T#riOR)|-!2j8}cwjS^Wl#Civ{ujadgI5r zKCj;@uj~#3Ss+9{x*Zb~TQ=V&j&|77HMX&oGa{^SsSR$*b8hmz4W5mD>9h)N0&=o2 zI@aHWvsmeI=n5Y?WF;-%W0yi#DbOqExQtl9PHBa2o7Dtgp1F{wiUQq8hR-^ZUooo9 zOpKjQ%8J+NIJhNM3(To$tK){mm|$JbxoozIKGQs0X9aVlYU3QCbcZ_hR|DZPDNKeq zy(*D`dFO-3TR+aX%<4OpyDKtgy$8vuMs+SH<~0UuD!;szxw0HQS#*Jr;iaesQIh5l zkdYNT4=x-Cr_u&@YK|r<%fr1D*>kdh+i1Z{N5`-fnv4ij3p&w|G~eM%{%x~LKJY9m zYg=Kxm%KpIUVVEiAYh#>)#TdEFfSQ-xZtO1LCOkUs*qk<0}DJfOYctIwk%u;l`@!F z;_e~aCQaeUgGo}_7#YVeP&;U+g|i^Xtsm!n(De4ri|5x;Y7JgOAVKbeh3!;YCSF1T ziR})C(wVp2yfH_6p*@b3*ta3`ynseXa&V(~H~ebSA(Z?%q*7X{v9&EL7J1)g7TT8A z!>}Mon82Jq=oag&T2`O>zw(2h{oaGiB5W_oU|IZ;0+X51Se=Xz8;cn_aO+(MsvGRm z!(en_Q^GyGFaVJ(1N~tDfJSl|=e?!BTD2W(&cq}~JkA=il-Oxb{$QKDItO{Nrn3PZ zAC-zAiBWNy*X&z~Sc9i$lMhG{S(2KV4eAh|60>XrbduokRn~+HqRt*HYqFyDw7WZ~ z8z|RqXOrqTO*4|5CaAG5x$0D@9lV^k;pkeixS7t%vMti;q9G_&manGAmd%q9s$BHPq%D zw)}#?ROTSe0mN*3faiLEl*|O8+W_9Nn_+s}UW}NO`5*$~1`$Zi7mkhySifQSTA`|G z=1$hamCI@#KxbAM>3q4OJ7c>Tc^+UJKekG_2%Q{w1GDLLGxGnj_g+7iX4#b=$WixDB*hUq9E=1=LaQGHVSp$eZyM;q z0IVlH&vOXJRsd^2l)p!Jnqp>FSNCupu6v_~BQUdW zmO!$*x-v52#`hhw_gd%dy%sF4RzRRDV&r^|+Fl6@te&+-tzCPS*u+Y??C*A+6&Et# zBNY}yn5W2%$MVrE zYcI0wyC~{`vlIy6UTc!;_Z%%Zb!DYg>z-5E{*ZP_MB05UbL6Gab^9^rC|l}K;NaQ} z-(4V(PEvPM9&UWe_Z?N^1X*Mf4Xj^xcs34ZOSdGh`}_a-H&2KPdw^nfMV@r1qeNC? z)mc0vB<09Kf{a1FyQ&;_+R-YD@>01BT3wT1<-3EEOecdt$ScokH_MJqu9lgm>GAw* zJK_=qvJF`)e9-;>@|#Ddggn>eF710K0@ZD5)9HBKF++B2s5uz`k$`^4VR?Cora(HB zX@R6a%Bpk10w?K_XK>9B%a)bGmTYi*T=Injg{j`F%gSC>(WV0d_GK;ctsm#I6oxG` zpRC>NnT54b!qi)k_lXCN*_T>rm5m8lyeWT_5C62lV!)I)vM`bHSTu|D zA*8Wu=sd8M^sS1Tr|uWaX-y`51QT|3WwOvshUO-t-ee0b8}e?@85c`bYWJ+nysItI zb>-N|Gyq*JaTYgVLMrprw&~lnR2tJb1WC?Fk42$(>=QQ!iKdA^?~m@X2y& zdW1EJ=) z6rl$}vP?<06rBf`lTh@1^n7XpjQVDnA*l(eswa}|*{ma+Zk8O}=0Salv&$23O8A)+ z$6CKAm@8ihsk92hlxIsAJwbSQ`zB+Ep;F8;mXUsnL^=XHTh*Jy=G~?6zEor)RiNQZ zwK@@p1~pL}RYO=y23Caxd7yil`hx$H zi9J@_7*AYlDS#VBQ#H zqF{6_7dN1Z;4`%pNRyF#%v|QdhVCTCGMDtRcLqSiV1^XW7aO()NxG_%u&Ju4v+gcz z-`~mveec)a8PE9LF!Z;_lZTIf`0{%{|GLO1nbLGv+5v`OU)6zuZ)ako#Gzv49A+l_ zw;-=-BQp#}ik)LX-ATkVvaiVaQ)W>*8X1s0J5-Kgj;CjH4v_80zA30gO|I>oG|=jD zSG@$5g)=(?EM-r|E_7h(kW+Dl*`_Uz4|!G@3DW`;KpAor1k=Dwb~@Lal?QA~@^0k6 z;<4J4+MqnM( zq$M400EXeDxvsg@&RC=142W_rav!u}$xpd4q~uzaOhy+j%Zzj{&-#iwYuRE&L*B=- zM$qZVGHE$qXY+s)*{$=ht|^$GSWXUPrM9X}Ty(ITtNd-sPT(DQj5l3&DzN7On~6Xo z&(G!EwJvdvsnwtaxA7gcAYMMlfnuhSf> zlik)PgdoQnBtoow%j7HxXpwBH)RcAn5*@ zS8{^%bk%5;I!RKbvnzY9ByqQ9t!*wr$0WI{DvP4DXPs({U|eA66!X+26`VX2W!03y zA1P01Gl71hx|eyLT@JT1y5CeyTt60hZ~>x-fpkvLlWH-p1Ek)`v9Yy8XRSa)O|33kpg=*z^Gih zwcFe6h%|WttIT%bZL6_NM?aA9OsZyV4g@d0V(c#RS%rUFl|ytX@_Mk0T!Pb*Jg^7n z%1l({`jB{#^EY?J-FoC6ZMgRr4fh}5MH(=IJ!e#53O$G8H>MLHpLBY`Kfw&}z%DCV zozLssQO@HV<_%V|>}Lj*JZOe|R^@V(c2l=Smw>xEb^I`6$VykGSMWCgI|DA!5m}jE z9ugElZtT>?mfB*>-4^=QeL&OxL*>|4yeWH>%Sq4go>v{WRex_0nc>c?u~WJOB- z)#zlZmvF4Dp!%mFbn?#Dx9FuL#>*yR$90#|FT7e$KNWwtTyD1>wr?to+dUe1e~@>s z`me=~{8~_`E+t(;NCpu?llB7FMKhP(_%1X(F#E1_gF+wYQ zCrD^L8m(DM*)T6DeDyRZ%af7RwTcc*(MeB zs&ft1eziCLctpR&ytd^Rv|%a|>WmOjc&^i|6R@h=l+k%79?wa<$Hz-czCZBr?5ZX1 z)+6>vSAzdiG0N*de{d^}EMou%N(a(7%~d^QLAFR9^f5{s>@73ZodMv8OiLv6)YF`{ z*o`5oy(q{?nXfyEUivh903l1yZs|mCcsW!Qh*ngT0l-w*s0IM`<$b_6V5Qx9#2(fE zv={oHA0SOwRyVZ4**c(T6Xfd?C<5j*XH7;%aOXC$OVCOuKXa%NKm`_LwFrVTfTRel z0x8wh7&dR!iU;-U&CDF`zoU$MnE=m!>cTM4y{d9;_PX|)-O7Zx zIT`E7vjO%6-M@@&LFV7v(qAMsC39I7juJdToUA6b!de9z8q~Stu zHhhSStsenlCa#X?TFp_`#WIjL(Lv;MhZ{K+5xJ66B3VI}5|k(l5I4ZCYbvQwDcg#h zZJCxXnC&sV^(M)XQ1cThFqu8+F-!>GqCLiM^?)+(&FuHO4>9I;7Q zT;{Cdl9T?*)Ar&=^ZDn`?q0Qi-N=0F!Fy!U*$d@E`ytX&Y1A($oH{tzYe}uQZ2Yi5 z9=?EkRiiSc^31qdqt?jW9siNZ!mNt@WVI<Y zQV@VBlcV@GNk&*Jo>r|&1XR^j(`I@GECiT}mI)oj`s{;(q_x)f z>Q_EpY0Inn(58G2@PqW?SsHoB*%od>1}?KzC%hV)y^o<7yguG#EvZkFpOe9f`+mx3*6tVqKYJd6s!U4bQGC-#(?u#i(u~r$oiA zW1b171NOwbn_VEV+jlGDR+$XIQ38Kk85SExG|~|v7f2Q!N_2ULbL+=>dx!I;jqpvc z=$ozmNbQ5<5C}p$7&W5xp>WhwP{pg&8EsWP4BHMI4>#Ll`g zT7cpr+h{YQ1#$(rUf}a}X~^8Nn`KC^Fjd(pZ8(zD+uDbp`(vk|Cm7f52))QTuk4tt zOwXI=C&)%thCM0(vBKg>wK=M{nL7HFUl+kr1dy?eT`Q=-O-6<~E;6x&LkW(SMG4gck=keQDZ!U`d$EX2UXDKw~+Q14BydOhpbw zGC3nB=CPdv_MSb6c~1dZmMXxfkac1q3S?6WAc5`NRlwq8;ZQso%K^1#BeO)+?tD?9 z^{spNkq^K9E%{6R`6ue{{>q;?>-9I@yx{Zi{=)N5Uze-=$>09D@BRFj4`I3qZ45Xf zi)tKm^04Jz(|ZdkscWxV)k(2wl5r{TbCh9B1{Kv%b#omgwPy%KI>eQ+NY1(&k`p}{ ziI3F%H@OlfTe=j#Is~t>viY}5YAgdnJ0m!1%ZZR2ZCi~z75JYh&3wzxL`7wO=QU!N z`XjrRZ{7y9DKDPY!DJJtDYNmx)7CwsSPtJ-N+RL%@oEzz63Z0BM(B0Roxi?R!TDkP zaZ?WebiH`R_+A~z+<5dJ&EM`Kf4dJ4JQ|~&1WHazD%)h!S!W{ztL3f}91CCDMa8#S zXIB!SBK(1hWRhYvY%NMeWFM)~Dr5B~{W(K{Ms{Phu_f5Un@EK?<;le6G zBfWi{KFep$dVnzm(`N#V^Z=w)q*i_po){{5TXpf}s#*)?u4U&8yWA1^lZ+56A0l}w zw}7N>G23leSYc$YYIf2Xzj9@fnX*J5s#m=-i%XYPsRWpA9q?E${{T~DF9zl`L5LsT zY^LE+-5~Ex6{@*YSSj~j5GaVpY$BU#em85agiKxpZ5t2d2}j%rDqCO-m)YoXY(8l(ua@7fhw)JjCU>F1^m`6@qAYqjxm33fVVpX?B+ySIy^iGM zk6^RQRdw~rG6TiS3V`@bBycr|%H^if3K_~HpY;$AznoPC+!-7QB$T-3?wgM#dxcPp zN-n1lyWjuchq6pIGXU~jK9Dn#^cFjb%StMBC76-tr^pO341J`R$AXi!YLdXRS+n(M zfgih!3O{M^8$L0(DH;*CRIxy+c>^x_9jZARD$y9-Dc#=xKY9vX6ak3xd%UH1K7|M596VwdG+ z_|2?Y-jabF324egq$xA!;I<9LgLK&=DUz&pl28__sY_-=z8+&%wIKPNv|j+cl9V(P zJP7^uKEA#b@ABEoQi+rTf~$qJfB!dp{O&afOoc)Ms%l)SjP+$Gf$5ToRL5>NYKGlF z@d`B^L=pgr48zZHM3rMOoOvlVYG}Nc4op~1+;D2haPu(lo;O5oY?2r2Tum|~F|@{( zE6b{ym^m;v+sCltz(DdpTtV_7(Dt1K!eO?($9Ckn_~f(`817P;;5=gZ45s4 z2q|VCjqP0AK|L02Nwg5w-g)8Bppc!Al}Eg)cmLJ5vUCKHb=O{eas>o$J${e0O1g_y zN%u}#C6gMED*SDNIn<|O+K9;$(GnpcFe7eDNWsrWVyIyGK`gh;4rzu6%y$V!O8hB~ zAt62)-msO2+~kPyge%pPD6GJ-VjzknhBF&Q5j*eyM(x3=PDvthC9$crB%0MD%n+0; zV|C_0_S7)?X-->6K0$D(9U20vdrsmtlzL}&U#wGOnjAr-7xe(D7)cU?*~%S#%2!Y9 zL(QH(6YazO-=wG5GLgvyDnO%dPO_w(Hg8S*)ZBaMK$k?T4RW%TM&b(mHxg0g!v?@F zPQocm-osU<$C~sY#U!27)oP%e)ENQfX-BP)?6iQ%d@S63aZn~gH9wY>LmRn!Ev^s6{^kz zXP&abz6rXzULvnLvWKn$!(v9Pq$JrLCa7PwX#ksy1i(ezK+(z8u{C98=+yn+`teaH zWV^|b!m=pTCvS%%CB?-)0Za|GZv%Qv1G-DuEwZioZSpX1KoXu^P2!!G(KG=v0$-O# zm^|kI`G7iey1KQa`Q2^q2H2R9bq6Fc_kWw7Voah=)Jo&)I*PEfbkbNS#cZ_$5?gg1 zI>rpmJGJ6#HG6q|K`XKzj3@@uknV^|J*>J(rAJ3z^=%W+f}{X=L~<}|88}BUsKi1* zr@#L*dJ2~%OW?}{iTPDc>}}~VwDMn9q+GChtN=b_B6e}a@SG*ImUa38=22?*YDEGN z5^h_6-HOHnC2I54b1p6=1)q(Z4r;#TAHQY7=f}AJ+s{}ea(VB}DeG2BddVr|d($iH zJK7$~@<3_7T(6eEek^lqHlc1Eu!}D{N!a;9NS>1QBcW*KB7@em8qwsuEY&b*GpIT1 z_ObL6Y)82NJ5Ed{FQ^)jQP;r_3v@Us)Up;B>ZQYeP&1iD?#@F>Ws+qly)S8{NfEIL zGFahG`Bx^AEXaibLzW?gM8VAp+DI~eC6TUe>sS)3CI97d|92jwO0FfgMBZp@vm)OP z`2JoVXt z%a?2&7(TOzVJ1d}!~4JMO8LMSa+j#6N-^*^bc$ z0P!4q_bxmOA%!urG!^fvyj(-FDTfR;zW@6^{t!e7{(e10fnjZu*j`fcNIKi#x6M#w zMl&ZXPr;L=sK$o?Muet%Q;nH~Ep}Uz(ccb=lE$#(7vHMlcwWK<5+*nyOjUCR>Cak- zH6b222-`bK@Av<}i5E;!n&jpwl@(b!6HC3WJ%_|<8w8R8X{^|OWUpABF!z-u+ztHD z^)+yKvP^r*Qs&Ei>s~r2@+#(mlJhpw$ZBK91xZ)UpDj#3!Ogq-fAHf|GF@4la>7%; z0Gu@|2~gbml8;7*0%!g_Xq^m_D`10X}!m{I3im94monhB-A z*#k6L^na5gNvJ#lglSA))j>!kQAfHgDaqbyu}VSW8I~x(j*{A_#6>b`_5L3|dnACC zO6V-&5|o$Oo+f2z+u;AA+ePPgRnoFuCm6sq*7IUc%rV1Onw%1+%Y=ib5vjl>b55lR=H;E90 zdr|@+hzy#}#pmW1!Ln$l+gSdqZV*y6 zdzlbQ$N*Hpw}f|tj@I3mHFNLdNA@FkE<|sB^Zt(<@;aq9kb&UI9HF7!0*G%bzhrF~ zV%c6D4hH5>YkN#d`rxeOSiLmj7$o9<0<{+p@l-KK(Ge*D7f23$Fl7)bqgT1h%nIvc zkfORFcF+5N^ne2|Pj>(uueDX_BvS?*Mw2^AV)R1}02*MT2b0LBBL@jhInaP|+BsoV zyDjW=Z36O=bckT@l%>QPSw?TOTE|{nDmNa!$tYmjmP%Up|JcXh`>Wr152^w4`WQ;s z^PtF~qi^sH9L!B1!;s5_Zdo@tMYlf0d%`XVdr3&=xJ^i-8!#7n>7^Vcsi(p&0X$5G zD8{+GdOmct%0RPhbfQRLy%I&fbtt>owLkw`SLar@9?{x6n8D_PPAnRE{k5@?kS$ChYv0(XMI z>sGKn>_J*K>WwQPe-Bp#wbkizzHG|6^=7_QzWMC4hpSTZTMyYI%?n?y?)4v7b?=*D z{Kb!cgFpR-{{4-p2`MP#LS&(G)DT4r##v1N-NK$8>_$(v`E_jcMkkvz@NZ?`C_| zt~yX}JZ_KNock{YyVrky2PWr@t>&tf@!EuA^NJ_bxzvy>UAKM4s&5pY7~)PE6CsaaP1%e5Xkan zvDl3t=TaN;>BG}?_f?J)Q5ObL2NSyLfx5f2Br_t*%Pt)Tlk;SKwW2oAIEQ?XPBX-i zc`f|M$kmPX-GbEi0f+1fey+s{!C-5!3Q2ccwaKtKxc`JLWt}kV8u{(Y`lYk7j%<;8 zAEugebL984Tp=S_l2E>E7$1>ddUh<&siJJ#RIIHkK3igf(U2^5n%0Al+4{QUC!XrC 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 tRA`^6ih~rC{u7eas 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�(m5 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�(-~R`n z;0j)DE4_xvP)NIMAF45APt|ieV3F;9x&_8#wktD7uJSRHX#joLAULG~O| zCb)S>wyg&e?iN}CcEcz(`I1kB+ZV;Z(8x&Vg0WlA^x0+gV7VXOzj}T5>ayeg#zS|t z9@d@eVPBw@l9eu}ItIIXF1Kzd_N+`=0bIq+GzsdA687?H_>qqo$xcFe!*{itk{&Iw zD0`nO*r#eQ!WY+`d0OY43|@3@=3}#I@Y`BqtA$`|gpYi-%_X-UxGM`ToC>hRODw=n zhRFiHyB>lLL3}42cPQI}c_yj$@3kZo4G&mNO*NU+mX?EV)@V!ZBgV?UW-CTxf!c8c zdQ{&GuWJ$sknS*8uKES&s}WMEOSz>={drdI9demiJ3C+j|MWWMjtN|t)&66AFlu-Y zr4T(N4QJb->rNgfUJa#BW0}mBAkKCZ|3=g?uMF)=8&Cgt<^*EYYsXGd;m@p*6=X6O znDMWDyZWp7`i>d-ZXz!t-K_`kbM-U=wR@m7qmW8=d(}nWsgh)2@-lFUeb(0CYog5r zIuBjE)YL=X66*KzuyS>S6^$~SEjdeAtAGYo!rtUpGawKlE_trOF3hfTc|g95@Xmdf z*5)QFNMGK%PDi&SjfeO>`AWE zxqQghMX770QN5}B(=H>?@3!2OPCq&QEK>MaM;l)O3}3Ii*Kgl`{o&#c=+?t`vFzeW z8#BI4ZA@^r0lkM5Lvze9L}Kk0(_wZJTJ~Kk`NlXY%?>38w@C%tlqMg=0(6nBwSmFu z?x<8L5;Ic0GDI;0L5NDykEm@;;QngrR?KW~r$0OEv3_pL?$*P1vFy?pAK3~0?B5`p71No%WiS@HJRCBPigbTpZdYCg$WvPLt^f1Xa7flt@0I@Ts? z)$_9Z+4rI>uU~zAp&WPXp}Q(~VNY@w&*5AjE4Uy<;OdCtdD3Ofl4wi}Y4y@XXlw-o zLE3)ne7!oMg#>M4Hf-&gc>`Y8ZB&vXFd~h-G+fShs^!u29E}V~0JxJ`SC2k$n~6^8 z+zWT>$2sd$yng%bdXRwX-Ph~a*G_1Rl^^8FkW1M{4v8sw9ov|(fnKBe!+%44dV5$^ z2_)F_n!AXo0SZ39v8;9$(3D|jb}O)ma?N#(SO9H#&P%2F zPoh7dLd~hB&(!n|x~^$^0I5J$ze;4-xJC+*{qU4f`XE_kBM0CrI}bIu=Ilrc@)vR5 zo7C96P9ASELD)HW*}2##^G$$tlB{f$CJ-Bs?cr@Nz}E8xe9BXf>q8avhu((_8M=(J zy8~!2ox|Iz`hF`XGB0_(wL;Uh$VZmR5LY9AnJg86z(Qyf;%S_zD!w0n1~{l!lck3e zfPObnSS9;8pXGM{u6J)A-w&yntk-L>IPMN_yo+PsTaV(!v2Qv{@}*~y^g%Wu1heam2QIKVM`?0=gN4aW z7@8*~oVo}fUK_F<{i;%P9BRPdtf?u5Eke;zsX{6M<+idjd7&LLrbKx^3r{lYy8n+p zK`mSC5n!_z8<1KJ6~MAvsQT(C@RPQ)+=Q%LAUE$5NIp6XTja4kQ?zD=IwjImv+e|l zPvuZ{ERF=kD_d5QpF>)flfUCtW5g%f1PGhwUY`R2;S$+1A zXIs4uSA8`uxru%xZ}%1!JcKCl8Hti#2l%1b@*(W!>Z7E=KW zK6hnwiN*%P^km#g1`<|e;b^%-J5-LRQVe#-@gXYu^?un4EuPP6|J{1*uHb5Sx@CVR zySN+gzwN<)IWGWjUh$z*|~KDSnN+zl>Y z0RJ1@?!nm-^$NRJ;zct#0)bfQc9z2mF?FMZ%$`~FfFz!oRpFwFm!fT>CIYriQwN;+ zV@MrkMDWx=b?adEpMHX11}B$817jULlb1w1OvuHwr3>=ae40i%4zOIL%xQFCqH0yO zqDU+2IE0zu@F`^8#CKHGYWjRbj(~>IMVK5ey{mz5R``94UVgnQb}!kLJsQXg zWY(BnCP41-E5XF|lh0ZY>QmSNiYuJLE@?nYxuU+XmV;(GhWLw6;2+S8fTi(GQB=RBDRnJz1)u3byBMoy*r z-z_;Aqju9C+{|-9vAdLv3}7dyh!#dj2wy4|)656>W?FI_A#ucPvRiNl2l^tpWN1Tk zo#|n)0WbEltMM~ha84LmxhIDPfTiaK8{HS$t6bRogb1uSYmrd;; zf=)gJ0z)7fCVB#p)%{Hg)3d6V2{klA>xwOVs0U;5UmSI;L+zaQsDO|QMc2nGKk}Jj z^$~SQ4VjtSAFZjO%Z;HmFGFDUT`@>KWOkX%Ak=ne3HJ#AH^+`sT{gV`JT8);t5xba z#6cdgFG-W$|Ce9BfUCD3ZvsETO`sw%ACwGR-joh=AP`$QW5W!pXQ78hEFIDhC3H6F zSVOTLD{jdZD3BjXs04>3MXC~{V;p4cQK!mwUF=n*6IQ1%t~F!knA!%t?A&AlvhV+^ zFJHjr|L0VTaJjbp%%q;mPOhH)txoHi)Q_Y-4?C0f>Q*@9sbYrWWtR0K&@lnbkq=WX zxhzJojxw;ExP`RW)-~MX^IDs6JEQ*gz|v!t5zu4^x`GTjuHQ2M@w1<-m(UAjHG2XU zi|Xk3Vth+#D+iV;2}2E3hEN#Qa$G9hH#Tx?)H$A$D~~PA0BM;BO{^x7jLG~l6B;V@ zJM7ZI7Hf=Xf-HUjv$B#P@qO+X=GNo)!xT!r01R{Py1nt^oO9K9{q~#n8`G&P@dR8T z%h&ELfEQ>L4qX?1srucfB1{5a=MgkP-pcaQHMR(o?z z;K9cw|0P?4?#|enj%jm4li_@x5Z*u(0t3P5dDg=-plqm)@W2KiR^rDdD9t*ShrMOS z{i|^eT@olN(Li=aMi!*o+Tdd=A_}a?B6WkkE=aSt8y5tO!luN4D&FrWF5>t|nUeC88x1Q;970WkoAKtXrul{`9 zeRz0%rTyxrV|T^oC!SpF<4e4W1F%ltNj9P-t+D|?QKWE+r=c2XxyQS1@e~E}V~vZv8lCXV!Ng z-n_e7G37GQDl`yR&_s?tJ24WyK{bqdgaV)1smKkQSb(!?yFS~BqmGC?eM)GcRVsqg5Z3(U*LWh)s6 zP}17&x^dyJxVg#IItdH%>0+7;Tu5U)1o2JnJv(7<$kswbdFTbj?N zsX91pfJ!-EaormFo)-t$?$0hdHg7y+S8h}7={EIwPJ~8^VK&fm?@|@_j9DWw%k6w+ zFemUd8W}`5w|XSrS*RL$HjLfaxqLf`4@<-}EggeemvrhXZ-8N^G4irru9v}{kSiBl zdidsCw|+mT0|=X`l<9Q^;Mf$!Es z_rqv`ya29w|KERtg%1iLwKfkDmLXv+hLvX_0k#!_Ey+>db09BcrRXKJ7Lp2Fyj?M9 zexgj$m)tc%I7~Q6#?S}C+e}?9uqr5rkG2iX)mdkVy~$gpvhdFJGq(;dXVIu%KED0t zu7BA3vcUeek94C~N13xv2`Vd_f_-c|I115mRCBivk>mz&BgG(?q24uu zAoqbJA;{Lea82Kd|0#5H848DvMxAKGLy3)P78ZA$PJh35CA^ zZ>TjJIOdWeNUxM3gragX9VPNbgx!(T|M+J><({<+B@i?MD?p@v~wOF-7lBy;7Y$}Oa z+7b8v<8d|?RsYWFYfJ>|b;X)JaM+V|lJk;~kne@rX_1oPG`z>szxgy%V6a6MR79i# zwbgMucydQo=Oq}+nt>>3TH!5N;!qr8nnbr*y-61v)kMkuY|^X+ z)RRJ3AZ!4j1Yl=`cD}MmgY_>Kxr>B}W>{Np!hxmX^q{6hkeJLDWbwf6=uikVn0gYy zBA*z7_%M#$?cF3nO>daZs*6e|7ucRzrhqjf05fh1&kOSxHj=vZ_g5Bw<0tRgA&-AM z=D!X+OU+Laf9}>hn5|sCoj*|qO37-{|S+*bh;=JO0&qz~A25{^-&If{bhfTvK ze?+xgg1cDq!fUx`iw5XY%yPSummQA}c#lNY;2e;Wlt-LBE^gJ>Z@0^G(hz!dP4?s7 z>8@UPo2S)bb(1r6u0D!Ds9}D6&1xGZR9oqp^h&4=t^*-<01&29z=$P5+1P`VF(sv> z#f!`hSzzU;&SWfAg=e4x;X=1Pvl5^rFA8x|HNRAI+xhDA59Wt=uh*~Sk9QXQx$(GN zgb(wD{UZKN;p6G+7YAY?Bj9*%*v@`C2{hFV(qfX6HEeb!HY=BU;6#z^E$_-$O5!#e zNaN~>>_D_&Ja$q=3Pc&~3G>MvESjsFHiaSOVC52-#WHNndNO8R2>y_N%F^FFBpQb! z=o=eKm1E(olJHQO|Iv1^2vj7iK0yzX^N@n0?hkd!1O+E9*&Gh>M0km3PMunhR~Kv7 zN%m@W0AX0h`h{!z4(z!~n;yqk>rK1pI=J!3U0HD-`5*k`>FXD_;!*={7_iyQQeJ^; z%*OUpc?dLl*Y65VdQ~#wFGg=&wuF%xtB#L08Goza(O0`+DM@wo5E_XkTS7-IVaOp1 z+G7~8E_W>1^28|nBY$3T#lU`;0oQxpGOjqh?k!A7@=eu&FuVXYp(RUhE<1S~$-y zufM$`Q*G;>#W(;N%nuCTt(7c=Fo+1+hlGIRLV&BD!kqt^x!Di&{Y-?kp&6t{~g!>w;sZ)va0qZtNI*bgE!v* z|LZ5%02zj<%NL!xjy|L)clhsxxfo#HF1X_;#q&Zl%^+1sxC!sHq*t@Nlc(p5U`9s( zt2zv9E;t!dIC8k|begJGnQ`WR1D2V20CS64q326F$d2o&u>p$Nd$w65dI6S@-{foy zG#wb5A-@ROji+pm8@Qy~p{A0*ATP(TJmJyW%)`yeN*~i^(LaK8J_=BG?z-bJGC}6K z+W=-j3cud~KYM)j&3ssoZy&z;@cl`^U%J%nzxC){K|kpu;QjRViv!+LL`tjq;|{X> z-B#bBF)1aI2Dc3=P#HeKy^1B8@i$UvvXd;!v?=eI5!JFVlV!z>CKtd3z=XRn=TIH^ ze@>~)8f@*61;vQwwq;Ch<7d9=ZasPzLX76@cV}Lx-yIa95lw3v%S%IPY&kTP@)YbLG4*L%rnM*Qo4TzwpPeIrea=9B7}BLS zP$YF$lOxXeWF;9@Niv_2wL=nckq-(|1eMvWaj6@%xBv;IB0VIPG6(;iHj?c(v_11% zt820+oyx<0b*46vbq%SrX0r1JW0ES#)XmYUwifV_RZUecVE34cOSml z>;3rZy!388fInD8PGj6vt~9~!y&d~0t{Qj&+pW*i)9jl`JL31`Pf8hX=~{D*)uwK@ zW`N|fe@b-5ZAVZs-~ncH4Bb;N^|@_w0MnLLrv!f{&Zm%iU+MmTJ9?}6P3$>fA$XzA z)LSZhxXJ^0B91N@fNCAW3d?!2Db{WAtMp;y)cp+@F9(@6+W6%6p7Ii|{@ zAWBS(KhDim;k-Olkci}(&8lI|WDlJ=05en_D}n?XNmjK`UKiI8h#i&F+5L?uFlsY| z)i(Bd;r)ESeRy*>+xvFM5HeX8Oz+m?cV*q>lVMPPiH!qICg?h^0o%{U=ykiC>ZrkM z-wxr7nV zGIk;*sdIItv;24{{CiYC%yt3(LUPljHM688>EvKb+<>4Q_ton#{kDOC=PIx;50G$O zEJMY}MK}7_FXXS*|K57wuA+@_LL1Ma zYIEzG?;kJXU-Csf*gt{ans@45%)6L1r62|!C{R*a__{G;lMIcDO(awfQuE5SrQ^h-vb$LeyDw;J-0T)r#~BY+ z+{O11{Rkp~Q7(r*bY0^O)4c32!Z0-^^`2RC@L73Qvf0WRrGH+F?$(2M6`|V`LVtls zY3rQ88%K1GWm=Mkfk=_P>l|yQEY}Jqh#a$3IVj$&x$Zg>T_Lv?Wf~aSg?vQyxn$`< zkjwV4TY}cs?F~g^hp)YX+D?`ok-ueCW_<3E`n(q1tq1ROEuQZ(^Ybw=E&);=XEv#O zXh+l8RJJu~LTXfbkFnJ*o0gS`Y&C9Y=HD`#A%G2FL7P8=DvKlKy^7EBu>nQz>T=CH zE`AWMowu6pf>&+Xg})s*X_(N71fXun+i{*`TMUgvmAq|Mtrceq+x|?bbtf zrQpbYRQ2)n^>g$m!4&qP4O|zT0ID5Rlah*;ZdOyJahHM4Zt#$5hRUayi>7klYGG5W zmg5>0T0Yh84`d)@3syu>X@(i+V5DGWjc;sKZ;e}Kv6lzmzW?7p!JVIvRq8Rh3=e$= z;?`(oM**ZM(5S_r6Qd;OzBV~5#qCO%z#|pv=R9+%UESgKI00}3y2hl}5Tisj;+`co z-96|cG{msvwn2!1NCqY~o>M#1UkW^5z2!SrQzxV3Kd&9KPARmEAQC|-wc+A zh`kXzmrRp&a_6j$Us+>>C?37Cwskq4+z`5NIzCUvRX9cj3QD@3fmU8UE%?8#L$^2Y z9@gXIUx-khOFVBpf>)%<%t@;3c`C%o0z48dhgUiR3G))6Ps9r#%M2t9GJ`MjQO`Pw zl$~XSiq$r1FXTS8aIC^mL9AiqGVQfGMQW<~uPWfzn+16XGI-YWqPd08LL7w)hB1j<-X#8n849Y}Il58Ec!T6Dz$Jn3egrOSXSJX?6201f>RMaM zc!BT zIQJq2NkX$F-2*U(0Nd3_YZ8Ky*LRYCOF1s4V8gN0BoB8MmJM;r=w{bkW=}iod{#5> znEIS1t9LPjR@Qki@D+Gd)*GCeaXH_Dvcem`EC$f!YAck~S;>r=Rg>AUp-Nw(3TGx^ z2q(w#9$;7&%nR}kJhx7W$;!=4*^{We2E?1?8xgEG4N7HTqLaNlL-ih5V{$IGE~ZJGHI1B{ngSz3 zA@CU8v}TtURsG8ZTJjZiN#YAL=>1?B0MTM#JhHGXQMXYr3Q*$!m&!P3gB_JAp|Z)q zH_m60H-4PcD)}p4wa2^nZy(=3y!z%B@7ph~983naxej?QG0(NmkX;Iv1?&mJb2?KJ zj7#21x{Oo9?9vsTg^lrlCtE?b(JL52WKji%?U6uh`=Oqh8my8<50I<@vblR95Ua?K zRW?AN{Zgj#ljxfGO#CBS1q(B7>FA?uyJx8cdG+K}0FUXhs%+bMsdno6DaxUmIRoG* zi`0}z31#=0=3tw6ssGs}F?t^f|2adPhs-#aWVT!!GA5G#&-qpjwn3g)qYyEiL=sdm zF{B-6B~79p#Kp>J{d00O? zc-kQrMgq;i3Kd0z}?;;I5D;b0SgCP&)r9ig;M&8y40elUsg( zyieQgC}!3BuC^|AKX63mW(F1sbeetI8H?&^+Gw@$3BER)*gfmG!ym4gNJxQyIw>DZ z92U$};%?rkx@%h|AozIrQF2Lz6!zmp_gaW6kY86&P z%F*pUT<*pPQbgIjFPo{w!>`v3cU(fpEb?A^9N^OV1VJntz5t;WL`W5__Xf{zaJ_B7 z6vq2~|9`1$2c#Wml3@m+MKal=Zgy%r6qKUL1b6W9umpT!O9KE|skRk)1M}AzbQ#)c zeOTG6P1RxKQClff&CtakQx@fMMaDDy*b>(4&FVlUtD;uNoZ=YI(SY#bSW-wha;V_f6e#Ipfw4K!>(cvA8cRx!Q=nf_j+3eus34xy9 zK9YnJ72d6!!9@U5h{6Ug=Ak?DQA-z-hXJy-2=uNN$csve6VxS0mb%v^S$eHAKFs?f z$te|(4++*vcRaX!meT)OKQvA5-u18NzThV}9=ab+I*NVWobFaOyID%n@?Fo?7WPM& zUTJEyaI|Kr4i#D@S7DpxTmYmpnjsgHlo#328o96+k~G10vzcI`Y5)(69!XKT#CglE zC58jEBqDzQ|9k>!K2)HUXIBA2Re@{)Fpzh8CmJjXm+N`bl-jHWDu_nJhvC$$OMY8A zhLpLyN#F_T-BpDGmedww0_mnCCJ~hz^EFfzMQH=CB|9_e~W>o!N4ECa_|WTV$3^`{m5iJgJxn2 zL|ZmmJNy{jfVuCB9_U}c9q-@X{ppAG;Ud)DdgQKl-J4U_{Y$+4vLRY`v~Cd&B&(wq zq@fLCU5TO)fDpcw@={Uuaw-69F_E}}bbs@)v_6|lBxfrfSmtm~?^=t}h7D69o;p{Lb(p$8gB9TQuZbGl5Ifs7eWooD7OOZi94 zmS)#=Ul5jxAP7MsWez;?07FJ(;q(ng8WJ39{31?U^?>Z0FN+{U5enO3Np`rA8_9j| zKh15p?`^r&Z+)+_Q2E_klpT0kw~A39P^`>+dGGg~X79Dm*?TR?S?d~dWmBW7Jfk`f zMPl>{D+7vkx;y%o8$s-cnsoDWm0{+x2G$t3(=brh^LgQ|ALq10{t+#aUkPr%ZsQjW z_A|EFl{2A8bdf-0tU;;|3t%9XW;2Rhw|N3M!918FA*&a{DY&2InQd1Oa8gOPU!-Ui zEE0RF3U7z3eX}oXKSM!fls44wt>$SsaW6HgwxD@K%2-((GMeI9 zx}nxhejx<;E_0YxbAeKZQIo_9ZBNpVfdTU;D@lb$WlSm_*#>;)eDo8}0z(E0L5kEc zIP&E|v;80f+Og-B`zkuCFY;)Du=H7A#5o_Lfy>LItQA>LIn!9uDl!>hcHpK{;{zdc zjkv(CX(SKutgh-rm}D(~nwGuF^K=B~`9yGFH%2@{t|1rxYJ9pHfFpZ6uPyDI+KsGi z*#A|>fl&Vn1@UPNzYEz|sSMs;aOGT`!ZokS%aDx62YjRZ7X0=qncKl25~8mlSf5wsR2CDQx^ORHDa%mki{RZ^81$-wPgp z-F#uZb@R%r|M&x(q55H9x+?XMkg+$FG_j{FFq*pXY9OpumdQA}@Jvurs=F=LfcmUd zsu#)Az(HOp8MoQix&k*92%>YDpabuvll`fB_tIVDJM#i%s{8AFt`*DBDK_EXd&77O z#U!tqljy4r4&q)+H=`B4ru99SiDv6=ROC9sO$bCX64CY8R=G2IRF(214M!|sA+uCh zTs}`}HS9gne{oee^gb_jo z;hj*y)UiQH^HUB(dEfmfy1mGOSTw6m&2}=Bl_~<`E|0lbv^$b^m@JHHAg)ba_b@qx z|5{0ga9RR{4?JtP@*vM3kKJYN$&0AycvP}U13XV?F!4>LPJ4|+O7U*wyZ=;A5yFVk zO@Z%DK61QPXV2<%dlj+dITZx5c5fPjU*H|S)Oj^tchxH!g&xOBVN*xjJIFW_RtS_$ z3VnQR>`t{x&8ur0^pj+bYDv~3-2G=CK$>^!NSD}63{4=#!W)1a#)90lm?iYcmXd@N zVJk`+hMyTZskJh#NM`Vb*f)opoe*VI9Gn2CvU7Kkf#HU*rq>L5QB6w#RvU8>0Brtz zb@?sX|F<5sYkC(SyZXM~g?{7P9|6wRus433^Ceq<`SH)MIRH8pYedN{!|7RO!@+Gw z^LvRwegrYU{kgxSwI8Pg#oRiUo-yf-ALoLzJb%tK-jA!M;YnqyM2X2t zA|i`ezHiWV9>Ct-3Emt2)rM>%w)&|6n|$p`;KvMs0o#o-Txcyx)O0Ud zh9*AEO1Jh^&IWq=NBB@@X+VC#ax>b76^#Bi^~R${k-sR>c3nhaKPWt&h! zyZg_T9f7xO$l5gsVaw*&7=mN>j*zEO4Pk^6A$6B(@c*<;>GrO3_R{TJVa9DQzVzwzUo3#tG3(>L$D z&Y!)0^XkR@RX6Kh`f^5H=j1pC6&x9!?)B`$>{f%3UgR+yey60(<<{Y|BI&sRjcH6i z%q4xxPcG zR!UlCTgRm9`k&G3(>kdq!Y~-XNK{F@hR}y-@nDMFR+ZN##*XHoDnO~`yzPbDl+X98 zw;touiv8X%FPaK(Jz!TW{r#!Z-#JWP8Kt?Cm{avvn9K&timo>~dMSJHp9q-piDeLWAP$i+oMu$!EQ3uiy9?V4z@!rS$w(m{ zHk!4oH+{FBfZl@@0w8ANGr(mU$yOS;bJJy0JU77J_;Jn`Cl76}ch*r?lpuh3@u-1v zGKh+V^uS<87){Z#vwl0ajB3AB<;@RO*g>q51kgx;Ols0?>uOoW3cR~SJ!M(K1osHQ zl{*~RaU4?aA#AoTAy%^Mq{jCn>0keqhkTz#b>#BYZF5OG1#G%N3vH`WSaR*;ZZ&pG zh-pQ`LRt*UaI%T%hK*EWVb`cXJQ4;>O|rMNq=po`ZloGGi|B6qBzZ@YKN0@8cWAMh zyZ`DsmDRNexQY2xUEG#BYiL`hH|kk$@FJDIj2&bpKY{}b5;s5+Eek@i!{L0AeFHav zry_e?S7|CE-D~bXBm|;@)vTQ&^b);P)MB(X$V}{_$p6-lb5(fc2agNxv$yxpubGeg zm8G7jI>WkrQ$OJ3k*otxWzXt%McpDYL`$jHI#}d=4%TE0+a!gQv;%NW`cG<&f?6nC zY{9ZPr3E}#4^SGug~yiqL=vmQNU;hG~HyJ5hWQR85ui zkIGkoidlxMBFVK#R5}R{fl{kstxEfGsqmNmQjS4Wb+D{>2iSg3w!C!TA>66x=Y#Zz z+uj#l8#jKOs}uU8&))85<=G##=l5##xiYCdmkUPf%5JDu397KA+g6fpL`sZXFSF+& zX~~*sKmeLnWd(PU)V2!bSOa+kGN4g8KFM*(4vXlsGU-{WzdF*M@&RGhu9DU3Df3%$ z*ZY$Sd4;sH1Uyfr!7LzAiHHu-9|vQY@}H`6D7*V&AA>OAi+^X4WG%}u@>*5O%LHR9 z(+4AqttdtCdck1hKN6EI`O+V8V5y zCTI|y>^5BBHIn(_e&eIN@OUwL9B66HN+>XeSm2MqrKOxYS0f^=x<{6R2o%JT(Hvl@ zvfOt!1V5J4(hrK2bOi+{WZZE^)eOUgc{38Rh&g}bKx^7ys*y|(`&@iG-+kZuan22R z|G@3ZT5voQ7;z7Rq!qayJMoJ&W)$Em6%eiZ8XI_zzDMwdm$XoA!Zd&YC~UlR%qHPT z71eS=C+31%GMi8U*~U`T$fqUhJE6xMV%&YrU(Kns#i2_-{r>+SPV(gy`|8KvfAw0J zv_1c;f9*HU?|%Bz-}x&?82iar{`KGc{0IKDPvKclW&OlhnH;*V5@e(L6_Jrh!cBxW zfg_a?D`f>}CY)InCnXE@wk{f=PU9iJi?h8>BE&-mvWKBJtG78p%}-h++gL zsF7q?e{Kd~TOwY}V3LF=5-9qyxts>+lK~L}GEEEa2EW6q^ni z3=a&@Ib|2#K8k#6B%dtF!^zP`#(t8J^PAZ%fID+8wf_EiF`qqrdVk?*f9qkps(Nou zs`pRPQ4^dB1mq%ILQyfv;@`-MHaTdk5T|3{q%rNt?V>Z_XB8%iK9L2LIjgNwGD9@rX_k3Nr=(}{fjf68$Zrjt@Xt(=KY)3&+cC`8P8t* z^5s=x!nDGLQtN6TQIu^V&b3@oFO|fTS3;d8u0lt>1KV7SmE_nn192>U^JOO(xI5+2EPZj*h*tLGs#&oLK>;6bRv7O zqjeXoA=Ozjm`@IqNk_`eNo@c0vZ@1+p!y95vQTNgH>oceHq2k$yS_nhybk@Lg90NfPCLLU zW5N^S*pC&|OLq*gT*!ak7D|^jYD|pIOWRR))4GwLR6LjH-1>3O#~bb8VZC|#?Dg}{ zu3d6jb?-FwB7&P$Yerg8Q3K(ObY_pU;8Ir#DqT$#yz5-p1rWaKNK^ehP~>77>l7fo z)G%!1?IuI`DZj(5VznVu+hl4C=}e?8kS%LI+pnpgTu&M0aBuGfSof-TYm))KS)FXby@d)5ct%OBQ0P+X1@_%qEx{p z9jcAnvzlT__!5eMR`T@4+o)nHRreEV3{UN^e?JIZaipLd)w`)xBZ)>wfV(B{^fc9@b)L;=MO)5cr$*&AAS7u zho64$@t!Ol>bNr3bxkeqq{IgCQj0-ZhScaQT%_vcX72`Iasb;!hzZ*_8`aR~D^Lb@ z6_1OLm_Xdifl6Ubd-|EXEnD|gJ5KUqEUnHKg`mbob^dNvHj>lJEQxqELiFTXew%1GBS^A-H>Si;qor3OJO7Y3k^@VL%@R4P(W+9OQn*D4Fl^6$F=m) z9$MJ_#&!mtX$u*$KEa}aw9`x3rpr&LtD2J}N)A%z#2!GRpo%h3Zq<2cgWLC3QyEO# z2s=U0R?6oygIhn&8R*}?{B*s!e|rtXMF@VYOY|Rbw$@V5zpCh)TsH#q+kyM*X!PfC zo#YAT(YVTbcU_JDA+lss5Ww?NW+f5b!w~ktt^U-L0d7CP63ymdU zmE8mmGQ&3s!mYmfNr@A!KD!ew3Y)ubtBMV6= zVQsT3+n&gN_uu}(agE4}#z0`%iBPi$9rmdEU}x(pr|4uRNnI6+(3&{d&|#@}DTL<5 z6Iph_`=IerJ{oHIA=X6cx3UDJ(vt)LZ3uNnvdmKRXeAWE4DSBBqrztvbsG=oZD7%L z=wRY+Y-x^Er@NoL%!XUAZrygWgWRPP>U;%%vID$yX$GN!{IBec{)UI~$pQaxvqmgimRxa-mOstX(== zY=_D^hy)fDHycn&py0v8lS+AoKR?nlk-GXdnFkfvgd*dcsao{K?`G2yz(v(w2Fx0T zR+o;r^9*O~@elu!fc9*>db1u+2-Y9*s25ThHy*;PK2G7}6Tnf@O2yDdyr#mlo>;1J480Y0%PSQ z(GgwX*s42%w1-NDOw8vt^jkm9X|4Q)V{xn(_ix{>H~yM{Wn#&KCP)F3$@G0x5}6E8 z7mF_&5D=L&^1H%hB+o8I)Brw)d&?Ew=-{j`5*6@D+oMavSkgxwqBJCAETm>y53Rx4 zvLze=mewvI%r8n?K6kb?ABPWe-l&q>uF6?ro`W>1imckD1M(bvm`hC}y9FS&RWG=& zVM}t8p8*TA8v_3dZy1siN+WkEBQ@Cs0UsfoDjg=D?wBixd8w$7&DlK8VYg-gHhWsSc(t z_nx3}I=Jfa%L$@%Mu+V&hbX9-RSMyaYFZ_DEoE!L{c5_OSspWaJBbNQb>*Mi{JN9N ztlNbhUfQf;v(^}uVVR(!X2~e>yTbj>7iI?77tHc0!#?v)RXUfZvkz0(&P}BC6alN! zU9Rr9c2uMKv{}xmtjUp#Dz@Zgey-yE-6NzBP5y|7eDm<^{`EKqlv@wr*M?9mcpVlw ztQ5e-&cd2<-O(|$Wk=8GHjF(C!n-Mv1a>RsB zsfy3U!j6(<#bFMqHvI-1Y}Gq?UYHiEB=UF>_<@lyK$A8*OD8^-{>#B!XJ5v8&j_5m z)NcGZXJgb~rNB?u^VckaYZapd7Nny?-JLDf1{Gfvdsuy$oibpM(`|LgIq9@GOOVr9 z3$s3*%%Nh@469I?D4RF$xFs_K@@}$#b%W`OM!m1>(H5k>7eZB+*l;nw7ub%~Nnm?& z{er@#A(M2K(6t)Xp(Zm59@t7Xq7Aq$Il8v7WK3RMOeJ`;oKDghfG7(eMq6#iY}-wE zv8v-;s&=*#W0&@xRMMPe9wK~0nhhydHo>%Ktn}>*Y_}f3uMsKTI<%cH32yv2=PRUF z{ngdd)@WvEk;FB1IJ7z>Vld=Pm0Cw#nH9gM`&B3N=YoRvn+BWT8tN~Sv zsPwU$(55W5ncc9Yds_O^o3jAlF9Lkr)}&AgHc4 zHH;OfdK1%)9iV@>YSaNG=zeyVqFSYz4?1A45=VsgwY;G!BMJJe??bh5W=bos8oLu= z{en(A#xutavoXP_U_7bTlfR<|YnZ|c@ZY#$J@5mlYG_?+V1~-q!*YnYR>Bdkt(CfA ztq>ce&m6KUcT8c!=>`e*;dd*6CsT*pR^_?1`D_RAQG4^|eqUHY+zJbah>A>{Z%!3XbkDB#70+1&e_dI9M*p`#8NMFgMAUtUyY3aElqFC1pEXJZG=N zZp|iuLQPEYj?P*cQS$A~g;8_uMaAiHw`OI0po-JvGi%N-|%BdNKfOBY^7>`_fj4TKSO$J9Xr^YF>e-tQQi+7wFjGU?otl^67})?TzreyIWd zyy9*>a#wXG%}HnSDPYLRa)cjkNa##888S=&RH<;Jl%dM%5Og=%k5_E~NkF+eoU9Xd^xcPsh^gLvECb_ukh)GpV(vtn-%U~IH86iTg0vn;bme4WO z9torc$*?d2`C=6rex|HaC3E*b=_!Vjn2SDv*?|+26(^I;bo3_MxIU9K{*>?JeZE?6 za^&1VPv8#pCg|cl7GlZH5+Hy)lY7!q|K0SvB)(eCq>gbW1cEr7IlR+T4z={V|M?gT z7KY3?oGe3waOokSZAisi)$8Dwp+1kn9^n~BH!2I8g=KE}-MRUw)GfeVt?-f>2i-D^ zLO)*Wh6HeesJ`IPG)-jAN?;ArBk9K6{V&H;Y`d6bmhfZ-j10IYv&P>8*yU1;)C*NF z;J2)z5ais z2uoNXMaM+h%^+DFE5cKnX4sjK60eg95i-XxSkz_*Jv*uk@UD>+nvMK@cF^4Ltl#-G!WR^*K39L!b?PRx* zYQmC#m6kx4y}e}v@FO0cdv2QiyJ=Lu`Gm};`Wo?HjTT#ckIJPTx+cb=8;uFZYG;b#T$4h5m4y7TRo_i zym}Q17Ji)xh$?|1+`#5!YRBH%r1Z>AHZnpazx7QFAv{4WK)Jk}R}ZXDtQ#;0ySS<1 z?C$?KVv+WAGvKLtNp&Y_ecVXyqZC8Dp{07q@ z+oF^J>H)p?ttNk-qD{HPXCQ!%`U**aNi{Hj-RSZBp!MN)xck39Kou6TqK_%1VVja3 zDmWQcHgk9jmA1VaE3*oqAw4Sh17MP2nF09{W`1{{vN}aFy*!%bDe2?FFg3Hbvy&9lFBoIq^8cFGq{Qw>A`>5@Rdl+^_ zCv`=id$qDx%O+11X4(vv$iqNf0ytCWWFr-~SM|oZ4La z;xLI>AixRwOET`2F)zTI7(zhI+PW`ayKTSblqc>|QB5OvWREW=i>dN#(9Z6*i6^k`u?*U@$|b?gB`0>K(` z+lXrDibs#HZVEwItRXdVO6=T(2(yOM#l5D@>VB&5G2MI1o-uFe0*MO>2+b(Ko-_HD zL2SSOehihcoPB^ltDn!fa@J|KBNHm^3t|aSq!UV*t2}DtPtcm zNH}kzyZ~0xy6mBv1wbyMwoJ`uJPI?T(VKn>f#d`bct9gL?2i-@#UT>aXoH^cl zFt08`b6SMoK*KC>gFghtt%~Lwp7s#t+z9f96%hhNjJW1Azc|=2lb;0x^x>uJZw$MW*IQw@Sq0ZB{=dQP}p>8)zCH3 zOfVdlAsGsc!t_UXt{3~ki~E<)?lpcFM~=51xNqwrw^fK)s>{!Ak)%Q|byShgC<9TV z0`Ce{DkKT-BTOW)4koaA_U%>OYqJ%5w^g={4YEFx_sh&8{XS4>lEpRH#52-GPO1Ai zqYHtMmd?F+BtJRcCy1s4jxF6+Nr*I(l*%!e-3j6xI{UN2T8%E|rKfFs(Ip*#)=H?S z!G5K9M;xl%!_lmuyyKT7uf3#r08>)m9Pl^i(v9r=&UtpcS?%q5w#K|rR=D-ZU97lp zvR@5PVZZw0+v{}S{XgFb!=)uBdv_^^+Xdkv$mTup=Fsw~t zL`$8fLY8f-8#<81fdEnqPd)^oy*VtZNt}c#Fgs`;sJ4|*ZPZP)u|WsCxq5$YSpp}f zCPx!n&G1fNA4*j}whOwG5EBk8%y7t5j?O}^>_Fn}f^2R!Q3v9N-r>mX1EZbBU-Joy z-1Z(o5>TZYRCduhQdvB=v^0Sry){BrCIcGMO35 z&C&$p5&CuR@8umkdYd0cb;?-i ztbj4^_r5-9=xjx82+Sy@f3$Mw~qPWQmY6eT9Ru2hUQ3+VkLK|Pl7rE zN#FYf4^m|v{Hw!jI;-098}R?p70n2yl6EH5fr@n^u&dhSQsWa$j!9zh>Qi1$n3@Eo zvU#J@6fstI0mK9`73b~%gOT@=I24BW* z>7h;r5!@kHNM1?~0Hf(*5}XZauU&U_VXdP)Y!TMC%2W<3*_oz~cmMd$REQFExDO=q zLsHm18#AQgN|I%qWrEHNLHP!oV#ieozdYXPop0B1rE%&dH51@o>Kgn*_0^TZ1K|V2 zW_A_GWJ(c;%10qVggeSqIk$NZJ-2?GGuCA4=BpR|Pu{L;OG_7962{q*bY}G|YeofC z8WZhYd{y;;;NC#MlH{-QB4dT{8a7Gohoo0p(gi)JnurN@nyNR_H32DjN)qTO?F(Tv zq8G$Z%44%->8=EOUFPk{O^kv{?OK6{l@-ebGlR*<+Ep?`<1pkQCW0$QPtg)ttqNW$ zTOK&Vi>B4}cFRfRUe2UO@`h}_oKsW^X~byOJt;xT98kfeGvCqO(UNj5?A+>Xof68Z zB}XvMmYuSxv+FKBPVhdX#lJ|BiE#%&g)Rq>B{Pel6PLrolRe$+P|uPi1eZ!i)N;Va zYmPT2?=`oGMx&{BCS(<2tu@bq=Xc+}dIlpQ!aZNl9^Ue=7uu1x9>8zw$qNX<8zTb3_YnW21uTh+m(dP#K<2URQ*O%lFX zz?P^AwZ+nEA*e)yx0=(kfOUp@T55kuMs4fm!!!Nr(<_pew;sNWWv68LWyi+HU;p|b zJgSUJ8m(;JP+McqI8u-tQK|u8=IShvGE4S@eJdY4G4I}s3e+{_|A=Jij1>24R0X0v-i!^|IT@Gg^2B2t2 zK&Gf}6aFAYfQAIP0Y`BC&>~~JN@}61z!dt$T-nuh@-^fWQy@5^X@%rt!8Q`zm310V z(MN1||K!h}{@^8Bp4CJ$a}H#`*fVP~GjdUf!ZpGKEO;x&p_B|>POHc%<2X8!x;~tB zR1JWG;T;a{)BB_REV$K$0g1lSnj=fH^x?AkC^b>dYmDdX#n@C&0&Z!Z)YizF zZpk6$?&VDoR0?+YxBu`12%IqE-C7dAQH_2-S_5J}WC$f1m5J|a1eCk@VllA-lS;7Q z3M?$yn0OaFfdrUnGE*hHTf?xVnPBCvgJdnZg2)comBIi6Vbx}+O5ASF>we47iIMEV zsqj#q?<{^#*0(Dp;y{Qp-ylAD)#TLdy4qKC`_3Ndf)Z6>e)h-$>4)@x-jMFfUxGf% zwQ3(}!Y*EgPsu8i0}O+w=EZUUdPrX-etPSXyL#SOPUnrk_PT$1uoEQhlStRLyJ%{W zrE7phF)7sn`E=IMHHbwG3WdP50{I#mYhkvg5l(_v6PXI!bX}Z75=lNwXLH@DJvN_7f7exkPI*(U+RL5CV=MVom$Hzf+*wy04l@I1tlPPBm>TrP0!fm z8DS5I%aR+WoyEh(hotUhd^OF?R#>*fzDYUVt3_k%)k|KzS)Fr*^F7F|ALpW-QxkCI zw2|~E&t#o<`l(t766uoSBa1n;(o~?`wi+7LYG9ne?6yMjyH6>+N#~&R`T7?@l;TAS61t4d(7CYyo{UQ`LUR79_u z1=+HkbJir6tL>i2H9K1pk4fs6Vmf(7Cx$c_G*6%>%tW3>F0cXtrVY6e)vQJne%Ef( z@*-PIXV`t9`>`^>+3G@?L^BU(fh@GVCJ)94I~Wg(tc9 zN+KSA{f*05lMw-TsIh+~7QKTMtMoh+6`gz0rQqCb1#DQoEb{tf@FbX^TP#)v@m@P7 z1aOFpL)JdBJ{pV_Al`_GGLu_JIw=H6!IJtb`N8qm&Q25LDYd(WAdoGUV%7BnmL!5* zlVj5kuuTu@=L!;aaBfd_zc32H+!^8zPrHJY2r?@z@JKLq2NfPcE$UDXuXExCttTz8 z7Mq$<^(Aw>tHJs458&m@=4UT{{;oRpqw(s+i&qzyWVar_E9)-4cLMqN>t8=>5kuj; z%tMgMvs{18p|PrVl(^OGSJ}-3(BhUl0mX?yoh@3ZJ3G)yiFUMVi}-kkS9=-Bs|RmM zN&k=nmPynQn~3rl6t!Rn%MQSw7s{<4=iH4v-i&A7U2Rq;v$m1cVjPJ&5)WQ#dJ)c@ zsu8nE$4(G~#7yR<#+X4+GBK(xj@+tSSEy$kv#bu};m7R)k5@IU@ygrjqL#JiSU-G0 zae%nGTH5PmrAgj$@2oV5jyzCvzWPASCAFvH@B(@YErW1O3u2NwZkJzQX8_xjC`MaF zVh$j~#K=^Y`Q&X3kHimy3VV~%hdiKU>`a99BNIY5lsp$z^)xuUzx$^?z)1(GrVW7Y zP~raydLp;V28*gem9)f*swi|z$lS_aZzpSH)3&6=3FfV814>5&>mJ8{bcPGN?Xp5` zAl;&FNeP@NwHzH45~YRd%!{(tZ(TII_4r+hX6ehq>wo_7*WX36@1of^E1I3>^Tv;J zn$N%ZtNs7%E6hEc)46J_U1s7iJ#|L60va||XEGs~rSf2%?L|qyv;1mqUhY>+EiBA9 zl@sveJb0H6&j>soOGG9jb@TzfU(*12Eb&clw9|zl-8ogX_V*_?Kg#7ieS%nf2VHYR z|MmicL13J51MrrIEZ|!s@QrL{*rqJ?&8hvDAu&21*`Y2timz%89y-``%cz`I+TjGU zVOwD^SgbbLs<>XjfL>)co2hK&%)M`I7I3aXyjS1DC!f7oS6XduJ#<%fF6>F?;wcP~ za#XuXaaNW9M&)xd1(`;D%n4*492r>GMlC0$@8Y}EZme=M$lgO7*%>)XiyUS<)cNF9 zS23$42xlGss>jTbKy70mq;AxFeaY%C|8ibDoL0?tPZ*)tNN16zHmaj_2Zn= zgBtAKzIu53=Kkd;Z`&u=3bJ%!IpIfFlex9QmD)#$h0J_mYP-gS!9g3c#3XU zT}i#Vyx!JwP>mw_MX~_V%4F2rHC<{F+30{ACoN;9Uia)$FzBFzvf7o2{UDNCJ8jU^ zBt{jfMhs$cNU9N;1Wb0>w$ZIvB{jC3vUF96xP#ftGFOGwMfUW{Z$^FS!uOjbANSI+ z)^XAlOK9p#b1c{$nc-=tJfc-pc;*k8n7FD>taH}Mb}kbli3P!`BZMta!cI&|SV^Y@ zCj0JUa75=(b;!z8#VKLyqJkx_ooTFOY#Q%UtHkApWz18Qm`brio+?{toyl8g+k_vz zxPNg!p1oNQuZf%&M{u_uyl-n)QVY$2=_NB(Br%wWM0#b6sM8__LIOunEki6!%gP-E z_%&u60bZc1y~?hvO#d7;TCe@1E+UC9$wLRi*uBe%Tnk(z-$oES5oA_%#rO2BUUat} zysJ0#=5#~<4XglcirBU#vGZx_-cUE7#F9P|M9mc`k}(8v8eU#XeMPkvOGoEpB*>_& z;sN%V309R+mASi`<|mv}C-`!cGnU{T)yotV5E5Cdxv6U2i<`>6nEox@DZXOrCRonW zW9VpgIS^-u-T1lSti#FZIfmWr6hoeiL<(q>Mi(SW6`l@~$$MD&EE<6ZzO=_?R7KMA zQvZ#*A(tyMv-4*l{Da5xxrRbPNpxx?ar8GR*f#6`93|LtQZaemMV0jR~h&p4pp5*Tw z%sfnHeHpb#A1wlX?Pvv%b1sp-_2ZmtI3C(w?|R0r7#Wq!fE!ZoGK9I6Mp0u;W8wyj zl-VV!#b{I|B_8UUJVS$IRo_yDKA{?O{nRvog^*NQAWVPBpaRBCl=DUrIR=VpLaZyviOXCiE9 z&Q11MJiS&Oi&VM+)1<}vZGA63E2bEwi(ULqcKG1nrDT#JE4aANhk3WwNj&S5JuVLb z{-dVB^$x>ZkKxtw=6EV^{aLAdgYCQQh!&e3Kugu9l+ZKcMpCMZHbnv$+)qybD_gKhZzGr&RM&MKf9PX z_G{3p0K5QFqC0`vob(AgSXe8_2-~B#_!FayuNh1x$)p#?JD=DuJZ3X z48Q9zJarhBxO;?s!YUG9)9Oe;es4RdVTC}*+rx6Ryz09rRq_-|K2g#(b<0;jZDR`p z5qmqFwF$9X{wu8OA>su>Tskx54S`T)3P=h3bZ zMby7s2vvzZ9sN1cD>;$8a31dKUq~DmJuI>fP&np!G%b zYN{jfYR;+YjK#ygYc{dp>Ws3%ZtMhhqF7NEbk;Gxk?V;xv}_`_m08th)EzOM=WR}k zvoA$kjMg_H*`~_M|n=waH_nC%r6V(P8gHFHViizrn+nk zr*O7QOI3$3p#PNln0AT%9oYYePcG>r_ZX>N@0^Qt2(~F!nzsae3BG&Sb?Cqszqcev zD|iQ{vsu~_rFDUM+(oyOYftZ+x=}(++oWL?B6Pe^b(5XDM6|t?#sOfSPc3TDJFSuG z;Zxn1txgU?6Cjth9)^T)X6&*eH#!h&gT;`%m5`a=QMzH-I(d!gpiHILG5BqOVdPX9 zkaP*qMJ*oDgJiZeq=DYH9cG4^Ow^V+WB-rF!vhQBLe1yKgLdW6%$yF*zFBRvUkv0A z_|;Dy|NW=mdo*&g5**ZZMXkogq{huQqSe_HNK-Na>?|hLN%!N>E`>!8OImSGvc)>L z>b;N}riCHuTnSi3untnQQx=M{J%D0Cs{s_n8!vC_N{XEGoP||1;0M!~L2Ygl{sHr_ ztiU?4POUuhTuLEVmkgoHrk0HUigd5xqiU%yBEdJ33xhy8U~D$*D&5YfSOvm1=>MH5)lA|Fz*UnQ*s0Atl{`uzg+#{)%eA_ zV4b%fw=2$Ju*~qDbJ+14Pta5gymEUtL0t+j-fu+eg4s zcywS1<1PQUFfw~^>X=&F9sXs!D*O3~D$^^rq5AO`?2H)^_c=a$mzeMV8R59HRKwCh z*%F9dPR{S(?mQ(bL^cB+f`s_8ELF=$t{IY-W$bt=@=1jgY?esyhZV2vxVny@7Jnq& zD!?_*6(tOyo5GezHq{-?O!7)`cmJ%OLWk^=NGB~$3*GaF{DZvbBPqMdDFO^XB^s;X zN2uu%*;5-dNIJ|o$Yx#s+eMv4kR2QIYy?v)yAe;^(apDdT#^Wlgxg?%hQ-k5D(3E= z(^HUSH$d1P3d!VNzB=dvbIjFzWSsZNHP(-ypg2^C zsHk2C`%4g41v*AxW_R{%WHFWIzyPK|j0W?~%8<7*+cfasY<3OuM-sD$Quxy~U;ee zoDgZ9IAoFd9~5C0sS?gU@Ba4BuC}b{)&d3Yl776flLmn73U8EFiiqJwabl*J$FG>GYH zYwTqKye-dOI?6~^~NQbzTjWF9r? zCZ#I7lA~DLK*PGqBXqo_+kkY${LM}+zJ;hQCU=U2c@Ta)-4lvyeJFz99X9U5$4jwElL6RZe zlP;qg9j4`x!f4fA6mx>-r~u+7I!C?>Pi6 zYmF5fjA~s;I(}Wnmdtd@_%|Czu$9_|H1}KN6}yq9anga-Hcqx}fJ#!)2<*}sJHyl4 zkuoH*2d*FoR513EtIj?u#VT;r1Dfagmi5-5^t6_~_u`^p`ql$>Rl3KVq7KOr8XqiBcBN=%BiS4uiOpjhAl6ztO^*Ge>fx{ z8}_8!WSXQ>tA?A{8Jdygqx1q-g@zP{yPZ|K*JNoOGS=IJNciXgpcu~hIw7MHzmnLBaqf?gdxhvtQ|$M0}$3{ zJ}Az-7fCrA1;TfQR)c zc?Bs+5azN?*DJc8TuMN!)vlnP zizGKXZ;L4m5xa=J0ap^wj_e=iNLON`w83A7VLP^LV?PmrrH8!F!Gv66B(knFvScz0 zqbeh3$$-hD)2t$Y&lS}cX&}ywud{)T*-VCE!_kM##fxWW+5`Za;0E1q!wCvYAh#2ATdNwyskjb85EtX!f}lUrAM2gdi-eh{4L2W5=Bxo3uxS1UC}I~3h)jR zi6Ha<>*vGIjg_}{n>=4e+&?^f_>&j?^78A}5adR3@5>TzijN(U0l z25E)ZJ3m4i`z1GeX-^F+yGPOqdrFoknc;R7W?l&@DUs~xwX+XXqQ!^sn(=C1<Ckt)he|-4hi69t?W=bpX-60T`CjwJqjx2gxRV#6dlHLjBQU@V7P)lRT7X;gxV;!Nl7eSW zNf#XOsV-Zr=v0cSE*!Z!N(s!!T)Gof?Fxlw3P(a|hY6SIIey zOsFfi`$LRP-cY2Mt>cU!pS(g^iG7)DU?UAYWZ`)GNHn^|44o9Fdt$B03D>eDC0Jl5=+ zm23P?B!VS33CPPPBcud@XTvW2Uyz&Q^6DsK5Rxur9dw89w>x@>1Ya4}lvt1G0zlZ2 zV}dc{dj1AsTIu3^u5jzeIp5#CeRzJ~uPmx;jcV4c6t_V@gB1ZNn(|cWHcrNSfpG?b zh%Y>jL6m(O3!T)K63B8b2PI(TvP$`Av9bL{ zgZOX1tEc6^AHuRDXG797-tiEOIN3n8wjos=%Q!Xln4z1}C{M*9i?xwM0+(4;ce9zv z0TGHpn3#`+zGRHK0FM=7nAOBkfoVowI>?uR zHj@o7C*ttRP~uhVV(N(+UWzSd_+l#SfUmElDmbi!K0qFwxeP}Esr(87%o+GG@BWpe z4Cp%#^glBm=(^11lSmMKY^i&(;$$J~jx%33C&Zd4qoeB?7zW18bhoA%;2^Dum4?)T z!63&e=OnXF&zfS8ftEV$4uBI#w`r_4;EySub=tQK@Kj8HCUm!coU7CM!*>Vp&+mV6 z^$54u;lvHU7lm2s++n`DBP11$86qj;$nsL~xcdD&!x6`AEP4b%udEAW~tfrwuM| zw`F@888Z9x&gZkFg)`ac?0iKwKbo#kfmCc!QliwWiMgtXj!PG_W0rqedU5CAU7)yd!IMtz41@|P$XNGolD@A)YrIj)niEqmI zQU>kB)4KTU47hxL7(+riLmHb}qjdN`*qs;G$NcrYyOi_z$jR^$YPDE88&>58jX)HP zx;e773FHl$VbSd+m%$YJ1m$+H1K(;`bA@lqWPY%dmowYcr6Im~_+W}@ITKtM`uN=&BsRQira?NsDv??hh z1%~WFH)K#X7PY|ZfRDfyRaiY|74}Q3a;cdddMfua5ITR|Rb?;Jn^)r-j4i3I*h%+) z!5ie{2s*s`R}V}md+(wTt9!aAO^WLIyD9=(kws^jCRKLoc8CE6L#yDAaUxeYz^jj- zFS*EC(~Azd(jd08-FRP>4#p`V0(Bv&XpCP@=>u(93Nb7G?qB=a2S|4+Q3oI|;bU(^ zJX*6gsQlcLEH*TaU&GHVkKY3+g^3QMRNWeqoMw|&k*E+0bf~_T|Ei=c7*+X&wt;o_ zaKHcyM4bv8o_U>h+~Zl$38qF8m{tv*I)ZAdp;K2pgTI)bs1E4FcRN;+RovOax68Sr zBZ?kQ8Kkw1(HRv&e4l6eK+tnQH5<^)+ax9F-V zr;*l{eRB3Tkb>5^9r~Mn?0q&Dy7Ab3Ih_3VV=0TT<;x)FH{bov6NsAwA=LW7rrfF} zgF{UAAxW1-z15E#lb~Lbo-ecjIHV(R230+~OSYIie&U^(<5Hj*fuV~$-cEJ--oO-- zSox@@A;(ErDpTmyeA@cF``5n-2kCeJ#s@GMU=SvYB8SO}l8i3+TlcRdNs=nR;$gkg zO4UUkNia0IP98qBEa29HvQm&Jq3mT?a7v`c0_UcjEmb~bn6lV1d~6qKJVc@LmL>mw zX0nShfWw-_9Dx`i36_23NO%OaCLy}mCowrmq=n@ykG4^ZnVGz-rX3xmGpX__nO3Uv z4!{nu1Ej|SHV5x}fB=YL)LKK3#srVXHg>8BJG+^Z+FyS5qOUj4UiF`^adGZ@>*2dv z?T}B^4*9#B{#{Q0nsPdX*vX<{R0h$wAOlBs*p$tk;$_}O$B%GS0`O988bF(&CfGvL z9OS#NDuGkktYxTVCRN&I)qAHGB&nt)X(HXp=G`j^)~f(YW?Q7;(>j@+nNL0GT(e4W zt4n2E$BWv2VRsd!b}PruzQEOTevp;5Xs|VnpHj&u-vBBQbqEBJJtZ2qr5vz};dg_W zhP*Aj4n)+^FIyDvY&zdIs%)y?e{%owvWNS|Cj#^-v+&c1lM` z7FNlW5%S%?`2k8(MKRkTTnyjCVZxjX;Dd-U7Z5={(B4Kf3GY4lp=*|=(k!5tB`^dK z;$EvIkR16#jw2F((3-P;gvRPKSv@*cDo=cY?$+eOVYe;v)1EK)>$f}BG-PEDhwW4mdBq!INWxFlrTV#F#pn2@ni4|~b43koU$TK>k z7FpQ=$9x#9L|vnu&x5~r|N6Y#Z#`h&)>b03ItjuBb*f0-=Fn#|HZygkD|WjsKbPph zfSptV15m_vsm4hY$ALh1W5{fgK1DTA)u7-ZM$))Nq@0QG~?K~ zlne7bWUHgfSWIiAB(LHqkavz%GSnmVLA*JXzFd>!iK!l9WMmG#6~fJ)HHEQ)dT$6M zgk@k4QJQ_O#w}-Z9VwHIbo?3vH2TcW8+k+2*D7xhSc$He22jE6sKF#w3t#bBe%FU8V^l6iCigXA8^UjO{@Y z@+FWKp^sK~hC$MyXM0Lo zc^#nE#;=JK9*7{ZX%I=134Acg9+hItGi#>67GWhUvQ%d;Q!>wIIPyd3!|`;FlC9^H zqZ<$1Ri9mV^4Wcg^dOr(yMb+UK&+jq5)<`0sp|{)9})5te1^`rW_tv!|~h z7P;(J9A4#GMh7QEHI;O*Sqd26$Q7}SDu0luA^^Pz{dXvh7)+*LtIImO|5bV~oox*1AOw)WXQcH=9N87{o3CU<# z4ZInkCuv})2kUS|R$7eU{-{#9ZEE*^!-#E!p6YDbj8w9;QdH8CC67`@GK-m8ZmNwl zo*mwQwA#bl_Hf@`{_=jly$A!h9=t2;cE{~b#vZBlX!p9 zkw;W7(3Fy~nYvF=0eQ&`$+E+X&LvMKmAPb_0HfVoc0^=DKuw)gpi8r*z|KB22|C(( zOsN?iyq(#JW2$mas?<>TS>%g>6kFJ_EZAxUT5OhB&c-Z4i*#O0P(kO;UM(DZgG)NO zNdhSOs5Q#rsM*O|J#jh~RKtXnBnG5Q5u6yW?PrMbqr1C*_fSb}018ra_OUX4X%$I= z7APF~V5(CWu6hVXT7g;en`fpWp(Kfxb(dL*5GvAKaY^9Nt0zCkJiz=hgB-{+zOpv< z$ib4>_+6+Z&%+YT?(W|^(oe9mWNo!)3G(l(8BsBbsTpFrrw9_0!<;34qk=RctV4-W zwk}3;@37_;x=h9<>6PW;RlYBSiYArK+9c*hXd>d4EMfc7C&V=9K>Y6C{{ZQyHU{2| zrtki(@F~m!?hK)%y3}Z873|f>>d*}<&*B$GFq^tDa!jw#;Px9i5Y3OVR z=203S4*g@pv;&g#nT1J~vP%!=DgqfI!_$K_&H)m8Ou0O4@CPVEJ*cFRrcDght5QtQ zWwG%=WZNa3d4h{bIy1vd!EWrLHK*!*_@q);F+iJ1vKlqU#axaCbb{qE?<~4?Zq)vZ zUy1||_n%yxj@^3nuF3=0lRUsv#DQB|gxviHM|t3_jW+(n?~FEnO{0w!W@ZTutFC!} z=ou9C7$rMkW#9-AQv*9&SlPV@Yav>Rg?On zjVqH1FecY-7jh`x^$ai@NeY#wNtJVgo^=br@Gn^bSb#$8M@Vk$WSdy7IyYF*LF?t_ z$o{WO2abK|_yI1;C$n{d5h^m{u}RMS&B})W2QS@I@-eA7$TG27QikN0E$mo*XiH05 z#oHroGJ?wHD~tdLabSjNjnVBKIL)eKI1t;q&ARN9ma^DRA@C7~_NZg29g+2$#GO?N zt=?z=fp_EFoq6lWIZf*K*YoGh;{CN5jS36X0>Ri^;87Xw?ktB*$(*S1(xs%Ut7-}{ ze{S7IHU2>qB2wz&P;neSKfTUg>+vy>&`W}Zd$XLk=fh>qDUZ2yob10|8AC|pF?2EFD%I9m9TR+ZuM(X!mn6M<6swZy^Dj=~4ox8$h3w6SNEZzd62#T1sHeJJxrMPxv0(kWtKXQ`1JKh7Bjzmd#`8n_?c@~S3VOF2<$<&>^=$*?(KN2!SRxc9C6Y z6^ZnDUca?V)3@3*D!8aK|B$k51xn(_cG3iSJLN8F0wfr8u0AF53jhq{(b)b5V$Vhn zlC#yRa$=U{`KeQp#T#0`T2#-wx~NrxE%8&C&B!;b>&lTNGUnMd>Hup${oN-w?c@c) zqL%+R9AlPzbcb9IBxRBHKuscXMIx4Rl5R$AR-hd{HFOg*hQJ5JpJB#L{G~*aA=RS(A1ul5se2AdA>`EX- zO=eb4*UdZyAAwqHtu<-XT8p99;tBYz6IFxC^Z#umts-%LgEZAuhW0O9eO?BFEh9L1f?w5nQ+8QSeV736IEs<9I zQZ-6yM`J=s`|?@Vp|R+RfxL>&>zL4YvQKLfRwAox(6NTp#9Dic#*1!AX<;3j8(CwW zQsv?(OKYNb|M=H^gwX^tMJe8-B^dx17_h;QY9=vb8i_cRBW;AR41inefErRQ(T(7$ z`um;HsK$=LOMP76wKkSVl3*Y!@=l9+dzlKS1%!az&DfQ<1r*mA(fp`_+SO}!C#c0! zPa$7M=H(*Q+b3L zl2IFhms&v7aBf>LrsfZ2+ZZM9=49s@1k2U?P}Eix$menK9aVkxQWzm}>uOy3L}t36 zt5v@=DEnbx&0p9r;>YNh(d3Rwvk=!EC5Mq`uu>7zS=Iai`_OXSp`cxM=8;!c)HtL@ z5UUb3&nwL;IZ}aV+fgnVNsgO*pYDwVQ3P5gzo01N+Q_+#U6)vKo%hM&4MQf2j)jGn zfPYmzmaB&h)y8DulXm(c6fIv=-i(uP<}i*2$}m-3_yK@m*P3@yK_zc7=Pkdo&VRE9 zon&hB=Ete6Kf>gslWgnxs{HMmUyt>$U$*z}*KH&3#f$f2?HMP-_?FhvMMAKnNXJ~} zsA|d9INaWnDzgCJl{s?2^@eLVTU1Q}qILTO{lo<+vur46DYJ zJ&mdzfLUWWyrd92`OG=1pG!hw>G5y)`KNGG|2KXLcjRZe%!?oArkm-PU;Q=xoA>M8 z`!|2EzPVRMi&g&e{V-waUQbz}KcFvNU0zcX?Ti8e}MM<^queYoOr1bErN zOy3LC+{qA93aaYXgo3r*g8`IA-&mBrWEnA6k+HP9xgIm$QY68Yx@66;0(( zB?42}RD4U3FIzvWC|&(HXUVRw`X7+J@4U~dd+H#yZeTNLkr=E>-;_1#E}F%1vdgS| z5?2Hr1|fRNb*ji{ov^9dNhr{iC{CV5*9Bf`1VjPOopI5Y*a?B0R5hg?mkL$mnY9v7 z&Sg>a?LErXb;uueS=386ZDuA>T3fSus+f@tznJ~Q zzo7)6CV8e7l0lY65$BrZt<6?Q@lAb6VdP2Bk!J+p-s*;Eh(nyqqEFhkfBe~7gMf?D zt=qB!qpslsjQu zll(ZrpDcUe0FmUNT61*mA$hsA9Hmd3*?lsEuwLQ++}wL&EM<6eEY85 z)M_tYygMzJ_TqAgchz9_M!!TtTIQS3K{S=*SFiv2ZS`ySFTNXPb*Em4#aF$ZM&uyNs6|R1q zGjIf$%{Q+OigyP%5&~NgQ& za$V)WCn=1)(Nxm1#(UG)@9sSRDt8)<`!482pZWc$zp*YuaF*Rxlnzan z`gV)t3Y*o|zeM-@?wRjk#nXZ-2Y^SFCG&DsV%V)VC8Gp`>S0LHmSgYazrNOx{T}@5 z@o)JExUuaFtpHVZ8M4WWytQ?d(^?HW@I56y4|}X=+SHO$OPX^>E4g5)^Exk;m6g5W ze3LE#VG_JuT~~{m3$h6wL&lQ=xyi1n*HXH|tmnRIBF>~>Uy>~z9OpGt!0&@mu%RRW zP*%O29Zw!M8kerMr@V{>Z$@?EgkFd{5`>6yLz8nDF^b=(=J7b?Yds^=_ZHiZIhIc6`aq(RR_X0An__w zIq3>c-yy4H)f*MiO=2Q_+QaPv4iaMzvY;C(-pdJU4;iLHd5K=JIJ;r8#q4f$M-Y-6 znPfjLzcjO4D{4H8sY&$_#-q}Ynx6R^14=&pp?uHAgjN9i+RdHV*YEd3dH7{}`C_*B zH-zQt#k)}zj%QWj_-v}eqr(e#vg$t8$Ut4d2=Lvt$%ip2_-24e%F z$cf2Y&Gl-YiBqHdWZ)ujM#|q^qm_KXngeGJRB6?<)ks{D4IwNfb8dyd`f<+tL@WC6 zi*LSq=wH8hc~5JkWYv_|d@jSBH53iPvcB@-P34uscAX!sMk!uMO(uc8tfH0_v%2Jw z)X|u-Wruq?0LtUoOPDihIDQ)d1CN{{a43<$Yn>k{f&HxPsC+sFvS$)5+7liLA?ribuU za&oaIl_6mW>%Ej%wUx6P{m<8vS3l0VRPo(=z4t~d_(uX4zP7%WEQ*%y8|4lshu2;b zT($us)JF{|BwRI8q{K%CZ_x1AJcs9<5$c{UFsG4eol3#*Nl+tS*3a*3l3f6yi$6<) z#Ps@MH`>dlOQDYe#<$ajR)F&?D{lj%;Q_0T1IWFvYMjy-kaRShJf$EXNpl8=Kp=cw z(!U_uZlrxNVw7~8lqA}S$tNgjGRc9YeUjq@3V1+PNa)xq|_ znu~8lewbq0Rxg2&onp1m($qGOf2%4BOTy7Ynzr#G^N?1ImkULg;_#?D^oFP$WC#6QG?iCH~MR1a3H)btt+VvWrKr6PzGO_QjCQAOE(e zYxE@V4bX4qwaW;=?{c(yNk_#dm!7;e93K+&xYA)huKG}_qy-H(ZWcls*28H67+@ej zjHC&>x}6+f0@%lwF8^Nw1OKI3O^3#h?H~X4kD)PQH`EcRUbhAEOTb0_m1^O$mNf}{ zESdjo-vy|3tG2?FFDB6tinifby6Lh-pr(yMqT-)!t0u6_z6i38%SD&3vVfK8rw*>n z`HebDHcZ%8JRLl;~W4#oel|cgMn*(O1{8-k6 z-%CuaI2K=aol>Q21YIDYx;+ZvH*gA7#u!n$OcMEVELe{$fUd?kQ%l55PFkror%@!L z!JZl_3!FpOAe25n{vF5E-*R!v_%0YP2`f%?RhyZUJFTq}uXL&pHqfj)=EynyQWV_M z3<1&)FTvU(0fwdHg#+LgRlmCXOLt zr9ShN55-JUdu>+Ss=%hzx!Y?pN`EShOK7v%P9E%%_f#)9;T1k^2UJQ$P8mq~e2DTj zwI2ctR-a)>fTiznp!ziX3f`P6^hvs5TLF&05+tQI4H%gtwB%f-J`BzxZM_BQ3COq`*aZ%=riuPbb99-iE&%n?=mK1yL(*b$yRxgwgtIr}qnc+(7iYl7y0XC^ z-oJTZf4;sWJbLx=-HrG56z@O5LR2gTupVv59L`}NISRC$r0pQ$(pl}A{z}kr`Q0x9 zX9Ff1AErPeus+ot)d)$Nm3wTDDVhbRYlPlFq+YE{)wL5FCM)RM-l`CSNF~$vBj0vc zFW=q5zdsfJf3OAe^KUyCmzBF|TflNJ<#t|RCR+~EyWW|Fd|4}1&vkforkSN|H^6W5 zSPT-fTg|sRBpOsT%D<#N=-5E3rm2SO(v22By98E)#W`ZQiD`{+({L(PxFIp&q88FZ zG9cedcNh}kZLvX(v=YCrTUO><<|*PmO@a^2Zn^O;BS{ZFRRL@Goz=_B_mMmVH-cv7 zU?vjG69+PRY~u>_t%P>kc7OTn_WI4k@4tKV`rFCvhXd>0=$T!;ig#7M-AU#92UFeW z-+jQCWQGA>XcSE<`P-;h8d3+#gF$8)9KlXIE2^!L+;))0?WN(us(=wnZ65HrpKS(j}rw<@5 zwAb&-hiXa6Fd~xVqCM50?u`ZS&jvPWo^=2MYX!k2-WURi^WvaY`VCeU4YFVrtXU=i zpQZTGB_sc#upkazXk{n1D`egr?|3U#y28_g3PZ$?1_&J$HK+9%e*=Pi&}7eZ=CwGUaeCxsCM<# zguP{w zeblt!3Sp~%!8%o7z(P~AQy#Fli`6@gx=Jd+iTy=>`yACC#q+JUw9pcpmW-U)pk!lL zp`D%=OcG}+MH2<$Hvy%OT&u1rH2)>xyHcxv{Cf_EX?7j(PGh~2@rrVgp00V`ljg-n z3$62U)v&AP7^$I0OA_TH4j-lEWC+8q#hywRPsti<4ohRfYO<8z70G$(2v!+>YqUYv z_bWRRaD4oG^%Pe-pFjS6KY#ui3CG#=OX$T$CyhmQAw+c$_|CB-(CoHr53L+S@k{pU zbxW5%g{?+RYh>p|+UTXK5eM+25nVNT>jkV4OO?IGhN;@JTW7&lM%Z1dV&`H@&|Q<` z-EP}g4z9S=v(uDs)6I!u4$P4E0K88FS`nLPb;)8nN|Myea9XcxD7EOampU{!OCf(1 z&aK=0*eG$rCXcl>0P^bkwas#h#<|M*m;UO@w-0aEpZR*dd;jp&+c&RXyu0baxOxTe zQV)Nk9zU4)>Vp=3Dd5F!>(z^#yt>~!c_`-wiTJWAOHT3(D6nDB5+5|JVvjU zVRla%282h*e*=TL*NWHGCZZP;C= zg`MPFqIM!Et8RZ=8LHh`BC<(o$tYJA;)K$YG)TDWPQ#O*B}eRP9K4nDq{LtRroXw_ z@K-O{-6@H9nv(dzWJi}7PHw{0DOa=BSxH#Z8f3rHRP{7zCSsJ;#l2CHR2qW>0hQyX zG|#OeX?Hbe5vzi)WFv_wT2KWXG0mv9Y(v_TafISUCV=J9eRgr>$A91>YBaE9-5zIgpQ;y&*@!^VfgxB7^x9CK2uMV)t2 zn|3^>x^LNlRhG%p;O$vvxspZq64TXiSu=Z#p)0RUSOOf4nPioeH8KElj=Z;Xi|1Ew zkM(=_^8Nc8*TSop?#HS?!RMHU7aCiTPtzc=?E#XtE2%ZMlZRQg5m^Z-sMQw9k3<%u zlN3xOTPKjLe4Sv`uu%DM<*E_n<*K?LqZ5i!wH&}2R)$M>P$m?ZMNQ`|XZ061Xwz?L z>FbhyyQqtHcF`EpF$d+>L4;Lp2yzX{SFNaPfQBbJ247_knBvg%GiU?C+?{Z?)J1C0 zrJGbIVv%2im$R4bvPFwCbziI3JiyOXm@tWO173Kr+iKjn*a(k_$H5;HDEN?Yi zpt*Svp`02mO9U5?fPOQrdq6k@)d9O8b$)qoWV~@WyjY@=0R04VI`vrBC0`%OXT<@v zwl47^&1_1d#zsw61;T?pm(w-*SgUNLD#_NQSo|a<5|FwkH28UmjdFAmYmA0u(ej4k z0A)$t7EmkM(O8m7Hv9w-q1TAL^c3KAs*6VXc5GL~H0qd^_}C=?LG&qS>#{!ql70Kl z!;^K{&E5UQOLtfA#Gdp{o@3;95_u&=M6%d2uk}lFQB_C?$}qr2-AjBRnl|Ci#ffD5 ztQ)9()L_J*)j1cp3<9^fGi1f9XS7YC3)!oI-O?ERU1;Et?xWFGNUGC4{(}dph50Y1 zwyBa}y9>HUdU2U#z&mgjo>Ldu0GPjq=14^aWv^PD%p+7YNtz5Cl0vb-2-1(BGkK{O zaZ^=NiVa!%PG0j6a7s{CNV+PF=FGeQgarqJXB!l$a%b9pPO-It~P2 z!*Q+>DcQCNv1jj)FxaAVcR>zLgG;xs>z+o5?T~FijANmOWcPb}o z87&yxCY;4tNIF6Pl6*v8mL=Ir1)P zo83QApu;`E*$LrE`-uFGxD$z;D)b${hgC+*JkYHg4(fx<KgCphlJ7gBf?}{mec|GPM1mBNy6c#7wUJu ze*5y_-Fp9UMAw_E$&1(SZk^to>hzx=YP56h!_vF75Ll$OCBd&7F_1jL8a^0p^iHZ= zd6+`NbFzL|CdeBtOUeBh0ndk4Nv_?bs=8zHYAS1zpz)dkBXYRH{N0OJU%gxpzgRb&7*{Xc9hy>3){^B} z#6LNcMdFpB+CX3Y!blkk!)3_)FwIF z8q3I<#mUgR5k<_w^8f``?T|idlX;*~+56`5`s&9y*DmK8Z(hM?-@SX_KfYoO*F8;R z8IlY+jx7&cFzi>ggAWjmtNe~)V7Ar_7gS>c1m&PPq{D@$YmjUOK&&6cSUr&;$W^bu zz}ZN3NRcrfQeRfXbDCCd@I75sJXMv~h=7RW?aVE_I1D|<5R$>>45fPu8ya6UB zq)1>{Te=zfCRZz4%uVt>N-Kt7sVA&Q)HKl!At&%$J%y)xig3 zvR<+fk;ucIjl5PX`5slI{eX=?Tf7iRahB-OG`T#b=tWM|WJ4uVcz2dx^BT}Uq()mK zU^s901QdCNr6v^zFtaoOj5-nJC<2hIrr9J@5i(wxY9DSoGPX-=xv1fJbbw})OBwJy zMd=E~%)>&?EsND^XC>2?cWhLIvgYw0{uroeFL8WJ_}q!4Edk5m0w2Z>&a)=4fWYKx z-iV~N3MZuKvVQQiJ-Nk;_mZ`la;UCSYLmHypG1Snn`}xII@+GKhr!E1QJVB%pD|56 z>q`Z`S>p1?l>OAjrJW9FF2BW|*?();!6w^&%K7q8ZQc=Ppbg1UI!?lg&;lj+Cbl+f8y1Pqets)W65r0DK1{RKbkG~DTwU+BZtUN3R1WL+q7VWUqV(lDKuP`Ds4+@ zw5Q7EfaQu-6Scy2p$ISx5uNJt=#$f)G}@6WfMkPr0GKMfZ@+pba}3wm3i`Y<3o6Y7 zxHZY?@gIH8xrEc!`jh;}U-|v7{N8Uo9nTCS&^0L7M+VM7>7^bGJ`f;HfeRQe>ne$7 zn?>N0usN7-1EYWf(t0d_NL7%AnjO16?n#S;A2?u=5@|-0d%9`{69CpZb$00Xbo(<& zzFO7y+*l-u`5VPH1ySK!D;NAk-U`fu!=|z|h;*4LXtIxr0V; zqHC2=jF%3x1mnqeLlc)EXe zmF3sl_xD684nY*B+&ne6!)A*OrZ15~uwm0)it6T3Ys&!o^Y5p}@3Iet?nRDoI%Xnk zgTiLd`xN8$6~f_5k%c_bTkgMNgDGuwS*D&e$aF(MzdNpx+@w)v&1fz!$mb%FWLk;H zXZ4gpJKA9pstITKcd7-}(5x&?p}|W$1WM91yec1wqvv0on%x&9GCy+w9!lDYQzC5- zGM4N#AU5gT^?UW>oUya?qTl{{!RQvf2@39+ttb7G3>}Zl5O>*JsmlL=vu35)E{!`;8k9iC|!keI`#~-lnsAAvd3l1 z@BOi7?~ReR>``}RF{Apd0*|6AKb258P%78-H4`6@P3$4QLl>RCK{Ms1qG^CQ)U`$` z8AMzYWKST$HaJU9fEYFX4?d)oyo&7M)Q_!ZI?lw6HsrMub7w;TB>DII?Pe6=>UF!@ z5f)AzVd2vw^lJL)k^{D~<+2mtq2?3apD!XESuCi(oJd{C;svZDsg=I=p3cWI)pY8d z%SBzGEH9fvUN%G0|IU>WGw;IJAat}is$JT1Ter|e5_0UBFui+0+1 z%U!*6cYCq?sTb=xx^9DtTSoVqeg+K<%!A9gu4WRuj5MUHq`4}eY)A~kRG)ffvBD3J}!-nzBN;=3G6I8bQp69&4n(NYTY$~Ze`Ih z)wvaQ)VhKwWT}qbi%KM}7J|Q5WR?`6k(`eN{F*&?;9tGQ=X*{Cfp_1$>Thm_F0Wp= zJ0^!8Hs1SZYP`QZ1pJdae3jp=c5n50w=7>|73w>%Vr#HgPL(F`>Lt1kwAG}cB_kA= zTIMv{=3OhY-y>K+FglrFku$)KRXWvD85wG_E)s|qK!K+V4rEPr!w4V$sgIyF5(w+F z`zaM9)3fQSh32OksXwt1nH_d61gl{9T6%BNO zjrp-~)B&5>DG1Bt0OaB$%fvvv`{CT0dbO&|ZAtz0!+bNoe#Il+WZ;XJ?q(tokXOIo z*z&V)zwitmA#uUNc4Yb7))W}1oBWg{V!-K|6O;`(GD+@k@~R{nRc5N(QpUU%c^>AeQZZ)*pV6NM3 ztEwQu19A$?uZvH7Hf^|C%II9K{_5?UvEJR3tFKA9Npmr1UdHU zI<|5cS|A2VyJ2(<%w*0{UsZvC1gx?Vxtgrv#*k4Qai$pfDgTOURbN}~aZ>y4J+n3J zl9QaI9zY!InPf>*8XQcKY_IRR5u4bNO|S~QrW*$m=`KsTesqqzC#)5@f&_UKc_ABh zkPZ=D_1I}BUW$sE+|!*0=Tz;k$>^#&J02=lnG0*ksfZ2vu@gUzWY?_9pEoTXXzb0P9w5Bkk_P=VJONgULm$W{xgT3n)=_fm91hg zk?-e~gKiJWBriqwD!|raP;`k>M4d)_q>zK!_r`pu=8Ty1gkFRZnvyH>X9rep{C2{ zFGMGXcJ%&`el?XI8qp&h4KvbuE<{hBG_VIY5iH0RQbtL=6ct~WBAbK7hyD1^JsG8} ztt63l)g_VHtqOwOPO8vGV+6e&H!C(CN>fh8 zJlnItL_Qt}1h{$6pi?Ko9Y}ou?9}=A&mVrAFvC%+x_L&BS!4jlxUBx|89IoSe+>Pf zQIsVO*|HmGDf<_iIVOj*TlUNFY?We;Us3t>un%FAx*~x)l4%4?y)HN`XJ!gS0aQpb zkN?6)7`irE4wov&a;t7Pr^=v4)4pDf%Mj&bTtdRDzJdmGCLsh{S+b)jD6ayTH=xKy z%f72N3wA@mn(F(YsMfvgAPd~9!QRqPDP|Lc`YdP4cl8>dJ!oEi{qp^bFL}0Gdy%VG z?v4ya_`=x_WGId={P-i{xx4k^$2sed{@S|=OYls#gsB+q+{igj}kx0u5usY*{6hcN*`*|CKf}2 z+S%MPekXK)byWWskEtWC3Fe$OIZ1xi;LRox4$e5?coWT2U!Cm=*X94q?U43qk|I$Y&q0I&LU1GhK zowEsMEQURD5}({kTxXG`s^|2}-$21&$>m^M5)>F+Rz)iMq|M*Yu=i8byLu$5`e1Cy=SIw{Gv~R4cEnTp9gZ8_vWpk)4!n$C zxmEY#$2kYnU$(a|Uf;XUH*DWg>a5$uu09NT7d4(hB4}B6$ukqrdvIIEiJGOXM{97? zY*y&W44+6DaFziTuZgDtNXug}NOM{yBQ6a7ZMz)lcuEVcj%9k?{LOPPJ+AYgzZSA5 zX})PjUtMD>W_23PefXZJLP@lq8tykP>#(XHhWNcI>`>(|jqE1E`_9E!v!R7qlZYbk z0F~H#14pHmHCVl5qahtQX%doxdJgHv@a;zvK(1c6yTfhaG~D)sZ+<@k`1ANLe+t?A za~ONhF!ubn89{D&Nq0c3kXqk-mx=pood?R@g$9Ldaw$s7v7VOnz2Y2lZfN{nnRQA? zrFn3tpU@+@9%Y!GNp@~EzB|H=_tkFC&*B8iSJH4|Rem~$v5STD&b+d}ncw^x{ot!t z?uJ*|FP!=Q(B#j){lYWI8xmxj?r=BTeHrP3=!pu6CTK2oni_p;&QE#4@$p!~R)ISjxd`5GmUG0NCwJpu@F6UYu6R!$D*KBp1+khbrKl8jvE`FSwKIC6x zed~Cl6xhds1MUdsdZB6@)}62;`)xm$Jag0~BDOZ;p>$v&V{Hx6`K~sHEgN510k*?q zuvvD|ViV~^Yz@%5NNN;!^)su5B8h>LT)qn-f8nOt9jwx@L6_wWrL1}dE5NSw`jt+5 zl0@uPB+j+kIBTC)hbT;}P8T;f2S~PInH$@^qs?KQm0gzC6`Db;u|j3btI5`W;>RI;T6 zCMOt13XEjDO^h$w?_tLz=(mWDs^+NT+jZ{{@{4(!&FT=54K9_gC}E0DWn5`$hCZQU~82CH?eO^ z%u!skJpQZNQr^l=daXYEaBZu1n|F|9G6+gtyH%4k9pqM@asjXr5W@L3-pgl|gm1jA zb!_FK)eXJ))lFB00%$HJPHiLX2c9g95Vvb13AAN(O|)~3^yBH-@LsS ztTf>njcnc2%{kc>>|=IND6tvOuCU!snd-E#2dv*G?<6c?B!elXXY!q<2XqsZ@;q+5 zG~-Rw(@%?P2J(dFtve%LH)w~y-wa1iou}c~?5x8(GDg=5zi3P#S@CMwH3@n6%k2&+C(Q$cWNldjbqOI3@NhRJ{O{edfJL{|qc&n72R1N0H zoWsP`k8`G3P^{O#e0cfd{k_R?+arlsY1ywgx79L zB#KFJbW6Nv0{fpDjZ*FkC? zT`s_xSo`>|A2G{|8jRwI1$-8%q)RbXU@z#(pLL1+oT|XDp}8zY;5p?E3t{&Md|*d{ zVmV^O3b&h4?2NIggF8S!v(nNj;!{cUZp!0od!HiKBRld zV;hVTmrwH$zFjOvN=hp=1z4oz2~+bG2flBl1{vU7dX-8f5io`$^oan4lr>(^hs z`0Cy{Cv!VEvSXK883K;Y&` zJU|Q3F(|YNvt_9+L=7TIiXm^JC|D^=`=bOwN)M^mm{wxDvZSo*$U$~SGl0^htqD$x z&~dVk15rt8jd0u_|JuL$_x{wg3sXvF8fd;$t5W46vme0FV3%saghxE@Ss<|_2|ohb zyMR~p(QVm^bba!mS{775^(t+rB2OmpKxP;8Vfa4&*C<1n4Z(#Fb&XjJKSOLvNCiw`rpba$QLWTfFopkwOsw8XYpcdBay6r76(LmyI4SHY zkMvQE>Nn(-R7rMl1D;#xIm>pOXk$odosi=tqn?LG38W`Dg^uU zgmI*V(Uif#o&siG-HNd|L<-G-M4O#3BW+_5ddrN2xYF{#(cN&UD_|AUg_Abk*ayl-2AAz=QVi z`cnt*@1UV!ld8J5SBjbx-|8W+yYUw|fDqTL3fES_RvkQK?lKF6IB7K7=^mI*1b!rj zw_!AUU;X31{qs+t9Q^q294;QRS=h3|tUg4~ofIqGD^PhO51LE?~-GFWLy zkjBaG4W7q2fl+(dQ8wy#f~qtDX3c62>0|M?+8)ksFu(M>WH6WD1e0j>`0xJwQz+a0 zdxytN0RU`SST9yx7b6^;#2c%l>h3?Z<~M7zN;kf%5q4S@BT0d@l8gv6BQ?DUI2{`( zrY5gp-qk3<)I_e)sBfM*2rpO3A4bBG9t`+8sTF(P~P7ojs%l1RZ5nl16l@ z3Sya0*7*34D0Q?t>s5Sc*@~`fE?}7jWZ>MVy^a=Hl{+E_o`k6iAo;Hcc}D8q4NQ@% z0X0o&L(TB`AABxh{=`a{I|t1fjaZ;8WRNz;;9MpBlD3Fj*2s5)XX3PMn}#_Q$;det zk`)LyF$oe&|3*E*v-sndUBsI0Z;K?jo!i!{p|DRrJwaW*E*eDL{qa9MwiMysSlw9= zw@AKl=%Lre-_qC%KZ<3s0_i+sExJA86de)>zDM0aZOxK2ZEFqJMW2J@E-G=<6qf;5 zkrS9TOa~3iQqz+b7vbhm@_GD^jyvPAHoK@1YMMk_+$ux|PPimIeVrQk&7=ZD?1C${ zOq|b60KI6WXllQ3Kp}0qM2(t~<)Jz4$DWdazI@?W47i;m3Ull^+Fk_**k@{w|FNEe zV;eyqtOh|(s>p%QJnOVlb|J2~6&%~gtfYwy#~K|i?NSK$Y!5b7Y^1T6@^SxOgQRb# zwzIvOtXrUEt$G>_F~{^yDOsF%cx`4Iy2;J15}cCmk+h2-9iXv z3@_#1$N%(mY5S*H+U_<3zJ^Q6!9`1P)Iy01oS32BYKb=kcyeKzt80$5*I-CXz{0N} zv2XPf1dfdKVKXpbDwk`w3JzBTR4{z2z{!*|uOl!SHQuZ_9{)4#EI4>p-vV2gr%BCc zr;{sNNXDj1*;nZ;z3p081%BWyW5OH0|0hS|*@?^rU4I1Y81Y z>@C%Y1+l1LkY%FOP#^#EpML@+;dANl;>S7f?>Da>_KVjq-hH|5WmE|svG;b7ak3gw zcnlI`1`olWQ|PiFATw!X6VyqlPrz_*f|u;K`U%Lr>@X90j04O3cs$)ts+JFWL#`2b7gfFvNix7 z^2uptV@aYk7U{kNNTO2#d4ecpUlVpMkO{E(?*C=Csw@sgiG<>foI5wdYId&hGK z2cen3B1aWSdWrJ9NQx6M+ZAl{Y#vl5aPWA?DdShBG{`fYJ!hN35CGlrVRY+3 zs;*j)!GY049e83MP8iZ6D7tqL^S7fNmjjRg^-(5}XDLxR$~JpSDU=k`hkhia(@7YA zNGX(u-+lI^nOm8H+Qi9TYQAY4Z~(IW+o8RJbWSsrPS-n=M}b6w0!Qz~;XEqQ2_}?Cdn@q?6QVrF0W!dXvTt?eg z*i}IitYIZ%BgH2H+3!-nt^Rpz~#gB73>Gb z8M`P}Iq+4K%v6!H77uHsQ|lGCK=Pj-5SVB;!#c-C?0AE83IGwCGCjbg!=k9FA{3eOkrtuY9%?N=Q8t!{>gX!m!zseB zJGEA325WQ!l-8BO;_1kDxVKoSk^oq|NEbRB6t6P)w63o zIyLAjO;34*ZMeTHl06vm_5ifBs@s&IBDmzMRQa!RnSv3jp5EoKV`V4cOPp}yEPW{@ z8KX9nO&&a2Lb`zzMH##*5~&>wDh>cR8wFlm1V8tuJZU}N2t8iBXm{rY&1qin6I4Ed zQSkYLE@LHv3v88rH@MUi0m_8(66nCnqb9jJ>Z*UiEeUuWf!S3>4icD&+gQ!EZ;fEW zFNf7g3<0J}l#u{cfwy|cQa%QBEh)$bbH;I3-^BfY7|ghOR2-xB|X23^iC^Ww)jvo>Di`?qhtx${1gjBtUV%SmKR8hfPD!ciABf+>Oc z;f=@LH1Kd6-kT>tZ0R+V585t71p^ZsBa)^0m#coO0LQKbIUW)zV8kBPPGr~?q?ZDz z8D`lmYl8b_mCyI8Ke>C=t7mjRj|~0vMutA$4?q9?@YUCUpKl|d?>6%CF}DBVQy63W zTvLDUn)=l2lU8oBGPFme%^uveWy2u50$@@z zYE;;~cXo+7^4L0aYnSl4oCaLfFKr);a?&^C{(k>M04w0Fatmv5tISdQnA*a-63g<}%IJ3O9RBL=C$z|izp`J_{q z-EeZ748ZH@#cHOO9ZdpqIk#iZO5I}WCoLUreN)FLF#>ql;A;6)i6&S1V1k7}#iJ(E z;peVL(*SCcoCg5;9M)>8-S{qmD;ySgNh9rICTyJp57%t6InTPMs$@%Wp%VogJQur2 z?u5IZyCnazxg_2C@b%jl597_Nuim`AW9D@A65eU-aNnQE{>`U9e|n7_`DkY3Gs)0S z-lg()F)}EqJp=;wfzkco&_H53Xg52ex8&quPrED)cK0TmJhQ^;{ph%;wMR|W1&B6> zKeRNVL#uIaz4YAq9Zek!=ORU1W)f3}Be$ApJ#eWnW3nGvgUJ~})jNTP7@W-X#Xj|K zm+JZ7KJN_DFi;G*8OWSZw5@b4jn_~@(WQ}*v!*}uSGU>&$@mK8Sw6qKD>KLxAb>U#=hE7>*adDPAo1$C4ILLMn77WJUx4dunC&AlOS5c zAwxanj5yPQ!+e*3NX;^1Qey$Te;dK;nx$DlII3$&%7A=3*!ES``R^-R!ap;(E#s2G5a{kZjQ0?l#~ca4iQxets>i z04w&OyLuRH8#UI+z1zc^3i)8o9D6QjNOJY#oC^itz1MqhwALNen&@lmYZU{moMZ@3 z76deIm?HS1MKYq*RfUT{$|}=Pa;oG@cx;}-^UebQh))|p9X42XZ21vn5Y3nM^SfLN zq#I5|VCV8}y@n6o=*tFSeg84Un42~uj|6%GJU7dSD#IQU*{;m3L=WmEXxY||Hr{D< zmBTxNGQ|w=i{6%1p>L6`yoV5Y)Ig6Xe21mcyFLihtxl`Px*W}{A$sYfm~}R#0F_Hu zL~gw@&;zeZbR{0sIJ{BPbm7M=%@TEfdyc&It=p1n)JH?iT?-uR$>17Q1<%J}*>u6o z=C|a`r3xY6J)p>J&2VrD9+R^c*=gq{|G(tj`?oK~`vaA*hKj3ar@f2U?~b(m2U1hN z`Sj;c4w6*UhC00o;4|pb%Q+j9DFk8yyFcu90e2lHLdFhGFR~mKx|vfBIi0Y+-TgAU zE`y{DBCi>7Z^L<<>Y4=e1v>x|ENwDgqB?+4enJI9o;Bj_l!@$|RiiUaEk-a5ncGyk zGx9s~&>dO`IZvA)8l58yFVesy4`!1vC{!e+u+)BEd*9M@C?&ETlTT1bBKZmf1dx}7 zyv_pCjCKP7Zp@`#ynEPRzaDxSH$}{gSMIKvfjgNQe1afYV-gZ}h|pC2|B$_ifQP>M zSX*S-3^Pq~MDH|ok0jfK%^OYd;W~KXz>h`(Cn3mQ8AO=i%48~6=Ny}rB}+IpwXYhr zW2($omtR8{>gPz;qn!jcewnkwH}8r6-5cUsjGD4<-N?T_>REt8E%ja?wu+BHml=nu zQoAKMJh)in6uOxmE7`r($&{P%4yLbujdRfPlm-Tb_Jld?>FKs1}#?qm&(jRe}dF`6ohB;PMiKe_rq>DfnSIr?C zS-n}SDjJX#9?Cfq704VQ`;w6x%f{bowJBc;dx@grF2MqXAa z8W2>?X0?zvdx?M`o4j!#V;+1)Ac@yZVI%wzn@GoMQw?OQoOYP}fdC?J;K3p(V1#0b zW+B=!_)Jo1W2MNu*+seNZ7>+I@oXP+wNv-$0Q^PkS2y*Bt5@t!sLiM3o}WiXvS@4~ zM?Jjn8?;iE9U2hZoe%3<^Tv)inp%$=-zYomsPY=bdgP~TJMcUhhNU)BB^C}ZKn1v* z<>j8U+~*{{mf%=j!ai$GVw&B~ugCxCBkXqq)6S}L)=^qL?7W-T{IlG{*jl_7A|j|< zd##cGwmPUb8C%yA6B0gBmMycoJ!4u?L)k0#0su=ZWN%;yIZBGjvPm>2-4BsG&FS*5 zbF&W%H_C9{Znb2v%wsiMB!_ee>zUj~kuyv6jvQ}O&jd+=zKS6v1ZzF34xcz&^@u7! zMVN#XCQ|H@s?0Hx>>U9*G{RAoT%z;3U~$8q1OD&4d-3Y4m+OIj!Ir;q8o7Aw?t%<^ z0vSK}ru6wih7dXlZaK>q*EOUkwOi=v1{!Xo6SPUjll2|hCtVK*O$qbX$Z}c14>-rd zXWko!MJ?!=aN!H@kc?lQy3YjyG#@1IZX=EW$>7a{Do=Zk#ARKK6RJasj{dM=Bu#-9 z2iq{a5L1!WpS?}p+eK9zRAH|Gj?D`*>a!;jO2MQXi4p8nMQuQ`b7__-NdgG; ztoztiJlla3|J}vwpZ?jqS1;aw`OSCtufiI4RC}*ox;vNi9~O7ra};-l{0M{^4YQ2| zG9d%8W?-ECP zmEun{1gzLrPHnlVv0<-9*rh>!a*zHiHxh4HJ#Hi9>~fP*gfxB#YnE-@x2aMo2CI5y zKuzam)7FP2HuvP1`utfd&9#6G99&LfU@3LUuKUiZj}>Lxbco=JIg|`!j!m~;xmp%} z8EFJ6ToaMWuK^CBsp%pC0gkfK!E`FF2D4^fS^~WfNv+0}GB58((olE`9#^m0odHZW z6n-#(d3@oAhmZIqoXZEX9M8-%@L^*DZD|(GSYKp3Xgh(es~|ue?AeSFCnqGTd1Y{v z!PtZEE*g{LW2Rv%aUVb`3YWJ0h$Wx~)lrR8>OM^q+Pu@p|M^Mtr5)&F>u$fMsHtxj zITWc{%*jt1yx5#w-|DM!MIyZFNCq1Mjgv~@aTDa*mU>}Yd@E>}T(sRG)-g0ho)X{6 z-?sdAITAu92h@pYdi-C0{`|$zt0#tjB%@a6vv>8J)h$+ZCzj+s#S*AwYaCHjm@3$i zfIoxKwIq%W@Xiz9%^^1cA?R&ZTAQPlHsJ+AXdRBL#uRn|>rV94z_^=I5qFzI2)gO6 z5aZZE^6`XR293e4VWg&g#)?<#z@AH>eku8~w1dvs>=ZfqY%;O`M6BzR2FR*zL~-jG8GB}I2|{3Ov%z@F|e zrG*ROXI<5KZ#e0r2Q#FOFzS?o5ts=%r`Ovx(NwY3)(gyr1waJ8$&x$O6J#j{_w_wU#3 z-QvY-cQ@48Q>gm{%YMm5b)!fh4fG-3ZO3PmY-e0P1lVFK4Th^x5pcZp8d@P3kN*Eo~4Ozd(EYFbXws2_&iTT&JdmOJ9H|c{Y$=eT;c%iZiF)27#k) z33f{rI9I;vq(3}I;D4Rl_WIj5fA-ya`(l5i&3ALVck$x=(KJ%1avG9N>Sieg$P>C% zHwU<2Nr^P^p=vD&(4%>}0%JGTETcE+)U(JL7ibt87}4hLErWqdc5uYj0NYIfk3ew0 z@&PeI>O0FQiDUAQq|}C*@ncBmg7ejnb0(VO#aCahw-3F&yEmM$BnQi19H24T))h8} zjgrNTxq_nzoWYox_(WsvZlSX5Al^5ja|t`{F5E>3CXFkOX+)k#+K$W7L$jB7SNzgV zhk^XGkajA%J2s#zgO+bM-iMH-Z#|ARTYPzDVmOHW*G9t)U#CuD+B2C}C;b@NzJz#06lgL1yz@i1A zPr+mpMqTAFN&^PhMC5=)1+dd-n*BaA%8MW8++X_QH9PCY`+IX~pgpG-!;ev0P6@(D z)k>1E!+#4Xu0k;jkiIR+X+T(3wq?#@1^3t|(QGhamoUEyEpikjhB-|s^Ug;lTM}Zo zv;t*^L+I&CeLI$YIL_A@-|efb<<-x#0vA8dIas^{ZhzMub!XVHYtY3VgUj1$a)8J& z_jK?}qj!(*)`Bk21xhtxSEj`kdJkJwiRkiP(4$kysp}5%V9KL|<$v zPCllq9W6hwbBJ^A(vVb3l`he%m{XV;FhIO#$Gbr+(Y5{1?Rrb>wv{13)gE2L;O!~@ zhdJz)S87!fMymj&DEq1anl$)`E=t8WN?L>Cr!hFrx5q#h!bs;bIf(FG{UIfT5` z4Hv@Pxj`!YB-rztEZZ-W+`O=Cn~>`f$b>{4xOnMSQ<+xmo1igC0PN$~Oaez{X}KXuC~ECmq0ImoHHsvG`#PJ-t9DXE2+y@@7|iC( zVXeVxIIZ;Agx^Y?n;6>&&t&lGREPIVc1PPE)+=4{wn<`uY~%RMUIQGtS<(p)J!~Xw z)hfw)n9BK-`fpF^)#fLky;z>vi{)x@hR6TyQ}N9B-REW};JG9NSk;8U)LJtD4~bHu z`nInzrixEZ22e{Wb@wS-E}&HBY|p@s@e#@pq!ZNu3w7na9WpblBY}Y^vq=BS51?{Mk&$DH z=0`}U-dW;ov6@>iR+Z>o2>?P0>Pb+SB@3K%Q4@I=b317(f>N@NIhm9``w5LvTJ_A_nWH|b7#gZ{I6h!XFJ_#mYu7Dn|% zDOL5*vnAB?vOz>!L)RR!B~{xB9P-)bX#9|qQB)tRyg*5gLj%C0sRyn|kf@M4)NjOE zbGX+&tNY7jC9gBAp)h=GLo3?!5clmy~^Jm|F;fG_2t4&Tmd#-%;T>0#|@@qU- zu7-g>8dUoEGUD@P#D$j;dh7cMH48a72mg&rVgYUx4*`}6NA~jBTwzMjft1yx+g->C zdnz}1%@Byc57jb&tGn-YP1E%UiRn2^pe%&pcVoMWG3eJ(Fz2htr#4{kiJxDb|?MmbxfJ2G!gT^;0E>WfZIUM06( zWe%;w!0McZTCRSavn$i9``21~tA$O2_p)~)m;)0z?U^rf1}xEAmo2dbAJtaP|B##y zq%TTd!|BF}5GYk2P0yv-)Cn31F$#NA^8}F+w=b0=<)emi_~qG7 z18Gymq*>y>1RL3Fd2ikO`B_w!PpPUU(EtT=io~1-q)UO#nx^_6N*Kkdd64iTnWdpw zF>-@$72#;SSPcRK5B4-G-0&y&?OVP23jcFQ!83Ohdt2mC^?}nu&>1{a!!zb z@bQ!5jTq;WC@s6<+{tt`UOE%PS1(@O%ne_?WOuH2(y7BZeNu89-!9|N#>*F9{QkS& z`;8~H*o#TnkAl0N1TYgeykz~qqO zL?Da096?5gU^}JN!QucA*S3O-QOY3mO}QQsBxN)gi}B7&^QS3FnaQ>#u7CS2 z+WRl%UGjGQV*To?Gkm*x@$QgQ`@wL-)1N;%#;{aX}>Cz2P zp!|C7dbMgMbFE5#N-Ew(+B=eeC;oC`lS@ywOKuX%`&cQ;@_4{p3lFJ8AFt1(yt zI7_Hxh#`57>Gtw8B5OGBGpNA9<%-nllZ>pUv{NLi!?`SVTL7OW@Bl1SerUXAUuTg1 zrxf*|W}_AmxNnJr3KWrz{F6oskbl;2?xP(hOEqR5jfaWYG)Vi^nP36weTkN>J zr+#XeWf<%;t5efNdBi(8&4!kj4~KJyoFU6$!~h#K5Z|QK(*paY_EMxgMN*Ls=xjGP zh`;^n>zD6e98yI$5^C43+nxB9KB$O1{rMTlDQKfLK*Vb5My`MfX%vDr<#MG~5EFs{ z%td+sRok151E8YfWarbX%oDq-15gL)-bID_E}ICG8t+639Q?_F*M;(y%iy~M^gzw# za*zL)dKS`{y1?&c9GW3;(NuWz^1IU115_qT)QRM%c9PW(WT?wYa4`=D)<`kSl%q-4 zJXcv0O68+%V|mVTjL+%j%S}ywDWN7HiIKyyXQP~l3@?71v)A{pRmibfMKl0)0N#~xhWRQKGNM}(PFC`!hy44me{hpRg)4V2KYq^IX5!? zXrkEF>vkuKedxGlp2>0R>L_+Dv0eN)H}QkL@$jpA?Gz&qdrUKSRfMNBvdkfJ%-2ldgXFkY z00n}th$tV%5C4Vvq8!Bi>Hz#XAAHjJz$5}$+^ueQKg`xl7B8qQQ6ULEZn+eVEou-C zb4lH(c{om$So}eAG_Wa|Wu6|Ax;BKB#V%F8Y;vL8V;`rjN*c~YnNdd>+QbH-J>R>u z0h_RUMm2}4O`uEvd-Se0q>=bTX=;_xTWO9XU{~ZhAs)v2n0Sg<}k|>{i?^CV*A-iq0 z^mZDT9VCGxCc|p-<;soET7p_fHw=`7S(>^H!&{&weW2X>v>1x)gJ zO}pj6B~ivDse12iy7W@I(F6Lwc;U>uS#Kq}li^c|-#fg7x3DVSfGo#mjdO zhbr}rwaCRQ_hVI}zPfkyN7VRxl@GxK-n^=mYsBx4})ja#s^bCU~BGGD%M2jzg z^iH02rl7m3RaL`yJR0%EaX#3_tV4_g*z9}Qu_4Z4oES$+BrBgB$%(->F@z;-W{8oK z-}OIL?XLG!i?pYk^D;6v!<5M}+3jZY&S(55{+pgXR^*#duz!N>En*Hh5-vpCcVvzhcd^Nl4YFGVH zUgf-e5oEk!Eo@{!wa8vg7go#}%gL!K#V2MC+O?8N+35Pu9#PEatwI`tU9FnvF-wtA zVPb;ioG_S72MH_o_f>K9*}}i+p?jhfsy&lJy}(cl%<-|w1VPr(5Mn1bYr_JhZS8X* zF*A}2kTz*Etssm%gRbzVOp2Q5n^|O8;}26r-Jt@aNxI7hxoq~~!CrOvJydp`fakJJ zSp3|%#x3k z1El_mi_7VU2n3@XUhW5}6 zV9)z(2^uyL(T^|v&iRO_w-Dm#5f?()2f;-$SF6f4I;<13@g&P zlhEtuoE;f)F>uH`y#RVq}u`(0NhWi(%JW&d2^t)&n~WWfsao-`XBWl z*EZix58M+WwK;>-7f9l&(M@@7UcIfv7g%nD_(B*mnLI;tOD=Kv6t?M32OQ1AM!>qW zcC&SRPKt)Hlu%qzqYR-*HQ~mOkr>@s;UqArDP=yzY*m$e`FbZ+Ih`*!BIFFfGRN<; zp(9fmg3(=TS9z~v?X0Tqh?R)UWfG<3J48$o-d@YH!{_8hKxaIq%M!rsI%l$3M@TTb zy@@3`cv(`Xz13)*CW)fD@TlSTk$d>nvisCy*+DDcyKdcIFSR=lZjb8*em6Xj*A`$n z<8ECF+rhtz-Fw`Kt3M=RRT83cE z1jjg9C0vxqLIUvBL)9SFKmi1eon3HWq*=PH zO>NMuc^GYC8}~ZwU_Zr@bREoO2l>G13LCDnAVQ)W*{G^qe&0!ORHlPq&8miS%f<_- z5kB*(%EG!0t8-Urf2e}0fmZ7XCipVW4?S*LyZL;*-F{hu-cNudH$84ofFt$nkgZ-K z_D!Mft{1N=5nwJzFGn;6>;nnO!o&oqPLD7L-A{rrRcMe5*kThzBv3FVF96e-n<(!k zmVT7K&t~}3J{Q0R!>C4(4#=pDyq)+g)w!JaWR@*IdmGu?0mfe?r9MG@QkzkSwqbdZ z4o2O&!zl1M-jEk^EMTO1LT$=gp;h}&N_VG`7k@3>ZZ4) zCqwR+#qtKS0Qtf8(`@fM5VI`)iO6tlD77I}Y5fC2nLM>fN3|QWZ?CcP8-AQ~Y0z~) z-dcb5Nx(>I6w%9WZ$NRDuDS9^Ql}z}W-~%|HXJj|LK?cemUJ+V#1owbQvpoRgN zpFrLja2-r{qvK>5B^Pt}BQtmEsm~gWnlu2qb|i+ zche5O0?Z7_x#+T^sqHWdo;j)Evvna31zhH&G~I}aQ{-(fB9W0aiY(Pl8^kUN4!Ug~ z9aesPd;k4g_ve>9aza<-$*uQ2*yYwkZ|ZCHCpSEfuU>zDSnJO}?P7g3L-_bd-}&fs zsna>{be8?L`UHd$?RkAQDeR;^XuC?b+py7mQsnfrEd9UGNd~~^Qiua4&CZ%2> zNvfo1l`lLUv7$c%#oyqBL*Zm%r5kWK1#8bfT1&eYu*3|W2xo5)TJI_kYG zz&541)z5c=PB~`F{8b*p=R{icBPI!t=`6zf0*+_B_^w;S;rCp+wgm%5ae(2*VEEzA z><$AXmG=WY)K*fUBC*j)o60s#)9u@+P1#T~oIA?1^t=-0r8RH2TROwPw)Ss& z2p3gT3dOT4!$sS+6PRw;n7Y0htp~9AaE#rQuu5vh0M{{RL9vJ;*r=kQ>voyl9OeqRz(Dtzb)u4H3aTa1WiadbagGzmrhg$+FcjX*M^f(~3CZ7mR*^&Q^&@O!?(i)u@x0hFrKwNwHcv zbVmh>1lA$y5y}V}OnDLRaZ%@LHm*Ec1nMQ8Wm>S1&e`}13gX=PVtXr7@qnj0^69ns zcEdyW#3Pw_b|mvr7d^f4OHO?XDYJj%z3IthW!OW#d68^DpTNl_gRDX<>5#%1;e~Rj zVIQUe0s&zAED1-l(~=56@-V>KK(kR&M)I}+WU1dyVx-F!%MgbZ2n*Jo12|xQkrGjN zRRR@>7y#Dt(ed5j5A~8^VarCnFmdR>AL>Fzl93B3h%hsk8k)RsC7WUfE1@)Bw+`ft zhz;PMTuS)Z@NKISs%%37J;89!m)swFwB+XP`!C(*o5Rbw6nin)AscF{iWpo)G)roI*?mDrudN-&{ zU~l&_dsKE;=ubX*C71neBygjt;Oj&@aboqQt&&EZG&QV4D9noCDl z|J5LNEGU#z-{40!t4o)RWmNkw4P>=SjqHj10AkpLwl7%*s;dR|b@;NU9{*z`8o|=seXm=Q7s8dilZi3c(v5wI{B&a<EKwhy|W?rq=CVH5P~=QSz_|fGKpH za;ds6TFa`b0sL+EHkFJ`3Ri<$j#Ubg-2~_MIW4~FORe*^j3+Uan;xDJZwNFC-K7q+ORjlsBB&@-Y=$aXR4Hf0r*PUTqP!x8w5kg`=NjFNZe>v*t$~VbsFLe$TQu~?@tLFUiqq=HPzjOBz9I(BSUjcTz zG`rcWQI}jn&DK_Z{3Vc)Oyjrgxgcc_=48sVJq)`>KJ+x5x{l-m?<*V1=SAE=<-oE$XeeK0(S~uPD`K18lw_1VV zfo}N>4uWgX4I#+0tk$Ko4=Y>hS&vHS_Ne7(PF4}12&jPRe15U9@DzXy(J#kqsjG}V z<0OnM$;7&d``~oPp852vj)?HsZn*mTjletb(;Zb8z>IWN9svWSQ3Ax=z4Ba9>hp=A z94r_3kR?ozaPl0g>|{m=MP`{Cl4*P92K&_AefPHd074CMgHOzqtmraPYHF&XDzfKV zr{DTBN5OZO=|T$fjA^Fv5AHx(%pL>ns$Uiu117dxElwkK&4H>6hGV3Inh8O_y#l{# zpGmTUJp|BW6ESCHtA8a{mVF-1%TQs;l57;YM7XXwlCyaklEc(j@^z*M1`sk4HmN?3SxB|(QI)%{YO zcR;R9P-UyG)4vq^jm?z5W*b_r<^*L_gJI=o9GCv*Cf*MC59H+Na<7Gfz}zRgQ>p6Fb0& zLFJAP)Y(}qfJ`7WJ4hN?-gQ~0Nl69>x|SpyW41jLAJVaz3;TwTDst>m$+>f`vO-86 z0yT}T-c7CYzaYUe=PI)Tn1tz1fAK??uw?(zhYsRKkTq(bBOTiy8Edtajxv}!ptX*? zf#^m`NTM6d{owvB<(1Rde(0$`^5|QyB=XaTKlIF7 z9$!%Fi=@5X_mu+@i zFqC}AZ>;7^JkHsgoVu8r2;#7PXv4F6_;SZ{dD5F+6zAtF4@dJ_WycMV+N+VzS6>$L zvF7oD__sX##z&8R2z8@c(6Hqh;9%DCLuC4+-s3n;_K>90tJTiak>>i8yjP4lGIni4CgFRV*uTbMuhuobGGJqX)%D)G&JA=i zk%wg+sDZdyFS}meal3f>OL_{Ua*;0GhQ63wRtao@bPRcDi}cpWFIy+savN-A260Q$ z9LtmKQCJtY^DE1j%yJ@;Egd1NS8KLINyroE3}~EXK!%6=@;~raDUV5H==7IA^XOnT zM-#hF5X~CO3YNqGpoc2Qy_&kGi#kQ%G1_19j}=Yu2_~SU#8Krt$Fpa~!w=<-0~U-! zLLWvd*R3FDkf;K0c6MPZGq3JPil;9>ba;+yqD;DP)v=~S1mgtuyNtvO%^y2$$;q&R)e)5rp?1jvcvZzR+9m3=FUv0=jZq~LP^Fd?0RdC$oLV?U{75>x z9AwVi2r?{Xsl(qHs#J1zQm<6$`|4gTg)UZ}J*MqV+Ta@g1aG`#sy_LAsN9TMii1`c z_?c}nNs$aObIjfuY&=sWg*u(vzNzrJ_D0+|eWk{tmC$=~Dnuc4)K;2=%zA;N?vUzK zaU}R_1+Nl=!Sakw&B?^WTulv9CYLL_gz|x|Osduh91;));HUs5r>1BoDSIiW*rF-+ zTNq^xfBK3eUZ_kaW|=Mp!mfdcl9R!uL*4LN)hy+bWu-k>R8xO^cU{>n^`-RVK2QO7 zu)wBeNwOuMJj}8x42kJ8uDGmOlGVzSjDPy7W2cgdCh0}HJ{jK08dX)Z zwitt<+seWN`YhkONfu&l2wM?jv(V=(OLYp(W40Zva9&lT_w z3mj_ViPHQn#@`&9O9im&kn-p*cR=Y-hxkzv8Q4dBKq;1Bv4ORKGOLnUTMxxVuSR&M zwt8aKG)~8;jHChE>eeiszVy3c&(KX@{GH9HqJwHATQ?&O9h$FV#m zcBlKbWmYCwL&p;9gD9D+GV|PB9!3z>vWu+J_V(Jc5S7d#2T5(PrR=hp7+@J0>R5U# zvA{#Iztp}^!s#DBr)g@cZzKRWxR#o|HW|nlLXL+k0pBD8EO!MK9obx(PlUz-C1b_8 zCZ8l(XcZzViG7wX^-oFQr6DEysRKKbo=p6RACrL(w#KF=Se8s4r=NN55|Yc$K6g|m zTE`q~ckl_UEYKFQv=|*c@|`RQLg4lQ;$7gBEN&}s0I>!6q*i2oDGdu9rnd$1)LEs} zA;8H}@NL9A;wQ_^0x?r#3UxBB%4xvE>7N{90YH;zTa;8T*@z(lz32=PT+L!3Pe?UD zmzjO?a?J1|naI-D%pp${fpzb}71ECLQfsp;g3x2D!12w53oAIILVzNvWltbUgCs(L zv!{Rh+$AvifA-uZgtDJ|?sc-)Pk873_Yb)1y> z?>>Iy|2q5T@sq#!+>@B?FFp6nCqDGQ{nxB*-oF3fGx*-oNc`}-x5oSDQ=k0kU-Z>u z|GMtK^s0a5EB))+9{uaphduR2U-^NnZ|Gg=!GVm$9H_~z21J@eM9J2GGet4d8{pxvt?fB8TG_@J@yw=VNi zP{bx5ZYjkQB|+N2*sv<(ZV}*&=)8;HSI1-N=P7#Owxc~TRHN%EDkFR4Ht!O zX4vNjzA;LoWs77>q6ALRtOSl=sSt`JgD~}jRZ(Li9;B4#l(LmLM9!HF+kIYD0<)z_ zzSztOQfzF~MY1EnNGe%1E|cZ0$}U}{sRv`vc23m)!27S&K-~0zJ^6N`0GmB=N^&=R z!Wt?&OEGQ|P1HqVIiwC0lDoDnQIV0AytCE$8?lWf2I($N1-4djjo>g2;RQv$rFbk4 zodlVL3~mrCQCoSMl(GE5(eu;c>GZ1GiL0;QjJrA=>3}T~go&pn|LJCRs}YLSJ(|S# ze3-y-$f@LEn@?)8QIW7}eF<*xi(TbQ--udq$;hgTkb2cZbzQ8Ih^mezrD;=iN~91e z&v@YKs{Qm|e%_Ha`1iovN__%?JrALjF1cBf4V;4?@G3Wlr;BVbNx2r;w5DlE3@};Y z_5@ZSYYLr7o`er(%@>jj#lrsV_`0qaJG}f3fn8>OQIvqOjiyeFw_&^K5Gmx|Z@C`D? za1s=i!m0lD=G9K$sHY&y^Q6umS--S{crDdblKdIGRX3?9LpGvyH5O+#xQo~6!i^&& zbqcmRf>^a#qRKnYn3~$w79e#Lc_1(_d#Kw)!^%5rpO9vKtEX@JJY8A5j;!&CS4EfV zHavav=RNhd_dVFR%B?SLFW#O+$nxQDhC@E`5F_SvOev~^r$!Z;Yf!^Uws*Rn1(#WJuko?iD9ea`$jJ)V zWQl*P9gxf~`AsRnbqU8M0-vJcc~w4<#Ny_a)7kbEr6I{1~Q%|f?%^XXTkMT z_T3j>y!-xJ_tv~kUb88(sC-%adP2r?jFS-1gD#TRv| zIioG$-8lLciYC)l*5D4ZoM`+}9r%*>LF-wLG)HIHf@_?<>m}98yU2IoAVpzVx<3+2 z02E7QhOiQJv_0EV3@uv~rhw3(XkR72Oawa0uZbKXNCGUWK$09urpO`7BRD7vxD5mW zE6)rmbfw60vkT{+zWXKB!@Z6G^9Ny7?|aYb`(AqLtq()S)i=Ihf9SDh3V5aU%jtqF zJ3HYbbBo@pcFU^m+HF}s@pbq1RwR_IOM-V*-K1&2o9(jOg$Ba$r;+uL{23wr zhCN)NZ7GJ_-7JGWOYHT0?zv9XO^@_hq_`T!YwZ&^JZ4WuV!X%pPQnItxD<7>iho!q;vZ||xcd5y&`ow;`b8sd@$;iDF_Vtjw%{X1dpm1Psx^4YYQZZZ zd^+#+7RqO(!n3AKf}7Ksy`Mg@Ada4wX%kSMfQTdwqpDvu7Rtoco_^|Gx-_VL&#`n(Xbdk6YS9VW7BdGT zE&@J_yo3buw1-iptXljEkdmtk2xF}3<;b48JgA``a((>S8damUNoycHnM(yW8ULZ? zUR{NN(Q-Kb-FLmt5cRhE?|b>>yZ4}tY-wsTDsa??)2l z0fH*j2SYJ~E^c;diWD^&9WODYH7>xU?c{3SSwe169=0Tfe8hqV;7IB%Aa9l)B{I31 zZdt9mo+?aA9f2&lBlM6B&l{>GgIJ}06p2gFvRPD#4g(ZaPD#fnns%dR_pCgtOFrrA zK>S=KbuX(x$D~PAJ1;iWSm4XS-W!t{@xWP-hsgyHuY>uv)F9C%OXAOq=>PDa`;z+~ zxHE3OpUr=*qW6YJ?#akT!V(fLUXT{;TlS$(rujonXtSl%J|aP?3hC3m8bQ&l_^@*b z5arZQ$BJcOB*eEMlCkx!#s$%LSh#Lj6$!^QSrBmr$!Y7zzcuse4~1O9t7F$&9)9Bu zC~}jqH(Y%hf(-DAfg4P%v~7=UAaxvL;I!~Rr=#;`*mt%BBh^`k5$ZT1sZ7ci%m6r-`Yhq!u1xUYC!l z!c&#y)afJh5(enE=j#k!pY$+Ntq1RAxtxAyGQf{@l>tecD}Ab8Dal@yw?FD zkZE~=Sp-tij==X~H_Nh1r>((@R!z-GVip)0b=8$XK33?a={}DwnW5?uqLfFhdbuzm=&VowlsHdo~B20#%woS&cO|+r9Mq0F@x9vFa?$&qN z2>R|!4=xHzxz(C)I-@2<4oNaes3%J^PK8kpJia{yYCMwLc`M^}>+Z`BZohQ<{!5Rv z5!JAIuRVc=-Si+nIaulLT&83a-iJKE8q&-q9wvumSL3CT1;J7=0#S`<&mtXD$1XyeXus_GLj}+hOR^nt zsS|0c4%2T9tn*DxX1W%Yx2KLQbs>7xDdutd>CX}GlRaJ97W^)KF}X}s{<0rlx8v%o#!58Jv43hL4;^s02?i5F#y#%CxK+X)BOT)p#l&sF{tBM<%cnj#N6cRn(vZ&!Y>^ zgbvdKb~chjCoU2T9|i7Do@?K}^?m}!x<`nakNENZm+p>h8htlChEL|lG3>x*Ca`J~ zs@{>nk!0g$;8rRGb5kTqr8H_Bg(fbs={+nYd^9mlQ2v@p^%$(mp|)8cZ6f_FvG%#) zWyUO3i0~uZ&Q6#C=GQ%I{`9K`Hh<2w(Jy`{MxWi?uvGn&Jprm`Gi)htGhlA45z6#p%Mb-Ox`DlUNf;<>G= z|5!Hy@$CJj{?{V)aM$$!%wtmr&{89qm3@`&1XxX{AJS8dA)WZfijdQQ&C)_nH5U?v zQ@O_09hHNm5DpLfoo3`-nvWY5*nC}j#4J=}VE-ib<0RO~ggcI$ogok|;V56Uu^c1^ zZZ4|4qVfLp!|%9+3Z)-;$0Y>lZ+N?|E{Rebgk}a$24^k04T#cqBRr&7kD?(_#ag9p z*B3j6pBk0_Hq>ztRl*pDTuFU&`npsYW)mV&hXyoo6SM}niQhbKZ&m!r0BSMU)1Oyy zfhq}k;iWP(p$V9xHvml8E)!8xQ^kgfwRF(dj5Df{WRwK3B*^egyLl`ShdV~B z%JyU*n2ltsysmW4L}&S+lS6$2TQjNi^rM;)QgT*_;5?)ev&^|ARzyIT1T)`>jwK3I zP*q4bx?qyZ9sy2rAcy%=J}PJVUjT>8Z2Rg5JISyqbC4w_8?x!jm#wn8b6W>L9uf~A zFsC2WQ)v0B|3fu1jm_%2{DhPGX+n^?7Q@jSV9Pdrgw&3XGeDh}uLKTP9JB<^5K7Xh z)_Nc~Rj9eqkCbAe}E2t6FM?93Sm*jDB zP0~6!ipqv#)dXUOPFjsZ0vSX$Z&#jq{2O~%f{I6pG*iubE9LafFI)l){+1Um0S14o zo`Q8(gO16FBrdB)9}dBCcRfqauk#HRTC-D2n_)~_4ezEfCr5`R=ZKV5oqbe$v1F4h z);e*7a3Kdnuj-&H!!{GNL<%5fWR)B1wEOgJFI)od{`MD+T95$C&N7y9)s(piG<;`~ z@^o!N@*=jgk|GZ`m}|ROwdz0Fhob=tWGUNurx;GCbM`2Znn$iqCJkm`v*U;ugWTZN zbUPq>&}C-O)YEsoaA?&Kmjnr9hs57df%?{sfa=SfiqD&NLmpCll@Utpv1i6tW_GOj zq4ov|;gLoSv9fQ+bOI{6KW=i^XAGaIDh?eonP=@o`Hy4;p3JB3JXU8cl0TA-BWOT> zsi>YSHp#zL!vuEk*?Gt=hBPIb#iGG<_7FCo8gC~4RxLl=Zo_NRp z;5lVlqfbyLnPJwoEKEFom!3kVYr1WO{Cc@E5WE>4KG9SoS`V6G+3;56PUiqka)cUk zXfKlI0d~yb)xpq=g1vFFHtGT->capE={7-U#@adpM}gF1@>KSkbGp-aAA6+emb&&L zDMLYv&0m&82r-Bq45}YwssRQF()}T>PQ}6A+;Jav7|wcKfwV~OXq{OjNM&|(mEWXi z6A{F9(86|AlZwm;R8CufN?_d6_q=ckpyPXAxCGGgeJ?!o@4YT=`X?XbrZ3;S`^9TK zc=x+ozkT|F7oPf$U+Z7*AE#%x_|BI?9q*lf@P()Tqu=Fc@85pU9e(nMUU=$1eE5@h z?!I(;yvPr{``zzt_vU-sgIfgB zEM+BC@(?&!`c-P1PXyo~E(#)RRSsSN^*|bQ;w2GyugV*E@ti7`Brdgk|P@g-0Lbyzjp6 z&TNM=-xZJkv`1rpXFYiT-Fshh>%Hs6m)CWl+?yWN3ue|5t1M^Ym2ZS1lP>5bHUVk# zV$&JyL?rMciKB$X&bK~*9P~Y;h1a z3^0s*42sW^03EC~1@12CJ%9S^pLq$v?9V^+ zJBmC)k#v)IAGzh4TqU9eqluxpG0jYQMoTa<0L~0zQ3q)A695@hYbv|=B^f<9qERa? z6QOc20Ht-X8Wn&XP3=G}5SQ_){4fJ@S4Q^N?Eb7}QyYo(*9uPVVq@}BEwQ`dCvzLg z?uLoBhp*;gS}!IIsaerYply=lmIE}h@|l&bng#20uQO@_Qf%3dv$vakl#EgFft3oP zl-eGJ&`yDvTrpl>_AdFz$$p2f|Z9?A=jo95|!rlFtT5M`GQ_=l;= z&0~5Hy4xA(31pUcyodxW4^GXVwPK}P&{FyMaNC0y$ydT|1y9~40W{$lI@<~(Gde2g zg?Iq*jgTx+!Aht?2RdFN$q=QV)6KFhSV{98%F0fcU}pi+ z^NzAqCt$#LHXIjXC3_LrSW^wUwWGk0mf!rJ5|&g?3n|!3mXC$7B7d!_FRFuy^XdPb zmk^wY-mh_wbmP(c=PzP_e&O{N0GvnfUplVUD^nf6~<&_5H?S=hSykq&$_myIq?n@54g)$P_I%niZ(;|ihJsH06o zR?|t+gej_}(l`lv2T5O;A(8blBXN?Mp5O|J;zG@2P|N7)0;x<#rifO;`~v^Boxbte zqw*y|B;t?+Y#p*5ma_y8s=7Kgrl`}j^tR<0t<%3P+Z@BD4b5NOB1yNyiuNhaMt(KK z$@3{$%}ib`LCPmnCpfBGAr_}Ltg*T0I!@p8>>*H6;xgo2z72yZH9}ETGhBg3hQAur zO19Wr3)U%tn=H8k9&bW|*}YbUce+90R~30Iqcmg!R%RF|7N+jVQA5@YG;OF0YxnLKZzt9g0e_cjdJlK*9P zB8yXHR=XuNwl0~IuxP#9JZtZYMNO)eQ8m@NYALF!?9J-ZyUFA1^v!yT;d@s*b@WNK zlE9OZ3(H&HJg&5*0%21fQ9Ht`=)>a3F1Itk91nBl_K zw6v)0#u8WMG4W&)(vy+(GvS8J<7C$3rT1czTHwhk!%NAByt7mRKew3xXh4_0&aN3w z->RqJ12f+xFX<#^NL;BznM^Y$Q1jygP8#X9Qr8;#UEoB&2)=-}_Lk`37r*C`q60W?z{n<;n^8SuzudckK>`Td` z3<1aiq~T2sF2*fqDb~J~&T|Y=+H#7;Qs03>!kq}6OV@So=vIyF0RE6}v-)t^Nak-i z2q(xw8bvYAxMX$^Cg?=s#BB7_cj_q?n~;#7dr7i#Rwuj(UZ>t!n|8r8)y=iZv%00! z%?P7W3^2gvmOX(prUA$y>cV5CH$Vimo<&6l(Y|9S0?TX=t{Nzp*BDEchXq<_*6F*B z86nU$UBPOj5VAV-(y%KR#JL!?ZQ5bj?WFp`&e>M*ny@4mOfX=aWCp#qR7VLBjXgP5 z5G0on1T(5OQ-x5bxu(L#G7^%|rfZA%bNX&QMJcSM%>M+nb3x48sBqrVjRaI#Y;5Ar z+sOM8U=yS-LvSSeGX650kwB4gGWO#SNt+-fordzxY*MIPVDDL7_2@3n@z_q5_qz2> z)mD4@9z8{sI(YE9L|{~Oj;hnw+$IAa6vyQ?Cg(A=;7CWB$Z3+Z(L>EvQw#$_>4JTc zp%@YQij5Ft=1FGqTlSoeeHEk>vm8U!BAcs?D2=Cj`rc!83YHmF9);S$EMxK^(`xT# z;~3?^h>iup^o8|iKr}!Wd)&X;qGm&E?6M5ih58~G}Ye9+`k{N>Ne7;F4+$ zh+nZwZNcR3Ok;h@A3+A?Vb*T>E7Au^J&@lj>(IDy7%~(4Mm&Aru}5l?y)bLHvd)X% zLZ+%Ly{6&^nehn*u{N5-hKK`9iZuY7Wpzwbgswt^q6hUqPVf>LsXG!8dp$`93*614 z!yclJ*IQ0R0WSevrSa1*Jb(02k$H7d)ul$_kPrH;!c3bIgE z-b|ekppa!rG)3Bq3lFfQBxl%A2sC5;u)6K`jDci?hr-JSPz4#lL(A6(nOI6^i)?I zsHe$|HBR+!iDV^N0|0lMj(LhA<^1oUe>{q z`Oryx1&dovSYn^?u0lT3!lj6rf^K&$~=t^|^HrNLKx0~pH9C#iZ!%GAJJ zaN~;lDrHY3D5oDevY89b^qoQ>F9JHHKPeZ+1{Z0d!)~`qFE#0*RH+SHjWJ)(Jd4{n!z;vh?^{ zIf~O%!_lN3q$UC$PfhQMrO-+1tW&GwN>5^CcY{`00Ki{If+lejMpG>*3uZ;RU&{1_ zMF}+{)&q*=$iu*R=>`jG5oToNdHV5ZucQj0Br1CGO9nn;^^vwJYnqy`BrIi6Ek`U@{Wypt*8~6nuwLCf2MMx^HURwWq&% z#Lg)l%|+JX;Yohd1SQzWP;U|u7+XR4aA*}VBT}FBCvGe@EdPkPY2r#Ss?SV?b$Dfcz~zMO2p?8`r7xPs;^5Yk_rBdP6dB=9^_p zH>t?C&CC0ikL!vI!4fL0PLrj=0#RXiZy}&gLUW`Tg41SCRbeA|SO8a$P@z&F@g{*3 zIQuVYb+V3RJZW?+BRxL#j7p;mC;%B`v4aF6fDBlrTn;ujFzbBCbFm%3?JapPRS_ms za2L)3=N_v4g8EN*kdEqAchq&2&R&@x+n(nX-vHPI(#7OZUKp-jA6GfZCEqlaD{ZTrD(uM$eD2WBxL$DlS{Yj!GtTI*_ z;7%SisvSK29I$_orHFoNPXrB%A*qtnf&U;giW-m-NwImIfJJ}$ua8p{URcK;j^H0WzZ}@* zBt@13h?zeid90*J!hvr~+YV|Px6|oS3%HiyIGUXl~& z8wkuo0^g}*P z^Niv2caAeYuaoRLtdtNye$fRobRzi<;-n56r89SMREB_*vvu?bMi@&fz3f6L1iwpg zW_b{+y1X2DcfBexXhR3*VnM)$l1|WyWy==k68tpkKK;t`$9bm;(ShU;I+(4bQIoC8 z((HyLqeaGB6@0*c2Y-_h6Pa;p%D`CiQZFzbm>dy)Z<&lj7j@q-8vvB|XATb^PV(pi zf3uVrg=D5}It4rZ)Uy{L#BusppL+qSY^VSHxo7^<*C-IbX#<8|ef|<;8-MM9#5Zky z@axZCf_UU_JpVdnz#a)Zo__23r#|sj+K(T3{+j*4Z$JMek;wn&`A5QE|N2JtPu{-s zVBNdZUi^&l;_c7qckez>(dWxjUi<^c%`}h!R7Su6r^rf{u+P{}V3mg{f)EGXLU$D2 z8u3o@8EeouqhoY{KnX!jf>EZ6MSjPbI01Mj2J=uyuQEi*dVumD%bw?=kaeyE#3KeLC!zJFb6qvs(TE+$-8xw-2 zjIYV>-b>?@*@yGUpKKLXnhj(J8ZaBM{{^a|2U%WkUKls3{d3U^LUGq-9>Ct=j z4fWSw)(y3JIz4S}b(Z$i{#9~}pY-_mKl=M>K%q>0Tq_VaY5HxoqYGzma%yBF*Q~X& zfq)^XI0sxN!6TLVki20u1vEXSItVs#Ld&8>>Z+*h^{MNt#(zs~E(ZhiI)-+vQb{gv zclz4PX=<~^Neod4n60qMIMUeD1x}VMRX?1WNh3{)damm}J=zY0<)gdy9kitpex;f~ zp2~|q*GRk4qmn;h5*aX2`p|$fA-ob4%*k+7X0WFZzx`rMi~i?#UBWc|FRxn|>8!Nq zAH3_lw1~}Y3XfWaFaT!2o1o4Ousd5pmUyHrf+))V$W24V|6iJIH$7&rp`M$`AaP`3 zkA%67yBD#^D#46CgkJOE|DskLm7~A~S&2jLf-XhbY(h|ZG~(SDA{RQplb8C`H4&6t z@KRpjaxIj3$OL!}GC?H82K%wD*>(xSX#e1|UaNBc-zvxb-YdtkO;V9|P;nAK1TdJP zehroxI!{TVM1vO{k~Hjzv%&ca@@S>GSP>sO7==;!Sxf`xO?x;tuMa+XRo<0-tf4+hVOLb z)Afcx?<7r$tr{!I+^H>Jr_?NDdB%?r7cg4IOe7_tHC=y=y|UNo8qm&xIZ01!BeGan zO~pxW$D|J0EMZ5!H-pstZB)k4HV1nb9=Js8m-Pki=%;F5h9+ z56N_Rtex`e>yJKQMcKL@uAtMXub>}(y)1=!6q%}GmMu)&mkWe0$Kh`Rb-EqqnOSLO z_?}>J)wd{pfG+L%BS*@?5?ClR)usbBui8K;T=vF;NJJRp={KLzQ%J9R^&>*VE_A}d zC+hZgc28Mjx<&Q=wLPE-WngX(IHU%Da4L8`9~GVQl6 zMA=JADb({U;N|W^)gA3NEyf_=W>oArq{RjcTKsp=q|OX=t=@H{n4rtKoqp}}FJYQ~ z{qz4#1u>8Pe)<=me-<|nJKUah`R*j&9BM zf6SKUbDUGoAEctZRItOxOO6c8%&bBnY}g4FpehknC_2?Il7S$^N=ZT8${rNhL)67# z4%x{pz6K$4mHmqr@-+UHxOsoQ)b2dEJ#O7wFRpffJ-R+pAie$IR=d+){J@`E_pV(Z z-SBWeIdsax3jhbRg|74l6C%gt$X<6k+GJ?i7|s;=k*b}ls&2-mJ=hHDtN;+`aoX|x z)u}i*@q}JQ%R(rk<3a&)pPf>Dic?)BfJQs@{Q(T7g8HTsg(Tt1ED zQ%i#a!d`cdOFF0|P?)pYND8qZlE{w{4s;RMRBQvB_F3LV)efUSREZiuaanb;_71}$ zUW_fRLl+D4w2PDnN01;|I{noz5`kZ&AQH0_z?|6tcrlTs>dv~=dS0C>TA&+XCn6y@ zSU1?olhy|Ggw^b_aF|>-rSeMbYVz0Q&r}^kN86=QpfZ}K1C}HoU@|K_9**lzU$3Wt zAL!)RKR0h?zNNfB=JLVJGg%L3WEkWs2jlaRT^=~OhcxJ%}b`$ zHo{@Ek-RE#u`appm}1=l$PXOsD&zDrv${gIp-T z%y?9;mQ<@gO+ADPp$E?COi}6A+HGa0!rM<(_sA(dX89pl^?!|+U7xa0mNHw4B@}Faqn?6E*m{06SZS2XPu>x&IHmG^0&bE{|LSv}`IINai>aCxMeC}bKmwsq5FbJCHc~F* z9czc7XSFdd#Tb?9Ffe;B!NV=*@T};v^)IUVf#&ewY%eX$E%m%n2}%Y!1YjT-sHRfN zdW=>%{frf>eD*9k8^?a{&fS-L!Z+ZUYy4HeSx0;G-EJgM8PG-mcP^8$Da$-^F< z`kQ?w78_N-3G{5~#~V@`&|pbXzWd3Nalj;EohnO9lG7~-juc*;m1ny4tO`4cRfke5 zE9V?&Y%2={ZN9^fnyo%J@i%&+tS3+{N%S&#rl>+?%h-FHL167O33p6YJ*#O&&4{E# zbvrnjeydEKbPVMi`o)@rI+m;fdg{8qam)Gky8(^2yyy0V_r9-Ra|ylSQM_P$QJ%Js zQM0SB-vDYR_0pP^-Pu#}yq1rt>fD?RcBF^u*vO=YnTx~_WkW8_&`e4cwP*K%Qaiw& z&}Re|aAeYn6^h;>6{Mmj5vbA=)ms^o+-U|REvg-mVrPwOT2PoiGON`U`KqP4n zHK-=SoaANMz`8ZENd(QYR;zk+oS>H4l-W;auA{KA8HqrtZ{JoT0OYQm{%OC2cBOyT zk2d)^ql*3gI#eb+ALDGSw#2t$KAk*<#42T@A|uyKvYj zS^uVDOuyM(>Q0jtdZ@e#>$`=n!vDysPClIekyfV_5Q|pG!>V}$WFq|!l^>Ir(qIHx zNxVD3DmS@QWgTFW0=-I|YmY3BI;YkC@vHMi4nRUR8~8?$VxNP%ylR)SuU!Sv5j*By zZF0Zrsj6&qwt76m=^uagC7|D*)9TdGWXqK~S5+k(U48p8IrXcP7H0#yTCz}%;5fE$ z>AKbMTm6CRg{Z^Ca0hM>`MT5R~VeY$F3$~dX+md;f)PY!9Kn& z=%zVp4TegMcoeYsaSWx-F5(D_K<66dfZ9naY5{R%Jpm?Gn+tR6RxJjbRo*S9wn5Z1 zF{%QKxvO!W{)xsS=y*HGEBH{HPQzp=Tx=EO!PW^Fj9ruxb5z-oJDOf{SL<5Q!4J8y zNN*5`rY05jW|N2bm<=IieAMQ`_T#U>HmU^EV^D7yi-bVf$LTAM;>tF&&U>qcm8h9~ z?N+55WDKlU;txJ6GKZit0bL>Mu#a#}F6)YETb!J?u6^bnvRX&YcDzU*mQt<~iO50dz^SBuWp0WCi+}oUr^{v{_t;F5SWE-#%lpu}^cen_X z!;)PFIG|=oX#nIDTO)~u-;JC7JJ5~mrbstCgcnTA-mHV)8>d9S`mRf$M89@ac{-&n zc!fH753L!$)rIYA;ayDEC6kdFO_M<1YG7iP75VURuvKRl!xfi~K;&5@oh@77K1HX- zW>$sFp`a?~ThKVU!Bxqks_~L&fBN-zT>>TgjdxuF^!?3u9cdkUssuz1g+t6V{nHplmq-;|?M5hkS%*2{Y~vJ{MKh&Oi`s%Ft=A-~*sT zx9FAka;a-{RzCfmw;wY?RFM`D(3(Y+ba!FokKwBa>@kC5sQI5~RcxHzR_V(?v-Tk8 zXRCu|f-C5o7qGG-QE5<}K3CNwRe4BS^^w4F*b3t?R$+KE>!tgB`l+Kxn}Ge>NEmgU^B;?$h7ZQ$#s!Mc&x3rHqxg)=+zhiTnkX)f*|d`$LeUsC=IA zIL3xti+JihP5P4jro3H7m2_Cw5!==&zE$OVoE0b|Clu0*nw7GTx@`(e*W#!DK~Ir4 zFgWX&0i+ON!GI**391>QE=)jW$>^9#NIF_SS^mx&qXI`K6&!7qq~08&c9PVfq|1UK z_P}CwZ34KOy7~;#9LiP_V+$nBl#J>7>3@9t(M+jy6Lf;;+DlWGg)Bi$e$ z^IoUF_x4M`R0k!xan*vKe)~}+=*d3a%lcYzX|`S@iWatttYwp8VahdEsbWNFU3J3r zA}OidgWRY~kfG_76fQW39~8xo9?hPgBy;9ULm_uu}^zki_s z{I}k935(?;ueXumH39g)Ja740x@jdJMcuBBWV90}+bpS{T)DDKvSCT4Z7CfFNHU03 zviq|Ff)#HY&;XD@K(bOc3=!ZXDH7tFk^2_Gz{Z*-;*g!HO;nCYiuB8xGXT!Y)$yOz z6~iGvCfQcSAxWlX-I~a$kbNwVy$bX$68~bt*d|I_%pb&FLL!;})(@p3*?3Kz+XAwV z)7GH_10jyCRssfnkoM->rv0t}{L>zOdF#&I2kZW=_pCeXp0N0}+mag|)+ftNUj!(( z1{CgJB{%)>8y^Gp7$1J8o}yoMMs#&)cd{XWTo+<(00oCm4SOmxNMTuHwty?DS_29M zX|cqkM;(TshSI4sjpVEJ-Ii2*0D&NVsKM$}f(v2mKCS`pA)AbK-TU-)@4SSnkpJSH zmrxb*SM?N-@hXWpDA1136vm$o=w*1gH$)?|&6cK6J5lNxwWw8>`JPh}&fCizY3@>r zt_=+Mo{%E%@xfkj{(vMpS?@C1EHgEDG=ERiZ0dBUU;4sJs7?9$V=Tgw20$o>E;RFU z=u-{Rqr8X+)rj%v{vb-?D_BRS?}SvhRRwHvalEF~WF=4rjXOFUZ00jq4*U*yySKy5 zN(wuqxMGcTXu8B%A&r0SotHqAepxdjr;aIj1uIn-41gNmQKinzAB7H!ttfaIwkng_ z_zAUc#G@xDsAat>RZp2%iET<&#j57Lxw4M#Zp|<+F9DzKApMD)UbE4KLM*3W`NB&; z7Z+0@^CvD81pewpOw+G@;Tr`4fAb5^K%n0`4UkqUbC)H=3X+SoJ z2M*9K`TL^%)pR+cdl40X^wf2YQH*XJS_BB_UT5lHg^2H(&TV2S+OA1gxm6X-1dH?L z)hrqCJ*1b@6`8yYmX^xqv-~H`RJpu?QWr>z+KO40OrL{~NL*;hq8O|v!#&^?F_f4T zGs#NU@LQ5t9tNZC=m6$B&V_UhCtp`xww?>OywvV}$(pwwta~rrzSFLGK;87{UGM>H zeA+!$8FTgZ8z9tj(_+`Z{8^&!l4+U)>`fd1KPsT9#!5^i$y!5q30sXdG89!JD+~#v!1#D$?gAJ zPoe6Ku3L`?E@*no6@V`wWIl09??=dT*=D<JfV zTU-$Q9JM*I!E`t$vpux8)#b1AM4$~}`t+;Ej1b6WX)HNeuSZGJ5h^+mpTgbj#ym;V zBeU?u0B z{?|jiwt%ij_Ofl3m@bq~&H+Fspfbn4F`%+8( zWI?IBS;Sc9@m1cml7`WuR}20KKsPl;HDD{K_VjDVSV%yUaksjJfGRe|bc0Km%D~`= z>>Nn}XF>{-$>ad@)EeI<6rP^ z*iv(qkWN4G1?Md_%p!3@dQ=i1V5`|f%Zg|-h%uub0_lm=L5x!a8X3!pnU&tyR#r#w zlW~YJ=}Elv0Whm0>7=ti!r$t;B^o-|&+vrpjcT%ZZ~h~M^GeqwYuniiPenQ;)HY^f z9G9Lzaz?VicgH?Xc6P7?EfW|VozAP&WA4_(hom8>Is@WRmo6HRFB0xp2Pu0mx&D$e zdkxqhi6>qi_8`T5F2MGQN;J3jdNAI5t$F5#2kyx!Tz3!3BG&6jR{(n#FDdTElB|{nhgKEWm zcMNFo?V&r^<2H`&4YF|r3Cr(bHeo$6zUAS%My6RA)*GRvw!Zj7fd|4&}4Q5w*bh|GXY z=^eXHa4iAgR#~8yK&$H?MFplTHreOQCHEug;bxUP>*;hWq;qcJKsgtzy$KmRthXOc7po(+VZ3XB9hn!Xi>7O(!R(= z(&7Bl0ngNy1+f7Supt&8hpj^X??!gOMk_e#`d^MdK#@HX%f_*~8Sw1*p>g`vFMFNg z=@0S6-Ff@YdrrUcWlw$bqxQc?-}}ukJCn>IgLm@B2EGqjl`(Q%vLQ>(3a}`dXE@h% z(;zGD?R=0VAc?Gc+2qJAMr2)LS)h714si<+eqrq@KQUcgSap9+D8Z6wh9V1L!-Bid zqSZ}ThCMoZ{`kA&!QC&p{orBL`qY(hw{ns>!w=< zj`)?HwvW|-Tz&nqQk+i+NRnVMa{Az%w+5=sI9ZelL^-81sgv3ys}i;~8A?s|TP1k9 zS|~E?BYsS>o6WqD?(7>67@Jk?0B~oTI)SmoYW^GF?K(`+LESXt^!GnUW1;#9M`liw zPqBnO(5}Pyz-CEY{MK@e*{#OZJD8hM$?ss z!E_Qf2qeTlp{ZSBje}*viaq^LpYvK;kvBd~f9r!s9dJ#Dnzk%t*g$YCF)r`HrJnyk zeQzRrUcQw+L%PXq;PTpGp*mdlB!(sQ5mY&vRR^HcNZ*Lus;=iL!p!1<1(LNQ8<|9! zWcmTlcBh~C;OmU#pZYL-KMY3ie)qV0Z=L@32hXn$33Fr(-5&_w5Iaj%;iu~3nuZge zE#sx3MhOcx(*b)h*~v96fxEM68Q|vIJ6Ve4A-##9w-#arYBDmAUFI}<`8;BrBbt&V8;F`1lzYi%Vs>Pn@m znTu5nKFy|Ba~hxbetv83Ft|K6nWM{5wB*xdHql!1wpOG2r|A&%yU@Yw&1Y*Q3VD6F9{d zSw5;VuvV25YqTXnN^mb>6UeG-@W@IrT|jtB8aT-iN%vgRyOnt8k`y+}Di=7vTtH{E z4qQ5;lyU1+OMwJ~&cXLGEoUzeRH+LGmRK5@H$8k$j@x0$(PNQNb|j4{^=(PC=fyj#vL^A_Yb#>welL&Vq))fB z-k|%%moW%NbFt-R1hj*^T}PJG#Eh<%v5tn4LLM};%CD}g>u0G3omaoA(RI~l6UzBZ*{k5T zL0C6oU-vYzr#KR8PJY|J9}OOEddyxUOoXFf#0{zB>u!NpYSNP?C=?(x$gaxnU7jbh zngJXaBXilqkx>G=Ql`$zWG+XxS5^^9$eU)r>kU@t<_h1=i@b)r!gqZ5JaDPR zX!nwb3QyJDR^&=457t}=6w;HQ1bKB{!n_VGeHA`LR)E${EFj7$!?z~$aCt@tHP%RZ zF-(cNH%Zq2f9$<^(5Bg0-d8w56q~`sVC*d{%Av$YoEDyPcT8Zlk-pMZL# zvr3IenyK!V6#N&9#13YM5Mv~ouX{B8 zb+^T2CiT4*LP9g&_P)=1mixZ0bME`P{8FE#v+XE4kf?=B8B@;Ne{}W=7d>G2xzU!{ zrgYBPG^GGos_xeMl(`msLP^u|aUG$P0f@yGRkcT{{l`h1FP_*IhhUoum{fBn9|=Vy zN7U-B&yDo2h7cb#3+!z_rGmjwe2C@PI zG*orWT3!Cly#MxJ73WeBPTu6Jk;zBAIne~_Cj$YHp<7urUpy)_Cocf4Ex8zUFfQnY zM?D%M2yaqP7O(B95g-<<+ElIt`;^Cn)M9#3)E&pMjnq&{#{1WO)rTC4IErAIS78Mm z-bfxS4QQ`Rrm-dwE3*<6kPZr^+KZ%8!!D)?4>OCnm*q1KDGY2OBlB;Sjqxu*M-#;1 zA-!)aPp-xq*A>^&{MP_0eeYkrA1l3Z$BVB&M(DyVFaF2lF)rNm;%^?0ap9&H-|$r* z@-$p8UdM+xZ+r22zIPAbi#L4LhuqKj;+u|VxTB)0IyRt$g{RB%uLojB84d8FQ z{IUMm?keuO;4!>UDjY6%DaA{Wtocof-5MIXh^kR!PQEpRPJ_waJv5Lw;9(Iz%hn|% zQPod0)t_z%!?H&rmOGuERmoS4PzJ9QeFWMctptFM0Ef*$g6MAnc>iFy1HkL+XCM`l zNj9~-EY?U>siutNSt1Y|Va}ouz1XkPV1S&|tQ6R!+&{ell=!@<`lN0n`pNf$Fk=R3 zVMND}1N({No}WeON(2?bO88A@cscLCpq>_qrAzDrS_lxXGC5Jtmt5t^Zze0mt7(}> zCC42_P^2DJ=IBVT8{c_er_O0eBY(B2SUV)>U=*u6tk2b&#sX_WH8l(^D@{u5vPy{i zFX|~4fsm!uii|*$(0Aeydl}J4Ag@I=au3sudI+b^M0K6ZLfs%IEH)<6vp(Q9s_1h< zkzg%;7cQv}(PWRMe$Y*h56Su7pf-eaD<75U_kXOXVEM3)NW&`GZh*s$&=`i)`Q$&o z^cGt9Y-|wdmXbQ?CGA_-yy{m_j{ppXpncd+&MoqxMs2QjL9}4iDc2I&5;!9Jd5A|` z+9WK4Z1y)lU#XWYXCzPpJGWA8P^=iiSfc_Y0t7@%h9RRcHlzm!aD%5O5aBpXK|sip z=eBCpc1#Mga+*ExI)!=RcYzu?}=;%%@j98@=P_!=#%aAo5SQCu8 zZJXRSRJIOIQF9jCpOvci*8N{ye&7VWRKHD1WHP2v3kd7OD^jS({1AuP8i*RR0A9Ed{L6pt-Ynw6Q`{RKIfWGWO^=*Hiu>kAj(Y?KQ%A@|60jE$ zYFWS(nt+Kx>LgVxhc2YU)CYYWX6L5H7-KQ##tQ zsFX^_(i*bjWF4e9;!54WMNa`$9I6qw66-n+U~SWtrV%0UmHgov+l){ET4b|q!@(bG zY-Csu!I^`>pGFQvqZd{dxsDtI7nkl0!?YYR1LDM^K<35~8Aa#W`hmjnr-dTE{dYz_;23N@7}of(pT`CZ+YZ_|LWFnzT&Z$ zU+a(Z3om~0E&upSXMeoE^^x~^J)M2$ZI9gLHUIWUE`QXWws{P5x6?Rgx$^c6J4nyGlU_L|~<~p-ZA1K`u(2VnDX&YEn)~ErScy zPOZivoqRTuh)5C4TRl}Q4q#;ktMHhRb^hDHKRpp$%p}x2VgK|o$2hOYUipeq#jbCi zY<&FfG4C&{*Dk%h-s~FayX^BWcuY_Dq(c=9@mxj2Gf_%>;V|$WFFZQYJ^9o_5OgWr zy}CXYBg$Md|D_X>YHA(GumCYb>iEQ7r-sJv%pifm=?C&|w7^1M6JceY|2NY;>F95WGEn!wf>_XO*_>dZy<>l?w z5iZjpJ`zFQ+n~Sd{ILv5RZF$Tl7@R$3sRJ9Cum?~VT>i=0UhX?BDqc0qfk!j()MZ{6qK|Jv?GIHKHrhP6XeUt-Hbo8sp)JpF_%yth>H#&&DPZzwLlg| zR&a|7Ms6hw`FwNsKf3EDm z{@hbYv?s;x`M!i<)IV%Ac&_jPFMQx5Z~c-m?*5Nnc%D`K!VB+W6~FkxbN8i8 zZYy9TB7CSls0D7#kTeR_R_SOln1?fvKAdU^lJwhU&> z!)_)!lc^-(kbhdTa)_0Lh6#tB9;szoqMNFRYJgTK-;^Y20hzr4;&WTG)k*5vFm^B(#z(fkKcn=T=b}(IIqa(ctw6D-qY~BcuY1lZ1e$NVaz9({3(t*zaOD&R=ntE^KH@b?o! zKjwA_z4_Qip4m z3L6QI@XaKU?`m->NtArkAyBCf5pZJK^uk?NsS>-A{4fi4Q_l#j6p%@D>BM-bmMR6i zO3L9R(kNw3?Z0&S1dcWLuf1{tFlhg}<0;6E^2-2_r?e7yydEmkX~4CIx;hv}0=eos zRe#+`72ZfnLTv>Q8WkDFm1YXf!XAvgo>uB=OeWlubcaMBRo7u5iE)!oIDwyJApxPj zfBls+sUG$|^TY>rLEbi&um;p278DuSvBe}-E|%IM5mFHJIjE?4ljoElN>Z#}V^uTK zNe;S3W5<$)ay>i(S^jW+p1Reg?$gS|z~ahc73|-rr`SkoMZHdzh@&2m;meXCU$PKi z1%Tc?5dy-eo2{y9bxEW(d6@KOike)5M4uT875YGm1G!U0!NXd0V8$sIk5)C0p+k5B zOQ-W0C3e2Q?#d}}{o~k@_2SfEq?Tx@`T}klesz@U+|81E0I?ki3_>lkAu0yW=gqcQ z5ZR8UYf_0{t2AV>x&2|*l zG9t?iqFGk2eO6D0?Rm-5X@BqKQ()Q0;pv65>=Qb++!D)z39_n1pKL?pmkRiZO+*fD zY@UHUrn2{`pgB}^*G-pGTLb%6mB#4xSt;rQ?}X~6zfI(6p5X- zad$fT+tk~}mMlq;OfbCVwXC9q69{jH;K5b|i5Z*s&pImi8{yV>nTBmDR**2b{I}Q( zDziUalZ%z101-^SKfDhc9q5&nVJ#SPr6m>SRn)qZtli`nYKA%;CQq~(b&E@Bb*8pt zqUR*KpNR~m&;5ivg>s0HP)2wYHsR`AZ) zKo0FpiXH;&1)NB(0be>;lKn*-01J`ZtSq1eBsxJdOJsXRyRr7Nk#y-%=;5=@YMWHP z2%SEv1wv}aQk5X0`MCDiKIeY6nHLVg{?^q~0ASyE^%MZu>#m*x0DJw_Q@CJw!_`xO zf!}oX6ky;tUp)mF_$^mY0S12S)l<0g`L?U4P`LN)SI>l7NSAUbk5fK5rORKhk_R?# z<(SBl?E(yGDU@a1YLd^0Nd)mBr#O=cj|4?sQ>qDjsSsYy1>l9u=Nh`=X<72nNv5a@ zI)VqD6=}=<9mh@uwMO1z;VHK~PF2cOwQk}_Ca z$=?7|h~jb&A%x`ybYxFwNie9;g|T1}g^f51o>E^cK*6nM_cvZWg@eX7T|EVo@|{;t zfuwxb)uW(uq%&>s0@h8^cqcc2w4oeHVvVdhp@tNR>VVM%rU?vy6a_#=UXB+kmjG?5 zJWT=zDbO@<4#Yt*J(ov2ChaXR7@E-Nznj;E`!{`3?hWvPY_}526Oo z6IEXj)Y~mlAYx@vyLUMJIL1g#1=Wm`A$l|bm1NF3vyetilU?c5M&R^lQYld*uFPz_ z$~z>L&ZDq6Qn2DeoD?lDX8+uz~f}26EGY5n~yyL1mx#i zWzESn0EFH|2wD6^_Gs(^LO1Ba2n-R4YcHZ{03xu$HgXKSG^<6Rg&tkioJG!DY*0zS+OX^vAd&+af|vLTD8fKD5m-oZAKU)cGn4}% zNwrK_eyD||^Rctoo0Yy0yjx6TmU#GKk-Md-lO?mx=P4q+#K0)y65t`wx8-@57zX03 z?+w<$UeVbuESb<{)JDlpfKkbiA&vcQ2L_kTu8IzUgNvOk+4I$OXION^o{jK|6wzR| zLEXJmHd*|K{lMrmX^|whm<`}yScks~Vb960mT<m38dVh z^anD`MV~5&<4Y+!uym&&yIg5_yZ}Omy>y@U?>n&8l!ps&oln?uufF-xUGZZ%782!O2=$jnRtz@I_V4pV=PRtM<}Y`9IJ zNAc1|QTMqYYybYMr*OdY16NPsfaeFVp2E?}4_!TlW2PUzdI|?TKXUaH4tRd_>M0!X z{Ozl!aKQ6-u3r8t&s2ND-@E$2e|hhp-tJ1cvH#fB2cG@pGNJd~wZ5-d=v<-7{`apw zaOwU1%^fB4`;TA!BNQY3#MKA>>-YCdy}n}q$*T|i=eK@O|EqW6jn965=~ZF>sjE*6 z%9DP6`|AB2SI?I?{q)tl?&p8zeQ$C5{a;#dT)I9bm^82N@4WiJC*D?3dhF3_><>{fLaJDS=2~svr3#QKQtmVU>tfCB;6vsx1hk8zY<+%loKmVR_&}@IZtQ)mcb@juxFaI z-+r2H>V~mpRwR+tB>5muJ;@D9(NF2KoL3j;1xaVEDQeiMGUnqjc}Y7FlDXM~ zbd$8CK_*#3@zH>p=3ekvJ{j(P2guLy!I$c<2HJS!@& zXmnN&?5VIM3MR235EMApO7QO=iWdYxd3DG?f3 z98Vy#&i{NM+Zx85_ml*TZeDfj)S}KcrOxgaNv)8X$b`Iwq&#C#{*U`>o_`9k^R*uo z-a6l!3vzHnBnAv6NE4e5AV*gD48U2wxh{f1t(>pHN{d_&BXP+U6|dwdnJF2*TcZwW z2Uh7O>pY%)o)l4GZAm)cTa>0N$YAQI-DH{R?4SGm69GA=+M4^1PNH(=7tT(qrA^!k zR88KM5(bp|y_I6n@BzZRNk}NWwW%tmN~0}-XNf%O2!UMd{#*B?R=1uNh%6b?&|}c@ zZ@PRX5LBNdkvqvT-FQM~25Zl;+5Hz!qFUr1pG0lK|9TR4(7$vNchLXa@f2HSYc#@H z)y+_l9kmfq4I;5i1ujXB<$Nv{3yDMSHLNz$Q9F364(&wrRCd>rY#GW58T>~+2#lz0 zvu{FuGJljTfsPUvk3mRkuI~TjB<|P#=}Fvd{qI*V|LLbhivIj3J#myPV)U|c$7%mR z`=eYP{OTX^>fqPzI{g3jyAS_=<9;u8?#X`h>TPwU2R`BD*We&G=cUK~`lbHpwM(}y zS|0ds$F&tT(cla=zef{)#Um2B5E*CdcezR6RUzVHniv9pkAFyO2e{~5k3&b6wz5z63DDv0VWtID(CHdUgf+Ln z{y7KlBet2^;6kMp(#_aNR#xK2iO8$7)FGiHAQQvGS|IH-Zx1z3o<2&XRfV6;81f=% zamxTK5`x_lc(^Dxu@)SF%yd%RjFv^OA~{l`0W7`YBo4Q~={cuxto+T#SPX!Jiu0Y0 zNYq}hgy6j-Ooo`JRWXOeA?IXbcx#>D z6sUkaAMLU_rw+%;2jd%QB<%nG^5u`XH@+V#ba3wIWM+K=3}oO01Y6B0E6Y=|ZFwZ{ zW@Li%k#Bh<6@d~2SL2}$uaKpmsBnxGubacBwQuDkIy>w@cTS^ZcKz50qLSt8s_y)( z7o5TXefCp5#QZb2Z@$lk<^8qiPcu9Fpvccu>@0xlLNHb?6#%Y~*nouMP3%quR}v%6 zx)C7AF%1#Il{eSaU0uQ$Vp`GZimN~(br=9QgNcDkK#3q4R;L@<`iGpkEI-d12#x3_ zxVF_?12l<1r8o-iX{zuOkp+ha*L`I>!E1Wfz;1P@m?#Zadm^5y2;ME-3`2ywIy+bs zYz9$0=#0cly>^#h;zbYPDIa2*I}H<`b?X}+0Lkpf zUvLV^>?iaTfy@ApX)<%lt?JYq*k?@G@^Sb%j0IQ$jWQI)K_*-1ZBtz}P_8V!2C8{WU!HI zfCX9h15tXLtV_QoTjKt%lSrvQsTpAuRwA*;`bSr*qe_{+L-*P1RVSdCfdC)?X2G{r z1uCuh&Zf(0$|G$X>J-`}<(!Kd;8@o4ka4%Hi{a{vXf|a;!D^E4!66sPz(IdEyTALm zBel~T$44--ULsA&J*?NHqTK~33A*Ph z!X+JkS0=)OmmeFnS*S+tTZVwldlHpks(t_26M+|}eTaGCAm<$?0dju&83Q@*x(nox z2lCMe)l|q7eAi*FFOFyIBY4Sov4IDmf<*#FEQ6II&vydzac|;BOR};r0iM9$qSulw`U!S-56*-n{b&lkdBhxySuVoezfg37L*e5W_ zYl4k8EN`UC8s5N_MM~zS!8x+h+h8EBla!TRrt!T1l-QcC5Us5NM7S+&5$3xMon;bj zw%Z`*!){)`_Nw~Q$8KSpKmYjkdGqGAdHvGkkG}Gy*Isey#$(rSUb^=3!-4W{AH|Cu z(i7(I{=x0Z7q=gJ_VqL1{u+9e`Joh2)xPT3%Ther7%%W-lY_Gb{)`akF!F^^7Yaem zSwBb|A%tp5(|u9}%E+}_P6Dj3;G9UWhRrKIG!m2?eU~b%y;>Gb^mTvZp*5hU(?MG1 zRU>IhE&*XhMvtr;Ng27wE=*>XezKsAOnr3&04DP)5;BCy<2+Mhb|E=kYY-6h$YE63 zu;gB#0sNrmqFw|5$6+U^3c0nv>A1sYac@d#a^(wdc~YcRo?T5$T@PZ_ce#i@#2pn4 zGRben4kT(eC89^h<|N*O8g{_vCc1BZJ?04xMZY}4t8+ZOeq^EqPKzw=0K z5*7|A@HR`$m26lwb2y%f80>;9#`!9U&_n_?Id(B?0R0Wf!Z(4QazIxbDLJSUvu9#F zyMSM1c@Y#qF3h*ACj;x(s=_I6aq_6k?B8|dk0xorp$3{!4o?vPgSZpq1L%`^=gvBi zxkDu4tMyr~Ox3gkI4P0k%M2B!cz_GRss>PGWu*ibcB+q+%?-~syxzB(?g%4MyLRKx z?Ec-iG$@*|ts&5;Z&Fubx>E!kw?+tq)ydNiP(A@Yv8wq$g3-DWgm6q1`*34SK#uBr z4^l+|?xA9!M>ZlN1%45HPXQJ-b(wVVBW&T{E2EEL)Kut)t^se|PiO6KRd zTi;S0z1A+bdUY%${(dq=MmGvff?8g)?phR^_)4aTQ^1s6WqCH+NmnY4YcUr#2U}_5 z52AWoU;+F0o&*Se^C6Y!Gaw!&!Zv{f$nerSUimw)`R*i z;Te((m1+SApvp%EAj?w{@1oV+As^9sIHLlgV}NBg8o>BjOP=(ohBX)p6ua3vj!G)A z55H7l39klgLLK;cB=&Pq=c45to@hmQqNn5b&BPPUDCd#QMUUWVALqF9$2sm9InKH8 zCWI5xCcN-V>Z1bc!gJW?o8N&CGx_nJwYB>VnnCRhz35b=tPQYz$fvs=A!%=WRDP`kdVw0!E|N+ zo-3FCvN$BN#@k!|Ae91{@K78p(=p6iwlc<3DvXcnwUw#su z#+US&tG@XuIK;Z>gA8PgKD@K0lBpdn{-&yK)rUk z1~PRz`eqT;u0q_cH|Ze|7v|IfXG}7=t;A&+s}W5T%Pa6dhJ~p+5jh4+NCV;}DqsNm z5N-Bf7}+18nlRYHIjV8dnr-)`8XtD6YVADHxajda;Um=epuNMD?(FLi(u`-4W?VEi zKNH-(@O*TToeM7q`^@K`LS68;orsL@$2%Y-uv(=w7&e#!>2&Ge)r*1klFj^51&Gc`xg(NLUQ>(9zKQS@_P?IbKc_r^5OSS zxqkoQ|F9C)zk2vQCHvP8-_`E&2M^zarTyW<=bXbKp<=M0ZCzPgwipZ4^4Yygo~l*R z5(^g+o6;bMN?w}%=Qoi9v!)?{=UVepWdPAp0&>vbPAF9QEXgu}h@yH#*o1BB)NzAa zIGY>)JntMHm?ZdAQW30*B2)XOO_$TGjw}=Tj`TWhU+m7| z8asaD6<9A4rzRL0K1|oOIWdC$Pdq16I`UXd?7NT`yC~o0V}I&>9QM+@0bRIxi>kfbdSC_2m41b?PU;Hb||M;bAbh>evb85Pls;A##`8xS#A{nJY+ENCm_x==vd;5u5?{ zu`z<~5tswz6RXor#;OtI+3(H>mk44I6uQ(f;Z#Zxr7>#z?;q{>?6PLo0&!aj6!#$I zf=zx3*^#9y;G1==ymb{v6C`c@e)q=Bp<28De;e_3n>t| z5w6Mt|I(jc3yjsr{^J^ps%la4jYOacy+a&i4W9Gd)k5Vz@CY0wY<05TyPNFUh z{opS*!bf$7Zf%Pyx^kdjRwx0N&t^p;T=3E-U%Flcf)J_}hz87^LnhdEz$W2CMcr1? z5e4iy7_*r(agLRhSSZ~)M>y_w|L(th3R+Y@`I1vO!F}ynp$#J{C8>=WZGNa11h}ax z_aN2w0)ESyR-Yzd6&6qm&>8IAI$&Cb|4nwFn|fy4O~w>VQPn&K9L57YZv^ z_p;2Vjb2B3Tbld#9tLWMTwRs`9^dx>C>fbyd`Ch{Vi86|G9ggVH~&U1>nBK#${IxuEAYV zGS&SZM<|mJO<+F8WY}0HsU%nx8D%4Wv?fsHW~yw(qH6HTtF>YQs-zFbrGQc)0)Z z22-1OCXq%GPC?ZZ3mi?(x0|GnmTOxs^JLD*~OHI8IRw zDgd<+FylNRuIg*kSre6uc2=^2n9(_Ybl5-Vx4Y^tMW+CizWha}uyMZPMW?WFzVbx?ga5A(WyYWx=?Dz+X)3PE zztT&l8HVl-yOt^iugz#000K>pCcK)Yk%`nc0@5>t*4XUpTIxfdjLtdqQLB-jB_X%4 zUVGFvS&Hf#XHJ%axzQ2C@U8QPp4E^Szq+DCgoZ96cr2%4og%TpqNd@hKtjfm>?C_@ z=&?PimQ0_zmnWGnQDMI$-}V?Vx3I=1+&ar839f4|y>z=j;;xdL3m(K1#vb`WX)`_a*i!rpo1b{EopH{wU|(`WZbuf0!7 zEtfp~k|N8RBr>BeNp{#qkj~vQs$k45vsJa))%WiD$ZiyAn5DdQ<(o^9L|CiCC&_Qx zHCuudgh6zN=?sS4ILktB(RRkCS{)&mjo@`&M_Xq-ts1LAG>Ked)a+vb3FKDL3Jj>$ z4o^y5XQOI&kJ)59%CM5!)Ngp@ViS%)IG2r8osDHC=m{BG))rx;W5M~b1eDU$&G0Ov zq;mo7Mh5XD*s-3Be8^DICA#7~bx5R2;zOo8YlH*U~l8tR&nGX?%%FvRr zMfY!=NFnptzW3eG*ZteaFdmP_hej*rpkgmcZfq__bR zvG5MLQ1NCf6n_pjeEe-eUFP=D$3Ekh6z*L|uoparPeu-3e_F`FJm?=Zml})yLHi^C z@zHmF|LNn13oi;h6`KPwk9*d7Uvy>h&pdPr)wJ(?=oA*qyB<1)#q#clp5npVxys6) zd+4sp%AbFT^>;^l0l*RK6m^{hJDseC>XuYnEIuct?F!5RLllY2teC5g6&-x6R{{5;33tXC^gfbU=>VpD{KGh=bb`; zIQo}J3R_fLOVAB5bn@^)lEdp3r>|4-P2NaVLt~~Fu2S}h>;!ER85W7C5m{xtlM^A= zl1#*#9HD(=D>eB6pJLNM>+Gs<6m=CeyGGgH`Mje_Pwo_ProkY{Pe$5OvCbZ&RQ!6a zl0{n?vP?uDE8D`#cdl3|qa_9AnQYNrIYg~R$HHRYuz(F=J`(kzucMPCqf~37&Y#Im zlGPu~QQp7rih|`yIs<<0N%SLp-osDR8So1qKBv7j1mxLb9-V=Au*vun@#zi>1pg-Nx1Ryy1dNNN$gSG z&Bge7E_Yn?2%pOx_iKZ`=utc6W6TF_xBqc1M2$g5kyUH$vKLH*C z*Oi>QErt^wQv6ZR5_L2KeW@}WtWm86Rb??*%?J+I9@s^tceN$f{ck<@;N-xa7`m!S z3v0Zw1B_CSWy=AZq(-2|xi#V3O2n%~m2RZ6NqMk%62@#2rgKAaHW-1a!Sj`z$O=oQ zV20tA&TlU>Di%jJn6arzZ|NKL6ri#&jaAtVX^jyK1@zf{VOv?lt8SZf>;j;`Q52SR zpD{a+H=@)uHz*pbVg+WFEF||jHyNAE(94i*m{!T9gq2CkZ6VA3%Egvd4Fby8U-#Uj zpxU#m=90&w&~DhO#9s&KM9#h}Ne^sUN;b{REhS%A8!YAG`E5SbaC(I7(mF!X+~SaV zVw09NNGJ$qR=}kl))6+Us?`OYb5;^H`|F>36kSNqx=Fs1ZQrtPf~_1xW0IG!YS;PD zGL&gX>pisEb*9MwGdqFB+3na?jjB_aL^;Ev^$e&jszehi@apK4mU>@u++#$55!3pr zTHE~%dJ4i^0~-*y*?ej@7(J2ZBPd_dgvnx^6i3u1=GD}!`ioc?hHw=(A~yKKLI;AJ zDsz_^opC-ISYljDrgA(Y8;ZCkfl_^1Q(M;EQJVz){hRa@fF?;~CKCH5FM~dsq(F?hTC+F4<^-iV~G=2py?zMKck$^E#ZdDBSGuxRiS5M+F~Q8bRVPL z$UD=q>S(v&3X#;1M*!ZiIK=rDl!Waif2v+n??D8$7G8#TY$U7xXC)S0BC0A z^BFdI*#Z-7c-9={C_y@jQ`)26$QV=_+)J%S(>I;gcNNbt@vU;1mp4Z9qysmrlyy*Q{rm7Y%gEDrY4v zOey!aSXAQT*~$uU&8fz1|JGw&bX928%4|gCp-8ZfC1u-#W4Dr!d&y3R_QW3+(3FjK zV3@m*T4urO5heD^$l0iPaLB^0jZNRl;zmxRidgJxr@oNbNcXZ^n~b^NzfDiU@?j4X z3MVlpD6NsTP1zjza_9g2%$$l7w>0ft;pVHL%1q)0r&`0q*GH!%NA2;t?S;% zc$TMQ;`u^>DipeG<nX#2IRCpvvka@2Mq1s zam)yTj!6LVvr&TN`hzv>%2`~?Y*Q9?H|%y`a%Sf&wW1O8SU!NXQmu?!dAJ2j2Kn=O zz|RuH9V#`+%&4x=6hfKi5;Gf%u}Dsvu1@05{zg4T&a9=x|81=;UBcB~I-}qCv!KPM zc11po>TWxc8L}fYLZYwAa7bxT5!FL&9@sZzSFlApweymZ7{J<`Y_#}NR-5o2=NRrO z2lrS&Yx|q@6lLi;$ID`ZQAwKIE|NMJ@J(^t!8utUs~r~Y(gEb}oeka%wyI)S<&ya!nLK%=TgSfIc=It;*K^jb(aE47i2XZ{)p^nO9PfGP$m}e4en;iC zI{%-wftrq4+teZixsy_{QC5_sww8xw=P1IdD2Xga{0dDad`6nbmG#N!s5zCvEY0#N zUPZG_{)dHiXq;?J`K=8=xqsKOM=sjk_qUJpRApYdVK%}N(+0$7uBh#cfTS2<9Jx@X z!K^IS7vW81k36S3_k%)~CDGK%#Io6=U3CJg!9tO5$^R;tBglLIu;1+p-EOf-GJI z;fcZWL@kV?3au4%mJG?sty0RLDxoC@k-gbI+x|Uzio|#kJY`IiNVQC8hM*Axvt^$X zL$mH|J8{|`j?n~H)?}6NCQ-*#u!EC%Z(@r9?uZ`RDD4(DU-q4XFF)hnXM2-6Un~&A$d+nYrnYwJB*mSxg zB_RbF8#;hzltdO`FELz{#S0fIJxxuVlhDGW%8J18fyx4M+_RT*lFY-UnS zd`c)oVkN@0NXU+z`j#Vh!WLzm3d7yJ)XSSlF24a@S$Q4C1weUNfS4+O&vURNETdj^ zA*=K<50=cE4k@96Pou=P)W1rEB{Q)9kGAlsS_H;&7M05r&|4b&ThH*tJVgAnAc^dt z#3h4n2+k_Gw0000>9%St>oj|M(T!vkyx)__PT10>$Lqot9 zC=s75`8pMnH!GN*1f0>X=5a^dXiYMx8(#EdX3oTSY-C%Jlp z*$Y8)6K`-z+OmEN1UqOhQ=A0fp_I~~^+NaR8_9P6fg^T~UMyRJ5N$lk4_Yu~RSJbr ziy~tyD8C&A@XW|+Bqw3+!Rkw@mtap4mdJJzErt@NO)n;A1(4|k39zKuLxgW>KlqIm zM_7~{4qMHH{Rj0F7p{@~yAK^TEihNPE(sNSf;(8VslG6auCmxc0s%la>ygXB<_2ah zOs3!?++L$+R&+Yu1$W^rLj_#?8PtEkgH})}kJ_z_EWLW{ypKpr0@v(6bc_WnS|#8< z>xFc*ogtHo$*Xx4LP<}jNNADReNcJ{9gRZ@os{ZTE~#+K9Rz zEJs*Bix>J24#-dqP~SLu&i5ZaVkZfPS8O^Ul4T5WkHnftkWCi0D#-9&MHgPMW%3i7 z8w?a=riDq!;~mKHWDMvWu)mX~WRo;NfMXLw3Zz=6+pMT=ZZ*ywtwuTl3x5BR;}k`b z$%8FI@ZUUtEb9xBBFh29%nPXJ0x&>i3zGRtDo-QgsEj91N#cMHCmRO@Ou)Bpfp_3C zg2MnP`2{AO*YQI^7S?l@OMRW{c#<#3j~?*?5Jnmb$7SFW*^}Bu5yF|0A*g)10DM23 zNx;Z_qopt$0R|MFW#iVTEQ2JX0j*#U017t}aK98oz?P#22Jy z|J%Qibe@y9EDJU@?bp@is+k&QDDDB zQj9ke6M+H%!;gcy%}N_e5Sq_Npi0miLm(7<*qW2P=$QN8Iq-!lw1N%=Ny~0B`wVty zI`(0mOna1h5ul>o6iuZman$Ls^sIEhy|e>1ozC#>;EU>qB9Vu<5M_;#rUdDVVm4F~ zxY@Ew1}zD=fS%j_ch63gSdB{bm5GFpZaT^XaLe+ICzv|WZ#vhSa~yD(xa){{^4|oY z>oS3%R;sWJ7^$PG;*aMN5Kq6MrX@{rV|sYeHsKVq>sVe0N79=S)TVw&+Zguh+w*But_Y_*1 zj$S|*k@|nTW$ZjCI2_U>G92pU3?01c{SLm)a*#BejzP0pUO?LH2sn$9jCyuh$dC}G zl4Tb)?Y!ZF8mpL=&l2O|E@uf}nRN}8>}Bo$;-ND!jT##CL{eUaVFotJ=&T%-Z%IY4 z8~IBmpw7W%Eo%{!FtmKZo3cJr`75ke#;;2ixKL+lKd8PpG7GF{9@R>dCaXHT zVXICA_aA%iX>=rt6#L%)CCmCNHk#5yOCxLF8XP)$*(lyLsc1?k@L# z{m>mfl7H~NI<4Ek@rMuHt4Z?TJak*4;eEHufA-odZqDnksE?}K=-KVD$8O%ZdA&aV zzP=-=YMP+*TjS8!1d%w6*ir=`_=wOjb!8NF|+w4gQ#@KcW;G( zU`?~Ny%Zs%Gz@e`qp~_-<^il%Gy0Om=y`{vqRWYmm(`XFDu-D$HM}k@2v=U= zCW_89tEL5DgcVHAJQe$-CfT^b8~GFHEX+RuJqm#_0;7kLG#`Tvz%Bx}S+Tt}i8FrK zbGP)Lc()1Uqu0i@o1bx)P0|Gq<4IR}*(Wz2edyWO&p?$Ikqa#8b&k{3TACqHLkH?* zknlFcM~4`c4bpEq*|`|AoZ=wq2EtJ`Ip}%G+XgXv!ms2v*z`_D!MagRqwp~)d zWV9rI9-ewr5to;cG|Rl?sh0Ot?ImGmTvh-O?P;# zSD$JFXTr**E7q6p7(wQwLmqm-BgG)u?}2o=kzI2kS)bJouz_^d%HTuyH`@YCupQd> zn=-v_a1ZzLe5{9YE`VP&eLP>Mdy8}36}T^W)K0ig*O~{*d0*7>%+%?s9gRV1*66I( z!vrBli9AUpNNW;AW&rK5dy|PwKyy=ock1G;NNBd`q(~=fn-f=1Cj+k-AofJ(w1uH- z1ENJ)5!@Q5Ttg;PO}2oK+c?{N~%pR>z|XB!CSSp6ZINdEMLyk{RAU zq#&z{weoUXThbI{ruZ7P*_j2Yi*BSEm2Z?K|8rFc6H3o6t094;6>zQ#`xl?lpFBew zvv|4FAGi2T>ZCyhgtF;%ke;SqZSalI4537E)=1nL1nn$qY^rT2ExA3A*G#gi8XvU+ zAz(@%S~!)22IaTW`9G&suadQv_Ak*>uo_sQFwj_ZhXeKkQcqvwMz~jTPlZF}+DVGM zB>PL@kxa2X2zo+pO)oK4xa~+&5UfRbhpW+qlq<1R$4VIl}z7yl_7^}Cyvk4if&uT zjDhW|@?}p%vsQWmWEqv2+eD&FhmFYw@LN1phKtJn-LtYtFO0+DabUgGNI5}Kqj<~b zR+ZKMUQt2jM#p+n=UEze)dpn}2z*7?7;8d8j=IajvrDA~QXA#C!>{K#ExeES*Hy4; z+P7heYy5fD?MGyYnd41Ng+M`!8{%cli)q9&E4cm3H5OHJ&XIs)*%njU|A7w(q4W{R zT^ODL++x)dz>Dq>H+j_%^VqpkaDezN={LwIW|K1G)EeCdTRyHZT25@6&{cq}7hlcFctA=Mtq8nr zTaZe+k#@Sa1Z3Fi&I#-$eFYMe1#UPn_8_!QYlyFt<(gvNzv9@bWTK(Mgr*B4qyD^Q za%OD}T~O!APVl4-U84=MP*({wu`La40#=V|(b&vjf2ok$sYRii05|{v4BD(RJmP`q zI4QB!t};Ldo#i#V+rRQTXSJzb{RmZUt(#1aY;S74hwSSXhsA3L;e}C=ElKvCaCQ{Z zgKu+@fU0yp*eC5M^JQ~J7z@M44i1S2vLaJ4Csw@b%f`?p;bd1=)y3~$b+$+HmQ-l# zW$;iAOPS3RrFkvJ-yE9@`V5^Vosvsa8$4)b=7uFTZS13@a(D5yrGn$mbR3okWKOvd znx-oIWQkS7IG!^xlE!tF+1I##^>a?)aQL`kO2>IYJRoCIpYl*yJ!?c-8>HQuq=V4G z&IuSqVmEAPk^~!8&!r0^c90bNRcfHV6t=2YBLJJe5o48DnbWDUPTh#|xmrzoJ?u4M#3N)TazYEB0L=`HMATtx$ z09w;Xgd}djS7W@YW}<{qyAG4ql1-P&%8V}5%Ub)_KIigZxHsfCAPhFO76J3jHeSbh zOH!RLqoc;mnF!WZ)$)EE%`(c&W3?nL34s5~QdLottm+y?xa?>W)=`y06`llElA(^J z#}eCg%O6=lgE+DOvN#dHs3H<|(@#$>gb`-d^^lXHI*#SYmSLapm@p=($8PO9|Y5N%Ma?@gXa4FlEG@Vl(I8S12LO<^U`Clc=R(K`1mJ& z_lY0q*FT(Jzx8VW#kp6LV9oUj-<*21%O73{#+Qz)1I z%;z1Ypn0=!I-TW4i6yWGfP+ndZ5du$Hv>IFvdIVhAOZ$d2;{5ScimKK?WJ_L6)%Bc zvNMDMe(yjTs*VATvQo*dJ^^X7s3cqAaEFsX;r?0AJB1SA&(*_TaQ`gT!SOC}{*u>T@x+rZE zsc^0OO^%6A2JQ#S98!dXsgO*cG#m-kVM@bh(_L2PH?ubAgfvQ2ryW!U#%1K+*VRh^EI9NomV}xm z>2Q=?YqLyJxrM<>7L-*=P9q@^y3QfLkJZ>+sy8k@e*LkRU%N5K-2m`nhwt71&=82b z`ZHO3y4Lc1^k#I@uq8egu6)~#M>>Qosz}>AsM1^ykLWs#%d(_LT z161wlQr(1PZ&A0F+X8GJ-R=Yf)7Ak1(}VU70C@KG(+7a^e|5#{=rzleNjKjBlEm}! z8QHvy?m!W3Qd@PP zB*kL4F=>IoxxYte;YLlcmZ&W|NUOp@pxIJZA2OkIEAeWoWa2x;5RPTTLwe`WY-$i0 zupi%t4CoXZ*t)S?LDPk$$TBypn+jVAEULaqNmoiQ1oN(Iylxw;6@FQiH+nP$?)B6y88w{>Hw8YSas*s zM_`vjrZ?SdKw=`$4Akh<(WH}luTH`k;<<1Qqv=E@!b4t?G_Z0Z3K^P_csB;N$61ML z5tbu>4xt3uLC;Ea(E=UE!5&-DvA!LKXa|ae`X<&aSU(mubZ@$dP@l6*o`EQG7zQ1+ zZJjqKdFA7y-kg`(^~YX)gShi3Deux~=Y#e|58}Nq*hLSdf)QGSnd!c99&+71sxt{x zXw*b^n8yyOjA)C3GQ4z*NN?JeOh?dd2NBhty0gXwlkDz5LKCNpYy^0QNDR+75G3>wm48bs^cCO=f#) zM+N`NsFf#eV$-En;AafgSOB!7BU+Pdt6>@GxTxszeswnKq2E0_Yi0i_x#?P025+av zJpSon_(2q37a0(LV5ZMOdYwW*y4AF(Jm)~NDo?7Vs&u)e8 zCx@T?y}Zm5o-Ox@PtUpol21~!)Mh+GTE;qLZ5X2^y#YS~bZ`chh@}jd@vOYDN!3dE z(hzi1{U437>}%C&`zWD`O_Z$Y49<(8cik>3T)b=fBc_OGVRLaPk2f&V;dBQc+Kq_`SWAkE@{e0XASa8ku(9o{Z`ec(gMt@F{_-4idHk3K%HUwZjtnD>tLzq-5|RrA3PI^?;uIN7Y5w)x018TC4$Gf*9vF0drED4Ff8)G7%f z8I$v7+2@(^T6}{gEzu# zUe(by@R4m?RieZgiLd){$f)?bzwtnzLv|BhKC4U=WUvDOO^_;sghv7}lvk2|Pd;2N znSZt5Z{Cwe)!`_uJOc%aaWiS@SjJ4%AS_jXdvB#>HPrDh_5NHZGz$bI6EbFU<^At} zs_uAQk*|rwfM+l7Lud=+vl7(0wu|mT;GH zB1jft5FOc7XdmB{#E4E63B|H%%2pK=g;gh`>8^`-5K?ZN&Z>;W35DADAYF(XD5M$+ zJ`)jRe}kUF>OQ#jCbsKCl}&p|YQst-2r_9;%sK?4OjfQn9%#8G_8UuFE%=G2UR`Ho zWNh+fWlE(k){bLs8zY33lqyYxB_!$QQe{UThPi~e~C{mNA4)L|$y1l2M8U2OJhf%k1y? z)TfwvKkjzsRf@QEz5C8jJztH?rpR6TsX8h(x+$0yY@?DVFZrz|S;xqLN{*G!VLAlG z)FD6S9%b0to2s-V>s=&wqKd=P;41R-AjP$INF~jn+qQ$Tr~wb?m@4V)d|tia!`O4& z>7#GnxHNCv;Q6lANAF6b7d>|OKIb~5F?4$bNrx7xG*tmObk%2QzqO zLOlEW=_k>PKZ}0O{oEWc{ILFWKJ63+=ry1A^bhMl@6*mjDe?qEqg$KJMb+#LvI@J% zNRCHB%`LgjyGoE%Qr8A^O-BU9>7JhKX_5}iB^JY~Wlp57IjT_~a_;M>0w02sI`L&t z*#}cM*$ZgArF8+>7$)bw6vJ1>F8aPLUCt5YRenWogEyE`n`0J3I!oE z0#_vQok(u1wP6RF z5XzANR7Hlf?o0u9Z4JOp{sVFot5o_-$gre3@VhEbbuz1N5h=+AlHs&tf6JBoVgCzv z(tPc!P9e2_?yF8AhUB2j5=Pe(<_*M5pAYbyT%g?$4f#@Di zH#kQfRNb~iq@C z*bn(l!B?R#Q`)aOpzd&zV6!d4+5UXj=0%6E_lrP2^q%13qDS$MCHUZ@B$(+0s=ZO1W_O=R0Oh1a`LQxD-;0?0Wv_3jv!X7oob z^EUY0CUh7+12|;4vSbpW&rqX|Q`7zhx`5v{U4ltbwj|xHFIjuZxus3{?DE#NLoOt$ ze$K40`nN9UqrEgGq? zOJFNn8JYkOduG5S_M;ZR=wu(oKB-+E5kk&EKoH1NjQsR~MUpQWBOA4is*y|1Il63e z9?;FsRSB=rH6v854jp%bM3UXV;L0fg^tWBP{Bb7=2fySbHqMtm)%uxpnCHvSSJ0?5 z%Gq$Ht`M#CQYHTybz&h=O)Fn3<~V2LGht2HM5cvZDwlFUkWzwGf38G_tDL>mK}=Z6 zyxs)fsyI&5Mt~xzAKp$zg13{E-p*IhTr?rMTa)6RXy&3v?S#>cf6&=G(9ErGJbg6d zWb8t)k;J-0qNl1!WiFs%czOBo*%CW@F@TZKM3B!@{~;uptm~RQ)$lyBx}BAJmj%3d zawQ0N4&5}%wOFMv1a{r1$v`8h6gCjp_8<8xr@(?<`<(k(S6?_;{gE4|FhD8C+&K*S_c)+_72`w|o@bO@OGVmi5{*0m+dv*8WfR6zU!f@+ROh zWQr-fZd{*IzNvo#Gr-0GWX4=2zzZ3s}rzlKT7F1W&2&54*Zd87u)UR5ykzhZJh)Tgh zzrN@KH*IUi!)EkYn$oqXeIqKvZiu9XB_5}|*d&JK#BC=Cpm{Lulv<4v=pxYpUziFeN zR^nqLSXF6vm?pTnMJRM#vhRYveBi;3iyqN?!;XtS9{(Wh_#o`~V+%VznDCE;|Mo*) z=z|IWLKA-OMQV>Vg`-k4nB1}>hK=r*WUmQDx|fT=u{yGB-R0G6)+WoL6lEmbhB2wy z!|%>n2=vi{WP|*bnypTK@bqp-nFl0Ql2!MtF7{VYFDdYyk!yU~;E#hobxs5xcRNfh<&-(9 zvhQ z7VipVswMSc=O@61NmQFj<|Bl?4`o4>QdI;ydmmz`%?nh@2P|@gH$D{U-L!qKRDJe^ zZ$QpGl_Fb83_DfiTuB>KEuc;%J40<-3-?`(B^Ag`Ghs$~>YSkC-B6-g8P<{D7e&+6 z7U*@1(zPd54wR7SneXik{wdIRy?d1t9Hyq6 zBcb9spA?kYSL|iX$3MS!GeW>Y+WAU_08UCjR96qigJ`F(LIUDQ*XD3Vn+Cj6@IsEtrwqzy?{`j|ftf0hL_HAq!lB$C7hqRS-s}vjpB-X}A>Qc8m$$`8U;6G}i0kKX7! zhqpUnm4M~iN1gm*+*i6R@cfuTUsZOEqh_>X%mp4-~`Kku=)4bpj2 z0swxWj!a`51WA`>5fuDNUvv{wM|GMjiCOE|Lsnr7v9GE;Vot3>3lr1gK zinclzghd6XE!}t7)`E!;l-?~rU1I>bF(p9dOL5Gyll8YC3zUHbZK;Lnv8+Z`KYn^Y z1tf+{4=UuGM2_02nbhpP%nE7Z2_mXP z0H*fJ_}}}bp8d!Gr3`#IY5*F0qlh$^Edfu*RW-gn==PIvW6Vm95fDA4Ibh`KMSmha zJ^uT?y{z*#O)2`YQ4<1hDs=^2ch~Q_7R^cX5E6)H=^btA+jjL!TO;DpWssb%ywgs= z#M*nG(5p>X_)3MRlWYoqmtieX-1?+)tRZQjoBieYzfR8lO5?sXzS40rn(5S?;_{w2 zvvyw>ryh0l3g|Vp=G_kJq5cMxEmFE>5I!?$!g`>F59n0cb?HPkfCRZ!o9yWoE_I#8 z(VGgisZ!nI<0p@Mq3`gHy9J3Zac-U5^$Z)uCT$v|MbC~Z`|sTIi5mnWuB7NFX_H%8 z*HOTLOxLzf$^)eVhM-c1YAddEpy%Kc>LYt7rr+f(X2AOG-p=hxq8F#Y_SFJ651-G6*MS-*gLjOig`+W*q|EuJpR+Rv}Dl#QrViPB@XVAa~pD|~6g z;+dEBp0I;&U9-RXou`!GxyS6QZxch3NVEX;s2A{pMAcAY@OiOb>M<=IZz@wzw44Oj z)&Y4QgACE@y0)T(ZsGUAeuszBMx%|?#S1l_tzR0<+lx|90&af~;s7w>+~ zlI~lt|NRYYNOTy=xF}~!O?^tso@qybl*%Z>pTTUQi z1^#$*J5$66h?7REd&c?truhL*<(Cw+1`+F@rT7lxHq>if zE&}v?54q*a>s-_y(D|S$f!Xy3t?GE!LD0Jqpj(0zAzYq~xfGey zR)OYG2l!rHJ$1lV6L$pH=q_53-zTI2<_pMc6F=3;0U~9x69n|fFW!a$`jZ#Gs0rLB zuYM@;|KvO4!w)|E`0=MN-uaa`s`_92&W~O^DV-IxnYFRlR9Y)$5G*XYluEfL@s#X4 zuccTHPfvRQhGjYi1h2zdJT(lJrX56nmo7n{r4Fc(y_|r{<*bXY7b#)uDnqj?Y6H-z zxk&ZY9`2d@`%^KykLO3P<|i-TXpes9_uI?&|KLm8yU#s{U!%pGi73TT7b9MSG-`T-X z@q`zvE)`)TyC^s)qTz+7eN#7STO#Z@gSt6upR+xF_Px86LrarboNS4DDyZ1$oZK!k zK+ilu*seZho!28kJ_nuE>Go8uW9+tXxRyR!t)_4iJCsY}1rSL6awRJ3i8_Zjt{k$R zek^=-bN7FIii0L?-^$G}i)#URL9#{5mf02dC}nCQmMEs(i%$zet;S8!Rg{o6X<^QT z8kukMQ4Z=TeGhiBpKhd3e);dv91AuBdfI#wMR@9b{MGlr&K?>l!I;5ybI}k~l#=dq zpOM zNp?iT2_$_u!{g6BdK*Ia&p-M}!m@z$L+M9x0m)tR2 z8Z7`x`c^=2OdKzru234)_w|GV-rP(D_iY(hpxL0*hV$gtxVy6xeesZfMEM z_62Gx$F1nqH4tdGIr4HL$*n7$Mt0s{p3I?OLp566d5S7vqd~E@jX=5}V`q%aVPAO? zje47}x$%hSw!GUL_06HWYRYuLg--xk1?yy}8)+|{KKN5-N->oXBm6n0*E>eukyD9K zJ#@xnM0m#0>aFVLZpT>bxcO?JXl_-xKHWsMNYTd}Fa@hUuQN$dYdt&TxqD)8KlB&v zU}jo!ixX$3??f_{-D63CAf<-SL&aCo zvIbKyR$Xw0=AL2FN=eEx_gZ%)HP8L3NgYTE%z2i!+_+Yf^B(k^ zq8(VQz3>MvdQ0FXCT|(-Tsu{+?No(x#4BlMOt>)8t!Xz=y>YBu^MVjZM(A{==g^1J zQP}NQz@weEwr0v6I)cAVCEz!$J!`79Yt+%_ai8lc)u?g{HMoOtAAJZ-xiEet66w>w z2MRc*M#GF;(fX>YR|e6MfS>#yPfIE1Erxt_U#nBO&usc`U@(OT+n^%tN{GUczyfqj zQfVg?jNRFjC}B&}x-eb;8vEoUFGfq{%*iamR;%mWy(^cj@_mL7oh}M^&!4PnJ9*B4 z&)&ClSBqlHfTX0)6<-RvRIhF7;O>f3w;vs$-7dT#wy;@r%m@$O+{ZEkOo?Y^gooOv znq<0few|H)TY-g}p6aF0QD;|6b)Pgz>hVUl#dRj?mv#N31(2N@mE>eScSDEjI%?qc z?se7Nc^xsJk8o0__BwrOS@*@KF!+bA6XdVP$<)nBQBHNh^^y+9>_ikTNpa4egIVVQo{u_!B z^zzPYrF30JRUbbzyIQmI+_~wkBdvGKv z*v2)(yoE&=;?)4cCvQ@hirypK%UwlB)~@zMj-;ff(uWc`S;R>@(|Nu?$7y(H&vOsr zgZmM30!S?#NU{>QjlRsVZ&lC5Bi5aSvxM_fWxsa!4wENEXi%EoUSrXqw)+UqUI8Ne zeb71!Jocy#XmXQO(dDJ0vjQ1FcPa{<@d~F&*|f{MwyIm9PV2-KvoecoOMO!VBBUAt z0Na+Q3;UE)ic11;^Q`)OXbWE`&iyK`gYSKdX}MgY@5zy4JQc3ZboHRSorHW)G?Wm(op0>TfZ$Vam5OiCIDSV$}Ertp^u1jy7(O z7*N=etS=-KNSxem`oC{yjTIy%VBFJMe4u|NY$`G(&&qdCABZwX@N{3&?j@=E~& zTXee%WTIt*+&jRlS?7=F#4$$gm~p8OOHzi5h6pW&GnNE=px}U&3RO(AMq;Di;n*!o z^i`@zOG@2`r0tXj(0jXd4sKe{sJlTTsC~htSGo}cn)kiR{O_Zb9@h0x0H8d?i!^J5 zW>1Myr)PMC!_$5yrQRov>#0csL;H@ z1gejjM-$^}chd8vqaP*aq#$<@MW61b39vnx37;m~K(RIyjqKAdBdb0F0F2UBsMi|u z(AOK)Q@3Mc@;vmv0{-q7y@KSV5uJ;~ Date: Mon, 18 Sep 2023 19:20:24 +0200 Subject: [PATCH 150/153] docs: add natspect to _setForcedLiquidation --- contracts/Comptroller/Diamond/facets/SetterFacet.sol | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/contracts/Comptroller/Diamond/facets/SetterFacet.sol b/contracts/Comptroller/Diamond/facets/SetterFacet.sol index 9d11dd55e..47b9f7c93 100644 --- a/contracts/Comptroller/Diamond/facets/SetterFacet.sol +++ b/contracts/Comptroller/Diamond/facets/SetterFacet.sol @@ -515,6 +515,12 @@ contract SetterFacet is ISetterFacet, FacetBase { emit NewVAIVaultInfo(vault_, releaseStartBlock_, minReleaseAmount_); } + /** + * @notice Enables forced liquidations for a market. If forced liquidation is enabled, + * borrows in the market may be liquidated regardless of the account liquidity + * @param vTokenBorrowed Borrowed vToken + * @param enable Whether to enable forced liquidations + */ function _setForcedLiquidation(address vTokenBorrowed, bool enable) external { ensureAllowed("_setForcedLiquidation(address,bool)"); if (vTokenBorrowed != address(vaiController)) { From 0710b66e4e51fc5170eeacd08164b4fb90ab2381 Mon Sep 17 00:00:00 2001 From: Debugger022 Date: Tue, 19 Sep 2023 15:06:25 +0530 Subject: [PATCH 151/153] fix: pr comments --- .../Comptroller/ComptrollerInterface.sol | 15 +- .../Comptroller/Diamond/accessControl.ts | 13 +- .../Comptroller/Diamond/comptrollerTest.ts | 25 ++-- .../Comptroller/Diamond/scripts/deploy.ts | 7 +- tests/hardhat/Fork/diamondTest.ts | 138 +++++++++--------- 5 files changed, 94 insertions(+), 104 deletions(-) diff --git a/contracts/Comptroller/ComptrollerInterface.sol b/contracts/Comptroller/ComptrollerInterface.sol index 04a0c4bb7..a6c8838b9 100644 --- a/contracts/Comptroller/ComptrollerInterface.sol +++ b/contracts/Comptroller/ComptrollerInterface.sol @@ -4,7 +4,7 @@ import "../Tokens/VTokens/VToken.sol"; import "../Oracle/PriceOracle.sol"; import "../Tokens/VAI/VAIControllerInterface.sol"; -contract ComptrollerInterfaceG1 { +contract ComptrollerInterface { /// @notice Indicator that this is a Comptroller contract (for inspection) bool public constant isComptroller = true; @@ -89,27 +89,14 @@ contract ComptrollerInterfaceG1 { ) external view returns (uint, uint); function setMintedVAIOf(address owner, uint amount) external returns (uint); -} -contract ComptrollerInterfaceG2 is ComptrollerInterfaceG1 { function liquidateVAICalculateSeizeTokens( address vTokenCollateral, uint repayAmount ) external view returns (uint, uint); -} -contract ComptrollerInterfaceG3 is ComptrollerInterfaceG2 { - function liquidateVAICalculateSeizeTokens( - address vTokenCollateral, - uint repayAmount - ) external view returns (uint, uint); -} - -contract ComptrollerInterfaceG4 is ComptrollerInterfaceG3 { function getXVSAddress() public view returns (address); -} -contract ComptrollerInterface is ComptrollerInterfaceG4 { function markets(address) external view returns (bool, uint); function oracle() external view returns (PriceOracle); diff --git a/tests/hardhat/Comptroller/Diamond/accessControl.ts b/tests/hardhat/Comptroller/Diamond/accessControl.ts index 2790a3ddd..bf0c42e2c 100644 --- a/tests/hardhat/Comptroller/Diamond/accessControl.ts +++ b/tests/hardhat/Comptroller/Diamond/accessControl.ts @@ -1,6 +1,7 @@ import { FakeContract, smock } from "@defi-wonderland/smock"; +import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers"; import chai from "chai"; -import { Signer, constants } from "ethers"; +import { constants } from "ethers"; import { ethers } from "hardhat"; import { ComptrollerMock, IAccessControlManager } from "../../../typechain"; @@ -10,7 +11,7 @@ const { expect } = chai; chai.use(smock.matchers); describe("Comptroller", () => { - let user: Signer; + let user: SignerWithAddress; let userAddress: string; let unitroller: ComptrollerMock; let accessControl: FakeContract; @@ -19,7 +20,7 @@ describe("Comptroller", () => { beforeEach(async () => { const signers = await ethers.getSigners(); user = signers[1]; - userAddress = await user.getAddress(); + userAddress = user.address; accessControl = await smock.fake( "contracts/Governance/IAccessControlManager.sol:IAccessControlManager", ); @@ -30,11 +31,13 @@ describe("Comptroller", () => { describe("_setAccessControlManager", () => { it("Reverts if called by non-admin", async () => { - expect(comptroller.connect(user)._setAccessControl(userAddress)).to.be.revertedWith("only admin can"); + await expect(comptroller.connect(user)._setAccessControl(userAddress)).to.be.revertedWith("only admin can"); }); it("Reverts if ACM is zero address", async () => { - expect(comptroller._setAccessControl(constants.AddressZero)).to.be.revertedWith("can't be zero address"); + await expect(comptroller._setAccessControl(constants.AddressZero)).to.be.revertedWith( + "old address is same as new address", + ); }); it("Sets ACM address in storage", async () => { diff --git a/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts b/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts index b66797fe5..4215144c2 100644 --- a/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts +++ b/tests/hardhat/Comptroller/Diamond/comptrollerTest.ts @@ -1,7 +1,8 @@ import { FakeContract, MockContract, smock } from "@defi-wonderland/smock"; import { loadFixture } from "@nomicfoundation/hardhat-network-helpers"; +import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers"; import chai from "chai"; -import { Signer, constants } from "ethers"; +import { constants } from "ethers"; import { ethers } from "hardhat"; import { convertToUnit } from "../../../../helpers/utils"; @@ -64,8 +65,8 @@ async function configureVToken(vToken: FakeContract, unitroller: MockCon } describe("Comptroller", () => { - let root: Signer; - let accounts: Signer[]; + let root: SignerWithAddress; + let accounts: SignerWithAddress[]; let comptroller: ComptrollerMock; before(async () => { @@ -83,7 +84,7 @@ describe("Comptroller", () => { describe("constructor", () => { it("on success it sets admin to creator and pendingAdmin is unset", async () => { const { comptroller } = await loadFixture(deploySimpleComptroller); - expect(await comptroller.admin()).to.equal(await root.getAddress()); + expect(await comptroller.admin()).to.equal(root.address); expect(await comptroller.pendingAdmin()).to.equal(constants.AddressZero); }); }); @@ -562,11 +563,7 @@ describe("Comptroller", () => { vToken.exchangeRateStored.returns(exchangeRate); await comptroller._setMarketSupplyCaps([vToken.address], [cap]); expect( - await comptroller.callStatic.mintAllowed( - vToken.address, - await root.getAddress(), - convertToUnit("0.9999", 18), - ), + await comptroller.callStatic.mintAllowed(vToken.address, root.address, convertToUnit("0.9999", 18)), ).to.equal(0); // 0 means "no error" }); @@ -580,29 +577,29 @@ describe("Comptroller", () => { vToken.exchangeRateStored.returns(exchangeRate); await comptroller._setMarketSupplyCaps([vToken.address], [cap]); await expect( - comptroller.mintAllowed(vToken.address, await root.getAddress(), convertToUnit("1.01", 18)), + comptroller.mintAllowed(vToken.address, root.address, convertToUnit("1.01", 18)), ).to.be.revertedWith("market supply cap reached"); }); it("reverts if market is not listed", async () => { const someVToken = await smock.fake("contracts/Tokens/VTokens/VToken.sol:VToken"); await expect( - comptroller.mintAllowed(someVToken.address, await root.getAddress(), convertToUnit("1", 18)), + comptroller.mintAllowed(someVToken.address, root.address, convertToUnit("1", 18)), ).to.be.revertedWith("market not listed"); }); }); describe("redeemVerify", () => { it("should allow you to redeem 0 underlying for 0 tokens", async () => { - await comptroller.redeemVerify(vToken.address, await accounts[0].getAddress(), 0, 0); + await comptroller.redeemVerify(vToken.address, accounts[0].address, 0, 0); }); it("should allow you to redeem 5 underlyig for 5 tokens", async () => { - await comptroller.redeemVerify(vToken.address, await accounts[0].getAddress(), 5, 5); + await comptroller.redeemVerify(vToken.address, accounts[0].address, 5, 5); }); it("should not allow you to redeem 5 underlying for 0 tokens", async () => { - await expect(comptroller.redeemVerify(vToken.address, await accounts[0].getAddress(), 5, 0)).to.be.revertedWith( + await expect(comptroller.redeemVerify(vToken.address, accounts[0].address, 5, 0)).to.be.revertedWith( "redeemTokens zero", ); }); diff --git a/tests/hardhat/Comptroller/Diamond/scripts/deploy.ts b/tests/hardhat/Comptroller/Diamond/scripts/deploy.ts index 8ecbffa74..188eb7423 100644 --- a/tests/hardhat/Comptroller/Diamond/scripts/deploy.ts +++ b/tests/hardhat/Comptroller/Diamond/scripts/deploy.ts @@ -10,7 +10,7 @@ const ethers = hre.ethers; const Owner = "0x939bd8d64c0a9583a7dcea9933f7b21697ab6396"; -async function deployFacets() { +export async function deployFacets() { // deploy Diamond const Diamond = await ethers.getContractFactory("Diamond"); const diamond = await Diamond.deploy(); @@ -40,7 +40,7 @@ async function deployFacets() { }; } -async function deployDiamond(unitrollerAddress) { +export async function deployDiamond(unitrollerAddress) { let unitroller; let unitrollerAdmin; @@ -81,6 +81,3 @@ if (require.main === module) { process.exit(1); }); } - -exports.deployDiamond = deployDiamond; -exports.deployFacets = deployFacets; diff --git a/tests/hardhat/Fork/diamondTest.ts b/tests/hardhat/Fork/diamondTest.ts index 2aab7e3a9..ae032c0f6 100644 --- a/tests/hardhat/Fork/diamondTest.ts +++ b/tests/hardhat/Fork/diamondTest.ts @@ -5,7 +5,8 @@ import chai from "chai"; import { parseUnits } from "ethers/lib/utils"; import { ethers, network } from "hardhat"; -import { VBep20 } from "../../../typechain"; +import { initMainnetUser } from "../../../script/hardhat/fork/vip-framework/utils"; +import { IAccessControlManagerV5__factory, VBep20 } from "../../../typechain"; import { deployDiamond } from "../Comptroller/Diamond/scripts/deploy"; const { expect } = chai; @@ -16,6 +17,7 @@ const UNITROLLER = "0xfD36E2c2a6789Db23113685031d7F16329158384"; const zeroAddr = "0x0000000000000000000000000000000000000000"; const VBUSD = "0x95c78222B3D6e262426483D42CfA53685A67Ab9D"; const VUSDT = "0xfD5840Cd36d94D7229439859C0112a4185BC0255"; +const ACM = "0x4788629ABc6cFCA10F9f969efdEAa1cF70c23555"; let owner, unitroller, @@ -26,8 +28,6 @@ let owner, closeFactorMantissa, liquidationIncentiveMantissa, allMarkets, - venusRate, - venusSpeeds, venusSupplyState, venusBorrowState, venusAccrued, @@ -48,12 +48,8 @@ let owner, comptrollerLens, market, venusSupplierIndex, - venusBorrowerIndex; - -const initMainnetUser = async (user: string) => { - await impersonateAccount(user); - return ethers.getSigner(user); -}; + venusBorrowerIndex, + accessControlManager; export async function setForkBlock(blockNumber: number) { await network.provider.request({ @@ -61,7 +57,7 @@ export async function setForkBlock(blockNumber: number) { params: [ { forking: { - jsonRpcUrl: process.env.BSC_ARCHIVE_NODE, + jsonRpcUrl: process.env.BSC_ARCHIVE_NODE_URL, blockNumber: blockNumber, }, }, @@ -78,14 +74,14 @@ const forking = (blockNumber: number, fn: () => void) => { }); }; -forking(26713742, () => { +forking(31873700, () => { let USDT: ethers.contract; let BUSD: ethers.contract; let usdtHolder: ethers.Signer; let busdHolder: ethers.Signer; let vBUSD: ethers.contract; let vUSDT: ethers.contract; - let admin: SignerWithAddress; //eslint-disable-line + let ownerSigner: SignerWithAddress; //eslint-disable-line let diamondUnitroller; if (process.env.FORK_MAINNET === "true") { @@ -117,8 +113,10 @@ forking(26713742, () => { // unitroller with diamond diamondUnitroller = await ethers.getContractAt("ComptrollerMock", diamondUnitroller.address); - busdHolder = await initMainnetUser("0xf977814e90da44bfa03b6295a0616a897441acec"); - usdtHolder = await initMainnetUser("0xc444949e0054A23c44Fc45789738bdF64aed2391"); + busdHolder = await initMainnetUser("0xf977814e90da44bfa03b6295a0616a897441acec", parseUnits("1000", 18)); + usdtHolder = await initMainnetUser("0x3e8734Ec146C981E3eD1f6b582D447DDE701d90c", parseUnits("1000", 18)); + ownerSigner = await initMainnetUser(Owner, parseUnits("1000", 18)); + accessControlManager = IAccessControlManagerV5__factory.connect(ACM, owner); [vBUSD, vUSDT] = await Promise.all( [VBUSD, VUSDT].map((address: string) => { @@ -173,14 +171,6 @@ forking(26713742, () => { const allMarketsAfterUpgrade = await diamondUnitroller.allMarkets(0); expect(allMarkets).to.equal(allMarketsAfterUpgrade); - venusRate = await unitroller.venusRate(); - const venusRateAfterUpgrade = await diamondUnitroller.venusRate(); - expect(venusRate).to.equal(venusRateAfterUpgrade); - - venusSpeeds = await unitroller.venusSpeeds(BUSD.address); - const venusSpeedsAfterUpgrade = await diamondUnitroller.venusSpeeds(BUSD.address); - expect(venusSpeeds).to.equal(venusSpeedsAfterUpgrade); - venusSupplyState = await unitroller.venusSupplyState(BUSD.address); const venusSupplyStateAfterUpgrade = await diamondUnitroller.venusSupplyState(BUSD.address); expect(venusSupplyState.index.toString()).to.equal(venusSupplyStateAfterUpgrade.index.toString()); @@ -300,8 +290,8 @@ forking(26713742, () => { it("setting close factor", async () => { const currentCloseFactor = (await diamondUnitroller.closeFactorMantissa()).toString(); - await diamondUnitroller.connect(owner)._setCloseFactor(parseUnits("10000", 18)); - expect(await diamondUnitroller.closeFactorMantissa()).to.equals(parseUnits("10000", 18)); + await diamondUnitroller.connect(owner)._setCloseFactor(parseUnits("8", 17)); + expect(await diamondUnitroller.closeFactorMantissa()).to.equals(parseUnits("8", 17)); await diamondUnitroller.connect(owner)._setCloseFactor(parseUnits(currentCloseFactor, 0)); expect(await diamondUnitroller.closeFactorMantissa()).to.equals(parseUnits(currentCloseFactor, 0)); }); @@ -344,69 +334,85 @@ forking(26713742, () => { }); it("pausing mint action in vUSDT", async () => { - expect(await diamondUnitroller.connect(owner)._setActionsPaused([vBUSD.address], [0], true)).to.emit( - vBUSD, + const tx = await accessControlManager + .connect(owner) + .giveCallPermission(diamondUnitroller.address, "_setActionsPaused(address[],uint8[],bool)", Owner); + await tx.wait(); + + await expect(diamondUnitroller.connect(owner)._setActionsPaused([vUSDT.address], [0], true)).to.emit( + diamondUnitroller, "ActionPausedMarket", ); - await expect(vBUSD.connect(usdtHolder).mint(1000)).to.be.revertedWith("action is paused"); + await expect(vUSDT.connect(usdtHolder).mint(1000)).to.be.revertedWith("action is paused"); - expect(await diamondUnitroller.connect(owner)._setActionsPaused([vBUSD.address], [0], false)).to.emit( - vBUSD, + await expect(diamondUnitroller.connect(owner)._setActionsPaused([vUSDT.address], [0], false)).to.emit( + diamondUnitroller, "ActionPausedMarket", ); - expect(await vBUSD.connect(busdHolder).mint(10)).to.be.emit(vBUSD, "Mint"); + await expect(vUSDT.connect(busdHolder).mint(10)).to.be.emit(vUSDT, "Transfer"); + }); + + it("sets forced liquidation", async () => { + const tx = await accessControlManager + .connect(owner) + .giveCallPermission(diamondUnitroller.address, "_setForcedLiquidation(address,bool)", Owner); + await tx.wait(); + + await diamondUnitroller.connect(owner)._setForcedLiquidation(vUSDT.address, true); + expect(await diamondUnitroller.isForcedLiquidationEnabled(vUSDT.address)).to.be.true; + + await diamondUnitroller.connect(owner)._setForcedLiquidation(vUSDT.address, false); + expect(await diamondUnitroller.isForcedLiquidationEnabled(vUSDT.address)).to.be.false; }); }); describe("Diamond Hooks", () => { - it("mint vToken vBUSD", async () => { - const vBUSDBalance = await BUSD.balanceOf(vBUSD.address); - const busdHolerBalance = await BUSD.balanceOf(busdHolder.address); - expect(await vBUSD.connect(busdHolder).mint(1000)).to.emit(vBUSD, "Mint"); - - const newvBUSDBalance = await BUSD.balanceOf(vBUSD.address); - const newBusdHolerBalance = await BUSD.balanceOf(busdHolder.address); - expect(newvBUSDBalance.toString()).to.equal(vBUSDBalance.add(1000)); - expect(newBusdHolerBalance.toString()).to.equal(busdHolerBalance.sub(1000)); + it("mint vToken vUSDT", async () => { + const vBUSDBalance = await USDT.balanceOf(vUSDT.address); + const busdHolerBalance = await USDT.balanceOf(await usdtHolder.getAddress()); + + await USDT.connect(usdtHolder).approve(vUSDT.address, parseUnits("2", 18)); + await expect(await vUSDT.connect(usdtHolder).mint(parseUnits("2", 18))).to.emit(vUSDT, "Transfer"); + + const newvBUSDBalance = await USDT.balanceOf(vUSDT.address); + const newBusdHolerBalance = await USDT.balanceOf(await usdtHolder.getAddress()); + + expect(newvBUSDBalance).greaterThan(vBUSDBalance); + expect(newBusdHolerBalance).lessThan(busdHolerBalance); }); it("redeem vToken", async () => { - const vBUSDBalance = (await BUSD.balanceOf(vBUSD.address)).toString(); - const busdHolderBalance = await vBUSD.balanceOf(busdHolder.address); - expect(await vBUSD.connect(busdHolder).redeem(1000)).to.emit(vBUSD, "Redeem"); - - const newVBUSDBalance = (await BUSD.balanceOf(vBUSD.address)).toString(); - const newBusdHolerBalance = (await vBUSD.balanceOf(busdHolder.address)).toString(); - expect(Number(vBUSDBalance)).greaterThan(Number(newVBUSDBalance)); - expect(newBusdHolerBalance).to.equal(busdHolderBalance.sub(1000)); - - const vUSDTBalance = (await USDT.balanceOf(vUSDT.address)).toString(); - const usdtHolderBalance = await vUSDT.balanceOf(usdtHolder.address); - expect(await vUSDT.connect(usdtHolder).redeem(1000)).to.emit(vUSDT, "Redeem"); - const newVUSDTBalance = (await USDT.balanceOf(vUSDT.address)).toString(); - const newUsdtHolerBalance = (await vUSDT.balanceOf(usdtHolder.address)).toString(); - expect(Number(vUSDTBalance)).greaterThan(Number(newVUSDTBalance)); - expect(newUsdtHolerBalance).to.equal(usdtHolderBalance.sub(1000)); + await USDT.connect(usdtHolder).approve(vUSDT.address, 2000); + // await expect(vUSDT.connect(usdtHolder).mint(2000)).to.emit(vUSDT, "Mint"); + + const vUSDTUserBal = await vUSDT.connect(usdtHolder).balanceOf(await usdtHolder.getAddress()); + await expect(await vUSDT.connect(usdtHolder).redeem(2000)).to.emit(vUSDT, "Transfer"); + const newVUSDTUserBal = await vUSDT.connect(usdtHolder).balanceOf(await usdtHolder.getAddress()); + + expect(newVUSDTUserBal).to.equal(vUSDTUserBal.sub(2000)); }); it("borrow vToken", async () => { - const busdUserBal = await BUSD.balanceOf(busdHolder.address); - expect(await vBUSD.connect(busdHolder).borrow(1000)).to.emit(vBUSD, "Borrow"); - expect((await BUSD.balanceOf(busdHolder.address)).toString()).to.equal(busdUserBal.add(1000)); + const busdUserBal = await USDT.balanceOf(await usdtHolder.getAddress()); + + await expect(vUSDT.connect(usdtHolder).borrow(1000)).to.emit(vUSDT, "Borrow"); - const usdtUserBal = await BUSD.balanceOf(usdtHolder.address); - expect(await vBUSD.connect(usdtHolder).borrow(1000)).to.emit(vBUSD, "Borrow"); - expect((await BUSD.balanceOf(usdtHolder.address)).toString()).to.equal(usdtUserBal.add(1000)); + expect((await USDT.balanceOf(await usdtHolder.getAddress())).toString()).to.equal(busdUserBal.add(1000)); }); it("Repay vToken", async () => { - const busdUserBal = await BUSD.balanceOf(busdHolder.address); - expect(await vBUSD.connect(busdHolder).borrow(1000)).to.emit(vBUSD, "Borrow"); - expect((await BUSD.balanceOf(busdHolder.address)).toString()).to.equal(busdUserBal.add(1000)); + await USDT.connect(usdtHolder).approve(vUSDT.address, 2000); + + const busdUserBal = await USDT.balanceOf(await usdtHolder.getAddress()); + await vUSDT.connect(usdtHolder).borrow(1000); + + expect((await USDT.balanceOf(await usdtHolder.getAddress())).toString()).to.greaterThan(busdUserBal); + + await vUSDT.connect(usdtHolder).repayBorrow(1000); - expect(await vBUSD.connect(busdHolder).repayBorrow(1000)).to.emit(vBUSD, "RepayBorrow"); - expect((await BUSD.balanceOf(busdHolder.address)).toString()).to.equal(busdUserBal); + const balanceAfterRepay = await USDT.balanceOf(await usdtHolder.getAddress()); + expect(balanceAfterRepay).to.equal(busdUserBal); }); }); }); From a1d991f909800df6505b9b451d4ca0e291c1ba9f Mon Sep 17 00:00:00 2001 From: Debugger022 Date: Fri, 22 Sep 2023 16:05:14 +0530 Subject: [PATCH 152/153] fix: moved diamond's facets script --- .../Diamond/scripts => script/deploy/comptroller}/diamond.ts | 0 script/deploy/comptroller/facet-cut-params-generator.ts | 2 +- tests/hardhat/Comptroller/Diamond/diamond.ts | 2 +- tests/hardhat/Comptroller/Diamond/scripts/deploy.ts | 2 +- 4 files changed, 3 insertions(+), 3 deletions(-) rename {tests/hardhat/Comptroller/Diamond/scripts => script/deploy/comptroller}/diamond.ts (100%) diff --git a/tests/hardhat/Comptroller/Diamond/scripts/diamond.ts b/script/deploy/comptroller/diamond.ts similarity index 100% rename from tests/hardhat/Comptroller/Diamond/scripts/diamond.ts rename to script/deploy/comptroller/diamond.ts diff --git a/script/deploy/comptroller/facet-cut-params-generator.ts b/script/deploy/comptroller/facet-cut-params-generator.ts index 1cbad2a68..00a1e1c67 100644 --- a/script/deploy/comptroller/facet-cut-params-generator.ts +++ b/script/deploy/comptroller/facet-cut-params-generator.ts @@ -1,7 +1,7 @@ import fs from "fs"; import { ethers } from "hardhat"; -import { FacetCutAction, getSelectors } from "../../../tests/hardhat/Comptroller/Diamond/scripts/diamond"; +import { FacetCutAction, getSelectors } from "./diamond"; /** * This script is used to generate the cut-params which will be used in diamond proxy vip diff --git a/tests/hardhat/Comptroller/Diamond/diamond.ts b/tests/hardhat/Comptroller/Diamond/diamond.ts index 7f14cbef5..29efb2e8f 100644 --- a/tests/hardhat/Comptroller/Diamond/diamond.ts +++ b/tests/hardhat/Comptroller/Diamond/diamond.ts @@ -1,7 +1,7 @@ import { expect } from "chai"; import { ethers } from "hardhat"; -import { FacetCutAction, getSelectors } from "./scripts/diamond"; +import { FacetCutAction, getSelectors } from "../../../../script/deploy/comptroller/diamond"; describe("Comptroller", async () => { let diamond; diff --git a/tests/hardhat/Comptroller/Diamond/scripts/deploy.ts b/tests/hardhat/Comptroller/Diamond/scripts/deploy.ts index 188eb7423..f1a7bcb4d 100644 --- a/tests/hardhat/Comptroller/Diamond/scripts/deploy.ts +++ b/tests/hardhat/Comptroller/Diamond/scripts/deploy.ts @@ -1,8 +1,8 @@ import { impersonateAccount } from "@nomicfoundation/hardhat-network-helpers"; import hre from "hardhat"; +import { FacetCutAction, getSelectors } from "../../../../../script/deploy/comptroller/diamond"; import { Unitroller__factory } from "../../../../../typechain"; -import { FacetCutAction, getSelectors } from "./diamond"; require("dotenv").config(); From 66f90f4564e73993b7885c4bbd15c8d9d7d74437 Mon Sep 17 00:00:00 2001 From: Debugger022 Date: Fri, 22 Sep 2023 18:52:52 +0530 Subject: [PATCH 153/153] feat: diamond proxy implementation of comptroller BREAKING CHANGE: Removal of comptroller.sol --- .yarn/install-state.gz | Bin 1499997 -> 1302223 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/.yarn/install-state.gz b/.yarn/install-state.gz index 525fc484c56f554201b8e114b6102820427ab79a..306236a7efd6cb0ad81289837a37ac9b56fdb04e 100644 GIT binary patch delta 1132778 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

  • -yRhXrAV*e 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 l}(<*;!v#J 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

    xsE0vW}}SbW6>&Fhz?MMSMK&d@ck@%Sxv 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

    3iSd@E5!nZ*$XAv>#RP_rOcMoYFUc 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

    lOzp~c~1vQoOZpF@m*Wu>B$t8UXEzGdqM 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

    P?X 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%0DR#fj^ zAt6!y+PcMqfw!oZqtn8fk*`WY$M?UQaP^ahR#aa(Ay;>OYU|xf)~Jk4qTx~ir}a{k zm1v40uI^v}bG#=QPc_+TXt_mB{eBF)T3e{-Qua$Vdw)~1lxhQO5{+fHxnrx;&CX(8 z=LA#T@;TlVbU>p3*lM_}uTepkWKRl8sl*sFgfNz7eikU;BHhz~R<^FH0ubQ2G-EHA zl8kFWHEy}B7oQRl3Vg|DvA5R9jOwJ3-gy~SgYub%R-p6krta%)q5Swsvm@^f8QMM8 zdz0?k^?%$xGC-tDf=NXt8<=k~<|#{Hf6iPt`@KmAC!FA4�ETTu|Oh1yd7^R<@qV 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

    (_z7mrr-Jbx2GNmNhM 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

    b(4qUx%0QI}T8P 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

    q}x9V{22MlsZ2SmDm_Zn#7mn5JUZa5 zLB6JmjaFqN*V^H5;B&Ik!ECcm9WBX(Ou$YiyRbROAiLMg|9dE^VL91f+Fu0t7~etH6)qMFWYH5oYIpgx@__! z-0TM_pzgubm80DQhU71Q{YRRkNQ7cz*P5D@5~3`TcF+|$kaSze1WCYbc_)99Vxv48 zq#;~eP;rE`h{$dxE?K0Jnv)D`U^CV1G@?3A!XlmSLy@l>_2W*-N9}^UU;YL?#eZ>6 z^^jUTQtNvwj?{bB$pge;T}WfA~q%Ur&QHu7kQT^J-;O&hbe`KAWOD)N?O8RKIoTOAT0xWsDDz3GW4m5C5J{UWm;U((H}_Fzj3hD%^-dx|R<+6_bXno~W}$6iN+OnU9#qT{ zRK>6M$xW6{1bw1jd#rgS$(gBcp>b%SB?6q)A%8A_z}UVdnJ3@Lpwrx;u9U3;*(>$* z?|$}ly!f=e8dru__a3(!0>A#PEAGdy-=Bl$H$5ld2{O}^w~#s$b7;i5-DR;5lwop< zoopC47>-R+WpB2OE+u`eQPN*bYHN_lG%WvS#HG(()Y6e7pq%^;bXVbOD|X8vCP!Twp49khOTUAj+(xx{g^ko3`Q=&w1 zE=XBtrVCJd>O4Xxa2uxTYm?)SA;4@e;|c)wR+rv6p#LQg>tnX*!;hY{&n3I|;s@)x z1Le*mc;le??HbwmE^1^CWiqxh5gsr&0e>qoR6=g_5_qs|SG!d#EYmvWE*O`L$s~J` zUC+I{t=9cTKARGj1K>oRsHmP9J{MK+In^R5VH02oKW14ylt7(!xAQzL+PK9SFE;j!H~XOP#DI%M@b+Tgp_AD5lkSh=1i- zQe5D#rRo9dI$q7d`wM8Y>*O;p8|?Y~%?aK6A|@(x)V+5f>K*B7up))>q7WlVR0Q_?*Y640p3=yaqp*>zF7`O z0pFJfS`Jo!GtGg2ML&4*`KzbTu9o1vhw=~5Qd&JC% z0sN(@))*6bBUnZUwtmPyFQ~;w`?K)1?@qNta!2j87q%hMWX8Zw%$n4`LQzc=LszvSMamF9ZbR*oe?HiFxKhfZQ8Qp!V2p4M%vzF-(x!w3?E?0K2}Y^l~q@3XsYF|2{2CJv);%>tCx0EbpsRAu@iLo z>6RsEPG|+3N5?fkZG!K8@N(YGcYd7n!TDT&{qv7+O{Wb`_MUqHw5x;~_ikR+^^%lT z?}^R`3gCBcxB6Dn^EXLFY7N zkW&;__F&05k_r*JS1==}ksZ(f`_WbKIC$zgi0iW4QlFqy!gM%7m?jtydkQIB4x&;k zd^6X7(i2MtSxdG1@HSo<@*~@S49Lpt2LV$%B{V%QKFgJt@4X-A=4AfLj}z{V3AMz@ z9p%YX$c#>MNnX}1Ix<{3KjCL^2di5P-IM3mBGj|GW&C84rG8c0)Na-x3Sr2OBsv8*FNgG}@&^8FAUCfI57aSORpHehHOdc4sLym<_o|RjfT8Ak5-8oJYrF$L}HE7J4?tI5*dpi3aFXcVlXWN<^YG zr}vIrMxZR}nMvn;dGE(L_ws+~j?7ht^r?i{R2%DbHq1Ol?Jk&qhb{_xBXbfk`_a{{ zuA&5|@gTFLGvUn8do>ny?art~ylIRFXn; zSvWMqL#<3}q&w#VIjDIsMu+2U`0FZVSwix zFRG++ah{qNlcYOHLBDjHm-Ar`QGf3II5(mHw?AnQ^OJT9Wx)I)nNpI00Muqh;B|jP z6p_wynQ{oUZLoc9llOqgy|$*2cDD;Dgzh#gZm>@66tw}+2DPpB4%nBpq|W8z!Cs3* z1a&jEuN{iT5>)d-o{Q0W0i=PzMdyiCoqCnchUbL;WFALo4d^3#|1Vh&J$ zW*)zNankI3ywI7ipl`j%N#3g`O z?jdNn8BxNf9I7A1%Xe}TI$+l{kr~-|5375xI6?1*rAw+QX6R~Mezutn>dD5HID6H0 zYzS=`j+fMgE@^zJqN*6OK;Dwh!y*}fT3rp(lmgj;8|Zo^>Z~>AUQLi^4lq$hMw7Q4 z40JY14ndyTgip4Z^h0#w1F7tpeYm$AP|_D_bRYcYBdV5M)2E+5fBNc2ub0iQzW)Br zYqxuk<&Cc6aPlq*?*#g>Yyn5z$#G>Ery@7_IuE?2IupUCGs=L$&S5OfEyz-TMjw6^ z(zaI~-UGZwzGe5!Bu&adoIlWP^5C6JCXdOax^;M^)|%PWF+*5|X`SJ~oge31t@V11 z{P5|^r>auu&w0L|(OzPM+F!bis=72OtUg}uUmWaz{;`XIy!qpQ z=Fj}`OMdgOzxuB#`sZITSopGIq!U(<&QaY)ebq8Xgnf8JQ01}dkod_Cm?+(M$LnECH1F}?n`C)%SlYG#=6i9ytr3o4A7Z0eLjL* zo;P8TLy(=GJVJ}aHIo{Dv4{m~1s=1rd?aLB-Qil2o!nEl3`TPXOp{B~@_FpmEQo+b z#$2qZmQ-chLuT<1xh9PpnL&mEi5MwGe_l7=`J}ykvY)jpb?$o)+s~_|Sr2lC{X{g%X*Mb%GEOOX?+cxCx)I%ISxoK6@ ztTqz3mmH3*OUfiiE%ELQzsftW3c|AIuVpe_*pY{(7(|ah+P=;?*xJN-y|^xW8m!WX z63O!X-EouLRbsp$o+T7px@`4Wtzs^Y{6!Rm5Wy;z4!Tt@WXa`nNej8jIrL0mUcPwt z$ql))dym=;S;zE$Rvq}`*Iylk8tsR}45E z>&|dazO~?;dg#US#tDpNogS-!NLIvS$XS8~AkJR5PFS zuWFeH5pyyEw%tf@KRVxi1S?E`l=pfSRs;t{1?o%86-wCmp~Ye|Y(s6OI{pdYtB)1H2{D7hz?IUyLl*w~3nug0Z%X6g`N84Z$BDgyDXSZm)2+wNPp$;&{Ig!dNPFG6;+Jx zs`kgp(x?@hv88bbSKwh-PcF!rI+W&Dg#-a$BE3yew{4zviUvIDh*-Izkrd%R91(DFFJ-vK_4P&88ycY}wQmNgOA>%6b^fwqNP;cYSoU z3WTcVMfioNb%_-RdB!uPsj&sY)dbTvti(GQs_k_o2RR_6LzCF1rSs`(0D4O?Xs_L} zV@_rny32=Y3|m$5O<00VHWn~Aa59$?oN1T8`)Ey`#(y`me=+>+^5k3#10XX%WHtye z%18x%vXWK=$+YmN5|B`;@Y@&>dsg$Y||z|veXJmq>jtqtEWgXGx?Is$#ThE74BPP zk?s#uX*K4i3fD_)qp141p+%r$SHt_2SPOe5dT{WF?bt&qlUz1v-x^)mE}`kHwl5IL zR6YIC#1051_KwTncg%>_1q(}@?QA7Ky;kwe_Y@x1A&j_GQvvisad4~p;CUr`Y6zSm1pv59n@dd z5^Su}C{M})RQV9elF(dI&a;uWQ{O9Ya$ z9@&TGd8qjiiqw;mKtg0Y8|4t+ppX1dUq$}JH4xv-WKboRslxT#b+17ffAbAW%|H1z z>2;6GKd6;8hrHdhB?IWFs>5snL23v9b9Ao{rDE7FXJsADCcy!|t1va96w9kzG(vE4 zH3i+3$Yvx8N>P^RJK3oj@WalI34Aq@mGegC`*k~_??3d>_y3ANUkduccRqVquUCcg9b)KO{#SYp!YXAd#h@7Td-J$dTe>_AY`M4y(ClDdX zC8`}jUQr;Sp|c4B&`~i})#e0Zk#KhBZ^Uq{yc6XL>Sj9H(5Gul5JiPiT`f=&G!qyp z3&8(|sC;+4{OrZ6A>#MCx9;VO&mYEm@@f0*$;;0_`|QQT6}i3lP~Ir6DQ~scKYsny z$!#P1R8pkm06^KWf4w+B?2vNe&#r9sOmwr6z`_(Q$?Nio$WBS-l+{QB)b~6BXjCm2 z>M}C&9|w&YZ(%;E0Lj}{u_ zOB2M)JQD_F0Ft_~&=CX+26zbRh|2Yf*<|`4I|+i8u7u@af4d}5J(666yoxO($zBt` z4d9xjZg61Kb05(?HRFO(QJY*!6f9~%1qpw~b*NyG@e8O5; zPuj!BS67Vpe;&dc&86|AFA?9#2DmrX{6<3Sol0ognpU=3cBV@nbEPhwRRe}gV(6l( ze#4<8)FslmVD|EcNV@9}c~xoH2IOhn|9HbZve|;I9BrpLUNk@5k5AkR6<_0)M z73DE&W=mYOktLMbW~uFH=9N&WQMcDOJ9=toBq1AjG%(#d=g?#TRW z_eHe`vY8Jl3)8i@n1k&Y@MeQigQyfRxBP1(|JHrq+!AesKDZ?f=@v&)heSB;z#+K0 zw$2PDe>81L1G5sKF8|m^?@+$}gJ1u>ho`TUwI6;kU;N(l5B}0aQRwY&{um4~FJ5;m z#^t3WY7=^mGD?#!zu>(C%(3uSP%T7@5Z?l@CPOz>R?9wau?~G=MH!X+uI8aUUSgWM zaDyP1$sUk94M?@J6hI~X@gb&N&WHM|S=}`Pe|ff8e{@n6VqH3-UiXp^CP_j~Swhe- zCM`B8@u;Uu+T%qvN$^Fe99W{3EuBZmZj{?5S$Bd?b;>6;O#+v=ya)9XPF0xztv>JT zuA#d2&AIQGUA1$wukBCT(S7UnH{QD|Bz6CQ-?U-KZN=#JzxA54bi1A4Y=<;vwk>>c ze}RKcRu#1q`y%k@;tfCqzEXvWPU}IO45ITY{ntIST(KZWav29+s+Oy&TUOAy7Jt6! zuF=;WGU-D?-9I@ zK{30W1)3pj>Y&z2W}m&y(t|M-!gzHy8BL+KWCXa%V8on;@ge?)}X zux!tsbl4a3RPK-3q$L`h*1}85W1e_&}|3A zTfW{2^bZxTEH@cC>HPOfy5PQ#bFQ7(FQ2U6fA!FAOet7MmoGFVY??ql^tack*|G zUa^vjpG$XkGD=;cgTj~|!an3AOsEHF9{hJ@TpYdJiKT=)mwG^DTIV4w;G-=oAgg6Y zmQ;-g8>SO7K_ocdq`p^T1uDY-h;O`6p8L>u;?boDn`pY#tm z$TGVp@k{R`jzi9FIi@zN_$Nn+^LBLxkO$S4qVw}i7$Udiqb3k+e^H4U0lsk*YkK(z z%aH2ol(yj~j*B)AaHT0$3 zO40-0G_5UiBUct68IGxMV+J|8cR{pT)+s=LZvYS>bf4(yPHXPoBX`3r`z^7l zUw-`htAj)$IB7?BGk1Aj8&IQ44f)F+RDDD)>DFC zGN4XxnV~M(9sOHmGnI}lRkwN)gDJY(R^7|01ITC?pmF)9j?4DWrw4f_Qk1NtOnB;%tJA%c+VMbcx@ZrJABqjB=~ebG>YKRyGe<#+JKEk< zfRy+EUb?5Qe|gJlk6j*4I?Q(JA2!SyY<@{3T|Uc#@t(JW<$B-LQ#-b9GwO~+dY3b3 zAX+w@PIH*JS(~b#0QK^QQ;C3QsbBut<3I=EHim`U0XG95a7sTEf}LbhQdVjZy`25Z z^7*M#f|^T)msJ(WOpNFf?|rBb8}bS{m#qz$)~?(Pf3;jqwpts&(`rDP@>Z7cq{Lg( z<)8Z+Qm`L9VaO_ZQiE9zQo~eZv&vuqG%W0;&OCrXonx}Bw@OxpuG!oy%7mR|> zPP#j7S2xAqdH!NQefH{x$MKzq?WU`?Ik{@ThsC}{wvVd6GAa_xd_?tuE#)pbdISKL z1KdmLa(bEcK}CI*H#HN;_S#1go6Whg4y<%lf7E7|wlr+PS~_$GWkG1A!sm+nB)e{s_enzfRJ49b*8uXQHXAI6HwOFzmzT`z>tn|EXUoG_oxmo-2FMU(Z^oOvT>D|MaT-ZkvDQ`OxtQhJAJn64v(~v>PDC zoO(#!jh8?p=rQD)i3aeBJd4*Ie|KTzq1&XuaR`OG5y{?azGa>y-4)ehPV~(&IW_u` z%1zc!5q2&fzBsIfT9A*&mPOcuGN z>K?y9WYStNn{sH-ot8X7A@U}xK@qL`9~pF3Oi@2`$z+yg)uUi{B%R1dys8$zkT=J1 zN$PZ<+zd;{LIQ?8lv3i-1%dQg6vYTJTgqw1EoCGAi>0Ujit2nhL#f|=NhrMXZMpN9 z-K?u|r@ET2yyD-bVfgEDfBdd2!;gQyzThVesqH}B)H)}wt_E2~5sR3iIzekdtW=6$ zy2b`;s@Z`JmDExvsSX`YK+QIgDgf~Uz_uFIYug0IVUj@3-n&Wu>+0SoM5+!$Cz8Ou zv(e}TQY3z0B;4D6qFho%W(RPIZfOAkxVol1R z=WFKp^4ZgVUTgOrvm1_}HoSea|M-pfZnZ(2BSTX7NT6AQe|-S?mS}VioVqh!xO}LX z=(xfuvfVaA9wW>tKebErOn1jw!m#9wI@8esB0(rK)fXuYt{=c4%a*8LA39E8G34`V zgKdd73<-SC26+es5M2zAaOg}GAO(eLDY@pp>G+p%;Jf42kG}b zN3~h~K?Rmef4J~ENtL8KjD)Prs|QK<8}s90?oZm&=bD%|7HMBd-d&~IJCESaIA>3B z?p>T(q`uoG*cN^U9PXO#TBc}Yf|p8qrE#nauSTwv65UK252FJ zoBe-4hEjR%aa`oDTyT38vgLVXZNSP+UVUd)jjwV=)Qj@1Y)|SdRxc9%|6E=taMbJ5QEet>2y2kO)%r~AN|hvzxB?!rG>4HAcwOM+C_gJBJ58XUwZM&8J0Mj86{hDdJB;JBw`nv;%%xVj|G*;DK_QYRNmC6W_!)5wQbPN+=w`OH$iU=?Vie=-f3w@Pxtc}C6?!_#O$186xYLuDGe zMOv)HLx}W{IX1yPN>*>CnRkwWU8k2P%1jv<6R_k zw4gelmKsqzC_e8tL5f9+Fn$sl39xG&@>J}b3Gc|Us+s+~{eEq{c=qDq35%08ebq>H z@3FgSQf5ykW$&c0a~Esi?%PXz-H!2S#o_#FxjAxi0EMd?s;PUC#F=FT(Blg7os+rC zkcP01=}DJBcp{#TaQtA#>L_vte`Uw)D*cBjGRF2YZL;T^)Z;Jz#@BGdW9n!`0!O&m znf#yX6u)JEs~<@|ql?csS$CvGQ2k8m0Z(eD&nlw`^SJb8#^t0CtPV{i4^dRCQJJ_2 z17R+wo6un&9cyLkqv@#G_p`5xOl`qqMgUazo+C=1n|JQ52M=;E;7qUkf0`g~2KC}Q znJN-q;1ViWh%9W_EB}D%NQ#?h4=Iso20JP*11YIvN`|UVq~qpio=2Hshuon zpQIf_Az3gLD>a$g%^|D$e-z`+*&Y%KjUBeP8bYJ$MwT=RXHx=ZesumOpdc$b&d$Baq``8b}B;8`}YWEQ;3DhpDd9Xv~$ zAxn=zj~oQ5TZyo@SVB-qxf8(=Hj_`Sm&)0>L}EY`g6;Bo0=$E-f0J65;A*lp>fmSx z&1?HmnQTq9FDnQzS=lsHXu@1_j7l+hH*zV0chcTF?tWD$Y*ZAH)JGJ?(7mVY)ei|` zkOp`KQ18rd074AD&$ucinsNZmOc$lPcQ#bO7-IPnMh9S8 zi9qk7PV8j0tw9Bp+`ry$(m<*P^le`e!5??+Mxib+-H9Rvqx z|M|4_)2HL%#gl!*sQumpcjFYopH3m(OQUvjbFeF^q>p%82OO)Yav`&&_GUyhpJ0E< zxFqXBP|s?ou`~R zuiBIkIYc9;fA$V5M&9p+gx{LPTkq$wYKSlgbV$8SDfxqq^L|H)^}@6+GEs?Waj@ZG4D zHK$tHcc2A%l&LI}Wb6%TV6TKODG)Dv<)Ttpcx6>Fe?SXKh+Ixc>OHq!=gigH+~tBO z=_^uuS6x(=tz-tekE|%5I`mqAY0Ym###6OB_yM@djw85S{_U>;cawNj0IZtAMv$;l zwkuZGtluk zr}|}Vkqc?$>6%mxRFZfEL{+fH44jJ6vg-zpSCjPnSn(uSNmE0E;E4XLd;PtSpS|eq z*^~M7;p))$-XnJ-+}cyPeK+SlDzug`n$A?lf9e6iMM7K>nFa3Vy64e|>xa>OoiWNE zrGtx&5O-x;HU8)3ySV&2U&Fc& z#3iWB)ah<5GMdaPX;(jUFI_j0leLqjCnFc0=yd~DX9!z8OMV>wEI}ZE&^%ge&PHRU ze{~21a8-40x*M~HzTI(V0(1*f{Lf~udafv71o>0oo|F+fR4cSu;#8x73Spu8UOf@= z_~>BPEJKDmcQsYjGpP+8ZtMOm@538n!Sr=&OupH1uGjX~6p@$ZxMf5T6&kjI?|^F|8rZ0>s?( z2BqAx(UNOz8FDIz1j-3JjeYrdkDG@wr{TR4n@^cuZ3^UnLeQZPB>9Fa94GPGf0B36 z`J2_zjm&agf!8!u?-8Zca}Df_f*9%$)Od&5T-Q1w8tHaLR(Kxv%3yjaYrXt?dJ1`Ar6B_(>${ysx}{Uz?aTIN1;q(O zH7uFwH0kv55l8Xz6llB;EWh|224fJcZ1W5OnFMi2W%S^SKQvB)m2Z!CM_*ExUXwhs zGI{3m?;m3U3mX8PoJVIkMA&%<_9$DJXJ=s~sAg9i@LqcYgLESSW>7+cf7nXDkt_%K zBblrN_(^4*F?T~Z*76?&2qjAz%M1871|U%W8BTR=SJEzbewmV(Pyt- zeEiTp`{YNr?1rSC34jb8PL;AM)p)pVW#l`Kq5v~Us}eRLsY~3_G2cMsTs!F_1ldFv zBa?R3kXI`qEC>?cy0;HOwdJXaYo} zK-$&8v)G`Zm_?S{hYOyLGxp^_I5c9}qzpb=JM}pSu%-ZhK!LwB!sya@u76N)>FmS=n&BWIrpoXzO~F zG*xxoWG5wDHZhohnA+8Bd16bxa2h)X?+_4ja>p~Fh3pejPd`m_g+nwXW4aM0K_zAAP5jZMkw^6 z2RtblQH|rxs3(F?_yl^sh+}&SQ`6N^RSjUo7fB)Sz4sqNHYA0-Cn=Hg-g~c*ck6eu zyJz~|tO`<-&D%pZKz|MwDsWD#ZO_;xWy8KPh?%b$YWvEJ;lk?v3F}+v_Zj2ctR87=#m|@uF(Oa9^CZmWk*L(Xm8Lp3se+ z*3}i$Z9c#6uv3LLqev zBv6-vQ`0<7yrOKVee1^%JW3o$9B1#;+a+N90umRFI?7ibWXQU}NHNwoeP=18Va^AJn(%J*Ph4I-TG9ao)Xq zmF8Z*X&=3LY=T9oB3A|i(==$$rM0FN3IH`lw0}y(pmYnr)7Irejh4K=(CX&ipd`xa zl;#79?Ocv~Ax%@8jVQ}$$Hy^K6E?;qMt{&B1#r5^T@+~9Z=2wN)k7($)g^tp;#hE5 zYh=zuGyM`@En>YQqJkHhn?LB6% zL&JLr_H7ef1xB>a7FVShSD}HWx2@e^cz;!G0tI4Tt*9x&o=4F~pd^WEyr9QD$elAbQ7G-YKE_DbkjgmcYzn6s>r$pIGFk?l1>GyMGW? zi%ILkDRlryV!#c-P-q*Qc-<}vU8nMDzHN53q-aVbdE=~u)}vyF(RR_Z#CrOS@hFK^ zPo=R*?ie66lRYN6A_jU1ya*E2Ne0^w(F>(MfkVxOsJSg%?ho|4#HcYk2vkG?BW%3Z zguD0SymNMcPG5e!UcGt#Xa*KAr+m9n?(Bp>eOR$b+e$Ovmg$l(p28+xywQa7DG7Yd_u9(iI%(4 zNj}m9cnyjh6vX^Qc=WqUEQ*}moVx27zW3w2bB0e1#O>6ga)eDu)hyZ;`=si7d)grC z;*hOi6r(jpmpqgX8GoPT*1;8;QM4)D?{;M5v0sf`CkXWqp=$w;w@t0~HwwJxK(|(} ze3k%X82$u9Ogjq7VQLSRt?wFY9%{qvFIKW(LCqIO84OGXPleZoVmK_})j;gj zqP2M9M@2Zrih*@yMZ<}50^fyDEv{Z$EJ!O|iIa1gVLYBx4o@5H2mMy?9DRu%G$H0S zPd%tOju9j1R1bdz6O4O5&O4XOFSY*qbbn1f`)u7jrg18=>du#Bx`W(5*6eU5kV9&;ii>icbiL#ja#=>g=#rL-NIF3 zA9lHY4!c&T-U&SdGnX>?TZ7#WeWpQU2$I3hos+Vmux^CW#AXnRon~+iuoh)gV|1kv z7Z4|-duof~*x*HftHx4r&Y_MJsMKa+IuB|5#wSZCN_(OUnmOE=3?@{UzxRW$!0F!C zhmBwEVI%6ku`S#Rr!syx9dXp{OW(>!AUk8d6WI~u6NKCfjJeL!mZ=2g^l3xT zF}{_`;;g*9MzE|6A>Mj*ldC|Mwo5l=m8rina?{9c4Olg&iht=;nu%i|Qc~c{_)-MI zGI(BTv+*o84SlvyoJd~NGAl?L3EU3~!*3d>zT%?w<0?ZVUMK9u?v;yJEK9NzL96?Q?UVpU@#q%2XKpx8}DR|U6Dn~gY z;yVmGEW(wB)_o0&Ad5br6r=U1e9@wIj8mEs2K*G6aVQPJ@XAKl zXW4gtoOjOdH$Pf$e(U9{?>!co6QqyRE8_sL9_wM`dPI)(1|^D)31GQG(V-3W0(4A; zVx^WbYAkgGurjTw6MZ{mAGT99LrT`i}Opa?$dAJ2IKbAnp=Kj^wKN>^WD%M_?q4wh?4fm*s!QnK#w5E>DG2Ppd6@zEJ5?5Oa+nN(I zWbib{{;Whaq(uV7YDF6-E}YsgLm*ZNM$vaF_2JQZYP|Q1Q5>_p^_c12HN!u-CCrbP zS(*+ZRNBmQj5&uggcVXUY+&WOZqve~!6m0`f*If`{?Vuy1jc+vYkGpF<~a(8;jK&} zyMjA>3`MaRMHDv*q6_m4k`+Few=sbh~HZM zv6lmz4o`pErnU=*`sir)HPnPT;Smn4F_8(*3ox+o61H51_DZWv#r>Ir3D*Mz~fsGHw z+5;zWmlvH5C4b*8s2MKpW9724HU&UJ_2aes@HSRz#UJU0V#0&dq)ok%M zuT)F3IOgF#x5m=e(9uFVJCrdXDH;V0o0tjSQB)V{(JfHCDK2MjhmX|>nxVN+;1ayk zJ6|{Tx7R=TXgqth-n_b5_xB#TM?0DQRVTB5f_0yQo_`|&R0axFb2RQwz4A&G>=egF zb+r%V$@HdcWnUvzJ&1VZfjk%$7hP}D1$Z4|nnBb!W8RKNss@EBv4Yx+&!cMGrdXjq z3Msi=FaPkDu6<&99V^d$z{j_#yqL$NiE1-$33YU~1 z;FfW^>=yQjFiepufpyH?3>2*BZ_p)N@T>Ovmr$M#7y;XtX`T)~7H)*vStif+dPF+t z-UIiDcH$TN_S_Sfy`BzH0wa%?5T6cJ4)^0cY7qNP4cE&lYW~=lbDs`Lf2C}tm;DUd z|J3h3h~9*Nour)z72?C_IT$SHk$O%mMMBV9G+-&}(-K1U3IEUPkg$y%NCg-Xr%-a! zPRF2=OG=Kgxq8B&J!w6jiazWh!_R?W+3@tvzm!R4+*TNI9i-Q4u#XtO<^uu?1`77Ui`7x2Gz4$YJ?@#^8FaDmh zlz;W{f7XY5fwf?zh16H+dJmDzGP_9F6fPAz_EAJxX~1m}wunAMe_JSw3qpwfDbZ-) zFo)Et&0%c)l133DC2eCNujn{JB+4OyevI$7D2V<~x96lITo;8!tBhokp59B_z(*9y zDU2&Y6TEihu-IX=Fm2CCXgF#r^b%401RX4FyLX~Gj;ap35Ft}U^;ByOw9`wU#`$el zN1vHxq}^LZaJLmmf4a7SXutjZPf&mnV&D#xg!`igIho zoGl7QM65$CEGxGl+$^pgan(yz=ymC}Jl0oZY^oazQWy@e0ntW8Dg)PPRvf2bew+!V ztLXhWvCc=ICUPfk&E@z1+S9|gy$iFFQ#3QB<1fA8H9F>umU2b zK8dm@^`UmgVKrA*KRlxT2G+F{dh-+SbKbmjjEto;1GbMM<9Q6u}=&%W~n zB1}22j3bMJd$qVMpbJkvPh2@6kFC^H1!a@IaGFI7MA{V9pA|71Hzq9xQAq^hk-*`- z=skNP*by^*EFy8*3x7S9g@Z$hSaJlq7Hquyqvyg-I5K&NeLb!od-u^e?^WE|saM31 zmMH-&;fe+;yBS1k_bd@v-@JUb+w0SM@b-)8 z>V*Dc(1&aUvGicUQNmw*gvc~uQ_Y(7=j>Nc%PD6>mB^gSfL2ZPM(;7Sz>N0F(fF>e z(dn}AAr}!&2rfE~O|6?jACmKr?ULd{y1JM~B_7Q2^grb|8E*7}Aeco2Kqs>G5}dYVGlx&tE^+(s=g0^@E!zd+!l^#6vQC;c)2T>#v-^ zF4o4KN$7DXQ{vtmE!_aEmhtJ>nUzx6xr;;!?H8;3!nuP2H8C6iE__^v{!Mg$&FYUW z{8*Faszu7{NRj{b-Y|HxL#A;D~_uOx70XOX$tz38||X2R(uvqfMZBEeKY&!)~V2{dpgdj!`2_kTwWg}sE6V1 znbUO3Nl!+abzwWD6nh#>OmV5h{4IjEu?TI78&H$2`Qmy?Z>P|>`tpj3rHTs)4>5gq zjAL_peFVS0|MEAUKYO)dK3q3?()S*@n{{8V^rXvE=t+MGrjcTIdTDNZi>6W=d2md8 zc1?7vhJpNMY109hC!JakP^)wyb+^u;EN%d{wHO=1T|sG8=%eag%J1S`gI<Els zUZ_xON{D}?sK}+nrzNzNvKs`3rX&jToj6sNXmzi7>^X`IO zUCBqFA+r@n;11Vf!dJ@WpEwqheToh&j~V08C>CYLbC5tKUesTu=rv=Dq#QTISM{)p zT|z1o?@q;mdhU#za!V8&D5<9-1S{lmOvAK*YSs@HWhZ~dkuh+L8W{M6EOvi=I)CTK z`CR_{^L6@hd-Zy~`m9Lg)2|+Bx@k6RJyHjym_Bn{Wz@Wyr^CA!5x8WJ?tNXmi1fsB z8I-D0K$$C7T;)A7*yp4&13!{}M6jFgt6d7J`U_K(wu&j20j#^$!X**H)RCTBBYc=d2(0k}FL@v3X9akK zG&B#&RUG+*8sip}(koSGOY18~4z`=dGEy?G1*esK9gpt(IM?UrR?d#>AJVFeZQ&g^W7ZF$CH3#7l5k`HKp%bNa$2D8>OJlN>Y{c0*zJ#KX+SYz^ znJld0lNkRBR>4|0B4VPbgo4d0^4r^RM_D&DRb7BY`H8Z6U z^&4Z7tOP3RTd4vG+N|sHPaipIN1gH@xH@6!J(~sO1iT^g9ML1(9v6rbDA+zkbVniD$uH0PIp=8Og1+{k}A z6jQAY8WDXXuTA5HuT9`h+ss!j8Ln?|tgH0B2!diT{pt0!LZBmIRHdfLCFf3QpF&X@ zG|aJYHawhm6-x5?T>fffrG5Elc?x}0psSx7O3gZQ^TQ=^rllR6IWBN3uZ|Z+^(0;V z%Tg|Z9kaSVic1(RLW%^mqDNPJ*G_+4>(s+JY+;YBfYq2pMADsjd`HY(yRrGpKX*=~ zH8e2~%rly)dOuBo(@Ks+hhB?MXqFT_B}$8WL^KV?h(nu38M1qj0GovN<~TT;jkO0& zSP+!o+PqrfrE!vleIVAFp<_lD88II&|NL1OHXs4*%W=gcevGBHAjBT^reS~jOa;KG z$N4T5?GuOdU~Vl|Q2>wZ{Hg*`k!YqF(9}1*E4J&35_yuqoK~cZBzTv!oD-F;af)R4 zcKH|1PNnQ5QGZ9LE;TV@TdRo^@-CQWf{u2>U#%nNPr*mge;4Z{D6A+{@t{LeBRwTM ziM9xibhq?(OWHvjS|M6H9G!obpUS2*5meUtxOBl974PUcN^_1A4i9)W4j;5{cI9M1{%c9q>PY;(vJG=J#zp86cXHOv)I~YL_cUD)4{qh)aQjSi%on zakW}u3`*-TP#NB0Z=r>&6{Yo?gbg|9N6cgiG4{aasB$Zk13}PHnOUiVvprA$kG6_8 zjoLVk_rCm#ADlMDB{HEHF$BtRke^D6U8yGuo#Gun=$m#*C>&~uF&3v>UPL1o?#C%l zZ6n+(9oxu49IUZwTR?>~D?bg4#POQB7J#+apPRxWl}5FCHeP^=J@O-jw^9&k@8 zqVGjH&YL3C;@7FCRRW>Jlakn-m4ZqNl*~nQ+M^VKUn$pb&qh+^H3%hg+=l%fEDC{t_8dQI7iiUAhF`5f*J@k+cWo)59 z98pA^x)!LAYoHq-ClSv2K*YA-k5Fk2TvXVxE`RVm#TIDMV@`!2%Uxx$8xkrI6O$NC zrJtU&U__#OD8O*#}C>5MAM z3?5?dE`NXMgGajvNRd?0YXU8;qau+*aLrqT@Q)*2h`cV0zVqWeT4VRK-)*nv zciWrCn%`RL+6dH=RTkAqSg-a658f{R4S_v(B0_&%LF=^51j7`CnHE310Pmjyd&>2q z{Txcv`G7sTqLmhNK=w^cLoZf1QS0;>Buoo;EmtLW+Hu0wTX_%nG|>`DVxq@ihz941 zT%7krGGR-t5$whEQ;MV7n95xuUvnchIBCwLKN>N@X=yuOiJAv|Km8KaQ^X#pAI2#2 zVN8ESHOMu`yYu5*-z&X+9zC~Hb&EQ!(Ib9yL)fKXsRV;fSL-HVMdkF38=ApireiWGamN!~OIZ zxw$jg11g0HTscuj@vWe0JRA3$OF2$y8D2b$-b4vxT_2tQ%wxBc_a3sF z^GX55_w$dOS3Z3GC6RiH<}refEtumWsM$dnblq_hGAm$ta7wreZ`Ra|FK z8RqA)(40f5XMtuH`tBCXD50Ex_2ABq98O>K1}bk4lXlO&ckac9_t@SSA1i+si3;0@ zW{IQFEE#N|O;)2b;1DH?_+#bP8uc*)nZ6VZ-D-3*dJZW$>=uUAo}{Mdg7&gM#wQo8)>JjEVb4XJL=cn{IIQ5F5Fn2+8tn!M=k z*9&OH%&gp;G%6VIqKl;;pAm@_^zn2IIcy(25oX>ssTKg`w(EvcPX|86&jJDWAAB z2VqLo`giSPZPmkIv>|`4J0Z4q&*B8hX(q&mIJ#D#6^Fx#6Hh&kIGVW?BVn)&`7q(Scaom0@42YghPP5GCib>!2=w*Mg zKBMrcVBHpi-h1dC?O(H3{cB%A4{+_pL^WE(3Sf#Gh#e}b@Ze&&X(OGX#51`= z*l5-*4j@FhMlOG77nHR6(8_Dt^Kfke*6ZtnAGB8=-pYO7dCYFg?QQ;|-uHW-e&Y%3 z-W-Lx$yvSd6wic>XggDaf*eUMj@b$ei<3qTpjGg9bz=G*^fIKARh=O6k>M5@P7UYH z?oY-v({^NR@^78QhYGC|iC%v={rVY$Ql5q+iAyWQ=m`-@ z5kAKb*ea9JK%wAnR_m03_dSKbwRM${!~kfOS_==>Eg+Dq(1Yk989Ba$ZL$97kU3mbO_F1H#5^%((>Zk3-30%NwOhAaxkxt*h@yf6RGIeZeHtQt)OHU>2ndWx}z zN0+B464T13PlyWGHfb9L#o478=3CPr6wXrAa|kiDMdSJk!T{MK;w=Ir((F0Wbeyf2 z>V%yY%9XB%ML=TZJum<6!!fg;S-Iby6Yeasrqq9q997)d01adhw4_A^lhTD2jrQzH zR)EiA^BkxW8TlyK>JyjtE1kk9galEn#Qmu90_TJJd2OdSKEd2`Hs-^aNM z8$bUbqx0<4+&n@yzf5sd!0hKLXEkY z?WPz9dR9{?%XsZi0nA#su`nnshjTf_sg+omHi;RtV$Q9VB9;)!nmEf(dz_P_!Gl#n zqy_ES##P_6frIFdheKdJC!w;-zjvS=nO1)rvtkG@rYHQUz(~I^pDdc7fJrZbq6s%j zsjv-;*Z{J3+W1rxV}V=f#}gYt(!_Tp{Y1NvhtsHXaV!X`|3#@&X$4bX@j+y4F8}@q z-~NRsFB9Ut+#m?PoREsA71MDEq`-wGmJ)=pl=9TVX*!Sq6zIG%N7sHI({c!@IW&I= zMQiY)aE(VqN+f}3v3$WG0yA82m&tvv7!B6p(>0%O+S(M`U<%?=8r>wEqwxzA{CHtv zkGeSw#x(^?1=w>vN5di7)ln#}3tSCjlg1+6*!V7_mPNn0jjf8ZCQi8~wLYHIf)5TR3B9Ke9 z%5ybo6n_$h^{o9;t-kZx;P5fO?9>HOUF4eV)UZSn{1n;5TQ=D1mn>G5vqi6QGD*EQkzr0L_iPuSa;>+U_#bUzIsb&BCCga`yt`{Qd7NoTQ$Q7OFjM)5ZW zQd#uU5IiUp)2vh_kfoGaH?rqG2V2DQOL3ey)eIS)qEv(ug}HwrCRY(C6?#*)ypDF? zSiikSyXhji^O!vXo9q{kVIRJJg4?m8WK;TbTw#Aim7_)i|BUBrm8-8B?gL6BE zwB^LIt7u0n)X;xA*r{2ziYBE9Nsl$BuoKGRAqiA*^$rIUZb(WiJG+UZCk{$m2n3c) zG{g7UdF2+<(=PbUB~iE}HbuE%DpUA+y32ofYJddeH3?J?DI~Uzn9vHALhW^c@8DWI zqb`eTd8(YLhyb`v@q^xS%cNXW;v8%>i+cR>6hv_#?b2pGO1}KZ=XPw{B@{<*0*Wl2DlQ|` z??tmiEjWKG1pR_mhokykW3|P4PK&~DR2pwCLL&VMEup!N5^OC~i6A5VYm_#kazx?| z8O5Sy)}k#}a4?6^FaOCI3%@uR@`#jkdy1M-)SySVwDxK>3i5imU4)DgVqOSLYwwGy zc)Cna^{ZHRR(Ro-4ymX_iCv9lG^dD?YaN}VRH1*5(*}%pRS>yxjN|1$J*!j0Nl)3( zu#pS5#VWjI%oQ{?c&F@GSfxdi#VM^tUe+pbX`KxlvS&jG*5pV%kHwQtF+r%OXlo#{ zHY2VGm3DU_Cq)Akc3N?bJJ-v9_Mrdm@mlHD(WKNggn`-=uSEc>Q^FPwkB&U92vePJ z+OvN_E4b1)>jA;n2Jjzat>L8QIyv8edNcn6RCP0Y&;#ky2-n)IIGCeFaP;b zn4MTnirG=I?{nh#1&-$HOxdsavrr$>YJq~hHA<$P znJt0PjW!td>YG%pVNX5LPSrVYrtf}~%YT3ICAh~O*KGf>0kmZLF)Kw5u8X43c86;Vi?}pMNx_wlAl&17IlO||qZ9A{Pp{b$8UB7>6 z1@8y#lo;I6cBC27n&U+(1~^F@NzWd$UQ5e<9et!QwU7sUP~fsC5oi?z zLEU=pp+uvQAa31I*W3ysMn=GwrUiZ12Rg$wzP-WBg>dN-Z$e^$)(xbMr~o~2M9ak} z^5WjXC;Q8Pb?!={JFPgv@#1@E0at4j7dd;V6sCx{LJ+7t=}l-(!A_`pQA&RjS{xRe zu|-$yLVEus?o;d?s|cQgM)OO9oay{1L0KR3A&1L^uvgvv@?Srcu#|$Ze&3;TRkSs3 zl*o#v2pbHJ(G?Q2=q(zTBAe*^vd9;*c#2dS-(~IASOph?Rw|c8eAYO(d#G@?fR3Ek zxClrj#q+N8e{KTJy!bVzm!PpvAGP#y*W}GK7}2OlFrDO(pbc@f)jteN(oIXg#-G9 z64fxuWoaQOmlSJEuSgMa4kW~*1k^B*MPxl&oXXPD)Cx^stN(uUl~(PukH7cfO-0+C zhwTx}?yinH-P35GPBe`dQsSOaIYdzNX@CX`>_tN!j!(sdfGWWuqVOmt+dNJi1|OzC zw-qKU^ihM|!l+_3u>^npgf^w;Kv#1F&yPsJMmprWqTJ=bJ$OXJ;t<%LockngFm{!v z1iC<#covZ_eQ?3jOEG>~fu49yJGESl$e(~ZzSN>Z*d|ab+4RtqvXz->tkl?o=W*cC zUs5!|G>k)vwlDwP>F2w+~CPNa*Vz1j}hK2DqqekEsZs#gQYnD5(!za|)XCUa+%{ z!b=)z$#+&htT;=G9wsfOhQuVo)y=wWuWRj%=!&wa#u2im^+@S|p8lfNzTyhT9vU#5 zWP^4qZjb`fnh#@eUudYc3nV)&9HVrysk9UeZ;p1Jkwr}f(FL28RuRP=^+@R8D_Jt~ zB<1>U{CBR`&t8A``S+iF@)6%}{l#rD*S$yZ(L+*mbx8UY5lM3(ez%qBM^Zp+2}i!9 zrR%AN8yU0$^6u);o6G%JbSp zHVFt}vM@LZINmPv@;`nF3P8xcZ_zgjb_+%~1qC^eFGg+u8cd#pl<`B`%eBMYAtUmU$Jq@$yl zXV!zcB@9`z9@w_kGtU_m)btm9@0x6M;RK$*p9(Bk!kS!45Vd>T^xnHn>?g5m?RIvZ zayUUbV=&;w;p6G49HGZN&?Hp&5t&;`J-$UP-7%HrMJ==>l0ub8+_`PE^zcV5T126L zN5Zz&SWhATocQDJm?w5H&CD)l#r-CyQRH7fC8aXjol$eYBLwNM;?Lc zv`amu%@cK`tuWd2nR+Nqg}&-#p^!?UwzGmXhJ#E)2^c-`l|HSaH_Q8ows$2eOnuPG zxt`rSKh8U6_gh_|`IGPWN24>H;n=f(An&JLIq7ihiXkWjjG~0woI^;Ob0^2Ln+h0O za|%M3kRAWAv^T!iZfy#Vl%z5TUfl|z;IOS+Vh69Fa0QeN$a^<2{L+nis}bwhg@k{M z77`wT4GvJazAf}4X_*I?^(Q8RP+57x+aeYsMqNX~MZFxe*Qi{GtEc|B7A8V}E+t!Z zj+fG9DwJFgMbXhTcA~ggq%?aD4=cx?!z;7;Z1#0*zW3w2d-r~C31olI#q^jDYZz!x zPwh=$w?Gjxo3WiP*UhbqFjP4jGHp>G6S}~4q4uxzOk=Xx`Vt#6S&3OmNt;*DI}7?9 zqbeF}wOAcZN0F{96mJA1w6d#z-pRhz3|>e?8-{8_gDz{t27a3=ycT+S3Q$XCJ#O3o(I-qhltq(pgWRsFHI&90V|$GJ+e z9ihoY!O_5?HZ4qaj`Gc%Rci!cRP6;kPf>@?9yyLlO-Dz7I7L+C@QOsJ$>MK}6%S=f z=-~~-;_Bq&e*}TmM3%9Ck66Lp_i^4iyFd3%&kUjRti`u+=1j=~oUt#D6WLm2X02P# zNvsHQQMRu}5eH?(Y&w?rMbkuCT*F=`&|-j;`=l(2b~Tr1eQd4exrInN2Y(iEXr-<; z(7$-={{7nJ{*PIg`=>A5(b6o|Wc1!Fl~USkbbF1~2AZ~^HYHYnO4q8A$HemtvC}Rl z)Q1VI&QWaA$gESxqEQp{(aK+FJJun%fduZ1);9_P&AAvJ)RT!V?i=?U5nh4Ix|~bF zC9g3;bZ@$yoxwq!!}OiAGF!J;bBdl&5>gzDS;(&9Z(xuGu3&k=vb-p!->zqUs=~S= zfqST#6DBmI(3MVq+pZRizY*zgAH9D5?Dd-;JaRR4?~!{%Cf$9Z!1dwlC%7!P6tO6+ zX6;Ooja-h9UMUMDLcM0U8}-&9fUE?E#PlkQ^9m%YTVN|rxTB9$!W(Q`qjp47kkuVTc3dTnbJ_WPf z+fxTL1*1`l?KZWlHP#U&$2lb@RH)k)%WyQI0>rp5%6U3eZujyEV}-tHgpOlV=vEZF zF6kDHo^&u)%y29%VEX%UqbY^hqXOMIjKOVHi%$7LoODp_<2Y5U8;{Q&P!H!<1{Suc zvsW|-y21^AGN@Wg!&WQE9P}TeHk24Ur>GpR*8MNM{^aA2U%qBKoKNU9>UC=Dr;DB9Fy&=*QnKDao3SEGGf&+DNbz{ z1mP(&8@q{`wN9r;2n)5yjc$aJ2{pc*luu13VPKDcHBu6+yZp~z#?m)hXxvjim{7RT z#AC%PqqQ|JD^|0E;_ZXwDJrzR#yU_w-AdK8%ukcBc}ln?2TM2gQiNuNRz-l7+iNYh zBJ_$G3ia)Zxkr*kXS>8# zO3WlWW)~_D!}REqb#6RRgb%5O-CC(G{mSQ zx>9JG;K1zyrUu;!ArB?igc9;ZQxTR%g6+(u4XzmdpC#&e)b6`P^0 zqGU>?(L@pE5PiB43i(N}^S$?&JyHdK60fR2o+ij~_@-6r?%)TPsG8n55AAJwQ;YYe+jBQSgBN81uvCKhsScyh4 z{g+`b|H~o&S(!`sbLb8jnVLGsL_CahOztdLC<{VTBJ~;)<`5>mGamGYK zST;_*A28czoJw-X#m(aQEieiOUc7`YgrFL}5qYxW^9SWk+pfZ!U zNj(#@HH<#4k^~e(rrgB?^QSP|NN!n5hAY(FiiaHmX`xU>p24BCkfFmk8JE62d`3a$ zx>+2BQ116LEa)gz7Hvz!>J3*(N*)%|#)<~NQbtA^z^}RDqJPT;#M$-xTwwGSaDr=& z-WY28EG5ki!DOMu#5v-BK->JBiNZ+Qylw>e#+&v1k8irf?>%OZ*4)~wn%k#1*wA?I zf&D2RcuIE!MX#+uwI8v2)?W3tqm^Xn%1{{4pawh5^bbO6ngoloeNedQf@+>FCmeCI zQxIPrZx)MlpQXN!S!hD{xlu@3=jDI~BlW}9GK zEi)^rqMhSJ1x(jM6n69OkUrWEd|ALKEmgq@k3w-0dsO_VZngonjdRrUQmA6JSGour zhRjN_ZpV;fFP*;2c@%5sz{;liM{TP)Hn4&NipSdJTZ;uXc-O;LGS{CS`XucTK^rY9 zu^F53=4^dzEt6D#IH_55Ccs<-Ho47=6k}p1(h(jB=%FblG-d5#s1#I0kEcCVJN0NK z{_kIjmWu!5wEhaHc!!xt5FiWUZB(lYs!_h2=&zY5@Ct_x3e>fRoD<&BLue9QPZ63w zXQ%Hw3arjf3Z0fnhjN}sTGn4^TA$jSM(=_H5ts7OgWN8E|K|ta{<$Z&b9NdPPHJtT z@VbhZDi0&BQH@DlW+iR^szI$25o#smvc2NpQm~`zLfG$!KU#qY>}G@2>mi8864Zhe zR8^R?IH;GQ06(;VdS8>ei{7t~P_UZPJS&Z`{kB-Ec0!vJEhDkbjB|z_S!c*Trm8(R zMKLGx*7~NGal;NKfAgYcl(AoYc98PsRU>5I9HiWP@NPs?GafrXV(a|gr{8!2T7!97 zY7oe&44yKE_s(^4T^Qyuh-Bp+W>oj~Ctlh9M#&m5cf1Yb-b_znUda&5D5TnSS zMRY=_70we3rD0fZY2XygTt7w)_z;WGnB_erR!aisWQ7PNP33w=V|)$Si_e6`8|z)n zzWm>Z)=V)O&GAI@QUFsxtiLP<&p&Hok3MDGgF0t7X;_Y}%c(8(T%947A+G15p$8Qe z$b?S%j{3QytPr-sYkxt0Ucaq*uL?M5&@8XjNGzW|HzlUa|8soG45B6)s^VFBiX?E% zS;$6CpPZAD_tJV1j1mnrZX;yRcn)D%2&pkVK&wMhG-6;jcvY+6KGqDn75h%AVYQu`SYs1ne_%#wNxtwSZq>>?{!kJYpnH0E^~GQ0qB&q!S{NDU`IkX-7I(3cgkVUg>s+T|K zJEs)3MiBYvw7622Eg-}d7KVr7i3sy5Etf*+?HtEQwtpFvFa>}$g>en-8RQ;jt7AQ64cN~R}hHjR<+G#A#~>)+g(-}`YMjp(0x})_44PQ74G8X zIslYhLoCY9+Jh@;pqk(*HlQY8SGvX82!GL0DSs-GNDrS~s|xmMyu78`-d3d%t$W1; z8pefZ=j24dD^zu%Af*R-!L>9}Qv9^7U;e-s(1dBNMc^dlu{vU5l++2;CJMWv&w$OgkW11!KsaTlVo8riQAG(1 zbOWvxy_Z184kUjQUeg8-IC0R;5*8F%RC5UATT?vnf7jdUGh$vzEhjZ>)TYouXaswF6nw;yHM@dZ zmPqQvc%}{P8av@FC?-V|$eM!exkU;Z^p>eVzx)L}MPG>?Kq31oZm1xH z1$~^wUbu*V&#j>)Bt+QloE#qNMHSAdIMV|N=5dmva1)edG%{L5NLS9wU&2#}rZ^1v zILXnIM4XScTULN-cubsnK*$T<1#vBXFA7>l&Kh?xjoxRW5XVKA_`DVQ^7Mu@EFw<5)8 zy9Pa%-^vaaf4ltU-+B6!-7xZA9$Qvnc!g7C96_qVJ-KV=%&K?Fqcs#p>kain#C;GE z^6UdzfLIMqnTC$Vu)J7`!HRUz!8~cL*KRHoH*uWIA}R}nA!X$2l)VMx(3Drm$+0$4 zT*1DY(ig2atz>BE)*yLNC(2+I&A61XFi|aLy@O(Yf1%0FOs!_>(I!T`oTaA-K;xQ3 zbD1zg-RIJW{^&gS9Oe2BX1)3Dvk%+rXRj8ePwS@Y>E6S4b8cbYckjC&QS5#1({KFv zNm~&@+X<&iitgPxS51Wd3^+%TCN>WCD4pOSRQXXc?MS^W|6q)&HBI^7aGY2Ql`ZPw zr`dv~e-0T?`jESrx$+Xq#Mt}}8x@VZ$l>L$IH90xD(CX2+zc~3vDm3p5~!k8WHPi` zXB>bCty@e;@Eiin&9UNt4L~+8cn&%e2~OA#AW*42c2K>DGJ1>n!y7#6yb%}gNG|5u z_vNqTDewSS0Me6DkB;8L3J#@38x01n7QFZbGQ%Cyz-JsY*@b?H#fDdNvb0JU6)vf1MDbFxl%&KehB&b#L?_!KDPWX7MLa2K zf1fo?;fu>({hfz;IL!nH)1#x5kP`${)DvBVDDI@8RlY&C6>pz};w*lMoE^484Xd&} z_U0UZ(I2nX9aavYC{G0SuvY50kM6a`LJTLSLc6qcVO;*2?>wC0D9tCDrjsH=7W2_0 zA%+))XvCH@cgDDcVTq&DM{89Xu>?g~f78gzx$5J%;z&Fo_H}|F;?S5$>hn&~pR%Ch zxSLwvS{`$p4p7ac4VS<6qzGjuxCFvy6sEgRh)>ppFirA4juM>o8f3|C2IW$f)~(Wn|zMLK`< zrI$y&$|@+vVD>TQut!16?asNJmZ(<8Do9gb{)PvTe`kO6zwtW{?S_OG{e8U&)mjSj zJy|X1^5E{g6-BgI40V2rX@YEue+@(EMOn}*Y9OKAf{+;1Ub%D9t})Qa2{I`n7BLw| z--t*nqM$-Xz5^>eR8oZJZ#rjtVn6GgqI2-0TqRbZmsRrAFQIX|yaI`UuGe(o9wg8m zFn{b*f4d?qrh)MeU5hEk;{=C&aVv7?qF>cZY6CT_tOhI3a}B3;ij$=Rf84(O%_nMU z*=Pw032HpKn^2I&Pla<8Iv4etRNrX$HLuuvYgWZ@`^a&K4A{oC*XAHU;nS82ZsGAI$v1T(&{l8YRrGN)hWnmD87go zUiUoR`*E(lZC`)4*~dEA7Ki&);YR^d%h7NxBW|z_t)kilBbPm(&M8(>Xe}>L~AvQ9F^msWUPW^ubOE7 z4{^Ppt_g9*rEnYbe?S4b+sef!C#T|8NU2my7fhjTf9E|#K{U?V!i`?Yb8kR@wijJ& zG{!lkpl%M4@BBEQorwu+DhYmfjqiPCu>Rh7@m$aO=#~D#yB@Nr1ZK26kY^SBPB1iu zTO~6(3y@jRKW3Dbg}iVJ$5cEh7VAxsS#Yz^YZE|jK0aJ+f5f8v>IieE7^)Ay6|a;M z1R|9i+vjc1?_KaBcsNDY!d9X@nNskjV3>e1HI1eS`=C%y3s>Rz7<~lbdb8W1!D^kltaZVVn`J-Oz5W`jgD*~0IK}2Tp=tf^$Uax!kr&RP65^{`BFgEC&DU}m z7$Y*cyy*DF{m-$W&X>8T)Ya9IyWszSrwDMec@ z8S81;e-wMf+DC6*yt*;vy7!>naPjcI^*>q=`QE4B z_{vp8(sDvU>+E7e+;>mJ3aR}R{T4Sjla6z-zA+R*D^6u7R4EZ=ZKzZnx3^jgn7DWR z=@G6PUYmE|zgyv5bhM;`nrIVn36y(74)h{_85WESn-@;rUZ=#nk$uaZS)`nOtczc_=uSy+hd?OLfzS#vC%W- zL`YP^+%$Z?e)Eh<+>hSe)ZpHG{PM1&nPt*$o1d%Bh>q{9Suo&~(IIly*dd^eodvfyEk+ zs`5Z0B#Ci#fsI2^5u#OI!!(1sxiUpfeC5%(abQq7=HEEn|GwvEd|U^&9aFlUL1 z)Dkt=2!B(D+0cqT$`QCND94DlYWLHuj+m#|yZ(ZBuu|r=08yU$g|q~*ia3ate-=7X zBJ$;&bL?}gHx}^u2; zM^vQh(HIPa$IXh{1iATq@0+Z8=W%U1Vj~S8i=YFoxU|N)&xY-lG zSQN%Ap$o+CBCel7tXE-WqwFXIe>4WCJaOXO^5E^THQlInC$ZHiO6v&g%-FC7k15NjWBkmRT=d}>?;{@5ofD3hw zk(ywy-xX0Dr5i1e7F{sM#=yA|J))zOl-RTja`7u`maZk5Fyw9{TQScBnxlizW5%?F z%DPW`oa&aY&(iZ9&AF1Xf2R)#K?{MhI=81tUZhlLO7uOiC>Xc5W>wgVizmTDtuDdv z?uRhCa$BC1&$@N(w)1mu)^ERg_69xq8&&N)58NXV?u!N&<|zy=o_@iNQz;TkvYPA8 z-M?wr@yw30!I3)AAYtjZ6%MfC>0MhiWNWu;-kfVIWkF0M$D+}pe{6-2FzBZ*44;Nl zp#?=$BveHQ6?#%US4P^!H{E+_D}Opm1B02?3UgEZy#!z=MhIxR=NcNtC2MpvroyR^ z77L&+MTiWSC%QqXqE3oE=cs#Dih;5dzPHFvb?#`)GQ9;_&HWKs+_w;}y?F6V!!>V8 z-S0eZkG4{|t5&KXf7@{LG%9DITWWerqxeM|K2rus0UAnH+F5fNPU%BU!p~f6qb`l@ zWSU(_W#%fRJe=k3S&7O={M!Ylak5pUS9o6$*d*MfiLIhjrU~c9uKczyf7_{SLaaYy zWLb`;NSOnlKoXS*8raIEMgfiWu0)4Ye+}mxIL_tNh50SFa-(q% zU1Apxix0gxqNsd49hRji^A!b@%isPTPL-b6YB`2HGTrKu>iWoXnw=Fq0#Iwn$c{8+?;i_^bw=ZgE&S%4Wk z6&tUsHs%UPe}E3dERO57BV4C)-KV6#*P7Mr(KROM$wtBjXE{-2Vb)1>oej!T3QYse zrFINQ96cMU;TDR)a=FA zoYtPAhu+p=^6Z>=qf?u-$y(6pIc-F*z~%#h$Yn1Me_4!BoSVqg&_sZNqZo=QAari* z1mN*J)a&WlgKJb0%z{U@X2vPxYB;sqc4!*Ag@2Gsm%rm&JW^_!@e$6)h&BeiWCL>Z zIVEn(m9;e=BBiakl857=UD05Q$!u-6I)^?i(`%yjvvXb*u_?{R;I1$uf2UZ(g&7rT zXi0VDf8LpL7InJ(onOKp6xX5RR-qtl)vGgD?7?0+m8^j$RQ-k8Z@0 zILs2HrSg$>H`111hqA(GtpQt${_9fg*%*rhT2s)QPwVJkirvK`{&!;lT*duN>)E!` zXKCh6ibjhzFd9k3*anx^#S6B_)5z#3!bMpfe`QQq8;*mPo7c&uvMb`BYn)!fp~nd# zpQ2@c3*K{T*3)))FOXVu#n)WFjQNSroc>9L~a*k`L!r4luzl(&m(Hkq7r0m6myoS ze;MJtzEw`YD{qLC+O=I7!i;{Z;=rB8ssV%Ny zX%vspC~l6Zyuz_N*|w5+guHK2cOJ=zr7Rk~ghb3UNuBX&7{T zsD7dPA5jU9ydn)Dc!eSn-VvjO;0B}`g?fgzT-TEJS-E~SW{YAS<@z9mrk%)59EFg* z={<(cOhi(&T`Av)q&@%WyX)2Sf7?5fdk@>A!9H9C`yacl<>`Yx=OCM|YCi>HTCG-$ zHU-3f3rD=pX^Ux};2IKk)XuS$rWwIBO8$%$9h|PB##lwZyuJaB&K7d32pg9_?gR=5 z3Sg~`5~FZ;rLAnNdJXbXP8CC{s8t9<2IsN5z`tM!P3F|7U((LpH3-oof6|N_GTsSA zG5t&jHMR+r!*j5RvR$Jbv&};H8k$E_%QkTBHz@5C*gP`N^!8tuX8+=gms1b+{+m~y ze5BQObF6dk(R)OiFMNS!KYaa_TXod_A>j~@iaIx=X>TJWt=J-fkD;p&WV4u<>|iTJ zcg~Y1xa4nim8?#UD~&Lyf6p5+A4*J3qMFemWJ{&ia-!ZNgeg`&C<`doiB?>nTPrgw z;?&@)kem30(t}x`+#sw+eF`nvLJa8$1yCZaPYr^3*pp&p?n zQmG@(bYODww{6KT(NmkcQ*Jj1dR|k@pBepD`t;sIcC*y#)g^F!ezbM{^teo1w#s8qBzs28@0*3F$19i#Z_u#f}r9KxTn!u(T4KaUMpc! zfGpCaOv+k1|BGF|qG)0$bwNK2<=GU5xEw0y4FP5ATC1W~f85{olP!yXEMxls=AMd< z!yPPrA+kN}wlvt)p_S|@!%I_WIGNzLkcNp(#LV^Tg)%)N0%-QkDG(R!)+6ig6LIFn=L6{V_>9TMIPJ7G-3^~150;bcP8Y%6v2gg2~-y$KsvuhnOedkuJ) zq#^pNDeX?#Y}n8mr1%my3U>wE*YUVWGN&aDUT3RLnZ z72}Wce~Mo@ChJW_Yx3YeAZu&(={*WIiwaxC?pPHJT=J-gq5vUSYFp$~t(OWPu9`>O zBDNK@7Moeu)*rRqI71#S zcRo>cfj+7btb&@tVDAx~nlurc7%n>xBu6u8f1^nlkeC=8iHs8Hjf$ArqtFw@F}142 zDD(DBRP@XTKRsmP?;cC&PRD;Y9=NMU#^GdS{1GxjgJKs=+lnJgv^jJofPlqkMQ0$0 zb%9mT$MOKmIj|2G1?FH%BN$8?3PpvsrXuhVXF*>?6i5soX+y8HVbIMoN?&GkFOG>A zf40~{7U%Se1g&OQv6uL>Li-3Jye**$e}HT<5+X6#kr(IjO`KntrTbI_K$PHWphicb zh>?#uD%uqE&j)QJB?pC?j6#RSNLFj9(Nkv-`@s(R?CjR3@eM;|qu8~)ps!ZfG6)>g z16h?r{jfc+ME`y-tsu7LY^On3Q)f_luvFV+t$-+iT|7<4dnTupIa<;RfB`I1e^L|W zLRmF+lLsP@=6uQj$G?7c_f>oPWRC`LO@5iX!2gH&Dd@c2Siq%!T#!fo- zIVqVdR-a1=(8d_uj?SszH&qXvn#T%2P}XN1T3~JTd7a zZP^N{deTmI_y6SQ?~%m(Za)7^e;@wMw;z1=>sP<}qqj#Rl#$eR7dKIe|n!OF}4Rg~3y{YZh@({@l#+9fAQnc(=$NDZuf2^jh8A*7q z76P(pgUE14WG@HJ5d2Z>R3N~L(v-mYyr^gJXirh|qy=r;ci+Ca%M+5@j@;EEQhO>Q zeIF+zu~w8t5N)7lT+yFW*C~`!7(uHSsR}P0*0!-w_Q@M6R0_K}Qs00$q+*Syqs==v zk)Z9(F?4w#ra+xfhBEY}e|Hw7sW@N_rPML+|EbSEhC85t`eV2QI$xLE_;Idom!II& zeC50-PI0FhDX9(IlpD+dV{9=rWJY2fDJmvvXQ1n+sm24xrK@iE~Q@YW1 z*xeOZ&^6E&w<%9Lwy2X!1L>&Y7aC}z#g0$Z$%Xr$uy4Uf8gIrE?Qdqj@Do$ zH<3qHQ_`CAwCvWVpM*T^P5wSoGJ)+xM&k8Zx6UAt*3b(jNy{RTK ziTfa`N}Xsn7^{$MS~?#nqTD7ltG%W~ZD^xF2~i?d&FoT25d|pvqgkCI$&RgAglHTsMLDDEsBmL(8CQ}J zDDE5gSc~pq;IOjIP!NYjMuUz`Nr&23-IBKXU|_=uDx52;bkLI z#t!q_jYyB5e|Qfd7q@f0A%%co)~Z293v8hENzL3q62{wgxKoy;l!`uaYsi2mp{|^j z7OFs+)8y z16BSwHTi-d7^T{s_H_Cs1wiT)clD6ms9LcgA;B#of6#ksqByoUfe$?hQg}ug&WHz0 z+N8JvTH@nDfCpLVru8kZH<$iUsC=&OT`gEGjPO}Fy7-$&)J7UpAyDY4A2LXBfIK>DYku0BCR`de}ZLVTs%>&cTu15q`JSQd^gr z=r3K?iIS6!Zah||$|!akIxdXMqAnHTOJU~Le+R;V=)#NUI<7qo2}=`Z^jeL!4TlEq zq@*!BR0oruEDP3Qxa+=qz5eX=^A~qd)?cg(0)OivycXTUIl6`SQz2Y1N{Glzc{rg{ zYMJ5*nbP=doUo5TPXb6Jp+^y`g?dC1SU9Tg@#1oVL{^Bn*+p$`6L&l$C!6J}O;KkQ zfBjSuPodC&Ks+B|MK)}?|2yxK!hc;S*(o;cNLdvNZ9*3=dz zT3G7Z+Lc^|wP~hp4aF;{F6yiJI;Di2xFKNnnL=C@lW*g-2BMO44H>&~t>JRvXzn6f z!<|bXq50sN!bx0MfQE^b$x%3OMM_rIf3L+148m@P;jFZ>BDDPU)3vC3ZwsFlMHIaT zjk*ZEceK2n@ST2`HcHn!>G2#Uy*{2#=KtEmvxkfN$QzH?Rfb+p4844OShAwAyUSq# zuGNoH-gHWpvtZnga=+4m5h2%KXyeQZRkzh8vy}$t<^*K#=o6;^z9=;`VWqx8e-SU$ z2Yi*?!#;X6z%GV~LT+JL&Ogo-xvQmEMcWTu`05e&^OQBwZlr)D1gW{8Qrej5G|!?2 zgLOx-1E>uh1JsZavRvbKN_Ufx= z<4%G0+3Tecd__m|*28$U3D2IIfABuSuJ*=z&Mbtor>B8;4Ksv3tddmdA`f^?ZF>DV z94nJ51==b*ocM8jw-XiyN;A@#hc%<}wkxbWUB0f3l~7qBuoP zoME=aIe%G^F7}RL^{QwAZ|t7u7hqpY*&_B{;a;U-1zvT zTW)Jc+)6jM$hh?=Mhx#ws}=h)i)rqnDD99g6-IEiBRq-Kt|lG9{WYdQk}DL?PwNnD zwFwUgK|SN$62>y3jm-;6e-Cb9sC2^JK-8q23&2L}kxLe3$UY~XdI&x#Dz!{Er09b6 z6)!^(Q!Uk6HR->>k z3c!B$^3AK){n=-~zLbf%@woj^dyL_^3tLjG(^KFO#2{#nnXAzMf5ewZ8K`jDUFlP* zn_eMAFK|!YR`EiM1dp;h5i}4$8i-@=<6dMV46A`^oY32~G~I<_E`xp`1A10j>q?Y< z*FI)MXV}pUm#pRsy)==UsOZtL;qy$9->MRgawRjY8sj>{16iC)C) zW>wBc-KWq2JhTu*e}e^=Dk_#ql;fN1`iu4YOU>Mim(PE_#@B4-uf2To;tG$s>G)l& zyZG)Q%}?WdI-{Ynx8aacltMhV@1r(cTg;)1kC%+5Aslb1P_ff=0;YmGo;;*I!d(Y) z!^%cn*jPpMAh6LDvN7RYNd72}phr7mF*RuzO7WC%YG%&re=fIvobO#IKkZ+=zIseE zyrRX%-AR;B2vQl?i9aYUilivu_>z&%LZnqlF;d?!4(kJ}(4z=k;#5@4c*GSriWdv7 zf@Xc0fS9o8xZc7YF-vdM&ajGAQ<}Q82g>0jU<|eKs*>DQ$FU zX%|$c#vP?2KWtVq+7h-<&*;+a(4UNztD^KK00oBOpW-#iaa~hjO!&h zF=0;2e|M@zzX{fle#i&|j}S_pTBUMLiDfvNPkIc!xQdr7ezPljjXQ=1F*HPViwXKA z_();fhr`@iImeStq1LgT98*2)4WS8r(z-4ppkS`9xFhR~r`sP!2~8ND9`|J}t#q2l4Ci4bP-I5Bss z#Ud9#O48gMVs?wfF#?&?XsvoKAiDMATsv2fI(oyASVGNyCe%hzitr?%iePw1^5=jw$1f7zSY z`>x#mMSJov>C?QNR6UmqC@eXLX>BpM9^!eM8VcnxZeC_jDx4IA3_c^sI1Mac4)(0< zqBW2)wwMM#lWMurY|3_8&x&4nMu{08)x)e>`kE_VB0}HmG^uf++KMuOo{GW5rOueF z^@7b=4phy%Tqjph(~I~B;-n--f9EmXQV!L!3`5MS9%|#l&v^40ktPk8RfaYABrAgl zv&ht(Vc{F3pS?9Tr%Ao_w$?SXka1J;Dlp+}`qqb!fjFHWE#| zSLik=dG*elf$t|x>05Lz9~(^5rGH!e(Aq^`(2XDGG@pO<_S9P7I@|VgSiD>9t2}nn z2Wd>vwutmG3IW=6!BKQFe}X?MHk82?rg0o?&Iqb`_8c_eqR`?6bt~Fge}y%LY}dsFyv5~e zE1XTE+?#?G5<;st+HQq+VH!1lDxhdH4y)V-0}&wdJseWn8HwuJ$RQXBQ$8l>wpO6^ zc2S~xT8lq__4?&%e@|bn_HulAaYK3Ip}Wda%!#9XglDKzguaTxWgIZX@F^NKV)iwN z4RE37hog}~`6OdqHM+PT3enEvrkd~pXX;Yt`UO3yLV@9`8~`4kV_SPwL%5WS9p00~ zqd_*wTWjH5V<}{hZo9U8?D~ZYWJkTXXuui>@C%-a$y&@qe|r!h%V8yj5&b1XU>@mn z8@9uPB)hG&fSy>+u_54J2I4}kgpS&Tj|jGTXKUJGMw^cO(~|qg+SB%z&!63m=U+T~ zc>VnDc+`j2U)^0E;@^58FBV|>%zySRtG}Nj67IWp2GG zZ8QZ50)>mme}X6FC`4Y3a+)@%W+fc;GD`SiQ1##OCswZ3#96vnmxfEEa|(cXBW~AB z;l|8tP{^wJ{-33MJaO}4T|chZTuGbG#f8?d0?`&TY=@huE&69|?>H10CuBdOo3>XfF&+`(FF~Klk||xDKSoj!Unk zIJPL84vK0DVCXv_eue{3#<{qOP%VoefuOf$5uZD2IqS)SutUo_k@wvclv9wkNMZ?z zSr^>GvrmBw+-vp6j>M(V`TgHLTn|f9;M5MN25w_Hm$hDtONkWwWW5OnQKe#xm^pn( zO{|Bre`Sj!)J{ESCwT7^5UUq=Uz{*5Eot=Zt!Q}`VG`09v-XG<#vytltTEE){{HVB zUTO-uHPRDrCzqf4QRdL$(V|sQbwUDG&!`ZMoJES2p~c%!Nxco=X4M|imY!CihK{F# zuG_*Wfzp+P5JS!-3C9lSGQCg>g_WR*@j2iBfAgRJ>eKgrURWuw=h_*qb!|5-w?inF zr>Vy4{{+x-*g=^`i#2tNX644IU9qKTQJG$iCVDyUq${dK$mTW73iTbaU=cMq zqWan+k^-EpoO>#jj*3lI6m~SO(lv)eE8K2P+ZK}*wbtSonqaZ9y%sfUqOi)QF^T_Z ze|yG+H@3ypC^)+WqNp-M(GN)in*e*Wai^WWUPT=U`Ox+0Bn>*2es%lyp7Z};(jfAaPd zALsy)x@k=QK)03ZJ47F-v@dj+rdl}WDoEa>EvA+^Euf8MVu^<}sd5$t1ksj36H#}B zYWi5JW`2h~XKS?1D{Z?Jg#Iy9E1IvGH9F_>=376`)$^vG&eh+1afQbU2cSS*_}&$@ zV5(3F=M`LDC?6`Du33c;^h?U&f45^AzN*Sq3U8>(D@5r#xpQ?$Yy=F&TS6}$^-H?R z@$sNF2>()jC9ux;#rc%$r(-6iaJ@*c=ucHn0yK);+$cu2u&5R`22lq3%%c(cj>54h zARD?c?b6x}h>eNQ1T9o*Jz%UTj-NPbiSumNv1*tZ^Ugwt5)w7-e~im-{W#~u z^IfwDmZCH{HcZk7Rr@v{6)?bQl)|*Ol#LFl6|6(cGPQ5MU=>Ux1k%y=9E&2Km0Bi# zt*xy-!Vq4;x`_jnAZ8Iarzt%TTAZ7L&*;C0UEJe4oemLx{`L^z%HN$#;d((aH;+b_ z`Y!yZB92^;OzeVWjzT8Ae=vUBF=&N@%?0O@6D|+>HVh7ZJ$fl>A58>IaZm({wj1w< zg7tEEGR%$$_AYKsO_30@*0MR@Y$AiLk(>f*t(g(0V7SkC0=6wM=x{+0*{g2Eg6DVY zlPdsfJQ3pcGwZ<=!hw`ZLi(G;;U%coA%qiMYHJH_I>f|98^nZge{L3a6y$YhN0CqW z!;>d>Z~Ht>Qh+xexGR@V@9MMV_oUBOgptJ26jo=ccx2>^oys(6tjYCDceIQtl4&lK zsY^i}5!jVnu$HTxAP#Or%V>a(MSD;yekXFe0wH}mh+H`=*b*h@LAWg`Fb)yIbpJ1W zfLi_#3MN8|+uThWf3X+^9rVqLCc(42eZhUOAn1t2ucG_Th+orHjvTmadV@Z?h?)X` z7`W(^l2tZCv|`Sq)~*=(6=LONU2Jy6)y7B)HfIS6#rc(+oo*RTbvV4|X};cc;tlSR zAZFr;RmfuF1t$P5+?wgp!`<8s0T`hvgGzarftqKd8tYpRvK1B_4Je&VA; z?M9q>H8C!6lPpr^Xfm_SA$Y1`2m+U5)77(ZG)9rb)vio8QSu1vCucEtrskvevNUtJ zND4SmCTu(wf9De)3dKF;L$13Ofv_qcl?wPX>>4X|QEoIxkrL<>Et|0^mu~yG;YuNu zmS!9UZ!Y{mlw?Qo3S)}VsWzeJXeVXUrj=BZA{I5VlQV%XiYY2N4*@BynYwphbxurp zp`GW*`|#>+{r2@2PoDP+*_|5?+!g6x`%dJ2{P?3=OmISwTz-~J>zh0J2Pu(X2B+oR z7U9Jj7j}(Rl~#K~yYb;#yf>FcDH2uox$sf1N3Vm5QT7ZjMl``;QnZ(w9 zHgo#fdL?%F=8BTtt;g*Tqh$9Hhzs8Tiyt7rrhh@WzLYhM0$1~f>+ij35*6f+ z3I$Pg66bZX5AKn)6cs#_R@d+fg$e>%Mz!Ems1ZQVtA9}dRT{OHO2u(eaLs|l(#np) zc^1>CbC{*KdRZ{+9CQtcj2b~Bt!Y0{*Px$DNjncE>P;=BFJiA++fnRB$kw58la7Lm z)R1ABbF7Ro&*2^rX_D0ATWr;R2@2M^a!e*%fXKr6qV~)7a(>xf-)VfGJij=TyY=9G zd+Gn_+kZ1T`##y@UTf{R`*E)rP60pSPgyvi`G4ucpXeuWbu zp@e*nrxH%Vrik6cOAtmhHY}=Rr`ckp!asHO!y+|Pj-Lh3+|WGR$2zl8?*FCZZeWK# z5%lT<^Au5@tiK${E4gBPPjrY+GiZHUiw^jqV1LGq6(altlS8g9Jidi^!&wm_Q8>n+ZELDvMAL7d_%Yiwknag{3Sb44pd# zHC&rzPPezPi#cXN;93KgvpA)OI6CD(@k572Z$YtFDakvEzzbq@CDr1R7VJ>gJeQx} z`f zqWD(UgDJiVgJwOjZIlV=IfIafexgSu&QIH+ReI^2tXA?$lrD?akMEk^ql&NqrG26h zhf7Mk5t(#Nd%}pcO$4rXQM{(#StD41sHi)xra<0sn<%RvegIbS&}@YaR9NWhXn%`K zu!-9Y2WBN|@&qgNw2s@viyGb=KhF0~@6Wn6@0+Lny2d%KOU{>;M{S2IB6VawgPR`UwqwTpOpL za5j&FjBd<#P4KOoaenL#`hdMb8h@AMyib@@*Wi){u~29+^w~;82(}09gxH+2il7Px zuc<2p2^3U)b_zys4lkFzBBtKi!z!}fxx!a z`YD(~P8$?S6zGLPY;_#Q`OHCbs|oS`Up@*j2A*D*zyuE*e|zj7z4eN{H3u-{@V>0-f;o<% zx5b80U`HrDRhy4%v3e9~bD}8nyL-;0`TKw6^FvqGu7O7Xw8G@tj$#{emrdzRvWgQl zkm_F|vWHKlekumW0zMUNsBjaY1Dy*}(~V!qBp8SG+vr2go*G;$W>9u-T<%dtqe1lo z7bT~3fB&z3euM&qrK+A(^co!Dw4*~tns6=6z_Of2(N$dyK*UdE81!{(Dhi1~#Y{6n zanWongf#ma(}^-n3r+z|BRet8R6ZLb9iyYs+rs3g*I$^>-THC9cgy`;nD^N$!Cr{W zwOv;_bvIMLYkA~Sl%vaN=mKvV!`jxPP6~W*f1~EgLLZwMyA6h;+d!oVwlc~iN|R|} zXQElpb14@qhM=k@bVXOL?-> ze;_0(?pyBvHC9^jRY7rq`j?|{toa?e+|Z=D#{DY=EHk3@%7&Q2GcH%3DKxj*tJCSl zwdloM9d!e!lMY2$O}Vw&dRo>7r<97|lu`{v)*=%^x>12_-v8@I*^_li8_rLT7JCyb zM&whdRKc81{zyx>rcD7(u`1!R-0fN}e@9_86e6|H-A+JL(l$yuU7J?a#EOP1&KhB0 z<2>qloX+TJv=Gn>=o@vW`+tL{Se5g&Ak0>M^mwm+V zB${qT+O)F~uxM6skT`@-Ep=Kr9>v2%M?+Z=CF`8j>S?(Yicus1OPveR!dpMifBCw2 zeA%A-?Q31HWL@orI>_R{R9yR^HuU=x)2m+kdT+v~WT2Eot?& zs7O#zj_Y*=;RT}y+ZLxHmTG7rf0(NHqn+55Zv2YV`nVLU#L+l81sC^*kFnmNDr-{< z*;2wWd?-9p5ora&t)Vow-T#{`s;n`_D@zMIqZcg}n1x{IA|d@9g1|{@-D7#3j%s}6 zfkvMVJdJefhSP6X+(Fnm35Sb+YqN;g6}m{Y+=W^xBsy&2Rv67`>*!ZHf3cYRf9u%h ziX_NZD;R6{_$*X8DC#bqgQuls)HfxLbd_-fjM9pNouZi*RpTyK*i&g1e~O02ZRPBS zR3IW1HO?b+kXD;0BhuKk6wyVLR#u?2;r`z~jKUfH&|~iy5H9^{r4>P4?L$EYY*9*$ zv_Wfu&^F~X4bJ4E>gntZj*`h9#k8$>{z`68BaaDTPKqsMV>l4fc`?}y8f!8aKe{%wIvB}KW%uj#W z)8OpRX(8?@G&*}i%rPPr?$NOl$(+iCUT8}@#&BXN_~%X5LM>QB(DzqDgWcAiZ3NVn zp`@Dy*u{uk(@ve590d}fqY&~GQtW=*|2qd>3JP}4^q?PFFgK6I;`v zvs`8q_KBQEYh1FDWTvpB2`L1TlB6iKcS~7VrgHcL<=G<9&JDCTDFQUca6Fw3Gc{qO zXgPw{n2I-Pedhar|MQQa*6IH5|1Fq}7aFLA))m}^2X@COtp?hwcS=JK6h<_fG}`@& zevY=QqCuW*e`!%D{9B&9>z7)p+O#N9fyW0t95uOK6lkqwvdDRvaS`z>v|(UYeE$#r z*00QaSL{*zSwxw<=<}tKK=VY;a66Qk@)k6#+$w7UBs|2esBZEKX;}+de<>tMtD4?R zypIBClLZS#7QNKuqmv!EoL(q_W=%0IgTk&mi+*R&9ikR1N0f~~57Io7a0pTHu?-gM6re1p^Zj&{WR3)OO zul-N)jL>MhD5svQy}sydy7id-P&=E%Q;{-KM$n5V@met-v3mvTCX%eTEF>Wz4Q0;~ zG$3H5e~qM(QQ3(M-+W57x#sq{(t(FW?_7}p0@LXyY;|bS#aTG z#}PipvJ4|)O+S3@6NLavVPbP2R@@_$mNA^>PJK>MXJrayCa36J$=LdvXlF$@!|D@w z8l$?EG3?v}O`RabTN8#9_-}JqD-cV)>T&2W*ZHu~Dx8Z(X&L}+WzZtuLh*qj_8xH9 zUNGaadViz{P+#cj+|c68!=ibp$sK+wSw=B=yXdA4N|=HW`g()NM;9|2=wow#?FN(H z9S3;nqGb0cFCO;Awe+or>`Fz(yS10$ebiol0OdQu5ER7409!*}$>iPZAFBl5Qh%+2WYho}{-P-7tacDiZDix7c5QG7 z#DsIBaL1!Yzn=3a`qRO8;;4CN@!&~4HW$XMy)Gm&QlxqZmGlKC>?nT=LyA%^D;S*V zJ%UnV{%0oZ4l*9`Q&BWhM06STqFjm~yx{Sfjr`(^_4@AN8P$%j9>zsJz46#x32*Kc z-hbYMnC#bM z5kW2toEOQhALqPC_M2zN!Rwv&)x0Jq zBk&$WONb43j`p%u)Tl`~d%7g{wZ+5WW`Bx!Ld_1o5+k>AW~1rmB3@<-%gQ!zv~ovx ztB*To1Z!bWP&Vb#itn7=hpAg?^!N$sy-QmGS&xDh85z&4m1qu?&~6X_owIHI2I@06 zY8ZAGe4T3TA`RR{2$)(u(hwyQ`dbunR&SPAS+8R>ynRMN2SRIkF~G<5?>xHck$>aj zJ3MDK_WnOOPG#63qOGYHDl*#`VxR>TNP*>o(4EpoM?2c2>U=;dtfn$>YPTX7DYrsx za6so95KdiRuC0pecsIPrnc=hvc~hG8HJ}ul*yXlpSey6%;c@timxzJq~(ohuz7^FrrXVPg`JB|wetx!XA zfE7_pN+!Z+;SjzN*g6+q-1u?MO735_YqtuD(1HV+p`qnM(52MOh{A}~`r;`b6!eTm zRPj*5raz+zkt%{=!GiCho1)b_CK|Tl%pD@7oykdnYtdD~3sLx15K)R^C4Wf_D<$+| zwA{}N+kEC9RXg6Z`r5JHIj-l366RzMd=c^OUPJi8Ak{cfJ_iLYs@1Y^MDiB%ZjE*> zVnmo=mA$m_g;s_&MhRz?9yJUC!J$cdZX7CpEriqcdh4r9AIwlf`1f!1s76}jv}*3 zmGJ2LdaiffGHp(D9D8emtMs8!QCKX84Ky~#Wx1waGYfd!|3^eLs_Dh=uytBODm_5n z=)$Qu=!&;f-0lU~t+U*YyXn9i91jkprxgpd2ZNT7!<%#@%J0OiLPgMiqWEO?O57)- zCK`@HqA7A}A#%gt|9{6Hz;lM9k~sC=#6Yi6KvHVpe=|~@f?3qy5h^B<)Tp;<02Dhp zcq>8c4H@fT2Hp}id6x_J6Ui^VZ_boxDx4Vwm$fGGrrqOzz}ikoL7f`WynH!tKs zBJKp*F0LG|L#8Fh9epe@p&=^0#mKXU8M>r-SWdCpYWp_5P=CXGs2yi((c+CExY4rH zz|-}UsV&$ENh6w9mCv-SnlGm?{iplYXD?TK^5V+j&#g!92W#S{8A3p8&q9Ok(Ct$owL{>uVzSf0VMJ$YG7R;5I|c!b?n*bYp6^5dI!o>D;niL1ubw}7 z^ZKGw;?~1=b=ld|vik^mxyXo8&b*e4*}N>H$$J^ByMpH7uCTd_Y&&ROl{9yj&Ntf zS*r|y0DodNUU3AEIq36IJNiB5T0cFS5HBn%Z#;ZI+6Mk;8~FR%2GVxoOBOf~x(i5U zX@z<;N=0)yPZxdFubsn(L*>vHeVL~QzlvN<+ZA$=r_w-aR`@~Ob1UvPWYyz1lvV;P z5rL^;9b}uHTZb9RO85WC0VK5@T=}F zvamJd#M_YO)Uh1 zsDGMTF3Potm6j5AQp%w*M{mL|TB}-6NY!8TfC{Lh00Papk(2z(6&9Bc-dgHZ{J^6(O{>aM;=im{vO(U*e#0{Ia$!e3OnxQ(jK) z%=iC9TckbFJ6#ye+<4e7(z!o1+WL>P(SKI2#95_B+!z`38HhLjD8_fF)2yT4LR029 z5?WUANGOL+8?QYfCQiCcz%g;JwwoE#(u+K@pj5Lq2%F6q*^de{+DH^ATZe3Uj^liz z!-f5BG~0}d3A_#b%5A+fUYlPOH5-6bq+l46N)yAhO7wWON4Jm&4wEvv;zY*v)PHE? zjzhx2j7-IA*E|kQEH!FLf7h{BYn}U?d_F<_CCBVqa8K6DyZ!LwV%6Px^scmbn|Blu zA3y&1R-Kq)qZYMmN_*uZ0gvOEyvW-S^%HEFIS(uHCZcDOTZ`s+l=pW|b|kS`luNwE zMcHB)Ka}_EP(F%gH@jQIz_B|{o_|FE6MT^_{6VSf#i6FvM4{tbJ9Xz{YSj(OB9$PE zLdhN&83DZ}s>Lm6!dJ`LH-(#lnAR42(*rhC4BZN1sY~=eR>whDJUE#X-xw zx(m8kLPg@xo;dtr`?dCe`c~5wIpmM@fPc2roE?E|-Vkn$`eb$9h8Sl2)f^ednV< zyieyus#4Mf0~PIA==!Vn@{3pBq0@8gp}XM7&b}MoK6(3zk8aVKP1j`fiCRx1QbYr4 z>C}=}@mkY5@*go)T7MBkU4=?`%ZdJimZ1#Sls_hyd&vedG$b=DW$V5lf&q$DLwE%- z!!m^3a~2R5D&CHchO?xe*Wws!k7_+KV`+im(zfDI4f9$nHeJJV!rg6p{RmOH;upT? zwL}bX{HA3rQi9;BfKf1$J~v#veDOyIg;oi7G75rab22;^&VOCvlxI7h{}(pAw;sT& zK9%9*Q~7)QKoQo(%@ofgeyu{=*-@yH7MHnx8%)i!cEvulx_k=MqAPSKqt_~~p#Y~? zZY-Tg+=2xcX@<uZp&R@q*$c;Fb;2It9^#mil^fI{y+Nw`YCSJ(rczQECZM; z?V*eAL_4h}h<_r&t=Hz1P+6%(LZChptd1GKucE*bG#4Xr9HJyCP6{NNc&;d?(sRwJ zpVIW85wx3G3yu!rfpMN;CAHs4KUX|NP*J%TZ#ylT-bM-OT&QE`Y4ERhL( z#YXc>SWCfl4^&4e&d4+&QW_#QBeo!ROdG@YJsDHBVt-#*j&n`BoM=%xABq3zczE%p zh)i#n$C9@mxvQt);dC1QKGwa}dmtQ#JJ^bTn54ij2*Y{40*zLvws5RUk9OBaZ+ABh z`})BBA$LrD^xS&M5K;nF>$7e|peew^FbUf_&FR7sBpqjRBkUAMTPa`oMc?>w&c`bc z&$L1wu7CDNb7(#nxS@&;n4++os4T)CM06lITDJ#k5X{g}8jQVi zq33I%g{$%)OiHu6raY0{+Sl$dMYk%E<~ViJZ@JHWZdaM=J!^|=AcaPCZOA? zMAa6=R6ef5$);=Mir0>#0!wgsIAsc8iGQOK%_un3;GIFqO(UhJtq2CBq}5Fm?;%i2 zzmZnC@tYdb8keK;L#S<=TBBY#-TxP#e+1#{$7uRqqv`vPV>V!>Ck!tLVL;8p8?+)& zWm;4R*ijRdt);Oi9tyiyh-CClL*WEN1sSP^$D#GOldlx$W5sGvTx3rOBHijhzOp|XkUHVKD+eUx%Hr3@?W}9 z-r>KGpZF1u{TM(#HaK>n+mI^y=kiG$#gE1S@oF{^%F?iHE`JWifhZiRJxCLy!hSGyo^1g?n?3IOrMG|Jk zj1~`?1R1rYfM;X1v8QFJpYIJ{axKVMGFO+0L&nri$p!5lef1Jio4Lmw>s)lLVRc^- zjjh}&6|p$RK%D>9~z zSnU*_6xLib=aoRB)>0^5Q{s|)iN>R_B8a4KaxN**2uICwHh-f0*~6>vh;g?bx2vSy zo=E*i7~@>yGG(tOKq6$wL9~V?En${C8!Uk85>L(RHWbT5gK6zdJJMl+Q(mF7T95~H zL>h=;=kBlw3iFWGMDHmp)dZy+&Admz7MTdTdoJXe?P{Y6b^?L3LYsAFG)xSH%jn9Y zI7?5X*|qfDDSwGhQ;!}Tht=PnPWT6_mX@pw%WxV~rf(DFoos5Os7s(}cQjJ=GKkr8 zl~c3A()kMV>3aFa`i>=c>!G{4I7;oW$4B=61^s4s{eKqF`0F zVJ{?$P>G2>CXGYuei@++Wk1A*MWv9m#&*RCG6RvrsJ2c-AZiW0^?kTT3;uLAzbUxY z>wjC%R;HXk8Gq>gR_Ycv4Il$O)TDqydvo`6DK8v`^s_t`_S*CMg@R5BidsLk=woX^ z*Nf({CNDx71?wl~v!bbi^8EdY zQ&V1>^xM%w!HK-s0l-hQsJDtG=qno13_^IlCe5BwG>wD~9e-d2 z&#Nw||H!lFFQ2w24}ZDtUbOMIHG7ZZjc0Cg)5ccM5gZ{f|Q)$zUIYSypt6uLS{0b?_cKa5~zAsT@}|j{77>>6}?JC|uHFBygpuM?as^^op@8pdnY2Q^_nJ zvUDPb822b+r^Bk}G35Q^g@5Mo>)RszQK|OXzO;Y6?buz3aqd(U;oeVCMDlB(5xpHE zY1*4rgiYLi&X^{p@L}&>x#H=~w(d-0ylX<-L)Zd0^h!I=6f)h`mvGp=&tigcj*fGS z{PO4+ngNpqKB`E5DywbV>-~RuXi7(l<8$mucs$Ie?}%2Pt{bGk6^|Et5W zLEqI9^1liXUeBUcP(!OOB8I6PTDDNTC`mKKjf_uPQ}C$aFe|0_a4}+j;bW8Z-|e6$ zwB~!H>K3Ks)wwnFi+_a<(-;^)7}KF4@&3R50L_toidH#2uvO|W*qC|G*3)>=YOrWU zsDcotRxD~MBcFLA|IsGP-nn!%x;71460|g(E^e`_jt#^rS?}pfMznD-<5&?193w&E zTMieN;Y|xGi#7Sxlu3qf_l4hh4#E4xgfOmF2c@ua(_-#ak@QR^MqDML0uKo zn5fTl-QTsx@I66fNpnqu2)FZjq8cS8sHKy&e|PfXTuy)kX}@R|y7i!4ww#~jRX?%s zMPHRyMZpQsrlpPp3TijYYz3mi1*fJ$tJLF}*J-FhM;<9>B*83}3K}Uhf|!n12KKn1 zb3YC*(OYtkcz;MOD<4Pn(Zp3MekeH#3QX?!?*E%ZvMc+vk$i}zU;soU#lkoS&1DfY z5dyIqC&9rGUE}zjiZ@M)5HxyyNc19r+-<_eOFua3AtR;&SZ`qd5{*bTZk7%E65LSM z!QUw^zW;A|3VqEM1@fYJRM#6Vqk^D#=5WjAN`Fod-G6Aptq7viTI8t9CSemjq}gll zrY~>PYuR|G{f-9rPC27hO>1I4eDp9;6Q2_5$bRff^BHCT_x~MF(a@Bp|8n>|hoBgD zS=t;Teb~t~eok^+KW7x6>*nmBIfwS41!7M{N2H0JV(P@*X}2sm9%dN=)G=a4;p)>(B>M8&B4@l`S^D~J-2H!lq}VCQBB)Z4VknA9 z6l&O+6@|j;`c+YZR1ZgyQ)=8(ha#dliMey1QdIYVD`~TtdU;X^OU)P8UY-6cP)9`w&)1%2#xqSuNvBYNJG68KS zx+}0Lw~7u;*aPPr!AY~Nv#}{2(P)#0;6QiYVL6w$1VMI8@31QeKbRb^5KcsD5w&5FMTHM+Py)&pJ&8^Ftvnd^s*3Ba2E`MrsDBP0 zwe4`8L(W?1O(cL75Rp8=YSG>Q{SVNwLj>@_c#LKAf-NIJb{zL9XXdeBxM^r|2cq?2 z-Cm5!AqS#2)pF`bk(0g{GaDgt;ZiTikvOVWYQ~kU;G&~>-V9$l3!jVMi5#uqD|o;4(SaKJ zmUU>9A?1sMsB(G`_t(sTsTB&R2;i{oT>tlH0J`?%?&unF)hwT zt=H8u*YXuBZjriiNNFqgh;tY^rS;sLt69f+_RwBvl^O>DsxomYe>}Jr1%DITZAh>R z&iw|KI~GeQ`AnzKI5n8#|YVa?z2mM+`u6(d{TM zCK_ghJ2^_Ar!jDRsK;0GR&*19on9D#3WyX0_OQP|T};b#W4$GG&;Tq-aL#nGP^Dt< zYTf5>pRncA`xl@J4IQ&;<$nlDN1+clCI!xuJ`kl<${vNT1*{8BBbeN$JULB>b@zpF zvhZ;hhBSwRxc8QzxBXf@)>Ns z-{CWlpLh>lnl&jFbx{jUCA$bajy1{xT`~lee_CLHEISF zt2=6V!Z}z3`C=5wobo(UGl*aXhCuHw0F_Rn9g@kV>{ zFV@}5C3^R8(eHih@w<97>Q6_b{(UrBcoR{j*RQttskpi!X+COG7Ev;%z-f?gi-@lu z`t<>o;1Ya6ynjAW;(`-#a9jLS$XR=cyGgcrQWm4{?B4%PYE#6;;1p$S#UcPiRr5fFuW=7`A`T&l50+aZXf z8ceV>D0E<9=6R^UMk*IY7c{r2I=!?&xfAadCXM#~fBFEcejEqRf>v!)C!|H7@TK(D z^`x7ke}Co9&_xIYlCky@9%_O$Xw!3fs7dAy!r9eKR&rgGYKso05cc47kuHKAaWxm< z7bom(Dgo|dRu{Rf=Nda&{%5L>u9F-l(IJb5eio;XCM!}091$i5h?QC;OB+SO1YBP( zcwI!14!eh0Jf5_IhNEg`rog+XiuZ@bx5zi{gn#-r5nRRWrX)~nIF}LsYHe=-MN)X$tRo!L%Ra0U^^Lr*P^ob>Fxdqie-!Z=-OE`N+9$o?OlmuhazjISj!2tetq}*%V*D@ zK8*eR&9m894_||x!-jjkdHU;DN8#1;3rVkAkLMpO{L?pQCO78!sDHqKEg)cqpJ<(- zwT}XEWCykU7KK&*Fa9uy_NNylMZkS zTe*-kDI1T|Fz)fVt!Ye;HeCV!D3nk0xUHuD@FUwL20hFh)Ez_2IX6cjq>+&Z!tSyK~Va1R-2!v<9>GK!3K>YS^i8qbY8d z`+cJr(G`~`qHs<$r)ZySuasCf4pb&^;w1>niARa)xMpc(HNn`*Jp*v7pKo0A+Z$Jf zM7^!=u4*0kl;}gJ=X?sobqtBPj3WS|!Z@rIWu(Ui^?wH_rA-f$gpguPwBjjPckVX3 zkZYnwK=Dmah{Z}&qJQal>QV;9;hDW?Y`FE~eDCCbst;eRm#-hL&alFY@{?w^>9-5y zh-ODWdc>z2@7IM?5m9N0#B|KU=@>LID-eas0eKcr*3uR-3R}R&i&G+fx16US#Pm9w zc+aHXyla&Ps|AT6a^pH8U!CFipEw%VS9&v1by0fZxvd4~F@H)i!l{PsQ$kw8{a9_c z&2|qOF-y-U~S1;X=N%0_8wDm`3=R3kImum%>rJFrsEuAroDZX3vR( zJDS5d(i@_!=GL6pjz$A@8|!(UW=-RtQy$ zGKtR!Wz1nJ0)Miuho!BG60^4D_O7LtzjwiWq8XXbFWUcZJ%m4Ijvq6}@1HpcXc|v# zv1&}i-BM4b#nw#=*jFkRX05y_45mPi@0P<%3zw})&vX(4K^F-*U(-BicSl2hL*xi8 zOFd5Xs|)>U2t(BFSRsm(Xt!`?a}ESIew^`Urhn-(euvb>P^}}srb;zA7`|KM$iE_6-J8e_AEhT6O(WpkF06DhPF#%=m2M_w zEwE*iu)Ng<7G=gqjHW`%O^f4xMT}Y`c~Qr9m@uL`uKiEtCa8a8!4pLog$#vVBVaEk z2>4j2LbJID*CT^f&NoS)Je~2HQrC?K?aH~Le}BjS;ql`izTDt>b=>%I&NnSz>aiYm zb+4dK=eO|iYMt{olz)6G*(y5B&=n}?%#4~}?e*al67;)pY@7xib)~tnCwzGIblhu`!Z(8wfr6_DqoRTUyVcB>MZFNt z<;yk2>1J>UGf0tuMNpF!Wb+k6D|{Q<+BLTeMG37L#bwbLw2TDMR-xTfTNtG_fpuFh>!kgKdNj%+}UTIU|Tv%;3IJgMZqNVrQ>O3yXRQJ)2gD03Wr5M~{KYLBFhM z9drKX&w6ryqR4Z%pR@~4<695gl{5Z#YXkkqDI<~A!UV^frHN}CBdIlJ`0(PS-F|=(ZkRdt{B$B1p_sQorkdL>iw`bn|)eA-esp)L4RM` zVD5rE3k3(R(Q@Ddh&^T~gEQ7W z1bZ@tY)T$kq!v?+KJ~&zi)$EBkD%3|Uq#*URH!;v<-L0HFxFjr_UfW4@74o%vEagK z!G-r!j7qIIz7Ni&!zoe$(b5rz?-dVpd-7+RGvjbx}@UoES+^9IZzon)8}N z#SbNJoApg1kgn$ul^ifTc8@AX;=*R-s)0EC&uSB(z5m}1@58RmDdt;_3-OFt^=QV4 zGDHs>PSC6={HzqI$I~C3h_vzx?N3xejM-=+RL1Ci=87g(*&Mt$*C-md#eZeRi6Jb} z;LL+Q5+!Hc*|x3s|NG|$H=;~WtHl{a7)-&1O3B0HkZbUn;abM0$W4nwpsp;A#FU?0 zFsRcB*D8Ofkf;^mQc=k-X3hsGiV@Uu0!3ZVRh62eShL5LFY1@kQhOoybKA!`?UsM^ zL9zMGlPAA>8e6uY$z) zpUgRy0n(&iw_=h&v4Bln${T2AMnU2!W|PGE1>Qy6h)1U793%WnFMo$Mys%TMI5o!} zi(_35hYzDNtX99RmevT(aO^f{uJw%?ouMz>=L=Z@O}v99>ZrqOtq5Q0qs_XQRZ&yR zAvI+)tqQGzL826C1af;k{~SFr=&24xA}+XFP#im!o2MxQ{V|aak&}qb0G>6iY6uXE zT8a+ma{m`Epa1r&yMO)i`O~}g>@O~gSZ+LcSIDM46|sDjvWs4sPRVl}Ubz~msDYsU zp@PtI;;ck^`$9Na22ZY3i}K{RTv85b$M zSQM{^!buiNOf*)W5o8}i-3~i6Bqj6}!hc*(Zd&I%R)e+R(0|u0UAR6duZvlT;nIyu zJz8y*142dYP4k{Oq_+o1uiDf~I-Y+-NHSV1Xob-vc3Mz7k6)7 zKDj84z45?ZwSF@v>$msfRK2uC4y-h3T}HJM1F6(C-nHjcF|AqJyG#hC4`%8glks%7 zVd@Rp<>>DUu74r)HQ0r8_J~z=ff{9xMv)-4Iwfzei)W>E-*OT?@Ba^y>4;NE0O4R? z^#5KnXrj28%L++|&FfcMA@_20-w&LMMdq5OxD{nRKk#=JK&N*}$X^H}CPfOr4t?jx zKTd@OOrnj*iVp&d-GVqmGAZ2upC6)%p)Htj>s~?VsDFHcGY`}Fs1~gN;U2}AL4U0f zq_0tlRWMKCOZj^%Hg7tW^R(H3U&QmZDRK}2YZmXsIhKI1VlHi1)*?|Rw(Te-8S}jP zs$V!sA02T5ob-a!81(=S+*2zu3&PMaWwia1(trXhR$h9l3Vqi0Ls>6s(@hP#)!5A< z@D$6?=6_Te)h_H99V<&DfdmXtOaPB@^Lf^wM6%=Mn`d_~+Utud-CGacRYYx1i28k) z0L(U4-~cxXEbkC1ZM#7jUwqok5}NCXSMC6^g#sgmI-(h( zEoNz`@TPVsnB{2>y%ndO=@gtoQnb>tAHw7z=6`wre|>19uXsLQ!zEsf3d*=r!=SBH{en!dIDLVRoB4vWxmX24NR#txx_fF9rnZU| zu7A=Xrw9*`uoQtMF$2A1SIE}Jno$@iR2zkRgr^MkvcgWTaX5GG=6(Kby?%IlseXCm zQM;0I-Yrdx@2NB~ZAI>gCZhJ;2pYtVRS_10G#-h3quM{aFUJX+ZK(EZM7$THEV(cnFddQA;{pdT7R8YY$t158;%9zR1~}azdyj5Um`A+GOx%f z(1z_=fy$UfQj-2HzM#fD8RWQw@48e7jF0}mj5CTEuzWPJJCx0tp zN3;U9GLYL69nTAeuc*P+GI813sO=&Ez7Raj8pk>{fs2Cwf)7KB!V%8sWm69*shrR1 zUazMw?yfW;-Fn!5xRS3*3n(d7I;#Y76g=ueE)BVxQ3JOrNtw`vqmICn^y{eeQKSg{ zH*|}tFM`X;1vqTvk*Bkr`*?vlC4Up`nB|38Dah_5kHYnXu+=)BKKx)b=x#l37Y($6 z5$}l5ee(7bAKi*mcs-=N1n(0^n5k+|!sIkvxNC|l6~9}K8cTsM;q5`;0>*eiswDhA zj*3yE*+)G>2rdZWYvg9<3UYKWI@FY?#Jxqv*R~yMJ`9HJ`~P9@O?xfB&VMUE*p_J7 zYQ?b89Rxv;1bo>*(R&^QNa$D27wFd)*dtk1kwsS(B`XGk&O9IkGSB1ZNq~HT%*Z^C z$egU-zGRto&XL?{UFwj545P$*>(;sd{~n%at-YUTt;i`8F4KFFs#)f8$5%#i#2PCm7FPz5E2>*JnR|{`$Gr-?dxceTVaE zA?6R9`||zyd!K*fYqt=shGmPPq)~@oA}(C!Jzj8{X0;H~&Vq6@?|=2RO>?&5{Q>gb ziGDrmSYpIwW2dE{!!6Kopd}GSk&Eq|*LMQ-oM?kn9#x~VT28`xSC_X4%L%cId(NWF zm+S5>2`r}ByBKOkV|?O|gE2QX^KMesRfqEwO+!5zI{I6Yuoo(Bwt|!JU&xulaxD+; z!))O8*7I+wKn&`cT7UKFQas={A9XXX%QfyiYF}P&-~B=f&3!rY{pJ_n`P!|xoF*;Z zy9uFg_Mdmdrr9(*nm290OfDG1C&;L^nqw5s-N;Sx#4e*T6Hiv!sX%w*+35|BPIv_( zSy}l=5Nx_-6NUH6M@=bjWKq_3Sxkn4-KPDnP=~B+GpMbx2!DH(grIrFc4is;XjU+A zL@MqU`flPgqaKA+470Wva5{3T4&%KBb*IX|>lrWsFf$tcBSAoHYq;|4{!cZBf8)oW ztuMLxy;@iD>h~VF8#l539f6|9ufKK+jy`;fq2llw60ue>wTRM07H=|o$GLpaR?EP3 zt~^H+HAOwY8-I>RQ*7Fkq3gL_L(D_Y^G~v}R<)jA3SCQb_~;HcaN?S1)@zq5iY&@oz2TbRD>t>~^-Fu7=+UwoS4W8yPs=!Kd{Xe(feDv()r*EEr{QUJ73fI4- zd4GBHs*P(WiF*&?4N4n72=7wb^NnBp9x~dUq0<)03B`E$ zca8$*u^-+xWlERZOciqm@q07^PUVGgPk$HX)Gtz$A{3yA-Sl`x(BAlgGm~-$AV~iz z_*`fTMO4A9SvOS;$}6$C9w||XI7BGTvh91hJbStK}v2V2* zL?nk|&?@RXPfE#aCoqO#DBV>0)pI$nas($uN~+&cKZ%2=3ELwtEF3{~juXw9D}Qpz zr~jq>p7Y7EQ zCseJ$K@3>qF-E8CCQzF@G@{Yt-ssN(yh9s~(!#J>ZcGffI!abMhv})xL4HfK;3-B$ z1nkO0?!J%nb0_+D-cB^mnK!4|M}Mj*u}y4L=j41E5xkOEiuN4Q2z3eN>&KQws1*5> z?Ju50Y@ZuE}$qjHI0oDG*! zt9O2!%LbpHIgKXOAQ&A(i&{h3jip)9-dlli5rt!O)zf**A~_Hj=6{$io~xBCHb}+i z){@f{Be>(raexyXI;CT%CvUGA&9)&p7pnGq55Wh$?!=w-ZP)OxKg7qrufKYv`TqC* z(pjp%|M+q*-~SGP>g6Zx#b5rDU;F;Azk9y3oT#cJwXJLlnhE<%0+lA-M8q{+P;^Z` za)hR^VtvhvwdU!1rGJxKL<6<$f{;?oic?!$(@rmxf>OCsC(UoUMZK-^G?Skr?c@GZ zZX$%XszV>GF4vW`?4lB)iK#@+aP*K?=}NKQdg$rHaj8p4$pv`ns~CdbPcFJE23&VPFk+Al{}>ML-jjb&-0 zHuS;;+v!xG3$nSbjfLxT@5lq-RVh@nSM)~6$1#lBG!ZL}hEH+B0Y#|IY5#Lms?ifn zqd#05Qp987gRQiuD9(Y!q;y0m>#EtXV|~7HUspI)#!NN0t$&MC`xqr6=vCa9n%3Q@ z)vLK?(e1>oSAP|p?t3Hs-3`O|jYEcBVK1#Kp-RvuCHJlhzzgY#sPEJ!x#eQ9 z{rUa+3%$x`Zxt-BbkFZRgx}O^(0)30=)M)KZZ${C4L)uHO035v$!D7ItSgidS<{9n z)>443h%wEh9Pbs@ftR~Ck))bzu}2dI*8{;dWNfFU{(lHj&?SxmDihpuxdh z=r?t;lQ62#E#AQi>5OiV+?@xc>&fRqy#lIObC;Ee$3c%G!Y;alZ)nGByX#N1!DBF+ zC$Cn4jx%nmEjQB1Bd?-FV=qgPKW?vnG++MYlV@*Qe{r?w?mc)n7oERYbic4%>eDYe zHmT8;>wk(3+DC0{B^eIq{OJgecsDr$jc8wv6|qWs6s@LBb1o!`Lr=u&V{+H&_#iwq zHg*ft$SER)i2$~Ei`cwkhX8QS%?)v-bm@Xpm^EC0f?|k^RHv70a&qND_o<* zkkPf9h@yk8l^g@PGKnu8rN_=Q)LM~?TP{+yyMLW^nG$nP*J9P&tsb@PXo97T5*OHu zMfV%+53h>d?>%By2Rey+x%8z2ozK7V1R5OlbfO5M@SG!lULCV2?HW3U5+@U4th?f? zBxpHoshG-$Ehtv&FO&#sq@@QfGhYOOj5yCk>MUiAop1e=wML1Rq~5R5_5Msv`74WeI~*{wt&06YXr1bl^X3euf5mueys zs&+J&1Nx~sBnrldNi=$m)ZG-zjc(Nu5^abgXFi%dAO1a_!YQXte9fvJadxNpfDuI; z=()|VnGR_8E7$eL;T>u`iXJ_PRvE()w0~_{*P8CO1L&KJ*Hr}4m3F7;#w*n&VX%%= zydGXmv2(sh_;O`G{QEyRXP`6+o94A4h6!|RJIzNhV`;stRSKr`;u;u133GBktaS-r z6jSkf5b^M}=nCN)+fRd0n4|TQ>%}BC+7bPmqM72cDH~xx{c!QZfMSOa|G^Kw|9_n) zKWFAfsI(B4_ytz0+TYvEjB`lLO}|-KQ;0-E9Gk$g(06Mij*_NRc+e&h##mZ*P5Tf< zAB0&nr$*7lXwEt5$KWn7>ohuVb52e~pUNIr7r3!^MpWT`t#vl|(i90_32QBS-Tbnr zQTB93w4$ZM^#*JUKG;H<4cX(aV1IypS;C#T)0SHs-OB4|0j+d`LevW(M^Q&Ikdym{z)+-;pQ#A1H$FHBjK25O`ZTzeNj^NA?jWsS8LC6`h zx3PBm@U>G+abl-Y13Qjyl;QY^dYn3k*j80kh?E)+VHnL%JPj$m1;XnMrQFBztYFqn2a23zCVHcE1NF2mmBjVY%Yxr3ciU1{W31k%r!t_Ge zCZ%PEcAnT5hopE_;%q(jW@2Uy({-1MS*B>BTJ%UtDMk*A0?cKT*u5X;vbN<9UqAb4 z`}meRr`2Q;+x%8!?r7*&&VLQ*;Z?q)MqY)z13{FdB`N z_2~+CZTide;xE)g#D5_u@3aZ`?xMxZSq#~1B_S`3-=vN&N32b^g1BO{EgGc6Wun!< zP)yZYI$q!47c2$6U0w``%PM6|Exd#auBQoF+r}hBPgZtCSmm<4;m(h9S$j)A&oj>6 zZcJ%TA>!TTwM=Fe8^>ys^-(PaB1W?{u}%?sRk})o3dx{=i+{7170eSLMu`^l8m&zv z))iuRJT@BQWeTyv;W>!}dXh+VRZs<;hO)Mp)ztusKy|-1eeCspa=fv{NR>u5uIbZ7 zD(bb*YU3CV#t;l=+}bH3chl9XRIP=(+7hXxF;$pRK)evEl#fss#&}JEW>r&!D>b8x ziZDABfLOO>EX+I|EnqfBiT(aq@r^#Lduz1cy~J9&5X&F?$DfqVOT?@1a>f) z77||-^n`Oqic0W`1yeEAM&(DEdubCl=PtV}W6=oOqtaz33@F+%@Z;K-XFT7X>&@au z@a3zk`s{m;+zpl;-)a1M{Q3#{E-MxhTumS80?x4_&I-tJEyRBbgp0M2Yv!woi}O%m zHA8Shu&8%Im5@sleoku(1u7y}u?nG=p{QFmhuR9hiJg`j>9A13(^TtCi@=&$5C75O z9OAVmcGRD3#qB|$OF15=&=yvSVHl&pp0)cOCDJ=OD^wXMa@pD98jbpmb|m1?DtZbW zM&<5Fl>x;M0b_r6w_Tt7{+y@MZ<*qFp zo|!u5#uk5T9nhiesCTThQ}~16RlqaFXkwNX9@!|hk3d&y5ab+SB~O)(_8q=XSZG(= z2b;FMzV_@u7ZHusq?9Xt@_Rqd#UlCk_^7@3(XH!5?scb7I8_IMD_#gCXDga&&N?-% z9Puc`FX6b{^b=x~q7g8qq;(+lDP)c*XE#YPQ9ysQo4y3znnh$si{v;H6S%Oj6{OEX z?}E2WndwqIEPUV|LHeEj|GqhPgx7QGgvU(vCTmsD8N;~%my`oas6db^br^zRC{8xf z-)dTpFlb?tY`xbLQK-a%)p9L*ms~nN@?kgNc%~GR+T9?w*)YD`luB-e2rY)U>Mf_I z;K6@>V9gV2guegVpGUiAugCkp{lV`)*H8U1`Qq0f?^J|my>r~ya`i; zldX5$#UE}Z*w@n5`Vh|6=323>N9mx3CaJck%OV0xtLide?9V97!=f%%jOGLM5anzIN{XcSQfWCu@It z8$t%CzE}LLn*gRWF`Q2mAmE-&TUQ}QqdPMfavG(f88#VR@hepqboI2SDZuGHD`W*f z9`EQ!M$}B~)1A8r+glO37~0~KQV}lC=u6|QW)<`~`V?HDk^%0B zD;J|P0;qj*m1*IIwl%SV<5s=;;HJUpKQQ@KXn8l+wPPiFT0Dr z^Zb+j;`xUkT^)zrd)RJ9k#rG7o}v)o-cFj|1Y^$|$LYp*#Q={A=E$?f?(9O4bFV^q zbP1``v9y)Oa9M10aO;0rZ6#4Eek3q)-*X6V({Hx)L&J7`C<3$sG^2T+1(as%R&YFV zM(VWerUKRQm%+n-;l6QaE6ywBv->{IWkKyvUbRm@{ppSQM9(M|YF-ul#f7Xheq;1u z9VCA_C5oz~(~H0;n(0O8p=q-#OhgJaD4`A}GI$S zFPOSZwOW2ctTW`d-tFH$Tm7rB+AuUFl<8^|j-KdLjHM;7F9C8| zPza+))?KcOe%^E7y`5rmGYYC=fuQk`Q314$I-P}_eqICjykfAQC__t|Xna`>W@}Q4 z+?d`9YiS+SwSs?hD~zLR5Vw{H;2$@}hNmaW{As6{oC#tnf&w|DN||i)77e?6L7%6ppB7D1xIqb_7OU);hY(1HX%DY5Qb8Q|w&N+N%$*VCB8X?}kX2dxyY0 ze*FX@VZ-B6t#vuEvr59j*is9W3Dgl6cHk;UdwNCuak^-}IG59m zj4WUuG!p_r3Uy%%PAQ_Hh{aW>lAlOiQ6McN8}?cqP>eq?F_tyx~#)FO_>^(T9j zGidGnh2ODPU{O*P+MEUzXLL#QcdaO0rCFQ+vEb~(fA$qrhS?B@)1)n|W0UeHHFFBKWc`K>?c{FS z3*}QnuIGFT3)~7H$6)0JZL@Pj>vT{8*rW+yI*aE%eTKCHMNh>)kKq=E;NP21#1wVX81wC=O zzG0aSZ(W0r6qTZ4y%UdFC^5H!-Rol~V2_fgOZM`6@5H0eUbhdg%A)T*fL8%2U6e(q zrzng5Is~Nu{0CoytDaxoJU!{nQ?P3er%ivJ^^;->ThI-)9D39lI84(8()2X?!j@j} zteCEgxFf0OL`8=K-cob8QNrQW71!%6)~J!1Vxf4qQU0Jsr}$8fAgL*w2Dtk0Uwkbh z`+xaWM0UYvtv>X$EM3vKCW*7mEQACn!zXREQ1n_js?i&-B;H0YQ48=0syZ~~T!?@6 zvB#Xw$|;y&479GoIYPf86(Pj^jG$-aI4yY)H1sBIr8aOTI zIm=kIK9)2#-r~ogCIKOXCXbp!1quA=6}$tzb;lshh=T+XKU*R_zX>sb z;T5eEe#~13z;A!@lIE7rnF!`x>-v9`{LVvn)7s5lSi5}<PbDtV+hjz9l$|K}eiW<=O7u<1t(f+wOYZgf?9~@b?pwzy?n;&O zz5{pjTE<;m%X|$NTxtlqn`$rsM8Jw(MemvdgNaRnqoD04rb?@|5=wJ$(Wd!LQIJBZ zN3d~=Cb~+xjwWeReVe`J6&8Q;`ht_Yg%5F7O{)?MS!JT$10kJmF98f%0#!xPC5tm>^56uX@jfIlLio#wfJ+O~f z%x-dPx)!zHn2!ot9VH~sJsWD#u?TTd>Obnke|3~|5O+h?)Ka_VD{YVZF|-g;*&Qcx z+lJE!>ep-g>e)mjVkm!w)3v=Tofd+~w4H1k-s#xW5PO9wg@7`HK2Jd|=n?dnSWO4# z1gLY`B^dkgUmpye1jRK6(OQ&UbFE5oaqBTh+XJDok|8E;25-EWSFx=L&ranoK_p>B zy4E!YxDk76DrZIKQb}k(%&p`$xmMJY7pPo6FsJZc!NjNB|-3o3OF@x4K+}WI#svsJiF5(7XCU#+j=!7bQV2&aZ!F7o1Sv*flEO#D`|jlNRGY)+Ac*+^m+3Y%K7StQpeLZBdMm9nc7 zl+wVX@9$~cv)oUzXOY)dmZicXIi7rKYH0Dpw^gH&ZM}aKh`RUVT#~f)$7{43^Qk>* zY1>BbA;Sp0LZ=2@8C#qTITL-QP@um+!L&w{#m%X~Sa@}678{pjL(wPNf`?w2M*LJk z9X01B94gck?F=QbH8D@cT|-n*OTpgk_xS#AKXuZkgIp|*`U2c+G$92st!)%Iqk#8} z4kAoE#9Dt@5yp;{MdYHwueAzG3cOf=%&Z(_^iA&aRz%g@chrG1x;Yu$rbKB}Tv_81 zsF_Du`bxT8;a`Bx3#5yfVZCZVbJ|W^a-~H>yAV}Fe?)OPk3z#q$ACrHP|s}Q2v`Hu zrbxViaoUC>onw*H*v0(`wAI8eN~4$VaTr){O>cjj18%EIee3l{&0Uol-+2IUoPp;H zZ>Fb7+9L~0_ZVZT1*g$=B@!SZ>i8{pj>qKOS|6O~Wvp5K_Ur)1$_@Et+^CJ7|UR zG>jrgsy6}?lq`a5mf^y%|15DiOp-L7cvTwgZ^>p}Yq+Cpl7%iP+fQ~jjd>FB9#nf+ zw9U#y3SJ?r2#YATccD1nIAM%h?MwH&PjzMx;iL4RovP^)S-3-rpr>Vqm%Va5nYMks*>m4V|U|-qh8bl)+c|tC)q-A z25D{WbX56}99ed9S(+QSmkRkp?5QYY2wGeG*Jl?^;G%ibY&KkWzU@BH9Odv`BZZo` zW=x4cpn4Y_=RdTxCYYK?Du$7*>yL;3?yGP#>sxEW2>9kaBQlesb>gzxhdyhoySd{K ztelf$a0QSez=^mn#Ur8n(m8*+Lgq-XvK(smF&vRuf!l^+pTPOT2D90Tt~d?~bXRkG zAJ%1&<2OLW=H4TAb+%G2>?YnTPvSQ5H4w46glTtvoQuWrJG;Gp^Gvh+>9h4mpS4@! z4MiM2|fZhh`kWZ@Pq?v!goW zCMue=_^&N|k}9=30g*5zG88z(aA=QT!)r^R>0q^`ac3)3x*?Gv&J=J?PN)Dl4W!!{ zP@<>bZj_`qwFaLW<=20Q|KaPP3v?ybe&5HrEb05~)pL9SZj|(4rCNkImtY!Ot8LMW z)g6L5E19NGE;A`6MtqF5fX%G_sC9EwZcM;Rn41-v=xBfms67ivZ<^&$=nhRg-Rif9 z=Ncs6MX?Y@SbF<;sd(VHd4BraRxxisIQFKnp^PlF#MOAD^+$gze0L6c(JdO?%;mM# zItMWwnevR+d#%borgJPcMil4kwunQ;IYvtKrHi1LNw~0%$mg714i14@wz_M49Pg%{1tgkS)Te z!t=A3Kbwgn_W?0mVs80(qJxoBZZ5;5EXfvYTLNMoni@Ck=NZZ zu?$zfc!B(Ba^qe`FxomrunjX-V8K^@r~tXZN~rI3XXXM20;`(cTd>G^ z+KjN$XbLww3!hYlK{3(pu}Y0)bNA&MN3P|VW(-%NKoK_UVi{8)>gXR*kEp1XjPh}_ zP7!nn&Y=pjt3&?jlD^;hac-_u&Es6p_NyZZd)@5bt!>&>f^CA*o#M-?)fuYI-0(rv zL%@GoAtPw-9Nth$GCpN}FX3Dq8g&lB&06^D)J$c=(T>k_kn~oSjKugypD0@)R+E%w zlz>Fv@_P5iDdQBH4^p*4Fp2>iJJ)YYgU{^)@9{!h8&9?BxGp%jbzF2N>VvN;b&eJ26Z(I&>^ecQ=v}k`S z*Al{4N*+oj`rJVgLZ9QvAx-^7ikSI`091p5$`O#~z- zQKKu{Qnjvs=@DED6tZh1%+zn%v|DQ_(;J`nNrvRnB>46SUZ{ee`Rh8&k*O}gMq=oA8PrSr#Un{>?K@9ck_i`CLZ zzDgVi+hRo|c$6F7U5cXmtHt3$)jMDYsI(FkGhN>1;r}>eq3x+zRqRA<0JD^;x1)`R z&R_+MP6vp#9mqtJuYF#%-kRw`;#mw?(`_uqb}-APu}KOC5MPlyEdswObkVa-&+iqN zb5(ix$jRxS*^BUZ@5i|r{(gVvUAv+%vQIWP6rn=(6<5h6PHQ@ikOoU`DoOMXsjQ^% z7{#=Zdk>lchs}39x5Zk#L+P4M1xiRf_IskDn2b2vmMu|;z-l!pXe+TBR79G+ihN%j zw6kgSZ?}mKrz+tWQES(I-FQjp7ohbZoUTQFnjnT^&cx13DMJ)IqOX6Y&5hKd&`8w= zp>)|Rd3e#Yxr9nIPm6fN!Egv{$*y4NGd0cr;r~3v9E#`Kx^dF(&*_yxOfA@{cp<2z zFeWfY4B>KJAYds)RLqo?Hc~)(S>dG8oz?MO)gX!=uG47NjFt%yKoJZ5LK3DHdPD!f zi1Ic4zkB$ZwmQxh(pT*7s&L@`yfPqV3Fzl+@cQ5q3MoaV#-ed4d8ky30}`b|p0 z{diEsm9fNC77@IQTwhQKf;&Xkq7}zgT5?MdrUxB;_(G{(6&QbA!mV+OfE7gueT3+~ za_SLK&J)urn+0$2p4VJaDSo-n?)^BICk3z9$3MP#mBmsOZVTjXgUxiZO3@i<(&ma5 ztFKcCcq#`Q{MU9^R;gDMXI1u}x0;0zE6Qr91&`WsK?8;8RciO5i=1L9K4h(e(l;|I zxG%gZ%2nPyDM){Bn>nGuS|bb9Q@tT zLT<{`Ss)W9hB{GYNz|1qpjS|V znlW}1Hp0j=mFb+!zJ_mS~AuTVO{ z1*ciqQm={?S`;&*r!j{HG%{VVax0)pjd!Fw z(jhx2I;Ayn+?b|_S8k_XTwuWaqfS?c9@=UcDU=*FYw1LfrweB4+KdA57XS9pZ~?xZ zlK%S7J=K3ddinhIn`b|6ub$)1a9zuJ=b`*%`Kf;mki*0O^A#MU;5QcyEdYrM1G``w zJ&QI7^a;>;3Y4m*XD(~w7Gx(A8}w<{pp8e-ZX^!p6$SCQW~NZene$;i0BPOq&`yh1M1@t)?GW z)1d4UlpYeLlQ9@-DD+$c8X8NhTtd&M@;jQT8xp0Ud{k<+w2XG!C^xsl-}3oZc>U>% z=Wm{^KSsIonbyIJ_NuX1uFC4~Jf^qzM7rD)PoW=i?>+I22KORo3yqwHub>|Z@zA3j zJ)D1_q;L<45jI-EA1;p&_3vH8So@=&GVhhCh!((t917$P1UyGv=uX>_;}%->;&|0y zBMFu1L5M||m$F9%d?5fM zUa7Iz4-YmhfR(xPbE9L5+a&;AQOLOk;@2Cs4F7QvV`B0Gsul7m>-L#6MZm z+nECZdPbDB#znnl{-Au|pEQ=d-64PBgWpF*`V7jm$M5~AET{%uInbicAP~tRFpZto zXxl38by^>~sRfH#A>e{ANI?IdEgMS^D;)xxoT^l1TtNueH54@j6Vn_%4h>d`!|uYt z>gg-5wIcSV$xl~SYt7PQKNL@56Bd7tVy-=EVge`So>DQcl`TM>@(Fz}3ZF+jOg5#} z>lB8%R+k8}x3S}{t#1td7){9s|I97ey?fJaVoB|nCZ=>v%9R5ApZmCd_(F}- z-3>o;|BiItd!K*f3A(a0T!l7n(JLyT0+(1532pIaab{hTwId6N4JXJM94+9)(i0J|a3? zg(}SrUsak5)R15oFB+)1;C>zHs3a2Tqp-9$;SQ$JW55;=Wf=C?=B2=t3pei1!? z=k?1M&$SeO`gyGQ`T6$VgLq>T*zgXW{rnrh_$HtxE!(L#=t4G`_(wv=&LNl(r@r=qzGf%x)fE7IPf9{<;Nhl;%lH_NhP$%1 zROjYnU6zjA`*AL%0ox~UUc3r#Zlzj>Cqy%AT21V<43~ehfZOUN9bb*0SkW*O7mREz=qb0&qJhZ#x!*Rx z{oYBn=7acwdDdQh`cb0~?&$-IP>FNPO*##{MJ}WWlLii72NhjHJb9+xEN$p5A78|5 zL~N?4Epop(TP3TkC$~y1nnut?7TQUx*eTMiMFMP?N}2$o!Gm1!Rpvz!92|QWE$Qw zd*Yd-u)GIl=o}CGmXb;F;qUwkk|}+tK|8r?0+hwY0W|s6b2vSPR)p%J6+2v7LsgtR z?NpOCx)utS-iifg9)T}Ytyo0IF2vKAlxgl(w&LSzQqq42g4{GOYhifiy1T$d$K|nD zE2xys;c~a4oxTLIhcz*IbCDM8JT|N%<3v9gF-J8@=f_-gNE=eh6Y&$AUMsyT5Jq~w z6eC*!XmWVO9j=0^lC8eV6s=ih>#N}Stq)(k?AQ45zC(7yvd~^w7CwPHG{{ESK!c_? z6t`2{5axe%(UsE#EtUkLELbFTJipR58W2deMTpSmqCf&sx#q7lb?^K*moo7C^#`w((ouW!(XHlj%6HoK7!060pbfnW z1-}EuN1<+RCh)(TyY<@6y783ojzq7;qRTuiPiKG1o{Qe|x>olBmqzhl6l15Qw3&-R zV$H1X2s;g}tb_&ZrF80BbGbV!6Ms{Ll5aG6HUhZ9{=z^zY>d4SE{G*@+K?^A1p1$@ zEIVyF<@`Y`YAac{7Ax9X&TwGA@<7tnOs&k?;uicC*dHMq{YMlnGXnx(JRLQ9i6~+a z#`S-UKB@s&(%p{_*ThA*tp{P z;I?rQ6&39xyAdMl6?{&qq+4CslzQMoHG_ZiEH=RqVW&OC%}xD zn?D-#VNFV@{JHcNW8fqsM7@zxTuNG(DrnG4({msD@1=@eG&0dk#t&F9Cz`IE((fCHz?O7;YSr#j+HoKTs z$1+a%evGY!)0KN`=0-v=KWi3^r=cxh_9}j-z54JRxm?|F+beGsIw zsQEO(YJGg?%&t;PXwidEtkJ~G5Z*9T)WcKfi1M1qUghNrMQPS zjc8z^*kU`1dG&9_8mr^_Xpt|<9vi6_qo3NPiXHlZ0BuLbCDf(i9HnbUxrMmAOuP5v zT(Xo8Uy0J}&t5#+H_L7Zm3a*m&~`MLC_ z-_>za;H|wN4RZKn0)NEtiit^!nO@S3Bf+`SQ-0ObE0MxPkt^$L4iN|I^BT(dRcN8I z#+}flI3$}i#hvjv~T^7KzD&0KH>z1T#g`t zH_h1=thP=Ne=u4^W@KbNZ4`PCuj}IZir^tPyK`!(RKZRK3sFSWRC3sQcRMZ@$#1^? zXuWvxhgYSk_a3zyw#ennS9#xl{Q4J9_4hsC%V4ho|VAu(Wip3}c*J4s#+EX!-+JDm(YjRoh3Q^+kgaZS;y}_z3thDZ*KX zK4{$EwMMx$8oTRbc5dF(tZ|w_Y*@@hgR-k2pfi7|XRXxw@b~`k3HLujd|KGwq2Pu8 z`n<|ToTpT3^51PWdIwq=rIx2b) z09mN5VQ({1jrvSw*)q>UN@{I^6pRxGl7Vd14TFIz4LDdg>yo zvVnhh>G-KH!2oS0>eWYgSjd_qFxzS982S|D&cvCd=6KmvChm&(EIBjnMz|?#%`x>D znMHXK5B`Ra+UsYZzS4JIz4__0Kg}6e0pi}nc+=(0T)4bF2^R?A_zsm)1k`dZ6Psvl zx~wEP1!o$~v!Q4!6+E?KuX;{L%NAxq3^kXq!f!#41BO>lWlv(YH*^q}5Yv*H^A5jax@V ze>4F7$vjScg1%SZxnQkBiAX%cJ7Ku3V3suNCRr3#T|8>6T?jJyAT(O-RsDjYUq64$ zjLEH_V&&F~96}u=4;bec-9-Ux(3q-bTj#0B<7I%KM(+Ynk?F)q~T7yE0DWJBs zm3S0AwZs*~I0xeBVeIwr53#`R?T_>gwQGvN{3*C20B4LtI3Nh9>~n2vD~+9NvFYcu ziupXCkQtgMRWp%N)Bkh<_f)9^R#eMPc?F@M;gGb!AYhTsQavmsi%);})3QWbxwLBv zk93;n>NI7W6wVo{(K=qPx-qG8SIRz6Llhy|9EloRoXS39PyM;T`#8aKEgKm;Suk1iI?xb(?MQ^8@5 zga5_#y@0TQBfs}lW6k< z8r(ekj@wX_qz4!n!BBGGxhueM1Up0yq&?H^#OSG>&1WdZC&fM!JyD61ri9^_7Z9TM zqTw%CaLh^j;U7OUQsYJ^LaeW^T7}JKEMm0Ev|;tB;E2e+GXKuVF+^Vx59*5LB`?~A z1Sz$CnihYLAe7f&Hz7~aDDALE(?Kz*p+#2lH6=P0iyw+mlJ;U<5C7&LoT8B}pfK=) z&_*~GdV~8eWlaG=uh1~*#1RIkFI*eiQ8+V_x8!$Rfjr2=x?^Wt@E8wy3Bu_aG`N~> zg|S$ZqDor1<4)s+1?+~o3Bx}8TYvEVzv-!o8x?=JTT=tR(CC*imEN7=PNe?=!Wi`c zx$SD`i0_{A5zgO|VKoJ+p`&)sY+8_Ad;>p$sC5zurJ_)~uy3?u6i)W?$B`f^r0Pvc zx|c`ZxoXt+#tpIyW=uUp7j)8uQnah}MxXJ?vY+AqrNad8ulW#-P|XcXAie?~2~u84c7+xp@2H_u+RpFDd6gI9+Z_a40~ z;&$%Gzf9ad|Hdy)+>~4K=Z%~l>knWvqAA(XbHLI<{&8IQ!wBI2l4IlX84VnK)O? zWxxa7B!)l>^-aaYwUI^>5fmv`)+pV^fnVT?Hmsmb=d^^{P{7bT#V!iz78cLPk5o87 z6kD4-iFYWRxaqt=x*_skf{!~t&ZVx(iof7wXM7wkFX|0l0HWqD@vg5FpHq+w?t|Pxd;{( zPMst9FL1}7`vOen4{SWhW0m4Lp{QNC)h9Gj%+&ra9N}t#6=hZ}1tHxumI7l@q)Y;} zP7K+g=3G%M>wzP`2|dQHrO?M@mqvd$X)4CK3>ey2+MgRegCh=Tyr5xz_$OIcO>B{( z{X7Ge*HfJqvc!F!Q;hefXyi6&HRG?no3_FC})Ze|Ci)&4XH_uoHj1=1PP@ z{ak74m+6xKDbQ`PqD2$+K zY!CnR51+6U>pFVAH(osd)AmrWz+O!~or)c!P0<@9WxYaxSd?I~*_5~y=GoaW499XE ziJ@qz6IlYZV+pZZL1(>*JMMpHqwPdLQ0!hjxzY6DMSL|N^nO=uReaFI!!P%;qijGM zP-8eJr`fx5e0VIC@L)!XOL)T|HteWm)>3nIT45s1VWeVlA-S0{cUFT z(`W6I*UxWh3QW_n1JTw6Lq_ki&{#sNxQOFAs`4#*q-X`(;9{A=PGKcsjahdaqF9#G zj6rQ*(nP^lqh`2UlmIyZ)04(TTeTR6Gs4=K+8eD4eRU~~WktEY5<&eXIM`VO;`5v=ytLY~lb!o7bur_=0Vq9F8(W`wPm3ss-h zx@|3-eg&J8Km>Q6hdormvoWd`0mplaQQUZ%piGmA|ESzmw2>!z)zb)KE#d4VkFi5R z2O*1QhPJdkop6N1s77Dr`1#l`Kl@}piYacU28E=fhW#SZs(U@y3O@zg*5dsn?dHCmk_^5z_vX`s+_CA+S)en4lYRC#JC~`V< zjgv4_N*t(U+7$J8+U~-~!Isui-B5rz#DpCBU?T70m)lOQ<4)oDc1MDc22kMn12px^z{1_CVWFK)PKAb+W_F7~MZZ;tb5G=&!x6MB(kA&P={%23+m zRjX$>bk2eT1zOZglnNbI?y|*2jhlI~_l>Vz`v%uwEF-n&yQv(76}^cy!aLq{^VUV< z>>&(d9=m~rZ|5rFRa|Ze0>{ws3!K5OW|x1!gV++6upTSZ6*4=#PGJtJgO?W0bc}0p zlqA_DLY$`7K8hfs)5@S)eW`Vfovfql8?jPNQ7uBGO12OG{5c|2$P;ZvKY4Kli>0vz z+or79!n-d|PJd7k%W7(G@O9a|N zJAYaouhF5TbCSL2DZL%8DeD){p9{;g<<8NDl1g)^Xo`j_Dp4&CI~Q>g#dobYZ9pNM z>EBswROtFgOF`ci(mCRV#zxe9qdT zWu03?_Cdhh(AGW>w%ox0Vq2y!ts=qA{F&B^uou{*?}vZkhewRcL=!n{PayzgFja8^ zJJwH;Isq}7;RJ!GLo=KHUi6K%y9%|M+INYI`{-9P*n=zMdM@>ZeEczgQ09LY@~<3c zB)Y4QcEOn2Os8}h9{xq1LcfsvnAn8u6$&_!#;B2k5k-n*G++4ADkOA@f2f4QHB6iq zEu+dg%R)vrU@|gONlU+=>zNiZ*H|(tS7QO$F?z)8R`Z>F5Ued#RN&!XI_aj&X%s(G z(5e=spr<5|G>jgPMbftDg3x~lB!dPrG8!gzf{2@j=fWLTiHc+JBu@>4UJ2PedQOqy zVCUn`!TG$##w#C*GEtN$2%TQyX1Vw< z+|U~vaY^!8rkffT&Rl)V=@bX}MvJbc1VJ>!I0cb{3D64mNc0G3?QMU%7#f{1V=0#> zlj!8nomMkW8jF2r=RxPw<2hXuoS;(>(KYUv?9x`t-22%Q>(&wpwh6Ck%v~7Voe%59 z9BcttC`Yy;wmV8jeVJw>J#tipJPvDXEIm@+meB&_T1E)bN(Vh{qAY=ic(QCmUrb)s?dFGyt%BC zcV9TY`HeZk9w^~i%8Ih04k~0;sinHaomf>QSKd{Gc3V4Q6u*BsSJ0sCoeRpC+A`r3 zk&DO$tVk5MGNP*fluZQ9f}#ngMwk-eQ? zWScOQpzz)X@RuSdSMN)J(J5~%ZIR?Kv&QA#Sh}-frX^UI0S>2}qA2U!Rnf-1ALn9j z|H2nh`Pq2&Q_bdwuiB>{-D+`ZROxfcg{y4J$Yki@XtjTbAc1Vm2qq6<@t&jSv|Y;< z>7uIiK0?qQ-bKJ0F}fu-f{lVpb?l0lwg4`L7Xs%wqgJ2kxD`HVIhu_l;XARJ4wpw% zR23U)K&`7AgGZuZW1}W*DcOlsiyR)oKT5wnH}%SLD-Gp#t;C4;jtFPmY4k@AHH+V~ z5L0e_DNlbmiw6&l$YV9po2~8V5n08PL>w|b{L2RkP!P5!F3}2+gT6ea94%mlG=US; zB9yv>1w}i|t_b4xfsmGlg?sx-DW~9$_Ay2pqQ07BN6)c7QVb&=N2p;dvWVNlXPSU! z*4r%9HLldF@B28H{csl{h~}MMA$rsL<7b zJQfA3+i!qvpjcj9Nt7Ikg*>QV8_8OF{{(jhaRy!b7&<7*CC911)~#Ywqid$2qk9=O z^5+?Wdnj!uEh0!hh3BPtOi-1=+M<(3a9ae?Zlhm71F530b|Cu4H6vPKHxefOnBE~Z zAX0y%WvI2@Q%at8-Z7aB&)y)t8Ls%eb_Zr&m#1KNew>RL{jFD@y?)a_`QWDIrSI9& z-?Oq1mzdseT-15(bnP8YZ(a^9x`cU8Tf^ms^X5jcA2pxjeZDB=Qy80=d~2JvBd!=R zWl|1v2K~j^J38tpb#TGE7gk$4ysNYDcbI>-C-7ef3yHt=sZVQb0vWKb@sbl!HVIKB zqhyR}i?%^SoyfH@epfsR$5Zv z#0fJC&q9|2^Pev@XnyOQX1@H<^Q-lC?{T}KGvY3EM%>p?XN1#w?RR=l3}Amn`5TkO zJq0{gE&?{*#g5{pNwo4M%v%H^BQ3Dv4t`QD&3RL?3i~3=g;F%34>$@ZV}j1ErHO~5 z12AhX6tN+?nzXMk?@vo>u5>ExEOusHlr?$*5w4giCJnUuvER+O{|{%1VaZE5&1Xc3?*>y+0oOD4WMUcG$%`q}GG z+fS}-K<+$pS1T@m@Q$ALw;#WL0sy%{M!((uHUvKfY!epns16zKPz4*h;7*}d3LC0E z1phjI2usjjT*OD=SYuJzFu}EO>YFY73|NR$8lxBXWoGPIEDhLB|F>mt3@AwonTQJh?+&fpt7RAVbEbJset(50Nr*Pa*m0NaC>d99|0p4dpV530~+^d4tbgNH$vmMd3INO2ACG=5L&X?PbY-?wyD4XP9`H zD-(|=F&i&UL`d5U&%%&>(++3T#Xz-MChh76uy!xoS zrtn->&~Jl`p;fd;z-!Pw69sb{hZLjcs9j^@^5)@R|5XFnUvmSP@mf$*<309iHqgX1 zm;|O&QOL{`hgos0+EW^T?2L?8)Gy}#%9RgxZn_ z^koNvp$$`krg*1$q(7zov}iDH z%3s1i!S?7o0!{k(ZMjzz=3Yo&8SOsYg}uLRH1p>_H$B^*eKOeV&px>k+3r1%zfAYP zds{mH8;{q(zp_Yw`v05X+LMPjsZgWXqY>Lg8(`yeb~N_wZfuHvfVD zAbg3pJ%0TJ1@F`gd&S+swY2g&_b|n_DsGMa6SDByYN)bK4qsA_)Af8>tBBcU`l4sI zCrF<@+a#QS(~yR7Ls*m(ILsgl%3xM|g&IFTs82zQeko*s@5i~ZPQLecos5^SZpjML zPSvrT#`cP4SZpom4-~VA_=49{N2;vIq4{t&h8=1U{m==e}4CWs<+=F;=;xilV{}nU8$e~PqBhf z#vXvNbu`lOWDq9TP)$SIHjlF#r8!U>B7J^*((i+)7c?1 zJ{IzSE!yy+=w_~c1k_{IlNRH-o@iQ_ol~YtGw`ef0a-_DMjDC=R@owPn-M4ixSrCd z&k=e8qhE=Ry3#GiEZS8IbvDycAQg@DHeXbCNk=73V0EmFAs}a+!jzO# zu8b6#^~!h}7XhH4slfjkkwzvo(rmGIVZ2vcyU~P zJgu6-x}rAp-vy1gLToHfJhwQ6D->%h6=iK6BhKyxIlHzEQ>QiM0`2NT!Zr@{jp#Ij zX{Dc=BVND0@(H{5@cq(q#J!XEHw{bN;MDhq6TeCkze*8*O*F#0a%6IaO&t1P*~UVD znP1lGb%h>`$pu%!3idQ*RFqD{`g5CTqvliCpdE{3D(*4}Vc`|){hFG+go2D>Wqs^{ zb9o~%XK2r&^W^f1yF`UjG}jmErrOV_4J!0!3`tT+ij`%z*l-Sr2rjfe4RTw>jEJX@ z2xl4;Gt*YBlrm7TwW5ArkkjrK=#N%^KyUcUqjz9x-bi)KpkH;_Ik#TFdDV!wSEnNP z9=NOI5b?bDQgV3w`fGR97@8*%8#-Hpno!n6B#A(74oSHg*`#MKG9cNrypVCL1Va%KLzQ6uQ*E+{{9=03JZuNuwPO}?df9;l=FMCGoQ6tul zXEx1Rt0>=>i5YgunE6tsXPd`=Eepvnr=>7c#%?JqJJD{lOU9zKj+tnBYEu(j1M*3p z4v2P2!*Q8c+RC7S)3a?ZPl2(+6+A!}$Z(QNCOZLS4+Q}6!BQI{M2ddgrE;*_1&@UY zGsV10k@Opws+lPYWSH%BdP5Wvouw~dnbS5D0C1Z&oq9hf_%H-4(ICBltfct3y%`@p zYcF102?E@C+-_9vxDV1hl{^;>VYSoV3hW`i$Fqg+%e-I#(VYBRKEg{93qlF$Rr zvAbrkaZIIg9c^tj&X}GTg*14^dci@#y(Aqqfi*AUPaY6y{YV>T@W9T=@q6?LRuz?mrQVy;^a19=Y4D%;D0N`4{F} zH`g5R?smPWB$DT9_0jDwK}X=cnx!SodHNnIm2;l-sFD(lpVE9+>t zHYZqW(-QyCkaR`&t*tD4l?5kCh(}^i*hn)wD$YxnSpCkAb2Bl%cM9rnm)(sI98ysT zYqYuH^@$DAxe`?z)wg}$0&T8|;Tr{51!IvH4uS_6fW9<6P=V{mf}ZdbnDlc%?{VHw4d!{X1$YZ~-83i0)UGmY|6ugkKaB z3#i#+b%q!85x(W1HTQEjNwINTqf=jjvwSO5a%=GluFoXQBsQT0I+uGpjqg3g5AyN( z_}2fIWPkAf_x{pZuD}2If-m3y&dW~;0`0|L{*zz({;$7#I7f2v zBua|V!#v=0N(g9&P3Wqk=0erTh+iodVi7k_EX4*yh7f4GxB~kGxFYhul38@ z4R-(U1w%6^@DxG>NOWI!&i|y@d#%j9*GknX=4wk;mys_tT=a*4J4!4iA_DJLr9WS9 zeMKg;-D7k`@s<9l(urD<0}1d9&ysG~(~^vP6FQ?fRs>e)n>`cv!Did&pSizHi~j84GMhvfPV!WtP<=oN;K+xkLK$#>NFld97zOcShW8 zB`Y|Hkan8YJZYl4_v2i(GTX-=Kdg`2yY=FSPOLJz=s2f;1|O>|;?$xtnpP?TTYI!R zp}(0Hrj}sJGe=A?`=+LFR{UlYE`J_nY%N>GHDMe@mE=%N=lHf;#XgE%+=wo)5<=Gd z4z2wkHnI2CkiPxZ$IzBbRxMAL3SElUHcm{(+L{)HLo_k%%d%3elEI%>Cyp(=wT4aI{UAE4V`b4&>wb$@_L-+dxQ zK-sp!LX5r^?RxCO1oZc6y@^^za7S=x$s7*U$6os_8z^xed&4cc;C9>f*# z7#W<|7_W8GBh^y{*NIsB5q}x%`kfI=R@4ql*?B5}85=N>7|jUNAs9MC33HF*Lro#K zkP^4hUtQYq2TR+9Nv-QJcu-G^=K!CMC6zlaRa!mRlpBM-KmBQ>*dS__5ghNz1PFvG z3OBKbsRR&@1eXw;7PlD33W^J69+;gfM+8PeCsD!6uD<=Xr&6k=!2;&cmxGcIHGk|* z1M`812Sl-gLnCTxE1IY4_Sf+giV!u5EMZO^wVqB-XQ!M}XsE`g-}JfjF@dv5J*1i^)RgC16||yoge3V zhW_z-_u}olht;0DIJ0P|>d&++sVStg3VaHg32%{ZH2OZ#tBl!D5@W1|7?$xRSH2OQ zL^pACkvfM?u>PNyUXu?T2UGRA&n+A6mw}THBY#H33NtpVFhPu*NY;CO<4DzEFoyQF z@P_`i1Rt}OuEOr%TC0ecmD^u`DxA6M&Jmo_Fx@GLrf5kIc2PwJxreMYY6YfO3V0E9 zsxw^@ij=*9M>s2 z`zorzusem##Pj>iiLln)+%>sXO`jw#GKr{Tif*0WodVzc6sqXa;h3ptf#BN~9(1W|xX zvCZ{ayOwaFcDZ6toNs^AQIx|XZ6TOfkWv+(JDhFVDDLr%LKAOZ7%=K{3j~_F@hI$bi-l<|8Qh{K{*Yp>dfIcr zu7yQenkdjxZqWNEwW0jnk@H;M-~N`Pc7_VOL%t`UlYY=d#L2jGLq-)W#ms_D#%i`i zwegR1S(A;DrlSIX9JJqu7K#<~MkhjPROm&NiGEP}if350pzVh(iDsJn{Mho!PdX~@ z{Ww>tg-^va=V#-&8o}x_72(S%Ee(a)#E~enKU5~xtch1>bo9F7t-G~cgv$mJ=UVj2 zvtliJ1czk<8mw*lP*YGw(L?o)(G!4e5hpasnWGw)QdDApLn*qHYg5G+d2AtE6=?Bq zL~yTMHG~gP;8N6S+zKj2*QG_bsse@b5s_=f#eD!i-dfTzmnj~U@On?$kXGo94$XxZ zI`)r(de%;nV21|*EqeI~zs7R=TR#NTk;}Te_v2hummk*KH?O`+W7)ICMFN}-FE9~B zT*s7iDOHa-ISC(OX`=U-2;pf_RU8Gal6b(iOl(ELOV1?`uv|D+z0|lb;qKizCdC^< zVN(w&{Fab8YIv(_p_dz%4=sO7E}bVQ$$AfwcN|;vgGqOV;;A4z1%Wf;RhWhR^geme z`Oj&uwKN#n+uwGYF)RDpDVq-MB@EJ(BBQo13e+Gc_y9YAq8vo4ku1@~9mIy+n`nw2 z!wOPG@!rPC;IaA?R>9c-dZR6|(C!Rtk^yaWCQ%S9_F`{;`w^)bjWd5oEdZ2(@Xg8& zF;jY31+rH}{+Uhzy-=bTFtcqslFwc2Q0!iRLFtR$|ELL(1_$ToRa2qtgGy~sdaDi_ zS`;+|(}K-O**vCx`#a7)Q`|#Mo_RJLf_jAx<&xGt&L@r;p&+^<_$$79P@00Gm{8ax zcPvg8hY(pYO0l)jjhKHomZ{n=2%t5J2gDHdA7!6Wlua~Q)={%kZ+|CGF}hfu_%&*O ziYH#cd{az-`DHP~Si= zFer!YI5!cBUXENWh>oDy_P0NXt&ZTBJN~f>_F2GcVR)G;EIQA%2 zZyMqhj7O*0O5f1BEoeverniF2;=qF?1MW~tFjkOVe^?WbwD8>OxG||Vb3(*|<)`TjF^l6?A-=AJqLnyYKnn>(OdVU(vJ~nn z3PM#uLHmq7h@pRg_)XUW5w`F_h+3&Z5qgH(AL1#rmT~_PS3VQzBMfn>VlHoEna{ir1po({wS{plFMi8m;|Z>(s>CANkd9miK3d@$?k@ zPdY}@m+$_jJw`%XLtxh#+S2z(98cRSzHhZPmOICaG$>b&LlmXCNJoQUp1WB=TCtpA ztP^_Dwyl30`WiIumGBL0J!v;CI@>wu+8d8bL4j1Ppq%FXnu|M<>xw&E)1n6~?imE0 zwjZwJ+=}ifcMSH>T`gD5l0&vvi$sr8%|V0W2A-7Ndlht7tU=`0qAJQEfuk!IgvF_d zGI8K9MBjybt`#w#`%1ribG>l7_qaW)Wn(W|HXnbWwur!{w%c~tes`oZEu|Qa15N6K z;^ssuQc0iaA~&=Gi8dyV0&S{2lz`HhS5_@aC~aaVugM7X8FEs^{gUXiCPnK8Ke<9T zj#wW6H(w8ai*~M3GXwx-kTyouY(U?-9!&XLkl?6!R85K#wO_u~R0amgR#-qB5CuJg zZs32y5e=D~E3PKlyWxeW#nkZM@QU6i*ii9lm-4JY^Al|m*4x|ff70K)dQ$Uu?~!|U z#reyM`;oOp-v5dt@tt-G<=QO#H91XCEQm^uLPpsisgR~PZ;haY_+*FyVXEWJ6odqm z&@$4yy92iuW#9N}g8nSt5Oc3=n>&YF9KL@Qp9RmTw8GlrDj1jr+&3Q2Q=mK!N{?Eo zOZdvyP@15cSiTjCBYB9ZQXi@~s5Gloim0=hXmAe1O^gDgTjbTkT>!!t!UhU(0t(bm z30rK88muxcwr^{Fp`P@OpZ~Rom-FNGz4hvgCfeWq1@ZXo;fW*Ay$A7`<`?^waQA=s z^@q3kjJ77th-@w9P+UboLfA;yL>xO7N8zUDvRN|??x;;bBIA~XuNDAQ;6`XLqC+CY z-zZbr3D2!&#ZadHA%L8s_&8OTlcR6c$<3J8BNQbP0lO~JZXkommlx40dKR_xa(9At z0~aalG#4TlliXG)K*eU&1{72^k5zxrS22_8Q?pI<)Q5-)2s>q?Pnr-Ob=d70Y|qa% zlCbjdKYa21(%UzmJq*E=PhX&_GM+5JI}ha30*{ZvNA@cP9*^Jn@Rs16)ntDnMR~8Q z@7{{M*YI~#dA}6?9>4z4i;KkHKo_*WO@)9J(y3S}xSWH@I(&>8~Q@c7}1*I-6wTFV%LxX{2OnTAh&+?aY$s4-n!v2x3N`@7EZH`WV6 zFA2pQ>NM~Mu)CjYi74)w#Ih87G`bXLD8J-lxY-cV8xgf(y?0IBZHyX2TZ&&eTMzC8 zI1>}F7R}pSJO#0OQHK(W(iMMaeR{Lo-+c})xL(*pLsIQgXX*u4XtBv<#QQAGO&}{H}E0Mdtlx_9CBP>q|q$sp=#s{lE5FLK;0E2uQY5+11OM`UF7f?rS;JSw>fn>nNHkL zODLPn(KP0SL0n3olc*B4Vlk?~(AVpUFzr|rBZQ&w)HCO}W!?UMo&vM<#d#(A%(Zw7 z>%{7&5*+1gS!{uhvOcFrO zj(mFOv(g;x5KNI5}z8`s)G0st` z>fsQKEA7*OG^T&JdYudR1dF{#;P1wWW5bd$zL?#cd<=qm$6dMO7=;f{4!l?q(b}SB zMoZr7b;53Np00$i)hFDcEm^r^JXhwJXFClNUPt3GK_?A4fW zA>|OYw30~*YxLHl)697{ZFgcw^bTwMZ3`M^W4K(8jjDg)qwOgagb9&;rJPIrdi#gZ z(Q}|^0vV)Xw6Dbq`5>GN5w64!wOcWTRY2E^aO_pByMSr3rN*o(7Sd& z*^#Z#yg0LB+RUal=HOUVS`3N&-KR4eo?e1JlT<@%S91aM6KhWmK8aM{)6>tpc`R2)~X4ZsxFBT{<-bMX--7JM)wg~3)dsB10m zg)oob;=*`12d4nI0V)Nt?wJ%j|B+Jz*-=qfzK)A;)`{3yVSj4-fd9BtbWN+Z`%Zl| zMd@=P-p@&o!W+I&3fWu^?b(7zvn?D-bM1dh-0u1)S{2cIWgcx-{MrK6*@^{o=qUG`Yoh?ajcdsk{6nV5yfApjM_nIO(=k!7Z3#(BAwA6- zJ=sEM1DBI})c=$%^|#)xh;fw&7CnBeX?)lvzZIwxZV zc!md~3bPu{a;`OaT{}#(K{3kMRAR=Yh;$_X1oefP71^+a68<|iFK%}Pq=g4}6Bix@ zImX$MxCmU8B}!y^K*Oxng*Ph~D*=CstuM<2M+r1;?KT{p%=J`zzj^rN#cc1|lQxPw zkJ}TT6D|tv;e9BygJ+eXATU{kLKv-DgDCUTGgD88_p9e_S_?fKGrFcRr6zqY5w_rl z70j_kXl@BTP&gx!;3-a`m|VcSpe~*T`GpMW@U6;UUYKMx%}e#|_KzQLwM>7JxmT2} zWGwUxFyYvuC7UZ>t{n^1Q;!;UQNZ5$$m8eJ`0IU1bh;VJQ;H&M>yL)(R`EJ2cnCA% z;@$#%OZ|?eTNF zQVsRtMqsGX9JEnM-Ua}R+oONNra}5dR4h=~GWB7wOG_v)E9t@m_fW)8+`RphKL-6` zgp-AryCL0i2&IgPx`={wC`gIZdJxZ3DXn;}dC{E}oD;@wloxOeTXq#1(pWYzpRG+A z+8%u`oH`gI(N|$cB?g6TS8=me(4*DinzxIfOs3i@O+7>uUZQN(Ohad!R(w{r27?+U z3NbRFF-;KXa)`Q;qZ>LElv1=Dxd5Q4i5eb(AaTfSH#I?2*=gkUag|zJ&^}H`Na&HT z1?Io!-J2H=>*MwNUwkf4_|-6Q@4lzbhBE#(j0ikam~Pr4Jo{C-xp* zKCB|cM7t7E4vei`%q}-!g^UzL#PZF!p!iMI2-SO8@1s%G;=lb<-}>fHz4rsZO{=Qt z*R(iwSIo!;pJ#W6;|JPEUU1$GVKDmT1gV;d3W5#L9R?lH8`(915JE> ziIQe5*h)hbO>sgcc~unV^&JE$lHy3S9XO>>b8YyV-Xrge<1^BKUWg6~kL2E)QmT-t z$cf@UNSD(A(M+K>6y(h0{Ftg-O4YOunut{qdh-~bM=m#~-ZibFyg?}u!tJ7UB8`fI z#qM+Y)URDJpSFj$>&36Vee=Xp8A32tRadG0L6q2nEl}C59CZ0Atuf* zW;xPhRUFzW##L=hZ}aUBoTs1=EpEa2kfUb0SJZ0})SyNkRFAw4jTSg1r9HGv^;ly6 zXvHI)sSKshKg1wBb&B5V(}W^wuBC1@JW)@ywxMX53P+@WxwAe6qB|Ou+rMz?{~aR! zSv<$jsyI71k#1U3%21jF90|l5L=zYKyAwqaqiCDCGcALrM0z5Wz)Ppz1V0RfvTa^r zb8&}jFb5?VNosP$h6D)cBH{QsTYvi(e++?0=+xk2mm*5#N&$(DIX9=wvsTVg0v;^G zh|*}s(xtn9=yDNFH;I!eZxug-BfV z5QmaBl5f1HsGzIU`5ki&JhICU51d4RpIUhc>|v zArT6H@P%MF{BPZ47@u7&Rfpo2EvpI;mY9R6&Z3$%hojvIH$|Xdu_D#?W?Md-R!KS2qsrcjbZ@dSA zcHw1?R?#AX0cl_7z9NpX!f*vK2A`+$%MibRN4hF%Zg!j#i|LA(y7T(mV?rM`+K~C2 zK1YJG_)uqX#9s{+ud!*{iNm&p+n#8tjkka40O6vEJ9-6Tt_st+i>Dj$Uj+@#v6wKX z_Z)6xhcje^z^tKGXu4^!d+efnu5zwl0K9G|0nTFeQ^1qwBH5sS z{&f47&vozM!nqA)h+#zUcA$SB6yeGbGf zaB|i*8QMMqnhMkwv!>Dq&hb=+h^@J=-o8*BinGsqKk1`!R@)XS3pZA!J52;q2~m3j zK`|ab_f|w3x%%J6c+o%wjLc=%<|=}Y6U0eQpg?LIsj4orr_JxVy)I_^Hm1ve9tAxm zJ&!etv=88JsD+RPMXhaE4EGrNp++?9>9w6W6e!fDTU18143J3^ z9mX3_|6CPa&Ng?+bd`w$I>Fv)BgoiM=b|^tH1bY*^RG8_?ct$)|HWsoUp}Q4_a3=t z&N%GljN^k$;>~d~$k}aLS)dDl?QnZ2hOJh6r;RiO!P+YH=HjSr#!)Ayg-`=?;JU%& zRD5OG*u_2jfZ4fniid)uf*V>Fm7g2V>IwmUb2snnb;UWnM!CZjJE;vP^`=J)0_a{0 z2Hic3lv>1YcjRF>VhvU^jmt#d76rT!Qt|YzY~&h+)0NX}6!#qYKsF4267kUVP9Hep zv6$#%>Qyx3+I#-VdiZ#`CkJYG9<*l=W4JU-gb%TTxMN)D6nq=?b|KKmq+xQ(mu8Aj z6130#m8yccI%BBEAVY%iM}QklYjxVWQ` z(kWKkB8S%o9RaS{xxwLo;!3H7ngaCDv+_Og4-*ue4)DzqNq1GDq>AjOwy2xybV4f_ zHbaf30EwovyBdpC5~+JBBQ>pIff;=ckr%3QTI12R((;pL*{{8Q#dBTV7wXEr)qj&>4bvRFZ+>vPaMuTYMm+wSLo((s&fEsn=gK69dR z31q2EHg`g^T)|!dk<7>W()RQr_s!jlU<3^XLfQi5*HYoI#fxX6&%7F~peb~ot7zi! zF>htGNYYZM)2o#%v?I(SIHr^fLSwHcP%G-Qoz=^!8B{&;=BU4wozGY ztu%V1taZ(6Dt$(Ohx^_G_Jo+EkF5R3eTkTS{*51dk3tA0{B_PRQ&YqBFv;HaNySe8e1 zL=?7Kgg<;lv0=`0I*a&bHpovY%w@%(8u3CMN}U3YTPt0-u!wPmT{n7iR46&ReKpAS z95vFkO8+>2E8m4R#}mJU@#^J^cdfr#Pvn{JJ#fzy#K*5>^T)4$^kpB=1a%4#lcr7) zXQi-)-bMBipsr<%E4KzPV-&f1#T*Q6RL7aC<}Lxq>_Rd!wc@#QX*LzSY)5a?Sh06y zLYuTV=>4KV-O<4+wARM$Up*(WeI>n$_Cpa_w1RGbeUEV5%(I!oYOU9`cck`uP_A4I znnEIP4l4;SzJHvy2le5~dZ=A(rB;nB=4G8Ky`kNiOH;_Aq988q;D-244AI>FwMWe* zCR^K@Mw>z#Bd#YJhqz}fdngqy%_fbkN`pw&Tf36&h~JGqgT@F=orb}QKTOjqj#!j| zgy$50_UaCJ<&)HJ2$yIOa6hp6l``7;{3Pry0_3`G_n}@f5s(JH`ul3JfzIylj zzNEkVjorY>O_VLGS{=Prsr@#4A3N8Pi0!BhYL#uZcVSt9+@tP=!3vFOsu1!ic zfVj2BM=Lw-2)sG2s|x2xD`X_-MBDNKyj!b(X2rRv@3RPPgrlI!xv0rv*wHI1M53WK znKtgVnUI@Iv$!45Scl%BSGFV5n^3>yzI8c^#c-svP`d{qjySObpe)1C6z}O!P}~p& z<+`*u^x?(Vs#dQ;hA15!g$P?IdeD#O_E-_M%t7?RxRLy?gn8 z-6w~~_a4M&J6Y?cleNBw;K2d8?~8CzkA@SLMw%Op;#a4EC4^ObBUb1$Mm&D^zyz0@ zA>m%j#BfSZVV7;_%wplTF@+g0#Uib2+SmZSC;~Y@uiow@w7!)pJoF=YwJ9v;sPxe8RyYl z+7)xvq2PjqtAOyLAE)lLR=fS1N1U+~?w)6-O3-RT6>og@m{Dl?+Hz6!;6uE31_w0z!`R zOIsmmH`8%Xm{Pt|dUS55i`YIz4t9i2V++kQNM)kRCHER6Kglu^weW)6YbP< z=SPj&mW|-KYsyFn+lbi?q*hmdyq`n=JS4F zAe63`5VQ{(f5&3ThH6gTvFk9RHQhtJ7Lqe=C)@!fP3rnH18sy9An*A2rI# zfb~?D_yKH>}kZoT0%2n7lOG6pFTTx=vh47>Frx~nO&$oT#KNUo}a!$>R50x zKUP4Uc2a{VlDqvoCwWILLT*JN{U$7`sLff8 zx^;*AgBLvzE1V*NS$t*&fzM{o9Z9SkY3ohk(=+cbCP-a@xPZv*zWu=;Ly5SpVmtMW zeDK_LVZx^Wsk31P5o$-c+Hz>kG1MS6HFV>9(x|zki?2Z!?Ly$ur%jJe7prT+K}xzf ze_5OYtdumTV#A_O9!o#UBCl=n4*NRuZ>`m)zS8bD)R!S7i79Yy$oL$a! zTD85=9_C0@xkJyjJoPwUII_0swZo(KkG4+|@YN$&%r;Jar916Llm%pDJEg9svX`n{*i7Wx`c~3wI*8RLfpshyz&#z4qwJV zdhWCw8GuAWGPo)`ps>$rlS%cF1w1y?Q$iUDTVG zzO}rHe$D68rb;iNSb_IBiB}3+7+$DywqB8xK-4()5XJh29m*7IP?2sIMfVO>`*m%7 z`MsKo@9OCeGJG+<1LS=5=HnMk;;Z(=_50p~`3&4K7r66&I^vR1&c=dLe>h&dT?8{N zu@qr9YQsd{m5u8TmNHHSX6Lx**G8N|lHEc&>8wVxGf^_+2W~KEl3EI*mk{2zv^F-X z+JXNWg-->0#rC$$6Gx6aKh6~r+zhd`fLf6wT6lBj<~BR@KlSMazyeV zKS}`V=gQd)yVz8O>G#pZf3P-$%^f6yCGNPimZM2&cM@Y1&nh{K^KQjegVu20BF|gM z8x3ruw|!Rd`TgIQED`v6T8TTE9pz6>_SpykKu5b+r2>$G)69*RjicjzE1u!!)J!Q0 zq$P4gWggwEgzbo$Ktd6lLrP3Iz}gy0u|h1*IsNc1n{_?@ENizJe-WGf*vt>aqp5>({v=K4M+bx-M2h|RoZC6^BZf6si1EZcVwB+M zPhXL*k~r6}SBZn4-7jCy7oR;rP4^zPXWQw_rJe45#E=GY5LmE!MuVE7OY!`h$R-xo zVvQ}P7!6_?J#($=fAk+eR!BH(;58Mg0_odn{DoM@8bXPoPuzz^OoR}<245q@@ifxZ z+;JI$A9$^|KlIqeBhZ^S_r)F=GV75MSWTfsZ_u&fqU}s*diWT+B6#j%SgSi)nWz3j z=m5bcJWo=_+i*J()w#rJe485SPI+^Raq>76%^^8(27Q#AyIJ}x<=rtoB8$eFkbj4 zHAnXzv}bLL-Nm-}Lqd?>_?iY%n@ZH4{QP8L# z)7_AfbQEHmVt5KwR-34YmWFn@;J;vwQDExy{ASm=e+Oz|B0-H2Lcob(JH@%`k&+6P zy^jhmf&o`i1#W}!^ytP~iV>XNSV7WJr+~^d$1#Jpidmf3oVzWqf+d_{zoVcsqLg9r za@R_o0Y?>)Ae-$>9al=%ku_Yx6JC$qIWIR9SR+v!*R?w2YmHO0r#8m-9kXXjEYp`= zjKB8yfAxE)TmKzDoQ-ilr4RRS{sV(9%ne^nn(_;G)!H z;?E#-FoQCpc+koXjTYfpuZXE1=s7bkigfjIO@tu4sLCQS7yZ_l<{3X88-5(nQQ$^- zAsb~(4X04ON8Tx?y+?OhbjjH?JPO%17rKZCfBNprWm>~#M}df5WL&J$!tu_6@#5}O zWtg6KY$hHRykwM{^O09PM^k$J@$|^OAd|t-n%5@O?~`5P#8@$iHMVw4E3vUw4AFND zI<>Va-wC`?qa+G))cH{=oDrQIL$g-Kq{54}Hgu>IkTemUbG@6jCWnAR>oLYs1^V1> zdWI&%2gTY={}s7PI16(+g;v0H!=TgVm)X_Nf}9J-}6Im6ysf4IkB>YM|TcpQ&$ zZu4ULx z{i?u~KbKXbfmGwUoL3S@M-sbsF?xkqPV8)ofkMxTj$%pyB{NU2s}?+%`xyTTf5SQP zuqn``s3!==w$&;}c^Ek{aqsRs0>^>dgoQd?-;^4RE1bRe8-%lwz39R#dC@ysOf=nKMqqp5T;5M5s*JwV%xI0%`(IEN+OWt>LzkFP!~0s4 zr)v5Qipm1*CQ|3sgvU7><^U!8fBC~^cjltC?7LH>)SKgOM&FRap`L}(#%SrIFHmvu zXq$xe^-#?S^P?#$@ZCE$%HoP?7+jKCrzpH59IjZEMG!E2$%0pP(rK@RULkATCSI$g z?)^Bw#SECXU zv(RFwsc4!Myb&W^*n3uNE<9LwQMc!k>2 zBq(q6$o;+W>am?t6pJK}2D%m$Et57yt*&+YGB(BAScPfX2`&w*fVydb6OfNumkXiV zi3S?yV%jE3z@D9k{{0kxf1k>G*Glm_KhBj4^w%Ff+mff%!P3a9hfskN&XoaqK^UiW z^jJ}g^-AR44FOQCskKUqU7-g(Fe=y@;wc>=OF`LhUwV^F4?wSP-HShWe$oS%8 zm*-drcdd1uPWREH_af##V=B%yfJ?Us#FuOq!noK8<9e>dhE@Whe`ZGDflv+=g{Vtt z)EpwR#w*BV6$`6YlTTnJ@k0IEi51Ma(zFSp)w-o%pAdF-IH@BiGHHQTT!h7~ zE}m_xf{9mVMaN|b;YDhmImWzV2DF(4@CuH_v^c(f2 z6G?NrKZ~LHsR^1##KrnVC9^B?B-&>YMD1Ejl!?Mn1R}LO2G>jC8AzdQTdy}1?d`jV z_UcjA?TMh229kRjVe?(LU>5>j4Ma4Ri8J!H zbsV+WkfS{(f8Y^Oa;+6j=y56AxH)w~gf>~;sJ}=3y1+RO@dI&!CbpiJ0_hdVi2GAG zMfY%AVs2o0y%3(1)9qu1+qr+#1X-klh8Rho13qG7E|l*?VR=CWC69{W#sZbDDF#CK zB+~27rA@sR7KB^L5XsMlcm3%8vgH1_mv7&E^5)^wfA72;FFt#{*Sqng6Yt&w_^fY? zx%kGsm#Yudn6R`fBGQfWbx&2BK7j4kYnx?g#i9*o&AHI0$9QD6O-hPd6B-_MHp=fhGt#IQN3`q)(k$9LrG4# zCUd$LFooIe_V4}b`@i~_>lBYvdVVcFS{9Sl9hEeFU5KG-L!4C%yIx9twd?;&4`R7i z33VJHqBs@B2+WwhYtI1V$HGpg9& z;82UnSOn1qCwl?0W^L}rf1Qd1HuJF~f9D4JnKhAhsK|1S_upIn<$U$xRM4D>e9{nm z?*V+a^V(iIuRp*pf3s3T)6^+XqepMJAkE#JjxLNt>5ZhO8!e4)ZB{xKeV?`Jb5n{S zhPct>PKmRfBF^9GP(*W1ON?R*fWoE%d1+9`$ zY3G*=#19~Urb8=GtLdy+q0OT!ELt>;KBCdIbN|2TR#X0uZ4|D?@-@c&+^6l`cb+>8 zzxS~Hq}tMjeY(=R0GP*nFqwt?>{8nI)%z`Ep^Q!!CT7nVE-2m8$RVg1J8fw#ug2LC zh3$ocVv*Wr+c2GuL2(G$b}HRFp^9S)h%5^9mKBJ9ar0X2wH359<{ZA&5l$T-QYKD( z1mgrM<`v#Lw;e_at*wnlwn0;-Ia(J*P)F>v3OXS!A+MDeJ!Xp|5Z0Yg@F@qOF+IDO z#kdRx8c{&^8s~oQlb4?e((b2%Id>kmpH#t|C|t>XlQ`wXy;L8x8Gl+4jH$vX0?%>O z;X*%uT5NdowB5PRtiD)rROJEf=OfG(m#Bdfl%mh-o2Jx(fx=8_Dg=$HjHhIRz@-rP z@YJbaHB2H+nVF8N3RjI`~E1N?dPlS0jG6-lLf& zT%-x2c5>rFW}}itR!AR4pBQE8KKUg@ie$#=IaF+D_VyqA7<4A|tj!5=Yt$pBpnI-= zVKqA_$qmZmg~;gQ>w;gRY|30?hA6T;E!q!7UnQ|*$h*)Kl7O=w1y-RV=Yud?cI#9y zQKd8^#e#~H%L+(s5sGWwq){N64G}({+JOBFXQePw(&CRj!#P8-l)Wul%c$V9rR`cB zmmV5-*XtetZ9tO06c~uJW{wy=I+4^zVnow%e+Wr#=?6`F1_68<7S;R_t>PbanD*A! z7Y?Am>*Mu$J+S1Tbe-IJ^uE0Ie>ZDCf8-QtzZ7_X_KWYlhqg1}U}{oE$B|i)BUBMc znky7dY%b`nt_|j=yII-A`PvMLvLfP}2w{p%%1Cgs7KT9@08x273JgM-qM8{DF6iWt zfA7S)$7-{S;v0MW4<9wiX^}{)C@?G(?ILxKg6w_hZv}ozam(5PuhqDjw({WG#R;uD zR3q2!1~f0g6gDc%rC09GqQ`IwijcJ;aEI{){eCK598F8u-&K42k4_~gC0Kgm7{zIn zv$2rV(iCJA^#-?1#W$>6XHB&WdD2--f6HCUh>;k5_^i)50=F89pw8$KDuq$Bwp*^~ z3VUHEtEUxG?8n{)jRP^Swr~IOX?|1m?;Zk-|Kr*mo{ySK@YQl36PBJpi|Dws_j5l( z)3tG0cw7%*5zxhVl<0#wJ@T^&zR>-+{M-VoV{1yY61>I@WetOA*Uoh-jQQ)ef5g2X z=X%%mYj4-v=St#(I2!#81IbK5Xlh?_qy#0B3pqt8=#cl>EmgK0T4w5QlrpClwdgEI zECJ1$GL#QMgRW#&m56M>%5z}XC{(@`6Na)BT^QQuR*B4COX4GUUGHB{no_ZjfPdUt zg~4r$je;Q&cVTT$Phwtv>oJF-B6+5oYJX}o9_9Vulmq`QH z5sOfttqU(*FSn-cb*Mb$bg-8UPZ5_4?2a?Jh!;Y zyZU*i8bdJ6JZfa5nlX*icEy|(m2Ba<73j7%n4?a`S0PHj6ioLJ3rXI(jP4eFF|%-E zi`|7w_4c0}P2D5h9Jb0K1>Y^4^Pb&JV zlsjn$>B3n9eGE;uB3oAq)xM)pd0O<9M-Dl(^_6SZvn(HLG4!XnUZ+W+9#ZLwCY3FtC@98W1s-Fh|IV)518RV! zox&fQ!xSybai}$9)?CF475+xw(bW;~4(>&J8{Y^MUDiAzlYB(7h2SX7^du>*nj+x6 z*9wBFlf#E=>(--5<-O&me@FfL$Dn@w{^3U#lgof~?FFo6e_}qKruv+f4znDU6%AVK z3ZvZ+hd7>4Ue)B#Vzv6-yEMQve(Z`-3uzJDZ_?7HI$m7xKH;x*JZ`qIf7!M<%B-$F zcN{|?`e8yc=sUTMf~Asrta`GlO|-eDo`UK4Qe^ykI~R;Wk(H30>+sgcI7Qhuj?LC~ zgf&Ftu%V(6f2W7oCcf(3U{gBvRN^0+3VS`t`}$+W-4o1l=Rte6hT2_fsNaidr^6u@ z2M+35^#Bfit>X0IMey-l6SJbE2~TVaSCw!?>2WVwKB8S1wG&&a+Uy~VM+jzou5_x6 z<4_&!Opw>l6cbTi9wCd7DG-ZMmD_)M?72BuNho^le}EB;m|5-h_;S@c&2c#tEg00q zDT-tP84l<0{wiC~=7*lw;h3c~>p71S35XaR;es;->!?SbbQSiv@!TsZSY;ZeAti@& z`_GOH8f}C$XNe##bVXg(BaS+gScNDNR9lp1uy)1&8;<2&1L8z}_3r`C!mjuB_DG#` z4X`mOe_IW^UeZ6OfSg26ul%93*R!73W4TO;%*V=M)fx7EiL9?Bg23g!Q!9hJ;9pUbyLF zE8Ss(?i4!O)Hv#^UeL%o+Lq3mt*s!&Y-j-xShclK_h@Xz-dxk)x7dt#BEf0g{_Agj z0PO|0|K?c1MjDQM(!AG-pKw5|*DGC$e~{~mOHlA7e>O*cClb?MRYp+gsI(r7fGr`} zio;e8xWx`Q99>e%!Ognrh>^Il1LH$KN|F@A=?&8DzdcnfIOr<5mb#1O&@SMLAeyLP z5x4f06=cxMcuX0UN30p6P~4*LIsCE2C?G}JoL&>880KwBG1^?|1#^N1V2zPIe`#Mc z(JNw@`GAn^;_bgX=DdF8DO@)e#w*?`f(GOm70)-l!x}y6Xb@V&alH-wU~ijF{4gUUt`7_ERQ{%w>MG^NUP zek!d;*V6XMwBRfB*We51_x}_P_BI z`a74J-jorKgMgknp0u1!Z4}LXAX26pk^Ja8ZPT{LNkxE{^VJ-HPg-x3?{j9W|7;r~ z&VI^_E>)Wm2UNJyZ;75NoChxXGFamFzn|5q@Ss(^k6*pMyDv>V@bI0V#;2YS58fZvv z`SyRD*x5}*WLA`j+RUP7NHZPBgmDm{f>amPL;g`PRGZu-Md@^G?gEVkm1_kKLbN|K zuJcoTP~Vcv<`0n=RtgofBQzzItD=ift`&?LC;Dr zbjK`9h5Sl1z<4E<3W@!W*0L?id?GZRCf$ zQ-Ia;DSd9bUWZLwX$gvWJxth$@rb(J{>*Qmrbs8!e~fwF${oK8lw0nA!Idf16PObcR;T8$#5S+HWBrk9~uzHCD; z*|3ste-=;CnjY;aT}7&`NjrH_#;1Tlsg(fH;<(s}dquBV(9>D2*2F$KM}m!eYvCMm z6HTGfe+JE5h$Tw;dpuhD7|sWDm$eD1K10z=3HB%O z9NsA!2%0;EsY->_0!C|__JHn+IBhdDkJW{=HMm?KPIwA6D+NcCre{RdC1gR5I)#9o zMqJachZ~eFTgCC)pTkpRSHjMyOe#$D<1d=3e?lh28#Tn4@+m~-Is zaW68o73C!iiO7;hsR-@F(M=$;=*fh8v(fSia}WTA7SlxJT0!jg=kgS!Hwrl%lqrb$ zuC0u)27;;rlogA2?NFz9q@|@`$~j=+10#1R;FlEHIcnGM>#rDQVJ)u^#>MEu%T;{5 ze`5TdVR%MqUZ8T&MmCiqZ-3smzxk)V_v-0vJEn#LL5T|>0vD}Eh4x>i0t}VJQt9L6 zbWRU%4>?!Ih(PxL#o?6hi&IU7RN(<75KXz(X}fmK zXdgPI1Z+@*@|;q(LU2n{bPV(zTxnL3e+*U#dWt9}32&m;z(pWv-VI?$>SEm}r%x|c z?JmCy=fL`*g%N473I%dkt-y=Dv)Cnc>vw_g9oXD=VtlbVBj58E@PUSGAVa__^g ziV4w!D(i`vXys}~ju|k_AU!Ba_B--S^!&7 zmo7;GNH_Et(PdEnpwf8?Y%38C4A_n0vd7Rk?tDlVf{h!-E~OO(cB&W4n^ z^pru{Pn&22kw&pFQPh#dNR>Iu(83gsLeNzS1j#cj0EFZ8Lf*$D^iYPww^?|)p}z?d zG+#aGMvu@wig&-~+WbN7PMer-Z$K{Mof8M_QI=@d)DtVEYOVT`o%WDuT4pwxt7V}T zeL~a%BX^}Eb09+fyP&9O1X>zmAtLZNX44~l9C3vn_Bkz7iWk4UUUQ*2s>Po3=tA(q za8%@A3qCd54*OT$A zV4%pBa-~Lg;<}(UruD(mlF=&b6d0f~s`nC#zx{bmufo8bQfU7x6-p1NtL0 zN8A%tv+ed5m+sdO8Gp3tC!P1g{q!IOu7*XuB2tFEb9)gQ*sJSjim9V!O0k`!VoGgUIHA?qk*K^`cYhs~tE)MNrg42%5){)j^H2Orqi%@fd zgwMdyzbI&@%-PcyCT7Z6!9JyhV(u%?YiZao?e_NFi@DaPFV=5-)?Pi)*1hxSJ=?wE zFWnm-V3(TVRDT5a(t^i8t2MY`6eSXTK%GY$+y;SGG4oP5VNs4b=+kPuY4*1$@xU1e z%K-v&ptgv<&*YT6gp{eOZIt67ZD^5X97+Qmbk2FL;aRZ{s|~Nbpy@QNLv~!$)0l{` zNHY!gxuLP*ZCY>Iw;7|ctvsY?pzWXeKod`(Q!xr?&VM1{KtDA7Tl+Y59!=!rk*ql{mEz5{o30%uV1`9=5;SXPp?0Ixu3QV-FYB?Qu{ds8>*=`A&Tm`@fvnc z?};H}9hurBGD9sz494Uovev{Wv?YV!uGOA3T=Egw1%ta7+U&H3dsCH@G`#!VSzB+p z;hWr>DSulJ%}}Iu=h`NTkS+(!Oj(&70)o3ibc!cm%XV{4$;BQnHmF-Dn<{Ot zz-@&Ruj@_tCX2XWFI2+dwrXDwKu-AK4~xB zJv3(XN!jDQhwzyW-Ec8b{6OuHwGaIco-69mIDbdfj@90yYbS`28oP}agl4VSOz|+? z>CIU5Fg0#&PZ4!sw5GFidlZs4ZfL|blf$eLW@x#jILD#mBCLj^yS))!yecv%$!w&w zXkZg~v549WybNK)&C{`U&qW3s8Dt%rxV%nS!>+MsY+B=WhPn;0$7f$aYaxQX(Kr~5$ z!NV;xsVY?-NH|lY!rj_@Bya%cn)P24fHzhtRoTOF_tT0I#sSpCjU92%J{8A-rjUm&ROJ%Q__UGHfL;L;<@t$9Q z;`V;$f&1;z{rEA2H?F|Bg5shn*VxcN*LF=*8bz)u6*lq~TtZ3$Why13t=J%1h<`i? zqJ5Zg1wWHg8fW{Sj_5c}TRtLS36BF$nT@cvFhAJ_o9UswdxdtJvan2n{jA*c=FQ!a zme%xbRpD^j4E^IhP@bp^)DAWu%N&&=vs}H(gXy;gI06!Vu*c zOY9{%Lr>1EG-}1GdEGBR%IJPH^nb;x(Vk}2dk^1}Wfwm3Us-mKUw?4R&Izt7J7FR1 zT*_9l!Dxoi|0>8Od(nJ%_MgU~^t5_B6&QlGriKxtITkxnOGGF|gSMtKa~WzOaG&Cw zBvEhaaoRDqV0IuXR~v@__PXpEEh`<0K9ez(ktC{{xzP2o7s|5Mo=8DW7W z*JiiXmxdo~Q3OGtE`JK_?21TEI8N<(<2b8yHUzP}-nooIW%Cr&%10*EFXBpY4qXgf zBFzt4>@)|TeDd<0X66g&bJk8|6CQoT9&r&2*wSXsg-k<0KfJr$II zEy@nI8y+8UG(yA@g{TCNGU{N>bDBPy7mT53o!jIV#pP1=HU$@Z)C<-Twzyp=SB(?= zgpJ@c3>L$eAquxnENHo%W+tDG07TnOpv`*vsC$nq7=HycvBNxER@m8;R>Zbxwb7dn zKScY42BDKFx~H+%t!BU%dviALcdK z?j9GLfD)oRGiRyG%jnkc(^7?^c2%?xc@or0nm3nRsHYlVuw``4$5{YJ@itk7AO$I* zUUa;aC4VRcq~chiMSQK-t#Bo1ow*Ai*I@UPcnfjwA$(R<%3M^XKEPO4B8@*nOisyW zgtjZ!EGP=Jgh>YV^kIZk7fq!`_O(z)+%za&fHyQGSVjKYqF9vX6$6!|1q~&uRahsX z(%z#))UxNU+=;p2hd!^j5V<>K!HuJoV^n9H=6|p_$1ChvViI%@^fM}EL|XE+U?{B) z$~sv8AaZCG?aZULd-9;Y6;MqQ9Zr6^mBlSGn)h0=6kaA=l=VK7a?Z=r`{N(hDXM(2 zAKrZO`R(g<<=uM(pH(Dx7e(?95a9_*VAS9=*{2k{D+E~D1S3M(nd)?ml)d;E=I(Uv zwSVI6rWDE3u(lC>8bl$*6aCdd0@}E&p`|^~%sRzQt!BW8hjyjLAS8tBAx?PLpl7Hd z5wpb5nSL4+jOij)jvY4oP2H8Co|vRojousWm4uFuP0F5&8Z)Ypvbdl)U>$u51kL6r zU6`kRKPm8h+r+fhCxJXoW6lTMRGsY3C;`Uw4Ta3og|As_^2IcMU%R5;(Q6m zpx(D2w_vS+3SB$`SxNy8afm+cd849%vAbJy`%6w~FWTl^!N`|rh1QcfE<{X1)PJs@ zS)n9_TG4OI-A9MzjfNHjGF-d`yyBX}du%H>5e4lU^dhA6vKaO0xpr z)6}XJ*h|0tr96c`i&t(!@?5NvlZl!=>LNfpMBwa+7-pvh;dDWtWAR_Tnkmb>!eO7N zbLriQ*>cKT{ zxb9Y*faz{3%GpZcW>U8+w-^J2iM)yiXLdS4m$^!Wq#QGaNCM0T%L z?V^C{yr&m&;_|NSva9A&2)!yhS=03B+t`lGA3HXuK{INvGc7Gu7GPFx^J0rv@rVA| z-cKw0?>%VG9HQ3CA!>au+kYai+=4q=D@&_O6hbqskrWdSr~y`ct&1 zG#2|Zq77&3C+%FfPKy(55PuPeH<9vOUEee#@5rg2r?hD;R6X|SLB#9!mw)?6P^@8G z&2`3Dg0KiRo_=pTwJvvX@BfQ2|ZSmj8#Z1 zN>1BG?1`#ad!nYack35Q7Ybl|p*Pr*C}i|$dJ11jb5x0OY$ixDdPd|YAUBb`3n_GW z`zwD8+n;`SOtF!*Dfpo0MpJ?j@#TakAL5I4`IN?QzDiM-Pb+1 zw(W`@+@9O$HL9 zA|6XGX6Wt0?;aaE-uZg@aqq{utdgI8`TE(OnmD51fFhLw#mH&WgsEpps9aPra}$|& z>bA7<)<`}#(|<*u7oNkJCS!dw=+71UdPl*P_8x>$6^yCgw<0@YRtiiuxx)R4pl9bO zTHw-N)uX=9dP5)Z+%T`L?Nfw{F?db-#0v9aD`HaoPxUi}sEU86L3F_rj24ur(hy3C zV{9+n60*SwucFf?y6E+L9v>cuaq>j$zGcg=>&Xx)=m|01{;F@k|IVJ5F6|E(f1+i? z=R1WMEn0A9(!zj-lt;iKScZ29aAc`T(~(6HdraIif)cLvWbk!F^aZv!MH#?cH%TtC_)uP9gH=JMUYx?9 zqh>Vo8BK4GID12oiF;Zve~7G1pfB`uBsG^0K~Ty}OoEY3aX5&Ec&%fGbtAMOe490w z#V95FAa*XiKhXmd6E|e*f(E(L51Kj~Ndyt@j6#?9HR{{lqUk2?p|lf&o0`Q~@DQ8A zR{?EMi#MC-FY#q(JXphKF6eiPlM$eem z{b-O_X>QLzF}a9ZXc>=aQMyj#Dn3Lio?^Y8UL*31fJ;LUXKH6>=ce#C&Er9+%i;PL z;B9sS$OA$F!qh7veX`T{i!6X1#! zQhcqy`WhD}@yV&doyY8%1na(XN%#2mhqKnc7{{M~^|Jpdti|$Rg$8%)+p4V>L$I znpi!!w$O@-siL?jHB98GFhxtBNS21F$phyKAluFXrQR$$@lGM*Nr(4HsKa6?gi$U= zSDL8fX9dWf%0^VDQ$B3n&PY`YY$-Y#WbRDFBxs>fEEZvVK$F@jmgXvsBMkP81of{x ztTx`g{O-$lf8Xco?)BUK=HZj4wa)h)#{b_4r(f@R@BBE=nx}mI)AsQ8S$XR?_I9M* zvgiS({!1aWDRwGUt++P{uLhH}dUMcwDOIj&e8V&+V4v~-viDv)l3rPsCJI$#GDV4Q z%*|jhH@qysSx1Wmy4erW*A5&>dS|GL2-ajG-(sdme``G$t+m#&pJ~4JdyvKW&B&QX zMx+HBS;Zv7J>1QHJ7Vv(&e?k{GW_Nv=P?eO>q9C4UagbzB{Pn(SRzBs=UeBAAOhl9 zQY|xY*uQ47KRcLg{>+)rY&^K^t*r`vaLx&rlY4XXgzJj*w^sH4oyoxOOa^{uGVuS$ zWI!I`e=UJ$gG9J$99inmVFk713%5emjgzdZ2LkAOk?^1cPY0V)`K@$NWeK0M+8cDg z*QAZlj}eN*-=%Bn)83Nx+foAeP_R(Ck+9miGXBPobG|}&+P-)gUmv+$nN?uaa8fm| zzLqXg#M&e(yLCee(GbOz1_=pOYNn>~_#5OPe`7l~ChWS82<#Ho?1tbC7OlN6Bf!X0 z4awpeU2q2@Q%msIv}Wj(F2wbX^3q{Sc5goOu+Cq9^z)y*^8?yLoU@n()~&`7O}#1V zo9ko2%cN6NBK(=vO%eooHr=#!V?Zrt%LKrYGMAcU+&n}%hvKHq?9gbdl>!-%S#tkz ze@-cAi_`laEjZL)Tr>@*OQs>IdFSlf^3+xfgf0?Pqa@Y@(UX#F)HV;oWxQN%?C0FT z#a>ER{7jL-p{@+1>^g`Y^2X97Znwip!*9YO2OqXoKyV}Rr|!?vOP}mlck7qn^ov8; z8xPy%C6jr(3-;qT-}vFXHlEK>Z~Qo?e--l6FJ6K<_E%5t_BE@LqI>fK{;EcTUjf`k z{P$}5IgYc`AQP?g>ySfa@fWp3#61A(tjwuvo}oG%2~hi4J-^52mxY70Fk8+e6BGl$ zaAX#n^r(+B)uWNWrMHtqP*=?(Ko5iAihQoddy)M{(WmxO+fN|N$>NnkZ!s~|f9X^X zxK%wPqmH#(V)01{P1n4-kjo+R5$y3XNUc?J-dXdI1AX+QG=y1L{y!GRp zx4q6c4y)EH-gf}S4y+*7c(n-YjC%%&kju-s$zF9iwSaj;j4_g5>beyITBr`jsQIRB zSQkLS5kv-`#{}Ix<}ORUEmMNAf8@rXw_sr|VhCWc!rS0qS0(wh(w1x@*ak+5W69W| z>QKvq-bOXVV`m1c0Yqkj-qZ!wnBZLCKl`8^RFNzTTWLBml_v+t*(BqKN=x87iy2@M zwmGUeEJ#O!p3ol4Xq;P zp@1t&AS+48m?-Q>^Ub;4C3Y5ANnr@LSRkm2opij_4ut)Z98LOPah(0_1Q|$cB|V zdy(ajlW3%Lyoi;SpL0(|j>R{Q-(ry_7UetlA<0C>;>9*-AFfY|%Y6JKsXLcur z`yJYr1QO7^N9_|=q}~`OKSyA=|A$r6CAo$GECYTIHC$OhID@eXuvLB0#7ULhNpz6l zLW)pzgbwGW^CgWPe30z)F%asFJL)>ZNz7j-mS_QlN`4?NG^5%+@`$7t&V{94y?nS*SAOe3yHZ&C zwxm~hN0QM)axaCfdsM@lP5uG|w_zlm2k!>KNGC-O;8L@&OWi1HhaB?h6}Aa%AsIom zHiI;VE4fkU+~oY@Z#O8099!jYA}r8r%DRLhQc0Tdgv7_a%$PHdBd3^{H}af&Q-Sc8NL_32Mh-LWsdC zm8|YKe;eB*AbA%RXk!JLwBbdUL7yc^aklHn2;V-YK|~L1i8jx*)IWZB_Ika1@p8Ss zFlWEp~!Q5(0PW*o~9XP}*0G!x;e`_`=^^%Uk404Uy{X&yscr{(?{Sv4M zoMe<^q=6o!jzT~x9h~bP3pMwYSmz+>NUlQqAiOS9D`q1J5%w!tjG5J0)v!GR?PD!0 z#-!w#bp6=Wnjcd##>6vY{^Ksje7Ao2LZau-FY0%1J$l#cckQ`;_gzF=X|fv&c^4Z{ ze<`fgqdppLIbC%UbvlR@P}EzY7pMutC}jtxe{T9ttNF3xwm^v9X5e}n__!Pe`;Kp z)8>$02%DY6h*E&2Gg&?jQdk`~o6MMCWz2m-Gn z*6aoGHLTgF^34f;h0YcoXrIB3!g=VHqyutDWO(TenKfl31(MP2rW1ufdMKJ)ULeD) z6+(CL8yW}LU}vyoq*vc%%B1U}+4lyH7+n*^IkT4l+myp$T1LhAk~iPwe|vO7eztzO z##gV`-OI0@TtGQ$-z<7!n~r6v-@8eY$A{Q7so_TMO~hwQU}%&(RXlS+|bAcR82zKp#EfOPv$U z9Sp8+`FaMgehk*8pwJ$Me<$j&eECyWt5#ZBW5`F@W|@n^e@vFm>7H4ZKMR1;y_LIf z1n2G&wwZ_Wu8C?cuHNbdoA~`rNzZHMNjilCVMrf2bB2jsapBSP5aQ zO&F2UB$!DDO8MvmPhEhBw{R>R^)E?R-k$kg0C=f{&u$VQu88Fc~ zZ_N;EuJ+L-mtaahPLV2^vZW^DT-9^{z(ImNPnh3hQVAIl%g+fx0JD3sQeO({xLfsn z^!*Qx=dYeVyy=)be^%jf^nLf_IUC}lh4$8CdG(~joK8C4PuM$(t|E|%i339ATwT~| zM)1{^&8CwS-h!RV1UoS(&xn!noCPDP zZ8KYPP3$Q{e?7g|GuBd=Z8dYZ#@1J%24uy9c#>0LKQOPz&}R`A;Vw{yD2<3cPgChT zF;&_R5+$_!mhV|tFuKf5Et@W{ph2Vxg+yort59tMS>^jOSRa+$AdAWbBUR&4O`)!! z+U}UAWfZqs4&=#d_-ZELBd~3$MoZ!KTzYup$GJL{e?NNt>h3#c)9o2m@v1Tzl2C&! zs%~m+&~_)1j77{>H}s=+fFMO6?DVl%k}Oc&p0HY{RU>aYS~kGjDGfg8?ptlLTN*?x z&H~djSpc421@)&m!544OW{?=N;cdG+JQL)EYb5>9!1@D}&5)5|V9k*b`1J|TOcFav zMU|OOe}1A#eZ-w@LBJTfvhvsvMt%ztnqd%=wBL-H&e;a6=N1WYex3`DZv8k{XY(h2 znXa!)s8xk(v{U*k0FKamQfpM*Rvxap^0W{T&|nQ}#?QGm7QiAQOOR3V0K(DWw%!YA z3}@KGgdEpR%CYJOwo7@jK}eL-S(X4u9sDJAe_fl?gvPF}Fp~mUmDtmWHm=G?LY?xw zszf&+foToUfp0~Z1kO4+xJy~0g*16OuRaYKC==%y`yK)Vq|1{e8^btcD73Q-=bKD7 zN&(dt&q_U?xZL`2&UHfHpEa$j6oc{Fl*;d9YOfj}$zVj4qetRq22rW-*DHKPg3sP< ze=u81TK>;BlY0PU6ye`Ou#ym{-#xzJVq&M<2VTPNs_48$&=oU`!~ zR5B_+TR=G@A<__tx@1x{g8*ihi*{H#WVfe5-c*TLXl;kqJPllW0TV9ZtP4NV!l;pU*%xR|41=GDav< z@_t0)w7M<<8>2{GtP?CIms}`_N_0|y(YV=lC7_m3BDjiD;H7{C{<{u|xU$RPY_5v5 zsbe)V@VSL0#z9CDV&+HGu~i)-th0YLVDT!W+A-m45UVl?hGhU7e=|r6sJ3R8PVgwa zuFI+g8bkI;vg*w8r-cpMEOSofi_HSq#6Rp=Aoy%NYExq0g$7Dbmv zT}%K}<^b+fs=dS%fAv7Mnub7pmwyLS1ZD&HEH4k{^EtN+%vDPfNufEb<)9pCF%5Xx zG=N%Yh~Xu4BCMv?#Y5ZV)qM}KW4Tpw4uB9cIv1H|ZDtc}>6$#Qi9C{#4Y3>@_GPJ- zGOJ%{>gI9hGu(Z%+rzLASk*q+*tpTWxmKb$a0iCQl;ognM>|(9u z(_MD{FvXKVy)b{taj?}|b4Tl%+NPcC8ayd#lmY=CeaZf3bjQhJFT_9e}DCCJi_3+muuejCvE)VPHmzWg2Xo-$Ezyr_N2o80eZnQ!BXjy zB^tQbe=_Y-@mSegYe)#zFGntjkl>&|F%u(Fx1^_JJKv28hPQknT2tYDG$S1DFe(P) z_k+0ptWp60T3e}#789#_g+_rzo*NY;ic#cDU(0lEWa*fT6DTaVvm~LjCe_IDHj~HdfV&#AZ|C** z<1cxvyMDzb@z&$^+cD=n4utZSN(M+W$%@J(wOsVB=7}N7Po(y$^6QomVFjH{lR#y# zK~8C#G}YPug(xpkBFIyR45{5NBp{UZtd>gCbtg~mf+VURXsarlBcP`U5kBkz_vCFPJe-3Rk(q<3Z4bM2Dd}=-mDHk6hcc-$ zt1o14nV2VbHcKOz$^Y4DT5!yYO6UHm<0*pri$f2&sOl=z-keF<8aIYCV$?TZJJcdb z?FwSi9KXDhu%QbV1qfqzJNa=4Z}x2U878FNIJ*ZB)vhdM6}BDFL6>7pMQAEWWkc2+ zVdq|pBQnaV!17~etAP+#u%%bF1<;w)z_ul*f)Pi)kPxv&m9s$6ZPSd*YSPK7e}qLM zeA{Lk9Pd3cxB67NfRgGYZ ztP0=R{mG=W0`4a-*PkCA3>SqP1Vo~=uX;V6w-S+6Lue+F) zCE>pz4G@VX6_uf3Gg-2(=wb;h4QhkSCH?B6X6I#-X&&L`n$?BBZ|B zK@8vb|IB+R-V?3?ad^nH~pAJqRp03n7)#QbmUJEBY-e{e3x%*#m}H?kMmLOA_lS!%7D~+e{`?nruU^k9S?{L9_Jfs3%}c7A5*~K_C@1%PLbs~gJYvdw zZ@-F{G+G~4h7p00RGFO9}NdR?9s^5T?_#mpVl4DV6 znbZcElyXdVHmb~=rvYa1*sMw-!W=3+2FKWBic)Enl)(86uKbXe;+wb!V-81u zWmO+>4S7fvO2tTXrzVZ4MU3gjdv(*Xsf7?+mPk}2#z2~~e0pqit^%A!neZ7Q5$3^W4sf%A#F;o&+EQ7ty(gL;fVo*17rua--PL`9S z2tE$r{!zFSrHeas7u?EGNT>WZk~4BI^gJ~o4$=!PBu1ZsylQiYKz?V_Qk~y?AWLs=VCX%BiVMv`z_xHV)!lw05 zy|C2=r&cn*=OH0#rSqyn3%6?~31rD9M<$njX>0-jxe5d&J%LqZ61|u@kW!Qh4nTH< z`+xTH4*})=bMK)y3*KSXzNT(yBFZ2x&F7!`Z_?o@Do=$~y^M+A_Rko*}i6Y87{>*(9Eg&MZ`RK;f-~^B>za z7&^cyw63J%lFFFEdr5>wQWPbHH3`_kvv`v(n5{A5&9JSdvz;QHNS7gQ#CR40;WI;! zY&Mx~e>hZ#X@=^<7D?vfaOdg6vxlec^|;u3w;s1EuHE*n+u_HrfAhU}>yFj?fBrpi zJJRVkY)@ULlC)jX6)V|y@5l_4X=Fy5Yi4GaZBr)RLCdbrE;dt^eAJgz0rws{-YR7f zaQW1xIYUr){2tW25}P7$bFw5>lOc0Zox`~?f2%kbYtuDgbu7|YO>L|nqI+)|X9hyD zH!_q0WT-+y2baaSs^dN)mfT6BO2vmPC`mJnA=Jpgi_FxiHj6N-pO5b@)yAqKA?O`~ z8Y0d>=Zh!LdwX*Cf+hCw%gdI;+m79DttIi+7CQI;g0fEU5?-$o&V-F^N!xgd%o4wr zf5cXGv|YMrTc$TPtjORqbaAVQhApqcea`=ft5K_IW<9xW zF4h{8F1sfPeo++yW2G!tr`+zBa;T)@e?9LTnBjbKAOOZ zs>?(s!%O8u)f7Mus}fV7d9z8L(QGt;K?4^N1=VQSr7^rf4E#*0V>x!9Nr&R7DnekM zmDe)Tk6-}}wu)@-BHY=^!}mh*T52hIXc4HWXy}N~k>0HAKE0dHmVcw9do$*n-y9oIQ*{xVjh$)BCQn6R)4KbA z`3L~ZC=VDl;2Kv{Q+pWibv65k#e&clgj*7Jpt!pWFIAbnIO`bbIV7-b{e+>&fPF5Z zAU3mvkAR;<8#e&YR(;_1Xd9C)p!y7^Ot#Jh>Bf(9E^cWrU$$S}ef3OJf29I=7k_F0 zfv(wDyCmjjFI!?#bkYd{8_I9p7XsZZbRavI{YaafG@=TZot4(D*gR>>O%g4!6et5Q zn^X0B+XYcBg!vQ^a?`JJJ`?cnyI@AYyRyWO^^;InNksK0qe`O^|X|1$c zr0W8E0OCq$i>v{sfCRbY?wL;@yMM*4ILwkNDO$LuDs!imq3T>mF}8ewgKd$#O29X3 zUDS`<`f<*O%k$yoox;yG70<8=uPOzotTbxW-04ebYxvrGSQ0}ZxB*Js&P2NkS(lE0 z_`9xM_X=d~6f9wo6%ot^at>h8So{Dfn&`%J1q=1hSzST9rR|&{fln1zeSdpK{WqGA ze8Anw&60i>qi=_>(5l3N#ImZ=#_d530>cjAe3#C@w^nu~>KWZ@Z@FExNjfdSG(rej zfal4f>ZTMDY{FU)AL$~r9VLn=XI~v9q;dbRC|KB5q&T5FPe~62op^1XToPv-u?lL> zK9J}Scq0y7bUCX|8~vDLCV&0x+Xkk29mh*qnpw;v@lDd_Mbgj2^&Q#w#Qq7xs$#Wj znVNp3`+xO73rVeLLCWt0%Pv)bpz;YYK_baDeVQb1=aBj34czb&-*rZ3d_0w8>mrDe zK(jzUo3Uv+QVtXB2{??7eO$>9@bv-oYGX=qeX1gjkKgY9wZn@z8-GK1iIq&q1}4=s z1DUUKFqOS>Tixs`ddd8&j}HtNSRPSQ{CUgKS-0%P_oLa$%Ct$+HC5U-BNOnfQO$~D zbQ!5dl9Fb{C=gN=!rlMt$Em?o8J$t@?eN7070Xx&&S!NX^H#DD2JAY=$z-U+5p*lj`sIHgvVQCsEJcBqr`2n_DI68pxFbFLJ7 z^+eBgP1@B&cChz4m2Je>2)`)Vfn020n!`?@R)G1eMPi-=@hC}tP(w>lo-9BjXI)^X zA7mQm)3j^wnlN?}mTk%DP9rvUhx8+|?CWRmQq;2ja+^y8^nXv@`OP|Gv~A|W80KEd zDnKGWPA{1O?cgGSMid~Lgw7DAL=k0nu@fj7Fmf2j#E`orf6~#q!LF~_N!digijWT@ z^+=$huEwQc#MYC?a^pSD$z4Sp42%~DkA&*A4i5&Veo4X`gx818HMfdXog?LWNyxBW zCC}o=WP;i<@_%bApjm51tUiyUYeq-;(3dD1Z==Rc(r?@ZNbls1&IhRH)}EJZeEIz0 zqA~u~qjp6B^zAxn^DgS7rN5QDst|yb?zrTfq6a}|VreNrw$LP5?GlkJLFB5WsR2$! z)sY7}$zu_*vLW-9L&;qb$P5cD798$mWKyMbehcAzPjy z0RhOKL7Uw}brLz;vA=VZD1tQnF6tRS+#aa&vcK`bT{&}fZ!P=BuRokCrcZzW^{ese zk95_kKYx7k`qiuTlBfOjXOG`{{Oad_@Ob$-bZ)YAMJHsW`|n9~U}PR`yN;ev(5Hjp zKpzBK4x=H-&%y~~31E#TM|7Q%I_a|+nCm3NblYU#DLUf;UlK_+TqC)mm3N?zT}lu4;@y5`87PCh;S zTDF!q3FKLMA^B2{>+Jh~OHZ*%AsV?3jrV-M`+xgj9uPUh zXD00>i9i78Ax~2>j>~9SMRMO@ni$KyI=re@tI<%6XC_R`OWZ`Y@TOWeAE~KwkAFZP zyW07(s>WH9%u=f=JxV)!$w$n5SR~y4JD>mjlXn-tzIWGs{FdD#1ZxV9?V}Tj)x^3~ zrAvn#k8T9fB#{ou)NL9w)#WfPPfzwJt0R?7BI%RQUWR(=6N8)i#|{H=g8r-8)E?$3 zP%a4Vl#p}fmkNvL-12|xi8vo-zJGf0&a_nKG=kkqD>C0QdqxZ;@Ul5#QuitQN{JNh^sA z$-t1np!uys9>auK=qi56#w|(`qDdL-qRH9!F*Cr4g`k979_2)WBtE2P5r1teEP*Yh znxn^8c9lkD{{|+$bY>1CHC3!O$&0{t_7Ir8>qbe%;RZyn3-AG<^*iZoN%afh(G_Mm zH#vXu`pcKkzxv|Ki$#CyVY`~1-6=i)J+bKjz4x%_H^V5MesZD9ZO5uwr5K$W0+J3X zkNN`@6}TXEga+m9Dq)v^U4Qq&4=V5_CeO5Om-8u;1_glRhh3renH(&m@f323W$j`^ zSXIlc15?f>VNzT&1@>%h*>0tgSu>E0`-HktNO?lH`rHXj?ekAC1VPRD{ z=r*tR`CwH7DhYo=EeLYh~dQq@TVdXLUX?P&dwJmw%=Kw;r`Cyn6_-S(-NNNFlwtc-8CCD zYkOEQ6z|H61l~C~mbe;GSOF5Qs=#i5kBko?9@P$=@3-vbHGczhba0yt*11SGKk84~ zFV^MGyY;AD*?I2Nb@>k5dftO^!DM1~levjH7o{Jl`Y0Gnovw9>FxIk0^%L z+REytHq8@Lz5EwJ+I#4(OO-@nmubM?;0BowOC`t1O>adL*KsSGV(Lx;cjwjC4|z}* zbvNw+DN9zNLw}1REKrY=`SOmFH7M^PU3~-Z$%)+svB# zPEr3}M-5|Hr0>{d*j$OxphK@gT8)1>8R0?nE9^%Xx_`P;aaraM1c@~j=B*BzRr8@{ z{+(xJT1|D4WV=)dPe71E-#QETs*;i==a*b0C8IHPKFL(^qYk#G696C6-0-Yq!4RaE zEdDjSbP8BZO9_Tm+R`D;-G8811L%nU5 z)MF7E413C3F0QEF*+9T&7`l{>W#dQ8keqFE>gepo!Dq@6#!#_-H#Vxc48VTA{Mrq~ z>g2vbT1ic!i>jH=rK-(tXWM;FpxZ4q&TQqCjtEOH3x65LUX zl$Fq7=8+}1EP+|3SCx+H1$Qu{CL3*k!Qa}eUp*VYc(}L*xb?7Ix&3-u7TSE6YWNHC zY}k2rvSA^qn~%=`iVm|yfwH84wMK`k#yN_R?}{^KNi-W>es^869KAdt!3&4{UsEw- zf`5~@>`YxVMpm`HlXg5zNC5~E!`g5c8Fi`jwXQG*RNoT18n4zyG^9Y1m+i*$tVAk_ zOEagSAvySwzoa{?dmJJBT8|op+=lv(3}Fn&zwBU95-l@mSaQIjz^KBIj|lWt@^;}| z?)S&9zGN*t`{FodY|k!R?QT4JzqMxO!+#<}b+}Cin8nK4LQU8N?%5g2S*P0-TvK*} zkcd8RIblfYKLKlPVp_GYlTACycQhw{XRtp@je@O>7msnzqv8*)o8XM23^ETXE#Lo# z@8Q(IJC@6F2VYw@tdy$D5>OlY4iaogQ>x@79)Pyhr7l}!2};4+)$I}`H*icVOMg*C z9dgOeDt7_L8KW?glEi&B$+#bAzf0q8>Gp#aa6TQraXIn13gsXA^5L?@BwXB6JS2%z z3#Idug3F6f834yQdCB8X_<@(LP=A+oyfjzaQCSl1|D$)g;y?X~hT!gTO8?}uKhst3 zUw-G!ZHd@HNs^)j_pRjEn5;V8Y@5aKYjI$>YNEd6$w11jR>icT5p39N-b^WF0JthJItOG2U1&y~O_~u5S%E2+i z5CjMaN4_kcUFM?9P94*>f`2s8C94&pO)6V6zz0&QFOnD!!&np4@U{tjajWw_M0qBi zYhFMAwKB#@EjL9rM>?P5nT8Ki&R5eKX`Uqr-A{{$V^Q@u+#1mn?s6?#`6{X~WQ3-6 z7{ih!j1?x-Z#Fp z=v|4#<+J)$B-Ym-+^XY~tyL{p3^?E9?>PgoQ$~%$$x&2odBPvdNwys72{~dotO}Y61Y;1>{eIqERdY!v9=eXr9p98fK=3;$!6+`R3Ggb@v10fLp7F~s>URW zrB>p~<1n)xOIqm6UVm$W93B#nQOHD|P_@eBJC0<;`jQp{NqsS^Q3|aEJSMc51_^!y zMK>KNO~OpJ(HTv(v!$KQFF$^@p8myUh`aTmU8%Clrz)%bVO3duJ&-?9s(t+Pn=}i} zn8`s@m%NL*SIr!w)qDq|Rpw;$N;;8RGTD#3RVS=?rU?y|S*i!lI%UP}g58g$ z+bdj9OOnt$VN{l$8A*VpUU>*d{g`SSV8i-XNukL8sh=-)cneEj;uS(jf|34kC5 zGhYu4Q|EPdn^b|cjS7Oh1@w+8=-R!Rp$wI{OCtmpkz=vOwK|KgT3QVg5Yxyq%{krk z`J-T*43XY*4ON|sH9QER%_D0VoRl?177 zrRlo!M1KY#OaY4|={QDGW7vS|9+NH>q=5y_S$n%$y%Q>vvhs``{a8J%%FQxM zBA`k(_rmFX>!MBF-%MWVvr6kS68lEaoyQnf#m=)O;z$5qc{aTi&a*BAc|0qf-?Unv zYE2~iE%o)3S)mf3Jf>{<6}Jv>5`1qRm3a<|XMbQN6TtY5`Dc6j;>FA7hvNPlw()X3 zZ7*ItJp1B;f!}xtuWIVplcvtQFrQWjnA+TnvN>@<_y6%@ zlYcjmj13-RlQ>3KZ?WvcoN7w}#k_8FgB?1ndQ_`1gO?d{nukYL&@_(+mm=0AB#-*;$vbqW) zmONz-#k-46OQ@0Vs7z=_Ynx$8rCCYDXPQ8b-V+qnf)&QvYGSG^{x~Jg&W4gE1pKAt zIs-5{t0m>QDvinyW0t;`iIP~@QUz@~pPaTOI9-D7+jCj>$Isfc=MR^My*D1TtAENu z>7*?5A$ebXGmw9D95)?*{%m|xoIBaprnAQ((IwZznWm`MCUi1=QT((qc=<277A5mZ zv}WE~mDuBu9+gd7f*N2@RJu0<2mT#3h2G{z+JssHK(i95AeLn8iE9) zBcs4WVV2J_q=gN;Ij*9uK!4MXq$)e3%UOB`#3bU=&MLbSU{oo@Dot*-e1E^pIRKo6 zfwuL7ewpEV|S%K)_=Z*Iv&6N;MSa^XVqwCvaUy<4NImviH$nz>cPt+R)@v= z=*f>z*P^CFCYxzb#f1X!u_P1~Et)LN<4ksJbFR$yoVQIJSo6?GXR8M3x#_mhsw&N# z0q;;h4IEsz-15~{lC8QnU1Ul}g7tP;2#rZCZcE0Li3X8EV5Rf|q<<>0@;6Dvt-8W- zUZ%IIcP8u^T?NSoAjM&&9mo6!mS%~m>g@1*o&P7VUa$7#^_Rc8d%6DntB04DHupCk zzN;mw_Ee(!0WP}|r;mBns21dCtut}T60|v=mdV@kxy#W2Oyo~&L^+xC)m&?HkO<|| zHMX@fcaZ2I@ke#D5`Pv3PgO}MSg0+*1hCxrlbsS2STYg?hMmutTp)1R&Lk9_N5X59 z90hc#Mh+v8bUz0O+!$E~`#K~AA^Id8=MIu$0U?I_%yV zWDncf9vD7W66gn;U9?c|hcCW*c_~+V>ruPf`C?9;FYn?yzke*dgPp4E55ueftg%~L z&}V?)vYFZLDs{H%_$K8L7o>6_v)nF}1pY9pY;@Mj`bKiq{Se|}{Q7n?)tr(%JSBKB za|vuYt6~jCbX?TS-}-URPI&9pXfM{?tJg2#--M#3F*BynrEY-9QiEt@j5~SD$ZcIK5APk0{ z7O_v|c`{CKVd$U6?BFe4D?zh(UE1PtNb*~k5 zmZV15F@FMdJxUNmZhUN(0wYpgOC5a=T8d4&Zq7I>}NaslPi$m=^ z=Tq_@*ah{iNAD_SFel3JF4q1EJbmn>fUPGCMT*OMV#eO<$Z^1SVva^?SvJj_;ZlZu z(&JuyxFBJrUX+*^Lt1Q=N+ zdIyHj(gTfVb$e(E>XfD=r($B26E2paK*A&yTUORgGGW~2?G&2cC>p)|aIe)4)jCJZ&L8RMN1Co)liho+bB}}28T%?X63=D{DIWr5!cYup+X&P63 zgPu2OIeWth4hca3d89sO$!75!NUZF#WY7!V0(Tw4CJCt8)es`LZ*VxkMDF5%+~x^9 zO;z4YUv4Ph+;Ru2iSDKlu?W%KT5_Nug1w-s4o?msIfD526G2$&U_)ZHv=sB4rhg6-z`F8uku!3g1sJ$hWGhEC-BASmVZeibsejV;^YY+#(vsz_{B3zdfm(s& zy2%b|)Y+9Bub$sBz^$J30;ZPO1#mZl>s&VK9vL3GoK+2M1c0-%i+FCDu7A?9Y?7+4 z;AW92K&_NxNlVbAZ!S(B9?Y0rK*Km|Ip6wmzI)Mpbm)s+!zW%Qu7UMf z=F!%Xqhg`Tgf^^FRg%VPT}&QQ-JLdrM28NzdKUx%!;q0|Q@apB#aMY=vt$h5Rw@ZA z&Z534K4(;IK2c>Z8FtEJrMj=9%TFIEe*P?c77k_AqK3KQeFz0wOMi$R>P{#4O&mzeePP_YULsBB+nB$^0(!i6iOTZV9q80X?hN zpe7xc_TldTv-fc=T~}bv56hwfzMKS>;R+~EX4*5hz=rc%C(tTv4V@U%c2+wHMER&t zB;iO+KR6YlZ3hg`~ zq?4r^5S}~9Aq?{Gb3UJ1{`5tA{pH>I<-@Djm*)&O9=YGnIe)`@CWS6LDtIrmLjviFb4_PMn=+wr>qNu>;8dU|Z!9zgRSyp9eb@X*CkTENvMcJwy z*b}%c3F&cITOBR=;Y{6*#(-|+>J1EP04ozaOio(wWu(n(5-%&1zNslw^Dvk@zYL^DyVX@4$tf^KX|B-EBAC?IZEvdx(d?n!{KLqL!E(WjpK>q3aH4T2(-ES0OT;Np5bQDH#;e*?B3``LKdq&tAbYk6(-Lyq`44@ z46-lH%%^Tg4`#|HnLpQ~ zf}#&%5|Vsc#35NQlrmQezB-q8*mKGVO6&Q!wzE)C(}|Jl&@>T_wwF$(_O=^n#V;?i zGQaC~Z?-cAb4r@N?uk9r)-3z9x$&) ziUK3vfPY3~2=($+3UX5C!zDRilU)v@fT;^CwZpObNf_jC_{;N7xQc~uHKtgzIxr<21Vo&-J)(0{DM>Fdz;zp^@h{A!ICE~a1Diy(62 z(Yu7mO3%BAxi{XY8x^zavS7UM7tZr z`q8&DH$DU#gzT>VEtxgS7plr1nLPzHVS6}cu|>76veT4(gM5f3;&=wWhV=leIHdI& zP=8j9#WgTI@K?|8N*p;ZzE8HE{0#_L=RS=QUQP1iKo9xJ$+OrQnYNb-$=(%o%1=ZV zlDrcA(%mj`B@IyLDkdHG>F4{{AAR*~uPb(Qw;r`C!NZ+E?+58FI){}sV)6}E7>>d@ZYoDH~|4&&KI0a_nhU%n!}-t%nx9aBEEK9}AW$e;|Nk$zjgwvg4&gAJR zA+#8pTw9}Q5Q`dIYy2z8L!?g?+sl{_t_lwzniFM~ifN2trqxwuWMc|}i2eRQe;@Lw zl9tgrbFoyp*2%lp4A`@6ah1IT0Dl7}Z!8NbZUgHOF*Z@|j7x@9wi!~7(LKJCruUwr zX>Nm*l7ndL12|n(S%yz;a@N4XMfd?O7bb_fsd19uRs~y%q@)@B3`N&rb4n6v$_>Kx zZ5bd}A~YU0WmEaddHV2l-96^y^RmD3z+D`h$~Ve?OVH`#H{W;%VkaucVW+VdEAV0K0t%$T=a(BG zPh;f}Bw-h6Uo4;z`+AXWraXjv&{6Ur-!*q!j1rYx4!y+`RiKj83uNT3746)LU;VJcv`? zkxWYQK^6K_7$xp1HAH)sGW+CcFTGnA#-6txwky%zzt#Bs`1Lzj^u4IemqBD`H!IZ{ zwbsfkJLPh?7!LOB)D)1CMv{qUs%aW{0w1gs;&mlf*zQIGb?kD0nW?_2EVs{QWv|54 z0kH=k4-}==G}CR6)qnQ=fB7C3eU@5=K&MPQm+F9JiKb#@KB&t>U2s+q}C`qltG`h_#lH`CKDo{M@MOwd2 zmZHbZg8rK#MHK8CS4DAr|T2b%O;Q6Mx}#!w&Ay^_$M`_YkX! zhM(GePP2VbDNmpJA@D^qL!yjrfX*-O-M@HAX5U{ux!V`v{?;RR5$=Vh?YF@7$8Wyz z!J+F)l2&Qbo+@OKkqj(~6%Nt?#JUuu8@CLEQ$_cSeVNYOAPW6}g5s46VYY!&4~hJy zqzi6%=fFFu)zm4&ZS991H+z96Xht1bpbx2KF6l}nIhJqO>o!iuu5v5OX3i{1#dE4D z!k1CBj#~xN7g?9fTs7BrDmPIKe7p|^I!JbxtgP(1*v>Pq+D%Wa2)imcG|A&iCY5zK z8M69nWq+(75p*?L0fM#gYdnQ6?K= zC=qme(Bl1nd$^9OUVB@KpdPnxhg39Rf2)*RHbOeOkhTMhGs+WnN${>P4GV;tLSvEY zJb&A%_x z=RlwG``g2_bORwIjU?56_7QNTG{8eqL#gIxss|{lwNW0vnRQOUX=I1Bs!8g6Y!U?k z^PEq=R{?tv$+k2)_=VtFZv2kitfMLVRbdEImZCMQBlgbPSCz$43=t$)QTiOotACZB zzaW|Qqp*Tq9(!vsmmMV+B2h?Z+#(VMua36f!Z&v#vaERWjfcm2@?u@~g5P@VzKxxJ z`lvnVz~$dUPe1zlJMX}IKFV~eNzS**d~_^!ol0HIar!t_0IoXZ43^Suk8+(?!)lnV z>u^Oz$a_nu*4P<^ly;T$9VCT_34iini%lPsa!NK!mMm&D?b3+Z?pz;q>&LmeP(FFR zp1yb@LH29a_F-&LQVTk;lFbr0LG4B*OdcV#;H_Hy`PbOe^mfpF09Y9@0b;dG450 z!dEt68Hyr#dsZu2M$};x*o@Oh9H;uX1#0}Y#mbDjH0e9Pe;mxnY1hvIURqs zET~49QH(Z^LJntnZ*%`YC`+kljBP7HM42*Ku%hU#Kg2z3F1$0y5J*EJsJgCpO2Rtk zuF^Dv;*O)>C8-UCjSPn9)_+RRS_-6a5|LvaOKYr(m zOK`m)UkUaw2%J2oqsmCcsgm8Wmwp4Y*WYC&t|WPlr9d)Z7i+rLgs35Z-`(w;ah}9LD4n z)uWPi4Hyj6owt-@Tz}T(1n(9hEX#C>=PX$sv4ke@ojtAw#3f~Al5$Pnx@@Zqs~{ys z&mf;?mfHRQ{2>H_^Pai!<6PY{-&rzEAYZELY0Tu75=0mhyy{CL<0iAekGgmZ=kXip zYRu@cDyeGA2{4wGo0h%XQdPRHD1(NM5cd znRg#pNh-v$LToW)7(ZE0rVP2?72S|ZeOiWHgQV0|38665W#Kw>3(V)18jIxOpbA6{ zc6;=L#OkCU1ecO>P&`;@kIu%xwhL-lsJw)90WZ{KB3w^8FT70?pLXO@*&*gcYOhi& zW1j)(B#JG41%H--DkRua>;Piz*40LCYN9Lz%Q{&RfXOWH&|u+y8FDVgD>xuv0B-FE zD`!R#&RrH6=Ri0 zWijG6@c;gQ`TS_QVC(T#K)FP^QSZyx?P#_3D)S;d7YPUD3PT81=fgTm;U@`|X_C4i z4eFDx>iAp}h&7#c>|oh6@99;Y2hZU_WN96A6jSY%4hu^x%=`cKIEI*y#&zWLvPhJj zqz6YzS%2=$M5$1t<{EHpa`POZRNV!KD_7p?V)5`<}HOz4I-4ljcx$TQ?@C za3MmaU|BgE45p=5sQ>-{e#{6_ zF0WA~0IFU%onwO@22bz$;XhM!S2DmW!0Ff^Yok{`)Zv^}Is#gU+}Xgo8RX;HM%M)! z^Wk~5qmvsVxyXD*H!iF~h-qT66dk(R`~Tzfpa0~Y-?WL=20pf=P*up`mQ?xqocv2P zgMYYTNc58Vkf=)`aW@{QvV@cFI@L4-J+TmtIa4wETgIt*#)CnWc@&>7F%%#}m~9jG zGmPR$4BT08#;f5x?y+UrcLe6%^wVkGx}-K{-%HKFdxb z4Ma@Sjm!jysm|(Du8ZMp89t1tzSgFmAb+`|PKBu?`G*XnWw7= z4|ZT0VMy*KvGG+0<{6#0gYm7|*?=0e(a~08-uZxRRihJMqOIhD93AO~1hV!LKrvX9_yCBE;OeB&4_y*3o4glUN!z6w{`9T3dMY4F4 z2f0ZrsbHG*zxG@@%m*-3!WEc-m(nsh`u4~y*)UEj+89$MKZULF_6gy!JRS)>s}sH! zV}ZtLVRoL6#MPAi8~;!GNQ|uv-+!d|nWo06M0JXS?{qUv#PhN_;tTl{TQ9#1Ih`k2 z)Ro{nb0lX%k;f{NA;=Z{ai)H8QgiFa`Q8cssQ>EqRV1w&3__O`Kq*Nv*@H~jnhtuEfaKR2wc`#V1H2`FQ2F# zraY@Avvkxy`*%%lP+frhoIq-e0J~;TJBZ zYg8!=Y3EPr7r6$maC5jBn}6hiboW!;p1H`{T*Vheqo9lMVr2{ryA2^PD0y1T0Bm*+ zSp^quW?kGg`NHlzB*RZ~&|TzY&4doZGdfQpi+tAvOLUzL1I(&Mu4d|j<Ke39DQWnL?T8>M>{7k_Fc2P z0peR$$nnrigdT1)z<&xE5R*ccnrLAqB}wu4E^}huX!$O`80m_GK;sCK^sEe#moc)L ze7FQ5fgzfbh^YKLJVD)yI$H+D4C8|C_xFYE&W#`EduR6#UVYizHPs2G&lx!E3JL68 z#?nc}B<<^NHLR}N<+yrZi*(`A0UmN}6{N`04FI{s9|P!fNPoI|4~dz`DMLnqYYUDT z3D&@w>Sk7C(tk6;?FU>t2`l zOdS@YBmCV-f!Q2CeuTRHJjeXCy~@6Uhs&X2IR?BkT1ud|n{di7a7n%I*0`k-L?A62F zbqVfUj||*ZZ8Lw;Hv5hH7T=fLI}jj$IY&wm0r1{O0|AMGlOT0$y(GKBmaIqh*FJ_tCumFh!*Gb@E{Y=RoZQ`~>)aE=QyUdT|M%8TN zT}xnUo8>)gt*pwC#11x)O8pg5i2yKK$-5d@*GMD44=i9DUZw`OHoOWYg~+~tIaz=9 zygylABZ@D1xXT8NTMyk;%NcXBocR#zaU*!2U04B%>@$_b0SLX+cwtgmiYHS#{i;|h za`p6U?5-U*T(iQJuNRzfW@S z>(%Q!5ZTj*SBorrsr`O`>mj_V{T@!*@4vCfmdbK!Qe|m&c}P&)k0KHAtP+D%B$CEA z3$w6w%f7N#5o+PjHV);S71cikt#^=zHgbk8GKnx{w|Lzmb46yvKzWGr$q#kgImRos zVoa{*)6iQ#&RP2J$@6)=JhH2oP?);r2^^HhzqD|43^1i*yL0h>wgeVy2@d+PSv;1d z9m4+zK6p<8BG5t_GK8`vsIP1n^gBgbjTYhKZ{qw?6ZOSj|AcMF#BN@^{G zX%ZjJE_*SQ-5Q&Jfhco~(pb(?CtFgiKEzIsL#-ky<+ByUtsm#A1jLWt1cocKO>$6j z+d-Z@rVky{^`!g0Xw_|6r7!79m42Yik*$olhD-u2IfjJ*4d+?;Awc;cQ>p`i_b5PHM^gU{2Ra z?kl_I!a2a-`f<*Z4c|SFbGxzy3Y8{@Wmc(Nw_Dt?`U(itbcybofBB zrHU+44p%799=Q_suq1Mxq*v<>4jJ4m{jOx zZMSr_D77z8=~AsfTc%1}C|xb7b9 zhb}>Xz-@={O0|f2tN-@#>mR;A(Eb1U9{O)pE!>0LGT{!5u{BN_y+Qp@BUuu13{h6X zQ~jTnVB`q6Q?dduWp!ahr-~M%@?I}_@u`;Tx*W5u-!G{gr0C^U(Q zJ}Zq>O|fk%EOff#-v)q5VH4> zt(}|BU;XOYxO@3xT#&9C58KtI^K@!D|Bamn^+Cxsem615t|Ky?&y%D;nT1ddVk{~} zC!KZ3sq4h@sLQUhmT!xBNMJ|jo8Mjhm`$$^jK;_lpdhTF6PM%`Dn&uy>5TGATQ0Q- zdSGDh|F3`du;^Jbx{Q#C;8;NDX?^Y45EysKnZ+}RN>&y3$GtP42uKXzByE$ibTugz zPCi0ftE!u5+qSifr)r7YsIxafvm@bw%j0a1wN!)$ovL5-R}$8zyk=_F2>`>*5Xq26 zo^7>)m*mLCHt>@#EE6J;;|ZFm>TrT7u?j)UWypVugJm4L#48eLny0R?yg9wj8^|7p z96>CJ)kwgg?8^L{RZM^Oy7edP?n(RA^RF(V{jG=YsPIE+jo4NrLxbweV_|#9L^phK$sy5TYjOel9fRV5u*1I)GL8BM6&a>;*6 z-~_Mcz|1G*6A~kW4t3tXrE*^v{{-Ju5=UYovk+G{uPXnoO3FNLb;*`NeRMKnB1$k~ zF4?RN%(^R55}AAsRw4hJahtRq7qTK(T&wu{O zJCEwASq3=5FlEM7b<$6Kfl>fY*OY&QebL}61~rzr$~q=HvIR-in8eJtVx-0E*=6lW z-V2J|p((vG&ISq^v?`{0r3nZiwZUszG4V@(2Ehv1R{-OAD=2D;$De{Bs$|&;OK=D* zKtk-gcaYMd(^Vrw2xu`=3IZzgGGmhB%Dy!a10=F`>GOZ78d4Q9 z7uwWE9A9^msJ;m5Hy*hw@(yonQ>S<3f#ulNa=IYT1}~?K)f;Iy%3i(6zN&SgR|KXM z#v2q)2HGkOS)OFKRYa;b8oQ6Mp`IW@1aMxRo2msX|1W#*^{eTXUiksCg1a?68joSX zuzjWbqIVAMi{{l__>cI69m#)cl2t@iQBuQzVH?gl=bYo;;&HZToO8}O|JFXm7VABS ztr>K&KlY#{kz!Sy`o8zw;d$2D`+3%aqXl)wL7R_@91&foaDI@iy}SL3-vFACrK`F< zV~~;)a)ehg7IRSmfRnWyLt8JJzJ@F^hkkI(S!AP0X+& zGZ%8mx(;yal4s7&QBG+?t55G*uQzrKtveFyKAx6%n{=#HCpl^pm1|Le5P}>m)WN9N zq;3FdSLzgF7oUT~&DkBm8~L23mSL_E46#zIp2>R;9@(rV1o`C;qw zN=rzgxS(5x*3~Flj3Se)X&qpV#IgJY+OTzqUwve9a2mU(ruu+f*Gg8W`{W zI8PQ4yngeePoFID++mJM#FQeC-gJqv7r1MvQFqgzW|2NCi}@5(sM@Y_BIa!hCuB{vzFYX9 zFJjFjC#NE_tpZC1&n&BbW|G?~aUtJGI5#x70nyI|$xfVF=;Y^;yh10aN#@VSo-*KE zH%un;7$dXAg7$ye0v#>MgzeiO{lTFF0Gv9c)8Ih}YUWJDLsDO38VQI{_mt&XH5MS$ zWfgf6SF@eDlDqPd7m<;*ARtCle@fs@)2o=~c&8{&Gw<1}Mq(yyG4MY6ew-1m+S+%1 zoU2%)>X+UIpT{eUZvb8TLDKZB^AZdx$LK6dhF8)g9fWAvK*z7BnDhaebp3QQ#4uq49B|Tqk@1+Af8I*jtC1T zEnW&s9iV@d)FA~)0$Di|U8^D2N9LpuD439J7Y`n1ZxC(R&=UQTsEEXOw1!A5jp(x^ z6*1MV>|`r4j#>vhB^4slItT%9v!V*K2~AlCm0e*T`)$yU&Zo$(ZYt)gqMywX*x#7phT z$viqn_)*k}ukjm%BkNA0wj7U*fmH3_b|uX0kq6(K>n5EYHOj=7gkcv6ax+I#}X+W00-troQ-Q|ft{6R}H{Q(ZBF_7ds2=xWtHVrv| zY@?P~AK)46Y!ypyH#XURPU4eFJVaI&tLoY(rN5AWz}d2mQj`y!l~SdL02Y^ni+p+~ zAYy@Saxs>4t6UdIiQonP_aYAS~5IB7hu>ZQzg zrFx`8fNMJSVRpHq%ekofai?=Nxy11R0(ayjBU1+up2@&72Yo6o4((snc41>!*}kZ5Y$4PjwEE0^2O; z5Jakk5x_I^giDzs-}A1@RHGV%BJaHwmL}Y(`F81Su(T=!N@fbTf9V_{%UO?In&jty z*+VdrR!p%rn!YPH3!WB9q$wAl_3JS*-+hOBpYNye5tRQPhuc zWca|!$z(WJQhbo9AS=dN=WhSD9}cKJXVN%gvZ3 z#ihw(nhg8yU6rEp@6B#+=E@p>fyBDNDIm=Xn}Tgcosg>`uSPI(8w3o13lvMfP;%$+ z^5XJv@(UQYVDX{CIuiZNcX03(P7b)XXlZh@8?e&S+iiL0dxWdph@aqZH8c^!!hHR zZ>rSt5cEl8gTT4c3=h@#r>Ky*Sr!fHwn^~`mn%*XAb)O>P=5tB69gqJ61~d4vdrcD zhPCx!ovB-O1e4G7Ex<7OXIPVljtJqR>R=f1M>fF?X_Za_uO>{ow>wGux>i+iNvCEf zKierD_j)kq;gMLwoge2a-a0;RpMLUGy{c#VFxYnRO#x~Hh=_@Yf{8@3k|}Nv7E)!0 z6K=9nR)6G+iE7iZXw^}q>!iAiEO>PUw=?T^RWhly1UOd3l=wg-rAcfyC==HKuUU1E zcMsr5I3Kt(oq(z?6{Vdvvsto((Htz&k+ZZGTz?fy1peOsm2W`huxtsHdL36K8Id*_ zkFf?o_fWf`9rHGw)m#Kz9 zwiLLYq0{7?t5vw=wYEA!IGXeWJQ%gJmvtoGW|U_}-f0(byb3G;yS_A-r+OAc*s_ZT zNq?*`y>5NLK)|DwC5p!qfj(y!9naFBvfIy#PeOXJtIqCRI9tB z(XB?O>(WCd%YGAqjc!boTL!>+S7U z)zlX#$-v-rfgijd3;Jbca&Hz$z34U{v>|5?HKs$(j>5i9Zb10zwuUV0#*&98{77M1 zI{Q1xQh;PSr9}_*tjX#+lZAWjo&DwKpMCMj=i%N%_T*Btm!j*TyL1`ne)Bx2CoH$4{iLQGW;hFeF=6B`Oq&#hav>Nb*#$iU(6>F0n13XfCCO z;7jqR6P>UjCG?=Onj&SvqQx+hPq%;d+i+of``5mKbC@z&Ey;SRns(s#l0dO>8~W9< zYC9$*O?uLMyRFLm7JaQFDqO0FLqfWFsoZ1)862tY0t~M9%cvVMLbbZjq<`*b_yd;=RuXWDFC{T=3M zNcqXARWZ$Aplxa0{&j7=)ohiMnwP-{m|d+-18~Mdu#9xn!KvmzI7Lk&&-6Vs`%yDME+fCA_R9Dp78FkSnb*0SP&es_pNf5hBwTc&! zi3-t$VNJG5O;0VJx?_?N4FQ|*aBX|O^W!{n8T|B9DB|<+6kQzBzzMAoG0B1rEFVIjzY)~RYp*H*I}ua-dG zGr&IUi17qqHd!9*o-gU*+X~6})>lXc_mzYffMYBQDW2?nPD%|6d=fC$U`qnzAq1?U zDFs`JuCw=fm!f-%Z21H~nnqGB;}8IwMPH-(Zc;K%y?;|??|jShBk{bDSh#PwfBl;e zUOFXM_!HZUWjTWyzXwDbOu^RT8FAwX8zqvSfvrqpg8KjqUbt9pkKgJba>1fHxAws8D86xuDAfr>wRK zcO+g|T$V6RAv>84SRgD+HeBtQe=N*ULK1h7;<$Fa!HV)h*Lc|@8RQV8e(BG`V4K>4eUIcfPBTW8~!he zZ*>F_;N>Pm&{VGsUj)t9sRH|+zso2^`I9AnDzI@%zWwnt7QQtd637XNe^}Ah4$=}< zjl6{&&ZAIBVuF1DEmT{XLs@;Qj|co=Teiq=GFOz1Wka!j6-OtK32 zK}@6{EB#)`x8L;v;;06>f6AG88?H8erprmCbe~>4Sy(T}sCHdiP zld!XAL<8V$$t$ucd6D>8jjigMvZZWet65_1LH8&{`dB1Pf}B?aa*|zZi+tr3Z~TEb zFTeQc<7eaL%TJy^zIMIy&^-b7<2yJ155Im7aKB6?4CACo28(BudF{w^0>&BB!5C&K z=h;MzW}CYWMlNMDf6SyiKx5XV0GhfSieYdSwiS+!86lk5%?3(R(<7e9$+k!Jkm-(A zJxlZU?`r!=i-^G5i!U2&vEvr`}e*9f4Cn>A)T*ZL;y*dXM&Uo zLdlYBlB|GQ<2HejwH-_wo_|I+6+*=if}W>Uqi!W7_9!eQi(73(cf^B%TZq%JrEFJl($-rmGFFX)m8(fKP1LY3#1ou9UtN|m1O!(aC zFCtlhUP{x6Ke8@t<*WxVmsFZSejycar8Rj5knn1R7eA;15H26V{TILeY&@!VzxSX$ zpO3b-N(;fLQ)-wAS#Ey7s2#y? z$g6Ew=46o-eE>&2x+A^w<6JL8*6#v`pFp=d@(vNS(xR2Fg!7%rp5WO`1QXfhSK9I7 z`4GV<(K557+XBiWmW|%J_){!d?rUqYBus|@%gRcn1<+YZ&k$9@JZ6;ufFdz}_J56i zq;&gbojY47YQS10LuBc_ujUklbZZu&UhZ@@2L7wa(^$y7OYwhtmAXhEx~{PS20G=) zS!pK{KVeqjS)OCcVzX9h5-_kZIYRK#y`f?2xq18dA8a#abO`_g&4P18CRFs0%JL>o zk`y}@xF}%hWgVdA@TI;NepqGx?0>Lxh1K+#M&g6;l3L}bJ4BZyeym|^#tgZ{6m{2H zDaJO*gt^;)@C{tafCHIEkQN)AMIq-oDUoDpvFhec{aNdvz##`7;KPAnx}hIVVz3J~ zAFa-Dp$O0ka@b;Gy7UoAB7L;wTAos(u|`&~IcyTglG;Jr*JBega>f;y+<&AB;tjLL z3WnM609op*Dr_fUsfI5#u&Gg%_KKiM&<-rCR0B|%&g7()&cu8`D8a#er`WSfohES( z)XG{gl2k7RA_!81ZCouo5VMx%{aD#SN1o_`65!QNkN3(!P8o^^2K8swcQWke8W-TbvvZD)a)ka$^v zrJ*{B%<6}x0binim9p<}``dqb&Mf#Vq@2ENTjWl)w5xoyZQ_zuwK8PZv^Yl&IzE+& zlKi|(N=0p3uq5Jd0%)?gjrN(5G8wc_t!L`ygDPj;|2cU~k<_x4rGGXrex0hU zOR`CV)@E_))YW!frmbz8;xc61XST&@`MCYZ-#`r585q~$vuc-y|5oyi-1~SxSiXnv zXBl!?fT|R(Ww6RXYJV{Vn}be&p>{H_3RVh0Or{0NoEuTb0e+}UP<6KNEIq2k4-A5$ zG-C|>@tQ5|&3STCd4Ed7ARQ0s44S)Ol} z1kYST%0maEHJ|!N@4|w%vWECvRXPV246hveeJ@BeS`Kt}c zo%!nZIQa7~Ui?Uf8IKwm?mTQy9Ao&)F^2y(HZZiP&c+nfaKEL0r}GWKHmF&Klt#|o z4f;WbtqwR3x=uBZ;~ck(&P#*bv~-y4RP5sH_9~Vd5QD6PbPIfBZLk{yI~#DPlAIZg z#Q(d$R)4AmRgqhum2!3~YBxCTey!Ri(XLq3pAwB=T6R&6UkgAcE+<_>s0nl_CPH^% z;+uv2#47QN8pSCfE<+2HWmk0bpm*2ZQ)z?*X*^$++aK(W2^(uZ`>eegkFLt^J$OGG z?Vb0(=nCY~S*e`>sF(U?GoiZ#NaAkt>5x8QYJWxwT)K^rFKHaA$mB1v6N@Bwg4h~- zPbc|Fj&s$r3VMXTo*H#Sj)KlZS*mndN&Y5}>fw#oE3a7OmXcLcya4s&3l;4MtMWY3 zG;iuewZyyL%`EaKnd(pVC1wKRBBhL(MT`A}w={4Putv}TOdR`^4Y+iLa!nFS=M8kC z=zrw`>r5|Ko};N?m9gX=(VTk^+@l3&E;Pq{JIjHrh=L!{N#Z>~0@#sDr}3%fAOhue ztfv-Yxk=O#jEb#DXWh*Jt6b81Bx*KK4~|;5o@kTwUd- zK;KDfT4yX!aGhxx6$JEEt$$^s z1XJ)w>>cX5;G9if&AO8gd&g;{LKe0p!9kg@TwOqTX=v*nmfw(b?1&9Sy9WF+5q$u~ zZJpp?t|j~Tew^QD+5Ew;ESp!Ke*VOfW?|{}t@`aK`VgC%g~quM&ke~sqklU(*%1^E4zS1cQ|^3<#j+u5YJF@Sc(zm`?%%nv zS22q}Cz?9uIu+T0F>HXmMBtuL?Qv=;39ZSV9G0P;e~6~j@kr~LfUAxv5=K+4RAx?Ug?+!hb}!p-Z5OK`QDH7ClMXKc=P-zm47wnSB}c^ zWzT)ED9=etl&eeh#=<63gng^$q(*CpD7WsfWfTtzQm+n4G&tjAPi%IB55nB#+S%LQ zq$`Q6<)CZ&osN5P&4ix^k@RBUndibhr-!Z#;u54Ho%?@6j~bCn^0le5Ai6oDj)M7| zqQxeypv_O|LVGQiCAd@tOMi^L%-yBYFWX&`sIEP|m3*i?!*xfXvl8~$fR@Ho&bfyR zk1aIs`#2Za@n?NGug}J-A2FF9y=tF-{G%tGo*=?Qh;>>*&X6c-THDG2d7PbSRAd3D z1$0DJ<+}s~32=XM)CggjCiFWc&aqropL-#~!x-hWD4}YRzwC2frGNHZ10=oJCR-KB zth_V3My5Rv`a5$ri59m~j@=~bLoKvY@|1REj1rCn?PM0-XvWS(XoC<2`Ov~jXC+(d z0+@^hR#WLqWDkYxwt+&%Air%Lk+_z z_n~5nV|@&=7zF@NOz8wvd7c)z6+sJJ(fK65#fsiNlFxy(K8-36hwS={EQbozF;@tN zY}`Gor&S|yYPITyDq{zo!%oS!uEewHjvzJN*T}I*CWrC>RLuwka%5@O`rjwofA6bU z@OK~g?B91RpMUi9au-jp_aQ#(hqT7z;VwUbSmZf00Kv6}Y}tE~taE;WSQimj<~*Wi zz+h(47g_U=lp$$xt~3c^+f6nUQ_YKSt2*D_=B#Y76#!jPB8BW9sq=5g9=vMU-1%{S zpGEU$d}Yy$m!EycA3UMsCNCPmO1G*FlCPZ1QvfZ@uz%%6h-!mXKY47Z13;yu;kN4I zV6()kz51!S*A)@Tf~+=GZt4t~kflB+J7v}>SlOZX(Y3;x$fGbzI(xp8M!eR^!}azr zF#j(w|1U8AFEIZvF#oq4^S^&+7{H`U0~jR*FeQXSvTHm(d8nBZysS}VS<#zMDht}J z5swTYUw_Kws?Gx;JJ78Pnn+RXHLFvx-indA;F0l3Dop~FRl|r_g|#*Vqj|l11K-6Z z4^7!UAIanHi_E;I8rD-e^$E@{Zzh`xX5rg%#mX}qSk5-_>Iu-fB7Zh?Gk?^e64^iO zG=>BS3B&4KuR{{(>1fpKx%sd#u9qR->8}9-AAhg$$rT3Pd)%IE8FZJH!S?|JRbvA( z-_gV3n1~^d^;jI+7YJ*C+g@VtTjuelZupN(A^0aWT`LFOaWY}qHV22=1o0h)da~5I znNldFw!qtM`8l$I%hpwRFHC=xAN1`%*S$CR#>(^2C-AlBQzm033NfB;@VfHqk*S4#r7R?<&K;pNDg>h#|)N32c|4(7HE>C>^N^N{_; zy8Rb=ipYbiuLn3*$WNilJu?A6NhsuZ$8#lSH2^%ilfnEkf|U)i&n^H_tmHUron6*4 zgfWtW>J}|XmLvt%95S}{a``FJ$uxeFNq?dRz`%m99t8J(oNKY#Yv|dt{>9!;DwlY& zGl;sth>4=HcW|rZ*jOs*Sh1;9%m$~DI%}=Uuw**voa))KW5Qw4Q<#D9zE}j(CMA+u zh&2DGh%JOz;O<0XtI~xA6EN8XN&C5WE$%$%_x%?$I5iWiC~aFoJTPUJa05UOY=6*- z+K9WKhBqJr#Hb5iZH;~Ev*W3vUo!6qCb&|e!=331n*}N<2rx}9v+CR;$@;)p_@yp{ zqm0E#npfI1q>n@bX3|6;*g6q5ZI>EuVHR#ci!v)EkilZ`e0f=3eZIP52Ck$I+TzdP z&Wt21Vl}a>Fm;9@xiLcH8chv^=SK^XI(Pyn!fv{`}K}x}Lph zuRdCD9(9P`dpLildPyXINTK(0Tb*NoYbRkgtIGr~Fl1jTtF)w`lzWuzS1H90U?T6~ z99htMO9qVE#90+w@(&2B0;AQd(Wmrwp~EoF9K$(BgY<@A_z@Fs|K({N8-GZm=66foMUOWm;62+yXjjE7%P7hXi#RVY z^hR>bteVy;Q$;v0rwED!KJ)Fr`oXDgS@C$t0NUqbAv&hSx=11|TF9P`-xeYG-F5CtJD0@)0!#U}Z>1PFmw85NMgg_e(hArDDXIr0D! z+AZFwLESZtYG~7{KaOP>EMMVB^0KD&uI<}@a~jxcmu`!61VI_Ihku${i7J4VO3YY> z^=eeL%r04kJ4H{mrAgd&N~m)5!C--6*&Sj^YW?RURQV^b$0SYW9M-fz7c0XT z$du~h?Crn(!S}!W{;R&=JJNx%C3b+EN_wS}kokXtz>TK{4Dz1RbUwoE5`z}V`e3+gEiPBw;Pa3(N@ zRH$a_)AV4O66@3s#Xcj*5JiFYD&)?o`O4q{(%jM=?^fHqG$~*=h0M0+sAE26C4V0g~oL_vpp1mQ1z1}ZheSh{SOx}AiA2rgSp!n5B z`nSLF(+9~m!Nsb$-CalMK_#HpM8aXpP2IwB(PK#)bs7o6Oh08@59^kxN;EprlhlRG z`ZDC87n0t&lL(=BZ`CO>nSF+o;Z!+&>sF}S>Df3)Nrz92pY00ft z4wkj6`LdY;HH=A3~95$q`q-Ppk-WSm?&@6 zkyT}@om8&Z)Ni(99nEKfP~k=uUdqxV?610^|4BM%|KYa|+FyCWpXj2key#>Tk{9DK zoPi9fjVYPl)Dg_XZ-p0tfXme+=wOFY%736DsU2fge%$K@PB(?t>sEnJ++ccX+3?;% z<#Jx}L@sCp>B_SybWK5uyYBwRUZ_qzeX_pE9ket`9nL|m%vNbBR8M;2vnHUHE~!*c z9Sb0ay-3hy+I!|m-zc+~|;3WsJ&O-YJIsz^1nvi?Ws=S|x(*90p`P*J(eZ>jqP z@HFwD4%oO(7=VcJsHUuZ`=10`WPf{EWWx#yg(K>?5;{y6sE`T>h0ZeM{Wd|l%~h$0 z&rJkk*Rc~xvbs)j>~Y{mSKEm_VmH9EXqpOZcnmmuI<`P*fY+sGep;VhGQ;2g=WjwC zfit&IoHboo+Mg>XZR=7N@>cJJfx$nh+q&NJ0~gFMlvp+GXlp z%Rponkd{+?2l2z)Qfk@S5>VNJ)(~?*!zQ_kK z+hln(V%;M7G+TPJ59Y)=&j6J>xkN6%wg;Y9wn>)?t4?wW8$|pfD<$3t&>*j|szbCX z?Y`^bdVY)Hw(jvZgCmDa{z{U6d(oMP41Q~p_)Lx~krPOF@Xb-8IVD>i4kMdrqZKZ@ z@75(WBRAh3Mmh%A@P8+%2J!Qx9wRM%u|xKRk(0TqrXF1{-uH2S;^hAF>yMjziiN>- zWyB8mg%tKeY>`Z~HCz4O0iJ2p(ka_Y)|*Qb=Pc^rnFOEBvdt{Ko}r0r$W?|&5K0#z zgPRR9paD{-n8xo_bwdEWa}r;6u0zuIlXLt2bH<1u4I}aMxPN(-AeCV@lUmPL4J{Gl zmgA2lS)99dQst6jWJrEBo0+fy&x&<-9c7HEhNgaQV*7$`+q!dbk;ExDTpX09R+8zF zHv)TK0UY!?N;q5E4T<#8V(9?*qK-EqnPl7=+mb@~2MgZgM#azkauGjOdzd|Wo?Pomf@wIr?Wa;C#p@UTYuAT|I34-ozAP4e7vGsb#y8< zn(i_}gzSZK2FS*?))6+}!!etH=S85cY+4!Egywf3DX8`b3P6~3(s|HPtn?wEmP4gr zauOo?$}p)9pnZ+j-~QLPN{5ZGTrwXr%q&Ax8q%&Z$R&$;b%q093lFH&4z#pFFiv*z zT|Q)>dw6+;(MJ{SFk5`hI0ul~@KKP+RZ9dAXUHf^)2RH%=A_D? zO@0bVH9wMG1B9tnk+ivhyM(pW{q29(Q-q+h8h_KJ7u5<;jGdtNc1C1R-4pA)6k3|| z?jU)U1P3)Mk}uoRF3hkinQcp5b}grq6`;KO%d9RySTiLXRhS>=BB>?#p%iPq6wvzZ z|2S7PM0wSiH7l=0#Q~Z0cBA9IVprAG0qh~~s1hItVA#M&$^L|`vIk&k6?w~1YWN|r zW`BY|XC;Yu>HUZm8Bi?w$lBVW2vZ88O2fSFzWtwPM(SdK`(5Z8kY6naDdQ8arwL zhI-J2ZXa&{*EyBeMPDzT#L{C2OIDNh-G99h^)~Npb%hD-v7xaxb=WOM+EAs@%VRlJ zNjhe&GUS9SHn|aM(dpSdAF~=*8#cynm!d(NeVYShhlCSu|Mw5R|A+oW)6;MM>HGEi zZQ}mxzX00sEB%Y-pT7C6uN*Y|=6Ak$@%g7;eDu+pzx5aWY2W{)@Bh-DV8buLSASGm zvhs6niIRfu)T|h0PmoP7;Rz}0OSOk>mxKh3ti!!Ngw&dCbw26}rwXihpiOXP-lIAi&ME))G-N>MLHJ&;e~7I_ZN)UzPv& zXU`v%*57-`o@n*8?@*qHU%!VY%RAdJ{5-fqJatAL2|bhWI}HIt_v3?gM~d`a-kK`z z1sqg>LMfAA>r_52FX0H~WwGoYngrni<2qL*(r1;B=8{-14g^)zv{cw4Mt@jm8V8@^ z%fLX!T{(_@>s9?r?;8iNqli$+C8sFSSyf0$%hyU1U&URJ#s26*i+zpQS%1;UU?mTHP-g5_L6_)QQZv-&3MEHv84V9=agC_FZVC$Bq_wYNTw- zM3!w9n-nGpJ(#-gn*-KahkpgU=o~_JMXDQ<-?sx<5a=slQMZjM-QtM@m{lG3d?O%L z!YHo5rFLKuny$sDvY+VfBOeDI?%DXby?C)6S%=(v=$;g(2p4gR_u;3RW0IbMvr_vq z?9Hmv;b|n2m~_AIq;srrD(A{UE|ylb%4b;eHFzme>%bmRS6Ti;=YN9UsaUpJ?{twz zbSKDbg0?QFz&)X;{wq!&cE9~U2MdRAd{NczC+UPThvISGsz;hqXA4fXtsaC1m6pJ6 zm0>wCBo(2l)YS(z>jH#%5(O&>5GivIGuOl68Bj9wiL2*!v}#Pw>Itj5LBBe|-uZDZ zEA@LHtvAn}zmV<7>whP;+*eu_D&m}!#*L;y7w&Cmu$F4$6ERYThJ99fA|$WIxFLgp z5#?C8O&>tcnZc};I4IE}Xh(KZUtiUd?bS>-CDyHj;XMXef2dka5pq0^XAkW_Vs!-w zo@7h__?OU_h+3m!ewPh<5DtHr%NI!3gDjd0 zc>;vlJ8R4L3ls-;bGQHZo3Q>;W|RG%KCte7eK%SXh;Mws4pdw z9EM7`co&&F_sNTqzqU$)t8Pg7N!ND<2M0LUX+UTiTtWianXM9ZsFtf;*Mq2JhOm~( z7)tTEb=FWP8~F@-s&ao>XT;QEFlDbG^J29?^5pQD6+OwXOGFnc2}jX#l#KR}*i)!1 zjpGt*b8b0evc*-S?2`VTjfy2s9{kSs0xR7|@r z)O$b9lMD5idwYNV)OEMa3hPvP!~l(|XsfE=vBdy+T_MIHCp~dyXr`t%!+o9ULI!%9 zs@4RF)`z}TW4XI-z2$xbkky?}O!8(lghtmAQ@6YfoSM45YY6W~)W2Bk@*6oRm3*g{ ztd_v+E>*sKV=8~uMPSzegR$#ygo-ILt}BapOhLA8jr@OjC{cAlb1)g`z_lW4grTNF z)~l+!I{T35&Ijn2#Kj05_g)Sh*OSt02`tSYC0cVpUem&k^1JFVFRxPZ1!5Xyx4;xb z|C5Z|k^bG~Ol6xsP}?7T_b?Yx|NbbylNvJ~VAk@fNE6fYn0FY7lm9yxuzTCZPz z`rGT-e)WIyvqw%}cOJSY9oNmpas6AUnMb593w+W69fkNz#$H8!!^`a|E2!d0Oe4!u zCdVE{`*lVj0o)FhfLApyTP9c+0X3VjNg75a=&CZ(bmT~EsH=CA;B?URqHdF@-pO$# zB|lF~?%qT9gkZqCOD=pnmt5;MZXpjNp)43U_yT_r4GTPfYST;(HUzU#jlD$d4^@L?LJ&4{%~-2Dm|>KHoLPKYlFRnBjkWhKid#Wl zs^tLlHs94MV6rTD2Gat9BTSUspl76pU|Izz%O@?%i`Ph4*z2|k!fd^_vfo=umadKs zZ*_kTRz@g-rC2%Cs5c@sC0pmNOYYY`dH!NPd$}L!Gv0aB9<8=?F=|cUPNUYX<_Q8j zFg9AZ2;M5%*=_35$a*&Zicmg6dOn;=qHHiqVBP2d8{GmXwku2-f=M(nOA-bH1gkot zoF>%L%U*?nn-ylg1jEymtyb*)8sH>DtRsJKGeF6E#hK*~U3UX!MQ~ONx}k9{b(uf| zJ{z12P+3$cJf$6yhuCE{&bM-o+0^$WRw?^=9#Y-_Eg30-E|#?f?zf4V6|0J@>uP%& z;2y=cJCE9abbL4U)vHhX4^6RLXy0 z`B&cx!G_Vd8j}zbvtoBD{A@XP+)EdKE*oQ<(ebNGQ5PGk?}1y56|Jf(+!~;Z+h6jb zIEst*lym?$m`pXbr6$!S-&^7%*p9{t*hb4p$<0Sj6pJe{J8gYdaAineWu-ACQ|P3t-9vw!cHI6_Jq2(X%EJ08VYV;{8UzI9b;1S-8ZHO5 z`Km+DvewkXCy`h(9WXyco5GG!wn>JsPkV0l3otIdl{$`sh1KUbZ*u~cWp(8y8Rhx0 z-L%`^{<06>;|al6RyV)=^WXmB`@i&X8Vj2-f#j`I>?P4%H~_S!N|;ej9+H1&06zx1 zRn|?6XMq>p>M`5C^EM<2E6%G5jp$X3S5~e3y)3(p$o92GazJusHEtcNQa;#u8M9ow z3Rql(a9GO9YBy4`hAzsc3P7CSyAAnzb{<1bkxqS#Kvtr)hfC$o+6rtX>1&m9X3i62 z;su||bb8r`z>9d_;a*wJ%E-RJB&GR?xpdXj9trxGw(5^?acOJjT z5h8z(KFD8<5D&lc9t4wA;gJTL-%31|nGkSGRjN?QRJ(>M4ZZsD5@7`3nbeci;0RIU z-*aY+d9}fg_ja=@y&849rgj#h%9iH;RLo^|nmQy^Gmr{g83KAexW9k%<9z*6d0WB$ z1b_D~HXu&|k4qaxDUGk z5R&|2i;NFI3s$~+<)BqvAuW=IgVAN@Mj9#*k(@+~GT>1KjGBKHqRyU^94dScyx&ob zu}L-CJD2+IVRw)+{o9!(WJp^gM_E|<=q7JnbP#Dsh0?;?jBn5P`rtv_lHDpUjsGQyF zIFhixSJJr3e>)|jyC1*_7jJ)so?`MAZd5*aAKPcyxQ436Zb)$i1L$Ccg=5l4vd57+ z6YMxhi^nIU)7zwixuHI4LXUAOUmnn(Qp&blmN*b=LIi)&C#|5{!zIxZ%l3n>-2O^E z#U4Y(2JBTvg>MJ5$de>D!-TG-DmqCsv8>J$j2)Z6d7&P-0iRW@cVz@y*E3L0$laeff6eVSu0m{(-Fl*qYmdgkKmJcyY_Oo`z_RghqDBR9_~a^?d%dZ4UwFDz}y1LJ3rv6$|L1$ zCh};qL>%0PFm#eZx1tH5ENEV^GPDxcW48d!hg2*rp{F-3468Cl2a(BarL@OP;|gFi z5l(-Gk$``7kXlJ6McGJ@w}AYrLMuzvJAhpEBdR4@DsNMTmq+!m_tSFNNdIt?BpAsK zmMD^LLyJiS2|<#f2lo(P8@u3!B`FY!p->E46(?f3-q>VXovZsZ>OaPOWN8$>nl;);&;h%={34Frld6 zM9n&Cj)Fr=-qRE7BZ)yx3o<#~%2IG?$aGgL-C!bRD5{Ho0Avno1yZ$y18kan`)hyn z6axk^T?xUsBoPnO(@+Z>aSf!!2-#X?f5O8MW0qUKNI%9&H%u~hq~t>OQzx94WT8yr zgLG>H8Q6P>*QgLF8AwT4!m2~4lq7Y(NQ$(#zxKo5yuXO@FEpKhJ~W*>P)g=cQ5}g% zl4X-l3fo5l&VZpFX_3Lgy_(z=3X%b@T4 zI9IbR&Fix^=gSw*+UL)oh-QBxdt+Mljwri~*&tK-+z$q_Ojms_;dcje8>}&C(eBeh zAn85=u7_CyW>k6-SqY1sBu$yL)s4ie7BAAOhS&PMWlY%^0PTSd1-tNO_j}?DcTU+? zLUZTGd2(Jq`qAgl)K4&}_lI{{5 zK{m6+*PH@>#M>%XS+##LK+#9w@1CY~KEJ!j%7Oflfmpc;Mm4-Mqo1}n>-C#&L@?NF zmRmP|@3xMQoOF&YSA?#Y|4M=5Mo!$J|WnLT16nC zXi-gbY+=trFwufQ`8~-9gDQmOEGVSuoU#a`$|949!Mn9kWumR)1DQLJJai=1%a3K2 zey#n^>u0a$C+{9{UqyrOJa&)7Ed2+*mai6r{Mwhl^V8#x4xk4rPj)L9Kl&-jL2=;{ zhTS~3M7j?K+i8E=7P@>%iB{l?z4Bs3tNKz|)aVMkc^SN!cxq0oMA=U9!B}K7D1?Z{ zX}&Igx5y5hx4&Na!%5V1I;&#^-HMaa$oICeD`DfFy(j>`&1Q3^L^PKarT&+BW&=B-o_AQa39ljRVrIeXBGxCB zMM>Op2(yJv*UB6C~>`%j6hAls)`WCE>@-uX^vre6fh`LGu>8cFf%8kmgLOd zxmlZ>dJlgBiK|r7bycE@sppsze`oaha1HI*nJVPeO)(4;%*sq<(%ED~`FKsf-+TQr zd+5bS&t9#M))P%;_Z_>R*9yQc&l@8=VMAScG>8;ijY*XOZ9VD}84BfK!?qEIvSi{! zu%PJ0m+iGKb zsLa;IU)Y_%Zlu@Gd`PplpJs7&>P*k0+odYGsKCvdtU5-}y}?q6gl@xig|Hy35V>G| zPF{kx^7B!bxtH2*l>TwEf%yxUHTNseU$5VNboqVnF?&KJ-dr4-zm;pv7MXf9wHEJE zwRe9K++T(n)k|Mhtp!p*mh`P8;fW?hm!)IjV5C_&oBFxMYKZYgjou5KZMJH?*DjhD z*)oxz$dw%grIRY78t;@-y`EVE2CC!3ihP-u3A%YCnXSf3)0dGWcs7!^$-d}W0Iep!11hR>fg97{9W{`#y!~5};ajQwHccsD` zio>&$NLI?-F*`XKs|Lx+MyC2=mi1jhpi2bL1@cXnI>z7}=8jDr?Os@7%b;fCdO&efvRf@xeaRQq$I&gAUdUAqu0AH4+ zsjBj*I-y#pk{bFXmLrc${3*a4txwoWovWD5lne~HA$%~$Yj3M zfqW1?un+9`-l~2-uOfqwr?^i*UXy@^j#}fIQ&eiF!?=v$ZB$E1>MO{)N;iNhFK1*G&5zr`%HJb*azlS+zivLG z>qb%$DKkgVA2xARZG^8z)mVGm%&HE)gO#thIW{_}D~vLAUajuv3N%qw5J7wl6Zjxm zCR$Z~L?Aa)pW$iV>06uuI;&L2nkt!yGOCK(1BjU*p$l9_T!~{zv~=;FrmNjhT6>km z_UQI?y*_1O*W1@S589)e!Sa7Wc!wqb>f7J=>2p^Cf)1E@teZIi#}PpFhFMOKvabZX z5>^M9N&9@pqP|-gr>#lyLUK;dqaCo`i_4n{8k( zYXH7-`r}SnAc>lstcIcMv?C)IhbY z46!4zIaOKYrGTmC{wj520xxrSgvu(v>r9o00VFPwbwa!S&F3k|$xd)c*eAGLHn2G7 z;=me3tg(e9PcLhuay?(F;qgo@@8x-+0ZNG^C$%ptISh$>um;9C{~_&duU7Y_qZ~p$ zabUs^CU+ou463$YW~$S* z9dRwj&E#^LdtG8S@{kMTs-uJ=0ZDek%5|y+6L=O2o2tiFK_JcB+u!=(0dGsESxpyZ zIxrb%fh_iX@lO#rLokp;sppv)0c`NdS&OalabzinD}&FVGFR--6i~akYOm zHb;zJTIi05aCOzY^W$9k@A$ZV`pHu+dVun6L6R)J)??6_NP))c>L2*E_fq9#E2p+n zyKoi*`PIq1AIHsAcgMZdnj~fI5-1)576$w|W(Y^pagG`4iQqwpN*ak7l}KL!6771= z@#Xy$0g|2BS-p{eb<5^qtwc}m+EQ5uXN20x7knK_MlGLK1`?szDcs?}iUWY5!Z9|Y z?6de&5=~WwHNismA=dU|w%`iGXk=6xhP;tfqB?JX=V_$azSibIx*kSR;Vq=wU1pxV z?PA>%%&HU@ETK?dM`|C@7E-Khj-=J)Xz5gqS7dfXrjQ7KS|#7YUx;Eyo!zSZO@fb^ zF*b5qu&%L<{O#|0*kE=CE171ll-Nko5Wj^GI`78$$v-OL>N{Cr1m6M@r zmw2Q!Q*_MQa)VDvAwsP%QRS)3QBH~21@~xes`>j^-dM?rjGk_P_bI=T9Zj8q1W~0? z$sZE)rJU-22QUQk%tQKpF4xHjd4t%O?2DXZE$fog=^9|mJyLsEvYSrDiI&8=JinYe z9w7p2aC((^ChM$`G=rbE-2R?Ze$$p?s+<(9_yD_Xk`SmRi}lJTfYK8!YqoP3>%G&( z6xk*fLa}XX{3k|w#cdY8)D&5}^7VxlWydzEtWMy6Xp%GrROYA<&z6YkayK&e_V?;3 zn(n0GudIF(G6<(>k5u_wf!SfN@&qBot6)J2pq?4tgt24qWk)(9rdDj=bA$@vuC2f~YYU)5pc@rOlz;ZJ3V-mp4OV&ejpdin(%8V{HOYdGi z49;Jbe7{VFcNg;fhtIMKt;&3=0Ub-TQU#2OZ6cFPx3-JK%y=#z` zd(49{6Y9(_5(_Nk&c)-pY|?%k9n(>;0i)a25jvs9L9z z?A>J1U9N&w;qCI)-WS+y!^4v#Nh*b1HN>-*=49tfHI109I=BHfQg1|m;{^bcI%$x% zvzo4hxZ9M5`xNElJqNR-HY;Q;6ejDD>;t@#yP6vIe>H<6IA6o`3Y>Y4;ef zi+j1$>)LDUqKufc_=dfYzYoFEL#ooLl7&rX)+P^_byG$R6-%!mG`V>ToK;=s!-x4z z5K@yswUMU?xJ>j6MoCJ44r;d|HaDBXHC%mJqom8=mb^|uB3~|BQ$FHoZcDl?h-c_A zw&dKCm7%n8x`-wYc_Pv*d=b!mOvpP(tC1QK5GYE?(#XmWA~>>)i_iN_)dw2##GDay zUT**B$;J0p{Qbv1JXN0jp^^N*xS4z^RebG5Qs9OF^rB^UuCE<`gko)F{6Q*&rjzb7 z7=ewIWTmTG#MlE__ z`7%{Zy?_)$icw_S4&sCktu&-3Ra#*kN)yHA00uh^63faN9p(XE7k$>+|~Ji4&E^W$6*!4F?Q`%(MsDNR$$%1oeAzk^IgNqtowaB$9{ z`$X1}T`3mOJB);7D~7SBk)#ayne9UQ)Le$*w7o(0;JXb8BxkH%$&qpsH&#jkM%I=j zW)_tc`&hp|Ug@!YyTv*Y+pxQh@=qGVPichN9&BZsh`XSFk%~IR%REenFX0nO*`mUm z^lut`T(+kqS0JxcP&&&!0DZu3o$SkPO%Vtq#8BJQ9tp&*@FfP|K{5wC+Rr}~| z^DmI#qo$t5D(QYBc@9_=$xvtBuwd_q-UiwToPn(6<5R7> zIX9qx+`{7wH=)#|+dp-hT^Z0VGbmX?NQ|uN4Be_{5yC7R2ZlZ=?8*WNzFL-id81s3 zsyH`GcNl3j5BU#RP+*Lw@wu2I`?F0U#pKRaRoS&V=&)gCJ&Z6=c0AOq-sj4E0leP)`6Ml$&JNu zyIfQ@4KWZ^fUD?Mi?7XkeYt)^Jr+TeXND1iGyoY~TtYs8dMiOutEOrrID^jX+W%WcPRR^$FoY``T=*t)>;9SbdrSW9XE}KJ| zB$bx@BME^>M-?osE2d)JT#}rjyjP64>8BY3kHLbs$*DG194lK5F$4 z5I~|(NMV>*!xU11X(-k0%SufE=vVkh6GD z2VQ{XL&9a-A|3y%8aEX;B)%J*%GTb%z($NTG9Pv9a;V18O4yRB=7-?;j)$~=TYb+J z;=%gU%9QLZT$`0iR&~)|ugJfI-vl}7(~@f7o;(`+qRS(FKtkCw($^k35ftm=k%wf& zw3mp~1ccnHAhyKf<%%v5Be|Ch6&yvK$!+qPjvRx!Y;`E+U6&`R1gr?c+1~#6A31tV zahfP+<&TG>!a)q4A;a=D;?LO$JE>{AX7MLd8ws3}p04?Ihd=9#w|K!PmUZZb%6 zcL##N6GD(&Aar_e-Hl~}G7&iGevJrt`=fv4`+wp4(;)itD*StrAbR-k4}SRitq74K zbp(&V=41~o!}Lpe&=P{>z$wb#66^wv3mmTj3&=eiu&Y}q;Nwx;l34LtHVgw+O&huN|r zw*;hk7xmUgc+>3adKw!9lN^yzM?(BdMt9^sTZ=mWjJ8t&^(3i?b(uTF^yr%M&X4mG zm&$kg^N(J9@mYWJFl+R!gGJEHsO`w!FAyhiR3&t3QE1NTMu@n7Vu)iULYzC%x#Z&# z>~)o#Wa;dZ49k~DdsbZ}8TFiO^4RWZG_j7dkyteNYRH2~eTU}j9Q8^Rfbf#Ws}Oa7 zsPs=^GyE=l(U%}|?m@nG4K$|p41Mo~Ropo1hZ9MziBVtJS8?IeFxuwu9b~DlbTID`(C#) zhMZJ=mBj@RU$YBA;8A6dC4N#Rn3V#F(tseKtOO;mgR5j}v+#$?mM6E&1jUuEBFhtM z>>`|8#gHs8eFWN@#Aq<4OtpX{Cb>C2Bk zdUE^fD!>>SUP~-W2a98?gHm3@x^vZObT{%ov$A#s8mVmz((k62BU7%T`_l%h%h??K z?Dm|aS0F)uty3Wla%D+fkWdhl4nK6j0J7l2o;FQ<@AZYMX7;BCD!`_sy`xh*K)fUv z`+$^?hgiWZ-%y82a<*>&N7S$g#=sMFO)e^_&eKR%w{pX^Q`h~fdq}Fxn2ZF#c@IgX z5AQ%(L28}Xa4$zaUDG<<8c7#cl2magq3dn?lHp2!FtQvwWeRI`tq}DyOWAFRP=U+X z>Bg%;ws$4e0A4Q}>^`BqaxEpQNNL_$`D%jZM6cYe_V+yRAK4l_^4Goh$USLm5HGd{ z@lOF;gKOi?oge4NOXS5%(XO{~Sx;z3!gJJEVO0P}l zIxWC|hg1*~g4Yo(;S46$N%hvVIHTIe)IcCxbY5u((2+DO&0gT?n&cs<`6?iLLNcGBAA1r8#P>DqvKrWN#5nqI$33ROaMWdT1)I!X5&N z=sY{HJz1YpV6_vlqJqZd%wnmNu#8!!DWpt)D+TjDmut6w_FUQi!mQ#?F|&&Io}t*F zEKK!d=OzV27Ek7VLX-GL9(JgIKQg}Zh6$vBaWnXLnJ7(pFJmj@8^#jxb8f1k1|xg*dgZkWQVxq1x&3qJvI*Kz2&p1zvO1R}tYOpnQ#dK*Px&)Bkg$r=hH5d~I2YEY7fA~;A#)^H zjV|d_FHa~otP&mQI>NA!jb!$-y?M4@ zEgtWQYaY@=l*ooU?;u0KyPe7PI`8M(OK7sB1-|j;1?V@tYKOr1QUH}cKvo562;i!r z2HvK#m#k*44WoA!oTfjKU2KFX=eZbwHRm3oW`g%sb<4dyfKJnUDOgJtHA`PWR@dNp ziSMPzHfAsMWq|IZROtwWRM|g&*_o;GaaFBUX@-FK*cCv=*d|OALn`i{ds%!dOiE$Yqs+fiY8^LJCNm6jh7*`sxrE|gCa;E z%W?b^3GV`CnR3-s_W(~M!B|x$sSthhGAh610SJIY?I3jlnU_5FtlX-9mrrB03TQiG zH(8h&f;hjnTn*|*E(_r6U`By2I?`y7?^&9vvtGIxJzgp-?j(5A!GcAm9BiDaLmL*F ztkJcOYAn?sZEN31yP<3&Nw5LhCj)f8tM6qJ7>xz%ptRRHz4zl>OSC?3Z$5q|{gJ1{ z@luFMx|1xEBh9C-O|6fAYC}5;u6}}wEU<}ekj^~`h>3+Kgpw>6ck9eN!?}3qXfh#1 zDuCIKI@sC((4Z^5uHO6|&<_;O0Cp2DBv|80m%>Pe1(|2cAjiMe&o zTdax>3E2rIPskstcpgxPW~!uIiYy%)gE*G-7@zKs-x zoWOv9`|Y3q@cZ9=@8sMO$0{KY5HO@|&C@ry$g$&Fq5C5Y2f>inaTO)%x;x^{ZDJ=# zo?A;~NcqK<(R8;GAvEha!&ghnR;dV?OqpNuP%_w+BJ>7Oj%!BA8a_$1k@;Par;8dN zWZUc1RSW3#UF8pd;KxSx)cICeNvnA=zEWXs{`CGdyHf)}OXbfL@i1m7O1!_y&c2we z`gKCJ+6Lk|!p8+MFR_VC+&^@8jVc&6befagaPdPz{0+XFU6+%gZdKZH>xeOX;2@v(yh4s{{hekonMm1SkT@qH0D$P(%o25SHRJ zJuj6OLTMRpwxbFRu4tPPRZ+(2-iXHO`lc%!2%qZirPo3zoa#d(r%76A&!Oh4wbh&? zUtLud?5f*2W=l6V{ur^yMMRebQ5X>-OQvxPs58|V3M&SwkE=?@_egg<+_TSK&M!WF zq}FlovHRJ7C`>;b!Kl|N)qV^%*q&28pM&>Hyn&>%H#66uoM1xvMP%LLx(12^zLb3g zCDnjfdjfq8$8dKxd(<5rD6b`TkuHLYhM!%g?!7_xcv(szJJ?nD@R@l2vyyW z!x6OFRNdL7A=lyR)s_}c4YlenJA|rxSu2&~iCHjzqrzj7A_h( zSJ4%J$!>N5EffT3(4Zg<8hFX$4WVkJCK_lU4NBt&9GiS(L}n@?vRLeH=ueXO-h1!8 z{YSKZ--}3QeD`KjRr!)Psue|4BA&bVyT|Ok);W8xl@fB5XW_aZ^`jqu{mG{kkZ3WT z*Zz%1@2XObJt@^Z$=Vmbcl)ix6NGq!8JqXr_|Q2X(Xp%87d*0pX>Ug7b^gw?DVA*hc{Q^wDHfs)nOR5!6LU zGf-G9=qLi$w%{=8QhBHWUU;gYttK)12 zcjGa;l0W?^fBL71Ave|@`*R_Mc7=O}nvFQ%n#(D0^{`An!2+W6(71+$yqHE~!-eLzSFnYRD zr#|%J_-`JHaC6PX&8R?_FsP<~Usy}<68o;8soZ-fDip-@rac5k&nnoql^K+~ktMfX zRH+2NHN*5ghz<=Q-LW^FS4Nm*GzA~J>juU;)d|Xb%AP`rVRf-am-nG!YqwCiazLRu zT#rEK%PQ6I;VXu_$W2eb(rLwf>!W9%^m8=1^^jdT{dRB3mpy*{^`nV@;9Sw5X)9F4 zxVb9S$d$wSOh_8_E^%zHd4khy)2(7E&DSmqDYzn3AcE1TXk+v1g~|{BG_(~9qG#6+ z{qdDU&|f9(S`N^YIjq2%KX=pK`f<(|B>UwDFIIcTq1Lraw9v8U_EB$mxD48@AkpfC za(SFit=1;io4fVesuoUvLqsu-gowz(S}vgC9l2z{aE_V;npKbqcR{OeWsWyYM+$#+ zhsaz*cq37Se-(}}iYbH~2BKC9ox(`MGnnn^VZ03poKib)r^dL@BbUX-oTA`FOSEe# zDzcWN3)^X^3hn}7Dv(pfEAClG-`J@dTP6bLTB(QXNubQXYoyPAlX~OFIm>82e7v7M zeDt$d*Xr(CO9+ANm556_JInDNl|)U+BU_`~Lp!o4wxETU4jQb5X1~~)z%LRxCSf2a zs!|nordDQckwTK>mY}f7l*8jo8m*wRM=FNXrbtus<%~XB09q6$n(|AS36VIHlx2JG zH1iGI-MuTEKv}JSI1VmD?xvweAJD`r8Z*=)8>@B&R7Ar(m)Pqb?X1T^m}c zhq@}Y5gWQu z#4feakJ@kU?8<#wXa5pvvv!T!K#iQwXuE+gX5SVd)5X>MhEUe4zp(*H(yqVE& zAH4G2X#V-fAKPveUGDXG&j(ewnxDWyQJiVdjc^@@r9p$xH&z0A= zew?#M=y5Cc@ba$pm!CZQ?A6tZn9U`3vm3V+ra|v*o61_jVmjBRf}%%pwp*&UI;VojpgBP)G4!m@kGTx` zoH&tsr9uVNj(l%Y1QTYSC`cSip-QFaOp*oIG{F-;KF5ilrjOn|Q;5gGYm*VnnuwoL zr?D6=o3SeO(t5*z%{PV5m?w%yDtw52iT#g%mC(B8Im8&X4tur=ntIe;^uvh|ks|Q< zr1FPaBS%}*f%s0O;MPO;TRWn+4KLP1#u%Eswe|(MFh!^%5{YKcK6rdAXgyE>R-zXO zqWN`#iJXVkB%qYFqBzdig{aj=4WNk{3+pLdQj;#);|}}VWza{~$gFk$PkaMM^ivpr z(bHt3c@n0?nq~SxpG2b1)y84MM)tsmq9>`;oa>Q|Q?jYF(giGY^m`jaq@y^i7Ce?v z(xf!H?qm}S?7|Qi)D~M@%c_)xyn{apZ9F8Vi4?V~A zYl-9wgX|x@_MpGhKG29>bTi$0Ab*Rd>SLFDViNh@?Ix}z-jH*-Xj`H@SJz`7*-v+!` z!K5k>A$+Q6i{ZuAC*^O2w-5bJ@$gVO2Q*_K^MuEXqL9fcSetgy4)M)g_^WG;9N6jB zUiGJ0zV+jL`7FQo6}sjpMyF(dXl!Iu>v}#;Y&hQ#mug&~h_W~l^hQO}LFa56dke;C z-Z-kUy#)oTtcc(cRi7p+b114M1VOp#Lq}DglU8soBrOd6<0wq5?qX`gYu!5d z^20~vHDrlX(L(hFUFf|j0-e+pCfW_C5!p_mJGi{Wm@%PL=2SLF+OUm(s}MXLcf{*NQ7De$Y@ZA+KhxTr+kZM_0PjyDl~q5>BW*=A`Ab6k+rpGc1=Ne-uk1 z;}h7Bl|##gT~tsk3tX5sgOru1r`AcK;(w!Br-xKJN9#|iwNGMk#}$CuAXC4r9I>q| zs1`+5I<01wGm>ShYaERkVFJCJV1`e<()St|g4|K0M4(Y=I3UY^c9>JuF&Dxb3J5G# z+8?#f6OvuODPl+U{-6E^4C|w5g3d};2nUEh`huv8!3;C8WAMN> zh_^ucI3^Y#sTtX?iG3E*!#=O1ztT?d8Vaf(g|LunMA9TtC?w8&2(85LDRP znhQG%OtZ}+rAKssD~m%|#R;#W6Y>$EH5@H#m5$*wM#CtGi77a(;=a&Nq$ocD^xaP4 zHCZW+V=u~HgrGEa=r<*rj=T^dCuj=iNQG7F(}ftv5r&WDdB$e99=I=Jvp@QjTl}B? z`e8rR(*1k<-;b1<`@8=!yeVHjeEjz*%jg$>^6Ovw>p%T}>1!nShsUq}y|hRDp=gn) z!dpG-`q?{F1NYjB(Hn8pJ9tcdit(i*KuZ9zec;LGBPtQ7T{Ww0 zQ)z*>3I#!b49y66(Lpra`4TrRr1hIpSC; z5I4o%jl;Vm2$CtTDmUU2(EL6u-aFIr*cHKY9M3 zO!3*r0+Gz}Yjk;Z->%P||NP}$*Mk4WdD-83IIq}$DziAhXsi4Lixq4*I4DEJUX1Xd zb;1JZ&exDpqmGK^=v9eD*W;>D`7WbwU$B{7$mBPw9<=q7;7;0Zy2UxAz|a=Rz*t!1 zT*Q2Z=>*IXz7XM5yx1;X=ae#ITxjsa zI}|>Dwc>@P==DUCIH6I+@p3ujAJ?Jf*j%7F)N|>JU$r9+W1*o?8E2hnrgl?nbet(h z#Y((My7|0!5B z#$b8~aVTezvR1@>r*S9at?*&cH=20-I4-S!1fNU+sCV?6>~RQpQ7U%h$N3F2{g=Kl z(=VP~HOOs(#tLfCAc{2bY-otmid94=M?|z0)D@SQFNP)90@ac-)?CP5iJ0cIcc|3!oXGcp>9fxDW}SZ74x3auf&nEb(RhaXH#lgU=6S$RJ|%^M?xM` zG2MxOP4N%0{&`LWw|<=8FwH;u!Zg2n@o?=J-_p|LM|2`uGiV(}O;{MH^5uXuw_x!^ zGT)Oj#NOauUOT%x?Afa(7gxHV^yh)?d22Zx z=S03yZ(-T7D>y`FM-hdqBJYT_S5fbc2ZmMe;H5h?Z+j2BpXfwSvyGFa%e-k&Zf=HdqKS2Z+&~f5a>o{sD%9ffY zOlK%@vLj_r!vzjHdnvf$sIJWhcBY%v6%l#1rUI>U&=k+vcF{+FX#!#nLEu^OTwmB~ zM65I{nyB-+o4#L{&{-3XQ?w^2&N{?;A}43Dd;L>LM}$v|-)zh(EojFFrukx0!@k{UJ~brP4_8$^u|8xr%1)s# zXBwjI2~YTC#MO_!FmBcrB9roXSVfR7C_`eyh{xOcis{ymbD>c2VzpQ6jw7IJ!m~o@ zLZ*VIHI0?A)`<>18;?}CkodrYXYGtgNx_@KLOT@xMBIXZ5uoFC8H{sFuD6s+dVp=8W8A_@e|d1zIBVxn|=H4(P553_33+SeBr1(c+&SnQ{Tsrhp{u zjAYrI3c?9Z*nz^o+qC8nJmcth&6w}dkSx|wVssiGr=&L$#>}jKJ)%a=F62cIRSi8d zo|5tYpE=BbMD)=)q;|sEgSJ~cvqN~&XsaV`h>faqUEk2Bk6wv$T90R+)l@1A4BNI6 zskq)A+9MRbAS0xpigSkYXb%YTwyNB*i*gUz7>dj8=&C=Lf!_LY&YkL7N$WZ7pw|us zkay)`mBP|tm6HYs=;Ef%*sj%s7Be+p3W3Og74*e_;jOGR>_9fRLm}8Pix1s5>`c7E zu3)E@tHuDiTu(iVSJp#*YH0>BvY6NkUv>*T3QELaXxtNe#XG2lia=7zsPgFlBK}H< zJcdn-Mh)-KuUhb!tT@^zXVv3UrJ)g|!wC;?F*`rdj}hXBz7rMGcZnkgco)QUtn zg}@UBN_5OkTbg{lAjLC0j%32S9BAcbimO_QX6+Wa{SySCJ+cV1ph6s0PnTCXkCRI6 z*ce=R3FQQ^_Rdj+gF74j^-9epaTLGwswg&pV9>PCgT!c$ewd2YuyD9Gn5V|c;*lB^ z3W%=TuY%g)#!xQNvxVTKGpLzpi}{%D|JiRqe!x#{N$omM-E4PQY?_S;y2e#|uKOJ_ z5{nHdL(M}FrcYTPBVo9SF|%f42QH-r2L&?RJgO0B#zx?DDr9!rq?_`KVz%)~1U2k` zbOWKkS$>!?>1);-o=^1(OcYU-AqKXZQ4LL z1XZJL?*BOekfSPd;tML?!VR~7$URs}uc7?x1)x^RRvae@Af%u~uE4I?9fwd&crxynt3`!W|=nA1n)#jGC@>6m>bW?+& z9={r;*Fq^7rQwc4hc)f0xY=S;h$j+t9UfV6RGl~KkFnRx^@kU+0j&=$dd)MV5vdmt z2R)~#(lM+xNk*5zBEBh=k)FhPQo@Jc|3IyML}@>q8op%XYE&O-o1P!4)*-w%Js&BceNPW zoQk2pwm#s~Yvc&8Wjndv68N=P3eT9m$csWYJw!?hM&PmG(>7gyida^=E*Po!tV|K+ zfO4dv#KZCZSd;>Wf;!t)h%Oq#DAJ<*(h+h$FgVQ98BWUGx#6lBtM0|XjYMul$B%T33Y^1 zG_gmvlxiX#p*&V|9KDR{SJHA&FdP?}yIOHaH`@4r<-E|HyYa|f(Ls7E$bI|q>vwL& zxz!A1L!#qOV5BEXga+nd6E21?9hU|sEB~a`*_F27kLGh-?{T!j7=w3xS~ zE*`&se&-gQ;of^{|C!X{Xqx1riFai+>l?uwb7gdltgU6?OdLk*S-96&CvYC;tW&?C z9Fmjc^i+^T+^>r|c_H~l`yVGZDRF9k7`xCDX2T(0aXyL#?NkIP(&z*2f0V^1Z^sRO z(Z6z?l&TjjC7Mslv*KsADSwJVT7yv^=jo4sM}s*b6Nm^y?HS2EtdkMaa|NxQsVInh zH+>R^k!kt-x-fla7C0~OR-nYY zkV3V1P|X>Nozc}H2%IQgQ>@oGhK+a`Qw>Dg0FK&)K&XGA{#&?N&`MODp7Tyo{}?TQ z3y^7QO+dF?C?@0`+=T%X7xOcVM%GO+WGjK+wq#Kg_i>d*NvFZa7d0=1#Ze4p14>_W z`@Tt=lcRJo-8lgDB`Iy?s#xb;67NtTQqsx-Q3C^3VZ@fp97kE`Z!}}elD-U1_{K7;eah61ib z&dOK{L5&d{*CwUeeW8!kJ(|UpXIm~90W+^v z-AeAMh-Xk`vr!_^QJ*W+>?96*4#C*PXg>cx_2(R!b`NhRtn-o)6z^#k^aAarQ{Gw}O*- zkCbCqv}H6k!hUGfMb;Jei%7h{BSms~)|LcIw7b?(Lt`Qx^a}kU9>+NJm12~6js&-U zoUfeP-*5fp5ee?}{Xf=YU%MWEjKL?ac{X=^Gfp4HP>BnJTYHo!^jvP*Y^I}N9qDPV zf;&7^SkD-J7Vh;$NO$7`2bC%`)t$0vcH0y$5NJ7{b{Szx@lk5A6yTO?U+THHcTiRv z3N<6r59j#fLMx8qsPR3~2|B@RA}WhM%pn|xeiVW`Ln9h}*Lb4#uCY{qO4Vvqz+FTq zO-$z@MU-)$w|GI1t_1Hqm$RD7bLr@i5|qkOSvQFe1jl~i^9;xzikkMot&{M|O^ zi}mu_jhJFgifFVT!m_9S?Tl7gp`nsG*O?T*MbNykFy@G6_r559FkLRv3$)OGb;8Lp zQQ}%{TOBJA#~I?lQ$$4CPuqoW0tWTT(n~3RR7!|v1+QOE@2$N^-&>=8!`7&S+pHdA zM5uzg^G>y)hR%ezoBn4brE&tap29Es2L?_-$TVnY&4Q^M<+j7>i#F}Hijr_?rAb8` zZ5hQ)R4(;vu^54Wp`=gcrvgms7YF;dew?qiN$$UTb@e`*Llcf%$1GJqeD5hN6}jk~ zAqT2ba~+4wh#qZf(>6EoWNac9UF1)*U9%Ap8DfooDFQ3*ZZ4QjP`Ker+oJ=3h=x8< zLjxnPnv}w4h_ip$_m&z`RPHk9M>Ksl4V5rrio0iv%Do%e##krbE+ZUg z2g))wo)unh{WxDayWiKBpRO0L9KT*_ zXHn{JLHtciRnaK-<9bNjX>^nww4F2t2rQkm?~NaS=PPIUhhj({zZ6O0(CAu>E=sy- zPrVm~NZPkfV7k$&zgGY|=uxK^$TvyE;7|e)DUMxid=Bfh5KwaydDbcsgIa4hjfcZu zY$zQe8lh1!+-dk;f}o}{LYPM)j^RS;1np98agGw;s4J zo}T{jD8?`!Am{ak1Jv(*{;hZK1Ya9;i!1ttf|J#Vq1TtX_#=cgP)aaj^@ghrYN~q1 zpE=@@svMW8dmQ)~IgJWNN}6W;G?o@hq!>qoU$UnNP@^6e#rIojCW{Z@#BoL%r5C?{ zo5GGVGeu{e+dnHFhxBQ~8j9NYEn*lG^63iIT4HqdivMS_S9F45qR};Yg}N35Ix{Dn zMmUAufQs0&;+wGoXToViX)cLQiCd?6x~%-(N9)xcUY{37_BS53E7z27-;Mis^KRUP z@-O^#3>9K zHzOL&T7;`i#ICbubqCGxbT(qn=JsfFuHx6xS1170nm0-?Vnn9sp9Q6MIyW+ZvVh_a zEtiYC@sA!}-3iX#9af|-E^aArJa|{j@Xe_V|4HtN4oB3)O>Wn-+E9;nIL9G4^7Nw9 zdy}}u&R32*Rec2Xw{cv{nkj4cVMJ~nmOIMpSv$qH(0yM!yy)?q6n%O`p4<3=RheY##*Qi}QxAxpP zvFcc>;)*T`RDD|a{~}K@qcT6f#%^%kxB&ac2|*4e@kyVnabap2w0;(v23qR|?>k{Y zeQvHNm2L&GrzoCC8B+FIx*~|2*KKVVt531kAw`H7gg#^pl#_^zX?X7cC7yyJNLq=M z2!zl_A!30%6$e1glB@t$5_y00a5n9G?vo8dC3e0z{u@&!U7D=2Gx+|)riEMun zsVa0^X;}^ZiuRgY!3#AjVp>YtjWGh<#*3W@xdxKV9En23KvDNSY zm2X1hE(MH*6cG|9jiCm7l!r!pHMGMc%>W}IjH$G1aJ1NBgmybPktSFOit@>c%zflA zI&)m9?KP>@5G(AqYqdp=188S76(M@Ob8HrHJRb=@Nv6n zkh=BgUAe(`ryKmIiOhoahz|*}u<8|XVEWu*P|Z&Q(gssdHdI6Sq%dpIl~1TxiB_lS zG?R4t>rb>(yVF)trgZga?|)YS>DExs-Alrw8*Ow&M}_mQ-%g-Wavqp zLiAHPu2f13QR4SUuq@c;(LS#U$kc}8AuT$v6-INeF>#^mot{vsu_;=>boE}{t-2J4 z^k{nrKBxj69h&0&s3BJCcfSAEj)rCt>O?rsid9OOIYNyEUzPtU1Ao^bpkp_cDlkqp zf^cM}q$O!Jx603AIyk!;+=T}wq6j%b{7NgecG=TlcaiXPJ=$0bBh%M!~|JQkn zL4ShDHbtVtqf@q!Os1z{PdtFV5iqfh^9$v1V->Squ3S4(EwJ#Lon9Yn>tPe#oLzBR zTZBTB+8lRN$!UDO7k{DCj-tQQ;xiUR`q%xx!BcRQ;zm|DZ(0W^eN-exu|ZWj7)Upv zH!8voekn(#^%e$Cf+%IoBn-XT5nG_cT7`VNsP<8v?Vi#`d3PwpY&M~k)Jhib?zm{eM&m3*GhYxGbicy?%6m;O* zn=_!l@YfzyZvDdKH%~!4{68zQ$h8D|UdQ4TZRZKtYkw#|B7}`-u2zuIXcqyEew5wn z!*DF&!KbLVbwpT~ja*y`S#Vl0cnrc~0(x-?R%<%5m|H*2SwrPZr*TpT6_5lTCF1)C8UcBE^xcf*2*af>g?UjZG^EhH$nKahh|}Ke4eGQk>h0tS)f;Q~9JwD8a%M zzAb0kVt?U=>o@UiCD~uA-hJ?BX!2M8*5CT8kKTvJzx?O_3ZMV$wX*R~zxAhqRzLoW zA0Es4CyxX1$&bJH$)_aL_Us?|n}6Y_zw;LE$^trG6HqB%Xed63SFjt6D2$kdVo^gC zyeZ&d-Ii$IRq)%#Ewg5+ip&f|5F66uqa=#YGJoYP%2#?}MaZB)?I~Bmk5n%ix<*nF zkm9!UUBKWT)djAwD0vfRvRV-=Es=x}IAvGBR`%eoRaCc7Lrq?Dg4IYlqt7pHVnmS& z?dsl9-D1d~+if9%E~=^2EjTM4YiOeq&8mF~i=kI{?bz>{C*rLK?y4uEIe8*J1?0*~ zFn`qRiAh=pJr373w}9 zgV6_a8^C%Pj4JC-!~^iZbVXcz$vFXR%bB z`B0=*xD!JZv&5cL!I5&MU^Np-Va!*o!pw!m;}2ery9a6z`ezr+@zx`ErL8Y~klt$R z<#;St<;j1K6s3-Lp$*rIqqigy`m7ZC zC>Bq%^?Os>9yM%WMHX5p1L-f&{-%PABRNVmjJf}J2xD<*m?Nc;Vj0-T3r`9VI>8vR zZETk_4iB_^I?XKxNRd0AG?G?`wipsm#>PX?#&T0kJxI2+1NUgRb(|Cmn&6R&V`G0s zb8IM|;MlS9{l9xKN9|n)=Nlo3AqioZrd`{b(fiUe=LLe4Pe(3dj{1yMNhfIiX4~;+ zqyE2hTbW4!$Omm(i)G17WWEd?3EU?L7!Uj}D`uf#1n0yrUBCbLjP4=RH8cNls%6?Hyi$=yzmw`M-3CT4=urv7 z*d=p1isNx!RSZ2JH*W6!-{&cA?Z15g9~@6nLJ3W;S8zrn1Z(GQ?@;o zKjbO8eyz3bia@L0LX!wRQwkEv*X-Ab0jJgG*6Z}vMN5OIt+U-yp1d*nNQ_$@SpX(> z0tOujiXa*nuI8Q7I1~>5lOmgTVd@;j49Z7MzyFVp^G(sVCaKedHJG;7}kE{(lykK55craSh=yZBXjiE4Kz-MNm zdEO7Tqn!4>|Brc!s`1;)daY%T26j|Zw45?%Qzc47ogUCB!cm1odH)idB~(%+u!+aG z)hudu1Oi=7^?)0bHX+(U56}9OFi|+rEcfo&_^!`6Ro+4?} zF@y?`h;2>8b#V2JX=w}Vp_TYWThq~VR$ZkmD{7dL&zz_R=b^A$vvFQ;Ekdjv6$3(I zM@xj(epjj!0v4=7NOJ`$)?%jHE*XFSpB-mBT#b#TZKu5Cu_RCu6wK1o1y+IJ{ZY=$ zrL3YyM9eu2z20)v&zH%mvo{ zfByRHPXT{YN|*J=ocK`HWswpaenxB{77w;}4xF4){_pqfIAgm(n&hTTV?f=orfzZX zN{w3ORtCWki@{^{P4O$vjbNN`v87?GX?6Y=$4*5%2@^9)ikE-G-)wj-l0<1-#t>l8 zW?HQN7ZUnMica)wEAs8eIb)~kmgci20EhjsRxNF5!syEA`h9A30v=fVgP0bR<3 zpK@`JdF#hHUz`8(lNa-sFWNQbd#)rkMIM0MDYM=6ebA> zD^bQk*}p*1nw)?5C`nDq5PMLfh76^OSG&T_awzE=rIQe7+0gn&^jncv`}n#``A`3@ zr!!vp-se#7`_CTwPsX!{4}Sjgr@wRHWMygWIk_7eGjV~GEH&+1?3IBQ{q*80Lws2Q zV;~DWVx+m%5TO}@F&t<|Wp&Q= zjIw}`M%&6*;-5iJZ>rF&@U!QJQW3}wk#P=PLpUv)@Bf2;^bh|-e{@yf=hg#v9BBODwGNcH7^_utbKnhv$9GMIb`K34`UHk8moZ!5*Rl= z9{h89Gzrpm-~ZPiJ|RhcYhiuwgP-VozuuBsK3o=Cg_+$3WxHGta#d9hXS7^+Zrb7~ zt5D8i(P%;(231olTl`I{ijhu^|73)D#U(95nL7*QIF?){h-x&rz@NdO0V5dS&K@?( z#vOknD+FhY2!g=j(;0q%8G}5o6S3K!) zJ;i>#wdc@#3#9iJNbfC>-diBOw?O(+S|ESj+KuMDInH}?ocHE9U&|clpi9eC+Cg!W zHI#sDuMSk2;=Q%GAW*+?roTK28!{3O{g%^hAn%o(&hf;fM(_C{82qsCIqO2O98sk~Z6CtRO9nwh!u21g}- zJmCF*`49Z`FFm;nlWU1~HBc_8*tXfphXN)8+lq;D%hnTWvPGXZ-D<_LnTJ^Z!srgA zsFJG@7!nv3O%hd%dz#cb=dOBj(Wxqo%k|Y#U{%6h&06kO&h7aMKJD;;p?QC9GV4f} ziPI0KVHCzxc4}KhUh!L~+fKbuLq;%9&p2z*av08)+R&OT-=Ub27mF}B#vSUh5;zw|J18VOlf^GD}q>atb9dIQALo3`{P3}o*TdD${@4ZxqB}H!0u{Ym*pT~FV}*jcEs9|x zgUVP@kE<1;5JbnfXs~s?2t0+@%19w`ioS>FboHBS)m)*M0d3rhQni2M5S>b>m|<6r z+em+Dnd4u}Cvku8>2t%(U?M_|Npu{f(XO#ox>gv{QsY*ZhI%npK`7C7lX2Qulo@bE zN;2lWuQ@U(oeb562&h>Nx_`-sLX* zP_Cw+u(YitZZs`M0h53DZ(LotMCdz|Rwm^vryMpkuG@+(YCm(_2&lpMat;y7okMXb zHh2s?1q%{FDeL~f{qX4p^j#B7UV2c}3Y4I%k_8J+pRBPWxml)9VA1=c^jb4*+;*GF zrB`lV$w1IlgqqJ;gu%6Z6&V%z>=0T}LQDqj3gKv{k)`X1zN3FlqlRnl0?`|@(zF6Z zXgbkThNKOxS!M9r@woM-Z&heLDR^$blzOA@imGT(Pz6!l+zM#oL6m`|Bsip1<_>bK ze?&~SivFa!mfyfJtamXjdP`Op&dejs~7+ zgl>uudZ7>9tvsTZfPT@YZtnlPZ!2Lb8KN0bu!D;{s!0moSWD`^+l*~3!>@IYo|_-Nq=MT3{auRToi@PM z#D$S%M25X++f00r^-PJ&_=yC8m_X-5v{F|@Lq;%rUAp}}YENjW^xhP|W}1i;fsZa0 zv9p>@)1rUYyYHE`!F|#<>U5Ola|WZVgl3xF0tGrTJ*~t!={{6cvOSG_2=;ifRRspS znrON}6oXkhJsbf|()<76!*>8G{5eK009X-yy^M0K5itavT9}z8#%Qe-EpU#nV_RDE zhn-vI{HWNHs1&8wNRXg6>=%bXcHBc#OC+apPKbYaXd{_zwPPG-{1(SQyA<<`8Sl;h z{{Le3_w-$)c;I^2y`CaxHw0?91y-&SQR9k&yQtKc64s<95LCMm+e9cq!A|^5@K7Jn z38ITW>ho>QjL-*|)ORY`a-pekbK#_n%t3dzodoRHS@-7F#;0GFP@cDOVJUOtk-LJw z><54OE&RpTUmt(n9Qpi@?~%{nrpV{kN&Y?NcxudXYm?^t|LMbb0BXEPK7Sk99G`EF zZu~gs9^RKfYajglTByi2Vs(O|?P#=kR`fWsGPetxlTkxgg58;LZE0|8NpIS{;YMaU zdo;sTt7I3aCVs?BXM>^RLyT2>SJTH`jpKi?vkcmwGPVr((%N5N^S%ic;e+x`AlZ;; zXfcODRZe9U8mF6Y8xc9HD5pf+`#|WYE5K_A61p{`Ywuv3X|(gKKC@{juY{Aw5tcI_)1v`?5N$zv0nC=TEufM z`Sz!G&)cULy=*rgvkMFxP9~h;DNH!IDivf_SQ5@x@KxZ_4l`+5$~Ur*SLUdFa78;j zy*8$prVU^ZM+!?Ja&(HMX?1PX7VUp-0($}d5XCi=43o_R*$aUOh0d*PZX<)TX&f~d zi{sXhbH2T6AAR&w~mdwRkoexr=IXe|-4I zDd=UPdXxGVpF`zwO);=F1bcS1y>FyP8ve0H&%L%;UF%&jDkLFPN4EnP6Dfad1NpO2 z^kWmi?>za9gz(#>yIrKK?zx8&li&CijNlb@MQLIdq)Hu&4h$vZ-1;VhtJ=j=z-nV+ z2J`9Tke;>ZndCYYx5ZCQ?G$#A?)U7aYFE(I?Wy3~)119BdN$%tt_v^`Fsj(&qIINk z83xQ2foMW^uA=y{D2UYXhs1waV#`K_c3Og)0ex~rbhLfLav7%~k&d?MClmG;xyV7e z+EI$X+!Ps0^IY!#ofi+!U$lL36LI4~yXpYvP7ZKSa=Cls&c}0#x$)ziR>!00!?i-B zBzi3PW7}a;FF5Ih@#z;+u)sAAS|lEzxt=1XBN^YbXy|~Twtx<7qPu@S(#TzFK>HAr zde-Yibv*e^1H%qZv=eOv@!O8pg@RK#Y4YdCN~9+Y9iMND@4VHfVA?1VZ7SE$*)X;C zP6;<18cmp3l#F<Ns%{Rg2Tk?gQHppG!V;Dz$x_Afwlo6;!j%#JW6%v|c!yE8h`~ z_X@=}hy|p%4DwBrhZfTF_P(??f`Q5n;DaSt)-+ghgY6irBI^E-5?& zToUUxLKY}$YaE+5OT$%NpHbTnvlE)l@@_beA;KnW zKg2w`>50c&BIYek6u2UFp3Z2TeYMDMasrkQ9llhH&4)5(2#Bb94TH#J5*Y1U1l}4U ze33(Im9%G`3tUhz$w}wdms>y1**pH><=vO0Fk8I1%i4b^%Fx3+yv-uSdeteA6*snx zco8nI$b;`#Gc78h7DZCL;RikwPC?Z4(bC}oJ~jJUQD|X)>kS-+h0kmEXr$^dT#*TrDaJ!N zZ!0z1o|7izPU!9_=xx%_z|l4O+;Jv$T|=`wij^XFf%wgI>9NY!CKi}KS5EG?zU11?rliFo93kMzlxqK?AU3C{b#EN)Y?`n| z$rgY0`eO-xYhmp|hxN`}7jxm30_`OY#j~*c&WC-n^pbU&8kF6mM`?tEe%sHI~jvnj?pMP^vtGSNo-jG1Jtab z$N8T?5_Pj%u~4I?9Ow&N+OtJjyWUOasK(Y5L2uu-skbKX!<+9+WtNuaQu>Qb<1Jbds?z>NddjQXj5@lYHa zOPN&>#}^L6`bL0ToHfv>jt9o*b09w6IeJIW$RE;HZp}Suo9!iD_o@2+lN$vXF(`lf zHm!-A;7WRzLlQ|6;TFsHhqJdJ@5Z1x(z>7(qOnC487ZJx zI1pf0h+I2?=!9RiM{qc#J@cU(AV_~FcAyYJi-+RB(=&C^^(sCXl`Fkn8t#fWgFl~I z{()HE{_NSaUp~xNKf4=3!FQj2@^E=baO+XLK=tl)Eal$KW2rp_qaznTnpdT9KegjT znF)zrnY;#^;FcANi4Fq}i_mlro|`O6Lj->@;8g0j74N8R=Ak}?sSVe$dCz*d;sy8&9tr2Vt?#t;^6uvs6!O-C zcJ)TZoNiR!!NsO6l$1Ebrqh3Fpw_3YhRw6!vm(siX3=4d0v(%HIa>)URvJZ+;L(y0 z=x}z{WtTER-E@5+!>G&^hn5WR(+Qn)6NTtjRg#}(#Y0+6?{*G#?GVP(&fc!Cu0P=l zh9=|5b*|_r*SAJ-Pf2CAo?}BnRe>?$m9CVh>{rnC9Oz+fOpm&LUF&}rRx&5Thld?{ zh{zm+h_e>;oE>fN^8welJJ%EEwRY<<`{G*r{^NPOeXEh^JFma-&aF0F-iAKWk*pLn zY~d0%1>*#MD0T`B;SVuBOsiTH92E(1;@_6?2M#1Vg<6C8&9#|o%$o<<|VWs zva)g)(zNKfSS<(r&TxO(o++~BMpsy6(Fv^g6zE6;JLk|8(nN@yaPdIlQal3b*tjXV zLUldy{w<1;&yCJ`D?ExuX@!lgd{TcOudTRJ-$h(gA-jK=IZE%T(X8LNH}@#~ z>)R$qsz18+D>|Zar$SHkup=tmq~Z_FOs}uR!c4+=wQv||#XyCKmG=^k+vQxs((_T# z6!8J@rp^^>R+!SGgf+8s0%1$+trrT&1~vn;jH6X4=u=>g6KbdWbw-Dhh6{Mt6n&Pp z7Fx6Vk%CNQ@^VP`ucjp=v2`I#R`r6JMM8 zR}ashuldkkT^QWndg!id>4lS)-aEMDS}qv>X+vR0LL~}DPtoA=IZH7@?z=V3N&$dW z!J#b}ltOGm6Der~P^k zalSPwBB+-V_G)Vf!D-KxBQ^B%IG{(x&I&`w0xNpVMLN8BGb zo}_ncohsg(1Hj2Th=ro48#p5;A#(+o3$F03&pv;9nCGQ->mj=u-Rvp4*>`WL(GW3; zK5@_hQVA6`z147$M%|o(zgtx0(tHJ2%_2x9VlkU(yYNoyA{)x@EMnO$dhNr4G1=Bm zR=O(Qa4w149F~QJ3+aY1ln7<-XIhFbj>Ur(8^Y`q*A9;^alDC}`mmbFXz^1Ll`!O{ zm5YDa;ZhFnxXk9gY0-~4P~7!+0-~grtH96PWM6}WP87fESa^2hDAwL}Sie(0OAq|X z^JhPM_3G0X>mU7Wy}URJx%J>(iErg3Jy707!q8$!H2!hQPce6-dq{A|!M+sUyQRSo zpElaK1+upl>%#x8p?R5z`L0xKIgmc)8iaq_Yvr%Gxn7tYIIoZbHVD)c&&b6f=9{H? zcaCp3Bac>$p?_to zHwr>+`L#)ufVUQJ+Dh4p@ zRskVS8vez62IaPc`d^{jrroJrVLYN=f%V1Ccd4zce+kEnc%I3^KqbdzMJZY!4eek8YXb?rR1Drt^p{TB z3yV{R^}Ex$6s=~t7bVKAxlI_8b%B2(+M}8{o&XQB|7G`}WSe{D7RYXt=$30DjLLy1 zll0Nt zJB4vCrmdNnCTK^LwzJ2lH&Zdik>cc#Vd#^8joz`MxTGh@IqBk z9k~kbH?=c0RS9EdF+wA#A=qTs&{#Qo3Y#pU62WOre>r?phcNQdW0p9=+HB+E8hx6WRqICPw=n7;gbtn}d=qh#PUo9g+v(O$r$CmA6KQY$(|MkOnKuqskhjHV_IUi}x z)j#{_T7Rq)RcuZ1W?O80>KMn_s1`xvfiSxrTgfU4X^3R`E-+F!TVH=#+qA@DTtNxO zUM;OURso|>uBxS;hr&@ALwS*!vMg>ou(&a{;pA?6xUATFyt>^fnJi9dHCDpW1+ySe zoe8EFTVc^up>ryIFfUZ9tcS@RdUp=b6;ukSlUrmVR4*EiWW*?ol60w z$>Adk(hb{};$2wx|J#4jA6t_aV^>J#!*+da+P}34^-;9dE&dDzn|BQFSN5r6_Kv>y z&@g#znIMohs4t3CdhbKX*|hFN&l3^wQR7vcX>;3`aNW`)C7}(I>p4B#`f<*eGS5Dl z*9&@@=U_l!V^a8Tan=l4N+B2{2AJAt?(l(doL_Zx{zni(8mNB}M!h$Ue2VHq$)=-3 zr7$!O>F(>Sv(fK)g^=L8x@$jLUise?LDA*_T(+0k76Kh$$8iv^$4gab9 zV1>sp5e6{CN%g>^_#TbUWb@J0S!wB2!! zBW&OGaok>+%)R+ZZ-W#P0Ea+>FKMOuds}kRHJD|5vPZdqd)mmi;noCnc5wNpEwf6Tu^ifolZ$T znmxQER}L;|OpW4>;RhYzLFe&u@qK7C6)`Dt)ih|tmjEOk^Vi*8fco&KNBiuw;;TT!1s^H-Wuirv zrBQ!A!n;OeUX$Qy5hmMPm=&GVGBJ*d6T<<@;-kPlH)vvD_3+oMLgK;gZO+YR3g>aJ zP5FJm9FK~9$ALmN*~Tq+8;#Q=>0g3&0z^GEEDkDIh;wsc=_Po!=>v3hfteoZ$ysrR zx(8YzGgo0WOCy-gLj7sQDA0{F!TDt22U~y9Ur+bq;ZjEP)+2Y-r^=mts=hY0d-@Xw z;VX>`vZ6x3Lc&Q|ZjXs6Pz!8zVKY0#%eys+p7!kn_iLhqBAJ28e2hb&hSe?nBE$&A zlB_~&=_YOvc3og%e6CBUO{mY@kCH!k<|Tz@MWN>2%*H--hNB8Np+*wta@&Yk6vuyc zqz9Uahyov)(=TtM;B3&M>8`PU6b+P{^|a!Tf{h_^O;eB?)yo?!TZ$6D=qp9JEsMCF zwOfDm^Y+K>?hD1G=W4PWkKWZAB6qqWdIwh>78=tWjzNM`!raQu-S}d(jTimQ!=h{- zxkc07^zgUQsHAaTfgR-`gwqnIX0$n*u?6c$sY>frY zg>#eR!YT!;-Z;!*_)-g2CtOVL}}4+@*<;W;_`cBj=O#3#QxUfcBSZ|ymfy~^!W8V zx87pNB_Ac*HgkzQj?xv5dp26#N&B-aT<9BOa{;sAu{bI3Rp_=UcWJ`~@fyeNnQ}t5 z8hT+*OaZ&r1f78Bj74X;F$p3-9luUQU6I*2H*qWFOpRUBkJ&{*nN4piQ-A06H@^OHX%wi`7Db^+$Z&BBS64mS@+fW3 zg&IA23zyiw!~G+L>hNUkB~)$7+{GER#ik|-oZ(W#M5g;gY0gZH8?=8%(^OtE1yC;F zP1``gMQPsu@5gZ|SG@}JN>H>vPt>R|@l1lWKBLS<(LKlOLqJvVB#A#G3i6od6n-Xl zW5Tn!8fChg^wSbs*xJ0xDfIW(mNY93f2M}Ma5W+UnqGbQ^R?2gALp#1C#KMzwRzP+ z1;{X(4{g!Ok?cNfax{M#MU*EyQF<>@?;Ypb75*+}q(Q5u)Cs*Qaub*AvE#Zu@-Q`is2V&Wq@=^es? zV$otOT2I22$VR5ou%5Do_ghtO8`T=^<2m)2bE*lO9g!13 z%IQpOieH!Vh>w3BX1IN!lhhF2SawYP$-r(suUNP`8pfl9AWA8kiDIaUD9HLI7CJU| z;n~$(3f%{hoATrkPvS5`8zWH~M>TF~oFgmggDwPAL#=t`ecr0Kew@?9{yy~v4=>i; z)PII%^O~=fww0KaM;6ONE%zK%IcjHtF>ig*_alN*P2qo7i9-pHvVs=r%s~Rnr-5xG zB1f)ib&Qp=tz98%OfBQYeRiT029s6WyOxdNt~oE4TV3uvwQu(9A%m3@AShzgH*ue* z&nt>Vh%RU`qm^ij*5syN2toEkZ3RDjrOSZU6DLwh#kfy83gEHV<58vtBm zWWh%6Qv`o7Q%BBto%igmALpW8?r6ihJKAin%qm;U2!-ekN6>^c?lVwO&5AO6$3dOD zP=yv<-f7nZ%W|Z@6|DDBEidq0IZLQ6>UHu|fJQzVMcqTIkx*~qP@WkGFlxaI6fF>U z>G^yJ>)td|_9ggUvXHWyS%J(?>S?qul#^3NY;%8mEymq#z?Dd2i&(EIIQY(*(d-hG zQ9LS3WKpZt9{zn%500p&_LLH16PVW)69Z5TQMM3D(5_5woHy*PALm?>_A6Vi8Nv<^ z^w-;$3&bl|@S5UHM%&TW~bef@`i(xZO4o6q@;*6SF z_@M-^L{FYW+j2SqE=~(`zzGjaQw5MLiiEvN&TV({fN-w1h8a5#G!>N&9H)rMa+NTL zz5hQxe0pcHiUZt0oM!f3B0C)Qf?Bzf-K~GKFXPJ8Oo*NJz`u>B*cy8~Z7EEM_AXTe zhm>3qlx=}NRBb1X0VZ=EK@*gB-1N9rPaC!LnxSa>%u)2>N}f)jXeu^nw=P7A2iEhU zRioL{sCMdXL|lXwpctD5>g9*0sgoZ4V(mtRbheHhV8!!PXc(~s0ctCR<(e=utIU5= z&o*d?7w_@slbG*)dUw#1iz3}y58D-)4s(*}cpB}?z-el9!krvjijx3Qmj*El;6n2U zHsZADbXq8b5wM-KFmsZs9XYgxV-WHQ3OzxgzP6l19kC17U@W_}Z=3VE=8ka5(6;to zcv>W9THo*g&kvtos)pukH>u-r4U2ztu~h|;L7PajR3~aHB01WrnG||!qGt+*VwzE( zQnOm9&!G_3yN2O9)zwY7LQBoYUCXeBdVrA7h}rHai{tpMa7NS5)#=Jt6hivBt)RX* zxYk0PN@HD5qsS|eix_7@y*(rTOC6nFo@Qyyh(i%m;3f2ks&k$&U+s*r>NJ%8Zb2lWdi z{q;BAxg(*a*ygz9>;t_9q*a`)lN~0&;YJjzM;vuT%Bv}06nQdn>nD|?=-9zZZF1=# zOsyYB+Ga+leOa4S-=$srxG#S`yx#P}WsCdMLF3Z-;Cl^>#4MU30;!c+q(bIa<`gd2 zEA>{k?IZPE;Mz0^D)hCZ#7wkRUm33$hqjr(U_k__Qfb+(2|wI%?jEnME_%UkJeJp2VLY$G`0jtL!j7G*VvG{u zajibGvBL0e0{~4H)O8LkSSNJUk6ue(lv|*xf zB7^xANFRvg1SeAG^w58GTCLn!2aN}UTG106r)QmDh+*6s$X^QvRx7d|eIFyd!KFX` zE;IA&p}*-t+%G@)WqbCEOYfH3j^0)8ymIo+D^HO7JGb#@%j}N6ywTzx;8Q)9BMxg* zn1w9-PKFYfq;Rs4W?9rpRgrlO|ID1(6xS6B6fgvY)?D9l{r~mhA^9-e&W)?!oCNQMg|<`bQ}U@kqqqddW1gL0hX@}hGEpSGi|Nhfv@p6B zQq0M(Ay&Rc5?aELrXwWdIbu#Ue+k6IR*K_hHWmFu6ezBK|9^kTCHxbYSjW;^rp=oA zv|UBLIPCUSoPd9>L7^t0NUh-&h6#CzsSNHPmG<>x{nxmhma=9sVPOr@a|l{`l^{qR zh4;}4Wm-BlMvYonqv_RrK^QQcd(AiYjL5|$8?lX#=)_rpVg*e>h$RHAu@Hetn`2A* zeiHALXau%xuhre8*->zsQf6g-hl7OZqy9(jLu^{v+8uw|08no`Y7loiqy`j=&mANm zfAZqFqW|AmcY+{4yC|r>@!Y;_*l-0)-}Jx$$QDie8GLLC zfW>bT;u(Jm@l(UB|A_Kpj@~x)LRlO@{}6q5%Fl3wLziBG)N)x>jo8*2CRKrqzNvD> zCm|S*elXe>(T3(UxrSih*G5rTkxP)}!ZG!ej`Gjl!^bZ_MFHrv=x#lDmlsnA8~86? zOg(<%om+M&?^VPsDP+tz1<@59IH0i&faPgov?70gko;=(+d^oFtcqod_>SQ<)0x^> z@roe~s#FQnuvIKU6uF5fhE5&4QbdRvTDrxjMp^+UoY98zLK$_0>Xe8OC#Qm+N+EHW zDReiD=1EJ49&}{{rJ5pA(@eH3sO+;Asa+!NUYtw$ZchlRX0U_`slf7 z{g2ujQVy-o;LH-G6eUso#_n24T+CUYTOT}g`>a&X0RAHGUEQ2hb1W(? z_<{b3R+6xw@6BePQWI(E$XH^%Gh6VeDDb&rnAjn>R%0Cnpy=DVs@m~~#2t*ol;ZJZ zSsv*GF8YPBI``#N3E}IYaXEa#147BQ^xe_lZ#)TZa(cRpGxD#XpE6?t8z8#FSUwW#C8m`Ru00ChWRKPXvSTTm8LE-X~uh#px= z+D1RiCExmSPRrx3aPR)fxssf1!OWX*Y=8U`m(tgDlR1 zp|aU$Z^GlQ;OS#YPlN70wo+DX9KjSN79rHEkuR)qQAhzN?eCzCUXYYqOP_xaleZ4( z6(90q*Wx+82+UIbqn$}}nsS?^Zkn?kr@7KbC{(m&>er{XV6ErHqPf?u5~UTGc8b1L z(PT5bh|y}+lU|`5bqtEG0&>aV`)PBD%)CHRvXnw=9yHFJEE{YBt^P!mi`GA?SF{bi zb|pO;Q!C6Nbs4Gx)jZ3$d>?-`?O(oVpI+*>+iG1njEl7 zfLLp=Vdvd4Fjumbj{A#LMc0PGX0uIRz7ocux6#S&SH&@t)U2~mDUqreB@}j`ax?#^ z>P~+QFj>NeJVO}lFR(_P zBpPLnE$XvWx2iKEKne>odujTvVBuT6Zfkx*|u1Jea zGE|%2BO@x38X12`ZOUw-x?yv!svxYAJ#+^mL(>+dYirLHxIfWhhipb3FYX&}J#be` zzVoT%`x)w$7a_W>L-tYr=IbL0n}JFmmF1mTHMjMD0M* zfw3f6*317^qUY*+7Z_D)Ti#a{r0QV6^Fpb&z1+oV?_mgUYha?lvtEaufUa?rJB`h} zLG)5q%Nq|a31XMJx?B|NtPRF@roIH|w%h8U?ks<137312nhg-dKv)cGc6Ib8g5^@3 zk#zBvruf{T_oid|lV7gh`e>KI@7BY21;p7Ch_lbJ|A6q#R+433E4?zy(t{qyJqtj* zEhkYgJID;6dFN`VkoPPTcXGq7M`3hbUNtskEmd53-H)!)fc~@AIAhf@CVSPasiLyI zYgK=<^dQ zISs#tCrH)ElugC`OD5&Bdy-sBN%z)E^~OM_l%iZM$?}(dp>LPn&s!6jqv7Om6}&eL;8c+!h>YkYx(@6P zRWL_n5fa&}PX6Q*ZUMiLuHdB&0%$36jlF2@o6>F?m6b&DBmsfLGA~HVtUMxEj6bDL zrPfL^Z)!Sn0>A;Nh#962b#qrmieXisZdeFXUIB^~e&e2GH<=35R4ofHNEl7BFpYow zNG>~TKYp|9p4!9HwPknf;k&Zz!s*mEJjW!vpkWeJ>CF|kC)usbNV=o7?Ta%+D`U_^ZjQ-17un0(w6Wdopd!~(erGBZQU9`L`s z8*pDDe7WYs>xOqFtwM80{SMh((&N{M@#i`%U~c)RQXeCuJ~KU{YC-Fp14tUG@S zcm6qsJE`C~LykzPsuf)lcD{|Ymvm<4BxH1}qE^1-k~F2NJOr3oUsp+n+yZ~>N!eHx zzj&cAK(A|V9G<)kemR_$b!=*MwL@0Yt(3G}i9#0@v_W=YRq+S(LJk9Wu`re@*=2Rb zgV|BNC3nesXhv1q0D*K|MJ6JjfzEx9jjjco=M0MkyMl2yeX9 zm6w+ikN2}1y})3z@BpXvvhm_E0F}d_q z{SgH%zgRZ2+XX1P4Tslob$Jl}dP=O@mTDSOIvesIgdGtnJB$X3(1piyG|Lj979VgyChRW z_zd5d_@T|}%H{4qIa*k|TZMY}GVBc?cY$aS3^wmSguaZ1z$MbgWaJalXbgh4lRpGZd9%IQTis%p|a5=W5 zJjl3E69!(kmqM1srsgO(c)UQp7HDx}hNuw|kNt}MVFjSFJl`|u=mIXTI+ z5qi4|wO2^`<=yC;UPq(&H=ol8lo&db7^pVKw=%W=!JH(wP8s$ndV0*(J0D zJ^?ajA|`)9uWnr;C;5XPnwee33l7vEjo)nK?IlgT>XRivNo(ES{ih$HkE%@9)Qi!r zRlARhZ!)QbAh0XgBxW)O2wvV6Y6fTPwzdw#SXH5_Yp6=!pvlj*7&+C?Wnq8usKgoM zW>Q;Na8uyWPG*JbkG|XK6f4dL%{e!IU6JFU%dCITA&bmdT#FN=WmTr8+aJA9l)^DN zsayR^h=qI*z1?%)bhS~(xvzg>vTgiSrs1H?c+GVQ%ghjvQNZQP~)vrIs za&fG8<01RC-OcWLSWQTVdJn*N^U_7B>drB>vsjnTDPeX|;Q+vzn-D7zm2EOYaDiClGSRt8K#f2%m%IDVK0H~gd)4mPjp2tu}vUCs>J8S~^)e=NLLfRT{cV zVcAJ=s{sP7d`Xwo!gTndJ3C@tpCxO`XMo?TJW1VpDz<{FUl=7VfZ|As34n1emEN~1 zON(`jjXxC`U1#>&Zd0NeehyZ4)_Q+xunTfMshU3|ByCF36|eFkECmeaS-dMqxSGdn zMhyV-pxQj7jO{NP@xPdV{$jj-c(_s_ee0pSQkL&dW%(aQxTiU1RCSx8G<6RB-qe!F zDIo@+q;q9pd2~y~W;sUC2^dNu#fgnSstglmc84doWKN7&&T5{-pi%+dl1_he05sBM zQZhjvPT`YSu>4idRW3JvoYNZlqhpP%Ki8GA#{F$U!xe+%qTUcY;2MAiS2h_-#HY@s z0&5HIlyU~MtJaZ*lUL2Uy$i)yRe+kWN-- zs;c`9kf&N|IP2%UQ`tW3(T#uHRG`OA!rfV>oD%vS@Z{*FPF{337+eX?sJ)0MR23t? z=xAE^y5-)jh`2dGq~Pv*!!J8;{}Dz9W0;JNgiSm4Lk3IvidYv80w- zKJ=hW-Dv_S)RPzW87cKI-dbPkuZ7Ju7}}l^In^PpR{NHc3R%l_b{`3fT@wlTNvfD8 zNFhgRroKY*0=$v^lkR{1i$8q^`|y0MbK}RkkTuqleR)6DtH<@?eqKA?32_~lGX{P! zbf<1$dfO&-d+0LJssc=&7KyN`9yiFdk=p%)etDx35J+D#gLhL*3aWYzv-0#~woXhw zE)xeq+9aI<4;{tVu6JT%mf*{k2>an<+YUJvaa$W$klHd9FwcJkIml#jYW!t5rC~`9 zu~S!WN6(dH$zYhO`dds+Nif$SLfWM{$EcHWSg7#MT^O`1DQ6&iXRB&Wcc2S7Y+QJh zhXAVSwZv^^>Y+fvv6jxV)A~0L;Mg0 z4!TmeI_(CCRykrgwqFgvXU1wL=>^FJYD}q-k%mfxL>(H8Df_X!9X1crN+iawu6`jf zsxCTqlZaW8+5u3+R?rE=%Sh6Uy)R9UA{$UQ&E0?bF$jNnt-1>FQ6>d5tBc9D<$#y>-ptNqU7gC zwc`aFzwt=^x`ZSS2{4dHXCup~y|XV!=ttvIWQJ@ml2lwfNTiyDJrYa3N<71mndK!P z*9gW|4OV1_sJyRRE4iZ0j#9rg%U*J9vOH)`UZsEXOl9(+qcGVEMY7vI0H;7$zs}V~ z^VSaHN;=gA7R$Ibd)TGMAQ5i4UOJtN*2ptg8!fxuZvqO?uXli9=MR%NNnO<+J&dk8 zFUgIGZ4b~?C^Ep)1#9+)CspZcR3ji0j;5D7p@HDOcP05|O?-@QBXhXUN+)h?nRct3 zU^mb$7+nT`jEjv6bdxzwcZs(ngGNS%6w!4joXH%alUOtgkp8tt)V)SBEc?k0-ja?4 zaCFB;@O<8r_LdC=JmKQGi(_pEkde_K7*Qr&s)XT5)YmF2FrHL)mCLbbZLhMy%7W^$ z@ZC}y(0OpNJnX7n#mK%71JD|zryk@mWz^^c22Wmp2F}B%0$x75R%a3M>LU3&ZzIbi zF@?y|#(+6o)HvLDApa(?{7qnaPJu;IB4e?JK}e(NenTa1@(I@ca?D)~OhJywIm;1k zOR5|2EM>l_E<*JbxF97zo#@-3=0Iu1#Rw61jt$&F3c!Xf8F5}j<~lCL<97YxT6gHm z9UvZmVDJFoGMj_}r`uiL;7*O>o{zvOU0TCiUCr(&+zq-z>%ane*jq56S;Q5VgG3^v zgky8d2fKChE48vXj4nwIHIEXsWYko1ZIS%w>7i+RUZC|`58hu6CO`cqnApFB*MIo# zGaujtBBUYZMxE*D;)4OCm`@u8p7*6^L zNmcx8(y8O62o~eT_h@q9G;>z1vbrgR0_OXJ6g@SH}s2@h!`P$yuKoM4riwn?Rj( z4h6_9I=3lyyXtkQsM265E3gZl)JDA7I`tUjp50{*3**!M{$f$+B37nHLmquH4I!j| z!_=Jx7%u5gZ?o_I>!Ybs)>ZPhA#oTYSs&I}6MOXPckod%j4=(XnuDTV8z~n_G~9a$ zWkyq2;krahsvgq~6x^t?wyDmAWx-R8bZzL-ZAJ*B&bRIf8 zqNHQ|agjI+R;Z;!A1Ue z$qbtbk~Dqi<>C0P^F9LfW^J{Vc1K+B_U^yYf-5X`NZXRGDY78ZoESH$6PE+rTRGI3KJib%k7ZFUVpfRefeQIi%?4nXAR#On0 z8}{zMJvN`WRjN2!9oTXeQL|frn48e#rnI~Ww@0ZfTfebWi35-{ABc{NEHBZ)Ey1c} zDx}ObwW@_e7#u)88Opib7r62;UJ6rotO8ckLe)01DN$1zl z+ZUjom+he)l8INevPnJwAKkS$-!|b*hLnxuVI8SLa!EzTs@XercM+w32vYoycd(Z! z%&lXI%DQq%_FdS}Zh{Rn0xAsZfQc zFq*svakd}gY~j#ci-4pku$6~|C8w(OglGnO?!Gu1XTOOuk*hH>dke)6M0Y{;ZKvh_lL%KyY)2w|7njQ7Ji z8E>%ii)05?h{hOi(u0gxGof;BB0!J2_Eu4**UzxVgy}u2Fe_CPT^)k494)EL6ND)I;HhaEfg1pG@tq>Fka`I|YSD$3BUQV4}kKB5eA}dsCWUwUYw;eZ~jgT)iO;&st zeSY$15BKxa^{e&rT?qQ|<9d409v<4)XPR{DA-vL~ZcpZT_Bop4jkSVn>OWH)YEvpo zp#WFNKdLf+;{!Hyj%5F7obfWr29m-gLG4Y3Ayy&=>NqU&K$a`v-gN`$Oj`vE4KW~j z>#}oznZ54xA=B9=T{mA`qOpwN*7Eq(^{~o>-IAW-E**569Gjc~=m;fRo_ilQyFSR` z8#b8b*gm5wiorLo0X!utyLp^&5O_$M2bDmi!2qj&2e;%9uzaagj?wQTS`24MM_C+*Ps0l$;3Y?D}chfv8%LQ9GF zw|55v!5pTy%xQ{}qjEWtpX3>=wBi6maE=wapSSPs?1?e${f$Bp!8kB?Yh=2M<>326a*qbXO1xnpmq9On9`C`m#@2#&`O9t z>?(6UDDf5v1Op{Nk26K;<3pnIC8$=Sk@98&mr8Js+%^F!X@QY42w1vOIu!aos_>l? z?v01=*P~MU5u}L-Bpoh3qlz6>OCWnA_F89ddHXQBY^80O!xZtBUO|phDHx-A$qtKu zi35|>%&RIn%hcO(xS%s3L#I_Ben7F!A*tYYRe2%Br4Hb6cB5@N3sO5lSyg6}K2$5~ zHe%u6cjU3GD(h5_3#J3{sOx;n25(D>g}f|@S^eSxr3BO~JgN&6x;LSjP2M{yz2ISY zjFMA^(B{}AK?6=dQ8sXf?RJ=>WScd~rT}h-V_3ssUyGwom^NID4J*kZme}Kon4KG8mZ9`gf4ix}O z=t=TbS(l&cxoP`cv%IQA_T_M7B}(C>y9~LHpzviw4z24!mD@mf+@XKz0rC%JN zW@Un&dhQu0AJhujLJey9igrr%r?7~{JJrSHM=xor_QEs*l<<2wD@gwI{_`&%`2S~m zy0ad~jYsZ^`>}nmQT@%w&u+!_6y*^mYhLGcO(lmo1}{P?w{9@A>GBH7vCIa!9NL-I zO~7##v@JuoPHxEh%0tmJTT=&r2DU{RMMiV@^=+Nodvb? zv$|X(s!ESWnC*>YQmcJKa*g`2LObrxW;&Xh!E_E{;Z+i=9{8c6Jc(v|-7vAXh!Z?! zsjFsn>Vg`F)5U>Ynl`~_9KBxW)cQ~T+2iY1B-YknzRR!o`|B6Kx_|nA?DdyVFZ5MD zzLYb)?U;UFVP4Hbuk!a5#P=g7(ildjnf%pAdK_rf_~?AD!rItCX`R+42S%!}gk+^{ zJ}YyX<)@yi;*23!O<$IOBeg}S@Ef1?z_K!9O;&J}A08=KR}wZAGj-xeCd>mOldTjg zV+uh<=Wzt1a>ffw+*j@C%ZK*z#bNpNaA|gTcUC(?|CW`X-d=9Az1dNN^O(y z-ra&)rnaS}L&SjalL8%henk?QYdR1xWoGcZmqH?7i48bN4c2>qlAY!CEYv`kdf+FW zT{?b*Tsa2o#?|6v8+lQoDI^AF>)`6qN;f_MtW%O5^`0xs9T6rF)fTLh^m`8q)JUC+VZdqwIPspcinzB)V?L~JDL?5DP*l?4rv%+(W-XK|zzuXfrEJlb;d0E*u{>aouut8=Ygg& z4)}x=a(LP(5fUCe7GS`V9Bav&L|O@ZGs<~%9xt<6E^ALBx3R?IHg%o7q?9QugtH{a z!)kNhKU{Es>01xml@6nHYN1RYWYL?#_A`4h(z=iYKM!4qkM7wHfD{Rl1Jk4`#!_~& zTayT6GdszOYOB|Qn6padEw>rg(9QWwjg%*QT@bjjeeLa}BAE6r0-Q7QC1sC(#)ea)TjzQkmVM+tQQnf3iffC0eeYIYNY2$b|d! z*wp1U!{SVmlwuk1avnGV+o{JHf-kHn5~X!Rn$xkUvDkgt*jq)#`aZ% zbnu5$@!nxasiKqWB^(a&Y8Qlt!^FGb;>+QAg8N(8oWfNQME4F-R)|~7Xv(N z66AT9Lmi}%X?yK|QFryG=;a%w{)fkPu=H~{yY=vWUypyoB_3+TGj`Y!pqqATOe
  • P%q4PFP1_cy-x{XNb8))WCinE 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 z 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 z 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

  • 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%0ASAdpiFy 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 sUFs&Cclt6hOt2l(wSICgG1| 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

    {0ambfD}P`qtiB<5=q9Nymh+0I{KqIw# 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