Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 25 from a total of 207 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Unstake And Unwr... | 20787795 | 524 days ago | IN | 0 ETH | 0.00257644 | ||||
| Unstake And Unwr... | 15482861 | 1269 days ago | IN | 0 ETH | 0.00220073 | ||||
| Unstake And Unwr... | 15344519 | 1291 days ago | IN | 0 ETH | 0.00400882 | ||||
| Unstake And Unwr... | 14190516 | 1475 days ago | IN | 0 ETH | 0.01418966 | ||||
| Unstake And Unwr... | 14104357 | 1488 days ago | IN | 0 ETH | 0.02607529 | ||||
| Unstake And Unwr... | 13915248 | 1517 days ago | IN | 0 ETH | 0.02275982 | ||||
| Unstake And Unwr... | 13844946 | 1528 days ago | IN | 0 ETH | 0.01688421 | ||||
| Unstake And Unwr... | 13839733 | 1529 days ago | IN | 0 ETH | 0.0175682 | ||||
| Unstake And Unwr... | 13783748 | 1538 days ago | IN | 0 ETH | 0.01544698 | ||||
| Unstake And Unwr... | 13775433 | 1539 days ago | IN | 0 ETH | 0.02001679 | ||||
| Unstake And Unwr... | 13744576 | 1544 days ago | IN | 0 ETH | 0.0168627 | ||||
| Unstake And Unwr... | 13701223 | 1551 days ago | IN | 0 ETH | 0.01914656 | ||||
| Unstake And Unwr... | 13658059 | 1558 days ago | IN | 0 ETH | 0.02525735 | ||||
| Unstake And Unwr... | 13650858 | 1559 days ago | IN | 0 ETH | 0.02013908 | ||||
| Unstake And Unwr... | 13645281 | 1560 days ago | IN | 0 ETH | 0.02836607 | ||||
| Unstake And Unwr... | 13618255 | 1564 days ago | IN | 0 ETH | 0.04116274 | ||||
| Unstake And Unwr... | 13611078 | 1565 days ago | IN | 0 ETH | 0.02927561 | ||||
| Unstake And Unwr... | 13558867 | 1573 days ago | IN | 0 ETH | 0.028441 | ||||
| Unstake And Unwr... | 13556141 | 1574 days ago | IN | 0 ETH | 0.03036205 | ||||
| Unstake And Unwr... | 13555336 | 1574 days ago | IN | 0 ETH | 0.03477621 | ||||
| Unstake And Unwr... | 13502607 | 1582 days ago | IN | 0 ETH | 0.04872064 | ||||
| Unstake And Unwr... | 13488235 | 1584 days ago | IN | 0 ETH | 0.03152843 | ||||
| Unstake And Unwr... | 13487433 | 1585 days ago | IN | 0 ETH | 0.02460292 | ||||
| Unstake And Unwr... | 13486317 | 1585 days ago | IN | 0 ETH | 0.01897704 | ||||
| Unstake And Unwr... | 13483219 | 1585 days ago | IN | 0 ETH | 0.02734653 |
Latest 3 internal transactions
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| - | 12309920 | 1768 days ago | Contract Creation | 0 ETH | |||
| - | 12309920 | 1768 days ago | Contract Creation | 0 ETH | |||
| - | 12309920 | 1768 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
TokenGeyser
Compiler Version
v0.5.17+commit.d19bba13
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2021-04-25
*/
// Sources flattened with hardhat v2.2.0 https://hardhat.org
// File openzeppelin-solidity/contracts/math/SafeMath.sol@v2.4.0
pragma solidity ^0.5.0;
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, 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.
*
* _Available since v2.4.0._
*/
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.
*
* _Available since v2.4.0._
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
// Solidity only automatically asserts when dividing by 0
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.
*
* _Available since v2.4.0._
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
// File openzeppelin-solidity/contracts/token/ERC20/IERC20.sol@v2.4.0
pragma solidity ^0.5.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP. Does not include
* the optional functions; to access them see {ERC20Detailed}.
*/
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);
}
// File openzeppelin-solidity/contracts/GSN/Context.sol@v2.4.0
pragma solidity ^0.5.0;
/*
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with GSN meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
contract Context {
// Empty internal constructor, to prevent people from mistakenly deploying
// an instance of this contract, which should be used via inheritance.
constructor () internal { }
// solhint-disable-previous-line no-empty-blocks
function _msgSender() internal view returns (address payable) {
return msg.sender;
}
function _msgData() internal view returns (bytes memory) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}
// File openzeppelin-solidity/contracts/ownership/Ownable.sol@v2.4.0
pragma solidity ^0.5.0;
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
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 {
_owner = _msgSender();
emit OwnershipTransferred(address(0), _owner);
}
/**
* @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(isOwner(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Returns true if the caller is the current owner.
*/
function isOwner() public view returns (bool) {
return _msgSender() == _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 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 onlyOwner {
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
*/
function _transferOwnership(address newOwner) internal {
require(newOwner != address(0), "Ownable: new owner is the zero address");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}
// File contracts/IStaking.sol
pragma solidity 0.5.17;
/**
* @title Staking interface, as defined by EIP-900.
* @dev https://github.com/ethereum/EIPs/blob/master/EIPS/eip-900.md
*/
contract IStaking {
event Staked(address indexed user, uint256 amount, uint256 total, bytes data);
event Unstaked(address indexed user, uint256 amount, uint256 total, bytes data);
function stake(uint256 amount, bytes calldata data) external;
function stakeFor(address user, uint256 amount, bytes calldata data) external;
function unstake(uint256 amount, bytes calldata data) external;
function totalStakedFor(address addr) public view returns (uint256);
function totalStaked() public view returns (uint256);
function token() external view returns (address);
/**
* @return False. This application does not support staking history.
*/
function supportsHistory() external pure returns (bool) {
return false;
}
}
// File contracts/IERC20Permit.sol
pragma solidity 0.5.17;
interface IERC20Permit {
function permit(address holder, address spender, uint256 nonce, uint256 expiry,
bool allowed, uint8 v, bytes32 r, bytes32 s) external;
function permit(address holder, address spender, uint256 value, uint256 expiry,
uint8 v, bytes32 r, bytes32 s) external;
}
// File contracts/TokenPool.sol
pragma solidity 0.5.17;
/**
* @title A simple holder of tokens.
* This is a simple contract to hold tokens. It's useful in the case where a separate contract
* needs to hold multiple distinct pools of the same token.
*/
contract TokenPool is Ownable {
IERC20 public token;
constructor(IERC20 _token) public {
token = _token;
}
function balance() public view returns (uint256) {
return token.balanceOf(address(this));
}
function transfer(address to, uint256 value) external onlyOwner returns (bool) {
return token.transfer(to, value);
}
function rescueFunds(address tokenToRescue, address to, uint256 amount) external onlyOwner returns (bool) {
require(address(token) != tokenToRescue, 'TokenPool: Cannot claim token held by the contract');
return IERC20(tokenToRescue).transfer(to, amount);
}
}
// File openzeppelin-solidity/contracts/token/ERC20/ERC20.sol@v2.4.0
pragma solidity ^0.5.0;
/**
* @dev Implementation of the {IERC20} interface.
*
* This implementation is agnostic to the way tokens are created. This means
* that a supply mechanism has to be added in a derived contract using {_mint}.
* For a generic mechanism see {ERC20Mintable}.
*
* TIP: For a detailed writeup see our guide
* https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
* to implement supply mechanisms].
*
* We have followed general OpenZeppelin guidelines: functions revert instead
* of returning `false` on failure. This behavior is nonetheless conventional
* and does not conflict with the expectations of ERC20 applications.
*
* Additionally, an {Approval} event is emitted on calls to {transferFrom}.
* This allows applications to reconstruct the allowance for all accounts just
* by listening to said events. Other implementations of the EIP may not emit
* these events, as it isn't required by the specification.
*
* Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
* functions have been added to mitigate the well-known issues around setting
* allowances. See {IERC20-approve}.
*/
contract ERC20 is Context, IERC20 {
using SafeMath for uint256;
mapping (address => uint256) private _balances;
mapping (address => mapping (address => uint256)) private _allowances;
uint256 private _totalSupply;
/**
* @dev See {IERC20-totalSupply}.
*/
function totalSupply() public view returns (uint256) {
return _totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/
function balanceOf(address account) public 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 returns (bool) {
_transfer(_msgSender(), recipient, amount);
return true;
}
/**
* @dev See {IERC20-allowance}.
*/
function allowance(address owner, address spender) public 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 returns (bool) {
_approve(_msgSender(), spender, amount);
return true;
}
/**
* @dev See {IERC20-transferFrom}.
*
* Emits an {Approval} event indicating the updated allowance. This is not
* required by the EIP. See the note at the beginning of {ERC20};
*
* Requirements:
* - `sender` and `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
* - the caller must have allowance for `sender`'s tokens of at least
* `amount`.
*/
function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) {
_transfer(sender, recipient, amount);
_approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
return true;
}
/**
* @dev Atomically increases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function increaseAllowance(address spender, uint256 addedValue) public returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
return true;
}
/**
* @dev Atomically decreases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `spender` must have allowance for the caller of at least
* `subtractedValue`.
*/
function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
return true;
}
/**
* @dev Moves tokens `amount` from `sender` to `recipient`.
*
* This is internal function is equivalent to {transfer}, and can be used to
* e.g. implement automatic token fees, slashing mechanisms, etc.
*
* Emits a {Transfer} event.
*
* Requirements:
*
* - `sender` cannot be the zero address.
* - `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
*/
function _transfer(address sender, address recipient, uint256 amount) internal {
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 {
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 {
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 {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
/**
* @dev Destroys `amount` tokens from `account`.`amount` is then deducted
* from the caller's allowance.
*
* See {_burn} and {_approve}.
*/
function _burnFrom(address account, uint256 amount) internal {
_burn(account, amount);
_approve(account, _msgSender(), _allowances[account][_msgSender()].sub(amount, "ERC20: burn amount exceeds allowance"));
}
}
// File openzeppelin-solidity/contracts/token/ERC20/ERC20Detailed.sol@v2.4.0
pragma solidity ^0.5.0;
/**
* @dev Optional functions from the ERC20 standard.
*/
contract ERC20Detailed is IERC20 {
string private _name;
string private _symbol;
uint8 private _decimals;
/**
* @dev Sets the values for `name`, `symbol`, and `decimals`. All three of
* these values are immutable: they can only be set once during
* construction.
*/
constructor (string memory name, string memory symbol, uint8 decimals) public {
_name = name;
_symbol = symbol;
_decimals = decimals;
}
/**
* @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.
*
* 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;
}
}
// File openzeppelin-solidity/contracts/utils/Address.sol@v2.4.0
pragma solidity ^0.5.5;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* This test is non-exhaustive, and there may be false-negatives: during the
* execution of a contract's constructor, its address will be reported as
* not containing a contract.
*
* IMPORTANT: It is unsafe to assume that an address for which this
* function returns false is an externally-owned account (EOA) and not a
* contract.
*/
function isContract(address account) internal view returns (bool) {
// This method relies in extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
// According to EIP-1052, 0x0 is the value returned for not-yet created accounts
// and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
// for accounts without code, i.e. `keccak256('')`
bytes32 codehash;
bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
// solhint-disable-next-line no-inline-assembly
assembly { codehash := extcodehash(account) }
return (codehash != 0x0 && codehash != accountHash);
}
/**
* @dev Converts an `address` into `address payable`. Note that this is
* simply a type cast: the actual underlying value is not changed.
*
* _Available since v2.4.0._
*/
function toPayable(address account) internal pure returns (address payable) {
return address(uint160(account));
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*
* _Available since v2.4.0._
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
// solhint-disable-next-line avoid-call-value
(bool success, ) = recipient.call.value(amount)("");
require(success, "Address: unable to send value, recipient may have reverted");
}
}
// File openzeppelin-solidity/contracts/token/ERC20/SafeERC20.sol@v2.4.0
pragma solidity ^0.5.0;
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using SafeMath for uint256;
using Address for address;
function safeTransfer(IERC20 token, address to, uint256 value) internal {
callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
function safeApprove(IERC20 token, address spender, uint256 value) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
// solhint-disable-next-line max-line-length
require((value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).add(value);
callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves.
// A Solidity high level call has three parts:
// 1. The target address is checked to verify it contains contract code
// 2. The call itself is made, and success asserted
// 3. The return value is decoded, which in turn checks the size of the returned data.
// solhint-disable-next-line max-line-length
require(address(token).isContract(), "SafeERC20: call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = address(token).call(data);
require(success, "SafeERC20: low-level call failed");
if (returndata.length > 0) { // Return data is optional
// solhint-disable-next-line max-line-length
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}
// File contracts/MasterChefTokenizer.sol
pragma solidity 0.5.17;
interface IMasterChef {
function deposit(uint256 _pid, uint256 _amount) external;
function withdraw(uint256 _pid, uint256 _amount) external;
}
contract MasterChefTokenizer is Ownable, ERC20, ERC20Detailed {
using SafeERC20 for IERC20;
using SafeMath for uint256;
address public token; // sushi LP share
address public masterChef;
uint256 public pid;
address private _geyser;
constructor(
string memory _name, // eg. IdleDAI
string memory _symbol, // eg. IDLEDAI
address _token,
uint256 _pid
) public ERC20Detailed(_name, _symbol, uint8(18)) {
token = _token;
pid = _pid;
masterChef = address(0xc2EdaD668740f1aA35E4D8f227fB8E17dcA888Cd);
Ownable(msg.sender);
IERC20(_token).approve(masterChef, uint256(-1));
}
modifier onlyGeyser() {
require(msg.sender == _geyser, "Tokenizer: Not Geyser");
_;
}
function geyser() public view returns (address) {
return _geyser;
}
function wrap(uint256 _amount) external {
IERC20(token).safeTransferFrom(msg.sender, address(this), _amount);
IMasterChef(masterChef).deposit(pid, _amount);
_mint(msg.sender, _amount);
}
function unwrap(uint256 _amount, address _account) external {
IMasterChef(masterChef).withdraw(pid, _amount);
_burn(msg.sender, _amount);
IERC20(token).safeTransfer(_account, _amount);
}
function unwrapFor(uint256 _amount, address _account) external onlyGeyser {
IMasterChef(masterChef).withdraw(pid, _amount);
_burn(_account, _amount);
IERC20(token).safeTransfer(_account, _amount);
}
function transferGeyser(address geyser_) external onlyOwner {
_geyser = geyser_;
}
// used both to rescue SUSHI rewards and eventually other tokens
function rescueFunds(address tokenToRescue, address to, uint256 amount) external onlyOwner returns (bool) {
return IERC20(tokenToRescue).transfer(to, amount);
}
function emergencyShutdown(uint256 _amount) external onlyOwner () {
address _idleFeeTreasury = address(0x69a62C24F16d4914a48919613e8eE330641Bcb94);
IMasterChef(masterChef).withdraw(pid, _amount);
IERC20(token).safeTransfer(_idleFeeTreasury, _amount);
}
}
// File contracts/TokenGeyser.sol
pragma solidity 0.5.17;
/**
* @title Token Geyser
* @dev A smart-contract based mechanism to distribute tokens over time, inspired loosely by
* Compound and Uniswap.
*
* Distribution tokens are added to a locked pool in the contract and become unlocked over time
* according to a once-configurable unlock schedule. Once unlocked, they are available to be
* claimed by users.
*
* A user may deposit tokens to accrue ownership share over the unlocked pool. This owner share
* is a function of the number of tokens deposited as well as the length of time deposited.
* Specifically, a user's share of the currently-unlocked pool equals their "deposit-seconds"
* divided by the global "deposit-seconds". This aligns the new token distribution with long
* term supporters of the project, addressing one of the major drawbacks of simple airdrops.
*
* More background and motivation available at:
* https://github.com/ampleforth/RFCs/blob/master/RFCs/rfc-1.md
*/
contract TokenGeyser is IStaking, Ownable {
using SafeMath for uint256;
event Staked(address indexed user, uint256 amount, uint256 total, bytes data);
event Unstaked(address indexed user, uint256 amount, uint256 total, bytes data);
event TokensClaimed(address indexed user, uint256 amount);
event TokensLocked(uint256 amount, uint256 durationSec, uint256 total);
// amount: Unlocked tokens, total: Total locked tokens
event TokensUnlocked(uint256 amount, uint256 total);
TokenPool private _stakingPool;
TokenPool private _unlockedPool;
TokenPool private _lockedPool;
MasterChefTokenizer private _tokenizer;
IERC20 private _unwrappedStakingToken;
//
// Time-bonus params
//
uint256 public constant BONUS_DECIMALS = 2;
uint256 public startBonus = 0;
uint256 public bonusPeriodSec = 0;
//
// Global accounting state
//
uint256 public totalLockedShares = 0;
uint256 public totalStakingShares = 0;
uint256 private _totalStakingShareSeconds = 0;
uint256 private _lastAccountingTimestampSec = now;
uint256 private _maxUnlockSchedules = 0;
uint256 private _initialSharesPerToken = 0;
//
// User accounting state
//
// Represents a single stake for a user. A user may have multiple.
struct Stake {
uint256 stakingShares;
uint256 timestampSec;
}
// Caches aggregated values from the User->Stake[] map to save computation.
// If lastAccountingTimestampSec is 0, there's no entry for that user.
struct UserTotals {
uint256 stakingShares;
uint256 stakingShareSeconds;
uint256 lastAccountingTimestampSec;
}
// Aggregated staking values per user
mapping(address => UserTotals) private _userTotals;
// The collection of stakes for each user. Ordered by timestamp, earliest to latest.
mapping(address => Stake[]) private _userStakes;
//
// Locked/Unlocked Accounting state
//
struct UnlockSchedule {
uint256 initialLockedShares;
uint256 unlockedShares;
uint256 lastUnlockTimestampSec;
uint256 endAtSec;
uint256 durationSec;
}
UnlockSchedule[] public unlockSchedules;
/**
* @param stakingToken The token users deposit as stake.
* @param distributionToken The token users receive as they unstake.
* @param maxUnlockSchedules Max number of unlock stages, to guard against hitting gas limit.
* @param startBonus_ Starting time bonus, BONUS_DECIMALS fixed point.
* e.g. 25% means user gets 25% of max distribution tokens.
* @param bonusPeriodSec_ Length of time for bonus to increase linearly to max.
* @param initialSharesPerToken Number of shares to mint per staking token on first stake.
*/
constructor(IERC20 stakingToken, IERC20 distributionToken, uint256 maxUnlockSchedules,
uint256 startBonus_, uint256 bonusPeriodSec_, uint256 initialSharesPerToken,
IERC20 unwrappedStakingToken_) public {
// The start bonus must be some fraction of the max. (i.e. <= 100%)
require(startBonus_ <= 10**BONUS_DECIMALS, 'TokenGeyser: start bonus too high');
// If no period is desired, instead set startBonus = 100%
// and bonusPeriod to a small value like 1sec.
require(bonusPeriodSec_ != 0, 'TokenGeyser: bonus period is zero');
require(initialSharesPerToken > 0, 'TokenGeyser: initialSharesPerToken is zero');
_stakingPool = new TokenPool(stakingToken);
_unlockedPool = new TokenPool(distributionToken);
_lockedPool = new TokenPool(distributionToken);
startBonus = startBonus_;
bonusPeriodSec = bonusPeriodSec_;
_maxUnlockSchedules = maxUnlockSchedules;
_initialSharesPerToken = initialSharesPerToken;
_tokenizer = MasterChefTokenizer(address(stakingToken)); // staking token will be the tokenizer
_unwrappedStakingToken = unwrappedStakingToken_;
_unwrappedStakingToken.approve(address(_tokenizer), uint256(-1)); // approve unwrapped LP token to be wrapped
stakingToken.approve(address(this), uint256(-1)); // approve this address to get staked token from this contract and avoid to change _stakeFor
}
/**
* @return The token users deposit as stake.
*/
function getStakingToken() public view returns (IERC20) {
return _stakingPool.token();
}
/**
* @return The token users receive as they unstake.
*/
function getDistributionToken() public view returns (IERC20) {
assert(_unlockedPool.token() == _lockedPool.token());
return _unlockedPool.token();
}
function permitWrapAndStake(uint256 amount, uint256 expiry, uint8 v, bytes32 r, bytes32 s) external {
IERC20Permit(address(_unwrappedStakingToken)).permit(msg.sender, address(this), amount, expiry, v, r, s);
wrapAndStake(amount);
}
function permitWrapAndStakeUnlimited(uint256 amount, uint256 expiry, uint8 v, bytes32 r, bytes32 s) external {
IERC20Permit(address(_unwrappedStakingToken)).permit(msg.sender, address(this), uint256(-1), expiry, v, r, s);
wrapAndStake(amount);
}
function wrapAndStake(uint256 amount) public {
_unwrappedStakingToken.transferFrom(msg.sender, address(this), amount);
_tokenizer.wrap(amount); // tokeniser will wrap tokens and send to geyser contract
_stakeFor(address(this), msg.sender, amount); // msg.sender is the beneficiary
}
/**
* @dev Transfers amount of deposit tokens from the user.
* @param amount Number of deposit tokens to stake.
* @param data Not used.
*/
function stake(uint256 amount, bytes calldata data) external {
_stakeFor(msg.sender, msg.sender, amount);
}
/**
* @dev Transfers amount of deposit tokens from the caller on behalf of user.
* @param user User address who gains credit for this stake operation.
* @param amount Number of deposit tokens to stake.
* @param data Not used.
*/
function stakeFor(address user, uint256 amount, bytes calldata data) external onlyOwner {
_stakeFor(msg.sender, user, amount);
}
/**
* @dev Private implementation of staking methods.
* @param staker User address who deposits tokens to stake.
* @param beneficiary User address who gains credit for this stake operation.
* @param amount Number of deposit tokens to stake.
*/
function _stakeFor(address staker, address beneficiary, uint256 amount) private {
require(amount > 0, 'TokenGeyser: stake amount is zero');
require(beneficiary != address(0), 'TokenGeyser: beneficiary is zero address');
require(totalStakingShares == 0 || totalStaked() > 0,
'TokenGeyser: Invalid state. Staking shares exist, but no staking tokens do');
uint256 mintedStakingShares = (totalStakingShares > 0)
? totalStakingShares.mul(amount).div(totalStaked())
: amount.mul(_initialSharesPerToken);
require(mintedStakingShares > 0, 'TokenGeyser: Stake amount is too small');
updateAccounting();
// 1. User Accounting
UserTotals storage totals = _userTotals[beneficiary];
totals.stakingShares = totals.stakingShares.add(mintedStakingShares);
totals.lastAccountingTimestampSec = now;
Stake memory newStake = Stake(mintedStakingShares, now);
_userStakes[beneficiary].push(newStake);
// 2. Global Accounting
totalStakingShares = totalStakingShares.add(mintedStakingShares);
// Already set in updateAccounting()
// _lastAccountingTimestampSec = now;
// interactions
require(_stakingPool.token().transferFrom(staker, address(_stakingPool), amount),
'TokenGeyser: transfer into staking pool failed');
emit Staked(beneficiary, amount, totalStakedFor(beneficiary), "");
}
function unstakeAndUnwrap(uint256 amount) external {
// this sends the rewards + wrapped stake to msg.sender
_unstake(amount);
// wLP are burned from msg.sender
_tokenizer.unwrapFor(amount, msg.sender);
}
/**
* @dev Unstakes a certain amount of previously deposited tokens. User also receives their
* alotted number of distribution tokens.
* @param amount Number of deposit tokens to unstake / withdraw.
* @param data Not used.
*/
function unstake(uint256 amount, bytes calldata data) external {
_unstake(amount);
}
/**
* @param amount Number of deposit tokens to unstake / withdraw.
* @return The total number of distribution tokens that would be rewarded.
*/
function unstakeQuery(uint256 amount) public returns (uint256) {
return _unstake(amount);
}
/**
* @dev Unstakes a certain amount of previously deposited tokens. User also receives their
* alotted number of distribution tokens.
* @param amount Number of deposit tokens to unstake / withdraw.
* @return The total number of distribution tokens rewarded.
*/
function _unstake(uint256 amount) private returns (uint256) {
updateAccounting();
// checks
require(amount > 0, 'TokenGeyser: unstake amount is zero');
require(totalStakedFor(msg.sender) >= amount,
'TokenGeyser: unstake amount is greater than total user stakes');
uint256 stakingSharesToBurn = totalStakingShares.mul(amount).div(totalStaked());
require(stakingSharesToBurn > 0, 'TokenGeyser: Unable to unstake amount this small');
// 1. User Accounting
UserTotals storage totals = _userTotals[msg.sender];
Stake[] storage accountStakes = _userStakes[msg.sender];
// Redeem from most recent stake and go backwards in time.
uint256 stakingShareSecondsToBurn = 0;
uint256 sharesLeftToBurn = stakingSharesToBurn;
uint256 rewardAmount = 0;
while (sharesLeftToBurn > 0) {
Stake storage lastStake = accountStakes[accountStakes.length - 1];
uint256 stakeTimeSec = now.sub(lastStake.timestampSec);
uint256 newStakingShareSecondsToBurn = 0;
if (lastStake.stakingShares <= sharesLeftToBurn) {
// fully redeem a past stake
newStakingShareSecondsToBurn = lastStake.stakingShares.mul(stakeTimeSec);
rewardAmount = computeNewReward(rewardAmount, newStakingShareSecondsToBurn, stakeTimeSec);
stakingShareSecondsToBurn = stakingShareSecondsToBurn.add(newStakingShareSecondsToBurn);
sharesLeftToBurn = sharesLeftToBurn.sub(lastStake.stakingShares);
accountStakes.length--;
} else {
// partially redeem a past stake
newStakingShareSecondsToBurn = sharesLeftToBurn.mul(stakeTimeSec);
rewardAmount = computeNewReward(rewardAmount, newStakingShareSecondsToBurn, stakeTimeSec);
stakingShareSecondsToBurn = stakingShareSecondsToBurn.add(newStakingShareSecondsToBurn);
lastStake.stakingShares = lastStake.stakingShares.sub(sharesLeftToBurn);
sharesLeftToBurn = 0;
}
}
totals.stakingShareSeconds = totals.stakingShareSeconds.sub(stakingShareSecondsToBurn);
totals.stakingShares = totals.stakingShares.sub(stakingSharesToBurn);
// Already set in updateAccounting
// totals.lastAccountingTimestampSec = now;
// 2. Global Accounting
_totalStakingShareSeconds = _totalStakingShareSeconds.sub(stakingShareSecondsToBurn);
totalStakingShares = totalStakingShares.sub(stakingSharesToBurn);
// Already set in updateAccounting
// _lastAccountingTimestampSec = now;
// interactions
require(_stakingPool.transfer(msg.sender, amount),
'TokenGeyser: transfer out of staking pool failed');
require(_unlockedPool.transfer(msg.sender, rewardAmount),
'TokenGeyser: transfer out of unlocked pool failed');
emit Unstaked(msg.sender, amount, totalStakedFor(msg.sender), "");
emit TokensClaimed(msg.sender, rewardAmount);
require(totalStakingShares == 0 || totalStaked() > 0,
"TokenGeyser: Error unstaking. Staking shares exist, but no staking tokens do");
return rewardAmount;
}
/**
* @dev Applies an additional time-bonus to a distribution amount. This is necessary to
* encourage long-term deposits instead of constant unstake/restakes.
* The bonus-multiplier is the result of a linear function that starts at startBonus and
* ends at 100% over bonusPeriodSec, then stays at 100% thereafter.
* @param currentRewardTokens The current number of distribution tokens already alotted for this
* unstake op. Any bonuses are already applied.
* @param stakingShareSeconds The stakingShare-seconds that are being burned for new
* distribution tokens.
* @param stakeTimeSec Length of time for which the tokens were staked. Needed to calculate
* the time-bonus.
* @return Updated amount of distribution tokens to award, with any bonus included on the
* newly added tokens.
*/
function computeNewReward(uint256 currentRewardTokens,
uint256 stakingShareSeconds,
uint256 stakeTimeSec) private view returns (uint256) {
uint256 newRewardTokens =
totalUnlocked()
.mul(stakingShareSeconds)
.div(_totalStakingShareSeconds);
if (stakeTimeSec >= bonusPeriodSec) {
return currentRewardTokens.add(newRewardTokens);
}
uint256 oneHundredPct = 10**BONUS_DECIMALS;
uint256 bonusedReward =
startBonus
.add(oneHundredPct.sub(startBonus).mul(stakeTimeSec).div(bonusPeriodSec))
.mul(newRewardTokens)
.div(oneHundredPct);
return currentRewardTokens.add(bonusedReward);
}
/**
* @param addr The user to look up staking information for.
* @return The number of staking tokens deposited for addr.
*/
function totalStakedFor(address addr) public view returns (uint256) {
return totalStakingShares > 0 ?
totalStaked().mul(_userTotals[addr].stakingShares).div(totalStakingShares) : 0;
}
/**
* @return The total number of deposit tokens staked globally, by all users.
*/
function totalStaked() public view returns (uint256) {
return _stakingPool.balance();
}
/**
* @dev Note that this application has a staking token as well as a distribution token, which
* may be different. This function is required by EIP-900.
* @return The deposit token used for staking.
*/
function token() external view returns (address) {
return address(getStakingToken());
}
/**
* @dev A globally callable function to update the accounting state of the system.
* Global state and state for the caller are updated.
* @return [0] balance of the locked pool
* @return [1] balance of the unlocked pool
* @return [2] caller's staking share seconds
* @return [3] global staking share seconds
* @return [4] Rewards caller has accumulated, optimistically assumes max time-bonus.
* @return [5] block timestamp
*/
function updateAccounting() public returns (
uint256, uint256, uint256, uint256, uint256, uint256) {
unlockTokens();
// Global accounting
uint256 newStakingShareSeconds =
now
.sub(_lastAccountingTimestampSec)
.mul(totalStakingShares);
_totalStakingShareSeconds = _totalStakingShareSeconds.add(newStakingShareSeconds);
_lastAccountingTimestampSec = now;
// User Accounting
UserTotals storage totals = _userTotals[msg.sender];
uint256 newUserStakingShareSeconds =
now
.sub(totals.lastAccountingTimestampSec)
.mul(totals.stakingShares);
totals.stakingShareSeconds =
totals.stakingShareSeconds
.add(newUserStakingShareSeconds);
totals.lastAccountingTimestampSec = now;
uint256 totalUserRewards = (_totalStakingShareSeconds > 0)
? totalUnlocked().mul(totals.stakingShareSeconds).div(_totalStakingShareSeconds)
: 0;
return (
totalLocked(),
totalUnlocked(),
totals.stakingShareSeconds,
_totalStakingShareSeconds,
totalUserRewards,
now
);
}
/**
* @return Total number of locked distribution tokens.
*/
function totalLocked() public view returns (uint256) {
return _lockedPool.balance();
}
/**
* @return Total number of unlocked distribution tokens.
*/
function totalUnlocked() public view returns (uint256) {
return _unlockedPool.balance();
}
/**
* @return Number of unlock schedules.
*/
function unlockScheduleCount() public view returns (uint256) {
return unlockSchedules.length;
}
/**
* @dev This funcion allows the contract owner to add more locked distribution tokens, along
* with the associated "unlock schedule". These locked tokens immediately begin unlocking
* linearly over the duraction of durationSec timeframe.
* @param amount Number of distribution tokens to lock. These are transferred from the caller.
* @param durationSec Length of time to linear unlock the tokens.
*/
function lockTokens(uint256 amount, uint256 durationSec) external onlyOwner {
require(unlockSchedules.length < _maxUnlockSchedules,
'TokenGeyser: reached maximum unlock schedules');
// Update lockedTokens amount before using it in computations after.
updateAccounting();
uint256 lockedTokens = totalLocked();
uint256 mintedLockedShares = (lockedTokens > 0)
? totalLockedShares.mul(amount).div(lockedTokens)
: amount.mul(_initialSharesPerToken);
UnlockSchedule memory schedule;
schedule.initialLockedShares = mintedLockedShares;
schedule.lastUnlockTimestampSec = now;
schedule.endAtSec = now.add(durationSec);
schedule.durationSec = durationSec;
unlockSchedules.push(schedule);
totalLockedShares = totalLockedShares.add(mintedLockedShares);
require(_lockedPool.token().transferFrom(msg.sender, address(_lockedPool), amount),
'TokenGeyser: transfer into locked pool failed');
emit TokensLocked(amount, durationSec, totalLocked());
}
/**
* @dev Moves distribution tokens from the locked pool to the unlocked pool, according to the
* previously defined unlock schedules. Publicly callable.
* @return Number of newly unlocked distribution tokens.
*/
function unlockTokens() public returns (uint256) {
uint256 unlockedTokens = 0;
uint256 lockedTokens = totalLocked();
if (totalLockedShares == 0) {
unlockedTokens = lockedTokens;
} else {
uint256 unlockedShares = 0;
for (uint256 s = 0; s < unlockSchedules.length; s++) {
unlockedShares = unlockedShares.add(unlockScheduleShares(s));
}
unlockedTokens = unlockedShares.mul(lockedTokens).div(totalLockedShares);
totalLockedShares = totalLockedShares.sub(unlockedShares);
}
if (unlockedTokens > 0) {
require(_lockedPool.transfer(address(_unlockedPool), unlockedTokens),
'TokenGeyser: transfer out of locked pool failed');
emit TokensUnlocked(unlockedTokens, totalLocked());
}
return unlockedTokens;
}
/**
* @dev Returns the number of unlockable shares from a given schedule. The returned value
* depends on the time since the last unlock. This function updates schedule accounting,
* but does not actually transfer any tokens.
* @param s Index of the unlock schedule.
* @return The number of unlocked shares.
*/
function unlockScheduleShares(uint256 s) private returns (uint256) {
UnlockSchedule storage schedule = unlockSchedules[s];
if(schedule.unlockedShares >= schedule.initialLockedShares) {
return 0;
}
uint256 sharesToUnlock = 0;
// Special case to handle any leftover dust from integer division
if (now >= schedule.endAtSec) {
sharesToUnlock = (schedule.initialLockedShares.sub(schedule.unlockedShares));
schedule.lastUnlockTimestampSec = schedule.endAtSec;
} else {
sharesToUnlock = now.sub(schedule.lastUnlockTimestampSec)
.mul(schedule.initialLockedShares)
.div(schedule.durationSec);
schedule.lastUnlockTimestampSec = now;
}
schedule.unlockedShares = schedule.unlockedShares.add(sharesToUnlock);
return sharesToUnlock;
}
/**
* @dev Lets the owner rescue funds air-dropped to the staking pool.
* @param tokenToRescue Address of the token to be rescued.
* @param to Address to which the rescued funds are to be sent.
* @param amount Amount of tokens to be rescued.
* @return Transfer success.
*/
function rescueFundsFromStakingPool(address tokenToRescue, address to, uint256 amount)
public onlyOwner returns (bool) {
return _stakingPool.rescueFunds(tokenToRescue, to, amount);
}
/**
* @dev Let's the owner emergency shutdown the geyser. Funds from each TokenPool as sent to the idleFeeTreausry
*/
function emergencyShutdown() external onlyOwner {
address _idleFeeTreasury = address(0x69a62C24F16d4914a48919613e8eE330641Bcb94);
_stakingPool.transfer(_idleFeeTreasury, _stakingPool.balance()); // send the wLP token to fee treasury, a subsequent unwrap will need to be called
_unlockedPool.transfer(_idleFeeTreasury, _unlockedPool.balance());
_lockedPool.transfer(_idleFeeTreasury, _lockedPool.balance());
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"contract IERC20","name":"stakingToken","type":"address"},{"internalType":"contract IERC20","name":"distributionToken","type":"address"},{"internalType":"uint256","name":"maxUnlockSchedules","type":"uint256"},{"internalType":"uint256","name":"startBonus_","type":"uint256"},{"internalType":"uint256","name":"bonusPeriodSec_","type":"uint256"},{"internalType":"uint256","name":"initialSharesPerToken","type":"uint256"},{"internalType":"contract IERC20","name":"unwrappedStakingToken_","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"total","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokensClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"durationSec","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"total","type":"uint256"}],"name":"TokensLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"total","type":"uint256"}],"name":"TokensUnlocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"total","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"Unstaked","type":"event"},{"constant":true,"inputs":[],"name":"BONUS_DECIMALS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"bonusPeriodSec","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"emergencyShutdown","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getDistributionToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getStakingToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"durationSec","type":"uint256"}],"name":"lockTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permitWrapAndStake","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permitWrapAndStakeUnlimited","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenToRescue","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"rescueFundsFromStakingPool","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"stake","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"stakeFor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"startBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"supportsHistory","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalLocked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalLockedShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"totalStakedFor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalStakingShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalUnlocked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"unlockScheduleCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"unlockSchedules","outputs":[{"internalType":"uint256","name":"initialLockedShares","type":"uint256"},{"internalType":"uint256","name":"unlockedShares","type":"uint256"},{"internalType":"uint256","name":"lastUnlockTimestampSec","type":"uint256"},{"internalType":"uint256","name":"endAtSec","type":"uint256"},{"internalType":"uint256","name":"durationSec","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unlockTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"unstake","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"unstakeAndUnwrap","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"unstakeQuery","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"updateAccounting","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"wrapAndStake","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405260006006556000600755600060085560006009556000600a5542600b556000600c556000600d553480156200003857600080fd5b50604051620051cc380380620051cc833981810160405260e08110156200005e57600080fd5b8101908080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190505050620000bb6200073060201b60201c565b6000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36002600a0a841115620001d5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180620051606021913960400191505060405180910390fd5b600083141562000231576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180620051ab6021913960400191505060405180910390fd5b600082116200028c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018062005181602a913960400191505060405180910390fd5b866040516200029b9062000738565b808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050604051809103906000f080158015620002ee573d6000803e3d6000fd5b50600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550856040516200033e9062000738565b808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050604051809103906000f08015801562000391573d6000803e3d6000fd5b50600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085604051620003e19062000738565b808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050604051809103906000f08015801562000434573d6000803e3d6000fd5b50600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550836006819055508260078190555084600c8190555081600d8190555086600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015620005ff57600080fd5b505af115801562000614573d6000803e3d6000fd5b505050506040513d60208110156200062b57600080fd5b8101908080519060200190929190505050508673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3307fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015620006e557600080fd5b505af1158015620006fa573d6000803e3d6000fd5b505050506040513d60208110156200071157600080fd5b8101908080519060200190929190505050505050505050505062000746565b600033905090565b610c8280620044de83390190565b613d8880620007566000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c80637c6aa6f41161010f578063a779d080116100a2578063f117d44711610071578063f117d447146108b9578063f2fde38b146108e7578063f968f4931461092b578063fc0c546a14610949576101f0565b8063a779d080146107a1578063c7ae2007146107bf578063c8fd6ed0146107dd578063e63aa55b14610860576101f0565b806389158d8e116100de57806389158d8e146106b35780638da5cb5b146106eb5780638f32d59b146107355780639f9106d114610757576101f0565b80637c6aa6f414610617578063817b1cd21461063557806381c39bec1461065357806386805dd114610671576101f0565b80634b341aed116101875780635c94bcb2116101565780635c94bcb21461056f5780637033e4a6146105cd57806370c6a17e146105ef578063715018a61461060d576101f0565b80634b341aed1461041a5780634bb005651461047257806356891412146104cb5780635a72bbef146104e9576101f0565b80633403c2fc116101c35780633403c2fc1461038357806338b45fde1461038d57806346a10546146103ab578063494347e7146103d9576101f0565b80630e89439b146101f55780630ef96356146102785780631dc27fde1461031b57806322c12b8414610339575b600080fd5b6102766004803603604081101561020b57600080fd5b81019080803590602001909291908035906020019064010000000081111561023257600080fd5b82018360208201111561024457600080fd5b8035906020019184600183028401116401000000008311171561026657600080fd5b9091929391929390505050610993565b005b6103196004803603606081101561028e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156102d557600080fd5b8201836020820111156102e757600080fd5b8035906020019184600183028401116401000000008311171561030957600080fd5b90919293919293905050506109a3565b005b610323610a2e565b6040518082815260200191505060405180910390f35b610341610a33565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61038b610c56565b005b610395611181565b6040518082815260200191505060405180910390f35b6103d7600480360360208110156103c157600080fd5b8101908080359060200190929190505050611187565b005b6103e161133b565b60405180878152602001868152602001858152602001848152602001838152602001828152602001965050505050505060405180910390f35b61045c6004803603602081101561043057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506114b1565b6040518082815260200191505060405180910390f35b6104c9600480360360a081101561048857600080fd5b810190808035906020019092919080359060200190929190803560ff169060200190929190803590602001909291908035906020019092919050505061153b565b005b6104d3611686565b6040518082815260200191505060405180910390f35b610555600480360360608110156104ff57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611730565b604051808215151515815260200191505060405180910390f35b61059b6004803603602081101561058557600080fd5b81019080803590602001909291905050506118cd565b604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b6105d5611910565b604051808215151515815260200191505060405180910390f35b6105f7611918565b6040518082815260200191505060405180910390f35b61061561191e565b005b61061f611a57565b6040518082815260200191505060405180910390f35b61063d611a5d565b6040518082815260200191505060405180910390f35b61065b611b07565b6040518082815260200191505060405180910390f35b61069d6004803603602081101561068757600080fd5b8101908080359060200190929190505050611b0d565b6040518082815260200191505060405180910390f35b6106e9600480360360408110156106c957600080fd5b810190808035906020019092919080359060200190929190505050611b1f565b005b6106f3611f83565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61073d611fac565b604051808215151515815260200191505060405180910390f35b61075f61200a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6107a96120b4565b6040518082815260200191505060405180910390f35b6107c761215e565b6040518082815260200191505060405180910390f35b61085e600480360360408110156107f357600080fd5b81019080803590602001909291908035906020019064010000000081111561081a57600080fd5b82018360208201111561082c57600080fd5b8035906020019184600183028401116401000000008311171561084e57600080fd5b909192939192939050505061216b565b005b6108b7600480360360a081101561087657600080fd5b810190808035906020019092919080359060200190929190803560ff169060200190929190803590602001909291908035906020019092919050505061217a565b005b6108e5600480360360208110156108cf57600080fd5b81019080803590602001909291905050506122a5565b005b610929600480360360208110156108fd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612373565b005b6109336123f9565b6040518082815260200191505060405180910390f35b61095161265b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61099e33338561266a565b505050565b6109ab611fac565b610a1d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b610a2833858561266a565b50505050565b600281565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015610a9d57600080fd5b505afa158015610ab1573d6000803e3d6000fd5b505050506040513d6020811015610ac757600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015610b5657600080fd5b505afa158015610b6a573d6000803e3d6000fd5b505050506040513d6020811015610b8057600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1614610bae57fe5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015610c1657600080fd5b505afa158015610c2a573d6000803e3d6000fd5b505050506040513d6020811015610c4057600080fd5b8101908080519060200190929190505050905090565b610c5e611fac565b610cd0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60007369a62c24f16d4914a48919613e8ee330641bcb949050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b69ef8a86040518163ffffffff1660e01b815260040160206040518083038186803b158015610d9057600080fd5b505afa158015610da4573d6000803e3d6000fd5b505050506040513d6020811015610dba57600080fd5b81019080805190602001909291905050506040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015610e3457600080fd5b505af1158015610e48573d6000803e3d6000fd5b505050506040513d6020811015610e5e57600080fd5b810190808051906020019092919050505050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b69ef8a86040518163ffffffff1660e01b815260040160206040518083038186803b158015610f1757600080fd5b505afa158015610f2b573d6000803e3d6000fd5b505050506040513d6020811015610f4157600080fd5b81019080805190602001909291905050506040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015610fbb57600080fd5b505af1158015610fcf573d6000803e3d6000fd5b505050506040513d6020811015610fe557600080fd5b810190808051906020019092919050505050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b69ef8a86040518163ffffffff1660e01b815260040160206040518083038186803b15801561109e57600080fd5b505afa1580156110b2573d6000803e3d6000fd5b505050506040513d60208110156110c857600080fd5b81019080805190602001909291905050506040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561114257600080fd5b505af1158015611156573d6000803e3d6000fd5b505050506040513d602081101561116c57600080fd5b81019080805190602001909291905050505050565b60065481565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561126457600080fd5b505af1158015611278573d6000803e3d6000fd5b505050506040513d602081101561128e57600080fd5b810190808051906020019092919050505050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ea598cb0826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561131557600080fd5b505af1158015611329573d6000803e3d6000fd5b5050505061133830338361266a565b50565b60008060008060008061134c6123f9565b50600061137860095461136a600b5442612c2390919063ffffffff16565b612c6d90919063ffffffff16565b905061138f81600a54612cf390919063ffffffff16565b600a8190555042600b819055506000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600061140e8260000154611400846002015442612c2390919063ffffffff16565b612c6d90919063ffffffff16565b9050611427818360010154612cf390919063ffffffff16565b8260010181905550428260020181905550600080600a541161144a57600061147d565b61147c600a5461146e85600101546114606120b4565b612c6d90919063ffffffff16565b612d7b90919063ffffffff16565b5b9050611487611686565b61148f6120b4565b8460010154600a54844299509950995099509950995050505050909192939495565b600080600954116114c3576000611534565b611533600954611525600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154611517611a5d565b612c6d90919063ffffffff16565b612d7b90919063ffffffff16565b5b9050919050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d505accf33307fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff888888886040518863ffffffff1660e01b8152600401808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018581526020018460ff1660ff168152602001838152602001828152602001975050505050505050600060405180830381600087803b15801561165e57600080fd5b505af1158015611672573d6000803e3d6000fd5b5050505061167f85611187565b5050505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b69ef8a86040518163ffffffff1660e01b815260040160206040518083038186803b1580156116f057600080fd5b505afa158015611704573d6000803e3d6000fd5b505050506040513d602081101561171a57600080fd5b8101908080519060200190929190505050905090565b600061173a611fac565b6117ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636ccae0548585856040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561188957600080fd5b505af115801561189d573d6000803e3d6000fd5b505050506040513d60208110156118b357600080fd5b810190808051906020019092919050505090509392505050565b601081815481106118da57fe5b90600052602060002090600502016000915090508060000154908060010154908060020154908060030154908060040154905085565b600080905090565b60095481565b611926611fac565b611998576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60075481565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b69ef8a86040518163ffffffff1660e01b815260040160206040518083038186803b158015611ac757600080fd5b505afa158015611adb573d6000803e3d6000fd5b505050506040513d6020811015611af157600080fd5b8101908080519060200190929190505050905090565b60085481565b6000611b1882612dc5565b9050919050565b611b27611fac565b611b99576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600c5460108054905010611bf8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180613cf7602d913960400191505060405180910390fd5b611c0061133b565b5050505050506000611c10611686565b90506000808211611c3557611c30600d5485612c6d90919063ffffffff16565b611c5d565b611c5c82611c4e86600854612c6d90919063ffffffff16565b612d7b90919063ffffffff16565b5b9050611c676139b5565b8181600001818152505042816040018181525050611c8e8442612cf390919063ffffffff16565b81606001818152505083816080018181525050601081908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000015560208201518160010155604082015181600201556060820151816003015560808201518160040155505050611d1982600854612cf390919063ffffffff16565b600881905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015611d8757600080fd5b505afa158015611d9b573d6000803e3d6000fd5b505050506040513d6020811015611db157600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff166323b872dd33600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16886040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015611e9e57600080fd5b505af1158015611eb2573d6000803e3d6000fd5b505050506040513d6020811015611ec857600080fd5b8101908080519060200190929190505050611f2e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180613a60602d913960400191505060405180910390fd5b7ff346961af4c52f314df1b45964746280fe409abb959d4a2458d58f79408b1fe88585611f59611686565b60405180848152602001838152602001828152602001935050505060405180910390a15050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611fee6134fb565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561207457600080fd5b505afa158015612088573d6000803e3d6000fd5b505050506040513d602081101561209e57600080fd5b8101908080519060200190929190505050905090565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b69ef8a86040518163ffffffff1660e01b815260040160206040518083038186803b15801561211e57600080fd5b505afa158015612132573d6000803e3d6000fd5b505050506040513d602081101561214857600080fd5b8101908080519060200190929190505050905090565b6000601080549050905090565b61217483612dc5565b50505050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d505accf333088888888886040518863ffffffff1660e01b8152600401808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018581526020018460ff1660ff168152602001838152602001828152602001975050505050505050600060405180830381600087803b15801561227d57600080fd5b505af1158015612291573d6000803e3d6000fd5b5050505061229e85611187565b5050505050565b6122ae81612dc5565b50600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632ab180e982336040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b15801561235857600080fd5b505af115801561236c573d6000803e3d6000fd5b5050505050565b61237b611fac565b6123ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6123f681613503565b50565b60008060009050600061240a611686565b90506000600854141561241f578091506124a8565b600080905060008090505b6010805490508110156124615761245261244382613647565b83612cf390919063ffffffff16565b9150808060010191505061242a565b5061248960085461247b8484612c6d90919063ffffffff16565b612d7b90919063ffffffff16565b92506124a081600854612c2390919063ffffffff16565b600881905550505b600082111561265357600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561257c57600080fd5b505af1158015612590573d6000803e3d6000fd5b505050506040513d60208110156125a657600080fd5b810190808051906020019092919050505061260c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180613b9c602f913960400191505060405180910390fd5b7f2e444eb379b177e88ce0649c6110a3b01099f03e297127919dd5e3b63a761a9c82612636611686565b604051808381526020018281526020019250505060405180910390a15b819250505090565b600061266561200a565b905090565b600081116126c3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613c6b6021913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612749576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180613b516028913960400191505060405180910390fd5b600060095414806127615750600061275f611a5d565b115b6127b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604a815260200180613cad604a913960600191505060405180910390fd5b600080600954116127db576127d6600d5483612c6d90919063ffffffff16565b61280a565b6128096127e6611a5d565b6127fb84600954612c6d90919063ffffffff16565b612d7b90919063ffffffff16565b5b905060008111612865576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180613bcb6026913960400191505060405180910390fd5b61286d61133b565b5050505050506000600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506128cd828260000154612cf390919063ffffffff16565b81600001819055504281600201819055506128e66139e4565b6040518060400160405280848152602001428152509050600f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190806001815401808255809150509060018203906000526020600020906002020160009091929091909150600082015181600001556020820151816001015550505061299483600954612cf390919063ffffffff16565b600981905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015612a0257600080fd5b505afa158015612a16573d6000803e3d6000fd5b505050506040513d6020811015612a2c57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff166323b872dd87600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16876040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015612b1957600080fd5b505af1158015612b2d573d6000803e3d6000fd5b505050506040513d6020811015612b4357600080fd5b8101908080519060200190929190505050612ba9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180613c3d602e913960400191505060405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff167fc65e53b88159e7d2c0fc12a0600072e28ae53ff73b4c1715369c30f16093514285612beb886114b1565b6040518083815260200182815260200180602001828103825260008152602001602001935050505060405180910390a2505050505050565b6000612c6583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613738565b905092915050565b600080831415612c805760009050612ced565b6000828402905082848281612c9157fe5b0414612ce8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613c8c6021913960400191505060405180910390fd5b809150505b92915050565b600080828401905083811015612d71576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000612dbd83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506137f8565b905092915050565b6000612dcf61133b565b50505050505060008211612e2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180613b796023913960400191505060405180910390fd5b81612e38336114b1565b1015612e8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180613b14603d913960400191505060405180910390fd5b6000612ebf612e9c611a5d565b612eb185600954612c6d90919063ffffffff16565b612d7b90919063ffffffff16565b905060008111612f1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180613a8d6030913960400191505060405180910390fd5b6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000809050600084905060008090505b60008211156130da57600084600186805490500381548110612fce57fe5b906000526020600020906002020190506000612ff7826001015442612c2390919063ffffffff16565b905060008090508483600001541161307757613020828460000154612c6d90919063ffffffff16565b905061302d8482846138be565b93506130428187612cf390919063ffffffff16565b955061305b836000015486612c2390919063ffffffff16565b94508680548091906001900361307191906139fe565b506130d2565b61308a8286612c6d90919063ffffffff16565b90506130978482846138be565b93506130ac8187612cf390919063ffffffff16565b95506130c5858460000154612c2390919063ffffffff16565b8360000181905550600094505b505050612fb0565b6130f1838660010154612c2390919063ffffffff16565b8560010181905550613110868660000154612c2390919063ffffffff16565b856000018190555061312d83600a54612c2390919063ffffffff16565b600a8190555061314886600954612c2390919063ffffffff16565b600981905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb338a6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156131f757600080fd5b505af115801561320b573d6000803e3d6000fd5b505050506040513d602081101561322157600080fd5b8101908080519060200190929190505050613287576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180613d246030913960400191505060405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561333057600080fd5b505af1158015613344573d6000803e3d6000fd5b505050506040513d602081101561335a57600080fd5b81019080805190602001909291905050506133c0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526031815260200180613ae36031913960400191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167faf01bfc8475df280aca00b578c4a948e6d95700f0db8c13365240f7f973c875489613402336114b1565b6040518083815260200182815260200180602001828103825260008152602001602001935050505060405180910390a23373ffffffffffffffffffffffffffffffffffffffff167f896e034966eaaf1adc54acc0f257056febbd300c9e47182cf761982cf1f5e430826040518082815260200191505060405180910390a26000600954148061349857506000613496611a5d565b115b6134ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604c815260200180613bf1604c913960600191505060405180910390fd5b809650505050505050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613589576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180613abd6026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806010838154811061365757fe5b906000526020600020906005020190508060000154816001015410613680576000915050613733565b6000809050816003015442106136bf576136ab82600101548360000154612c2390919063ffffffff16565b90508160030154826002018190555061370e565b61370282600401546136f484600001546136e6866002015442612c2390919063ffffffff16565b612c6d90919063ffffffff16565b612d7b90919063ffffffff16565b90504282600201819055505b613725818360010154612cf390919063ffffffff16565b826001018190555080925050505b919050565b60008383111582906137e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156137aa57808201518184015260208101905061378f565b50505050905090810190601f1680156137d75780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b600080831182906138a4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561386957808201518184015260208101905061384e565b50505050905090810190601f1680156138965780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816138b057fe5b049050809150509392505050565b6000806138ef600a546138e1866138d36120b4565b612c6d90919063ffffffff16565b612d7b90919063ffffffff16565b905060075483106139155761390d8186612cf390919063ffffffff16565b9150506139ae565b60006002600a0a9050600061399382613985856139776139666007546139588c61394a6006548c612c2390919063ffffffff16565b612c6d90919063ffffffff16565b612d7b90919063ffffffff16565b600654612cf390919063ffffffff16565b612c6d90919063ffffffff16565b612d7b90919063ffffffff16565b90506139a88188612cf390919063ffffffff16565b93505050505b9392505050565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b604051806040016040528060008152602001600081525090565b815481835581811115613a2b57600202816002028360005260206000209182019101613a2a9190613a30565b5b505050565b613a5c91905b80821115613a5857600080820160009055600182016000905550600201613a36565b5090565b9056fe546f6b656e4765797365723a207472616e7366657220696e746f206c6f636b656420706f6f6c206661696c6564546f6b656e4765797365723a20556e61626c6520746f20756e7374616b6520616d6f756e74207468697320736d616c6c4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373546f6b656e4765797365723a207472616e73666572206f7574206f6620756e6c6f636b656420706f6f6c206661696c6564546f6b656e4765797365723a20756e7374616b6520616d6f756e742069732067726561746572207468616e20746f74616c2075736572207374616b6573546f6b656e4765797365723a2062656e6566696369617279206973207a65726f2061646472657373546f6b656e4765797365723a20756e7374616b6520616d6f756e74206973207a65726f546f6b656e4765797365723a207472616e73666572206f7574206f66206c6f636b656420706f6f6c206661696c6564546f6b656e4765797365723a205374616b6520616d6f756e7420697320746f6f20736d616c6c546f6b656e4765797365723a204572726f7220756e7374616b696e672e205374616b696e67207368617265732065786973742c20627574206e6f207374616b696e6720746f6b656e7320646f546f6b656e4765797365723a207472616e7366657220696e746f207374616b696e6720706f6f6c206661696c6564546f6b656e4765797365723a207374616b6520616d6f756e74206973207a65726f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77546f6b656e4765797365723a20496e76616c69642073746174652e205374616b696e67207368617265732065786973742c20627574206e6f207374616b696e6720746f6b656e7320646f546f6b656e4765797365723a2072656163686564206d6178696d756d20756e6c6f636b207363686564756c6573546f6b656e4765797365723a207472616e73666572206f7574206f66207374616b696e6720706f6f6c206661696c6564a265627a7a72315820f911c42cc82d36f2540fb9a8764a528b9c649c8f42a51fee6e8c4cc9ea7b421a64736f6c63430005110032608060405234801561001057600080fd5b50604051610c82380380610c828339818101604052602081101561003357600080fd5b810190808051906020019092919050505061005261015460201b60201c565b6000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505061015c565b600033905090565b610b178061016b6000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c8063a9059cbb1161005b578063a9059cbb14610189578063b69ef8a8146101ef578063f2fde38b1461020d578063fc0c546a1461025157610088565b80636ccae0541461008d578063715018a6146101135780638da5cb5b1461011d5780638f32d59b14610167575b600080fd5b6100f9600480360360608110156100a357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061029b565b604051808215151515815260200191505060405180910390f35b61011b610489565b005b6101256105c2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61016f6105eb565b604051808215151515815260200191505060405180910390f35b6101d56004803603604081101561019f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610649565b604051808215151515815260200191505060405180910390f35b6101f76107b1565b6040518082815260200191505060405180910390f35b61024f6004803603602081101561022357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610892565b005b610259610918565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60006102a56105eb565b610317576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156103be576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180610ab16032913960400191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561044557600080fd5b505af1158015610459573d6000803e3d6000fd5b505050506040513d602081101561046f57600080fd5b810190808051906020019092919050505090509392505050565b6104916105eb565b610503576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661062d61093e565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b60006106536105eb565b6106c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561076e57600080fd5b505af1158015610782573d6000803e3d6000fd5b505050506040513d602081101561079857600080fd5b8101908080519060200190929190505050905092915050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561085257600080fd5b505afa158015610866573d6000803e3d6000fd5b505050506040513d602081101561087c57600080fd5b8101908080519060200190929190505050905090565b61089a6105eb565b61090c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b61091581610946565b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156109cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180610a8b6026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373546f6b656e506f6f6c3a2043616e6e6f7420636c61696d20746f6b656e2068656c642062792074686520636f6e7472616374a265627a7a72315820f1b25bb6b9d93544871f0853db232045ddb82a09e894faf504b5c0cdb41c434764736f6c63430005110032546f6b656e4765797365723a20737461727420626f6e757320746f6f2068696768546f6b656e4765797365723a20696e697469616c536861726573506572546f6b656e206973207a65726f546f6b656e4765797365723a20626f6e757320706572696f64206973207a65726f000000000000000000000000076ff8e6402b02855ff82119b53e59bbdd67f0ee000000000000000000000000875773784af8135ea0ef43b5a374aad105c5d39e0000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000000000000000002100000000000000000000000000000000000000000000000000000000009e340000000000000000000000000000000000000000000000000000000000000f4240000000000000000000000000a7f11e026a0af768d285360a855f2bded3047530
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101f05760003560e01c80637c6aa6f41161010f578063a779d080116100a2578063f117d44711610071578063f117d447146108b9578063f2fde38b146108e7578063f968f4931461092b578063fc0c546a14610949576101f0565b8063a779d080146107a1578063c7ae2007146107bf578063c8fd6ed0146107dd578063e63aa55b14610860576101f0565b806389158d8e116100de57806389158d8e146106b35780638da5cb5b146106eb5780638f32d59b146107355780639f9106d114610757576101f0565b80637c6aa6f414610617578063817b1cd21461063557806381c39bec1461065357806386805dd114610671576101f0565b80634b341aed116101875780635c94bcb2116101565780635c94bcb21461056f5780637033e4a6146105cd57806370c6a17e146105ef578063715018a61461060d576101f0565b80634b341aed1461041a5780634bb005651461047257806356891412146104cb5780635a72bbef146104e9576101f0565b80633403c2fc116101c35780633403c2fc1461038357806338b45fde1461038d57806346a10546146103ab578063494347e7146103d9576101f0565b80630e89439b146101f55780630ef96356146102785780631dc27fde1461031b57806322c12b8414610339575b600080fd5b6102766004803603604081101561020b57600080fd5b81019080803590602001909291908035906020019064010000000081111561023257600080fd5b82018360208201111561024457600080fd5b8035906020019184600183028401116401000000008311171561026657600080fd5b9091929391929390505050610993565b005b6103196004803603606081101561028e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156102d557600080fd5b8201836020820111156102e757600080fd5b8035906020019184600183028401116401000000008311171561030957600080fd5b90919293919293905050506109a3565b005b610323610a2e565b6040518082815260200191505060405180910390f35b610341610a33565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61038b610c56565b005b610395611181565b6040518082815260200191505060405180910390f35b6103d7600480360360208110156103c157600080fd5b8101908080359060200190929190505050611187565b005b6103e161133b565b60405180878152602001868152602001858152602001848152602001838152602001828152602001965050505050505060405180910390f35b61045c6004803603602081101561043057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506114b1565b6040518082815260200191505060405180910390f35b6104c9600480360360a081101561048857600080fd5b810190808035906020019092919080359060200190929190803560ff169060200190929190803590602001909291908035906020019092919050505061153b565b005b6104d3611686565b6040518082815260200191505060405180910390f35b610555600480360360608110156104ff57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611730565b604051808215151515815260200191505060405180910390f35b61059b6004803603602081101561058557600080fd5b81019080803590602001909291905050506118cd565b604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b6105d5611910565b604051808215151515815260200191505060405180910390f35b6105f7611918565b6040518082815260200191505060405180910390f35b61061561191e565b005b61061f611a57565b6040518082815260200191505060405180910390f35b61063d611a5d565b6040518082815260200191505060405180910390f35b61065b611b07565b6040518082815260200191505060405180910390f35b61069d6004803603602081101561068757600080fd5b8101908080359060200190929190505050611b0d565b6040518082815260200191505060405180910390f35b6106e9600480360360408110156106c957600080fd5b810190808035906020019092919080359060200190929190505050611b1f565b005b6106f3611f83565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61073d611fac565b604051808215151515815260200191505060405180910390f35b61075f61200a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6107a96120b4565b6040518082815260200191505060405180910390f35b6107c761215e565b6040518082815260200191505060405180910390f35b61085e600480360360408110156107f357600080fd5b81019080803590602001909291908035906020019064010000000081111561081a57600080fd5b82018360208201111561082c57600080fd5b8035906020019184600183028401116401000000008311171561084e57600080fd5b909192939192939050505061216b565b005b6108b7600480360360a081101561087657600080fd5b810190808035906020019092919080359060200190929190803560ff169060200190929190803590602001909291908035906020019092919050505061217a565b005b6108e5600480360360208110156108cf57600080fd5b81019080803590602001909291905050506122a5565b005b610929600480360360208110156108fd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612373565b005b6109336123f9565b6040518082815260200191505060405180910390f35b61095161265b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61099e33338561266a565b505050565b6109ab611fac565b610a1d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b610a2833858561266a565b50505050565b600281565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015610a9d57600080fd5b505afa158015610ab1573d6000803e3d6000fd5b505050506040513d6020811015610ac757600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015610b5657600080fd5b505afa158015610b6a573d6000803e3d6000fd5b505050506040513d6020811015610b8057600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1614610bae57fe5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015610c1657600080fd5b505afa158015610c2a573d6000803e3d6000fd5b505050506040513d6020811015610c4057600080fd5b8101908080519060200190929190505050905090565b610c5e611fac565b610cd0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60007369a62c24f16d4914a48919613e8ee330641bcb949050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b69ef8a86040518163ffffffff1660e01b815260040160206040518083038186803b158015610d9057600080fd5b505afa158015610da4573d6000803e3d6000fd5b505050506040513d6020811015610dba57600080fd5b81019080805190602001909291905050506040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015610e3457600080fd5b505af1158015610e48573d6000803e3d6000fd5b505050506040513d6020811015610e5e57600080fd5b810190808051906020019092919050505050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b69ef8a86040518163ffffffff1660e01b815260040160206040518083038186803b158015610f1757600080fd5b505afa158015610f2b573d6000803e3d6000fd5b505050506040513d6020811015610f4157600080fd5b81019080805190602001909291905050506040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015610fbb57600080fd5b505af1158015610fcf573d6000803e3d6000fd5b505050506040513d6020811015610fe557600080fd5b810190808051906020019092919050505050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b69ef8a86040518163ffffffff1660e01b815260040160206040518083038186803b15801561109e57600080fd5b505afa1580156110b2573d6000803e3d6000fd5b505050506040513d60208110156110c857600080fd5b81019080805190602001909291905050506040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561114257600080fd5b505af1158015611156573d6000803e3d6000fd5b505050506040513d602081101561116c57600080fd5b81019080805190602001909291905050505050565b60065481565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561126457600080fd5b505af1158015611278573d6000803e3d6000fd5b505050506040513d602081101561128e57600080fd5b810190808051906020019092919050505050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ea598cb0826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561131557600080fd5b505af1158015611329573d6000803e3d6000fd5b5050505061133830338361266a565b50565b60008060008060008061134c6123f9565b50600061137860095461136a600b5442612c2390919063ffffffff16565b612c6d90919063ffffffff16565b905061138f81600a54612cf390919063ffffffff16565b600a8190555042600b819055506000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600061140e8260000154611400846002015442612c2390919063ffffffff16565b612c6d90919063ffffffff16565b9050611427818360010154612cf390919063ffffffff16565b8260010181905550428260020181905550600080600a541161144a57600061147d565b61147c600a5461146e85600101546114606120b4565b612c6d90919063ffffffff16565b612d7b90919063ffffffff16565b5b9050611487611686565b61148f6120b4565b8460010154600a54844299509950995099509950995050505050909192939495565b600080600954116114c3576000611534565b611533600954611525600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154611517611a5d565b612c6d90919063ffffffff16565b612d7b90919063ffffffff16565b5b9050919050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d505accf33307fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff888888886040518863ffffffff1660e01b8152600401808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018581526020018460ff1660ff168152602001838152602001828152602001975050505050505050600060405180830381600087803b15801561165e57600080fd5b505af1158015611672573d6000803e3d6000fd5b5050505061167f85611187565b5050505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b69ef8a86040518163ffffffff1660e01b815260040160206040518083038186803b1580156116f057600080fd5b505afa158015611704573d6000803e3d6000fd5b505050506040513d602081101561171a57600080fd5b8101908080519060200190929190505050905090565b600061173a611fac565b6117ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636ccae0548585856040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561188957600080fd5b505af115801561189d573d6000803e3d6000fd5b505050506040513d60208110156118b357600080fd5b810190808051906020019092919050505090509392505050565b601081815481106118da57fe5b90600052602060002090600502016000915090508060000154908060010154908060020154908060030154908060040154905085565b600080905090565b60095481565b611926611fac565b611998576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60075481565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b69ef8a86040518163ffffffff1660e01b815260040160206040518083038186803b158015611ac757600080fd5b505afa158015611adb573d6000803e3d6000fd5b505050506040513d6020811015611af157600080fd5b8101908080519060200190929190505050905090565b60085481565b6000611b1882612dc5565b9050919050565b611b27611fac565b611b99576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600c5460108054905010611bf8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180613cf7602d913960400191505060405180910390fd5b611c0061133b565b5050505050506000611c10611686565b90506000808211611c3557611c30600d5485612c6d90919063ffffffff16565b611c5d565b611c5c82611c4e86600854612c6d90919063ffffffff16565b612d7b90919063ffffffff16565b5b9050611c676139b5565b8181600001818152505042816040018181525050611c8e8442612cf390919063ffffffff16565b81606001818152505083816080018181525050601081908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000015560208201518160010155604082015181600201556060820151816003015560808201518160040155505050611d1982600854612cf390919063ffffffff16565b600881905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015611d8757600080fd5b505afa158015611d9b573d6000803e3d6000fd5b505050506040513d6020811015611db157600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff166323b872dd33600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16886040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015611e9e57600080fd5b505af1158015611eb2573d6000803e3d6000fd5b505050506040513d6020811015611ec857600080fd5b8101908080519060200190929190505050611f2e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180613a60602d913960400191505060405180910390fd5b7ff346961af4c52f314df1b45964746280fe409abb959d4a2458d58f79408b1fe88585611f59611686565b60405180848152602001838152602001828152602001935050505060405180910390a15050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611fee6134fb565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561207457600080fd5b505afa158015612088573d6000803e3d6000fd5b505050506040513d602081101561209e57600080fd5b8101908080519060200190929190505050905090565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b69ef8a86040518163ffffffff1660e01b815260040160206040518083038186803b15801561211e57600080fd5b505afa158015612132573d6000803e3d6000fd5b505050506040513d602081101561214857600080fd5b8101908080519060200190929190505050905090565b6000601080549050905090565b61217483612dc5565b50505050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d505accf333088888888886040518863ffffffff1660e01b8152600401808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018581526020018460ff1660ff168152602001838152602001828152602001975050505050505050600060405180830381600087803b15801561227d57600080fd5b505af1158015612291573d6000803e3d6000fd5b5050505061229e85611187565b5050505050565b6122ae81612dc5565b50600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632ab180e982336040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b15801561235857600080fd5b505af115801561236c573d6000803e3d6000fd5b5050505050565b61237b611fac565b6123ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6123f681613503565b50565b60008060009050600061240a611686565b90506000600854141561241f578091506124a8565b600080905060008090505b6010805490508110156124615761245261244382613647565b83612cf390919063ffffffff16565b9150808060010191505061242a565b5061248960085461247b8484612c6d90919063ffffffff16565b612d7b90919063ffffffff16565b92506124a081600854612c2390919063ffffffff16565b600881905550505b600082111561265357600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561257c57600080fd5b505af1158015612590573d6000803e3d6000fd5b505050506040513d60208110156125a657600080fd5b810190808051906020019092919050505061260c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180613b9c602f913960400191505060405180910390fd5b7f2e444eb379b177e88ce0649c6110a3b01099f03e297127919dd5e3b63a761a9c82612636611686565b604051808381526020018281526020019250505060405180910390a15b819250505090565b600061266561200a565b905090565b600081116126c3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613c6b6021913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612749576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180613b516028913960400191505060405180910390fd5b600060095414806127615750600061275f611a5d565b115b6127b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604a815260200180613cad604a913960600191505060405180910390fd5b600080600954116127db576127d6600d5483612c6d90919063ffffffff16565b61280a565b6128096127e6611a5d565b6127fb84600954612c6d90919063ffffffff16565b612d7b90919063ffffffff16565b5b905060008111612865576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180613bcb6026913960400191505060405180910390fd5b61286d61133b565b5050505050506000600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506128cd828260000154612cf390919063ffffffff16565b81600001819055504281600201819055506128e66139e4565b6040518060400160405280848152602001428152509050600f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190806001815401808255809150509060018203906000526020600020906002020160009091929091909150600082015181600001556020820151816001015550505061299483600954612cf390919063ffffffff16565b600981905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015612a0257600080fd5b505afa158015612a16573d6000803e3d6000fd5b505050506040513d6020811015612a2c57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff166323b872dd87600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16876040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015612b1957600080fd5b505af1158015612b2d573d6000803e3d6000fd5b505050506040513d6020811015612b4357600080fd5b8101908080519060200190929190505050612ba9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180613c3d602e913960400191505060405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff167fc65e53b88159e7d2c0fc12a0600072e28ae53ff73b4c1715369c30f16093514285612beb886114b1565b6040518083815260200182815260200180602001828103825260008152602001602001935050505060405180910390a2505050505050565b6000612c6583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613738565b905092915050565b600080831415612c805760009050612ced565b6000828402905082848281612c9157fe5b0414612ce8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613c8c6021913960400191505060405180910390fd5b809150505b92915050565b600080828401905083811015612d71576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000612dbd83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506137f8565b905092915050565b6000612dcf61133b565b50505050505060008211612e2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180613b796023913960400191505060405180910390fd5b81612e38336114b1565b1015612e8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180613b14603d913960400191505060405180910390fd5b6000612ebf612e9c611a5d565b612eb185600954612c6d90919063ffffffff16565b612d7b90919063ffffffff16565b905060008111612f1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180613a8d6030913960400191505060405180910390fd5b6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000809050600084905060008090505b60008211156130da57600084600186805490500381548110612fce57fe5b906000526020600020906002020190506000612ff7826001015442612c2390919063ffffffff16565b905060008090508483600001541161307757613020828460000154612c6d90919063ffffffff16565b905061302d8482846138be565b93506130428187612cf390919063ffffffff16565b955061305b836000015486612c2390919063ffffffff16565b94508680548091906001900361307191906139fe565b506130d2565b61308a8286612c6d90919063ffffffff16565b90506130978482846138be565b93506130ac8187612cf390919063ffffffff16565b95506130c5858460000154612c2390919063ffffffff16565b8360000181905550600094505b505050612fb0565b6130f1838660010154612c2390919063ffffffff16565b8560010181905550613110868660000154612c2390919063ffffffff16565b856000018190555061312d83600a54612c2390919063ffffffff16565b600a8190555061314886600954612c2390919063ffffffff16565b600981905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb338a6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156131f757600080fd5b505af115801561320b573d6000803e3d6000fd5b505050506040513d602081101561322157600080fd5b8101908080519060200190929190505050613287576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180613d246030913960400191505060405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561333057600080fd5b505af1158015613344573d6000803e3d6000fd5b505050506040513d602081101561335a57600080fd5b81019080805190602001909291905050506133c0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526031815260200180613ae36031913960400191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167faf01bfc8475df280aca00b578c4a948e6d95700f0db8c13365240f7f973c875489613402336114b1565b6040518083815260200182815260200180602001828103825260008152602001602001935050505060405180910390a23373ffffffffffffffffffffffffffffffffffffffff167f896e034966eaaf1adc54acc0f257056febbd300c9e47182cf761982cf1f5e430826040518082815260200191505060405180910390a26000600954148061349857506000613496611a5d565b115b6134ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604c815260200180613bf1604c913960600191505060405180910390fd5b809650505050505050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613589576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180613abd6026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806010838154811061365757fe5b906000526020600020906005020190508060000154816001015410613680576000915050613733565b6000809050816003015442106136bf576136ab82600101548360000154612c2390919063ffffffff16565b90508160030154826002018190555061370e565b61370282600401546136f484600001546136e6866002015442612c2390919063ffffffff16565b612c6d90919063ffffffff16565b612d7b90919063ffffffff16565b90504282600201819055505b613725818360010154612cf390919063ffffffff16565b826001018190555080925050505b919050565b60008383111582906137e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156137aa57808201518184015260208101905061378f565b50505050905090810190601f1680156137d75780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b600080831182906138a4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561386957808201518184015260208101905061384e565b50505050905090810190601f1680156138965780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816138b057fe5b049050809150509392505050565b6000806138ef600a546138e1866138d36120b4565b612c6d90919063ffffffff16565b612d7b90919063ffffffff16565b905060075483106139155761390d8186612cf390919063ffffffff16565b9150506139ae565b60006002600a0a9050600061399382613985856139776139666007546139588c61394a6006548c612c2390919063ffffffff16565b612c6d90919063ffffffff16565b612d7b90919063ffffffff16565b600654612cf390919063ffffffff16565b612c6d90919063ffffffff16565b612d7b90919063ffffffff16565b90506139a88188612cf390919063ffffffff16565b93505050505b9392505050565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b604051806040016040528060008152602001600081525090565b815481835581811115613a2b57600202816002028360005260206000209182019101613a2a9190613a30565b5b505050565b613a5c91905b80821115613a5857600080820160009055600182016000905550600201613a36565b5090565b9056fe546f6b656e4765797365723a207472616e7366657220696e746f206c6f636b656420706f6f6c206661696c6564546f6b656e4765797365723a20556e61626c6520746f20756e7374616b6520616d6f756e74207468697320736d616c6c4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373546f6b656e4765797365723a207472616e73666572206f7574206f6620756e6c6f636b656420706f6f6c206661696c6564546f6b656e4765797365723a20756e7374616b6520616d6f756e742069732067726561746572207468616e20746f74616c2075736572207374616b6573546f6b656e4765797365723a2062656e6566696369617279206973207a65726f2061646472657373546f6b656e4765797365723a20756e7374616b6520616d6f756e74206973207a65726f546f6b656e4765797365723a207472616e73666572206f7574206f66206c6f636b656420706f6f6c206661696c6564546f6b656e4765797365723a205374616b6520616d6f756e7420697320746f6f20736d616c6c546f6b656e4765797365723a204572726f7220756e7374616b696e672e205374616b696e67207368617265732065786973742c20627574206e6f207374616b696e6720746f6b656e7320646f546f6b656e4765797365723a207472616e7366657220696e746f207374616b696e6720706f6f6c206661696c6564546f6b656e4765797365723a207374616b6520616d6f756e74206973207a65726f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77546f6b656e4765797365723a20496e76616c69642073746174652e205374616b696e67207368617265732065786973742c20627574206e6f207374616b696e6720746f6b656e7320646f546f6b656e4765797365723a2072656163686564206d6178696d756d20756e6c6f636b207363686564756c6573546f6b656e4765797365723a207472616e73666572206f7574206f66207374616b696e6720706f6f6c206661696c6564a265627a7a72315820f911c42cc82d36f2540fb9a8764a528b9c649c8f42a51fee6e8c4cc9ea7b421a64736f6c63430005110032
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000076ff8e6402b02855ff82119b53e59bbdd67f0ee000000000000000000000000875773784af8135ea0ef43b5a374aad105c5d39e0000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000000000000000002100000000000000000000000000000000000000000000000000000000009e340000000000000000000000000000000000000000000000000000000000000f4240000000000000000000000000a7f11e026a0af768d285360a855f2bded3047530
-----Decoded View---------------
Arg [0] : stakingToken (address): 0x076ff8E6402B02855ff82119B53E59bbDd67f0Ee
Arg [1] : distributionToken (address): 0x875773784Af8135eA0ef43b5a374AaD105c5D39e
Arg [2] : maxUnlockSchedules (uint256): 10000
Arg [3] : startBonus_ (uint256): 33
Arg [4] : bonusPeriodSec_ (uint256): 10368000
Arg [5] : initialSharesPerToken (uint256): 1000000
Arg [6] : unwrappedStakingToken_ (address): 0xA7f11E026a0Af768D285360a855F2BDEd3047530
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 000000000000000000000000076ff8e6402b02855ff82119b53e59bbdd67f0ee
Arg [1] : 000000000000000000000000875773784af8135ea0ef43b5a374aad105c5d39e
Arg [2] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000021
Arg [4] : 00000000000000000000000000000000000000000000000000000000009e3400
Arg [5] : 00000000000000000000000000000000000000000000000000000000000f4240
Arg [6] : 000000000000000000000000a7f11e026a0af768d285360a855f2bded3047530
Deployed Bytecode Sourcemap
34901:22978:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34901:22978:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40764:121;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;40764:121:0;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;40764:121:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;40764:121:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;40764:121:0;;;;;;;;;;;;:::i;:::-;;41157:142;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;41157:142:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;41157:142:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;41157:142:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;41157:142:0;;;;;;;;;;;;:::i;:::-;;35660:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39555:171;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;57425:451;;;:::i;:::-;;35709:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;40274:314;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;40274:314:0;;;;;;;;;;;;;;;;;:::i;:::-;;50868:1281;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49606:210;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;49606:210:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39998:268;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;39998:268:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;52235:100;;;:::i;:::-;;;;;;;;;;;;;;;;;;;57075:207;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;57075:207:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;37155:39;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;37155:39:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13077:87;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;35878:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;11436:140;;;:::i;:::-;;35745:33;;;:::i;:::-;;;;;;;;;;;;;;;;;;;49924:101;;;:::i;:::-;;;;;;;;;;;;;;;;;;;35835:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;43889:105;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;43889:105:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;53168:1123;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;53168:1123:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;10625:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;10991:94;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;39370:102;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;52423:104;;;:::i;:::-;;;;;;;;;;;;;;;;;;;52597:109;;;:::i;:::-;;;;;;;;;;;;;;;;;;;43615:98;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;43615:98:0;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;43615:98:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;43615:98:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;43615:98:0;;;;;;;;;;;;:::i;:::-;;39736:254;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;39736:254:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;43101:245;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;43101:245:0;;;;;;;;;;;;;;;;;:::i;:::-;;11731:109;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11731:109:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;54547:916;;;:::i;:::-;;;;;;;;;;;;;;;;;;;50266:101;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;40764:121;40836:41;40846:10;40858;40870:6;40836:9;:41::i;:::-;40764:121;;;:::o;41157:142::-;10837:9;:7;:9::i;:::-;10829:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41256:35;41266:10;41278:4;41284:6;41256:9;:35::i;:::-;41157:142;;;;:::o;35660:42::-;35701:1;35660:42;:::o;39555:171::-;39608:6;39659:11;;;;;;;;;;;:17;;;:19;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39659:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39659:19:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;39659:19:0;;;;;;;;;;;;;;;;39634:44;;:13;;;;;;;;;;;:19;;;:21;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39634:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39634:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;39634:21:0;;;;;;;;;;;;;;;;:44;;;39627:52;;;;39697:13;;;;;;;;;;;:19;;;:21;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39697:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39697:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;39697:21:0;;;;;;;;;;;;;;;;39690:28;;39555:171;:::o;57425:451::-;10837:9;:7;:9::i;:::-;10829:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57484:24;57519:42;57484:78;;57575:12;;;;;;;;;;;:21;;;57597:16;57615:12;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;57615:22:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57615:22:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;57615:22:0;;;;;;;;;;;;;;;;57575:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;57575:63:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57575:63:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;57575:63:0;;;;;;;;;;;;;;;;;57731:13;;;;;;;;;;;:22;;;57754:16;57772:13;;;;;;;;;;;:21;;;:23;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;57772:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57772:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;57772:23:0;;;;;;;;;;;;;;;;57731:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;57731:65:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57731:65:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;57731:65:0;;;;;;;;;;;;;;;;;57807:11;;;;;;;;;;;:20;;;57828:16;57846:11;;;;;;;;;;;:19;;;:21;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;57846:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57846:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;57846:21:0;;;;;;;;;;;;;;;;57807:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;57807:61:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57807:61:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;57807:61:0;;;;;;;;;;;;;;;;;10894:1;57425:451::o;35709:29::-;;;;:::o;40274:314::-;40330:22;;;;;;;;;;;:35;;;40366:10;40386:4;40393:6;40330:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40330:70:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40330:70:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;40330:70:0;;;;;;;;;;;;;;;;;40411:10;;;;;;;;;;;:15;;;40427:6;40411:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40411:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40411:23:0;;;;40503:44;40521:4;40528:10;40540:6;40503:9;:44::i;:::-;40274:314;:::o;50868:1281::-;50922:7;50931;50940;50949;50958;50967;50989:14;:12;:14::i;:::-;;51046:30;51092:88;51161:18;;51092:50;51114:27;;51092:3;:21;;:50;;;;:::i;:::-;:68;;:88;;;;:::i;:::-;51046:134;;51219:53;51249:22;51219:25;;:29;;:53;;;;:::i;:::-;51191:25;:81;;;;51313:3;51283:27;:33;;;;51357:25;51385:11;:23;51397:10;51385:23;;;;;;;;;;;;;;;51357:51;;51419:34;51469:96;51544:6;:20;;;51469:56;51491:6;:33;;;51469:3;:21;;:56;;;;:::i;:::-;:74;;:96;;;;:::i;:::-;51419:146;;51618:72;51663:26;51618:6;:26;;;:44;;:72;;;;:::i;:::-;51576:6;:26;;:114;;;;51737:3;51701:6;:33;;:39;;;;51753:24;51809:1;51781:25;;:29;51780:142;;51921:1;51780:142;;;51827:78;51879:25;;51827:47;51847:6;:26;;;51827:15;:13;:15::i;:::-;:19;;:47;;;;:::i;:::-;:51;;:78;;;;:::i;:::-;51780:142;51753:169;;51957:13;:11;:13::i;:::-;51985:15;:13;:15::i;:::-;52015:6;:26;;;52056:25;;52096:16;52127:3;51935:206;;;;;;;;;;;;;;;;50868:1281;;;;;;:::o;49606:210::-;49665:7;49713:1;49692:18;;:22;:116;;49807:1;49692:116;;;49730:74;49785:18;;49730:50;49748:11;:17;49760:4;49748:17;;;;;;;;;;;;;;;:31;;;49730:13;:11;:13::i;:::-;:17;;:50;;;;:::i;:::-;:54;;:74;;;;:::i;:::-;49692:116;49685:123;;49606:210;;;:::o;39998:268::-;40139:22;;;;;;;;;;;40118:52;;;40171:10;40191:4;40206:2;40211:6;40219:1;40222;40225;40118:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40118:109:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40118:109:0;;;;40238:20;40251:6;40238:12;:20::i;:::-;39998:268;;;;;:::o;52235:100::-;52279:7;52306:11;;;;;;;;;;;:19;;;:21;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52306:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52306:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;52306:21:0;;;;;;;;;;;;;;;;52299:28;;52235:100;:::o;57075:207::-;57197:4;10837:9;:7;:9::i;:::-;10829:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57223:12;;;;;;;;;;;:24;;;57248:13;57263:2;57267:6;57223:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;57223:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57223:51:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;57223:51:0;;;;;;;;;;;;;;;;57216:58;;57075:207;;;;;:::o;37155:39::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;13077:87::-;13127:4;13151:5;13144:12;;13077:87;:::o;35878:37::-;;;;:::o;11436:140::-;10837:9;:7;:9::i;:::-;10829:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11535:1;11498:40;;11519:6;;;;;;;;;;;11498:40;;;;;;;;;;;;11566:1;11549:6;;:19;;;;;;;;;;;;;;;;;;11436:140::o;35745:33::-;;;;:::o;49924:101::-;49968:7;49995:12;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49995:22:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49995:22:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;49995:22:0;;;;;;;;;;;;;;;;49988:29;;49924:101;:::o;35835:36::-;;;;:::o;43889:105::-;43943:7;43970:16;43979:6;43970:8;:16::i;:::-;43963:23;;43889:105;;;:::o;53168:1123::-;10837:9;:7;:9::i;:::-;10829:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53288:19;;53263:15;:22;;;;:44;53255:115;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53461:18;:16;:18::i;:::-;;;;;;;53492:20;53515:13;:11;:13::i;:::-;53492:36;;53539:26;53584:1;53569:12;:16;53568:131;;53665:34;53676:22;;53665:6;:10;;:34;;;;:::i;:::-;53568:131;;;53602:47;53636:12;53602:29;53624:6;53602:17;;:21;;:29;;;;:::i;:::-;:33;;:47;;;;:::i;:::-;53568:131;53539:160;;53712:30;;:::i;:::-;53784:18;53753:8;:28;;:49;;;;;53847:3;53813:8;:31;;:37;;;;;53881:20;53889:11;53881:3;:7;;:20;;;;:::i;:::-;53861:8;:17;;:40;;;;;53935:11;53912:8;:20;;:34;;;;;53957:15;53978:8;53957:30;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;53957:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54020:41;54042:18;54020:17;;:21;;:41;;;;:::i;:::-;54000:17;:61;;;;54082:11;;;;;;;;;;;:17;;;:19;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54082:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54082:19:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;54082:19:0;;;;;;;;;;;;;;;;:32;;;54115:10;54135:11;;;;;;;;;;;54149:6;54082:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54082:74:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54082:74:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;54082:74:0;;;;;;;;;;;;;;;;54074:145;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54235:48;54248:6;54256:11;54269:13;:11;:13::i;:::-;54235:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10894:1;;;53168:1123;;:::o;10625:79::-;10663:7;10690:6;;;;;;;;;;;10683:13;;10625:79;:::o;10991:94::-;11031:4;11071:6;;;;;;;;;;;11055:22;;:12;:10;:12::i;:::-;:22;;;11048:29;;10991:94;:::o;39370:102::-;39418:6;39444:12;;;;;;;;;;;:18;;;:20;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39444:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39444:20:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;39444:20:0;;;;;;;;;;;;;;;;39437:27;;39370:102;:::o;52423:104::-;52469:7;52496:13;;;;;;;;;;;:21;;;:23;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52496:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52496:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;52496:23:0;;;;;;;;;;;;;;;;52489:30;;52423:104;:::o;52597:109::-;52649:7;52676:15;:22;;;;52669:29;;52597:109;:::o;43615:98::-;43689:16;43698:6;43689:8;:16::i;:::-;;43615:98;;;:::o;39736:254::-;39868:22;;;;;;;;;;;39847:52;;;39900:10;39920:4;39927:6;39935;39943:1;39946;39949;39847:104;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39847:104:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39847:104:0;;;;39962:20;39975:6;39962:12;:20::i;:::-;39736:254;;;;;:::o;43101:245::-;43228:16;43237:6;43228:8;:16::i;:::-;;43298:10;;;;;;;;;;;:20;;;43319:6;43327:10;43298:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43298:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43298:40:0;;;;43101:245;:::o;11731:109::-;10837:9;:7;:9::i;:::-;10829:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11804:28;11823:8;11804:18;:28::i;:::-;11731:109;:::o;54547:916::-;54587:7;54607:22;54632:1;54607:26;;54644:20;54667:13;:11;:13::i;:::-;54644:36;;54718:1;54697:17;;:22;54693:464;;;54753:12;54736:29;;54693:464;;;54798:22;54823:1;54798:26;;54844:9;54856:1;54844:13;;54839:148;54863:15;:22;;;;54859:1;:26;54839:148;;;54928:43;54947:23;54968:1;54947:20;:23::i;:::-;54928:14;:18;;:43;;;;:::i;:::-;54911:60;;54887:3;;;;;;;54839:148;;;;55018:55;55055:17;;55018:32;55037:12;55018:14;:18;;:32;;;;:::i;:::-;:36;;:55;;;;:::i;:::-;55001:72;;55108:37;55130:14;55108:17;;:21;;:37;;;;:::i;:::-;55088:17;:57;;;;54693:464;;55190:1;55173:14;:18;55169:253;;;55216:11;;;;;;;;;;;:20;;;55245:13;;;;;;;;;;;55261:14;55216:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55216:60:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55216:60:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;55216:60:0;;;;;;;;;;;;;;;;55208:137;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55365:45;55380:14;55396:13;:11;:13::i;:::-;55365:45;;;;;;;;;;;;;;;;;;;;;;;;55169:253;55441:14;55434:21;;;;54547:916;:::o;50266:101::-;50306:7;50341:17;:15;:17::i;:::-;50326:33;;50266:101;:::o;41586:1507::-;41694:1;41685:6;:10;41677:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41775:1;41752:25;;:11;:25;;;;41744:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41863:1;41841:18;;:23;:44;;;;41884:1;41868:13;:11;:13::i;:::-;:17;41841:44;41833:148;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41994:27;42046:1;42025:18;;:22;42024:139;;42129:34;42140:22;;42129:6;:10;;:34;;;;:::i;:::-;42024:139;;;42064:49;42099:13;:11;:13::i;:::-;42064:30;42087:6;42064:18;;:22;;:30;;;;:::i;:::-;:34;;:49;;;;:::i;:::-;42024:139;41994:169;;42204:1;42182:19;:23;42174:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42261:18;:16;:18::i;:::-;;;;;;;42323:25;42351:11;:24;42363:11;42351:24;;;;;;;;;;;;;;;42323:52;;42409:45;42434:19;42409:6;:20;;;:24;;:45;;;;:::i;:::-;42386:6;:20;;:68;;;;42501:3;42465:6;:33;;:39;;;;42517:21;;:::i;:::-;42541:31;;;;;;;;42547:19;42541:31;;;;42568:3;42541:31;;;42517:55;;42583:11;:24;42595:11;42583:24;;;;;;;;;;;;;;;42613:8;42583:39;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;42583:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42689:43;42712:19;42689:18;;:22;;:43;;;;:::i;:::-;42668:18;:64;;;;42871:12;;;;;;;;;;;:18;;;:20;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42871:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42871:20:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;42871:20:0;;;;;;;;;;;;;;;;:33;;;42905:6;42921:12;;;;;;;;;;;42936:6;42871:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42871:72:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42871:72:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;42871:72:0;;;;;;;;;;;;;;;;42863:144;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43032:11;43025:60;;;43045:6;43053:27;43068:11;43053:14;:27::i;:::-;43025:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41586:1507;;;;;;:::o;1447:136::-;1505:7;1532:43;1536:1;1539;1532:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;1525:50;;1447:136;;;;:::o;2363:471::-;2421:7;2671:1;2666;:6;2662:47;;;2696:1;2689:8;;;;2662:47;2721:9;2737:1;2733;:5;2721:17;;2766:1;2761;2757;:5;;;;;;:10;2749:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2825:1;2818:8;;;2363:471;;;;;:::o;991:181::-;1049:7;1069:9;1085:1;1081;:5;1069:17;;1110:1;1105;:6;;1097:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1163:1;1156:8;;;991:181;;;;:::o;3302:132::-;3360:7;3387:39;3391:1;3394;3387:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;3380:46;;3302:132;;;;:::o;44299:3367::-;44350:7;44370:18;:16;:18::i;:::-;;;;;;;44437:1;44428:6;:10;44420:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44527:6;44497:26;44512:10;44497:14;:26::i;:::-;:36;;44489:123;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44623:27;44653:49;44688:13;:11;:13::i;:::-;44653:30;44676:6;44653:18;;:22;;:30;;;;:::i;:::-;:34;;:49;;;;:::i;:::-;44623:79;;44743:1;44721:19;:23;44713:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44841:25;44869:11;:23;44881:10;44869:23;;;;;;;;;;;;;;;44841:51;;44903:29;44935:11;:23;44947:10;44935:23;;;;;;;;;;;;;;;44903:55;;45039:33;45075:1;45039:37;;45087:24;45114:19;45087:46;;45144:20;45167:1;45144:24;;45179:1298;45205:1;45186:16;:20;45179:1298;;;45223:23;45249:13;45286:1;45263:13;:20;;;;:24;45249:39;;;;;;;;;;;;;;;;;;45223:65;;45303:20;45326:31;45334:9;:22;;;45326:3;:7;;:31;;;;:::i;:::-;45303:54;;45372:36;45411:1;45372:40;;45458:16;45431:9;:23;;;:43;45427:1039;;45572:41;45600:12;45572:9;:23;;;:27;;:41;;;;:::i;:::-;45541:72;;45647:74;45664:12;45678:28;45708:12;45647:16;:74::i;:::-;45632:89;;45768:59;45798:28;45768:25;:29;;:59;;;;:::i;:::-;45740:87;;45865:45;45886:9;:23;;;45865:16;:20;;:45;;;;:::i;:::-;45846:64;;45929:13;:22;;;;;;;;;;;;:::i;:::-;;45427:1039;;;46073:34;46094:12;46073:16;:20;;:34;;;;:::i;:::-;46042:65;;46141:74;46158:12;46172:28;46202:12;46141:16;:74::i;:::-;46126:89;;46262:59;46292:28;46262:25;:29;;:59;;;;:::i;:::-;46234:87;;46366:45;46394:16;46366:9;:23;;;:27;;:45;;;;:::i;:::-;46340:9;:23;;:71;;;;46449:1;46430:20;;45427:1039;45179:1298;;;;;;46516:57;46547:25;46516:6;:26;;;:30;;:57;;;;:::i;:::-;46487:6;:26;;:86;;;;46607:45;46632:19;46607:6;:20;;;:24;;:45;;;;:::i;:::-;46584:6;:20;;:68;;;;46823:56;46853:25;46823;;:29;;:56;;;;:::i;:::-;46795:25;:84;;;;46911:43;46934:19;46911:18;;:22;;:43;;;;:::i;:::-;46890:18;:64;;;;47091:12;;;;;;;;;;;:21;;;47113:10;47125:6;47091:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47091:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47091:41:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;47091:41:0;;;;;;;;;;;;;;;;47083:115;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47217:13;;;;;;;;;;;:22;;;47240:10;47252:12;47217:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47217:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47217:48:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;47217:48:0;;;;;;;;;;;;;;;;47209:123;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47359:10;47350:60;;;47371:6;47379:26;47394:10;47379:14;:26::i;:::-;47350:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47440:10;47426:39;;;47452:12;47426:39;;;;;;;;;;;;;;;;;;47508:1;47486:18;;:23;:44;;;;47529:1;47513:13;:11;:13::i;:::-;:17;47486:44;47478:150;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47646:12;47639:19;;;;;;;;44299:3367;;;:::o;9358:98::-;9403:15;9438:10;9431:17;;9358:98;:::o;11946:229::-;12040:1;12020:22;;:8;:22;;;;12012:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12130:8;12101:38;;12122:6;;;;;;;;;;;12101:38;;;;;;;;;;;;12159:8;12150:6;;:17;;;;;;;;;;;;;;;;;;11946:229;:::o;55833:920::-;55891:7;55911:31;55945:15;55961:1;55945:18;;;;;;;;;;;;;;;;;;55911:52;;56006:8;:28;;;55979:8;:23;;;:55;55976:95;;56058:1;56051:8;;;;;55976:95;56083:22;56108:1;56083:26;;56206:8;:17;;;56199:3;:24;56195:437;;56258:57;56291:8;:23;;;56258:8;:28;;;:32;;:57;;;;:::i;:::-;56240:76;;56365:8;:17;;;56331:8;:31;;:51;;;;56195:437;;;56432:136;56547:8;:20;;;56432:92;56495:8;:28;;;56432:40;56440:8;:31;;;56432:3;:7;;:40;;;;:::i;:::-;:62;;:92;;;;:::i;:::-;:114;;:136;;;;:::i;:::-;56415:153;;56617:3;56583:8;:31;;:37;;;;56195:437;56670:43;56698:14;56670:8;:23;;;:27;;:43;;;;:::i;:::-;56644:8;:23;;:69;;;;56731:14;56724:21;;;;55833:920;;;;:::o;1920:192::-;2006:7;2039:1;2034;:6;;2042:12;2026:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;2026:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2066:9;2082:1;2078;:5;2066:17;;2103:1;2096:8;;;1920:192;;;;;:::o;3964:345::-;4050:7;4149:1;4145;:5;4152:12;4137:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;4137:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4176:9;4192:1;4188;:5;;;;;;4176:17;;4300:1;4293:8;;;3964:345;;;;;:::o;48642:808::-;48836:7;48858:23;48897:99;48970:25;;48897:54;48931:19;48897:15;:13;:15::i;:::-;:33;;:54;;;;:::i;:::-;:72;;:99;;;;:::i;:::-;48858:138;;49029:14;;49013:12;:30;49009:110;;49067:40;49091:15;49067:19;:23;;:40;;;;:::i;:::-;49060:47;;;;;49009:110;49131:21;35701:1;49155:2;:18;49131:42;;49184:21;49221:165;49372:13;49221:132;49337:15;49221:97;49250:67;49302:14;;49250:47;49284:12;49250:29;49268:10;;49250:13;:17;;:29;;;;:::i;:::-;:33;;:47;;;;:::i;:::-;:51;;:67;;;;:::i;:::-;49221:10;;:28;;:97;;;;:::i;:::-;:115;;:132;;;;:::i;:::-;:150;;:165;;;;:::i;:::-;49184:202;;49404:38;49428:13;49404:19;:23;;:38;;;;:::i;:::-;49397:45;;;;;48642:808;;;;;;:::o;34901:22978::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
bzzr://f1b25bb6b9d93544871f0853db232045ddb82a09e894faf504b5c0cdb41c4347
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 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.