Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 38 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Create Token Rew... | 19136219 | 277 days ago | IN | 0 ETH | 0.04084171 | ||||
Create Token Rew... | 19086409 | 284 days ago | IN | 0 ETH | 0.03254409 | ||||
Create Token Rew... | 19064452 | 287 days ago | IN | 0 ETH | 0.0581248 | ||||
Create Token Rew... | 19014711 | 294 days ago | IN | 0 ETH | 0.04257198 | ||||
Create Token Rew... | 18978442 | 299 days ago | IN | 0 ETH | 0.06525124 | ||||
Create Token Rew... | 18965069 | 301 days ago | IN | 0 ETH | 0.03840989 | ||||
Create Token Rew... | 18964301 | 301 days ago | IN | 0 ETH | 0.06141198 | ||||
Create Token Rew... | 18963061 | 301 days ago | IN | 0 ETH | 0.03130613 | ||||
Create Token Rew... | 18928669 | 306 days ago | IN | 0 ETH | 0.05324669 | ||||
Create Token Rew... | 18885015 | 312 days ago | IN | 0 ETH | 0.06919118 | ||||
Create Token Rew... | 18837175 | 319 days ago | IN | 0 ETH | 0.05087594 | ||||
Create Token Rew... | 18821614 | 321 days ago | IN | 0 ETH | 0.0773757 | ||||
Create Token Rew... | 18814354 | 322 days ago | IN | 0 ETH | 0.09670289 | ||||
Create Token Rew... | 18785938 | 326 days ago | IN | 0 ETH | 0.0771991 | ||||
Create ETH Rewar... | 18778828 | 327 days ago | IN | 0 ETH | 0.0697567 | ||||
Create Token Rew... | 18771590 | 328 days ago | IN | 0 ETH | 0.0773817 | ||||
Create Token Rew... | 18763298 | 329 days ago | IN | 0 ETH | 0.06615814 | ||||
Create Token Rew... | 18763267 | 329 days ago | IN | 0 ETH | 0.06618919 | ||||
Create Token Rew... | 18750494 | 331 days ago | IN | 0 ETH | 0.04827246 | ||||
Create Token Rew... | 18742525 | 332 days ago | IN | 0 ETH | 0.0773823 | ||||
Create Token Rew... | 18736475 | 333 days ago | IN | 0 ETH | 0.0773749 | ||||
Create Token Rew... | 18721550 | 335 days ago | IN | 0 ETH | 0.13608428 | ||||
Create Token Rew... | 18714429 | 336 days ago | IN | 0 ETH | 0.08151742 | ||||
Create Token Rew... | 18702097 | 338 days ago | IN | 0 ETH | 0.05318442 | ||||
Create Token Rew... | 18693424 | 339 days ago | IN | 0 ETH | 0.0773737 |
Latest 25 internal transactions (View All)
Advanced mode:
Loading...
Loading
Contract Name:
ViralXRewardPoolFactory
Compiler Version
v0.8.20+commit.a1b79de6
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
pragma solidity 0.8.20; // SPDX-License-Identifier: MIT abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } interface IERC20Metadata is IERC20{ /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the default value returned by this function, unless * it's overridden. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, 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}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `from` to `to`. * * This 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: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer(address from, address to, uint256 amount) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by // decrementing then incrementing. _balances[to] += amount; } emit Transfer(from, to, 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: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _totalSupply += amount; unchecked { // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above. _balances[account] += amount; } emit Transfer(address(0), account, amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance(address owner, address spender, uint256 amount) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } } contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); constructor () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } function owner() public view returns (address) { return _owner; } modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } function renounceOwnership() external virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } library Address { function isContract(address account) internal view returns (bool) { return account.code.length > 0; } function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } library SafeERC20 { 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 _callOptionalReturn(IERC20 token, bytes memory data) private { bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } 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' 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)); } } interface ILpPair { function sync() external; } interface IDexRouter { function factory() external pure returns (address); function WETH() external pure returns (address); function swapExactTokensForETHSupportingFeeOnTransferTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); } interface IDexFactory { function createPair(address tokenA, address tokenB) external returns (address pair); } library SafeMath { function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, 'SafeMath: addition overflow'); return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, 'SafeMath: subtraction overflow'); } function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } 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; } function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, 'SafeMath: division by zero'); } function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, 'SafeMath: modulo by zero'); } function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } function min(uint256 x, uint256 y) internal pure returns (uint256 z) { z = x < y ? x : y; } function sqrt(uint256 y) internal pure returns (uint256 z) { if (y > 3) { z = y; uint256 x = y / 2 + 1; while (x < z) { z = x; x = (y / x + x) / 2; } } else if (y != 0) { z = 1; } } } library SafeMathInt { int256 private constant MIN_INT256 = int256(1) << 255; int256 private constant MAX_INT256 = ~(int256(1) << 255); /** * @dev Multiplies two int256 variables and fails on overflow. */ function mul(int256 a, int256 b) internal pure returns (int256) { int256 c = a * b; // Detect overflow when multiplying MIN_INT256 with -1 require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256)); require((b == 0) || (c / b == a)); return c; } /** * @dev Division of two int256 variables and fails on overflow. */ function div(int256 a, int256 b) internal pure returns (int256) { // Prevent overflow when dividing MIN_INT256 by -1 require(b != -1 || a != MIN_INT256); // Solidity already throws when dividing by 0. return a / b; } /** * @dev Subtracts two int256 variables and fails on overflow. */ function sub(int256 a, int256 b) internal pure returns (int256) { int256 c = a - b; require((b >= 0 && c <= a) || (b < 0 && c > a)); return c; } /** * @dev Adds two int256 variables and fails on overflow. */ function add(int256 a, int256 b) internal pure returns (int256) { int256 c = a + b; require((b >= 0 && c >= a) || (b < 0 && c < a)); return c; } /** * @dev Converts to absolute value, and fails on overflow. */ function abs(int256 a) internal pure returns (int256) { require(a != MIN_INT256); return a < 0 ? -a : a; } function toUint256Safe(int256 a) internal pure returns (uint256) { require(a >= 0); return uint256(a); } } library SafeMathUint { function toInt256Safe(uint256 a) internal pure returns (int256) { int256 b = int256(a); require(b >= 0); return b; } } contract RewardPoolETH is Ownable { using SafeMath for uint256; using SafeMathUint for uint256; using SafeMathInt for int256; event Claim(address indexed account, uint256 amount, bool indexed automatic); event DividendsDistributed( address indexed from, uint256 weiAmount ); event DividendWithdrawn( address indexed to, uint256 weiAmount ); mapping (address => bool) public authorized; uint256 public fee; address public feeReceiver; PoolInfo public poolInfo; string public poolName; struct PoolInfo { uint64 poolStartTime; uint48 poolDuration; uint64 payoutFrequency; uint64 lastPayout; uint8 totalPayouts; } uint256 constant internal magnitude = 2**128; uint256 internal magnifiedDividendPerShare; mapping(address => int256) internal magnifiedDividendCorrections; mapping(address => uint256) internal withdrawnDividends; mapping (address => uint256) public holderPoints; uint256 public totalPoints; uint256 public totalDividendsDistributed; uint256 public totalForDistribution; constructor(address _feeReceiver, uint256 _fee, string memory _poolName, uint64 _poolStartTime, uint48 _poolDuration, uint64 _payoutFrequency, address _pointSetter){ PoolInfo memory poolInfoMem; fee = _fee; feeReceiver = _feeReceiver; require(_poolDuration % _payoutFrequency == 0, "Duration must be evenly divisible by payout frequency"); poolName = _poolName; poolInfoMem.poolDuration = _poolDuration; poolInfoMem.poolStartTime = _poolStartTime; poolInfoMem.payoutFrequency = _payoutFrequency; poolInfoMem.lastPayout = _poolStartTime; poolInfoMem.totalPayouts = uint8(_poolDuration / _payoutFrequency); poolInfo = poolInfoMem; authorized[_pointSetter] = true; } modifier onlyAuthorized(){ require(authorized[msg.sender] || msg.sender == owner(), "Not Authorized"); _; } function setAuthorized(address _wallet, bool _authorized) external onlyOwner { authorized[_wallet] = _authorized; } receive() external payable { uint256 amountForFee; if(fee > 0){ amountForFee = msg.value * fee / 100; (bool success,) = feeReceiver.call{value: amountForFee}(""); require(success, "Distribution failed"); } totalForDistribution += msg.value - amountForFee; } function distributeDividends() external onlyAuthorized { PoolInfo memory poolInfoMem = poolInfo; require(totalPoints > 0, "No shares to distribute to"); require(block.timestamp >= poolInfoMem.payoutFrequency + poolInfoMem.lastPayout, "Too early for distribution"); uint256 payouts = (block.timestamp - poolInfoMem.lastPayout) / poolInfoMem.payoutFrequency; uint256 amountToAdd = totalForDistribution * payouts / poolInfoMem.totalPayouts; poolInfoMem.lastPayout += uint64(payouts * poolInfoMem.payoutFrequency); poolInfo = poolInfoMem; if(amountToAdd + totalDividendsDistributed > totalForDistribution){ amountToAdd = totalForDistribution - totalDividendsDistributed; } if(amountToAdd > 0){ magnifiedDividendPerShare = magnifiedDividendPerShare.add( (amountToAdd).mul(magnitude) / totalPoints ); emit DividendsDistributed(msg.sender, amountToAdd); totalDividendsDistributed = totalDividendsDistributed.add(amountToAdd); } } function withdrawDividend() external { _withdrawDividendOfUser(payable(msg.sender)); } function _withdrawDividendOfUser(address payable user) internal returns (uint256) { uint256 _withdrawableDividend = withdrawableDividendOf(user); if (_withdrawableDividend > 0) { withdrawnDividends[user] = withdrawnDividends[user].add(_withdrawableDividend); emit DividendWithdrawn(user, _withdrawableDividend); (bool success,) = user.call{value: _withdrawableDividend}(""); if(!success) { withdrawnDividends[user] = withdrawnDividends[user].sub(_withdrawableDividend); return 0; } return _withdrawableDividend; } return 0; } function dividendOf(address _owner) external view returns(uint256) { return withdrawableDividendOf(_owner); } function withdrawableDividendOf(address _owner) public view returns(uint256) { return accumulativeDividendOf(_owner).sub(withdrawnDividends[_owner]); } function withdrawnDividendOf(address _owner) external view returns(uint256) { return withdrawnDividends[_owner]; } function accumulativeDividendOf(address _owner) public view returns(uint256) { return magnifiedDividendPerShare.mul(holderPoints[_owner]).toInt256Safe() .add(magnifiedDividendCorrections[_owner]).toUint256Safe() / magnitude; } function _increase(address account, uint256 value) internal { magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account] .sub( (magnifiedDividendPerShare.mul(value)).toInt256Safe() ); } function _reduce(address account, uint256 value) internal { magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account] .add( (magnifiedDividendPerShare.mul(value)).toInt256Safe() ); } function _setBalance(address account, uint256 newBalance) internal { uint256 currentBalance = holderPoints[account]; holderPoints[account] = newBalance; if(newBalance > currentBalance) { uint256 increaseAmount = newBalance.sub(currentBalance); _increase(account, increaseAmount); totalPoints += increaseAmount; } else if(newBalance < currentBalance) { uint256 reduceAmount = currentBalance.sub(newBalance); _reduce(account, reduceAmount); totalPoints -= reduceAmount; } } function getAccount(address _account) public view returns ( address account, uint256 withdrawableDividends, uint256 totalDividends, uint256 balance) { account = _account; withdrawableDividends = withdrawableDividendOf(account); totalDividends = accumulativeDividendOf(account); balance = holderPoints[account]; } function setBalance(address payable account, uint256 newBalance) external onlyAuthorized { _setBalance(account, newBalance); processAccount(account, true); } function setBalances(address payable[] memory accounts, uint256[] memory newBalances) external onlyAuthorized { address payable account; uint256 newBalance; for(uint8 i = 0; i < accounts.length; i++){ account = accounts[i]; newBalance = newBalances[i]; _setBalance(account, newBalance); processAccount(account, true); } } function processAccount(address payable account, bool automatic) internal returns (bool) { uint256 amount = _withdrawDividendOfUser(account); if(amount > 0) { emit Claim(account, amount, automatic); return true; } return false; } function getTotalDividendsDistributed() external view returns (uint256) { return totalDividendsDistributed; } function dividendTokenBalanceOf(address account) public view returns (uint256) { return holderPoints[account]; } function getNumberOfDividends() external view returns(uint256) { return totalPoints; } function claim() external { processAccount(payable(msg.sender), false); } } contract RewardPoolTokens is Ownable { using SafeMath for uint256; using SafeMathUint for uint256; using SafeMathInt for int256; event Claim(address indexed account, uint256 amount, bool indexed automatic); event DividendsDistributed( address indexed from, uint256 weiAmount ); event DividendWithdrawn( address indexed to, uint256 weiAmount ); mapping (address => bool) public authorized; uint256 public fee; address public feeReceiver; PoolInfo public poolInfo; string public poolName; address public rewardToken; struct PoolInfo { uint64 poolStartTime; uint48 poolDuration; uint64 payoutFrequency; uint64 lastPayout; uint8 totalPayouts; } uint256 constant internal magnitude = 2**128; uint256 internal magnifiedDividendPerShare; mapping(address => int256) internal magnifiedDividendCorrections; mapping(address => uint256) internal withdrawnDividends; mapping (address => uint256) public holderPoints; uint256 public totalPoints; uint256 public totalDividendsDistributed; uint256 public totalForDistribution; constructor(address _feeReceiver, uint256 _fee, string memory _poolName, uint64 _poolStartTime, uint48 _poolDuration, uint64 _payoutFrequency, address _pointSetter, address _rewardToken){ PoolInfo memory poolInfoMem; fee = _fee; feeReceiver = _feeReceiver; require(_poolDuration % _payoutFrequency == 0, "Duration must be evenly divisible by payout frequency"); poolName = _poolName; poolInfoMem.poolDuration = _poolDuration; poolInfoMem.poolStartTime = _poolStartTime; poolInfoMem.payoutFrequency = _payoutFrequency; poolInfoMem.lastPayout = _poolStartTime; poolInfoMem.totalPayouts = uint8(_poolDuration / _payoutFrequency); poolInfo = poolInfoMem; authorized[_pointSetter] = true; require(_rewardToken != address(0), "Reward Token Address not Set"); rewardToken = _rewardToken; } modifier onlyAuthorized(){ require(authorized[msg.sender] || msg.sender == owner(), "Not Authorized"); _; } function setAuthorized(address _wallet, bool _authorized) external onlyOwner { authorized[_wallet] = _authorized; } function addTokensForDistribution() public onlyAuthorized { uint256 amountForFee; uint256 tokenBalance = IERC20(rewardToken).balanceOf(address(this)); require(tokenBalance > 0, "No tokens to distribute"); if(fee > 0 && tokenBalance > totalForDistribution){ amountForFee = (tokenBalance - totalForDistribution) * fee / 100; if(tokenBalance - amountForFee > totalForDistribution){ totalForDistribution += tokenBalance - amountForFee - totalForDistribution; SafeERC20.safeTransfer(IERC20(rewardToken), feeReceiver, amountForFee); } } } function distributeDividends() external onlyAuthorized { PoolInfo memory poolInfoMem = poolInfo; require(totalPoints > 0, "No shares to distribute to"); require(block.timestamp >= poolInfoMem.payoutFrequency + poolInfoMem.lastPayout, "Too early for distribution"); uint256 payouts = (block.timestamp - poolInfoMem.lastPayout) / poolInfoMem.payoutFrequency; uint256 amountToAdd = totalForDistribution * payouts / poolInfoMem.totalPayouts; poolInfoMem.lastPayout += uint64(payouts * poolInfoMem.payoutFrequency); poolInfo = poolInfoMem; if(amountToAdd + totalDividendsDistributed > totalForDistribution){ amountToAdd = totalForDistribution - totalDividendsDistributed; } if(amountToAdd > 0){ magnifiedDividendPerShare = magnifiedDividendPerShare.add( (amountToAdd).mul(magnitude) / totalPoints ); emit DividendsDistributed(msg.sender, amountToAdd); totalDividendsDistributed = totalDividendsDistributed.add(amountToAdd); } } function withdrawDividend() external { _withdrawDividendOfUser(payable(msg.sender)); } function _withdrawDividendOfUser(address payable user) internal returns (uint256) { uint256 _withdrawableDividend = withdrawableDividendOf(user); if (_withdrawableDividend > 0) { withdrawnDividends[user] = withdrawnDividends[user].add(_withdrawableDividend); emit DividendWithdrawn(user, _withdrawableDividend); SafeERC20.safeTransfer(IERC20(rewardToken), user, _withdrawableDividend); } return 0; } function dividendOf(address _owner) external view returns(uint256) { return withdrawableDividendOf(_owner); } function withdrawableDividendOf(address _owner) public view returns(uint256) { return accumulativeDividendOf(_owner).sub(withdrawnDividends[_owner]); } function withdrawnDividendOf(address _owner) external view returns(uint256) { return withdrawnDividends[_owner]; } function accumulativeDividendOf(address _owner) public view returns(uint256) { return magnifiedDividendPerShare.mul(holderPoints[_owner]).toInt256Safe() .add(magnifiedDividendCorrections[_owner]).toUint256Safe() / magnitude; } function _increase(address account, uint256 value) internal { magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account] .sub( (magnifiedDividendPerShare.mul(value)).toInt256Safe() ); } function _reduce(address account, uint256 value) internal { magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account] .add( (magnifiedDividendPerShare.mul(value)).toInt256Safe() ); } function _setBalance(address account, uint256 newBalance) internal { uint256 currentBalance = holderPoints[account]; holderPoints[account] = newBalance; if(newBalance > currentBalance) { uint256 increaseAmount = newBalance.sub(currentBalance); _increase(account, increaseAmount); totalPoints += increaseAmount; } else if(newBalance < currentBalance) { uint256 reduceAmount = currentBalance.sub(newBalance); _reduce(account, reduceAmount); totalPoints -= reduceAmount; } } function getAccount(address _account) public view returns ( address account, uint256 withdrawableDividends, uint256 totalDividends, uint256 balance) { account = _account; withdrawableDividends = withdrawableDividendOf(account); totalDividends = accumulativeDividendOf(account); balance = holderPoints[account]; } function setBalance(address payable account, uint256 newBalance) external onlyAuthorized { if(totalForDistribution == 0){ addTokensForDistribution(); } _setBalance(account, newBalance); processAccount(account, true); } function setBalances(address payable[] memory accounts, uint256[] memory newBalances) external onlyAuthorized { if(totalForDistribution == 0){ addTokensForDistribution(); } address payable account; uint256 newBalance; for(uint8 i = 0; i < accounts.length; i++){ account = accounts[i]; newBalance = newBalances[i]; _setBalance(account, newBalance); processAccount(account, true); } } function processAccount(address payable account, bool automatic) internal returns (bool) { uint256 amount = _withdrawDividendOfUser(account); if(amount > 0) { emit Claim(account, amount, automatic); return true; } return false; } function getTotalDividendsDistributed() external view returns (uint256) { return totalDividendsDistributed; } function dividendTokenBalanceOf(address account) public view returns (uint256) { return holderPoints[account]; } function getNumberOfDividends() external view returns(uint256) { return totalPoints; } function claim() external { processAccount(payable(msg.sender), false); } } contract ViralXRewardPoolFactory is Ownable { address public feeReceiverETH; address public feeReceiverTokens; uint256 public fee; address public pointSetter; address[] public rewardPools; event ETHRewardPoolCreated(address rewardPool); event TokensRewardPoolCreated(address rewardPool); constructor(address _feeReceiverETH, address _feeReceiverTokens, uint256 _fee, address _pointSetter){ feeReceiverETH = _feeReceiverETH; feeReceiverTokens = _feeReceiverTokens; fee = _fee; pointSetter = _pointSetter; } function createETHRewardPool(string memory _poolName, uint64 _poolStartTime, uint48 _poolDuration, uint64 _payoutFrequency) external onlyOwner { RewardPoolETH newPool = new RewardPoolETH(feeReceiverETH, fee, _poolName, _poolStartTime, _poolDuration, _payoutFrequency, pointSetter); rewardPools.push(address(newPool)); newPool.transferOwnership(msg.sender); emit ETHRewardPoolCreated(address(newPool)); } function createTokenRewardPool(string memory _poolName, uint64 _poolStartTime, uint48 _poolDuration, uint64 _payoutFrequency, address _rewardToken) external onlyOwner { RewardPoolTokens newPool = new RewardPoolTokens(feeReceiverTokens, fee, _poolName, _poolStartTime, _poolDuration, _payoutFrequency, pointSetter, _rewardToken); rewardPools.push(address(newPool)); newPool.transferOwnership(msg.sender); emit TokensRewardPoolCreated(address(newPool)); } function updateFeeReceiverETH(address _newAddress) external onlyOwner { require(_newAddress != address(0), "Zero Address"); feeReceiverETH = _newAddress; } function updateFeeReceiverTokens(address _newAddress) external onlyOwner { require(_newAddress != address(0), "Zero Address"); feeReceiverTokens = _newAddress; } function updatePointSetter(address _newAddress) external onlyOwner { require(_newAddress != address(0), "Zero Address"); pointSetter = _newAddress; } function updateFee(uint256 _newFee) external onlyOwner { require(_newFee <= 20, "Fee must be 0-20%"); fee = _newFee; } }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_feeReceiverETH","type":"address"},{"internalType":"address","name":"_feeReceiverTokens","type":"address"},{"internalType":"uint256","name":"_fee","type":"uint256"},{"internalType":"address","name":"_pointSetter","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"rewardPool","type":"address"}],"name":"ETHRewardPoolCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"rewardPool","type":"address"}],"name":"TokensRewardPoolCreated","type":"event"},{"inputs":[{"internalType":"string","name":"_poolName","type":"string"},{"internalType":"uint64","name":"_poolStartTime","type":"uint64"},{"internalType":"uint48","name":"_poolDuration","type":"uint48"},{"internalType":"uint64","name":"_payoutFrequency","type":"uint64"}],"name":"createETHRewardPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_poolName","type":"string"},{"internalType":"uint64","name":"_poolStartTime","type":"uint64"},{"internalType":"uint48","name":"_poolDuration","type":"uint48"},{"internalType":"uint64","name":"_payoutFrequency","type":"uint64"},{"internalType":"address","name":"_rewardToken","type":"address"}],"name":"createTokenRewardPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeReceiverETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeReceiverTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pointSetter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardPools","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newFee","type":"uint256"}],"name":"updateFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newAddress","type":"address"}],"name":"updateFeeReceiverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newAddress","type":"address"}],"name":"updateFeeReceiverTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newAddress","type":"address"}],"name":"updatePointSetter","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561000f575f80fd5b5060405161498538038061498583398101604081905261002e916100d1565b5f80546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600180546001600160a01b039586166001600160a01b03199182161790915560028054948616948216949094179093556003919091556004805491909316911617905561011b565b80516001600160a01b03811681146100cc575f80fd5b919050565b5f805f80608085870312156100e4575f80fd5b6100ed856100b6565b93506100fb602086016100b6565b925060408501519150610110606086016100b6565b905092959194509250565b61485d806101285f395ff3fe608060405234801562000010575f80fd5b5060043610620000f8575f3560e01c8063cba778e41162000093578063e627ba72116200006b578063e627ba7214620001ea578063ea17a03c1462000201578063f2fde38b1462000215578063f3c5e653146200022c575f80fd5b8063cba778e414620001a6578063d9dea1c314620001bd578063ddca3f4314620001d1575f80fd5b80636035d45511620000d35780636035d455146200015d578063715018a614620001745780638da5cb5b146200017e5780639012c4a8146200018f575f80fd5b806319e19a3a14620000fc5780632475d786146200011557806346abf3911462000146575b5f80fd5b620001136200010d36600462000995565b62000243565b005b60045462000129906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b620001296200015736600462000a1c565b620003ba565b620001136200016e36600462000a34565b620003e3565b620001136200054d565b5f546001600160a01b031662000129565b62000113620001a036600462000a1c565b620005c1565b62000113620001b736600462000aa9565b62000639565b60025462000129906001600160a01b031681565b620001db60035481565b6040519081526020016200013d565b62000113620001fb36600462000aa9565b620006b0565b60015462000129906001600160a01b031681565b620001136200022636600462000aa9565b62000727565b620001136200023d36600462000aa9565b62000813565b5f546001600160a01b03163314620002785760405162461bcd60e51b81526004016200026f9062000acc565b60405180910390fd5b6002546003546004546040515f936001600160a01b0390811693928a928a928a928a929116908990620002ab906200088a565b620002be98979695949392919062000b46565b604051809103905ff080158015620002d8573d5f803e3d5ffd5b50600580546001810182555f919091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b0319166001600160a01b03831690811790915560405163f2fde38b60e01b81523360048201529192509063f2fde38b906024015f604051808303815f87803b1580156200035e575f80fd5b505af115801562000371573d5f803e3d5ffd5b50506040516001600160a01b03841681527fc7caa24d4386c19f106a6b99fa99ba51c2451911ee733cd4f5079f75839bb0d69250602001905060405180910390a1505050505050565b60058181548110620003ca575f80fd5b5f918252602090912001546001600160a01b0316905081565b5f546001600160a01b031633146200040f5760405162461bcd60e51b81526004016200026f9062000acc565b6001546003546004546040515f936001600160a01b0390811693928992899289928992911690620004409062000898565b62000452979695949392919062000bb8565b604051809103905ff0801580156200046c573d5f803e3d5ffd5b50600580546001810182555f919091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b0319166001600160a01b03831690811790915560405163f2fde38b60e01b81523360048201529192509063f2fde38b906024015f604051808303815f87803b158015620004f2575f80fd5b505af115801562000505573d5f803e3d5ffd5b50506040516001600160a01b03841681527f295cdfadcaf678740de7ce28f94d78de09a8b971a17a203d9501d8d6837fbaaa9250602001905060405180910390a15050505050565b5f546001600160a01b03163314620005795760405162461bcd60e51b81526004016200026f9062000acc565b5f80546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a35f80546001600160a01b0319169055565b5f546001600160a01b03163314620005ed5760405162461bcd60e51b81526004016200026f9062000acc565b6014811115620006345760405162461bcd60e51b8152602060048201526011602482015270466565206d75737420626520302d32302560781b60448201526064016200026f565b600355565b5f546001600160a01b03163314620006655760405162461bcd60e51b81526004016200026f9062000acc565b6001600160a01b0381166200068e5760405162461bcd60e51b81526004016200026f9062000c1b565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b5f546001600160a01b03163314620006dc5760405162461bcd60e51b81526004016200026f9062000acc565b6001600160a01b038116620007055760405162461bcd60e51b81526004016200026f9062000c1b565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b5f546001600160a01b03163314620007535760405162461bcd60e51b81526004016200026f9062000acc565b6001600160a01b038116620007ba5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016200026f565b5f80546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35f80546001600160a01b0319166001600160a01b0392909216919091179055565b5f546001600160a01b031633146200083f5760405162461bcd60e51b81526004016200026f9062000acc565b6001600160a01b038116620008685760405162461bcd60e51b81526004016200026f9062000c1b565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b611f788062000c4283390190565b611c6e8062002bba83390190565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620008ca575f80fd5b813567ffffffffffffffff80821115620008e857620008e8620008a6565b604051601f8301601f19908116603f01168101908282118183101715620009135762000913620008a6565b816040528381528660208588010111156200092c575f80fd5b836020870160208301375f602085830101528094505050505092915050565b803567ffffffffffffffff8116811462000963575f80fd5b919050565b803565ffffffffffff8116811462000963575f80fd5b80356001600160a01b038116811462000963575f80fd5b5f805f805f60a08688031215620009aa575f80fd5b853567ffffffffffffffff811115620009c1575f80fd5b620009cf88828901620008ba565b955050620009e0602087016200094b565b9350620009f06040870162000968565b925062000a00606087016200094b565b915062000a10608087016200097e565b90509295509295909350565b5f6020828403121562000a2d575f80fd5b5035919050565b5f805f806080858703121562000a48575f80fd5b843567ffffffffffffffff81111562000a5f575f80fd5b62000a6d87828801620008ba565b94505062000a7e602086016200094b565b925062000a8e6040860162000968565b915062000a9e606086016200094b565b905092959194509250565b5f6020828403121562000aba575f80fd5b62000ac5826200097e565b9392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b5f81518084525f5b8181101562000b275760208185018101518683018201520162000b09565b505f602082860101526020601f19601f83011685010191505092915050565b6001600160a01b03898116825260208201899052610100604083018190525f9162000b748483018b62000b01565b67ffffffffffffffff998a16606086015265ffffffffffff9890981660808501529590971660a08301525091831660c083015290911660e090910152949350505050565b5f60018060a01b03808a16835288602084015260e0604084015262000be160e084018962000b01565b67ffffffffffffffff978816606085015265ffffffffffff9690961660808401529390951660a0820152911660c090910152949350505050565b6020808252600c908201526b5a65726f204164647265737360a01b60408201526060019056fe608060405234801562000010575f80fd5b5060405162001f7838038062001f7883398101604081905262000033916200033d565b5f80546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506040805160a0810182525f808252602082018190529181018290526060810182905260808101919091526002889055600380546001600160a01b0319166001600160a01b038b16179055620000d18465ffffffffffff871662000497565b6001600160401b031615620001535760405162461bcd60e51b815260206004820152603560248201527f4475726174696f6e206d757374206265206576656e6c7920646976697369626c60448201527f65206279207061796f7574206672657175656e6379000000000000000000000060648201526084015b60405180910390fd5b60056200016188826200054b565b5065ffffffffffff8516602082018190526001600160401b03808816808452908616604084015260608301526200019a90859062000613565b60ff16608082018190528151600480546020808601516040808801516060890151600160f01b90980260ff60f01b196001600160401b03998a16600160b01b02600160b01b600160f01b0319938b16600160701b0293909316600160701b600160f01b031965ffffffffffff90961668010000000000000000026001600160701b03199098169a9099169990991795909517929092169590951717949094161790556001600160a01b038086165f90815260019384905291909120805460ff19169092179091558216620002b15760405162461bcd60e51b815260206004820152601c60248201527f52657761726420546f6b656e2041646472657373206e6f74205365740000000060448201526064016200014a565b50600680546001600160a01b0319166001600160a01b0392909216919091179055506200063b95505050505050565b80516001600160a01b0381168114620002f7575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b80516001600160401b0381168114620002f7575f80fd5b805165ffffffffffff81168114620002f7575f80fd5b5f805f805f805f80610100898b03121562000356575f80fd5b6200036189620002e0565b60208a81015160408c0151929a509850906001600160401b038082111562000387575f80fd5b818c0191508c601f8301126200039b575f80fd5b815181811115620003b057620003b0620002fc565b604051601f8201601f19908116603f01168101908382118183101715620003db57620003db620002fc565b816040528281528f86848701011115620003f3575f80fd5b5f93505b82841015620004165784840186015181850187015292850192620003f7565b5f868483010152809b505050505050506200043460608a0162000310565b94506200044460808a0162000327565b93506200045460a08a0162000310565b92506200046460c08a01620002e0565b91506200047460e08a01620002e0565b90509295985092959890939650565b634e487b7160e01b5f52601260045260245ffd5b5f6001600160401b0383811680620004b357620004b362000483565b92169190910692915050565b600181811c90821680620004d457607f821691505b602082108103620004f357634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000546575f81815260208120601f850160051c81016020861015620005215750805b601f850160051c820191505b8181101562000542578281556001016200052d565b5050505b505050565b81516001600160401b03811115620005675762000567620002fc565b6200057f81620005788454620004bf565b84620004f9565b602080601f831160018114620005b5575f84156200059d5750858301515b5f19600386901b1c1916600185901b17855562000542565b5f85815260208120601f198616915b82811015620005e557888601518255948401946001909101908401620005c4565b50858210156200060357878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f6001600160401b03838116806200062f576200062f62000483565b92169190910492915050565b61192f80620006495f395ff3fe608060405234801561000f575f80fd5b50600436106101bb575f3560e01c806391b89fba116100f3578063dd85d22911610093578063f2fde38b1161006e578063f2fde38b14610406578063f3466dfa14610419578063f7c618c11461042e578063fbcbc0f114610441575f80fd5b8063dd85d229146103e2578063ddca3f43146103ea578063e30443bc146103f3575f80fd5b8063b3f00674116100ce578063b3f0067414610381578063b7e39b4f14610394578063b9181611146103a7578063dd6dd852146103d9575f80fd5b806391b89fba14610333578063a8b9d24014610346578063aafd847a14610359575f80fd5b80636843cd841161015e578063715018a611610139578063715018a6146102f657806371778e7d146102fe57806385a6b3ae146103065780638da5cb5b1461030f575f80fd5b80636843cd84146102b35780636a474002146102db578063711bf9b2146102e3575f80fd5b80634e71d92d116101995780634e71d92d146101f7578063567142be146101ff5780635a2f3d091461020857806365d14c4714610294575f80fd5b806303c83302146101bf57806327ce0147146101c957806330bb4cff146101ef575b5f80fd5b6101c761047e565b005b6101dc6101d736600461149e565b6107be565b6040519081526020015b60405180910390f35b600c546101dc565b6101c7610820565b6101dc600b5481565b60045461024e9067ffffffffffffffff80821691600160401b810465ffffffffffff1691600160701b8204811691600160b01b810490911690600160f01b900460ff1685565b6040805167ffffffffffffffff968716815265ffffffffffff90951660208601529285169284019290925292909216606082015260ff909116608082015260a0016101e6565b6101dc6102a236600461149e565b600a6020525f908152604090205481565b6101dc6102c136600461149e565b6001600160a01b03165f908152600a602052604090205490565b6101c761082d565b6101c76102f13660046114c6565b610836565b6101c7610889565b600b546101dc565b6101dc600c5481565b5f546001600160a01b03165b6040516001600160a01b0390911681526020016101e6565b6101dc61034136600461149e565b6108fa565b6101dc61035436600461149e565b610900565b6101dc61036736600461149e565b6001600160a01b03165f9081526009602052604090205490565b60035461031b906001600160a01b031681565b6101c76103a23660046115cd565b61092b565b6103c96103b536600461149e565b60016020525f908152604090205460ff1681565b60405190151581526020016101e6565b6101dc600d5481565b6101c76109fb565b6101dc60025481565b6101c7610401366004611689565b610b9d565b6101c761041436600461149e565b610c05565b610421610cec565b6040516101e691906116d5565b60065461031b906001600160a01b031681565b61045461044f36600461149e565b610d78565b604080516001600160a01b03909516855260208501939093529183015260608201526080016101e6565b335f9081526001602052604090205460ff16806104a457505f546001600160a01b031633145b6104c95760405162461bcd60e51b81526004016104c090611707565b60405180910390fd5b6040805160a08101825260045467ffffffffffffffff8082168352600160401b820465ffffffffffff166020840152600160701b8204811693830193909352600160b01b81049092166060820152600160f01b90910460ff166080820152600b546105765760405162461bcd60e51b815260206004820152601a60248201527f4e6f2073686172657320746f206469737472696275746520746f00000000000060448201526064016104c0565b8060600151816040015161058a9190611743565b67ffffffffffffffff164210156105e35760405162461bcd60e51b815260206004820152601a60248201527f546f6f206561726c7920666f7220646973747269627574696f6e00000000000060448201526064016104c0565b5f816040015167ffffffffffffffff16826060015167ffffffffffffffff164261060d919061176b565b610617919061177e565b90505f826080015160ff1682600d54610630919061179d565b61063a919061177e565b9050826040015167ffffffffffffffff1682610656919061179d565b836060018181516106679190611743565b67ffffffffffffffff9081169091528451600480546020880151604089015160608a015160808b01519587166dffffffffffffffffffffffffffff1990941693909317600160401b65ffffffffffff90931692909202919091176fffffffffffffffffffffffffffffffff60701b1916600160701b9186169190910267ffffffffffffffff60b01b191617600160b01b91909416029290921760ff60f01b1916600160f01b60ff9092169190910217905550600d54600c5461072990836117b4565b111561074257600c54600d5461073f919061176b565b90505b80156107b957600b546107709061075d83600160801b610db4565b610767919061177e565b60075490610e39565b60075560405181815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a2600c546107b59082610e39565b600c555b505050565b6001600160a01b0381165f90815260086020908152604080832054600a909252822054600754600160801b926108109261080b92610805916108009190610db4565b610e97565b90610ea5565b610edf565b61081a919061177e565b92915050565b61082a335f610ef0565b50565b61082a33610f5c565b5f546001600160a01b0316331461085f5760405162461bcd60e51b81526004016104c0906117c7565b6001600160a01b03919091165f908152600160205260409020805460ff1916911515919091179055565b5f546001600160a01b031633146108b25760405162461bcd60e51b81526004016104c0906117c7565b5f80546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a35f80546001600160a01b0319169055565b5f61081a825b6001600160a01b0381165f9081526009602052604081205461081a90610925846107be565b90611006565b335f9081526001602052604090205460ff168061095157505f546001600160a01b031633145b61096d5760405162461bcd60e51b81526004016104c090611707565b600d545f0361097e5761097e6109fb565b5f805f5b84518160ff1610156109f457848160ff16815181106109a3576109a36117fc565b60200260200101519250838160ff16815181106109c2576109c26117fc565b602002602001015191506109d68383611047565b6109e1836001610ef0565b50806109ec81611810565b915050610982565b5050505050565b335f9081526001602052604090205460ff1680610a2157505f546001600160a01b031633145b610a3d5760405162461bcd60e51b81526004016104c090611707565b6006546040516370a0823160e01b81523060048201525f9182916001600160a01b03909116906370a0823190602401602060405180830381865afa158015610a87573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aab919061182e565b90505f8111610afc5760405162461bcd60e51b815260206004820152601760248201527f4e6f20746f6b656e7320746f206469737472696275746500000000000000000060448201526064016104c0565b5f600254118015610b0e5750600d5481115b15610b99576064600254600d5483610b26919061176b565b610b30919061179d565b610b3a919061177e565b600d54909250610b4a838361176b565b1115610b9957600d54610b5d838361176b565b610b67919061176b565b600d5f828254610b7791906117b4565b9091555050600654600354610b99916001600160a01b039081169116846110db565b5050565b335f9081526001602052604090205460ff1680610bc357505f546001600160a01b031633145b610bdf5760405162461bcd60e51b81526004016104c090611707565b600d545f03610bf057610bf06109fb565b610bfa8282611047565b6107b9826001610ef0565b5f546001600160a01b03163314610c2e5760405162461bcd60e51b81526004016104c0906117c7565b6001600160a01b038116610c935760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016104c0565b5f80546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35f80546001600160a01b0319166001600160a01b0392909216919091179055565b60058054610cf990611845565b80601f0160208091040260200160405190810160405280929190818152602001828054610d2590611845565b8015610d705780601f10610d4757610100808354040283529160200191610d70565b820191905f5260205f20905b815481529060010190602001808311610d5357829003601f168201915b505050505081565b805f8080610d8584610900565b9250610d90846107be565b6001600160a01b0385165f908152600a602052604090205494969395509392915050565b5f825f03610dc357505f61081a565b5f610dce838561179d565b905082610ddb858361177e565b14610e325760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016104c0565b9392505050565b5f80610e4583856117b4565b905083811015610e325760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016104c0565b5f818181121561081a575f80fd5b5f80610eb1838561187d565b90505f8312158015610ec35750838112155b80610ed757505f83128015610ed757508381125b610e32575f80fd5b5f80821215610eec575f80fd5b5090565b5f80610efb84610f5c565b90508015610f5357821515846001600160a01b03167fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf09283604051610f4191815260200190565b60405180910390a3600191505061081a565b505f9392505050565b5f80610f6783610900565b90508015610ffe576001600160a01b0383165f90815260096020526040902054610f919082610e39565b6001600160a01b0384165f81815260096020526040908190209290925590517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d90610fdf9084815260200190565b60405180910390a2600654610ffe906001600160a01b031684836110db565b505f92915050565b5f610e3283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061112d565b6001600160a01b0382165f908152600a60205260409020805490829055808211156110a0575f6110778383611006565b90506110838482611165565b80600b5f82825461109491906117b4565b909155506107b9915050565b808210156107b9575f6110b38284611006565b90506110bf84826111bd565b80600b5f8282546110d0919061176b565b909155505050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526107b99084906111f6565b5f81848411156111505760405162461bcd60e51b81526004016104c091906116d5565b505f61115c848661176b565b95945050505050565b61119e61118061080083600754610db490919063ffffffff16565b6001600160a01b0384165f90815260086020526040902054906112c7565b6001600160a01b039092165f9081526008602052604090209190915550565b61119e6111d861080083600754610db490919063ffffffff16565b6001600160a01b0384165f9081526008602052604090205490610ea5565b5f61124a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166113009092919063ffffffff16565b8051909150156107b9578080602001905181019061126891906118a4565b6107b95760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016104c0565b5f806112d383856118bf565b90505f83121580156112e55750838113155b80610ed757505f83128015610ed75750838113610e32575f80fd5b606061130e84845f85611316565b949350505050565b6060824710156113775760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016104c0565b5f80866001600160a01b0316858760405161139291906118de565b5f6040518083038185875af1925050503d805f81146113cc576040519150601f19603f3d011682016040523d82523d5f602084013e6113d1565b606091505b50915091506113e2878383876113ed565b979650505050505050565b6060831561145b5782515f03611454576001600160a01b0385163b6114545760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016104c0565b508161130e565b61130e83838151156114705781518083602001fd5b8060405162461bcd60e51b81526004016104c091906116d5565b6001600160a01b038116811461082a575f80fd5b5f602082840312156114ae575f80fd5b8135610e328161148a565b801515811461082a575f80fd5b5f80604083850312156114d7575f80fd5b82356114e28161148a565b915060208301356114f2816114b9565b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561153a5761153a6114fd565b604052919050565b5f67ffffffffffffffff82111561155b5761155b6114fd565b5060051b60200190565b5f82601f830112611574575f80fd5b8135602061158961158483611542565b611511565b82815260059290921b840181019181810190868411156115a7575f80fd5b8286015b848110156115c257803583529183019183016115ab565b509695505050505050565b5f80604083850312156115de575f80fd5b823567ffffffffffffffff808211156115f5575f80fd5b818501915085601f830112611608575f80fd5b8135602061161861158483611542565b82815260059290921b84018101918181019089841115611636575f80fd5b948201945b8386101561165d57853561164e8161148a565b8252948201949082019061163b565b96505086013592505080821115611672575f80fd5b5061167f85828601611565565b9150509250929050565b5f806040838503121561169a575f80fd5b82356116a58161148a565b946020939093013593505050565b5f5b838110156116cd5781810151838201526020016116b5565b50505f910152565b602081525f82518060208401526116f38160408501602087016116b3565b601f01601f19169190910160400192915050565b6020808252600e908201526d139bdd08105d5d1a1bdc9a5e995960921b604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b67ffffffffffffffff8181168382160190808211156117645761176461172f565b5092915050565b8181038181111561081a5761081a61172f565b5f8261179857634e487b7160e01b5f52601260045260245ffd5b500490565b808202811582820484141761081a5761081a61172f565b8082018082111561081a5761081a61172f565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b5f60ff821660ff81036118255761182561172f565b60010192915050565b5f6020828403121561183e575f80fd5b5051919050565b600181811c9082168061185957607f821691505b60208210810361187757634e487b7160e01b5f52602260045260245ffd5b50919050565b8082018281125f83128015821682158216171561189c5761189c61172f565b505092915050565b5f602082840312156118b4575f80fd5b8151610e32816114b9565b8181035f8312801583831316838312821617156117645761176461172f565b5f82516118ef8184602087016116b3565b919091019291505056fea264697066735822122090a06f517c358598a95393848a4c786b53bdec0bae78f3e46e06a36c669f5a0a64736f6c63430008140033608060405234801562000010575f80fd5b5060405162001c6e38038062001c6e8339810160408190526200003391620002cc565b5f80546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506040805160a0810182525f808252602082018190529181018290526060810182905260808101919091526002879055600380546001600160a01b0319166001600160a01b038a16179055620000d18365ffffffffffff861662000413565b6001600160401b031615620001525760405162461bcd60e51b815260206004820152603560248201527f4475726174696f6e206d757374206265206576656e6c7920646976697369626c60448201527f65206279207061796f7574206672657175656e63790000000000000000000000606482015260840160405180910390fd5b6005620001608782620004c7565b5065ffffffffffff8416602082018190526001600160401b0380871680845290851660408401526060830152620001999084906200058f565b60ff16608082018190528151600480546020808601516040808801516060909801516001600160401b039687166001600160701b0319909516949094176801000000000000000065ffffffffffff9093169290920291909117600160701b600160f01b031916600160701b97861697909702600160b01b600160f01b03191696909617600160b01b94909216939093021760ff60f01b1916600160f01b909302929092179091556001600160a01b03929092165f90815260019283905220805460ff1916909117905550620005b7945050505050565b80516001600160a01b038116811462000286575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b80516001600160401b038116811462000286575f80fd5b805165ffffffffffff8116811462000286575f80fd5b5f805f805f805f60e0888a031215620002e3575f80fd5b620002ee886200026f565b60208981015160408b01519299509750906001600160401b038082111562000314575f80fd5b818b0191508b601f83011262000328575f80fd5b8151818111156200033d576200033d6200028b565b604051601f8201601f19908116603f011681019083821181831017156200036857620003686200028b565b816040528281528e8684870101111562000380575f80fd5b5f93505b82841015620003a3578484018601518185018701529285019262000384565b5f868483010152809a50505050505050620003c1606089016200029f565b9350620003d160808901620002b6565b9250620003e160a089016200029f565b9150620003f160c089016200026f565b905092959891949750929550565b634e487b7160e01b5f52601260045260245ffd5b5f6001600160401b03838116806200042f576200042f620003ff565b92169190910692915050565b600181811c908216806200045057607f821691505b6020821081036200046f57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115620004c2575f81815260208120601f850160051c810160208610156200049d5750805b601f850160051c820191505b81811015620004be57828155600101620004a9565b5050505b505050565b81516001600160401b03811115620004e357620004e36200028b565b620004fb81620004f484546200043b565b8462000475565b602080601f83116001811462000531575f8415620005195750858301515b5f19600386901b1c1916600185901b178555620004be565b5f85815260208120601f198616915b82811015620005615788860151825594840194600190910190840162000540565b50858210156200057f57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f6001600160401b0383811680620005ab57620005ab620003ff565b92169190910492915050565b6116a980620005c55f395ff3fe60806040526004361061017e575f3560e01c80638da5cb5b116100cd578063b918161111610087578063e30443bc11610062578063e30443bc146105a3578063f2fde38b146105c2578063f3466dfa146105e1578063fbcbc0f114610602575f80fd5b8063b91816111461053b578063dd6dd85214610579578063ddca3f431461058e575f80fd5b80638da5cb5b1461045b57806391b89fba1461048b578063a8b9d240146104aa578063aafd847a146104c9578063b3f00674146104fd578063b7e39b4f1461051c575f80fd5b806365d14c4711610138578063711bf9b211610113578063711bf9b2146103ff578063715018a61461041e57806371778e7d1461043257806385a6b3ae14610446575f80fd5b806365d14c471461038c5780636843cd84146103b75780636a474002146103eb575f80fd5b806303c833021461026f57806327ce01471461028557806330bb4cff146102b75780634e71d92d146102cb578063567142be146102df5780635a2f3d09146102f4575f80fd5b3661026b576002545f90156102495760646002543461019d919061127e565b6101a79190611295565b6003546040519192505f916001600160a01b039091169083908381818185875af1925050503d805f81146101f6576040519150601f19603f3d011682016040523d82523d5f602084013e6101fb565b606091505b50509050806102475760405162461bcd60e51b8152602060048201526013602482015272111a5cdd1c9a589d5d1a5bdb8819985a5b1959606a1b60448201526064015b60405180910390fd5b505b61025381346112b4565b600c5f82825461026391906112c7565b925050819055005b5f80fd5b34801561027a575f80fd5b5061028361064b565b005b348015610290575f80fd5b506102a461029f3660046112ee565b610982565b6040519081526020015b60405180910390f35b3480156102c2575f80fd5b50600b546102a4565b3480156102d6575f80fd5b506102836109e4565b3480156102ea575f80fd5b506102a4600a5481565b3480156102ff575f80fd5b506004546103469067ffffffffffffffff80821691600160401b810465ffffffffffff1691600160701b8204811691600160b01b810490911690600160f01b900460ff1685565b6040805167ffffffffffffffff968716815265ffffffffffff90951660208601529285169284019290925292909216606082015260ff909116608082015260a0016102ae565b348015610397575f80fd5b506102a46103a63660046112ee565b60096020525f908152604090205481565b3480156103c2575f80fd5b506102a46103d13660046112ee565b6001600160a01b03165f9081526009602052604090205490565b3480156103f6575f80fd5b506102836109f1565b34801561040a575f80fd5b50610283610419366004611309565b6109fa565b348015610429575f80fd5b50610283610a4d565b34801561043d575f80fd5b50600a546102a4565b348015610451575f80fd5b506102a4600b5481565b348015610466575f80fd5b505f546001600160a01b03165b6040516001600160a01b0390911681526020016102ae565b348015610496575f80fd5b506102a46104a53660046112ee565b610abe565b3480156104b5575f80fd5b506102a46104c43660046112ee565b610ac4565b3480156104d4575f80fd5b506102a46104e33660046112ee565b6001600160a01b03165f9081526008602052604090205490565b348015610508575f80fd5b50600354610473906001600160a01b031681565b348015610527575f80fd5b50610283610536366004611414565b610aef565b348015610546575f80fd5b506105696105553660046112ee565b60016020525f908152604090205460ff1681565b60405190151581526020016102ae565b348015610584575f80fd5b506102a4600c5481565b348015610599575f80fd5b506102a460025481565b3480156105ae575f80fd5b506102836105bd3660046114d0565b610bae565b3480156105cd575f80fd5b506102836105dc3660046112ee565b610c05565b3480156105ec575f80fd5b506105f5610cec565b6040516102ae91906114fa565b34801561060d575f80fd5b5061062161061c3660046112ee565b610d78565b604080516001600160a01b03909516855260208501939093529183015260608201526080016102ae565b335f9081526001602052604090205460ff168061067157505f546001600160a01b031633145b61068d5760405162461bcd60e51b815260040161023e90611545565b6040805160a08101825260045467ffffffffffffffff8082168352600160401b820465ffffffffffff166020840152600160701b8204811693830193909352600160b01b81049092166060820152600160f01b90910460ff166080820152600a5461073a5760405162461bcd60e51b815260206004820152601a60248201527f4e6f2073686172657320746f206469737472696275746520746f000000000000604482015260640161023e565b8060600151816040015161074e919061156d565b67ffffffffffffffff164210156107a75760405162461bcd60e51b815260206004820152601a60248201527f546f6f206561726c7920666f7220646973747269627574696f6e000000000000604482015260640161023e565b5f816040015167ffffffffffffffff16826060015167ffffffffffffffff16426107d191906112b4565b6107db9190611295565b90505f826080015160ff1682600c546107f4919061127e565b6107fe9190611295565b9050826040015167ffffffffffffffff168261081a919061127e565b8360600181815161082b919061156d565b67ffffffffffffffff9081169091528451600480546020880151604089015160608a015160808b01519587166dffffffffffffffffffffffffffff1990941693909317600160401b65ffffffffffff90931692909202919091176fffffffffffffffffffffffffffffffff60701b1916600160701b9186169190910267ffffffffffffffff60b01b191617600160b01b91909416029290921760ff60f01b1916600160f01b60ff9092169190910217905550600c54600b546108ed90836112c7565b111561090657600b54600c5461090391906112b4565b90505b801561097d57600a546109349061092183600160801b610db4565b61092b9190611295565b60065490610e39565b60065560405181815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a2600b546109799082610e39565b600b555b505050565b6001600160a01b0381165f908152600760209081526040808320546009909252822054600654600160801b926109d4926109cf926109c9916109c49190610db4565b610e97565b90610ea5565b610edf565b6109de9190611295565b92915050565b6109ee335f610ef0565b50565b6109ee33610f5c565b5f546001600160a01b03163314610a235760405162461bcd60e51b815260040161023e9061158e565b6001600160a01b03919091165f908152600160205260409020805460ff1916911515919091179055565b5f546001600160a01b03163314610a765760405162461bcd60e51b815260040161023e9061158e565b5f80546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a35f80546001600160a01b0319169055565b5f6109de825b6001600160a01b0381165f908152600860205260408120546109de90610ae984610982565b90611093565b335f9081526001602052604090205460ff1680610b1557505f546001600160a01b031633145b610b315760405162461bcd60e51b815260040161023e90611545565b5f805f5b84518160ff161015610ba757848160ff1681518110610b5657610b566115c3565b60200260200101519250838160ff1681518110610b7557610b756115c3565b60200260200101519150610b8983836110d4565b610b94836001610ef0565b5080610b9f816115d7565b915050610b35565b5050505050565b335f9081526001602052604090205460ff1680610bd457505f546001600160a01b031633145b610bf05760405162461bcd60e51b815260040161023e90611545565b610bfa82826110d4565b61097d826001610ef0565b5f546001600160a01b03163314610c2e5760405162461bcd60e51b815260040161023e9061158e565b6001600160a01b038116610c935760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161023e565b5f80546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35f80546001600160a01b0319166001600160a01b0392909216919091179055565b60058054610cf9906115f5565b80601f0160208091040260200160405190810160405280929190818152602001828054610d25906115f5565b8015610d705780601f10610d4757610100808354040283529160200191610d70565b820191905f5260205f20905b815481529060010190602001808311610d5357829003601f168201915b505050505081565b805f8080610d8584610ac4565b9250610d9084610982565b6001600160a01b0385165f9081526009602052604090205494969395509392915050565b5f825f03610dc357505f6109de565b5f610dce838561127e565b905082610ddb8583611295565b14610e325760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b606482015260840161023e565b9392505050565b5f80610e4583856112c7565b905083811015610e325760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640161023e565b5f81818112156109de575f80fd5b5f80610eb1838561162d565b90505f8312158015610ec35750838112155b80610ed757505f83128015610ed757508381125b610e32575f80fd5b5f80821215610eec575f80fd5b5090565b5f80610efb84610f5c565b90508015610f5357821515846001600160a01b03167fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf09283604051610f4191815260200190565b60405180910390a360019150506109de565b505f9392505050565b5f80610f6783610ac4565b9050801561108b576001600160a01b0383165f90815260086020526040902054610f919082610e39565b6001600160a01b0384165f81815260086020526040908190209290925590517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d90610fdf9084815260200190565b60405180910390a25f836001600160a01b0316826040515f6040518083038185875af1925050503d805f8114611030576040519150601f19603f3d011682016040523d82523d5f602084013e611035565b606091505b5050905080611084576001600160a01b0384165f908152600860205260409020546110609083611093565b6001600160a01b039094165f90815260086020526040812094909455509192915050565b5092915050565b505f92915050565b5f610e3283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611168565b6001600160a01b0382165f9081526009602052604090208054908290558082111561112d575f6111048383611093565b905061111084826111a0565b80600a5f82825461112191906112c7565b9091555061097d915050565b8082101561097d575f6111408284611093565b905061114c84826111f8565b80600a5f82825461115d91906112b4565b909155505050505050565b5f818484111561118b5760405162461bcd60e51b815260040161023e91906114fa565b505f61119784866112b4565b95945050505050565b6111d96111bb6109c483600654610db490919063ffffffff16565b6001600160a01b0384165f9081526007602052604090205490611231565b6001600160a01b039092165f9081526007602052604090209190915550565b6111d96112136109c483600654610db490919063ffffffff16565b6001600160a01b0384165f9081526007602052604090205490610ea5565b5f8061123d8385611654565b90505f831215801561124f5750838113155b80610ed757505f83128015610ed75750838113610e32575f80fd5b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176109de576109de61126a565b5f826112af57634e487b7160e01b5f52601260045260245ffd5b500490565b818103818111156109de576109de61126a565b808201808211156109de576109de61126a565b6001600160a01b03811681146109ee575f80fd5b5f602082840312156112fe575f80fd5b8135610e32816112da565b5f806040838503121561131a575f80fd5b8235611325816112da565b915060208301358015158114611339575f80fd5b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561138157611381611344565b604052919050565b5f67ffffffffffffffff8211156113a2576113a2611344565b5060051b60200190565b5f82601f8301126113bb575f80fd5b813560206113d06113cb83611389565b611358565b82815260059290921b840181019181810190868411156113ee575f80fd5b8286015b8481101561140957803583529183019183016113f2565b509695505050505050565b5f8060408385031215611425575f80fd5b823567ffffffffffffffff8082111561143c575f80fd5b818501915085601f83011261144f575f80fd5b8135602061145f6113cb83611389565b82815260059290921b8401810191818101908984111561147d575f80fd5b948201945b838610156114a4578535611495816112da565b82529482019490820190611482565b965050860135925050808211156114b9575f80fd5b506114c6858286016113ac565b9150509250929050565b5f80604083850312156114e1575f80fd5b82356114ec816112da565b946020939093013593505050565b5f6020808352835180828501525f5b8181101561152557858101830151858201604001528201611509565b505f604082860101526040601f19601f8301168501019250505092915050565b6020808252600e908201526d139bdd08105d5d1a1bdc9a5e995960921b604082015260600190565b67ffffffffffffffff8181168382160190808211156110845761108461126a565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b5f60ff821660ff81036115ec576115ec61126a565b60010192915050565b600181811c9082168061160957607f821691505b60208210810361162757634e487b7160e01b5f52602260045260245ffd5b50919050565b8082018281125f83128015821682158216171561164c5761164c61126a565b505092915050565b8181035f8312801583831316838312821617156110845761108461126a56fea26469706673582212208619c278cffa41b5d7bf66198269c16b27fd1ef0bb1249fcc0dede8a61b9d9f764736f6c63430008140033a26469706673582212204387398b009b4eb8b1ce91ef9c904c1430f3a93daf0f03a0337db52ce71289b864736f6c6343000814003300000000000000000000000096ba97679ca4889c4a86e01e98bbfcb1cd194ed600000000000000000000000096ba97679ca4889c4a86e01e98bbfcb1cd194ed6000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000079d1e3eaf2192ee6df7ae89a579725343fe958cc
Deployed Bytecode
0x608060405234801562000010575f80fd5b5060043610620000f8575f3560e01c8063cba778e41162000093578063e627ba72116200006b578063e627ba7214620001ea578063ea17a03c1462000201578063f2fde38b1462000215578063f3c5e653146200022c575f80fd5b8063cba778e414620001a6578063d9dea1c314620001bd578063ddca3f4314620001d1575f80fd5b80636035d45511620000d35780636035d455146200015d578063715018a614620001745780638da5cb5b146200017e5780639012c4a8146200018f575f80fd5b806319e19a3a14620000fc5780632475d786146200011557806346abf3911462000146575b5f80fd5b620001136200010d36600462000995565b62000243565b005b60045462000129906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b620001296200015736600462000a1c565b620003ba565b620001136200016e36600462000a34565b620003e3565b620001136200054d565b5f546001600160a01b031662000129565b62000113620001a036600462000a1c565b620005c1565b62000113620001b736600462000aa9565b62000639565b60025462000129906001600160a01b031681565b620001db60035481565b6040519081526020016200013d565b62000113620001fb36600462000aa9565b620006b0565b60015462000129906001600160a01b031681565b620001136200022636600462000aa9565b62000727565b620001136200023d36600462000aa9565b62000813565b5f546001600160a01b03163314620002785760405162461bcd60e51b81526004016200026f9062000acc565b60405180910390fd5b6002546003546004546040515f936001600160a01b0390811693928a928a928a928a929116908990620002ab906200088a565b620002be98979695949392919062000b46565b604051809103905ff080158015620002d8573d5f803e3d5ffd5b50600580546001810182555f919091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b0319166001600160a01b03831690811790915560405163f2fde38b60e01b81523360048201529192509063f2fde38b906024015f604051808303815f87803b1580156200035e575f80fd5b505af115801562000371573d5f803e3d5ffd5b50506040516001600160a01b03841681527fc7caa24d4386c19f106a6b99fa99ba51c2451911ee733cd4f5079f75839bb0d69250602001905060405180910390a1505050505050565b60058181548110620003ca575f80fd5b5f918252602090912001546001600160a01b0316905081565b5f546001600160a01b031633146200040f5760405162461bcd60e51b81526004016200026f9062000acc565b6001546003546004546040515f936001600160a01b0390811693928992899289928992911690620004409062000898565b62000452979695949392919062000bb8565b604051809103905ff0801580156200046c573d5f803e3d5ffd5b50600580546001810182555f919091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b0319166001600160a01b03831690811790915560405163f2fde38b60e01b81523360048201529192509063f2fde38b906024015f604051808303815f87803b158015620004f2575f80fd5b505af115801562000505573d5f803e3d5ffd5b50506040516001600160a01b03841681527f295cdfadcaf678740de7ce28f94d78de09a8b971a17a203d9501d8d6837fbaaa9250602001905060405180910390a15050505050565b5f546001600160a01b03163314620005795760405162461bcd60e51b81526004016200026f9062000acc565b5f80546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a35f80546001600160a01b0319169055565b5f546001600160a01b03163314620005ed5760405162461bcd60e51b81526004016200026f9062000acc565b6014811115620006345760405162461bcd60e51b8152602060048201526011602482015270466565206d75737420626520302d32302560781b60448201526064016200026f565b600355565b5f546001600160a01b03163314620006655760405162461bcd60e51b81526004016200026f9062000acc565b6001600160a01b0381166200068e5760405162461bcd60e51b81526004016200026f9062000c1b565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b5f546001600160a01b03163314620006dc5760405162461bcd60e51b81526004016200026f9062000acc565b6001600160a01b038116620007055760405162461bcd60e51b81526004016200026f9062000c1b565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b5f546001600160a01b03163314620007535760405162461bcd60e51b81526004016200026f9062000acc565b6001600160a01b038116620007ba5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016200026f565b5f80546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35f80546001600160a01b0319166001600160a01b0392909216919091179055565b5f546001600160a01b031633146200083f5760405162461bcd60e51b81526004016200026f9062000acc565b6001600160a01b038116620008685760405162461bcd60e51b81526004016200026f9062000c1b565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b611f788062000c4283390190565b611c6e8062002bba83390190565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620008ca575f80fd5b813567ffffffffffffffff80821115620008e857620008e8620008a6565b604051601f8301601f19908116603f01168101908282118183101715620009135762000913620008a6565b816040528381528660208588010111156200092c575f80fd5b836020870160208301375f602085830101528094505050505092915050565b803567ffffffffffffffff8116811462000963575f80fd5b919050565b803565ffffffffffff8116811462000963575f80fd5b80356001600160a01b038116811462000963575f80fd5b5f805f805f60a08688031215620009aa575f80fd5b853567ffffffffffffffff811115620009c1575f80fd5b620009cf88828901620008ba565b955050620009e0602087016200094b565b9350620009f06040870162000968565b925062000a00606087016200094b565b915062000a10608087016200097e565b90509295509295909350565b5f6020828403121562000a2d575f80fd5b5035919050565b5f805f806080858703121562000a48575f80fd5b843567ffffffffffffffff81111562000a5f575f80fd5b62000a6d87828801620008ba565b94505062000a7e602086016200094b565b925062000a8e6040860162000968565b915062000a9e606086016200094b565b905092959194509250565b5f6020828403121562000aba575f80fd5b62000ac5826200097e565b9392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b5f81518084525f5b8181101562000b275760208185018101518683018201520162000b09565b505f602082860101526020601f19601f83011685010191505092915050565b6001600160a01b03898116825260208201899052610100604083018190525f9162000b748483018b62000b01565b67ffffffffffffffff998a16606086015265ffffffffffff9890981660808501529590971660a08301525091831660c083015290911660e090910152949350505050565b5f60018060a01b03808a16835288602084015260e0604084015262000be160e084018962000b01565b67ffffffffffffffff978816606085015265ffffffffffff9690961660808401529390951660a0820152911660c090910152949350505050565b6020808252600c908201526b5a65726f204164647265737360a01b60408201526060019056fe608060405234801562000010575f80fd5b5060405162001f7838038062001f7883398101604081905262000033916200033d565b5f80546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506040805160a0810182525f808252602082018190529181018290526060810182905260808101919091526002889055600380546001600160a01b0319166001600160a01b038b16179055620000d18465ffffffffffff871662000497565b6001600160401b031615620001535760405162461bcd60e51b815260206004820152603560248201527f4475726174696f6e206d757374206265206576656e6c7920646976697369626c60448201527f65206279207061796f7574206672657175656e6379000000000000000000000060648201526084015b60405180910390fd5b60056200016188826200054b565b5065ffffffffffff8516602082018190526001600160401b03808816808452908616604084015260608301526200019a90859062000613565b60ff16608082018190528151600480546020808601516040808801516060890151600160f01b90980260ff60f01b196001600160401b03998a16600160b01b02600160b01b600160f01b0319938b16600160701b0293909316600160701b600160f01b031965ffffffffffff90961668010000000000000000026001600160701b03199098169a9099169990991795909517929092169590951717949094161790556001600160a01b038086165f90815260019384905291909120805460ff19169092179091558216620002b15760405162461bcd60e51b815260206004820152601c60248201527f52657761726420546f6b656e2041646472657373206e6f74205365740000000060448201526064016200014a565b50600680546001600160a01b0319166001600160a01b0392909216919091179055506200063b95505050505050565b80516001600160a01b0381168114620002f7575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b80516001600160401b0381168114620002f7575f80fd5b805165ffffffffffff81168114620002f7575f80fd5b5f805f805f805f80610100898b03121562000356575f80fd5b6200036189620002e0565b60208a81015160408c0151929a509850906001600160401b038082111562000387575f80fd5b818c0191508c601f8301126200039b575f80fd5b815181811115620003b057620003b0620002fc565b604051601f8201601f19908116603f01168101908382118183101715620003db57620003db620002fc565b816040528281528f86848701011115620003f3575f80fd5b5f93505b82841015620004165784840186015181850187015292850192620003f7565b5f868483010152809b505050505050506200043460608a0162000310565b94506200044460808a0162000327565b93506200045460a08a0162000310565b92506200046460c08a01620002e0565b91506200047460e08a01620002e0565b90509295985092959890939650565b634e487b7160e01b5f52601260045260245ffd5b5f6001600160401b0383811680620004b357620004b362000483565b92169190910692915050565b600181811c90821680620004d457607f821691505b602082108103620004f357634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000546575f81815260208120601f850160051c81016020861015620005215750805b601f850160051c820191505b8181101562000542578281556001016200052d565b5050505b505050565b81516001600160401b03811115620005675762000567620002fc565b6200057f81620005788454620004bf565b84620004f9565b602080601f831160018114620005b5575f84156200059d5750858301515b5f19600386901b1c1916600185901b17855562000542565b5f85815260208120601f198616915b82811015620005e557888601518255948401946001909101908401620005c4565b50858210156200060357878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f6001600160401b03838116806200062f576200062f62000483565b92169190910492915050565b61192f80620006495f395ff3fe608060405234801561000f575f80fd5b50600436106101bb575f3560e01c806391b89fba116100f3578063dd85d22911610093578063f2fde38b1161006e578063f2fde38b14610406578063f3466dfa14610419578063f7c618c11461042e578063fbcbc0f114610441575f80fd5b8063dd85d229146103e2578063ddca3f43146103ea578063e30443bc146103f3575f80fd5b8063b3f00674116100ce578063b3f0067414610381578063b7e39b4f14610394578063b9181611146103a7578063dd6dd852146103d9575f80fd5b806391b89fba14610333578063a8b9d24014610346578063aafd847a14610359575f80fd5b80636843cd841161015e578063715018a611610139578063715018a6146102f657806371778e7d146102fe57806385a6b3ae146103065780638da5cb5b1461030f575f80fd5b80636843cd84146102b35780636a474002146102db578063711bf9b2146102e3575f80fd5b80634e71d92d116101995780634e71d92d146101f7578063567142be146101ff5780635a2f3d091461020857806365d14c4714610294575f80fd5b806303c83302146101bf57806327ce0147146101c957806330bb4cff146101ef575b5f80fd5b6101c761047e565b005b6101dc6101d736600461149e565b6107be565b6040519081526020015b60405180910390f35b600c546101dc565b6101c7610820565b6101dc600b5481565b60045461024e9067ffffffffffffffff80821691600160401b810465ffffffffffff1691600160701b8204811691600160b01b810490911690600160f01b900460ff1685565b6040805167ffffffffffffffff968716815265ffffffffffff90951660208601529285169284019290925292909216606082015260ff909116608082015260a0016101e6565b6101dc6102a236600461149e565b600a6020525f908152604090205481565b6101dc6102c136600461149e565b6001600160a01b03165f908152600a602052604090205490565b6101c761082d565b6101c76102f13660046114c6565b610836565b6101c7610889565b600b546101dc565b6101dc600c5481565b5f546001600160a01b03165b6040516001600160a01b0390911681526020016101e6565b6101dc61034136600461149e565b6108fa565b6101dc61035436600461149e565b610900565b6101dc61036736600461149e565b6001600160a01b03165f9081526009602052604090205490565b60035461031b906001600160a01b031681565b6101c76103a23660046115cd565b61092b565b6103c96103b536600461149e565b60016020525f908152604090205460ff1681565b60405190151581526020016101e6565b6101dc600d5481565b6101c76109fb565b6101dc60025481565b6101c7610401366004611689565b610b9d565b6101c761041436600461149e565b610c05565b610421610cec565b6040516101e691906116d5565b60065461031b906001600160a01b031681565b61045461044f36600461149e565b610d78565b604080516001600160a01b03909516855260208501939093529183015260608201526080016101e6565b335f9081526001602052604090205460ff16806104a457505f546001600160a01b031633145b6104c95760405162461bcd60e51b81526004016104c090611707565b60405180910390fd5b6040805160a08101825260045467ffffffffffffffff8082168352600160401b820465ffffffffffff166020840152600160701b8204811693830193909352600160b01b81049092166060820152600160f01b90910460ff166080820152600b546105765760405162461bcd60e51b815260206004820152601a60248201527f4e6f2073686172657320746f206469737472696275746520746f00000000000060448201526064016104c0565b8060600151816040015161058a9190611743565b67ffffffffffffffff164210156105e35760405162461bcd60e51b815260206004820152601a60248201527f546f6f206561726c7920666f7220646973747269627574696f6e00000000000060448201526064016104c0565b5f816040015167ffffffffffffffff16826060015167ffffffffffffffff164261060d919061176b565b610617919061177e565b90505f826080015160ff1682600d54610630919061179d565b61063a919061177e565b9050826040015167ffffffffffffffff1682610656919061179d565b836060018181516106679190611743565b67ffffffffffffffff9081169091528451600480546020880151604089015160608a015160808b01519587166dffffffffffffffffffffffffffff1990941693909317600160401b65ffffffffffff90931692909202919091176fffffffffffffffffffffffffffffffff60701b1916600160701b9186169190910267ffffffffffffffff60b01b191617600160b01b91909416029290921760ff60f01b1916600160f01b60ff9092169190910217905550600d54600c5461072990836117b4565b111561074257600c54600d5461073f919061176b565b90505b80156107b957600b546107709061075d83600160801b610db4565b610767919061177e565b60075490610e39565b60075560405181815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a2600c546107b59082610e39565b600c555b505050565b6001600160a01b0381165f90815260086020908152604080832054600a909252822054600754600160801b926108109261080b92610805916108009190610db4565b610e97565b90610ea5565b610edf565b61081a919061177e565b92915050565b61082a335f610ef0565b50565b61082a33610f5c565b5f546001600160a01b0316331461085f5760405162461bcd60e51b81526004016104c0906117c7565b6001600160a01b03919091165f908152600160205260409020805460ff1916911515919091179055565b5f546001600160a01b031633146108b25760405162461bcd60e51b81526004016104c0906117c7565b5f80546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a35f80546001600160a01b0319169055565b5f61081a825b6001600160a01b0381165f9081526009602052604081205461081a90610925846107be565b90611006565b335f9081526001602052604090205460ff168061095157505f546001600160a01b031633145b61096d5760405162461bcd60e51b81526004016104c090611707565b600d545f0361097e5761097e6109fb565b5f805f5b84518160ff1610156109f457848160ff16815181106109a3576109a36117fc565b60200260200101519250838160ff16815181106109c2576109c26117fc565b602002602001015191506109d68383611047565b6109e1836001610ef0565b50806109ec81611810565b915050610982565b5050505050565b335f9081526001602052604090205460ff1680610a2157505f546001600160a01b031633145b610a3d5760405162461bcd60e51b81526004016104c090611707565b6006546040516370a0823160e01b81523060048201525f9182916001600160a01b03909116906370a0823190602401602060405180830381865afa158015610a87573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aab919061182e565b90505f8111610afc5760405162461bcd60e51b815260206004820152601760248201527f4e6f20746f6b656e7320746f206469737472696275746500000000000000000060448201526064016104c0565b5f600254118015610b0e5750600d5481115b15610b99576064600254600d5483610b26919061176b565b610b30919061179d565b610b3a919061177e565b600d54909250610b4a838361176b565b1115610b9957600d54610b5d838361176b565b610b67919061176b565b600d5f828254610b7791906117b4565b9091555050600654600354610b99916001600160a01b039081169116846110db565b5050565b335f9081526001602052604090205460ff1680610bc357505f546001600160a01b031633145b610bdf5760405162461bcd60e51b81526004016104c090611707565b600d545f03610bf057610bf06109fb565b610bfa8282611047565b6107b9826001610ef0565b5f546001600160a01b03163314610c2e5760405162461bcd60e51b81526004016104c0906117c7565b6001600160a01b038116610c935760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016104c0565b5f80546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35f80546001600160a01b0319166001600160a01b0392909216919091179055565b60058054610cf990611845565b80601f0160208091040260200160405190810160405280929190818152602001828054610d2590611845565b8015610d705780601f10610d4757610100808354040283529160200191610d70565b820191905f5260205f20905b815481529060010190602001808311610d5357829003601f168201915b505050505081565b805f8080610d8584610900565b9250610d90846107be565b6001600160a01b0385165f908152600a602052604090205494969395509392915050565b5f825f03610dc357505f61081a565b5f610dce838561179d565b905082610ddb858361177e565b14610e325760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016104c0565b9392505050565b5f80610e4583856117b4565b905083811015610e325760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016104c0565b5f818181121561081a575f80fd5b5f80610eb1838561187d565b90505f8312158015610ec35750838112155b80610ed757505f83128015610ed757508381125b610e32575f80fd5b5f80821215610eec575f80fd5b5090565b5f80610efb84610f5c565b90508015610f5357821515846001600160a01b03167fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf09283604051610f4191815260200190565b60405180910390a3600191505061081a565b505f9392505050565b5f80610f6783610900565b90508015610ffe576001600160a01b0383165f90815260096020526040902054610f919082610e39565b6001600160a01b0384165f81815260096020526040908190209290925590517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d90610fdf9084815260200190565b60405180910390a2600654610ffe906001600160a01b031684836110db565b505f92915050565b5f610e3283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061112d565b6001600160a01b0382165f908152600a60205260409020805490829055808211156110a0575f6110778383611006565b90506110838482611165565b80600b5f82825461109491906117b4565b909155506107b9915050565b808210156107b9575f6110b38284611006565b90506110bf84826111bd565b80600b5f8282546110d0919061176b565b909155505050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526107b99084906111f6565b5f81848411156111505760405162461bcd60e51b81526004016104c091906116d5565b505f61115c848661176b565b95945050505050565b61119e61118061080083600754610db490919063ffffffff16565b6001600160a01b0384165f90815260086020526040902054906112c7565b6001600160a01b039092165f9081526008602052604090209190915550565b61119e6111d861080083600754610db490919063ffffffff16565b6001600160a01b0384165f9081526008602052604090205490610ea5565b5f61124a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166113009092919063ffffffff16565b8051909150156107b9578080602001905181019061126891906118a4565b6107b95760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016104c0565b5f806112d383856118bf565b90505f83121580156112e55750838113155b80610ed757505f83128015610ed75750838113610e32575f80fd5b606061130e84845f85611316565b949350505050565b6060824710156113775760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016104c0565b5f80866001600160a01b0316858760405161139291906118de565b5f6040518083038185875af1925050503d805f81146113cc576040519150601f19603f3d011682016040523d82523d5f602084013e6113d1565b606091505b50915091506113e2878383876113ed565b979650505050505050565b6060831561145b5782515f03611454576001600160a01b0385163b6114545760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016104c0565b508161130e565b61130e83838151156114705781518083602001fd5b8060405162461bcd60e51b81526004016104c091906116d5565b6001600160a01b038116811461082a575f80fd5b5f602082840312156114ae575f80fd5b8135610e328161148a565b801515811461082a575f80fd5b5f80604083850312156114d7575f80fd5b82356114e28161148a565b915060208301356114f2816114b9565b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561153a5761153a6114fd565b604052919050565b5f67ffffffffffffffff82111561155b5761155b6114fd565b5060051b60200190565b5f82601f830112611574575f80fd5b8135602061158961158483611542565b611511565b82815260059290921b840181019181810190868411156115a7575f80fd5b8286015b848110156115c257803583529183019183016115ab565b509695505050505050565b5f80604083850312156115de575f80fd5b823567ffffffffffffffff808211156115f5575f80fd5b818501915085601f830112611608575f80fd5b8135602061161861158483611542565b82815260059290921b84018101918181019089841115611636575f80fd5b948201945b8386101561165d57853561164e8161148a565b8252948201949082019061163b565b96505086013592505080821115611672575f80fd5b5061167f85828601611565565b9150509250929050565b5f806040838503121561169a575f80fd5b82356116a58161148a565b946020939093013593505050565b5f5b838110156116cd5781810151838201526020016116b5565b50505f910152565b602081525f82518060208401526116f38160408501602087016116b3565b601f01601f19169190910160400192915050565b6020808252600e908201526d139bdd08105d5d1a1bdc9a5e995960921b604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b67ffffffffffffffff8181168382160190808211156117645761176461172f565b5092915050565b8181038181111561081a5761081a61172f565b5f8261179857634e487b7160e01b5f52601260045260245ffd5b500490565b808202811582820484141761081a5761081a61172f565b8082018082111561081a5761081a61172f565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b5f60ff821660ff81036118255761182561172f565b60010192915050565b5f6020828403121561183e575f80fd5b5051919050565b600181811c9082168061185957607f821691505b60208210810361187757634e487b7160e01b5f52602260045260245ffd5b50919050565b8082018281125f83128015821682158216171561189c5761189c61172f565b505092915050565b5f602082840312156118b4575f80fd5b8151610e32816114b9565b8181035f8312801583831316838312821617156117645761176461172f565b5f82516118ef8184602087016116b3565b919091019291505056fea264697066735822122090a06f517c358598a95393848a4c786b53bdec0bae78f3e46e06a36c669f5a0a64736f6c63430008140033608060405234801562000010575f80fd5b5060405162001c6e38038062001c6e8339810160408190526200003391620002cc565b5f80546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506040805160a0810182525f808252602082018190529181018290526060810182905260808101919091526002879055600380546001600160a01b0319166001600160a01b038a16179055620000d18365ffffffffffff861662000413565b6001600160401b031615620001525760405162461bcd60e51b815260206004820152603560248201527f4475726174696f6e206d757374206265206576656e6c7920646976697369626c60448201527f65206279207061796f7574206672657175656e63790000000000000000000000606482015260840160405180910390fd5b6005620001608782620004c7565b5065ffffffffffff8416602082018190526001600160401b0380871680845290851660408401526060830152620001999084906200058f565b60ff16608082018190528151600480546020808601516040808801516060909801516001600160401b039687166001600160701b0319909516949094176801000000000000000065ffffffffffff9093169290920291909117600160701b600160f01b031916600160701b97861697909702600160b01b600160f01b03191696909617600160b01b94909216939093021760ff60f01b1916600160f01b909302929092179091556001600160a01b03929092165f90815260019283905220805460ff1916909117905550620005b7945050505050565b80516001600160a01b038116811462000286575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b80516001600160401b038116811462000286575f80fd5b805165ffffffffffff8116811462000286575f80fd5b5f805f805f805f60e0888a031215620002e3575f80fd5b620002ee886200026f565b60208981015160408b01519299509750906001600160401b038082111562000314575f80fd5b818b0191508b601f83011262000328575f80fd5b8151818111156200033d576200033d6200028b565b604051601f8201601f19908116603f011681019083821181831017156200036857620003686200028b565b816040528281528e8684870101111562000380575f80fd5b5f93505b82841015620003a3578484018601518185018701529285019262000384565b5f868483010152809a50505050505050620003c1606089016200029f565b9350620003d160808901620002b6565b9250620003e160a089016200029f565b9150620003f160c089016200026f565b905092959891949750929550565b634e487b7160e01b5f52601260045260245ffd5b5f6001600160401b03838116806200042f576200042f620003ff565b92169190910692915050565b600181811c908216806200045057607f821691505b6020821081036200046f57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115620004c2575f81815260208120601f850160051c810160208610156200049d5750805b601f850160051c820191505b81811015620004be57828155600101620004a9565b5050505b505050565b81516001600160401b03811115620004e357620004e36200028b565b620004fb81620004f484546200043b565b8462000475565b602080601f83116001811462000531575f8415620005195750858301515b5f19600386901b1c1916600185901b178555620004be565b5f85815260208120601f198616915b82811015620005615788860151825594840194600190910190840162000540565b50858210156200057f57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f6001600160401b0383811680620005ab57620005ab620003ff565b92169190910492915050565b6116a980620005c55f395ff3fe60806040526004361061017e575f3560e01c80638da5cb5b116100cd578063b918161111610087578063e30443bc11610062578063e30443bc146105a3578063f2fde38b146105c2578063f3466dfa146105e1578063fbcbc0f114610602575f80fd5b8063b91816111461053b578063dd6dd85214610579578063ddca3f431461058e575f80fd5b80638da5cb5b1461045b57806391b89fba1461048b578063a8b9d240146104aa578063aafd847a146104c9578063b3f00674146104fd578063b7e39b4f1461051c575f80fd5b806365d14c4711610138578063711bf9b211610113578063711bf9b2146103ff578063715018a61461041e57806371778e7d1461043257806385a6b3ae14610446575f80fd5b806365d14c471461038c5780636843cd84146103b75780636a474002146103eb575f80fd5b806303c833021461026f57806327ce01471461028557806330bb4cff146102b75780634e71d92d146102cb578063567142be146102df5780635a2f3d09146102f4575f80fd5b3661026b576002545f90156102495760646002543461019d919061127e565b6101a79190611295565b6003546040519192505f916001600160a01b039091169083908381818185875af1925050503d805f81146101f6576040519150601f19603f3d011682016040523d82523d5f602084013e6101fb565b606091505b50509050806102475760405162461bcd60e51b8152602060048201526013602482015272111a5cdd1c9a589d5d1a5bdb8819985a5b1959606a1b60448201526064015b60405180910390fd5b505b61025381346112b4565b600c5f82825461026391906112c7565b925050819055005b5f80fd5b34801561027a575f80fd5b5061028361064b565b005b348015610290575f80fd5b506102a461029f3660046112ee565b610982565b6040519081526020015b60405180910390f35b3480156102c2575f80fd5b50600b546102a4565b3480156102d6575f80fd5b506102836109e4565b3480156102ea575f80fd5b506102a4600a5481565b3480156102ff575f80fd5b506004546103469067ffffffffffffffff80821691600160401b810465ffffffffffff1691600160701b8204811691600160b01b810490911690600160f01b900460ff1685565b6040805167ffffffffffffffff968716815265ffffffffffff90951660208601529285169284019290925292909216606082015260ff909116608082015260a0016102ae565b348015610397575f80fd5b506102a46103a63660046112ee565b60096020525f908152604090205481565b3480156103c2575f80fd5b506102a46103d13660046112ee565b6001600160a01b03165f9081526009602052604090205490565b3480156103f6575f80fd5b506102836109f1565b34801561040a575f80fd5b50610283610419366004611309565b6109fa565b348015610429575f80fd5b50610283610a4d565b34801561043d575f80fd5b50600a546102a4565b348015610451575f80fd5b506102a4600b5481565b348015610466575f80fd5b505f546001600160a01b03165b6040516001600160a01b0390911681526020016102ae565b348015610496575f80fd5b506102a46104a53660046112ee565b610abe565b3480156104b5575f80fd5b506102a46104c43660046112ee565b610ac4565b3480156104d4575f80fd5b506102a46104e33660046112ee565b6001600160a01b03165f9081526008602052604090205490565b348015610508575f80fd5b50600354610473906001600160a01b031681565b348015610527575f80fd5b50610283610536366004611414565b610aef565b348015610546575f80fd5b506105696105553660046112ee565b60016020525f908152604090205460ff1681565b60405190151581526020016102ae565b348015610584575f80fd5b506102a4600c5481565b348015610599575f80fd5b506102a460025481565b3480156105ae575f80fd5b506102836105bd3660046114d0565b610bae565b3480156105cd575f80fd5b506102836105dc3660046112ee565b610c05565b3480156105ec575f80fd5b506105f5610cec565b6040516102ae91906114fa565b34801561060d575f80fd5b5061062161061c3660046112ee565b610d78565b604080516001600160a01b03909516855260208501939093529183015260608201526080016102ae565b335f9081526001602052604090205460ff168061067157505f546001600160a01b031633145b61068d5760405162461bcd60e51b815260040161023e90611545565b6040805160a08101825260045467ffffffffffffffff8082168352600160401b820465ffffffffffff166020840152600160701b8204811693830193909352600160b01b81049092166060820152600160f01b90910460ff166080820152600a5461073a5760405162461bcd60e51b815260206004820152601a60248201527f4e6f2073686172657320746f206469737472696275746520746f000000000000604482015260640161023e565b8060600151816040015161074e919061156d565b67ffffffffffffffff164210156107a75760405162461bcd60e51b815260206004820152601a60248201527f546f6f206561726c7920666f7220646973747269627574696f6e000000000000604482015260640161023e565b5f816040015167ffffffffffffffff16826060015167ffffffffffffffff16426107d191906112b4565b6107db9190611295565b90505f826080015160ff1682600c546107f4919061127e565b6107fe9190611295565b9050826040015167ffffffffffffffff168261081a919061127e565b8360600181815161082b919061156d565b67ffffffffffffffff9081169091528451600480546020880151604089015160608a015160808b01519587166dffffffffffffffffffffffffffff1990941693909317600160401b65ffffffffffff90931692909202919091176fffffffffffffffffffffffffffffffff60701b1916600160701b9186169190910267ffffffffffffffff60b01b191617600160b01b91909416029290921760ff60f01b1916600160f01b60ff9092169190910217905550600c54600b546108ed90836112c7565b111561090657600b54600c5461090391906112b4565b90505b801561097d57600a546109349061092183600160801b610db4565b61092b9190611295565b60065490610e39565b60065560405181815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a2600b546109799082610e39565b600b555b505050565b6001600160a01b0381165f908152600760209081526040808320546009909252822054600654600160801b926109d4926109cf926109c9916109c49190610db4565b610e97565b90610ea5565b610edf565b6109de9190611295565b92915050565b6109ee335f610ef0565b50565b6109ee33610f5c565b5f546001600160a01b03163314610a235760405162461bcd60e51b815260040161023e9061158e565b6001600160a01b03919091165f908152600160205260409020805460ff1916911515919091179055565b5f546001600160a01b03163314610a765760405162461bcd60e51b815260040161023e9061158e565b5f80546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a35f80546001600160a01b0319169055565b5f6109de825b6001600160a01b0381165f908152600860205260408120546109de90610ae984610982565b90611093565b335f9081526001602052604090205460ff1680610b1557505f546001600160a01b031633145b610b315760405162461bcd60e51b815260040161023e90611545565b5f805f5b84518160ff161015610ba757848160ff1681518110610b5657610b566115c3565b60200260200101519250838160ff1681518110610b7557610b756115c3565b60200260200101519150610b8983836110d4565b610b94836001610ef0565b5080610b9f816115d7565b915050610b35565b5050505050565b335f9081526001602052604090205460ff1680610bd457505f546001600160a01b031633145b610bf05760405162461bcd60e51b815260040161023e90611545565b610bfa82826110d4565b61097d826001610ef0565b5f546001600160a01b03163314610c2e5760405162461bcd60e51b815260040161023e9061158e565b6001600160a01b038116610c935760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161023e565b5f80546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35f80546001600160a01b0319166001600160a01b0392909216919091179055565b60058054610cf9906115f5565b80601f0160208091040260200160405190810160405280929190818152602001828054610d25906115f5565b8015610d705780601f10610d4757610100808354040283529160200191610d70565b820191905f5260205f20905b815481529060010190602001808311610d5357829003601f168201915b505050505081565b805f8080610d8584610ac4565b9250610d9084610982565b6001600160a01b0385165f9081526009602052604090205494969395509392915050565b5f825f03610dc357505f6109de565b5f610dce838561127e565b905082610ddb8583611295565b14610e325760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b606482015260840161023e565b9392505050565b5f80610e4583856112c7565b905083811015610e325760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640161023e565b5f81818112156109de575f80fd5b5f80610eb1838561162d565b90505f8312158015610ec35750838112155b80610ed757505f83128015610ed757508381125b610e32575f80fd5b5f80821215610eec575f80fd5b5090565b5f80610efb84610f5c565b90508015610f5357821515846001600160a01b03167fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf09283604051610f4191815260200190565b60405180910390a360019150506109de565b505f9392505050565b5f80610f6783610ac4565b9050801561108b576001600160a01b0383165f90815260086020526040902054610f919082610e39565b6001600160a01b0384165f81815260086020526040908190209290925590517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d90610fdf9084815260200190565b60405180910390a25f836001600160a01b0316826040515f6040518083038185875af1925050503d805f8114611030576040519150601f19603f3d011682016040523d82523d5f602084013e611035565b606091505b5050905080611084576001600160a01b0384165f908152600860205260409020546110609083611093565b6001600160a01b039094165f90815260086020526040812094909455509192915050565b5092915050565b505f92915050565b5f610e3283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611168565b6001600160a01b0382165f9081526009602052604090208054908290558082111561112d575f6111048383611093565b905061111084826111a0565b80600a5f82825461112191906112c7565b9091555061097d915050565b8082101561097d575f6111408284611093565b905061114c84826111f8565b80600a5f82825461115d91906112b4565b909155505050505050565b5f818484111561118b5760405162461bcd60e51b815260040161023e91906114fa565b505f61119784866112b4565b95945050505050565b6111d96111bb6109c483600654610db490919063ffffffff16565b6001600160a01b0384165f9081526007602052604090205490611231565b6001600160a01b039092165f9081526007602052604090209190915550565b6111d96112136109c483600654610db490919063ffffffff16565b6001600160a01b0384165f9081526007602052604090205490610ea5565b5f8061123d8385611654565b90505f831215801561124f5750838113155b80610ed757505f83128015610ed75750838113610e32575f80fd5b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176109de576109de61126a565b5f826112af57634e487b7160e01b5f52601260045260245ffd5b500490565b818103818111156109de576109de61126a565b808201808211156109de576109de61126a565b6001600160a01b03811681146109ee575f80fd5b5f602082840312156112fe575f80fd5b8135610e32816112da565b5f806040838503121561131a575f80fd5b8235611325816112da565b915060208301358015158114611339575f80fd5b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561138157611381611344565b604052919050565b5f67ffffffffffffffff8211156113a2576113a2611344565b5060051b60200190565b5f82601f8301126113bb575f80fd5b813560206113d06113cb83611389565b611358565b82815260059290921b840181019181810190868411156113ee575f80fd5b8286015b8481101561140957803583529183019183016113f2565b509695505050505050565b5f8060408385031215611425575f80fd5b823567ffffffffffffffff8082111561143c575f80fd5b818501915085601f83011261144f575f80fd5b8135602061145f6113cb83611389565b82815260059290921b8401810191818101908984111561147d575f80fd5b948201945b838610156114a4578535611495816112da565b82529482019490820190611482565b965050860135925050808211156114b9575f80fd5b506114c6858286016113ac565b9150509250929050565b5f80604083850312156114e1575f80fd5b82356114ec816112da565b946020939093013593505050565b5f6020808352835180828501525f5b8181101561152557858101830151858201604001528201611509565b505f604082860101526040601f19601f8301168501019250505092915050565b6020808252600e908201526d139bdd08105d5d1a1bdc9a5e995960921b604082015260600190565b67ffffffffffffffff8181168382160190808211156110845761108461126a565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b5f60ff821660ff81036115ec576115ec61126a565b60010192915050565b600181811c9082168061160957607f821691505b60208210810361162757634e487b7160e01b5f52602260045260245ffd5b50919050565b8082018281125f83128015821682158216171561164c5761164c61126a565b505092915050565b8181035f8312801583831316838312821617156110845761108461126a56fea26469706673582212208619c278cffa41b5d7bf66198269c16b27fd1ef0bb1249fcc0dede8a61b9d9f764736f6c63430008140033a26469706673582212204387398b009b4eb8b1ce91ef9c904c1430f3a93daf0f03a0337db52ce71289b864736f6c63430008140033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000096ba97679ca4889c4a86e01e98bbfcb1cd194ed600000000000000000000000096ba97679ca4889c4a86e01e98bbfcb1cd194ed6000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000079d1e3eaf2192ee6df7ae89a579725343fe958cc
-----Decoded View---------------
Arg [0] : _feeReceiverETH (address): 0x96ba97679cA4889C4A86E01E98bBfCb1cD194eD6
Arg [1] : _feeReceiverTokens (address): 0x96ba97679cA4889C4A86E01E98bBfCb1cD194eD6
Arg [2] : _fee (uint256): 10
Arg [3] : _pointSetter (address): 0x79d1E3EAf2192Ee6df7AE89A579725343fE958cC
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 00000000000000000000000096ba97679ca4889c4a86e01e98bbfcb1cd194ed6
Arg [1] : 00000000000000000000000096ba97679ca4889c4a86e01e98bbfcb1cd194ed6
Arg [2] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [3] : 00000000000000000000000079d1e3eaf2192ee6df7ae89a579725343fe958cc
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.