Source Code
More Info
Private Name Tags
ContractCreator
TokenTracker
Multichain Info
Latest 25 from a total of 458 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Enable Mining | 56835004 | 7 days ago | IN | 0.01058262 CELO | 0.00358812 | ||||
| Enable Mining | 56834536 | 7 days ago | IN | 0.01058276 CELO | 0.00334891 | ||||
| Enable Mining | 56834453 | 7 days ago | IN | 0.01058279 CELO | 0.0032293 | ||||
| Enable Mining | 56834388 | 7 days ago | IN | 0.01058281 CELO | 0.0031097 | ||||
| Enable Mining | 56834341 | 7 days ago | IN | 0.01058282 CELO | 0.0031097 | ||||
| Approve | 56834011 | 7 days ago | IN | 0 CELO | 0.00174696 | ||||
| Mining | 56833733 | 7 days ago | IN | 0 CELO | 0.00262947 | ||||
| Approve | 56832820 | 7 days ago | IN | 0 CELO | 0.00174924 | ||||
| Approve | 56830529 | 7 days ago | IN | 0 CELO | 0.00174696 | ||||
| Mining | 56830317 | 7 days ago | IN | 0 CELO | 0.00262947 | ||||
| Mining | 56829456 | 7 days ago | IN | 0 CELO | 0.00262947 | ||||
| Approve | 56828754 | 7 days ago | IN | 0 CELO | 0.00174696 | ||||
| Mining | 56828451 | 7 days ago | IN | 0 CELO | 0.00262947 | ||||
| Approve | 56827417 | 7 days ago | IN | 0 CELO | 0.00174696 | ||||
| Approve | 56826464 | 7 days ago | IN | 0 CELO | 0.00071301 | ||||
| Approve | 56826430 | 7 days ago | IN | 0 CELO | 0.00078861 | ||||
| Mining | 56826088 | 7 days ago | IN | 0 CELO | 0.00262947 | ||||
| Mining | 55525414 | 22 days ago | IN | 0 CELO | 0.00262947 | ||||
| Mining | 55525110 | 22 days ago | IN | 0 CELO | 0.00262947 | ||||
| Mining | 55524963 | 22 days ago | IN | 0 CELO | 0.00262947 | ||||
| Mining | 46395563 | 128 days ago | IN | 0 CELO | 0.00262947 | ||||
| Mining | 46395387 | 128 days ago | IN | 0 CELO | 0.00262947 | ||||
| Mining | 43115876 | 166 days ago | IN | 0 CELO | 0.00348963 | ||||
| Mining | 43113848 | 166 days ago | IN | 0 CELO | 0.00257675 | ||||
| Mining | 42320032 | 175 days ago | IN | 0 CELO | 0.00262947 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 56835004 | 7 days ago | 0.00005291 CELO | ||||
| 56835004 | 7 days ago | 0.00005291 CELO | ||||
| 56834536 | 7 days ago | 0.00005291 CELO | ||||
| 56834536 | 7 days ago | 0.00005291 CELO | ||||
| 56834453 | 7 days ago | 0.00005291 CELO | ||||
| 56834453 | 7 days ago | 0.00005291 CELO | ||||
| 56834388 | 7 days ago | 0.00005291 CELO | ||||
| 56834388 | 7 days ago | 0.00005291 CELO | ||||
| 56834341 | 7 days ago | 0.00005291 CELO | ||||
| 56834341 | 7 days ago | 0.00005291 CELO | ||||
| 43116137 | 166 days ago | 0.51890466 CELO | ||||
| 43115958 | 166 days ago | 1.03774215 CELO | ||||
| 43115461 | 166 days ago | 0.01855432 CELO | ||||
| 43115461 | 166 days ago | 0.01855432 CELO | ||||
| 43115461 | 166 days ago | 3.71086472 CELO | ||||
| 43115215 | 166 days ago | 0.00003038 CELO | ||||
| 43115215 | 166 days ago | 0.00003038 CELO | ||||
| 43115215 | 166 days ago | 0.00607653 CELO | ||||
| 43115215 | 166 days ago | 0.04861229 CELO | ||||
| 43115097 | 166 days ago | 0.00497 CELO | ||||
| 43115097 | 166 days ago | 0.00497 CELO | ||||
| 43115097 | 166 days ago | 0.994 CELO | ||||
| 43114986 | 166 days ago | 0.00003038 CELO | ||||
| 43114986 | 166 days ago | 0.00003038 CELO | ||||
| 43114986 | 166 days ago | 0.00607653 CELO |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
TimeToken
Compiler Version
v0.8.19+commit.7dd6d404
Optimization Enabled:
Yes with 2000000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/utils/math/Math.sol";
import "@openzeppelin/contracts/utils/math/SafeMath.sol";
/**
* @title TIME Token contract
* @notice Smart contract used for main interaction with the TIME tokenomics system
**/
contract TimeToken is IERC20 {
using Math for uint256;
using SafeMath for uint256;
event Mining(address indexed miner, uint256 amount, uint256 blockNumber);
event Donation(address indexed donator, uint256 donatedAmount);
bool private _isMintLocked = false;
bool private _isOperationLocked;
uint8 private constant _decimals = 18;
address public constant DEVELOPER_ADDRESS = 0x731591207791A93fB0Ec481186fb086E16A7d6D0;
uint256 private constant FACTOR = 10**18;
uint256 private constant D = 10**_decimals;
uint256 public constant BASE_FEE = 4 ether; // 10 ether; (Polygon) | 0.1 ether; (BSC) | 20 ether; (Fantom) | 0.01 ether; (Ethereum) | 30 ether; (Evmos)
uint256 public constant COMISSION_RATE = 2;
uint256 public constant SHARE_RATE = 4;
uint256 public constant TIME_BASE_LIQUIDITY = 400_000 * D; // 200000 * D; (Polygon, Evmos and BSC) | 400000 * D; (Fantom) | 40000 * D; (Ethereum) | 2000000 * D; (Arbitrum)
uint256 public constant TIME_BASE_FEE = 9_600_000 * D; // 4800000 * D; (Polygon, Evmos and BSC) | 9600000 * D; (Fantom) | 960000 * D; (Ethereum)
uint256 public constant TOLERANCE = 10;
uint256 private _totalSupply;
uint256 public dividendPerToken;
uint256 public firstBlock;
uint256 public liquidityFactorNative = 11;
uint256 public liquidityFactorTime = 20;
uint256 public numberOfHolders;
uint256 public numberOfMiners;
uint256 public sharedBalance;
uint256 public poolBalance;
uint256 public totalMinted;
string private _name;
string private _symbol;
mapping (address => bool) public isMiningAllowed;
mapping (address => uint256) private _balances;
mapping (address => uint256) private _consumedDividendPerToken;
mapping (address => uint256) private _credits;
mapping (address => uint256) private _lastBalances;
mapping (address => uint256) private _lastBlockMined;
mapping (address => mapping (address => uint256)) private _allowances;
constructor(
string memory name_,
string memory symbol_
) {
_name = name_;
_symbol = symbol_;
firstBlock = block.number;
}
modifier nonReentrant() {
require(!_isOperationLocked, "TIME: This operation is locked for security reasons");
_isOperationLocked = true;
_;
_isOperationLocked = false;
}
receive() external payable {
saveTime();
}
fallback() external payable {
require(msg.data.length == 0);
saveTime();
}
function name() public view returns (string memory) {
return _name;
}
function symbol() public view returns (string memory) {
return _symbol;
}
function decimals() public pure returns (uint8) {
return _decimals;
}
function totalSupply() external view override returns (uint256) {
return _totalSupply;
}
function balanceOf(address account) external override view returns (uint256) {
return _balances[account];
}
function burn(uint256 amount) public {
_burn(msg.sender, amount);
}
function transfer(address to, uint256 amount) external override returns (bool success) {
if (to == address(this))
success = spendTime(amount);
else
success = _transfer(msg.sender, to, amount);
return success;
}
function allowance(address owner, address spender) external override view returns (uint256) {
return _allowances[owner][spender];
}
function approve(address spender, uint256 amount) external override returns (bool) {
_approve(msg.sender, spender, amount);
return true;
}
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
_approve(msg.sender, spender, _allowances[msg.sender][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
return true;
}
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
_approve(msg.sender, spender, _allowances[msg.sender][spender].add(addedValue));
return true;
}
function transferFrom(
address from,
address to,
uint256 amount
) external override returns (bool success) {
success = _transfer(from, to, amount);
_approve(from, msg.sender, _allowances[from][msg.sender].sub(amount, "ERC20: transfer amount exceeds allowance"));
return success;
}
function _afterTokenTransfer(
address from,
address to,
uint256 amount
) internal virtual {
if (_balances[to] > 0 && to != address(0) && to != address(this) && _lastBalances[to] != _balances[to] && _lastBalances[to] == 0)
numberOfHolders++;
if (_balances[from] == 0 && from != address(0) && to != address(this) && _lastBalances[from] != _balances[from])
numberOfHolders--;
_lastBalances[from] = _balances[from];
_lastBalances[to] = _balances[to];
}
function _beforeTokenTransfer(
address from,
address to,
uint256 amount
) internal virtual {
_credit(from);
_credit(to);
_lastBalances[from] = _balances[from];
_lastBalances[to] = _balances[to];
}
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 _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 _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");
_beforeTokenTransfer(address(0), account, amount);
_totalSupply += amount;
totalMinted += amount;
_balances[account] += amount;
emit Transfer(address(0), account, amount);
_afterTokenTransfer(address(0), account, amount);
}
function _transfer(
address from,
address to,
uint256 amount
) internal virtual returns (bool) {
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);
return true;
}
/**
* @notice Calculate the amount some address has to claim and credit for it
* @param account The account address
**/
function _credit(address account) private {
_credits[account] += accountShareBalance(account);
_consumedDividendPerToken[account] = dividendPerToken;
}
/**
* @notice Obtain the aproximate amount of blocks needed to drain the whole internal LP (considering the current TIME mining rate)
**/
function _getAmountOfBlocksToDrainLP(bool isFeeInTime) private view returns (uint256) {
if (averageMiningRate() == 0) {
if (isFeeInTime)
return TIME_BASE_FEE;
else
return TIME_BASE_LIQUIDITY;
} else {
return _balances[address(this)].mulDiv(D, averageMiningRate());
}
}
/**
* @notice Called when an investor wants to exchange ETH for TIME. A comission in ETH is paid to miner (block.coinbase) and developer
* @param comissionAmount The amount in ETH which will be paid (two times)
**/
function _payComission(uint256 comissionAmount) private {
payable(DEVELOPER_ADDRESS).transfer(comissionAmount);
if (block.coinbase == address(0))
payable(DEVELOPER_ADDRESS).transfer(comissionAmount);
else
payable(block.coinbase).transfer(comissionAmount);
sharedBalance += comissionAmount;
dividendPerToken += comissionAmount.mulDiv(FACTOR, (_totalSupply - _balances[address(this)] + 1));
_updatePoolBalance();
}
/**
* @notice Updates the state of the internal pool balance
*
*/
function _updatePoolBalance() private {
poolBalance = address(this).balance > sharedBalance ? address(this).balance - sharedBalance : 0;
}
/**
* @notice Called when an investor wants to exchange TIME for ETH. A comission in TIME token is paid to miner (block.coinbase) and developer
* @param comissionAmount The amount in TIME tokens which will be paid (two times)
**/
function _payComissionInTime(uint256 comissionAmount) private {
_transfer(msg.sender, DEVELOPER_ADDRESS, comissionAmount);
if (block.coinbase == address(0))
_transfer(msg.sender, DEVELOPER_ADDRESS, comissionAmount);
else
_transfer(msg.sender, block.coinbase, comissionAmount);
_burn(msg.sender, comissionAmount);
}
/**
* @notice Returns the average rate of TIME tokens mined per block (mining rate)
**/
function averageMiningRate() public view returns (uint256) {
if (totalMinted > TIME_BASE_LIQUIDITY)
return ((totalMinted - TIME_BASE_LIQUIDITY) / (block.number - firstBlock));
else
return 0;
}
/**
* @notice Just verify if the msg.value has any ETH value for donation
**/
function donateEth() public payable nonReentrant {
require(msg.value > 0, "TIME: please specify any amount you would like to donate");
emit Donation(msg.sender, msg.value);
uint256 remaining = msg.value;
uint256 totalComission = msg.value.mulDiv(COMISSION_RATE, 100);
uint256 comission = totalComission / SHARE_RATE;
_payComission(comission);
remaining -= totalComission;
sharedBalance += (remaining / 2);
dividendPerToken += (remaining / 2).mulDiv(FACTOR, (_totalSupply - _balances[address(this)] + 1));
_updatePoolBalance();
}
/**
* @notice An address call this function to be able to mine TIME by paying with ETH (native cryptocurrency)
* @dev An additional amount of TIME should be created for the AMM address to provide initial liquidity if the contract does not have any miners enabled
**/
function enableMining() public payable nonReentrant {
uint256 f = fee();
uint256 tolerance;
if (msg.value < f) {
tolerance = f.mulDiv(TOLERANCE, 100);
require(msg.value >= (f - tolerance), "TIME: to enable mining for an address you need at least the fee() amount in native currency");
}
require(!isMiningAllowed[msg.sender], "TIME: the address is already enabled");
uint256 remaining = msg.value;
isMiningAllowed[msg.sender] = true;
_lastBlockMined[msg.sender] = block.number;
if (numberOfMiners == 0)
_mint(address(this), TIME_BASE_LIQUIDITY);
uint256 totalComission = remaining.mulDiv(COMISSION_RATE, 100);
uint256 comission = totalComission / SHARE_RATE;
_payComission(comission);
remaining -= totalComission;
sharedBalance += (remaining / 2);
dividendPerToken += (remaining / 2).mulDiv(FACTOR, (_totalSupply - _balances[address(this)] + 1));
if (numberOfMiners == 0) {
sharedBalance = 0;
dividendPerToken = 0;
}
_updatePoolBalance();
numberOfMiners++;
}
/**
* @notice An address call this function to be able to mine TIME with its earned (or bought) TIME tokens
**/
function enableMiningWithTimeToken() public nonReentrant {
uint256 f = feeInTime();
require(_balances[msg.sender] >= f, "TIME: to enable mining for an address you need at least the feeInTime() amount in TIME tokens");
require(!isMiningAllowed[msg.sender], "TIME: the address is already enabled");
_burn(msg.sender, f);
isMiningAllowed[msg.sender] = true;
_lastBlockMined[msg.sender] = block.number;
numberOfMiners++;
}
/**
* @notice Query the fee amount needed, in ETH, to enable an address for mining TIME
* @dev Function has now dynamic fee calculation. Fee should not be so expensive and not cheap at the same time
* @return Fee amount (in native cryptocurrency)
**/
function fee() public view returns (uint256) {
return BASE_FEE.mulDiv(TIME_BASE_LIQUIDITY, _getAmountOfBlocksToDrainLP(false)) / (numberOfMiners + 1);
}
/**
* @notice Query the fee amount needed, in TIME, to enable an address for mining TIME
* @dev Function has now dynamic fee calculation. Fee should not be so expensive and not cheap at the same time
* @return Fee amount (in TIME Tokens)
**/
function feeInTime() public view returns (uint256) {
return TIME_BASE_FEE.mulDiv(TIME_BASE_FEE, _getAmountOfBlocksToDrainLP(true));
}
/**
* @notice An allowed address call this function in order to mint TIME tokens according to the number of blocks which has passed since it has enabled mining
**/
function mining() public nonReentrant {
if (isMiningAllowed[msg.sender]) {
uint256 miningAmount = (block.number - _lastBlockMined[msg.sender]).mulDiv(D, 1);
_mint(msg.sender, miningAmount);
if (block.coinbase != address(0))
_mint(block.coinbase, (miningAmount / 100));
_lastBlockMined[msg.sender] = block.number;
emit Mining(msg.sender, miningAmount, block.number);
}
}
/**
* @notice Investor send native cryptocurrency in exchange for TIME tokens. Here, he sends some amount and the contract calculates the equivalent amount in TIME units
* @dev msg.value - The amount of TIME in terms of ETH an investor wants to 'save'
**/
function saveTime() public payable nonReentrant returns (bool success) {
if (msg.value > 0) {
uint256 totalComission = msg.value.mulDiv(COMISSION_RATE, 100);
uint256 comission = totalComission / SHARE_RATE;
uint256 nativeAmountTimeValue = msg.value.mulDiv(swapPriceNative(msg.value), FACTOR);
require(nativeAmountTimeValue <= _balances[address(this)], "TIME: the pool does not have a sufficient amount to trade");
_payComission(comission);
success = _transfer(address(this), msg.sender, nativeAmountTimeValue - (nativeAmountTimeValue.mulDiv(COMISSION_RATE, 100) / SHARE_RATE));
_updatePoolBalance();
liquidityFactorNative = liquidityFactorNative < 20 ? liquidityFactorNative + 1 : liquidityFactorNative;
liquidityFactorTime = liquidityFactorTime > 11 ? liquidityFactorTime - 1 : liquidityFactorTime;
}
return success;
}
/**
* @notice Investor send TIME tokens in exchange for native cryptocurrency
* @param timeAmount The amount of TIME tokens for exchange
**/
function spendTime(uint256 timeAmount) public nonReentrant returns (bool success) {
require(_balances[msg.sender] >= timeAmount, "TIME: there is no enough time to spend");
uint256 comission = timeAmount.mulDiv(COMISSION_RATE, 100) / SHARE_RATE;
uint256 timeAmountNativeValue = timeAmount.mulDiv(swapPriceTimeInverse(timeAmount), FACTOR);
require(timeAmountNativeValue <= poolBalance, "TIME: the pool does not have a sufficient amount to trade");
_payComissionInTime(comission);
timeAmount -= comission.mulDiv(3, 1);
success = _transfer(msg.sender, address(this), timeAmount);
payable(msg.sender).transfer(timeAmountNativeValue - (timeAmountNativeValue.mulDiv(COMISSION_RATE, 100) / SHARE_RATE));
_updatePoolBalance();
liquidityFactorTime = liquidityFactorTime < 20 ? liquidityFactorTime + 1 : liquidityFactorTime;
liquidityFactorNative = liquidityFactorNative > 11 ? liquidityFactorNative - 1 : liquidityFactorNative;
return success;
}
/**
* @notice Query for market price before swap, in TIME/ETH, in terms of native cryptocurrency (ETH)
* @dev Constant Function Market Maker
* @param amountNative The amount of ETH a user wants to exchange
* @return Local market price, in TIME/ETH, given the amount of ETH a user informed
**/
function swapPriceNative(uint256 amountNative) public view returns (uint256) {
if (poolBalance > 0 && _balances[address(this)] > 0) {
uint256 ratio = poolBalance.mulDiv(FACTOR, (amountNative + 1));
uint256 deltaSupply = (_balances[address(this)].mulDiv(amountNative, 1)).mulDiv(ratio, poolBalance + amountNative.mulDiv(liquidityFactorNative, 10));
return (deltaSupply / poolBalance);
} else {
return 1;
}
}
/**
* @notice Query for market price before swap, in ETH/TIME, in terms of ETH currency
* @param amountTime The amount of TIME a user wants to exchange
* @return Local market price, in ETH/TIME, given the amount of TIME a user informed
**/
function swapPriceTimeInverse(uint256 amountTime) public view returns (uint256) {
if (poolBalance > 0 && _balances[address(this)] > 0) {
uint256 ratio = _balances[address(this)].mulDiv(FACTOR, (amountTime + 1));
uint256 deltaBalance = (poolBalance.mulDiv(amountTime, 1)).mulDiv(ratio, _balances[address(this)] + amountTime.mulDiv(liquidityFactorTime, 10));
return (deltaBalance / _balances[address(this)]);
} else {
return 1;
}
}
/**
* @notice Show the amount in ETH an account address can credit to itself
* @param account The address of some account
* @return The claimable amount in ETH
**/
function accountShareBalance(address account) public view returns (uint256) {
return _balances[account].mulDiv(dividendPerToken - _consumedDividendPerToken[account], FACTOR);
}
/**
* @notice Show the amount in ETH an account address can withdraw to itself
* @param account The address of some account
* @return The withdrawable amount in ETH
**/
function withdrawableShareBalance(address account) public view returns (uint256) {
return (accountShareBalance(account) + _credits[account]);
}
/**
* @notice Withdraw the available amount returned by the accountShareBalance(address account) function
**/
function withdrawShare() public nonReentrant {
uint256 withdrawableAmount = accountShareBalance(msg.sender);
withdrawableAmount += _credits[msg.sender];
require(withdrawableAmount > 0, "TIME: you don't have any amount to withdraw");
require(withdrawableAmount <= sharedBalance, "TIME: there is no enough balance to share");
_credits[msg.sender] = 0;
_consumedDividendPerToken[msg.sender] = dividendPerToken;
sharedBalance -= withdrawableAmount;
payable(msg.sender).transfer(withdrawableAmount);
_updatePoolBalance();
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @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);
/**
* @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 `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, 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 `from` to `to` 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 from,
address to,
uint256 amount
) external returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/Math.sol)
pragma solidity ^0.8.0;
/**
* @dev Standard math utilities missing in the Solidity language.
*/
library Math {
enum Rounding {
Down, // Toward negative infinity
Up, // Toward infinity
Zero // Toward zero
}
/**
* @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.
return (a & b) + (a ^ b) / 2;
}
/**
* @dev Returns the ceiling of the division of two numbers.
*
* This differs from standard division with `/` in that it rounds up instead
* of rounding down.
*/
function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b - 1) / b can overflow on addition, so we distribute.
return a == 0 ? 0 : (a - 1) / b + 1;
}
/**
* @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
* @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
* with further edits by Uniswap Labs also under MIT license.
*/
function mulDiv(
uint256 x,
uint256 y,
uint256 denominator
) internal pure returns (uint256 result) {
unchecked {
// 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
// use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
// variables such that product = prod1 * 2^256 + prod0.
uint256 prod0; // Least significant 256 bits of the product
uint256 prod1; // Most significant 256 bits of the product
assembly {
let mm := mulmod(x, y, not(0))
prod0 := mul(x, y)
prod1 := sub(sub(mm, prod0), lt(mm, prod0))
}
// Handle non-overflow cases, 256 by 256 division.
if (prod1 == 0) {
return prod0 / denominator;
}
// Make sure the result is less than 2^256. Also prevents denominator == 0.
require(denominator > prod1);
///////////////////////////////////////////////
// 512 by 256 division.
///////////////////////////////////////////////
// Make division exact by subtracting the remainder from [prod1 prod0].
uint256 remainder;
assembly {
// Compute remainder using mulmod.
remainder := mulmod(x, y, denominator)
// Subtract 256 bit number from 512 bit number.
prod1 := sub(prod1, gt(remainder, prod0))
prod0 := sub(prod0, remainder)
}
// Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
// See https://cs.stackexchange.com/q/138556/92363.
// Does not overflow because the denominator cannot be zero at this stage in the function.
uint256 twos = denominator & (~denominator + 1);
assembly {
// Divide denominator by twos.
denominator := div(denominator, twos)
// Divide [prod1 prod0] by twos.
prod0 := div(prod0, twos)
// Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
twos := add(div(sub(0, twos), twos), 1)
}
// Shift in bits from prod1 into prod0.
prod0 |= prod1 * twos;
// Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
// that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
// four bits. That is, denominator * inv = 1 mod 2^4.
uint256 inverse = (3 * denominator) ^ 2;
// Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
// in modular arithmetic, doubling the correct bits in each step.
inverse *= 2 - denominator * inverse; // inverse mod 2^8
inverse *= 2 - denominator * inverse; // inverse mod 2^16
inverse *= 2 - denominator * inverse; // inverse mod 2^32
inverse *= 2 - denominator * inverse; // inverse mod 2^64
inverse *= 2 - denominator * inverse; // inverse mod 2^128
inverse *= 2 - denominator * inverse; // inverse mod 2^256
// Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
// This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
// less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
// is no longer required.
result = prod0 * inverse;
return result;
}
}
/**
* @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
*/
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;
}
/**
* @dev Returns the square root of a number. It the number is not a perfect square, the value is rounded down.
*
* Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
*/
function sqrt(uint256 a) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
// For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
// We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
// `msb(a) <= a < 2*msb(a)`.
// We also know that `k`, the position of the most significant bit, is such that `msb(a) = 2**k`.
// This gives `2**k < a <= 2**(k+1)` → `2**(k/2) <= sqrt(a) < 2 ** (k/2+1)`.
// Using an algorithm similar to the msb conmputation, we are able to compute `result = 2**(k/2)` which is a
// good first aproximation of `sqrt(a)` with at least 1 correct bit.
uint256 result = 1;
uint256 x = a;
if (x >> 128 > 0) {
x >>= 128;
result <<= 64;
}
if (x >> 64 > 0) {
x >>= 64;
result <<= 32;
}
if (x >> 32 > 0) {
x >>= 32;
result <<= 16;
}
if (x >> 16 > 0) {
x >>= 16;
result <<= 8;
}
if (x >> 8 > 0) {
x >>= 8;
result <<= 4;
}
if (x >> 4 > 0) {
x >>= 4;
result <<= 2;
}
if (x >> 2 > 0) {
result <<= 1;
}
// At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
// since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
// every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
// into the expected uint128 result.
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);
}
}
/**
* @notice Calculates sqrt(a), following the selected rounding direction.
*/
function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
uint256 result = sqrt(a);
if (rounding == Rounding.Up && result * result < a) {
result += 1;
}
return result;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol)
pragma solidity ^0.8.0;
// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.
/**
* @dev Wrappers over Solidity's arithmetic operations.
*
* NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
* now has built in overflow checking.
*/
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) {
unchecked {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the subtraction of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
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) {
unchecked {
// 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) {
unchecked {
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) {
unchecked {
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) {
return a + b;
}
/**
* @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) {
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) {
return a * b;
}
/**
* @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.
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
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) {
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) {
unchecked {
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.
*
* 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) {
unchecked {
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) {
unchecked {
require(b > 0, errorMessage);
return a % b;
}
}
}{
"remappings": [
"@ensdomains/=node_modules/@ensdomains/",
"@openzeppelin/=node_modules/@openzeppelin/",
"ds-test/=lib/forge-std/lib/ds-test/src/",
"eth-gas-reporter/=node_modules/eth-gas-reporter/",
"forge-std/=lib/forge-std/src/",
"hardhat/=node_modules/hardhat/",
"lib/forge-std:ds-test/=lib/forge-std/lib/ds-test/src/"
],
"optimizer": {
"enabled": true,
"runs": 2000000
},
"metadata": {
"useLiteralContent": false,
"bytecodeHash": "ipfs",
"appendCBOR": true
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"evmVersion": "paris",
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"donator","type":"address"},{"indexed":false,"internalType":"uint256","name":"donatedAmount","type":"uint256"}],"name":"Donation","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"miner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"Mining","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"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"BASE_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"COMISSION_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEVELOPER_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SHARE_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TIME_BASE_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TIME_BASE_LIQUIDITY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOLERANCE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"accountShareBalance","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":[],"name":"averageMiningRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","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":"dividendPerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"donateEth","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"enableMining","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"enableMiningWithTimeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeInTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"firstBlock","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":"address","name":"","type":"address"}],"name":"isMiningAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFactorNative","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFactorTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mining","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numberOfHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numberOfMiners","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"saveTime","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"sharedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"timeAmount","type":"uint256"}],"name":"spendTime","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountNative","type":"uint256"}],"name":"swapPriceNative","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountTime","type":"uint256"}],"name":"swapPriceTimeInverse","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"success","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":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawShare","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawableShareBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60806040526000805460ff19169055600b60045560146005553480156200002557600080fd5b506040516200357738038062003577833981016040819052620000489162000137565b600b62000056838262000230565b50600c62000065828262000230565b50504360035550620002fc565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200009a57600080fd5b81516001600160401b0380821115620000b757620000b762000072565b604051601f8301601f19908116603f01168101908282118183101715620000e257620000e262000072565b81604052838152602092508683858801011115620000ff57600080fd5b600091505b8382101562000123578582018301518183018401529082019062000104565b600093810190920192909252949350505050565b600080604083850312156200014b57600080fd5b82516001600160401b03808211156200016357600080fd5b620001718683870162000088565b935060208501519150808211156200018857600080fd5b50620001978582860162000088565b9150509250929050565b600181811c90821680620001b657607f821691505b602082108103620001d757634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200022b57600081815260208120601f850160051c81016020861015620002065750805b601f850160051c820191505b81811015620002275782815560010162000212565b5050505b505050565b81516001600160401b038111156200024c576200024c62000072565b62000264816200025d8454620001a1565b84620001dd565b602080601f8311600181146200029c5760008415620002835750858301515b600019600386901b1c1916600185901b17855562000227565b600085815260208120601f198616915b82811015620002cd57888601518255948401946001909101908401620002ac565b5085821015620002ec5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61326b806200030c6000396000f3fe6080604052600436106102e05760003560e01c8063734cbb6a11610184578063aadd1b03116100d6578063dcd310c91161008a578063f1a10a7e11610064578063f1a10a7e146107a1578063fb7e5ad0146107b6578063fe9636d3146107cb576102ef565b8063dcd310c914610724578063dd62ed3e14610739578063ddca3f431461078c576102ef565b8063b845ead7116100bb578063b845ead7146106c9578063bdeef6db146106f9578063c3497b091461070f576102ef565b8063aadd1b03146106ac578063b52d5b1e146106b4576102ef565b806396365d4411610138578063a457c2d711610112578063a457c2d71461064c578063a88f71331461066c578063a9059cbb1461068c576102ef565b806396365d4414610618578063a2309ff81461062e578063a3e7f6dd14610644576102ef565b80638faefa42116101695780638faefa42146105c3578063901362bd146105e357806395d89b4114610603576102ef565b8063734cbb6a1461059757806377ec0feb146105ad576102ef565b8063395093511161023d578063542d199c116101f1578063685b9325116101cb578063685b93251461051e5780636a089b711461053457806370a0823114610554576102ef565b8063542d199c146104df578063657b1eb8146104f4578063662fac3914610509576102ef565b80634003d22e116102225780634003d22e1461045d57806342966c6814610472578063454e66c814610492576102ef565b806339509351146104215780633d18651e14610441576102ef565b806318160ddd1161029457806323b872dd1161027957806323b872dd146103d057806324349671146103f0578063313ce56714610405576102ef565b806318160ddd146103a5578063231b0268146103ba576102ef565b80630774c059116102c55780630774c0591461034d578063095ea7b31461036d57806310e7b9f21461039d576102ef565b80630199c7b21461030257806306fdde031461032b576102ef565b366102ef576102ed6107e1565b005b36156102fa57600080fd5b6102ed6107e1565b34801561030e57600080fd5b5061031860065481565b6040519081526020015b60405180910390f35b34801561033757600080fd5b50610340610a47565b6040516103229190612dc6565b34801561035957600080fd5b50610318610368366004612e32565b610ad9565b34801561037957600080fd5b5061038d610388366004612e6f565b610bb1565b6040519015158152602001610322565b61038d6107e1565b3480156103b157600080fd5b50600154610318565b3480156103c657600080fd5b5061031860035481565b3480156103dc57600080fd5b5061038d6103eb366004612e99565b610bc8565b3480156103fc57600080fd5b506102ed610c3d565b34801561041157600080fd5b5060405160128152602001610322565b34801561042d57600080fd5b5061038d61043c366004612e6f565b610ee3565b34801561044d57600080fd5b50610318673782dace9d90000081565b34801561046957600080fd5b50610318600481565b34801561047e57600080fd5b506102ed61048d366004612e32565b610f26565b34801561049e57600080fd5b506104ba73731591207791a93fb0ec481186fb086e16a7d6d081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610322565b3480156104eb57600080fd5b50610318610f33565b34801561050057600080fd5b50610318610f79565b34801561051557600080fd5b506102ed610f95565b34801561052a57600080fd5b5061031860055481565b34801561054057600080fd5b5061038d61054f366004612e32565b61113a565b34801561056057600080fd5b5061031861056f366004612ed5565b73ffffffffffffffffffffffffffffffffffffffff166000908152600e602052604090205490565b3480156105a357600080fd5b5061031860045481565b3480156105b957600080fd5b5061031860025481565b3480156105cf57600080fd5b506103186105de366004612e32565b611467565b3480156105ef57600080fd5b506103186105fe366004612ed5565b611509565b34801561060f57600080fd5b50610340611542565b34801561062457600080fd5b5061031860095481565b34801561063a57600080fd5b50610318600a5481565b6102ed611551565b34801561065857600080fd5b5061038d610667366004612e6f565b611910565b34801561067857600080fd5b50610318610687366004612ed5565b61196c565b34801561069857600080fd5b5061038d6106a7366004612e6f565b6119d7565b6102ed611a11565b3480156106c057600080fd5b50610318600a81565b3480156106d557600080fd5b5061038d6106e4366004612ed5565b600d6020526000908152604090205460ff1681565b34801561070557600080fd5b5061031860075481565b34801561071b57600080fd5b50610318611c65565b34801561073057600080fd5b506102ed611c7e565b34801561074557600080fd5b50610318610754366004612ef0565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260136020908152604080832093909416825291909152205490565b34801561079857600080fd5b50610318611f3e565b3480156107ad57600080fd5b50610318611f8f565b3480156107c257600080fd5b50610318600281565b3480156107d757600080fd5b5061031860085481565b60008054610100900460ff161561087f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54494d453a2054686973206f7065726174696f6e206973206c6f636b6564206660448201527f6f7220736563757269747920726561736f6e730000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790553415610a1c5760006108c03460026064611fec565b905060006108cf600483612f81565b905060006108ef6108df34611467565b3490670de0b6b3a7640000611fec565b306000908152600e6020526040902054909150811115610991576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f54494d453a2074686520706f6f6c20646f6573206e6f7420686176652061207360448201527f756666696369656e7420616d6f756e7420746f207472616465000000000000006064820152608401610876565b61099a826120b9565b6109c7303360046109ae8560026064611fec565b6109b89190612f81565b6109c29085612fbc565b6121ea565b93506109d16124bb565b6014600454106109e3576004546109f1565b6004546109f1906001612fcf565b600455600554600b10610a0657600554610a15565b6001600554610a159190612fbc565b6005555050505b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905590565b6060600b8054610a5690612fe2565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8290612fe2565b8015610acf5780601f10610aa457610100808354040283529160200191610acf565b820191906000526020600020905b815481529060010190602001808311610ab257829003601f168201915b5050505050905090565b600080600954118015610afa5750306000908152600e602052604090205415155b15610ba4576000610b2f670de0b6b3a7640000610b18856001612fcf565b306000908152600e60205260409020549190611fec565b90506000610b7f82610b4f600554600a88611fec9092919063ffffffff16565b306000908152600e6020526040902054610b699190612fcf565b600954610b7890886001611fec565b9190611fec565b306000908152600e6020526040902054909150610b9c9082612f81565b949350505050565b506001919050565b919050565b6000610bbe3384846124dd565b5060015b92915050565b6000610bd58484846121ea565b9050610c368433610c31856040518060600160405280602881526020016131e96028913973ffffffffffffffffffffffffffffffffffffffff8a1660009081526013602090815260408083203384529091529020549190612690565b6124dd565b9392505050565b600054610100900460ff1615610cd5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54494d453a2054686973206f7065726174696f6e206973206c6f636b6564206660448201527f6f7220736563757269747920726561736f6e73000000000000000000000000006064820152608401610876565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100178155610d0a3361196c565b33600090815260106020526040902054909150610d279082612fcf565b905060008111610db9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f54494d453a20796f7520646f6e2774206861766520616e7920616d6f756e742060448201527f746f2077697468647261770000000000000000000000000000000000000000006064820152608401610876565b600854811115610e4b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f54494d453a207468657265206973206e6f20656e6f7567682062616c616e636560448201527f20746f20736861726500000000000000000000000000000000000000000000006064820152608401610876565b336000908152601060209081526040808320839055600254600f90925282205560088054839290610e7d908490612fbc565b9091555050604051339082156108fc029083906000818181858888f19350505050158015610eaf573d6000803e3d6000fd5b50610eb86124bb565b50600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055565b33600081815260136020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091610bbe918590610c3190866126d6565b610f3033826126e2565b50565b6000610f74610f446012600a613155565b610f519062927c00613164565b610f5b60016128e7565b610f676012600a613155565b610b789062927c00613164565b905090565b610f856012600a613155565b610f929062927c00613164565b81565b600054610100900460ff161561102d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54494d453a2054686973206f7065726174696f6e206973206c6f636b6564206660448201527f6f7220736563757269747920726561736f6e73000000000000000000000000006064820152608401610876565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100178155338152600d602052604090205460ff161561111057600061109c61107f6012600a613155565b33600090815260126020526040902054600190610b789043612fbc565b90506110a83382612947565b41156110c2576110c2416110bd606484612f81565b612947565b3360008181526012602090815260409182902043908190558251858152918201527fe3984b193af5ec77cff31edaae343c16170c91f8a89ef6accdd4ded0959f1959910160405180910390a2505b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055565b60008054610100900460ff16156111d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54494d453a2054686973206f7065726174696f6e206973206c6f636b6564206660448201527f6f7220736563757269747920726561736f6e73000000000000000000000000006064820152608401610876565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100178155338152600e602052604090205482111561129b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54494d453a207468657265206973206e6f20656e6f7567682074696d6520746f60448201527f207370656e6400000000000000000000000000000000000000000000000000006064820152608401610876565b600060046112ac8460026064611fec565b6112b69190612f81565b905060006112d66112c685610ad9565b8590670de0b6b3a7640000611fec565b905060095481111561136a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f54494d453a2074686520706f6f6c20646f6573206e6f7420686176652061207360448201527f756666696369656e7420616d6f756e7420746f207472616465000000000000006064820152608401610876565b61137382612a98565b6113808260036001611fec565b61138a9085612fbc565b93506113973330866121ea565b9250336108fc60046113ac8460026064611fec565b6113b69190612f81565b6113c09084612fbc565b6040518115909202916000818181858888f193505050501580156113e8573d6000803e3d6000fd5b506113f16124bb565b60146005541061140357600554611411565b600554611411906001612fcf565b600555600454600b1061142657600454611435565b60016004546114359190612fbc565b6004555050600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055919050565b6000806009541180156114885750306000908152600e602052604090205415155b15610ba45760006114b0670de0b6b3a76400006114a6856001612fcf565b6009549190611fec565b905060006114f9826114d0600454600a88611fec9092919063ffffffff16565b6009546114dd9190612fcf565b306000908152600e6020526040902054610b7890886001611fec565b905060095481610b9c9190612f81565b73ffffffffffffffffffffffffffffffffffffffff81166000908152601060205260408120546115388361196c565b610bc29190612fcf565b6060600c8054610a5690612fe2565b600054610100900460ff16156115e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54494d453a2054686973206f7065726174696f6e206973206c6f636b6564206660448201527f6f7220736563757269747920726561736f6e73000000000000000000000000006064820152608401610876565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010017815561161d611f3e565b90506000813410156116f75761163682600a6064611fec565b90506116428183612fbc565b3410156116f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605b60248201527f54494d453a20746f20656e61626c65206d696e696e6720666f7220616e20616460448201527f647265737320796f75206e656564206174206c6561737420746865206665652860648201527f2920616d6f756e7420696e206e61746976652063757272656e63790000000000608482015260a401610876565b336000908152600d602052604090205460ff1615611796576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f54494d453a20746865206164647265737320697320616c726561647920656e6160448201527f626c6564000000000000000000000000000000000000000000000000000000006064820152608401610876565b336000908152600d6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556012909152812043905560075434910361180257611802306117f56012600a613155565b6110bd9062061a80613164565b60006118118260026064611fec565b90506000611820600483612f81565b905061182b816120b9565b6118358284612fbc565b9250611842600284612f81565b600860008282546118539190612fcf565b9091555050306000908152600e602052604090205460015461189991670de0b6b3a7640000916118839190612fbc565b61188e906001612fcf565b610b78600287612f81565b600260008282546118aa9190612fcf565b90915550506007546000036118c457600060088190556002555b6118cc6124bb565b600780549060006118dc8361317b565b9091555050600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555050505050565b6000610bbe3384610c31856040518060600160405280602581526020016132116025913933600090815260136020908152604080832073ffffffffffffffffffffffffffffffffffffffff8d1684529091529020549190612690565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600f6020526040812054600254610bc2916119a291612fbc565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600e602052604090205490670de0b6b3a7640000611fec565b60003073ffffffffffffffffffffffffffffffffffffffff841603611a06576119ff8261113a565b9050610bc2565b610c363384846121ea565b600054610100900460ff1615611aa9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54494d453a2054686973206f7065726174696f6e206973206c6f636b6564206660448201527f6f7220736563757269747920726561736f6e73000000000000000000000000006064820152608401610876565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010017905534611b62576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f54494d453a20706c65617365207370656369667920616e7920616d6f756e742060448201527f796f7520776f756c64206c696b6520746f20646f6e61746500000000000000006064820152608401610876565b60405134815233907f5d8bc849764969eb1bcc6d0a2f55999d0167c1ccec240a4f39cf664ca9c4148e9060200160405180910390a2346000611ba78260026064611fec565b90506000611bb6600483612f81565b9050611bc1816120b9565b611bcb8284612fbc565b9250611bd8600284612f81565b60086000828254611be99190612fcf565b9091555050306000908152600e6020526040902054600154611c1991670de0b6b3a7640000916118839190612fbc565b60026000828254611c2a9190612fcf565b90915550611c3890506124bb565b5050600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905550565b611c716012600a613155565b610f929062061a80613164565b600054610100900460ff1615611d16576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54494d453a2054686973206f7065726174696f6e206973206c6f636b6564206660448201527f6f7220736563757269747920726561736f6e73000000000000000000000000006064820152608401610876565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100178155611d4a610f33565b336000908152600e6020526040902054909150811115611e12576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f54494d453a20746f20656e61626c65206d696e696e6720666f7220616e20616460448201527f647265737320796f75206e656564206174206c6561737420746865206665654960648201527f6e54696d65282920616d6f756e7420696e2054494d4520746f6b656e73000000608482015260a401610876565b336000908152600d602052604090205460ff1615611eb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f54494d453a20746865206164647265737320697320616c726561647920656e6160448201527f626c6564000000000000000000000000000000000000000000000000000000006064820152608401610876565b611ebb33826126e2565b336000908152600d6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055601290915281204390556007805491611f0e8361317b565b9091555050600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905550565b60006007546001611f4f9190612fcf565b611f85611f5e6012600a613155565b611f6b9062061a80613164565b611f7560006128e7565b673782dace9d9000009190611fec565b610f749190612f81565b6000611f9d6012600a613155565b611faa9062061a80613164565b600a541115611fe657600354611fc09043612fbc565b611fcc6012600a613155565b611fd99062061a80613164565b600a54611f859190612fbc565b50600090565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff858709858702925082811083820303915050806000036120445783828161203a5761203a612f23565b0492505050610c36565b80841161205057600080fd5b60008486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091026000889003889004909101858311909403939093029303949094049190911702949350505050565b60405173731591207791a93fb0ec481186fb086e16a7d6d09082156108fc029083906000818181858888f193505050501580156120fa573d6000803e3d6000fd5b50416121475760405173731591207791a93fb0ec481186fb086e16a7d6d09082156108fc029083906000818181858888f19350505050158015612141573d6000803e3d6000fd5b50612176565b604051419082156108fc029083906000818181858888f19350505050158015612174573d6000803e3d6000fd5b505b80600860008282546121889190612fcf565b9091555050306000908152600e60205260409020546001546121cb91670de0b6b3a7640000916121b89190612fbc565b6121c3906001612fcf565b839190611fec565b600260008282546121dc9190612fcf565b90915550610f3090506124bb565b600073ffffffffffffffffffffffffffffffffffffffff841661228f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610876565b73ffffffffffffffffffffffffffffffffffffffff8316612332576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610876565b61233d848484612af8565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600e6020526040902054828110156123f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610876565b73ffffffffffffffffffffffffffffffffffffffff8086166000908152600e6020526040808220868503905591861681529081208054859290612437908490612fcf565b925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161249d91815260200190565b60405180910390a36124b0858585612b58565b506001949350505050565b60085447116124cb576000600955565b6008546124d89047612fbc565b600955565b73ffffffffffffffffffffffffffffffffffffffff831661257f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610876565b73ffffffffffffffffffffffffffffffffffffffff8216612622576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610876565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526013602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600081848411156126ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108769190612dc6565b505050900390565b6000610c368284612fcf565b73ffffffffffffffffffffffffffffffffffffffff8216612785576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610876565b61279182600083612af8565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600e602052604090205481811015612847576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610876565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600e60205260408120838303905560018054849290612883908490612fbc565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a36128e283600084612b58565b505050565b60006128f1611f8f565b6000036129305781156129175761290a6012600a613155565b610bc29062927c00613164565b6129236012600a613155565b610bc29062061a80613164565b610bc261293f6012600a613155565b610b18611f8f565b73ffffffffffffffffffffffffffffffffffffffff82166129c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610876565b6129d060008383612af8565b80600160008282546129e29190612fcf565b9250508190555080600a60008282546129fb9190612fcf565b909155505073ffffffffffffffffffffffffffffffffffffffff82166000908152600e602052604081208054839290612a35908490612fcf565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3612a9460008383612b58565b5050565b612ab73373731591207791a93fb0ec481186fb086e16a7d6d0836121ea565b5041612ae257612adc3373731591207791a93fb0ec481186fb086e16a7d6d0836121ea565b50610f26565b612aed3341836121ea565b50610f3033826126e2565b612b0183612d57565b612b0a82612d57565b5073ffffffffffffffffffffffffffffffffffffffff9182166000908152600e6020818152604080842054601180845282862091909155949095168352908152838220549290529190912055565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600e602052604090205415801590612ba1575073ffffffffffffffffffffffffffffffffffffffff821615155b8015612bc3575073ffffffffffffffffffffffffffffffffffffffff82163014155b8015612bff575073ffffffffffffffffffffffffffffffffffffffff82166000908152600e602090815260408083205460119092529091205414155b8015612c2e575073ffffffffffffffffffffffffffffffffffffffff8216600090815260116020526040902054155b15612c495760068054906000612c438361317b565b91905055505b73ffffffffffffffffffffffffffffffffffffffff83166000908152600e6020526040902054158015612c91575073ffffffffffffffffffffffffffffffffffffffff831615155b8015612cb3575073ffffffffffffffffffffffffffffffffffffffff82163014155b8015612cef575073ffffffffffffffffffffffffffffffffffffffff83166000908152600e602090815260408083205460119092529091205414155b15612b0a5760068054906000612d04836131b3565b91905055505073ffffffffffffffffffffffffffffffffffffffff9182166000908152600e6020818152604080842054601180845282862091909155949095168352908152838220549290529190912055565b612d608161196c565b73ffffffffffffffffffffffffffffffffffffffff821660009081526010602052604081208054909190612d95908490612fcf565b909155505060025473ffffffffffffffffffffffffffffffffffffffff9091166000908152600f6020526040902055565b600060208083528351808285015260005b81811015612df357858101830151858201604001528201612dd7565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b600060208284031215612e4457600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610bac57600080fd5b60008060408385031215612e8257600080fd5b612e8b83612e4b565b946020939093013593505050565b600080600060608486031215612eae57600080fd5b612eb784612e4b565b9250612ec560208501612e4b565b9150604084013590509250925092565b600060208284031215612ee757600080fd5b610c3682612e4b565b60008060408385031215612f0357600080fd5b612f0c83612e4b565b9150612f1a60208401612e4b565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082612fb7577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b81810381811115610bc257610bc2612f52565b80820180821115610bc257610bc2612f52565b600181811c90821680612ff657607f821691505b60208210810361302f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600181815b8085111561308e57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561307457613074612f52565b8085161561308157918102915b93841c939080029061303a565b509250929050565b6000826130a557506001610bc2565b816130b257506000610bc2565b81600181146130c857600281146130d2576130ee565b6001915050610bc2565b60ff8411156130e3576130e3612f52565b50506001821b610bc2565b5060208310610133831016604e8410600b8410161715613111575081810a610bc2565b61311b8383613035565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561314d5761314d612f52565b029392505050565b6000610c3660ff841683613096565b8082028115828204841417610bc257610bc2612f52565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036131ac576131ac612f52565b5060010190565b6000816131c2576131c2612f52565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122027b109661aaa66767a7bd40f1de59287a51fe863496c8380e7fb1d62211c4e8d64736f6c6343000813003300000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000a54494d4520546f6b656e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000454494d4500000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106102e05760003560e01c8063734cbb6a11610184578063aadd1b03116100d6578063dcd310c91161008a578063f1a10a7e11610064578063f1a10a7e146107a1578063fb7e5ad0146107b6578063fe9636d3146107cb576102ef565b8063dcd310c914610724578063dd62ed3e14610739578063ddca3f431461078c576102ef565b8063b845ead7116100bb578063b845ead7146106c9578063bdeef6db146106f9578063c3497b091461070f576102ef565b8063aadd1b03146106ac578063b52d5b1e146106b4576102ef565b806396365d4411610138578063a457c2d711610112578063a457c2d71461064c578063a88f71331461066c578063a9059cbb1461068c576102ef565b806396365d4414610618578063a2309ff81461062e578063a3e7f6dd14610644576102ef565b80638faefa42116101695780638faefa42146105c3578063901362bd146105e357806395d89b4114610603576102ef565b8063734cbb6a1461059757806377ec0feb146105ad576102ef565b8063395093511161023d578063542d199c116101f1578063685b9325116101cb578063685b93251461051e5780636a089b711461053457806370a0823114610554576102ef565b8063542d199c146104df578063657b1eb8146104f4578063662fac3914610509576102ef565b80634003d22e116102225780634003d22e1461045d57806342966c6814610472578063454e66c814610492576102ef565b806339509351146104215780633d18651e14610441576102ef565b806318160ddd1161029457806323b872dd1161027957806323b872dd146103d057806324349671146103f0578063313ce56714610405576102ef565b806318160ddd146103a5578063231b0268146103ba576102ef565b80630774c059116102c55780630774c0591461034d578063095ea7b31461036d57806310e7b9f21461039d576102ef565b80630199c7b21461030257806306fdde031461032b576102ef565b366102ef576102ed6107e1565b005b36156102fa57600080fd5b6102ed6107e1565b34801561030e57600080fd5b5061031860065481565b6040519081526020015b60405180910390f35b34801561033757600080fd5b50610340610a47565b6040516103229190612dc6565b34801561035957600080fd5b50610318610368366004612e32565b610ad9565b34801561037957600080fd5b5061038d610388366004612e6f565b610bb1565b6040519015158152602001610322565b61038d6107e1565b3480156103b157600080fd5b50600154610318565b3480156103c657600080fd5b5061031860035481565b3480156103dc57600080fd5b5061038d6103eb366004612e99565b610bc8565b3480156103fc57600080fd5b506102ed610c3d565b34801561041157600080fd5b5060405160128152602001610322565b34801561042d57600080fd5b5061038d61043c366004612e6f565b610ee3565b34801561044d57600080fd5b50610318673782dace9d90000081565b34801561046957600080fd5b50610318600481565b34801561047e57600080fd5b506102ed61048d366004612e32565b610f26565b34801561049e57600080fd5b506104ba73731591207791a93fb0ec481186fb086e16a7d6d081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610322565b3480156104eb57600080fd5b50610318610f33565b34801561050057600080fd5b50610318610f79565b34801561051557600080fd5b506102ed610f95565b34801561052a57600080fd5b5061031860055481565b34801561054057600080fd5b5061038d61054f366004612e32565b61113a565b34801561056057600080fd5b5061031861056f366004612ed5565b73ffffffffffffffffffffffffffffffffffffffff166000908152600e602052604090205490565b3480156105a357600080fd5b5061031860045481565b3480156105b957600080fd5b5061031860025481565b3480156105cf57600080fd5b506103186105de366004612e32565b611467565b3480156105ef57600080fd5b506103186105fe366004612ed5565b611509565b34801561060f57600080fd5b50610340611542565b34801561062457600080fd5b5061031860095481565b34801561063a57600080fd5b50610318600a5481565b6102ed611551565b34801561065857600080fd5b5061038d610667366004612e6f565b611910565b34801561067857600080fd5b50610318610687366004612ed5565b61196c565b34801561069857600080fd5b5061038d6106a7366004612e6f565b6119d7565b6102ed611a11565b3480156106c057600080fd5b50610318600a81565b3480156106d557600080fd5b5061038d6106e4366004612ed5565b600d6020526000908152604090205460ff1681565b34801561070557600080fd5b5061031860075481565b34801561071b57600080fd5b50610318611c65565b34801561073057600080fd5b506102ed611c7e565b34801561074557600080fd5b50610318610754366004612ef0565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260136020908152604080832093909416825291909152205490565b34801561079857600080fd5b50610318611f3e565b3480156107ad57600080fd5b50610318611f8f565b3480156107c257600080fd5b50610318600281565b3480156107d757600080fd5b5061031860085481565b60008054610100900460ff161561087f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54494d453a2054686973206f7065726174696f6e206973206c6f636b6564206660448201527f6f7220736563757269747920726561736f6e730000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790553415610a1c5760006108c03460026064611fec565b905060006108cf600483612f81565b905060006108ef6108df34611467565b3490670de0b6b3a7640000611fec565b306000908152600e6020526040902054909150811115610991576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f54494d453a2074686520706f6f6c20646f6573206e6f7420686176652061207360448201527f756666696369656e7420616d6f756e7420746f207472616465000000000000006064820152608401610876565b61099a826120b9565b6109c7303360046109ae8560026064611fec565b6109b89190612f81565b6109c29085612fbc565b6121ea565b93506109d16124bb565b6014600454106109e3576004546109f1565b6004546109f1906001612fcf565b600455600554600b10610a0657600554610a15565b6001600554610a159190612fbc565b6005555050505b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905590565b6060600b8054610a5690612fe2565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8290612fe2565b8015610acf5780601f10610aa457610100808354040283529160200191610acf565b820191906000526020600020905b815481529060010190602001808311610ab257829003601f168201915b5050505050905090565b600080600954118015610afa5750306000908152600e602052604090205415155b15610ba4576000610b2f670de0b6b3a7640000610b18856001612fcf565b306000908152600e60205260409020549190611fec565b90506000610b7f82610b4f600554600a88611fec9092919063ffffffff16565b306000908152600e6020526040902054610b699190612fcf565b600954610b7890886001611fec565b9190611fec565b306000908152600e6020526040902054909150610b9c9082612f81565b949350505050565b506001919050565b919050565b6000610bbe3384846124dd565b5060015b92915050565b6000610bd58484846121ea565b9050610c368433610c31856040518060600160405280602881526020016131e96028913973ffffffffffffffffffffffffffffffffffffffff8a1660009081526013602090815260408083203384529091529020549190612690565b6124dd565b9392505050565b600054610100900460ff1615610cd5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54494d453a2054686973206f7065726174696f6e206973206c6f636b6564206660448201527f6f7220736563757269747920726561736f6e73000000000000000000000000006064820152608401610876565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100178155610d0a3361196c565b33600090815260106020526040902054909150610d279082612fcf565b905060008111610db9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f54494d453a20796f7520646f6e2774206861766520616e7920616d6f756e742060448201527f746f2077697468647261770000000000000000000000000000000000000000006064820152608401610876565b600854811115610e4b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f54494d453a207468657265206973206e6f20656e6f7567682062616c616e636560448201527f20746f20736861726500000000000000000000000000000000000000000000006064820152608401610876565b336000908152601060209081526040808320839055600254600f90925282205560088054839290610e7d908490612fbc565b9091555050604051339082156108fc029083906000818181858888f19350505050158015610eaf573d6000803e3d6000fd5b50610eb86124bb565b50600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055565b33600081815260136020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091610bbe918590610c3190866126d6565b610f3033826126e2565b50565b6000610f74610f446012600a613155565b610f519062927c00613164565b610f5b60016128e7565b610f676012600a613155565b610b789062927c00613164565b905090565b610f856012600a613155565b610f929062927c00613164565b81565b600054610100900460ff161561102d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54494d453a2054686973206f7065726174696f6e206973206c6f636b6564206660448201527f6f7220736563757269747920726561736f6e73000000000000000000000000006064820152608401610876565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100178155338152600d602052604090205460ff161561111057600061109c61107f6012600a613155565b33600090815260126020526040902054600190610b789043612fbc565b90506110a83382612947565b41156110c2576110c2416110bd606484612f81565b612947565b3360008181526012602090815260409182902043908190558251858152918201527fe3984b193af5ec77cff31edaae343c16170c91f8a89ef6accdd4ded0959f1959910160405180910390a2505b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055565b60008054610100900460ff16156111d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54494d453a2054686973206f7065726174696f6e206973206c6f636b6564206660448201527f6f7220736563757269747920726561736f6e73000000000000000000000000006064820152608401610876565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100178155338152600e602052604090205482111561129b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54494d453a207468657265206973206e6f20656e6f7567682074696d6520746f60448201527f207370656e6400000000000000000000000000000000000000000000000000006064820152608401610876565b600060046112ac8460026064611fec565b6112b69190612f81565b905060006112d66112c685610ad9565b8590670de0b6b3a7640000611fec565b905060095481111561136a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f54494d453a2074686520706f6f6c20646f6573206e6f7420686176652061207360448201527f756666696369656e7420616d6f756e7420746f207472616465000000000000006064820152608401610876565b61137382612a98565b6113808260036001611fec565b61138a9085612fbc565b93506113973330866121ea565b9250336108fc60046113ac8460026064611fec565b6113b69190612f81565b6113c09084612fbc565b6040518115909202916000818181858888f193505050501580156113e8573d6000803e3d6000fd5b506113f16124bb565b60146005541061140357600554611411565b600554611411906001612fcf565b600555600454600b1061142657600454611435565b60016004546114359190612fbc565b6004555050600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055919050565b6000806009541180156114885750306000908152600e602052604090205415155b15610ba45760006114b0670de0b6b3a76400006114a6856001612fcf565b6009549190611fec565b905060006114f9826114d0600454600a88611fec9092919063ffffffff16565b6009546114dd9190612fcf565b306000908152600e6020526040902054610b7890886001611fec565b905060095481610b9c9190612f81565b73ffffffffffffffffffffffffffffffffffffffff81166000908152601060205260408120546115388361196c565b610bc29190612fcf565b6060600c8054610a5690612fe2565b600054610100900460ff16156115e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54494d453a2054686973206f7065726174696f6e206973206c6f636b6564206660448201527f6f7220736563757269747920726561736f6e73000000000000000000000000006064820152608401610876565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010017815561161d611f3e565b90506000813410156116f75761163682600a6064611fec565b90506116428183612fbc565b3410156116f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605b60248201527f54494d453a20746f20656e61626c65206d696e696e6720666f7220616e20616460448201527f647265737320796f75206e656564206174206c6561737420746865206665652860648201527f2920616d6f756e7420696e206e61746976652063757272656e63790000000000608482015260a401610876565b336000908152600d602052604090205460ff1615611796576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f54494d453a20746865206164647265737320697320616c726561647920656e6160448201527f626c6564000000000000000000000000000000000000000000000000000000006064820152608401610876565b336000908152600d6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556012909152812043905560075434910361180257611802306117f56012600a613155565b6110bd9062061a80613164565b60006118118260026064611fec565b90506000611820600483612f81565b905061182b816120b9565b6118358284612fbc565b9250611842600284612f81565b600860008282546118539190612fcf565b9091555050306000908152600e602052604090205460015461189991670de0b6b3a7640000916118839190612fbc565b61188e906001612fcf565b610b78600287612f81565b600260008282546118aa9190612fcf565b90915550506007546000036118c457600060088190556002555b6118cc6124bb565b600780549060006118dc8361317b565b9091555050600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555050505050565b6000610bbe3384610c31856040518060600160405280602581526020016132116025913933600090815260136020908152604080832073ffffffffffffffffffffffffffffffffffffffff8d1684529091529020549190612690565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600f6020526040812054600254610bc2916119a291612fbc565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600e602052604090205490670de0b6b3a7640000611fec565b60003073ffffffffffffffffffffffffffffffffffffffff841603611a06576119ff8261113a565b9050610bc2565b610c363384846121ea565b600054610100900460ff1615611aa9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54494d453a2054686973206f7065726174696f6e206973206c6f636b6564206660448201527f6f7220736563757269747920726561736f6e73000000000000000000000000006064820152608401610876565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010017905534611b62576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f54494d453a20706c65617365207370656369667920616e7920616d6f756e742060448201527f796f7520776f756c64206c696b6520746f20646f6e61746500000000000000006064820152608401610876565b60405134815233907f5d8bc849764969eb1bcc6d0a2f55999d0167c1ccec240a4f39cf664ca9c4148e9060200160405180910390a2346000611ba78260026064611fec565b90506000611bb6600483612f81565b9050611bc1816120b9565b611bcb8284612fbc565b9250611bd8600284612f81565b60086000828254611be99190612fcf565b9091555050306000908152600e6020526040902054600154611c1991670de0b6b3a7640000916118839190612fbc565b60026000828254611c2a9190612fcf565b90915550611c3890506124bb565b5050600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905550565b611c716012600a613155565b610f929062061a80613164565b600054610100900460ff1615611d16576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54494d453a2054686973206f7065726174696f6e206973206c6f636b6564206660448201527f6f7220736563757269747920726561736f6e73000000000000000000000000006064820152608401610876565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100178155611d4a610f33565b336000908152600e6020526040902054909150811115611e12576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f54494d453a20746f20656e61626c65206d696e696e6720666f7220616e20616460448201527f647265737320796f75206e656564206174206c6561737420746865206665654960648201527f6e54696d65282920616d6f756e7420696e2054494d4520746f6b656e73000000608482015260a401610876565b336000908152600d602052604090205460ff1615611eb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f54494d453a20746865206164647265737320697320616c726561647920656e6160448201527f626c6564000000000000000000000000000000000000000000000000000000006064820152608401610876565b611ebb33826126e2565b336000908152600d6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055601290915281204390556007805491611f0e8361317b565b9091555050600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905550565b60006007546001611f4f9190612fcf565b611f85611f5e6012600a613155565b611f6b9062061a80613164565b611f7560006128e7565b673782dace9d9000009190611fec565b610f749190612f81565b6000611f9d6012600a613155565b611faa9062061a80613164565b600a541115611fe657600354611fc09043612fbc565b611fcc6012600a613155565b611fd99062061a80613164565b600a54611f859190612fbc565b50600090565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff858709858702925082811083820303915050806000036120445783828161203a5761203a612f23565b0492505050610c36565b80841161205057600080fd5b60008486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091026000889003889004909101858311909403939093029303949094049190911702949350505050565b60405173731591207791a93fb0ec481186fb086e16a7d6d09082156108fc029083906000818181858888f193505050501580156120fa573d6000803e3d6000fd5b50416121475760405173731591207791a93fb0ec481186fb086e16a7d6d09082156108fc029083906000818181858888f19350505050158015612141573d6000803e3d6000fd5b50612176565b604051419082156108fc029083906000818181858888f19350505050158015612174573d6000803e3d6000fd5b505b80600860008282546121889190612fcf565b9091555050306000908152600e60205260409020546001546121cb91670de0b6b3a7640000916121b89190612fbc565b6121c3906001612fcf565b839190611fec565b600260008282546121dc9190612fcf565b90915550610f3090506124bb565b600073ffffffffffffffffffffffffffffffffffffffff841661228f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610876565b73ffffffffffffffffffffffffffffffffffffffff8316612332576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610876565b61233d848484612af8565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600e6020526040902054828110156123f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610876565b73ffffffffffffffffffffffffffffffffffffffff8086166000908152600e6020526040808220868503905591861681529081208054859290612437908490612fcf565b925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161249d91815260200190565b60405180910390a36124b0858585612b58565b506001949350505050565b60085447116124cb576000600955565b6008546124d89047612fbc565b600955565b73ffffffffffffffffffffffffffffffffffffffff831661257f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610876565b73ffffffffffffffffffffffffffffffffffffffff8216612622576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610876565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526013602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600081848411156126ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108769190612dc6565b505050900390565b6000610c368284612fcf565b73ffffffffffffffffffffffffffffffffffffffff8216612785576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610876565b61279182600083612af8565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600e602052604090205481811015612847576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610876565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600e60205260408120838303905560018054849290612883908490612fbc565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a36128e283600084612b58565b505050565b60006128f1611f8f565b6000036129305781156129175761290a6012600a613155565b610bc29062927c00613164565b6129236012600a613155565b610bc29062061a80613164565b610bc261293f6012600a613155565b610b18611f8f565b73ffffffffffffffffffffffffffffffffffffffff82166129c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610876565b6129d060008383612af8565b80600160008282546129e29190612fcf565b9250508190555080600a60008282546129fb9190612fcf565b909155505073ffffffffffffffffffffffffffffffffffffffff82166000908152600e602052604081208054839290612a35908490612fcf565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3612a9460008383612b58565b5050565b612ab73373731591207791a93fb0ec481186fb086e16a7d6d0836121ea565b5041612ae257612adc3373731591207791a93fb0ec481186fb086e16a7d6d0836121ea565b50610f26565b612aed3341836121ea565b50610f3033826126e2565b612b0183612d57565b612b0a82612d57565b5073ffffffffffffffffffffffffffffffffffffffff9182166000908152600e6020818152604080842054601180845282862091909155949095168352908152838220549290529190912055565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600e602052604090205415801590612ba1575073ffffffffffffffffffffffffffffffffffffffff821615155b8015612bc3575073ffffffffffffffffffffffffffffffffffffffff82163014155b8015612bff575073ffffffffffffffffffffffffffffffffffffffff82166000908152600e602090815260408083205460119092529091205414155b8015612c2e575073ffffffffffffffffffffffffffffffffffffffff8216600090815260116020526040902054155b15612c495760068054906000612c438361317b565b91905055505b73ffffffffffffffffffffffffffffffffffffffff83166000908152600e6020526040902054158015612c91575073ffffffffffffffffffffffffffffffffffffffff831615155b8015612cb3575073ffffffffffffffffffffffffffffffffffffffff82163014155b8015612cef575073ffffffffffffffffffffffffffffffffffffffff83166000908152600e602090815260408083205460119092529091205414155b15612b0a5760068054906000612d04836131b3565b91905055505073ffffffffffffffffffffffffffffffffffffffff9182166000908152600e6020818152604080842054601180845282862091909155949095168352908152838220549290529190912055565b612d608161196c565b73ffffffffffffffffffffffffffffffffffffffff821660009081526010602052604081208054909190612d95908490612fcf565b909155505060025473ffffffffffffffffffffffffffffffffffffffff9091166000908152600f6020526040902055565b600060208083528351808285015260005b81811015612df357858101830151858201604001528201612dd7565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b600060208284031215612e4457600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610bac57600080fd5b60008060408385031215612e8257600080fd5b612e8b83612e4b565b946020939093013593505050565b600080600060608486031215612eae57600080fd5b612eb784612e4b565b9250612ec560208501612e4b565b9150604084013590509250925092565b600060208284031215612ee757600080fd5b610c3682612e4b565b60008060408385031215612f0357600080fd5b612f0c83612e4b565b9150612f1a60208401612e4b565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082612fb7577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b81810381811115610bc257610bc2612f52565b80820180821115610bc257610bc2612f52565b600181811c90821680612ff657607f821691505b60208210810361302f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600181815b8085111561308e57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561307457613074612f52565b8085161561308157918102915b93841c939080029061303a565b509250929050565b6000826130a557506001610bc2565b816130b257506000610bc2565b81600181146130c857600281146130d2576130ee565b6001915050610bc2565b60ff8411156130e3576130e3612f52565b50506001821b610bc2565b5060208310610133831016604e8410600b8410161715613111575081810a610bc2565b61311b8383613035565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561314d5761314d612f52565b029392505050565b6000610c3660ff841683613096565b8082028115828204841417610bc257610bc2612f52565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036131ac576131ac612f52565b5060010190565b6000816131c2576131c2612f52565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122027b109661aaa66767a7bd40f1de59287a51fe863496c8380e7fb1d62211c4e8d64736f6c63430008130033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000a54494d4520546f6b656e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000454494d4500000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : name_ (string): TIME Token
Arg [1] : symbol_ (string): TIME
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [3] : 54494d4520546f6b656e00000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [5] : 54494d4500000000000000000000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
Loading...
Loading
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ 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.