Source Code
Latest 25 from a total of 99 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Finalize | 11597833 | 1856 days ago | IN | 0 ETH | 0.00464202 | ||||
| Transfer | 11597771 | 1856 days ago | IN | 1 ETH | 0.00259084 | ||||
| Lock Liquidity | 11597757 | 1856 days ago | IN | 0 ETH | 0.31989969 | ||||
| Transfer | 11597572 | 1857 days ago | IN | 1.8 ETH | 0.01825753 | ||||
| Transfer | 11597539 | 1857 days ago | IN | 0.7 ETH | 0.0063 | ||||
| Transfer | 11597534 | 1857 days ago | IN | 0.8 ETH | 0.002856 | ||||
| Transfer | 11597529 | 1857 days ago | IN | 0.9 ETH | 0.0063 | ||||
| Transfer | 11597526 | 1857 days ago | IN | 0.90898239 ETH | 0.003003 | ||||
| Transfer | 11597521 | 1857 days ago | IN | 0.9105312 ETH | 0.003003 | ||||
| Transfer | 11597503 | 1857 days ago | IN | 1 ETH | 0.01259538 | ||||
| Transfer | 11597428 | 1857 days ago | IN | 0.7 ETH | 0.00501048 | ||||
| Transfer | 11597411 | 1857 days ago | IN | 0.7 ETH | 0.006573 | ||||
| Transfer | 11596457 | 1857 days ago | IN | 0.3 ETH | 0.003213 | ||||
| Transfer | 11596279 | 1857 days ago | IN | 10 ETH | 0.02011996 | ||||
| Transfer | 11590969 | 1858 days ago | IN | 1 ETH | 0.001428 | ||||
| Transfer | 11590887 | 1858 days ago | IN | 1.96 ETH | 0.002541 | ||||
| Transfer | 11590887 | 1858 days ago | IN | 2 ETH | 0.02765431 | ||||
| Transfer | 11590878 | 1858 days ago | IN | 2 ETH | 0.002373 | ||||
| Transfer | 11590871 | 1858 days ago | IN | 5 ETH | 0.01414443 | ||||
| Transfer | 11590869 | 1858 days ago | IN | 2 ETH | 0.002289 | ||||
| Transfer | 11590862 | 1858 days ago | IN | 5 ETH | 0.01833003 | ||||
| Transfer | 11590855 | 1858 days ago | IN | 5 ETH | 0.002667 | ||||
| Transfer | 11590831 | 1858 days ago | IN | 1 ETH | 0.0095648 | ||||
| Transfer | 11590827 | 1858 days ago | IN | 1 ETH | 0.01481378 | ||||
| Transfer | 11589151 | 1858 days ago | IN | 1 ETH | 0.02166664 |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
TDE
Compiler Version
v0.6.7+commit.b8d736ae
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2020-12-30
*/
pragma solidity 0.6.7;
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
/**
* @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) {
// 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 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts 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) {
require(b > 0, errorMessage);
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts 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 mod(a, b, "SafeMath: modulo by zero");
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}
interface IUniswapV2Router01 {
function factory() external pure returns (address);
function WETH() external pure returns (address);
function addLiquidity(
address tokenA,
address tokenB,
uint256 amountADesired,
uint256 amountBDesired,
uint256 amountAMin,
uint256 amountBMin,
address to,
uint256 deadline
)
external
returns (
uint256 amountA,
uint256 amountB,
uint256 liquidity
);
function addLiquidityETH(
address token,
uint256 amountTokenDesired,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline
)
external
payable
returns (
uint256 amountToken,
uint256 amountETH,
uint256 liquidity
);
function removeLiquidity(
address tokenA,
address tokenB,
uint256 liquidity,
uint256 amountAMin,
uint256 amountBMin,
address to,
uint256 deadline
) external returns (uint256 amountA, uint256 amountB);
function removeLiquidityETH(
address token,
uint256 liquidity,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline
) external returns (uint256 amountToken, uint256 amountETH);
function removeLiquidityWithPermit(
address tokenA,
address tokenB,
uint256 liquidity,
uint256 amountAMin,
uint256 amountBMin,
address to,
uint256 deadline,
bool approveMax,
uint8 v,
bytes32 r,
bytes32 s
) external returns (uint256 amountA, uint256 amountB);
function removeLiquidityETHWithPermit(
address token,
uint256 liquidity,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline,
bool approveMax,
uint8 v,
bytes32 r,
bytes32 s
) external returns (uint256 amountToken, uint256 amountETH);
function swapExactTokensForTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external returns (uint256[] memory amounts);
function swapTokensForExactTokens(
uint256 amountOut,
uint256 amountInMax,
address[] calldata path,
address to,
uint256 deadline
) external returns (uint256[] memory amounts);
function swapExactETHForTokens(
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external payable returns (uint256[] memory amounts);
function swapTokensForExactETH(
uint256 amountOut,
uint256 amountInMax,
address[] calldata path,
address to,
uint256 deadline
) external returns (uint256[] memory amounts);
function swapExactTokensForETH(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external returns (uint256[] memory amounts);
function swapETHForExactTokens(
uint256 amountOut,
address[] calldata path,
address to,
uint256 deadline
) external payable returns (uint256[] memory amounts);
function quote(
uint256 amountA,
uint256 reserveA,
uint256 reserveB
) external pure returns (uint256 amountB);
function getAmountOut(
uint256 amountIn,
uint256 reserveIn,
uint256 reserveOut
) external pure returns (uint256 amountOut);
function getAmountIn(
uint256 amountOut,
uint256 reserveIn,
uint256 reserveOut
) external pure returns (uint256 amountIn);
function getAmountsOut(uint256 amountIn, address[] calldata path)
external
view
returns (uint256[] memory amounts);
function getAmountsIn(uint256 amountOut, address[] calldata path)
external
view
returns (uint256[] memory amounts);
}
interface IUniswapV2Router02 is IUniswapV2Router01 {
function removeLiquidityETHSupportingFeeOnTransferTokens(
address token,
uint256 liquidity,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline
) external returns (uint256 amountETH);
function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
address token,
uint256 liquidity,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline,
bool approveMax,
uint8 v,
bytes32 r,
bytes32 s
) external returns (uint256 amountETH);
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external;
function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external payable;
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external;
}
abstract contract Context {
function _msgSender() internal view virtual returns (address payable) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes memory) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}
contract ERC20 is IERC20 {
using SafeMath for uint256;
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
uint8 private _decimals;
/**
* @dev Sets the values for {name} and {symbol}, initializes {decimals} with
* a default value of 18.
*
* To select a different value for {decimals}, use {_setupDecimals}.
*
* All three of these values are immutable: they can only be set once during
* construction.
*/
constructor(string memory name, string memory symbol) public {
_name = name;
_symbol = symbol;
_decimals = 18;
}
/**
* @dev Returns the name of the token.
*/
function name() public view returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5,05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is
* called.
*
* NOTE: This information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/
function decimals() public view returns (uint8) {
return _decimals;
}
/**
* @dev See {IERC20-totalSupply}.
*/
function totalSupply() public override view returns (uint256) {
return _totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/
function balanceOf(address account) public override view returns (uint256) {
return _balances[account];
}
/**
* @dev See {IERC20-transfer}.
*
* Requirements:
*
* - `recipient` cannot be the zero address.
* - the caller must have a balance of at least `amount`.
*/
function transfer(address recipient, uint256 amount)
public
override
returns (bool)
{
_transfer(msg.sender, recipient, amount);
return true;
}
/**
* @dev See {IERC20-allowance}.
*/
function allowance(address owner, address spender)
public
override
view
returns (uint256)
{
return _allowances[owner][spender];
}
/**
* @dev See {IERC20-approve}.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 amount)
public
override
returns (bool)
{
_approve(msg.sender, spender, amount);
return true;
}
/**
* @dev See {IERC20-transferFrom}.
*
* Emits an {Approval} event indicating the updated allowance. This is not
* required by the EIP. See the note at the beginning of {ERC20};
*
* Requirements:
* - `sender` and `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
* - the caller must have allowance for ``sender``'s tokens of at least
* `amount`.
*/
function transferFrom(
address sender,
address recipient,
uint256 amount
) public virtual override returns (bool) {
_transfer(sender, recipient, amount);
_approve(
sender,
msg.sender,
_allowances[sender][msg.sender].sub(
amount,
'ERC20: transfer amount exceeds allowance'
)
);
return true;
}
/**
* @dev Atomically increases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function increaseAllowance(address spender, uint256 addedValue)
public
returns (bool)
{
_approve(
msg.sender,
spender,
_allowances[msg.sender][spender].add(addedValue)
);
return true;
}
/**
* @dev Atomically decreases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `spender` must have allowance for the caller of at least
* `subtractedValue`.
*/
function decreaseAllowance(address spender, uint256 subtractedValue)
public
virtual
returns (bool)
{
_approve(
msg.sender,
spender,
_allowances[msg.sender][spender].sub(
subtractedValue,
'ERC20: decreased allowance below zero'
)
);
return true;
}
/**
* @dev Moves tokens `amount` from `sender` to `recipient`.
*
* This is internal function is equivalent to {transfer}, and can be used to
* e.g. implement automatic token fees, slashing mechanisms, etc.
*
* Emits a {Transfer} event.
*
* Requirements:
*
* - `sender` cannot be the zero address.
* - `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
*/
function _transfer(
address sender,
address recipient,
uint256 amount
) internal virtual {
require(sender != address(0), 'ERC20: transfer from the zero address');
require(recipient != address(0), 'ERC20: transfer to the zero address');
_balances[sender] = _balances[sender].sub(
amount,
'ERC20: transfer amount exceeds balance'
);
_balances[recipient] = _balances[recipient].add(amount);
emit Transfer(sender, recipient, amount);
}
/** @dev Creates `amount` tokens and assigns them to `account`, increasing
* the total supply.
*
* Emits a {Transfer} event with `from` set to the zero address.
*
* Requirements
*
* - `to` cannot be the zero address.
*/
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), 'ERC20: mint to the zero address');
_totalSupply = _totalSupply.add(amount);
_balances[account] = _balances[account].add(amount);
emit Transfer(address(0), account, amount);
}
/**
* @dev Destroys `amount` tokens from `account`, reducing the
* total supply.
*
* Emits a {Transfer} event with `to` set to the zero address.
*
* Requirements
*
* - `account` cannot be the zero address.
* - `account` must have at least `amount` tokens.
*/
function _burn(address account, uint256 amount) internal virtual {
require(account != address(0), 'ERC20: burn from the zero address');
_balances[account] = _balances[account].sub(
amount,
'ERC20: burn amount exceeds balance'
);
_totalSupply = _totalSupply.sub(amount);
emit Transfer(account, address(0), amount);
}
/**
* @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens.
*
* This is internal function is equivalent to `approve`, and can be used to
* e.g. set automatic allowances for certain subsystems, etc.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `owner` cannot be the zero address.
* - `spender` cannot be the zero address.
*/
function _approve(
address owner,
address spender,
uint256 amount
) internal virtual {
require(owner != address(0), 'ERC20: approve from the zero address');
require(spender != address(0), 'ERC20: approve to the zero address');
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
}
contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor () internal {
address msgSender = _msgSender();
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(_owner == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}
contract Token is IERC20, Ownable {
using SafeMath for uint256;
struct Challenger {
uint256 acceptance;
uint256 challenge;
}
uint256 private constant _BASE = 1 * _DECIMALFACTOR;
uint32 private constant _TERM = 24 hours;
uint256 private _prizes;
uint256 private _challenges;
mapping (address => Challenger) private _challengers;
uint256 private _power;
mapping (address => uint256) private _powers;
string private constant _NAME = "Gauntlet Finance";
string private constant _SYMBOL = "GFIv2";
uint8 private constant _DECIMALS = 18;
uint256 private constant _DECIMALFACTOR = 10 ** uint256(_DECIMALS);
uint8 private constant _DENOMINATOR = 100;
uint8 private constant _PRECISION = 100;
mapping (address => uint256) private _balances;
mapping (address => mapping (address => uint256)) private _allowances;
uint256 private _totalSupply;
uint256 private immutable _rate;
uint8 private immutable _penalty;
uint256 private immutable _requirement;
uint256 private immutable _initialSupply;
uint256 private _contributors;
bool private _paused;
address private _TDE;
event Penalized(
address indexed account,
uint256 amount);
event Boosted(
address indexed account,
uint256 amount);
event Deflated(
uint256 supply,
uint256 amount);
event Recovered(
uint256 supply,
uint256 amount);
event Added(
address indexed account,
uint256 time);
event Removed(
address indexed account,
uint256 time);
event Accepted(
address indexed account,
uint256 amount);
event Rewarded(
address indexed account,
uint256 amount);
event Powered(
address indexed account,
uint256 power);
event Forfeited(
address indexed account,
uint256 amount);
event Unpaused(
address indexed account,
uint256 time);
constructor (
uint256 rate,
uint8 penalty,
uint256 requirement)
public {
require(rate > 0,
"error: must be larger than zero");
require(penalty > 0,
"error: must be larger than zero");
require(requirement > 0,
"error: must be larger than zero");
_rate = rate;
_penalty = penalty;
_requirement = requirement;
uint256 prizes = 20000 * _DECIMALFACTOR;
uint256 capacity = 25000 * _DECIMALFACTOR;
uint256 operations = 55000 * _DECIMALFACTOR;
_mint(_environment(), prizes.add(capacity));
_mint(_msgSender(), operations);
_prizes = prizes;
_initialSupply = prizes.add(capacity).add(operations);
_paused = true;
}
function setTokenDistributionEvent(address TDE) external onlyOwner returns (bool) {
require(TDE != address(0),
"error: must not be the zero address");
require(_TDE == address(0),
"error: must not be set already");
_TDE = TDE;
return true;
}
function unpause() external returns (bool) {
address account = _msgSender();
require(account == owner() || account == _TDE,
"error: must be owner or must be token distribution event");
_paused = false;
emit Unpaused(account, _time());
return true;
}
function reward() external returns (bool) {
uint256 prizes = getPrizesTotal();
require(prizes > 0,
"error: must be prizes available");
address account = _msgSender();
require(getReward(account) > 0,
"error: must be worthy of a reward");
uint256 amount = getReward(account);
if (_isExcessive(amount, prizes)) {
uint256 excess = amount.sub(prizes);
amount = amount.sub(excess);
_challengers[account].acceptance = _time();
_prizes = _prizes.sub(amount);
_mint(account, amount);
emit Rewarded(account, amount);
} else {
_challengers[account].acceptance = _time();
_prizes = _prizes.sub(amount);
_mint(account, amount);
emit Rewarded(account, amount);
}
return true;
}
function challenge(uint256 amount) external returns (bool) {
address account = _msgSender();
uint256 processed = amount.mul(_DECIMALFACTOR);
require(_isEligible(account, processed),
"error: must have sufficient holdings");
require(_isContributor(account),
"error: must be a contributor");
require(_isAcceptable(processed),
"error: must comply with requirement");
_challengers[account].acceptance = _time();
_challengers[account].challenge = processed;
_challenges = _challenges.add(processed);
emit Accepted(account, processed);
return true;
}
function powerUp() external returns (bool) {
address account = _msgSender();
require(getReward(account) > 0,
"error: must be worthy of a reward");
uint256 amount = getReward(account);
_challengers[account].acceptance = _time();
_powers[account] = _powers[account].add(amount);
_power = _power.add(amount);
emit Powered(account, amount);
return true;
}
function powerDown() external returns (bool) {
uint256 prizes = getPrizesTotal();
require(prizes > 0,
"error: must be prizes available");
address account = _msgSender();
require(getPower(account) > 0,
"error: must have convertible power");
uint256 amount = getPower(account);
if (_isExcessive(amount, prizes)) {
uint256 excess = amount.sub(prizes);
amount = amount.sub(excess);
_powers[account] = _powers[account].sub(amount);
_power = _power.sub(amount);
_prizes = _prizes.sub(amount);
_mint(account, amount);
emit Rewarded(account, amount);
} else {
_powers[account] = _powers[account].sub(amount);
_power = _power.sub(amount);
_prizes = _prizes.sub(amount);
_mint(account, amount);
emit Rewarded(account, amount);
}
emit Powered(account, amount);
return true;
}
function burn(uint256 amount) external returns (bool) {
_burn(_msgSender(), amount);
return true;
}
function getTerm() public pure returns (uint256) {
return _TERM;
}
function getBase() public pure returns (uint256) {
return _BASE;
}
function getAcceptance(address account) public view returns (uint256) {
return _challengers[account].acceptance;
}
function getPeriod(address account) public view returns (uint256) {
if (getAcceptance(account) > 0) {
uint256 period = _time().sub(_challengers[account].acceptance);
uint256 term = getTerm();
if (period >= term) {
return period.div(term);
} else {
return 0;
}
} else {
return 0;
}
}
function getChallenge(address account) public view returns (uint256) {
return _challengers[account].challenge;
}
function getFerocity(address account) public view returns (uint256) {
return (getChallenge(account).mul(_PRECISION)).div(getRequirement());
}
function getReward(address account) public view returns (uint256) {
return _getBlock(account).mul((_BASE.mul(getFerocity(account))).div(_PRECISION));
}
function getPower(address account) public view returns (uint256) {
return _powers[account];
}
function getPrizesTotal() public view returns (uint256) {
return _prizes;
}
function getChallengesTotal() public view returns (uint256) {
return _challenges;
}
function getPowerTotal() public view returns (uint256) {
return _power;
}
function getRate() public view returns (uint256) {
return _rate;
}
function getPenalty() public view returns (uint8) {
return _penalty;
}
function getRequirement() public view returns (uint256) {
return _requirement;
}
function getCapacity() public view returns (uint256) {
return balanceOf(_environment()).sub(getPrizesTotal());
}
function getContributorsTotal() public view returns (uint256) {
return _contributors;
}
function getContributorsLimit() public view returns (uint256) {
return getCapacity().div(getRate());
}
function name() public pure returns (string memory) {
return _NAME;
}
function symbol() public pure returns (string memory) {
return _SYMBOL;
}
function decimals() public pure returns (uint8) {
return _DECIMALS;
}
function totalSupply() public view override returns (uint256) {
return _totalSupply;
}
function initialSupply() public view returns (uint256) {
return _initialSupply;
}
function balanceOf(address account) public view override returns (uint256) {
return _balances[account];
}
function allowance(address owner, address spender) public view virtual override returns (uint256) {
return _allowances[owner][spender];
}
function approve(address spender, uint256 amount) public virtual override returns (bool) {
_approve(_msgSender(), spender, amount);
return true;
}
function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
address sender = _msgSender();
require(_isNotPaused() || recipient == _TDE || sender == _TDE,
"error: must not be paused else must be token distribution event recipient or sender");
_checkReactiveness(sender, recipient, amount);
_checkChallenger(sender, amount);
_transfer(sender, recipient, amount);
return true;
}
function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
require(_isNotPaused() || recipient == _TDE || sender == _TDE,
"error: must not be paused else must be token distribution event recipient or sender");
_checkReactiveness(sender, recipient, amount);
_checkChallenger(sender, amount);
_transfer(sender, recipient, amount);
_approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
return true;
}
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
return true;
}
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
return true;
}
function _transfer(address sender, address recipient, uint256 amount) internal virtual {
require(sender != address(0), "ERC20: transfer from the zero address");
require(recipient != address(0), "ERC20: transfer to the zero address");
if (sender == owner() && recipient == _TDE || sender == _TDE) {
_balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
_balances[recipient] = _balances[recipient].add(amount);
emit Transfer(sender, recipient, amount);
} else {
uint256 penalty = _computePenalty(amount);
uint256 boosted = penalty.div(2);
uint256 prize = penalty.div(2);
_prize(prize);
_boost(boosted);
uint256 processed = amount.sub(penalty);
_balances[sender] = _balances[sender].sub(processed, "ERC20: transfer amount exceeds balance");
_balances[recipient] = _balances[recipient].add(processed);
emit Transfer(sender, recipient, processed);
}
}
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");
_totalSupply = _totalSupply.add(amount);
_balances[account] = _balances[account].add(amount);
emit Transfer(address(0), account, amount);
}
function _burn(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: burn from the zero address");
_balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
_totalSupply = _totalSupply.sub(amount);
emit Transfer(account, address(0), amount);
}
function _approve(address owner, address spender, uint256 amount) internal virtual {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
function _boost(uint256 amount) private returns (bool) {
_mint(_environment(), amount);
emit Boosted(_environment(), amount);
return true;
}
function _prize(uint256 amount) private returns (bool) {
_mint(_environment(), amount);
_prizes = _prizes.add(amount);
emit Rewarded(_environment(), amount);
return true;
}
function _checkReactiveness(address sender, address recipient, uint256 amount) private {
if (_isUnique(recipient)) {
if (_isCompliant(recipient, amount)) {
_addContributor(recipient);
if(_isElastic()) {
_deflate();
}
}
}
if (_isNotUnique(sender)) {
if (_isNotCompliant(sender, amount)) {
_removeContributor(sender);
if(_isElastic()) {
_recover();
}
}
}
}
function _checkChallenger(address account, uint256 amount) private {
if (_isChallenger(account)) {
if (balanceOf(account).sub(amount) < getChallenge(account)) {
uint256 challenged = getChallenge(account);
_challenges = _challenges.sub(challenged);
delete _challengers[account].acceptance;
delete _challengers[account].challenge;
emit Forfeited(account, challenged);
}
}
}
function _deflate() private returns (bool) {
uint256 amount = getRate();
_burn(_environment(), amount);
emit Deflated(totalSupply(), amount);
return true;
}
function _recover() private returns (bool) {
uint256 amount = getRate();
_mint(_environment(), amount);
emit Recovered(totalSupply(), amount);
return true;
}
function _addContributor(address account) private returns (bool) {
_contributors++;
emit Added(account, _time());
return true;
}
function _removeContributor(address account) private returns (bool) {
_contributors--;
emit Removed(account, _time());
return true;
}
function _computePenalty(uint256 amount) private view returns (uint256) {
return (amount.mul(getPenalty())).div(_DENOMINATOR);
}
function _isNotPaused() private view returns (bool) {
if (_paused) { return false; } else { return true; }
}
function _isUnique(address account) private view returns (bool) {
if (balanceOf(account) < getRequirement()) { return true; } else { return false; }
}
function _isNotUnique(address account) private view returns (bool) {
if (balanceOf(account) > getRequirement()) { return true; } else { return false; }
}
function _getAcceptance(address account) private view returns (uint256) {
return _challengers[account].acceptance;
}
function _getEpoch(address account) private view returns (uint256) {
if (_getAcceptance(account) > 0) { return _time().sub(_getAcceptance(account)); } else { return 0; }
}
function _getBlock(address account) private view returns (uint256) {
return _getEpoch(account).div(_TERM);
}
function _isContributor(address account) private view returns (bool) {
if (balanceOf(account) >= getRequirement()) { return true; } else { return false; }
}
function _isEligible(address account, uint256 amount) private view returns (bool) {
if (balanceOf(account) >= amount) { return true; } else { return false; }
}
function _isAcceptable(uint256 amount) private view returns (bool) {
if (amount >= getRequirement()) { return true; } else { return false; }
}
function _isChallenger(address account) private view returns (bool) {
if (_getAcceptance(account) > 0) { return true; } else { return false; }
}
function _isExcessive(uint256 amount, uint256 ceiling) private pure returns (bool) {
if (amount > ceiling) { return true; } else { return false; }
}
function _isCompliant(address account, uint256 amount) private view returns (bool) {
if (balanceOf(account).add(amount) >= getRequirement()) { return true; } else { return false; }
}
function _isNotCompliant(address account, uint256 amount) private view returns (bool) {
if (balanceOf(account).sub(amount) < getRequirement()) { return true; } else { return false; }
}
function _isElastic() private view returns (bool) {
if (getContributorsTotal() <= getContributorsLimit() && getContributorsTotal() > 0) { return true; } else { return false; }
}
function _environment() private view returns (address) {
return address(this);
}
function _time() private view returns (uint256) {
return block.timestamp;
}
}
contract TDE is Context {
using SafeMath for uint256;
Token private _token;
IUniswapV2Router02 private _uniswapRouter = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
uint256 private constant _TOKEN_ALLOCATION_SALE = 40000000000000000000000;
uint256 private constant _FIRST_CEILING = 100 ether;
uint256 private constant _TOTAL_CEILING = 1250 ether;
uint8 private constant _LOYALTY_PERCENT = 25;
uint8 private constant _UNISWAP_PERCENT = 45;
uint256 private constant _UNISWAP_RATE = 11;
uint256 private constant _MIN_CONTRIBUTION = 1 ether;
uint256 private constant _MAX_CONTRIBUTION_FIRST_MOVER_STAGE_NOT_WHITELISTED = 5 ether;
uint256 private constant _MAX_CONTRIBUTION_FIRST_MOVER_STAGE_WHITELISTED = 10 ether;
uint8 private constant _MULTIPLIER = 150;
uint8 private constant _DENOMINATOR = 100;
uint8 private constant _PRECISION = 100;
uint32 private constant _DURATION = 7 days;
uint256 private _launch;
uint256 private _over;
uint256 private _fr;
uint256 private _rr;
mapping(address => uint256) private _contributions;
mapping(address => bool) private _whitelisted;
address payable private _wallet;
uint256 public _tokens;
uint256 private _buffer;
uint256 private _funds;
bool private _locked;
bool private _legacy;
event Configured(
uint256 rate1,
uint256 rate2);
event Contributed(
address indexed account,
uint256 amount);
event LiquidityLocked(
uint256 amountETH,
uint256 amountToken);
event Finalized(
uint256 time);
event Destroyed(
uint256 amount);
constructor(address token, address payable wallet) public {
require(token != address(0),
"error: must not be zero address");
require(wallet != address(0),
"error: must not be zero address");
_buffer = (_TOTAL_CEILING.mul(_UNISWAP_PERCENT).div(_DENOMINATOR)).mul(_UNISWAP_RATE);
_tokens = _TOKEN_ALLOCATION_SALE.sub(_buffer);
_launch = _time();
_over = _launch.add(_DURATION);
_token = Token(token);
_wallet = wallet;
_calculateRates();
}
receive() external payable {
require(!_isOver(),
"error: must not be over");
if (_token.balanceOf(_environment()) == 0) revert();
if (_token.balanceOf(_environment()) > 0) _contribute();
}
function lockLiquidity() external returns (bool) {
require(_isOver(),
"error: must be over");
require(!_isLocked(),
"error: must not be locked");
_locked = true;
uint256 amountETHForUniswap = (getFunds().mul(_UNISWAP_PERCENT)).div(_DENOMINATOR);
uint256 amountGFIForUniswap = (amountETHForUniswap.mul((_UNISWAP_RATE.mul(_PRECISION)))).div(_PRECISION);
require(_token.unpause(),
"error: must be unpausable");
require(_token.approve(address(_uniswapRouter), amountGFIForUniswap),
"error: must be approved");
_uniswapRouter.addLiquidityETH
{ value: amountETHForUniswap }
(
address(_token),
amountGFIForUniswap,
0,
0,
address(0),
_time()
);
emit LiquidityLocked(amountETHForUniswap, amountGFIForUniswap);
return true;
}
function whitelist() external returns (bool) {
require(!_legacy,
"error: must not already have whitelisted legacy contributors");
_whitelisted[0xdec08cb92a506B88411da9Ba290f3694BE223c26] = true;
_whitelisted[0x5782728c449fCF4D5FA2644a5680ba66b2d9327F] = true;
_whitelisted[0xdec08cb92a506B88411da9Ba290f3694BE223c26] = true;
_whitelisted[0x5782728c449fCF4D5FA2644a5680ba66b2d9327F] = true;
_whitelisted[0xe15863985BE0c9Fb9D590E2d1D6486a551d63e06] = true;
_whitelisted[0xa7E3058e7C4eB1b18a4c18C69983daA8D724bd28] = true;
_whitelisted[0xBB1095B606774b6bD4e64619BF2239D152BB6774] = true;
_whitelisted[0xDDFB4C1841d57C9aCAe1dC1D1c8C1EAecc1568FC] = true;
_whitelisted[0xB16E1101CbB48F631AB4dBd54c801Ecef9B47D2b] = true;
_whitelisted[0xe0B54aa5E28109F6Aa8bEdcff9622D61a75E6B83] = true;
_whitelisted[0x75B0bBD46d7752CB2f5FfE645467e0ce6E389795] = true;
_whitelisted[0x9fdB427dCD7cB55C7F228a3b5C9814c086C4dC94] = true;
_whitelisted[0x63BD5327D12A93c7265785Ced9d7693cadBb40d8] = true;
_whitelisted[0xfEEAa6A2aE0D4a15e947AFC71DC249A29Dc2778d] = true;
_whitelisted[0x0FB5B52cA714D07321A4913408B00e83675b53F8] = true;
_whitelisted[0xCbaFAE637587e048cAd5B2f9736996A76308D99E] = true;
_whitelisted[0x6Ee6107a6C9aDB834d6ba0985dDA992905526e5a] = true;
_whitelisted[0xd838a891E891d9E59942a5d04d26B1b67a0e6779] = true;
_whitelisted[0xf0478C748428f35ab13a965BB76A170A6359B00B] = true;
_whitelisted[0xff37697171B95605b4511030C9Cdc2dcEA0A51e2] = true;
_whitelisted[0x9C705a173ab01929a29c68D1e3627F744A9ECE24] = true;
_whitelisted[0x75ef5403b6E53686fE5eF3376d87BB5E84671E1e] = true;
_whitelisted[0x27388bdbC5132d8348981C7f68a86326e4330AD3] = true;
_whitelisted[0x89B404b52ab50Fd3e7ff316d5C659cbcB8dc700b] = true;
_whitelisted[0xe36288736e5a45c27ee6FA2F8d1A1aeD99D3eA63] = true;
_whitelisted[0xd491447348c474aF15c40839D3e0056A80fEC352] = true;
_whitelisted[0xD6eEF3cf97A349960b0C976929BAE90435b2BFb2] = true;
_whitelisted[0xa76B0152fE8BC2eC3CbfAC3D3ecee4A397747051] = true;
_whitelisted[0xcC05590bA009b10CB30A7b7e87e2F517Ea2F4301] = true;
_whitelisted[0x6400E53111Fd4B600814fcCdb990C8EDD18780C3] = true;
_whitelisted[0x710049Cfe15475b24D587CC2bF5fFa2007E7a9BE] = true;
_whitelisted[0xD8D55b75dE1b10A1fC9811c0c1422C241093c21c] = true;
_whitelisted[0xDb8FeDAB0fDAD50d4Fa79096F6217185e4157B76] = true;
_whitelisted[0x109f860cFb26339e7635e0BD33D24FA419566CC6] = true;
_whitelisted[0x3Dd4234DaeefBaBCeAA6068C04C3f75F19aa2cdA] = true;
_whitelisted[0x0613e2c0e58E811e358C0e26B51842eEDA05AEd4] = true;
_whitelisted[0x5BBe5c40AF27DBe17adb4Cf24a4793D4dBFF5614] = true;
_whitelisted[0xED66081dF3f42a5e3Ce388F93815Eff87462F1CE] = true;
_whitelisted[0xCDa9BFE9D578003E9dBDC90A5Dd1E9B0F52C01f6] = true;
_whitelisted[0x40428BdeDDb4FFc6124e1a96692968aB3e03F7d8] = true;
_whitelisted[0x83f81720e2cEf8e246a3c24dB897afEb48a978fa] = true;
_whitelisted[0x7FCA6E58FE281389901cA313Be31d0ba0c29c4cc] = true;
_whitelisted[0x4c9C3626Cf1828Da7b58a50DC2F6AA2C4546609e] = true;
_whitelisted[0xf30b321970b3a4BBA00d068284F9E4C09D2befE1] = true;
_whitelisted[0x66D45a58CF49f054938c0a288793c420Fe98bB04] = true;
_whitelisted[0xB4AAe67267a76c11F2A00Fe7304c6D716c2f65E5] = true;
_whitelisted[0x92b5a3f06fe24CeA07a6F92aA94F2994d481Afc8] = true;
_whitelisted[0x8dB7147b554B739058E74C01042d2aEA44505E2F] = true;
_whitelisted[0x2019E3f8b40B144ef1FBf92c4e36DF981F37ba2c] = true;
_whitelisted[0x8c3De1634251D1e51C28844391FC9c11abB9F5E4] = true;
_whitelisted[0x1De8EE475989A81a353ec6e4ea5a5C0aC60642d0] = true;
_whitelisted[0x29Bf6652e795C360f7605be0FcD8b8e4F29a52d4] = true;
_whitelisted[0x9Dd80697C85De40890D355a38cec7a8d3Dc9D71a] = true;
_whitelisted[0xa4D8e21f63E875C1B544d324908f5bABd4D1960D] = true;
_whitelisted[0x9d1b27796Adb236512D4bc0f26dE4C12dFde37d0] = true;
_whitelisted[0xce3e142Bc70F5a0f674A2ef5649b3248842cf1A5] = true;
_whitelisted[0xBE719b05B4dBF02ed9555ef92d36d746312403AE] = true;
_whitelisted[0x65a7C3Cb6d1C3cEf361063C57936d9d4c9D7bCAB] = true;
_whitelisted[0x2019E3f8b40B144ef1FBf92c4e36DF981F37ba2c] = true;
_whitelisted[0x8EDAB1576B34b0BFdcdF4F368eFDE5200ff6F4e8] = true;
_whitelisted[0x77543419f10E8C04BcAF826C2dB9C3bEDDEfBa40] = true;
_whitelisted[0x05FB3770CA63ECEE9C5a6874254022820DbEf944] = true;
_legacy = true;
return true;
}
function finalize() external returns (bool) {
require(_isOver(),
"error: must be over");
require(_isLocked(),
"error: must be locked");
_vault();
_destroy();
emit Finalized(_time());
return true;
}
function getLaunch() public view returns (uint256) {
return _launch;
}
function getOver() public view returns (uint256) {
return _over;
}
function getFunds() public view returns (uint256) {
return _funds;
}
function getContribution(address contributor) public view returns (uint256) {
return _contributions[contributor];
}
function getContributionBonus(address contributor) public view returns (uint8) {
if (_isWhitelisted(contributor)) { return _LOYALTY_PERCENT; } else { return 0; }
}
function getContributionCeiling(address contributor) public view returns (uint256) {
if (_isWhitelisted(contributor)) {
return _MAX_CONTRIBUTION_FIRST_MOVER_STAGE_WHITELISTED;
} else {
return _MAX_CONTRIBUTION_FIRST_MOVER_STAGE_NOT_WHITELISTED;
}
}
function _calculateRates() private returns (bool) {
require(_isNotConfigured(),
"error: must not be configured");
_rr = (_tokens.sub(_buffer)).div(_TOTAL_CEILING);
_fr = (_rr.mul(_MULTIPLIER)).div(_DENOMINATOR);
Configured(_fr, _rr);
return true;
}
function _contribute() private returns (bool) {
address contributor = _msgSender();
uint256 contribution = msg.value;
require(_checkContribution(contribution),
"error: must comply with contribution requirements");
uint256 contributorCeiling = getContributionCeiling(contributor);
uint256 contributorBonus = getContributionBonus(contributor);
uint256 processedContribution;
uint256 excessContribution;
uint256 tokens;
uint256 bonus;
if (_isFirstMover()) {
require(_isWithinCeiling(contributor, contribution, contributorCeiling),
"error: contribution must not exceed contributor ceiling");
processedContribution = _FIRST_CEILING.sub(getFunds());
if (_isExcessive(contribution, processedContribution)) {
excessContribution = contribution.sub(processedContribution);
tokens = (processedContribution.mul(_fr)).add(excessContribution.mul(_rr));
if (contributorBonus > 0) {
bonus = (tokens.mul(contributorBonus)).div(_DENOMINATOR);
tokens = tokens.add(bonus);
}
require(_token.transfer(contributor, tokens),
"error: must be transferable");
_funds = _funds.add(contribution);
_contributions[contributor] = _getContribution(contributor).add(contribution);
_tokens = _tokens.sub(tokens);
emit Contributed(contributor, processedContribution);
return true;
} else {
tokens = (contribution.mul(_fr));
if (contributorBonus > 0) {
bonus = (tokens.mul(contributorBonus)).div(_DENOMINATOR);
tokens = tokens.add(bonus);
}
require(_token.transfer(contributor, tokens),
"error: must be transferable");
_funds = _funds.add(contribution);
_contributions[contributor] = _getContribution(contributor).add(contribution);
_tokens = _tokens.sub(tokens);
emit Contributed(contributor, processedContribution);
return true;
}
} else {
tokens = contribution.mul(_rr);
processedContribution = _TOTAL_CEILING.sub(getFunds());
if (_isExcessive(contribution, processedContribution)) {
excessContribution = contribution.sub(processedContribution);
processedContribution = contribution.sub(excessContribution);
tokens = processedContribution.mul(_rr);
if (contributorBonus > 0) {
bonus = (tokens.mul(contributorBonus)).div(_DENOMINATOR);
tokens = tokens.add(bonus);
if (_isExcessive(tokens, _tokens)) {
uint256 excessTokens = tokens.sub(_tokens);
uint256 excessETH = (excessTokens.sub((excessTokens.mul(contributorBonus)).div(_DENOMINATOR))).div(_rr);
excessContribution = excessContribution.add(excessETH);
processedContribution = processedContribution.sub(excessETH);
tokens = _tokens;
}
}
_msgSender().transfer(excessContribution);
require(_token.transfer(contributor, tokens),
"error: must be transferable");
_funds = _funds.add(processedContribution);
_tokens = _tokens.sub(tokens);
_contributions[contributor] = _getContribution(contributor).add(processedContribution);
emit Contributed(contributor, processedContribution);
return true;
}
if (contributorBonus > 0) {
bonus = (tokens.mul(contributorBonus)).div(_DENOMINATOR);
tokens = tokens.add(bonus);
}
require(_token.transfer(contributor, tokens),
"error: must be transferable");
_funds = _funds.add(contribution);
_tokens = _tokens.sub(tokens);
_contributions[contributor] = _getContribution(contributor).add(contribution);
emit Contributed(contributor, contribution);
return true;
}
}
function _vault() private returns (bool) {
_wallet.transfer(_environment().balance);
return true;
}
function _destroy() private returns (bool) {
uint256 amount = _token.balanceOf(_environment());
_token.burn(amount);
emit Destroyed(amount);
return true;
}
function _checkContribution(uint256 amount) private view returns (bool) {
require(_isLaunched(),
"error: must be launched");
require(_isActive(),
"error: must be active");
require(amount >= _MIN_CONTRIBUTION,
"error: must be more or equal to the minimum contribution");
require(getFunds() < _TOTAL_CEILING,
"error: must not have reached maximum funds");
return true;
}
function _isLaunched() private view returns (bool) {
if (getLaunch() > 0) { return true; } else { return false; }
}
function _isNotConfigured() private view returns (bool) {
if (_fr == 0 && _rr == 0) { return true; } else { return false; }
}
function _isActive() private view returns (bool) {
if (getOver() > _time() || getFunds() < _TOTAL_CEILING) { return true; } else { return false; }
}
function _isFirstMover() private view returns (bool) {
if (getFunds() < _FIRST_CEILING) { return true; } else { return false; }
}
function _isExcessive(uint256 amount, uint256 ceiling) private pure returns (bool) {
if (amount > ceiling) { return true; } else { return false; }
}
function _isWhitelisted(address contributor) private view returns (bool) {
if (_whitelisted[contributor]) { return true; } else { return false; }
}
function _isWithinCeiling(address contributor, uint256 amount, uint256 ceiling) private view returns (bool) {
if (_contributions[contributor].add(amount) <= ceiling) { return true; } else { return false; }
}
function _getContribution(address contributor) private view returns (uint256) {
return _contributions[contributor];
}
function _isOver() private view returns (bool) {
if (getOver() <= _time() || getFunds() >= _TOTAL_CEILING || _tokens == 0) { return true; } else { return false; }
}
function _isLocked() private view returns (bool) {
return _locked;
}
function _environment() private view returns (address) {
return address(this);
}
function _time() private view returns (uint256) {
return block.timestamp;
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address payable","name":"wallet","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"rate1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rate2","type":"uint256"}],"name":"Configured","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Contributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Destroyed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"Finalized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountETH","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountToken","type":"uint256"}],"name":"LiquidityLocked","type":"event"},{"inputs":[],"name":"_tokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"finalize","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contributor","type":"address"}],"name":"getContribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contributor","type":"address"}],"name":"getContributionBonus","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contributor","type":"address"}],"name":"getContributionCeiling","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFunds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLaunch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOver","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockLiquidity","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
6080604052600180546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d1790553480156200003757600080fd5b506040516200281b3803806200281b833981810160405260408110156200005d57600080fd5b5080516020909101516001600160a01b038216620000c2576040805162461bcd60e51b815260206004820152601f60248201527f6572726f723a206d757374206e6f74206265207a65726f206164647265737300604482015290519081900360640190fd5b6001600160a01b0381166200011e576040805162461bcd60e51b815260206004820152601f60248201527f6572726f723a206d757374206e6f74206265207a65726f206164647265737300604482015290519081900360640190fd5b62000174600b6200016060646200014c6843c33c193756480000602d62000225602090811b62001cd417901c565b6200028c60201b62001d871790919060201c565b6200022560201b62001cd41790919060201c565b600a81905550620001a0600a54690878678326eac9000000620002d660201b62001c6f1790919060201c565b600955620001b66001600160e01b036200032016565b6002819055620001d69062093a8062000325602090811b62001d2d17901c565b600355600080546001600160a01b038085166001600160a01b03199283161790925560088054928416929091169190911790556200021c6001600160e01b036200038016565b505050620005b3565b600082620002365750600062000286565b828202828482816200024457fe5b0414620002835760405162461bcd60e51b8152600401808060200182810382526021815260200180620027fa6021913960400191505060405180910390fd5b90505b92915050565b60006200028383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506200048260201b60201c565b60006200028383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506200052960201b60201c565b425b90565b60008282018381101562000283576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000620003956001600160e01b036200058616565b620003e7576040805162461bcd60e51b815260206004820152601d60248201527f6572726f723a206d757374206e6f7420626520636f6e66696775726564000000604482015290519081900360640190fd5b620004136843c33c1937564800006200014c600a54600954620002d660201b62001c6f1790919060201c565b600581905562000439906064906200014c90609662000225602090811b62001cd417901c565b600481905560055460408051928352602083019190915280517ff314bf3c90b46e174ab99f91ef073816e45a9c6a734a681fc5a6dfe947d71a2e9281900390910190a150600190565b60008183620005125760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015620004d6578181015183820152602001620004bc565b50505050905090810190601f168015620005045780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816200051f57fe5b0495945050505050565b600081848411156200057e5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315620004d6578181015183820152602001620004bc565b505050900390565b600060045460001480156200059b5750600554155b15620005aa5750600162000322565b50600062000322565b61223780620005c36000396000f3fe6080604052600436106100955760003560e01c80638970d84c116100595780638970d84c1461030c57806393e59dc114610321578063bb2f719914610336578063d213f62e1461034b578063eb4c4f481461037e57610226565b806319f28d491461022b57806321eff7fc146102745780634bb278f3146102b95780634d9b3735146102e25780637b07dc36146102f757610226565b36610226576100a2610393565b156100f4576040805162461bcd60e51b815260206004820152601760248201527f6572726f723a206d757374206e6f74206265206f766572000000000000000000604482015290519081900360640190fd5b6000546001600160a01b03166370a0823161010d6103e1565b6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561015357600080fd5b505afa158015610167573d6000803e3d6000fd5b505050506040513d602081101561017d57600080fd5b505161018857600080fd5b600080546001600160a01b03166370a082316101a26103e1565b6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156101e857600080fd5b505afa1580156101fc573d6000803e3d6000fd5b505050506040513d602081101561021257600080fd5b50511115610224576102226103e5565b505b005b600080fd5b34801561023757600080fd5b5061025e6004803603602081101561024e57600080fd5b50356001600160a01b0316610b80565b6040805160ff9092168252519081900360200190f35b34801561028057600080fd5b506102a76004803603602081101561029757600080fd5b50356001600160a01b0316610ba1565b60408051918252519081900360200190f35b3480156102c557600080fd5b506102ce610bbc565b604080519115158252519081900360200190f35b3480156102ee57600080fd5b506102a7610cb0565b34801561030357600080fd5b506102a7610cb6565b34801561031857600080fd5b506102a7610cbc565b34801561032d57600080fd5b506102ce610cc2565b34801561034257600080fd5b506102ce6116c4565b34801561035757600080fd5b506102a76004803603602081101561036e57600080fd5b50356001600160a01b0316611a85565b34801561038a57600080fd5b506102a7611ab3565b600061039d611ab9565b6103a5611ab3565b1115806103c257506843c33c1937564800006103bf610cb0565b10155b806103cd5750600954155b156103da575060016103de565b5060005b90565b3090565b6000806103f0611abd565b9050346103fc81611ac1565b6104375760405162461bcd60e51b81526004018080602001828103825260318152602001806120db6031913960400191505060405180910390fd5b600061044283611a85565b9050600061044f84610b80565b60ff169050600080600080610462611c0a565b156106f357610472888888611c2c565b6104ad5760405162461bcd60e51b81526004018080602001828103825260378152602001806121cb6037913960400191505060405180910390fd5b6104ce6104b8610cb0565b68056bc75e2d631000009063ffffffff611c6f16565b93506104da8785611cba565b156106df576104ef878563ffffffff611c6f16565b925061052961050960055485611cd490919063ffffffff16565b60045461051d90879063ffffffff611cd416565b9063ffffffff611d2d16565b91508415610567576105526064610546848863ffffffff611cd416565b9063ffffffff611d8716565b9050610564828263ffffffff611d2d16565b91505b600080546040805163a9059cbb60e01b81526001600160a01b038c81166004830152602482018790529151919092169263a9059cbb92604480820193602093909283900390910190829087803b1580156105c057600080fd5b505af11580156105d4573d6000803e3d6000fd5b505050506040513d60208110156105ea57600080fd5b505161063d576040805162461bcd60e51b815260206004820152601b60248201527f6572726f723a206d757374206265207472616e7366657261626c650000000000604482015290519081900360640190fd5b600b54610650908863ffffffff611d2d16565b600b556106608761051d8a610ba1565b6001600160a01b03891660009081526006602052604090205560095461068c908363ffffffff611c6f16565b6009556040805185815290516001600160a01b038a16917f62722348256371b5147820d6cad90c40fd2da1ccee18c3ed52c0bca5a61dbbab919081900360200190a26001985050505050505050506103de565b60045461052990889063ffffffff611cd416565b60055461070790889063ffffffff611cd416565b915061072a610714610cb0565b6843c33c1937564800009063ffffffff611c6f16565b93506107368785611cba565b156109de5761074b878563ffffffff611c6f16565b925061075d878463ffffffff611c6f16565b935061077460055485611cd490919063ffffffff16565b9150841561082b576107916064610546848863ffffffff611cd416565b90506107a3828263ffffffff611d2d16565b91506107b182600954611cba565b1561082b5760006107cd60095484611c6f90919063ffffffff16565b6005549091506000906107fd906105466107f0606482878d63ffffffff611cd416565b859063ffffffff611c6f16565b905061080f858263ffffffff611d2d16565b9450610821868263ffffffff611c6f16565b9550600954935050505b610833611abd565b6001600160a01b03166108fc849081150290604051600060405180830381858888f1935050505015801561086b573d6000803e3d6000fd5b50600080546040805163a9059cbb60e01b81526001600160a01b038c81166004830152602482018790529151919092169263a9059cbb92604480820193602093909283900390910190829087803b1580156108c557600080fd5b505af11580156108d9573d6000803e3d6000fd5b505050506040513d60208110156108ef57600080fd5b5051610942576040805162461bcd60e51b815260206004820152601b60248201527f6572726f723a206d757374206265207472616e7366657261626c650000000000604482015290519081900360640190fd5b600b54610955908563ffffffff611d2d16565b600b5560095461096b908363ffffffff611c6f16565b60095561097b8461051d8a610ba1565b6001600160a01b038916600081815260066020908152604091829020939093558051878152905191927f62722348256371b5147820d6cad90c40fd2da1ccee18c3ed52c0bca5a61dbbab92918290030190a26001985050505050505050506103de565b8415610a0e576109f96064610546848863ffffffff611cd416565b9050610a0b828263ffffffff611d2d16565b91505b600080546040805163a9059cbb60e01b81526001600160a01b038c81166004830152602482018790529151919092169263a9059cbb92604480820193602093909283900390910190829087803b158015610a6757600080fd5b505af1158015610a7b573d6000803e3d6000fd5b505050506040513d6020811015610a9157600080fd5b5051610ae4576040805162461bcd60e51b815260206004820152601b60248201527f6572726f723a206d757374206265207472616e7366657261626c650000000000604482015290519081900360640190fd5b600b54610af7908863ffffffff611d2d16565b600b55600954610b0d908363ffffffff611c6f16565b600955610b1d8761051d8a610ba1565b6001600160a01b0389166000818152600660209081526040918290209390935580518a8152905191927f62722348256371b5147820d6cad90c40fd2da1ccee18c3ed52c0bca5a61dbbab92918290030190a26001985050505050505050506103de565b6000610b8b82611dc9565b15610b9857506019610b9c565b5060005b919050565b6001600160a01b031660009081526006602052604090205490565b6000610bc6610393565b610c0d576040805162461bcd60e51b815260206004820152601360248201527232b93937b91d1036bab9ba1031329037bb32b960691b604482015290519081900360640190fd5b610c15611df2565b610c5e576040805162461bcd60e51b8152602060048201526015602482015274195c9c9bdc8e881b5d5cdd081899481b1bd8dad959605a1b604482015290519081900360640190fd5b610c66611dfb565b50610c6f611e52565b507f839cf22e1ba87ce2f5b9bbf46cf0175a09eed52febdfaac8852478e68203c763610c99611ab9565b60408051918252519081900360200190a150600190565b600b5490565b60025490565b60095481565b600c54600090610100900460ff1615610d0c5760405162461bcd60e51b815260040180806020018281038252603c81526020018061218f603c913960400191505060405180910390fd5b5060076020527f0c4f74400277bc9ebfde150d808b40c98b167dc7a3f8fa3fce766e39c031156f80547f63ede79f6715e0388dbc17ca5b2e6d337dbb73ceba352307c6c9feda7f393b36805460ff19928316600190811784168117909455821683178216831790557ffca776baf84360d837d4844dabdd99bce023edc2501147db1731d4e5e00e543680548216831790557fd10dcce221972ecb385cb9671a4181901ed8c2ed09f79be2128a29f67be904a380548216831790557fbe6948d6872952e5d72d4c052ba06253eb169aae18ffd799edae6f9ada106d1880548216831790557fc147f1a1f003cca9465956d0a5094092fddd699378a15a53772daaa01ae0755180548216831790557f16cd8f2b9b3bdd26a2550babbb9578d06de5f51f5adab51f7f729bca4ee94f0f80548216831790557f46b4bfadbd89931105aabc58ea09c8cc73cf4182fba899587cdf7896d4ba2af880548216831790557feb04b378943f4042794c767458a8a4c93b1fac667af7c6ece2fda78c27c6118380548216831790557feefa7f836f5e87643d555ad633fbd3d2dd838208401bcd82c53f6d01a654bc2280548216831790557ff465ec26741fd9702dd5f4c7e1731d5de6f0ec12bd1cf89b5ba76428820670ba80548216831790557f5a33bab911b45070d9caaf0d54880203cc899674845e74b618dfedde7649a13e80548216831790557fc01e1e63b2b5c5d4784c86cc890081a0693a6ee0796908fc37d0022d602d390a80548216831790557f9729261abbeae23652d9a4f3cbd8e57966e8a1ede368a7cded438c4a1d84e97680548216831790557fd3abf9eac845186d04f3aa9bb6dbd768228561491813404148fca70bd003c78080548216831790557f1c5064f3eca50236bd532ece94e5a5a8a205540b751bb1b3269e496f73e4a57f80548216831790557f492d26a99d2fd31724c9e583a21f86e73329c7c8a4b779b95737e1ad37aa03f780548216831790557f97d4bf73de36548759fd524ed8e1a2d8c97bfb6ce54eea3d7a537b44538151fc80548216831790557f9f0699132d9ec82357a19a389eb01adda5dc972e34a623eb78c567c20a9cfba980548216831790557f9b236971fc43f7665d850bebaefd3d35b179c93faada5881da0b5901b4cb085f80548216831790557fbacbbf2e44dd911fccfcd8fcdf0855db480956aba70fc8eb327ccb9e360a7f8a80548216831790557fb37d0aef72f87a2ae0f0c6215aaf6eb1a7c734dbf589f8f9413df48e10dc7f1580548216831790557fd42eda0c91c0efe1287f0918576a21ae5b358ddc6455f97b24591640ac30311380548216831790557ff92717cfe0b6330bb94f1fee6211300d7f3ba8f72a16244161c3b0ef03be850a80548216831790557fc047173addcc53fa2cda82a633c51f921df3c561575708547155d761ee53ffde80548216831790557fc406acef5e6698d60e57ae90d885e83b1c4c5016dd5634fa21af3f82cbb8107080548216831790557f06b4c2e9cafc107e255b8e0e5a2f1b0a1bc71d9c1230b8d6e4e22fb06a6cacbb80548216831790557fc5419f760fff43ec148ebe02ea68928f16b8e8f911d68dc9a8ae737a3ae505bb80548216831790557f7b00169774f0ac692c54318e6799cc99bffb16bf1b887532a8c98a1d752da84f80548216831790557fd2f12e2128f472486fafe5ba5915cd75f36e8ac4514fd7eff74f224cefacbb1d80548216831790557f9eca4d1cb6021c50f377bd9605dd4ceb962e56789ee1b817402a95dc2ef95fb580548216831790557f4e3190177450bf3c0569a5fa5ebdbe146b6589fbe9a43ff5c533ebb00dad4d0580548216831790557f0140275e51f9796e08ebdd85aeb7461aa5525b6c7f30b685ea9e29c9d480592780548216831790557f10c46ca3996014c31e2d96c736bdfa113f04311568a8cf7ab26e42fa6a007b5180548216831790557f58671f0070d2f40a29e57a7fd2cb478ef144f7173679c842a51195ed54d53fea80548216831790557f9a2571fd168fbc241cecf552bf2328e48fc50a361579b1cd52ac866af50bbf2f80548216831790557fec25f9b0308372e6b04688519b7c8f666a058429239421e9a0a3c439760a9d6a80548216831790557f38aa1216e40105b784dd2f594ea3d84611599d63435ee2706579e53b44043e5380548216831790557fd52704390f47368860344b6f5bff464a9c792a971ef9a5e15551205e2b66b01280548216831790557f6ccf6051e0c7d84e03c444737f0d89628d25e7ae4fdd7006c236d70e8989978880548216831790557f7f85b95f14c985bebc9ae606c9e75480bba9e2649f3d33edab779869b9cacf5c80548216831790557f3d4346477ec63e7754ad0fbd2fe4499c5a4037abaeffdbf9210dbe3a404af3e380548216831790557f4f091d3a005b08a3d99b6d866baceeac0f5374e6e5e232d5eecc135568f6913680548216831790557fc25c04b0cd1125543fd8de62e43dad78b318c1047e2d689e768e6d969df99fc880548216831790557f0b4924a25b1c8c484f801dc495a3f913cb9de8e779f9b2e3c300d2acdbbb329b80548216831790557f25846e14bb5d80c7de1d95505a5022edd7e7203cf691aaca206e872cbdb91cb280548216831790557f7e684b25ca3c77cf6d19ead8b0303e03ff1f06817c64066097743a7b9c5dcd0e80547f4838f250864fd5d6f84fb2ad95315d965e8c883143999979dde253641daa3f2180548416851790557fc303b1e48154cd75040bd36d392b589fa60c14804d1bc2790d4206287b6fa1b580548416851790557fe71cd27f42dd3326e4979d063c92a589abefebf775b315c4fc72e1e3e81bac3c80548416851790557f4048c797b19f33d1192c0663794e1d3c92c35d11ace404f6ab92b805fda0412980548416851790557f840a742c67969de5c576f823f56d617a2e0a9ce2cc2301aff2a772d7dc0a114580548416851790557f78ae430f0a20043f57eedb4f8cbf2a4e007d25151e47018e046bd593fbdd4ac580548416851790557fe0852039314b5b632a07b3a598ffdcf2df6c52cb9616471453cc6ffecb9650f080548416851790557ffbf103f3f8f2543b157f12c64e9c8a027cd3cfc372677121d8714ff6699d386480548416851790557f99ba2568b875bfe15c371ad87d7d16e8c77c21231de9d89fcc13f3a52677e7878054841685179055821683178216831790557f1e3ca1c77f99ef1771c947d7c738fb439357e650ef0d68712edaa1221419911a80548216831790557f377a18e1933b81df4d7480ad8a682387e372995583476178f90a06bd7cc0a82780548216831790557305fb3770ca63ecee9c5a6874254022820dbef9446000527f0d3feb1f76c87e659507ebae1d7493a0aa72ec5d86cc571ada1c8b4c9ae5ba04805490911682179055600c805461ff00191661010017905590565b60006116ce610393565b611715576040805162461bcd60e51b815260206004820152601360248201527232b93937b91d1036bab9ba1031329037bb32b960691b604482015290519081900360640190fd5b61171d611df2565b1561176f576040805162461bcd60e51b815260206004820152601960248201527f6572726f723a206d757374206e6f74206265206c6f636b656400000000000000604482015290519081900360640190fd5b600c805460ff19166001179055600061179c6064610546602d611790610cb0565b9063ffffffff611cd416565b905060006117c660646105466117b9600b8363ffffffff611cd416565b859063ffffffff611cd416565b90506000809054906101000a90046001600160a01b03166001600160a01b0316633f4ba83a6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561181757600080fd5b505af115801561182b573d6000803e3d6000fd5b505050506040513d602081101561184157600080fd5b5051611894576040805162461bcd60e51b815260206004820152601960248201527f6572726f723a206d75737420626520756e7061757361626c6500000000000000604482015290519081900360640190fd5b600080546001546040805163095ea7b360e01b81526001600160a01b039283166004820152602481018690529051919092169263095ea7b392604480820193602093909283900390910190829087803b1580156118f057600080fd5b505af1158015611904573d6000803e3d6000fd5b505050506040513d602081101561191a57600080fd5b505161196d576040805162461bcd60e51b815260206004820152601760248201527f6572726f723a206d75737420626520617070726f766564000000000000000000604482015290519081900360640190fd5b600154600080546001600160a01b039283169263f305d7199286929091169085908080611998611ab9565b6040518863ffffffff1660e01b815260040180876001600160a01b03166001600160a01b03168152602001868152602001858152602001848152602001836001600160a01b03166001600160a01b0316815260200182815260200196505050505050506060604051808303818588803b158015611a1457600080fd5b505af1158015611a28573d6000803e3d6000fd5b50505050506040513d6060811015611a3f57600080fd5b5050604080518381526020810183905281517fcb75aa8347c098d414422e8cafbbe4e2c1a229f5b27bf425984b2b9792aa787a929181900390910190a160019250505090565b6000611a9082611dc9565b15611aa45750678ac7230489e80000610b9c565b50674563918244f40000610b9c565b60035490565b4290565b3390565b6000611acb611f9a565b611b1c576040805162461bcd60e51b815260206004820152601760248201527f6572726f723a206d757374206265206c61756e63686564000000000000000000604482015290519081900360640190fd5b611b24611fb3565b611b6d576040805162461bcd60e51b81526020600482015260156024820152746572726f723a206d7573742062652061637469766560581b604482015290519081900360640190fd5b670de0b6b3a7640000821015611bb45760405162461bcd60e51b815260040180806020018281038252603881526020018061210c6038913960400191505060405180910390fd5b6843c33c193756480000611bc6610cb0565b10611c025760405162461bcd60e51b815260040180806020018281038252602a815260200180612144602a913960400191505060405180910390fd5b506001919050565b600068056bc75e2d63100000611c1e610cb0565b10156103da575060016103de565b6001600160a01b0383166000908152600660205260408120548290611c57908563ffffffff611d2d16565b11611c6457506001611c68565b5060005b9392505050565b6000611cb183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611fde565b90505b92915050565b600081831115611ccc57506001611cb4565b506000611cb4565b600082611ce357506000611cb4565b82820282848281611cf057fe5b0414611cb15760405162461bcd60e51b815260040180806020018281038252602181526020018061216e6021913960400191505060405180910390fd5b600082820183811015611cb1576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000611cb183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612075565b6001600160a01b03811660009081526007602052604081205460ff1615610b9857506001610b9c565b600c5460ff1690565b6008546000906001600160a01b03166108fc611e156103e1565b6001600160a01b0316319081150290604051600060405180830381858888f19350505050158015611e4a573d6000803e3d6000fd5b506001905090565b6000805481906001600160a01b03166370a08231611e6e6103e1565b6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611eb457600080fd5b505afa158015611ec8573d6000803e3d6000fd5b505050506040513d6020811015611ede57600080fd5b50516000805460408051630852cd8d60e31b81526004810185905290519394506001600160a01b03909116926342966c6892602480840193602093929083900390910190829087803b158015611f3357600080fd5b505af1158015611f47573d6000803e3d6000fd5b505050506040513d6020811015611f5d57600080fd5b50506040805182815290517ff15a2816d9b33bd70f4b57d8cfbd7ee75d3231d8c52a030fef8a86fb4adfe9479181900360200190a1600191505090565b600080611fa5610cb6565b11156103da575060016103de565b6000611fbd611ab9565b611fc5611ab3565b11806103cd57506843c33c193756480000611c1e610cb0565b6000818484111561206d5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561203257818101518382015260200161201a565b50505050905090810190601f16801561205f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836120c45760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561203257818101518382015260200161201a565b5060008385816120d057fe5b049594505050505056fe6572726f723a206d75737420636f6d706c79207769746820636f6e747269627574696f6e20726571756972656d656e74736572726f723a206d757374206265206d6f7265206f7220657175616c20746f20746865206d696e696d756d20636f6e747269627574696f6e6572726f723a206d757374206e6f7420686176652072656163686564206d6178696d756d2066756e6473536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f776572726f723a206d757374206e6f7420616c726561647920686176652077686974656c6973746564206c656761637920636f6e7472696275746f72736572726f723a20636f6e747269627574696f6e206d757374206e6f742065786365656420636f6e7472696275746f72206365696c696e67a26469706673582212203bc4bbfee0701fa3070aa9a0fb134093966977c460cb57d03f64acd19cb1f25464736f6c63430006070033536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77000000000000000000000000ad45320077fc7a0f0a43976ac7dbacc65ad21d8f000000000000000000000000b827ff81627edfa3711c40286d304951f92ee414
Deployed Bytecode
0x6080604052600436106100955760003560e01c80638970d84c116100595780638970d84c1461030c57806393e59dc114610321578063bb2f719914610336578063d213f62e1461034b578063eb4c4f481461037e57610226565b806319f28d491461022b57806321eff7fc146102745780634bb278f3146102b95780634d9b3735146102e25780637b07dc36146102f757610226565b36610226576100a2610393565b156100f4576040805162461bcd60e51b815260206004820152601760248201527f6572726f723a206d757374206e6f74206265206f766572000000000000000000604482015290519081900360640190fd5b6000546001600160a01b03166370a0823161010d6103e1565b6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561015357600080fd5b505afa158015610167573d6000803e3d6000fd5b505050506040513d602081101561017d57600080fd5b505161018857600080fd5b600080546001600160a01b03166370a082316101a26103e1565b6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156101e857600080fd5b505afa1580156101fc573d6000803e3d6000fd5b505050506040513d602081101561021257600080fd5b50511115610224576102226103e5565b505b005b600080fd5b34801561023757600080fd5b5061025e6004803603602081101561024e57600080fd5b50356001600160a01b0316610b80565b6040805160ff9092168252519081900360200190f35b34801561028057600080fd5b506102a76004803603602081101561029757600080fd5b50356001600160a01b0316610ba1565b60408051918252519081900360200190f35b3480156102c557600080fd5b506102ce610bbc565b604080519115158252519081900360200190f35b3480156102ee57600080fd5b506102a7610cb0565b34801561030357600080fd5b506102a7610cb6565b34801561031857600080fd5b506102a7610cbc565b34801561032d57600080fd5b506102ce610cc2565b34801561034257600080fd5b506102ce6116c4565b34801561035757600080fd5b506102a76004803603602081101561036e57600080fd5b50356001600160a01b0316611a85565b34801561038a57600080fd5b506102a7611ab3565b600061039d611ab9565b6103a5611ab3565b1115806103c257506843c33c1937564800006103bf610cb0565b10155b806103cd5750600954155b156103da575060016103de565b5060005b90565b3090565b6000806103f0611abd565b9050346103fc81611ac1565b6104375760405162461bcd60e51b81526004018080602001828103825260318152602001806120db6031913960400191505060405180910390fd5b600061044283611a85565b9050600061044f84610b80565b60ff169050600080600080610462611c0a565b156106f357610472888888611c2c565b6104ad5760405162461bcd60e51b81526004018080602001828103825260378152602001806121cb6037913960400191505060405180910390fd5b6104ce6104b8610cb0565b68056bc75e2d631000009063ffffffff611c6f16565b93506104da8785611cba565b156106df576104ef878563ffffffff611c6f16565b925061052961050960055485611cd490919063ffffffff16565b60045461051d90879063ffffffff611cd416565b9063ffffffff611d2d16565b91508415610567576105526064610546848863ffffffff611cd416565b9063ffffffff611d8716565b9050610564828263ffffffff611d2d16565b91505b600080546040805163a9059cbb60e01b81526001600160a01b038c81166004830152602482018790529151919092169263a9059cbb92604480820193602093909283900390910190829087803b1580156105c057600080fd5b505af11580156105d4573d6000803e3d6000fd5b505050506040513d60208110156105ea57600080fd5b505161063d576040805162461bcd60e51b815260206004820152601b60248201527f6572726f723a206d757374206265207472616e7366657261626c650000000000604482015290519081900360640190fd5b600b54610650908863ffffffff611d2d16565b600b556106608761051d8a610ba1565b6001600160a01b03891660009081526006602052604090205560095461068c908363ffffffff611c6f16565b6009556040805185815290516001600160a01b038a16917f62722348256371b5147820d6cad90c40fd2da1ccee18c3ed52c0bca5a61dbbab919081900360200190a26001985050505050505050506103de565b60045461052990889063ffffffff611cd416565b60055461070790889063ffffffff611cd416565b915061072a610714610cb0565b6843c33c1937564800009063ffffffff611c6f16565b93506107368785611cba565b156109de5761074b878563ffffffff611c6f16565b925061075d878463ffffffff611c6f16565b935061077460055485611cd490919063ffffffff16565b9150841561082b576107916064610546848863ffffffff611cd416565b90506107a3828263ffffffff611d2d16565b91506107b182600954611cba565b1561082b5760006107cd60095484611c6f90919063ffffffff16565b6005549091506000906107fd906105466107f0606482878d63ffffffff611cd416565b859063ffffffff611c6f16565b905061080f858263ffffffff611d2d16565b9450610821868263ffffffff611c6f16565b9550600954935050505b610833611abd565b6001600160a01b03166108fc849081150290604051600060405180830381858888f1935050505015801561086b573d6000803e3d6000fd5b50600080546040805163a9059cbb60e01b81526001600160a01b038c81166004830152602482018790529151919092169263a9059cbb92604480820193602093909283900390910190829087803b1580156108c557600080fd5b505af11580156108d9573d6000803e3d6000fd5b505050506040513d60208110156108ef57600080fd5b5051610942576040805162461bcd60e51b815260206004820152601b60248201527f6572726f723a206d757374206265207472616e7366657261626c650000000000604482015290519081900360640190fd5b600b54610955908563ffffffff611d2d16565b600b5560095461096b908363ffffffff611c6f16565b60095561097b8461051d8a610ba1565b6001600160a01b038916600081815260066020908152604091829020939093558051878152905191927f62722348256371b5147820d6cad90c40fd2da1ccee18c3ed52c0bca5a61dbbab92918290030190a26001985050505050505050506103de565b8415610a0e576109f96064610546848863ffffffff611cd416565b9050610a0b828263ffffffff611d2d16565b91505b600080546040805163a9059cbb60e01b81526001600160a01b038c81166004830152602482018790529151919092169263a9059cbb92604480820193602093909283900390910190829087803b158015610a6757600080fd5b505af1158015610a7b573d6000803e3d6000fd5b505050506040513d6020811015610a9157600080fd5b5051610ae4576040805162461bcd60e51b815260206004820152601b60248201527f6572726f723a206d757374206265207472616e7366657261626c650000000000604482015290519081900360640190fd5b600b54610af7908863ffffffff611d2d16565b600b55600954610b0d908363ffffffff611c6f16565b600955610b1d8761051d8a610ba1565b6001600160a01b0389166000818152600660209081526040918290209390935580518a8152905191927f62722348256371b5147820d6cad90c40fd2da1ccee18c3ed52c0bca5a61dbbab92918290030190a26001985050505050505050506103de565b6000610b8b82611dc9565b15610b9857506019610b9c565b5060005b919050565b6001600160a01b031660009081526006602052604090205490565b6000610bc6610393565b610c0d576040805162461bcd60e51b815260206004820152601360248201527232b93937b91d1036bab9ba1031329037bb32b960691b604482015290519081900360640190fd5b610c15611df2565b610c5e576040805162461bcd60e51b8152602060048201526015602482015274195c9c9bdc8e881b5d5cdd081899481b1bd8dad959605a1b604482015290519081900360640190fd5b610c66611dfb565b50610c6f611e52565b507f839cf22e1ba87ce2f5b9bbf46cf0175a09eed52febdfaac8852478e68203c763610c99611ab9565b60408051918252519081900360200190a150600190565b600b5490565b60025490565b60095481565b600c54600090610100900460ff1615610d0c5760405162461bcd60e51b815260040180806020018281038252603c81526020018061218f603c913960400191505060405180910390fd5b5060076020527f0c4f74400277bc9ebfde150d808b40c98b167dc7a3f8fa3fce766e39c031156f80547f63ede79f6715e0388dbc17ca5b2e6d337dbb73ceba352307c6c9feda7f393b36805460ff19928316600190811784168117909455821683178216831790557ffca776baf84360d837d4844dabdd99bce023edc2501147db1731d4e5e00e543680548216831790557fd10dcce221972ecb385cb9671a4181901ed8c2ed09f79be2128a29f67be904a380548216831790557fbe6948d6872952e5d72d4c052ba06253eb169aae18ffd799edae6f9ada106d1880548216831790557fc147f1a1f003cca9465956d0a5094092fddd699378a15a53772daaa01ae0755180548216831790557f16cd8f2b9b3bdd26a2550babbb9578d06de5f51f5adab51f7f729bca4ee94f0f80548216831790557f46b4bfadbd89931105aabc58ea09c8cc73cf4182fba899587cdf7896d4ba2af880548216831790557feb04b378943f4042794c767458a8a4c93b1fac667af7c6ece2fda78c27c6118380548216831790557feefa7f836f5e87643d555ad633fbd3d2dd838208401bcd82c53f6d01a654bc2280548216831790557ff465ec26741fd9702dd5f4c7e1731d5de6f0ec12bd1cf89b5ba76428820670ba80548216831790557f5a33bab911b45070d9caaf0d54880203cc899674845e74b618dfedde7649a13e80548216831790557fc01e1e63b2b5c5d4784c86cc890081a0693a6ee0796908fc37d0022d602d390a80548216831790557f9729261abbeae23652d9a4f3cbd8e57966e8a1ede368a7cded438c4a1d84e97680548216831790557fd3abf9eac845186d04f3aa9bb6dbd768228561491813404148fca70bd003c78080548216831790557f1c5064f3eca50236bd532ece94e5a5a8a205540b751bb1b3269e496f73e4a57f80548216831790557f492d26a99d2fd31724c9e583a21f86e73329c7c8a4b779b95737e1ad37aa03f780548216831790557f97d4bf73de36548759fd524ed8e1a2d8c97bfb6ce54eea3d7a537b44538151fc80548216831790557f9f0699132d9ec82357a19a389eb01adda5dc972e34a623eb78c567c20a9cfba980548216831790557f9b236971fc43f7665d850bebaefd3d35b179c93faada5881da0b5901b4cb085f80548216831790557fbacbbf2e44dd911fccfcd8fcdf0855db480956aba70fc8eb327ccb9e360a7f8a80548216831790557fb37d0aef72f87a2ae0f0c6215aaf6eb1a7c734dbf589f8f9413df48e10dc7f1580548216831790557fd42eda0c91c0efe1287f0918576a21ae5b358ddc6455f97b24591640ac30311380548216831790557ff92717cfe0b6330bb94f1fee6211300d7f3ba8f72a16244161c3b0ef03be850a80548216831790557fc047173addcc53fa2cda82a633c51f921df3c561575708547155d761ee53ffde80548216831790557fc406acef5e6698d60e57ae90d885e83b1c4c5016dd5634fa21af3f82cbb8107080548216831790557f06b4c2e9cafc107e255b8e0e5a2f1b0a1bc71d9c1230b8d6e4e22fb06a6cacbb80548216831790557fc5419f760fff43ec148ebe02ea68928f16b8e8f911d68dc9a8ae737a3ae505bb80548216831790557f7b00169774f0ac692c54318e6799cc99bffb16bf1b887532a8c98a1d752da84f80548216831790557fd2f12e2128f472486fafe5ba5915cd75f36e8ac4514fd7eff74f224cefacbb1d80548216831790557f9eca4d1cb6021c50f377bd9605dd4ceb962e56789ee1b817402a95dc2ef95fb580548216831790557f4e3190177450bf3c0569a5fa5ebdbe146b6589fbe9a43ff5c533ebb00dad4d0580548216831790557f0140275e51f9796e08ebdd85aeb7461aa5525b6c7f30b685ea9e29c9d480592780548216831790557f10c46ca3996014c31e2d96c736bdfa113f04311568a8cf7ab26e42fa6a007b5180548216831790557f58671f0070d2f40a29e57a7fd2cb478ef144f7173679c842a51195ed54d53fea80548216831790557f9a2571fd168fbc241cecf552bf2328e48fc50a361579b1cd52ac866af50bbf2f80548216831790557fec25f9b0308372e6b04688519b7c8f666a058429239421e9a0a3c439760a9d6a80548216831790557f38aa1216e40105b784dd2f594ea3d84611599d63435ee2706579e53b44043e5380548216831790557fd52704390f47368860344b6f5bff464a9c792a971ef9a5e15551205e2b66b01280548216831790557f6ccf6051e0c7d84e03c444737f0d89628d25e7ae4fdd7006c236d70e8989978880548216831790557f7f85b95f14c985bebc9ae606c9e75480bba9e2649f3d33edab779869b9cacf5c80548216831790557f3d4346477ec63e7754ad0fbd2fe4499c5a4037abaeffdbf9210dbe3a404af3e380548216831790557f4f091d3a005b08a3d99b6d866baceeac0f5374e6e5e232d5eecc135568f6913680548216831790557fc25c04b0cd1125543fd8de62e43dad78b318c1047e2d689e768e6d969df99fc880548216831790557f0b4924a25b1c8c484f801dc495a3f913cb9de8e779f9b2e3c300d2acdbbb329b80548216831790557f25846e14bb5d80c7de1d95505a5022edd7e7203cf691aaca206e872cbdb91cb280548216831790557f7e684b25ca3c77cf6d19ead8b0303e03ff1f06817c64066097743a7b9c5dcd0e80547f4838f250864fd5d6f84fb2ad95315d965e8c883143999979dde253641daa3f2180548416851790557fc303b1e48154cd75040bd36d392b589fa60c14804d1bc2790d4206287b6fa1b580548416851790557fe71cd27f42dd3326e4979d063c92a589abefebf775b315c4fc72e1e3e81bac3c80548416851790557f4048c797b19f33d1192c0663794e1d3c92c35d11ace404f6ab92b805fda0412980548416851790557f840a742c67969de5c576f823f56d617a2e0a9ce2cc2301aff2a772d7dc0a114580548416851790557f78ae430f0a20043f57eedb4f8cbf2a4e007d25151e47018e046bd593fbdd4ac580548416851790557fe0852039314b5b632a07b3a598ffdcf2df6c52cb9616471453cc6ffecb9650f080548416851790557ffbf103f3f8f2543b157f12c64e9c8a027cd3cfc372677121d8714ff6699d386480548416851790557f99ba2568b875bfe15c371ad87d7d16e8c77c21231de9d89fcc13f3a52677e7878054841685179055821683178216831790557f1e3ca1c77f99ef1771c947d7c738fb439357e650ef0d68712edaa1221419911a80548216831790557f377a18e1933b81df4d7480ad8a682387e372995583476178f90a06bd7cc0a82780548216831790557305fb3770ca63ecee9c5a6874254022820dbef9446000527f0d3feb1f76c87e659507ebae1d7493a0aa72ec5d86cc571ada1c8b4c9ae5ba04805490911682179055600c805461ff00191661010017905590565b60006116ce610393565b611715576040805162461bcd60e51b815260206004820152601360248201527232b93937b91d1036bab9ba1031329037bb32b960691b604482015290519081900360640190fd5b61171d611df2565b1561176f576040805162461bcd60e51b815260206004820152601960248201527f6572726f723a206d757374206e6f74206265206c6f636b656400000000000000604482015290519081900360640190fd5b600c805460ff19166001179055600061179c6064610546602d611790610cb0565b9063ffffffff611cd416565b905060006117c660646105466117b9600b8363ffffffff611cd416565b859063ffffffff611cd416565b90506000809054906101000a90046001600160a01b03166001600160a01b0316633f4ba83a6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561181757600080fd5b505af115801561182b573d6000803e3d6000fd5b505050506040513d602081101561184157600080fd5b5051611894576040805162461bcd60e51b815260206004820152601960248201527f6572726f723a206d75737420626520756e7061757361626c6500000000000000604482015290519081900360640190fd5b600080546001546040805163095ea7b360e01b81526001600160a01b039283166004820152602481018690529051919092169263095ea7b392604480820193602093909283900390910190829087803b1580156118f057600080fd5b505af1158015611904573d6000803e3d6000fd5b505050506040513d602081101561191a57600080fd5b505161196d576040805162461bcd60e51b815260206004820152601760248201527f6572726f723a206d75737420626520617070726f766564000000000000000000604482015290519081900360640190fd5b600154600080546001600160a01b039283169263f305d7199286929091169085908080611998611ab9565b6040518863ffffffff1660e01b815260040180876001600160a01b03166001600160a01b03168152602001868152602001858152602001848152602001836001600160a01b03166001600160a01b0316815260200182815260200196505050505050506060604051808303818588803b158015611a1457600080fd5b505af1158015611a28573d6000803e3d6000fd5b50505050506040513d6060811015611a3f57600080fd5b5050604080518381526020810183905281517fcb75aa8347c098d414422e8cafbbe4e2c1a229f5b27bf425984b2b9792aa787a929181900390910190a160019250505090565b6000611a9082611dc9565b15611aa45750678ac7230489e80000610b9c565b50674563918244f40000610b9c565b60035490565b4290565b3390565b6000611acb611f9a565b611b1c576040805162461bcd60e51b815260206004820152601760248201527f6572726f723a206d757374206265206c61756e63686564000000000000000000604482015290519081900360640190fd5b611b24611fb3565b611b6d576040805162461bcd60e51b81526020600482015260156024820152746572726f723a206d7573742062652061637469766560581b604482015290519081900360640190fd5b670de0b6b3a7640000821015611bb45760405162461bcd60e51b815260040180806020018281038252603881526020018061210c6038913960400191505060405180910390fd5b6843c33c193756480000611bc6610cb0565b10611c025760405162461bcd60e51b815260040180806020018281038252602a815260200180612144602a913960400191505060405180910390fd5b506001919050565b600068056bc75e2d63100000611c1e610cb0565b10156103da575060016103de565b6001600160a01b0383166000908152600660205260408120548290611c57908563ffffffff611d2d16565b11611c6457506001611c68565b5060005b9392505050565b6000611cb183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611fde565b90505b92915050565b600081831115611ccc57506001611cb4565b506000611cb4565b600082611ce357506000611cb4565b82820282848281611cf057fe5b0414611cb15760405162461bcd60e51b815260040180806020018281038252602181526020018061216e6021913960400191505060405180910390fd5b600082820183811015611cb1576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000611cb183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612075565b6001600160a01b03811660009081526007602052604081205460ff1615610b9857506001610b9c565b600c5460ff1690565b6008546000906001600160a01b03166108fc611e156103e1565b6001600160a01b0316319081150290604051600060405180830381858888f19350505050158015611e4a573d6000803e3d6000fd5b506001905090565b6000805481906001600160a01b03166370a08231611e6e6103e1565b6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611eb457600080fd5b505afa158015611ec8573d6000803e3d6000fd5b505050506040513d6020811015611ede57600080fd5b50516000805460408051630852cd8d60e31b81526004810185905290519394506001600160a01b03909116926342966c6892602480840193602093929083900390910190829087803b158015611f3357600080fd5b505af1158015611f47573d6000803e3d6000fd5b505050506040513d6020811015611f5d57600080fd5b50506040805182815290517ff15a2816d9b33bd70f4b57d8cfbd7ee75d3231d8c52a030fef8a86fb4adfe9479181900360200190a1600191505090565b600080611fa5610cb6565b11156103da575060016103de565b6000611fbd611ab9565b611fc5611ab3565b11806103cd57506843c33c193756480000611c1e610cb0565b6000818484111561206d5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561203257818101518382015260200161201a565b50505050905090810190601f16801561205f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836120c45760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561203257818101518382015260200161201a565b5060008385816120d057fe5b049594505050505056fe6572726f723a206d75737420636f6d706c79207769746820636f6e747269627574696f6e20726571756972656d656e74736572726f723a206d757374206265206d6f7265206f7220657175616c20746f20746865206d696e696d756d20636f6e747269627574696f6e6572726f723a206d757374206e6f7420686176652072656163686564206d6178696d756d2066756e6473536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f776572726f723a206d757374206e6f7420616c726561647920686176652077686974656c6973746564206c656761637920636f6e7472696275746f72736572726f723a20636f6e747269627574696f6e206d757374206e6f742065786365656420636f6e7472696275746f72206365696c696e67a26469706673582212203bc4bbfee0701fa3070aa9a0fb134093966977c460cb57d03f64acd19cb1f25464736f6c63430006070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000ad45320077fc7a0f0a43976ac7dbacc65ad21d8f000000000000000000000000b827ff81627edfa3711c40286d304951f92ee414
-----Decoded View---------------
Arg [0] : token (address): 0xAD45320077Fc7a0f0A43976Ac7DBaCC65aD21d8F
Arg [1] : wallet (address): 0xb827Ff81627EdfA3711C40286D304951F92Ee414
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000ad45320077fc7a0f0a43976ac7dbacc65ad21d8f
Arg [1] : 000000000000000000000000b827ff81627edfa3711c40286d304951f92ee414
Deployed Bytecode Sourcemap
42253:17756:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44761:9;:7;:9::i;:::-;44760:10;44752:56;;;;;-1:-1:-1;;;44752:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;44833:6;;-1:-1:-1;;;;;44833:6:0;:16;44850:14;:12;:14::i;:::-;44833:32;;;;;;;;;;;;;-1:-1:-1;;;;;44833:32:0;-1:-1:-1;;;;;44833:32:0;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;44833:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44833:32:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;44833:32:0;44829:51;;12:1:-1;9;2:12;44829:51:0;44930:1;44895:6;;-1:-1:-1;;;;;44895:6:0;:16;44912:14;:12;:14::i;:::-;44895:32;;;;;;;;;;;;;-1:-1:-1;;;;;44895:32:0;-1:-1:-1;;;;;44895:32:0;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;44895:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44895:32:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;44895:32:0;:36;44891:55;;;44933:13;:11;:13::i;:::-;;44891:55;42253:17756;;12:1:-1;9;2:12;51531:177:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;51531:177:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;51531:177:0;-1:-1:-1;;;;;51531:177:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;51396:129;;5:9:-1;2:2;;;27:1;24;17:12;2:2;51396:129:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;51396:129:0;-1:-1:-1;;;;;51396:129:0;;:::i;:::-;;;;;;;;;;;;;;;;50808:306;;5:9:-1;2:2;;;27:1;24;17:12;2:2;50808:306:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;51302:82;;5:9:-1;2:2;;;27:1;24;17:12;2:2;51302:82:0;;;:::i;51126:84::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;51126:84:0;;;:::i;43585:22::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;43585:22:0;;;:::i;45986:4810::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;45986:4810:0;;;:::i;44966:1008::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;44966:1008:0;;;:::i;51714:310::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;51714:310:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;51714:310:0;-1:-1:-1;;;;;51714:310:0;;:::i;51216:80::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;51216:80:0;;;:::i;59541:178::-;59582:4;59616:7;:5;:7::i;:::-;59603:9;:7;:9::i;:::-;:20;;:52;;;;42652:10;59627;:8;:10::i;:::-;:28;;59603:52;:68;;;-1:-1:-1;59659:7:0;;:12;59603:68;59599:113;;;-1:-1:-1;59682:4:0;59675:11;;59599:113;-1:-1:-1;59704:5:0;59599:113;59541:178;:::o;59815:94::-;59896:4;59815:94;:::o;52356:5041::-;52396:4;52413:19;52435:12;:10;:12::i;:::-;52413:34;-1:-1:-1;52481:9:0;52519:32;52481:9;52519:18;:32::i;:::-;52511:103;;;;-1:-1:-1;;;52511:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52635:26;52664:35;52687:11;52664:22;:35::i;:::-;52635:64;;52710:24;52737:33;52758:11;52737:20;:33::i;:::-;52710:60;;;;52791:29;52831:26;52878:14;52903:13;52933:15;:13;:15::i;:::-;52929:4461;;;52987:63;53004:11;53017:12;53031:18;52987:16;:63::i;:::-;52979:145;;;;-1:-1:-1;;;52979:145:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53177:30;53196:10;:8;:10::i;:::-;42594:9;;53177:30;:18;:30;:::i;:::-;53153:54;;53236:49;53249:12;53263:21;53236:12;:49::i;:::-;53232:1732;;;53327:39;:12;53344:21;53327:39;:16;:39;:::i;:::-;53306:60;;53408:65;53445:27;53468:3;;53445:18;:22;;:27;;;;:::i;:::-;53435:3;;53409:30;;:21;;:30;:25;:30;:::i;:::-;53408:36;:65;:36;:65;:::i;:::-;53399:74;-1:-1:-1;53514:20:0;;53510:174;;53567:48;43186:3;53568:28;:6;53579:16;53568:28;:10;:28;:::i;:::-;53567:34;:48;:34;:48;:::i;:::-;53559:56;-1:-1:-1;53647:17:0;:6;53559:56;53647:17;:10;:17;:::i;:::-;53638:26;;53510:174;53728:6;;;:36;;;-1:-1:-1;;;53728:36:0;;-1:-1:-1;;;;;53728:36:0;;;;;;;;;;;;;;;:6;;;;;:15;;:36;;;;;;;;;;;;;;;;;;:6;:36;;;2:2:-1;;;;27:1;24;17:12;2:2;53728:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53728:36:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;53728:36:0;53720:94;;;;;-1:-1:-1;;;53720:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;53860:6;;:24;;53871:12;53860:24;:10;:24;:::i;:::-;53851:6;:33;53951:47;53985:12;53951:29;53968:11;53951:16;:29::i;:47::-;-1:-1:-1;;;;;53921:27:0;;;;;;:14;:27;;;;;:77;54027:7;;:19;;54039:6;54027:19;:11;:19;:::i;:::-;54017:7;:29;54088:47;;;;;;;;-1:-1:-1;;;;;54088:47:0;;;;;;;;;;;;;54161:4;54154:11;;;;;;;;;;;;53232:1732;54251:3;;54234:21;;:12;;:21;:16;:21;:::i;52929:4461::-;55050:3;;55033:21;;:12;;:21;:16;:21;:::i;:::-;55024:30;;55093;55112:10;:8;:10::i;:::-;42652;;55093:30;:18;:30;:::i;:::-;55069:54;;55156:49;55169:12;55183:21;55156:12;:49::i;:::-;55152:1660;;;55247:39;:12;55264:21;55247:39;:16;:39;:::i;:::-;55226:60;-1:-1:-1;55329:36:0;:12;55226:60;55329:36;:16;:36;:::i;:::-;55305:60;;55411:30;55437:3;;55411:21;:25;;:30;;;;:::i;:::-;55402:39;-1:-1:-1;55482:20:0;;55478:741;;55535:48;43186:3;55536:28;:6;55547:16;55536:28;:10;:28;:::i;55535:48::-;55527:56;-1:-1:-1;55615:17:0;:6;55527:56;55615:17;:10;:17;:::i;:::-;55606:26;;55681:29;55694:6;55702:7;;55681:12;:29::i;:::-;55677:523;;;55765:20;55788:19;55799:7;;55788:6;:10;;:19;;;;:::i;:::-;55933:3;;55765:42;;-1:-1:-1;55834:17:0;;55854:83;;55855:72;55872:54;43186:3;55855:72;55765:42;55890:16;55873:34;:16;:34;:::i;55872:54::-;55855:12;;:72;:16;:72;:::i;55854:83::-;55834:103;-1:-1:-1;56011:33:0;:18;55834:103;56011:33;:22;:33;:::i;:::-;55990:54;-1:-1:-1;56095:36:0;:21;56121:9;56095:36;:25;:36;:::i;:::-;56071:60;;56169:7;;56160:16;;55677:523;;;56255:12;:10;:12::i;:::-;-1:-1:-1;;;;;56255:21:0;:41;56277:18;56255:41;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;56341:6:0;;;:36;;;-1:-1:-1;;;56341:36:0;;-1:-1:-1;;;;;56341:36:0;;;;;;;;;;;;;;;:6;;;;;:15;;:36;;;;;;;;;;;;;;;;;;:6;:36;;;2:2:-1;;;;27:1;24;17:12;2:2;56341:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56341:36:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;56341:36:0;56333:94;;;;;-1:-1:-1;;;56333:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;56473:6;;:33;;56484:21;56473:33;:10;:33;:::i;:::-;56464:6;:42;56535:7;;:19;;56547:6;56535:19;:11;:19;:::i;:::-;56525:7;:29;56621:56;56655:21;56621:29;56638:11;56621:16;:29::i;:56::-;-1:-1:-1;;;;;56591:27:0;;;;;;:14;:27;;;;;;;;;:86;;;;56719:47;;;;;;;56591:27;;56719:47;;;;;;;;;56792:4;56785:11;;;;;;;;;;;;55152:1660;56840:20;;56836:150;;56885:48;43186:3;56886:28;:6;56897:16;56886:28;:10;:28;:::i;56885:48::-;56877:56;-1:-1:-1;56957:17:0;:6;56877:56;56957:17;:10;:17;:::i;:::-;56948:26;;56836:150;57018:6;;;:36;;;-1:-1:-1;;;57018:36:0;;-1:-1:-1;;;;;57018:36:0;;;;;;;;;;;;;;;:6;;;;;:15;;:36;;;;;;;;;;;;;;;;;;:6;:36;;;2:2:-1;;;;27:1;24;17:12;2:2;57018:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57018:36:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;57018:36:0;57010:86;;;;;-1:-1:-1;;;57010:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;57130:6;;:24;;57141:12;57130:24;:10;:24;:::i;:::-;57121:6;:33;57175:7;;:19;;57187:6;57175:19;:11;:19;:::i;:::-;57165:7;:29;57245:47;57279:12;57245:29;57262:11;57245:16;:29::i;:47::-;-1:-1:-1;;;;;57215:27:0;;;;;;:14;:27;;;;;;;;;:77;;;;57318:38;;;;;;;57215:27;;57318:38;;;;;;;;;57374:4;57367:11;;;;;;;;;;;;51531:177;51603:5;51625:27;51640:11;51625:14;:27::i;:::-;51621:80;;;-1:-1:-1;42719:2:0;51656:23;;51621:80;-1:-1:-1;51697:1:0;51621:80;51531:177;;;:::o;51396:129::-;-1:-1:-1;;;;;51490:27:0;51463:7;51490:27;;;:14;:27;;;;;;;51396:129::o;50808:306::-;50846:4;50871:9;:7;:9::i;:::-;50863:51;;;;;-1:-1:-1;;;50863:51:0;;;;;;;;;;;;-1:-1:-1;;;50863:51:0;;;;;;;;;;;;;;;50943:11;:9;:11::i;:::-;50935:55;;;;;-1:-1:-1;;;50935:55:0;;;;;;;;;;;;-1:-1:-1;;;50935:55:0;;;;;;;;;;;;;;;51011:8;:6;:8::i;:::-;;51030:10;:8;:10::i;:::-;;51066:18;51076:7;:5;:7::i;:::-;51066:18;;;;;;;;;;;;;;;-1:-1:-1;51102:4:0;50808:306;:::o;51302:82::-;51370:6;;51302:82;:::o;51126:84::-;51195:7;;51126:84;:::o;43585:22::-;;;;:::o;45986:4810::-;46051:7;;46025:4;;46051:7;;;;;46050:8;46042:91;;;;-1:-1:-1;;;46042:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46154:12:0;:56;;;:63;;46228:56;:63;;-1:-1:-1;;46154:63:0;;;46213:4;46154:63;;;46302;;;;;;;46228;;;;46376;;;;;;46450:56;:63;;;;;;;;46524:56;:63;;;;;;;;46598:56;:63;;;;;;;;46672:56;:63;;;;;;;;46746:56;:63;;;;;;;;46820:56;:63;;;;;;;;46894:56;:63;;;;;;;;46968:56;:63;;;;;;;;47042:56;:63;;;;;;;;47116:56;:63;;;;;;;;47190:56;:63;;;;;;;;47264:56;:63;;;;;;;;47338:56;:63;;;;;;;;47412:56;:63;;;;;;;;47486:56;:63;;;;;;;;47560:56;:63;;;;;;;;47634:56;:63;;;;;;;;47708:56;:63;;;;;;;;47782:56;:63;;;;;;;;47856:56;:63;;;;;;;;47930:56;:63;;;;;;;;48004:56;:63;;;;;;;;48078:56;:63;;;;;;;;48152:56;:63;;;;;;;;48226:56;:63;;;;;;;;48300:56;:63;;;;;;;;48374:56;:63;;;;;;;;48448:56;:63;;;;;;;;48522:56;:63;;;;;;;;48596:56;:63;;;;;;;;48670:56;:63;;;;;;;;48744:56;:63;;;;;;;;48818:56;:63;;;;;;;;48892:56;:63;;;;;;;;48966:56;:63;;;;;;;;49040:56;:63;;;;;;;;49114:56;:63;;;;;;;;49188:56;:63;;;;;;;;49262:56;:63;;;;;;;;49336:56;:63;;;;;;;;49410:56;:63;;;;;;;;49484:56;:63;;;;;;;;49558:56;:63;;;;;;;;49632:56;:63;;;;;;;;49706:56;:63;;49780:56;:63;;;;;;;;49854:56;:63;;;;;;;;49928:56;:63;;;;;;;;50002:56;:63;;;;;;;;50076:56;:63;;;;;;;;50150:56;:63;;;;;;;;50224:56;:63;;;;;;;;50298:56;:63;;;;;;;;50372:56;:63;;;;;;;;49706;;;;50446;;;;;;50520:56;:63;;;;;;;;50594:56;:63;;;;;;;;50681:42;46154:56;50668;;:63;;;;;;;;;50752:7;:14;;-1:-1:-1;;50752:14:0;46154:63;50752:14;;;45986:4810;:::o;44966:1008::-;45009:4;45034:9;:7;:9::i;:::-;45026:51;;;;;-1:-1:-1;;;45026:51:0;;;;;;;;;;;;-1:-1:-1;;;45026:51:0;;;;;;;;;;;;;;;45097:11;:9;:11::i;:::-;45096:12;45088:60;;;;;-1:-1:-1;;;45088:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;45161:7;:14;;-1:-1:-1;;45161:14:0;45171:4;45161:14;;;:7;45226:52;43186:3;45227:32;42773:2;45227:10;:8;:10::i;:::-;:14;:32;:14;:32;:::i;45226:52::-;45196:82;-1:-1:-1;45289:27:0;45319:74;43236:3;45320:56;45345:29;42829:2;43236:3;45345:29;:17;:29;:::i;:::-;45320:19;;:56;:23;:56;:::i;45319:74::-;45289:104;;45422:6;;;;;;;;;-1:-1:-1;;;;;45422:6:0;-1:-1:-1;;;;;45422:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;45422:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45422:16:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;45422:16:0;45414:64;;;;;-1:-1:-1;;;45414:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;45507:6;;;;45530:14;45507:60;;;-1:-1:-1;;;45507:60:0;;-1:-1:-1;;;;;45530:14:0;;;45507:60;;;;;;;;;;;;:6;;;;;:14;;:60;;;;;;;;;;;;;;;;;;:6;:60;;;2:2:-1;;;;27:1;24;17:12;2:2;45507:60:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45507:60:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;45507:60:0;45499:106;;;;;-1:-1:-1;;;45499:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;45626:14;;;45729:6;;-1:-1:-1;;;;;45626:14:0;;;;:30;;45675:19;;45729:6;;;;45751:19;;45626:14;;45843:7;:5;:7::i;:::-;45626:235;;;;;;;;;;;;;-1:-1:-1;;;;;45626:235:0;-1:-1:-1;;;;;45626:235:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;45626:235:0;-1:-1:-1;;;;;45626:235:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;45626:235:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45626:235:0;;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;45626:235:0;45887:57;;;;;45626:235;45887:57;;;;;;;;;;;;;;;;;;45962:4;45955:11;;;;44966:1008;:::o;51714:310::-;51788:7;51812:27;51827:11;51812:14;:27::i;:::-;51808:209;;;-1:-1:-1;43074:8:0;51857:54;;51808:209;-1:-1:-1;42984:7:0;51946:58;;51216:80;51283:5;;51216:80;:::o;59915:89::-;59981:15;59915:89;:::o;12463:106::-;12551:10;12463:106;:::o;57757:458::-;57823:4;57848:13;:11;:13::i;:::-;57840:59;;;;;-1:-1:-1;;;57840:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;57918:11;:9;:11::i;:::-;57910:55;;;;;-1:-1:-1;;;57910:55:0;;;;;;;;;;;;-1:-1:-1;;;57910:55:0;;;;;;;;;;;;;;;42885:7;57984:6;:27;;57976:106;;;;-1:-1:-1;;;57976:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42652:10;58101;:8;:10::i;:::-;:27;58093:92;;;;-1:-1:-1;;;58093:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58203:4:0;57757:458;;;:::o;58675:143::-;58722:4;42594:9;58743:10;:8;:10::i;:::-;:27;58739:72;;;-1:-1:-1;58781:4:0;58774:11;;59165:221;-1:-1:-1;;;;;59288:27:0;;59267:4;59288:27;;;:14;:27;;;;;;59331:7;;59288:39;;59320:6;59288:39;:31;:39;:::i;:::-;:50;59284:95;;-1:-1:-1;59349:4:0;59342:11;;59284:95;-1:-1:-1;59371:5:0;59284:95;59165:221;;;;;:::o;755:136::-;813:7;840:43;844:1;847;840:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;833:50;;755:136;;;;;:::o;58824:162::-;58901:4;58931:7;58922:6;:16;58918:61;;;-1:-1:-1;58949:4:0;58942:11;;58918:61;-1:-1:-1;58971:5:0;58964:12;;1645:471;1703:7;1948:6;1944:47;;-1:-1:-1;1978:1:0;1971:8;;1944:47;2015:5;;;2019:1;2015;:5;:1;2039:5;;;;;:10;2031:56;;;;-1:-1:-1;;;2031:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;291:181;349:7;381:5;;;405:6;;;;397:46;;;;;-1:-1:-1;;;397:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;2592:132;2650:7;2677:39;2681:1;2684;2677:39;;;;;;;;;;;;;;;;;:3;:39::i;58998:161::-;-1:-1:-1;;;;;59086:25:0;;59065:4;59086:25;;;:12;:25;;;;;;;;59082:70;;;-1:-1:-1;59122:4:0;59115:11;;59725:82;59792:7;;;;59725:82;:::o;57409:122::-;57461:7;;57444:4;;-1:-1:-1;;;;;57461:7:0;:40;57478:14;:12;:14::i;:::-;-1:-1:-1;;;;;57478:22:0;;57461:40;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57461:40:0;57519:4;57512:11;;57409:122;:::o;57537:208::-;57574:4;57608:6;;57574:4;;-1:-1:-1;;;;;57608:6:0;:16;57625:14;:12;:14::i;:::-;57608:32;;;;;;;;;;;;;-1:-1:-1;;;;;57608:32:0;-1:-1:-1;;;;;57608:32:0;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;57608:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57608:32:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;57608:32:0;57653:6;;;:19;;;-1:-1:-1;;;57653:19:0;;;;;;;;;;57608:32;;-1:-1:-1;;;;;;57653:6:0;;;;:11;;:19;;;;;57608:32;;57653:19;;;;;;;;;;;:6;:19;;;2:2:-1;;;;27:1;24;17:12;2:2;57653:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57653:19:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;57698:17:0;;;;;;;;;;;;;57653:19;57698:17;;;57733:4;57726:11;;;57537:208;:::o;58223:130::-;58268:4;58303:1;58289:11;:9;:11::i;:::-;:15;58285:60;;;-1:-1:-1;58315:4:0;58308:11;;58507:162;58550:4;58583:7;:5;:7::i;:::-;58571:9;:7;:9::i;:::-;:19;:50;;;;42652:10;58594;:8;:10::i;1194:192::-;1280:7;1316:12;1308:6;;;;1300:29;;;;-1:-1:-1;;;1300:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;1300:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1352:5:0;;;1194:192::o;3220:278::-;3306:7;3341:12;3334:5;3326:28;;;;-1:-1:-1;;;3326:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;3326:28:0;;3365:9;3381:1;3377;:5;;;;;;;3220:278;-1:-1:-1;;;;;3220:278:0:o
Swarm Source
ipfs://3bc4bbfee0701fa3070aa9a0fb134093966977c460cb57d03f64acd19cb1f254
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
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.