编译器
0.8.19+commit.7dd6d404
文件 1 的 17: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 的 17:BasicFDT.sol
pragma solidity 0.8.19;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "./interfaces/IBaseFDT.sol";
import "./math/SafeMath.sol";
import "./math/SignedSafeMath.sol";
import "./math/SafeMathUint.sol";
import "./math/SafeMathInt.sol";
abstract contract BasicFDT is IBaseFDT, ERC20 {
using SafeMath for uint256;
using SafeMathUint for uint256;
using SignedSafeMath for int256;
using SafeMathInt for int256;
uint256 internal constant pointsMultiplier = 2 ** 128;
uint256 internal pointsPerShare_WLP;
mapping(address => int256) internal pointsCorrection_WLP;
mapping(address => uint256) internal withdrawnFunds_WLP;
uint256 internal pointsPerShare_VWINR;
mapping(address => int256) internal pointsCorrection_VWINR;
mapping(address => uint256) internal withdrawnFunds_VWINR;
event PointsPerShareUpdated_WLP(uint256 pointsPerShare_WLP);
event PointsCorrectionUpdated_WLP(address indexed account, int256 pointsCorrection_WLP);
event PointsPerShareUpdated_VWINR(uint256 pointsPerShare_VWINR);
event PointsCorrectionUpdated_VWINR(address indexed account, int256 pointsCorrection_VWINR);
constructor(string memory name, string memory symbol) ERC20(name, symbol) {}
function correctedTotalSupply() public view returns (uint256) {
return (totalSupply() - balanceOf(address(this)));
}
function _distributeFunds_WLP(uint256 value) internal {
require(totalSupply() > 0, "FDT:ZERO_SUPPLY");
if (value == 0) return;
uint256 correctedTotalSupply_ = correctedTotalSupply();
pointsPerShare_WLP = pointsPerShare_WLP.add(
value.mul(pointsMultiplier) / correctedTotalSupply_
);
emit FundsDistributed_WLP(msg.sender, value);
emit PointsPerShareUpdated_WLP(pointsPerShare_WLP);
}
function _distributeFunds_VWINR(uint256 value) internal {
require(totalSupply() > 0, "FDT:ZERO_SUPPLY");
if (value == 0) return;
uint256 correctedTotalSupply_ = correctedTotalSupply();
pointsPerShare_VWINR = pointsPerShare_VWINR.add(
value.mul(pointsMultiplier) / correctedTotalSupply_
);
emit FundsDistributed_VWINR(msg.sender, value);
emit PointsPerShareUpdated_VWINR(pointsPerShare_VWINR);
}
function _prepareWithdraw_WLP() internal returns (uint256 withdrawableDividend_WLP) {
withdrawableDividend_WLP = withdrawableFundsOf_WLP(msg.sender);
uint256 _withdrawnFunds_WLP = withdrawnFunds_WLP[msg.sender].add(
withdrawableDividend_WLP
);
withdrawnFunds_WLP[msg.sender] = _withdrawnFunds_WLP;
emit FundsWithdrawn_WLP(msg.sender, withdrawableDividend_WLP, _withdrawnFunds_WLP);
}
function _prepareWithdraw_VWINR() internal returns (uint256 withdrawableDividend_VWINR) {
withdrawableDividend_VWINR = withdrawableFundsOf_VWINR(msg.sender);
uint256 _withdrawnFunds_VWINR = withdrawnFunds_VWINR[msg.sender].add(
withdrawableDividend_VWINR
);
withdrawnFunds_VWINR[msg.sender] = _withdrawnFunds_VWINR;
emit FundsWithdrawn_VWINR(
msg.sender,
withdrawableDividend_VWINR,
_withdrawnFunds_VWINR
);
}
function withdrawableFundsOf_WLP(address _owner) public view returns (uint256) {
return accumulativeFundsOf_WLP(_owner).sub(withdrawnFunds_WLP[_owner]);
}
function withdrawableFundsOf_VWINR(address _owner) public view returns (uint256) {
return accumulativeFundsOf_VWINR(_owner).sub(withdrawnFunds_VWINR[_owner]);
}
function withdrawnFundsOf_WLP(address _owner) external view returns (uint256) {
return withdrawnFunds_WLP[_owner];
}
function withdrawnFundsOf_VWINR(address _owner) external view returns (uint256) {
return withdrawnFunds_VWINR[_owner];
}
function accumulativeFundsOf_WLP(address _owner) public view returns (uint256) {
return
pointsPerShare_WLP
.mul(balanceOf(_owner))
.toInt256Safe()
.add(pointsCorrection_WLP[_owner])
.toUint256Safe() / pointsMultiplier;
}
function accumulativeFundsOf_VWINR(address _owner) public view returns (uint256) {
return
pointsPerShare_VWINR
.mul(balanceOf(_owner))
.toInt256Safe()
.add(pointsCorrection_VWINR[_owner])
.toUint256Safe() / pointsMultiplier;
}
function _transfer(address from, address to, uint256 value) internal virtual override {
super._transfer(from, to, value);
int256 _magCorrection_WLP = pointsPerShare_WLP.mul(value).toInt256Safe();
int256 pointsCorrectionFrom_WLP = pointsCorrection_WLP[from].add(
_magCorrection_WLP
);
pointsCorrection_WLP[from] = pointsCorrectionFrom_WLP;
int256 pointsCorrectionTo_WLP = pointsCorrection_WLP[to].sub(_magCorrection_WLP);
pointsCorrection_WLP[to] = pointsCorrectionTo_WLP;
int256 _magCorrection_VWINR = pointsPerShare_VWINR.mul(value).toInt256Safe();
int256 pointsCorrectionFrom_VWINR = pointsCorrection_VWINR[from].add(
_magCorrection_VWINR
);
pointsCorrection_VWINR[from] = pointsCorrectionFrom_VWINR;
int256 pointsCorrectionTo_VWINR = pointsCorrection_VWINR[to].sub(
_magCorrection_VWINR
);
pointsCorrection_VWINR[to] = pointsCorrectionTo_VWINR;
emit PointsCorrectionUpdated_WLP(from, pointsCorrectionFrom_WLP);
emit PointsCorrectionUpdated_WLP(to, pointsCorrectionTo_WLP);
emit PointsCorrectionUpdated_VWINR(from, pointsCorrectionFrom_VWINR);
emit PointsCorrectionUpdated_VWINR(to, pointsCorrectionTo_VWINR);
}
function _mint(address account, uint256 value) internal virtual override {
super._mint(account, value);
int256 _pointsCorrection_WLP = pointsCorrection_WLP[account].sub(
(pointsPerShare_WLP.mul(value)).toInt256Safe()
);
pointsCorrection_WLP[account] = _pointsCorrection_WLP;
int256 _pointsCorrection_VWINR = pointsCorrection_VWINR[account].sub(
(pointsPerShare_VWINR.mul(value)).toInt256Safe()
);
pointsCorrection_VWINR[account] = _pointsCorrection_VWINR;
emit PointsCorrectionUpdated_WLP(account, _pointsCorrection_WLP);
emit PointsCorrectionUpdated_VWINR(account, _pointsCorrection_VWINR);
}
function _burn(address account, uint256 value) internal virtual override {
super._burn(account, value);
int256 _pointsCorrection_WLP = pointsCorrection_WLP[account].add(
(pointsPerShare_WLP.mul(value)).toInt256Safe()
);
pointsCorrection_WLP[account] = _pointsCorrection_WLP;
int256 _pointsCorrection_VWINR = pointsCorrection_VWINR[account].add(
(pointsPerShare_VWINR.mul(value)).toInt256Safe()
);
pointsCorrection_VWINR[account] = _pointsCorrection_VWINR;
emit PointsCorrectionUpdated_WLP(account, _pointsCorrection_WLP);
emit PointsCorrectionUpdated_VWINR(account, _pointsCorrection_VWINR);
}
function withdrawFunds_WLP() public virtual override {}
function withdrawFunds_VWINR() public virtual override {}
function withdrawFunds() public virtual override {}
function _updateFundsTokenBalance_WLP() internal virtual returns (int256) {}
function _updateFundsTokenBalance_VWINR() internal virtual returns (int256) {}
function updateFundsReceived() public virtual {
int256 newFunds_WLP = _updateFundsTokenBalance_WLP();
int256 newFunds_VWINR = _updateFundsTokenBalance_VWINR();
if (newFunds_WLP > 0) {
_distributeFunds_WLP(newFunds_WLP.toUint256Safe());
}
if (newFunds_VWINR > 0) {
_distributeFunds_VWINR(newFunds_VWINR.toUint256Safe());
}
}
function updateFundsReceived_WLP() public virtual {
int256 newFunds_WLP = _updateFundsTokenBalance_WLP();
if (newFunds_WLP > 0) {
_distributeFunds_WLP(newFunds_WLP.toUint256Safe());
}
}
function updateFundsReceived_VWINR() public virtual {
int256 newFunds_VWINR = _updateFundsTokenBalance_VWINR();
if (newFunds_VWINR > 0) {
_distributeFunds_VWINR(newFunds_VWINR.toUint256Safe());
}
}
function returnPointsCorrection_WLP(address _account) public view returns (int256) {
return pointsCorrection_WLP[_account];
}
function returnPointsCorrection_VWINR(address _account) public view returns (int256) {
return pointsCorrection_VWINR[_account];
}
function returnWithdrawnFunds_WLP(address _account) public view returns (uint256) {
return withdrawnFunds_WLP[_account];
}
function returnWithdrawnFunds_VWINR(address _account) public view returns (uint256) {
return withdrawnFunds_VWINR[_account];
}
}
文件 3 的 17: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 的 17:ERC20.sol
pragma solidity ^0.8.0;
import "./IERC20.sol";
import "./extensions/IERC20Metadata.sol";
import "../../utils/Context.sol";
contract ERC20 is Context, IERC20, IERC20Metadata {
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
function name() public view virtual override returns (string memory) {
return _name;
}
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
function decimals() public view virtual override returns (uint8) {
return 18;
}
function totalSupply() public view virtual override returns (uint256) {
return _totalSupply;
}
function balanceOf(address account) public view virtual override returns (uint256) {
return _balances[account];
}
function transfer(address to, uint256 amount) public virtual override returns (bool) {
address owner = _msgSender();
_transfer(owner, to, amount);
return true;
}
function allowance(address owner, address spender) public view virtual override returns (uint256) {
return _allowances[owner][spender];
}
function approve(address spender, uint256 amount) public virtual override returns (bool) {
address owner = _msgSender();
_approve(owner, spender, amount);
return true;
}
function transferFrom(
address from,
address to,
uint256 amount
) public virtual override returns (bool) {
address spender = _msgSender();
_spendAllowance(from, spender, amount);
_transfer(from, to, amount);
return true;
}
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
address owner = _msgSender();
_approve(owner, spender, allowance(owner, spender) + addedValue);
return true;
}
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
address owner = _msgSender();
uint256 currentAllowance = allowance(owner, spender);
require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
unchecked {
_approve(owner, spender, currentAllowance - subtractedValue);
}
return true;
}
function _transfer(
address from,
address to,
uint256 amount
) internal virtual {
require(from != address(0), "ERC20: transfer from the zero address");
require(to != address(0), "ERC20: transfer to the zero address");
_beforeTokenTransfer(from, to, amount);
uint256 fromBalance = _balances[from];
require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
unchecked {
_balances[from] = fromBalance - amount;
_balances[to] += amount;
}
emit Transfer(from, to, amount);
_afterTokenTransfer(from, to, amount);
}
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");
_beforeTokenTransfer(address(0), account, amount);
_totalSupply += amount;
unchecked {
_balances[account] += amount;
}
emit Transfer(address(0), account, amount);
_afterTokenTransfer(address(0), account, amount);
}
function _burn(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: burn from the zero address");
_beforeTokenTransfer(account, address(0), amount);
uint256 accountBalance = _balances[account];
require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
unchecked {
_balances[account] = accountBalance - amount;
_totalSupply -= amount;
}
emit Transfer(account, address(0), amount);
_afterTokenTransfer(account, address(0), amount);
}
function _approve(
address owner,
address spender,
uint256 amount
) internal virtual {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
function _spendAllowance(
address owner,
address spender,
uint256 amount
) internal virtual {
uint256 currentAllowance = allowance(owner, spender);
if (currentAllowance != type(uint256).max) {
require(currentAllowance >= amount, "ERC20: insufficient allowance");
unchecked {
_approve(owner, spender, currentAllowance - amount);
}
}
}
function _beforeTokenTransfer(
address from,
address to,
uint256 amount
) internal virtual {}
function _afterTokenTransfer(
address from,
address to,
uint256 amount
) internal virtual {}
}
文件 5 的 17: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;
}
文件 6 的 17:IBaseFDT.sol
pragma solidity >=0.6.0 <0.9.0;
interface IBaseFDT {
function withdrawableFundsOf_WLP(address owner) external view returns (uint256);
function withdrawableFundsOf_VWINR(address owner) external view returns (uint256);
function withdrawFunds_WLP() external;
function withdrawFunds_VWINR() external;
function withdrawFunds() external;
event FundsDistributed_WLP(address indexed by, uint256 fundsDistributed_WLP);
event FundsDistributed_VWINR(address indexed by, uint256 fundsDistributed_VWINR);
event FundsWithdrawn_WLP(
address indexed by,
uint256 fundsWithdrawn_WLP,
uint256 totalWithdrawn_WLP
);
event FundsWithdrawn_VWINR(
address indexed by,
uint256 fundsWithdrawn_VWINR,
uint256 totalWithdrawn_VWINR
);
}
文件 7 的 17: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);
}
文件 8 的 17:IERC20Metadata.sol
pragma solidity ^0.8.0;
import "../IERC20.sol";
interface IERC20Metadata is IERC20 {
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
}
文件 9 的 17: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;
}
文件 10 的 17: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 的 17:MintableBaseToken.sol
pragma solidity 0.8.19;
import "./BasicFDT.sol";
import "../../interfaces/tokens/wlp/IMintable.sol";
import "../../core/AccessControlBase.sol";
import "solmate/src/utils/ReentrancyGuard.sol";
contract MintableBaseToken is BasicFDT, AccessControlBase, ReentrancyGuard, IMintable {
using SafeMath for uint256;
using SafeMathUint for uint256;
using SignedSafeMath for int256;
using SafeMathInt for int256;
mapping(address => bool) public override isMinter;
bool public inPrivateTransferMode;
mapping(address => bool) public isHandler;
IERC20 public immutable rewardToken_WLP;
IERC20 public immutable rewardToken_VWINR;
uint256 public rewardTokenBalance_WLP;
uint256 public rewardTokenBalance_VWINR;
event SetInfo(string name, string symbol);
event SetPrivateTransferMode(bool inPrivateTransferMode);
event SetHandler(address handlerAddress, bool isActive);
event WithdrawStuckToken(address tokenAddress, address receiver, uint256 amount);
constructor(
string memory _name,
string memory _symbol,
address _vwinrAddress,
address _vaultRegistry,
address _timelock
) BasicFDT(_name, _symbol) AccessControlBase(_vaultRegistry, _timelock) {
rewardToken_WLP = IERC20(address(this));
rewardToken_VWINR = IERC20(_vwinrAddress);
}
modifier onlyMinter() {
require(isMinter[_msgSender()], "MintableBaseToken: forbidden");
_;
}
function withdrawFunds_WLP() public virtual override nonReentrant {
_withdrawFunds_WLP();
}
function _withdrawFunds_WLP() internal {
uint256 withdrawableFunds_WLP = _prepareWithdraw_WLP();
if (withdrawableFunds_WLP > uint256(0)) {
rewardToken_WLP.transfer(_msgSender(), withdrawableFunds_WLP);
_updateFundsTokenBalance_WLP();
}
}
function withdrawFunds_VWINR() public virtual override nonReentrant {
_withdrawFunds_VWINR();
}
function _withdrawFunds_VWINR() internal {
uint256 withdrawableFunds_VWINR = _prepareWithdraw_VWINR();
if (withdrawableFunds_VWINR > uint256(0)) {
rewardToken_VWINR.transfer(_msgSender(), withdrawableFunds_VWINR);
_updateFundsTokenBalance_VWINR();
}
}
function withdrawFunds() public virtual override nonReentrant {
_withdrawFunds_WLP();
_withdrawFunds_VWINR();
}
function _updateFundsTokenBalance_WLP() internal virtual override returns (int256) {
uint256 _prevFundsTokenBalance_WLP = rewardTokenBalance_WLP;
rewardTokenBalance_WLP = rewardToken_WLP.balanceOf(address(this));
return int256(rewardTokenBalance_WLP).sub(int256(_prevFundsTokenBalance_WLP));
}
function _updateFundsTokenBalance_VWINR() internal virtual override returns (int256) {
uint256 _prevFundsTokenBalance_VWINR = rewardTokenBalance_VWINR;
rewardTokenBalance_VWINR = rewardToken_VWINR.balanceOf(address(this));
return int256(rewardTokenBalance_VWINR).sub(int256(_prevFundsTokenBalance_VWINR));
}
function transfer(address _recipient, uint256 _amount) public override returns (bool) {
if (inPrivateTransferMode) {
require(isHandler[_msgSender()], "BaseToken: _msgSender() not whitelisted");
}
super._transfer(_msgSender(), _recipient, _amount);
return true;
}
function transferFrom(
address _from,
address _recipient,
uint256 _amount
) public override returns (bool) {
if (inPrivateTransferMode) {
require(isHandler[_msgSender()], "BaseToken: _msgSender() not whitelisted");
}
if (isHandler[_msgSender()]) {
super._transfer(_from, _recipient, _amount);
return true;
}
address spender = _msgSender();
super._spendAllowance(_from, spender, _amount);
super._transfer(_from, _recipient, _amount);
return true;
}
function setInPrivateTransferMode(
bool _inPrivateTransferMode
) external onlyTimelockGovernance {
inPrivateTransferMode = _inPrivateTransferMode;
emit SetPrivateTransferMode(_inPrivateTransferMode);
}
function setHandler(address _handler, bool _isActive) external onlyTimelockGovernance {
isHandler[_handler] = _isActive;
emit SetHandler(_handler, _isActive);
}
function setInfo(string memory _name, string memory _symbol) external onlyGovernance {
_name = _name;
_symbol = _symbol;
emit SetInfo(_name, _symbol);
}
function withdrawToken(
address _token,
address _account,
uint256 _amount
) external onlyGovernance {
IERC20(_token).transfer(_account, _amount);
emit WithdrawStuckToken(_token, _account, _amount);
}
function setMinter(
address _minter,
bool _isActive
) external override onlyTimelockGovernance {
isMinter[_minter] = _isActive;
emit MinterSet(_minter, _isActive);
}
function mint(address _account, uint256 _amount) external override nonReentrant onlyMinter {
super._mint(_account, _amount);
}
function burn(address _account, uint256 _amount) external override nonReentrant onlyMinter {
super._burn(_account, _amount);
}
}
文件 12 的 17: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;
}
}
文件 13 的 17:SafeMath.sol
pragma solidity 0.8.19;
library SafeMath {
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
function sub(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
function div(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
require(b > 0, errorMessage);
uint256 c = a / b;
return c;
}
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
function mod(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
文件 14 的 17:SafeMathInt.sol
pragma solidity 0.8.19;
library SafeMathInt {
function toUint256Safe(int256 a) internal pure returns (uint256) {
require(a >= 0, "SMI:NEG");
return uint256(a);
}
}
文件 15 的 17:SafeMathUint.sol
pragma solidity 0.8.19;
library SafeMathUint {
function toInt256Safe(uint256 a) internal pure returns (int256 b) {
b = int256(a);
require(b >= 0, "SMU:OOB");
}
}
文件 16 的 17:SignedSafeMath.sol
pragma solidity 0.8.19;
library SignedSafeMath {
int256 private constant _INT256_MIN = -2 ** 255;
function mul(int256 a, int256 b) internal pure returns (int256) {
if (a == 0) {
return 0;
}
require(!(a == -1 && b == _INT256_MIN), "SignedSafeMath: multiplication overflow");
int256 c = a * b;
require(c / a == b, "SignedSafeMath: multiplication overflow");
return c;
}
function div(int256 a, int256 b) internal pure returns (int256) {
require(b != 0, "SignedSafeMath: division by zero");
require(!(b == -1 && a == _INT256_MIN), "SignedSafeMath: division overflow");
int256 c = a / b;
return c;
}
function sub(int256 a, int256 b) internal pure returns (int256) {
int256 c = a - b;
require(
(b >= 0 && c <= a) || (b < 0 && c > a),
"SignedSafeMath: subtraction overflow"
);
return c;
}
function add(int256 a, int256 b) internal pure returns (int256) {
int256 c = a + b;
require(
(b >= 0 && c >= a) || (b < 0 && c < a),
"SignedSafeMath: addition overflow"
);
return c;
}
}
文件 17 的 17:WLP.sol
pragma solidity 0.8.19;
import "./MintableBaseToken.sol";
contract WLP is MintableBaseToken {
constructor(
address _vaultRegistry,
address _timelock,
address _vwinrAddress
) MintableBaseToken("WINR LP", "WLP", _vwinrAddress, _vaultRegistry, _timelock) {}
function id() external pure returns (string memory _name) {
return "WLP";
}
}
{
"compilationTarget": {
"contracts/tokens/wlp/WLP.sol": "WLP"
},
"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":"_vaultRegistry","type":"address"},{"internalType":"address","name":"_timelock","type":"address"},{"internalType":"address","name":"_vwinrAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"by","type":"address"},{"indexed":false,"internalType":"uint256","name":"fundsDistributed_VWINR","type":"uint256"}],"name":"FundsDistributed_VWINR","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"by","type":"address"},{"indexed":false,"internalType":"uint256","name":"fundsDistributed_WLP","type":"uint256"}],"name":"FundsDistributed_WLP","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"by","type":"address"},{"indexed":false,"internalType":"uint256","name":"fundsWithdrawn_VWINR","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalWithdrawn_VWINR","type":"uint256"}],"name":"FundsWithdrawn_VWINR","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"by","type":"address"},{"indexed":false,"internalType":"uint256","name":"fundsWithdrawn_WLP","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalWithdrawn_WLP","type":"uint256"}],"name":"FundsWithdrawn_WLP","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"minterAddress","type":"address"},{"indexed":false,"internalType":"bool","name":"isActive","type":"bool"}],"name":"MinterSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"int256","name":"pointsCorrection_VWINR","type":"int256"}],"name":"PointsCorrectionUpdated_VWINR","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"int256","name":"pointsCorrection_WLP","type":"int256"}],"name":"PointsCorrectionUpdated_WLP","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"pointsPerShare_VWINR","type":"uint256"}],"name":"PointsPerShareUpdated_VWINR","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"pointsPerShare_WLP","type":"uint256"}],"name":"PointsPerShareUpdated_WLP","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"handlerAddress","type":"address"},{"indexed":false,"internalType":"bool","name":"isActive","type":"bool"}],"name":"SetHandler","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"string","name":"symbol","type":"string"}],"name":"SetInfo","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"inPrivateTransferMode","type":"bool"}],"name":"SetPrivateTransferMode","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawStuckToken","type":"event"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"accumulativeFundsOf_VWINR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"accumulativeFundsOf_WLP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"correctedTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"id","outputs":[{"internalType":"string","name":"_name","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"inPrivateTransferMode","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","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":"isMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"registry","outputs":[{"internalType":"contract IVaultAccessControlRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"returnPointsCorrection_VWINR","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"returnPointsCorrection_WLP","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"returnWithdrawnFunds_VWINR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"returnWithdrawnFunds_WLP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardTokenBalance_VWINR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardTokenBalance_WLP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardToken_VWINR","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardToken_WLP","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","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":"_inPrivateTransferMode","type":"bool"}],"name":"setInPrivateTransferMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"name":"setInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"},{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"setMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timelockAddressImmutable","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updateFundsReceived","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updateFundsReceived_VWINR","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updateFundsReceived_WLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawFunds_VWINR","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawFunds_WLP","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"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"withdrawableFundsOf_VWINR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"withdrawableFundsOf_WLP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"withdrawnFundsOf_VWINR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"withdrawnFundsOf_WLP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]