编译器
0.6.12+commit.27d51765
文件 1 的 18:Address.sol
pragma solidity ^0.6.2;
library Address {
function isContract(address account) internal view returns (bool) {
uint256 size;
assembly { size := extcodesize(account) }
return size > 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 functionCall(target, data, "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");
return _functionCallWithValue(target, data, value, errorMessage);
}
function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
if (success) {
return returndata;
} else {
if (returndata.length > 0) {
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
文件 2 的 18:AddressesLib.sol
pragma solidity 0.6.12;
library AddressesLib {
function add(address[] storage self, address newItem) internal {
require(newItem != address(0x0), "EMPTY_ADDRESS_NOT_ALLOWED");
self.push(newItem);
}
function removeAt(address[] storage self, uint256 index) internal {
if (index >= self.length) return;
if (index != self.length - 1) {
address temp = self[self.length - 1];
self[index] = temp;
}
delete self[self.length - 1];
self.pop();
}
function getIndex(address[] storage self, address item)
internal
view
returns (bool found, uint256 indexAt)
{
for (indexAt = 0; indexAt < self.length; indexAt++) {
found = self[indexAt] == item;
if (found) {
return (found, indexAt);
}
}
return (found, indexAt);
}
function remove(address[] storage self, address item) internal {
(bool found, uint256 indexAt) = getIndex(self, item);
if (!found) return;
removeAt(self, indexAt);
}
}
文件 3 的 18:Base.sol
pragma solidity 0.6.12;
import "../roles/RolesManagerConsts.sol";
import "@openzeppelin/contracts/utils/Address.sol";
import "../settings/IPlatformSettings.sol";
import "../roles/IRolesManager.sol";
abstract contract Base {
using Address for address;
address private settings;
modifier onlyOwner(address account) {
_requireHasRole(
RolesManagerConsts(_rolesManager().consts()).OWNER_ROLE(),
account,
"SENDER_ISNT_OWNER"
);
_;
}
modifier onlyMinter(address account) {
_requireHasRole(
RolesManagerConsts(_rolesManager().consts()).MINTER_ROLE(),
account,
"SENDER_ISNT_MINTER"
);
_;
}
constructor(address settingsAddress) internal {
require(settingsAddress.isContract(), "SETTINGS_MUST_BE_CONTRACT");
settings = settingsAddress;
}
function _settings() internal view returns (IPlatformSettings) {
return IPlatformSettings(settings);
}
function _rolesManager() internal view returns (IRolesManager) {
return IRolesManager(IPlatformSettings(settings).rolesManager());
}
function _requireHasRole(
bytes32 role,
address account,
string memory message
) internal view {
IRolesManager rolesManager = _rolesManager();
rolesManager.requireHasRole(role, account, message);
}
}
文件 4 的 18:IERC20.sol
pragma solidity ^0.6.0;
interface IERC20 {
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, 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 sender, address recipient, uint256 amount) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
文件 5 的 18:IMigrator.sol
pragma solidity 0.6.12;
interface IMigrator {
event ContractMigrated(
address indexed migrator,
address indexed oldContract,
address indexed newContract
);
function migrate(
address oldContract,
address newContract,
bytes calldata extraData
) external returns (address);
}
文件 6 的 18:IMintableERC20.sol
pragma solidity 0.6.12;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
interface IMintableERC20 is IERC20 {
function mint(address account, uint256 amount) external;
}
文件 7 的 18:IPlatformSettings.sol
pragma solidity 0.6.12;
pragma experimental ABIEncoderV2;
import "../libs/SettingsLib.sol";
interface IPlatformSettings {
event PlatformPaused(address indexed pauser);
event PlatformUnpaused(address indexed unpauser);
event PlatformSettingCreated(
bytes32 indexed name,
address indexed creator,
uint256 minValue,
uint256 value,
uint256 maxValue
);
event PlatformSettingRemoved(bytes32 indexed name, address indexed remover, uint256 value);
event PlatformSettingUpdated(
bytes32 indexed name,
address indexed remover,
uint256 oldValue,
uint256 newValue
);
function createSetting(
bytes32 name,
uint256 value,
uint256 min,
uint256 max
) external;
function removeSetting(bytes32 name) external;
function getSetting(bytes32 name) external view returns (SettingsLib.Setting memory);
function getSettingValue(bytes32 name) external view returns (uint256);
function hasSetting(bytes32 name) external view returns (bool);
function rolesManager() external view returns (address);
function isPaused() external view returns (bool);
function requireIsPaused() external view;
function requireIsNotPaused() external view;
function pause() external;
function unpause() external;
}
文件 8 的 18:IRewardPeriodsRegistry.sol
pragma solidity 0.6.12;
pragma experimental ABIEncoderV2;
import "../libs/RewardPeriodLib.sol";
interface IRewardPeriodsRegistry {
event RewardPeriodCreated(
address indexed creator,
uint256 period,
uint256 startPeriodTimestamp,
uint256 endPeriodTimestamp,
uint256 endRedeemablePeriodTimestamp,
uint256 availableRewards
);
event RewardPeriodRemoved(
address indexed remover,
uint256 period,
uint256 startTimestamp,
uint256 endTimestamp,
uint256 availableRewards
);
function settings() external view returns (address);
function getRewardPeriod(uint256 id)
external
view
returns (RewardPeriodLib.RewardPeriod memory);
function notifyRewardsSent(uint256 period, uint256 totalRewardsSent)
external
returns (uint256 newTotalAvailableRewards);
function createRewardPeriod(
uint256 startPeriodTimestamp,
uint256 endPeriodTimestamp,
uint256 endRedeemablePeriodTimestamp,
uint256 availableRewards
) external;
function getRewardPeriods() external view returns (RewardPeriodLib.RewardPeriod[] memory);
function getLastRewardPeriod()
external
view
returns (
uint256 periodId,
uint256 startPeriodTimestamp,
uint256 endPeriodTimestamp,
uint256 endRedeemablePeriodTimestamp,
uint256 totalRewards,
uint256 availableRewards,
bool exists
);
function getRewardPeriodById(uint256 periodId)
external
view
returns (
uint256 id,
uint256 startPeriodTimestamp,
uint256 endPeriodTimestamp,
uint256 endRedeemablePeriodTimestamp,
uint256 totalRewards,
uint256 availableRewards,
bool exists
);
}
文件 9 的 18:IRewardsCalculator.sol
pragma solidity 0.6.12;
interface IRewardsCalculator {
function getRewards(
uint256 period,
address account,
uint256 totalRewards,
uint256 totalAvailableRewards
) external view returns (uint256);
function processRewards(
uint256 period,
address account,
uint256 totalRewards,
uint256 totalAvailableRewards
) external returns (uint256 rewardsForAccount);
}
文件 10 的 18:IRewardsMinter.sol
pragma solidity 0.6.12;
import "../tokens/IMintableERC20.sol";
interface IRewardsMinter {
event NewCalculatorAdded(
address indexed adder,
address indexed newCalulator,
uint256 calculatorPercentage,
uint256 currentPercentage
);
event CalculatorRemoved(
address indexed remover,
address indexed calulator,
uint256 calculatorPercentage,
uint256 currentPercentage
);
event CalculatorPercentageUpdated(
address indexed updater,
address indexed calulator,
uint256 newcalculatorPercentage,
uint256 currentPercentage
);
event RewardsClaimed(address indexed account, uint256 indexed periodId, uint256 amount);
function token() external view returns (IMintableERC20);
function settings() external view returns (address);
function rewardPeriodsRegistry() external view returns (address);
function currentPercentage() external view returns (uint256);
function getCalculators() external view returns (address[] memory);
function getAvailableRewards(uint256 periodId, address account) external view returns (uint256);
function claimRewards(uint256 periodId) external;
function addCalculator(address newCalculator, uint256 percentage) external;
function removeCalculator(address calculator) external;
function hasCalculator(address calculator) external view returns (bool);
function updateCalculatorPercentage(address calculator, uint256 percentage) external;
}
文件 11 的 18:IRolesManager.sol
pragma solidity 0.6.12;
interface IRolesManager {
event MaxMultiItemsUpdated(address indexed updater, uint8 oldValue, uint8 newValue);
function setMaxMultiItems(uint8 newMaxMultiItems) external;
function multiGrantRole(bytes32 role, address[] calldata accounts) external;
function multiRevokeRole(bytes32 role, address[] calldata accounts) external;
function consts() external view returns (address);
function maxMultiItems() external view returns (uint8);
function requireHasRole(bytes32 role, address account) external view;
function requireHasRole(
bytes32 role,
address account,
string calldata message
) external view;
}
文件 12 的 18:MigratorBase.sol
pragma solidity 0.6.12;
import "./Base.sol";
import "../migrator/IMigrator.sol";
abstract contract MigratorBase is Base {
address private migrator;
constructor(address settingsAddress) internal Base(settingsAddress) {}
function setMigrator(address newMigrator) external onlyOwner(msg.sender) {
require(newMigrator.isContract(), "MIGRATOR_MUST_BE_CONTRACT");
migrator = newMigrator;
}
function migrateTo(address newContract, bytes calldata extraData)
external
onlyOwner(msg.sender)
{
require(newContract != address(0x0), "MIGRATOR_IS_EMPTY");
IMigrator(migrator).migrate(address(this), newContract, extraData);
}
function hasMigrator() external view returns (bool) {
return migrator != address(0x0);
}
function _migrator() internal view returns (address) {
return migrator;
}
}
文件 13 的 18:RewardCalculatorLib.sol
pragma solidity 0.6.12;
library RewardCalculatorLib {
uint256 private constant MAX_PERCENTAGE = 10000;
struct RewardCalculator {
uint256 percentage;
bool paused;
bool exists;
}
function create(RewardCalculator storage self, uint256 percentage) internal {
requireNotExists(self);
require(percentage <= MAX_PERCENTAGE, "PERCENTAGE_MUST_BE_LT_MAX");
self.percentage = percentage;
self.exists = true;
}
function update(RewardCalculator storage self, uint256 newPercentage)
internal
returns (uint256 oldPercentage)
{
requireExists(self);
require(self.percentage != newPercentage, "NEW_PERCENTAGE_REQUIRED");
require(newPercentage < MAX_PERCENTAGE, "PERCENTAGE_MUST_BE_LT_MAX");
oldPercentage = self.percentage;
self.percentage = newPercentage;
}
function pause(RewardCalculator storage self) internal {
requireExists(self);
require(!self.paused, "CALCULATOR_ALREADY_PAUSED");
self.paused = true;
}
function unpause(RewardCalculator storage self) internal {
requireExists(self);
require(self.paused, "CALCULATOR_NOT_PAUSED");
self.paused = false;
}
function getPercentage(RewardCalculator storage self) internal view returns (uint256) {
return self.exists && !self.paused ? self.percentage : 0;
}
function requireNotExists(RewardCalculator storage self) internal view {
require(!self.exists, "REWARD_CALC_ALREADY_EXISTS");
}
function requireExists(RewardCalculator storage self) internal view {
require(self.exists, "REWARD_CALC_NOT_EXISTS");
}
function remove(RewardCalculator storage self) internal {
requireExists(self);
self.percentage = 0;
self.exists = false;
}
}
文件 14 的 18:RewardPeriodLib.sol
pragma solidity 0.6.12;
import "@openzeppelin/contracts/math/SafeMath.sol";
library RewardPeriodLib {
using SafeMath for uint256;
struct RewardPeriod {
uint256 id;
uint256 startPeriodTimestamp;
uint256 endPeriodTimestamp;
uint256 endRedeemablePeriodTimestamp;
uint256 totalRewards;
uint256 availableRewards;
bool exists;
}
function create(
RewardPeriod storage self,
uint256 id,
uint256 startPeriodTimestamp,
uint256 endPeriodTimestamp,
uint256 endRedeemablePeriodTimestamp,
uint256 availableRewards
) internal {
requireNotExists(self);
require(block.timestamp <= startPeriodTimestamp, "START_TIMESTAMP_IS_INVALID");
require(startPeriodTimestamp < endPeriodTimestamp, "REWARD_PERIOD_IS_INVALID");
require(endPeriodTimestamp < endRedeemablePeriodTimestamp, "END_REDEEM_PERIOD_IS_INVALID");
require(availableRewards > 0, "REWARDS_MUST_BE_GT_ZERO");
self.id = id;
self.startPeriodTimestamp = startPeriodTimestamp;
self.endPeriodTimestamp = endPeriodTimestamp;
self.endRedeemablePeriodTimestamp = endRedeemablePeriodTimestamp;
self.availableRewards = availableRewards;
self.totalRewards = availableRewards;
self.exists = true;
}
function isInProgress(RewardPeriod storage self) internal view returns (bool) {
uint256 currentTimestamp = block.timestamp;
return
self.exists &&
self.startPeriodTimestamp <= currentTimestamp &&
currentTimestamp <= self.endPeriodTimestamp;
}
function isInRedemption(RewardPeriod storage self) internal view returns (bool) {
return isFinished(self) && self.endRedeemablePeriodTimestamp > block.timestamp;
}
function isFinished(RewardPeriod storage self) internal view returns (bool) {
return self.exists && self.endPeriodTimestamp < block.timestamp;
}
function isPending(RewardPeriod storage self) internal view returns (bool) {
uint256 currentTimestamp = block.timestamp;
return self.exists && self.startPeriodTimestamp > currentTimestamp;
}
function requireNotExists(RewardPeriod storage self) internal view {
require(!self.exists, "REWARD_PERIOD_ALREADY_EXISTS");
}
function requireExists(RewardPeriod storage self) internal view {
require(self.exists, "REWARD_PERIOD_NOT_EXISTS");
}
function endsBefore(RewardPeriod storage self, uint256 startPeriodTimestamp)
internal
view
returns (bool)
{
return self.exists && self.endPeriodTimestamp < startPeriodTimestamp;
}
function notifyRewardsSent(RewardPeriod storage self, uint256 amount) internal returns (bool) {
self.availableRewards = self.availableRewards.sub(amount);
}
function remove(RewardPeriod storage self) internal {
requireExists(self);
self.id = 0;
self.startPeriodTimestamp = 0;
self.endPeriodTimestamp = 0;
self.endRedeemablePeriodTimestamp = 0;
self.totalRewards = 0;
self.availableRewards = 0;
self.exists = false;
}
}
文件 15 的 18:RewardsMinter.sol
pragma solidity 0.6.12;
import "../base/MigratorBase.sol";
import "../tokens/IMintableERC20.sol";
import "../rewards/IRewardsCalculator.sol";
import "./IRewardsMinter.sol";
import "../registries/IRewardPeriodsRegistry.sol";
import "@openzeppelin/contracts/math/SafeMath.sol";
import "../libs/RewardCalculatorLib.sol";
import "../libs/AddressesLib.sol";
contract RewardsMinter is MigratorBase, IRewardsMinter {
using RewardCalculatorLib for RewardCalculatorLib.RewardCalculator;
using AddressesLib for address[];
using SafeMath for uint256;
uint256 private constant MAX_PERCENTAGE = 10000;
IMintableERC20 public override token;
mapping(address => RewardCalculatorLib.RewardCalculator) public calculators;
uint256 public override currentPercentage;
address[] public calculatorsList;
address public override rewardPeriodsRegistry;
constructor(
address rewardPeriodsRegistryAddress,
address settingsAddress,
address tokenAddress
) public MigratorBase(settingsAddress) {
require(rewardPeriodsRegistryAddress.isContract(), "PERIODS_REG_MUST_BE_CONTRACT");
require(tokenAddress.isContract(), "TOKEN_MUST_BE_CONTRACT");
rewardPeriodsRegistry = rewardPeriodsRegistryAddress;
token = IMintableERC20(tokenAddress);
}
function claimRewards(uint256 periodId) external override {
_settings().requireIsNotPaused();
require(currentPercentage == MAX_PERCENTAGE, "CURRENT_PERCENTAGE_INVALID");
(
uint256 id,
,
uint256 endPeriodTimestamp,
uint256 endRedeemablePeriodTimestamp,
,
uint256 availableRewards,
bool exists
) = _getRewardPeriod(periodId);
require(exists, "PERIOD_ID_NOT_EXISTS");
require(endPeriodTimestamp < block.timestamp, "REWARD_PERIOD_IN_PROGRESS");
require(endRedeemablePeriodTimestamp > block.timestamp, "CLAIMABLE_PERIOD_FINISHED");
address account = msg.sender;
uint256 totalRewardsSent = 0;
for (uint256 indexAt = 0; indexAt < calculatorsList.length; indexAt++) {
IRewardsCalculator rewardsCalculator = IRewardsCalculator(calculatorsList[indexAt]);
uint256 calculatorPercentage = calculators[calculatorsList[indexAt]].getPercentage();
uint256 calculatorAvailableRewards =
availableRewards.mul(calculatorPercentage).div(100);
uint256 availableRewardsForAcount =
rewardsCalculator.processRewards(
id,
account,
availableRewards,
calculatorAvailableRewards
);
totalRewardsSent = totalRewardsSent.add(availableRewardsForAcount);
if (availableRewardsForAcount > 0) {
token.mint(account, availableRewardsForAcount);
}
}
if (totalRewardsSent > 0) {
_notifyRewardsSent(id, totalRewardsSent);
emit RewardsClaimed(account, id, totalRewardsSent);
}
}
function updateCalculatorPercentage(address calculator, uint256 percentage)
external
override
onlyOwner(msg.sender)
{
require(calculators[calculator].exists, "CALCULATOR_ISNT_ADDED");
uint256 oldPercentage = calculators[calculator].percentage;
uint256 newCurrentPercentage = currentPercentage.sub(oldPercentage).add(percentage);
require(newCurrentPercentage <= MAX_PERCENTAGE, "ACCUM_PERCENTAGE_EXCEEDS_MAX");
calculators[calculator].update(percentage);
currentPercentage = newCurrentPercentage;
emit CalculatorPercentageUpdated(msg.sender, calculator, percentage, currentPercentage);
}
function addCalculator(address newCalculator, uint256 percentage)
external
override
onlyOwner(msg.sender)
{
require(newCalculator.isContract(), "NEW_CALCULATOR_MUST_BE_CONTRACT");
require(!calculators[newCalculator].exists, "CALCULATOR_ALREADY_ADDED");
uint256 newCurrentPercentage = currentPercentage.add(percentage);
require(newCurrentPercentage <= MAX_PERCENTAGE, "ACCUM_PERCENTAGE_EXCEEDS_MAX");
calculators[newCalculator].create(percentage);
calculatorsList.add(newCalculator);
currentPercentage = newCurrentPercentage;
emit NewCalculatorAdded(msg.sender, newCalculator, percentage, currentPercentage);
}
function removeCalculator(address calculator) external override onlyOwner(msg.sender) {
require(calculators[calculator].exists, "CALCULATOR_DOESNT_EXIST");
uint256 percentage = calculators[calculator].percentage;
calculatorsList.remove(calculator);
calculators[calculator].remove();
currentPercentage = currentPercentage.sub(percentage);
emit CalculatorRemoved(msg.sender, calculator, percentage, currentPercentage);
}
function settings() external view override returns (address) {
return address(_settings());
}
function getAvailableRewards(uint256 periodId, address account)
external
view
override
returns (uint256)
{
if (currentPercentage != MAX_PERCENTAGE) {
return 0;
}
(
uint256 id,
uint256 startPeriodTimestamp,
,
uint256 endRedeemablePeriodTimestamp,
,
uint256 availableRewards,
bool exists
) = _getRewardPeriod(periodId);
if (
!exists ||
startPeriodTimestamp > block.timestamp ||
endRedeemablePeriodTimestamp < block.timestamp
) {
return 0;
}
uint256 rewardsForAccount = 0;
for (uint256 indexAt = 0; indexAt < calculatorsList.length; indexAt++) {
IRewardsCalculator rewardsCalculator = IRewardsCalculator(calculatorsList[indexAt]);
uint256 calculatorPercentage = calculators[calculatorsList[indexAt]].getPercentage();
uint256 calculatorAvailableRewards =
availableRewards.mul(calculatorPercentage).div(100);
uint256 availableRewardsForAcount =
rewardsCalculator.getRewards(
id,
account,
availableRewards,
calculatorAvailableRewards
);
rewardsForAccount = rewardsForAccount.add(availableRewardsForAcount);
}
return rewardsForAccount;
}
function getCalculators() external view override returns (address[] memory) {
return calculatorsList;
}
function hasCalculator(address calculator) external view override returns (bool) {
return calculators[calculator].exists;
}
function _notifyRewardsSent(uint256 period, uint256 totalRewardsSent) internal {
IRewardPeriodsRegistry rewardsRegistry = IRewardPeriodsRegistry(rewardPeriodsRegistry);
rewardsRegistry.notifyRewardsSent(period, totalRewardsSent);
}
function _getRewardPeriod(uint256 periodId)
internal
view
returns (
uint256 id,
uint256 startPeriodTimestamp,
uint256 endPeriodTimestamp,
uint256 endRedeemablePeriodTimestamp,
uint256 totalRewards,
uint256 availableRewards,
bool exists
)
{
IRewardPeriodsRegistry rewardsRegistry = IRewardPeriodsRegistry(rewardPeriodsRegistry);
(
id,
startPeriodTimestamp,
endPeriodTimestamp,
endRedeemablePeriodTimestamp,
totalRewards,
availableRewards,
exists
) = rewardsRegistry.getRewardPeriodById(periodId);
}
}
文件 16 的 18:RolesManagerConsts.sol
pragma solidity 0.6.12;
contract RolesManagerConsts {
bytes32 public constant OWNER_ROLE = keccak256("");
bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");
bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
bytes32 public constant CONFIGURATOR_ROLE = keccak256("CONFIGURATOR_ROLE");
bytes32 public constant VAULT_CONFIGURATOR_ROLE = keccak256("VAULT_CONFIGURATOR_ROLE");
}
文件 17 的 18:SafeMath.sol
pragma solidity ^0.6.0;
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;
}
}
文件 18 的 18:SettingsLib.sol
pragma solidity 0.6.12;
library SettingsLib {
struct Setting {
uint256 value;
uint256 min;
uint256 max;
bool exists;
}
function create(
Setting storage self,
uint256 value,
uint256 min,
uint256 max
) internal {
requireNotExists(self);
require(value >= min, "VALUE_MUST_BE_GT_MIN_VALUE");
require(value <= max, "VALUE_MUST_BE_LT_MAX_VALUE");
self.value = value;
self.min = min;
self.max = max;
self.exists = true;
}
function requireNotExists(Setting storage self) internal view {
require(!self.exists, "SETTING_ALREADY_EXISTS");
}
function requireExists(Setting storage self) internal view {
require(self.exists, "SETTING_NOT_EXISTS");
}
function update(Setting storage self, uint256 newValue) internal returns (uint256 oldValue) {
requireExists(self);
require(self.value != newValue, "NEW_VALUE_REQUIRED");
require(newValue >= self.min, "NEW_VALUE_MUST_BE_GT_MIN_VALUE");
require(newValue <= self.max, "NEW_VALUE_MUST_BE_LT_MAX_VALUE");
oldValue = self.value;
self.value = newValue;
}
function remove(Setting storage self) internal {
requireExists(self);
self.value = 0;
self.min = 0;
self.max = 0;
self.exists = false;
}
}
{
"compilationTarget": {
"contracts/minters/RewardsMinter.sol": "RewardsMinter"
},
"evmVersion": "istanbul",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"inputs":[{"internalType":"address","name":"rewardPeriodsRegistryAddress","type":"address"},{"internalType":"address","name":"settingsAddress","type":"address"},{"internalType":"address","name":"tokenAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"updater","type":"address"},{"indexed":true,"internalType":"address","name":"calulator","type":"address"},{"indexed":false,"internalType":"uint256","name":"newcalculatorPercentage","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"currentPercentage","type":"uint256"}],"name":"CalculatorPercentageUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"remover","type":"address"},{"indexed":true,"internalType":"address","name":"calulator","type":"address"},{"indexed":false,"internalType":"uint256","name":"calculatorPercentage","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"currentPercentage","type":"uint256"}],"name":"CalculatorRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"adder","type":"address"},{"indexed":true,"internalType":"address","name":"newCalulator","type":"address"},{"indexed":false,"internalType":"uint256","name":"calculatorPercentage","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"currentPercentage","type":"uint256"}],"name":"NewCalculatorAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"uint256","name":"periodId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardsClaimed","type":"event"},{"inputs":[{"internalType":"address","name":"newCalculator","type":"address"},{"internalType":"uint256","name":"percentage","type":"uint256"}],"name":"addCalculator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"calculators","outputs":[{"internalType":"uint256","name":"percentage","type":"uint256"},{"internalType":"bool","name":"paused","type":"bool"},{"internalType":"bool","name":"exists","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"calculatorsList","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"periodId","type":"uint256"}],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"periodId","type":"uint256"},{"internalType":"address","name":"account","type":"address"}],"name":"getAvailableRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCalculators","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"calculator","type":"address"}],"name":"hasCalculator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasMigrator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newContract","type":"address"},{"internalType":"bytes","name":"extraData","type":"bytes"}],"name":"migrateTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"calculator","type":"address"}],"name":"removeCalculator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardPeriodsRegistry","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newMigrator","type":"address"}],"name":"setMigrator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"settings","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IMintableERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"calculator","type":"address"},{"internalType":"uint256","name":"percentage","type":"uint256"}],"name":"updateCalculatorPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"}]