Source Code
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 261 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Approve | 13937465 | 380 days ago | IN | 0 ETH | 0.00000004 | ||||
| Approve | 9606579 | 481 days ago | IN | 0 ETH | 0.00000008 | ||||
| Approve | 9533506 | 482 days ago | IN | 0 ETH | 0.00000016 | ||||
| Approve | 9485320 | 483 days ago | IN | 0 ETH | 0.00000011 | ||||
| Approve | 9435986 | 485 days ago | IN | 0 ETH | 0.00000005 | ||||
| Approve | 9326514 | 487 days ago | IN | 0 ETH | 0.00000013 | ||||
| Approve | 9326509 | 487 days ago | IN | 0 ETH | 0.00000021 | ||||
| Approve | 9241150 | 489 days ago | IN | 0 ETH | 0.00000023 | ||||
| Approve | 9228778 | 489 days ago | IN | 0 ETH | 0.00000018 | ||||
| Approve | 9220035 | 490 days ago | IN | 0 ETH | 0.00000015 | ||||
| Approve | 9177422 | 491 days ago | IN | 0 ETH | 0.00000021 | ||||
| Approve | 9157414 | 491 days ago | IN | 0 ETH | 0.00000012 | ||||
| Approve | 9101142 | 492 days ago | IN | 0 ETH | 0.00000014 | ||||
| Approve | 9018108 | 494 days ago | IN | 0 ETH | 0.00000019 | ||||
| Approve | 8965393 | 495 days ago | IN | 0 ETH | 0.00000018 | ||||
| Approve | 8942894 | 496 days ago | IN | 0 ETH | 0.00000017 | ||||
| Approve | 8899984 | 497 days ago | IN | 0 ETH | 0.00000015 | ||||
| Approve | 8890568 | 497 days ago | IN | 0 ETH | 0.00000021 | ||||
| Approve | 8849095 | 498 days ago | IN | 0 ETH | 0.00000035 | ||||
| Approve | 8842247 | 498 days ago | IN | 0 ETH | 0.00000095 | ||||
| Approve | 8803045 | 499 days ago | IN | 0 ETH | 0.00000033 | ||||
| Approve | 8787069 | 500 days ago | IN | 0 ETH | 0.00000024 | ||||
| Approve | 8772722 | 500 days ago | IN | 0 ETH | 0.00000023 | ||||
| Approve | 8716386 | 501 days ago | IN | 0 ETH | 0.00000091 | ||||
| Approve | 8707605 | 501 days ago | IN | 0 ETH | 0.00000042 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Cross-Chain Transactions
Loading...
Loading
Contract Name:
PlaneToken
Compiler Version
v0.7.6+commit.7338295f
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity =0.7.6;
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/math/Math.sol";
import "@openzeppelin/contracts/math/SafeMath.sol";
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import './Blast.sol';
import "./interfaces/tokens/IPlaneToken.sol";
/*
* PLANE is Planar's native ERC20 token.
* It has an hard cap and manages its own emissions and allocations.
*/
contract PlaneToken is Ownable, ERC20("Planar Token", "PLANE"), IPlaneToken, Blast {
using SafeMath for uint256;
uint256 public constant MAX_EMISSION_RATE = 0.05 ether;
uint256 public constant MAX_SUPPLY_LIMIT = 10000000 ether;
uint256 public elasticMaxSupply; // Once deployed, controlled through governance only
uint256 public emissionRate; // Token emission per second
uint256 public override lastEmissionTime;
uint256 public masterReserve; // Pending rewards for the master
uint256 public constant ALLOCATION_PRECISION = 100;
// Allocations emitted over time. When < 100%, the rest is minted into the treasury (default 15%)
uint256 public farmingAllocation = 85; // = 85%
uint256 public legacyAllocation; // V1 holders allocation
address public masterAddress;
address public treasuryAddress;
address public constant BURN_ADDRESS = 0x000000000000000000000000000000000000dEaD;
constructor(uint256 maxSupply_, uint256 initialSupply, uint256 initialEmissionRate, address treasuryAddress_) {
require(initialEmissionRate <= MAX_EMISSION_RATE, "invalid emission rate");
require(maxSupply_ <= MAX_SUPPLY_LIMIT, "invalid initial maxSupply");
require(initialSupply < maxSupply_, "invalid initial supply");
require(treasuryAddress_ != address(0), "invalid treasury address");
elasticMaxSupply = maxSupply_;
emissionRate = initialEmissionRate;
treasuryAddress = treasuryAddress_;
_mint(msg.sender, initialSupply);
}
/********************************************/
/****************** EVENTS ******************/
/********************************************/
event ClaimMasterRewards(uint256 amount);
event AllocationsDistributed(uint256 masterShare, uint256 treasuryShare);
event InitializeMasterAddress(address masterAddress);
event InitializeEmissionStart(uint256 startTime);
event UpdateAllocations(uint256 farmingAllocation, uint256 legacyAllocation, uint256 treasuryAllocation);
event UpdateEmissionRate(uint256 previousEmissionRate, uint256 newEmissionRate);
event UpdateMaxSupply(uint256 previousMaxSupply, uint256 newMaxSupply);
event UpdateTreasuryAddress(address previousTreasuryAddress, address newTreasuryAddress);
/***********************************************/
/****************** MODIFIERS ******************/
/***********************************************/
/*
* @dev Throws error if called by any account other than the master
*/
modifier onlyMaster() {
require(msg.sender == masterAddress, "PlaneToken: caller is not the master");
_;
}
/**************************************************/
/****************** PUBLIC VIEWS ******************/
/**************************************************/
/**
* @dev Returns total master allocation
*/
function masterAllocation() public view returns (uint256) {
return farmingAllocation.add(legacyAllocation);
}
/**
* @dev Returns master emission rate
*/
function masterEmissionRate() public view override returns (uint256) {
return emissionRate.mul(farmingAllocation.add(legacyAllocation)).div(ALLOCATION_PRECISION);
}
/**
* @dev Returns treasury allocation
*/
function treasuryAllocation() public view returns (uint256) {
return uint256(ALLOCATION_PRECISION).sub(masterAllocation());
}
/*****************************************************************/
/****************** EXTERNAL PUBLIC FUNCTIONS ******************/
/*****************************************************************/
/**
* @dev Mint rewards and distribute it between master and treasury
*
* Treasury share is directly minted to the treasury address
* Master incentives are minted into this contract and claimed later by the master contract
*/
function emitAllocations() public {
uint256 circulatingSupply = totalSupply();
uint256 currentBlockTimestamp = _currentBlockTimestamp();
uint256 _lastEmissionTime = lastEmissionTime; // gas saving
uint256 _maxSupply = elasticMaxSupply; // gas saving
// if already up to date or not started
if (currentBlockTimestamp <= _lastEmissionTime || _lastEmissionTime == 0) {
return;
}
// if max supply is already reached or emissions deactivated
if (_maxSupply <= circulatingSupply || emissionRate == 0) {
lastEmissionTime = currentBlockTimestamp;
return;
}
uint256 newEmissions = currentBlockTimestamp.sub(_lastEmissionTime).mul(emissionRate);
// cap new emissions if exceeding max supply
if(_maxSupply < circulatingSupply.add(newEmissions)) {
newEmissions = _maxSupply.sub(circulatingSupply);
}
// calculate master and treasury shares from new emissions
uint256 masterShare = newEmissions.mul(masterAllocation()).div(ALLOCATION_PRECISION);
// sub to avoid rounding errors
uint256 treasuryShare = newEmissions.sub(masterShare);
lastEmissionTime = currentBlockTimestamp;
// add master shares to its claimable reserve
masterReserve = masterReserve.add(masterShare);
// mint shares
_mint(address(this), masterShare);
_mint(treasuryAddress, treasuryShare);
emit AllocationsDistributed(masterShare, treasuryShare);
}
/**
* @dev Sends to Master contract the asked "amount" from masterReserve
*
* Can only be called by the MasterContract
*/
function claimMasterRewards(uint256 amount) external override onlyMaster returns (uint256 effectiveAmount) {
// update emissions
emitAllocations();
// cap asked amount with available reserve
effectiveAmount = Math.min(masterReserve, amount);
// if no rewards to transfer
if (effectiveAmount == 0) {
return effectiveAmount;
}
// remove claimed rewards from reserve and transfer to master
masterReserve = masterReserve.sub(effectiveAmount);
_transfer(address(this), masterAddress, effectiveAmount);
emit ClaimMasterRewards(effectiveAmount);
}
/**
* @dev Burns "amount" of PLANE by sending it to BURN_ADDRESS
*/
function burn(uint256 amount) external override {
_transfer(msg.sender, BURN_ADDRESS, amount);
}
/*****************************************************************/
/****************** EXTERNAL OWNABLE FUNCTIONS ******************/
/*****************************************************************/
/**
* @dev Setup Master contract address
*
* Can only be initialized once
* Must only be called by the owner
*/
function initializeMasterAddress(address masterAddress_) external onlyOwner {
require(masterAddress == address(0), "initializeMasterAddress: master already initialized");
require(masterAddress_ != address(0), "initializeMasterAddress: master initialized to zero address");
masterAddress = masterAddress_;
emit InitializeMasterAddress(masterAddress_);
}
/**
* @dev Set emission start time
*
* Can only be initialized once
* Must only be called by the owner
*/
function initializeEmissionStart(uint256 startTime) external onlyOwner {
require(lastEmissionTime == 0, "initializeEmissionStart: emission start already initialized");
require(_currentBlockTimestamp() < startTime, "initializeEmissionStart: invalid");
lastEmissionTime = startTime;
emit InitializeEmissionStart(startTime);
}
/**
* @dev Updates emission allocations between farming incentives, legacy holders and treasury (remaining share)
*
* Must only be called by the owner
*/
function updateAllocations(uint256 farmingAllocation_, uint256 legacyAllocation_) external onlyOwner {
// apply emissions before changes
emitAllocations();
// total sum of allocations can't be > 100%
uint256 totalAllocationsSet = farmingAllocation_.add(legacyAllocation_);
require(totalAllocationsSet <= 100, "updateAllocations: total allocation is too high");
// set new allocations
farmingAllocation = farmingAllocation_;
legacyAllocation = legacyAllocation_;
emit UpdateAllocations(farmingAllocation_, legacyAllocation_, treasuryAllocation());
}
/**
* @dev Updates PLANE emission rate per second
*
* Must only be called by the owner
*/
function updateEmissionRate(uint256 emissionRate_) external onlyOwner {
require(emissionRate_ <= MAX_EMISSION_RATE, "updateEmissionRate: can't exceed maximum");
// apply emissions before changes
emitAllocations();
emit UpdateEmissionRate(emissionRate, emissionRate_);
emissionRate = emissionRate_;
}
/**
* @dev Updates PLANE max supply
*
* Must only be called by the owner
*/
function updateMaxSupply(uint256 maxSupply_) external onlyOwner {
require(maxSupply_ >= totalSupply(), "updateMaxSupply: can't be lower than current circulating supply");
require(maxSupply_ <= MAX_SUPPLY_LIMIT, "updateMaxSupply: invalid maxSupply");
emit UpdateMaxSupply(elasticMaxSupply, maxSupply_);
elasticMaxSupply = maxSupply_;
}
/**
* @dev Updates treasury address
*
* Must only be called by owner
*/
function updateTreasuryAddress(address treasuryAddress_) external onlyOwner {
require(treasuryAddress_ != address(0), "updateTreasuryAddress: invalid address");
emit UpdateTreasuryAddress(treasuryAddress, treasuryAddress_);
treasuryAddress = treasuryAddress_;
}
/********************************************************/
/****************** INTERNAL FUNCTIONS ******************/
/********************************************************/
/**
* @dev Utility function to get the current block timestamp
*/
function _currentBlockTimestamp() internal view virtual returns (uint256) {
/* solhint-disable not-rely-on-time */
return block.timestamp;
}
}// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
import "../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor () internal {
address msgSender = _msgSender();
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Standard math utilities missing in the Solidity language.
*/
library Math {
/**
* @dev Returns the largest of two numbers.
*/
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return a >= b ? a : b;
}
/**
* @dev Returns the smallest of two numbers.
*/
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two numbers. The result is rounded towards
* zero.
*/
function average(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b) / 2 can overflow, so we distribute
return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2);
}
}// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
/**
* @dev Returns the substraction of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b > a) return (false, 0);
return (true, a - b);
}
/**
* @dev Returns the multiplication of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
/**
* @dev Returns the division of two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b == 0) return (false, 0);
return (true, a / b);
}
/**
* @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b == 0) return (false, 0);
return (true, a % b);
}
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
require(b <= a, "SafeMath: subtraction overflow");
return a - b;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
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;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
require(b > 0, "SafeMath: division by zero");
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
require(b > 0, "SafeMath: modulo by zero");
return a % b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {trySub}.
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
return a - b;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting with custom message on
* division by zero. The result is rounded towards zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryDiv}.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting with custom message when dividing by zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryMod}.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
return a % b;
}
}// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
import "../../utils/Context.sol";
import "./IERC20.sol";
import "../../math/SafeMath.sol";
/**
* @dev Implementation of the {IERC20} interface.
*
* This implementation is agnostic to the way tokens are created. This means
* that a supply mechanism has to be added in a derived contract using {_mint}.
* For a generic mechanism see {ERC20PresetMinterPauser}.
*
* TIP: For a detailed writeup see our guide
* https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
* to implement supply mechanisms].
*
* We have followed general OpenZeppelin guidelines: functions revert instead
* of returning `false` on failure. This behavior is nonetheless conventional
* and does not conflict with the expectations of ERC20 applications.
*
* Additionally, an {Approval} event is emitted on calls to {transferFrom}.
* This allows applications to reconstruct the allowance for all accounts just
* by listening to said events. Other implementations of the EIP may not emit
* these events, as it isn't required by the specification.
*
* Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
* functions have been added to mitigate the well-known issues around setting
* allowances. See {IERC20-approve}.
*/
contract ERC20 is Context, IERC20 {
using SafeMath for uint256;
mapping (address => uint256) private _balances;
mapping (address => mapping (address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
uint8 private _decimals;
/**
* @dev Sets the values for {name} and {symbol}, initializes {decimals} with
* a default value of 18.
*
* To select a different value for {decimals}, use {_setupDecimals}.
*
* All three of these values are immutable: they can only be set once during
* construction.
*/
constructor (string memory name_, string memory symbol_) public {
_name = name_;
_symbol = symbol_;
_decimals = 18;
}
/**
* @dev Returns the name of the token.
*/
function name() public view virtual returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view virtual returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5,05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is
* called.
*
* NOTE: This information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/
function decimals() public view virtual returns (uint8) {
return _decimals;
}
/**
* @dev See {IERC20-totalSupply}.
*/
function totalSupply() public view virtual override returns (uint256) {
return _totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/
function balanceOf(address account) public view virtual override returns (uint256) {
return _balances[account];
}
/**
* @dev See {IERC20-transfer}.
*
* Requirements:
*
* - `recipient` cannot be the zero address.
* - the caller must have a balance of at least `amount`.
*/
function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(_msgSender(), recipient, amount);
return true;
}
/**
* @dev See {IERC20-allowance}.
*/
function allowance(address owner, address spender) public view virtual override returns (uint256) {
return _allowances[owner][spender];
}
/**
* @dev See {IERC20-approve}.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 amount) public virtual override returns (bool) {
_approve(_msgSender(), spender, amount);
return true;
}
/**
* @dev See {IERC20-transferFrom}.
*
* Emits an {Approval} event indicating the updated allowance. This is not
* required by the EIP. See the note at the beginning of {ERC20}.
*
* Requirements:
*
* - `sender` and `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
* - the caller must have allowance for ``sender``'s tokens of at least
* `amount`.
*/
function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(sender, recipient, amount);
_approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
return true;
}
/**
* @dev Atomically increases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
return true;
}
/**
* @dev Atomically decreases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `spender` must have allowance for the caller of at least
* `subtractedValue`.
*/
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
return true;
}
/**
* @dev Moves tokens `amount` from `sender` to `recipient`.
*
* This is internal function is equivalent to {transfer}, and can be used to
* e.g. implement automatic token fees, slashing mechanisms, etc.
*
* Emits a {Transfer} event.
*
* Requirements:
*
* - `sender` cannot be the zero address.
* - `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
*/
function _transfer(address sender, address recipient, uint256 amount) internal virtual {
require(sender != address(0), "ERC20: transfer from the zero address");
require(recipient != address(0), "ERC20: transfer to the zero address");
_beforeTokenTransfer(sender, recipient, amount);
_balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
_balances[recipient] = _balances[recipient].add(amount);
emit Transfer(sender, recipient, amount);
}
/** @dev Creates `amount` tokens and assigns them to `account`, increasing
* the total supply.
*
* Emits a {Transfer} event with `from` set to the zero address.
*
* Requirements:
*
* - `to` cannot be the zero address.
*/
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");
_beforeTokenTransfer(address(0), account, amount);
_totalSupply = _totalSupply.add(amount);
_balances[account] = _balances[account].add(amount);
emit Transfer(address(0), account, amount);
}
/**
* @dev Destroys `amount` tokens from `account`, reducing the
* total supply.
*
* Emits a {Transfer} event with `to` set to the zero address.
*
* Requirements:
*
* - `account` cannot be the zero address.
* - `account` must have at least `amount` tokens.
*/
function _burn(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: burn from the zero address");
_beforeTokenTransfer(account, address(0), amount);
_balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
_totalSupply = _totalSupply.sub(amount);
emit Transfer(account, address(0), amount);
}
/**
* @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
*
* This internal function is equivalent to `approve`, and can be used to
* e.g. set automatic allowances for certain subsystems, etc.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `owner` cannot be the zero address.
* - `spender` cannot be the zero address.
*/
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);
}
/**
* @dev Sets {decimals} to a value other than the default one of 18.
*
* WARNING: This function should only be called from the constructor. Most
* applications that interact with token contracts will not expect
* {decimals} to ever change, and may work incorrectly if it does.
*/
function _setupDecimals(uint8 decimals_) internal virtual {
_decimals = decimals_;
}
/**
* @dev Hook that is called before any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* will be to transferred to `to`.
* - when `from` is zero, `amount` tokens will be minted for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens will be burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
}// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
/*
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with GSN meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address payable) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes memory) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0;
import "./interfaces/IBlast.sol";
import "./interfaces/IERC20Rebasing.sol";
import "./interfaces/IBlastPoints.sol";
contract Blast {
address public collector = 0xdD4Bb1Ee1EcdB10e18ea81CD28F30ecb81Ac34eA;
// Blast Native Contracts
IBlast public constant BLAST = IBlast(0x4300000000000000000000000000000000000002);
IERC20Rebasing public constant USDBBLAST = IERC20Rebasing(0x4300000000000000000000000000000000000003);
IERC20Rebasing public constant WETHBLAST = IERC20Rebasing(0x4300000000000000000000000000000000000004);
IBlastPoints public constant BLASTPOINTS = IBlastPoints(0x2536FE9ab3F511540F2f9e2eC2A805005C3Dd800);
constructor() public {
BLAST.configureClaimableYield(); // Configuring the yield for ETH deposits of this contract (if any) to be claimable
BLAST.configureClaimableGas(); // Configuring the Gas Revenue collected by this contract to be claimable
BLAST.configureGovernor(collector); // Setting Governor to manage the ETH yield and Gas Revenue. Initially set to the deployer
WETHBLAST.configure(IERC20Rebasing.YieldMode.CLAIMABLE); // Configuring the yield for WETH deposits of this contract (if any) to be claimable
USDBBLAST.configure(IERC20Rebasing.YieldMode.CLAIMABLE); // Configuring the yield for USDB deposits of this contract (if any) to be claimable
BLASTPOINTS.configurePointsOperator(collector); // Configure Blast Points
}
/***********************************************/
/****************** MODIFIERS ******************/
/***********************************************/
/**
* @dev Check if caller is the collector
*/
modifier onlyCollector() {
require(collector == msg.sender, "Blast: caller is not the collector");
_;
}
/*******************************************************/
/****************** COLLECTOR FUNCTIONS ****************/
/*******************************************************/
/**
* @dev Calls claim function of WETH and USDB deposits (if any) for this contract to transfer the yield to the recipient
*
* Must only be called by the collector
*/
function claimWethAndUsdbYield(address recipient, uint256 amount) public onlyCollector {
WETHBLAST.claim(recipient, amount);
USDBBLAST.claim(recipient, amount);
}
function setCollector(address _collector) external onlyCollector {
collector = _collector;
}
}// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0;
// Blast Contract Interface
interface IBlast{
function configureClaimableYield() external;
function configureClaimableGas() external;
function configureGovernor(address _governor) external;
}// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0;
interface IBlastPoints {
function configurePointsOperator(address operator) external;
}// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0;
interface IERC20Rebasing {
enum YieldMode {
AUTOMATIC,
VOID,
CLAIMABLE
}
// changes the yield mode of the caller and update the balance
// to reflect the configuration
function configure(YieldMode) external returns (uint256);
// "claimable" yield mode accounts can call this this claim their yield
// to another address
function claim(address recipient, uint256 amount) external returns (uint256);
// read the claimable amount for an account
function getClaimableAmount(address account) external view returns (uint256);
}// SPDX-License-Identifier: MIT
pragma solidity =0.7.6;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
interface IPlaneToken is IERC20{
function lastEmissionTime() external view returns (uint256);
function claimMasterRewards(uint256 amount) external returns (uint256 effectiveAmount);
function masterEmissionRate() external view returns (uint256);
function burn(uint256 amount) external;
}{
"optimizer": {
"enabled": true,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"uint256","name":"maxSupply_","type":"uint256"},{"internalType":"uint256","name":"initialSupply","type":"uint256"},{"internalType":"uint256","name":"initialEmissionRate","type":"uint256"},{"internalType":"address","name":"treasuryAddress_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"masterShare","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":"ClaimMasterRewards","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":"masterAddress","type":"address"}],"name":"InitializeMasterAddress","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":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":"farmingAllocation","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"legacyAllocation","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":"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":"BLAST","outputs":[{"internalType":"contract IBlast","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BLASTPOINTS","outputs":[{"internalType":"contract IBlastPoints","name":"","type":"address"}],"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":"USDBBLAST","outputs":[{"internalType":"contract IERC20Rebasing","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETHBLAST","outputs":[{"internalType":"contract IERC20Rebasing","name":"","type":"address"}],"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":"claimMasterRewards","outputs":[{"internalType":"uint256","name":"effectiveAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"claimWethAndUsdbYield","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"collector","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"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":[],"name":"farmingAllocation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"uint256","name":"startTime","type":"uint256"}],"name":"initializeEmissionStart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"masterAddress_","type":"address"}],"name":"initializeMasterAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastEmissionTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"legacyAllocation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"masterAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"masterAllocation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"masterEmissionRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"masterReserve","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":"_collector","type":"address"}],"name":"setCollector","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":"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":"sender","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":[{"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":"farmingAllocation_","type":"uint256"},{"internalType":"uint256","name":"legacyAllocation_","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":"uint256","name":"maxSupply_","type":"uint256"}],"name":"updateMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"treasuryAddress_","type":"address"}],"name":"updateTreasuryAddress","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405260068054610100600160a81b03191674dd4bb1ee1ecdb10e18ea81cd28f30ecb81ac34ea001790556055600b553480156200003e57600080fd5b50604051620027e8380380620027e8833981810160405260808110156200006457600080fd5b50805160208083015160408085015160609095015181518083018352600c81526b283630b730b9102a37b5b2b760a11b8186015282518084019093526005835264504c414e4560d81b94830194909452939491939192906000620000c7620005c1565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508151620001269060049060208501906200073f565b5080516200013c9060059060208401906200073f565b50506006805460ff19166012179055506040805163784c3b3d60e11b815290517343000000000000000000000000000000000000029163f098767a91600480830192600092919082900301818387803b1580156200019957600080fd5b505af1158015620001ae573d6000803e3d6000fd5b505050507343000000000000000000000000000000000000026001600160a01b0316634e606c476040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200020257600080fd5b505af115801562000217573d6000803e3d6000fd5b505060065460408051631d70c8d360e31b81526101009092046001600160a01b0316600483015251734300000000000000000000000000000000000002935063eb8646989250602480830192600092919082900301818387803b1580156200027e57600080fd5b505af115801562000293573d6000803e3d6000fd5b5050604051631a33757d60e01b81527343000000000000000000000000000000000000049250631a33757d915060029060040180828152602001915050602060405180830381600087803b158015620002eb57600080fd5b505af115801562000300573d6000803e3d6000fd5b505050506040513d60208110156200031757600080fd5b5050604051631a33757d60e01b815273430000000000000000000000000000000000000390631a33757d9060029060040180828152602001915050602060405180830381600087803b1580156200036d57600080fd5b505af115801562000382573d6000803e3d6000fd5b505050506040513d60208110156200039957600080fd5b5050600654604080516336b91f2b60e01b81526101009092046001600160a01b0316600483015251732536fe9ab3f511540f2f9e2ec2a805005c3dd800916336b91f2b91602480830192600092919082900301818387803b158015620003fe57600080fd5b505af115801562000413573d6000803e3d6000fd5b5050505066b1a2bc2ec5000082111562000474576040805162461bcd60e51b815260206004820152601560248201527f696e76616c696420656d697373696f6e20726174650000000000000000000000604482015290519081900360640190fd5b6a084595161401484a000000841115620004d5576040805162461bcd60e51b815260206004820152601960248201527f696e76616c696420696e697469616c206d6178537570706c7900000000000000604482015290519081900360640190fd5b8383106200052a576040805162461bcd60e51b815260206004820152601660248201527f696e76616c696420696e697469616c20737570706c7900000000000000000000604482015290519081900360640190fd5b6001600160a01b03811662000586576040805162461bcd60e51b815260206004820152601860248201527f696e76616c696420747265617375727920616464726573730000000000000000604482015290519081900360640190fd5b60078490556008829055600e80546001600160a01b0319166001600160a01b038316179055620005b73384620005c5565b50505050620007eb565b3390565b6001600160a01b03821662000621576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b6200062f60008383620006d8565b6200064b81600354620006dd60201b6200170f1790919060201c565b6003556001600160a01b038216600090815260016020908152604090912054620006809183906200170f620006dd821b17901c565b6001600160a01b03831660008181526001602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b505050565b60008282018381101562000738576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620007775760008555620007c2565b82601f106200079257805160ff1916838001178555620007c2565b82800160010185558215620007c2579182015b82811115620007c2578251825591602001919060010190620007a5565b50620007d0929150620007d4565b5090565b5b80821115620007d05760008155600101620007d5565b611fed80620007fb6000396000f3fe608060405234801561001057600080fd5b506004361061027e5760003560e01c8063781357051161015c578063b71144a4116100ce578063ed424fd011610087578063ed424fd014610646578063f103b4331461064e578063f2fde38b1461066b578063fb5b82d014610691578063fc1852fb146106b7578063fccc2813146106d45761027e565b8063b71144a4146105d5578063c5f956af146105f8578063c68bb4c514610600578063d365a08e14610608578063dd62ed3e14610610578063e4ef9dce1461063e5761027e565b806395d89b411161012057806395d89b411461055d57806396afc4501461056557806397d757761461056d578063a457c2d714610575578063a9059cbb146105a1578063b10c8fb9146105cd5761027e565b80637813570514610502578063841e45611461051f5780638da5cb5b146105455780638f88bba31461054d578063913e77ad146105555761027e565b806342966c68116101f557806360cfe755116101b957806360cfe7551461047a578063617d11261461049e57806367c0f278146104a657806370a08231146104cc578063715018a6146104f2578063728e616f146104fa5761027e565b806342966c6814610419578063436cc3d614610436578063439af45e1461043e57806348045e11146104465780634f3147ba146104725761027e565b806318160ddd1161024757806318160ddd1461038157806323b872dd1461038957806327dede2d146103bf578063313ce567146103c757806339509351146103e557806339eb4189146104115761027e565b80624fbf6b146102835780630495d11c1461029d57806306fdde03146102a5578063095ea7b3146103225780630ba84cd214610362575b600080fd5b61028b6106dc565b60408051918252519081900360200190f35b61028b6106e1565b6102ad6106e7565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102e75781810151838201526020016102cf565b50505050905090810190601f1680156103145780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61034e6004803603604081101561033857600080fd5b506001600160a01b03813516906020013561077d565b604080519115158252519081900360200190f35b61037f6004803603602081101561037857600080fd5b503561079b565b005b61028b61088d565b61034e6004803603606081101561039f57600080fd5b506001600160a01b03813581169160208101359091169060400135610893565b61028b61091a565b6103cf610920565b6040805160ff9092168252519081900360200190f35b61034e600480360360408110156103fb57600080fd5b506001600160a01b038135169060200135610929565b61028b610977565b61037f6004803603602081101561042f57600080fd5b50356109ac565b61028b6109bc565b61028b6109c7565b61037f6004803603604081101561045c57600080fd5b506001600160a01b0381351690602001356109cd565b61028b610b23565b610482610b38565b604080516001600160a01b039092168252519081900360200190f35b61028b610b43565b61037f600480360360208110156104bc57600080fd5b50356001600160a01b0316610b52565b61028b600480360360208110156104e257600080fd5b50356001600160a01b0316610c95565b61037f610cb4565b610482610d60565b61028b6004803603602081101561051857600080fd5b5035610d78565b61037f6004803603602081101561053557600080fd5b50356001600160a01b0316610e44565b610482610f55565b61028b610f64565b610482610f6a565b6102ad610f7e565b61028b610fdf565b610482610fe5565b61034e6004803603604081101561058b57600080fd5b506001600160a01b038135169060200135610ff0565b61034e600480360360408110156105b757600080fd5b506001600160a01b038135169060200135611058565b61048261106c565b61037f600480360360408110156105eb57600080fd5b5080359060200135611077565b610482611186565b61028b611195565b6104826111ae565b61028b6004803603604081101561062657600080fd5b506001600160a01b03813581169160200135166111bd565b61037f6111e8565b61028b611320565b61037f6004803603602081101561066457600080fd5b5035611326565b61037f6004803603602081101561068157600080fd5b50356001600160a01b031661145a565b61037f600480360360208110156106a757600080fd5b50356001600160a01b031661155c565b61037f600480360360208110156106cd57600080fd5b50356115d2565b610482611709565b606481565b600c5481565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156107735780601f1061074857610100808354040283529160200191610773565b820191906000526020600020905b81548152906001019060200180831161075657829003601f168201915b5050505050905090565b600061079161078a611770565b8484611774565b5060015b92915050565b6107a3611770565b6001600160a01b03166107b4610f55565b6001600160a01b0316146107fd576040805162461bcd60e51b81526020600482018190526024820152600080516020611e1f833981519152604482015290519081900360640190fd5b66b1a2bc2ec500008111156108435760405162461bcd60e51b8152600401808060200182810382526028815260200180611eea6028913960400191505060405180910390fd5b61084b6111e8565b600854604080519182526020820183905280517f16b9091836a63537907593ebc3a80f3528891f3575b10f58ad7dd9c29fd0d44f9281900390910190a1600855565b60035490565b60006108a0848484611860565b610910846108ac611770565b61090b85604051806060016040528060288152602001611df7602891396001600160a01b038a166000908152600260205260408120906108ea611770565b6001600160a01b0316815260208101919091526040016000205491906119bd565b611774565b5060019392505050565b600a5481565b60065460ff1690565b6000610791610936611770565b8461090b8560026000610947611770565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549061170f565b60006109a760646109a1610998600c54600b5461170f90919063ffffffff16565b60085490611a54565b90611aad565b905090565b6109b93361dead83611860565b50565b66b1a2bc2ec5000081565b60095481565b60065461010090046001600160a01b03163314610a1b5760405162461bcd60e51b8152600401808060200182810382526022815260200180611f366022913960400191505060405180910390fd5b60408051635569f64b60e11b81526001600160a01b03841660048201526024810183905290516004604360981b019163aad3ec969160448083019260209291908290030181600087803b158015610a7157600080fd5b505af1158015610a85573d6000803e3d6000fd5b505050506040513d6020811015610a9b57600080fd5b505060408051635569f64b60e11b81526001600160a01b03841660048201526024810183905290516003604360981b019163aad3ec969160448083019260209291908290030181600087803b158015610af357600080fd5b505af1158015610b07573d6000803e3d6000fd5b505050506040513d6020811015610b1d57600080fd5b50505050565b60006109a7610b30611195565b606490611b14565b6004604360981b0181565b6a084595161401484a00000081565b610b5a611770565b6001600160a01b0316610b6b610f55565b6001600160a01b031614610bb4576040805162461bcd60e51b81526020600482018190526024820152600080516020611e1f833981519152604482015290519081900360640190fd5b600d546001600160a01b031615610bfc5760405162461bcd60e51b8152600401808060200182810382526033815260200180611eb76033913960400191505060405180910390fd5b6001600160a01b038116610c415760405162461bcd60e51b815260040180806020018281038252603b815260200180611d9b603b913960400191505060405180910390fd5b600d80546001600160a01b0383166001600160a01b0319909116811790915560408051918252517fcba13eb1e65d2c1588ce6d10f862f4535cc67855c3f31e3d2732f8fb6b5317b29181900360200190a150565b6001600160a01b0381166000908152600160205260409020545b919050565b610cbc611770565b6001600160a01b0316610ccd610f55565b6001600160a01b031614610d16576040805162461bcd60e51b81526020600482018190526024820152600080516020611e1f833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b732536fe9ab3f511540f2f9e2ec2a805005c3dd80081565b600d546000906001600160a01b03163314610dc45760405162461bcd60e51b8152600401808060200182810382526024815260200180611f126024913960400191505060405180910390fd5b610dcc6111e8565b610dd8600a5483611b71565b905080610de457610caf565b600a54610df19082611b14565b600a55600d54610e0c9030906001600160a01b031683611860565b6040805182815290517f45102e9ef2c4f14fd9f3e8510c4bb2ad67fe498584602f26647da23039f125319181900360200190a1919050565b610e4c611770565b6001600160a01b0316610e5d610f55565b6001600160a01b031614610ea6576040805162461bcd60e51b81526020600482018190526024820152600080516020611e1f833981519152604482015290519081900360640190fd5b6001600160a01b038116610eeb5760405162461bcd60e51b8152600401808060200182810382526026815260200180611d366026913960400191505060405180910390fd5b600e54604080516001600160a01b039283168152918316602083015280517f5634a90413b79beba6c5f37aa8f19d1aee84a5320ff20ac7bd1ac63280867d5c9281900390910190a1600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031690565b600b5481565b60065461010090046001600160a01b031681565b60058054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156107735780601f1061074857610100808354040283529160200191610773565b60085481565b6002604360981b0181565b6000610791610ffd611770565b8461090b85604051806060016040528060258152602001611f936025913960026000611027611770565b6001600160a01b03908116825260208083019390935260409182016000908120918d168152925290205491906119bd565b6000610791611065611770565b8484611860565b6003604360981b0181565b61107f611770565b6001600160a01b0316611090610f55565b6001600160a01b0316146110d9576040805162461bcd60e51b81526020600482018190526024820152600080516020611e1f833981519152604482015290519081900360640190fd5b6110e16111e8565b60006110ed838361170f565b9050606481111561112f5760405162461bcd60e51b815260040180806020018281038252602f815260200180611e64602f913960400191505060405180910390fd5b600b839055600c8290557fa4a1bde80c0d4ba37d1bd0feec135fb515a9def4e8baee90221348069946b86c8383611164610b23565b60408051938452602084019290925282820152519081900360600190a1505050565b600e546001600160a01b031681565b60006109a7600c54600b5461170f90919063ffffffff16565b600d546001600160a01b031681565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b60006111f261088d565b905060006111fe611b87565b600954600754919250908183111580611215575081155b15611223575050505061131e565b83811115806112325750600854155b156112425750506009555061131e565b60085460009061125c906112568686611b14565b90611a54565b9050611268858261170f565b82101561127c576112798286611b14565b90505b600061129560646109a161128e611195565b8590611a54565b905060006112a38383611b14565b6009879055600a549091506112b8908361170f565b600a556112c53083611b8b565b600e546112db906001600160a01b031682611b8b565b604080518381526020810183905281517f26c155e7637ca49a34c19c7f8cb8533322897de0808134df1a98f71557111684929181900390910190a1505050505050505b565b60075481565b61132e611770565b6001600160a01b031661133f610f55565b6001600160a01b031614611388576040805162461bcd60e51b81526020600482018190526024820152600080516020611e1f833981519152604482015290519081900360640190fd5b61139061088d565b8110156113ce5760405162461bcd60e51b815260040180806020018281038252603f815260200180611d5c603f913960400191505060405180910390fd5b6a084595161401484a0000008111156114185760405162461bcd60e51b8152600401808060200182810382526022815260200180611cee6022913960400191505060405180910390fd5b600754604080519182526020820183905280517f6a84334bf6663b783f2bbfcaf459b2cbc73570cf346a46d9e6a0f290fcf3ebfc9281900390910190a1600755565b611462611770565b6001600160a01b0316611473610f55565b6001600160a01b0316146114bc576040805162461bcd60e51b81526020600482018190526024820152600080516020611e1f833981519152604482015290519081900360640190fd5b6001600160a01b0381166115015760405162461bcd60e51b8152600401808060200182810382526026815260200180611ca66026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60065461010090046001600160a01b031633146115aa5760405162461bcd60e51b8152600401808060200182810382526022815260200180611f366022913960400191505060405180910390fd5b600680546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6115da611770565b6001600160a01b03166115eb610f55565b6001600160a01b031614611634576040805162461bcd60e51b81526020600482018190526024820152600080516020611e1f833981519152604482015290519081900360640190fd5b600954156116735760405162461bcd60e51b815260040180806020018281038252603b815260200180611f58603b913960400191505060405180910390fd5b8061167c611b87565b106116ce576040805162461bcd60e51b815260206004820181905260248201527f696e697469616c697a65456d697373696f6e53746172743a20696e76616c6964604482015290519081900360640190fd5b60098190556040805182815290517f10e116be9bb4f621259f592ccd7e00d783e796535f2a5f3bc91a79da0fc3456d9181900360200190a150565b61dead81565b600082820183811015611769576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b3390565b6001600160a01b0383166117b95760405162461bcd60e51b8152600401808060200182810382526024815260200180611e936024913960400191505060405180910390fd5b6001600160a01b0382166117fe5760405162461bcd60e51b8152600401808060200182810382526022815260200180611ccc6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260026020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b0383166118a55760405162461bcd60e51b8152600401808060200182810382526025815260200180611e3f6025913960400191505060405180910390fd5b6001600160a01b0382166118ea5760405162461bcd60e51b8152600401808060200182810382526023815260200180611c836023913960400191505060405180910390fd5b6118f5838383611c7d565b61193281604051806060016040528060268152602001611d10602691396001600160a01b03861660009081526001602052604090205491906119bd565b6001600160a01b038085166000908152600160205260408082209390935590841681522054611961908261170f565b6001600160a01b0380841660008181526001602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008184841115611a4c5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611a115781810151838201526020016119f9565b50505050905090810190601f168015611a3e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600082611a6357506000610795565b82820282848281611a7057fe5b04146117695760405162461bcd60e51b8152600401808060200182810382526021815260200180611dd66021913960400191505060405180910390fd5b6000808211611b03576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381611b0c57fe5b049392505050565b600082821115611b6b576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6000818310611b805781611769565b5090919050565b4290565b6001600160a01b038216611be6576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b611bf260008383611c7d565b600354611bff908261170f565b6003556001600160a01b038216600090815260016020526040902054611c25908261170f565b6001600160a01b03831660008181526001602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b50505056fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f20616464726573737570646174654d6178537570706c793a20696e76616c6964206d6178537570706c7945524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63657570646174655472656173757279416464726573733a20696e76616c696420616464726573737570646174654d6178537570706c793a2063616e2774206265206c6f776572207468616e2063757272656e742063697263756c6174696e6720737570706c79696e697469616c697a654d6173746572416464726573733a206d617374657220696e697469616c697a656420746f207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657245524332303a207472616e736665722066726f6d20746865207a65726f2061646472657373757064617465416c6c6f636174696f6e733a20746f74616c20616c6c6f636174696f6e20697320746f6f206869676845524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373696e697469616c697a654d6173746572416464726573733a206d617374657220616c726561647920696e697469616c697a6564757064617465456d697373696f6e526174653a2063616e277420657863656564206d6178696d756d506c616e65546f6b656e3a2063616c6c6572206973206e6f7420746865206d6173746572426c6173743a2063616c6c6572206973206e6f742074686520636f6c6c6563746f72696e697469616c697a65456d697373696f6e53746172743a20656d697373696f6e20737461727420616c726561647920696e697469616c697a656445524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122093c6074bf813f40e9afb439b64017b6a95f52ca5aef02916f89edfd885685d1b64736f6c63430007060033000000000000000000000000000000000000000000084595161401484a0000000000000000000000000000000000000000000000000669205782b4319fc000000000000000000000000000000000000000000000000000000058d15e17628000000000000000000000000000919d64eb3fd67879ea34e9e512979fe9710066d4
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061027e5760003560e01c8063781357051161015c578063b71144a4116100ce578063ed424fd011610087578063ed424fd014610646578063f103b4331461064e578063f2fde38b1461066b578063fb5b82d014610691578063fc1852fb146106b7578063fccc2813146106d45761027e565b8063b71144a4146105d5578063c5f956af146105f8578063c68bb4c514610600578063d365a08e14610608578063dd62ed3e14610610578063e4ef9dce1461063e5761027e565b806395d89b411161012057806395d89b411461055d57806396afc4501461056557806397d757761461056d578063a457c2d714610575578063a9059cbb146105a1578063b10c8fb9146105cd5761027e565b80637813570514610502578063841e45611461051f5780638da5cb5b146105455780638f88bba31461054d578063913e77ad146105555761027e565b806342966c68116101f557806360cfe755116101b957806360cfe7551461047a578063617d11261461049e57806367c0f278146104a657806370a08231146104cc578063715018a6146104f2578063728e616f146104fa5761027e565b806342966c6814610419578063436cc3d614610436578063439af45e1461043e57806348045e11146104465780634f3147ba146104725761027e565b806318160ddd1161024757806318160ddd1461038157806323b872dd1461038957806327dede2d146103bf578063313ce567146103c757806339509351146103e557806339eb4189146104115761027e565b80624fbf6b146102835780630495d11c1461029d57806306fdde03146102a5578063095ea7b3146103225780630ba84cd214610362575b600080fd5b61028b6106dc565b60408051918252519081900360200190f35b61028b6106e1565b6102ad6106e7565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102e75781810151838201526020016102cf565b50505050905090810190601f1680156103145780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61034e6004803603604081101561033857600080fd5b506001600160a01b03813516906020013561077d565b604080519115158252519081900360200190f35b61037f6004803603602081101561037857600080fd5b503561079b565b005b61028b61088d565b61034e6004803603606081101561039f57600080fd5b506001600160a01b03813581169160208101359091169060400135610893565b61028b61091a565b6103cf610920565b6040805160ff9092168252519081900360200190f35b61034e600480360360408110156103fb57600080fd5b506001600160a01b038135169060200135610929565b61028b610977565b61037f6004803603602081101561042f57600080fd5b50356109ac565b61028b6109bc565b61028b6109c7565b61037f6004803603604081101561045c57600080fd5b506001600160a01b0381351690602001356109cd565b61028b610b23565b610482610b38565b604080516001600160a01b039092168252519081900360200190f35b61028b610b43565b61037f600480360360208110156104bc57600080fd5b50356001600160a01b0316610b52565b61028b600480360360208110156104e257600080fd5b50356001600160a01b0316610c95565b61037f610cb4565b610482610d60565b61028b6004803603602081101561051857600080fd5b5035610d78565b61037f6004803603602081101561053557600080fd5b50356001600160a01b0316610e44565b610482610f55565b61028b610f64565b610482610f6a565b6102ad610f7e565b61028b610fdf565b610482610fe5565b61034e6004803603604081101561058b57600080fd5b506001600160a01b038135169060200135610ff0565b61034e600480360360408110156105b757600080fd5b506001600160a01b038135169060200135611058565b61048261106c565b61037f600480360360408110156105eb57600080fd5b5080359060200135611077565b610482611186565b61028b611195565b6104826111ae565b61028b6004803603604081101561062657600080fd5b506001600160a01b03813581169160200135166111bd565b61037f6111e8565b61028b611320565b61037f6004803603602081101561066457600080fd5b5035611326565b61037f6004803603602081101561068157600080fd5b50356001600160a01b031661145a565b61037f600480360360208110156106a757600080fd5b50356001600160a01b031661155c565b61037f600480360360208110156106cd57600080fd5b50356115d2565b610482611709565b606481565b600c5481565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156107735780601f1061074857610100808354040283529160200191610773565b820191906000526020600020905b81548152906001019060200180831161075657829003601f168201915b5050505050905090565b600061079161078a611770565b8484611774565b5060015b92915050565b6107a3611770565b6001600160a01b03166107b4610f55565b6001600160a01b0316146107fd576040805162461bcd60e51b81526020600482018190526024820152600080516020611e1f833981519152604482015290519081900360640190fd5b66b1a2bc2ec500008111156108435760405162461bcd60e51b8152600401808060200182810382526028815260200180611eea6028913960400191505060405180910390fd5b61084b6111e8565b600854604080519182526020820183905280517f16b9091836a63537907593ebc3a80f3528891f3575b10f58ad7dd9c29fd0d44f9281900390910190a1600855565b60035490565b60006108a0848484611860565b610910846108ac611770565b61090b85604051806060016040528060288152602001611df7602891396001600160a01b038a166000908152600260205260408120906108ea611770565b6001600160a01b0316815260208101919091526040016000205491906119bd565b611774565b5060019392505050565b600a5481565b60065460ff1690565b6000610791610936611770565b8461090b8560026000610947611770565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549061170f565b60006109a760646109a1610998600c54600b5461170f90919063ffffffff16565b60085490611a54565b90611aad565b905090565b6109b93361dead83611860565b50565b66b1a2bc2ec5000081565b60095481565b60065461010090046001600160a01b03163314610a1b5760405162461bcd60e51b8152600401808060200182810382526022815260200180611f366022913960400191505060405180910390fd5b60408051635569f64b60e11b81526001600160a01b03841660048201526024810183905290516004604360981b019163aad3ec969160448083019260209291908290030181600087803b158015610a7157600080fd5b505af1158015610a85573d6000803e3d6000fd5b505050506040513d6020811015610a9b57600080fd5b505060408051635569f64b60e11b81526001600160a01b03841660048201526024810183905290516003604360981b019163aad3ec969160448083019260209291908290030181600087803b158015610af357600080fd5b505af1158015610b07573d6000803e3d6000fd5b505050506040513d6020811015610b1d57600080fd5b50505050565b60006109a7610b30611195565b606490611b14565b6004604360981b0181565b6a084595161401484a00000081565b610b5a611770565b6001600160a01b0316610b6b610f55565b6001600160a01b031614610bb4576040805162461bcd60e51b81526020600482018190526024820152600080516020611e1f833981519152604482015290519081900360640190fd5b600d546001600160a01b031615610bfc5760405162461bcd60e51b8152600401808060200182810382526033815260200180611eb76033913960400191505060405180910390fd5b6001600160a01b038116610c415760405162461bcd60e51b815260040180806020018281038252603b815260200180611d9b603b913960400191505060405180910390fd5b600d80546001600160a01b0383166001600160a01b0319909116811790915560408051918252517fcba13eb1e65d2c1588ce6d10f862f4535cc67855c3f31e3d2732f8fb6b5317b29181900360200190a150565b6001600160a01b0381166000908152600160205260409020545b919050565b610cbc611770565b6001600160a01b0316610ccd610f55565b6001600160a01b031614610d16576040805162461bcd60e51b81526020600482018190526024820152600080516020611e1f833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b732536fe9ab3f511540f2f9e2ec2a805005c3dd80081565b600d546000906001600160a01b03163314610dc45760405162461bcd60e51b8152600401808060200182810382526024815260200180611f126024913960400191505060405180910390fd5b610dcc6111e8565b610dd8600a5483611b71565b905080610de457610caf565b600a54610df19082611b14565b600a55600d54610e0c9030906001600160a01b031683611860565b6040805182815290517f45102e9ef2c4f14fd9f3e8510c4bb2ad67fe498584602f26647da23039f125319181900360200190a1919050565b610e4c611770565b6001600160a01b0316610e5d610f55565b6001600160a01b031614610ea6576040805162461bcd60e51b81526020600482018190526024820152600080516020611e1f833981519152604482015290519081900360640190fd5b6001600160a01b038116610eeb5760405162461bcd60e51b8152600401808060200182810382526026815260200180611d366026913960400191505060405180910390fd5b600e54604080516001600160a01b039283168152918316602083015280517f5634a90413b79beba6c5f37aa8f19d1aee84a5320ff20ac7bd1ac63280867d5c9281900390910190a1600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031690565b600b5481565b60065461010090046001600160a01b031681565b60058054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156107735780601f1061074857610100808354040283529160200191610773565b60085481565b6002604360981b0181565b6000610791610ffd611770565b8461090b85604051806060016040528060258152602001611f936025913960026000611027611770565b6001600160a01b03908116825260208083019390935260409182016000908120918d168152925290205491906119bd565b6000610791611065611770565b8484611860565b6003604360981b0181565b61107f611770565b6001600160a01b0316611090610f55565b6001600160a01b0316146110d9576040805162461bcd60e51b81526020600482018190526024820152600080516020611e1f833981519152604482015290519081900360640190fd5b6110e16111e8565b60006110ed838361170f565b9050606481111561112f5760405162461bcd60e51b815260040180806020018281038252602f815260200180611e64602f913960400191505060405180910390fd5b600b839055600c8290557fa4a1bde80c0d4ba37d1bd0feec135fb515a9def4e8baee90221348069946b86c8383611164610b23565b60408051938452602084019290925282820152519081900360600190a1505050565b600e546001600160a01b031681565b60006109a7600c54600b5461170f90919063ffffffff16565b600d546001600160a01b031681565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b60006111f261088d565b905060006111fe611b87565b600954600754919250908183111580611215575081155b15611223575050505061131e565b83811115806112325750600854155b156112425750506009555061131e565b60085460009061125c906112568686611b14565b90611a54565b9050611268858261170f565b82101561127c576112798286611b14565b90505b600061129560646109a161128e611195565b8590611a54565b905060006112a38383611b14565b6009879055600a549091506112b8908361170f565b600a556112c53083611b8b565b600e546112db906001600160a01b031682611b8b565b604080518381526020810183905281517f26c155e7637ca49a34c19c7f8cb8533322897de0808134df1a98f71557111684929181900390910190a1505050505050505b565b60075481565b61132e611770565b6001600160a01b031661133f610f55565b6001600160a01b031614611388576040805162461bcd60e51b81526020600482018190526024820152600080516020611e1f833981519152604482015290519081900360640190fd5b61139061088d565b8110156113ce5760405162461bcd60e51b815260040180806020018281038252603f815260200180611d5c603f913960400191505060405180910390fd5b6a084595161401484a0000008111156114185760405162461bcd60e51b8152600401808060200182810382526022815260200180611cee6022913960400191505060405180910390fd5b600754604080519182526020820183905280517f6a84334bf6663b783f2bbfcaf459b2cbc73570cf346a46d9e6a0f290fcf3ebfc9281900390910190a1600755565b611462611770565b6001600160a01b0316611473610f55565b6001600160a01b0316146114bc576040805162461bcd60e51b81526020600482018190526024820152600080516020611e1f833981519152604482015290519081900360640190fd5b6001600160a01b0381166115015760405162461bcd60e51b8152600401808060200182810382526026815260200180611ca66026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60065461010090046001600160a01b031633146115aa5760405162461bcd60e51b8152600401808060200182810382526022815260200180611f366022913960400191505060405180910390fd5b600680546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6115da611770565b6001600160a01b03166115eb610f55565b6001600160a01b031614611634576040805162461bcd60e51b81526020600482018190526024820152600080516020611e1f833981519152604482015290519081900360640190fd5b600954156116735760405162461bcd60e51b815260040180806020018281038252603b815260200180611f58603b913960400191505060405180910390fd5b8061167c611b87565b106116ce576040805162461bcd60e51b815260206004820181905260248201527f696e697469616c697a65456d697373696f6e53746172743a20696e76616c6964604482015290519081900360640190fd5b60098190556040805182815290517f10e116be9bb4f621259f592ccd7e00d783e796535f2a5f3bc91a79da0fc3456d9181900360200190a150565b61dead81565b600082820183811015611769576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b3390565b6001600160a01b0383166117b95760405162461bcd60e51b8152600401808060200182810382526024815260200180611e936024913960400191505060405180910390fd5b6001600160a01b0382166117fe5760405162461bcd60e51b8152600401808060200182810382526022815260200180611ccc6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260026020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b0383166118a55760405162461bcd60e51b8152600401808060200182810382526025815260200180611e3f6025913960400191505060405180910390fd5b6001600160a01b0382166118ea5760405162461bcd60e51b8152600401808060200182810382526023815260200180611c836023913960400191505060405180910390fd5b6118f5838383611c7d565b61193281604051806060016040528060268152602001611d10602691396001600160a01b03861660009081526001602052604090205491906119bd565b6001600160a01b038085166000908152600160205260408082209390935590841681522054611961908261170f565b6001600160a01b0380841660008181526001602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008184841115611a4c5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611a115781810151838201526020016119f9565b50505050905090810190601f168015611a3e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600082611a6357506000610795565b82820282848281611a7057fe5b04146117695760405162461bcd60e51b8152600401808060200182810382526021815260200180611dd66021913960400191505060405180910390fd5b6000808211611b03576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381611b0c57fe5b049392505050565b600082821115611b6b576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6000818310611b805781611769565b5090919050565b4290565b6001600160a01b038216611be6576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b611bf260008383611c7d565b600354611bff908261170f565b6003556001600160a01b038216600090815260016020526040902054611c25908261170f565b6001600160a01b03831660008181526001602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b50505056fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f20616464726573737570646174654d6178537570706c793a20696e76616c6964206d6178537570706c7945524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63657570646174655472656173757279416464726573733a20696e76616c696420616464726573737570646174654d6178537570706c793a2063616e2774206265206c6f776572207468616e2063757272656e742063697263756c6174696e6720737570706c79696e697469616c697a654d6173746572416464726573733a206d617374657220696e697469616c697a656420746f207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657245524332303a207472616e736665722066726f6d20746865207a65726f2061646472657373757064617465416c6c6f636174696f6e733a20746f74616c20616c6c6f636174696f6e20697320746f6f206869676845524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373696e697469616c697a654d6173746572416464726573733a206d617374657220616c726561647920696e697469616c697a6564757064617465456d697373696f6e526174653a2063616e277420657863656564206d6178696d756d506c616e65546f6b656e3a2063616c6c6572206973206e6f7420746865206d6173746572426c6173743a2063616c6c6572206973206e6f742074686520636f6c6c6563746f72696e697469616c697a65456d697373696f6e53746172743a20656d697373696f6e20737461727420616c726561647920696e697469616c697a656445524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122093c6074bf813f40e9afb439b64017b6a95f52ca5aef02916f89edfd885685d1b64736f6c63430007060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000084595161401484a0000000000000000000000000000000000000000000000000669205782b4319fc000000000000000000000000000000000000000000000000000000058d15e17628000000000000000000000000000919d64eb3fd67879ea34e9e512979fe9710066d4
-----Decoded View---------------
Arg [0] : maxSupply_ (uint256): 10000000000000000000000000
Arg [1] : initialSupply (uint256): 7750000000000000000000000
Arg [2] : initialEmissionRate (uint256): 25000000000000000
Arg [3] : treasuryAddress_ (address): 0x919d64EB3FD67879EA34E9E512979fe9710066d4
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000000000000000000000084595161401484a000000
Arg [1] : 0000000000000000000000000000000000000000000669205782b4319fc00000
Arg [2] : 0000000000000000000000000000000000000000000000000058d15e17628000
Arg [3] : 000000000000000000000000919d64eb3fd67879ea34e9e512979fe9710066d4
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.