Source Code
Latest 25 from a total of 16,938 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Withdraw | 61068481 | 43 hrs ago | IN | 0 S | 0.00618832 | ||||
| Withdraw | 61068084 | 43 hrs ago | IN | 0 S | 0.00188408 | ||||
| Withdraw | 61068064 | 43 hrs ago | IN | 0 S | 0.00188331 | ||||
| Emergency Withdr... | 61067516 | 43 hrs ago | IN | 0 S | 0.00172986 | ||||
| Withdraw | 61067496 | 43 hrs ago | IN | 0 S | 0.00174031 | ||||
| Deposit | 52289410 | 89 days ago | IN | 0 S | 0.0046336 | ||||
| Withdraw | 52289374 | 89 days ago | IN | 0 S | 0.01038345 | ||||
| Withdraw | 51519670 | 96 days ago | IN | 0 S | 0.0050654 | ||||
| Deposit | 49676650 | 110 days ago | IN | 0 S | 0.0038682 | ||||
| Withdraw | 49676621 | 110 days ago | IN | 0 S | 0.01005818 | ||||
| Withdraw | 47018318 | 132 days ago | IN | 0 S | 0.0087437 | ||||
| Deposit | 45776603 | 143 days ago | IN | 0 S | 0.00403458 | ||||
| Withdraw | 45776580 | 143 days ago | IN | 0 S | 0.00965349 | ||||
| Emergency Withdr... | 42724743 | 166 days ago | IN | 0 S | 0.00292902 | ||||
| Emergency Withdr... | 42572048 | 167 days ago | IN | 0 S | 0.00366041 | ||||
| Withdraw | 39653735 | 188 days ago | IN | 0 S | 0.00464061 | ||||
| Deposit | 39653676 | 188 days ago | IN | 0 S | 0.00972126 | ||||
| Withdraw | 34361918 | 223 days ago | IN | 0 S | 0.00497898 | ||||
| Withdraw | 34162807 | 225 days ago | IN | 0 S | 0.00438545 | ||||
| Withdraw | 34162693 | 225 days ago | IN | 0 S | 0.00401644 | ||||
| Deposit | 34162627 | 225 days ago | IN | 0 S | 0.00882778 | ||||
| Withdraw | 33286965 | 229 days ago | IN | 0 S | 0.00697268 | ||||
| Withdraw | 30681888 | 240 days ago | IN | 0 S | 0.00439051 | ||||
| Withdraw | 30681863 | 240 days ago | IN | 0 S | 0.00438935 | ||||
| Deposit | 30450678 | 241 days ago | IN | 0 S | 0.0034818 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Cross-Chain Transactions
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
GenesisPool
Compiler Version
v0.8.28+commit.7893614a
Contract Source Code (Solidity)
/**
*Submitted for verification at SonicScan.org on 2025-03-12
*/
// SPDX-License-Identifier: No License
// Hubble Genesis Contract
pragma solidity ^0.8.0;
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the subtraction of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b > a) return (false, 0);
return (true, a - b);
}
}
/**
* @dev Returns the multiplication of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the division of two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a / b);
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a % b);
}
}
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
return a + b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return a - b;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
return a * b;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator.
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return a % b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {trySub}.
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
unchecked {
require(b <= a, errorMessage);
return a - b;
}
}
/**
* @dev Returns the integer division of two unsigned integers, reverting with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a / b;
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting with custom message when dividing by zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryMod}.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a % b;
}
}
}
interface IERC20 {
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address to, uint256 value) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 value) external returns (bool);
function transferFrom(address from, address to, uint256 value) external returns (bool);
}
interface IERC165 {
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
interface IERC1363 is IERC20, IERC165 {
/*
* Note: the ERC-165 identifier for this interface is 0xb0202a11.
* 0xb0202a11 ===
* bytes4(keccak256('transferAndCall(address,uint256)')) ^
* bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^
* bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^
* bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^
* bytes4(keccak256('approveAndCall(address,uint256)')) ^
* bytes4(keccak256('approveAndCall(address,uint256,bytes)'))
*/
/**
* @dev Moves a `value` amount of tokens from the caller's account to `to`
* and then calls {IERC1363Receiver-onTransferReceived} on `to`.
* @param to The address which you want to transfer to.
* @param value The amount of tokens to be transferred.
* @return A boolean value indicating whether the operation succeeded unless throwing.
*/
function transferAndCall(address to, uint256 value) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from the caller's account to `to`
* and then calls {IERC1363Receiver-onTransferReceived} on `to`.
* @param to The address which you want to transfer to.
* @param value The amount of tokens to be transferred.
* @param data Additional data with no specified format, sent in call to `to`.
* @return A boolean value indicating whether the operation succeeded unless throwing.
*/
function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism
* and then calls {IERC1363Receiver-onTransferReceived} on `to`.
* @param from The address which you want to send tokens from.
* @param to The address which you want to transfer to.
* @param value The amount of tokens to be transferred.
* @return A boolean value indicating whether the operation succeeded unless throwing.
*/
function transferFromAndCall(address from, address to, uint256 value) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism
* and then calls {IERC1363Receiver-onTransferReceived} on `to`.
* @param from The address which you want to send tokens from.
* @param to The address which you want to transfer to.
* @param value The amount of tokens to be transferred.
* @param data Additional data with no specified format, sent in call to `to`.
* @return A boolean value indicating whether the operation succeeded unless throwing.
*/
function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);
/**
* @dev Sets a `value` amount of tokens as the allowance of `spender` over the
* caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.
* @param spender The address which will spend the funds.
* @param value The amount of tokens to be spent.
* @return A boolean value indicating whether the operation succeeded unless throwing.
*/
function approveAndCall(address spender, uint256 value) external returns (bool);
/**
* @dev Sets a `value` amount of tokens as the allowance of `spender` over the
* caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.
* @param spender The address which will spend the funds.
* @param value The amount of tokens to be spent.
* @param data Additional data with no specified format, sent in call to `spender`.
* @return A boolean value indicating whether the operation succeeded unless throwing.
*/
function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);
}
/**
* @title SafeERC20
* @dev Wrappers around ERC-20 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 {
/**
* @dev An operation with an ERC-20 token failed.
*/
error SafeERC20FailedOperation(address token);
/**
* @dev Indicates a failed `decreaseAllowance` request.
*/
error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);
/**
* @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,
* non-reverting calls are assumed to be successful.
*/
function safeTransfer(IERC20 token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));
}
/**
* @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the
* calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.
*/
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));
}
/**
* @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.
*/
function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {
return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));
}
/**
* @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.
*/
function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {
return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));
}
/**
* @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,
* non-reverting calls are assumed to be successful.
*
* IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the "client"
* smart contract uses ERC-7674 to set temporary allowances, then the "client" smart contract should avoid using
* this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract
* that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.
*/
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 oldAllowance = token.allowance(address(this), spender);
forceApprove(token, spender, oldAllowance + value);
}
/**
* @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no
* value, non-reverting calls are assumed to be successful.
*
* IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the "client"
* smart contract uses ERC-7674 to set temporary allowances, then the "client" smart contract should avoid using
* this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract
* that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.
*/
function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {
unchecked {
uint256 currentAllowance = token.allowance(address(this), spender);
if (currentAllowance < requestedDecrease) {
revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);
}
forceApprove(token, spender, currentAllowance - requestedDecrease);
}
}
/**
* @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,
* non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval
* to be set to zero before setting it to a non-zero value, such as USDT.
*
* NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function
* only sets the "standard" allowance. Any temporary allowance will remain active, in addition to the value being
* set here.
*/
function forceApprove(IERC20 token, address spender, uint256 value) internal {
bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));
if (!_callOptionalReturnBool(token, approvalCall)) {
_callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));
_callOptionalReturn(token, approvalCall);
}
}
/**
* @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no
* code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when
* targeting contracts.
*
* Reverts if the returned value is other than `true`.
*/
function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {
if (to.code.length == 0) {
safeTransfer(token, to, value);
} else if (!token.transferAndCall(to, value, data)) {
revert SafeERC20FailedOperation(address(token));
}
}
/**
* @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target
* has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when
* targeting contracts.
*
* Reverts if the returned value is other than `true`.
*/
function transferFromAndCallRelaxed(
IERC1363 token,
address from,
address to,
uint256 value,
bytes memory data
) internal {
if (to.code.length == 0) {
safeTransferFrom(token, from, to, value);
} else if (!token.transferFromAndCall(from, to, value, data)) {
revert SafeERC20FailedOperation(address(token));
}
}
/**
* @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no
* code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when
* targeting contracts.
*
* NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.
* Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}
* once without retrying, and relies on the returned value to be true.
*
* Reverts if the returned value is other than `true`.
*/
function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {
if (to.code.length == 0) {
forceApprove(token, to, value);
} else if (!token.approveAndCall(to, value, data)) {
revert SafeERC20FailedOperation(address(token));
}
}
/**
* @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).
*
* This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
uint256 returnSize;
uint256 returnValue;
assembly ("memory-safe") {
let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)
// bubble errors
if iszero(success) {
let ptr := mload(0x40)
returndatacopy(ptr, 0, returndatasize())
revert(ptr, returndatasize())
}
returnSize := returndatasize()
returnValue := mload(0)
}
if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {
revert SafeERC20FailedOperation(address(token));
}
}
/**
* @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).
*
* This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.
*/
function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {
bool success;
uint256 returnSize;
uint256 returnValue;
assembly ("memory-safe") {
success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)
returnSize := returndatasize()
returnValue := mload(0)
}
return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);
}
}
abstract contract ReentrancyGuard {
uint256 private constant NOT_ENTERED = 1;
uint256 private constant ENTERED = 2;
uint256 private _status;
error ReentrancyGuardReentrantCall();
constructor() {
_status = NOT_ENTERED;
}
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
if (_status == ENTERED) {
revert ReentrancyGuardReentrantCall();
}
_status = ENTERED;
}
function _nonReentrantAfter() private {
_status = NOT_ENTERED;
}
function _reentrancyGuardEntered() internal view returns (bool) {
return _status == ENTERED;
}
}
contract GenesisPool is ReentrancyGuard {
using SafeMath for uint256;
using SafeERC20 for IERC20;
address public operator;
struct UserInfo {
uint256 amount;
uint256 rewardDebt;
uint256 rewardDebtX;
}
struct PoolInfo {
IERC20 token;
uint256 depositFee;
uint256 allocationPoints;
uint256 allocationPointsX;
uint256 lastRewardTime;
uint256 accHubblePerShare;
uint256 accxHubblePerShare;
bool isStarted;
uint256 poolHubblePerSec;
uint256 poolxHubblePerSec;
}
IERC20 public hubble;
IERC20 public xhubble;
PoolInfo[] public poolInfo;
mapping(uint256 => mapping(address => UserInfo)) public userInfo;
uint256 public totalAllocPoint = 0;
uint256 public totalAllocPointX = 0;
uint256 public poolStartTime;
uint256 public poolEndTime;
uint256 public hubblePerSecond = 0 ether;
uint256 public xhubblePerSecond = 0 ether;
uint256 constant public runningTime = 10 days;
address public protocolReserves;
event Deposit(address indexed user, uint256 indexed pid, uint256 amount);
event Withdraw(address indexed user, uint256 indexed pid, uint256 amount);
event EmergencyWithdraw(address indexed user, uint256 indexed pid, uint256 amount);
event RewardPaid(address indexed user, uint256 amount);
event RewardPaidX(address indexed user, uint256 amount);
constructor(
address _hubble,
address _xhubble,
uint256 _poolStartTime,
address _protocolReserves
) {
require(block.timestamp < _poolStartTime, "pool cant be started in the past");
if (_hubble != address(0)) hubble = IERC20(_hubble);
if (_xhubble != address(0)) xhubble = IERC20(_xhubble);
poolStartTime = _poolStartTime;
poolEndTime = _poolStartTime + runningTime;
operator = msg.sender;
protocolReserves = _protocolReserves;
}
modifier onlyOperator() {
require(operator == msg.sender, "GenesisPool: caller is not the operator");
_;
}
function changeStartTime(uint256 newStartTime) public onlyOperator {
require(block.timestamp < newStartTime, "pool cant be started in the past");
require(block.timestamp < poolStartTime, "pool has already started");
poolStartTime = newStartTime;
poolEndTime = newStartTime + runningTime;
// Update lastRewardTime for all pools that were set to
// start before this new start time
uint256 length = poolInfo.length;
for (uint256 pid = 0; pid < length; ++pid) {
PoolInfo storage pool = poolInfo[pid];
if (pool.lastRewardTime < newStartTime) {
pool.lastRewardTime = newStartTime;
}
}
}
function changeReserves (address newReserves) public onlyOperator {
protocolReserves = newReserves;
}
function poolLength() external view returns (uint256) {
return poolInfo.length;
}
function checkPoolDuplicate(IERC20 _token) internal view {
uint256 length = poolInfo.length;
for (uint256 pid = 0; pid < length; ++pid) {
require(poolInfo[pid].token != _token, "GenesisPool: existing pool?");
}
}
// bulk add pools
function addBulk(
uint256[] calldata _allocPoints,
uint256[] calldata _allocPointsX,
uint256[] calldata _depFees,
IERC20[] calldata _tokens,
bool _withUpdate,
uint256 _lastRewardTime) external onlyOperator {
require(
_allocPoints.length == _depFees.length &&
_allocPoints.length == _tokens.length &&
_allocPoints.length == _allocPointsX.length,
"GenesisPool: invalid length"
);
for (uint256 i = 0; i < _allocPoints.length; i++) {
add(_allocPoints[i],
_allocPointsX[i],
_depFees[i],
_tokens[i],
_withUpdate,
_lastRewardTime);
}
}
function add(
uint256 _allocPoint,
uint256 _allocPointX,
uint256 _depFee,
IERC20 _token,
bool _withUpdate,
uint256 _lastRewardTime
) public onlyOperator {
checkPoolDuplicate(_token);
if (_withUpdate) {
massUpdatePools();
}
if (block.timestamp < poolStartTime) {
if (_lastRewardTime == 0) {
_lastRewardTime = poolStartTime;
} else {
if (_lastRewardTime < poolStartTime) {
_lastRewardTime = poolStartTime;
}
}
} else {
if (_lastRewardTime == 0 || _lastRewardTime < block.timestamp) {
_lastRewardTime = block.timestamp;
}
}
bool _isStarted = (_lastRewardTime <= poolStartTime) || (_lastRewardTime <= block.timestamp);
poolInfo.push(PoolInfo({
token: _token,
depositFee: _depFee,
allocationPoints: _allocPoint,
allocationPointsX: _allocPointX,
accHubblePerShare: 0,
accxHubblePerShare: 0,
poolHubblePerSec: _allocPoint,
poolxHubblePerSec: _allocPointX,
lastRewardTime: _lastRewardTime,
isStarted: _isStarted
}));
if (_isStarted) {
totalAllocPoint = totalAllocPoint.add(_allocPoint);
totalAllocPointX = totalAllocPointX.add(_allocPointX);
hubblePerSecond = hubblePerSecond.add(_allocPoint);
xhubblePerSecond = xhubblePerSecond.add(_allocPointX);
}
}
// Return accumulate rewards over the given _from to _to block.
function getGeneratedReward(uint256 _fromTime, uint256 _toTime) public view returns (uint256) {
if (_fromTime >= _toTime) return 0;
if (_toTime >= poolEndTime) {
if (_fromTime >= poolEndTime) return 0;
if (_fromTime <= poolStartTime) return poolEndTime.sub(poolStartTime).mul(hubblePerSecond);
return poolEndTime.sub(_fromTime).mul(hubblePerSecond);
} else {
if (_toTime <= poolStartTime) return 0;
if (_fromTime <= poolStartTime) return _toTime.sub(poolStartTime).mul(hubblePerSecond);
return _toTime.sub(_fromTime).mul(hubblePerSecond);
}
}
function getGeneratedRewardX(uint256 _fromTime, uint256 _toTime) public view returns (uint256) {
if (_fromTime >= _toTime) return 0;
if (_toTime >= poolEndTime) {
if (_fromTime >= poolEndTime) return 0;
if (_fromTime <= poolStartTime) return poolEndTime.sub(poolStartTime).mul(xhubblePerSecond);
return poolEndTime.sub(_fromTime).mul(xhubblePerSecond);
} else {
if (_toTime <= poolStartTime) return 0;
if (_fromTime <= poolStartTime) return _toTime.sub(poolStartTime).mul(xhubblePerSecond);
return _toTime.sub(_fromTime).mul(xhubblePerSecond);
}
}
function pendingHUBBLE(uint256 _pid, address _user) external view returns (uint256) {
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][_user];
uint256 accHubblePerShare = pool.accHubblePerShare;
uint256 tokenSupply = pool.token.balanceOf(address(this));
if (block.timestamp > pool.lastRewardTime && tokenSupply != 0) {
uint256 _generatedReward = getGeneratedReward(pool.lastRewardTime, block.timestamp);
uint256 _hubbleReward = _generatedReward.mul(pool.allocationPoints).div(totalAllocPoint);
accHubblePerShare = accHubblePerShare.add(_hubbleReward.mul(1e18).div(tokenSupply));
}
return user.amount.mul(accHubblePerShare).div(1e18).sub(user.rewardDebt);
}
function pendingXHUBBLE(uint256 _pid, address _user) external view returns (uint256) {
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][_user];
uint256 accXHubblePerShare = pool.accxHubblePerShare;
uint256 tokenSupply = pool.token.balanceOf(address(this));
if (block.timestamp > pool.lastRewardTime && tokenSupply != 0) {
uint256 _generatedReward = getGeneratedRewardX(pool.lastRewardTime, block.timestamp);
uint256 _xhubbleReward = _generatedReward.mul(pool.allocationPointsX).div(totalAllocPointX);
accXHubblePerShare = accXHubblePerShare.add(_xhubbleReward.mul(1e18).div(tokenSupply));
}
return user.amount.mul(accXHubblePerShare).div(1e18).sub(user.rewardDebtX);
}
function massUpdatePools() public {
uint256 length = poolInfo.length;
for (uint256 pid = 0; pid < length; ++pid) {
updatePool(pid);
}
}
function massUpdatePoolsInRange(uint256 _fromPid, uint256 _toPid) public {
require(_fromPid <= _toPid, "invalid range");
require(_toPid < poolInfo.length, "to pid out of range");
for (uint256 pid = _fromPid; pid <= _toPid; ++pid) {
updatePool(pid);
}
}
function updatePool(uint256 _pid) private {
PoolInfo storage pool = poolInfo[_pid];
if (block.timestamp <= pool.lastRewardTime) {
return;
}
uint256 tokenSupply = pool.token.balanceOf(address(this));
if (tokenSupply == 0) {
pool.lastRewardTime = block.timestamp;
return;
}
if (!pool.isStarted) {
pool.isStarted = true;
totalAllocPoint = totalAllocPoint.add(pool.allocationPoints);
totalAllocPointX = totalAllocPointX.add(pool.allocationPointsX);
hubblePerSecond = hubblePerSecond.add(pool.poolHubblePerSec);
xhubblePerSecond = xhubblePerSecond.add(pool.poolxHubblePerSec);
}
if (totalAllocPoint > 0) {
uint256 _generatedReward = getGeneratedReward(pool.lastRewardTime, block.timestamp);
uint256 _hubbleReward = _generatedReward.mul(pool.allocationPoints).div(totalAllocPoint);
pool.accHubblePerShare = pool.accHubblePerShare.add(_hubbleReward.mul(1e18).div(tokenSupply));
}
if (totalAllocPointX > 0) {
uint256 _generatedRewardX = getGeneratedRewardX(pool.lastRewardTime, block.timestamp);
uint256 _xhubbleReward = _generatedRewardX.mul(pool.allocationPointsX).div(totalAllocPointX);
pool.accxHubblePerShare = pool.accxHubblePerShare.add(_xhubbleReward.mul(1e18).div(tokenSupply));
}
pool.lastRewardTime = block.timestamp;
}
function deposit(uint256 _pid, uint256 _amount) public nonReentrant {
address _sender = msg.sender;
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][_sender];
updatePool(_pid);
if (user.amount > 0) {
uint256 _pendingHubble = user.amount.mul(pool.accHubblePerShare).div(1e18).sub(user.rewardDebt);
uint256 _pendingXHubble = user.amount.mul(pool.accxHubblePerShare).div(1e18).sub(user.rewardDebtX);
if (_pendingHubble > 0) {
safeHubbleTransfer(_sender, _pendingHubble);
emit RewardPaid(_sender, _pendingHubble);
}
if (_pendingXHubble > 0) {
safeXHubbleTransfer(_sender, _pendingXHubble);
emit RewardPaidX(_sender, _pendingXHubble);
}
}
if (_amount > 0 ) {
uint256 balBefore = pool.token.balanceOf(address(this));
pool.token.safeTransferFrom(_sender, address(this), _amount);
uint256 balAfter = pool.token.balanceOf(address(this));
// Actual amount may differ from provided _amount if the token has some transfer fees or other weird behavior.
uint256 actualAmount = balAfter - balBefore;
uint256 depositDebt = actualAmount.mul(pool.depositFee).div(10000);
user.amount = user.amount.add(actualAmount.sub(depositDebt));
pool.token.safeTransfer(protocolReserves, depositDebt);
}
updatePool(_pid);
user.rewardDebt = user.amount.mul(pool.accHubblePerShare).div(1e18);
user.rewardDebtX = user.amount.mul(pool.accxHubblePerShare).div(1e18);
emit Deposit(_sender, _pid, _amount);
}
// Withdraw LP tokens.
function withdraw(uint256 _pid, uint256 _amount) public nonReentrant {
address _sender = msg.sender;
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][_sender];
require(user.amount >= _amount, "withdraw: not good");
updatePool(_pid);
uint256 _pendingHubble = user.amount.mul(pool.accHubblePerShare).div(1e18).sub(user.rewardDebt);
uint256 _pendingXHubble = user.amount.mul(pool.accxHubblePerShare).div(1e18).sub(user.rewardDebtX);
if (_pendingHubble > 0) {
safeHubbleTransfer(_sender, _pendingHubble);
emit RewardPaid(_sender, _pendingHubble);
}
if (_pendingXHubble > 0) {
safeXHubbleTransfer(_sender, _pendingXHubble);
emit RewardPaidX(_sender, _pendingXHubble);
}
if (_amount > 0) {
user.amount = user.amount.sub(_amount);
pool.token.safeTransfer(_sender, _amount);
}
user.rewardDebt = user.amount.mul(pool.accHubblePerShare).div(1e18);
user.rewardDebtX = user.amount.mul(pool.accxHubblePerShare).div(1e18);
emit Withdraw(_sender, _pid, _amount);
}
function emergencyWithdraw(uint256 _pid) public nonReentrant {
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][msg.sender];
uint256 _amount = user.amount;
user.amount = 0;
user.rewardDebt = 0;
user.rewardDebtX = 0;
pool.token.safeTransfer(msg.sender, _amount);
emit EmergencyWithdraw(msg.sender, _pid, _amount);
}
function safeHubbleTransfer(address _to, uint256 _amount) internal {
uint256 _hubbleBal = hubble.balanceOf(address(this));
if (_hubbleBal > 0) {
if (_amount > _hubbleBal) {
hubble.safeTransfer(_to, _hubbleBal);
} else {
hubble.safeTransfer(_to, _amount);
}
}
}
function safeXHubbleTransfer(address _to, uint256 _amount) internal {
uint256 _xhubbleBal = xhubble.balanceOf(address(this));
if (_xhubbleBal > 0) {
if (_amount > _xhubbleBal) {
xhubble.safeTransfer(_to, _xhubbleBal);
} else {
xhubble.safeTransfer(_to, _amount);
}
}
}
function setOperator(address _operator) external onlyOperator {
operator = _operator;
}
function governanceRecoverUnsupported(IERC20 _token, uint256 amount, address to) external onlyOperator {
// Prevent recovery of LP tokens
uint256 length = poolInfo.length;
for (uint256 pid = 0; pid < length; ++pid) {
PoolInfo storage pool = poolInfo[pid];
require(_token != pool.token, "ShareRewardPool: Token cannot be pool token");
}
// Prevent recovery of reward tokens
require(_token != hubble, "ShareRewardPool: Cannot recover HUBBLE token");
require(_token != xhubble, "ShareRewardPool: Cannot recover xHUBBLE token");
_token.safeTransfer(to, amount);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_hubble","type":"address"},{"internalType":"address","name":"_xhubble","type":"address"},{"internalType":"uint256","name":"_poolStartTime","type":"uint256"},{"internalType":"address","name":"_protocolReserves","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardPaidX","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"uint256","name":"_allocPointX","type":"uint256"},{"internalType":"uint256","name":"_depFee","type":"uint256"},{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"bool","name":"_withUpdate","type":"bool"},{"internalType":"uint256","name":"_lastRewardTime","type":"uint256"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_allocPoints","type":"uint256[]"},{"internalType":"uint256[]","name":"_allocPointsX","type":"uint256[]"},{"internalType":"uint256[]","name":"_depFees","type":"uint256[]"},{"internalType":"contract IERC20[]","name":"_tokens","type":"address[]"},{"internalType":"bool","name":"_withUpdate","type":"bool"},{"internalType":"uint256","name":"_lastRewardTime","type":"uint256"}],"name":"addBulk","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newReserves","type":"address"}],"name":"changeReserves","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newStartTime","type":"uint256"}],"name":"changeStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fromTime","type":"uint256"},{"internalType":"uint256","name":"_toTime","type":"uint256"}],"name":"getGeneratedReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fromTime","type":"uint256"},{"internalType":"uint256","name":"_toTime","type":"uint256"}],"name":"getGeneratedRewardX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"governanceRecoverUnsupported","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"hubble","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hubblePerSecond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fromPid","type":"uint256"},{"internalType":"uint256","name":"_toPid","type":"uint256"}],"name":"massUpdatePoolsInRange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingHUBBLE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingXHUBBLE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolEndTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"depositFee","type":"uint256"},{"internalType":"uint256","name":"allocationPoints","type":"uint256"},{"internalType":"uint256","name":"allocationPointsX","type":"uint256"},{"internalType":"uint256","name":"lastRewardTime","type":"uint256"},{"internalType":"uint256","name":"accHubblePerShare","type":"uint256"},{"internalType":"uint256","name":"accxHubblePerShare","type":"uint256"},{"internalType":"bool","name":"isStarted","type":"bool"},{"internalType":"uint256","name":"poolHubblePerSec","type":"uint256"},{"internalType":"uint256","name":"poolxHubblePerSec","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"protocolReserves","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"runningTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"}],"name":"setOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocPointX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"},{"internalType":"uint256","name":"rewardDebtX","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"xhubble","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"xhubblePerSecond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]Contract Creation Code
60806040525f6006555f6007555f600a555f600b5534801561001f575f5ffd5b5060405161299638038061299683398101604081905261003e91610152565b60015f554282116100955760405162461bcd60e51b815260206004820181905260248201527f706f6f6c2063616e74206265207374617274656420696e207468652070617374604482015260640160405180910390fd5b6001600160a01b038416156100c057600280546001600160a01b0319166001600160a01b0386161790555b6001600160a01b038316156100eb57600380546001600160a01b0319166001600160a01b0385161790555b60088290556100fd620d2f008361019c565b60095560018054336001600160a01b031991821617909155600c80549091166001600160a01b0392909216919091179055506101c1915050565b80516001600160a01b038116811461014d575f5ffd5b919050565b5f5f5f5f60808587031215610165575f5ffd5b61016e85610137565b935061017c60208601610137565b92506040850151915061019160608601610137565b905092959194509250565b808201808211156101bb57634e487b7160e01b5f52601160045260245ffd5b92915050565b6127c8806101ce5f395ff3fe608060405234801561000f575f5ffd5b50600436106101c6575f3560e01c80636e271dd5116100fe5780639691b7421161009e578063e2bbb1581161006e578063e2bbb15814610462578063e571b21c14610475578063ead9ba2614610488578063fb094bf714610491575f5ffd5b80639691b74214610409578063b3ab15fb1461041c578063b947a88d1461042f578063d681a44914610442575f5ffd5b80637f169e91116100d95780637f169e91146103855780638aa5b2c31461039857806393f1a40b146103ab578063943f013d146103ff575f5ffd5b80636e271dd51461036a578063727b4831146103735780637865705b1461037c575f5ffd5b8063441a3e7011610169578063570ca73511610144578063570ca735146103265780635f96dc111461034657806362f07eb91461034f578063630b5ba114610362575f5ffd5b8063441a3e70146102eb5780635312ea8e1461030057806354575af414610313575f5ffd5b806317caf6f1116101a457806317caf6f11461026a578063231f0c6a146102735780632b4f05e8146102865780633e284993146102cb575f5ffd5b8063081e3eda146101ca5780631526fe27146101e15780631627ac7c14610257575b5f5ffd5b6004545b6040519081526020015b60405180910390f35b6101f46101ef3660046123f5565b6104a4565b6040805173ffffffffffffffffffffffffffffffffffffffff909b168b5260208b0199909952978901969096526060880194909452608087019290925260a086015260c0850152151560e0840152610100830152610120820152610140016101d8565b6101ce61026536600461242d565b610520565b6101ce60065481565b6101ce61028136600461245b565b6106a9565b6002546102a69073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101d8565b6003546102a69073ffffffffffffffffffffffffffffffffffffffff1681565b6102fe6102f936600461245b565b610764565b005b6102fe61030e3660046123f5565b610a3a565b6102fe61032136600461247b565b610aff565b6001546102a69073ffffffffffffffffffffffffffffffffffffffff1681565b6101ce60085481565b6102fe61035d3660046124ce565b610e0a565b6102fe6110ab565b6101ce60095481565b6101ce600a5481565b6101ce600b5481565b6101ce61039336600461242d565b6110c9565b6102fe6103a63660046123f5565b611232565b6103e46103b936600461242d565b600560209081525f928352604080842090915290825290208054600182015460029092015490919083565b604080519384526020840192909252908201526060016101d8565b6101ce620d2f0081565b6101ce61041736600461245b565b611413565b6102fe61042a366004612526565b6114c1565b6102fe61043d36600461245b565b6115af565b600c546102a69073ffffffffffffffffffffffffffffffffffffffff1681565b6102fe61047036600461245b565b6116a6565b6102fe610483366004612526565b611aa1565b6101ce60075481565b6102fe61049f366004612589565b611b8f565b600481815481106104b3575f80fd5b5f9182526020909120600a9091020180546001820154600283015460038401546004850154600586015460068701546007880154600889015460099099015473ffffffffffffffffffffffffffffffffffffffff909816995095979496939592949193909260ff1691908a565b5f5f6004848154811061053557610535612675565b5f918252602080832087845260058252604080852073ffffffffffffffffffffffffffffffffffffffff89811687529352808520600a949094029091016006810154815492517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015291965093949291909116906370a0823190602401602060405180830381865afa1580156105d3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105f791906126a2565b905083600401544211801561060b57508015155b1561066c575f61061f856004015442611413565b90505f61064560075461063f886003015485611d5090919063ffffffff16565b90611d62565b90506106676106608461063f84670de0b6b3a7640000611d50565b8590611d6d565b935050505b61069c8360020154610696670de0b6b3a764000061063f86885f0154611d5090919063ffffffff16565b90611d78565b9450505050505b92915050565b5f8183106106b857505f6106a3565b600954821061071f5760095483106106d157505f6106a3565b6008548311610704576106fd600a546106f7600854600954611d7890919063ffffffff16565b90611d50565b90506106a3565b6106fd600a546106f785600954611d7890919063ffffffff16565b600854821161072f57505f6106a3565b6008548311610753576106fd600a546106f760085485611d7890919063ffffffff16565b600a546106fd906106f78486611d78565b61076c611d83565b5f3390505f6004848154811061078457610784612675565b5f918252602080832087845260058252604080852073ffffffffffffffffffffffffffffffffffffffff8816865290925292208054600a9092029092019250841115610831576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f77697468647261773a206e6f7420676f6f64000000000000000000000000000060448201526064015b60405180910390fd5b61083a85611dc4565b5f6108698260010154610696670de0b6b3a764000061063f8760050154875f0154611d5090919063ffffffff16565b90505f61089a8360020154610696670de0b6b3a764000061063f8860060154885f0154611d5090919063ffffffff16565b905081156108fd576108ac8583611ff7565b8473ffffffffffffffffffffffffffffffffffffffff167fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e0486836040516108f491815260200190565b60405180910390a25b801561095e5761090d85826120df565b8473ffffffffffffffffffffffffffffffffffffffff167fa8ea518dd0eb22db58eeea0fc63b44cd8c8b259df2e097eae82251b0eeea471d8260405161095591815260200190565b60405180910390a25b85156109955782546109709087611d78565b835583546109959073ffffffffffffffffffffffffffffffffffffffff1686886121c3565b600584015483546109b391670de0b6b3a76400009161063f91611d50565b6001840155600684015483546109d691670de0b6b3a76400009161063f91611d50565b6002840155604051868152879073ffffffffffffffffffffffffffffffffffffffff8716907ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689060200160405180910390a35050505050610a3660015f55565b5050565b610a42611d83565b5f60048281548110610a5657610a56612675565b5f918252602080832085845260058252604080852033808752935284208054858255600182018690556002820195909555600a909302018054909450919291610ab99173ffffffffffffffffffffffffffffffffffffffff9190911690836121c3565b604051818152849033907fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae05959060200160405180910390a3505050610afc60015f55565b50565b60015473ffffffffffffffffffffffffffffffffffffffff163314610ba6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f47656e65736973506f6f6c3a2063616c6c6572206973206e6f7420746865206f60448201527f70657261746f72000000000000000000000000000000000000000000000000006064820152608401610828565b6004545f5b81811015610c8c575f60048281548110610bc757610bc7612675565b5f9182526020909120600a90910201805490915073ffffffffffffffffffffffffffffffffffffffff90811690871603610c83576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f5368617265526577617264506f6f6c3a20546f6b656e2063616e6e6f7420626560448201527f20706f6f6c20746f6b656e0000000000000000000000000000000000000000006064820152608401610828565b50600101610bab565b5060025473ffffffffffffffffffffffffffffffffffffffff90811690851603610d38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f5368617265526577617264506f6f6c3a2043616e6e6f74207265636f7665722060448201527f485542424c4520746f6b656e00000000000000000000000000000000000000006064820152608401610828565b60035473ffffffffffffffffffffffffffffffffffffffff90811690851603610de3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f5368617265526577617264506f6f6c3a2043616e6e6f74207265636f7665722060448201527f78485542424c4520746f6b656e000000000000000000000000000000000000006064820152608401610828565b610e0473ffffffffffffffffffffffffffffffffffffffff851683856121c3565b50505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610eb1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f47656e65736973506f6f6c3a2063616c6c6572206973206e6f7420746865206f60448201527f70657261746f72000000000000000000000000000000000000000000000000006064820152608401610828565b610eba83612244565b8115610ec857610ec86110ab565b600854421015610ef657805f03610ee25750600854610f0a565b600854811015610ef157506008545b610f0a565b801580610f0257504281105b15610f0a5750425b5f60085482111580610f1c5750428211155b905060046040518061014001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020018781526020018981526020018881526020018481526020015f81526020015f8152602001831515815260200189815260200188815250908060018154018082558091505060019003905f5260205f2090600a02015f909190919091505f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e0820151816007015f6101000a81548160ff02191690831515021790555061010082015181600801556101208201518160090155505080156110a25760065461106e9088611d6d565b60065560075461107e9087611d6d565b600755600a5461108e9088611d6d565b600a55600b5461109e9087611d6d565b600b555b50505050505050565b6004545f5b81811015610a36576110c181611dc4565b6001016110b0565b5f5f600484815481106110de576110de612675565b5f91825260208083208784526005808352604080862073ffffffffffffffffffffffffffffffffffffffff8a811688529452808620600a9590950290920190810154815492517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015291965093949291909116906370a0823190602401602060405180830381865afa15801561117c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111a091906126a2565b90508360040154421180156111b457508015155b15611208575f6111c88560040154426106a9565b90505f6111e860065461063f886002015485611d5090919063ffffffff16565b90506112036106608461063f84670de0b6b3a7640000611d50565b935050505b61069c8360010154610696670de0b6b3a764000061063f86885f0154611d5090919063ffffffff16565b60015473ffffffffffffffffffffffffffffffffffffffff1633146112d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f47656e65736973506f6f6c3a2063616c6c6572206973206e6f7420746865206f60448201527f70657261746f72000000000000000000000000000000000000000000000000006064820152608401610828565b804210611342576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f706f6f6c2063616e74206265207374617274656420696e2074686520706173746044820152606401610828565b60085442106113ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f706f6f6c2068617320616c7265616479207374617274656400000000000000006044820152606401610828565b60088190556113bf620d2f00826126e6565b6009556004545f5b8181101561140e575f600482815481106113e3576113e3612675565b905f5260205f2090600a02019050838160040154101561140557600481018490555b506001016113c7565b505050565b5f81831061142257505f6106a3565b600954821061147c57600954831061143b57505f6106a3565b6008548311611461576106fd600b546106f7600854600954611d7890919063ffffffff16565b6106fd600b546106f785600954611d7890919063ffffffff16565b600854821161148c57505f6106a3565b60085483116114b0576106fd600b546106f760085485611d7890919063ffffffff16565b600b546106fd906106f78486611d78565b60015473ffffffffffffffffffffffffffffffffffffffff163314611568576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f47656e65736973506f6f6c3a2063616c6c6572206973206e6f7420746865206f60448201527f70657261746f72000000000000000000000000000000000000000000000000006064820152608401610828565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b80821115611619576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f696e76616c69642072616e6765000000000000000000000000000000000000006044820152606401610828565b6004548110611684576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f746f20706964206f7574206f662072616e6765000000000000000000000000006044820152606401610828565b815b81811161140e5761169681611dc4565b61169f816126f9565b9050611686565b6116ae611d83565b5f3390505f600484815481106116c6576116c6612675565b5f918252602080832087845260058252604080852073ffffffffffffffffffffffffffffffffffffffff881686529092529220600a909102909101915061170c85611dc4565b80541561183a575f6117428260010154610696670de0b6b3a764000061063f8760050154875f0154611d5090919063ffffffff16565b90505f6117738360020154610696670de0b6b3a764000061063f8860060154885f0154611d5090919063ffffffff16565b905081156117d6576117858583611ff7565b8473ffffffffffffffffffffffffffffffffffffffff167fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e0486836040516117cd91815260200190565b60405180910390a25b8015611837576117e685826120df565b8473ffffffffffffffffffffffffffffffffffffffff167fa8ea518dd0eb22db58eeea0fc63b44cd8c8b259df2e097eae82251b0eeea471d8260405161182e91815260200190565b60405180910390a25b50505b83156119f95781546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156118ab573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118cf91906126a2565b83549091506118f69073ffffffffffffffffffffffffffffffffffffffff16853088612310565b82546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015611961573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061198591906126a2565b90505f6119928383612730565b90505f6119b261271061063f886001015485611d5090919063ffffffff16565b90506119c96119c18383611d78565b865490611d6d565b8555600c5486546119f49173ffffffffffffffffffffffffffffffffffffffff9182169116836121c3565b505050505b611a0285611dc4565b60058201548154611a2091670de0b6b3a76400009161063f91611d50565b600182015560068201548154611a4391670de0b6b3a76400009161063f91611d50565b6002820155604051848152859073ffffffffffffffffffffffffffffffffffffffff8516907f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a159060200160405180910390a3505050610a3660015f55565b60015473ffffffffffffffffffffffffffffffffffffffff163314611b48576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f47656e65736973506f6f6c3a2063616c6c6572206973206e6f7420746865206f60448201527f70657261746f72000000000000000000000000000000000000000000000000006064820152608401610828565b600c80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60015473ffffffffffffffffffffffffffffffffffffffff163314611c36576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f47656e65736973506f6f6c3a2063616c6c6572206973206e6f7420746865206f60448201527f70657261746f72000000000000000000000000000000000000000000000000006064820152608401610828565b8885148015611c4457508883145b8015611c4f57508887145b611cb5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f47656e65736973506f6f6c3a20696e76616c6964206c656e67746800000000006044820152606401610828565b5f5b89811015611d4357611d3b8b8b83818110611cd457611cd4612675565b905060200201358a8a84818110611ced57611ced612675565b90506020020135898985818110611d0657611d06612675565b90506020020135888886818110611d1f57611d1f612675565b9050602002016020810190611d349190612526565b8787610e0a565b600101611cb7565b5050505050505050505050565b5f611d5b8284612743565b9392505050565b5f611d5b828461275a565b5f611d5b82846126e6565b5f611d5b8284612730565b60025f5403611dbe576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f55565b5f60048281548110611dd857611dd8612675565b905f5260205f2090600a0201905080600401544211611df5575050565b80546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015611e60573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e8491906126a2565b9050805f03611e9857504260049091015550565b600782015460ff16611f22576007820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556002820154600654611ee291611d6d565b6006556003820154600754611ef691611d6d565b6007556008820154600a54611f0a91611d6d565b600a556009820154600b54611f1e91611d6d565b600b555b60065415611f87575f611f398360040154426106a9565b90505f611f5960065461063f866002015485611d5090919063ffffffff16565b9050611f7f611f748461063f84670de0b6b3a7640000611d50565b600586015490611d6d565b600585015550505b60075415611fec575f611f9e836004015442611413565b90505f611fbe60075461063f866003015485611d5090919063ffffffff16565b9050611fe4611fd98461063f84670de0b6b3a7640000611d50565b600686015490611d6d565b600685015550505b504260049091015550565b6002546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015612063573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061208791906126a2565b9050801561140e57808211156120bb5760025461140e9073ffffffffffffffffffffffffffffffffffffffff1684836121c3565b60025461140e9073ffffffffffffffffffffffffffffffffffffffff1684846121c3565b6003546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa15801561214b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061216f91906126a2565b9050801561140e57808211156121a35760035461140e9073ffffffffffffffffffffffffffffffffffffffff1684836121c3565b60035461140e9073ffffffffffffffffffffffffffffffffffffffff1684845b60405173ffffffffffffffffffffffffffffffffffffffff83811660248301526044820183905261140e91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612356565b6004545f5b8181101561140e578273ffffffffffffffffffffffffffffffffffffffff166004828154811061227b5761227b612675565b5f9182526020909120600a909102015473ffffffffffffffffffffffffffffffffffffffff1603612308576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f47656e65736973506f6f6c3a206578697374696e6720706f6f6c3f00000000006044820152606401610828565b600101612249565b60405173ffffffffffffffffffffffffffffffffffffffff8481166024830152838116604483015260648201839052610e049186918216906323b872dd906084016121fd565b5f5f60205f8451602086015f885af180612375576040513d5f823e3d81fd5b50505f513d9150811561238c5780600114156123a6565b73ffffffffffffffffffffffffffffffffffffffff84163b155b15610e04576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610828565b5f60208284031215612405575f5ffd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610afc575f5ffd5b5f5f6040838503121561243e575f5ffd5b8235915060208301356124508161240c565b809150509250929050565b5f5f6040838503121561246c575f5ffd5b50508035926020909101359150565b5f5f5f6060848603121561248d575f5ffd5b83356124988161240c565b92506020840135915060408401356124af8161240c565b809150509250925092565b803580151581146124c9575f5ffd5b919050565b5f5f5f5f5f5f60c087890312156124e3575f5ffd5b86359550602087013594506040870135935060608701356125038161240c565b9250612511608088016124ba565b9598949750929591949360a090920135925050565b5f60208284031215612536575f5ffd5b8135611d5b8161240c565b5f5f83601f840112612551575f5ffd5b50813567ffffffffffffffff811115612568575f5ffd5b6020830191508360208260051b8501011115612582575f5ffd5b9250929050565b5f5f5f5f5f5f5f5f5f5f60c08b8d0312156125a2575f5ffd5b8a3567ffffffffffffffff8111156125b8575f5ffd5b6125c48d828e01612541565b909b5099505060208b013567ffffffffffffffff8111156125e3575f5ffd5b6125ef8d828e01612541565b90995097505060408b013567ffffffffffffffff81111561260e575f5ffd5b61261a8d828e01612541565b90975095505060608b013567ffffffffffffffff811115612639575f5ffd5b6126458d828e01612541565b9095509350612658905060808c016124ba565b91505f60a08c01359050809150509295989b9194979a5092959850565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f602082840312156126b2575f5ffd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156106a3576106a36126b9565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612729576127296126b9565b5060010190565b818103818111156106a3576106a36126b9565b80820281158282048414176106a3576106a36126b9565b5f8261278d577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b50049056fea264697066735822122051755f2b5676d6a33d75394ec9498b6eaec891c09391816693e142bdf76e551264736f6c634300081c0033000000000000000000000000d441a37aa73fc1ddd2db99fc4c92f233b7d41cbd00000000000000000000000014d1db2367312ee3bba54905b64f3bf0f0d677a80000000000000000000000000000000000000000000000000000000067d4b4f0000000000000000000000000d5a638a1e6d55dee90688e65f15bfa3f08d869a1
Deployed Bytecode
0x608060405234801561000f575f5ffd5b50600436106101c6575f3560e01c80636e271dd5116100fe5780639691b7421161009e578063e2bbb1581161006e578063e2bbb15814610462578063e571b21c14610475578063ead9ba2614610488578063fb094bf714610491575f5ffd5b80639691b74214610409578063b3ab15fb1461041c578063b947a88d1461042f578063d681a44914610442575f5ffd5b80637f169e91116100d95780637f169e91146103855780638aa5b2c31461039857806393f1a40b146103ab578063943f013d146103ff575f5ffd5b80636e271dd51461036a578063727b4831146103735780637865705b1461037c575f5ffd5b8063441a3e7011610169578063570ca73511610144578063570ca735146103265780635f96dc111461034657806362f07eb91461034f578063630b5ba114610362575f5ffd5b8063441a3e70146102eb5780635312ea8e1461030057806354575af414610313575f5ffd5b806317caf6f1116101a457806317caf6f11461026a578063231f0c6a146102735780632b4f05e8146102865780633e284993146102cb575f5ffd5b8063081e3eda146101ca5780631526fe27146101e15780631627ac7c14610257575b5f5ffd5b6004545b6040519081526020015b60405180910390f35b6101f46101ef3660046123f5565b6104a4565b6040805173ffffffffffffffffffffffffffffffffffffffff909b168b5260208b0199909952978901969096526060880194909452608087019290925260a086015260c0850152151560e0840152610100830152610120820152610140016101d8565b6101ce61026536600461242d565b610520565b6101ce60065481565b6101ce61028136600461245b565b6106a9565b6002546102a69073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101d8565b6003546102a69073ffffffffffffffffffffffffffffffffffffffff1681565b6102fe6102f936600461245b565b610764565b005b6102fe61030e3660046123f5565b610a3a565b6102fe61032136600461247b565b610aff565b6001546102a69073ffffffffffffffffffffffffffffffffffffffff1681565b6101ce60085481565b6102fe61035d3660046124ce565b610e0a565b6102fe6110ab565b6101ce60095481565b6101ce600a5481565b6101ce600b5481565b6101ce61039336600461242d565b6110c9565b6102fe6103a63660046123f5565b611232565b6103e46103b936600461242d565b600560209081525f928352604080842090915290825290208054600182015460029092015490919083565b604080519384526020840192909252908201526060016101d8565b6101ce620d2f0081565b6101ce61041736600461245b565b611413565b6102fe61042a366004612526565b6114c1565b6102fe61043d36600461245b565b6115af565b600c546102a69073ffffffffffffffffffffffffffffffffffffffff1681565b6102fe61047036600461245b565b6116a6565b6102fe610483366004612526565b611aa1565b6101ce60075481565b6102fe61049f366004612589565b611b8f565b600481815481106104b3575f80fd5b5f9182526020909120600a9091020180546001820154600283015460038401546004850154600586015460068701546007880154600889015460099099015473ffffffffffffffffffffffffffffffffffffffff909816995095979496939592949193909260ff1691908a565b5f5f6004848154811061053557610535612675565b5f918252602080832087845260058252604080852073ffffffffffffffffffffffffffffffffffffffff89811687529352808520600a949094029091016006810154815492517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015291965093949291909116906370a0823190602401602060405180830381865afa1580156105d3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105f791906126a2565b905083600401544211801561060b57508015155b1561066c575f61061f856004015442611413565b90505f61064560075461063f886003015485611d5090919063ffffffff16565b90611d62565b90506106676106608461063f84670de0b6b3a7640000611d50565b8590611d6d565b935050505b61069c8360020154610696670de0b6b3a764000061063f86885f0154611d5090919063ffffffff16565b90611d78565b9450505050505b92915050565b5f8183106106b857505f6106a3565b600954821061071f5760095483106106d157505f6106a3565b6008548311610704576106fd600a546106f7600854600954611d7890919063ffffffff16565b90611d50565b90506106a3565b6106fd600a546106f785600954611d7890919063ffffffff16565b600854821161072f57505f6106a3565b6008548311610753576106fd600a546106f760085485611d7890919063ffffffff16565b600a546106fd906106f78486611d78565b61076c611d83565b5f3390505f6004848154811061078457610784612675565b5f918252602080832087845260058252604080852073ffffffffffffffffffffffffffffffffffffffff8816865290925292208054600a9092029092019250841115610831576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f77697468647261773a206e6f7420676f6f64000000000000000000000000000060448201526064015b60405180910390fd5b61083a85611dc4565b5f6108698260010154610696670de0b6b3a764000061063f8760050154875f0154611d5090919063ffffffff16565b90505f61089a8360020154610696670de0b6b3a764000061063f8860060154885f0154611d5090919063ffffffff16565b905081156108fd576108ac8583611ff7565b8473ffffffffffffffffffffffffffffffffffffffff167fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e0486836040516108f491815260200190565b60405180910390a25b801561095e5761090d85826120df565b8473ffffffffffffffffffffffffffffffffffffffff167fa8ea518dd0eb22db58eeea0fc63b44cd8c8b259df2e097eae82251b0eeea471d8260405161095591815260200190565b60405180910390a25b85156109955782546109709087611d78565b835583546109959073ffffffffffffffffffffffffffffffffffffffff1686886121c3565b600584015483546109b391670de0b6b3a76400009161063f91611d50565b6001840155600684015483546109d691670de0b6b3a76400009161063f91611d50565b6002840155604051868152879073ffffffffffffffffffffffffffffffffffffffff8716907ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689060200160405180910390a35050505050610a3660015f55565b5050565b610a42611d83565b5f60048281548110610a5657610a56612675565b5f918252602080832085845260058252604080852033808752935284208054858255600182018690556002820195909555600a909302018054909450919291610ab99173ffffffffffffffffffffffffffffffffffffffff9190911690836121c3565b604051818152849033907fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae05959060200160405180910390a3505050610afc60015f55565b50565b60015473ffffffffffffffffffffffffffffffffffffffff163314610ba6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f47656e65736973506f6f6c3a2063616c6c6572206973206e6f7420746865206f60448201527f70657261746f72000000000000000000000000000000000000000000000000006064820152608401610828565b6004545f5b81811015610c8c575f60048281548110610bc757610bc7612675565b5f9182526020909120600a90910201805490915073ffffffffffffffffffffffffffffffffffffffff90811690871603610c83576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f5368617265526577617264506f6f6c3a20546f6b656e2063616e6e6f7420626560448201527f20706f6f6c20746f6b656e0000000000000000000000000000000000000000006064820152608401610828565b50600101610bab565b5060025473ffffffffffffffffffffffffffffffffffffffff90811690851603610d38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f5368617265526577617264506f6f6c3a2043616e6e6f74207265636f7665722060448201527f485542424c4520746f6b656e00000000000000000000000000000000000000006064820152608401610828565b60035473ffffffffffffffffffffffffffffffffffffffff90811690851603610de3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f5368617265526577617264506f6f6c3a2043616e6e6f74207265636f7665722060448201527f78485542424c4520746f6b656e000000000000000000000000000000000000006064820152608401610828565b610e0473ffffffffffffffffffffffffffffffffffffffff851683856121c3565b50505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610eb1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f47656e65736973506f6f6c3a2063616c6c6572206973206e6f7420746865206f60448201527f70657261746f72000000000000000000000000000000000000000000000000006064820152608401610828565b610eba83612244565b8115610ec857610ec86110ab565b600854421015610ef657805f03610ee25750600854610f0a565b600854811015610ef157506008545b610f0a565b801580610f0257504281105b15610f0a5750425b5f60085482111580610f1c5750428211155b905060046040518061014001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020018781526020018981526020018881526020018481526020015f81526020015f8152602001831515815260200189815260200188815250908060018154018082558091505060019003905f5260205f2090600a02015f909190919091505f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e0820151816007015f6101000a81548160ff02191690831515021790555061010082015181600801556101208201518160090155505080156110a25760065461106e9088611d6d565b60065560075461107e9087611d6d565b600755600a5461108e9088611d6d565b600a55600b5461109e9087611d6d565b600b555b50505050505050565b6004545f5b81811015610a36576110c181611dc4565b6001016110b0565b5f5f600484815481106110de576110de612675565b5f91825260208083208784526005808352604080862073ffffffffffffffffffffffffffffffffffffffff8a811688529452808620600a9590950290920190810154815492517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015291965093949291909116906370a0823190602401602060405180830381865afa15801561117c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111a091906126a2565b90508360040154421180156111b457508015155b15611208575f6111c88560040154426106a9565b90505f6111e860065461063f886002015485611d5090919063ffffffff16565b90506112036106608461063f84670de0b6b3a7640000611d50565b935050505b61069c8360010154610696670de0b6b3a764000061063f86885f0154611d5090919063ffffffff16565b60015473ffffffffffffffffffffffffffffffffffffffff1633146112d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f47656e65736973506f6f6c3a2063616c6c6572206973206e6f7420746865206f60448201527f70657261746f72000000000000000000000000000000000000000000000000006064820152608401610828565b804210611342576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f706f6f6c2063616e74206265207374617274656420696e2074686520706173746044820152606401610828565b60085442106113ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f706f6f6c2068617320616c7265616479207374617274656400000000000000006044820152606401610828565b60088190556113bf620d2f00826126e6565b6009556004545f5b8181101561140e575f600482815481106113e3576113e3612675565b905f5260205f2090600a02019050838160040154101561140557600481018490555b506001016113c7565b505050565b5f81831061142257505f6106a3565b600954821061147c57600954831061143b57505f6106a3565b6008548311611461576106fd600b546106f7600854600954611d7890919063ffffffff16565b6106fd600b546106f785600954611d7890919063ffffffff16565b600854821161148c57505f6106a3565b60085483116114b0576106fd600b546106f760085485611d7890919063ffffffff16565b600b546106fd906106f78486611d78565b60015473ffffffffffffffffffffffffffffffffffffffff163314611568576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f47656e65736973506f6f6c3a2063616c6c6572206973206e6f7420746865206f60448201527f70657261746f72000000000000000000000000000000000000000000000000006064820152608401610828565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b80821115611619576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f696e76616c69642072616e6765000000000000000000000000000000000000006044820152606401610828565b6004548110611684576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f746f20706964206f7574206f662072616e6765000000000000000000000000006044820152606401610828565b815b81811161140e5761169681611dc4565b61169f816126f9565b9050611686565b6116ae611d83565b5f3390505f600484815481106116c6576116c6612675565b5f918252602080832087845260058252604080852073ffffffffffffffffffffffffffffffffffffffff881686529092529220600a909102909101915061170c85611dc4565b80541561183a575f6117428260010154610696670de0b6b3a764000061063f8760050154875f0154611d5090919063ffffffff16565b90505f6117738360020154610696670de0b6b3a764000061063f8860060154885f0154611d5090919063ffffffff16565b905081156117d6576117858583611ff7565b8473ffffffffffffffffffffffffffffffffffffffff167fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e0486836040516117cd91815260200190565b60405180910390a25b8015611837576117e685826120df565b8473ffffffffffffffffffffffffffffffffffffffff167fa8ea518dd0eb22db58eeea0fc63b44cd8c8b259df2e097eae82251b0eeea471d8260405161182e91815260200190565b60405180910390a25b50505b83156119f95781546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156118ab573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118cf91906126a2565b83549091506118f69073ffffffffffffffffffffffffffffffffffffffff16853088612310565b82546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015611961573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061198591906126a2565b90505f6119928383612730565b90505f6119b261271061063f886001015485611d5090919063ffffffff16565b90506119c96119c18383611d78565b865490611d6d565b8555600c5486546119f49173ffffffffffffffffffffffffffffffffffffffff9182169116836121c3565b505050505b611a0285611dc4565b60058201548154611a2091670de0b6b3a76400009161063f91611d50565b600182015560068201548154611a4391670de0b6b3a76400009161063f91611d50565b6002820155604051848152859073ffffffffffffffffffffffffffffffffffffffff8516907f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a159060200160405180910390a3505050610a3660015f55565b60015473ffffffffffffffffffffffffffffffffffffffff163314611b48576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f47656e65736973506f6f6c3a2063616c6c6572206973206e6f7420746865206f60448201527f70657261746f72000000000000000000000000000000000000000000000000006064820152608401610828565b600c80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60015473ffffffffffffffffffffffffffffffffffffffff163314611c36576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f47656e65736973506f6f6c3a2063616c6c6572206973206e6f7420746865206f60448201527f70657261746f72000000000000000000000000000000000000000000000000006064820152608401610828565b8885148015611c4457508883145b8015611c4f57508887145b611cb5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f47656e65736973506f6f6c3a20696e76616c6964206c656e67746800000000006044820152606401610828565b5f5b89811015611d4357611d3b8b8b83818110611cd457611cd4612675565b905060200201358a8a84818110611ced57611ced612675565b90506020020135898985818110611d0657611d06612675565b90506020020135888886818110611d1f57611d1f612675565b9050602002016020810190611d349190612526565b8787610e0a565b600101611cb7565b5050505050505050505050565b5f611d5b8284612743565b9392505050565b5f611d5b828461275a565b5f611d5b82846126e6565b5f611d5b8284612730565b60025f5403611dbe576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f55565b5f60048281548110611dd857611dd8612675565b905f5260205f2090600a0201905080600401544211611df5575050565b80546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015611e60573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e8491906126a2565b9050805f03611e9857504260049091015550565b600782015460ff16611f22576007820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556002820154600654611ee291611d6d565b6006556003820154600754611ef691611d6d565b6007556008820154600a54611f0a91611d6d565b600a556009820154600b54611f1e91611d6d565b600b555b60065415611f87575f611f398360040154426106a9565b90505f611f5960065461063f866002015485611d5090919063ffffffff16565b9050611f7f611f748461063f84670de0b6b3a7640000611d50565b600586015490611d6d565b600585015550505b60075415611fec575f611f9e836004015442611413565b90505f611fbe60075461063f866003015485611d5090919063ffffffff16565b9050611fe4611fd98461063f84670de0b6b3a7640000611d50565b600686015490611d6d565b600685015550505b504260049091015550565b6002546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015612063573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061208791906126a2565b9050801561140e57808211156120bb5760025461140e9073ffffffffffffffffffffffffffffffffffffffff1684836121c3565b60025461140e9073ffffffffffffffffffffffffffffffffffffffff1684846121c3565b6003546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa15801561214b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061216f91906126a2565b9050801561140e57808211156121a35760035461140e9073ffffffffffffffffffffffffffffffffffffffff1684836121c3565b60035461140e9073ffffffffffffffffffffffffffffffffffffffff1684845b60405173ffffffffffffffffffffffffffffffffffffffff83811660248301526044820183905261140e91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612356565b6004545f5b8181101561140e578273ffffffffffffffffffffffffffffffffffffffff166004828154811061227b5761227b612675565b5f9182526020909120600a909102015473ffffffffffffffffffffffffffffffffffffffff1603612308576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f47656e65736973506f6f6c3a206578697374696e6720706f6f6c3f00000000006044820152606401610828565b600101612249565b60405173ffffffffffffffffffffffffffffffffffffffff8481166024830152838116604483015260648201839052610e049186918216906323b872dd906084016121fd565b5f5f60205f8451602086015f885af180612375576040513d5f823e3d81fd5b50505f513d9150811561238c5780600114156123a6565b73ffffffffffffffffffffffffffffffffffffffff84163b155b15610e04576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610828565b5f60208284031215612405575f5ffd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610afc575f5ffd5b5f5f6040838503121561243e575f5ffd5b8235915060208301356124508161240c565b809150509250929050565b5f5f6040838503121561246c575f5ffd5b50508035926020909101359150565b5f5f5f6060848603121561248d575f5ffd5b83356124988161240c565b92506020840135915060408401356124af8161240c565b809150509250925092565b803580151581146124c9575f5ffd5b919050565b5f5f5f5f5f5f60c087890312156124e3575f5ffd5b86359550602087013594506040870135935060608701356125038161240c565b9250612511608088016124ba565b9598949750929591949360a090920135925050565b5f60208284031215612536575f5ffd5b8135611d5b8161240c565b5f5f83601f840112612551575f5ffd5b50813567ffffffffffffffff811115612568575f5ffd5b6020830191508360208260051b8501011115612582575f5ffd5b9250929050565b5f5f5f5f5f5f5f5f5f5f60c08b8d0312156125a2575f5ffd5b8a3567ffffffffffffffff8111156125b8575f5ffd5b6125c48d828e01612541565b909b5099505060208b013567ffffffffffffffff8111156125e3575f5ffd5b6125ef8d828e01612541565b90995097505060408b013567ffffffffffffffff81111561260e575f5ffd5b61261a8d828e01612541565b90975095505060608b013567ffffffffffffffff811115612639575f5ffd5b6126458d828e01612541565b9095509350612658905060808c016124ba565b91505f60a08c01359050809150509295989b9194979a5092959850565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f602082840312156126b2575f5ffd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156106a3576106a36126b9565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612729576127296126b9565b5060010190565b818103818111156106a3576106a36126b9565b80820281158282048414176106a3576106a36126b9565b5f8261278d577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b50049056fea264697066735822122051755f2b5676d6a33d75394ec9498b6eaec891c09391816693e142bdf76e551264736f6c634300081c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000d441a37aa73fc1ddd2db99fc4c92f233b7d41cbd00000000000000000000000014d1db2367312ee3bba54905b64f3bf0f0d677a80000000000000000000000000000000000000000000000000000000067d4b4f0000000000000000000000000d5a638a1e6d55dee90688e65f15bfa3f08d869a1
-----Decoded View---------------
Arg [0] : _hubble (address): 0xd441a37aA73fc1DDd2db99FC4c92f233b7d41CBd
Arg [1] : _xhubble (address): 0x14D1Db2367312Ee3BBA54905b64f3bf0f0D677A8
Arg [2] : _poolStartTime (uint256): 1741993200
Arg [3] : _protocolReserves (address): 0xd5A638a1E6D55Dee90688e65F15BFA3f08d869A1
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000d441a37aa73fc1ddd2db99fc4c92f233b7d41cbd
Arg [1] : 00000000000000000000000014d1db2367312ee3bba54905b64f3bf0f0d677a8
Arg [2] : 0000000000000000000000000000000000000000000000000000000067d4b4f0
Arg [3] : 000000000000000000000000d5a638a1e6d55dee90688e65f15bfa3f08d869a1
Deployed Bytecode Sourcemap
22028:15921:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25066:95;25138:8;:15;25066:95;;;160:25:1;;;148:2;133:18;25066:95:0;;;;;;;;22705:26;;;;;;:::i;:::-;;:::i;:::-;;;;864:42:1;852:55;;;834:74;;939:2;924:18;;917:34;;;;967:18;;;960:34;;;;1025:2;1010:18;;1003:34;;;;1068:3;1053:19;;1046:35;;;;1112:3;1097:19;;1090:35;1156:3;1141:19;;1134:35;1213:14;1206:22;1200:3;1185:19;;1178:51;1260:3;1245:19;;1238:35;1304:3;1289:19;;1282:35;821:3;806:19;22705:26:0;427:896:1;30122:805:0;;;;;;:::i;:::-;;:::i;22813:34::-;;;;;;27980:661;;;;;;:::i;:::-;;:::i;22648:20::-;;;;;;;;;;;;2400:42:1;2388:55;;;2370:74;;2358:2;2343:18;22648:20:0;2210:240:1;22675:21:0;;;;;;;;;34776:1206;;;;;;:::i;:::-;;:::i;:::-;;35990:421;;;;;;:::i;:::-;;:::i;37280:666::-;;;;;;:::i;:::-;;:::i;22143:23::-;;;;;;;;;22896:28;;;;;;26238:1661;;;;;;:::i;:::-;;:::i;30937:180::-;;;:::i;22931:26::-;;;;;;22964:40;;;;;;23011:41;;;;;;29321:793;;;;;;:::i;:::-;;:::i;24208:727::-;;;;;;:::i;:::-;;:::i;22740:64::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4397:25:1;;;4453:2;4438:18;;4431:34;;;;4481:18;;;4474:34;4385:2;4370:18;22740:64:0;4195:319:1;23059:45:0;;23097:7;23059:45;;28647:666;;;;;;:::i;:::-;;:::i;37171:101::-;;;;;;:::i;:::-;;:::i;31125:306::-;;;;;;:::i;:::-;;:::i;23111:31::-;;;;;;;;;32973:1767;;;;;;:::i;:::-;;:::i;24943:115::-;;;;;;:::i;:::-;;:::i;22854:35::-;;;;;;25457:773;;;;;;:::i;:::-;;:::i;22705:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22705:26:0;;;;;;;;;;;;;;;;;:::o;30122:805::-;30198:7;30218:21;30242:8;30251:4;30242:14;;;;;;;;:::i;:::-;;;;;;;;;30291;;;:8;:14;;;;;;:21;;;;;;;;;;;30242:14;;;;;;;;30352:23;;;;30408:10;;:35;;;;;30437:4;30408:35;;;2370:74:1;30242:14:0;;-1:-1:-1;30291:21:0;;30242:14;30408:10;;;;;:20;;2343:18:1;;30408:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30386:57;;30476:4;:19;;;30458:15;:37;:57;;;;-1:-1:-1;30499:16:0;;;30458:57;30454:381;;;30532:24;30559:57;30579:4;:19;;;30600:15;30559:19;:57::i;:::-;30532:84;;30631:22;30656:66;30705:16;;30656:44;30677:4;:22;;;30656:16;:20;;:44;;;;:::i;:::-;:48;;:66::i;:::-;30631:91;-1:-1:-1;30758:65:0;30781:41;30810:11;30781:24;30631:91;30800:4;30781:18;:24::i;:41::-;30758:18;;:22;:65::i;:::-;30737:86;;30517:318;;30454:381;30852:67;30902:4;:16;;;30852:45;30892:4;30852:35;30868:18;30852:4;:11;;;:15;;:35;;;;:::i;:45::-;:49;;:67::i;:::-;30845:74;;;;;;30122:805;;;;;:::o;27980:661::-;28065:7;28102;28089:9;:20;28085:34;;-1:-1:-1;28118:1:0;28111:8;;28085:34;28145:11;;28134:7;:22;28130:504;;28190:11;;28177:9;:24;28173:38;;-1:-1:-1;28210:1:0;28203:8;;28173:38;28243:13;;28230:9;:26;28226:90;;28265:51;28300:15;;28265:30;28281:13;;28265:11;;:15;;:30;;;;:::i;:::-;:34;;:51::i;:::-;28258:58;;;;28226:90;28338:47;28369:15;;28338:26;28354:9;28338:11;;:15;;:26;;;;:::i;28130:504::-;28433:13;;28422:7;:24;28418:38;;-1:-1:-1;28455:1:0;28448:8;;28418:38;28488:13;;28475:9;:26;28471:86;;28510:47;28541:15;;28510:26;28522:13;;28510:7;:11;;:26;;;;:::i;28471:86::-;28606:15;;28579:43;;:22;:7;28591:9;28579:11;:22::i;34776:1206::-;21564:21;:19;:21::i;:::-;34856:15:::1;34874:10;34856:28;;34895:21;34919:8;34928:4;34919:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;34968;;;:8:::1;:14:::0;;;;;;:23:::1;::::0;::::1;::::0;;;;;;;35010:11;;34919:14:::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;35010:22:0;-1:-1:-1;35010:22:0::1;35002:53;;;::::0;::::1;::::0;;7357:2:1;35002:53:0::1;::::0;::::1;7339:21:1::0;7396:2;7376:18;;;7369:30;7435:20;7415:18;;;7408:48;7473:18;;35002:53:0::1;;;;;;;;;35066:16;35077:4;35066:10;:16::i;:::-;35093:22;35118:70;35172:4;:15;;;35118:49;35162:4;35118:39;35134:4;:22;;;35118:4;:11;;;:15;;:39;;;;:::i;:70::-;35093:95;;35199:23;35225:72;35280:4;:16;;;35225:50;35270:4;35225:40;35241:4;:23;;;35225:4;:11;;;:15;;:40;;;;:::i;:72::-;35199:98:::0;-1:-1:-1;35312:18:0;;35308:149:::1;;35347:43;35366:7;35375:14;35347:18;:43::i;:::-;35421:7;35410:35;;;35430:14;35410:35;;;;160:25:1::0;;148:2;133:18;;14:177;35410:35:0::1;;;;;;;;35308:149;35471:19:::0;;35467:154:::1;;35507:45;35527:7;35536:15;35507:19;:45::i;:::-;35584:7;35572:37;;;35593:15;35572:37;;;;160:25:1::0;;148:2;133:18;;14:177;35572:37:0::1;;;;;;;;35467:154;35635:11:::0;;35631:138:::1;;35677:11:::0;;:24:::1;::::0;35693:7;35677:15:::1;:24::i;:::-;35663:38:::0;;35716:10;;:41:::1;::::0;:10:::1;;35740:7:::0;35749;35716:23:::1;:41::i;:::-;35813:22;::::0;::::1;::::0;35797:11;;:49:::1;::::0;35841:4:::1;::::0;35797:39:::1;::::0;:15:::1;:39::i;:49::-;35779:15;::::0;::::1;:67:::0;35892:23:::1;::::0;::::1;::::0;35876:11;;:50:::1;::::0;35921:4:::1;::::0;35876:40:::1;::::0;:15:::1;:40::i;:50::-;35857:16;::::0;::::1;:69:::0;35942:32:::1;::::0;160:25:1;;;35960:4:0;;35942:32:::1;::::0;::::1;::::0;::::1;::::0;148:2:1;133:18;35942:32:0::1;;;;;;;34845:1137;;;;;21608:20:::0;21343:1;21874:7;:21;21825:78;21608:20;34776:1206;;:::o;35990:421::-;21564:21;:19;:21::i;:::-;36062::::1;36086:8;36095:4;36086:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;36135;;;:8:::1;:14:::0;;;;;;36150:10:::1;36135:26:::0;;;;;;;36190:11;;36212:15;;;-1:-1:-1;36238:15:0;::::1;:19:::0;;;36268:16:::1;::::0;::::1;:20:::0;;;;36086:14:::1;::::0;;::::1;;36299:10:::0;;36086:14;;-1:-1:-1;36135:26:0;;36190:11;36299:44:::1;::::0;36135:26:::1;36299:10:::0;;;::::1;::::0;36190:11;36299:23:::1;:44::i;:::-;36359;::::0;160:25:1;;;36389:4:0;;36377:10:::1;::::0;36359:44:::1;::::0;148:2:1;133:18;36359:44:0::1;;;;;;;36051:360;;;21608:20:::0;21343:1;21874:7;:21;21825:78;21608:20;35990:421;:::o;37280:666::-;24114:8;;:22;:8;24126:10;24114:22;24106:74;;;;;;;7704:2:1;24106:74:0;;;7686:21:1;7743:2;7723:18;;;7716:30;7782:34;7762:18;;;7755:62;7853:9;7833:18;;;7826:37;7880:19;;24106:74:0;7502:403:1;24106:74:0;37453:8:::1;:15:::0;37436:14:::1;37479:198;37507:6;37501:3;:12;37479:198;;;37537:21;37561:8;37570:3;37561:13;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;37607:10:::0;;37561:13;;-1:-1:-1;37607:10:0::1;::::0;;::::1;37597:20:::0;;::::1;::::0;37589:76:::1;;;::::0;::::1;::::0;;8112:2:1;37589:76:0::1;::::0;::::1;8094:21:1::0;8151:2;8131:18;;;8124:30;8190:34;8170:18;;;8163:62;8261:13;8241:18;;;8234:41;8292:19;;37589:76:0::1;7910:407:1::0;37589:76:0::1;-1:-1:-1::0;37515:5:0::1;;37479:198;;;-1:-1:-1::0;37753:6:0::1;::::0;::::1;::::0;;::::1;37743:16:::0;;::::1;::::0;37735:73:::1;;;::::0;::::1;::::0;;8524:2:1;37735:73:0::1;::::0;::::1;8506:21:1::0;8563:2;8543:18;;;8536:30;8602:34;8582:18;;;8575:62;8673:14;8653:18;;;8646:42;8705:19;;37735:73:0::1;8322:408:1::0;37735:73:0::1;37837:7;::::0;::::1;::::0;;::::1;37827:17:::0;;::::1;::::0;37819:75:::1;;;::::0;::::1;::::0;;8937:2:1;37819:75:0::1;::::0;::::1;8919:21:1::0;8976:2;8956:18;;;8949:30;9015:34;8995:18;;;8988:62;9086:15;9066:18;;;9059:43;9119:19;;37819:75:0::1;8735:409:1::0;37819:75:0::1;37907:31;:19;::::0;::::1;37927:2:::0;37931:6;37907:19:::1;:31::i;:::-;37383:563;37280:666:::0;;;:::o;26238:1661::-;24114:8;;:22;:8;24126:10;24114:22;24106:74;;;;;;;7704:2:1;24106:74:0;;;7686:21:1;7743:2;7723:18;;;7716:30;7782:34;7762:18;;;7755:62;7853:9;7833:18;;;7826:37;7880:19;;24106:74:0;7502:403:1;24106:74:0;26462:26:::1;26481:6;26462:18;:26::i;:::-;26503:11;26499:61;;;26531:17;:15;:17::i;:::-;26592:13;;26574:15;:31;26570:469;;;26626:15;26645:1;26626:20:::0;26622:243:::1;;-1:-1:-1::0;26685:13:0::1;::::0;26570:469:::1;;26622:243;26761:13;;26743:15;:31;26739:111;;;-1:-1:-1::0;26817:13:0::1;::::0;26739:111:::1;26570:469;;;26901:20:::0;;;:57:::1;;;26943:15;26925;:33;26901:57;26897:131;;;-1:-1:-1::0;26997:15:0::1;26897:131;27049:15;27087:13;;27068:15;:32;;27067:74;;;;27125:15;27106;:34;;27067:74;27049:92;;27154:8;27168:416;;;;;;;;27199:6;27168:416;;;;;;27232:7;27168:416;;;;27272:11;27168:416;;;;27317:12;27168:416;;;;27521:15;27168:416;;;;27363:1;27168:416;;;;27399:1;27168:416;;;;27562:10;27168:416;;;;;;27433:11;27168:416;;;;27478:12;27168:416;;::::0;27154:431:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27602:10;27598:294;;;27647:15;::::0;:32:::1;::::0;27667:11;27647:19:::1;:32::i;:::-;27629:15;:50:::0;27713:16:::1;::::0;:34:::1;::::0;27734:12;27713:20:::1;:34::i;:::-;27694:16;:53:::0;27780:15:::1;::::0;:32:::1;::::0;27800:11;27780:19:::1;:32::i;:::-;27762:15;:50:::0;27846:16:::1;::::0;:34:::1;::::0;27867:12;27846:20:::1;:34::i;:::-;27827:16;:53:::0;27598:294:::1;26451:1448;26238:1661:::0;;;;;;:::o;30937:180::-;30999:8;:15;30982:14;31025:85;31053:6;31047:3;:12;31025:85;;;31083:15;31094:3;31083:10;:15::i;:::-;31061:5;;31025:85;;29321:793;29396:7;29416:21;29440:8;29449:4;29440:14;;;;;;;;:::i;:::-;;;;;;;;;29489;;;:8;:14;;;;;;;:21;;;;;;;;;;;29440:14;;;;;;;;29549:22;;;;29604:10;;:35;;;;;29633:4;29604:35;;;2370:74:1;29440:14:0;;-1:-1:-1;29489:21:0;;29440:14;29604:10;;;;;:20;;2343:18:1;;29604:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29582:57;;29672:4;:19;;;29654:15;:37;:57;;;;-1:-1:-1;29695:16:0;;;29654:57;29650:374;;;29728:24;29755:56;29774:4;:19;;;29795:15;29755:18;:56::i;:::-;29728:83;;29826:21;29850:64;29898:15;;29850:43;29871:4;:21;;;29850:16;:20;;:43;;;;:::i;:64::-;29826:88;-1:-1:-1;29949:63:0;29971:40;29999:11;29971:23;29826:88;29989:4;29971:17;:23::i;29949:63::-;29929:83;;29713:311;;29650:374;30041:65;30090:4;:15;;;30041:44;30080:4;30041:34;30057:17;30041:4;:11;;;:15;;:34;;;;:::i;24208:727::-;24114:8;;:22;:8;24126:10;24114:22;24106:74;;;;;;;7704:2:1;24106:74:0;;;7686:21:1;7743:2;7723:18;;;7716:30;7782:34;7762:18;;;7755:62;7853:9;7833:18;;;7826:37;7880:19;;24106:74:0;7502:403:1;24106:74:0;24312:12:::1;24294:15;:30;24286:75;;;::::0;::::1;::::0;;9351:2:1;24286:75:0::1;::::0;::::1;9333:21:1::0;;;9370:18;;;9363:30;9429:34;9409:18;;;9402:62;9481:18;;24286:75:0::1;9149:356:1::0;24286:75:0::1;24398:13;;24380:15;:31;24372:68;;;::::0;::::1;::::0;;9712:2:1;24372:68:0::1;::::0;::::1;9694:21:1::0;9751:2;9731:18;;;9724:30;9790:26;9770:18;;;9763:54;9834:18;;24372:68:0::1;9510:348:1::0;24372:68:0::1;24453:13;:28:::0;;;24506:26:::1;23097:7;24469:12:::0;24506:26:::1;:::i;:::-;24492:11;:40:::0;24672:8:::1;:15:::0;24655:14:::1;24698:230;24726:6;24720:3;:12;24698:230;;;24756:21;24780:8;24789:3;24780:13;;;;;;;;:::i;:::-;;;;;;;;;;;24756:37;;24834:12;24812:4;:19;;;:34;24808:109;;;24867:19;::::0;::::1;:34:::0;;;24808:109:::1;-1:-1:-1::0;24734:5:0::1;;24698:230;;;;24275:660;24208:727:::0;:::o;28647:666::-;28733:7;28770;28757:9;:20;28753:34;;-1:-1:-1;28786:1:0;28779:8;;28753:34;28813:11;;28802:7;:22;28798:508;;28858:11;;28845:9;:24;28841:38;;-1:-1:-1;28878:1:0;28871:8;;28841:38;28911:13;;28898:9;:26;28894:91;;28933:52;28968:16;;28933:30;28949:13;;28933:11;;:15;;:30;;;;:::i;28894:91::-;29007:48;29038:16;;29007:26;29023:9;29007:11;;:15;;:26;;;;:::i;28798:508::-;29103:13;;29092:7;:24;29088:38;;-1:-1:-1;29125:1:0;29118:8;;29088:38;29158:13;;29145:9;:26;29141:87;;29180:48;29211:16;;29180:26;29192:13;;29180:7;:11;;:26;;;;:::i;29141:87::-;29277:16;;29250:44;;:22;:7;29262:9;29250:11;:22::i;37171:101::-;24114:8;;:22;:8;24126:10;24114:22;24106:74;;;;;;;7704:2:1;24106:74:0;;;7686:21:1;7743:2;7723:18;;;7716:30;7782:34;7762:18;;;7755:62;7853:9;7833:18;;;7826:37;7880:19;;24106:74:0;7502:403:1;24106:74:0;37244:8:::1;:20:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;37171:101::o;31125:306::-;31229:6;31217:8;:18;;31209:44;;;;;;;10384:2:1;31209:44:0;;;10366:21:1;10423:2;10403:18;;;10396:30;10462:15;10442:18;;;10435:43;10495:18;;31209:44:0;10182:337:1;31209:44:0;31281:8;:15;31272:24;;31264:56;;;;;;;10726:2:1;31264:56:0;;;10708:21:1;10765:2;10745:18;;;10738:30;10804:21;10784:18;;;10777:49;10843:18;;31264:56:0;10524:343:1;31264:56:0;31350:8;31331:93;31367:6;31360:3;:13;31331:93;;31397:15;31408:3;31397:10;:15::i;:::-;31375:5;;;:::i;:::-;;;31331:93;;32973:1767;21564:21;:19;:21::i;:::-;33052:15:::1;33070:10;33052:28;;33091:21;33115:8;33124:4;33115:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;33164;;;:8:::1;:14:::0;;;;;;:23:::1;::::0;::::1;::::0;;;;;;;33115:14:::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;33198:16:0::1;33173:4:::0;33198:10:::1;:16::i;:::-;33229:11:::0;;:15;33225:611:::1;;33261:22;33286:70;33340:4;:15;;;33286:49;33330:4;33286:39;33302:4;:22;;;33286:4;:11;;;:15;;:39;;;;:::i;:70::-;33261:95;;33371:23;33397:72;33452:4;:16;;;33397:50;33442:4;33397:40;33413:4;:23;;;33397:4;:11;;;:15;;:40;;;;:::i;:72::-;33371:98:::0;-1:-1:-1;33488:18:0;;33484:161:::1;;33527:43;33546:7;33555:14;33527:18;:43::i;:::-;33605:7;33594:35;;;33614:14;33594:35;;;;160:25:1::0;;148:2;133:18;;14:177;33594:35:0::1;;;;;;;;33484:161;33663:19:::0;;33659:166:::1;;33703:45;33723:7;33732:15;33703:19;:45::i;:::-;33784:7;33772:37;;;33793:15;33772:37;;;;160:25:1::0;;148:2;133:18;;14:177;33772:37:0::1;;;;;;;;33659:166;33246:590;;33225:611;33850:11:::0;;33846:653:::1;;33899:10:::0;;:35:::1;::::0;;;;33928:4:::1;33899:35;::::0;::::1;2370:74:1::0;33879:17:0::1;::::0;33899:10:::1;;::::0;:20:::1;::::0;2343:18:1;;33899:35:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33949:10:::0;;33879:55;;-1:-1:-1;33949:60:0::1;::::0;:10:::1;;33977:7:::0;33994:4:::1;34001:7:::0;33949:27:::1;:60::i;:::-;34043:10:::0;;:35:::1;::::0;;;;34072:4:::1;34043:35;::::0;::::1;2370:74:1::0;34024:16:0::1;::::0;34043:10:::1;;::::0;:20:::1;::::0;2343:18:1;;34043:35:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34024:54:::0;-1:-1:-1;34217:20:0::1;34240;34251:9:::0;34024:54;34240:20:::1;:::i;:::-;34217:43;;34277:19;34299:44;34337:5;34299:33;34316:4;:15;;;34299:12;:16;;:33;;;;:::i;:44::-;34277:66:::0;-1:-1:-1;34372:46:0::1;34388:29;:12:::0;34277:66;34388:16:::1;:29::i;:::-;34372:11:::0;;;:15:::1;:46::i;:::-;34358:60:::0;;34457:16:::1;::::0;34433:10;;:54:::1;::::0;34457:16:::1;34433:10:::0;;::::1;::::0;34457:16:::1;34475:11:::0;34433:23:::1;:54::i;:::-;33864:635;;;;33846:653;34509:16;34520:4;34509:10;:16::i;:::-;34572:22;::::0;::::1;::::0;34556:11;;:49:::1;::::0;34600:4:::1;::::0;34556:39:::1;::::0;:15:::1;:39::i;:49::-;34538:15;::::0;::::1;:67:::0;34651:23:::1;::::0;::::1;::::0;34635:11;;:50:::1;::::0;34680:4:::1;::::0;34635:40:::1;::::0;:15:::1;:40::i;:50::-;34616:16;::::0;::::1;:69:::0;34701:31:::1;::::0;160:25:1;;;34718:4:0;;34701:31:::1;::::0;::::1;::::0;::::1;::::0;148:2:1;133:18;34701:31:0::1;;;;;;;33041:1699;;;21608:20:::0;21343:1;21874:7;:21;21825:78;24943:115;24114:8;;:22;:8;24126:10;24114:22;24106:74;;;;;;;7704:2:1;24106:74:0;;;7686:21:1;7743:2;7723:18;;;7716:30;7782:34;7762:18;;;7755:62;7853:9;7833:18;;;7826:37;7880:19;;24106:74:0;7502:403:1;24106:74:0;25020:16:::1;:30:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;24943:115::o;25457:773::-;24114:8;;:22;:8;24126:10;24114:22;24106:74;;;;;;;7704:2:1;24106:74:0;;;7686:21:1;7743:2;7723:18;;;7716:30;7782:34;7762:18;;;7755:62;7853:9;7833:18;;;7826:37;7880:19;;24106:74:0;7502:403:1;24106:74:0;25750:38;;::::1;:92:::0;::::1;;;-1:-1:-1::0;25805:37:0;;::::1;25750:92;:152;;;;-1:-1:-1::0;25859:43:0;;::::1;25750:152;25728:229;;;::::0;::::1;::::0;;11407:2:1;25728:229:0::1;::::0;::::1;11389:21:1::0;11446:2;11426:18;;;11419:30;11485:29;11465:18;;;11458:57;11532:18;;25728:229:0::1;11205:351:1::0;25728:229:0::1;25973:9;25968:255;25988:23:::0;;::::1;25968:255;;;26033:178;26037:12;;26050:1;26037:15;;;;;;;:::i;:::-;;;;;;;26071:13;;26085:1;26071:16;;;;;;;:::i;:::-;;;;;;;26106:8;;26115:1;26106:11;;;;;;;:::i;:::-;;;;;;;26136:7;;26144:1;26136:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;26165:11;26195:15;26033:3;:178::i;:::-;26013:3;;25968:255;;;;25457:773:::0;;;;;;;;;;:::o;3181:98::-;3239:7;3266:5;3270:1;3266;:5;:::i;:::-;3259:12;3181:98;-1:-1:-1;;;3181:98:0:o;3580:::-;3638:7;3665:5;3669:1;3665;:5;:::i;2443:98::-;2501:7;2528:5;2532:1;2528;:5;:::i;2824:98::-;2882:7;2909:5;2913:1;2909;:5;:::i;21644:173::-;21386:1;21698:7;;:18;21694:88;;21740:30;;;;;;;;;;;;;;21694:88;21386:1;21792:7;:17;21644:173::o;31439:1526::-;31492:21;31516:8;31525:4;31516:14;;;;;;;;:::i;:::-;;;;;;;;;;;31492:38;;31564:4;:19;;;31545:15;:38;31541:77;;31600:7;31439:1526;:::o;31541:77::-;31650:10;;:35;;;;;31679:4;31650:35;;;2370:74:1;31628:19:0;;31650:10;;;:20;;2343:18:1;;31650:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31628:57;;31700:11;31715:1;31700:16;31696:107;;-1:-1:-1;31755:15:0;31733:19;;;;:37;-1:-1:-1;31439:1526:0:o;31696:107::-;31818:14;;;;;;31813:375;;31849:14;;;:21;;;;31866:4;31849:21;;;31923;;;;31903:15;;:42;;:19;:42::i;:::-;31885:15;:60;32000:22;;;;31979:16;;:44;;:20;:44::i;:::-;31960:16;:63;32076:21;;;;32056:15;;:42;;:19;:42::i;:::-;32038:15;:60;32153:22;;;;32132:16;;:44;;:20;:44::i;:::-;32113:16;:63;31813:375;32202:15;;:19;32198:346;;32238:24;32265:56;32284:4;:19;;;32305:15;32265:18;:56::i;:::-;32238:83;;32336:21;32360:64;32408:15;;32360:43;32381:4;:21;;;32360:16;:20;;:43;;;;:::i;:64::-;32336:88;-1:-1:-1;32464:68:0;32491:40;32519:11;32491:23;32336:88;32509:4;32491:17;:23::i;:40::-;32464:22;;;;;:26;:68::i;:::-;32439:22;;;:93;-1:-1:-1;;32198:346:0;32558:16;;:20;32554:356;;32595:25;32623:57;32643:4;:19;;;32664:15;32623:19;:57::i;:::-;32595:85;;32695:22;32720:67;32770:16;;32720:45;32742:4;:22;;;32720:17;:21;;:45;;;;:::i;:67::-;32695:92;-1:-1:-1;32828:70:0;32856:41;32885:11;32856:24;32695:92;32875:4;32856:18;:24::i;:41::-;32828:23;;;;;:27;:70::i;:::-;32802:23;;;:96;-1:-1:-1;;32554:356:0;-1:-1:-1;32942:15:0;32920:19;;;;:37;-1:-1:-1;31439:1526:0:o;36419:365::-;36518:6;;:31;;;;;36543:4;36518:31;;;2370:74:1;36497:18:0;;36518:6;;;:16;;2343:18:1;;36518:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36497:52;-1:-1:-1;36564:14:0;;36560:217;;36609:10;36599:7;:20;36595:171;;;36640:6;;:36;;:6;;36660:3;36665:10;36640:19;:36::i;36595:171::-;36717:6;;:33;;:6;;36737:3;36742:7;36717:19;:33::i;36790:373::-;36891:7;;:32;;;;;36917:4;36891:32;;;2370:74:1;36869:19:0;;36891:7;;;:17;;2343:18:1;;36891:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36869:54;-1:-1:-1;36938:15:0;;36934:222;;36984:11;36974:7;:21;36970:175;;;37016:7;;:38;;:7;;37037:3;37042:11;37016:20;:38::i;36970:175::-;37095:7;;:34;;:7;;37116:3;37121:7;12227:162;12337:43;;12352:14;12471:55:1;;;12337:43:0;;;12453:74:1;12543:18;;;12536:34;;;12310:71:0;;12330:5;;12352:14;;;;;12426:18:1;;12337:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12310:19;:71::i;25169:257::-;25254:8;:15;25237:14;25280:139;25308:6;25302:3;:12;25280:139;;;25369:6;25346:29;;:8;25355:3;25346:13;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:19;;;:29;25338:69;;;;;;;12783:2:1;25338:69:0;;;12765:21:1;12822:2;12802:18;;;12795:30;12861:29;12841:18;;;12834:57;12908:18;;25338:69:0;12581:351:1;25338:69:0;25316:5;;25280:139;;12634:190;12762:53;;12777:18;13157:55:1;;;12762:53:0;;;13139:74:1;13249:55;;;13229:18;;;13222:83;13321:18;;;13314:34;;;12735:81:0;;12755:5;;12777:18;;;;;13112::1;;12762:53:0;12937:417:1;19518:738:0;19599:18;19628:19;19768:4;19765:1;19758:4;19752:11;19745:4;19739;19735:15;19732:1;19725:5;19718;19713:60;19827:7;19817:180;;19872:4;19866:11;19918:16;19915:1;19910:3;19895:40;19965:16;19960:3;19953:29;19817:180;-1:-1:-1;;20076:1:0;20070:8;20025:16;;-1:-1:-1;20105:15:0;;:68;;20157:11;20172:1;20157:16;;20105:68;;;20123:26;;;;:31;20105:68;20101:148;;;20197:40;;;;;2400:42:1;2388:55;;20197:40:0;;;2370:74:1;2343:18;;20197:40:0;2210:240:1;196:226;255:6;308:2;296:9;287:7;283:23;279:32;276:52;;;324:1;321;314:12;276:52;-1:-1:-1;369:23:1;;196:226;-1:-1:-1;196:226:1:o;1328:154::-;1414:42;1407:5;1403:54;1396:5;1393:65;1383:93;;1472:1;1469;1462:12;1487:367;1555:6;1563;1616:2;1604:9;1595:7;1591:23;1587:32;1584:52;;;1632:1;1629;1622:12;1584:52;1677:23;;;-1:-1:-1;1776:2:1;1761:18;;1748:32;1789:33;1748:32;1789:33;:::i;:::-;1841:7;1831:17;;;1487:367;;;;;:::o;1859:346::-;1927:6;1935;1988:2;1976:9;1967:7;1963:23;1959:32;1956:52;;;2004:1;2001;1994:12;1956:52;-1:-1:-1;;2049:23:1;;;2169:2;2154:18;;;2141:32;;-1:-1:-1;1859:346:1:o;2455:522::-;2546:6;2554;2562;2615:2;2603:9;2594:7;2590:23;2586:32;2583:52;;;2631:1;2628;2621:12;2583:52;2670:9;2657:23;2689:31;2714:5;2689:31;:::i;:::-;2739:5;-1:-1:-1;2817:2:1;2802:18;;2789:32;;-1:-1:-1;2899:2:1;2884:18;;2871:32;2912:33;2871:32;2912:33;:::i;:::-;2964:7;2954:17;;;2455:522;;;;;:::o;3213:160::-;3278:20;;3334:13;;3327:21;3317:32;;3307:60;;3363:1;3360;3353:12;3307:60;3213:160;;;:::o;3378:812::-;3493:6;3501;3509;3517;3525;3533;3586:3;3574:9;3565:7;3561:23;3557:33;3554:53;;;3603:1;3600;3593:12;3554:53;3648:23;;;-1:-1:-1;3768:2:1;3753:18;;3740:32;;-1:-1:-1;3871:2:1;3856:18;;3843:32;;-1:-1:-1;3953:2:1;3938:18;;3925:32;3966:33;3925:32;3966:33;:::i;:::-;4018:7;-1:-1:-1;4044:36:1;4075:3;4060:19;;4044:36;:::i;:::-;3378:812;;;;-1:-1:-1;3378:812:1;;;;;4153:3;4138:19;;;4125:33;;-1:-1:-1;;3378:812:1:o;4519:247::-;4578:6;4631:2;4619:9;4610:7;4606:23;4602:32;4599:52;;;4647:1;4644;4637:12;4599:52;4686:9;4673:23;4705:31;4730:5;4705:31;:::i;4771:367::-;4834:8;4844:6;4898:3;4891:4;4883:6;4879:17;4875:27;4865:55;;4916:1;4913;4906:12;4865:55;-1:-1:-1;4939:20:1;;4982:18;4971:30;;4968:50;;;5014:1;5011;5004:12;4968:50;5051:4;5043:6;5039:17;5027:29;;5111:3;5104:4;5094:6;5091:1;5087:14;5079:6;5075:27;5071:38;5068:47;5065:67;;;5128:1;5125;5118:12;5065:67;4771:367;;;;;:::o;5143:1629::-;5366:6;5374;5382;5390;5398;5406;5414;5422;5430;5438;5491:3;5479:9;5470:7;5466:23;5462:33;5459:53;;;5508:1;5505;5498:12;5459:53;5548:9;5535:23;5581:18;5573:6;5570:30;5567:50;;;5613:1;5610;5603:12;5567:50;5652:70;5714:7;5705:6;5694:9;5690:22;5652:70;:::i;:::-;5741:8;;-1:-1:-1;5626:96:1;-1:-1:-1;;5829:2:1;5814:18;;5801:32;5858:18;5845:32;;5842:52;;;5890:1;5887;5880:12;5842:52;5929:72;5993:7;5982:8;5971:9;5967:24;5929:72;:::i;:::-;6020:8;;-1:-1:-1;5903:98:1;-1:-1:-1;;6108:2:1;6093:18;;6080:32;6137:18;6124:32;;6121:52;;;6169:1;6166;6159:12;6121:52;6208:72;6272:7;6261:8;6250:9;6246:24;6208:72;:::i;:::-;6299:8;;-1:-1:-1;6182:98:1;-1:-1:-1;;6387:2:1;6372:18;;6359:32;6416:18;6403:32;;6400:52;;;6448:1;6445;6438:12;6400:52;6487:72;6551:7;6540:8;6529:9;6525:24;6487:72;:::i;:::-;6578:8;;-1:-1:-1;6461:98:1;-1:-1:-1;6632:36:1;;-1:-1:-1;6663:3:1;6648:19;;6632:36;:::i;:::-;6622:46;;6690:1;6737:3;6726:9;6722:19;6709:33;6700:42;;6761:5;6751:15;;;5143:1629;;;;;;;;;;;;;:::o;6777:184::-;6829:77;6826:1;6819:88;6926:4;6923:1;6916:15;6950:4;6947:1;6940:15;6966:184;7036:6;7089:2;7077:9;7068:7;7064:23;7060:32;7057:52;;;7105:1;7102;7095:12;7057:52;-1:-1:-1;7128:16:1;;6966:184;-1:-1:-1;6966:184:1:o;9863:::-;9915:77;9912:1;9905:88;10012:4;10009:1;10002:15;10036:4;10033:1;10026:15;10052:125;10117:9;;;10138:10;;;10135:36;;;10151:18;;:::i;10872:195::-;10911:3;10942:66;10935:5;10932:77;10929:103;;11012:18;;:::i;:::-;-1:-1:-1;11059:1:1;11048:13;;10872:195::o;11072:128::-;11139:9;;;11160:11;;;11157:37;;;11174:18;;:::i;11827:168::-;11900:9;;;11931;;11948:15;;;11942:22;;11928:37;11918:71;;11969:18;;:::i;12000:274::-;12040:1;12066;12056:189;;12101:77;12098:1;12091:88;12202:4;12199:1;12192:15;12230:4;12227:1;12220:15;12056:189;-1:-1:-1;12259:9:1;;12000:274::o
Swarm Source
ipfs://51755f2b5676d6a33d75394ec9498b6eaec891c09391816693e142bdf76e5512
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$201.97
Net Worth in S
Token Allocations
GOGLZ
31.15%
MOON
27.39%
USDC
22.68%
Others
18.78%
Multichain Portfolio | 35 Chains
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ 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.