编译器
0.8.10+commit.fc410830
文件 1 的 9: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;
}
}
文件 2 的 9: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 {}
}
文件 3 的 9: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);
}
文件 4 的 9: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);
}
文件 5 的 9:IOATH.sol
pragma solidity ^0.8.10;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
interface IOATH is IERC20 {
function lastEmissionTime() external view returns (uint256);
function claimMasterV2Rewards(uint256 amount) external returns (uint256 effectiveAmount);
function claimMasterV3Rewards(uint256 amount) external returns (uint256 effectiveAmount);
function masterV3EmissionRate() external view returns (uint256);
function masterV2EmissionRate() external view returns (uint256);
function burn(uint256 amount) external;
}
文件 6 的 9:Math.sol
pragma solidity ^0.8.0;
library Math {
enum Rounding {
Down,
Up,
Zero
}
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return a > b ? a : b;
}
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
function average(uint256 a, uint256 b) internal pure returns (uint256) {
return (a & b) + (a ^ b) / 2;
}
function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
return a == 0 ? 0 : (a - 1) / b + 1;
}
function mulDiv(
uint256 x,
uint256 y,
uint256 denominator
) internal pure returns (uint256 result) {
unchecked {
uint256 prod0;
uint256 prod1;
assembly {
let mm := mulmod(x, y, not(0))
prod0 := mul(x, y)
prod1 := sub(sub(mm, prod0), lt(mm, prod0))
}
if (prod1 == 0) {
return prod0 / denominator;
}
require(denominator > prod1);
uint256 remainder;
assembly {
remainder := mulmod(x, y, denominator)
prod1 := sub(prod1, gt(remainder, prod0))
prod0 := sub(prod0, remainder)
}
uint256 twos = denominator & (~denominator + 1);
assembly {
denominator := div(denominator, twos)
prod0 := div(prod0, twos)
twos := add(div(sub(0, twos), twos), 1)
}
prod0 |= prod1 * twos;
uint256 inverse = (3 * denominator) ^ 2;
inverse *= 2 - denominator * inverse;
inverse *= 2 - denominator * inverse;
inverse *= 2 - denominator * inverse;
inverse *= 2 - denominator * inverse;
inverse *= 2 - denominator * inverse;
inverse *= 2 - denominator * inverse;
result = prod0 * inverse;
return result;
}
}
function mulDiv(
uint256 x,
uint256 y,
uint256 denominator,
Rounding rounding
) internal pure returns (uint256) {
uint256 result = mulDiv(x, y, denominator);
if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
result += 1;
}
return result;
}
function sqrt(uint256 a) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
uint256 result = 1 << (log2(a) >> 1);
unchecked {
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
return min(result, a / result);
}
}
function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = sqrt(a);
return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
}
}
function log2(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 128;
}
if (value >> 64 > 0) {
value >>= 64;
result += 64;
}
if (value >> 32 > 0) {
value >>= 32;
result += 32;
}
if (value >> 16 > 0) {
value >>= 16;
result += 16;
}
if (value >> 8 > 0) {
value >>= 8;
result += 8;
}
if (value >> 4 > 0) {
value >>= 4;
result += 4;
}
if (value >> 2 > 0) {
value >>= 2;
result += 2;
}
if (value >> 1 > 0) {
result += 1;
}
}
return result;
}
function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log2(value);
return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
}
}
function log10(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >= 10**64) {
value /= 10**64;
result += 64;
}
if (value >= 10**32) {
value /= 10**32;
result += 32;
}
if (value >= 10**16) {
value /= 10**16;
result += 16;
}
if (value >= 10**8) {
value /= 10**8;
result += 8;
}
if (value >= 10**4) {
value /= 10**4;
result += 4;
}
if (value >= 10**2) {
value /= 10**2;
result += 2;
}
if (value >= 10**1) {
result += 1;
}
}
return result;
}
function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log10(value);
return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
}
}
function log256(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 16;
}
if (value >> 64 > 0) {
value >>= 64;
result += 8;
}
if (value >> 32 > 0) {
value >>= 32;
result += 4;
}
if (value >> 16 > 0) {
value >>= 16;
result += 2;
}
if (value >> 8 > 0) {
result += 1;
}
}
return result;
}
function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log256(value);
return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
}
}
}
文件 7 的 9:OATH.sol
pragma solidity ^0.8.10;
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/math/Math.sol";
import "@openzeppelin/contracts/utils/math/SafeMath.sol";
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "contracts/interfaces/IOATH.sol";
contract OATH is Ownable, ERC20("Throne", "OATH"), IOATH {
using SafeMath for uint256;
uint256 public constant MAX_EMISSION_RATE = 1 ether;
uint256 public constant MAX_SUPPLY_LIMIT = 20_000_000 ether;
uint256 public elasticMaxSupply;
uint256 public emissionRate;
uint256 public override lastEmissionTime;
uint256 public masterV2Reserve;
uint256 public masterV3Reserve;
uint256 public constant ALLOCATION_PRECISION = 100;
uint256 public masterV2Allocation = 0;
uint256 public masterV3Allocation = 96;
address public masterV2Address;
address public masterV3Address;
address public treasuryAddress;
address public constant BURN_ADDRESS = 0x000000000000000000000000000000000000dEaD;
mapping(address => bool) public isExcludedFromMaxWallet;
uint256 public maxWallet;
bool public isMaxWalletEnabled = true;
uint256 public constant MAX_WALLET_PRECISION = 10000;
constructor(
uint256 maxSupply_,
uint256 initialSupply,
uint256 initialEmissionRate,
uint256 maxWallet_,
address treasuryAddress_
) {
require(initialEmissionRate <= MAX_EMISSION_RATE, "OATH: invalid emission rate");
require(maxSupply_ <= MAX_SUPPLY_LIMIT, "OATH: invalid initial maxSupply");
require(maxWallet_ <= MAX_WALLET_PRECISION, "OATH: invalid maxWallet");
require(initialSupply < maxSupply_, "OATH: invalid initial supply");
require(treasuryAddress_ != address(0), "OATH: invalid treasury address");
elasticMaxSupply = maxSupply_;
emissionRate = initialEmissionRate;
treasuryAddress = treasuryAddress_;
maxWallet = maxWallet_;
isExcludedFromMaxWallet[address(this)] = true;
isExcludedFromMaxWallet[msg.sender] = true;
isExcludedFromMaxWallet[treasuryAddress] = true;
isExcludedFromMaxWallet[BURN_ADDRESS] = true;
_mint(msg.sender, initialSupply);
}
event ClaimMasterV2Rewards(uint256 amount);
event ClaimMasterV3Rewards(uint256 amount);
event AllocationsDistributed(uint256 masterV2Share, uint256 masterV3Share, uint256 treasuryShare);
event InitializeMasterAddress(address masterV2Address, address masterV3Address);
event InitializeEmissionStart(uint256 startTime);
event UpdateAllocations(uint256 v2FarmingAllocation, uint256 v3FarmingAllocation, uint256 treasuryAllocation);
event UpdateEmissionRate(uint256 previousEmissionRate, uint256 newEmissionRate);
event UpdateMaxSupply(uint256 previousMaxSupply, uint256 newMaxSupply);
event UpdateMaxWallet(uint256 previousMaxWallet, uint256 newMaxWallet);
event UpdateTreasuryAddress(address previousTreasuryAddress, address newTreasuryAddress);
event SetExcludeMaxWallet(address account, bool excluded);
event MaxWalletDisabled();
modifier onlyMasterV2() {
require(msg.sender == masterV2Address, "OATH: caller is not the master");
_;
}
modifier onlyMasterV3() {
require(msg.sender == masterV3Address, "OATH: caller is not the master");
_;
}
function _transfer(address sender, address recipient, uint256 amount) internal override {
if (isMaxWalletEnabled && !isExcludedFromMaxWallet[recipient]) {
uint256 maxWalletTokens = maxWallet.mul(totalSupply()).div(MAX_WALLET_PRECISION);
require(balanceOf(recipient).add(amount) <= maxWalletTokens, "OATH: wallet balance limit exceeded");
}
super._transfer(sender, recipient, amount);
}
function masterV2EmissionRate() public view override returns (uint256) {
return emissionRate.mul(masterV2Allocation).div(ALLOCATION_PRECISION);
}
function masterV3EmissionRate() public view override returns (uint256) {
return emissionRate.mul(masterV3Allocation).div(ALLOCATION_PRECISION);
}
function treasuryAllocation() public view returns (uint256) {
return uint256(ALLOCATION_PRECISION).sub(masterV2Allocation).sub(masterV3Allocation);
}
function emitAllocations() public {
uint256 circulatingSupply = totalSupply();
uint256 currentBlockTimestamp = _currentBlockTimestamp();
uint256 _lastEmissionTime = lastEmissionTime;
uint256 _maxSupply = elasticMaxSupply;
if (currentBlockTimestamp <= _lastEmissionTime || _lastEmissionTime == 0) {
return;
}
if (_maxSupply <= circulatingSupply || emissionRate == 0) {
lastEmissionTime = currentBlockTimestamp;
return;
}
uint256 newEmissions = currentBlockTimestamp.sub(_lastEmissionTime).mul(emissionRate);
if (_maxSupply < circulatingSupply.add(newEmissions)) {
newEmissions = _maxSupply.sub(circulatingSupply);
}
uint256 masterV2Share = newEmissions.mul(masterV2Allocation).div(ALLOCATION_PRECISION);
uint256 masterV3Share = newEmissions.mul(masterV3Allocation).div(ALLOCATION_PRECISION);
uint256 treasuryShare = newEmissions.sub(masterV2Share).sub(masterV3Share);
lastEmissionTime = currentBlockTimestamp;
masterV2Reserve = masterV2Reserve.add(masterV2Share);
masterV3Reserve = masterV3Reserve.add(masterV3Share);
_mint(address(this), masterV2Share);
_mint(address(this), masterV3Share);
_mint(treasuryAddress, treasuryShare);
emit AllocationsDistributed(masterV2Share, masterV3Share, treasuryShare);
}
function claimMasterV2Rewards(uint256 amount) external override onlyMasterV2 returns (uint256 effectiveAmount) {
emitAllocations();
effectiveAmount = Math.min(masterV2Reserve, amount);
if (effectiveAmount == 0) {
return effectiveAmount;
}
masterV2Reserve = masterV2Reserve.sub(effectiveAmount);
_transfer(address(this), masterV2Address, effectiveAmount);
emit ClaimMasterV2Rewards(effectiveAmount);
}
function claimMasterV3Rewards(uint256 amount) external override onlyMasterV3 returns (uint256 effectiveAmount) {
emitAllocations();
effectiveAmount = Math.min(masterV3Reserve, amount);
if (effectiveAmount == 0) {
return effectiveAmount;
}
masterV3Reserve = masterV3Reserve.sub(effectiveAmount);
_transfer(address(this), masterV3Address, effectiveAmount);
emit ClaimMasterV2Rewards(effectiveAmount);
}
function burn(uint256 amount) external override {
_transfer(msg.sender, BURN_ADDRESS, amount);
}
function updateMasterV3Addresses(address masterV3Address_) external onlyOwner {
require(masterV3Address_ != address(0), "OATH:initializeMasterAddresses: master initialized to zero addresses");
isExcludedFromMaxWallet[masterV3Address_] = true;
masterV3Address = masterV3Address_;
emit InitializeMasterAddress(address(0), masterV3Address_);
}
function updateMasterV2Addresses(address masterV2Address_) external onlyOwner {
require(masterV2Address_ != address(0), "OATH:initializeMasterAddresses: master initialized to zero addresses");
isExcludedFromMaxWallet[masterV2Address_] = true;
masterV2Address = masterV2Address_;
emit InitializeMasterAddress(masterV2Address_, address(0));
}
function initializeEmissionStart(uint256 startTime) external onlyOwner {
require(lastEmissionTime == 0, "OATH:initializeEmissionStart: emission start already initialized");
require(_currentBlockTimestamp() < startTime, "OATH:initializeEmissionStart: invalid");
lastEmissionTime = startTime;
emit InitializeEmissionStart(startTime);
}
function updateAllocations(uint256 masterV2Allocation_, uint256 masterV3Allocation_) external onlyOwner {
emitAllocations();
uint256 totalAllocationsSet = masterV2Allocation_.add(masterV3Allocation_);
require(totalAllocationsSet <= 100, "OATH:updateAllocations: total allocation is too high");
masterV2Allocation = masterV2Allocation_;
masterV3Allocation = masterV3Allocation_;
emit UpdateAllocations(masterV2Allocation_, masterV3Allocation_, treasuryAllocation());
}
function updateEmissionRate(uint256 emissionRate_) external onlyOwner {
require(emissionRate_ <= MAX_EMISSION_RATE, "OATH:updateEmissionRate: can't exceed maximum");
emitAllocations();
emit UpdateEmissionRate(emissionRate, emissionRate_);
emissionRate = emissionRate_;
}
function updateMaxSupply(uint256 maxSupply_) external onlyOwner {
require(maxSupply_ >= totalSupply(), "OATH:updateMaxSupply: can't be lower than current circulating supply");
require(maxSupply_ <= MAX_SUPPLY_LIMIT, "OATH:updateMaxSupply: invalid maxSupply");
emit UpdateMaxSupply(elasticMaxSupply, maxSupply_);
elasticMaxSupply = maxSupply_;
}
function updateMaxWallet(uint256 maxWallet_) external onlyOwner {
require(maxWallet_ >= maxWallet, "OATH:updateMaxWallet: can't be lower than current max wallet");
require(maxWallet_ <= MAX_WALLET_PRECISION, "OATH:updateMaxWallet: invalid maxWallet");
emit UpdateMaxWallet(maxWallet, maxWallet_);
maxWallet = maxWallet_;
}
function updateTreasuryAddress(address treasuryAddress_) external onlyOwner {
require(treasuryAddress_ != address(0), "OATH:updateTreasuryAddress: invalid address");
emit UpdateTreasuryAddress(treasuryAddress, treasuryAddress_);
treasuryAddress = treasuryAddress_;
}
function disableMaxWallet() external onlyOwner {
require(isMaxWalletEnabled, "OATH:disableMaxWallet: already disabled");
emit MaxWalletDisabled();
isMaxWalletEnabled = false;
}
function setExcludeMaxWallet(address for_, bool exclude_) external onlyOwner {
isExcludedFromMaxWallet[for_] = exclude_;
emit SetExcludeMaxWallet(for_, exclude_);
}
function _currentBlockTimestamp() internal view virtual returns (uint256) {
return block.timestamp;
}
}
文件 8 的 9:Ownable.sol
pragma solidity ^0.8.0;
import "../utils/Context.sol";
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor() {
_transferOwnership(_msgSender());
}
modifier onlyOwner() {
_checkOwner();
_;
}
function owner() public view virtual returns (address) {
return _owner;
}
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
文件 9 的 9:SafeMath.sol
pragma solidity ^0.8.0;
library SafeMath {
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
}
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b > a) return (false, 0);
return (true, a - b);
}
}
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
}
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a / b);
}
}
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a % b);
}
}
function add(uint256 a, uint256 b) internal pure returns (uint256) {
return a + b;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return a - b;
}
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
return a * b;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return a / b;
}
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return a % b;
}
function sub(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b <= a, errorMessage);
return a - b;
}
}
function div(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a / b;
}
}
function mod(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a % b;
}
}
}
{
"compilationTarget": {
"contracts/OATH.sol": "OATH"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 999
},
"remappings": []
}
[{"inputs":[{"internalType":"uint256","name":"maxSupply_","type":"uint256"},{"internalType":"uint256","name":"initialSupply","type":"uint256"},{"internalType":"uint256","name":"initialEmissionRate","type":"uint256"},{"internalType":"uint256","name":"maxWallet_","type":"uint256"},{"internalType":"address","name":"treasuryAddress_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"masterV2Share","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"masterV3Share","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"treasuryShare","type":"uint256"}],"name":"AllocationsDistributed","type":"event"},{"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":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ClaimMasterV2Rewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ClaimMasterV3Rewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"startTime","type":"uint256"}],"name":"InitializeEmissionStart","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"masterV2Address","type":"address"},{"indexed":false,"internalType":"address","name":"masterV3Address","type":"address"}],"name":"InitializeMasterAddress","type":"event"},{"anonymous":false,"inputs":[],"name":"MaxWalletDisabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"excluded","type":"bool"}],"name":"SetExcludeMaxWallet","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":"uint256","name":"v2FarmingAllocation","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"v3FarmingAllocation","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"treasuryAllocation","type":"uint256"}],"name":"UpdateAllocations","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previousEmissionRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newEmissionRate","type":"uint256"}],"name":"UpdateEmissionRate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previousMaxSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newMaxSupply","type":"uint256"}],"name":"UpdateMaxSupply","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previousMaxWallet","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newMaxWallet","type":"uint256"}],"name":"UpdateMaxWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousTreasuryAddress","type":"address"},{"indexed":false,"internalType":"address","name":"newTreasuryAddress","type":"address"}],"name":"UpdateTreasuryAddress","type":"event"},{"inputs":[],"name":"ALLOCATION_PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BURN_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_EMISSION_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_WALLET_PRECISION","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":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"claimMasterV2Rewards","outputs":[{"internalType":"uint256","name":"effectiveAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"claimMasterV3Rewards","outputs":[{"internalType":"uint256","name":"effectiveAmount","type":"uint256"}],"stateMutability":"nonpayable","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":"disableMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"elasticMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emissionRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emitAllocations","outputs":[],"stateMutability":"nonpayable","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":"uint256","name":"startTime","type":"uint256"}],"name":"initializeEmissionStart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromMaxWallet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isMaxWalletEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastEmissionTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"masterV2Address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"masterV2Allocation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"masterV2EmissionRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"masterV2Reserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"masterV3Address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"masterV3Allocation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"masterV3EmissionRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"masterV3Reserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"for_","type":"address"},{"internalType":"bool","name":"exclude_","type":"bool"}],"name":"setExcludeMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","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":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasuryAllocation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"masterV2Allocation_","type":"uint256"},{"internalType":"uint256","name":"masterV3Allocation_","type":"uint256"}],"name":"updateAllocations","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"emissionRate_","type":"uint256"}],"name":"updateEmissionRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"masterV2Address_","type":"address"}],"name":"updateMasterV2Addresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"masterV3Address_","type":"address"}],"name":"updateMasterV3Addresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxSupply_","type":"uint256"}],"name":"updateMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxWallet_","type":"uint256"}],"name":"updateMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"treasuryAddress_","type":"address"}],"name":"updateTreasuryAddress","outputs":[],"stateMutability":"nonpayable","type":"function"}]