Source Code
Overview
ETH Balance
0 ETH
ETH Value
$0.00Latest 7 from a total of 7 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Set Tier WETH To... | 236316 | 699 days ago | IN | 0 ETH | 0.00028922 | ||||
| Set Tier WETH To... | 236313 | 699 days ago | IN | 0 ETH | 0.00028108 | ||||
| Set Tier WETH To... | 236310 | 699 days ago | IN | 0 ETH | 0.00027819 | ||||
| Set Tier WETH To... | 236307 | 699 days ago | IN | 0 ETH | 0.00027323 | ||||
| Set Tier WETH To... | 236304 | 699 days ago | IN | 0 ETH | 0.00027017 | ||||
| Set Tier WETH To... | 236301 | 699 days ago | IN | 0 ETH | 0.00027117 | ||||
| Set Tier WETH To... | 236298 | 699 days ago | IN | 0 ETH | 0.00029262 |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
StakerTierBlastHub
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/**
*Submitted for verification at blastscan.io on 2024-03-01
*/
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.
/**
* @dev Wrappers over Solidity's arithmetic operations.
*
* NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
* now has built in overflow checking.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryAdd(
uint256 a,
uint256 b
) internal pure returns (bool, uint256) {
unchecked {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the substraction of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function trySub(
uint256 a,
uint256 b
) internal pure returns (bool, uint256) {
unchecked {
if (b > a) return (false, 0);
return (true, a - b);
}
}
/**
* @dev Returns the multiplication of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryMul(
uint256 a,
uint256 b
) internal pure returns (bool, uint256) {
unchecked {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the division of two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryDiv(
uint256 a,
uint256 b
) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a / b);
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryMod(
uint256 a,
uint256 b
) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a % b);
}
}
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
return a + b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return a - b;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
return a * b;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator.
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return a % b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {trySub}.
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b <= a, errorMessage);
return a - b;
}
}
/**
* @dev Returns the integer division of two unsigned integers, reverting with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a / b;
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting with custom message when dividing by zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryMod}.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a % b;
}
}
}
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(
bytes4 interfaceId
) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
// Inspired by OraclizeAPI's implementation - MIT licence
// https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
while (value != 0) {
digits -= 1;
buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
value /= 10;
}
return string(buffer);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
if (value == 0) {
return "0x00";
}
uint256 temp = value;
uint256 length = 0;
while (temp != 0) {
length++;
temp >>= 8;
}
return toHexString(value, length);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(
uint256 value,
uint256 length
) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _HEX_SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
}
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
assembly {
size := extcodesize(account)
}
return size > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(
address(this).balance >= amount,
"Address: insufficient balance"
);
(bool success, ) = recipient.call{value: amount}("");
require(
success,
"Address: unable to send value, recipient may have reverted"
);
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data
) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return
functionCallWithValue(
target,
data,
value,
"Address: low-level call with value failed"
);
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(
address(this).balance >= value,
"Address: insufficient balance for call"
);
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{value: value}(
data
);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data
) internal view returns (bytes memory) {
return
functionStaticCall(
target,
data,
"Address: low-level static call failed"
);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data
) internal returns (bytes memory) {
return
functionDelegateCall(
target,
data,
"Address: low-level delegate call failed"
);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
/**
* @dev External interface of AccessControl declared to support ERC165 detection.
*/
interface IAccessControl {
function hasRole(
bytes32 role,
address account
) external view returns (bool);
function getRoleAdmin(bytes32 role) external view returns (bytes32);
function grantRole(bytes32 role, address account) external;
function revokeRole(bytes32 role, address account) external;
function renounceRole(bytes32 role, address account) external;
}
/**
* @dev Contract module that allows children to implement role-based access
* control mechanisms. This is a lightweight version that doesn't allow enumerating role
* members except through off-chain means by accessing the contract event logs. Some
* applications may benefit from on-chain enumerability, for those cases see
* {AccessControlEnumerable}.
*
* Roles are referred to by their `bytes32` identifier. These should be exposed
* in the external API and be unique. The best way to achieve this is by
* using `public constant` hash digests:
*
* ```
* bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
* ```
*
* Roles can be used to represent a set of permissions. To restrict access to a
* function call, use {hasRole}:
*
* ```
* function foo() public {
* require(hasRole(MY_ROLE, msg.sender));
* ...
* }
* ```
*
* Roles can be granted and revoked dynamically via the {grantRole} and
* {revokeRole} functions. Each role has an associated admin role, and only
* accounts that have a role's admin role can call {grantRole} and {revokeRole}.
*
* By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
* that only accounts with this role will be able to grant or revoke other
* roles. More complex role relationships can be created by using
* {_setRoleAdmin}.
*
* WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
* grant and revoke this role. Extra precautions should be taken to secure
* accounts that have been granted it.
*/
abstract contract AccessControl is Context, IAccessControl, ERC165 {
struct RoleData {
mapping(address => bool) members;
bytes32 adminRole;
}
mapping(bytes32 => RoleData) private _roles;
bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;
/**
* @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
*
* `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
* {RoleAdminChanged} not being emitted signaling this.
*
* _Available since v3.1._
*/
event RoleAdminChanged(
bytes32 indexed role,
bytes32 indexed previousAdminRole,
bytes32 indexed newAdminRole
);
/**
* @dev Emitted when `account` is granted `role`.
*
* `sender` is the account that originated the contract call, an admin role
* bearer except when using {_setupRole}.
*/
event RoleGranted(
bytes32 indexed role,
address indexed account,
address indexed sender
);
/**
* @dev Emitted when `account` is revoked `role`.
*
* `sender` is the account that originated the contract call:
* - if using `revokeRole`, it is the admin role bearer
* - if using `renounceRole`, it is the role bearer (i.e. `account`)
*/
event RoleRevoked(
bytes32 indexed role,
address indexed account,
address indexed sender
);
/**
* @dev Modifier that checks that an account has a specific role. Reverts
* with a standardized message including the required role.
*
* The format of the revert reason is given by the following regular expression:
*
* /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
*
* _Available since v4.1._
*/
modifier onlyRole(bytes32 role) {
_checkRole(role, _msgSender());
_;
}
modifier isAdmin() {
require(
hasRole(DEFAULT_ADMIN_ROLE, _msgSender()),
"Account is not in the admin list"
);
_;
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(
bytes4 interfaceId
) public view virtual override returns (bool) {
return
interfaceId == type(IAccessControl).interfaceId ||
super.supportsInterface(interfaceId);
}
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(
bytes32 role,
address account
) public view override returns (bool) {
return _roles[role].members[account];
}
/**
* @dev Revert with a standard message if `account` is missing `role`.
*
* The format of the revert reason is given by the following regular expression:
*
* /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
*/
function _checkRole(bytes32 role, address account) internal view {
if (!hasRole(role, account)) {
revert(
string(
abi.encodePacked(
"AccessControl: account ",
Strings.toHexString(uint160(account), 20),
" is missing role ",
Strings.toHexString(uint256(role), 32)
)
)
);
}
}
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) public view override returns (bytes32) {
return _roles[role].adminRole;
}
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function grantRole(
bytes32 role,
address account
) public virtual override onlyRole(getRoleAdmin(role)) {
_grantRole(role, account);
}
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function revokeRole(
bytes32 role,
address account
) public virtual override onlyRole(getRoleAdmin(role)) {
_revokeRole(role, account);
}
/**
* @dev Revokes `role` from the calling account.
*
* Roles are often managed via {grantRole} and {revokeRole}: this function's
* purpose is to provide a mechanism for accounts to lose their privileges
* if they are compromised (such as when a trusted device is misplaced).
*
* If the calling account had been granted `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `account`.
*/
function renounceRole(
bytes32 role,
address account
) public virtual override {
require(
account == _msgSender(),
"AccessControl: can only renounce roles for self"
);
_revokeRole(role, account);
}
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event. Note that unlike {grantRole}, this function doesn't perform any
* checks on the calling account.
*
* [WARNING]
* ====
* This function should only be called from the constructor when setting
* up the initial roles for the system.
*
* Using this function in any other way is effectively circumventing the admin
* system imposed by {AccessControl}.
* ====
*/
function _setupRole(bytes32 role, address account) internal virtual {
_grantRole(role, account);
}
/**
* @dev Sets `adminRole` as ``role``'s admin role.
*
* Emits a {RoleAdminChanged} event.
*/
function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
bytes32 previousAdminRole = getRoleAdmin(role);
_roles[role].adminRole = adminRole;
emit RoleAdminChanged(role, previousAdminRole, adminRole);
}
function _grantRole(bytes32 role, address account) private {
if (!hasRole(role, account)) {
_roles[role].members[account] = true;
emit RoleGranted(role, account, _msgSender());
}
}
function _revokeRole(bytes32 role, address account) private {
if (hasRole(role, account)) {
_roles[role].members[account] = false;
emit RoleRevoked(role, account, _msgSender());
}
}
}
/**
* @dev Required interface of an ERC1155 compliant contract, as defined in the
* https://eips.ethereum.org/EIPS/eip-1155[EIP].
*
* _Available since v3.1._
*/
interface IERC1155 is IERC165 {
/**
* @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
*/
event TransferSingle(
address indexed operator,
address indexed from,
address indexed to,
uint256 id,
uint256 value
);
/**
* @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
* transfers.
*/
event TransferBatch(
address indexed operator,
address indexed from,
address indexed to,
uint256[] ids,
uint256[] values
);
/**
* @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
* `approved`.
*/
event ApprovalForAll(
address indexed account,
address indexed operator,
bool approved
);
/**
* @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
*
* If an {URI} event was emitted for `id`, the standard
* https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
* returned by {IERC1155MetadataURI-uri}.
*/
event URI(string value, uint256 indexed id);
/**
* @dev Returns the amount of tokens of token type `id` owned by `account`.
*
* Requirements:
*
* - `account` cannot be the zero address.
*/
function balanceOf(
address account,
uint256 id
) external view returns (uint256);
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
*
* Requirements:
*
* - `accounts` and `ids` must have the same length.
*/
function balanceOfBatch(
address[] calldata accounts,
uint256[] calldata ids
) external view returns (uint256[] memory);
/**
* @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
*
* Emits an {ApprovalForAll} event.
*
* Requirements:
*
* - `operator` cannot be the caller.
*/
function setApprovalForAll(address operator, bool approved) external;
/**
* @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
*
* See {setApprovalForAll}.
*/
function isApprovedForAll(
address account,
address operator
) external view returns (bool);
/**
* @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
*
* Emits a {TransferSingle} event.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
* - `from` must have a balance of tokens of type `id` of at least `amount`.
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
* acceptance magic value.
*/
function safeTransferFrom(
address from,
address to,
uint256 id,
uint256 amount,
bytes calldata data
) external;
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
*
* Emits a {TransferBatch} event.
*
* Requirements:
*
* - `ids` and `amounts` must have the same length.
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
* acceptance magic value.
*/
function safeBatchTransferFrom(
address from,
address to,
uint256[] calldata ids,
uint256[] calldata amounts,
bytes calldata data
) external;
function mint(uint256 id, address receiver) external;
}
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(
address recipient,
uint256 amount
) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(
address owner,
address spender
) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address sender,
address recipient,
uint256 amount
) external returns (bool);
function mintToken(address account, uint256 amount) external;
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(
address indexed owner,
address indexed spender,
uint256 value
);
/**
* @dev Destroys `amount` tokens from the caller.
*
* See {ERC20-_burn}.
*/
function burn(uint256 amount) external;
/**
* @dev Destroys `amount` tokens from `account`, deducting from the caller's
* allowance.
*
* See {ERC20-_burn} and {ERC20-allowance}.
*
* Requirements:
*
* - the caller must have allowance for ``accounts``'s tokens of at least
* `amount`.
*/
function burnFrom(address account, uint256 amount) external;
}
/**
* @dev _Available since v3.1._
*/
interface IERC1155Receiver is IERC165 {
/**
@dev Handles the receipt of a single ERC1155 token type. This function is
called at the end of a `safeTransferFrom` after the balance has been updated.
To accept the transfer, this must return
`bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
(i.e. 0xf23a6e61, or its own function selector).
@param operator The address which initiated the transfer (i.e. msg.sender)
@param from The address which previously owned the token
@param id The ID of the token being transferred
@param value The amount of tokens being transferred
@param data Additional data with no specified format
@return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
*/
function onERC1155Received(
address operator,
address from,
uint256 id,
uint256 value,
bytes calldata data
) external returns (bytes4);
/**
@dev Handles the receipt of a multiple ERC1155 token types. This function
is called at the end of a `safeBatchTransferFrom` after the balances have
been updated. To accept the transfer(s), this must return
`bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
(i.e. 0xbc197c81, or its own function selector).
@param operator The address which initiated the batch transfer (i.e. msg.sender)
@param from The address which previously owned the token
@param ids An array containing ids of each token being transferred (order and length must match values array)
@param values An array containing amounts of each token being transferred (order and length must match ids array)
@param data Additional data with no specified format
@return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
*/
function onERC1155BatchReceived(
address operator,
address from,
uint256[] calldata ids,
uint256[] calldata values,
bytes calldata data
) external returns (bytes4);
}
/**
* @dev _Available since v3.1._
*/
abstract contract ERC1155Receiver is ERC165, IERC1155Receiver {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(
bytes4 interfaceId
) public view virtual override(ERC165, IERC165) returns (bool) {
return
interfaceId == type(IERC1155Receiver).interfaceId ||
super.supportsInterface(interfaceId);
}
}
/**
* @dev _Available since v3.1._
*/
contract ERC1155Holder is ERC1155Receiver {
function onERC1155Received(
address,
address,
uint256,
uint256,
bytes memory
) public virtual override returns (bytes4) {
return this.onERC1155Received.selector;
}
function onERC1155BatchReceived(
address,
address,
uint256[] memory,
uint256[] memory,
bytes memory
) public virtual override returns (bytes4) {
return this.onERC1155BatchReceived.selector;
}
}
/**
* @dev
* Interface to access the TierFactory BlastHub
**/
interface ITierFactoryBlastHub {
/**
* @dev
* Returns the balance of the number of NFTs based on the NFTId
**/
function balanceOf(
address _owner,
uint256 _id
) external view returns (uint256);
/**
* @dev
* Returns the balance of a list of addresses
**/
function balanceOfBatch(
address[] calldata _owners,
uint256[] calldata _ids
) external view returns (uint256[] memory);
/**
* @dev
* Mint the NFT
**/
function mint(
address _to,
uint256 _id,
uint256 _quantity,
bytes calldata _data
) external;
/**
* @dev
* Check if the NFT is mintable
**/
function isMintable(uint256 _id) external returns (bool);
/**
* @dev
* Transfer the NFT _from _to
**/
function safeTransferFrom(
address _from,
address _to,
uint256 _id,
uint256 _amount,
bytes calldata _data
) external;
/**
* @dev
* Safe transfer a batch of NFTs _from _to
**/
function safeBatchTransferFrom(
address _from,
address _to,
uint256[] calldata _ids,
uint256[] calldata _amounts,
bytes calldata _data
) external;
/**
* @dev
* Get max supply for token id
**/
function maxSupply(uint256 _id) external view returns (uint256);
/**
* @dev
* Get the Tier based on the NFT Id
**/
function getTierByNFTId(uint256 _nftId) external view returns (uint256);
}
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using Address for address;
function safeTransfer(IERC20 token, address to, uint256 value) internal {
_callOptionalReturn(
token,
abi.encodeWithSelector(token.transfer.selector, to, value)
);
}
function safeTransferFrom(
IERC20 token,
address from,
address to,
uint256 value
) internal {
_callOptionalReturn(
token,
abi.encodeWithSelector(token.transferFrom.selector, from, to, value)
);
}
function safeIncreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
uint256 newAllowance = token.allowance(address(this), spender) + value;
_callOptionalReturn(
token,
abi.encodeWithSelector(
token.approve.selector,
spender,
newAllowance
)
);
}
function safeDecreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
unchecked {
uint256 oldAllowance = token.allowance(address(this), spender);
require(
oldAllowance >= value,
"SafeERC20: decreased allowance below zero"
);
uint256 newAllowance = oldAllowance - value;
_callOptionalReturn(
token,
abi.encodeWithSelector(
token.approve.selector,
spender,
newAllowance
)
);
}
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(
data,
"SafeERC20: low-level call failed"
);
if (returndata.length > 0) {
// Return data is optional
require(
abi.decode(returndata, (bool)),
"SafeERC20: ERC20 operation did not succeed"
);
}
}
}
/**
* @dev Staking Tier Blast Hub contract.
* Staking NFT:
* Every wallet can stake only one NFT at a time.
* Staking WETH Tokens:
* Every wallet can stake only x tokens
*
* Staking only per wallet at a time, either for NFT or WETH Tokens
**/
contract StakerTierBlastHub is ERC1155Holder, AccessControl {
using SafeMath for uint256;
using SafeERC20 for IERC20;
ITierFactoryBlastHub public tierFactory;
IERC20 public wEthToken;
IERC20 public bhubEthToken;
// The period of lockup days before you can unstake NFT or WETH tokens.
uint256 public lockupDays = 7;
// Cooldown days used after staking to calculate lockup period
uint256 public coolDownDays = 0;
// When unstaking WETH tokens before lockup period, we keep 50% as a penalty
uint256 public withholdUnstakingPercentage = 50;
// The dev wallet address that penalty WETH tokens are sent to
address private devWallet;
// Struct for the staked NFT
struct StakedTierNFT {
bool currentlyStaked;
uint256 nftId;
uint256 tierId;
uint256 creationTimestamp; // EPOCH timestamp
uint256 stakingLockupDays;
uint256 cancelStackingCoolDownDays;
}
// Tier for WETH Tokens in staked contract within a certain range
struct TierWETHTokens {
bool initialized;
uint256 tierId;
uint256 minWETHTokens;
uint256 maxWETHTokens;
}
// Struct for the staked WETH tokens
struct StakedTierWETHToken {
bool currentlyStaked;
uint256 tokenAmount;
uint256 tierId;
uint256 withholdUnstakingPercentage;
uint256 creationTimestamp; // EPOCH timestamp
uint256 stakingLockupDays;
uint256 cancelStackingCoolDownDays;
}
// Contains the list of Tiers based on the WETH Tokens min max range
TierWETHTokens[] public tierWETHTokensList;
// Each wallet can only stake either NFT or WETH token and also only once.
mapping(address => StakedTierNFT) public walletStakedTierNFTMapping;
mapping(address => StakedTierWETHToken) public walletStakedTierWETHTokenMapping;
// Events
event AddToStakedTierNFT(address staker, uint256 nftId);
event AddToStakedTierWETHToken(address staker, uint256 wEthTokensStaked);
event RemovedFromStakedTierNFT(address staker, uint256 nftId);
event RemovedFromStakedTierWETHToken(address staker, uint256 wEthTokensStaked);
event UnstakedBeforeLockupPeriodWETHToken(
address staker,
uint256 wEthTokensStakedReturned,
uint256 withheldWETHTokens
);
// Loggers for admin only
event ChangedTierFactoryAddress(
address admin,
ITierFactoryBlastHub oldTierFactoryAddress,
ITierFactoryBlastHub newTierFactoryAddress
);
event ChangedLockupDays(
address admin,
uint256 oldLockupFactoryDays,
uint256 newLockupFactoryDays
);
event ChangedCoolDownDays(
address admin,
uint256 oldCoolDownDays,
uint256 newCoolDownDays
);
event ChangedDevWalletAddress(
address admin,
address oldDevWalletAddress,
address newDevWalletAddress
);
event ChangedWithholdUnstakingPercentage(
address admin,
uint256 oldUnstakingPercentage,
uint256 newUnstakingPercentage
);
event UpdateOrCreateWETHTierTokenRange(
address admin,
uint256 tierId,
uint256 minWETHTokens,
uint256 maxWETHTokens
);
constructor(
ITierFactoryBlastHub _tierFactory,
IERC20 _wEthToken,
IERC20 _bhubEthToken,
address _devWallet
) {
_setupRole(DEFAULT_ADMIN_ROLE, msg.sender); // Add contract publisher to the admin users
tierFactory = _tierFactory;
wEthToken = _wEthToken;
bhubEthToken = _bhubEthToken;
devWallet = _devWallet;
}
// Needed for compiling
function supportsInterface(
bytes4 _interfaceId
)
public
view
virtual
override(ERC1155Receiver, AccessControl)
returns (bool)
{
return super.supportsInterface(_interfaceId);
}
// Getters and Setters
/**
* @dev
* Update or create a Tier WETH token range
**/
function setTierWETHTokenRange(
uint256 _tierId,
uint256 _minWETHTokens,
uint256 _maxWETHTokens
) public isAdmin {
// First check if the tier already exists and if so, update the current tier.
bool _tierExists = false;
uint256 _tierIndex = 0;
for (uint256 i = 0; i < tierWETHTokensList.length; i++) {
if (tierWETHTokensList[i].tierId == _tierId) {
_tierIndex = i;
_tierExists = true;
break;
}
}
if (_tierExists) {
// The tier already exists, update the existing Tier
tierWETHTokensList[_tierIndex].minWETHTokens = _minWETHTokens;
tierWETHTokensList[_tierIndex].maxWETHTokens = _maxWETHTokens;
} else {
// The tier does not exist, create a new entry
tierWETHTokensList.push(
TierWETHTokens(true, _tierId, _minWETHTokens, _maxWETHTokens)
);
}
emit UpdateOrCreateWETHTierTokenRange(
msg.sender,
_tierId,
_minWETHTokens,
_maxWETHTokens
);
}
/**
* @dev
* Returns back the entire list of WETH Tier tokens
**/
function getTierWETHTokens()
public
view
returns (TierWETHTokens[] memory tierWETHTokens)
{
return tierWETHTokensList;
}
/**
* @dev Replace the existing TierFactory address with a new one, only admins.
**/
function setTierFactoryAddress(
ITierFactoryBlastHub _tierFactory
) public isAdmin {
ITierFactoryBlastHub _oldTierFactoryAddress = tierFactory;
tierFactory = _tierFactory;
emit ChangedTierFactoryAddress(
msg.sender,
_oldTierFactoryAddress,
_tierFactory
);
}
/**
* @dev Replace the lockup_days period, only admins.
**/
function setLockupDays(uint256 _days) public isAdmin {
uint256 _oldLockupDays = lockupDays;
lockupDays = _days;
emit ChangedLockupDays(msg.sender, _oldLockupDays, _days);
}
/**
* @dev Replace the cooldowndays period, only admins.
**/
function setCoolDownDays(uint256 _days) public isAdmin {
uint256 _oldCoolDownDays = coolDownDays;
coolDownDays = _days;
emit ChangedCoolDownDays(msg.sender, _oldCoolDownDays, _days);
}
/**
* @dev Replace the dev wallet
**/
function setDevWalletAddress(address _devWallet) public isAdmin {
address _oldDevWallet = devWallet;
devWallet = _devWallet;
emit ChangedDevWalletAddress(msg.sender, _oldDevWallet, _devWallet);
}
/**
* @dev Replace the withhold unstaking percentage
**/
function setWithholdUnstakingPercentage(
uint256 _withholdUnstakingPercentage
) public isAdmin {
require(
_withholdUnstakingPercentage < 100,
"You cannot withhold more than 99 percent"
);
require(
_withholdUnstakingPercentage >= 1,
"You need to withhold at least 1 percent"
);
uint256 _oldWithholdUnstakingPercentage = withholdUnstakingPercentage;
withholdUnstakingPercentage = _withholdUnstakingPercentage;
emit ChangedWithholdUnstakingPercentage(
msg.sender,
_oldWithholdUnstakingPercentage,
_withholdUnstakingPercentage
);
}
/**
* @dev
* Returns the NFT ID currently staked
**/
function getNFTIdStaked(
address _wallet
) public view returns (uint256 nftIdStaked) {
require(
hasWalletCurrentlyStakedNFT(_wallet) == true,
"Wallet has currently no NFT staked"
);
require(
hasWalletCurrentlyStakedWETHTokens(_wallet) == false,
"Wallet has staked WETH Tokens and not NFTs"
);
return walletStakedTierNFTMapping[_wallet].nftId;
}
/**
* @dev
* Returns the token amount staked
**/
function getTokensAmountStaked(
address _wallet
) public view returns (uint256 tokenAmountStaked) {
require(
hasWalletCurrentlyStakedNFT(_wallet) == false,
"Wallet has staked NFTs and not WETH tokens"
);
require(
hasWalletCurrentlyStakedWETHTokens(_wallet) == true,
"Wallet has currently no WETH Tokens staked"
);
return walletStakedTierWETHTokenMapping[_wallet].tokenAmount;
}
/**
* @dev
* Returns back the Tier for staked benefits, either the token staked or NFT staked
**/
function getTierBenefitForStaker(
address _wallet
) public view returns (uint256 tierId) {
uint256 result = 0;
if (hasWalletCurrentlyStakedNFT(_wallet)) {
// If the wallet has staked NFT, get back the Tier for that NFT and return it.
result = tierFactory.getTierByNFTId(getNFTIdStaked(_wallet));
} else if (hasWalletCurrentlyStakedWETHTokens(_wallet)) {
// If the wallet has staked WETH tokens, calculate the TierID for the tokens staked
uint256 _wEthTokenAmountToStake = walletStakedTierWETHTokenMapping[
_wallet
].tokenAmount;
result = getTierIdFromTokensStaked(_wEthTokenAmountToStake);
}
return result;
}
/**
* @dev
* Returns back the Tier for the Tokens staked
**/
function getTierIdFromTokensStaked(
uint256 _tokensStaked
) public view returns (uint256 tierId) {
uint256 result = 0;
for (uint256 i = 0; i < tierWETHTokensList.length; i++) {
if (
_tokensStaked >= tierWETHTokensList[i].minWETHTokens &&
_tokensStaked <= tierWETHTokensList[i].maxWETHTokens
) {
result = tierWETHTokensList[i].tierId;
break;
}
}
return result;
}
/**
* @dev Returns uint256 lockupTime left for staked address for NFT Staked
**/
function getLockupTimeLeftStakedNFT(
address _wallet
) public view returns (uint256 lockupTimeLeft) {
require(
hasWalletCurrentlyStakedNFT(_wallet) == true,
"Wallet has currently no NFT staked"
);
require(
hasWalletCurrentlyStakedWETHTokens(_wallet) == false,
"Wallet has staked WETH Tokens and not NFTs"
);
StakedTierNFT memory _stakedTierNFT = walletStakedTierNFTMapping[
_wallet
];
uint256 result = 0;
if (
(_stakedTierNFT.creationTimestamp +
(_stakedTierNFT.stakingLockupDays * 1 days) -
block.timestamp) > 0
) {
result =
_stakedTierNFT.creationTimestamp +
(_stakedTierNFT.stakingLockupDays * 1 days) -
block.timestamp;
}
return result;
}
/**
* @dev Returns uint256 lockupTime left for staked address for Tokens Stakend
**/
function getLockupTimeLeftStakedWETHTokens(
address _wallet
) public view returns (uint256 lockupTimeLeft) {
require(
hasWalletCurrentlyStakedNFT(_wallet) == false,
"Wallet has staked NFTs and not WETH tokens"
);
require(
hasWalletCurrentlyStakedWETHTokens(_wallet) == true,
"Wallet has currently no WETH Tokens staked"
);
StakedTierWETHToken
memory _stakedTierWETHToken = walletStakedTierWETHTokenMapping[_wallet];
uint256 result = 0;
if (
(_stakedTierWETHToken.creationTimestamp +
(_stakedTierWETHToken.stakingLockupDays * 1 days) -
block.timestamp) > 0
) {
result =
_stakedTierWETHToken.creationTimestamp +
(_stakedTierWETHToken.stakingLockupDays * 1 days) -
block.timestamp;
}
return result;
}
// Checks
/**
* @dev Check if account has any Completed staked NFTs for Tier
**/
function hasWalletCompletedStakingNFT(
address _wallet
) public view returns (bool hasCompletedStakingNFT) {
bool result = true;
// 1. get the staked NFT object
StakedTierNFT memory _stakedTierNFT = walletStakedTierNFTMapping[
_wallet
];
// 2. Check if the lockup period is still counting
// If the creationTimestamp with added lockupDays is equal or bigger than now, then the auction has expired
if (
_stakedTierNFT.creationTimestamp +
_stakedTierNFT.stakingLockupDays *
1 days >=
block.timestamp
) {
result = false;
}
return result;
}
/**
* @dev Check if account has any Completed staked WETH Tokens for Tier
**/
function hasWalletCompletedStakingWETHTokens(
address _wallet
) public view returns (bool hasCompletedStakingWETHTokens) {
bool result = true;
// 1. get the staked NFT object
StakedTierWETHToken
memory _stakedTierWETHToken = walletStakedTierWETHTokenMapping[_wallet];
// 2. Check if the lockup period is still counting
// If the creationTimestamp with added lockupDays is equal or bigger than now, then the auction has expired
if (
_stakedTierWETHToken.creationTimestamp +
_stakedTierWETHToken.stakingLockupDays *
1 days >=
block.timestamp
) {
result = false;
}
return result;
}
/**
* @dev Check if address has already staked for another NFT Tier
**/
function hasWalletCurrentlyStakedNFT(
address _wallet
) public view returns (bool hasStakedNFT) {
bool result = false;
if (walletStakedTierNFTMapping[_wallet].currentlyStaked == true) {
result = true;
}
return result;
}
/**
* @dev Check if address has already staked for Tokens
**/
function hasWalletCurrentlyStakedWETHTokens(
address _wallet
) public view returns (bool hasStakedWETHTokens) {
bool result = false;
if (walletStakedTierWETHTokenMapping[_wallet].currentlyStaked == true) {
result = true;
}
return result;
}
/**
* @dev Returns true if address can cancel staked NFT
**/
function hasCancelCoolDownDaysExpiredForStakedNFT(
address _wallet
) public view returns (bool expired) {
require(
hasWalletCurrentlyStakedNFT(_wallet) == true,
"You have currently no NFT staked"
);
require(
hasWalletCompletedStakingNFT(_wallet) == true,
"Lockup period still pending"
);
bool result = true;
// 1. get the staked NFT object
StakedTierNFT memory _stakedTierNFT = walletStakedTierNFTMapping[
_wallet
];
// 2. Check if the cool down period has expired
// If the creationTimestamp with added lockupDays is equal or bigger than now, then the auction has expired
if (
_stakedTierNFT.creationTimestamp +
(_stakedTierNFT.stakingLockupDays * 1 days) +
(_stakedTierNFT.cancelStackingCoolDownDays * 1 days) >=
block.timestamp
) {
result = false;
}
return result;
}
// BusinessLogic
/**
* @dev Transfers the NFT of the msg.sender to this contract to be staked
* You can only stake once per wallet
*/
function stakeTierNFT(uint256 _nftId) public {
require(
tierFactory.balanceOf(msg.sender, _nftId) > 0,
"You do not own this NFT"
);
require(
hasWalletCurrentlyStakedNFT(msg.sender) == false,
"You have already staked NFTs"
);
require(
hasWalletCurrentlyStakedWETHTokens(msg.sender) == false,
"You have already staked WETHTokens"
);
// SafeTransfer the NFT from the msg.sender to the contract
tierFactory.safeTransferFrom(msg.sender, address(this), _nftId, 1, "");
// Create a new staking NFT object and add them to the mapping
uint256 _tierId = tierFactory.getTierByNFTId(_nftId);
walletStakedTierNFTMapping[msg.sender] = StakedTierNFT(
true,
_nftId,
_tierId,
block.timestamp,
lockupDays,
coolDownDays
);
// Emit event
emit AddToStakedTierNFT(msg.sender, _nftId);
}
/**
* @dev Transfers the WETHTokens of the msg.sender to this contract to be staked.
* Wallet can only stake once per wallet
**/
function stakeTierWETHTokens(uint256 _wEthTokenAmountToStake) public {
require(
wEthToken.balanceOf(msg.sender) >= _wEthTokenAmountToStake,
"You do not own enough tokens to stake"
);
require(
hasWalletCurrentlyStakedNFT(msg.sender) == false,
"You have already staked NFTs"
);
require(
hasWalletCurrentlyStakedWETHTokens(msg.sender) == false,
"You have already staked WETHTokens"
);
// SafeTransfer the tokens from msg.sender to this contract
wEthToken.safeTransferFrom(
msg.sender,
address(this),
_wEthTokenAmountToStake
);
// Mint sWETH tokens
bhubEthToken.mintToken(msg.sender, _wEthTokenAmountToStake);
// Get the Tier Id from the amount of _wEthTokenAmountToStake
uint256 _tierId = getTierIdFromTokensStaked(_wEthTokenAmountToStake);
// Create a new staking WETHToken object and add them to the mapping
walletStakedTierWETHTokenMapping[msg.sender] = StakedTierWETHToken(
true,
_wEthTokenAmountToStake,
_tierId,
withholdUnstakingPercentage,
block.timestamp,
lockupDays,
coolDownDays
);
// Emit event
emit AddToStakedTierWETHToken(msg.sender, _wEthTokenAmountToStake);
}
/**
* @dev Add more tokens to Staked WETH Tokens
**/
function updateCurrentStakedWETHTokens(uint256 _wEthTokenAmountToStake) public {
require(
wEthToken.balanceOf(msg.sender) >= _wEthTokenAmountToStake,
"You do not own enough tokens to stake"
);
require(
hasWalletCurrentlyStakedNFT(msg.sender) == false,
"You have already staked NFTs"
);
require(
hasWalletCurrentlyStakedWETHTokens(msg.sender) == true,
"You do not have staked WETHTokens"
);
// SafeTransfer the tokens from msg.sender to this contract
wEthToken.safeTransferFrom(
msg.sender,
address(this),
_wEthTokenAmountToStake
);
// Mint sWETH tokens
bhubEthToken.mintToken(msg.sender, _wEthTokenAmountToStake);
// Create a new staking WETHToken object and add them to the mapping
walletStakedTierWETHTokenMapping[msg.sender].tokenAmount =
walletStakedTierWETHTokenMapping[msg.sender].tokenAmount +
_wEthTokenAmountToStake;
// Update the Tier id
uint256 _tierId = getTierIdFromTokensStaked(
walletStakedTierWETHTokenMapping[msg.sender].tokenAmount
);
walletStakedTierWETHTokenMapping[msg.sender].tierId = _tierId;
// Reset the lockup period in days
walletStakedTierWETHTokenMapping[msg.sender].creationTimestamp = block
.timestamp;
// Emit event
emit AddToStakedTierWETHToken(msg.sender, _wEthTokenAmountToStake);
}
/**
* @dev Cancels the staked NFT and returns it to the owner
*/
function unstakeTierNFT() public {
require(
hasWalletCurrentlyStakedNFT(msg.sender) == true,
"You have currently no NFT staked"
);
require(
hasWalletCompletedStakingNFT(msg.sender) == true,
"Lockup period still pending"
);
require(
hasCancelCoolDownDaysExpiredForStakedNFT(msg.sender) == true,
"You need to wait for the cool down period to expire"
);
// 1. get the staked NFT object
StakedTierNFT memory _stakedTierNFT = walletStakedTierNFTMapping[
msg.sender
];
// 2. Since the staking lockup period has expired, transfer the NFT back to the owner
// SafeTransfer the NFT from the msg.sender to the contract
tierFactory.safeTransferFrom(
address(this),
msg.sender,
_stakedTierNFT.nftId,
1,
""
);
// 3. Remove the StakedTierNFT Object from the mapping
delete walletStakedTierNFTMapping[msg.sender];
// Emit event
emit RemovedFromStakedTierNFT(msg.sender, _stakedTierNFT.nftId);
}
/**
* @dev Unstake WETH Tokens after lockup period
*/
function unstakeTierWETHTokensAfterLockupPeriod() public {
require(
hasWalletCurrentlyStakedWETHTokens(msg.sender) == true,
"You have no WETHTokens staked"
);
require(
hasWalletCompletedStakingWETHTokens(msg.sender) == true,
"Lockup period still pending"
);
// 1. get the staked NFT object
StakedTierWETHToken
memory _stakedTierWETHToken = walletStakedTierWETHTokenMapping[
msg.sender
];
require(
bhubEthToken.balanceOf(msg.sender) >= _stakedTierWETHToken.tokenAmount,
"You don't have enough sWETH token!"
);
// 2. Since the staking lockup period has expired, transfer the WETH Tokens back to the owner
// SafeTransfer the WETHTokens from the contract to the msg.sender
wEthToken.safeTransfer(msg.sender, _stakedTierWETHToken.tokenAmount);
// burn sWETH tokens of user
bhubEthToken.burnFrom(msg.sender, _stakedTierWETHToken.tokenAmount);
// 3. Remove the StakedTierWETHToken Object from the mapping
delete walletStakedTierWETHTokenMapping[msg.sender];
// Emit event
emit RemovedFromStakedTierWETHToken(
msg.sender,
_stakedTierWETHToken.tokenAmount
);
}
/**
* @dev Unstake WETH Token while lockup period still pending
**/
function unstakeTierWETHTokensBeforeLockupPeriod() public {
require(
hasWalletCurrentlyStakedWETHTokens(msg.sender) == true,
"You have no WETHTokens staked"
);
require(
hasWalletCompletedStakingWETHTokens(msg.sender) == false,
"Lockup period has expired"
);
// 1. get the staked NFT object
StakedTierWETHToken
memory _stakedTierWETHToken = walletStakedTierWETHTokenMapping[
msg.sender
];
require(
bhubEthToken.balanceOf(msg.sender) >= _stakedTierWETHToken.tokenAmount,
"You don't have enough sWETH token!"
);
uint256 _wEthTokensToReturnToStaker = 0;
uint256 _wEthTokensPenaltyToDevWallet = 0;
// 2. Set the tokens that need to be returned
_wEthTokensPenaltyToDevWallet =
(_stakedTierWETHToken.tokenAmount *
_stakedTierWETHToken.withholdUnstakingPercentage) /
100;
_wEthTokensToReturnToStaker =
_stakedTierWETHToken.tokenAmount -
_wEthTokensPenaltyToDevWallet;
// 3. Safe transfer the tokens to the dev wallet and the staker
wEthToken.safeTransfer(msg.sender, _wEthTokensToReturnToStaker);
wEthToken.safeTransfer(devWallet, _wEthTokensPenaltyToDevWallet);
// burn sWETH tokens of user
bhubEthToken.burnFrom(msg.sender, _stakedTierWETHToken.tokenAmount);
// 4. Remove the StakedTierWETHToken Object from the mapping
delete walletStakedTierWETHTokenMapping[msg.sender];
// Emit event
emit UnstakedBeforeLockupPeriodWETHToken(
msg.sender,
_wEthTokensToReturnToStaker,
_wEthTokensPenaltyToDevWallet
);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"contract ITierFactoryBlastHub","name":"_tierFactory","type":"address"},{"internalType":"contract IERC20","name":"_wEthToken","type":"address"},{"internalType":"contract IERC20","name":"_bhubEthToken","type":"address"},{"internalType":"address","name":"_devWallet","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"AddToStakedTierNFT","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"wEthTokensStaked","type":"uint256"}],"name":"AddToStakedTierWETHToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"admin","type":"address"},{"indexed":false,"internalType":"uint256","name":"oldCoolDownDays","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newCoolDownDays","type":"uint256"}],"name":"ChangedCoolDownDays","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"admin","type":"address"},{"indexed":false,"internalType":"address","name":"oldDevWalletAddress","type":"address"},{"indexed":false,"internalType":"address","name":"newDevWalletAddress","type":"address"}],"name":"ChangedDevWalletAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"admin","type":"address"},{"indexed":false,"internalType":"uint256","name":"oldLockupFactoryDays","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newLockupFactoryDays","type":"uint256"}],"name":"ChangedLockupDays","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"admin","type":"address"},{"indexed":false,"internalType":"contract ITierFactoryBlastHub","name":"oldTierFactoryAddress","type":"address"},{"indexed":false,"internalType":"contract ITierFactoryBlastHub","name":"newTierFactoryAddress","type":"address"}],"name":"ChangedTierFactoryAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"admin","type":"address"},{"indexed":false,"internalType":"uint256","name":"oldUnstakingPercentage","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newUnstakingPercentage","type":"uint256"}],"name":"ChangedWithholdUnstakingPercentage","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"RemovedFromStakedTierNFT","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"wEthTokensStaked","type":"uint256"}],"name":"RemovedFromStakedTierWETHToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"wEthTokensStakedReturned","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"withheldWETHTokens","type":"uint256"}],"name":"UnstakedBeforeLockupPeriodWETHToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"admin","type":"address"},{"indexed":false,"internalType":"uint256","name":"tierId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"minWETHTokens","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxWETHTokens","type":"uint256"}],"name":"UpdateOrCreateWETHTierTokenRange","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bhubEthToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"coolDownDays","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"getLockupTimeLeftStakedNFT","outputs":[{"internalType":"uint256","name":"lockupTimeLeft","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"getLockupTimeLeftStakedWETHTokens","outputs":[{"internalType":"uint256","name":"lockupTimeLeft","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"getNFTIdStaked","outputs":[{"internalType":"uint256","name":"nftIdStaked","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"getTierBenefitForStaker","outputs":[{"internalType":"uint256","name":"tierId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokensStaked","type":"uint256"}],"name":"getTierIdFromTokensStaked","outputs":[{"internalType":"uint256","name":"tierId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTierWETHTokens","outputs":[{"components":[{"internalType":"bool","name":"initialized","type":"bool"},{"internalType":"uint256","name":"tierId","type":"uint256"},{"internalType":"uint256","name":"minWETHTokens","type":"uint256"},{"internalType":"uint256","name":"maxWETHTokens","type":"uint256"}],"internalType":"struct StakerTierBlastHub.TierWETHTokens[]","name":"tierWETHTokens","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"getTokensAmountStaked","outputs":[{"internalType":"uint256","name":"tokenAmountStaked","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"hasCancelCoolDownDaysExpiredForStakedNFT","outputs":[{"internalType":"bool","name":"expired","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"hasWalletCompletedStakingNFT","outputs":[{"internalType":"bool","name":"hasCompletedStakingNFT","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"hasWalletCompletedStakingWETHTokens","outputs":[{"internalType":"bool","name":"hasCompletedStakingWETHTokens","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"hasWalletCurrentlyStakedNFT","outputs":[{"internalType":"bool","name":"hasStakedNFT","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"hasWalletCurrentlyStakedWETHTokens","outputs":[{"internalType":"bool","name":"hasStakedWETHTokens","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockupDays","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_days","type":"uint256"}],"name":"setCoolDownDays","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_devWallet","type":"address"}],"name":"setDevWalletAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_days","type":"uint256"}],"name":"setLockupDays","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ITierFactoryBlastHub","name":"_tierFactory","type":"address"}],"name":"setTierFactoryAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tierId","type":"uint256"},{"internalType":"uint256","name":"_minWETHTokens","type":"uint256"},{"internalType":"uint256","name":"_maxWETHTokens","type":"uint256"}],"name":"setTierWETHTokenRange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_withholdUnstakingPercentage","type":"uint256"}],"name":"setWithholdUnstakingPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nftId","type":"uint256"}],"name":"stakeTierNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_wEthTokenAmountToStake","type":"uint256"}],"name":"stakeTierWETHTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tierFactory","outputs":[{"internalType":"contract ITierFactoryBlastHub","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tierWETHTokensList","outputs":[{"internalType":"bool","name":"initialized","type":"bool"},{"internalType":"uint256","name":"tierId","type":"uint256"},{"internalType":"uint256","name":"minWETHTokens","type":"uint256"},{"internalType":"uint256","name":"maxWETHTokens","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unstakeTierNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unstakeTierWETHTokensAfterLockupPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unstakeTierWETHTokensBeforeLockupPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_wEthTokenAmountToStake","type":"uint256"}],"name":"updateCurrentStakedWETHTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wEthToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"walletStakedTierNFTMapping","outputs":[{"internalType":"bool","name":"currentlyStaked","type":"bool"},{"internalType":"uint256","name":"nftId","type":"uint256"},{"internalType":"uint256","name":"tierId","type":"uint256"},{"internalType":"uint256","name":"creationTimestamp","type":"uint256"},{"internalType":"uint256","name":"stakingLockupDays","type":"uint256"},{"internalType":"uint256","name":"cancelStackingCoolDownDays","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"walletStakedTierWETHTokenMapping","outputs":[{"internalType":"bool","name":"currentlyStaked","type":"bool"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"internalType":"uint256","name":"tierId","type":"uint256"},{"internalType":"uint256","name":"withholdUnstakingPercentage","type":"uint256"},{"internalType":"uint256","name":"creationTimestamp","type":"uint256"},{"internalType":"uint256","name":"stakingLockupDays","type":"uint256"},{"internalType":"uint256","name":"cancelStackingCoolDownDays","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withholdUnstakingPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]Contract Creation Code
60806040526007600455600060055560326006553480156200002057600080fd5b506040516200334d3803806200334d83398101604081905262000043916200016d565b62000050600033620000a4565b600180546001600160a01b039586166001600160a01b0319918216179091556002805494861694821694909417909355600380549285169284169290921790915560078054919093169116179055620001d5565b620000b08282620000b4565b5050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff16620000b0576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620001103390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6001600160a01b03811681146200016a57600080fd5b50565b600080600080608085870312156200018457600080fd5b8451620001918162000154565b6020860151909450620001a48162000154565b6040860151909350620001b78162000154565b6060860151909250620001ca8162000154565b939692955090935050565b61316880620001e56000396000f3fe608060405234801561001057600080fd5b506004361061025e5760003560e01c8063842b047e11610146578063c5ff87fb116100c3578063e15853d911610087578063e15853d914610647578063e1a4f14a1461065a578063e406bbbd1461066d578063f23a6e6114610680578063f52dd1331461069f578063fdd3fd38146106a757600080fd5b8063c5ff87fb146105e6578063c9993709146105fb578063d547741f1461060e578063d859345f14610621578063ddadd90f1461063457600080fd5b806398bc695d1161010a57806398bc695d14610577578063a217fddf14610580578063a2b70e5914610588578063bc197c811461059b578063c1679476146105d357600080fd5b8063842b047e146104b057806390273901146104c357806391d14854146104cb57806393c310b7146104de57806396e431df146104f157600080fd5b806346d77162116101df578063587e7736116101a3578063587e77361461041c5780635a2f80a01461042f57806365f3e00d14610442578063680cefa01461045557806369267744146104685780636e9ceae91461047b57600080fd5b806346d77162146103645780635040df9a14610377578063523280861461038a578063554a706014610400578063583d5a831461041357600080fd5b80631c620d80116102265780631c620d80146102dd578063248a9ca3146102f05780632f2ff15d146103135780633580b13b1461032657806336568abe1461035157600080fd5b806301de23511461026357806301ffc9a71461027f57806311983e53146102a257806311aec429146102b5578063120a0612146102ca575b600080fd5b61026c60055481565b6040519081526020015b60405180910390f35b61029261028d3660046128d9565b6106af565b6040519015158152602001610276565b61026c6102b036600461291b565b6106c0565b6102c86102c3366004612938565b6107ea565b005b6102c86102d836600461291b565b610859565b61026c6102eb36600461291b565b6108e1565b61026c6102fe366004612938565b60009081526020819052604090206001015490565b6102c8610321366004612951565b6109f8565b600254610339906001600160a01b031681565b6040516001600160a01b039091168152602001610276565b6102c861035f366004612951565b610a23565b6102c8610372366004612938565b610aa1565b61029261038536600461291b565b610d34565b6103d161039836600461291b565b60096020526000908152604090208054600182015460028301546003840154600485015460059095015460ff9094169492939192909186565b6040805196151587526020870195909552938501929092526060840152608083015260a082015260c001610276565b6102c861040e366004612938565b610dc9565b61026c60065481565b61029261042a36600461291b565b610eee565b6102c861043d366004612938565b611016565b61029261045036600461291b565b611079565b6102c8610463366004612981565b6110a9565b600354610339906001600160a01b031681565b61048e610489366004612938565b6112b2565b6040805194151585526020850193909352918301526060820152608001610276565b600154610339906001600160a01b031681565b6102c86112f0565b6102926104d9366004612951565b61151f565b61026c6104ec36600461291b565b611548565b6105406104ff36600461291b565b600a60205260009081526040902080546001820154600283015460038401546004850154600586015460069096015460ff9095169593949293919290919087565b6040805197151588526020880196909652948601939093526060850191909152608084015260a083015260c082015260e001610276565b61026c60045481565b61026c600081565b6102c861059636600461291b565b6115b9565b6105ba6105a9366004612ad9565b63bc197c8160e01b95945050505050565b6040516001600160e01b03199091168152602001610276565b6102c86105e1366004612938565b611641565b6105ee611862565b6040516102769190612b87565b6102c8610609366004612938565b6118e8565b6102c861061c366004612951565b611b06565b61026c61062f36600461291b565b611b2c565b61029261064236600461291b565b611b9d565b61029261065536600461291b565b611bcd565b61026c610668366004612938565b611c5b565b61026c61067b36600461291b565b611d05565b6105ba61068e366004612bed565b63f23a6e6160e01b95945050505050565b6102c8611dd1565b6102c861203b565b60006106ba82612329565b92915050565b60006106cb82611b9d565b15156001146106f55760405162461bcd60e51b81526004016106ec90612c56565b60405180910390fd5b6106fe82611079565b1561071b5760405162461bcd60e51b81526004016106ec90612c98565b6001600160a01b0382166000908152600960209081526040808320815160c081018352815460ff16151581526001820154938101939093526002810154918301919091526003810154606083015260048101546080830181905260059091015460a0830152909190819042906107949062015180612cf8565b84606001516107a39190612d0f565b6107ad9190612d22565b11156107e357428260800151620151806107c79190612cf8565b83606001516107d69190612d0f565b6107e09190612d22565b90505b9392505050565b6107f560003361151f565b6108115760405162461bcd60e51b81526004016106ec90612d35565b60048054908290556040517f339b9229beac0da59bc8ab4913b1e81b018cae9ecef830c573c53deeb87f5c529061084d90339084908690612d6a565b60405180910390a15050565b61086460003361151f565b6108805760405162461bcd60e51b81526004016106ec90612d35565b600780546001600160a01b031981166001600160a01b0384811691821790935560408051338152939092166020840181905291830152907f51b66e0e5bd72224dd75c35b693ad62bd75766bdb04230e2c8c218752c51408a9060600161084d565b60006108ec82611b9d565b156109095760405162461bcd60e51b81526004016106ec90612d8b565b61091282611079565b15156001146109335760405162461bcd60e51b81526004016106ec90612dd5565b6001600160a01b0382166000908152600a60209081526040808320815160e081018352815460ff16151581526001820154938101939093526002810154918301919091526003810154606083015260048101546080830152600581015460a0830181905260069091015460c0830152909190819042906109b69062015180612cf8565b84608001516109c59190612d0f565b6109cf9190612d22565b11156107e357428260a00151620151806109e99190612cf8565b83608001516107d69190612d0f565b600082815260208190526040902060010154610a14813361234e565b610a1e83836123b2565b505050565b6001600160a01b0381163314610a935760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016106ec565b610a9d8282612436565b5050565b600154604051627eeac760e11b81526000916001600160a01b03169062fdd58e90610ad29033908690600401612e1f565b602060405180830381865afa158015610aef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b139190612e38565b11610b605760405162461bcd60e51b815260206004820152601760248201527f596f7520646f206e6f74206f776e2074686973204e465400000000000000000060448201526064016106ec565b610b6933611b9d565b15610b865760405162461bcd60e51b81526004016106ec90612e51565b610b8f33611079565b15610bac5760405162461bcd60e51b81526004016106ec90612e88565b60018054604051637921219560e11b81526001600160a01b039091169163f242432a91610be191339130918791600401612eca565b600060405180830381600087803b158015610bfb57600080fd5b505af1158015610c0f573d6000803e3d6000fd5b5050600154604051634551169d60e01b815260048101859052600093506001600160a01b039091169150634551169d90602401602060405180830381865afa158015610c5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c839190612e38565b6040805160c08101825260018082526020808301878152838501868152426060860190815260048054608088019081526005805460a08a019081523360008181526009909952978b902099518a5460ff1916901515178a55955197890197909755925160028801559051600387015590519085015551929091019190915590519192507fae60b3ca24281aea6e75782e0e5a980a7dd9ee173e63fb212a8c0def1fc6efe79161084d91908590612e1f565b6001600160a01b0381166000908152600960209081526040808320815160c081018352815460ff1615158152600182810154948201949094526002820154928101929092526003810154606083015260048101546080830181905260059091015460a08301524290610da99062015180612cf8565b8260600151610db89190612d0f565b10610dc257600091505b5092915050565b610dd460003361151f565b610df05760405162461bcd60e51b81526004016106ec90612d35565b60648110610e515760405162461bcd60e51b815260206004820152602860248201527f596f752063616e6e6f742077697468686f6c64206d6f7265207468616e203939604482015267081c195c98d95b9d60c21b60648201526084016106ec565b6001811015610eb25760405162461bcd60e51b815260206004820152602760248201527f596f75206e65656420746f2077697468686f6c64206174206c656173742031206044820152661c195c98d95b9d60ca1b60648201526084016106ec565b60068054908290556040517fbed291e013058f2243e71b2170f425b3c4819b155f012b92e4492b3ad3e866849061084d90339084908690612d6a565b6000610ef982611b9d565b1515600114610f4a5760405162461bcd60e51b815260206004820181905260248201527f596f7520686176652063757272656e746c79206e6f204e4654207374616b656460448201526064016106ec565b610f5382610d34565b1515600114610f745760405162461bcd60e51b81526004016106ec90612f02565b6001600160a01b038216600090815260096020908152604091829020825160c081018452815460ff16151581526001828101549382019390935260028201549381019390935260038101546060840152600481015460808401526005015460a083018190529091904290610feb9062015180612cf8565b6080830151610ffd9062015180612cf8565b836060015161100c9190612d0f565b610db89190612d0f565b61102160003361151f565b61103d5760405162461bcd60e51b81526004016106ec90612d35565b60058054908290556040517fdb8d38150b9bb879c12291844bcd9c914b7c4666ae198f4db69a5a5176d13ee89061084d90339084908690612d6a565b6001600160a01b0381166000908152600a6020526040812054819060ff1615156001036106ba5750600192915050565b6110b460003361151f565b6110d05760405162461bcd60e51b81526004016106ec90612d35565b60008060005b6008548110156111295785600882815481106110f4576110f4612f39565b906000526020600020906004020160010154036111175780915060019250611129565b8061112181612f4f565b9150506110d6565b50811561118757836008828154811061114457611144612f39565b906000526020600020906004020160020181905550826008828154811061116d5761116d612f39565b906000526020600020906004020160030181905550611263565b604080516080810182526001808252602082018881529282018781526060830187815260088054938401815560005292517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee36004909302928301805460ff191691151591909117905592517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee482015591517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee5830155517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee6909101555b6040805133815260208101879052908101859052606081018490527f9ab3a3aa3898f03e382a329fbebc7dcd0b0cf8f18181e3517e3327a0fe971ff09060800160405180910390a15050505050565b600881815481106112c257600080fd5b6000918252602090912060049091020180546001820154600283015460039093015460ff9092169350919084565b6112f933611b9d565b151560011461134a5760405162461bcd60e51b815260206004820181905260248201527f596f7520686176652063757272656e746c79206e6f204e4654207374616b656460448201526064016106ec565b61135333610d34565b15156001146113745760405162461bcd60e51b81526004016106ec90612f02565b61137d33610eee565b15156001146113ea5760405162461bcd60e51b815260206004820152603360248201527f596f75206e65656420746f207761697420666f722074686520636f6f6c20646f604482015272776e20706572696f6420746f2065787069726560681b60648201526084016106ec565b33600081815260096020908152604091829020825160c081018452815460ff161515815260018083015493820184905260028301548286015260038301546060830152600480840154608084015260059093015460a083015280549451637921219560e11b815291956001600160a01b039095169463f242432a946114759430949293919201612eca565b600060405180830381600087803b15801561148f57600080fd5b505af11580156114a3573d6000803e3d6000fd5b5050336000818152600960209081526040808320805460ff19168155600181018490556002810184905560038101849055600481018490556005019290925585015190517fb04b58934e9f7d959ec5e18634b0bc7164b689fa752fd45d2f20f8ccfa33cab194506115149350612e1f565b60405180910390a150565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b600061155382611b9d565b156115705760405162461bcd60e51b81526004016106ec90612d8b565b61157982611079565b151560011461159a5760405162461bcd60e51b81526004016106ec90612dd5565b506001600160a01b03166000908152600a602052604090206001015490565b6115c460003361151f565b6115e05760405162461bcd60e51b81526004016106ec90612d35565b600180546001600160a01b031981166001600160a01b0384811691821790935560408051338152939092166020840181905291830152907f9d5e5e35ff4b9029875bfd320e82316168739f50ec7d9b2847a08542967036789060600161084d565b6002546040516370a0823160e01b815233600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa158015611689573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ad9190612e38565b10156116cb5760405162461bcd60e51b81526004016106ec90612f68565b6116d433611b9d565b156116f15760405162461bcd60e51b81526004016106ec90612e51565b6116fa33611079565b156117175760405162461bcd60e51b81526004016106ec90612e88565b60025461172f906001600160a01b031633308461249b565b600354604051630f38ca0d60e31b81526001600160a01b03909116906379c65068906117619033908590600401612e1f565b600060405180830381600087803b15801561177b57600080fd5b505af115801561178f573d6000803e3d6000fd5b50505050600061179e82611c5b565b6040805160e08101825260018082526020808301878152838501868152600680546060870190815242608088019081526004805460a08a019081526005805460c08c01908152336000818152600a909b52998d90209b518c5460ff1916901515178c559751998b0199909955945160028a015591516003890155519087015590519385019390935551929091019190915590519192507fc06da153f5addc7510f70c2b8a3222e69d0a01b067bbbe32051d4a65d5ff05649161084d91908590612e1f565b60606008805480602002602001604051908101604052809291908181526020016000905b828210156118df5760008481526020908190206040805160808101825260048602909201805460ff1615158352600180820154848601526002820154928401929092526003015460608301529083529092019101611886565b50505050905090565b6002546040516370a0823160e01b815233600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa158015611930573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119549190612e38565b10156119725760405162461bcd60e51b81526004016106ec90612f68565b61197b33611b9d565b156119985760405162461bcd60e51b81526004016106ec90612e51565b6119a133611079565b15156001146119fc5760405162461bcd60e51b815260206004820152602160248201527f596f7520646f206e6f742068617665207374616b65642057455448546f6b656e6044820152607360f81b60648201526084016106ec565b600254611a14906001600160a01b031633308461249b565b600354604051630f38ca0d60e31b81526001600160a01b03909116906379c6506890611a469033908590600401612e1f565b600060405180830381600087803b158015611a6057600080fd5b505af1158015611a74573d6000803e3d6000fd5b5050336000908152600a6020526040902060010154611a969250839150612d0f565b336000908152600a6020526040812060010182905590611ab590611c5b565b336000818152600a6020526040908190206002810184905542600490910155519192507fc06da153f5addc7510f70c2b8a3222e69d0a01b067bbbe32051d4a65d5ff05649161084d91908590612e1f565b600082815260208190526040902060010154611b22813361234e565b610a1e8383612436565b6000611b3782611b9d565b1515600114611b585760405162461bcd60e51b81526004016106ec90612c56565b611b6182611079565b15611b7e5760405162461bcd60e51b81526004016106ec90612c98565b506001600160a01b031660009081526009602052604090206001015490565b6001600160a01b038116600090815260096020526040812054819060ff1615156001036106ba5750600192915050565b6001600160a01b0381166000908152600a60209081526040808320815160e081018352815460ff1615158152600182810154948201949094526002820154928101929092526003810154606083015260048101546080830152600581015460a0830181905260069091015460c08301524290611c4c9062015180612cf8565b8260800151610db89190612d0f565b600080805b600854811015610dc25760088181548110611c7d57611c7d612f39565b9060005260206000209060040201600201548410158015611cc2575060088181548110611cac57611cac612f39565b9060005260206000209060040201600301548411155b15611cf35760088181548110611cda57611cda612f39565b9060005260206000209060040201600101549150610dc2565b80611cfd81612f4f565b915050611c60565b600080611d1183611b9d565b15611d96576001546001600160a01b0316634551169d611d3085611b2c565b6040518263ffffffff1660e01b8152600401611d4e91815260200190565b602060405180830381865afa158015611d6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d8f9190612e38565b90506106ba565b611d9f83611079565b156106ba576001600160a01b0383166000908152600a6020526040902060010154611dc981611c5b565b949350505050565b611dda33611079565b1515600114611e2b5760405162461bcd60e51b815260206004820152601d60248201527f596f752068617665206e6f2057455448546f6b656e73207374616b656400000060448201526064016106ec565b611e3433611bcd565b1515600114611e555760405162461bcd60e51b81526004016106ec90612f02565b336000818152600a6020908152604091829020825160e081018452815460ff1615158152600182015492810183905260028201548185015260038083015460608301526004808401546080840152600584015460a084015260069093015460c08301525493516370a0823160e01b81529182019490945290916001600160a01b0316906370a0823190602401602060405180830381865afa158015611efe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f229190612e38565b1015611f405760405162461bcd60e51b81526004016106ec90612fad565b6020810151600254611f5f916001600160a01b0390911690339061250c565b600354602082015160405163079cc67960e41b81526001600160a01b03909216916379cc679091611f9591339190600401612e1f565b600060405180830381600087803b158015611faf57600080fd5b505af1158015611fc3573d6000803e3d6000fd5b5050336000818152600a60209081526040808320805460ff1916815560018101849055600281018490556003810184905560048101849055600581018490556006019290925585015190517fb5002f5c5b7001c8c4c971ba24b3798cf513f5fce4a3b9a53bdf0e6cb854d19394506115149350612e1f565b61204433611079565b15156001146120955760405162461bcd60e51b815260206004820152601d60248201527f596f752068617665206e6f2057455448546f6b656e73207374616b656400000060448201526064016106ec565b61209e33611bcd565b156120eb5760405162461bcd60e51b815260206004820152601960248201527f4c6f636b757020706572696f642068617320657870697265640000000000000060448201526064016106ec565b336000818152600a6020908152604091829020825160e081018452815460ff1615158152600182015492810183905260028201548185015260038083015460608301526004808401546080840152600584015460a084015260069093015460c08301525493516370a0823160e01b81529182019490945290916001600160a01b0316906370a0823190602401602060405180830381865afa158015612194573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121b89190612e38565b10156121d65760405162461bcd60e51b81526004016106ec90612fad565b6000806064836060015184602001516121ef9190612cf8565b6121f99190612fef565b905080836020015161220b9190612d22565b600254909250612225906001600160a01b0316338461250c565b600754600254612242916001600160a01b0391821691168361250c565b600354602084015160405163079cc67960e41b81526001600160a01b03909216916379cc67909161227891339190600401612e1f565b600060405180830381600087803b15801561229257600080fd5b505af11580156122a6573d6000803e3d6000fd5b5050336000818152600a6020526040808220805460ff19168155600181018390556002810183905560038101839055600481018390556005810183905560060191909155517fbd5e41c4eac68e2a12798d7590d946c140589147a67f17c43d143962958485d7935061231c925085908590612d6a565b60405180910390a1505050565b60006001600160e01b03198216637965db0b60e01b14806106ba57506106ba8261252b565b612358828261151f565b610a9d57612370816001600160a01b03166014612560565b61237b836020612560565b60405160200161238c929190613035565b60408051601f198184030181529082905262461bcd60e51b82526106ec916004016130aa565b6123bc828261151f565b610a9d576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556123f23390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b612440828261151f565b15610a9d576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6040516001600160a01b03808516602483015283166044820152606481018290526125069085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526126fc565b50505050565b610a1e8363a9059cbb60e01b84846040516024016124cf929190612e1f565b60006001600160e01b03198216630271189760e51b14806106ba57506301ffc9a760e01b6001600160e01b03198316146106ba565b6060600061256f836002612cf8565b61257a906002612d0f565b67ffffffffffffffff811115612592576125926129ad565b6040519080825280601f01601f1916602001820160405280156125bc576020820181803683370190505b509050600360fc1b816000815181106125d7576125d7612f39565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061260657612606612f39565b60200101906001600160f81b031916908160001a905350600061262a846002612cf8565b612635906001612d0f565b90505b60018111156126ad576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061266957612669612f39565b1a60f81b82828151811061267f5761267f612f39565b60200101906001600160f81b031916908160001a90535060049490941c936126a6816130dd565b9050612638565b5083156107e35760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016106ec565b6000612751826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166127ce9092919063ffffffff16565b805190915015610a1e578080602001905181019061276f91906130f4565b610a1e5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106ec565b60606107e0848460008585843b6128275760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106ec565b600080866001600160a01b031685876040516128439190613116565b60006040518083038185875af1925050503d8060008114612880576040519150601f19603f3d011682016040523d82523d6000602084013e612885565b606091505b50915091506128958282866128a0565b979650505050505050565b606083156128af5750816107e3565b8251156128bf5782518084602001fd5b8160405162461bcd60e51b81526004016106ec91906130aa565b6000602082840312156128eb57600080fd5b81356001600160e01b0319811681146107e357600080fd5b6001600160a01b038116811461291857600080fd5b50565b60006020828403121561292d57600080fd5b81356107e381612903565b60006020828403121561294a57600080fd5b5035919050565b6000806040838503121561296457600080fd5b82359150602083013561297681612903565b809150509250929050565b60008060006060848603121561299657600080fd5b505081359360208301359350604090920135919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156129ec576129ec6129ad565b604052919050565b600082601f830112612a0557600080fd5b8135602067ffffffffffffffff821115612a2157612a216129ad565b8160051b612a308282016129c3565b9283528481018201928281019087851115612a4a57600080fd5b83870192505b8483101561289557823582529183019190830190612a50565b600082601f830112612a7a57600080fd5b813567ffffffffffffffff811115612a9457612a946129ad565b612aa7601f8201601f19166020016129c3565b818152846020838601011115612abc57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a08688031215612af157600080fd5b8535612afc81612903565b94506020860135612b0c81612903565b9350604086013567ffffffffffffffff80821115612b2957600080fd5b612b3589838a016129f4565b94506060880135915080821115612b4b57600080fd5b612b5789838a016129f4565b93506080880135915080821115612b6d57600080fd5b50612b7a88828901612a69565b9150509295509295909350565b602080825282518282018190526000919060409081850190868401855b82811015612be0578151805115158552868101518786015285810151868601526060908101519085015260809093019290850190600101612ba4565b5091979650505050505050565b600080600080600060a08688031215612c0557600080fd5b8535612c1081612903565b94506020860135612c2081612903565b93506040860135925060608601359150608086013567ffffffffffffffff811115612c4a57600080fd5b612b7a88828901612a69565b60208082526022908201527f57616c6c6574206861732063757272656e746c79206e6f204e4654207374616b604082015261195960f21b606082015260800190565b6020808252602a908201527f57616c6c657420686173207374616b6564205745544820546f6b656e7320616e60408201526964206e6f74204e46547360b01b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176106ba576106ba612ce2565b808201808211156106ba576106ba612ce2565b818103818111156106ba576106ba612ce2565b6020808252818101527f4163636f756e74206973206e6f7420696e207468652061646d696e206c697374604082015260600190565b6001600160a01b039390931683526020830191909152604082015260600190565b6020808252602a908201527f57616c6c657420686173207374616b6564204e46547320616e64206e6f74205760408201526945544820746f6b656e7360b01b606082015260800190565b6020808252602a908201527f57616c6c6574206861732063757272656e746c79206e6f205745544820546f6b604082015269195b9cc81cdd185ad95960b21b606082015260800190565b6001600160a01b03929092168252602082015260400190565b600060208284031215612e4a57600080fd5b5051919050565b6020808252601c908201527f596f75206861766520616c7265616479207374616b6564204e46547300000000604082015260600190565b60208082526022908201527f596f75206861766520616c7265616479207374616b65642057455448546f6b656040820152616e7360f01b606082015260800190565b6001600160a01b0394851681529290931660208301526040820152606081019190915260a06080820181905260009082015260c00190565b6020808252601b908201527f4c6f636b757020706572696f64207374696c6c2070656e64696e670000000000604082015260600190565b634e487b7160e01b600052603260045260246000fd5b600060018201612f6157612f61612ce2565b5060010190565b60208082526025908201527f596f7520646f206e6f74206f776e20656e6f75676820746f6b656e7320746f206040820152647374616b6560d81b606082015260800190565b60208082526022908201527f596f7520646f6e2774206861766520656e6f75676820735745544820746f6b656040820152616e2160f01b606082015260800190565b60008261300c57634e487b7160e01b600052601260045260246000fd5b500490565b60005b8381101561302c578181015183820152602001613014565b50506000910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161306d816017850160208801613011565b7001034b99036b4b9b9b4b733903937b6329607d1b601791840191820152835161309e816028840160208801613011565b01602801949350505050565b60208152600082518060208401526130c9816040850160208701613011565b601f01601f19169190910160400192915050565b6000816130ec576130ec612ce2565b506000190190565b60006020828403121561310657600080fd5b815180151581146107e357600080fd5b60008251613128818460208701613011565b919091019291505056fea264697066735822122003e1b1c58c41b8d1c6fa6436b836143f140eb2f18cd5ab2099e0551853aa115564736f6c634300081200330000000000000000000000000e11285d30143c05d564ff4046e4edf63ed9442b0000000000000000000000006abe0f515b839f242bf8253ca1f47a7ed061adb000000000000000000000000004aef0f00958088b4beeaa118b3c0701d421f0590000000000000000000000000d26c301ec9e586064ae5504b9b32a34844286db
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061025e5760003560e01c8063842b047e11610146578063c5ff87fb116100c3578063e15853d911610087578063e15853d914610647578063e1a4f14a1461065a578063e406bbbd1461066d578063f23a6e6114610680578063f52dd1331461069f578063fdd3fd38146106a757600080fd5b8063c5ff87fb146105e6578063c9993709146105fb578063d547741f1461060e578063d859345f14610621578063ddadd90f1461063457600080fd5b806398bc695d1161010a57806398bc695d14610577578063a217fddf14610580578063a2b70e5914610588578063bc197c811461059b578063c1679476146105d357600080fd5b8063842b047e146104b057806390273901146104c357806391d14854146104cb57806393c310b7146104de57806396e431df146104f157600080fd5b806346d77162116101df578063587e7736116101a3578063587e77361461041c5780635a2f80a01461042f57806365f3e00d14610442578063680cefa01461045557806369267744146104685780636e9ceae91461047b57600080fd5b806346d77162146103645780635040df9a14610377578063523280861461038a578063554a706014610400578063583d5a831461041357600080fd5b80631c620d80116102265780631c620d80146102dd578063248a9ca3146102f05780632f2ff15d146103135780633580b13b1461032657806336568abe1461035157600080fd5b806301de23511461026357806301ffc9a71461027f57806311983e53146102a257806311aec429146102b5578063120a0612146102ca575b600080fd5b61026c60055481565b6040519081526020015b60405180910390f35b61029261028d3660046128d9565b6106af565b6040519015158152602001610276565b61026c6102b036600461291b565b6106c0565b6102c86102c3366004612938565b6107ea565b005b6102c86102d836600461291b565b610859565b61026c6102eb36600461291b565b6108e1565b61026c6102fe366004612938565b60009081526020819052604090206001015490565b6102c8610321366004612951565b6109f8565b600254610339906001600160a01b031681565b6040516001600160a01b039091168152602001610276565b6102c861035f366004612951565b610a23565b6102c8610372366004612938565b610aa1565b61029261038536600461291b565b610d34565b6103d161039836600461291b565b60096020526000908152604090208054600182015460028301546003840154600485015460059095015460ff9094169492939192909186565b6040805196151587526020870195909552938501929092526060840152608083015260a082015260c001610276565b6102c861040e366004612938565b610dc9565b61026c60065481565b61029261042a36600461291b565b610eee565b6102c861043d366004612938565b611016565b61029261045036600461291b565b611079565b6102c8610463366004612981565b6110a9565b600354610339906001600160a01b031681565b61048e610489366004612938565b6112b2565b6040805194151585526020850193909352918301526060820152608001610276565b600154610339906001600160a01b031681565b6102c86112f0565b6102926104d9366004612951565b61151f565b61026c6104ec36600461291b565b611548565b6105406104ff36600461291b565b600a60205260009081526040902080546001820154600283015460038401546004850154600586015460069096015460ff9095169593949293919290919087565b6040805197151588526020880196909652948601939093526060850191909152608084015260a083015260c082015260e001610276565b61026c60045481565b61026c600081565b6102c861059636600461291b565b6115b9565b6105ba6105a9366004612ad9565b63bc197c8160e01b95945050505050565b6040516001600160e01b03199091168152602001610276565b6102c86105e1366004612938565b611641565b6105ee611862565b6040516102769190612b87565b6102c8610609366004612938565b6118e8565b6102c861061c366004612951565b611b06565b61026c61062f36600461291b565b611b2c565b61029261064236600461291b565b611b9d565b61029261065536600461291b565b611bcd565b61026c610668366004612938565b611c5b565b61026c61067b36600461291b565b611d05565b6105ba61068e366004612bed565b63f23a6e6160e01b95945050505050565b6102c8611dd1565b6102c861203b565b60006106ba82612329565b92915050565b60006106cb82611b9d565b15156001146106f55760405162461bcd60e51b81526004016106ec90612c56565b60405180910390fd5b6106fe82611079565b1561071b5760405162461bcd60e51b81526004016106ec90612c98565b6001600160a01b0382166000908152600960209081526040808320815160c081018352815460ff16151581526001820154938101939093526002810154918301919091526003810154606083015260048101546080830181905260059091015460a0830152909190819042906107949062015180612cf8565b84606001516107a39190612d0f565b6107ad9190612d22565b11156107e357428260800151620151806107c79190612cf8565b83606001516107d69190612d0f565b6107e09190612d22565b90505b9392505050565b6107f560003361151f565b6108115760405162461bcd60e51b81526004016106ec90612d35565b60048054908290556040517f339b9229beac0da59bc8ab4913b1e81b018cae9ecef830c573c53deeb87f5c529061084d90339084908690612d6a565b60405180910390a15050565b61086460003361151f565b6108805760405162461bcd60e51b81526004016106ec90612d35565b600780546001600160a01b031981166001600160a01b0384811691821790935560408051338152939092166020840181905291830152907f51b66e0e5bd72224dd75c35b693ad62bd75766bdb04230e2c8c218752c51408a9060600161084d565b60006108ec82611b9d565b156109095760405162461bcd60e51b81526004016106ec90612d8b565b61091282611079565b15156001146109335760405162461bcd60e51b81526004016106ec90612dd5565b6001600160a01b0382166000908152600a60209081526040808320815160e081018352815460ff16151581526001820154938101939093526002810154918301919091526003810154606083015260048101546080830152600581015460a0830181905260069091015460c0830152909190819042906109b69062015180612cf8565b84608001516109c59190612d0f565b6109cf9190612d22565b11156107e357428260a00151620151806109e99190612cf8565b83608001516107d69190612d0f565b600082815260208190526040902060010154610a14813361234e565b610a1e83836123b2565b505050565b6001600160a01b0381163314610a935760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016106ec565b610a9d8282612436565b5050565b600154604051627eeac760e11b81526000916001600160a01b03169062fdd58e90610ad29033908690600401612e1f565b602060405180830381865afa158015610aef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b139190612e38565b11610b605760405162461bcd60e51b815260206004820152601760248201527f596f7520646f206e6f74206f776e2074686973204e465400000000000000000060448201526064016106ec565b610b6933611b9d565b15610b865760405162461bcd60e51b81526004016106ec90612e51565b610b8f33611079565b15610bac5760405162461bcd60e51b81526004016106ec90612e88565b60018054604051637921219560e11b81526001600160a01b039091169163f242432a91610be191339130918791600401612eca565b600060405180830381600087803b158015610bfb57600080fd5b505af1158015610c0f573d6000803e3d6000fd5b5050600154604051634551169d60e01b815260048101859052600093506001600160a01b039091169150634551169d90602401602060405180830381865afa158015610c5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c839190612e38565b6040805160c08101825260018082526020808301878152838501868152426060860190815260048054608088019081526005805460a08a019081523360008181526009909952978b902099518a5460ff1916901515178a55955197890197909755925160028801559051600387015590519085015551929091019190915590519192507fae60b3ca24281aea6e75782e0e5a980a7dd9ee173e63fb212a8c0def1fc6efe79161084d91908590612e1f565b6001600160a01b0381166000908152600960209081526040808320815160c081018352815460ff1615158152600182810154948201949094526002820154928101929092526003810154606083015260048101546080830181905260059091015460a08301524290610da99062015180612cf8565b8260600151610db89190612d0f565b10610dc257600091505b5092915050565b610dd460003361151f565b610df05760405162461bcd60e51b81526004016106ec90612d35565b60648110610e515760405162461bcd60e51b815260206004820152602860248201527f596f752063616e6e6f742077697468686f6c64206d6f7265207468616e203939604482015267081c195c98d95b9d60c21b60648201526084016106ec565b6001811015610eb25760405162461bcd60e51b815260206004820152602760248201527f596f75206e65656420746f2077697468686f6c64206174206c656173742031206044820152661c195c98d95b9d60ca1b60648201526084016106ec565b60068054908290556040517fbed291e013058f2243e71b2170f425b3c4819b155f012b92e4492b3ad3e866849061084d90339084908690612d6a565b6000610ef982611b9d565b1515600114610f4a5760405162461bcd60e51b815260206004820181905260248201527f596f7520686176652063757272656e746c79206e6f204e4654207374616b656460448201526064016106ec565b610f5382610d34565b1515600114610f745760405162461bcd60e51b81526004016106ec90612f02565b6001600160a01b038216600090815260096020908152604091829020825160c081018452815460ff16151581526001828101549382019390935260028201549381019390935260038101546060840152600481015460808401526005015460a083018190529091904290610feb9062015180612cf8565b6080830151610ffd9062015180612cf8565b836060015161100c9190612d0f565b610db89190612d0f565b61102160003361151f565b61103d5760405162461bcd60e51b81526004016106ec90612d35565b60058054908290556040517fdb8d38150b9bb879c12291844bcd9c914b7c4666ae198f4db69a5a5176d13ee89061084d90339084908690612d6a565b6001600160a01b0381166000908152600a6020526040812054819060ff1615156001036106ba5750600192915050565b6110b460003361151f565b6110d05760405162461bcd60e51b81526004016106ec90612d35565b60008060005b6008548110156111295785600882815481106110f4576110f4612f39565b906000526020600020906004020160010154036111175780915060019250611129565b8061112181612f4f565b9150506110d6565b50811561118757836008828154811061114457611144612f39565b906000526020600020906004020160020181905550826008828154811061116d5761116d612f39565b906000526020600020906004020160030181905550611263565b604080516080810182526001808252602082018881529282018781526060830187815260088054938401815560005292517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee36004909302928301805460ff191691151591909117905592517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee482015591517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee5830155517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee6909101555b6040805133815260208101879052908101859052606081018490527f9ab3a3aa3898f03e382a329fbebc7dcd0b0cf8f18181e3517e3327a0fe971ff09060800160405180910390a15050505050565b600881815481106112c257600080fd5b6000918252602090912060049091020180546001820154600283015460039093015460ff9092169350919084565b6112f933611b9d565b151560011461134a5760405162461bcd60e51b815260206004820181905260248201527f596f7520686176652063757272656e746c79206e6f204e4654207374616b656460448201526064016106ec565b61135333610d34565b15156001146113745760405162461bcd60e51b81526004016106ec90612f02565b61137d33610eee565b15156001146113ea5760405162461bcd60e51b815260206004820152603360248201527f596f75206e65656420746f207761697420666f722074686520636f6f6c20646f604482015272776e20706572696f6420746f2065787069726560681b60648201526084016106ec565b33600081815260096020908152604091829020825160c081018452815460ff161515815260018083015493820184905260028301548286015260038301546060830152600480840154608084015260059093015460a083015280549451637921219560e11b815291956001600160a01b039095169463f242432a946114759430949293919201612eca565b600060405180830381600087803b15801561148f57600080fd5b505af11580156114a3573d6000803e3d6000fd5b5050336000818152600960209081526040808320805460ff19168155600181018490556002810184905560038101849055600481018490556005019290925585015190517fb04b58934e9f7d959ec5e18634b0bc7164b689fa752fd45d2f20f8ccfa33cab194506115149350612e1f565b60405180910390a150565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b600061155382611b9d565b156115705760405162461bcd60e51b81526004016106ec90612d8b565b61157982611079565b151560011461159a5760405162461bcd60e51b81526004016106ec90612dd5565b506001600160a01b03166000908152600a602052604090206001015490565b6115c460003361151f565b6115e05760405162461bcd60e51b81526004016106ec90612d35565b600180546001600160a01b031981166001600160a01b0384811691821790935560408051338152939092166020840181905291830152907f9d5e5e35ff4b9029875bfd320e82316168739f50ec7d9b2847a08542967036789060600161084d565b6002546040516370a0823160e01b815233600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa158015611689573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ad9190612e38565b10156116cb5760405162461bcd60e51b81526004016106ec90612f68565b6116d433611b9d565b156116f15760405162461bcd60e51b81526004016106ec90612e51565b6116fa33611079565b156117175760405162461bcd60e51b81526004016106ec90612e88565b60025461172f906001600160a01b031633308461249b565b600354604051630f38ca0d60e31b81526001600160a01b03909116906379c65068906117619033908590600401612e1f565b600060405180830381600087803b15801561177b57600080fd5b505af115801561178f573d6000803e3d6000fd5b50505050600061179e82611c5b565b6040805160e08101825260018082526020808301878152838501868152600680546060870190815242608088019081526004805460a08a019081526005805460c08c01908152336000818152600a909b52998d90209b518c5460ff1916901515178c559751998b0199909955945160028a015591516003890155519087015590519385019390935551929091019190915590519192507fc06da153f5addc7510f70c2b8a3222e69d0a01b067bbbe32051d4a65d5ff05649161084d91908590612e1f565b60606008805480602002602001604051908101604052809291908181526020016000905b828210156118df5760008481526020908190206040805160808101825260048602909201805460ff1615158352600180820154848601526002820154928401929092526003015460608301529083529092019101611886565b50505050905090565b6002546040516370a0823160e01b815233600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa158015611930573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119549190612e38565b10156119725760405162461bcd60e51b81526004016106ec90612f68565b61197b33611b9d565b156119985760405162461bcd60e51b81526004016106ec90612e51565b6119a133611079565b15156001146119fc5760405162461bcd60e51b815260206004820152602160248201527f596f7520646f206e6f742068617665207374616b65642057455448546f6b656e6044820152607360f81b60648201526084016106ec565b600254611a14906001600160a01b031633308461249b565b600354604051630f38ca0d60e31b81526001600160a01b03909116906379c6506890611a469033908590600401612e1f565b600060405180830381600087803b158015611a6057600080fd5b505af1158015611a74573d6000803e3d6000fd5b5050336000908152600a6020526040902060010154611a969250839150612d0f565b336000908152600a6020526040812060010182905590611ab590611c5b565b336000818152600a6020526040908190206002810184905542600490910155519192507fc06da153f5addc7510f70c2b8a3222e69d0a01b067bbbe32051d4a65d5ff05649161084d91908590612e1f565b600082815260208190526040902060010154611b22813361234e565b610a1e8383612436565b6000611b3782611b9d565b1515600114611b585760405162461bcd60e51b81526004016106ec90612c56565b611b6182611079565b15611b7e5760405162461bcd60e51b81526004016106ec90612c98565b506001600160a01b031660009081526009602052604090206001015490565b6001600160a01b038116600090815260096020526040812054819060ff1615156001036106ba5750600192915050565b6001600160a01b0381166000908152600a60209081526040808320815160e081018352815460ff1615158152600182810154948201949094526002820154928101929092526003810154606083015260048101546080830152600581015460a0830181905260069091015460c08301524290611c4c9062015180612cf8565b8260800151610db89190612d0f565b600080805b600854811015610dc25760088181548110611c7d57611c7d612f39565b9060005260206000209060040201600201548410158015611cc2575060088181548110611cac57611cac612f39565b9060005260206000209060040201600301548411155b15611cf35760088181548110611cda57611cda612f39565b9060005260206000209060040201600101549150610dc2565b80611cfd81612f4f565b915050611c60565b600080611d1183611b9d565b15611d96576001546001600160a01b0316634551169d611d3085611b2c565b6040518263ffffffff1660e01b8152600401611d4e91815260200190565b602060405180830381865afa158015611d6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d8f9190612e38565b90506106ba565b611d9f83611079565b156106ba576001600160a01b0383166000908152600a6020526040902060010154611dc981611c5b565b949350505050565b611dda33611079565b1515600114611e2b5760405162461bcd60e51b815260206004820152601d60248201527f596f752068617665206e6f2057455448546f6b656e73207374616b656400000060448201526064016106ec565b611e3433611bcd565b1515600114611e555760405162461bcd60e51b81526004016106ec90612f02565b336000818152600a6020908152604091829020825160e081018452815460ff1615158152600182015492810183905260028201548185015260038083015460608301526004808401546080840152600584015460a084015260069093015460c08301525493516370a0823160e01b81529182019490945290916001600160a01b0316906370a0823190602401602060405180830381865afa158015611efe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f229190612e38565b1015611f405760405162461bcd60e51b81526004016106ec90612fad565b6020810151600254611f5f916001600160a01b0390911690339061250c565b600354602082015160405163079cc67960e41b81526001600160a01b03909216916379cc679091611f9591339190600401612e1f565b600060405180830381600087803b158015611faf57600080fd5b505af1158015611fc3573d6000803e3d6000fd5b5050336000818152600a60209081526040808320805460ff1916815560018101849055600281018490556003810184905560048101849055600581018490556006019290925585015190517fb5002f5c5b7001c8c4c971ba24b3798cf513f5fce4a3b9a53bdf0e6cb854d19394506115149350612e1f565b61204433611079565b15156001146120955760405162461bcd60e51b815260206004820152601d60248201527f596f752068617665206e6f2057455448546f6b656e73207374616b656400000060448201526064016106ec565b61209e33611bcd565b156120eb5760405162461bcd60e51b815260206004820152601960248201527f4c6f636b757020706572696f642068617320657870697265640000000000000060448201526064016106ec565b336000818152600a6020908152604091829020825160e081018452815460ff1615158152600182015492810183905260028201548185015260038083015460608301526004808401546080840152600584015460a084015260069093015460c08301525493516370a0823160e01b81529182019490945290916001600160a01b0316906370a0823190602401602060405180830381865afa158015612194573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121b89190612e38565b10156121d65760405162461bcd60e51b81526004016106ec90612fad565b6000806064836060015184602001516121ef9190612cf8565b6121f99190612fef565b905080836020015161220b9190612d22565b600254909250612225906001600160a01b0316338461250c565b600754600254612242916001600160a01b0391821691168361250c565b600354602084015160405163079cc67960e41b81526001600160a01b03909216916379cc67909161227891339190600401612e1f565b600060405180830381600087803b15801561229257600080fd5b505af11580156122a6573d6000803e3d6000fd5b5050336000818152600a6020526040808220805460ff19168155600181018390556002810183905560038101839055600481018390556005810183905560060191909155517fbd5e41c4eac68e2a12798d7590d946c140589147a67f17c43d143962958485d7935061231c925085908590612d6a565b60405180910390a1505050565b60006001600160e01b03198216637965db0b60e01b14806106ba57506106ba8261252b565b612358828261151f565b610a9d57612370816001600160a01b03166014612560565b61237b836020612560565b60405160200161238c929190613035565b60408051601f198184030181529082905262461bcd60e51b82526106ec916004016130aa565b6123bc828261151f565b610a9d576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556123f23390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b612440828261151f565b15610a9d576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6040516001600160a01b03808516602483015283166044820152606481018290526125069085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526126fc565b50505050565b610a1e8363a9059cbb60e01b84846040516024016124cf929190612e1f565b60006001600160e01b03198216630271189760e51b14806106ba57506301ffc9a760e01b6001600160e01b03198316146106ba565b6060600061256f836002612cf8565b61257a906002612d0f565b67ffffffffffffffff811115612592576125926129ad565b6040519080825280601f01601f1916602001820160405280156125bc576020820181803683370190505b509050600360fc1b816000815181106125d7576125d7612f39565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061260657612606612f39565b60200101906001600160f81b031916908160001a905350600061262a846002612cf8565b612635906001612d0f565b90505b60018111156126ad576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061266957612669612f39565b1a60f81b82828151811061267f5761267f612f39565b60200101906001600160f81b031916908160001a90535060049490941c936126a6816130dd565b9050612638565b5083156107e35760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016106ec565b6000612751826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166127ce9092919063ffffffff16565b805190915015610a1e578080602001905181019061276f91906130f4565b610a1e5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106ec565b60606107e0848460008585843b6128275760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106ec565b600080866001600160a01b031685876040516128439190613116565b60006040518083038185875af1925050503d8060008114612880576040519150601f19603f3d011682016040523d82523d6000602084013e612885565b606091505b50915091506128958282866128a0565b979650505050505050565b606083156128af5750816107e3565b8251156128bf5782518084602001fd5b8160405162461bcd60e51b81526004016106ec91906130aa565b6000602082840312156128eb57600080fd5b81356001600160e01b0319811681146107e357600080fd5b6001600160a01b038116811461291857600080fd5b50565b60006020828403121561292d57600080fd5b81356107e381612903565b60006020828403121561294a57600080fd5b5035919050565b6000806040838503121561296457600080fd5b82359150602083013561297681612903565b809150509250929050565b60008060006060848603121561299657600080fd5b505081359360208301359350604090920135919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156129ec576129ec6129ad565b604052919050565b600082601f830112612a0557600080fd5b8135602067ffffffffffffffff821115612a2157612a216129ad565b8160051b612a308282016129c3565b9283528481018201928281019087851115612a4a57600080fd5b83870192505b8483101561289557823582529183019190830190612a50565b600082601f830112612a7a57600080fd5b813567ffffffffffffffff811115612a9457612a946129ad565b612aa7601f8201601f19166020016129c3565b818152846020838601011115612abc57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a08688031215612af157600080fd5b8535612afc81612903565b94506020860135612b0c81612903565b9350604086013567ffffffffffffffff80821115612b2957600080fd5b612b3589838a016129f4565b94506060880135915080821115612b4b57600080fd5b612b5789838a016129f4565b93506080880135915080821115612b6d57600080fd5b50612b7a88828901612a69565b9150509295509295909350565b602080825282518282018190526000919060409081850190868401855b82811015612be0578151805115158552868101518786015285810151868601526060908101519085015260809093019290850190600101612ba4565b5091979650505050505050565b600080600080600060a08688031215612c0557600080fd5b8535612c1081612903565b94506020860135612c2081612903565b93506040860135925060608601359150608086013567ffffffffffffffff811115612c4a57600080fd5b612b7a88828901612a69565b60208082526022908201527f57616c6c6574206861732063757272656e746c79206e6f204e4654207374616b604082015261195960f21b606082015260800190565b6020808252602a908201527f57616c6c657420686173207374616b6564205745544820546f6b656e7320616e60408201526964206e6f74204e46547360b01b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176106ba576106ba612ce2565b808201808211156106ba576106ba612ce2565b818103818111156106ba576106ba612ce2565b6020808252818101527f4163636f756e74206973206e6f7420696e207468652061646d696e206c697374604082015260600190565b6001600160a01b039390931683526020830191909152604082015260600190565b6020808252602a908201527f57616c6c657420686173207374616b6564204e46547320616e64206e6f74205760408201526945544820746f6b656e7360b01b606082015260800190565b6020808252602a908201527f57616c6c6574206861732063757272656e746c79206e6f205745544820546f6b604082015269195b9cc81cdd185ad95960b21b606082015260800190565b6001600160a01b03929092168252602082015260400190565b600060208284031215612e4a57600080fd5b5051919050565b6020808252601c908201527f596f75206861766520616c7265616479207374616b6564204e46547300000000604082015260600190565b60208082526022908201527f596f75206861766520616c7265616479207374616b65642057455448546f6b656040820152616e7360f01b606082015260800190565b6001600160a01b0394851681529290931660208301526040820152606081019190915260a06080820181905260009082015260c00190565b6020808252601b908201527f4c6f636b757020706572696f64207374696c6c2070656e64696e670000000000604082015260600190565b634e487b7160e01b600052603260045260246000fd5b600060018201612f6157612f61612ce2565b5060010190565b60208082526025908201527f596f7520646f206e6f74206f776e20656e6f75676820746f6b656e7320746f206040820152647374616b6560d81b606082015260800190565b60208082526022908201527f596f7520646f6e2774206861766520656e6f75676820735745544820746f6b656040820152616e2160f01b606082015260800190565b60008261300c57634e487b7160e01b600052601260045260246000fd5b500490565b60005b8381101561302c578181015183820152602001613014565b50506000910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161306d816017850160208801613011565b7001034b99036b4b9b9b4b733903937b6329607d1b601791840191820152835161309e816028840160208801613011565b01602801949350505050565b60208152600082518060208401526130c9816040850160208701613011565b601f01601f19169190910160400192915050565b6000816130ec576130ec612ce2565b506000190190565b60006020828403121561310657600080fd5b815180151581146107e357600080fd5b60008251613128818460208701613011565b919091019291505056fea264697066735822122003e1b1c58c41b8d1c6fa6436b836143f140eb2f18cd5ab2099e0551853aa115564736f6c63430008120033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000e11285d30143c05d564ff4046e4edf63ed9442b0000000000000000000000006abe0f515b839f242bf8253ca1f47a7ed061adb000000000000000000000000004aef0f00958088b4beeaa118b3c0701d421f0590000000000000000000000000d26c301ec9e586064ae5504b9b32a34844286db
-----Decoded View---------------
Arg [0] : _tierFactory (address): 0x0E11285D30143c05D564Ff4046E4EDf63ed9442B
Arg [1] : _wEthToken (address): 0x6ABE0f515B839f242Bf8253ca1f47A7ED061adb0
Arg [2] : _bhubEthToken (address): 0x04AeF0f00958088B4beeaA118B3c0701D421f059
Arg [3] : _devWallet (address): 0x0d26C301EC9E586064aE5504B9B32A34844286db
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000e11285d30143c05d564ff4046e4edf63ed9442b
Arg [1] : 0000000000000000000000006abe0f515b839f242bf8253ca1f47a7ed061adb0
Arg [2] : 00000000000000000000000004aef0f00958088b4beeaa118b3c0701d421f059
Arg [3] : 0000000000000000000000000d26c301ec9e586064ae5504b9b32a34844286db
Deployed Bytecode Sourcemap
45366:25429:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45795:31;;;;;;;;;160:25:1;;;148:2;133:18;45795:31:0;;;;;;;;49160:253;;;;;;:::i;:::-;;:::i;:::-;;;652:14:1;;645:22;627:41;;615:2;600:18;49160:253:0;487:187:1;55889:942:0;;;;;;:::i;:::-;;:::i;51538:208::-;;;;;;:::i;:::-;;:::i;:::-;;52115:231;;;;;;:::i;:::-;;:::i;56941:988::-;;;;;;:::i;:::-;;:::i;25726:123::-;;;;;;:::i;:::-;25792:7;25819:12;;;;;;;;;;:22;;;;25726:123;26111:172;;;;;;:::i;:::-;;:::i;45547:23::-;;;;;-1:-1:-1;;;;;45547:23:0;;;;;;-1:-1:-1;;;;;2118:32:1;;;2100:51;;2088:2;2073:18;45547:23:0;1939:218:1;27209:280:0;;;;;;:::i;:::-;;:::i;61752:1057::-;;;;;;:::i;:::-;;:::i;58040:737::-;;;;;;:::i;:::-;;:::i;47145:67::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2468:14:1;;2461:22;2443:41;;2515:2;2500:18;;2493:34;;;;2543:18;;;2536:34;;;;2601:2;2586:18;;2579:34;2644:3;2629:19;;2622:35;2688:3;2673:19;;2666:35;2430:3;2415:19;47145:67:0;2162:545:1;52428:715:0;;;;;;:::i;:::-;;:::i;45917:47::-;;;;;;60522:1060;;;;;;:::i;:::-;;:::i;51832:220::-;;;;;;:::i;:::-;;:::i;60125:311::-;;;;;;:::i;:::-;;:::i;49530:1195::-;;;;;;:::i;:::-;;:::i;45577:26::-;;;;;-1:-1:-1;;;;;45577:26:0;;;47014:42;;;;;;:::i;:::-;;:::i;:::-;;;;3283:14:1;;3276:22;3258:41;;3330:2;3315:18;;3308:34;;;;3358:18;;;3351:34;3416:2;3401:18;;3394:34;3245:3;3230:19;47014:42:0;3033:401:1;45501:39:0;;;;;-1:-1:-1;;;;;45501:39:0;;;66186:1201;;;:::i;24586:164::-;;;;;;:::i;:::-;;:::i;53769:495::-;;;;;;:::i;:::-;;:::i;47219:79::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4010:14:1;;4003:22;3985:41;;4057:2;4042:18;;4035:34;;;;4085:18;;;4078:34;;;;4143:2;4128:18;;4121:34;;;;4186:3;4171:19;;4164:35;4230:3;4215:19;;4208:35;4274:3;4259:19;;4252:35;3972:3;3957:19;47219:79:0;3676:617:1;45689:29:0;;;;;;22239:49;;22284:4;22239:49;;51098:355;;;;;;:::i;:::-;;:::i;39797:255::-;;;;;;:::i;:::-;-1:-1:-1;;;39797:255:0;;;;;;;;;;;-1:-1:-1;;;;;;7481:33:1;;;7463:52;;7451:2;7436:18;39797:255:0;7319:202:1;62969:1457:0;;;;;;:::i;:::-;;:::i;50822:166::-;;;:::i;:::-;;;;;;;:::i;64504:1592::-;;;;;;:::i;:::-;;:::i;26528:174::-;;;;;;:::i;:::-;;:::i;53227:462::-;;;;;;:::i;:::-;;:::i;59747:291::-;;;;;;:::i;:::-;;:::i;58880:770::-;;;;;;:::i;:::-;;:::i;55256:527::-;;;;;;:::i;:::-;;:::i;54393:771::-;;;;;;:::i;:::-;;:::i;39562:227::-;;;;;;:::i;:::-;-1:-1:-1;;;39562:227:0;;;;;;;;67466:1378;;;:::i;68937:1855::-;;;:::i;49160:253::-;49339:4;49368:37;49392:12;49368:23;:37::i;:::-;49361:44;49160:253;-1:-1:-1;;49160:253:0:o;55889:942::-;55979:22;56036:36;56064:7;56036:27;:36::i;:::-;:44;;56076:4;56036:44;56014:128;;;;-1:-1:-1;;;56014:128:0;;;;;;;:::i;:::-;;;;;;;;;56175:43;56210:7;56175:34;:43::i;:::-;:52;56153:144;;;;-1:-1:-1;;;56153:144:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;56348:59:0;;56310:35;56348:59;;;:26;:59;;;;;;;;56310:97;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:35;;;56583:15;;56521:41;;56556:6;56521:41;:::i;:::-;56468:14;:32;;;:95;;;;:::i;:::-;:130;;;;:::i;:::-;56467:136;56449:349;;;56771:15;56709:14;:32;;;56744:6;56709:41;;;;:::i;:::-;56656:14;:32;;;:95;;;;:::i;:::-;:130;;;;:::i;:::-;56630:156;;56449:349;56817:6;55889:942;-1:-1:-1;;;55889:942:0:o;51538:208::-;24055:41;22284:4;683:10;24586:164;:::i;24055:41::-;24033:123;;;;-1:-1:-1;;;24033:123:0;;;;;;;:::i;:::-;51627:10:::1;::::0;;51650:18;;;;51686:52:::1;::::0;::::1;::::0;::::1;::::0;51704:10:::1;::::0;51627;;51663:5;;51686:52:::1;:::i;:::-;;;;;;;;51591:155;51538:208:::0;:::o;52115:231::-;24055:41;22284:4;683:10;24586:164;:::i;24055:41::-;24033:123;;;;-1:-1:-1;;;24033:123:0;;;;;;;:::i;:::-;52214:9:::1;::::0;;-1:-1:-1;;;;;;52236:22:0;::::1;-1:-1:-1::0;;;;;52236:22:0;;::::1;::::0;;::::1;::::0;;;52276:62:::1;::::0;;52300:10:::1;11556:34:1::0;;52214:9:0;;;::::1;11621:2:1::0;11606:18;;11599:43;;;11658:18;;;11651:43;52214:9:0;52276:62:::1;::::0;11506:2:1;11491:18;52276:62:0::1;11316:384:1::0;56941:988:0;57038:22;57095:36;57123:7;57095:27;:36::i;:::-;:45;57073:137;;;;-1:-1:-1;;;57073:137:0;;;;;;;:::i;:::-;57243:43;57278:7;57243:34;:43::i;:::-;:51;;57290:4;57243:51;57221:143;;;;-1:-1:-1;;;57221:143:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;57440:41:0;;57377:60;57440:41;;;:32;:41;;;;;;;;57377:104;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:60;;;57669:15;;57601:47;;57642:6;57601:47;:::i;:::-;57542:20;:38;;;:107;;;;:::i;:::-;:142;;;;:::i;:::-;57541:148;57523:373;;;57869:15;57801:20;:38;;;57842:6;57801:47;;;;:::i;:::-;57742:20;:38;;;:107;;;;:::i;26111:172::-;25792:7;25819:12;;;;;;;;;;:22;;;23945:30;23956:4;683:10;23945;:30::i;:::-;26250:25:::1;26261:4;26267:7;26250:10;:25::i;:::-;26111:172:::0;;;:::o;27209:280::-;-1:-1:-1;;;;;27344:23:0;;683:10;27344:23;27322:120;;;;-1:-1:-1;;;27322:120:0;;12729:2:1;27322:120:0;;;12711:21:1;12768:2;12748:18;;;12741:30;12807:34;12787:18;;;12780:62;-1:-1:-1;;;12858:18:1;;;12851:45;12913:19;;27322:120:0;12527:411:1;27322:120:0;27455:26;27467:4;27473:7;27455:11;:26::i;:::-;27209:280;;:::o;61752:1057::-;61830:11;;:41;;-1:-1:-1;;;61830:41:0;;61874:1;;-1:-1:-1;;;;;61830:11:0;;:21;;:41;;61852:10;;61864:6;;61830:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:45;61808:118;;;;-1:-1:-1;;;61808:118:0;;13613:2:1;61808:118:0;;;13595:21:1;13652:2;13632:18;;;13625:30;13691:25;13671:18;;;13664:53;13734:18;;61808:118:0;13411:347:1;61808:118:0;61959:39;61987:10;61959:27;:39::i;:::-;:48;61937:126;;;;-1:-1:-1;;;61937:126:0;;;;;;;:::i;:::-;62096:46;62131:10;62096:34;:46::i;:::-;:55;62074:139;;;;-1:-1:-1;;;62074:139:0;;;;;;;:::i;:::-;62295:11;;;:70;;-1:-1:-1;;;62295:70:0;;-1:-1:-1;;;;;62295:11:0;;;;:28;;:70;;62324:10;;62344:4;;62351:6;;62295:70;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;62468:11:0;;:34;;-1:-1:-1;;;62468:34:0;;;;;160:25:1;;;62450:15:0;;-1:-1:-1;;;;;;62468:11:0;;;;-1:-1:-1;62468:26:0;;133:18:1;;62468:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62554:168;;;;;;;;62582:4;62554:168;;;;;;;;;;;;;;;;62644:15;62554:168;;;;;;62674:10;;;62554:168;;;;;;62699:12;;;62554:168;;;;;;62540:10;-1:-1:-1;62513:38:0;;;:26;:38;;;;;;;:209;;;;-1:-1:-1;;62513:209:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62763:38;;62554:168;;-1:-1:-1;62763:38:0;;;;62540:10;62554:168;;62763:38;:::i;58040:737::-;-1:-1:-1;;;;;58282:59:0;;58132:27;58282:59;;;:26;:59;;;;;;;;58244:97;;;;;;;;;;;;;;;58186:4;58244:97;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58676:15;;58601:58;;58653:6;58601:58;:::i;:::-;58549:14;:32;;;:110;;;;:::i;:::-;:142;58531:213;;58727:5;58718:14;;58531:213;-1:-1:-1;58763:6:0;58040:737;-1:-1:-1;;58040:737:0:o;52428:715::-;24055:41;22284:4;683:10;24586:164;:::i;24055:41::-;24033:123;;;;-1:-1:-1;;;24033:123:0;;;;;;;:::i;:::-;52601:3:::1;52570:28;:34;52548:124;;;::::0;-1:-1:-1;;;52548:124:0;;15365:2:1;52548:124:0::1;::::0;::::1;15347:21:1::0;15404:2;15384:18;;;15377:30;15443:34;15423:18;;;15416:62;-1:-1:-1;;;15494:18:1;;;15487:38;15542:19;;52548:124:0::1;15163:404:1::0;52548:124:0::1;52737:1;52705:28;:33;;52683:122;;;::::0;-1:-1:-1;;;52683:122:0;;15774:2:1;52683:122:0::1;::::0;::::1;15756:21:1::0;15813:2;15793:18;;;15786:30;15852:34;15832:18;;;15825:62;-1:-1:-1;;;15903:18:1;;;15896:37;15950:19;;52683:122:0::1;15572:403:1::0;52683:122:0::1;52860:27;::::0;;52900:58;;;;52976:159:::1;::::0;::::1;::::0;::::1;::::0;53025:10:::1;::::0;52860:27;;52930:28;;52976:159:::1;:::i;60522:1060::-:0;60626:12;60673:36;60701:7;60673:27;:36::i;:::-;:44;;60713:4;60673:44;60651:126;;;;-1:-1:-1;;;60651:126:0;;16182:2:1;60651:126:0;;;16164:21:1;;;16201:18;;;16194:30;16260:34;16240:18;;;16233:62;16312:18;;60651:126:0;15980:356:1;60651:126:0;60810:37;60839:7;60810:28;:37::i;:::-;:45;;60851:4;60810:45;60788:122;;;;-1:-1:-1;;;60788:122:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;61033:59:0;;60923:11;61033:59;;;:26;:59;;;;;;;;;60995:97;;;;;;;;;;;;;;;60937:4;60995:97;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60937:4;;60995:97;61481:15;;61413:50;;61457:6;61413:50;:::i;:::-;61350:32;;;;:41;;61385:6;61350:41;:::i;:::-;61297:14;:32;;;:95;;;;:::i;:::-;:167;;;;:::i;51832:220::-;24055:41;22284:4;683:10;24586:164;:::i;24055:41::-;24033:123;;;;-1:-1:-1;;;24033:123:0;;;;;;;:::i;:::-;51925:12:::1;::::0;;51950:20;;;;51988:56:::1;::::0;::::1;::::0;::::1;::::0;52008:10:::1;::::0;51925:12;;51965:5;;51988:56:::1;:::i;60125:311::-:0;-1:-1:-1;;;;;60296:41:0;;60223:24;60296:41;;;:32;:41;;;;;:57;60223:24;;60296:57;;:65;;:57;:65;60292:111;;-1:-1:-1;60387:4:0;60422:6;60125:311;-1:-1:-1;;60125:311:0:o;49530:1195::-;24055:41;22284:4;683:10;24586:164;:::i;24055:41::-;24033:123;;;;-1:-1:-1;;;24033:123:0;;;;;;;:::i;:::-;49775:16:::1;49810:18:::0;49850:9:::1;49845:237;49869:18;:25:::0;49865:29;::::1;49845:237;;;49952:7;49920:18;49939:1;49920:21;;;;;;;;:::i;:::-;;;;;;;;;;;:28;;;:39:::0;49916:155:::1;;49993:1;49980:14;;50027:4;50013:18;;50050:5;;49916:155;49896:3:::0;::::1;::::0;::::1;:::i;:::-;;;;49845:237;;;;50098:11;50094:458;;;50239:14;50192:18;50211:10;50192:30;;;;;;;;:::i;:::-;;;;;;;;;;;:44;;:61;;;;50315:14;50268:18;50287:10;50268:30;;;;;;;;:::i;:::-;;;;;;;;;;;:44;;:61;;;;50094:458;;;50464:61;::::0;;::::1;::::0;::::1;::::0;;50479:4:::1;50464:61:::0;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;50422:18:::1;:118:::0;;;;::::1;::::0;;-1:-1:-1;50422:118:0;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;50422:118:0::1;::::0;::::1;;::::0;;;::::1;::::0;;;;;;;;;;;;;;;;;;;;50094:458:::1;50569:148;::::0;;50616:10:::1;17200:51:1::0;;17282:2;17267:18;;17260:34;;;17310:18;;;17303:34;;;17368:2;17353:18;;17346:34;;;50569:148:0::1;::::0;17187:3:1;17172:19;50569:148:0::1;;;;;;;49675:1050;;49530:1195:::0;;;:::o;47014:42::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47014:42:0;;;:::o;66186:1201::-;66252:39;66280:10;66252:27;:39::i;:::-;:47;;66295:4;66252:47;66230:129;;;;-1:-1:-1;;;66230:129:0;;16182:2:1;66230:129:0;;;16164:21:1;;;16201:18;;;16194:30;16260:34;16240:18;;;16233:62;16312:18;;66230:129:0;15980:356:1;66230:129:0;66392:40;66421:10;66392:28;:40::i;:::-;:48;;66436:4;66392:48;66370:125;;;;-1:-1:-1;;;66370:125:0;;;;;;;:::i;:::-;66528:52;66569:10;66528:40;:52::i;:::-;:60;;66584:4;66528:60;66506:161;;;;-1:-1:-1;;;66506:161:0;;17593:2:1;66506:161:0;;;17575:21:1;17632:2;17612:18;;;17605:30;17671:34;17651:18;;;17644:62;-1:-1:-1;;;17722:18:1;;;17715:49;17781:19;;66506:161:0;17391:415:1;66506:161:0;66800:10;66721:35;66759:62;;;:26;:62;;;;;;;;;66721:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66998:11;;:160;;-1:-1:-1;;;66998:160:0;;66721:100;;-1:-1:-1;;;;;66998:11:0;;;;:28;;:160;;67049:4;;66800:10;;66721:100;;66998:160;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;67269:10:0;67242:38;;;;:26;:38;;;;;;;;67235:45;;-1:-1:-1;;67235:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67358:20;;;67321:58;;;;-1:-1:-1;67321:58:0;;-1:-1:-1;67321:58:0;:::i;:::-;;;;;;;;66219:1168;66186:1201::o;24586:164::-;24689:4;24713:12;;;;;;;;;;;-1:-1:-1;;;;;24713:29:0;;;;;;;;;;;;;;;24586:164::o;53769:495::-;53854:25;53914:36;53942:7;53914:27;:36::i;:::-;:45;53892:137;;;;-1:-1:-1;;;53892:137:0;;;;;;;:::i;:::-;54062:43;54097:7;54062:34;:43::i;:::-;:51;;54109:4;54062:51;54040:143;;;;-1:-1:-1;;;54040:143:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;54203:41:0;;;;;:32;:41;;;;;:53;;;;53769:495::o;51098:355::-;24055:41;22284:4;683:10;24586:164;:::i;24055:41::-;24033:123;;;;-1:-1:-1;;;24033:123:0;;;;;;;:::i;:::-;51252:11:::1;::::0;;-1:-1:-1;;;;;;51276:26:0;::::1;-1:-1:-1::0;;;;;51276:26:0;;::::1;::::0;;::::1;::::0;;;51320:125:::1;::::0;;51360:10:::1;11556:34:1::0;;51252:11:0;;;::::1;11621:2:1::0;11606:18;;11599:43;;;11658:18;;;11651:43;51252:11:0;51320:125:::1;::::0;11506:2:1;11491:18;51320:125:0::1;11316:384:1::0;62969:1457:0;63071:9;;:31;;-1:-1:-1;;;63071:31:0;;63091:10;63071:31;;;2100:51:1;63106:23:0;;-1:-1:-1;;;;;63071:9:0;;:19;;2073:18:1;;63071:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:58;;63049:145;;;;-1:-1:-1;;;63049:145:0;;;;;;;:::i;:::-;63227:39;63255:10;63227:27;:39::i;:::-;:48;63205:126;;;;-1:-1:-1;;;63205:126:0;;;;;;;:::i;:::-;63364:46;63399:10;63364:34;:46::i;:::-;:55;63342:139;;;;-1:-1:-1;;;63342:139:0;;;;;;;:::i;:::-;63563:9;;:128;;-1:-1:-1;;;;;63563:9:0;63604:10;63637:4;63657:23;63563:26;:128::i;:::-;63734:12;;:59;;-1:-1:-1;;;63734:59:0;;-1:-1:-1;;;;;63734:12:0;;;;:22;;:59;;63757:10;;63769:23;;63734:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63877:15;63895:50;63921:23;63895:25;:50::i;:::-;64083:233;;;;;;;;64117:4;64083:233;;;;;;;;;;;;;;;;64196:27;;;64083:233;;;;;;64238:15;64083:233;;;;;;64268:10;;;64083:233;;;;;;64293:12;;;64083:233;;;;;;64069:10;-1:-1:-1;64036:44:0;;;:32;:44;;;;;;;:280;;;;-1:-1:-1;;64036:280:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64357:61;;64083:233;;-1:-1:-1;64357:61:0;;;;64069:10;64083:233;;64357:61;:::i;50822:166::-;50899:38;50962:18;50955:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50822:166;:::o;64504:1592::-;64616:9;;:31;;-1:-1:-1;;;64616:31:0;;64636:10;64616:31;;;2100:51:1;64651:23:0;;-1:-1:-1;;;;;64616:9:0;;:19;;2073:18:1;;64616:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:58;;64594:145;;;;-1:-1:-1;;;64594:145:0;;;;;;;:::i;:::-;64772:39;64800:10;64772:27;:39::i;:::-;:48;64750:126;;;;-1:-1:-1;;;64750:126:0;;;;;;;:::i;:::-;64909:46;64944:10;64909:34;:46::i;:::-;:54;;64959:4;64909:54;64887:137;;;;-1:-1:-1;;;64887:137:0;;19074:2:1;64887:137:0;;;19056:21:1;19113:2;19093:18;;;19086:30;19152:34;19132:18;;;19125:62;-1:-1:-1;;;19203:18:1;;;19196:31;19244:19;;64887:137:0;18872:397:1;64887:137:0;65106:9;;:128;;-1:-1:-1;;;;;65106:9:0;65147:10;65180:4;65200:23;65106:26;:128::i;:::-;65277:12;;:59;;-1:-1:-1;;;65277:59:0;;-1:-1:-1;;;;;65277:12:0;;;;:22;;:59;;65300:10;;65312:23;;65277:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;65532:10:0;65499:44;;;;:32;:44;;;;;:56;;;:95;;-1:-1:-1;65571:23:0;;-1:-1:-1;65499:95:0;:::i;:::-;65460:10;65427:44;;;;:32;:44;;;;;:56;;:167;;;:44;65656:107;;:25;:107::i;:::-;65807:10;65774:44;;;;:32;:44;;;;;;;:51;;;:61;;;65957:29;65892:62;;;;:94;66027:61;65638:125;;-1:-1:-1;66027:61:0;;;;65807:10;66064:23;;66027:61;:::i;26528:174::-;25792:7;25819:12;;;;;;;;;;:22;;;23945:30;23956:4;683:10;23945;:30::i;:::-;26668:26:::1;26680:4;26686:7;26668:11;:26::i;53227:462::-:0;53305:19;53359:36;53387:7;53359:27;:36::i;:::-;:44;;53399:4;53359:44;53337:128;;;;-1:-1:-1;;;53337:128:0;;;;;;;:::i;:::-;53498:43;53533:7;53498:34;:43::i;:::-;:52;53476:144;;;;-1:-1:-1;;;53476:144:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;53640:35:0;;;;;:26;:35;;;;;:41;;;;53227:462::o;59747:291::-;-1:-1:-1;;;;;59904:35:0;;59838:17;59904:35;;;:26;:35;;;;;:51;59838:17;;59904:51;;:59;;:51;:59;59900:105;;-1:-1:-1;59989:4:0;60024:6;59747:291;-1:-1:-1;;59747:291:0:o;58880:770::-;-1:-1:-1;;;;;59161:41:0;;58979:34;59161:41;;;:32;:41;;;;;;;;59098:104;;;;;;;;;;;;;;;59040:4;59098:104;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59549:15;;59468:64;;59526:6;59468:64;:::i;:::-;59410:20;:38;;;:122;;;;:::i;55256:527::-;55351:14;;;55409:341;55433:18;:25;55429:29;;55409:341;;;55519:18;55538:1;55519:21;;;;;;;;:::i;:::-;;;;;;;;;;;:35;;;55502:13;:52;;:125;;;;;55592:18;55611:1;55592:21;;;;;;;;:::i;:::-;;;;;;;;;;;:35;;;55575:13;:52;;55502:125;55480:259;;;55671:18;55690:1;55671:21;;;;;;;;:::i;:::-;;;;;;;;;;;:28;;;55662:37;;55718:5;;55480:259;55460:3;;;;:::i;:::-;;;;55409:341;;54393:771;54480:14;;54542:36;54570:7;54542:27;:36::i;:::-;54538:593;;;54696:11;;-1:-1:-1;;;;;54696:11:0;:26;54723:23;54738:7;54723:14;:23::i;:::-;54696:51;;;;;;;;;;;;;160:25:1;;148:2;133:18;;14:177;54696:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54687:60;;54538:593;;;54769:43;54804:7;54769:34;:43::i;:::-;54765:366;;;-1:-1:-1;;;;;54960:73:0;;54926:31;54960:73;;;:32;:73;;;;;:85;;;55069:50;54960:85;55069:25;:50::i;:::-;55060:59;55150:6;-1:-1:-1;;;;54393:771:0:o;67466:1378::-;67556:46;67591:10;67556:34;:46::i;:::-;:54;;67606:4;67556:54;67534:133;;;;-1:-1:-1;;;67534:133:0;;19476:2:1;67534:133:0;;;19458:21:1;19515:2;19495:18;;;19488:30;19554:31;19534:18;;;19527:59;19603:18;;67534:133:0;19274:353:1;67534:133:0;67700:47;67736:10;67700:35;:47::i;:::-;:55;;67751:4;67700:55;67678:132;;;;-1:-1:-1;;;67678:132:0;;;;;;;:::i;:::-;67978:10;67864:60;67927:76;;;:32;:76;;;;;;;;;67864:139;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68038:12;:34;;-1:-1:-1;;;68038:34:0;;;;;2100:51:1;;;;67864:139:0;;-1:-1:-1;;;;;68038:12:0;;:22;;2073:18:1;;68038:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:70;;68016:154;;;;-1:-1:-1;;;68016:154:0;;;;;;;:::i;:::-;68397:32;;;;68362:9;;:68;;-1:-1:-1;;;;;68362:9:0;;;;68385:10;;68362:22;:68::i;:::-;68481:12;;68515:32;;;;68481:67;;-1:-1:-1;;;68481:67:0;;-1:-1:-1;;;;;68481:12:0;;;;:21;;:67;;68503:10;;68515:32;68481:67;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;68671:10:0;68638:44;;;;:32;:44;;;;;;;;68631:51;;-1:-1:-1;;68631:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68793:32;;;68723:113;;;;-1:-1:-1;68723:113:0;;-1:-1:-1;68723:113:0;:::i;68937:1855::-;69028:46;69063:10;69028:34;:46::i;:::-;:54;;69078:4;69028:54;69006:133;;;;-1:-1:-1;;;69006:133:0;;19476:2:1;69006:133:0;;;19458:21:1;19515:2;19495:18;;;19488:30;19554:31;19534:18;;;19527:59;19603:18;;69006:133:0;19274:353:1;69006:133:0;69172:47;69208:10;69172:35;:47::i;:::-;:56;69150:131;;;;-1:-1:-1;;;69150:131:0;;20237:2:1;69150:131:0;;;20219:21:1;20276:2;20256:18;;;20249:30;20315:27;20295:18;;;20288:55;20360:18;;69150:131:0;20035:349:1;69150:131:0;69449:10;69335:60;69398:76;;;:32;:76;;;;;;;;;69335:139;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69509:12;:34;;-1:-1:-1;;;69509:34:0;;;;;2100:51:1;;;;69335:139:0;;-1:-1:-1;;;;;69509:12:0;;:22;;2073:18:1;;69509:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:70;;69487:154;;;;-1:-1:-1;;;69487:154:0;;;;;;;:::i;:::-;69654:35;69704:37;69976:3;69911:20;:48;;;69859:20;:32;;;:100;;;;:::i;:::-;69858:121;;;;:::i;:::-;69813:166;;70081:29;70033:20;:32;;;:77;;;;:::i;:::-;70196:9;;69990:120;;-1:-1:-1;70196:63:0;;-1:-1:-1;;;;;70196:9:0;70219:10;69990:120;70196:22;:63::i;:::-;70293:9;;70270;;:64;;-1:-1:-1;;;;;70270:9:0;;;;70293;70304:29;70270:22;:64::i;:::-;70385:12;;70419:32;;;;70385:67;;-1:-1:-1;;;70385:67:0;;-1:-1:-1;;;;;70385:12:0;;;;:21;;:67;;70407:10;;70419:32;70385:67;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;70575:10:0;70542:44;;;;:32;:44;;;;;;70535:51;;-1:-1:-1;;70535:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70627:157;;;-1:-1:-1;70627:157:0;;-1:-1:-1;70702:27:0;;70744:29;;70627:157;:::i;:::-;;;;;;;;68995:1797;;;68937:1855::o;24248:246::-;24349:4;-1:-1:-1;;;;;;24386:47:0;;-1:-1:-1;;;24386:47:0;;:100;;;24450:36;24474:11;24450:23;:36::i;25040:497::-;25121:22;25129:4;25135:7;25121;:22::i;:::-;25116:414;;25309:41;25337:7;-1:-1:-1;;;;;25309:41:0;25347:2;25309:19;:41::i;:::-;25423:38;25451:4;25458:2;25423:19;:38::i;:::-;25214:270;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;25214:270:0;;;;;;;;;;-1:-1:-1;;;25160:358:0;;;;;;;:::i;28575:229::-;28650:22;28658:4;28664:7;28650;:22::i;:::-;28645:152;;28689:6;:12;;;;;;;;;;;-1:-1:-1;;;;;28689:29:0;;;;;;;;;:36;;-1:-1:-1;;28689:36:0;28721:4;28689:36;;;28772:12;683:10;;603:98;28772:12;-1:-1:-1;;;;;28745:40:0;28763:7;-1:-1:-1;;;;;28745:40:0;28757:4;28745:40;;;;;;;;;;28575:229;;:::o;28812:230::-;28887:22;28895:4;28901:7;28887;:22::i;:::-;28883:152;;;28958:5;28926:12;;;;;;;;;;;-1:-1:-1;;;;;28926:29:0;;;;;;;;;;:37;;-1:-1:-1;;28926:37:0;;;28983:40;683:10;;28926:12;;28983:40;;28958:5;28983:40;28812:230;;:::o;42508:285::-;42706:68;;-1:-1:-1;;;;;22342:15:1;;;42706:68:0;;;22324:34:1;22394:15;;22374:18;;;22367:43;22426:18;;;22419:34;;;42652:133:0;;42686:5;;-1:-1:-1;;;42729:27:0;22259:18:1;;42706:68:0;;;;-1:-1:-1;;42706:68:0;;;;;;;;;;;;;;-1:-1:-1;;;;;42706:68:0;-1:-1:-1;;;;;;42706:68:0;;;;;;;;;;42652:19;:133::i;:::-;42508:285;;;;:::o;42286:214::-;42369:123;42403:5;42446:23;;;42471:2;42475:5;42423:58;;;;;;;;;:::i;39198:265::-;39316:4;-1:-1:-1;;;;;;39353:49:0;;-1:-1:-1;;;39353:49:0;;:102;;-1:-1:-1;;;;;;;;;;9381:40:0;;;39419:36;9256:173;10963:476;11063:13;11089:19;11121:10;11125:6;11121:1;:10;:::i;:::-;:14;;11134:1;11121:14;:::i;:::-;11111:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11111:25:0;;11089:47;;-1:-1:-1;;;11147:6:0;11154:1;11147:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;11147:15:0;;;;;;;;;-1:-1:-1;;;11173:6:0;11180:1;11173:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;11173:15:0;;;;;;;;-1:-1:-1;11204:9:0;11216:10;11220:6;11216:1;:10;:::i;:::-;:14;;11229:1;11216:14;:::i;:::-;11204:26;;11199:135;11236:1;11232;:5;11199:135;;;-1:-1:-1;;;11284:5:0;11292:3;11284:11;11271:25;;;;;;;:::i;:::-;;;;11259:6;11266:1;11259:9;;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;;;;;11259:37:0;;;;;;;;-1:-1:-1;11321:1:0;11311:11;;;;;11239:3;;;:::i;:::-;;;11199:135;;;-1:-1:-1;11352:10:0;;11344:55;;;;-1:-1:-1;;;11344:55:0;;22807:2:1;11344:55:0;;;22789:21:1;;;22826:18;;;22819:30;22885:34;22865:18;;;22858:62;22937:18;;11344:55:0;22605:356:1;44297:802:0;44721:23;44747:106;44789:4;44747:106;;;;;;;;;;;;;;;;;44755:5;-1:-1:-1;;;;;44747:27:0;;;:106;;;;;:::i;:::-;44868:17;;44721:132;;-1:-1:-1;44868:21:0;44864:228;;44983:10;44972:30;;;;;;;;;;;;:::i;:::-;44946:134;;;;-1:-1:-1;;;44946:134:0;;23450:2:1;44946:134:0;;;23432:21:1;23489:2;23469:18;;;23462:30;23528:34;23508:18;;;23501:62;-1:-1:-1;;;23579:18:1;;;23572:40;23629:19;;44946:134:0;23248:406:1;15032:229:0;15169:12;15201:52;15223:6;15231:4;15237:1;15240:12;15169;12450:20;;16572:60;;;;-1:-1:-1;;;16572:60:0;;24268:2:1;16572:60:0;;;24250:21:1;24307:2;24287:18;;;24280:30;24346:31;24326:18;;;24319:59;24395:18;;16572:60:0;24066:353:1;16572:60:0;16646:12;16660:23;16687:6;-1:-1:-1;;;;;16687:11:0;16706:5;16727:4;16687:55;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16645:97;;;;16760:51;16777:7;16786:10;16798:12;16760:16;:51::i;:::-;16753:58;16248:571;-1:-1:-1;;;;;;;16248:571:0:o;19203:712::-;19353:12;19382:7;19378:530;;;-1:-1:-1;19413:10:0;19406:17;;19378:530;19527:17;;:21;19523:374;;19725:10;19719:17;19786:15;19773:10;19769:2;19765:19;19758:44;19523:374;19868:12;19861:20;;-1:-1:-1;;;19861:20:0;;;;;;;;:::i;196:286:1:-;254:6;307:2;295:9;286:7;282:23;278:32;275:52;;;323:1;320;313:12;275:52;349:23;;-1:-1:-1;;;;;;401:32:1;;391:43;;381:71;;448:1;445;438:12;679:131;-1:-1:-1;;;;;754:31:1;;744:42;;734:70;;800:1;797;790:12;734:70;679:131;:::o;815:247::-;874:6;927:2;915:9;906:7;902:23;898:32;895:52;;;943:1;940;933:12;895:52;982:9;969:23;1001:31;1026:5;1001:31;:::i;1067:180::-;1126:6;1179:2;1167:9;1158:7;1154:23;1150:32;1147:52;;;1195:1;1192;1185:12;1147:52;-1:-1:-1;1218:23:1;;1067:180;-1:-1:-1;1067:180:1:o;1619:315::-;1687:6;1695;1748:2;1736:9;1727:7;1723:23;1719:32;1716:52;;;1764:1;1761;1754:12;1716:52;1800:9;1787:23;1777:33;;1860:2;1849:9;1845:18;1832:32;1873:31;1898:5;1873:31;:::i;:::-;1923:5;1913:15;;;1619:315;;;;;:::o;2712:316::-;2789:6;2797;2805;2858:2;2846:9;2837:7;2833:23;2829:32;2826:52;;;2874:1;2871;2864:12;2826:52;-1:-1:-1;;2897:23:1;;;2967:2;2952:18;;2939:32;;-1:-1:-1;3018:2:1;3003:18;;;2990:32;;2712:316;-1:-1:-1;2712:316:1:o;4579:127::-;4640:10;4635:3;4631:20;4628:1;4621:31;4671:4;4668:1;4661:15;4695:4;4692:1;4685:15;4711:275;4782:2;4776:9;4847:2;4828:13;;-1:-1:-1;;4824:27:1;4812:40;;4882:18;4867:34;;4903:22;;;4864:62;4861:88;;;4929:18;;:::i;:::-;4965:2;4958:22;4711:275;;-1:-1:-1;4711:275:1:o;4991:712::-;5045:5;5098:3;5091:4;5083:6;5079:17;5075:27;5065:55;;5116:1;5113;5106:12;5065:55;5152:6;5139:20;5178:4;5201:18;5197:2;5194:26;5191:52;;;5223:18;;:::i;:::-;5269:2;5266:1;5262:10;5292:28;5316:2;5312;5308:11;5292:28;:::i;:::-;5354:15;;;5424;;;5420:24;;;5385:12;;;;5456:15;;;5453:35;;;5484:1;5481;5474:12;5453:35;5520:2;5512:6;5508:15;5497:26;;5532:142;5548:6;5543:3;5540:15;5532:142;;;5614:17;;5602:30;;5565:12;;;;5652;;;;5532:142;;5708:530;5750:5;5803:3;5796:4;5788:6;5784:17;5780:27;5770:55;;5821:1;5818;5811:12;5770:55;5857:6;5844:20;5883:18;5879:2;5876:26;5873:52;;;5905:18;;:::i;:::-;5949:55;5992:2;5973:13;;-1:-1:-1;;5969:27:1;5998:4;5965:38;5949:55;:::i;:::-;6029:2;6020:7;6013:19;6075:3;6068:4;6063:2;6055:6;6051:15;6047:26;6044:35;6041:55;;;6092:1;6089;6082:12;6041:55;6157:2;6150:4;6142:6;6138:17;6131:4;6122:7;6118:18;6105:55;6205:1;6180:16;;;6198:4;6176:27;6169:38;;;;6184:7;5708:530;-1:-1:-1;;;5708:530:1:o;6243:1071::-;6397:6;6405;6413;6421;6429;6482:3;6470:9;6461:7;6457:23;6453:33;6450:53;;;6499:1;6496;6489:12;6450:53;6538:9;6525:23;6557:31;6582:5;6557:31;:::i;:::-;6607:5;-1:-1:-1;6664:2:1;6649:18;;6636:32;6677:33;6636:32;6677:33;:::i;:::-;6729:7;-1:-1:-1;6787:2:1;6772:18;;6759:32;6810:18;6840:14;;;6837:34;;;6867:1;6864;6857:12;6837:34;6890:61;6943:7;6934:6;6923:9;6919:22;6890:61;:::i;:::-;6880:71;;7004:2;6993:9;6989:18;6976:32;6960:48;;7033:2;7023:8;7020:16;7017:36;;;7049:1;7046;7039:12;7017:36;7072:63;7127:7;7116:8;7105:9;7101:24;7072:63;:::i;:::-;7062:73;;7188:3;7177:9;7173:19;7160:33;7144:49;;7218:2;7208:8;7205:16;7202:36;;;7234:1;7231;7224:12;7202:36;;7257:51;7300:7;7289:8;7278:9;7274:24;7257:51;:::i;:::-;7247:61;;;6243:1071;;;;;;;;:::o;7526:953::-;7761:2;7813:21;;;7883:13;;7786:18;;;7905:22;;;7732:4;;7761:2;7946;;7964:18;;;;8005:15;;;7732:4;8048:405;8062:6;8059:1;8056:13;8048:405;;;8121:13;;8173:9;;8166:17;8159:25;8147:38;;8225:11;;;8219:18;8205:12;;;8198:40;8278:11;;;8272:18;8258:12;;;8251:40;8314:4;8358:11;;;8352:18;8338:12;;;8331:40;8400:4;8391:14;;;;8428:15;;;;8084:1;8077:9;8048:405;;;-1:-1:-1;8470:3:1;;7526:953;-1:-1:-1;;;;;;;7526:953:1:o;8484:734::-;8588:6;8596;8604;8612;8620;8673:3;8661:9;8652:7;8648:23;8644:33;8641:53;;;8690:1;8687;8680:12;8641:53;8729:9;8716:23;8748:31;8773:5;8748:31;:::i;:::-;8798:5;-1:-1:-1;8855:2:1;8840:18;;8827:32;8868:33;8827:32;8868:33;:::i;:::-;8920:7;-1:-1:-1;8974:2:1;8959:18;;8946:32;;-1:-1:-1;9025:2:1;9010:18;;8997:32;;-1:-1:-1;9080:3:1;9065:19;;9052:33;9108:18;9097:30;;9094:50;;;9140:1;9137;9130:12;9094:50;9163:49;9204:7;9195:6;9184:9;9180:22;9163:49;:::i;9223:398::-;9425:2;9407:21;;;9464:2;9444:18;;;9437:30;9503:34;9498:2;9483:18;;9476:62;-1:-1:-1;;;9569:2:1;9554:18;;9547:32;9611:3;9596:19;;9223:398::o;9626:406::-;9828:2;9810:21;;;9867:2;9847:18;;;9840:30;9906:34;9901:2;9886:18;;9879:62;-1:-1:-1;;;9972:2:1;9957:18;;9950:40;10022:3;10007:19;;9626:406::o;10037:127::-;10098:10;10093:3;10089:20;10086:1;10079:31;10129:4;10126:1;10119:15;10153:4;10150:1;10143:15;10169:168;10242:9;;;10273;;10290:15;;;10284:22;;10270:37;10260:71;;10311:18;;:::i;10342:125::-;10407:9;;;10428:10;;;10425:36;;;10441:18;;:::i;10472:128::-;10539:9;;;10560:11;;;10557:37;;;10574:18;;:::i;10605:356::-;10807:2;10789:21;;;10826:18;;;10819:30;10885:34;10880:2;10865:18;;10858:62;10952:2;10937:18;;10605:356::o;10966:345::-;-1:-1:-1;;;;;11186:32:1;;;;11168:51;;11250:2;11235:18;;11228:34;;;;11293:2;11278:18;;11271:34;11156:2;11141:18;;10966:345::o;11705:406::-;11907:2;11889:21;;;11946:2;11926:18;;;11919:30;11985:34;11980:2;11965:18;;11958:62;-1:-1:-1;;;12051:2:1;12036:18;;12029:40;12101:3;12086:19;;11705:406::o;12116:::-;12318:2;12300:21;;;12357:2;12337:18;;;12330:30;12396:34;12391:2;12376:18;;12369:62;-1:-1:-1;;;12462:2:1;12447:18;;12440:40;12512:3;12497:19;;12116:406::o;12943:274::-;-1:-1:-1;;;;;13135:32:1;;;;13117:51;;13199:2;13184:18;;13177:34;13105:2;13090:18;;12943:274::o;13222:184::-;13292:6;13345:2;13333:9;13324:7;13320:23;13316:32;13313:52;;;13361:1;13358;13351:12;13313:52;-1:-1:-1;13384:16:1;;13222:184;-1:-1:-1;13222:184:1:o;13763:352::-;13965:2;13947:21;;;14004:2;13984:18;;;13977:30;14043;14038:2;14023:18;;14016:58;14106:2;14091:18;;13763:352::o;14120:398::-;14322:2;14304:21;;;14361:2;14341:18;;;14334:30;14400:34;14395:2;14380:18;;14373:62;-1:-1:-1;;;14466:2:1;14451:18;;14444:32;14508:3;14493:19;;14120:398::o;14523:635::-;-1:-1:-1;;;;;14882:15:1;;;14864:34;;14934:15;;;;14929:2;14914:18;;14907:43;14981:2;14966:18;;14959:34;15024:2;15009:18;;15002:34;;;;14844:3;15067;15052:19;;15045:32;;;14807:4;15093:19;;;15086:30;15148:3;15133:19;;14523:635::o;16341:351::-;16543:2;16525:21;;;16582:2;16562:18;;;16555:30;16621:29;16616:2;16601:18;;16594:57;16683:2;16668:18;;16341:351::o;16697:127::-;16758:10;16753:3;16749:20;16746:1;16739:31;16789:4;16786:1;16779:15;16813:4;16810:1;16803:15;16829:135;16868:3;16889:17;;;16886:43;;16909:18;;:::i;:::-;-1:-1:-1;16956:1:1;16945:13;;16829:135::o;18466:401::-;18668:2;18650:21;;;18707:2;18687:18;;;18680:30;18746:34;18741:2;18726:18;;18719:62;-1:-1:-1;;;18812:2:1;18797:18;;18790:35;18857:3;18842:19;;18466:401::o;19632:398::-;19834:2;19816:21;;;19873:2;19853:18;;;19846:30;19912:34;19907:2;19892:18;;19885:62;-1:-1:-1;;;19978:2:1;19963:18;;19956:32;20020:3;20005:19;;19632:398::o;20389:217::-;20429:1;20455;20445:132;;20499:10;20494:3;20490:20;20487:1;20480:31;20534:4;20531:1;20524:15;20562:4;20559:1;20552:15;20445:132;-1:-1:-1;20591:9:1;;20389:217::o;20611:250::-;20696:1;20706:113;20720:6;20717:1;20714:13;20706:113;;;20796:11;;;20790:18;20777:11;;;20770:39;20742:2;20735:10;20706:113;;;-1:-1:-1;;20853:1:1;20835:16;;20828:27;20611:250::o;20866:812::-;21277:25;21272:3;21265:38;21247:3;21332:6;21326:13;21348:75;21416:6;21411:2;21406:3;21402:12;21395:4;21387:6;21383:17;21348:75;:::i;:::-;-1:-1:-1;;;21482:2:1;21442:16;;;21474:11;;;21467:40;21532:13;;21554:76;21532:13;21616:2;21608:11;;21601:4;21589:17;;21554:76;:::i;:::-;21650:17;21669:2;21646:26;;20866:812;-1:-1:-1;;;;20866:812:1:o;21683:396::-;21832:2;21821:9;21814:21;21795:4;21864:6;21858:13;21907:6;21902:2;21891:9;21887:18;21880:34;21923:79;21995:6;21990:2;21979:9;21975:18;21970:2;21962:6;21958:15;21923:79;:::i;:::-;22063:2;22042:15;-1:-1:-1;;22038:29:1;22023:45;;;;22070:2;22019:54;;21683:396;-1:-1:-1;;21683:396:1:o;22464:136::-;22503:3;22531:5;22521:39;;22540:18;;:::i;:::-;-1:-1:-1;;;22576:18:1;;22464:136::o;22966:277::-;23033:6;23086:2;23074:9;23065:7;23061:23;23057:32;23054:52;;;23102:1;23099;23092:12;23054:52;23134:9;23128:16;23187:5;23180:13;23173:21;23166:5;23163:32;23153:60;;23209:1;23206;23199:12;24424:287;24553:3;24591:6;24585:13;24607:66;24666:6;24661:3;24654:4;24646:6;24642:17;24607:66;:::i;:::-;24689:16;;;;;24424:287;-1:-1:-1;;24424:287:1:o
Swarm Source
ipfs://03e1b1c58c41b8d1c6fa6436b836143f140eb2f18cd5ab2099e0551853aa1155
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
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.