编译器
0.8.16+commit.07a7930e
文件 1 的 20:Address.sol
pragma solidity ^0.8.1;
library Address {
function isContract(address account) internal view returns (bool) {
return account.code.length > 0;
}
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, "Address: low-level call failed");
}
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata,
string memory errorMessage
) internal view returns (bytes memory) {
if (success) {
if (returndata.length == 0) {
require(isContract(target), "Address: call to non-contract");
}
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
function _revert(bytes memory returndata, string memory errorMessage) private pure {
if (returndata.length > 0) {
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
文件 2 的 20:Context.sol
pragma solidity ^0.8.0;
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
文件 3 的 20:EnumerableSet.sol
pragma solidity ^0.8.0;
library EnumerableSet {
struct Set {
bytes32[] _values;
mapping(bytes32 => uint256) _indexes;
}
function _add(Set storage set, bytes32 value) private returns (bool) {
if (!_contains(set, value)) {
set._values.push(value);
set._indexes[value] = set._values.length;
return true;
} else {
return false;
}
}
function _remove(Set storage set, bytes32 value) private returns (bool) {
uint256 valueIndex = set._indexes[value];
if (valueIndex != 0) {
uint256 toDeleteIndex = valueIndex - 1;
uint256 lastIndex = set._values.length - 1;
if (lastIndex != toDeleteIndex) {
bytes32 lastValue = set._values[lastIndex];
set._values[toDeleteIndex] = lastValue;
set._indexes[lastValue] = valueIndex;
}
set._values.pop();
delete set._indexes[value];
return true;
} else {
return false;
}
}
function _contains(Set storage set, bytes32 value) private view returns (bool) {
return set._indexes[value] != 0;
}
function _length(Set storage set) private view returns (uint256) {
return set._values.length;
}
function _at(Set storage set, uint256 index) private view returns (bytes32) {
return set._values[index];
}
function _values(Set storage set) private view returns (bytes32[] memory) {
return set._values;
}
struct Bytes32Set {
Set _inner;
}
function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _add(set._inner, value);
}
function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _remove(set._inner, value);
}
function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
return _contains(set._inner, value);
}
function length(Bytes32Set storage set) internal view returns (uint256) {
return _length(set._inner);
}
function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
return _at(set._inner, index);
}
function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
bytes32[] memory store = _values(set._inner);
bytes32[] memory result;
assembly {
result := store
}
return result;
}
struct AddressSet {
Set _inner;
}
function add(AddressSet storage set, address value) internal returns (bool) {
return _add(set._inner, bytes32(uint256(uint160(value))));
}
function remove(AddressSet storage set, address value) internal returns (bool) {
return _remove(set._inner, bytes32(uint256(uint160(value))));
}
function contains(AddressSet storage set, address value) internal view returns (bool) {
return _contains(set._inner, bytes32(uint256(uint160(value))));
}
function length(AddressSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
function at(AddressSet storage set, uint256 index) internal view returns (address) {
return address(uint160(uint256(_at(set._inner, index))));
}
function values(AddressSet storage set) internal view returns (address[] memory) {
bytes32[] memory store = _values(set._inner);
address[] memory result;
assembly {
result := store
}
return result;
}
struct UintSet {
Set _inner;
}
function add(UintSet storage set, uint256 value) internal returns (bool) {
return _add(set._inner, bytes32(value));
}
function remove(UintSet storage set, uint256 value) internal returns (bool) {
return _remove(set._inner, bytes32(value));
}
function contains(UintSet storage set, uint256 value) internal view returns (bool) {
return _contains(set._inner, bytes32(value));
}
function length(UintSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
function at(UintSet storage set, uint256 index) internal view returns (uint256) {
return uint256(_at(set._inner, index));
}
function values(UintSet storage set) internal view returns (uint256[] memory) {
bytes32[] memory store = _values(set._inner);
uint256[] memory result;
assembly {
result := store
}
return result;
}
}
文件 4 的 20:EnumerableValues.sol
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
library EnumerableValues {
using EnumerableSet for EnumerableSet.Bytes32Set;
using EnumerableSet for EnumerableSet.AddressSet;
using EnumerableSet for EnumerableSet.UintSet;
function valuesAt(EnumerableSet.Bytes32Set storage set, uint256 start, uint256 end) internal view returns (bytes32[] memory) {
uint256 max = set.length();
if (end > max) { end = max; }
bytes32[] memory items = new bytes32[](end - start);
for (uint256 i = start; i < end; i++) {
items[i - start] = set.at(i);
}
return items;
}
function valuesAt(EnumerableSet.AddressSet storage set, uint256 start, uint256 end) internal view returns (address[] memory) {
uint256 max = set.length();
if (end > max) { end = max; }
address[] memory items = new address[](end - start);
for (uint256 i = start; i < end; i++) {
items[i - start] = set.at(i);
}
return items;
}
function valuesAt(EnumerableSet.UintSet storage set, uint256 start, uint256 end) internal view returns (uint256[] memory) {
uint256 max = set.length();
if (end > max) { end = max; }
uint256[] memory items = new uint256[](end - start);
for (uint256 i = start; i < end; i++) {
items[i - start] = set.at(i);
}
return items;
}
}
文件 5 的 20:IELP.sol
pragma solidity ^0.8.0;
interface IELP {
function updateStakingAmount(address _account, uint256 _amount) external;
function claimForAccount(address _account) external returns (uint256);
function claimable(address _account) external view returns (uint256);
function USDbyFee( ) external view returns (uint256);
function TokenFeeReserved( address _token) external view returns (uint256);
function withdrawToEDEPool() external returns (uint256);
function vault() external returns (address);
}
文件 6 的 20:IERC20.sol
pragma solidity ^0.8.0;
interface IERC20 {
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address to, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(
address from,
address to,
uint256 amount
) external returns (bool);
}
文件 7 的 20:IESBT.sol
pragma solidity ^0.8.13;
interface IESBT {
function scorePara(uint256 _paraId) external view returns (uint256);
function createTime(address _account) external view returns (uint256);
function nickName(address _account) external view returns (string memory);
function getReferralForAccount(address _account) external view returns (address[] memory , address[] memory);
function userSizeSum(address _account) external view returns (uint256);
function updateFee(address _account, uint256 _origFee) external returns (uint256);
function getESBTAddMpUintetRoles(address _mpaddress, bytes32 _key) external view returns (uint256[] memory);
function updateClaimVal(address _account) external ;
function userClaimable(address _account) external view returns (uint256, uint256);
function updateScoreForAccount(address _account, address , uint256 _amount, uint256 _reasonCode) external;
function updateTradingScoreForAccount(address _account, address _vault, uint256 _amount, uint256 _refCode) external;
function updateSwapScoreForAccount(address _account, address _vault, uint256 _amount) external;
function updateAddLiqScoreForAccount(address _account, address _vault, uint256 _amount, uint256 _refCode) external;
function getScore(address _account) external view returns (uint256);
function getRefCode(address _account) external view returns (string memory);
function accountToDisReb(address _account) external view returns (uint256, uint256);
function rank(address _account) external view returns (uint256);
function addressToTokenID(address _account) external view returns (uint256);
}
文件 8 的 20:IElpManager.sol
pragma solidity ^0.8.0;
interface IElpManager {
function cooldownDuration() external returns (uint256);
function lastAddedAt(address _account) external returns (uint256);
function addLiquidity(address _token, uint256 _amount, uint256 _minUsdx, uint256 _minElp) external returns (uint256);
function removeLiquidity(address _tokenOut, uint256 _elpAmount, uint256 _minOut, address _receiver) external returns (uint256);
}
文件 9 的 20:IMintable.sol
pragma solidity ^0.8.0;
interface IMintable {
function isMinter(address _account) external returns (bool);
function setMinter(address _minter, bool _isActive) external;
function mint(address _account, uint256 _amount) external;
function burn(address _account, uint256 _amount) external;
}
文件 10 的 20:IRewardTracker.sol
pragma solidity ^0.8.0;
interface IRewardTracker {
function stakedAmounts(address _account) external view returns (uint256);
function updateRewardsForUser(address _account) external;
function poolStakedAmount() external view returns (uint256);
function stake(address _depositToken, uint256 _amount) external;
function stakeForAccount(address _fundingAccount, address _account, address _depositToken, uint256 _amount) external;
function unstake(address _depositToken, uint256 _amount) external;
function unstakeForAccount(address _account, address _depositToken, uint256 _amount, address _receiver) external;
function claim(address _receiver) external returns (uint256);
function claimForAccount(address _account, address _receiver) external returns (uint256);
function claimable(address _account) external view returns (uint256);
function averageStakedAmounts(address _account) external view returns (uint256);
function cumulativeRewards(address _account) external view returns (uint256);
function balanceOf(address _account) external view returns (uint256);
function poolTokenRewardPerInterval() external view returns (uint256);
}
文件 11 的 20:IVault.sol
pragma solidity ^0.8.0;
import "../../DID/interfaces/IESBT.sol";
import "../VaultMSData.sol";
interface IVault {
function isSwapEnabled() external view returns (bool);
function priceFeed() external view returns (address);
function usdx() external view returns (address);
function totalTokenWeights() external view returns (uint256);
function usdxSupply() external view returns (uint256);
function usdxAmounts(address _token) external view returns (uint256);
function guaranteedUsd(address _token) external view returns (uint256);
function baseMode() external view returns (uint8);
function approvedRouters(address _router) external view returns (bool);
function isManager(address _account) external view returns (bool);
function feeReserves(address _token) external view returns (uint256);
function feeSold (address _token) external view returns (uint256);
function feeReservesUSD() external view returns (uint256);
function feeReservesDiscountedUSD() external view returns (uint256);
function feeReservesRecord(uint256 _day) external view returns (uint256);
function feeClaimedUSD() external view returns (uint256);
function globalShortSize( ) external view returns (uint256);
function globalLongSize( ) external view returns (uint256);
function setESBT(address _eSBT) external;
function setVaultStorage(address _vaultStorage) external;
function setVaultUtils(address _vaultUtils) external;
function setManager(address _manager, bool _isManager) external;
function setIsSwapEnabled(bool _isSwapEnabled) external;
function setPriceFeed(address _priceFeed) external;
function setRouter(address _router, bool _status) external;
function setUsdxAmount(address _token, uint256 _amount, bool _increase) external;
function setTokenConfig(address _token, uint256 _tokenDecimals, uint256 _tokenWeight, uint256 _maxUSDAmount,
bool _isStable, bool _isFundingToken, bool _isTradingToken ) external;
function clearTokenConfig(address _token) external;
function updateRate(address _token) external;
function buyUSDX(address _token, address _receiver) external returns (uint256);
function sellUSDX(address _token, address _receiver, uint256 _usdxAmount) external returns (uint256);
function claimFeeToken(address _token) external returns (uint256);
function claimFeeReserves( ) external returns (uint256) ;
function swap(address _tokenIn, address _tokenOut, address _receiver) external returns (uint256);
function increasePosition(address _account, address _collateralToken, address _indexToken, uint256 _sizeDelta, bool _isLong) external;
function decreasePosition(address _account, address _collateralToken, address _indexToken, uint256 _collateralDelta, uint256 _sizeDelta, bool _isLong, address _receiver) external returns (uint256);
function liquidatePosition(address _account, address _collateralToken, address _indexToken, bool _isLong, address _feeReceiver) external;
function directPoolDeposit(address _token) external;
function tradingTokenList() external view returns (address[] memory);
function fundingTokenList() external view returns (address[] memory);
function claimableFeeReserves( ) external view returns (uint256);
function getMaxPrice(address _token) external view returns (uint256);
function getMinPrice(address _token) external view returns (uint256);
function getRedemptionAmount(address _token, uint256 _usdxAmount) external view returns (uint256);
function tokenToUsdMin(address _token, uint256 _tokenAmount) external view returns (uint256);
function usdToTokenMax(address _token, uint256 _usdAmount) external view returns (uint256);
function usdToTokenMin(address _token, uint256 _usdAmount) external view returns (uint256);
function isFundingToken(address _token) external view returns(bool);
function isTradingToken(address _token) external view returns(bool);
function tokenDecimals(address _token) external view returns (uint256);
function getPositionStructByKey(bytes32 _key) external view returns (VaultMSData.Position memory);
function getPositionStruct(address _account, address _collateralToken, address _indexToken, bool _isLong) external view returns (VaultMSData.Position memory);
function getTokenBase(address _token) external view returns (VaultMSData.TokenBase memory);
function getTradingFee(address _token) external view returns (VaultMSData.TradingFee memory);
function getTradingRec(address _token) external view returns (VaultMSData.TradingRec memory);
function getUserKeys(address _account, uint256 _start, uint256 _end) external view returns (bytes32[] memory);
function getKeys(uint256 _start, uint256 _end) external view returns (bytes32[] memory);
}
文件 12 的 20:IVaultPriceFeedV2.sol
pragma solidity ^0.8.0;
interface IVaultPriceFeedV2 {
function adjustmentBasisPoints(address _token) external view returns (uint256);
function isAdjustmentAdditive(address _token) external view returns (bool);
function setAdjustment(address _token, bool _isAdditive, uint256 _adjustmentBps) external;
function setUseV2Pricing(bool _useV2Pricing) external;
function setIsAmmEnabled(bool _isEnabled) external;
function setIsSecondaryPriceEnabled(bool _isEnabled) external;
function setSpreadBasisPoints(address _token, uint256 _spreadBasisPoints) external;
function setSpreadThresholdBasisPoints(uint256 _spreadThresholdBasisPoints) external;
function setFavorPrimaryPrice(bool _favorPrimaryPrice) external;
function setPriceSampleSpace(uint256 _priceSampleSpace) external;
function setMaxStrictPriceDeviation(uint256 _maxStrictPriceDeviation) external;
function getPrice(address _token, bool _maximise,bool,bool) external view returns (uint256);
function getOrigPrice(address _token) external view returns (uint256);
function getLatestPrimaryPrice(address _token) external view returns (uint256);
function getPrimaryPrice(address _token, bool _maximise) external view returns (uint256, bool);
function setTokenChainlink( address _token, address _chainlinkContract) external;
function setTokenConfig(
address _token,
address _priceFeed,
uint256 _priceDecimals,
bool _isStrictStable
) external;
function priceVariancePer1Million(address _token) external view returns (uint256);
}
文件 13 的 20:IWETH.sol
pragma solidity ^0.8.0;
interface IWETH {
function deposit() external payable;
function transfer(address to, uint value) external returns (bool);
function withdraw(uint) external;
}
文件 14 的 20:Ownable.sol
pragma solidity ^0.8.0;
import "../utils/Context.sol";
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor() {
_transferOwnership(_msgSender());
}
modifier onlyOwner() {
_checkOwner();
_;
}
function owner() public view virtual returns (address) {
return _owner;
}
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
文件 15 的 20:ReentrancyGuard.sol
pragma solidity ^0.8.0;
abstract contract ReentrancyGuard {
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
_status = _ENTERED;
}
function _nonReentrantAfter() private {
_status = _NOT_ENTERED;
}
}
文件 16 的 20:RewardRouter.sol
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/utils/math/SafeMath.sol";
import "@openzeppelin/contracts/utils/Address.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
import "./interfaces/IRewardTracker.sol";
import "../core/interfaces/IElpManager.sol";
import "../core/interfaces/IVaultPriceFeedV2.sol";
import "../core/interfaces/IVault.sol";
import "../tokens/interfaces/IMintable.sol";
import "../tokens/interfaces/IWETH.sol";
import "../tokens/interfaces/IELP.sol";
import "../utils/EnumerableValues.sol";
import "../DID/interfaces/IESBT.sol";
contract RewardRouter is ReentrancyGuard, Ownable {
using SafeMath for uint256;
using SafeERC20 for IERC20;
using Address for address payable;
using EnumerableSet for EnumerableSet.AddressSet;
using EnumerableValues for EnumerableSet.AddressSet;
uint256 public cooldownDuration = 1 hours;
mapping (address => uint256) public latestOperationTime;
uint256 public constant PRICE_TO_EUSD = 10 ** 12;
uint256 public base_fee_point;
uint256 public constant LVT_PRECISION = 10000;
uint256 public constant LVT_MINFEE = 50;
uint256 public constant PRICE_PRECISION = 10 ** 30;
uint256 public constant SWAP_THRESHOLD = 100 * (10 ** 30);
mapping(address => uint256) public claimedESBTRebate;
mapping(address => uint256) public claimedESBTDiscount;
bool public isInitialized;
address public rewardToken;
address public eusd;
address public weth;
address public esbt;
EnumerableSet.AddressSet internal allToken;
mapping (address => bool) public swapToken;
mapping (address => bool) public isStable;
mapping (address => bool) public swapStatus;
mapping (address => EnumerableSet.AddressSet) internal ELPnContainsToken;
mapping (address => address) ELPnStableTokens;
address public pricefeed;
uint256 public totalELPnWeights;
EnumerableSet.AddressSet allWhitelistedELPn;
address[] public whitelistedELPn;
mapping (address => uint256) public rewardELPnWeights;
mapping (address => address) public stakedELPnTracker;
mapping (address => address) public stakedELPnVault;
mapping (address => uint256) public tokenDecimals;
event StakeElp(address account, uint256 amount);
event UnstakeElp(address account, uint256 amount);
event UserStakeElp(address account, uint256 amount);
event UserUnstakeElp(address account, uint256 amount);
event Claim(address receiver, uint256 amount);
event BuyEUSD(
address account,
address token,
uint256 amount,
uint256 fee
);
event SellEUSD(
address account,
address token,
uint256 amount,
uint256 fee
);
event ClaimESBTEUSD(address _account, uint256 claimAmount);
receive() external payable {
require(msg.sender == weth, "Router: invalid sender");
}
function initialize(
address _rewardToken,
address _eusd,
address _weth,
address _pricefeed,
uint256 _base_fee_point
) external onlyOwner {
require(!isInitialized, "RewardTracker: already initialized");
isInitialized = true;
eusd = _eusd;
weth = _weth;
rewardToken = _rewardToken;
pricefeed = _pricefeed;
base_fee_point = _base_fee_point;
tokenDecimals[eusd] = 18;
}
function setRewardToken(address _rewardToken)external onlyOwner {
rewardToken = _rewardToken;
}
function setPriceFeed(address _pricefeed) external onlyOwner {
pricefeed = _pricefeed;
}
function adjustProfit(address _account, uint256 val_1, uint256 val_2 ) external onlyOwner {
claimedESBTDiscount[_account] = val_1;
claimedESBTRebate[_account] = val_2;
}
function setESBT(address _esbt) external onlyOwner {
esbt = _esbt;
}
function setPriceFeed(address _token, bool _status) external onlyOwner {
swapToken[_token] = _status;
}
function setBaseFeePoint(uint256 _base_fee_point) external onlyOwner {
base_fee_point = _base_fee_point;
}
function setCooldownDuration(uint256 _setCooldownDuration) external onlyOwner {
cooldownDuration = _setCooldownDuration;
}
function setTokenConfig(
address _token,
uint256 _token_decimal,
address _elp_n,
bool _isStable
) external onlyOwner {
if (!allToken.contains(_token)){
allToken.add(_token);
}
tokenDecimals[_token] = _token_decimal;
if (!ELPnContainsToken[_elp_n].contains(_token))
ELPnContainsToken[_elp_n].add(_token);
if (_isStable){
ELPnStableTokens[_elp_n] = _token;
isStable[_token] = true;
}
}
function delToken(
address _token,
address _elp_n
) external onlyOwner {
if (allToken.contains(_token)){
allToken.remove(_token);
}
if (ELPnContainsToken[_elp_n].contains(_token))
ELPnContainsToken[_elp_n].remove(_token);
}
function setSwapToken(address _token, bool _status) external onlyOwner{
swapStatus[_token] = _status;
}
function setELPn(
address _elp_n,
uint256 _elp_n_weight,
address _stakedELPnVault,
uint256 _elp_n_decimal,
address _stakedElpTracker
) external onlyOwner {
if (!allWhitelistedELPn.contains(_elp_n)) {
allWhitelistedELPn.add(_elp_n);
}
uint256 _totalELPnWeights = totalELPnWeights;
_totalELPnWeights = _totalELPnWeights.sub(rewardELPnWeights[_elp_n]);
totalELPnWeights = totalELPnWeights.add(_elp_n_weight);
rewardELPnWeights[_elp_n] = _elp_n_weight;
tokenDecimals[_elp_n] = _elp_n_decimal;
stakedELPnTracker[_elp_n] = _stakedElpTracker;
stakedELPnVault[_elp_n] = _stakedELPnVault;
whitelistedELPn = allWhitelistedELPn.valuesAt(0, allWhitelistedELPn.length());
}
function clearELPn(address _elp_n) external onlyOwner {
require(allWhitelistedELPn.contains(_elp_n), "not included");
totalELPnWeights = totalELPnWeights.sub(rewardELPnWeights[_elp_n]);
allWhitelistedELPn.remove(_elp_n);
delete rewardELPnWeights[_elp_n];
delete stakedELPnTracker[_elp_n];
whitelistedELPn = allWhitelistedELPn.valuesAt(0, allWhitelistedELPn.length());
}
function withdrawToken(address _token, address _account, uint256 _amount) external onlyOwner {
IERC20(_token).safeTransfer(_account, _amount);
}
function stakedELPnAmount() external view returns (address[] memory, uint256[] memory, uint256[] memory) {
uint256 poolLength = whitelistedELPn.length;
uint256[] memory _stakedAmount = new uint256[](poolLength);
address[] memory _stakedELPn = new address[](poolLength);
uint256[] memory _poolRewardRate = new uint256[](poolLength);
for (uint80 i = 0; i < poolLength; i++) {
_stakedELPn[i] = whitelistedELPn[i];
_stakedAmount[i] = IRewardTracker(stakedELPnTracker[whitelistedELPn[i]]).poolStakedAmount();
_poolRewardRate[i] = IRewardTracker(stakedELPnTracker[whitelistedELPn[i]]).poolTokenRewardPerInterval();
}
return (_stakedELPn, _stakedAmount, _poolRewardRate);
}
function stakeELPn(address _elp_n, uint256 _elpAmount) external nonReentrant returns (uint256) {
require(_elpAmount > 0, "RewardRouter: invalid _amount");
require(allWhitelistedELPn.contains(_elp_n), "RewardTracker: invalid stake ELP Token");
address account = msg.sender;
latestOperationTime[account] = block.timestamp;
IRewardTracker(stakedELPnTracker[_elp_n]).stakeForAccount(account, account, _elp_n, _elpAmount);
emit UserStakeElp(account, _elpAmount);
return _elpAmount;
}
function unstakeELPn(address _elp_n, uint256 _tokenInAmount) external nonReentrant returns (uint256) {
address account = msg.sender;
require(block.timestamp.sub(latestOperationTime[account]) > cooldownDuration, "Cooldown Time Required.");
latestOperationTime[account] = block.timestamp;
require(_tokenInAmount > 0, "RewardRouter: invalid _elpAmount");
require(allWhitelistedELPn.contains(_elp_n), "RewardTracker: invalid stake Token");
IRewardTracker(stakedELPnTracker[_elp_n]).unstakeForAccount(account, _elp_n, _tokenInAmount, account);
emit UserUnstakeElp(account, _tokenInAmount);
return _tokenInAmount;
}
function claimEDEForAccount(address _account) external nonReentrant returns (uint256) {
address account =_account == address(0) ? msg.sender : _account;
return _claimEDE(account);
}
function claimEDE() external nonReentrant returns (uint256) {
address account = msg.sender;
return _claimEDE(account);
}
function claimEUSDForAccount(address _account) public nonReentrant returns (uint256) {
address account =_account == address(0) ? msg.sender : _account;
return _claimEUSD(account);
}
function claimEUSD() public nonReentrant returns (uint256) {
address account = msg.sender;
return _claimEUSD(account);
}
function claimEE(address[] memory _ELPlist) public nonReentrant returns (uint256, uint256) {
address account = msg.sender;
return _claimEEforAccount(account, _ELPlist);
}
function _claimEEforAccount(address _account, address[] memory _ELPlist) internal returns (uint256, uint256) {
require(block.timestamp.sub(latestOperationTime[_account]) > cooldownDuration, "Cooldown Time Required.");
for (uint80 i = 0; i < _ELPlist.length; i++) {
require(allWhitelistedELPn.contains(_ELPlist[i]), "invalid elp");
}
uint256 eusdClaimReward = 0;
for (uint80 i = 0; i < _ELPlist.length; i++) {
uint256 this_reward = IRewardTracker(stakedELPnTracker[_ELPlist[i]]).claimForAccount(_account, _account);
eusdClaimReward = eusdClaimReward.add(this_reward);
}
require(IERC20(rewardToken).balanceOf(address(this)) > eusdClaimReward, "insufficient aEDE");
IERC20(rewardToken).safeTransfer(_account, eusdClaimReward);
address account =_account == address(0) ? msg.sender : _account;
uint256 edeClaimReward = 0;
for (uint80 i = 0; i < _ELPlist.length; i++) {
uint256 this_reward = IELP(_ELPlist[i]).claimForAccount(account);
edeClaimReward = edeClaimReward.add(this_reward);
}
return (edeClaimReward, eusdClaimReward);
}
function claimableEUSDForAccount(address _account) external view returns (uint256) {
address account =_account == address(0) ? msg.sender : _account;
uint256 totalClaimReward = 0;
for (uint80 i = 0; i < whitelistedELPn.length; i++) {
uint256 this_reward = IELP(whitelistedELPn[i]).claimable(account);
totalClaimReward = totalClaimReward.add(this_reward);
}
return totalClaimReward;
}
function claimableEUSD() external view returns (uint256) {
address account = msg.sender;
uint256 totalClaimReward = 0;
for (uint80 i = 0; i < whitelistedELPn.length; i++) {
uint256 this_reward = IELP(whitelistedELPn[i]).claimable(account);
totalClaimReward = totalClaimReward.add(this_reward);
}
return totalClaimReward;
}
function claimableEUSDListForAccount(address _account) external view returns (address[] memory, uint256[] memory) {
uint256 poolLength = whitelistedELPn.length;
address account =_account == address(0) ? msg.sender : _account;
address[] memory _stakedELPn = new address[](poolLength);
uint256[] memory _rewardList = new uint256[](poolLength);
for (uint80 i = 0; i < whitelistedELPn.length; i++) {
_rewardList[i] = IELP(whitelistedELPn[i]).claimable(account);
_stakedELPn[i] = whitelistedELPn[i];
}
return (_stakedELPn, _rewardList);
}
function claimableEUSDList() external view returns (address[] memory, uint256[] memory) {
uint256 poolLength = whitelistedELPn.length;
address account = msg.sender;
address[] memory _stakedELPn = new address[](poolLength);
uint256[] memory _rewardList = new uint256[](poolLength);
for (uint80 i = 0; i < whitelistedELPn.length; i++) {
_rewardList[i] = IELP(whitelistedELPn[i]).claimable(account);
_stakedELPn[i] = whitelistedELPn[i];
}
return (_stakedELPn, _rewardList);
}
function claimAllForAccount(address _account) external nonReentrant returns ( uint256[] memory) {
address account =_account == address(0) ? msg.sender : _account;
uint256[] memory reward = new uint256[](2);
reward[0] = _claimEDE(account);
reward[1] = _claimEUSD(account);
return reward;
}
function claimAll() external nonReentrant returns ( uint256[] memory) {
address account = msg.sender ;
uint256[] memory reward = new uint256[](2);
reward[0] = _claimEDE(account);
reward[1] = _claimEUSD(account);
return reward;
}
function _claimEUSD(address _account) private returns (uint256) {
address account =_account == address(0) ? msg.sender : _account;
require(block.timestamp.sub(latestOperationTime[account]) > cooldownDuration, "Cooldown Time Required.");
uint256 totalClaimReward = 0;
for (uint80 i = 0; i < whitelistedELPn.length; i++) {
uint256 this_reward = IELP(whitelistedELPn[i]).claimForAccount(account);
totalClaimReward = totalClaimReward.add(this_reward);
}
return totalClaimReward;
}
function _claimEDE(address _account) private returns (uint256) {
require(block.timestamp.sub(latestOperationTime[_account]) > cooldownDuration, "Cooldown Time Required.");
uint256 totalClaimReward = 0;
for (uint80 i = 0; i < whitelistedELPn.length; i++) {
uint256 this_reward = IRewardTracker(stakedELPnTracker[whitelistedELPn[i]]).claimForAccount(_account, _account);
totalClaimReward = totalClaimReward.add(this_reward);
}
require(IERC20(rewardToken).balanceOf(address(this)) > totalClaimReward, "insufficient aEDE");
IERC20(rewardToken).safeTransfer(_account, totalClaimReward);
return totalClaimReward;
}
function claimableEDEListForAccount(address _account) external view returns (address[] memory, uint256[] memory) {
uint256 poolLength = whitelistedELPn.length;
address[] memory _stakedELPn = new address[](poolLength);
uint256[] memory _rewardList = new uint256[](poolLength);
address account =_account == address(0) ? msg.sender : _account;
for (uint80 i = 0; i < whitelistedELPn.length; i++) {
_rewardList[i] = IRewardTracker(stakedELPnTracker[whitelistedELPn[i]]).claimable(account);
_stakedELPn[i] = whitelistedELPn[i];
}
return (_stakedELPn, _rewardList);
}
function claimableEDEList() external view returns (address[] memory, uint256[] memory) {
address account = msg.sender ;
uint256 poolLength = whitelistedELPn.length;
address[] memory _stakedELPn = new address[](poolLength);
uint256[] memory _rewardList = new uint256[](poolLength);
for (uint80 i = 0; i < whitelistedELPn.length; i++) {
_rewardList[i] = IRewardTracker(stakedELPnTracker[whitelistedELPn[i]]).claimable(account);
_stakedELPn[i] = whitelistedELPn[i];
}
return (_stakedELPn, _rewardList);
}
function claimableEDEForAccount(address _account) external view returns (uint256) {
uint256 _rewardList = 0;
address account =_account == address(0) ? msg.sender : _account;
for (uint80 i = 0; i < whitelistedELPn.length; i++) {
_rewardList = _rewardList.add(IRewardTracker(stakedELPnTracker[whitelistedELPn[i]]).claimable(account));
}
return _rewardList;
}
function claimableEDE() external view returns (uint256) {
uint256 _rewardList = 0;
address account = msg.sender;
for (uint80 i = 0; i < whitelistedELPn.length; i++) {
_rewardList = _rewardList.add(IRewardTracker(stakedELPnTracker[whitelistedELPn[i]]).claimable(account));
}
return _rewardList;
}
function withdrawToEDEPool() external {
for (uint80 i = 0; i < whitelistedELPn.length; i++) {
IELP(whitelistedELPn[i]).withdrawToEDEPool();
}
}
function claimableESBTEUSD(address _account) external view returns (uint256, uint256) {
if (esbt == address(0)) return (0, 0);
(uint256 accumReb, uint256 accumDis) = IESBT(esbt).userClaimable(_account);
accumDis = claimedESBTDiscount[_account] > accumDis? 0 : accumDis.sub(claimedESBTDiscount[_account]);
accumReb = claimedESBTRebate[_account] > accumReb ? 0 : accumReb.sub(claimedESBTRebate[_account]);
accumReb = accumReb.div(PRICE_TO_EUSD);
accumDis = accumDis.div(PRICE_TO_EUSD);
return (accumDis,accumReb);
}
function claimESBTEUSD( ) public nonReentrant returns (uint256) {
address _account = msg.sender;
if (esbt == address(0)) return (0);
(uint256 accumReb, uint256 accumDis) = IESBT(esbt).userClaimable(_account);
uint256 claimAmount = accumDis.add(accumReb);
uint256 claimedA = claimedESBTDiscount[_account].add(claimedESBTRebate[_account]);
if (claimAmount > claimedA){
claimAmount = claimAmount.sub(claimedA);
claimedESBTDiscount[_account] = accumDis;
claimedESBTRebate[_account] = accumReb;
claimAmount = claimAmount.div(PRICE_TO_EUSD);
if (claimAmount > 0)
IMintable(eusd).mint(_account, claimAmount);
}
else{
claimAmount = 0;
}
emit ClaimESBTEUSD(_account, claimAmount);
return claimAmount;
}
function _USDbyFee() internal view returns (uint256){
uint256 feeUSD = 0;
for (uint80 i = 0; i < whitelistedELPn.length; i++) {
feeUSD = feeUSD.add( IELP(whitelistedELPn[i]).USDbyFee() );
}
return feeUSD;
}
function _collateralAmount(address token) internal view returns (uint256) {
uint256 colAmount = 0;
for (uint80 i = 0; i < whitelistedELPn.length; i++) {
colAmount = colAmount.add(IELP(whitelistedELPn[i]).TokenFeeReserved(token) );
}
colAmount = colAmount.add(IERC20(token).balanceOf(address(this)));
return colAmount;
}
function EUSDCirculation() public view returns (uint256) {
uint256 _EUSDSupply = _USDbyFee().div(PRICE_TO_EUSD);
return _EUSDSupply.sub(IERC20(eusd).balanceOf(address(this)));
}
function feeAUM() public view returns (uint256) {
uint256 aum = 0;
address[] memory allWhitelistedToken = allToken.valuesAt(0, allToken.length());
for (uint80 i = 0; i < allWhitelistedToken.length; i++) {
uint256 price = IVaultPriceFeedV2(pricefeed).getOrigPrice(allWhitelistedToken[i]);
uint256 poolAmount = _collateralAmount(allWhitelistedToken[i]);
uint256 _decimalsTk = tokenDecimals[allWhitelistedToken[i]];
aum = aum.add(poolAmount.mul(price).div(10 ** _decimalsTk));
}
return aum;
}
function lvt() public view returns (uint256) {
uint256 _aumToEUSD = feeAUM().div(PRICE_TO_EUSD);
uint256 _EUSDSupply = EUSDCirculation();
return _aumToEUSD.mul(LVT_PRECISION).div(_EUSDSupply);
}
function _buyEUSDFee(uint256 _aumToEUSD, uint256 _EUSDSupply) internal view returns (uint256) {
uint256 fee_count = _aumToEUSD > _EUSDSupply ? base_fee_point : 0;
return fee_count;
}
function _sellEUSDFee(uint256 _aumToEUSD, uint256 _EUSDSupply) internal view returns (uint256) {
uint256 fee_count = _aumToEUSD > _EUSDSupply ? base_fee_point : base_fee_point.add(_EUSDSupply.sub(_aumToEUSD).mul(LVT_PRECISION).div(_EUSDSupply) );
return fee_count;
}
function buyEUSD( address _token, uint256 _amount) external nonReentrant returns (uint256) {
address _account = msg.sender;
require(allToken.contains(_token), "Invalid Token");
require(_amount > 0, "invalid amount");
IERC20(_token).transferFrom(_account, address(this), _amount);
uint256 buyAmount = _buyEUSD(_account, _token, _amount);
return buyAmount;
}
function buyEUSDNative( ) external nonReentrant payable returns (uint256) {
address _account = msg.sender;
uint256 _amount = msg.value;
address _token = weth;
require(allToken.contains(_token), "Invalid Token");
require(_amount > 0, "invalid amount");
IWETH(weth).deposit{value: msg.value}();
uint256 buyAmount = _buyEUSD(_account, _token, _amount);
return buyAmount;
}
function _buyEUSD(address _account, address _token, uint256 _amount) internal returns (uint256) {
uint256 _aumToEUSD = feeAUM().div(PRICE_TO_EUSD);
uint256 _EUSDSupply = EUSDCirculation();
uint256 fee_count = _buyEUSDFee(_aumToEUSD, _EUSDSupply);
uint256 price = IVaultPriceFeedV2(pricefeed).getOrigPrice(_token);
uint256 buyEusdAmount = _amount.mul(price).div(10 ** tokenDecimals[_token]).mul(10 ** tokenDecimals[eusd]).div(PRICE_PRECISION);
uint256 fee_cut = buyEusdAmount.mul(fee_count).div(LVT_PRECISION);
buyEusdAmount = buyEusdAmount.sub(fee_cut);
require(buyEusdAmount < IERC20(eusd).balanceOf(address(this)), "insufficient EUSD");
IERC20(eusd).safeTransfer(_account, buyEusdAmount);
emit BuyEUSD(_account, _token, buyEusdAmount, fee_count);
return buyEusdAmount;
}
function claimGeneratedFee(address _token) public returns (uint256) {
uint256 claimedTokenAmount = 0;
for (uint80 i = 0; i < whitelistedELPn.length; i++) {
claimedTokenAmount = claimedTokenAmount.add(IVault(stakedELPnVault[whitelistedELPn[i]]).claimFeeToken(_token) );
}
return claimedTokenAmount;
}
function swapCollateral() public {
for (uint256 i = 0; i < whitelistedELPn.length; i++) {
if (whitelistedELPn[i] == address(0)) continue;
if (ELPnStableTokens[whitelistedELPn[i]] == address(0)) continue;
address[] memory _wToken = ELPnContainsToken[whitelistedELPn[i]].valuesAt(0,ELPnContainsToken[whitelistedELPn[i]].length());
for (uint80 k = 0; k < _wToken.length; k++) {
if (!swapStatus[_wToken[k]]) continue;
if (IVault(stakedELPnVault[whitelistedELPn[i]]).tokenToUsdMin(_wToken[k], IERC20(_wToken[k]).balanceOf(address(this)))
< SWAP_THRESHOLD)
break;
IVault(stakedELPnVault[whitelistedELPn[i]]).swap(_wToken[k], ELPnStableTokens[whitelistedELPn[i]], address(this));
}
}
}
function sellEUSD(address _token, uint256 _EUSDamount) public nonReentrant returns (uint256) {
require(allToken.contains(_token), "Invalid Token");
require(_EUSDamount > 0, "invalid amount");
address _account = msg.sender;
uint256 sellTokenAmount = _sellEUSD(_account, _token, _EUSDamount);
IERC20(_token).transfer(_account, sellTokenAmount);
return sellTokenAmount;
}
function sellEUSDNative(uint256 _EUSDamount) public nonReentrant returns (uint256) {
address _token = weth;
require(allToken.contains(_token), "Invalid Token");
require(_EUSDamount > 0, "invalid amount");
address _account = msg.sender;
uint256 sellTokenAmount = _sellEUSD(_account, _token, _EUSDamount);
IWETH(weth).withdraw(sellTokenAmount);
payable(_account).sendValue(sellTokenAmount);
return sellTokenAmount;
}
function _sellEUSD(address _account, address _token, uint256 _EUSDamount) internal returns (uint256) {
uint256 _aumToEUSD = feeAUM().div(PRICE_TO_EUSD);
uint256 _EUSDSupply = EUSDCirculation();
uint256 fee_count = _sellEUSDFee(_aumToEUSD, _EUSDSupply);
uint256 price = IVaultPriceFeedV2(pricefeed).getOrigPrice(_token);
uint256 sellTokenAmount = _EUSDamount.mul(PRICE_PRECISION).div(10 ** tokenDecimals[eusd]).mul(10 ** tokenDecimals[_token]).div(price);
uint256 fee_cut = sellTokenAmount.mul(fee_count).div(LVT_PRECISION);
sellTokenAmount = sellTokenAmount.sub(fee_cut);
claimGeneratedFee(_token);
require(IERC20(_token).balanceOf(address(this)) > sellTokenAmount, "insufficient sell token");
IERC20(eusd).transferFrom(_account, address(this), _EUSDamount);
uint256 burnEUSDAmount = _EUSDamount.mul(fee_count).div(LVT_PRECISION);
if (burnEUSDAmount > 0){
IMintable(eusd).burn(address(this), burnEUSDAmount);
}
return sellTokenAmount;
}
function getELPnList() external view returns (address[] memory){
return allWhitelistedELPn.valuesAt(0, allWhitelistedELPn.length());
}
function getEUSDPoolInfo() external view returns (uint256[] memory) {
uint256[] memory _poolInfo = new uint256[](6);
_poolInfo[0] = feeAUM();
_poolInfo[1] = EUSDCirculation().add(IERC20(eusd).balanceOf(address(this)));
_poolInfo[2] = EUSDCirculation();
_poolInfo[3] = base_fee_point;
_poolInfo[4] = _buyEUSDFee(_poolInfo[0].div(PRICE_TO_EUSD), _poolInfo[2]);
_poolInfo[5] = _sellEUSDFee(_poolInfo[0].div(PRICE_TO_EUSD), _poolInfo[2]);
return _poolInfo;
}
function getEUSDCollateralDetail() external view returns (address[] memory, uint256[] memory, uint256[] memory) {
address[] memory allWhitelistedToken = allToken.valuesAt(0, allToken.length());
uint256 _length = allWhitelistedToken.length;
address[] memory _collateralToken = new address[](_length);
uint256[] memory _collageralAmount = new uint256[](_length);
uint256[] memory _collageralUSD = new uint256[](_length);
for (uint256 i = 0; i < allWhitelistedToken.length; i++) {
uint256 price = IVaultPriceFeedV2(pricefeed).getOrigPrice(allWhitelistedToken[i]);
_collateralToken[i] = allWhitelistedToken[i];
_collageralAmount[i] = _collateralAmount(allWhitelistedToken[i]);
uint256 _decimalsTk = tokenDecimals[allWhitelistedToken[i]];
_collageralUSD[i] = _collageralAmount[i].mul(price).div(10 ** _decimalsTk);
}
return (_collateralToken, _collageralAmount, _collageralUSD);
}
}
文件 17 的 20:SafeERC20.sol
pragma solidity ^0.8.0;
import "../IERC20.sol";
import "../extensions/draft-IERC20Permit.sol";
import "../../../utils/Address.sol";
library SafeERC20 {
using Address for address;
function safeTransfer(
IERC20 token,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(
IERC20 token,
address from,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
function safeApprove(
IERC20 token,
address spender,
uint256 value
) internal {
require(
(value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
uint256 newAllowance = token.allowance(address(this), spender) + value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
unchecked {
uint256 oldAllowance = token.allowance(address(this), spender);
require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
uint256 newAllowance = oldAllowance - value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
}
function safePermit(
IERC20Permit token,
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) internal {
uint256 nonceBefore = token.nonces(owner);
token.permit(owner, spender, value, deadline, v, r, s);
uint256 nonceAfter = token.nonces(owner);
require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
}
function _callOptionalReturn(IERC20 token, bytes memory data) private {
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) {
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}
文件 18 的 20:SafeMath.sol
pragma solidity ^0.8.0;
library SafeMath {
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
}
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b > a) return (false, 0);
return (true, a - b);
}
}
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
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) {
unchecked {
if (b == 0) return (false, 0);
return (true, a / b);
}
}
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a % b);
}
}
function add(uint256 a, uint256 b) internal pure returns (uint256) {
return a + b;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return a - b;
}
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
return a * b;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return a / b;
}
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return a % b;
}
function sub(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b <= a, errorMessage);
return a - b;
}
}
function div(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a / b;
}
}
function mod(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a % b;
}
}
}
文件 19 的 20:VaultMSData.sol
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
import "../utils/EnumerableValues.sol";
library VaultMSData {
uint256 constant COM_RATE_PRECISION = 10**4;
uint256 constant HOUR_RATE_PRECISION = 10**6;
uint256 constant PRC_RATE_PRECISION = 10**10;
uint256 constant PRICE_PRECISION = 10**30;
struct Position {
address account;
address collateralToken;
address indexToken;
uint256 size;
uint256 collateral;
uint256 averagePrice;
uint256 reserveAmount;
uint256 lastUpdateTime;
uint256 aveIncreaseTime;
uint256 entryFundingRateSec;
int256 entryPremiumRateSec;
int256 realisedPnl;
uint256 stopLossRatio;
uint256 takeProfitRatio;
bool isLong;
int256 accPremiumFee;
uint256 accFundingFee;
uint256 accPositionFee;
uint256 accCollateral;
}
struct TokenBase {
bool isFundable;
bool isStable;
uint256 decimal;
uint256 weight;
uint256 maxUSDAmounts;
uint256 balance;
uint256 poolAmount;
uint256 reservedAmount;
uint256 bufferAmount;
}
struct TradingFee {
uint256 fundingRatePerSec;
uint256 accumulativefundingRateSec;
int256 longRatePerSec;
int256 shortRatePerSec;
int256 accumulativeLongRateSec;
int256 accumulativeShortRateSec;
uint256 latestUpdateTime;
}
struct TradingTax {
uint256 taxMax;
uint256 taxDuration;
uint256 k;
}
struct TradingLimit {
uint256 maxShortSize;
uint256 maxLongSize;
uint256 maxTradingSize;
uint256 maxRatio;
uint256 countMinSize;
}
struct TradingRec {
uint256 shortSize;
uint256 shortCollateral;
uint256 shortAveragePrice;
uint256 longSize;
uint256 longCollateral;
uint256 longAveragePrice;
}
}
文件 20 的 20:draft-IERC20Permit.sol
pragma solidity ^0.8.0;
interface IERC20Permit {
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
function nonces(address owner) external view returns (uint256);
function DOMAIN_SEPARATOR() external view returns (bytes32);
}
{
"compilationTarget": {
"contracts/staking/RewardRouter.sol": "RewardRouter"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"BuyEUSD","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_account","type":"address"},{"indexed":false,"internalType":"uint256","name":"claimAmount","type":"uint256"}],"name":"ClaimESBTEUSD","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"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"SellEUSD","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"StakeElp","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UnstakeElp","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UserStakeElp","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UserUnstakeElp","type":"event"},{"inputs":[],"name":"EUSDCirculation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LVT_MINFEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LVT_PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE_PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE_TO_EUSD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SWAP_THRESHOLD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"val_1","type":"uint256"},{"internalType":"uint256","name":"val_2","type":"uint256"}],"name":"adjustProfit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"base_fee_point","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"buyEUSD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyEUSDNative","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"claimAll","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"claimAllForAccount","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimEDE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"claimEDEForAccount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_ELPlist","type":"address[]"}],"name":"claimEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimESBTEUSD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimEUSD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"claimEUSDForAccount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"claimGeneratedFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimableEDE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"claimableEDEForAccount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimableEDEList","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"claimableEDEListForAccount","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"claimableESBTEUSD","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimableEUSD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"claimableEUSDForAccount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimableEUSDList","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"claimableEUSDListForAccount","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimedESBTDiscount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimedESBTRebate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_elp_n","type":"address"}],"name":"clearELPn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cooldownDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_elp_n","type":"address"}],"name":"delToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"esbt","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eusd","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeAUM","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getELPnList","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getEUSDCollateralDetail","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getEUSDPoolInfo","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardToken","type":"address"},{"internalType":"address","name":"_eusd","type":"address"},{"internalType":"address","name":"_weth","type":"address"},{"internalType":"address","name":"_pricefeed","type":"address"},{"internalType":"uint256","name":"_base_fee_point","type":"uint256"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isInitialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isStable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"latestOperationTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lvt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pricefeed","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewardELPnWeights","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_EUSDamount","type":"uint256"}],"name":"sellEUSD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_EUSDamount","type":"uint256"}],"name":"sellEUSDNative","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_base_fee_point","type":"uint256"}],"name":"setBaseFeePoint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_setCooldownDuration","type":"uint256"}],"name":"setCooldownDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_elp_n","type":"address"},{"internalType":"uint256","name":"_elp_n_weight","type":"uint256"},{"internalType":"address","name":"_stakedELPnVault","type":"address"},{"internalType":"uint256","name":"_elp_n_decimal","type":"uint256"},{"internalType":"address","name":"_stakedElpTracker","type":"address"}],"name":"setELPn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_esbt","type":"address"}],"name":"setESBT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"setPriceFeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pricefeed","type":"address"}],"name":"setPriceFeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardToken","type":"address"}],"name":"setRewardToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"setSwapToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_token_decimal","type":"uint256"},{"internalType":"address","name":"_elp_n","type":"address"},{"internalType":"bool","name":"_isStable","type":"bool"}],"name":"setTokenConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_elp_n","type":"address"},{"internalType":"uint256","name":"_elpAmount","type":"uint256"}],"name":"stakeELPn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakedELPnAmount","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakedELPnTracker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakedELPnVault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapCollateral","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"swapStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"swapToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenDecimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalELPnWeights","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_elp_n","type":"address"},{"internalType":"uint256","name":"_tokenInAmount","type":"uint256"}],"name":"unstakeELPn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"whitelistedELPn","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawToEDEPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]