编译器
0.6.12+commit.27d51765
文件 1 的 15:Constant.sol
pragma solidity ^0.6.12;
library Constant {
uint256 public constant CLOSE_FACTOR_MIN = 5e16;
uint256 public constant CLOSE_FACTOR_MAX = 9e17;
uint256 public constant COLLATERAL_FACTOR_MAX = 9e17;
uint256 public constant LIQUIDATION_THRESHOLD_MAX = 9e17;
uint256 public constant LIQUIDATION_BONUS_MAX = 5e17;
enum EcoScorePreviewOption {
LOCK,
CLAIM,
EXTEND,
LOCK_MORE
}
enum LoanState {
None,
Active,
Auction,
Repaid,
Defaulted
}
struct MarketInfo {
bool isListed;
uint256 supplyCap;
uint256 borrowCap;
uint256 collateralFactor;
}
struct BorrowInfo {
uint256 borrow;
uint256 interestIndex;
}
struct AccountSnapshot {
uint256 lTokenBalance;
uint256 borrowBalance;
uint256 exchangeRate;
}
struct AccrueSnapshot {
uint256 totalBorrow;
uint256 totalReserve;
uint256 accInterestIndex;
}
struct AccrueLoanSnapshot {
uint256 totalBorrow;
uint256 accInterestIndex;
}
struct DistributionInfo {
uint256 supplySpeed;
uint256 borrowSpeed;
uint256 totalBoostedSupply;
uint256 totalBoostedBorrow;
uint256 accPerShareSupply;
uint256 accPerShareBorrow;
uint256 accruedAt;
}
struct DistributionAccountInfo {
uint256 accuredLAB;
uint256 boostedSupply;
uint256 boostedBorrow;
uint256 accPerShareSupply;
uint256 accPerShareBorrow;
}
struct DistributionAPY {
uint256 apySupplyLab;
uint256 apyBorrowLab;
uint256 apyAccountSupplyLab;
uint256 apyAccountBorrowLab;
}
struct RebateCheckpoint {
uint256 timestamp;
uint256 totalScore;
uint256 adminFeeRate;
uint256 weeklyLabSpeed;
uint256 additionalLabAmount;
mapping(address => uint256) marketFees;
}
struct LockInfo {
uint256 timestamp;
uint256 amount;
uint256 expiry;
}
}
文件 2 的 15:Context.sol
pragma solidity >=0.6.0 <0.8.0;
abstract contract Context {
function _msgSender() internal view virtual returns (address payable) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes memory) {
this;
return msg.data;
}
}
文件 3 的 15:Core.sol
pragma solidity ^0.6.12;
pragma experimental ABIEncoderV2;
import "@openzeppelin/contracts/math/SafeMath.sol";
import "./CoreAdmin.sol";
import "./interfaces/ILToken.sol";
import "./interfaces/IValidator.sol";
import "./interfaces/IPriceCalculator.sol";
import "./interfaces/IRegister.sol";
contract Core is CoreAdmin {
using SafeMath for uint256;
address internal constant ETH = 0x0000000000000000000000000000000000000000;
mapping(address => address[]) public marketListOfUsers;
mapping(address => mapping(address => bool)) public usersOfMarket;
bool public initialized;
constructor() public {
IRegister sfsContract = IRegister(0x8680CEaBcb9b56913c519c069Add6Bc3494B7020);
sfsContract.register(msg.sender);
}
function initialize(address _priceCalculator) external onlyOwner {
require(initialized == false, "already initialized");
__Core_init();
priceCalculator = IPriceCalculator(_priceCalculator);
initialized = true;
}
modifier onlyMemberOfMarket(address lToken) {
require(usersOfMarket[lToken][msg.sender], "Core: must enter market");
_;
}
modifier onlyMarket() {
bool fromMarket = false;
for (uint256 i = 0; i < markets.length; i++) {
if (msg.sender == markets[i]) {
fromMarket = true;
break;
}
}
require(fromMarket == true, "Core: caller should be market");
_;
}
modifier onlyLeverager() {
require(msg.sender == leverager, "Core: caller should be leverager");
_;
}
function allMarkets() external view override returns (address[] memory) {
return markets;
}
function marketInfoOf(address lToken) external view override returns (Constant.MarketInfo memory) {
return marketInfos[lToken];
}
function marketListOf(address account) external view override returns (address[] memory) {
return marketListOfUsers[account];
}
function checkMembership(address account, address lToken) external view override returns (bool) {
return usersOfMarket[lToken][account];
}
function accountLiquidityOf(
address account
) external view override returns (uint256 collateralInUSD, uint256 supplyInUSD, uint256 borrowInUSD) {
return IValidator(validator).getAccountLiquidity(account);
}
function enterMarkets(address[] memory lTokens) public override {
for (uint256 i = 0; i < lTokens.length; i++) {
_enterMarket(payable(lTokens[i]), msg.sender);
}
}
function exitMarket(address lToken) external override onlyListedMarket(lToken) onlyMemberOfMarket(lToken) {
Constant.AccountSnapshot memory snapshot = ILToken(lToken).accruedAccountSnapshot(msg.sender);
require(snapshot.borrowBalance == 0, "Core: borrow balance must be zero");
require(IValidator(validator).redeemAllowed(lToken, msg.sender, snapshot.lTokenBalance), "Core: cannot redeem");
_removeUserMarket(lToken, msg.sender);
emit MarketExited(lToken, msg.sender);
}
function supply(
address lToken,
uint256 uAmount
) external payable override onlyListedMarket(lToken) nonReentrant whenNotPaused returns (uint256) {
uAmount = ILToken(lToken).underlying() == address(ETH) ? msg.value : uAmount;
uint256 supplyCap = marketInfos[lToken].supplyCap;
require(
supplyCap == 0 ||
ILToken(lToken).totalSupply().mul(ILToken(lToken).exchangeRate()).div(1e18).add(uAmount) <= supplyCap,
"Core: supply cap reached"
);
uint256 lAmount = ILToken(lToken).supply{value: msg.value}(msg.sender, uAmount);
labDistributor.notifySupplyUpdated(lToken, msg.sender);
emit MarketSupply(msg.sender, lToken, uAmount);
return lAmount;
}
function supplyBehalf(
address supplier,
address lToken,
uint256 uAmount
) external payable override onlyListedMarket(lToken) nonReentrant whenNotPaused returns (uint256) {
uAmount = ILToken(lToken).underlying() == address(ETH) ? msg.value : uAmount;
uint256 supplyCap = marketInfos[lToken].supplyCap;
require(
supplyCap == 0 ||
ILToken(lToken).totalSupply().mul(ILToken(lToken).exchangeRate()).div(1e18).add(uAmount) <= supplyCap,
"Core: supply cap reached"
);
uint256 lAmount = ILToken(lToken).supplyBehalf{value: msg.value}(msg.sender, supplier, uAmount);
labDistributor.notifySupplyUpdated(lToken, supplier);
emit MarketSupply(supplier, lToken, uAmount);
return lAmount;
}
function redeemToken(
address lToken,
uint256 lAmount
) external override onlyListedMarket(lToken) nonReentrant whenNotPaused returns (uint256) {
uint256 uAmountRedeem = ILToken(lToken).redeemToken(msg.sender, lAmount);
labDistributor.notifySupplyUpdated(lToken, msg.sender);
emit MarketRedeem(msg.sender, lToken, uAmountRedeem);
return uAmountRedeem;
}
function redeemUnderlying(
address lToken,
uint256 uAmount
) external override onlyListedMarket(lToken) nonReentrant whenNotPaused returns (uint256) {
uint256 uAmountRedeem = ILToken(lToken).redeemUnderlying(msg.sender, uAmount);
labDistributor.notifySupplyUpdated(lToken, msg.sender);
emit MarketRedeem(msg.sender, lToken, uAmountRedeem);
return uAmountRedeem;
}
function borrow(
address lToken,
uint256 amount
) external override onlyListedMarket(lToken) nonReentrant whenNotPaused {
_enterMarket(lToken, msg.sender);
require(IValidator(validator).borrowAllowed(lToken, msg.sender, amount), "Core: cannot borrow");
ILToken(payable(lToken)).borrow(msg.sender, amount);
labDistributor.notifyBorrowUpdated(lToken, msg.sender);
}
function borrowBehalf(
address borrower,
address lToken,
uint256 amount
) external override onlyListedMarket(lToken) onlyLeverager nonReentrant whenNotPaused {
_enterMarket(lToken, borrower);
require(IValidator(validator).borrowAllowed(lToken, borrower, amount), "Core: cannot borrow");
ILToken(payable(lToken)).borrowBehalf(msg.sender, borrower, amount);
labDistributor.notifyBorrowUpdated(lToken, borrower);
}
function repayBorrow(
address lToken,
uint256 amount
) external payable override onlyListedMarket(lToken) nonReentrant whenNotPaused {
ILToken(payable(lToken)).repayBorrow{value: msg.value}(msg.sender, amount);
labDistributor.notifyBorrowUpdated(lToken, msg.sender);
}
function liquidateBorrow(
address lTokenBorrowed,
address lTokenCollateral,
address borrower,
uint256 amount
) external payable override nonReentrant whenNotPaused {
amount = ILToken(lTokenBorrowed).underlying() == address(ETH) ? msg.value : amount;
require(marketInfos[lTokenBorrowed].isListed && marketInfos[lTokenCollateral].isListed, "Core: invalid market");
require(usersOfMarket[lTokenCollateral][borrower], "Core: not a collateral");
require(marketInfos[lTokenCollateral].collateralFactor > 0, "Core: not a collateral");
require(
IValidator(validator).liquidateAllowed(lTokenBorrowed, borrower, amount, closeFactor),
"Core: cannot liquidate borrow"
);
(, uint256 rebateLAmount, uint256 liquidatorLAmount) = ILToken(lTokenBorrowed).liquidateBorrow{value: msg.value}(
lTokenCollateral,
msg.sender,
borrower,
amount
);
ILToken(lTokenCollateral).seize(msg.sender, borrower, liquidatorLAmount);
labDistributor.notifyTransferred(lTokenCollateral, borrower, msg.sender);
if (rebateLAmount > 0) {
ILToken(lTokenCollateral).seize(rebateDistributor, borrower, rebateLAmount);
labDistributor.notifyTransferred(lTokenCollateral, borrower, rebateDistributor);
}
labDistributor.notifyBorrowUpdated(lTokenBorrowed, borrower);
}
function claimLab() external override nonReentrant {
labDistributor.claim(markets, msg.sender);
}
function claimLab(address market) external override nonReentrant {
address[] memory _markets = new address[](1);
_markets[0] = market;
labDistributor.claim(_markets, msg.sender);
}
function compoundLab(uint256 lockDuration) external override nonReentrant {
labDistributor.compound(markets, msg.sender, lockDuration);
}
function transferTokens(
address spender,
address src,
address dst,
uint256 amount
) external override nonReentrant onlyMarket {
ILToken(msg.sender).transferTokensInternal(spender, src, dst, amount);
labDistributor.notifyTransferred(msg.sender, src, dst);
}
function _enterMarket(address lToken, address _account) internal onlyListedMarket(lToken) {
if (!usersOfMarket[lToken][_account]) {
usersOfMarket[lToken][_account] = true;
marketListOfUsers[_account].push(lToken);
emit MarketEntered(lToken, _account);
}
}
function _removeUserMarket(address lTokenToExit, address _account) private {
require(marketListOfUsers[_account].length > 0, "Core: cannot pop user market");
delete usersOfMarket[lTokenToExit][_account];
uint256 length = marketListOfUsers[_account].length;
for (uint256 i = 0; i < length; i++) {
if (marketListOfUsers[_account][i] == lTokenToExit) {
marketListOfUsers[_account][i] = marketListOfUsers[_account][length - 1];
marketListOfUsers[_account].pop();
break;
}
}
}
}
文件 4 的 15:CoreAdmin.sol
pragma solidity ^0.6.12;
pragma experimental ABIEncoderV2;
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import "@openzeppelin/contracts/utils/Pausable.sol";
import "./library/Constant.sol";
import "./interfaces/ICore.sol";
import "./interfaces/ILABDistributor.sol";
import "./interfaces/IPriceCalculator.sol";
import "./interfaces/ILToken.sol";
import "./interfaces/IRebateDistributor.sol";
abstract contract CoreAdmin is ICore, Ownable, ReentrancyGuard, Pausable {
address public keeper;
address public leverager;
address public override validator;
address public override rebateDistributor;
ILABDistributor public labDistributor;
IPriceCalculator public priceCalculator;
address[] public markets;
mapping(address => Constant.MarketInfo) public marketInfos;
uint256 public override closeFactor;
uint256 public override liquidationIncentive;
modifier onlyKeeper() {
require(msg.sender == keeper || msg.sender == owner(), "Core: caller is not the owner or keeper");
_;
}
modifier onlyListedMarket(address lToken) {
require(marketInfos[lToken].isListed, "Core: invalid market");
_;
}
function __Core_init() internal {
closeFactor = 5e17;
liquidationIncentive = 115e16;
}
function setPriceCalculator(address _priceCalculator) external onlyKeeper {
require(_priceCalculator != address(0), "Core: invalid calculator address");
priceCalculator = IPriceCalculator(_priceCalculator);
}
function setKeeper(address _keeper) external onlyKeeper {
require(_keeper != address(0), "Core: invalid keeper address");
keeper = _keeper;
emit KeeperUpdated(_keeper);
}
function setValidator(address _validator) external onlyKeeper {
require(_validator != address(0), "Core: invalid validator address");
validator = _validator;
emit ValidatorUpdated(_validator);
}
function setLABDistributor(address _labDistributor) external onlyKeeper {
require(_labDistributor != address(0), "Core: invalid labDistributor address");
labDistributor = ILABDistributor(_labDistributor);
emit LABDistributorUpdated(_labDistributor);
}
function setRebateDistributor(address _rebateDistributor) external onlyKeeper {
require(_rebateDistributor != address(0), "Core: invalid rebateDistributor address");
rebateDistributor = _rebateDistributor;
emit RebateDistributorUpdated(_rebateDistributor);
}
function setLeverager(address _leverager) external onlyKeeper {
require(_leverager != address(0), "Core: invalid leverager address");
leverager = _leverager;
emit LeveragerUpdated(_leverager);
}
function setCloseFactor(uint256 newCloseFactor) external onlyKeeper {
require(
newCloseFactor >= Constant.CLOSE_FACTOR_MIN && newCloseFactor <= Constant.CLOSE_FACTOR_MAX,
"Core: invalid close factor"
);
closeFactor = newCloseFactor;
emit CloseFactorUpdated(newCloseFactor);
}
function setCollateralFactor(
address lToken,
uint256 newCollateralFactor
) external onlyKeeper onlyListedMarket(lToken) {
require(newCollateralFactor <= Constant.COLLATERAL_FACTOR_MAX, "Core: invalid collateral factor");
if (newCollateralFactor != 0 && priceCalculator.getUnderlyingPrice(lToken) == 0) {
revert("Core: invalid underlying price");
}
marketInfos[lToken].collateralFactor = newCollateralFactor;
emit CollateralFactorUpdated(lToken, newCollateralFactor);
}
function setLiquidationIncentive(uint256 newLiquidationIncentive) external onlyKeeper {
liquidationIncentive = newLiquidationIncentive;
emit LiquidationIncentiveUpdated(newLiquidationIncentive);
}
function setMarketSupplyCaps(address[] calldata lTokens, uint256[] calldata newSupplyCaps) external onlyKeeper {
require(lTokens.length != 0 && lTokens.length == newSupplyCaps.length, "Core: invalid data");
for (uint256 i = 0; i < lTokens.length; i++) {
marketInfos[lTokens[i]].supplyCap = newSupplyCaps[i];
emit SupplyCapUpdated(lTokens[i], newSupplyCaps[i]);
}
}
function setMarketBorrowCaps(address[] calldata lTokens, uint256[] calldata newBorrowCaps) external onlyKeeper {
require(lTokens.length != 0 && lTokens.length == newBorrowCaps.length, "Core: invalid data");
for (uint256 i = 0; i < lTokens.length; i++) {
marketInfos[lTokens[i]].borrowCap = newBorrowCaps[i];
emit BorrowCapUpdated(lTokens[i], newBorrowCaps[i]);
}
}
function listMarket(
address payable lToken,
uint256 supplyCap,
uint256 borrowCap,
uint256 collateralFactor
) external onlyKeeper {
require(!marketInfos[lToken].isListed, "Core: already listed market");
for (uint256 i = 0; i < markets.length; i++) {
require(markets[i] != lToken, "Core: already listed market");
}
marketInfos[lToken] = Constant.MarketInfo({
isListed: true,
supplyCap: supplyCap,
borrowCap: borrowCap,
collateralFactor: collateralFactor
});
markets.push(lToken);
emit MarketListed(lToken);
}
function removeMarket(address payable lToken) external onlyKeeper {
require(marketInfos[lToken].isListed, "Core: unlisted market");
require(ILToken(lToken).totalSupply() == 0 && ILToken(lToken).totalBorrow() == 0, "Core: cannot remove market");
uint256 length = markets.length;
for (uint256 i = 0; i < length; i++) {
if (markets[i] == lToken) {
markets[i] = markets[length - 1];
markets.pop();
delete marketInfos[lToken];
break;
}
}
}
function claimLabBehalf(address[] calldata accounts) external onlyKeeper nonReentrant {
labDistributor.claimBehalf(markets, accounts);
}
function pause() external onlyKeeper {
_pause();
}
function unpause() external onlyKeeper {
_unpause();
}
}
文件 5 的 15:ICore.sol
pragma solidity ^0.6.12;
pragma experimental ABIEncoderV2;
import "../library/Constant.sol";
interface ICore {
event MarketSupply(address user, address lToken, uint256 uAmount);
event MarketRedeem(address user, address lToken, uint256 uAmount);
event MarketListed(address lToken);
event MarketEntered(address lToken, address account);
event MarketExited(address lToken, address account);
event CloseFactorUpdated(uint256 newCloseFactor);
event CollateralFactorUpdated(address lToken, uint256 newCollateralFactor);
event LiquidationIncentiveUpdated(uint256 newLiquidationIncentive);
event SupplyCapUpdated(address indexed lToken, uint256 newSupplyCap);
event BorrowCapUpdated(address indexed lToken, uint256 newBorrowCap);
event KeeperUpdated(address newKeeper);
event ValidatorUpdated(address newValidator);
event LABDistributorUpdated(address newLABDistributor);
event RebateDistributorUpdated(address newRebateDistributor);
event LeveragerUpdated(address newLeverager);
event FlashLoan(
address indexed target,
address indexed initiator,
address indexed asset,
uint256 amount,
uint256 premium
);
function validator() external view returns (address);
function rebateDistributor() external view returns (address);
function allMarkets() external view returns (address[] memory);
function marketListOf(address account) external view returns (address[] memory);
function marketInfoOf(address lToken) external view returns (Constant.MarketInfo memory);
function checkMembership(address account, address lToken) external view returns (bool);
function accountLiquidityOf(
address account
) external view returns (uint256 collateralInUSD, uint256 supplyInUSD, uint256 borrowInUSD);
function closeFactor() external view returns (uint256);
function liquidationIncentive() external view returns (uint256);
function enterMarkets(address[] memory lTokens) external;
function exitMarket(address lToken) external;
function supply(address lToken, uint256 underlyingAmount) external payable returns (uint256);
function supplyBehalf(address account, address lToken, uint256 underlyingAmount) external payable returns (uint256);
function redeemToken(address lToken, uint256 lTokenAmount) external returns (uint256 redeemed);
function redeemUnderlying(address lToken, uint256 underlyingAmount) external returns (uint256 redeemed);
function borrow(address lToken, uint256 amount) external;
function borrowBehalf(address borrower, address lToken, uint256 amount) external;
function repayBorrow(address lToken, uint256 amount) external payable;
function liquidateBorrow(
address lTokenBorrowed,
address lTokenCollateral,
address borrower,
uint256 amount
) external payable;
function claimLab() external;
function claimLab(address market) external;
function transferTokens(address spender, address src, address dst, uint256 amount) external;
function compoundLab(uint256 lockDuration) external;
}
文件 6 的 15:ILABDistributor.sol
pragma solidity ^0.6.12;
pragma experimental ABIEncoderV2;
import "../library/Constant.sol";
interface ILABDistributor {
event DistributionSpeedUpdated(address indexed lToken, uint256 supplySpeed, uint256 borrowSpeed);
event Claimed(address indexed user, uint256 amount);
event Compound(address indexed user, uint256 amount);
function accuredLAB(address[] calldata markets, address account) external view returns (uint);
function distributionInfoOf(address market) external view returns (Constant.DistributionInfo memory);
function accountDistributionInfoOf(
address market,
address account
) external view returns (Constant.DistributionAccountInfo memory);
function apyDistributionOf(address market, address account) external view returns (Constant.DistributionAPY memory);
function boostedRatioOf(
address market,
address account
) external view returns (uint boostedSupplyRatio, uint boostedBorrowRatio);
function notifySupplyUpdated(address market, address user) external;
function notifyBorrowUpdated(address market, address user) external;
function notifyTransferred(address qToken, address sender, address receiver) external;
function claim(address[] calldata markets, address account) external;
function claimBehalf(address[] calldata markets, address[] calldata accounts) external;
function updateAccountBoostedInfo(address user) external;
function compound(address[] calldata markets, address account, uint256 lockDuration) external;
function pause() external;
function unpause() external;
function approve(address _spender, uint256 amount) external returns (bool);
}
文件 7 的 15:ILToken.sol
pragma solidity ^0.6.12;
pragma experimental ABIEncoderV2;
import "../library/Constant.sol";
interface ILToken {
function underlying() external view returns (address);
function totalSupply() external view returns (uint256);
function accountSnapshot(address account) external view returns (Constant.AccountSnapshot memory);
function underlyingBalanceOf(address account) external view returns (uint256);
function borrowBalanceOf(address account) external view returns (uint256);
function totalBorrow() external view returns (uint256);
function _totalBorrow() external view returns (uint256);
function totalReserve() external view returns (uint256);
function reserveFactor() external view returns (uint256);
function lastAccruedTime() external view returns (uint256);
function accInterestIndex() external view returns (uint256);
function exchangeRate() external view returns (uint256);
function getCash() external view returns (uint256);
function getRateModel() external view returns (address);
function getAccInterestIndex() external view returns (uint256);
function accruedAccountSnapshot(address account) external returns (Constant.AccountSnapshot memory);
function accruedBorrowBalanceOf(address account) external returns (uint256);
function accruedTotalBorrow() external returns (uint256);
function accruedExchangeRate() external returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address dst, uint256 amount) external returns (bool);
function transferFrom(address src, address dst, uint256 amount) external returns (bool);
function supply(address account, uint256 underlyingAmount) external payable returns (uint256);
function supplyBehalf(address account, address supplier, uint256 underlyingAmount) external payable returns (uint256);
function redeemToken(address account, uint256 lTokenAmount) external returns (uint256);
function redeemUnderlying(address account, uint256 underlyingAmount) external returns (uint256);
function borrow(address account, uint256 amount) external returns (uint256);
function borrowBehalf(address account, address borrower, uint256 amount) external returns (uint256);
function repayBorrow(address account, uint256 amount) external payable returns (uint256);
function liquidateBorrow(
address lTokenCollateral,
address liquidator,
address borrower,
uint256 amount
) external payable returns (uint256 seizeLAmount, uint256 rebateLAmount, uint256 liquidatorLAmount);
function seize(address liquidator, address borrower, uint256 lTokenAmount) external;
function withdrawReserves() external;
function transferTokensInternal(address spender, address src, address dst, uint256 amount) external;
}
文件 8 的 15:IPriceCalculator.sol
pragma solidity ^0.6.12;
interface IPriceCalculator {
struct ReferenceData {
uint256 lastData;
uint256 lastUpdated;
}
function priceOf(address asset) external view returns (uint256);
function pricesOf(address[] memory assets) external view returns (uint256[] memory);
function priceOfETH() external view returns (uint256);
function getUnderlyingPrice(address lToken) external view returns (uint256);
function getUnderlyingPrices(address[] memory lTokens) external view returns (uint256[] memory);
}
文件 9 的 15:IRebateDistributor.sol
pragma solidity ^0.6.12;
interface IRebateDistributor {
function setKeeper(address _keeper) external;
function pause() external;
function unpause() external;
function updateAdminFeeRate(uint256 newAdminFeeRate) external;
function checkpoint() external;
function weeklyRebatePool() external view returns (uint256);
function weeklyProfitOfVP(uint256 vp) external view returns (uint256);
function weeklyProfitOf(address account) external view returns (uint256);
function indicativeAPR() external view returns (uint256);
function indicativeAPROf(uint256 amount, uint256 lockDuration) external view returns (uint256);
function indicativeAPROfUser(address account) external view returns (uint256);
function accruedRebates(address account) external view returns (uint256, uint256, uint256[] memory);
function claimRebates() external returns (uint256, uint256, uint256[] memory);
function claimAdminRebates() external returns (uint256, uint256[] memory);
function addLABToRebatePool(uint256 amount) external;
function addMarketUTokenToRebatePool(address lToken, uint256 uAmount) external payable;
}
文件 10 的 15:IRegister.sol
pragma solidity ^0.6.12;
interface IRegister {
function register(address _recipient) external returns (uint256 tokenId);
}
文件 11 的 15:IValidator.sol
pragma solidity ^0.6.12;
pragma experimental ABIEncoderV2;
interface IValidator {
function redeemAllowed(address lToken, address redeemer, uint256 redeemAmount) external returns (bool);
function borrowAllowed(address lToken, address borrower, uint256 borrowAmount) external returns (bool);
function liquidateAllowed(
address lTokenBorrowed,
address borrower,
uint256 repayAmount,
uint256 closeFactor
) external returns (bool);
function lTokenAmountToSeize(
address lTokenBorrowed,
address lTokenCollateral,
uint256 actualRepayAmount
) external returns (uint256 seizeLAmount, uint256 rebateLAmount, uint256 liquidatorLAmount);
function getAccountLiquidity(
address account
) external view returns (uint256 collateralInUSD, uint256 supplyInUSD, uint256 borrowInUSD);
}
文件 12 的 15:Ownable.sol
pragma solidity >=0.6.0 <0.8.0;
import "../utils/Context.sol";
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor () internal {
address msgSender = _msgSender();
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
function owner() public view virtual returns (address) {
return _owner;
}
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
function renounceOwnership() public virtual onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}
文件 13 的 15:Pausable.sol
pragma solidity >=0.6.0 <0.8.0;
import "./Context.sol";
abstract contract Pausable is Context {
event Paused(address account);
event Unpaused(address account);
bool private _paused;
constructor () internal {
_paused = false;
}
function paused() public view virtual returns (bool) {
return _paused;
}
modifier whenNotPaused() {
require(!paused(), "Pausable: paused");
_;
}
modifier whenPaused() {
require(paused(), "Pausable: not paused");
_;
}
function _pause() internal virtual whenNotPaused {
_paused = true;
emit Paused(_msgSender());
}
function _unpause() internal virtual whenPaused {
_paused = false;
emit Unpaused(_msgSender());
}
}
文件 14 的 15:ReentrancyGuard.sol
pragma solidity >=0.6.0 <0.8.0;
abstract contract ReentrancyGuard {
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor () internal {
_status = _NOT_ENTERED;
}
modifier nonReentrant() {
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
_status = _ENTERED;
_;
_status = _NOT_ENTERED;
}
}
文件 15 的 15:SafeMath.sol
pragma solidity >=0.6.0 <0.8.0;
library SafeMath {
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b > a) return (false, 0);
return (true, a - b);
}
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b == 0) return (false, 0);
return (true, a / b);
}
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b == 0) return (false, 0);
return (true, a % b);
}
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
require(b <= a, "SafeMath: subtraction overflow");
return a - b;
}
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) return 0;
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
require(b > 0, "SafeMath: division by zero");
return a / b;
}
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
require(b > 0, "SafeMath: modulo by zero");
return a % b;
}
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
return a - b;
}
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
return a / b;
}
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
return a % b;
}
}
{
"compilationTarget": {
"contracts/Core.sol": "Core"
},
"evmVersion": "istanbul",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"lToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"newBorrowCap","type":"uint256"}],"name":"BorrowCapUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newCloseFactor","type":"uint256"}],"name":"CloseFactorUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"lToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"newCollateralFactor","type":"uint256"}],"name":"CollateralFactorUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"target","type":"address"},{"indexed":true,"internalType":"address","name":"initiator","type":"address"},{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"premium","type":"uint256"}],"name":"FlashLoan","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newKeeper","type":"address"}],"name":"KeeperUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newLABDistributor","type":"address"}],"name":"LABDistributorUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newLeverager","type":"address"}],"name":"LeveragerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newLiquidationIncentive","type":"uint256"}],"name":"LiquidationIncentiveUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"lToken","type":"address"},{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"MarketEntered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"lToken","type":"address"},{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"MarketExited","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"lToken","type":"address"}],"name":"MarketListed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address","name":"lToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"uAmount","type":"uint256"}],"name":"MarketRedeem","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address","name":"lToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"uAmount","type":"uint256"}],"name":"MarketSupply","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newRebateDistributor","type":"address"}],"name":"RebateDistributorUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"lToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"newSupplyCap","type":"uint256"}],"name":"SupplyCapUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newValidator","type":"address"}],"name":"ValidatorUpdated","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"accountLiquidityOf","outputs":[{"internalType":"uint256","name":"collateralInUSD","type":"uint256"},{"internalType":"uint256","name":"supplyInUSD","type":"uint256"},{"internalType":"uint256","name":"borrowInUSD","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allMarkets","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"borrow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"borrower","type":"address"},{"internalType":"address","name":"lToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"borrowBehalf","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"lToken","type":"address"}],"name":"checkMembership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimLab","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"market","type":"address"}],"name":"claimLab","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"claimLabBehalf","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"closeFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"lockDuration","type":"uint256"}],"name":"compoundLab","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"lTokens","type":"address[]"}],"name":"enterMarkets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"lToken","type":"address"}],"name":"exitMarket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_priceCalculator","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"keeper","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"labDistributor","outputs":[{"internalType":"contract ILABDistributor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"leverager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lTokenBorrowed","type":"address"},{"internalType":"address","name":"lTokenCollateral","type":"address"},{"internalType":"address","name":"borrower","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"liquidateBorrow","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"liquidationIncentive","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"lToken","type":"address"},{"internalType":"uint256","name":"supplyCap","type":"uint256"},{"internalType":"uint256","name":"borrowCap","type":"uint256"},{"internalType":"uint256","name":"collateralFactor","type":"uint256"}],"name":"listMarket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"lToken","type":"address"}],"name":"marketInfoOf","outputs":[{"components":[{"internalType":"bool","name":"isListed","type":"bool"},{"internalType":"uint256","name":"supplyCap","type":"uint256"},{"internalType":"uint256","name":"borrowCap","type":"uint256"},{"internalType":"uint256","name":"collateralFactor","type":"uint256"}],"internalType":"struct Constant.MarketInfo","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"marketInfos","outputs":[{"internalType":"bool","name":"isListed","type":"bool"},{"internalType":"uint256","name":"supplyCap","type":"uint256"},{"internalType":"uint256","name":"borrowCap","type":"uint256"},{"internalType":"uint256","name":"collateralFactor","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"marketListOf","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"marketListOfUsers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"markets","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceCalculator","outputs":[{"internalType":"contract IPriceCalculator","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rebateDistributor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lToken","type":"address"},{"internalType":"uint256","name":"lAmount","type":"uint256"}],"name":"redeemToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"lToken","type":"address"},{"internalType":"uint256","name":"uAmount","type":"uint256"}],"name":"redeemUnderlying","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"lToken","type":"address"}],"name":"removeMarket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"lToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"repayBorrow","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newCloseFactor","type":"uint256"}],"name":"setCloseFactor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"lToken","type":"address"},{"internalType":"uint256","name":"newCollateralFactor","type":"uint256"}],"name":"setCollateralFactor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_keeper","type":"address"}],"name":"setKeeper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_labDistributor","type":"address"}],"name":"setLABDistributor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_leverager","type":"address"}],"name":"setLeverager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLiquidationIncentive","type":"uint256"}],"name":"setLiquidationIncentive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"lTokens","type":"address[]"},{"internalType":"uint256[]","name":"newBorrowCaps","type":"uint256[]"}],"name":"setMarketBorrowCaps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"lTokens","type":"address[]"},{"internalType":"uint256[]","name":"newSupplyCaps","type":"uint256[]"}],"name":"setMarketSupplyCaps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_priceCalculator","type":"address"}],"name":"setPriceCalculator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rebateDistributor","type":"address"}],"name":"setRebateDistributor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_validator","type":"address"}],"name":"setValidator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"lToken","type":"address"},{"internalType":"uint256","name":"uAmount","type":"uint256"}],"name":"supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"supplier","type":"address"},{"internalType":"address","name":"lToken","type":"address"},{"internalType":"uint256","name":"uAmount","type":"uint256"}],"name":"supplyBehalf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"usersOfMarket","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"validator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]