编译器
0.8.19+commit.7dd6d404
文件 1 的 16:AccessControlBase.sol
import "@openzeppelin/contracts/utils/Context.sol";
import "../interfaces/core/IVaultAccessControlRegistry.sol";
pragma solidity 0.8.19;
contract AccessControlBase is Context {
IVaultAccessControlRegistry public immutable registry;
address public immutable timelockAddressImmutable;
constructor(address _vaultRegistry, address _timelock) {
registry = IVaultAccessControlRegistry(_vaultRegistry);
timelockAddressImmutable = _timelock;
}
modifier onlyGovernance() {
require(registry.isCallerGovernance(_msgSender()), "Forbidden: Only Governance");
_;
}
modifier onlyEmergency() {
require(registry.isCallerEmergency(_msgSender()), "Forbidden: Only Emergency");
_;
}
modifier onlySupport() {
require(registry.isCallerSupport(_msgSender()), "Forbidden: Only Support");
_;
}
modifier onlyTeam() {
require(registry.isCallerTeam(_msgSender()), "Forbidden: Only Team");
_;
}
modifier onlyProtocol() {
require(registry.isCallerProtocol(_msgSender()), "Forbidden: Only Protocol");
_;
}
modifier protocolNotPaused() {
require(!registry.isProtocolPaused(), "Forbidden: Protocol Paused");
_;
}
modifier onlyTimelockGovernance() {
address timelockActive_;
if (!registry.timelockActivated()) {
timelockActive_ = registry.governanceAddress();
} else {
timelockActive_ = timelockAddressImmutable;
}
require(_msgSender() == timelockActive_, "Forbidden: Only TimelockGovernance");
_;
}
}
文件 2 的 16: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);
}
}
}
文件 3 的 16: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;
}
}
文件 4 的 16:IAccessControl.sol
pragma solidity ^0.8.0;
interface IAccessControl {
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);
function hasRole(bytes32 role, address account) external view returns (bool);
function getRoleAdmin(bytes32 role) external view returns (bytes32);
function grantRole(bytes32 role, address account) external;
function revokeRole(bytes32 role, address account) external;
function renounceRole(bytes32 role, address account) external;
}
文件 5 的 16: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);
}
文件 6 的 16:IFeeCollector.sol
pragma solidity >=0.6.0 <0.9.0;
interface IFeeCollector {
struct SwapDistributionRatio {
uint64 wlpHolders;
uint64 staking;
uint64 buybackAndBurn;
uint64 core;
}
struct WagerDistributionRatio {
uint64 staking;
uint64 buybackAndBurn;
uint64 core;
}
struct Reserve {
uint256 wlpHolders;
uint256 staking;
uint256 buybackAndBurn;
uint256 core;
}
struct DistributionAddresses {
address wlpClaim;
address winrStaking;
address buybackAndBurn;
address core;
address referral;
}
struct DistributionTimes {
uint256 wlpClaim;
uint256 winrStaking;
uint256 buybackAndBurn;
uint256 core;
uint256 referral;
}
function getReserves() external returns (Reserve memory);
function getSwapDistribution() external returns (SwapDistributionRatio memory);
function getWagerDistribution() external returns (WagerDistributionRatio memory);
function getAddresses() external returns (DistributionAddresses memory);
function calculateDistribution(
uint256 _amountToDistribute,
uint64 _ratio
) external pure returns (uint256 amount_);
function withdrawFeesAll() external;
function isWhitelistedDestination(address _address) external returns (bool);
function syncWhitelistedTokens() external;
function addToWhitelist(address _toWhitelistAddress, bool _setting) external;
function setReferralDistributor(address _distributorAddress) external;
function setCoreDevelopment(address _coreDevelopment) external;
function setWinrStakingContract(address _winrStakingContract) external;
function setBuyBackAndBurnContract(address _buybackAndBurnContract) external;
function setWlpClaimContract(address _wlpClaimContract) external;
function setWagerDistribution(
uint64 _stakingRatio,
uint64 _burnRatio,
uint64 _coreRatio
) external;
function setSwapDistribution(
uint64 _wlpHoldersRatio,
uint64 _stakingRatio,
uint64 _buybackRatio,
uint64 _coreRatio
) external;
function addTokenToWhitelistList(address _tokenToAdd) external;
function deleteWhitelistTokenList() external;
function collectFeesBeforeLPEvent() external;
event DistributionSync();
event WithdrawSync();
event WhitelistEdit(address whitelistAddress, bool setting);
event EmergencyWithdraw(address caller, address token, uint256 amount, address destination);
event ManualGovernanceDistro();
event FeesDistributed();
event WagerFeesManuallyFarmed(address tokenAddress, uint256 amountFarmed);
event ManualDistributionManager(
address targetToken,
uint256 amountToken,
address destinationAddress
);
event SetRewardInterval(uint256 timeInterval);
event SetCoreDestination(address newDestination);
event SetBuybackAndBurnDestination(address newDestination);
event SetClaimDestination(address newDestination);
event SetReferralDestination(address referralDestination);
event SetStakingDestination(address newDestination);
event SwapFeesManuallyFarmed(address tokenAddress, uint256 totalAmountCollected);
event CollectedWagerFees(address tokenAddress, uint256 amountCollected);
event CollectedSwapFees(address tokenAddress, uint256 amountCollected);
event NothingToDistribute(address token);
event DistributionComplete(
address token,
uint256 toWLP,
uint256 toStakers,
uint256 toBuyBack,
uint256 toCore,
uint256 toReferral
);
event WagerDistributionSet(uint64 stakingRatio, uint64 burnRatio, uint64 coreRatio);
event SwapDistributionSet(
uint64 _wlpHoldersRatio,
uint64 _stakingRatio,
uint64 _buybackRatio,
uint64 _coreRatio
);
event SyncTokens();
event DeleteAllWhitelistedTokens();
event TokenAddedToWhitelist(address addedTokenAddress);
event TokenTransferredByTimelock(address token, address recipient, uint256 amount);
event ManualFeeWithdraw(
address token,
uint256 swapFeesCollected,
uint256 wagerFeesCollected,
uint256 referralFeesCollected
);
event TransferBuybackAndBurnTokens(address receiver, uint256 amount);
event TransferCoreTokens(address receiver, uint256 amount);
event TransferWLPRewardTokens(address receiver, uint256 amount);
event TransferWinrStakingTokens(address receiver, uint256 amount);
event TransferReferralTokens(address token, address receiver, uint256 amount);
event VaultUpdated(address vault);
event WLPManagerUpdated(address wlpManager);
}
文件 7 的 16:IMintable.sol
pragma solidity >=0.6.0 <0.9.0;
interface IMintable {
event MinterSet(address minterAddress, bool isActive);
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;
}
文件 8 的 16:IUSDW.sol
pragma solidity >=0.6.0 <0.9.0;
interface IUSDW {
event VaultAdded(address vaultAddress);
event VaultRemoved(address vaultAddress);
function addVault(address _vault) external;
function removeVault(address _vault) external;
function mint(address _account, uint256 _amount) external;
function burn(address _account, uint256 _amount) external;
}
文件 9 的 16:IVault.sol
pragma solidity >=0.6.0 <0.9.0;
import "./IVaultUtils.sol";
interface IVault {
event BuyUSDW(
address account,
address token,
uint256 tokenAmount,
uint256 usdwAmount,
uint256 feeBasisPoints
);
event SellUSDW(
address account,
address token,
uint256 usdwAmount,
uint256 tokenAmount,
uint256 feeBasisPoints
);
event Swap(
address account,
address tokenIn,
address tokenOut,
uint256 amountIn,
uint256 indexed amountOut,
uint256 indexed amountOutAfterFees,
uint256 indexed feeBasisPoints
);
event DirectPoolDeposit(address token, uint256 amount);
error TokenBufferViolation(address tokenAddress);
error PriceZero();
event PayinWLP(
address tokenInAddress,
uint256 amountPayin
);
event PlayerPayout(
address recipient,
address tokenOut,
uint256 amountPayoutTotal
);
event AmountOutNull();
event WithdrawAllFees(
address tokenCollected,
uint256 swapFeesCollected,
uint256 wagerFeesCollected,
uint256 referralFeesCollected
);
event RebalancingWithdraw(address tokenWithdrawn, uint256 amountWithdrawn);
event RebalancingDeposit(address tokenDeposit, uint256 amountDeposit);
event WagerFeeChanged(uint256 newWagerFee);
event ReferralDistributionReverted(uint256 registeredTooMuch, uint256 maxVaueAllowed);
function setPayoutHalted(bool _setting) external;
function isSwapEnabled() external view returns (bool);
function setVaultUtils(IVaultUtils _vaultUtils) external;
function setError(uint256 _errorCode, string calldata _error) external;
function usdw() external view returns (address);
function feeCollector() external returns (address);
function hasDynamicFees() external view returns (bool);
function totalTokenWeights() external view returns (uint256);
function getTargetUsdwAmount(address _token) external view returns (uint256);
function inManagerMode() external view returns (bool);
function isManager(address _account) external view returns (bool);
function tokenBalances(address _token) external view returns (uint256);
function setInManagerMode(bool _inManagerMode) external;
function setManager(address _manager, bool _isManager, bool _isWLPManager) external;
function setIsSwapEnabled(bool _isSwapEnabled) external;
function setUsdwAmount(address _token, uint256 _amount) external;
function setBufferAmount(address _token, uint256 _amount) external;
function setFees(
uint256 _taxBasisPoints,
uint256 _stableTaxBasisPoints,
uint256 _mintBurnFeeBasisPoints,
uint256 _swapFeeBasisPoints,
uint256 _stableSwapFeeBasisPoints,
uint256 _minimumBurnMintFee,
bool _hasDynamicFees
) external;
function setTokenConfig(
address _token,
uint256 _tokenDecimals,
uint256 _redemptionBps,
uint256 _maxUsdwAmount,
bool _isStable
) external;
function setPriceFeedRouter(address _priceFeed) external;
function withdrawAllFees(address _token) external returns (uint256, uint256, uint256);
function directPoolDeposit(address _token) external;
function deposit(address _tokenIn, address _receiver, bool _swapLess) external returns (uint256);
function withdraw(address _tokenOut, address _receiverTokenOut) external returns (uint256);
function swap(
address _tokenIn,
address _tokenOut,
address _receiver
) external returns (uint256);
function tokenToUsdMin(
address _tokenToPrice,
uint256 _tokenAmount
) external view returns (uint256);
function priceOracleRouter() external view returns (address);
function taxBasisPoints() external view returns (uint256);
function stableTaxBasisPoints() external view returns (uint256);
function mintBurnFeeBasisPoints() external view returns (uint256);
function swapFeeBasisPoints() external view returns (uint256);
function stableSwapFeeBasisPoints() external view returns (uint256);
function minimumBurnMintFee() external view returns (uint256);
function allWhitelistedTokensLength() external view returns (uint256);
function allWhitelistedTokens(uint256) external view returns (address);
function stableTokens(address _token) external view returns (bool);
function swapFeeReserves(address _token) external view returns (uint256);
function tokenDecimals(address _token) external view returns (uint256);
function tokenWeights(address _token) external view returns (uint256);
function poolAmounts(address _token) external view returns (uint256);
function bufferAmounts(address _token) external view returns (uint256);
function usdwAmounts(address _token) external view returns (uint256);
function maxUsdwAmounts(address _token) external view returns (uint256);
function getRedemptionAmount(
address _token,
uint256 _usdwAmount
) external view returns (uint256);
function getMaxPrice(address _token) external view returns (uint256);
function getMinPrice(address _token) external view returns (uint256);
function setVaultManagerAddress(address _vaultManagerAddress, bool _setting) external;
function wagerFeeBasisPoints() external view returns (uint256);
function setWagerFee(uint256 _wagerFee) external;
function wagerFeeReserves(address _token) external view returns (uint256);
function referralReserves(address _token) external view returns (uint256);
function getReserve() external view returns (uint256);
function getWlpValue() external view returns (uint256);
function usdToTokenMin(address _token, uint256 _usdAmount) external view returns (uint256);
function usdToTokenMax(address _token, uint256 _usdAmount) external view returns (uint256);
function usdToToken(
address _token,
uint256 _usdAmount,
uint256 _price
) external view returns (uint256);
function returnTotalOutAndIn(
address token_
) external view returns (uint256 totalOutAllTime_, uint256 totalInAllTime_);
function payout(
address _wagerToken,
address _escrowAddress,
uint256 _escrowAmount,
address _recipient,
uint256 _totalAmount
) external;
function payoutNoEscrow(
address _wagerAsset,
address _recipient,
uint256 _totalAmount
) external;
function payin(
address _inputToken,
address _escrowAddress,
uint256 _escrowAmount) external;
function setAsideReferral(address _token, uint256 _amount) external;
function payinWagerFee(
address _tokenIn
) external;
function payinSwapFee(
address _tokenIn
) external;
function payinPoolProfits(
address _tokenIn
) external;
function removeAsideReferral(address _token, uint256 _amountRemoveAside) external;
function setFeeCollector(address _feeCollector) external;
function upgradeVault(
address _newVault,
address _token,
uint256 _amount,
bool _upgrade
) external;
function setCircuitBreakerAmount(address _token, uint256 _amount) external;
function clearTokenConfig(address _token) external;
function updateTokenBalance(address _token) external;
function setCircuitBreakerEnabled(bool _setting) external;
function setPoolBalance(address _token, uint256 _amount) external;
}
文件 10 的 16:IVaultAccessControlRegistry.sol
import "@openzeppelin/contracts/access/IAccessControl.sol";
pragma solidity >=0.6.0 <0.9.0;
interface IVaultAccessControlRegistry is IAccessControl {
function timelockActivated() external view returns (bool);
function governanceAddress() external view returns (address);
function pauseProtocol() external;
function unpauseProtocol() external;
function isCallerGovernance(address _account) external view returns (bool);
function isCallerEmergency(address _account) external view returns (bool);
function isCallerProtocol(address _account) external view returns (bool);
function isCallerTeam(address _account) external view returns (bool);
function isCallerSupport(address _account) external view returns (bool);
function isProtocolPaused() external view returns (bool);
function changeGovernanceAddress(address _governanceAddress) external;
event DeadmanSwitchFlipped();
event GovernanceChange(address newGovernanceAddress);
}
文件 11 的 16:IVaultUtils.sol
pragma solidity >=0.6.0 <0.9.0;
interface IVaultUtils {
function getBuyUsdwFeeBasisPoints(
address _token,
uint256 _usdwAmount
) external view returns (uint256);
function getSellUsdwFeeBasisPoints(
address _token,
uint256 _usdwAmount
) external view returns (uint256);
function getSwapFeeBasisPoints(
address _tokenIn,
address _tokenOut,
uint256 _usdwAmount
) external view returns (uint256);
function getFeeBasisPoints(
address _token,
uint256 _usdwDelta,
uint256 _feeBasisPoints,
uint256 _taxBasisPoints,
bool _increment
) external view returns (uint256);
}
文件 12 的 16:IWLPManager.sol
pragma solidity >=0.6.0 <0.9.0;
import "./IVault.sol";
interface IWLPManager {
function wlp() external view returns (address);
function usdw() external view returns (address);
function vault() external view returns (IVault);
function cooldownDuration() external returns (uint256);
function getAumInUsdw(bool maximise) external view returns (uint256);
function lastAddedAt(address _account) external returns (uint256);
function addLiquidity(
address _token,
uint256 _amount,
uint256 _minUsdw,
uint256 _minWlp
) external returns (uint256);
function addLiquidityForAccount(
address _fundingAccount,
address _account,
address _token,
uint256 _amount,
uint256 _minUsdw,
uint256 _minWlp
) external returns (uint256);
function removeLiquidity(
address _tokenOut,
uint256 _wlpAmount,
uint256 _minOut,
address _receiver
) external returns (uint256);
function removeLiquidityForAccount(
address _account,
address _tokenOut,
uint256 _wlpAmount,
uint256 _minOut,
address _receiver
) external returns (uint256);
function setCooldownDuration(uint256 _cooldownDuration) external;
function getAum(bool _maximise) external view returns (uint256);
function getPriceWlp(bool _maximise) external view returns (uint256);
function getPriceWLPInUsdw(bool _maximise) external view returns (uint256);
function circuitBreakerTrigger(address _token) external;
function aumDeduction() external view returns (uint256);
function reserveDeduction() external view returns (uint256);
function maxPercentageOfWagerFee() external view returns (uint256);
function addLiquidityFeeCollector(
address _token,
uint256 _amount,
uint256 _minUsdw,
uint256 _minWlp
) external returns (uint256 wlpAmount_);
event AddLiquidity(
address account,
address token,
uint256 amount,
uint256 aumInUsdw,
uint256 wlpSupply,
uint256 usdwAmount,
uint256 mintAmount
);
event RemoveLiquidity(
address account,
address token,
uint256 wlpAmount,
uint256 aumInUsdw,
uint256 wlpSupply,
uint256 usdwAmount,
uint256 amountOut
);
event PrivateModeSet(bool inPrivateMode);
event HandlerEnabling(bool setting);
event HandlerSet(address handlerAddress, bool isActive);
event CoolDownDurationSet(uint256 cooldownDuration);
event AumAdjustmentSet(uint256 aumAddition, uint256 aumDeduction);
event MaxPercentageOfWagerFeeSet(uint256 maxPercentageOfWagerFee);
event CircuitBreakerTriggered(
address forToken,
bool pausePayoutsOnCB,
bool pauseSwapOnCB,
uint256 reserveDeductionOnCB
);
event CircuitBreakerPolicy(
bool pausePayoutsOnCB,
bool pauseSwapOnCB,
uint256 reserveDeductionOnCB
);
event CircuitBreakerReset(
bool pausePayoutsOnCB,
bool pauseSwapOnCB,
uint256 reserveDeductionOnCB
);
}
文件 13 的 16:ReentrancyGuard.sol
pragma solidity >=0.8.0;
abstract contract ReentrancyGuard {
uint256 private locked = 1;
modifier nonReentrant() virtual {
require(locked == 1, "REENTRANCY");
locked = 2;
_;
locked = 1;
}
}
文件 14 的 16: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");
}
}
}
文件 15 的 16:WLPManager.sol
pragma solidity 0.8.19;
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "solmate/src/utils/ReentrancyGuard.sol";
import "../interfaces/core/IVault.sol";
import "../interfaces/core/IFeeCollector.sol";
import "../interfaces/core/IWLPManager.sol";
import "../interfaces/tokens/wlp/IUSDW.sol";
import "../interfaces/tokens/wlp/IMintable.sol";
import "./AccessControlBase.sol";
contract WLPManager is ReentrancyGuard, AccessControlBase, IWLPManager {
uint128 private constant PRICE_PRECISION = 1e30;
uint32 private constant USDW_DECIMALS = 18;
uint64 private constant WLP_PRECISION = 1e18;
uint64 private constant MAX_COOLDOWN_DURATION = 48 hours;
IVault public immutable override vault;
address public immutable override usdw;
address public immutable override wlp;
address public feeCollector;
uint256 public override cooldownDuration;
uint256 public aumAddition;
uint256 public aumDeduction;
uint256 public reserveDeduction;
uint256 public override maxPercentageOfWagerFee = 2000;
uint256 public reserveDeductionOnCB = 5000;
bool public handlersEnabled = false;
bool public collectFeesOnLiquidityEvent = false;
bool public inPrivateMode = false;
bool public pausePayoutsOnCB = false;
bool public pauseSwapOnCB = false;
bool private circuitBreakerActive = false;
mapping(address => uint256) public override lastAddedAt;
mapping(address => bool) public isHandler;
constructor(
address _vault,
address _usdw,
address _wlp,
uint256 _cooldownDuration,
address _vaultRegistry,
address _timelock
) AccessControlBase(_vaultRegistry, _timelock) {
vault = IVault(_vault);
usdw = _usdw;
wlp = _wlp;
cooldownDuration = _cooldownDuration;
}
function setInPrivateMode(bool _inPrivateMode) external onlyTeam {
inPrivateMode = _inPrivateMode;
emit PrivateModeSet(_inPrivateMode);
}
function setHandlerEnabled(bool _setting) external onlyTimelockGovernance {
handlersEnabled = _setting;
emit HandlerEnabling(_setting);
}
function setHandler(address _handler, bool _isActive) external onlyTimelockGovernance {
isHandler[_handler] = _isActive;
emit HandlerSet(_handler, _isActive);
}
function setMaxPercentageOfWagerFee(
uint256 _maxPercentageOfWagerFee
) external onlyTeam {
maxPercentageOfWagerFee = _maxPercentageOfWagerFee;
emit MaxPercentageOfWagerFeeSet(_maxPercentageOfWagerFee);
}
function setCooldownDuration(uint256 _cooldownDuration) external override onlyTeam {
require(
_cooldownDuration <= MAX_COOLDOWN_DURATION,
"WLPManager: invalid _cooldownDuration"
);
cooldownDuration = _cooldownDuration;
emit CoolDownDurationSet(_cooldownDuration);
}
function setAumAdjustment(
uint256 _aumAddition,
uint256 _aumDeduction
) external onlyTeam {
aumAddition = _aumAddition;
aumDeduction = _aumDeduction;
emit AumAdjustmentSet(_aumAddition, _aumDeduction);
}
function addLiquidity(
address _token,
uint256 _amount,
uint256 _minUsdw,
uint256 _minWlp
) external override nonReentrant returns (uint256 wlpAmount_) {
if (inPrivateMode) {
revert("WLPManager: action not enabled");
}
wlpAmount_ = _addLiquidity(
_msgSender(),
_msgSender(),
_token,
_amount,
_minUsdw,
_minWlp,
false
);
}
function addLiquidityForAccount(
address _fundingAccount,
address _account,
address _token,
uint256 _amount,
uint256 _minUsdw,
uint256 _minWlp
) external override nonReentrant returns (uint256 wlpAmount_) {
_validateHandler();
wlpAmount_ = _addLiquidity(
_fundingAccount,
_account,
_token,
_amount,
_minUsdw,
_minWlp,
false
);
}
function removeLiquidity(
address _tokenOut,
uint256 _wlpAmount,
uint256 _minOut,
address _receiver
) external override nonReentrant returns (uint256 tokenOutAmount_) {
if (inPrivateMode) {
revert("WLPManager: action not enabled");
}
tokenOutAmount_ = _removeLiquidity(
_msgSender(),
_tokenOut,
_wlpAmount,
_minOut,
_receiver
);
}
function removeLiquidityForAccount(
address _account,
address _tokenOut,
uint256 _wlpAmount,
uint256 _minOut,
address _receiver
) external override nonReentrant returns (uint256 tokenOutAmount_) {
_validateHandler();
tokenOutAmount_ = _removeLiquidity(
_account,
_tokenOut,
_wlpAmount,
_minOut,
_receiver
);
}
function setCiruitBreakerPolicy(
bool _pausePayoutsOnCB,
bool _pauseSwapOnCB,
uint256 _reserveDeductionOnCB
) external onlyTeam {
pausePayoutsOnCB = _pausePayoutsOnCB;
pauseSwapOnCB = _pauseSwapOnCB;
reserveDeductionOnCB = _reserveDeductionOnCB;
emit CircuitBreakerPolicy(pausePayoutsOnCB, pauseSwapOnCB, reserveDeductionOnCB);
}
function circuitBreakerTrigger(address _token) external {
if (circuitBreakerActive) {
return;
}
require(
_msgSender() == address(vault),
"WLPManager: only vault can trigger circuit break"
);
circuitBreakerActive = true;
vault.setPayoutHalted(pausePayoutsOnCB);
vault.setIsSwapEnabled(pauseSwapOnCB);
if (reserveDeductionOnCB != 0) {
uint256 aum_ = getAum(true);
reserveDeduction = (aum_ * reserveDeductionOnCB) / 10000;
}
emit CircuitBreakerTriggered(
_token,
pausePayoutsOnCB,
pauseSwapOnCB,
reserveDeductionOnCB
);
}
function resetCircuitBreaker() external onlyTeam {
circuitBreakerActive = false;
vault.setPayoutHalted(false);
vault.setIsSwapEnabled(true);
reserveDeduction = 0;
emit CircuitBreakerReset(pausePayoutsOnCB, pauseSwapOnCB, reserveDeductionOnCB);
}
function getPriceWlp(bool _maximise) external view returns (uint256 tokenPrice_) {
uint256 supply_ = IERC20(wlp).totalSupply();
if (supply_ == 0) {
return 0;
}
tokenPrice_ = ((getAum(_maximise) * WLP_PRECISION) / supply_);
}
function getPriceWLPInUsdw(bool _maximise) external view returns (uint256 tokenPrice_) {
uint256 supply_ = IERC20(wlp).totalSupply();
if (supply_ == 0) {
return 0;
}
tokenPrice_ = ((getAumInUsdw(_maximise) * WLP_PRECISION) / supply_);
}
function getAumInUsdw(bool _maximise) public view override returns (uint256 aumUSDW_) {
aumUSDW_ = (getAum(_maximise) * (10 ** USDW_DECIMALS)) / PRICE_PRECISION;
}
function getAums() external view returns (uint256[] memory aumAmountsUSD_) {
aumAmountsUSD_ = new uint256[](2);
aumAmountsUSD_[0] = getAum(true );
aumAmountsUSD_[1] = getAum(false );
}
function getAum(bool _maximise) public view returns (uint256 aumUSD_) {
IVault _vault = vault;
uint256 length_ = _vault.allWhitelistedTokensLength();
uint256 aum_ = aumAddition;
for (uint256 i = 0; i < length_; ++i) {
address token_ = _vault.allWhitelistedTokens(i);
uint256 price_ = _maximise
? _vault.getMaxPrice(token_)
: _vault.getMinPrice(token_);
aum_ += ((_vault.poolAmounts(token_) * price_) /
(10 ** _vault.tokenDecimals(token_)));
}
uint256 aumD_ = aumDeduction;
aumUSD_ = aumD_ > aum_ ? 0 : (aum_ - aumD_);
}
function addLiquidityFeeCollector(
address _token,
uint256 _amount,
uint256 _minUsdw,
uint256 _minWlp
) external returns (uint256 wlpAmount_) {
require(
_msgSender() == feeCollector,
"WLP: only fee collector can call this function"
);
wlpAmount_ = _addLiquidity(
_msgSender(),
_msgSender(),
_token,
_amount,
_minUsdw,
_minWlp,
true
);
}
function setFeeCollector(address _feeCollector) external onlyTimelockGovernance {
feeCollector = _feeCollector;
}
function setCollectFeesOnLiquidityEvent(
bool _collectFeesOnLiquidityEvent
) external onlyTeam {
collectFeesOnLiquidityEvent = _collectFeesOnLiquidityEvent;
}
function _collectFees() internal {
IFeeCollector(feeCollector).collectFeesBeforeLPEvent();
}
function _addLiquidity(
address _fundingAccount,
address _account,
address _tokenDeposit,
uint256 _amountDeposit,
uint256 _minUsdw,
uint256 _minWlp,
bool _swapLess
) private returns (uint256 mintAmountWLP_) {
require(_amountDeposit != 0, "WLPManager: invalid _amount");
if (collectFeesOnLiquidityEvent) {
collectFeesOnLiquidityEvent = false;
_collectFees();
collectFeesOnLiquidityEvent = true;
}
address wlp_ = wlp;
uint256 aumInUsdw_ = getAumInUsdw(true );
uint256 wlpSupply_ = IERC20(wlp_).totalSupply();
bool firstMint_;
if (wlpSupply_ == 0) {
firstMint_ = true;
require((_minWlp >= 1e18), "WLPManager: too low WLP amount for first mint");
}
SafeERC20.safeTransferFrom(
IERC20(_tokenDeposit),
_fundingAccount,
address(vault),
_amountDeposit
);
uint256 usdwAmount_ = vault.deposit(
_tokenDeposit,
address(this),
_swapLess
);
require(usdwAmount_ >= _minUsdw, "WLPManager: insufficient USDW output");
mintAmountWLP_ = aumInUsdw_ == 0
? usdwAmount_
: ((usdwAmount_ * wlpSupply_) / aumInUsdw_);
require(mintAmountWLP_ >= _minWlp, "WLPManager: insufficient WLP output");
if (firstMint_) {
mintAmountWLP_ -= 1e18;
IMintable(wlp_).mint(timelockAddressImmutable, 1e18);
}
IMintable(wlp_).mint(_account, mintAmountWLP_);
lastAddedAt[_account] = block.timestamp;
emit AddLiquidity(
_account,
_tokenDeposit,
_amountDeposit,
aumInUsdw_,
wlpSupply_,
usdwAmount_,
mintAmountWLP_
);
return mintAmountWLP_;
}
function _removeLiquidity(
address _account,
address _tokenOut,
uint256 _wlpAmount,
uint256 _minOut,
address _receiver
) private returns (uint256 amountOutToken_) {
require(_wlpAmount != 0, "WLPManager: invalid _wlpAmount");
require(
(lastAddedAt[_account] + cooldownDuration) <= block.timestamp,
"WLPManager: cooldown duration not yet passed"
);
uint256 aumInUsdw_ = getAumInUsdw(false);
address wlp_ = wlp;
uint256 wlpSupply_ = IERC20(wlp_).totalSupply();
uint256 usdwAmountToBurn_ = (_wlpAmount * aumInUsdw_) / wlpSupply_;
address usdw_ = usdw;
uint256 usdwBalance_ = IERC20(usdw_).balanceOf(address(this));
if (usdwAmountToBurn_ > usdwBalance_) {
IUSDW(usdw_).mint(address(this), usdwAmountToBurn_ - usdwBalance_);
}
IMintable(wlp_).burn(_account, _wlpAmount);
IERC20(usdw_).transfer(address(vault), usdwAmountToBurn_);
amountOutToken_ = vault.withdraw(_tokenOut, _receiver);
require(amountOutToken_ >= _minOut, "WLPManager: insufficient output");
emit RemoveLiquidity(
_account,
_tokenOut,
_wlpAmount,
aumInUsdw_,
wlpSupply_,
usdwAmountToBurn_,
amountOutToken_
);
return amountOutToken_;
}
function _validateHandler() private view {
require(handlersEnabled, "WLPManager: handlers not enabled");
require(isHandler[_msgSender()], "WLPManager: forbidden");
}
}
文件 16 的 16: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/core/WLPManager.sol": "WLPManager"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": [
":@ensdomains/=node_modules/@ensdomains/",
":@openzeppelin/=node_modules/@openzeppelin/",
":@uniswap/=node_modules/@uniswap/",
":base64-sol/=node_modules/base64-sol/",
":ds-test/=lib/forge-std/lib/ds-test/src/",
":eth-gas-reporter/=node_modules/eth-gas-reporter/",
":forge-std/=lib/forge-std/src/",
":hardhat/=node_modules/hardhat/",
":solmate/=node_modules/solmate/"
]
}
[{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"address","name":"_usdw","type":"address"},{"internalType":"address","name":"_wlp","type":"address"},{"internalType":"uint256","name":"_cooldownDuration","type":"uint256"},{"internalType":"address","name":"_vaultRegistry","type":"address"},{"internalType":"address","name":"_timelock","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"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":"aumInUsdw","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"wlpSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"usdwAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mintAmount","type":"uint256"}],"name":"AddLiquidity","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"aumAddition","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"aumDeduction","type":"uint256"}],"name":"AumAdjustmentSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"pausePayoutsOnCB","type":"bool"},{"indexed":false,"internalType":"bool","name":"pauseSwapOnCB","type":"bool"},{"indexed":false,"internalType":"uint256","name":"reserveDeductionOnCB","type":"uint256"}],"name":"CircuitBreakerPolicy","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"pausePayoutsOnCB","type":"bool"},{"indexed":false,"internalType":"bool","name":"pauseSwapOnCB","type":"bool"},{"indexed":false,"internalType":"uint256","name":"reserveDeductionOnCB","type":"uint256"}],"name":"CircuitBreakerReset","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"forToken","type":"address"},{"indexed":false,"internalType":"bool","name":"pausePayoutsOnCB","type":"bool"},{"indexed":false,"internalType":"bool","name":"pauseSwapOnCB","type":"bool"},{"indexed":false,"internalType":"uint256","name":"reserveDeductionOnCB","type":"uint256"}],"name":"CircuitBreakerTriggered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"cooldownDuration","type":"uint256"}],"name":"CoolDownDurationSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"setting","type":"bool"}],"name":"HandlerEnabling","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"handlerAddress","type":"address"},{"indexed":false,"internalType":"bool","name":"isActive","type":"bool"}],"name":"HandlerSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"maxPercentageOfWagerFee","type":"uint256"}],"name":"MaxPercentageOfWagerFeeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"inPrivateMode","type":"bool"}],"name":"PrivateModeSet","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":"wlpAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"aumInUsdw","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"wlpSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"usdwAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"}],"name":"RemoveLiquidity","type":"event"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_minUsdw","type":"uint256"},{"internalType":"uint256","name":"_minWlp","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"wlpAmount_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_minUsdw","type":"uint256"},{"internalType":"uint256","name":"_minWlp","type":"uint256"}],"name":"addLiquidityFeeCollector","outputs":[{"internalType":"uint256","name":"wlpAmount_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_fundingAccount","type":"address"},{"internalType":"address","name":"_account","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_minUsdw","type":"uint256"},{"internalType":"uint256","name":"_minWlp","type":"uint256"}],"name":"addLiquidityForAccount","outputs":[{"internalType":"uint256","name":"wlpAmount_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"aumAddition","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"aumDeduction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"circuitBreakerTrigger","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"collectFeesOnLiquidityEvent","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cooldownDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeCollector","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_maximise","type":"bool"}],"name":"getAum","outputs":[{"internalType":"uint256","name":"aumUSD_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_maximise","type":"bool"}],"name":"getAumInUsdw","outputs":[{"internalType":"uint256","name":"aumUSDW_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAums","outputs":[{"internalType":"uint256[]","name":"aumAmountsUSD_","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_maximise","type":"bool"}],"name":"getPriceWLPInUsdw","outputs":[{"internalType":"uint256","name":"tokenPrice_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_maximise","type":"bool"}],"name":"getPriceWlp","outputs":[{"internalType":"uint256","name":"tokenPrice_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"handlersEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"inPrivateMode","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isHandler","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastAddedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPercentageOfWagerFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pausePayoutsOnCB","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseSwapOnCB","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"registry","outputs":[{"internalType":"contract IVaultAccessControlRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenOut","type":"address"},{"internalType":"uint256","name":"_wlpAmount","type":"uint256"},{"internalType":"uint256","name":"_minOut","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"tokenOutAmount_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"address","name":"_tokenOut","type":"address"},{"internalType":"uint256","name":"_wlpAmount","type":"uint256"},{"internalType":"uint256","name":"_minOut","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"removeLiquidityForAccount","outputs":[{"internalType":"uint256","name":"tokenOutAmount_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveDeduction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reserveDeductionOnCB","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"resetCircuitBreaker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_aumAddition","type":"uint256"},{"internalType":"uint256","name":"_aumDeduction","type":"uint256"}],"name":"setAumAdjustment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_pausePayoutsOnCB","type":"bool"},{"internalType":"bool","name":"_pauseSwapOnCB","type":"bool"},{"internalType":"uint256","name":"_reserveDeductionOnCB","type":"uint256"}],"name":"setCiruitBreakerPolicy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_collectFeesOnLiquidityEvent","type":"bool"}],"name":"setCollectFeesOnLiquidityEvent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cooldownDuration","type":"uint256"}],"name":"setCooldownDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeCollector","type":"address"}],"name":"setFeeCollector","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_handler","type":"address"},{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"setHandler","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_setting","type":"bool"}],"name":"setHandlerEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_inPrivateMode","type":"bool"}],"name":"setInPrivateMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPercentageOfWagerFee","type":"uint256"}],"name":"setMaxPercentageOfWagerFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"timelockAddressImmutable","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"usdw","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"contract IVault","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wlp","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]