Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 38 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim | 13242374 | 1263 days ago | IN | 0 ETH | 0.00692967 | ||||
Claim | 13242075 | 1263 days ago | IN | 0 ETH | 0.00447022 | ||||
Claim | 13242074 | 1263 days ago | IN | 0 ETH | 0.00399055 | ||||
Claim | 13242074 | 1263 days ago | IN | 0 ETH | 0.01559213 | ||||
Claim | 13241234 | 1263 days ago | IN | 0 ETH | 0.00665046 | ||||
Claim | 13241234 | 1263 days ago | IN | 0 ETH | 0.00664969 | ||||
Claim | 13240787 | 1263 days ago | IN | 0 ETH | 0.00571056 | ||||
Claim | 13240255 | 1263 days ago | IN | 0 ETH | 0.00593614 | ||||
Claim | 13240226 | 1263 days ago | IN | 0 ETH | 0.00654042 | ||||
Claim | 13240172 | 1263 days ago | IN | 0 ETH | 0.00565789 | ||||
Claim | 13240131 | 1263 days ago | IN | 0 ETH | 0.00482128 | ||||
Claim | 13240099 | 1263 days ago | IN | 0 ETH | 0.00623388 | ||||
Update | 13240082 | 1263 days ago | IN | 0 ETH | 0.00229387 | ||||
Update | 13238992 | 1263 days ago | IN | 0 ETH | 0.00143793 | ||||
Update | 13238547 | 1263 days ago | IN | 0 ETH | 0.00194955 | ||||
Restake | 13238524 | 1263 days ago | IN | 0 ETH | 0.00749519 | ||||
Restake | 13236458 | 1264 days ago | IN | 0 ETH | 0.00443126 | ||||
Restake | 13233662 | 1264 days ago | IN | 0 ETH | 0.00666409 | ||||
Restake | 13231395 | 1264 days ago | IN | 0 ETH | 0.01528849 | ||||
Restake | 13231110 | 1265 days ago | IN | 0 ETH | 0.00696175 | ||||
Unstake | 13229767 | 1265 days ago | IN | 0 ETH | 0.00286653 | ||||
Restake | 13229748 | 1265 days ago | IN | 0 ETH | 0.00307976 | ||||
Restake | 13229405 | 1265 days ago | IN | 0 ETH | 0.00419555 | ||||
Restake | 13215627 | 1267 days ago | IN | 0 ETH | 0.00540067 | ||||
Restake | 13202036 | 1269 days ago | IN | 0 ETH | 0.00869681 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
13197942 | 1270 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
InvestorV1Pool
Compiler Version
v0.8.7+commit.e28d00a7
Optimization Enabled:
Yes with 1000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.7; import "@openzeppelin/contracts/utils/math/SafeMath.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "./interfaces/IInvestorV1Pool.sol"; import "./interfaces/IInvestorV1PoolDeployer.sol"; contract InvestorV1Pool is IInvestorV1Pool { using SafeMath for uint256; using SafeERC20 for IERC20; address public constant HSF = 0xbA6B0dbb2bA8dAA8F5D6817946393Aef8D3A4487; address public constant USDT = 0xdAC17F958D2ee523a2206206994597C13D831ec7; address public immutable override factory; address public immutable override operator; string public override name; uint256 public immutable override maxCapacity; uint256 public immutable override minCapacity; uint256 public override oraclePrice; uint256 public immutable override startTime; uint256 public immutable override stageTime; uint256 public immutable override endTime; uint24 public immutable override fee; uint24 public immutable override interestRate; mapping(address => uint256) public override pooledAmt; mapping(address => uint256) public override restakeAmt; mapping(address => bool) public override claimed; address[] public override depositorList; address[] public override restakerList; uint256 public override funded = 0; uint256 public override exited = 0; uint256 public override restaked = 0; string public override collateralDocument; string public override collateralHash; string public override detailLink; enum PoolState { Created, Opened, Active, Reverted, Liquidated, Dishonored } PoolState private poolState = PoolState.Created; modifier onlyOperator() { require(operator == msg.sender, "InvestorV1Pool: not operator"); _; } constructor() { ( factory, operator, name, maxCapacity, minCapacity ) = IInvestorV1PoolDeployer(msg.sender).parameter1(); ( oraclePrice, startTime, stageTime, endTime, fee, interestRate ) = IInvestorV1PoolDeployer(msg.sender).parameter2(); } function depositors() public override view returns(uint256) { return depositorList.length; } function restakers() public override view returns(uint256) { return restakerList.length; } function getInfo(address _account) public override view returns (string memory, string memory, uint256, uint256, uint256, uint256, uint256, uint256, uint24, uint24) { uint256 mypool = pooledAmt[_account]; uint256 myrestake = restakeAmt[_account]; return (name, getPoolState(), maxCapacity, funded, restaked, exited, mypool, myrestake, fee, interestRate); } function getExtra() public override view returns (address, address, uint256, uint256, uint256, string memory, string memory, string memory) { return (operator, factory, oraclePrice, depositors(), restakers(), collateralDocument, collateralHash, detailLink); } function expectedRestakeRevenue(uint256 amount) public override view returns (uint256) { if(amount == 0) return 0; uint256 estimated = (10000 - fee); uint256 added = restaked.add(amount); estimated = estimated * (10000 + interestRate); estimated = exited.mul(estimated); estimated = estimated.div(100000000); estimated = estimated.mul(amount); estimated = estimated.div(added); return estimated; } function getPoolState() public override view returns (string memory) { if (poolState == PoolState.Opened) return "Opened"; if (poolState == PoolState.Active) return "Active"; if (poolState == PoolState.Created) return "Created"; if (poolState == PoolState.Dishonored) return "Dishonored"; if (poolState == PoolState.Liquidated) return "Liquidated"; if (poolState == PoolState.Reverted) return "Reverted"; return "Impossible"; } function removeDepositor(address user) internal { require(depositorList.length >= 1); if(depositorList[depositorList.length-1] == user) { depositorList.pop(); return; } for (uint i = 0; i < depositorList.length-1; i++){ if(depositorList[i] == user) { depositorList[i] = depositorList[depositorList.length-1]; depositorList.pop(); return; } } } function removeRestaker(address user) internal { require(restakerList.length >= 1); if(restakerList[restakerList.length-1] == user) { restakerList.pop(); return; } for (uint i = 0; i < restakerList.length-1; i++){ if(restakerList[i] == user) { restakerList[i] = restakerList[restakerList.length-1]; restakerList.pop(); return; } } } // State Update function update() public override returns (bool) { if(poolState == PoolState.Opened && block.timestamp > stageTime) { if(funded >= minCapacity) { poolState = PoolState.Active; exited = maxCapacity - funded; emit PoolActiviated(funded); } else { poolState = PoolState.Reverted; emit PoolReverted(minCapacity, funded); } return true; } if(poolState == PoolState.Active && block.timestamp > endTime) { uint256 liquidityFund = IERC20(USDT).balanceOf(address(this)); uint256 estimated = (10000 - fee); estimated = estimated * (10000 + interestRate); if(exited > 0 && restaked == 0) estimated = funded.mul(estimated); else estimated = maxCapacity.mul(estimated); estimated = estimated.div(100000000); if(liquidityFund >= estimated) { poolState = PoolState.Liquidated; emit PoolLiquidated(liquidityFund); } else { poolState = PoolState.Dishonored; emit PoolDishonored(estimated, liquidityFund); } } return true; } function setOraclePrice(uint256 _oraclePrice) public override onlyOperator returns (bool) { update(); require(poolState == PoolState.Opened || poolState == PoolState.Created, "InvestorV1Pool: pool not open"); require(_oraclePrice != oraclePrice, "InvestorV1Pool: oraclePrice not changed"); uint256 minDeposit = maxCapacity.mul(100); minDeposit = minDeposit.div(_oraclePrice); if (maxCapacity.mod(_oraclePrice) != 0) { minDeposit = minDeposit.add(1); } minDeposit = minDeposit.mul(10**12); if(oraclePrice > _oraclePrice) { minDeposit = minDeposit.sub(IERC20(HSF).balanceOf(address(this))); oraclePrice = _oraclePrice; IERC20(HSF).safeTransferFrom(msg.sender, address(this), minDeposit); emit Deposit(HSF, msg.sender, minDeposit); } else { uint256 operatorDeposits = IERC20(HSF).balanceOf(address(this)); minDeposit = operatorDeposits.sub(minDeposit); oraclePrice = _oraclePrice; IERC20(HSF).safeTransfer(msg.sender, minDeposit); emit Withdrawal(HSF, msg.sender, msg.sender, minDeposit); } emit OraclePriceChanged(_oraclePrice); return true; } function setPoolDetailLink(string memory _newLink) public override onlyOperator returns (bool) { detailLink = _newLink; emit PoolDetailLinkChanged(detailLink); return true; } function setColletralHash(string memory _newHash) public override onlyOperator returns (bool) { string memory oldHash = collateralHash; collateralHash = _newHash; emit ColletralHashChanged(oldHash, collateralHash); return true; } function setColletralLink(string memory _newLink) public override onlyOperator returns (bool) { string memory oldLink = collateralDocument; collateralDocument = _newLink; emit ColletralLinkChanged(oldLink, collateralDocument); return true; } function rescue(address target) public override onlyOperator returns (bool) { require(target != USDT && target != HSF, "InvestorV1Pool: USDT and HSF cannot be rescued"); require(IERC20(target).balanceOf(address(this)) > 0, "InvestorV1Pool: no target token here"); IERC20(target).safeTransfer(msg.sender, IERC20(target).balanceOf(address(this))); emit Withdrawal(target, msg.sender, msg.sender, IERC20(target).balanceOf(address(this))); return true; } function pullDeposit() public override onlyOperator returns (bool) { update(); require(poolState == PoolState.Active, "InvestorV1Pool: pool not active"); uint256 pooledTotal = IERC20(USDT).balanceOf(address(this)); IERC20(USDT).safeTransfer(msg.sender, pooledTotal); emit Withdrawal(USDT, msg.sender, msg.sender, pooledTotal); return true; } function liquidate() public override onlyOperator returns (bool) { update(); require(poolState == PoolState.Active, "InvestorV1Pool: pool not active"); uint256 estimated = (10000 - fee); estimated = estimated * (10000 + interestRate); if(exited > 0 && restaked == 0) estimated = funded.mul(estimated); else estimated = maxCapacity.mul(estimated); estimated = estimated.div(100000000); uint256 currentBalance = IERC20(USDT).balanceOf(address(this)); if(estimated <= currentBalance) return true; IERC20(USDT).safeTransferFrom(msg.sender, address(this), estimated.sub(currentBalance)); emit Deposit(USDT, msg.sender, estimated.sub(currentBalance)); return true; } function openPool() public override onlyOperator returns (bool) { update(); require(poolState == PoolState.Created, "InvestorV1Pool: not create state"); uint256 minDeposit = maxCapacity.mul(100); minDeposit = minDeposit.div(oraclePrice); if (maxCapacity.mod(oraclePrice) != 0) { minDeposit = minDeposit.add(1); } minDeposit = minDeposit.mul(10**12); poolState = PoolState.Opened; IERC20(HSF).safeTransferFrom(msg.sender, address(this), minDeposit); emit Deposit(HSF, msg.sender, minDeposit); emit PoolOpened(msg.sender, startTime, minDeposit); return true; } function closePool() public override onlyOperator returns (bool) { update(); require(poolState == PoolState.Liquidated, "InvestorV1Pool: pool not finalized"); uint256 stakedAmt = IERC20(HSF).balanceOf(address(this)); IERC20(HSF).safeTransfer(msg.sender, stakedAmt); emit Withdrawal(HSF, msg.sender, msg.sender, stakedAmt); return true; } function revertPool() public override onlyOperator returns (bool) { update(); require(poolState == PoolState.Opened || poolState == PoolState.Created, "InvestorV1Pool: not revertable state"); poolState = PoolState.Reverted; uint256 operatorDeposits = IERC20(HSF).balanceOf(address(this)); IERC20(HSF).safeTransfer(msg.sender, operatorDeposits); emit Withdrawal(HSF, msg.sender, msg.sender, operatorDeposits); emit PoolReverted(minCapacity, funded); return true; } function deposit(uint256 amount) public override returns (bool) { update(); require(poolState == PoolState.Opened, "InvestorV1Pool: pool not opened"); require(block.timestamp >= startTime, "InvestorV1Pool: not started yet"); require(amount > 0, "InvestorV1Pool: amount is zero"); require(funded.add(amount) <= maxCapacity, "InvestorV1Pool: deposit over capacity"); pooledAmt[msg.sender] = pooledAmt[msg.sender].add(amount); funded = funded.add(amount); depositorList.push(msg.sender); IERC20(USDT).safeTransferFrom(msg.sender, address(this), amount); emit Deposit(USDT, msg.sender, amount); return true; } function withdraw(uint256 amount, address to) public override returns (bool) { update(); require(poolState == PoolState.Opened || poolState == PoolState.Reverted, "InvestorV1Pool: pool not opened"); require(block.timestamp >= startTime, "InvestorV1Pool: not started yet"); require(pooledAmt[msg.sender] >= amount, "InvestorV1Pool: not enough deposit"); require(to != address(0), "InvestorV1Pool: to address is zero"); pooledAmt[msg.sender] = pooledAmt[msg.sender].sub(amount); funded = funded.sub(amount); if(pooledAmt[msg.sender]==0) { removeDepositor(msg.sender); } IERC20(USDT).safeTransfer(to, amount); emit Withdrawal(USDT, msg.sender, to, amount); return true; } function exit(uint256 amount, address to) public override returns (bool) { update(); require(poolState == PoolState.Active || poolState == PoolState.Dishonored, "InvestorV1Pool: pool not active"); require(pooledAmt[msg.sender] >= amount, "InvestorV1Pool: not enough deposit"); require(to != address(0), "InvestorV1Pool: to address is zero"); pooledAmt[msg.sender] = pooledAmt[msg.sender].sub(amount); exited = exited.add(amount); if(pooledAmt[msg.sender]==0) { removeDepositor(msg.sender); } uint256 exitAmt = amount.mul(10**14); exitAmt = exitAmt.div(oraclePrice); IERC20(HSF).safeTransfer(to, exitAmt); emit Exited(msg.sender, to, exitAmt); return true; } function claim(address to) public override returns (bool) { update(); require(poolState == PoolState.Liquidated, "InvestorV1Pool: pool not finalized"); require(!claimed[msg.sender], "InvestorV1Pool: already claimed"); require(to != address(0), "InvestorV1Pool: to address is zero"); uint256 liquidityTotal = (10000 - fee); liquidityTotal = liquidityTotal * (10000 + interestRate); liquidityTotal = maxCapacity.mul(liquidityTotal); liquidityTotal = liquidityTotal.div(100000000); uint256 poolClaim = 0; uint256 restakeClaim = 0; if(pooledAmt[msg.sender] > 0) { poolClaim = liquidityTotal.mul(pooledAmt[msg.sender]); poolClaim = poolClaim.div(maxCapacity); } if(restakeAmt[msg.sender] > 0 && exited > 0) { restakeClaim = liquidityTotal.mul(exited); restakeClaim = restakeClaim.mul(restakeAmt[msg.sender]); restakeClaim = restakeClaim.div(maxCapacity); restakeClaim = restakeClaim.div(restaked); } claimed[msg.sender] = true; require(poolClaim.add(restakeClaim) > 0, "InvestorV1Pool: no claim for you"); IERC20(USDT).safeTransfer(to, poolClaim.add(restakeClaim)); emit Claim(msg.sender, to, poolClaim.add(restakeClaim)); return true; } function restake(uint256 amount) public override returns (bool) { update(); require(poolState == PoolState.Active, "InvestorV1Pool: pool not active"); require(exited > 0, "InvestorV1Pool: no capacity for restake"); restakeAmt[msg.sender] = restakeAmt[msg.sender].add(amount); restaked = restaked.add(amount); restakerList.push(msg.sender); IERC20(HSF).safeTransferFrom(msg.sender, address(this), amount); emit Deposit(HSF, msg.sender, amount); return true; } function unstake(uint256 amount, address to) public override returns (bool) { update(); require(poolState == PoolState.Active || poolState == PoolState.Dishonored, "InvestorV1Pool: pool not active"); require(restakeAmt[msg.sender] >= amount, "InvestorV1Pool: not enough restake"); require(to != address(0), "InvestorV1Pool: to address is zero"); restakeAmt[msg.sender] = restakeAmt[msg.sender].sub(amount); restaked = restaked.sub(amount); if(restakeAmt[msg.sender]==0) { removeRestaker(msg.sender); } IERC20(HSF).safeTransfer(to, amount); emit Withdrawal(HSF, msg.sender, to, amount); return true; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../IERC20.sol"; import "../../../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ 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)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ 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)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.7; import './IInvestorV1PoolImmutables.sol'; import './IInvestorV1PoolState.sol'; import './IInvestorV1PoolDerivedState.sol'; import './IInvestorV1PoolActions.sol'; import './IInvestorV1PoolOperatorActions.sol'; import './IInvestorV1PoolEvents.sol'; interface IInvestorV1Pool is IInvestorV1PoolImmutables, IInvestorV1PoolState, IInvestorV1PoolDerivedState, IInvestorV1PoolActions, IInvestorV1PoolOperatorActions, IInvestorV1PoolEvents { }
// SPDX-License-Identifier: MIT pragma solidity 0.8.7; interface IInvestorV1PoolDeployer { function parameter1() external view returns ( address factory, address operator, string memory name, uint256 maxCapacity, uint256 minCapacity ); function parameter2() external view returns ( uint256 oraclePrice, uint256 startTime, uint256 stageTime, uint256 endTime, uint24 fee, uint24 interestRate ); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ 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"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ 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"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(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) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(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) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason 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 { // 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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.7; interface IInvestorV1PoolImmutables { function factory() external view returns (address); function operator() external view returns (address); function name() external view returns (string memory); function maxCapacity() external view returns (uint256); function minCapacity() external view returns (uint256); function startTime() external view returns (uint256); function stageTime() external view returns (uint256); function endTime() external view returns (uint256); function fee() external view returns (uint24); function interestRate() external view returns (uint24); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.7; interface IInvestorV1PoolState { function funded() external view returns (uint256); function exited() external view returns (uint256); function restaked() external view returns (uint256); function oraclePrice() external view returns (uint256); function getPoolState() external view returns (string memory); function pooledAmt(address user) external view returns (uint256); function restakeAmt(address user) external view returns (uint256); function claimed(address user) external view returns (bool); function collateralDocument() external view returns (string memory); function detailLink() external view returns (string memory); function collateralHash() external view returns (string memory); function depositors() external view returns (uint256); function restakers() external view returns (uint256); function depositorList(uint256 index) external view returns (address); function restakerList(uint256 index) external view returns (address); function getInfo(address _account) external view returns (string memory, string memory, uint256, uint256, uint256, uint256, uint256, uint256, uint24, uint24); function getExtra() external view returns (address, address, uint256, uint256, uint256, string memory, string memory, string memory); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.7; interface IInvestorV1PoolDerivedState { function expectedRestakeRevenue(uint256 amount) external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.7; interface IInvestorV1PoolActions { function update() external returns (bool); function deposit(uint256 amount) external returns (bool); function withdraw(uint256 amount, address to) external returns (bool); function exit(uint256 amount, address to) external returns (bool); function claim(address to) external returns (bool); function restake(uint256 amount) external returns (bool); function unstake(uint256 amount, address to) external returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.7; interface IInvestorV1PoolOperatorActions { function setOraclePrice(uint256 _oraclePrice) external returns (bool); function setColletralHash(string memory _newHash) external returns (bool); function setColletralLink(string memory _newLink) external returns (bool); function setPoolDetailLink(string memory _newLink) external returns (bool); function rescue(address target) external returns (bool); function pullDeposit() external returns (bool); function liquidate() external returns (bool); function openPool() external returns (bool); function closePool() external returns (bool); function revertPool() external returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.7; interface IInvestorV1PoolEvents { event PoolOpened(address operator, uint256 startTime, uint256 tokenDeposit); event PoolActiviated(uint256 funded); event PoolLiquidated(uint256 liquidityFund); event PoolDishonored(uint256 requiredFund, uint256 liquidityFund); event PoolReverted(uint256 minCapacity, uint256 funded); event OraclePriceChanged(uint256 oraclePrice); event PoolDetailLinkChanged(string link); event ColletralHashChanged(string oldHash, string newHash); event ColletralLinkChanged(string oldLink, string newLink); event Deposit(address token, address from, uint256 amount); event Withdrawal(address token, address from, address to, uint256 amount); event Claim(address from, address to, uint256 amount); event Exited(address from, address to, uint256 amount); }
{ "optimizer": { "enabled": true, "runs": 1000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"oldHash","type":"string"},{"indexed":false,"internalType":"string","name":"newHash","type":"string"}],"name":"ColletralHashChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"oldLink","type":"string"},{"indexed":false,"internalType":"string","name":"newLink","type":"string"}],"name":"ColletralLinkChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Exited","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oraclePrice","type":"uint256"}],"name":"OraclePriceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"funded","type":"uint256"}],"name":"PoolActiviated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"link","type":"string"}],"name":"PoolDetailLinkChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"requiredFund","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"liquidityFund","type":"uint256"}],"name":"PoolDishonored","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"liquidityFund","type":"uint256"}],"name":"PoolLiquidated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"uint256","name":"startTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenDeposit","type":"uint256"}],"name":"PoolOpened","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"minCapacity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"funded","type":"uint256"}],"name":"PoolReverted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawal","type":"event"},{"inputs":[],"name":"HSF","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"USDT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"claim","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"closePool","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"collateralDocument","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collateralHash","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"depositorList","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"depositors","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"detailLink","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"exit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"exited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"expectedRestakeRevenue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fee","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"funded","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getExtra","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"string","name":"","type":"string"},{"internalType":"string","name":"","type":"string"},{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"getInfo","outputs":[{"internalType":"string","name":"","type":"string"},{"internalType":"string","name":"","type":"string"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint24","name":"","type":"uint24"},{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPoolState","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"interestRate","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxCapacity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minCapacity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openPool","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oraclePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"pooledAmt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pullDeposit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"rescue","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"restake","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"restakeAmt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"restaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"restakerList","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"restakers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revertPool","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newHash","type":"string"}],"name":"setColletralHash","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newLink","type":"string"}],"name":"setColletralLink","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_oraclePrice","type":"uint256"}],"name":"setOraclePrice","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newLink","type":"string"}],"name":"setPoolDetailLink","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stageTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"unstake","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"update","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"withdraw","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6101a0604052600060078190556008819055600955600d805460ff191690553480156200002b57600080fd5b50336001600160a01b031663857eee1b6040518163ffffffff1660e01b815260040160006040518083038186803b1580156200006657600080fd5b505afa1580156200007b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620000a591908101906200025e565b60e081905260c08290528251620000c490600090602086019062000187565b50505050606090811b6001600160601b031990811660a05291901b16608052604080516310e1877160e01b8152905133916310e187719160048083019260c0929190829003018186803b1580156200011b57600080fd5b505afa15801562000130573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000156919062000373565b6001600160e81b031960e891821b81166101805291901b166101605261014052610120526101005260015562000423565b8280546200019590620003d0565b90600052602060002090601f016020900481019282620001b9576000855562000204565b82601f10620001d457805160ff191683800117855562000204565b8280016001018555821562000204579182015b8281111562000204578251825591602001919060010190620001e7565b506200021292915062000216565b5090565b5b8082111562000212576000815560010162000217565b80516001600160a01b03811681146200024557600080fd5b919050565b805162ffffff811681146200024557600080fd5b600080600080600060a086880312156200027757600080fd5b62000282866200022d565b94506020620002938188016200022d565b60408801519095506001600160401b0380821115620002b157600080fd5b818901915089601f830112620002c657600080fd5b815181811115620002db57620002db6200040d565b604051601f8201601f19908116603f011681019083821181831017156200030657620003066200040d565b816040528281528c868487010111156200031f57600080fd5b600093505b8284101562000343578484018601518185018701529285019262000324565b82841115620003555760008684830101525b60608c01516080909c01519a9d999c509a9998975050505050505050565b60008060008060008060c087890312156200038d57600080fd5b86519550602087015194506040870151935060608701519250620003b4608088016200024a565b9150620003c460a088016200024a565b90509295509295509295565b600181811c90821680620003e557607f821691505b602082108114156200040757634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b60805160601c60a05160601c60c05160e0516101005161012051610140516101605160e81c6101805160e81c61461e620005c66000396000818161051f01528181610c2f01528181611200015281816125b1015281816137de01526138e601526000818161069f01528181610bfc015281816111cd0152818161257e0152818161379201526138c50152600081816103f101526124c90152600081816103a9015261236d0152600081816104f8015281816107e10152818161276c01526135d70152600081816106c60152818161192701528181612396015261244b01526000818161047701528181610c6c01528181610cdf01528181610d5f01528181611268015281816123d3015281816126190152818161282f01528181612d3b01528181612d74015281816134b5015281816134fc0152613899015260008181610450015281816110e1015281816113db015281816114cf015281816116e60152818161198801528181611dde0152818161216201528181612bb601528181613278015281816133c9015261362f01526000818161060101526114f0015261461e6000f3fe608060405234801561001057600080fd5b50600436106103145760003560e01c80637c3a00fd116101a7578063c54e44eb116100ee578063e1b0b70611610097578063f491b2eb11610071578063f491b2eb146106f9578063ff9d11281461070c578063ffdd5cf11461071f57600080fd5b8063e1b0b706146106c1578063eb5797a4146106e8578063f3a504f2146106f057600080fd5b8063cff40759116100c8578063cff4075914610674578063dd6d90ce14610687578063ddca3f431461069a57600080fd5b8063c54e44eb14610623578063c65cd86d1461063e578063c884ef831461065157600080fd5b8063a992e6da11610150578063bce1b5201161012a578063bce1b520146105ce578063c0695af1146105e1578063c45a0155146105fc57600080fd5b8063a992e6da146105ab578063aaa46688146105b3578063b6b55f25146105bb57600080fd5b806399d7a0f41161018157806399d7a0f41461057b5780639f8280cc14610583578063a2e62045146105a357600080fd5b80637c3a00fd1461051a5780638381e18214610555578063839006f21461056857600080fd5b80634178bb3b1161026b5780635ce6c32711610214578063668aa824116101ee578063668aa824146104d75780637267b828146104e057806378e97925146104f357600080fd5b80635ce6c327146104be5780636603b86f146104c757806366805de5146104cf57600080fd5b806359b6a0c91161024557806359b6a0c9146104725780635c0428b8146104995780635c925b9d146104a257600080fd5b80634178bb3b1461043b5780634876c97714610443578063570ca7351461044b57600080fd5b806328a07025116102cd5780633197cbb6116102a75780633197cbb6146103ec5780633d289376146104135780633e5e89be1461043357600080fd5b806328a070251461039c57806329942ed4146103a45780632ecfbe59146103d957600080fd5b80631400a85e116102fe5780631400a85e146103565780631e83409a14610381578063217ac2371461039457600080fd5b8062f714ce1461031957806306fdde0314610341575b600080fd5b61032c6103273660046141d1565b610748565b60405190151581526020015b60405180910390f35b610349610a00565b604051610338919061435b565b61036961036436600461419f565b610a8e565b6040516001600160a01b039091168152602001610338565b61032c61038f3660046140b1565b610ab8565b610349610e99565b61032c6110dd565b6103cb7f000000000000000000000000000000000000000000000000000000000000000081565b604051908152602001610338565b61032c6103e73660046140ee565b6113d7565b6103cb7f000000000000000000000000000000000000000000000000000000000000000081565b6103cb6104213660046140b1565b60026020526000908152604090205481565b6103496114a6565b6103496114b3565b6006546103cb565b6103697f000000000000000000000000000000000000000000000000000000000000000081565b6103cb7f000000000000000000000000000000000000000000000000000000000000000081565b6103cb60095481565b6104aa6114c0565b6040516103389897969594939291906142e5565b6103cb60085481565b61032c6116e2565b61032c611984565b6103cb60015481565b6103696104ee36600461419f565b611b79565b6103cb7f000000000000000000000000000000000000000000000000000000000000000081565b6105417f000000000000000000000000000000000000000000000000000000000000000081565b60405162ffffff9091168152602001610338565b61032c6105633660046141d1565b611b89565b61032c6105763660046140b1565b611dda565b61032c61215e565b6103cb6105913660046140b1565b60036020526000908152604090205481565b61032c612348565b6103496126ec565b6005546103cb565b61032c6105c936600461419f565b6126f9565b61032c6105dc36600461419f565b6129cb565b61036973ba6b0dbb2ba8daa8f5d6817946393aef8d3a448781565b6103697f000000000000000000000000000000000000000000000000000000000000000081565b61036973dac17f958d2ee523a2206206994597c13d831ec781565b61032c61064c36600461419f565b612bb2565b61032c61065f3660046140b1565b60046020526000908152604090205460ff1681565b61032c6106823660046141d1565b613023565b61032c6106953660046140ee565b613274565b6105417f000000000000000000000000000000000000000000000000000000000000000081565b6103cb7f000000000000000000000000000000000000000000000000000000000000000081565b61032c6133c5565b6103cb60075481565b61032c6107073660046140ee565b61362b565b6103cb61071a36600461419f565b61377c565b61073261072d3660046140b1565b613854565b6040516103389a9998979695949392919061436e565b6000610752612348565b506001600d5460ff16600581111561076c5761076c614590565b148061078e57506003600d5460ff16600581111561078c5761078c614590565b145b6107df5760405162461bcd60e51b815260206004820152601f60248201527f496e766573746f725631506f6f6c3a20706f6f6c206e6f74206f70656e65640060448201526064015b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000042101561084f5760405162461bcd60e51b815260206004820152601f60248201527f496e766573746f725631506f6f6c3a206e6f742073746172746564207965740060448201526064016107d6565b336000908152600260205260409020548311156108b95760405162461bcd60e51b815260206004820152602260248201527f496e766573746f725631506f6f6c3a206e6f7420656e6f756768206465706f736044820152611a5d60f21b60648201526084016107d6565b6001600160a01b03821661091a5760405162461bcd60e51b815260206004820152602260248201527f496e766573746f725631506f6f6c3a20746f2061646472657373206973207a65604482015261726f60f01b60648201526084016107d6565b3360009081526002602052604090205461093490846139b4565b3360009081526002602052604090205560075461095190846139b4565b6007553360009081526002602052604090205461097157610971336139c7565b61099073dac17f958d2ee523a2206206994597c13d831ec78385613b86565b6040805173dac17f958d2ee523a2206206994597c13d831ec781523360208201526001600160a01b03841691810191909152606081018490527f342e7ff505a8a0364cd0dc2ff195c315e43bce86b204846ecd36913e117b109e906080015b60405180910390a150600192915050565b60008054610a0d906144fa565b80601f0160208091040260200160405190810160405280929190818152602001828054610a39906144fa565b8015610a865780601f10610a5b57610100808354040283529160200191610a86565b820191906000526020600020905b815481529060010190602001808311610a6957829003601f168201915b505050505081565b60058181548110610a9e57600080fd5b6000918252602090912001546001600160a01b0316905081565b6000610ac2612348565b506004600d5460ff166005811115610adc57610adc614590565b14610b345760405162461bcd60e51b815260206004820152602260248201527f496e766573746f725631506f6f6c3a20706f6f6c206e6f742066696e616c697a604482015261195960f21b60648201526084016107d6565b3360009081526004602052604090205460ff1615610b945760405162461bcd60e51b815260206004820152601f60248201527f496e766573746f725631506f6f6c3a20616c726561647920636c61696d65640060448201526064016107d6565b6001600160a01b038216610bf55760405162461bcd60e51b815260206004820152602260248201527f496e766573746f725631506f6f6c3a20746f2061646472657373206973207a65604482015261726f60f01b60648201526084016107d6565b6000610c237f0000000000000000000000000000000000000000000000000000000000000000612710614493565b62ffffff169050610c567f0000000000000000000000000000000000000000000000000000000000000000612710614421565b610c659062ffffff1682614474565b9050610c917f000000000000000000000000000000000000000000000000000000000000000082613c34565b9050610ca1816305f5e100613c40565b3360009081526002602052604081205491925090819015610d065733600090815260026020526040902054610cd7908490613c34565b9150610d03827f0000000000000000000000000000000000000000000000000000000000000000613c40565b91505b3360009081526003602052604090205415801590610d2657506000600854115b15610d9d57600854610d39908490613c34565b33600090815260036020526040902054909150610d57908290613c34565b9050610d83817f0000000000000000000000000000000000000000000000000000000000000000613c40565b9050610d9a60095482613c4090919063ffffffff16565b90505b336000908152600460205260408120805460ff19166001179055610dc18383613c4c565b11610e0e5760405162461bcd60e51b815260206004820181905260248201527f496e766573746f725631506f6f6c3a206e6f20636c61696d20666f7220796f7560448201526064016107d6565b610e3885610e1c8484613c4c565b73dac17f958d2ee523a2206206994597c13d831ec79190613b86565b7f70eb43c4a8ae8c40502dcf22436c509c28d6ff421cf07c491be56984bd9870683386610e658585613c4c565b604080516001600160a01b0394851681529390921660208401529082015260600160405180910390a1506001949350505050565b60606001600d5460ff166005811115610eb457610eb4614590565b1415610ef2575060408051808201909152600681527f4f70656e65640000000000000000000000000000000000000000000000000000602082015290565b6002600d5460ff166005811115610f0b57610f0b614590565b1415610f49575060408051808201909152600681527f4163746976650000000000000000000000000000000000000000000000000000602082015290565b6000600d5460ff166005811115610f6257610f62614590565b1415610fa0575060408051808201909152600781527f4372656174656400000000000000000000000000000000000000000000000000602082015290565b6005600d5460ff166005811115610fb957610fb9614590565b1415610ff7575060408051808201909152600a81527f446973686f6e6f72656400000000000000000000000000000000000000000000602082015290565b6004600d5460ff16600581111561101057611010614590565b141561104e575060408051808201909152600a81527f4c69717569646174656400000000000000000000000000000000000000000000602082015290565b6003600d5460ff16600581111561106757611067614590565b14156110a5575060408051808201909152600881527f5265766572746564000000000000000000000000000000000000000000000000602082015290565b5060408051808201909152600a81527f496d706f737369626c6500000000000000000000000000000000000000000000602082015290565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633146111575760405162461bcd60e51b815260206004820152601c60248201527f496e766573746f725631506f6f6c3a206e6f74206f70657261746f720000000060448201526064016107d6565b61115f612348565b506002600d5460ff16600581111561117957611179614590565b146111c65760405162461bcd60e51b815260206004820152601f60248201527f496e766573746f725631506f6f6c3a20706f6f6c206e6f74206163746976650060448201526064016107d6565b60006111f47f0000000000000000000000000000000000000000000000000000000000000000612710614493565b62ffffff1690506112277f0000000000000000000000000000000000000000000000000000000000000000612710614421565b6112369062ffffff1682614474565b9050600060085411801561124a5750600954155b156112635760075461125c9082613c34565b9050611290565b61128d7f000000000000000000000000000000000000000000000000000000000000000082613c34565b90505b61129e816305f5e100613c40565b6040516370a0823160e01b815230600482015290915060009073dac17f958d2ee523a2206206994597c13d831ec7906370a082319060240160206040518083038186803b1580156112ee57600080fd5b505afa158015611302573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061132691906141b8565b90508082116113385760019250505090565b611364333061134785856139b4565b73dac17f958d2ee523a2206206994597c13d831ec7929190613c58565b7f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f6273dac17f958d2ee523a2206206994597c13d831ec7336113a585856139b4565b604080516001600160a01b0394851681529390921660208401529082015260600160405180910390a160019250505090565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633146114515760405162461bcd60e51b815260206004820152601c60248201527f496e766573746f725631506f6f6c3a206e6f74206f70657261746f720000000060448201526064016107d6565b815161146490600c906020850190614001565b507faa0ff26ab50884aa4da188d89239cdcc32b5dfa5b8700c33d280b3af25ad611d600c604051611495919061440e565b60405180910390a15060015b919050565b600a8054610a0d906144fa565b600b8054610a0d906144fa565b600080600080600060608060607f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000060015461151b60055490565b600654600a600b600c828054611530906144fa565b80601f016020809104026020016040519081016040528092919081815260200182805461155c906144fa565b80156115a95780601f1061157e576101008083540402835291602001916115a9565b820191906000526020600020905b81548152906001019060200180831161158c57829003601f168201915b505050505092508180546115bc906144fa565b80601f01602080910402602001604051908101604052809291908181526020018280546115e8906144fa565b80156116355780601f1061160a57610100808354040283529160200191611635565b820191906000526020600020905b81548152906001019060200180831161161857829003601f168201915b50505050509150808054611648906144fa565b80601f0160208091040260200160405190810160405280929190818152602001828054611674906144fa565b80156116c15780601f10611696576101008083540402835291602001916116c1565b820191906000526020600020905b8154815290600101906020018083116116a457829003601f168201915b50505050509050975097509750975097509750975097509091929394959697565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316331461175c5760405162461bcd60e51b815260206004820152601c60248201527f496e766573746f725631506f6f6c3a206e6f74206f70657261746f720000000060448201526064016107d6565b611764612348565b506001600d5460ff16600581111561177e5761177e614590565b14806117a057506000600d5460ff16600581111561179e5761179e614590565b145b6118115760405162461bcd60e51b8152602060048201526024808201527f496e766573746f725631506f6f6c3a206e6f742072657665727461626c65207360448201527f746174650000000000000000000000000000000000000000000000000000000060648201526084016107d6565b600d805460ff191660031790556040516370a0823160e01b815230600482015260009073ba6b0dbb2ba8daa8f5d6817946393aef8d3a4487906370a082319060240160206040518083038186803b15801561186b57600080fd5b505afa15801561187f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a391906141b8565b90506118c473ba6b0dbb2ba8daa8f5d6817946393aef8d3a44873383613b86565b6040805173ba6b0dbb2ba8daa8f5d6817946393aef8d3a448781523360208201819052818301526060810183905290517f342e7ff505a8a0364cd0dc2ff195c315e43bce86b204846ecd36913e117b109e9181900360800190a1600754604080517f0000000000000000000000000000000000000000000000000000000000000000815260208101929092527f7c64d86d5ba045525890af71998709b40afa070fe3680693c0899aeb5926568491015b60405180910390a1600191505090565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633146119fe5760405162461bcd60e51b815260206004820152601c60248201527f496e766573746f725631506f6f6c3a206e6f74206f70657261746f720000000060448201526064016107d6565b611a06612348565b506004600d5460ff166005811115611a2057611a20614590565b14611a785760405162461bcd60e51b815260206004820152602260248201527f496e766573746f725631506f6f6c3a20706f6f6c206e6f742066696e616c697a604482015261195960f21b60648201526084016107d6565b6040516370a0823160e01b815230600482015260009073ba6b0dbb2ba8daa8f5d6817946393aef8d3a4487906370a082319060240160206040518083038186803b158015611ac557600080fd5b505afa158015611ad9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611afd91906141b8565b9050611b1e73ba6b0dbb2ba8daa8f5d6817946393aef8d3a44873383613b86565b6040805173ba6b0dbb2ba8daa8f5d6817946393aef8d3a44878152336020820181905291810191909152606081018290527f342e7ff505a8a0364cd0dc2ff195c315e43bce86b204846ecd36913e117b109e90608001611974565b60068181548110610a9e57600080fd5b6000611b93612348565b506002600d5460ff166005811115611bad57611bad614590565b1480611bcf57506005600d5460ff166005811115611bcd57611bcd614590565b145b611c1b5760405162461bcd60e51b815260206004820152601f60248201527f496e766573746f725631506f6f6c3a20706f6f6c206e6f74206163746976650060448201526064016107d6565b33600090815260036020526040902054831115611ca05760405162461bcd60e51b815260206004820152602260248201527f496e766573746f725631506f6f6c3a206e6f7420656e6f75676820726573746160448201527f6b6500000000000000000000000000000000000000000000000000000000000060648201526084016107d6565b6001600160a01b038216611d015760405162461bcd60e51b815260206004820152602260248201527f496e766573746f725631506f6f6c3a20746f2061646472657373206973207a65604482015261726f60f01b60648201526084016107d6565b33600090815260036020526040902054611d1b90846139b4565b33600090815260036020526040902055600954611d3890846139b4565b60095533600090815260036020526040902054611d5857611d5833613caf565b611d7773ba6b0dbb2ba8daa8f5d6817946393aef8d3a44878385613b86565b6040805173ba6b0dbb2ba8daa8f5d6817946393aef8d3a448781523360208201526001600160a01b03841691810191909152606081018490527f342e7ff505a8a0364cd0dc2ff195c315e43bce86b204846ecd36913e117b109e906080016109ef565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163314611e545760405162461bcd60e51b815260206004820152601c60248201527f496e766573746f725631506f6f6c3a206e6f74206f70657261746f720000000060448201526064016107d6565b6001600160a01b03821673dac17f958d2ee523a2206206994597c13d831ec714801590611e9e57506001600160a01b03821673ba6b0dbb2ba8daa8f5d6817946393aef8d3a448714155b611f105760405162461bcd60e51b815260206004820152602e60248201527f496e766573746f725631506f6f6c3a205553445420616e64204853462063616e60448201527f6e6f74206265207265736375656400000000000000000000000000000000000060648201526084016107d6565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a082319060240160206040518083038186803b158015611f5257600080fd5b505afa158015611f66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8a91906141b8565b11611ffc5760405162461bcd60e51b8152602060048201526024808201527f496e766573746f725631506f6f6c3a206e6f2074617267657420746f6b656e2060448201527f686572650000000000000000000000000000000000000000000000000000000060648201526084016107d6565b6040516370a0823160e01b815230600482015261208a9033906001600160a01b038516906370a082319060240160206040518083038186803b15801561204157600080fd5b505afa158015612055573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061207991906141b8565b6001600160a01b0385169190613b86565b6040516370a0823160e01b81523060048201527f342e7ff505a8a0364cd0dc2ff195c315e43bce86b204846ecd36913e117b109e908390339081906001600160a01b038416906370a082319060240160206040518083038186803b1580156120f157600080fd5b505afa158015612105573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061212991906141b8565b60405161149594939291906001600160a01b039485168152928416602084015292166040820152606081019190915260800190565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633146121d85760405162461bcd60e51b815260206004820152601c60248201527f496e766573746f725631506f6f6c3a206e6f74206f70657261746f720000000060448201526064016107d6565b6121e0612348565b506002600d5460ff1660058111156121fa576121fa614590565b146122475760405162461bcd60e51b815260206004820152601f60248201527f496e766573746f725631506f6f6c3a20706f6f6c206e6f74206163746976650060448201526064016107d6565b6040516370a0823160e01b815230600482015260009073dac17f958d2ee523a2206206994597c13d831ec7906370a082319060240160206040518083038186803b15801561229457600080fd5b505afa1580156122a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122cc91906141b8565b90506122ed73dac17f958d2ee523a2206206994597c13d831ec73383613b86565b6040805173dac17f958d2ee523a2206206994597c13d831ec78152336020820181905291810191909152606081018290527f342e7ff505a8a0364cd0dc2ff195c315e43bce86b204846ecd36913e117b109e90608001611974565b60006001600d5460ff16600581111561236357612363614590565b14801561238f57507f000000000000000000000000000000000000000000000000000000000000000042115b156124a6577f00000000000000000000000000000000000000000000000000000000000000006007541061243557600d805460ff191660021790556007546123f7907f00000000000000000000000000000000000000000000000000000000000000006144b7565b6008556007546040519081527ff4e709ae88b8c450ce2b6f255aece15d83282f77351735003b4b091a79e972f29060200160405180910390a16124a0565b600d805460ff19166003179055600754604080517f0000000000000000000000000000000000000000000000000000000000000000815260208101929092527f7c64d86d5ba045525890af71998709b40afa070fe3680693c0899aeb59265684910160405180910390a15b50600190565b6002600d5460ff1660058111156124bf576124bf614590565b1480156124eb57507f000000000000000000000000000000000000000000000000000000000000000042115b156124a0576040516370a0823160e01b815230600482015260009073dac17f958d2ee523a2206206994597c13d831ec7906370a082319060240160206040518083038186803b15801561253d57600080fd5b505afa158015612551573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061257591906141b8565b905060006125a57f0000000000000000000000000000000000000000000000000000000000000000612710614493565b62ffffff1690506125d87f0000000000000000000000000000000000000000000000000000000000000000612710614421565b6125e79062ffffff1682614474565b905060006008541180156125fb5750600954155b156126145760075461260d9082613c34565b9050612641565b61263e7f000000000000000000000000000000000000000000000000000000000000000082613c34565b90505b61264f816305f5e100613c40565b905080821061269d57600d805460ff191660041790556040518281527ff22938d29944010ebbf93c4b810b830fcb603d4de90ac510080e10d59f2a46c89060200160405180910390a16126e4565b600d805460ff1916600517905560408051828152602081018490527f773d8dddcb5934119d33dfd68c32aa3b9b74369d9c96eca4749311b1678517d3910160405180910390a15b505050600190565b600c8054610a0d906144fa565b6000612703612348565b506001600d5460ff16600581111561271d5761271d614590565b1461276a5760405162461bcd60e51b815260206004820152601f60248201527f496e766573746f725631506f6f6c3a20706f6f6c206e6f74206f70656e65640060448201526064016107d6565b7f00000000000000000000000000000000000000000000000000000000000000004210156127da5760405162461bcd60e51b815260206004820152601f60248201527f496e766573746f725631506f6f6c3a206e6f742073746172746564207965740060448201526064016107d6565b6000821161282a5760405162461bcd60e51b815260206004820152601e60248201527f496e766573746f725631506f6f6c3a20616d6f756e74206973207a65726f000060448201526064016107d6565b6007547f0000000000000000000000000000000000000000000000000000000000000000906128599084613c4c565b11156128cd5760405162461bcd60e51b815260206004820152602560248201527f496e766573746f725631506f6f6c3a206465706f736974206f7665722063617060448201527f616369747900000000000000000000000000000000000000000000000000000060648201526084016107d6565b336000908152600260205260409020546128e79083613c4c565b336000908152600260205260409020556007546129049083613c4c565b600755600580546001810182556000919091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db001805473ffffffffffffffffffffffffffffffffffffffff19163390811790915561297a9073dac17f958d2ee523a2206206994597c13d831ec7903085613c58565b6040805173dac17f958d2ee523a2206206994597c13d831ec781523360208201529081018390527f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f6290606001611495565b60006129d5612348565b506002600d5460ff1660058111156129ef576129ef614590565b14612a3c5760405162461bcd60e51b815260206004820152601f60248201527f496e766573746f725631506f6f6c3a20706f6f6c206e6f74206163746976650060448201526064016107d6565b600060085411612ab45760405162461bcd60e51b815260206004820152602760248201527f496e766573746f725631506f6f6c3a206e6f20636170616369747920666f722060448201527f72657374616b650000000000000000000000000000000000000000000000000060648201526084016107d6565b33600090815260036020526040902054612ace9083613c4c565b33600090815260036020526040902055600954612aeb9083613c4c565b600955600680546001810182556000919091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f01805473ffffffffffffffffffffffffffffffffffffffff191633908117909155612b619073ba6b0dbb2ba8daa8f5d6817946393aef8d3a4487903085613c58565b6040805173ba6b0dbb2ba8daa8f5d6817946393aef8d3a448781523360208201529081018390527f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f6290606001611495565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163314612c2c5760405162461bcd60e51b815260206004820152601c60248201527f496e766573746f725631506f6f6c3a206e6f74206f70657261746f720000000060448201526064016107d6565b612c34612348565b506001600d5460ff166005811115612c4e57612c4e614590565b1480612c7057506000600d5460ff166005811115612c6e57612c6e614590565b145b612cbc5760405162461bcd60e51b815260206004820152601d60248201527f496e766573746f725631506f6f6c3a20706f6f6c206e6f74206f70656e00000060448201526064016107d6565b600154821415612d345760405162461bcd60e51b815260206004820152602760248201527f496e766573746f725631506f6f6c3a206f7261636c655072696365206e6f742060448201527f6368616e6765640000000000000000000000000000000000000000000000000060648201526084016107d6565b6000612d617f00000000000000000000000000000000000000000000000000000000000000006064613c34565b9050612d6d8184613c40565b9050612d997f000000000000000000000000000000000000000000000000000000000000000084613e05565b15612dac57612da9816001613c4c565b90505b612dbb8164e8d4a51000613c34565b9050826001541115612ed4576040516370a0823160e01b8152306004820152612e549073ba6b0dbb2ba8daa8f5d6817946393aef8d3a4487906370a082319060240160206040518083038186803b158015612e1557600080fd5b505afa158015612e29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e4d91906141b8565b82906139b4565b60018490559050612e7b73ba6b0dbb2ba8daa8f5d6817946393aef8d3a4487333084613c58565b6040805173ba6b0dbb2ba8daa8f5d6817946393aef8d3a448781523360208201529081018290527f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f629060600160405180910390a1612fe7565b6040516370a0823160e01b815230600482015260009073ba6b0dbb2ba8daa8f5d6817946393aef8d3a4487906370a082319060240160206040518083038186803b158015612f2157600080fd5b505afa158015612f35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f5991906141b8565b9050612f6581836139b4565b60018590559150612f8b73ba6b0dbb2ba8daa8f5d6817946393aef8d3a44873384613b86565b6040805173ba6b0dbb2ba8daa8f5d6817946393aef8d3a448781523360208201819052818301526060810184905290517f342e7ff505a8a0364cd0dc2ff195c315e43bce86b204846ecd36913e117b109e9181900360800190a1505b6040518381527f51c6eaaaa11f3a57f136cd3fbce664dfa4da3c42210ab46757f048532068e0ce9060200160405180910390a150600192915050565b600061302d612348565b506002600d5460ff16600581111561304757613047614590565b148061306957506005600d5460ff16600581111561306757613067614590565b145b6130b55760405162461bcd60e51b815260206004820152601f60248201527f496e766573746f725631506f6f6c3a20706f6f6c206e6f74206163746976650060448201526064016107d6565b3360009081526002602052604090205483111561311f5760405162461bcd60e51b815260206004820152602260248201527f496e766573746f725631506f6f6c3a206e6f7420656e6f756768206465706f736044820152611a5d60f21b60648201526084016107d6565b6001600160a01b0382166131805760405162461bcd60e51b815260206004820152602260248201527f496e766573746f725631506f6f6c3a20746f2061646472657373206973207a65604482015261726f60f01b60648201526084016107d6565b3360009081526002602052604090205461319a90846139b4565b336000908152600260205260409020556008546131b79084613c4c565b600855336000908152600260205260409020546131d7576131d7336139c7565b60006131e984655af3107a4000613c34565b905061320060015482613c4090919063ffffffff16565b905061322173ba6b0dbb2ba8daa8f5d6817946393aef8d3a44878483613b86565b604080513381526001600160a01b03851660208201529081018290527f104ad9ab27213fcc307f2308fc015959def8986f04d9475d82c5f32ab9c8d83b9060600160405180910390a15060019392505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633146132ee5760405162461bcd60e51b815260206004820152601c60248201527f496e766573746f725631506f6f6c3a206e6f74206f70657261746f720000000060448201526064016107d6565b6000600b80546132fd906144fa565b80601f0160208091040260200160405190810160405280929190818152602001828054613329906144fa565b80156133765780601f1061334b57610100808354040283529160200191613376565b820191906000526020600020905b81548152906001019060200180831161335957829003601f168201915b5050865193945061339293600b93506020880192509050614001565b507fbf3c9539cc784485849e00ee75d20bc0ccec32277a9db906764208ccdba82a6781600b6040516109ef9291906143e0565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316331461343f5760405162461bcd60e51b815260206004820152601c60248201527f496e766573746f725631506f6f6c3a206e6f74206f70657261746f720000000060448201526064016107d6565b613447612348565b506000600d5460ff16600581111561346157613461614590565b146134ae5760405162461bcd60e51b815260206004820181905260248201527f496e766573746f725631506f6f6c3a206e6f742063726561746520737461746560448201526064016107d6565b60006134db7f00000000000000000000000000000000000000000000000000000000000000006064613c34565b90506134f260015482613c4090919063ffffffff16565b90506135296001547f0000000000000000000000000000000000000000000000000000000000000000613e0590919063ffffffff16565b1561353c57613539816001613c4c565b90505b61354b8164e8d4a51000613c34565b600d805460ff19166001179055905061357a73ba6b0dbb2ba8daa8f5d6817946393aef8d3a4487333084613c58565b6040805173ba6b0dbb2ba8daa8f5d6817946393aef8d3a448781523360208201529081018290527f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f629060600160405180910390a1604080513381527f000000000000000000000000000000000000000000000000000000000000000060208201529081018290527ff9d60b8197870d29952728aa5990c3e1a21ca5bd20ba5ba4ca2610cd2530dfa490606001611974565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633146136a55760405162461bcd60e51b815260206004820152601c60248201527f496e766573746f725631506f6f6c3a206e6f74206f70657261746f720000000060448201526064016107d6565b6000600a80546136b4906144fa565b80601f01602080910402602001604051908101604052809291908181526020018280546136e0906144fa565b801561372d5780601f106137025761010080835404028352916020019161372d565b820191906000526020600020905b81548152906001019060200180831161371057829003601f168201915b5050865193945061374993600a93506020880192509050614001565b507f6714abb209a7aa5abff3a625d8a54e3fa31055a01c0ad6b03947529f05cbc7fe81600a6040516109ef9291906143e0565b60008161378b57506000919050565b60006137b97f0000000000000000000000000000000000000000000000000000000000000000612710614493565b62ffffff16905060006137d784600954613c4c90919063ffffffff16565b90506138057f0000000000000000000000000000000000000000000000000000000000000000612710614421565b6138149062ffffff1683614474565b6008549092506138249083613c34565b9150613834826305f5e100613c40565b91506138408285613c34565b915061384c8282613c40565b949350505050565b6001600160a01b03811660009081526002602090815260408083205460039092528220546060928392909182918291829182918291829182919082613897610e99565b7f000000000000000000000000000000000000000000000000000000000000000060075460095460085487877f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000898054613911906144fa565b80601f016020809104026020016040519081016040528092919081815260200182805461393d906144fa565b801561398a5780601f1061395f5761010080835404028352916020019161398a565b820191906000526020600020905b81548152906001019060200180831161396d57829003601f168201915b505050505099509b509b509b509b509b509b509b509b509b509b5050509193959799509193959799565b60006139c082846144b7565b9392505050565b600554600111156139d757600080fd5b600580546001600160a01b03831691906139f3906001906144b7565b81548110613a0357613a036145bc565b6000918252602090912001546001600160a01b03161415613a61576005805480613a2f57613a2f6145a6565b6000828152602090208101600019908101805473ffffffffffffffffffffffffffffffffffffffff1916905501905550565b60005b600554613a73906001906144b7565b811015613b8257816001600160a01b031660058281548110613a9757613a976145bc565b6000918252602090912001546001600160a01b03161415613b705760058054613ac2906001906144b7565b81548110613ad257613ad26145bc565b600091825260209091200154600580546001600160a01b039092169183908110613afe57613afe6145bc565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506005805480613b3d57613b3d6145a6565b6000828152602090208101600019908101805473ffffffffffffffffffffffffffffffffffffffff191690550190555050565b80613b7a81614535565b915050613a64565b5050565b6040516001600160a01b038316602482015260448101829052613c2f9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613e11565b505050565b60006139c08284614474565b60006139c08284614460565b60006139c08284614448565b6040516001600160a01b0380851660248301528316604482015260648101829052613ca99085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401613bcb565b50505050565b60065460011115613cbf57600080fd5b600680546001600160a01b0383169190613cdb906001906144b7565b81548110613ceb57613ceb6145bc565b6000918252602090912001546001600160a01b03161415613d17576006805480613a2f57613a2f6145a6565b60005b600654613d29906001906144b7565b811015613b8257816001600160a01b031660068281548110613d4d57613d4d6145bc565b6000918252602090912001546001600160a01b03161415613df35760068054613d78906001906144b7565b81548110613d8857613d886145bc565b600091825260209091200154600680546001600160a01b039092169183908110613db457613db46145bc565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506006805480613b3d57613b3d6145a6565b80613dfd81614535565b915050613d1a565b60006139c08284614550565b6000613e66826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613ef69092919063ffffffff16565b805190915015613c2f5780806020019051810190613e8491906140cc565b613c2f5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016107d6565b606061384c848460008585843b613f4f5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016107d6565b600080866001600160a01b03168587604051613f6b91906142c9565b60006040518083038185875af1925050503d8060008114613fa8576040519150601f19603f3d011682016040523d82523d6000602084013e613fad565b606091505b5091509150613fbd828286613fc8565b979650505050505050565b60608315613fd75750816139c0565b825115613fe75782518084602001fd5b8160405162461bcd60e51b81526004016107d6919061435b565b82805461400d906144fa565b90600052602060002090601f01602090048101928261402f5760008555614075565b82601f1061404857805160ff1916838001178555614075565b82800160010185558215614075579182015b8281111561407557825182559160200191906001019061405a565b50614081929150614085565b5090565b5b808211156140815760008155600101614086565b80356001600160a01b03811681146114a157600080fd5b6000602082840312156140c357600080fd5b6139c08261409a565b6000602082840312156140de57600080fd5b815180151581146139c057600080fd5b60006020828403121561410057600080fd5b813567ffffffffffffffff8082111561411857600080fd5b818401915084601f83011261412c57600080fd5b81358181111561413e5761413e6145d2565b604051601f8201601f19908116603f01168101908382118183101715614166576141666145d2565b8160405282815287602084870101111561417f57600080fd5b826020860160208301376000928101602001929092525095945050505050565b6000602082840312156141b157600080fd5b5035919050565b6000602082840312156141ca57600080fd5b5051919050565b600080604083850312156141e457600080fd5b823591506141f46020840161409a565b90509250929050565b600081518084526142158160208601602086016144ce565b601f01601f19169290920160200192915050565b8054600090600181811c908083168061424357607f831692505b602080841082141561426557634e487b7160e01b600052602260045260246000fd5b838852602088018280156142805760018114614291576142bc565b60ff198716825282820197506142bc565b60008981526020902060005b878110156142b65781548482015290860190840161429d565b83019850505b5050505050505092915050565b600082516142db8184602087016144ce565b9190910192915050565b60006101006001600160a01b03808c168452808b166020850152508860408401528760608401528660808401528060a0840152614324818401876141fd565b905082810360c084015261433881866141fd565b905082810360e084015261434c81856141fd565b9b9a5050505050505050505050565b6020815260006139c060208301846141fd565b60006101408083526143828184018e6141fd565b90508281036020840152614396818d6141fd565b604084019b909b5250506060810197909752608087019590955260a086019390935260c085019190915260e084015262ffffff908116610100840152166101209091015292915050565b6040815260006143f360408301856141fd565b82810360208401526144058185614229565b95945050505050565b6020815260006139c06020830184614229565b600062ffffff80831681851680830382111561443f5761443f614564565b01949350505050565b6000821982111561445b5761445b614564565b500190565b60008261446f5761446f61457a565b500490565b600081600019048311821515161561448e5761448e614564565b500290565b600062ffffff838116908316818110156144af576144af614564565b039392505050565b6000828210156144c9576144c9614564565b500390565b60005b838110156144e95781810151838201526020016144d1565b83811115613ca95750506000910152565b600181811c9082168061450e57607f821691505b6020821081141561452f57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561454957614549614564565b5060010190565b60008261455f5761455f61457a565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfea2646970667358221220fb011bf2d37f2592810ddf909e830d3c8d97cd73b1ac0e35d607dac70a3b145864736f6c63430008070033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103145760003560e01c80637c3a00fd116101a7578063c54e44eb116100ee578063e1b0b70611610097578063f491b2eb11610071578063f491b2eb146106f9578063ff9d11281461070c578063ffdd5cf11461071f57600080fd5b8063e1b0b706146106c1578063eb5797a4146106e8578063f3a504f2146106f057600080fd5b8063cff40759116100c8578063cff4075914610674578063dd6d90ce14610687578063ddca3f431461069a57600080fd5b8063c54e44eb14610623578063c65cd86d1461063e578063c884ef831461065157600080fd5b8063a992e6da11610150578063bce1b5201161012a578063bce1b520146105ce578063c0695af1146105e1578063c45a0155146105fc57600080fd5b8063a992e6da146105ab578063aaa46688146105b3578063b6b55f25146105bb57600080fd5b806399d7a0f41161018157806399d7a0f41461057b5780639f8280cc14610583578063a2e62045146105a357600080fd5b80637c3a00fd1461051a5780638381e18214610555578063839006f21461056857600080fd5b80634178bb3b1161026b5780635ce6c32711610214578063668aa824116101ee578063668aa824146104d75780637267b828146104e057806378e97925146104f357600080fd5b80635ce6c327146104be5780636603b86f146104c757806366805de5146104cf57600080fd5b806359b6a0c91161024557806359b6a0c9146104725780635c0428b8146104995780635c925b9d146104a257600080fd5b80634178bb3b1461043b5780634876c97714610443578063570ca7351461044b57600080fd5b806328a07025116102cd5780633197cbb6116102a75780633197cbb6146103ec5780633d289376146104135780633e5e89be1461043357600080fd5b806328a070251461039c57806329942ed4146103a45780632ecfbe59146103d957600080fd5b80631400a85e116102fe5780631400a85e146103565780631e83409a14610381578063217ac2371461039457600080fd5b8062f714ce1461031957806306fdde0314610341575b600080fd5b61032c6103273660046141d1565b610748565b60405190151581526020015b60405180910390f35b610349610a00565b604051610338919061435b565b61036961036436600461419f565b610a8e565b6040516001600160a01b039091168152602001610338565b61032c61038f3660046140b1565b610ab8565b610349610e99565b61032c6110dd565b6103cb7f00000000000000000000000000000000000000000000000000000000613b4e9e81565b604051908152602001610338565b61032c6103e73660046140ee565b6113d7565b6103cb7f000000000000000000000000000000000000000000000000000000006143da7f81565b6103cb6104213660046140b1565b60026020526000908152604090205481565b6103496114a6565b6103496114b3565b6006546103cb565b6103697f00000000000000000000000083a44f85051c0f7e031cf4cbec2048a164aa1b3981565b6103cb7f00000000000000000000000000000000000000000000000000000002540be40081565b6103cb60095481565b6104aa6114c0565b6040516103389897969594939291906142e5565b6103cb60085481565b61032c6116e2565b61032c611984565b6103cb60015481565b6103696104ee36600461419f565b611b79565b6103cb7f00000000000000000000000000000000000000000000000000000000613b4c4681565b6105417f000000000000000000000000000000000000000000000000000000000000000081565b60405162ffffff9091168152602001610338565b61032c6105633660046141d1565b611b89565b61032c6105763660046140b1565b611dda565b61032c61215e565b6103cb6105913660046140b1565b60036020526000908152604090205481565b61032c612348565b6103496126ec565b6005546103cb565b61032c6105c936600461419f565b6126f9565b61032c6105dc36600461419f565b6129cb565b61036973ba6b0dbb2ba8daa8f5d6817946393aef8d3a448781565b6103697f000000000000000000000000e37ddccd2119e757d2e0228269fef8b7bdaca8eb81565b61036973dac17f958d2ee523a2206206994597c13d831ec781565b61032c61064c36600461419f565b612bb2565b61032c61065f3660046140b1565b60046020526000908152604090205460ff1681565b61032c6106823660046141d1565b613023565b61032c6106953660046140ee565b613274565b6105417f000000000000000000000000000000000000000000000000000000000000000081565b6103cb7f00000000000000000000000000000000000000000000000000000002540be40081565b61032c6133c5565b6103cb60075481565b61032c6107073660046140ee565b61362b565b6103cb61071a36600461419f565b61377c565b61073261072d3660046140b1565b613854565b6040516103389a9998979695949392919061436e565b6000610752612348565b506001600d5460ff16600581111561076c5761076c614590565b148061078e57506003600d5460ff16600581111561078c5761078c614590565b145b6107df5760405162461bcd60e51b815260206004820152601f60248201527f496e766573746f725631506f6f6c3a20706f6f6c206e6f74206f70656e65640060448201526064015b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000613b4c4642101561084f5760405162461bcd60e51b815260206004820152601f60248201527f496e766573746f725631506f6f6c3a206e6f742073746172746564207965740060448201526064016107d6565b336000908152600260205260409020548311156108b95760405162461bcd60e51b815260206004820152602260248201527f496e766573746f725631506f6f6c3a206e6f7420656e6f756768206465706f736044820152611a5d60f21b60648201526084016107d6565b6001600160a01b03821661091a5760405162461bcd60e51b815260206004820152602260248201527f496e766573746f725631506f6f6c3a20746f2061646472657373206973207a65604482015261726f60f01b60648201526084016107d6565b3360009081526002602052604090205461093490846139b4565b3360009081526002602052604090205560075461095190846139b4565b6007553360009081526002602052604090205461097157610971336139c7565b61099073dac17f958d2ee523a2206206994597c13d831ec78385613b86565b6040805173dac17f958d2ee523a2206206994597c13d831ec781523360208201526001600160a01b03841691810191909152606081018490527f342e7ff505a8a0364cd0dc2ff195c315e43bce86b204846ecd36913e117b109e906080015b60405180910390a150600192915050565b60008054610a0d906144fa565b80601f0160208091040260200160405190810160405280929190818152602001828054610a39906144fa565b8015610a865780601f10610a5b57610100808354040283529160200191610a86565b820191906000526020600020905b815481529060010190602001808311610a6957829003601f168201915b505050505081565b60058181548110610a9e57600080fd5b6000918252602090912001546001600160a01b0316905081565b6000610ac2612348565b506004600d5460ff166005811115610adc57610adc614590565b14610b345760405162461bcd60e51b815260206004820152602260248201527f496e766573746f725631506f6f6c3a20706f6f6c206e6f742066696e616c697a604482015261195960f21b60648201526084016107d6565b3360009081526004602052604090205460ff1615610b945760405162461bcd60e51b815260206004820152601f60248201527f496e766573746f725631506f6f6c3a20616c726561647920636c61696d65640060448201526064016107d6565b6001600160a01b038216610bf55760405162461bcd60e51b815260206004820152602260248201527f496e766573746f725631506f6f6c3a20746f2061646472657373206973207a65604482015261726f60f01b60648201526084016107d6565b6000610c237f0000000000000000000000000000000000000000000000000000000000000000612710614493565b62ffffff169050610c567f0000000000000000000000000000000000000000000000000000000000000000612710614421565b610c659062ffffff1682614474565b9050610c917f00000000000000000000000000000000000000000000000000000002540be40082613c34565b9050610ca1816305f5e100613c40565b3360009081526002602052604081205491925090819015610d065733600090815260026020526040902054610cd7908490613c34565b9150610d03827f00000000000000000000000000000000000000000000000000000002540be400613c40565b91505b3360009081526003602052604090205415801590610d2657506000600854115b15610d9d57600854610d39908490613c34565b33600090815260036020526040902054909150610d57908290613c34565b9050610d83817f00000000000000000000000000000000000000000000000000000002540be400613c40565b9050610d9a60095482613c4090919063ffffffff16565b90505b336000908152600460205260408120805460ff19166001179055610dc18383613c4c565b11610e0e5760405162461bcd60e51b815260206004820181905260248201527f496e766573746f725631506f6f6c3a206e6f20636c61696d20666f7220796f7560448201526064016107d6565b610e3885610e1c8484613c4c565b73dac17f958d2ee523a2206206994597c13d831ec79190613b86565b7f70eb43c4a8ae8c40502dcf22436c509c28d6ff421cf07c491be56984bd9870683386610e658585613c4c565b604080516001600160a01b0394851681529390921660208401529082015260600160405180910390a1506001949350505050565b60606001600d5460ff166005811115610eb457610eb4614590565b1415610ef2575060408051808201909152600681527f4f70656e65640000000000000000000000000000000000000000000000000000602082015290565b6002600d5460ff166005811115610f0b57610f0b614590565b1415610f49575060408051808201909152600681527f4163746976650000000000000000000000000000000000000000000000000000602082015290565b6000600d5460ff166005811115610f6257610f62614590565b1415610fa0575060408051808201909152600781527f4372656174656400000000000000000000000000000000000000000000000000602082015290565b6005600d5460ff166005811115610fb957610fb9614590565b1415610ff7575060408051808201909152600a81527f446973686f6e6f72656400000000000000000000000000000000000000000000602082015290565b6004600d5460ff16600581111561101057611010614590565b141561104e575060408051808201909152600a81527f4c69717569646174656400000000000000000000000000000000000000000000602082015290565b6003600d5460ff16600581111561106757611067614590565b14156110a5575060408051808201909152600881527f5265766572746564000000000000000000000000000000000000000000000000602082015290565b5060408051808201909152600a81527f496d706f737369626c6500000000000000000000000000000000000000000000602082015290565b60007f00000000000000000000000083a44f85051c0f7e031cf4cbec2048a164aa1b396001600160a01b031633146111575760405162461bcd60e51b815260206004820152601c60248201527f496e766573746f725631506f6f6c3a206e6f74206f70657261746f720000000060448201526064016107d6565b61115f612348565b506002600d5460ff16600581111561117957611179614590565b146111c65760405162461bcd60e51b815260206004820152601f60248201527f496e766573746f725631506f6f6c3a20706f6f6c206e6f74206163746976650060448201526064016107d6565b60006111f47f0000000000000000000000000000000000000000000000000000000000000000612710614493565b62ffffff1690506112277f0000000000000000000000000000000000000000000000000000000000000000612710614421565b6112369062ffffff1682614474565b9050600060085411801561124a5750600954155b156112635760075461125c9082613c34565b9050611290565b61128d7f00000000000000000000000000000000000000000000000000000002540be40082613c34565b90505b61129e816305f5e100613c40565b6040516370a0823160e01b815230600482015290915060009073dac17f958d2ee523a2206206994597c13d831ec7906370a082319060240160206040518083038186803b1580156112ee57600080fd5b505afa158015611302573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061132691906141b8565b90508082116113385760019250505090565b611364333061134785856139b4565b73dac17f958d2ee523a2206206994597c13d831ec7929190613c58565b7f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f6273dac17f958d2ee523a2206206994597c13d831ec7336113a585856139b4565b604080516001600160a01b0394851681529390921660208401529082015260600160405180910390a160019250505090565b60007f00000000000000000000000083a44f85051c0f7e031cf4cbec2048a164aa1b396001600160a01b031633146114515760405162461bcd60e51b815260206004820152601c60248201527f496e766573746f725631506f6f6c3a206e6f74206f70657261746f720000000060448201526064016107d6565b815161146490600c906020850190614001565b507faa0ff26ab50884aa4da188d89239cdcc32b5dfa5b8700c33d280b3af25ad611d600c604051611495919061440e565b60405180910390a15060015b919050565b600a8054610a0d906144fa565b600b8054610a0d906144fa565b600080600080600060608060607f00000000000000000000000083a44f85051c0f7e031cf4cbec2048a164aa1b397f000000000000000000000000e37ddccd2119e757d2e0228269fef8b7bdaca8eb60015461151b60055490565b600654600a600b600c828054611530906144fa565b80601f016020809104026020016040519081016040528092919081815260200182805461155c906144fa565b80156115a95780601f1061157e576101008083540402835291602001916115a9565b820191906000526020600020905b81548152906001019060200180831161158c57829003601f168201915b505050505092508180546115bc906144fa565b80601f01602080910402602001604051908101604052809291908181526020018280546115e8906144fa565b80156116355780601f1061160a57610100808354040283529160200191611635565b820191906000526020600020905b81548152906001019060200180831161161857829003601f168201915b50505050509150808054611648906144fa565b80601f0160208091040260200160405190810160405280929190818152602001828054611674906144fa565b80156116c15780601f10611696576101008083540402835291602001916116c1565b820191906000526020600020905b8154815290600101906020018083116116a457829003601f168201915b50505050509050975097509750975097509750975097509091929394959697565b60007f00000000000000000000000083a44f85051c0f7e031cf4cbec2048a164aa1b396001600160a01b0316331461175c5760405162461bcd60e51b815260206004820152601c60248201527f496e766573746f725631506f6f6c3a206e6f74206f70657261746f720000000060448201526064016107d6565b611764612348565b506001600d5460ff16600581111561177e5761177e614590565b14806117a057506000600d5460ff16600581111561179e5761179e614590565b145b6118115760405162461bcd60e51b8152602060048201526024808201527f496e766573746f725631506f6f6c3a206e6f742072657665727461626c65207360448201527f746174650000000000000000000000000000000000000000000000000000000060648201526084016107d6565b600d805460ff191660031790556040516370a0823160e01b815230600482015260009073ba6b0dbb2ba8daa8f5d6817946393aef8d3a4487906370a082319060240160206040518083038186803b15801561186b57600080fd5b505afa15801561187f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a391906141b8565b90506118c473ba6b0dbb2ba8daa8f5d6817946393aef8d3a44873383613b86565b6040805173ba6b0dbb2ba8daa8f5d6817946393aef8d3a448781523360208201819052818301526060810183905290517f342e7ff505a8a0364cd0dc2ff195c315e43bce86b204846ecd36913e117b109e9181900360800190a1600754604080517f00000000000000000000000000000000000000000000000000000002540be400815260208101929092527f7c64d86d5ba045525890af71998709b40afa070fe3680693c0899aeb5926568491015b60405180910390a1600191505090565b60007f00000000000000000000000083a44f85051c0f7e031cf4cbec2048a164aa1b396001600160a01b031633146119fe5760405162461bcd60e51b815260206004820152601c60248201527f496e766573746f725631506f6f6c3a206e6f74206f70657261746f720000000060448201526064016107d6565b611a06612348565b506004600d5460ff166005811115611a2057611a20614590565b14611a785760405162461bcd60e51b815260206004820152602260248201527f496e766573746f725631506f6f6c3a20706f6f6c206e6f742066696e616c697a604482015261195960f21b60648201526084016107d6565b6040516370a0823160e01b815230600482015260009073ba6b0dbb2ba8daa8f5d6817946393aef8d3a4487906370a082319060240160206040518083038186803b158015611ac557600080fd5b505afa158015611ad9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611afd91906141b8565b9050611b1e73ba6b0dbb2ba8daa8f5d6817946393aef8d3a44873383613b86565b6040805173ba6b0dbb2ba8daa8f5d6817946393aef8d3a44878152336020820181905291810191909152606081018290527f342e7ff505a8a0364cd0dc2ff195c315e43bce86b204846ecd36913e117b109e90608001611974565b60068181548110610a9e57600080fd5b6000611b93612348565b506002600d5460ff166005811115611bad57611bad614590565b1480611bcf57506005600d5460ff166005811115611bcd57611bcd614590565b145b611c1b5760405162461bcd60e51b815260206004820152601f60248201527f496e766573746f725631506f6f6c3a20706f6f6c206e6f74206163746976650060448201526064016107d6565b33600090815260036020526040902054831115611ca05760405162461bcd60e51b815260206004820152602260248201527f496e766573746f725631506f6f6c3a206e6f7420656e6f75676820726573746160448201527f6b6500000000000000000000000000000000000000000000000000000000000060648201526084016107d6565b6001600160a01b038216611d015760405162461bcd60e51b815260206004820152602260248201527f496e766573746f725631506f6f6c3a20746f2061646472657373206973207a65604482015261726f60f01b60648201526084016107d6565b33600090815260036020526040902054611d1b90846139b4565b33600090815260036020526040902055600954611d3890846139b4565b60095533600090815260036020526040902054611d5857611d5833613caf565b611d7773ba6b0dbb2ba8daa8f5d6817946393aef8d3a44878385613b86565b6040805173ba6b0dbb2ba8daa8f5d6817946393aef8d3a448781523360208201526001600160a01b03841691810191909152606081018490527f342e7ff505a8a0364cd0dc2ff195c315e43bce86b204846ecd36913e117b109e906080016109ef565b60007f00000000000000000000000083a44f85051c0f7e031cf4cbec2048a164aa1b396001600160a01b03163314611e545760405162461bcd60e51b815260206004820152601c60248201527f496e766573746f725631506f6f6c3a206e6f74206f70657261746f720000000060448201526064016107d6565b6001600160a01b03821673dac17f958d2ee523a2206206994597c13d831ec714801590611e9e57506001600160a01b03821673ba6b0dbb2ba8daa8f5d6817946393aef8d3a448714155b611f105760405162461bcd60e51b815260206004820152602e60248201527f496e766573746f725631506f6f6c3a205553445420616e64204853462063616e60448201527f6e6f74206265207265736375656400000000000000000000000000000000000060648201526084016107d6565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a082319060240160206040518083038186803b158015611f5257600080fd5b505afa158015611f66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8a91906141b8565b11611ffc5760405162461bcd60e51b8152602060048201526024808201527f496e766573746f725631506f6f6c3a206e6f2074617267657420746f6b656e2060448201527f686572650000000000000000000000000000000000000000000000000000000060648201526084016107d6565b6040516370a0823160e01b815230600482015261208a9033906001600160a01b038516906370a082319060240160206040518083038186803b15801561204157600080fd5b505afa158015612055573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061207991906141b8565b6001600160a01b0385169190613b86565b6040516370a0823160e01b81523060048201527f342e7ff505a8a0364cd0dc2ff195c315e43bce86b204846ecd36913e117b109e908390339081906001600160a01b038416906370a082319060240160206040518083038186803b1580156120f157600080fd5b505afa158015612105573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061212991906141b8565b60405161149594939291906001600160a01b039485168152928416602084015292166040820152606081019190915260800190565b60007f00000000000000000000000083a44f85051c0f7e031cf4cbec2048a164aa1b396001600160a01b031633146121d85760405162461bcd60e51b815260206004820152601c60248201527f496e766573746f725631506f6f6c3a206e6f74206f70657261746f720000000060448201526064016107d6565b6121e0612348565b506002600d5460ff1660058111156121fa576121fa614590565b146122475760405162461bcd60e51b815260206004820152601f60248201527f496e766573746f725631506f6f6c3a20706f6f6c206e6f74206163746976650060448201526064016107d6565b6040516370a0823160e01b815230600482015260009073dac17f958d2ee523a2206206994597c13d831ec7906370a082319060240160206040518083038186803b15801561229457600080fd5b505afa1580156122a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122cc91906141b8565b90506122ed73dac17f958d2ee523a2206206994597c13d831ec73383613b86565b6040805173dac17f958d2ee523a2206206994597c13d831ec78152336020820181905291810191909152606081018290527f342e7ff505a8a0364cd0dc2ff195c315e43bce86b204846ecd36913e117b109e90608001611974565b60006001600d5460ff16600581111561236357612363614590565b14801561238f57507f00000000000000000000000000000000000000000000000000000000613b4e9e42115b156124a6577f00000000000000000000000000000000000000000000000000000002540be4006007541061243557600d805460ff191660021790556007546123f7907f00000000000000000000000000000000000000000000000000000002540be4006144b7565b6008556007546040519081527ff4e709ae88b8c450ce2b6f255aece15d83282f77351735003b4b091a79e972f29060200160405180910390a16124a0565b600d805460ff19166003179055600754604080517f00000000000000000000000000000000000000000000000000000002540be400815260208101929092527f7c64d86d5ba045525890af71998709b40afa070fe3680693c0899aeb59265684910160405180910390a15b50600190565b6002600d5460ff1660058111156124bf576124bf614590565b1480156124eb57507f000000000000000000000000000000000000000000000000000000006143da7f42115b156124a0576040516370a0823160e01b815230600482015260009073dac17f958d2ee523a2206206994597c13d831ec7906370a082319060240160206040518083038186803b15801561253d57600080fd5b505afa158015612551573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061257591906141b8565b905060006125a57f0000000000000000000000000000000000000000000000000000000000000000612710614493565b62ffffff1690506125d87f0000000000000000000000000000000000000000000000000000000000000000612710614421565b6125e79062ffffff1682614474565b905060006008541180156125fb5750600954155b156126145760075461260d9082613c34565b9050612641565b61263e7f00000000000000000000000000000000000000000000000000000002540be40082613c34565b90505b61264f816305f5e100613c40565b905080821061269d57600d805460ff191660041790556040518281527ff22938d29944010ebbf93c4b810b830fcb603d4de90ac510080e10d59f2a46c89060200160405180910390a16126e4565b600d805460ff1916600517905560408051828152602081018490527f773d8dddcb5934119d33dfd68c32aa3b9b74369d9c96eca4749311b1678517d3910160405180910390a15b505050600190565b600c8054610a0d906144fa565b6000612703612348565b506001600d5460ff16600581111561271d5761271d614590565b1461276a5760405162461bcd60e51b815260206004820152601f60248201527f496e766573746f725631506f6f6c3a20706f6f6c206e6f74206f70656e65640060448201526064016107d6565b7f00000000000000000000000000000000000000000000000000000000613b4c464210156127da5760405162461bcd60e51b815260206004820152601f60248201527f496e766573746f725631506f6f6c3a206e6f742073746172746564207965740060448201526064016107d6565b6000821161282a5760405162461bcd60e51b815260206004820152601e60248201527f496e766573746f725631506f6f6c3a20616d6f756e74206973207a65726f000060448201526064016107d6565b6007547f00000000000000000000000000000000000000000000000000000002540be400906128599084613c4c565b11156128cd5760405162461bcd60e51b815260206004820152602560248201527f496e766573746f725631506f6f6c3a206465706f736974206f7665722063617060448201527f616369747900000000000000000000000000000000000000000000000000000060648201526084016107d6565b336000908152600260205260409020546128e79083613c4c565b336000908152600260205260409020556007546129049083613c4c565b600755600580546001810182556000919091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db001805473ffffffffffffffffffffffffffffffffffffffff19163390811790915561297a9073dac17f958d2ee523a2206206994597c13d831ec7903085613c58565b6040805173dac17f958d2ee523a2206206994597c13d831ec781523360208201529081018390527f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f6290606001611495565b60006129d5612348565b506002600d5460ff1660058111156129ef576129ef614590565b14612a3c5760405162461bcd60e51b815260206004820152601f60248201527f496e766573746f725631506f6f6c3a20706f6f6c206e6f74206163746976650060448201526064016107d6565b600060085411612ab45760405162461bcd60e51b815260206004820152602760248201527f496e766573746f725631506f6f6c3a206e6f20636170616369747920666f722060448201527f72657374616b650000000000000000000000000000000000000000000000000060648201526084016107d6565b33600090815260036020526040902054612ace9083613c4c565b33600090815260036020526040902055600954612aeb9083613c4c565b600955600680546001810182556000919091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f01805473ffffffffffffffffffffffffffffffffffffffff191633908117909155612b619073ba6b0dbb2ba8daa8f5d6817946393aef8d3a4487903085613c58565b6040805173ba6b0dbb2ba8daa8f5d6817946393aef8d3a448781523360208201529081018390527f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f6290606001611495565b60007f00000000000000000000000083a44f85051c0f7e031cf4cbec2048a164aa1b396001600160a01b03163314612c2c5760405162461bcd60e51b815260206004820152601c60248201527f496e766573746f725631506f6f6c3a206e6f74206f70657261746f720000000060448201526064016107d6565b612c34612348565b506001600d5460ff166005811115612c4e57612c4e614590565b1480612c7057506000600d5460ff166005811115612c6e57612c6e614590565b145b612cbc5760405162461bcd60e51b815260206004820152601d60248201527f496e766573746f725631506f6f6c3a20706f6f6c206e6f74206f70656e00000060448201526064016107d6565b600154821415612d345760405162461bcd60e51b815260206004820152602760248201527f496e766573746f725631506f6f6c3a206f7261636c655072696365206e6f742060448201527f6368616e6765640000000000000000000000000000000000000000000000000060648201526084016107d6565b6000612d617f00000000000000000000000000000000000000000000000000000002540be4006064613c34565b9050612d6d8184613c40565b9050612d997f00000000000000000000000000000000000000000000000000000002540be40084613e05565b15612dac57612da9816001613c4c565b90505b612dbb8164e8d4a51000613c34565b9050826001541115612ed4576040516370a0823160e01b8152306004820152612e549073ba6b0dbb2ba8daa8f5d6817946393aef8d3a4487906370a082319060240160206040518083038186803b158015612e1557600080fd5b505afa158015612e29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e4d91906141b8565b82906139b4565b60018490559050612e7b73ba6b0dbb2ba8daa8f5d6817946393aef8d3a4487333084613c58565b6040805173ba6b0dbb2ba8daa8f5d6817946393aef8d3a448781523360208201529081018290527f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f629060600160405180910390a1612fe7565b6040516370a0823160e01b815230600482015260009073ba6b0dbb2ba8daa8f5d6817946393aef8d3a4487906370a082319060240160206040518083038186803b158015612f2157600080fd5b505afa158015612f35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f5991906141b8565b9050612f6581836139b4565b60018590559150612f8b73ba6b0dbb2ba8daa8f5d6817946393aef8d3a44873384613b86565b6040805173ba6b0dbb2ba8daa8f5d6817946393aef8d3a448781523360208201819052818301526060810184905290517f342e7ff505a8a0364cd0dc2ff195c315e43bce86b204846ecd36913e117b109e9181900360800190a1505b6040518381527f51c6eaaaa11f3a57f136cd3fbce664dfa4da3c42210ab46757f048532068e0ce9060200160405180910390a150600192915050565b600061302d612348565b506002600d5460ff16600581111561304757613047614590565b148061306957506005600d5460ff16600581111561306757613067614590565b145b6130b55760405162461bcd60e51b815260206004820152601f60248201527f496e766573746f725631506f6f6c3a20706f6f6c206e6f74206163746976650060448201526064016107d6565b3360009081526002602052604090205483111561311f5760405162461bcd60e51b815260206004820152602260248201527f496e766573746f725631506f6f6c3a206e6f7420656e6f756768206465706f736044820152611a5d60f21b60648201526084016107d6565b6001600160a01b0382166131805760405162461bcd60e51b815260206004820152602260248201527f496e766573746f725631506f6f6c3a20746f2061646472657373206973207a65604482015261726f60f01b60648201526084016107d6565b3360009081526002602052604090205461319a90846139b4565b336000908152600260205260409020556008546131b79084613c4c565b600855336000908152600260205260409020546131d7576131d7336139c7565b60006131e984655af3107a4000613c34565b905061320060015482613c4090919063ffffffff16565b905061322173ba6b0dbb2ba8daa8f5d6817946393aef8d3a44878483613b86565b604080513381526001600160a01b03851660208201529081018290527f104ad9ab27213fcc307f2308fc015959def8986f04d9475d82c5f32ab9c8d83b9060600160405180910390a15060019392505050565b60007f00000000000000000000000083a44f85051c0f7e031cf4cbec2048a164aa1b396001600160a01b031633146132ee5760405162461bcd60e51b815260206004820152601c60248201527f496e766573746f725631506f6f6c3a206e6f74206f70657261746f720000000060448201526064016107d6565b6000600b80546132fd906144fa565b80601f0160208091040260200160405190810160405280929190818152602001828054613329906144fa565b80156133765780601f1061334b57610100808354040283529160200191613376565b820191906000526020600020905b81548152906001019060200180831161335957829003601f168201915b5050865193945061339293600b93506020880192509050614001565b507fbf3c9539cc784485849e00ee75d20bc0ccec32277a9db906764208ccdba82a6781600b6040516109ef9291906143e0565b60007f00000000000000000000000083a44f85051c0f7e031cf4cbec2048a164aa1b396001600160a01b0316331461343f5760405162461bcd60e51b815260206004820152601c60248201527f496e766573746f725631506f6f6c3a206e6f74206f70657261746f720000000060448201526064016107d6565b613447612348565b506000600d5460ff16600581111561346157613461614590565b146134ae5760405162461bcd60e51b815260206004820181905260248201527f496e766573746f725631506f6f6c3a206e6f742063726561746520737461746560448201526064016107d6565b60006134db7f00000000000000000000000000000000000000000000000000000002540be4006064613c34565b90506134f260015482613c4090919063ffffffff16565b90506135296001547f00000000000000000000000000000000000000000000000000000002540be400613e0590919063ffffffff16565b1561353c57613539816001613c4c565b90505b61354b8164e8d4a51000613c34565b600d805460ff19166001179055905061357a73ba6b0dbb2ba8daa8f5d6817946393aef8d3a4487333084613c58565b6040805173ba6b0dbb2ba8daa8f5d6817946393aef8d3a448781523360208201529081018290527f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f629060600160405180910390a1604080513381527f00000000000000000000000000000000000000000000000000000000613b4c4660208201529081018290527ff9d60b8197870d29952728aa5990c3e1a21ca5bd20ba5ba4ca2610cd2530dfa490606001611974565b60007f00000000000000000000000083a44f85051c0f7e031cf4cbec2048a164aa1b396001600160a01b031633146136a55760405162461bcd60e51b815260206004820152601c60248201527f496e766573746f725631506f6f6c3a206e6f74206f70657261746f720000000060448201526064016107d6565b6000600a80546136b4906144fa565b80601f01602080910402602001604051908101604052809291908181526020018280546136e0906144fa565b801561372d5780601f106137025761010080835404028352916020019161372d565b820191906000526020600020905b81548152906001019060200180831161371057829003601f168201915b5050865193945061374993600a93506020880192509050614001565b507f6714abb209a7aa5abff3a625d8a54e3fa31055a01c0ad6b03947529f05cbc7fe81600a6040516109ef9291906143e0565b60008161378b57506000919050565b60006137b97f0000000000000000000000000000000000000000000000000000000000000000612710614493565b62ffffff16905060006137d784600954613c4c90919063ffffffff16565b90506138057f0000000000000000000000000000000000000000000000000000000000000000612710614421565b6138149062ffffff1683614474565b6008549092506138249083613c34565b9150613834826305f5e100613c40565b91506138408285613c34565b915061384c8282613c40565b949350505050565b6001600160a01b03811660009081526002602090815260408083205460039092528220546060928392909182918291829182918291829182919082613897610e99565b7f00000000000000000000000000000000000000000000000000000002540be40060075460095460085487877f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000898054613911906144fa565b80601f016020809104026020016040519081016040528092919081815260200182805461393d906144fa565b801561398a5780601f1061395f5761010080835404028352916020019161398a565b820191906000526020600020905b81548152906001019060200180831161396d57829003601f168201915b505050505099509b509b509b509b509b509b509b509b509b509b5050509193959799509193959799565b60006139c082846144b7565b9392505050565b600554600111156139d757600080fd5b600580546001600160a01b03831691906139f3906001906144b7565b81548110613a0357613a036145bc565b6000918252602090912001546001600160a01b03161415613a61576005805480613a2f57613a2f6145a6565b6000828152602090208101600019908101805473ffffffffffffffffffffffffffffffffffffffff1916905501905550565b60005b600554613a73906001906144b7565b811015613b8257816001600160a01b031660058281548110613a9757613a976145bc565b6000918252602090912001546001600160a01b03161415613b705760058054613ac2906001906144b7565b81548110613ad257613ad26145bc565b600091825260209091200154600580546001600160a01b039092169183908110613afe57613afe6145bc565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506005805480613b3d57613b3d6145a6565b6000828152602090208101600019908101805473ffffffffffffffffffffffffffffffffffffffff191690550190555050565b80613b7a81614535565b915050613a64565b5050565b6040516001600160a01b038316602482015260448101829052613c2f9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613e11565b505050565b60006139c08284614474565b60006139c08284614460565b60006139c08284614448565b6040516001600160a01b0380851660248301528316604482015260648101829052613ca99085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401613bcb565b50505050565b60065460011115613cbf57600080fd5b600680546001600160a01b0383169190613cdb906001906144b7565b81548110613ceb57613ceb6145bc565b6000918252602090912001546001600160a01b03161415613d17576006805480613a2f57613a2f6145a6565b60005b600654613d29906001906144b7565b811015613b8257816001600160a01b031660068281548110613d4d57613d4d6145bc565b6000918252602090912001546001600160a01b03161415613df35760068054613d78906001906144b7565b81548110613d8857613d886145bc565b600091825260209091200154600680546001600160a01b039092169183908110613db457613db46145bc565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506006805480613b3d57613b3d6145a6565b80613dfd81614535565b915050613d1a565b60006139c08284614550565b6000613e66826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613ef69092919063ffffffff16565b805190915015613c2f5780806020019051810190613e8491906140cc565b613c2f5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016107d6565b606061384c848460008585843b613f4f5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016107d6565b600080866001600160a01b03168587604051613f6b91906142c9565b60006040518083038185875af1925050503d8060008114613fa8576040519150601f19603f3d011682016040523d82523d6000602084013e613fad565b606091505b5091509150613fbd828286613fc8565b979650505050505050565b60608315613fd75750816139c0565b825115613fe75782518084602001fd5b8160405162461bcd60e51b81526004016107d6919061435b565b82805461400d906144fa565b90600052602060002090601f01602090048101928261402f5760008555614075565b82601f1061404857805160ff1916838001178555614075565b82800160010185558215614075579182015b8281111561407557825182559160200191906001019061405a565b50614081929150614085565b5090565b5b808211156140815760008155600101614086565b80356001600160a01b03811681146114a157600080fd5b6000602082840312156140c357600080fd5b6139c08261409a565b6000602082840312156140de57600080fd5b815180151581146139c057600080fd5b60006020828403121561410057600080fd5b813567ffffffffffffffff8082111561411857600080fd5b818401915084601f83011261412c57600080fd5b81358181111561413e5761413e6145d2565b604051601f8201601f19908116603f01168101908382118183101715614166576141666145d2565b8160405282815287602084870101111561417f57600080fd5b826020860160208301376000928101602001929092525095945050505050565b6000602082840312156141b157600080fd5b5035919050565b6000602082840312156141ca57600080fd5b5051919050565b600080604083850312156141e457600080fd5b823591506141f46020840161409a565b90509250929050565b600081518084526142158160208601602086016144ce565b601f01601f19169290920160200192915050565b8054600090600181811c908083168061424357607f831692505b602080841082141561426557634e487b7160e01b600052602260045260246000fd5b838852602088018280156142805760018114614291576142bc565b60ff198716825282820197506142bc565b60008981526020902060005b878110156142b65781548482015290860190840161429d565b83019850505b5050505050505092915050565b600082516142db8184602087016144ce565b9190910192915050565b60006101006001600160a01b03808c168452808b166020850152508860408401528760608401528660808401528060a0840152614324818401876141fd565b905082810360c084015261433881866141fd565b905082810360e084015261434c81856141fd565b9b9a5050505050505050505050565b6020815260006139c060208301846141fd565b60006101408083526143828184018e6141fd565b90508281036020840152614396818d6141fd565b604084019b909b5250506060810197909752608087019590955260a086019390935260c085019190915260e084015262ffffff908116610100840152166101209091015292915050565b6040815260006143f360408301856141fd565b82810360208401526144058185614229565b95945050505050565b6020815260006139c06020830184614229565b600062ffffff80831681851680830382111561443f5761443f614564565b01949350505050565b6000821982111561445b5761445b614564565b500190565b60008261446f5761446f61457a565b500490565b600081600019048311821515161561448e5761448e614564565b500290565b600062ffffff838116908316818110156144af576144af614564565b039392505050565b6000828210156144c9576144c9614564565b500390565b60005b838110156144e95781810151838201526020016144d1565b83811115613ca95750506000910152565b600181811c9082168061450e57607f821691505b6020821081141561452f57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561454957614549614564565b5060010190565b60008261455f5761455f61457a565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfea2646970667358221220fb011bf2d37f2592810ddf909e830d3c8d97cd73b1ac0e35d607dac70a3b145864736f6c63430008070033
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.