More Info
Private Name Tags
ContractCreator
Latest 7 from a total of 7 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 13150947 | 30 hrs ago | IN | 0 S | 0.00834232 | ||||
Claim Reward | 12948528 | 2 days ago | IN | 0 S | 0.00498555 | ||||
Claim Reward | 12946653 | 2 days ago | IN | 0 S | 0.00753206 | ||||
Stake | 12610419 | 3 days ago | IN | 0 S | 0.00926791 | ||||
Set Operator | 12519228 | 4 days ago | IN | 0 S | 0.00139241 | ||||
Set Operator | 12516719 | 4 days ago | IN | 0 S | 0.00178061 | ||||
Initialize | 12516546 | 4 days ago | IN | 0 S | 0.01352016 |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Source Code Verified (Exact Match)
Contract Name:
Masonry
Compiler Version
v0.8.26+commit.8a97fa7a
Contract Source Code (Solidity)
/** *Submitted for verification at SonicScan.org on 2025-03-08 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with 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; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } } // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since 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 subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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 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 `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, 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 `from` to `to` 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 from, address to, uint256 amount) external returns (bool); } /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. * * ==== Security Considerations * * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be * considered as an intention to spend the allowance in any specific way. The second is that because permits have * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be * generally recommended is: * * ```solidity * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public { * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {} * doThing(..., value); * } * * function doThing(..., uint256 value) public { * token.safeTransferFrom(msg.sender, address(this), value); * ... * } * ``` * * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also * {SafeERC20-safeTransferFrom}). * * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so * contracts should have entry points that don't rely on permit. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. * * CAUTION: See Security Considerations above. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } /** * @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 * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 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://consensys.net/diligence/blog/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.8.0/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 functionCallWithValue(target, data, 0, "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"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } /** * @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; /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value)); } /** * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ 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"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value)); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval * to be set to zero before setting it to a non-zero value, such as USDT. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0)); _callOptionalReturn(token, approvalCall); } } /** * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`. * Revert on invalid signature. */ function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @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"); require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). * * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { // 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 cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token)); } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } contract Operator is Context, Ownable { address private _operator; event OperatorTransferred(address indexed previousOperator, address indexed newOperator); constructor() { _operator = _msgSender(); emit OperatorTransferred(address(0), _operator); } function operator() public view returns (address) { return _operator; } modifier onlyOperator() { require(_operator == msg.sender, "operator: caller is not the operator"); _; } function isOperator() public view returns (bool) { return _msgSender() == _operator; } function transferOperator(address newOperator_) public onlyOwner { _transferOperator(newOperator_); } function _transferOperator(address newOperator_) internal { require(newOperator_ != address(0), "operator: zero address given for new operator"); emit OperatorTransferred(address(0), newOperator_); _operator = newOperator_; } function _renounceOperator() public onlyOwner { emit OperatorTransferred(_operator, address(0)); _operator = address(0); } } interface IBasisAsset { function mint(address recipient, uint256 amount) external returns (bool); function burn(uint256 amount) external; function burnFrom(address from, uint256 amount) external; function isOperator() external returns (bool); function operator() external view returns (address); function transferOperator(address newOperator_) external; } interface ITreasury { function epoch() external view returns (uint256); function nextEpochPoint() external view returns (uint256); function getBillPrice() external view returns (uint256); function buyBonds(uint256 amount, uint256 targetPrice) external; function redeemBonds(uint256 amount, uint256 targetPrice) external; } contract ContractGuard { mapping(uint256 => mapping(address => bool)) private _status; function checkSameOriginReentranted() internal view returns (bool) { return _status[block.number][tx.origin]; } function checkSameSenderReentranted() internal view returns (bool) { return _status[block.number][msg.sender]; } modifier onlyOneBlock() { require(!checkSameOriginReentranted(), "ContractGuard: one block, one function"); require(!checkSameSenderReentranted(), "ContractGuard: one block, one function"); _; _status[block.number][tx.origin] = true; _status[block.number][msg.sender] = true; } } contract ShareWrapper { using SafeMath for uint256; using SafeERC20 for IERC20; IERC20 public share; uint256 private _totalSupply; mapping(address => uint256) private _balances; function totalSupply() public view returns (uint256) { return _totalSupply; } function balanceOf(address account) public view returns (uint256) { return _balances[account]; } function stake(uint256 amount) public virtual { _totalSupply = _totalSupply.add(amount); _balances[msg.sender] = _balances[msg.sender].add(amount); share.safeTransferFrom(msg.sender, address(this), amount); } function withdraw(uint256 amount) public virtual { uint256 masonUserShare = _balances[msg.sender]; require(masonUserShare >= amount, "Masonry: withdraw request greater than staked amount"); _totalSupply = _totalSupply.sub(amount); _balances[msg.sender] = masonUserShare.sub(amount); share.safeTransfer(msg.sender, amount); } } contract Masonry is ShareWrapper, ContractGuard, Operator { using SafeERC20 for IERC20; using Address for address; using SafeMath for uint256; /* ========== DATA STRUCTURES ========== */ struct MasonSeat { uint256 lastSnapshotIndex; uint256 rewardEarned; uint256 epochTimerStart; } struct MasonrySnapshot { uint256 time; uint256 rewardReceived; uint256 rewardPerShare; } /* ========== STATE VARIABLES ========== */ // flags bool public initialized = false; IERC20 public bill; ITreasury public treasury; mapping(address => MasonSeat) public masons; MasonrySnapshot[] public masonryHistory; uint256 public withdrawLockupEpochs; uint256 public rewardLockupEpochs; uint256 public claimRewardsBurnEpochs; /* ========== EVENTS ========== */ event Initialized(address indexed executor, uint256 at); event Staked(address indexed user, uint256 amount); event Withdrawn(address indexed user, uint256 amount); event RewardPaid(address indexed user, uint256 reward); event RewardAdded(address indexed user, uint256 reward); /* ========== Modifiers =============== */ modifier masonUserExists { require(balanceOf(msg.sender) > 0, "Masonry: The masonUser does not exist"); _; } modifier updateReward(address masonUser) { if (masonUser != address(0)) { MasonSeat memory seat = masons[masonUser]; seat.rewardEarned = earned(masonUser); seat.lastSnapshotIndex = latestSnapshotIndex(); masons[masonUser] = seat; } _; } modifier notInitialized { require(!initialized, "Masonry: already initialized"); _; } /* ========== GOVERNANCE ========== */ function initialize( IERC20 _bill, IERC20 _share, ITreasury _treasury ) public notInitialized onlyOperator { bill = _bill; share = _share; treasury = _treasury; MasonrySnapshot memory genesisSnapshot = MasonrySnapshot({time : block.number, rewardReceived : 0, rewardPerShare : 0}); masonryHistory.push(genesisSnapshot); withdrawLockupEpochs = 4; // Lock for 4 epochs (24h) before release withdraw rewardLockupEpochs = 2; // Lock for 2 epochs (12h) before release claimReward claimRewardsBurnEpochs = 8; // if the masonUser doesn't claim rewards in 2 days, the rewards will be burned initialized = true; emit Initialized(msg.sender, block.number); } function setOperator(address _operator) external onlyOperator { transferOperator(_operator); } function renounceOperator() external onlyOperator { _renounceOperator(); } function setLockUp(uint256 _withdrawLockupEpochs, uint256 _rewardLockupEpochs, uint256 _claimRewardsBurnEpochs) external onlyOperator { require(_withdrawLockupEpochs >= _rewardLockupEpochs && _withdrawLockupEpochs <= 56 && _claimRewardsBurnEpochs <= 56, "_withdrawLockupEpochs: out of range"); // <= 2 week require(_withdrawLockupEpochs > 0 && _rewardLockupEpochs > 0 && _claimRewardsBurnEpochs > 0, "lockupEpochs must be greater than 0"); withdrawLockupEpochs = _withdrawLockupEpochs; rewardLockupEpochs = _rewardLockupEpochs; claimRewardsBurnEpochs = _claimRewardsBurnEpochs; } /* ========== VIEW FUNCTIONS ========== */ // =========== Snapshot getters =========== // function latestSnapshotIndex() public view returns (uint256) { return masonryHistory.length.sub(1); } function getLatestSnapshot() internal view returns (MasonrySnapshot memory) { return masonryHistory[latestSnapshotIndex()]; } function getLastSnapshotIndexOf(address masonUser) public view returns (uint256) { return masons[masonUser].lastSnapshotIndex; } function getLastSnapshotOf(address masonUser) internal view returns (MasonrySnapshot memory) { return masonryHistory[getLastSnapshotIndexOf(masonUser)]; } function canWithdraw(address masonUser) external view returns (bool) { return masons[masonUser].epochTimerStart.add(withdrawLockupEpochs) <= treasury.epoch(); } function canClaimReward(address masonUser) external view returns (bool) { return masons[masonUser].epochTimerStart.add(rewardLockupEpochs) <= treasury.epoch(); } function rewardsWillBeBurned(address masonUser) external view returns (bool) { return masons[masonUser].epochTimerStart.add(claimRewardsBurnEpochs) <= treasury.epoch(); // if the masonUser doesn't claim rewards in 2 weeks, the rewards will be burned } function epoch() external view returns (uint256) { return treasury.epoch(); } function nextEpochPoint() external view returns (uint256) { return treasury.nextEpochPoint(); } function getBillPrice() external view returns (uint256) { return treasury.getBillPrice(); } // =========== Users getters =========== // function rewardPerShare() public view returns (uint256) { return getLatestSnapshot().rewardPerShare; } function earned(address masonUser) public view returns (uint256) { uint256 latestRPS = getLatestSnapshot().rewardPerShare; uint256 storedRPS = getLastSnapshotOf(masonUser).rewardPerShare; return balanceOf(masonUser).mul(latestRPS.sub(storedRPS)).div(1e18).add(masons[masonUser].rewardEarned); } /* ========== MUTATIVE FUNCTIONS ========== */ function stake(uint256 amount) public override onlyOneBlock updateReward(msg.sender) { require(amount > 0, "Masonry: Cannot stake 0"); super.stake(amount); masons[msg.sender].epochTimerStart = treasury.epoch(); // reset timer emit Staked(msg.sender, amount); } function withdraw(uint256 amount) public override onlyOneBlock masonUserExists updateReward(msg.sender) { require(amount > 0, "Masonry: Cannot withdraw 0"); require(masons[msg.sender].epochTimerStart.add(withdrawLockupEpochs) <= treasury.epoch(), "Masonry: still in withdraw lockup"); claimReward(); super.withdraw(amount); emit Withdrawn(msg.sender, amount); } function exit() external { withdraw(balanceOf(msg.sender)); } function claimReward() public updateReward(msg.sender) { uint256 reward = masons[msg.sender].rewardEarned; if (reward > 0) { require(masons[msg.sender].epochTimerStart.add(rewardLockupEpochs) <= treasury.epoch(), "Masonry: still in reward lockup"); bool willBurn = masons[msg.sender].epochTimerStart.add(claimRewardsBurnEpochs) <= treasury.epoch(); masons[msg.sender].epochTimerStart = treasury.epoch(); // reset timer masons[msg.sender].rewardEarned = 0; if (willBurn) { IBasisAsset(address(bill)).burn(reward); emit RewardPaid(msg.sender, 0); } else { bill.safeTransfer(msg.sender, reward); emit RewardPaid(msg.sender, reward); } } } function allocateSeigniorage(uint256 amount) external onlyOneBlock onlyOperator { require(amount > 0, "Masonry: Cannot allocate 0"); require(totalSupply() > 0, "Masonry: Cannot allocate when totalSupply is 0"); // Create & add new snapshot uint256 prevRPS = getLatestSnapshot().rewardPerShare; uint256 nextRPS = prevRPS.add(amount.mul(1e18).div(totalSupply())); MasonrySnapshot memory newSnapshot = MasonrySnapshot({ time: block.number, rewardReceived: amount, rewardPerShare: nextRPS }); masonryHistory.push(newSnapshot); bill.safeTransferFrom(msg.sender, address(this), amount); emit RewardAdded(msg.sender, amount); } function governanceRecoverUnsupported(IERC20 _token, uint256 _amount, address _to) external onlyOperator { // do not allow to drain core tokens require(address(_token) != address(bill), "bill"); require(address(_token) != address(share), "share"); _token.safeTransfer(_to, _amount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"executor","type":"address"},{"indexed":false,"internalType":"uint256","name":"at","type":"uint256"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOperator","type":"address"},{"indexed":true,"internalType":"address","name":"newOperator","type":"address"}],"name":"OperatorTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[],"name":"_renounceOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"allocateSeigniorage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bill","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"masonUser","type":"address"}],"name":"canClaimReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"masonUser","type":"address"}],"name":"canWithdraw","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimRewardsBurnEpochs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"masonUser","type":"address"}],"name":"earned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"epoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"exit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getBillPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"masonUser","type":"address"}],"name":"getLastSnapshotIndexOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"governanceRecoverUnsupported","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_bill","type":"address"},{"internalType":"contract IERC20","name":"_share","type":"address"},{"internalType":"contract ITreasury","name":"_treasury","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestSnapshotIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"masonryHistory","outputs":[{"internalType":"uint256","name":"time","type":"uint256"},{"internalType":"uint256","name":"rewardReceived","type":"uint256"},{"internalType":"uint256","name":"rewardPerShare","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"masons","outputs":[{"internalType":"uint256","name":"lastSnapshotIndex","type":"uint256"},{"internalType":"uint256","name":"rewardEarned","type":"uint256"},{"internalType":"uint256","name":"epochTimerStart","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextEpochPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardLockupEpochs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPerShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"masonUser","type":"address"}],"name":"rewardsWillBeBurned","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_withdrawLockupEpochs","type":"uint256"},{"internalType":"uint256","name":"_rewardLockupEpochs","type":"uint256"},{"internalType":"uint256","name":"_claimRewardsBurnEpochs","type":"uint256"}],"name":"setLockUp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"}],"name":"setOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"share","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOperator_","type":"address"}],"name":"transferOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"contract ITreasury","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawLockupEpochs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040526005805460ff60a01b19169055348015601b575f80fd5b506023336066565b600580546001600160a01b031916339081179091556040515f907f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed908290a360b7565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b61224e806100c45f395ff3fe608060405234801561000f575f80fd5b5060043610610228575f3560e01c8063714b46581161012a578063a8d5fd65116100b4578063c5967c2611610079578063c5967c261461049c578063ceccf59a146104a4578063e0f6dc9e146104b7578063e9fad8ee146104e5578063f2fde38b146104ed575f80fd5b8063a8d5fd6514610454578063ab39e27a14610466578063b3ab15fb1461046e578063b88a802f14610481578063c0c53b8b14610489575f80fd5b80638da5cb5b116100fa5780638da5cb5b1461040c578063900cf0cf1461041d57806397ffe1d714610425578063a694fc3a14610438578063a894a1ee1461044b575f80fd5b8063714b4658146103a6578063715018a6146103ce5780638a27f103146103d65780638cd9a27f146103de575f80fd5b80632ab6f8db116101b6578063446a2ec81161017b578063446a2ec81461033f57806354575af414610347578063570ca7351461035a57806361d027b31461036b57806370a082311461037e575f80fd5b80632ab6f8db146102de5780632e1a7d4d146102e6578063371e677a146102f95780633f9e3f04146103245780634456eda21461032c575f80fd5b8063158ef93e116101fc578063158ef93e1461029157806318160ddd146102a557806319262d30146102ad5780631e85cd65146102c057806329605e77146102c9575f80fd5b80628cc2621461022c578063022ba18d14610252578063046335d01461025b5780630666798a1461027e575b5f80fd5b61023f61023a366004611fab565b610500565b6040519081526020015b60405180910390f35b61023f600b5481565b61026e610269366004611fab565b61058d565b6040519015158152602001610249565b61026e61028c366004611fab565b610627565b60055461026e90600160a01b900460ff1681565b60015461023f565b61026e6102bb366004611fab565b6106b9565b61023f600a5481565b6102dc6102d7366004611fab565b61074b565b005b6102dc61075f565b6102dc6102f4366004611fcd565b61079c565b60065461030c906001600160a01b031681565b6040516001600160a01b039091168152602001610249565b61023f610ac7565b6005546001600160a01b0316331461026e565b61023f610adc565b6102dc610355366004611fe4565b610aee565b6005546001600160a01b031661030c565b60075461030c906001600160a01b031681565b61023f61038c366004611fab565b6001600160a01b03165f9081526002602052604090205490565b61023f6103b4366004611fab565b6001600160a01b03165f9081526008602052604090205490565b6102dc610bbd565b6102dc610bce565b6103f16103ec366004611fcd565b610c1f565b60408051938452602084019290925290820152606001610249565b6004546001600160a01b031661030c565b61023f610c50565b6102dc610433366004611fcd565b610cbb565b6102dc610446366004611fcd565b610f83565b61023f600c5481565b5f5461030c906001600160a01b031681565b61023f61119a565b6102dc61047c366004611fab565b6111e1565b6102dc611214565b6102dc610497366004612023565b61159f565b61023f61175f565b6102dc6104b2366004612060565b6117a6565b6103f16104c5366004611fab565b60086020525f908152604090208054600182015460029092015490919083565b6102dc6118c5565b6102dc6104fb366004611fab565b6118dd565b5f8061050a611953565b6040015190505f61051a846119c7565b6040908101516001600160a01b0386165f908152600860205291909120600101549091506105859061057f670de0b6b3a764000061057961055b8787611a53565b6001600160a01b038a165f9081526002602052604090205490611a67565b90611a72565b90611a7d565b949350505050565b6007546040805163900cf0cf60e01b815290515f926001600160a01b03169163900cf0cf9160048083019260209291908290030181865afa1580156105d4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105f89190612089565b600b546001600160a01b0384165f9081526008602052604090206002015461061f91611a7d565b111592915050565b6007546040805163900cf0cf60e01b815290515f926001600160a01b03169163900cf0cf9160048083019260209291908290030181865afa15801561066e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106929190612089565b600c546001600160a01b0384165f9081526008602052604090206002015461061f91611a7d565b6007546040805163900cf0cf60e01b815290515f926001600160a01b03169163900cf0cf9160048083019260209291908290030181865afa158015610700573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107249190612089565b600a546001600160a01b0384165f9081526008602052604090206002015461061f91611a7d565b610753611a88565b61075c81611ae2565b50565b6005546001600160a01b031633146107925760405162461bcd60e51b8152600401610789906120a0565b60405180910390fd5b61079a610bce565b565b435f90815260036020908152604080832032845290915290205460ff16156107d65760405162461bcd60e51b8152600401610789906120e4565b435f90815260036020908152604080832033845290915290205460ff16156108105760405162461bcd60e51b8152600401610789906120e4565b335f908152600260205260408120541161087a5760405162461bcd60e51b815260206004820152602560248201527f4d61736f6e72793a20546865206d61736f6e5573657220646f6573206e6f7420604482015264195e1a5cdd60da1b6064820152608401610789565b338015610909576001600160a01b0381165f9081526008602090815260409182902082516060810184528154815260018201549281019290925260020154918101919091526108c882610500565b60208201526108d5610ac7565b81526001600160a01b0382165f90815260086020908152604091829020835181559083015160018201559101516002909101555b5f82116109585760405162461bcd60e51b815260206004820152601a60248201527f4d61736f6e72793a2043616e6e6f7420776974686472617720300000000000006044820152606401610789565b60075f9054906101000a90046001600160a01b03166001600160a01b031663900cf0cf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109a8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109cc9190612089565b600a54335f908152600860205260409020600201546109ea91611a7d565b1115610a425760405162461bcd60e51b815260206004820152602160248201527f4d61736f6e72793a207374696c6c20696e207769746864726177206c6f636b756044820152600760fc1b6064820152608401610789565b610a4a611214565b610a5382611ba5565b60405182815233907f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5906020015b60405180910390a25050435f9081526003602090815260408083203284529091528082208054600160ff1991821681179092553384529190922080549091169091179055565b6009545f90610ad7906001611a53565b905090565b5f610ae5611953565b60400151905090565b6005546001600160a01b03163314610b185760405162461bcd60e51b8152600401610789906120a0565b6006546001600160a01b0390811690841603610b5f5760405162461bcd60e51b815260040161078990602080825260049082015263189a5b1b60e21b604082015260600190565b5f546001600160a01b0390811690841603610ba45760405162461bcd60e51b8152602060048201526005602482015264736861726560d81b6044820152606401610789565b610bb86001600160a01b0384168284611c61565b505050565b610bc5611a88565b61079a5f611cc4565b610bd6611a88565b6005546040515f916001600160a01b0316907f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed908390a3600580546001600160a01b0319169055565b60098181548110610c2e575f80fd5b5f91825260209091206003909102018054600182015460029092015490925083565b6007546040805163900cf0cf60e01b815290515f926001600160a01b03169163900cf0cf9160048083019260209291908290030181865afa158015610c97573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ad79190612089565b435f90815260036020908152604080832032845290915290205460ff1615610cf55760405162461bcd60e51b8152600401610789906120e4565b435f90815260036020908152604080832033845290915290205460ff1615610d2f5760405162461bcd60e51b8152600401610789906120e4565b6005546001600160a01b03163314610d595760405162461bcd60e51b8152600401610789906120a0565b5f8111610da85760405162461bcd60e51b815260206004820152601a60248201527f4d61736f6e72793a2043616e6e6f7420616c6c6f6361746520300000000000006044820152606401610789565b5f610db260015490565b11610e165760405162461bcd60e51b815260206004820152602e60248201527f4d61736f6e72793a2043616e6e6f7420616c6c6f63617465207768656e20746f60448201526d074616c537570706c7920697320360941b6064820152608401610789565b5f610e1f611953565b6040015190505f610e4e610e47610e3560015490565b61057986670de0b6b3a7640000611a67565b8390611a7d565b6040805160608101825243815260208101868152918101838152600980546001810182555f9190915282517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af60039092029182015592517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b0840155517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b19092019190915560065491925090610f0e906001600160a01b0316333087611d15565b60405184815233907fac24935fd910bc682b5ccb1a07b718cadf8cf2f6d1404c4f3ddc3662dae40e299060200160405180910390a25050435f9081526003602090815260408083203284529091528082208054600160ff19918216811790925533845291909220805490911690911790555050565b435f90815260036020908152604080832032845290915290205460ff1615610fbd5760405162461bcd60e51b8152600401610789906120e4565b435f90815260036020908152604080832033845290915290205460ff1615610ff75760405162461bcd60e51b8152600401610789906120e4565b338015611086576001600160a01b0381165f90815260086020908152604091829020825160608101845281548152600182015492810192909252600201549181019190915261104582610500565b6020820152611052610ac7565b81526001600160a01b0382165f90815260086020908152604091829020835181559083015160018201559101516002909101555b5f82116110d55760405162461bcd60e51b815260206004820152601760248201527f4d61736f6e72793a2043616e6e6f74207374616b6520300000000000000000006044820152606401610789565b6110de82611d53565b60075f9054906101000a90046001600160a01b03166001600160a01b031663900cf0cf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561112e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111529190612089565b335f81815260086020526040908190206002019290925590517f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d90610a819085815260200190565b6007546040805163559cf13d60e11b815290515f926001600160a01b03169163ab39e27a9160048083019260209291908290030181865afa158015610c97573d5f803e3d5ffd5b6005546001600160a01b0316331461120b5760405162461bcd60e51b8152600401610789906120a0565b61075c8161074b565b3380156112a3576001600160a01b0381165f90815260086020908152604091829020825160608101845281548152600182015492810192909252600201549181019190915261126282610500565b602082015261126f610ac7565b81526001600160a01b0382165f90815260086020908152604091829020835181559083015160018201559101516002909101555b335f90815260086020526040902060010154801561159b5760075f9054906101000a90046001600160a01b03166001600160a01b031663900cf0cf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561130b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061132f9190612089565b600b54335f9081526008602052604090206002015461134d91611a7d565b111561139b5760405162461bcd60e51b815260206004820152601f60248201527f4d61736f6e72793a207374696c6c20696e20726577617264206c6f636b7570006044820152606401610789565b6007546040805163900cf0cf60e01b815290515f926001600160a01b03169163900cf0cf9160048083019260209291908290030181865afa1580156113e2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114069190612089565b600c54335f9081526008602052604090206002015461142491611a7d565b1115905060075f9054906101000a90046001600160a01b03166001600160a01b031663900cf0cf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611478573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061149c9190612089565b335f9081526008602052604081206002810192909255600190910155801561155257600654604051630852cd8d60e31b8152600481018490526001600160a01b03909116906342966c68906024015f604051808303815f87803b158015611501575f80fd5b505af1158015611513573d5f803e3d5ffd5b50506040515f81523392507fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e048691506020015b60405180910390a2505050565b600654611569906001600160a01b03163384611c61565b60405182815233907fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e048690602001611545565b5050565b600554600160a01b900460ff16156115f95760405162461bcd60e51b815260206004820152601c60248201527f4d61736f6e72793a20616c726561647920696e697469616c697a6564000000006044820152606401610789565b6005546001600160a01b031633146116235760405162461bcd60e51b8152600401610789906120a0565b600680546001600160a01b038581166001600160a01b0319928316179092555f8054858416908316178155600780549385169390921692909217905560408051606081018252438082526020808301858152838501868152600980546001810182559752845160039097027f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af81019790975590517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b0870155517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b1909501949094556004600a556002600b556008600c556005805460ff60a01b1916600160a01b17905591519182529133917f25ff68dd81b34665b5ba7e553ee5511bf6812e12adb4a7e2c0d9e26b3099ce79910160405180910390a250505050565b600754604080516362cb3e1360e11b815290515f926001600160a01b03169163c5967c269160048083019260209291908290030181865afa158015610c97573d5f803e3d5ffd5b6005546001600160a01b031633146117d05760405162461bcd60e51b8152600401610789906120a0565b8183101580156117e1575060388311155b80156117ee575060388111155b6118465760405162461bcd60e51b815260206004820152602360248201527f5f77697468647261774c6f636b757045706f6368733a206f7574206f662072616044820152626e676560e81b6064820152608401610789565b5f8311801561185457505f82115b801561185f57505f81115b6118b75760405162461bcd60e51b815260206004820152602360248201527f6c6f636b757045706f636873206d75737420626520677265617465722074686160448201526206e20360ec1b6064820152608401610789565b600a92909255600b55600c55565b335f9081526002602052604090205461079a9061079c565b6118e5611a88565b6001600160a01b03811661194a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610789565b61075c81611cc4565b61197460405180606001604052805f81526020015f81526020015f81525090565b600961197e610ac7565b8154811061198e5761198e61212a565b905f5260205f2090600302016040518060600160405290815f820154815260200160018201548152602001600282015481525050905090565b6119e860405180606001604052805f81526020015f81526020015f81525090565b6009611a08836001600160a01b03165f9081526008602052604090205490565b81548110611a1857611a1861212a565b905f5260205f2090600302016040518060600160405290815f8201548152602001600182015481526020016002820154815250509050919050565b5f611a5e8284612152565b90505b92915050565b5f611a5e8284612165565b5f611a5e828461217c565b5f611a5e828461219b565b6004546001600160a01b0316331461079a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610789565b6001600160a01b038116611b4e5760405162461bcd60e51b815260206004820152602d60248201527f6f70657261746f723a207a65726f206164647265737320676976656e20666f7260448201526c103732bb9037b832b930ba37b960991b6064820152608401610789565b6040516001600160a01b038216905f907f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed908290a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b335f9081526002602052604090205481811015611c215760405162461bcd60e51b815260206004820152603460248201527f4d61736f6e72793a2077697468647261772072657175657374206772656174656044820152731c881d1a185b881cdd185ad95908185b5bdd5b9d60621b6064820152608401610789565b600154611c2e9083611a53565b600155611c3b8183611a53565b335f81815260026020526040812092909255905461159b916001600160a01b0390911690845b6040516001600160a01b038316602482015260448101829052610bb890849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611da7565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6040516001600160a01b0380851660248301528316604482015260648101829052611d4d9085906323b872dd60e01b90608401611c8d565b50505050565b600154611d609082611a7d565b600155335f90815260026020526040902054611d7c9082611a7d565b335f81815260026020526040812092909255905461075c916001600160a01b03909116903084611d15565b5f611dfb826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611e7a9092919063ffffffff16565b905080515f1480611e1b575080806020019051810190611e1b91906121ae565b610bb85760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610789565b606061058584845f85855f80866001600160a01b03168587604051611e9f91906121cd565b5f6040518083038185875af1925050503d805f8114611ed9576040519150601f19603f3d011682016040523d82523d5f602084013e611ede565b606091505b5091509150611eef87838387611efa565b979650505050505050565b60608315611f685782515f03611f61576001600160a01b0385163b611f615760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610789565b5081610585565b6105858383815115611f7d5781518083602001fd5b8060405162461bcd60e51b815260040161078991906121e3565b6001600160a01b038116811461075c575f80fd5b5f60208284031215611fbb575f80fd5b8135611fc681611f97565b9392505050565b5f60208284031215611fdd575f80fd5b5035919050565b5f805f60608486031215611ff6575f80fd5b833561200181611f97565b925060208401359150604084013561201881611f97565b809150509250925092565b5f805f60608486031215612035575f80fd5b833561204081611f97565b9250602084013561205081611f97565b9150604084013561201881611f97565b5f805f60608486031215612072575f80fd5b505081359360208301359350604090920135919050565b5f60208284031215612099575f80fd5b5051919050565b60208082526024908201527f6f70657261746f723a2063616c6c6572206973206e6f7420746865206f70657260408201526330ba37b960e11b606082015260800190565b60208082526026908201527f436f6e747261637447756172643a206f6e6520626c6f636b2c206f6e652066756040820152653731ba34b7b760d11b606082015260800190565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b81810381811115611a6157611a6161213e565b8082028115828204841417611a6157611a6161213e565b5f8261219657634e487b7160e01b5f52601260045260245ffd5b500490565b80820180821115611a6157611a6161213e565b5f602082840312156121be575f80fd5b81518015158114611fc6575f80fd5b5f82518060208501845e5f920191825250919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f8301168401019150509291505056fea26469706673582212205fdd1985eeb6cef6f3a2ecc44bff81cb7977c28625e62ba0de2b70bb26b41dcb64736f6c634300081a0033
Deployed Bytecode
0x608060405234801561000f575f80fd5b5060043610610228575f3560e01c8063714b46581161012a578063a8d5fd65116100b4578063c5967c2611610079578063c5967c261461049c578063ceccf59a146104a4578063e0f6dc9e146104b7578063e9fad8ee146104e5578063f2fde38b146104ed575f80fd5b8063a8d5fd6514610454578063ab39e27a14610466578063b3ab15fb1461046e578063b88a802f14610481578063c0c53b8b14610489575f80fd5b80638da5cb5b116100fa5780638da5cb5b1461040c578063900cf0cf1461041d57806397ffe1d714610425578063a694fc3a14610438578063a894a1ee1461044b575f80fd5b8063714b4658146103a6578063715018a6146103ce5780638a27f103146103d65780638cd9a27f146103de575f80fd5b80632ab6f8db116101b6578063446a2ec81161017b578063446a2ec81461033f57806354575af414610347578063570ca7351461035a57806361d027b31461036b57806370a082311461037e575f80fd5b80632ab6f8db146102de5780632e1a7d4d146102e6578063371e677a146102f95780633f9e3f04146103245780634456eda21461032c575f80fd5b8063158ef93e116101fc578063158ef93e1461029157806318160ddd146102a557806319262d30146102ad5780631e85cd65146102c057806329605e77146102c9575f80fd5b80628cc2621461022c578063022ba18d14610252578063046335d01461025b5780630666798a1461027e575b5f80fd5b61023f61023a366004611fab565b610500565b6040519081526020015b60405180910390f35b61023f600b5481565b61026e610269366004611fab565b61058d565b6040519015158152602001610249565b61026e61028c366004611fab565b610627565b60055461026e90600160a01b900460ff1681565b60015461023f565b61026e6102bb366004611fab565b6106b9565b61023f600a5481565b6102dc6102d7366004611fab565b61074b565b005b6102dc61075f565b6102dc6102f4366004611fcd565b61079c565b60065461030c906001600160a01b031681565b6040516001600160a01b039091168152602001610249565b61023f610ac7565b6005546001600160a01b0316331461026e565b61023f610adc565b6102dc610355366004611fe4565b610aee565b6005546001600160a01b031661030c565b60075461030c906001600160a01b031681565b61023f61038c366004611fab565b6001600160a01b03165f9081526002602052604090205490565b61023f6103b4366004611fab565b6001600160a01b03165f9081526008602052604090205490565b6102dc610bbd565b6102dc610bce565b6103f16103ec366004611fcd565b610c1f565b60408051938452602084019290925290820152606001610249565b6004546001600160a01b031661030c565b61023f610c50565b6102dc610433366004611fcd565b610cbb565b6102dc610446366004611fcd565b610f83565b61023f600c5481565b5f5461030c906001600160a01b031681565b61023f61119a565b6102dc61047c366004611fab565b6111e1565b6102dc611214565b6102dc610497366004612023565b61159f565b61023f61175f565b6102dc6104b2366004612060565b6117a6565b6103f16104c5366004611fab565b60086020525f908152604090208054600182015460029092015490919083565b6102dc6118c5565b6102dc6104fb366004611fab565b6118dd565b5f8061050a611953565b6040015190505f61051a846119c7565b6040908101516001600160a01b0386165f908152600860205291909120600101549091506105859061057f670de0b6b3a764000061057961055b8787611a53565b6001600160a01b038a165f9081526002602052604090205490611a67565b90611a72565b90611a7d565b949350505050565b6007546040805163900cf0cf60e01b815290515f926001600160a01b03169163900cf0cf9160048083019260209291908290030181865afa1580156105d4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105f89190612089565b600b546001600160a01b0384165f9081526008602052604090206002015461061f91611a7d565b111592915050565b6007546040805163900cf0cf60e01b815290515f926001600160a01b03169163900cf0cf9160048083019260209291908290030181865afa15801561066e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106929190612089565b600c546001600160a01b0384165f9081526008602052604090206002015461061f91611a7d565b6007546040805163900cf0cf60e01b815290515f926001600160a01b03169163900cf0cf9160048083019260209291908290030181865afa158015610700573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107249190612089565b600a546001600160a01b0384165f9081526008602052604090206002015461061f91611a7d565b610753611a88565b61075c81611ae2565b50565b6005546001600160a01b031633146107925760405162461bcd60e51b8152600401610789906120a0565b60405180910390fd5b61079a610bce565b565b435f90815260036020908152604080832032845290915290205460ff16156107d65760405162461bcd60e51b8152600401610789906120e4565b435f90815260036020908152604080832033845290915290205460ff16156108105760405162461bcd60e51b8152600401610789906120e4565b335f908152600260205260408120541161087a5760405162461bcd60e51b815260206004820152602560248201527f4d61736f6e72793a20546865206d61736f6e5573657220646f6573206e6f7420604482015264195e1a5cdd60da1b6064820152608401610789565b338015610909576001600160a01b0381165f9081526008602090815260409182902082516060810184528154815260018201549281019290925260020154918101919091526108c882610500565b60208201526108d5610ac7565b81526001600160a01b0382165f90815260086020908152604091829020835181559083015160018201559101516002909101555b5f82116109585760405162461bcd60e51b815260206004820152601a60248201527f4d61736f6e72793a2043616e6e6f7420776974686472617720300000000000006044820152606401610789565b60075f9054906101000a90046001600160a01b03166001600160a01b031663900cf0cf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109a8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109cc9190612089565b600a54335f908152600860205260409020600201546109ea91611a7d565b1115610a425760405162461bcd60e51b815260206004820152602160248201527f4d61736f6e72793a207374696c6c20696e207769746864726177206c6f636b756044820152600760fc1b6064820152608401610789565b610a4a611214565b610a5382611ba5565b60405182815233907f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5906020015b60405180910390a25050435f9081526003602090815260408083203284529091528082208054600160ff1991821681179092553384529190922080549091169091179055565b6009545f90610ad7906001611a53565b905090565b5f610ae5611953565b60400151905090565b6005546001600160a01b03163314610b185760405162461bcd60e51b8152600401610789906120a0565b6006546001600160a01b0390811690841603610b5f5760405162461bcd60e51b815260040161078990602080825260049082015263189a5b1b60e21b604082015260600190565b5f546001600160a01b0390811690841603610ba45760405162461bcd60e51b8152602060048201526005602482015264736861726560d81b6044820152606401610789565b610bb86001600160a01b0384168284611c61565b505050565b610bc5611a88565b61079a5f611cc4565b610bd6611a88565b6005546040515f916001600160a01b0316907f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed908390a3600580546001600160a01b0319169055565b60098181548110610c2e575f80fd5b5f91825260209091206003909102018054600182015460029092015490925083565b6007546040805163900cf0cf60e01b815290515f926001600160a01b03169163900cf0cf9160048083019260209291908290030181865afa158015610c97573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ad79190612089565b435f90815260036020908152604080832032845290915290205460ff1615610cf55760405162461bcd60e51b8152600401610789906120e4565b435f90815260036020908152604080832033845290915290205460ff1615610d2f5760405162461bcd60e51b8152600401610789906120e4565b6005546001600160a01b03163314610d595760405162461bcd60e51b8152600401610789906120a0565b5f8111610da85760405162461bcd60e51b815260206004820152601a60248201527f4d61736f6e72793a2043616e6e6f7420616c6c6f6361746520300000000000006044820152606401610789565b5f610db260015490565b11610e165760405162461bcd60e51b815260206004820152602e60248201527f4d61736f6e72793a2043616e6e6f7420616c6c6f63617465207768656e20746f60448201526d074616c537570706c7920697320360941b6064820152608401610789565b5f610e1f611953565b6040015190505f610e4e610e47610e3560015490565b61057986670de0b6b3a7640000611a67565b8390611a7d565b6040805160608101825243815260208101868152918101838152600980546001810182555f9190915282517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af60039092029182015592517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b0840155517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b19092019190915560065491925090610f0e906001600160a01b0316333087611d15565b60405184815233907fac24935fd910bc682b5ccb1a07b718cadf8cf2f6d1404c4f3ddc3662dae40e299060200160405180910390a25050435f9081526003602090815260408083203284529091528082208054600160ff19918216811790925533845291909220805490911690911790555050565b435f90815260036020908152604080832032845290915290205460ff1615610fbd5760405162461bcd60e51b8152600401610789906120e4565b435f90815260036020908152604080832033845290915290205460ff1615610ff75760405162461bcd60e51b8152600401610789906120e4565b338015611086576001600160a01b0381165f90815260086020908152604091829020825160608101845281548152600182015492810192909252600201549181019190915261104582610500565b6020820152611052610ac7565b81526001600160a01b0382165f90815260086020908152604091829020835181559083015160018201559101516002909101555b5f82116110d55760405162461bcd60e51b815260206004820152601760248201527f4d61736f6e72793a2043616e6e6f74207374616b6520300000000000000000006044820152606401610789565b6110de82611d53565b60075f9054906101000a90046001600160a01b03166001600160a01b031663900cf0cf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561112e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111529190612089565b335f81815260086020526040908190206002019290925590517f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d90610a819085815260200190565b6007546040805163559cf13d60e11b815290515f926001600160a01b03169163ab39e27a9160048083019260209291908290030181865afa158015610c97573d5f803e3d5ffd5b6005546001600160a01b0316331461120b5760405162461bcd60e51b8152600401610789906120a0565b61075c8161074b565b3380156112a3576001600160a01b0381165f90815260086020908152604091829020825160608101845281548152600182015492810192909252600201549181019190915261126282610500565b602082015261126f610ac7565b81526001600160a01b0382165f90815260086020908152604091829020835181559083015160018201559101516002909101555b335f90815260086020526040902060010154801561159b5760075f9054906101000a90046001600160a01b03166001600160a01b031663900cf0cf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561130b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061132f9190612089565b600b54335f9081526008602052604090206002015461134d91611a7d565b111561139b5760405162461bcd60e51b815260206004820152601f60248201527f4d61736f6e72793a207374696c6c20696e20726577617264206c6f636b7570006044820152606401610789565b6007546040805163900cf0cf60e01b815290515f926001600160a01b03169163900cf0cf9160048083019260209291908290030181865afa1580156113e2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114069190612089565b600c54335f9081526008602052604090206002015461142491611a7d565b1115905060075f9054906101000a90046001600160a01b03166001600160a01b031663900cf0cf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611478573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061149c9190612089565b335f9081526008602052604081206002810192909255600190910155801561155257600654604051630852cd8d60e31b8152600481018490526001600160a01b03909116906342966c68906024015f604051808303815f87803b158015611501575f80fd5b505af1158015611513573d5f803e3d5ffd5b50506040515f81523392507fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e048691506020015b60405180910390a2505050565b600654611569906001600160a01b03163384611c61565b60405182815233907fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e048690602001611545565b5050565b600554600160a01b900460ff16156115f95760405162461bcd60e51b815260206004820152601c60248201527f4d61736f6e72793a20616c726561647920696e697469616c697a6564000000006044820152606401610789565b6005546001600160a01b031633146116235760405162461bcd60e51b8152600401610789906120a0565b600680546001600160a01b038581166001600160a01b0319928316179092555f8054858416908316178155600780549385169390921692909217905560408051606081018252438082526020808301858152838501868152600980546001810182559752845160039097027f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af81019790975590517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b0870155517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b1909501949094556004600a556002600b556008600c556005805460ff60a01b1916600160a01b17905591519182529133917f25ff68dd81b34665b5ba7e553ee5511bf6812e12adb4a7e2c0d9e26b3099ce79910160405180910390a250505050565b600754604080516362cb3e1360e11b815290515f926001600160a01b03169163c5967c269160048083019260209291908290030181865afa158015610c97573d5f803e3d5ffd5b6005546001600160a01b031633146117d05760405162461bcd60e51b8152600401610789906120a0565b8183101580156117e1575060388311155b80156117ee575060388111155b6118465760405162461bcd60e51b815260206004820152602360248201527f5f77697468647261774c6f636b757045706f6368733a206f7574206f662072616044820152626e676560e81b6064820152608401610789565b5f8311801561185457505f82115b801561185f57505f81115b6118b75760405162461bcd60e51b815260206004820152602360248201527f6c6f636b757045706f636873206d75737420626520677265617465722074686160448201526206e20360ec1b6064820152608401610789565b600a92909255600b55600c55565b335f9081526002602052604090205461079a9061079c565b6118e5611a88565b6001600160a01b03811661194a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610789565b61075c81611cc4565b61197460405180606001604052805f81526020015f81526020015f81525090565b600961197e610ac7565b8154811061198e5761198e61212a565b905f5260205f2090600302016040518060600160405290815f820154815260200160018201548152602001600282015481525050905090565b6119e860405180606001604052805f81526020015f81526020015f81525090565b6009611a08836001600160a01b03165f9081526008602052604090205490565b81548110611a1857611a1861212a565b905f5260205f2090600302016040518060600160405290815f8201548152602001600182015481526020016002820154815250509050919050565b5f611a5e8284612152565b90505b92915050565b5f611a5e8284612165565b5f611a5e828461217c565b5f611a5e828461219b565b6004546001600160a01b0316331461079a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610789565b6001600160a01b038116611b4e5760405162461bcd60e51b815260206004820152602d60248201527f6f70657261746f723a207a65726f206164647265737320676976656e20666f7260448201526c103732bb9037b832b930ba37b960991b6064820152608401610789565b6040516001600160a01b038216905f907f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed908290a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b335f9081526002602052604090205481811015611c215760405162461bcd60e51b815260206004820152603460248201527f4d61736f6e72793a2077697468647261772072657175657374206772656174656044820152731c881d1a185b881cdd185ad95908185b5bdd5b9d60621b6064820152608401610789565b600154611c2e9083611a53565b600155611c3b8183611a53565b335f81815260026020526040812092909255905461159b916001600160a01b0390911690845b6040516001600160a01b038316602482015260448101829052610bb890849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611da7565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6040516001600160a01b0380851660248301528316604482015260648101829052611d4d9085906323b872dd60e01b90608401611c8d565b50505050565b600154611d609082611a7d565b600155335f90815260026020526040902054611d7c9082611a7d565b335f81815260026020526040812092909255905461075c916001600160a01b03909116903084611d15565b5f611dfb826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611e7a9092919063ffffffff16565b905080515f1480611e1b575080806020019051810190611e1b91906121ae565b610bb85760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610789565b606061058584845f85855f80866001600160a01b03168587604051611e9f91906121cd565b5f6040518083038185875af1925050503d805f8114611ed9576040519150601f19603f3d011682016040523d82523d5f602084013e611ede565b606091505b5091509150611eef87838387611efa565b979650505050505050565b60608315611f685782515f03611f61576001600160a01b0385163b611f615760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610789565b5081610585565b6105858383815115611f7d5781518083602001fd5b8060405162461bcd60e51b815260040161078991906121e3565b6001600160a01b038116811461075c575f80fd5b5f60208284031215611fbb575f80fd5b8135611fc681611f97565b9392505050565b5f60208284031215611fdd575f80fd5b5035919050565b5f805f60608486031215611ff6575f80fd5b833561200181611f97565b925060208401359150604084013561201881611f97565b809150509250925092565b5f805f60608486031215612035575f80fd5b833561204081611f97565b9250602084013561205081611f97565b9150604084013561201881611f97565b5f805f60608486031215612072575f80fd5b505081359360208301359350604090920135919050565b5f60208284031215612099575f80fd5b5051919050565b60208082526024908201527f6f70657261746f723a2063616c6c6572206973206e6f7420746865206f70657260408201526330ba37b960e11b606082015260800190565b60208082526026908201527f436f6e747261637447756172643a206f6e6520626c6f636b2c206f6e652066756040820152653731ba34b7b760d11b606082015260800190565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b81810381811115611a6157611a6161213e565b8082028115828204841417611a6157611a6161213e565b5f8261219657634e487b7160e01b5f52601260045260245ffd5b500490565b80820180821115611a6157611a6161213e565b5f602082840312156121be575f80fd5b81518015158114611fc6575f80fd5b5f82518060208501845e5f920191825250919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f8301168401019150509291505056fea26469706673582212205fdd1985eeb6cef6f3a2ecc44bff81cb7977c28625e62ba0de2b70bb26b41dcb64736f6c634300081a0033
Deployed Bytecode Sourcemap
36670:8506:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42043:328;;;;;;:::i;:::-;;:::i;:::-;;;548:25:1;;;536:2;521:18;42043:328:0;;;;;;;;37452:33;;;;;;41083:175;;;;;;:::i;:::-;;:::i;:::-;;;749:14:1;;742:22;724:41;;712:2;697:18;41083:175:0;584:187:1;41266:265:0;;;;;;:::i;:::-;;:::i;37213:31::-;;;;;-1:-1:-1;;;37213:31:0;;;;;;35822:91;35893:12;;35822:91;;40901:174;;;;;;:::i;:::-;;:::i;37410:35::-;;;;;;33598:115;;;;;;:::i;:::-;;:::i;:::-;;39468:88;;;:::i;42742:411::-;;;;;;:::i;:::-;;:::i;37253:18::-;;;;;-1:-1:-1;;;;;37253:18:0;;;;;;-1:-1:-1;;;;;1185:32:1;;;1167:51;;1155:2;1140:18;37253::0;1007:217:1;40305:115:0;;;:::i;33490:100::-;33573:9;;-1:-1:-1;;;;;33573:9:0;682:10;33557:25;33490:100;;41919:116;;;:::i;44848:325::-;;;;;;:::i;:::-;;:::i;33262:85::-;33330:9;;-1:-1:-1;;;;;33330:9:0;33262:85;;37278:25;;;;;-1:-1:-1;;;;;37278:25:0;;;35921:110;;;;;;:::i;:::-;-1:-1:-1;;;;;36005:18:0;35978:7;36005:18;;;:9;:18;;;;;;;35921:110;40575:142;;;;;;:::i;:::-;-1:-1:-1;;;;;40674:17:0;40647:7;40674:17;;;:6;:17;;;;;:35;;40575:142;32144:103;;;:::i;33986:145::-;;;:::i;37362:39::-;;;;;;:::i;:::-;;:::i;:::-;;;;2392:25:1;;;2448:2;2433:18;;2426:34;;;;2476:18;;;2469:34;2380:2;2365:18;37362:39:0;2190:319:1;31503:87:0;31576:6;;-1:-1:-1;;;;;31576:6:0;31503:87;;41539:91;;;:::i;44080:760::-;;;;;;:::i;:::-;;:::i;42433:301::-;;;;;;:::i;:::-;;:::i;37492:37::-;;;;;;35705:19;;;;;-1:-1:-1;;;;;35705:19:0;;;41755:105;;;:::i;39352:108::-;;;;;;:::i;:::-;;:::i;43244:828::-;;;:::i;38563:781::-;;;;;;:::i;:::-;;:::i;41638:109::-;;;:::i;39564:629::-;;;;;;:::i;:::-;;:::i;37312:43::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;43161:75;;;:::i;32402:201::-;;;;;;:::i;:::-;;:::i;42043:328::-;42099:7;42119:17;42139:19;:17;:19::i;:::-;:34;;;42119:54;;42184:17;42204:28;42222:9;42204:17;:28::i;:::-;:43;;;;;-1:-1:-1;;;;;42332:17:0;;;;;;:6;:17;;;;;;:30;;;42204:43;;-1:-1:-1;42267:96:0;;:60;42322:4;42267:50;42292:24;:9;42204:43;42292:13;:24::i;:::-;-1:-1:-1;;;;;36005:18:0;;35978:7;36005:18;;;:9;:18;;;;;;42267:24;;:50::i;:::-;:54;;:60::i;:::-;:64;;:96::i;:::-;42260:103;42043:328;-1:-1:-1;;;;42043:328:0:o;41083:175::-;41234:8;;:16;;;-1:-1:-1;;;41234:16:0;;;;41149:4;;-1:-1:-1;;;;;41234:8:0;;:14;;:16;;;;;;;;;;;;;;:8;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41211:18;;-1:-1:-1;;;;;41173:17:0;;;;;;:6;:17;;;;;:33;;;:57;;:37;:57::i;:::-;:77;;;41083:175;-1:-1:-1;;41083:175:0:o;41266:265::-;41426:8;;:16;;;-1:-1:-1;;;41426:16:0;;;;41337:4;;-1:-1:-1;;;;;41426:8:0;;:14;;:16;;;;;;;;;;;;;;:8;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41399:22;;-1:-1:-1;;;;;41361:17:0;;;;;;:6;:17;;;;;:33;;;:61;;:37;:61::i;40901:174::-;41051:8;;:16;;;-1:-1:-1;;;41051:16:0;;;;40964:4;;-1:-1:-1;;;;;41051:8:0;;:14;;:16;;;;;;;;;;;;;;:8;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41026:20;;-1:-1:-1;;;;;40988:17:0;;;;;;:6;:17;;;;;:33;;;:59;;:37;:59::i;33598:115::-;31389:13;:11;:13::i;:::-;33674:31:::1;33692:12;33674:17;:31::i;:::-;33598:115:::0;:::o;39468:88::-;33398:9;;-1:-1:-1;;;;;33398:9:0;33411:10;33398:23;33390:72;;;;-1:-1:-1;;;33390:72:0;;;;;;;:::i;:::-;;;;;;;;;39529:19:::1;:17;:19::i;:::-;39468:88::o:0;42742:411::-;35096:12;35064:4;35088:21;;;:7;:21;;;;;;;;35110:9;35088:32;;;;;;;;;;35313:29;35305:80;;;;-1:-1:-1;;;35305:80:0;;;;;;;:::i;:::-;35229:12;35197:4;35221:21;;;:7;:21;;;;;;;;35243:10;35221:33;;;;;;;;;;35404:29;35396:80;;;;-1:-1:-1;;;35396:80:0;;;;;;;:::i;:::-;37988:10:::1;38002:1;36005:18:::0;;;:9;:18;;;;;;37978:25:::1;37970:75;;;::::0;-1:-1:-1;;;37970:75:0;;4768:2:1;37970:75:0::1;::::0;::::1;4750:21:1::0;4807:2;4787:18;;;4780:30;4846:34;4826:18;;;4819:62;-1:-1:-1;;;4897:18:1;;;4890:35;4942:19;;37970:75:0::1;4566:401:1::0;37970:75:0::1;42834:10:::2;38129:23:::0;;38125:249:::2;;-1:-1:-1::0;;;;;38193:17:0;::::2;38169:21;38193:17:::0;;;:6:::2;:17;::::0;;;;;;;;38169:41;;::::2;::::0;::::2;::::0;;;;;;::::2;::::0;::::2;::::0;;;::::2;::::0;;;;::::2;;::::0;;;;;;;;38245:17:::2;38200:9:::0;38245:6:::2;:17::i;:::-;38225;::::0;::::2;:37:::0;38302:21:::2;:19;:21::i;:::-;38277:46:::0;;-1:-1:-1;;;;;38338:17:0;::::2;38277:22;38338:17:::0;;;:6:::2;:17;::::0;;;;;;;;:24;;;;;;::::2;::::0;::::2;::::0;::::2;::::0;;::::2;::::0;::::2;::::0;;::::2;::::0;38125:249:::2;42874:1:::3;42865:6;:10;42857:49;;;::::0;-1:-1:-1;;;42857:49:0;;5174:2:1;42857:49:0::3;::::0;::::3;5156:21:1::0;5213:2;5193:18;;;5186:30;5252:28;5232:18;;;5225:56;5298:18;;42857:49:0::3;4972:350:1::0;42857:49:0::3;42989:8;;;;;;;;;-1:-1:-1::0;;;;;42989:8:0::3;-1:-1:-1::0;;;;;42989:14:0::3;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42964:20;::::0;42932:10:::3;42925:18;::::0;;;:6:::3;:18;::::0;;;;:34:::3;;::::0;:60:::3;::::0;:38:::3;:60::i;:::-;:80;;42917:126;;;::::0;-1:-1:-1;;;42917:126:0;;5529:2:1;42917:126:0::3;::::0;::::3;5511:21:1::0;5568:2;5548:18;;;5541:30;5607:34;5587:18;;;5580:62;-1:-1:-1;;;5658:18:1;;;5651:31;5699:19;;42917:126:0::3;5327:397:1::0;42917:126:0::3;43054:13;:11;:13::i;:::-;43078:22;43093:6;43078:14;:22::i;:::-;43116:29;::::0;548:25:1;;;43126:10:0::3;::::0;43116:29:::3;::::0;536:2:1;521:18;43116:29:0::3;;;;;;;;-1:-1:-1::0;;35511:12:0;35503:21;;;;:7;:21;;;;;;;;35525:9;35503:32;;;;;;;;:39;;35538:4;-1:-1:-1;;35503:39:0;;;;;;;;35575:10;35553:33;;;;;;:40;;;;;;;;;;42742:411::o;40305:115::-;40384:14;:21;40357:7;;40384:28;;40410:1;40384:25;:28::i;:::-;40377:35;;40305:115;:::o;41919:116::-;41966:7;41993:19;:17;:19::i;:::-;:34;;;41986:41;;41919:116;:::o;44848:325::-;33398:9;;-1:-1:-1;;;;;33398:9:0;33411:10;33398:23;33390:72;;;;-1:-1:-1;;;33390:72:0;;;;;;;:::i;:::-;45045:4:::1;::::0;-1:-1:-1;;;;;45045:4:0;;::::1;45018:32:::0;;::::1;::::0;45010:49:::1;;;;-1:-1:-1::0;;;45010:49:0::1;;;;;;5931:2:1::0;5913:21;;;5970:1;5950:18;;;5943:29;-1:-1:-1;;;6003:2:1;5988:18;;5981:34;6047:2;6032:18;;5729:327;45010:49:0::1;45105:5;::::0;-1:-1:-1;;;;;45105:5:0;;::::1;45078:33:::0;;::::1;::::0;45070:51:::1;;;::::0;-1:-1:-1;;;45070:51:0;;6263:2:1;45070:51:0::1;::::0;::::1;6245:21:1::0;6302:1;6282:18;;;6275:29;-1:-1:-1;;;6320:18:1;;;6313:35;6365:18;;45070:51:0::1;6061:328:1::0;45070:51:0::1;45132:33;-1:-1:-1::0;;;;;45132:19:0;::::1;45152:3:::0;45157:7;45132:19:::1;:33::i;:::-;44848:325:::0;;;:::o;32144:103::-;31389:13;:11;:13::i;:::-;32209:30:::1;32236:1;32209:18;:30::i;33986:145::-:0;31389:13;:11;:13::i;:::-;34068:9:::1;::::0;34048:42:::1;::::0;34087:1:::1;::::0;-1:-1:-1;;;;;34068:9:0::1;::::0;34048:42:::1;::::0;34087:1;;34048:42:::1;34101:9;:22:::0;;-1:-1:-1;;;;;;34101:22:0::1;::::0;;33986:145::o;37362:39::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37362:39:0;:::o;41539:91::-;41606:8;;:16;;;-1:-1:-1;;;41606:16:0;;;;41579:7;;-1:-1:-1;;;;;41606:8:0;;:14;;:16;;;;;;;;;;;;;;:8;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;44080:760::-;35096:12;35064:4;35088:21;;;:7;:21;;;;;;;;35110:9;35088:32;;;;;;;;;;35313:29;35305:80;;;;-1:-1:-1;;;35305:80:0;;;;;;;:::i;:::-;35229:12;35197:4;35221:21;;;:7;:21;;;;;;;;35243:10;35221:33;;;;;;;;;;35404:29;35396:80;;;;-1:-1:-1;;;35396:80:0;;;;;;;:::i;:::-;33398:9:::1;::::0;-1:-1:-1;;;;;33398:9:0::1;33411:10;33398:23;33390:72;;;;-1:-1:-1::0;;;33390:72:0::1;;;;;;;:::i;:::-;44188:1:::2;44179:6;:10;44171:49;;;::::0;-1:-1:-1;;;44171:49:0;;6596:2:1;44171:49:0::2;::::0;::::2;6578:21:1::0;6635:2;6615:18;;;6608:30;6674:28;6654:18;;;6647:56;6720:18;;44171:49:0::2;6394:350:1::0;44171:49:0::2;44255:1;44239:13;35893:12:::0;;;35822:91;44239:13:::2;:17;44231:76;;;::::0;-1:-1:-1;;;44231:76:0;;6951:2:1;44231:76:0::2;::::0;::::2;6933:21:1::0;6990:2;6970:18;;;6963:30;7029:34;7009:18;;;7002:62;-1:-1:-1;;;7080:18:1;;;7073:44;7134:19;;44231:76:0::2;6749:410:1::0;44231:76:0::2;44358:15;44376:19;:17;:19::i;:::-;:34;;;44358:52;;44421:15;44439:48;44451:35;44472:13;35893:12:::0;;;35822:91;44472:13:::2;44451:16;:6:::0;44462:4:::2;44451:10;:16::i;:35::-;44439:7:::0;;:11:::2;:48::i;:::-;44537:136;::::0;;::::2;::::0;::::2;::::0;;44574:12:::2;44537:136:::0;;::::2;::::0;::::2;::::0;;;;;;;;;44684:14:::2;:32:::0;;::::2;::::0;::::2;::::0;;-1:-1:-1;44684:32:0;;;;;;;::::2;::::0;;::::2;::::0;;::::2;::::0;;;;;;;;;;;;;;;;44729:4:::2;::::0;44537:136;;-1:-1:-1;44537:136:0;44729:56:::2;::::0;-1:-1:-1;;;;;44729:4:0::2;44751:10;44771:4;44537:136:::0;44729:21:::2;:56::i;:::-;44801:31;::::0;548:25:1;;;44813:10:0::2;::::0;44801:31:::2;::::0;536:2:1;521:18;44801:31:0::2;;;;;;;-1:-1:-1::0;;35511:12:0;35503:21;;;;:7;:21;;;;;;;;35525:9;35503:32;;;;;;;;:39;;35538:4;-1:-1:-1;;35503:39:0;;;;;;;;35575:10;35553:33;;;;;;:40;;;;;;;;;;-1:-1:-1;;44080:760:0:o;42433:301::-;35096:12;35064:4;35088:21;;;:7;:21;;;;;;;;35110:9;35088:32;;;;;;;;;;35313:29;35305:80;;;;-1:-1:-1;;;35305:80:0;;;;;;;:::i;:::-;35229:12;35197:4;35221:21;;;:7;:21;;;;;;;;35243:10;35221:33;;;;;;;;;;35404:29;35396:80;;;;-1:-1:-1;;;35396:80:0;;;;;;;:::i;:::-;42506:10:::1;38129:23:::0;;38125:249:::1;;-1:-1:-1::0;;;;;38193:17:0;::::1;38169:21;38193:17:::0;;;:6:::1;:17;::::0;;;;;;;;38169:41;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;;::::1;;::::0;;;;;;;;38245:17:::1;38200:9:::0;38245:6:::1;:17::i;:::-;38225;::::0;::::1;:37:::0;38302:21:::1;:19;:21::i;:::-;38277:46:::0;;-1:-1:-1;;;;;38338:17:0;::::1;38277:22;38338:17:::0;;;:6:::1;:17;::::0;;;;;;;;:24;;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;38125:249:::1;42546:1:::2;42537:6;:10;42529:46;;;::::0;-1:-1:-1;;;42529:46:0;;7366:2:1;42529:46:0::2;::::0;::::2;7348:21:1::0;7405:2;7385:18;;;7378:30;7444:25;7424:18;;;7417:53;7487:18;;42529:46:0::2;7164:347:1::0;42529:46:0::2;42586:19;42598:6;42586:11;:19::i;:::-;42653:8;;;;;;;;;-1:-1:-1::0;;;;;42653:8:0::2;-1:-1:-1::0;;;;;42653:14:0::2;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42623:10;42616:18;::::0;;;:6:::2;:18;::::0;;;;;;:34:::2;;:53:::0;;;;42700:26;;::::2;::::0;::::2;::::0;42719:6;548:25:1;;536:2;521:18;;402:177;41755:105:0;41829:8;;:23;;;-1:-1:-1;;;41829:23:0;;;;41802:7;;-1:-1:-1;;;;;41829:8:0;;:21;;:23;;;;;;;;;;;;;;:8;:23;;;;;;;;;;;;;;39352:108;33398:9;;-1:-1:-1;;;;;33398:9:0;33411:10;33398:23;33390:72;;;;-1:-1:-1;;;33390:72:0;;;;;;;:::i;:::-;39425:27:::1;39442:9;39425:16;:27::i;43244:828::-:0;43287:10;38129:23;;38125:249;;-1:-1:-1;;;;;38193:17:0;;38169:21;38193:17;;;:6;:17;;;;;;;;;38169:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38245:17;38200:9;38245:6;:17::i;:::-;38225;;;:37;38302:21;:19;:21::i;:::-;38277:46;;-1:-1:-1;;;;;38338:17:0;;38277:22;38338:17;;;:6;:17;;;;;;;;;:24;;;;;;;;;;;;;;;;;;;;38125:249;43334:10:::1;43310:14;43327:18:::0;;;:6:::1;:18;::::0;;;;:31:::1;;::::0;43373:10;;43369:696:::1;;43470:8;;;;;;;;;-1:-1:-1::0;;;;;43470:8:0::1;-1:-1:-1::0;;;;;43470:14:0::1;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43447:18;::::0;43415:10:::1;43408:18;::::0;;;:6:::1;:18;::::0;;;;:34:::1;;::::0;:58:::1;::::0;:38:::1;:58::i;:::-;:78;;43400:122;;;::::0;-1:-1:-1;;;43400:122:0;;7718:2:1;43400:122:0::1;::::0;::::1;7700:21:1::0;7757:2;7737:18;;;7730:30;7796:33;7776:18;;;7769:61;7847:18;;43400:122:0::1;7516:355:1::0;43400:122:0::1;43619:8;::::0;:16:::1;::::0;;-1:-1:-1;;;43619:16:0;;;;43537:13:::1;::::0;-1:-1:-1;;;;;43619:8:0::1;::::0;:14:::1;::::0;:16:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:8;:16:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43592:22;::::0;43560:10:::1;43553:18;::::0;;;:6:::1;:18;::::0;;;;:34:::1;;::::0;:62:::1;::::0;:38:::1;:62::i;:::-;:82;;43537:98;;43687:8;;;;;;;;;-1:-1:-1::0;;;;;43687:8:0::1;-1:-1:-1::0;;;;;43687:14:0::1;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43657:10;43650:18;::::0;;;:6:::1;:18;::::0;;;;:34:::1;::::0;::::1;:53:::0;;;;43733:31:::1;::::0;;::::1;:35:::0;43785:269;::::1;;;43838:4;::::0;43818:39:::1;::::0;-1:-1:-1;;;43818:39:0;;::::1;::::0;::::1;548:25:1::0;;;-1:-1:-1;;;;;43838:4:0;;::::1;::::0;43818:31:::1;::::0;521:18:1;;43818:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;43881:25:0::1;::::0;43904:1:::1;548:25:1::0;;43892:10:0::1;::::0;-1:-1:-1;43881:25:0::1;::::0;-1:-1:-1;536:2:1;521:18;43881:25:0::1;;;;;;;;44848:325:::0;;;:::o;43785:269::-:1;43947:4;::::0;:37:::1;::::0;-1:-1:-1;;;;;43947:4:0::1;43965:10;43977:6:::0;43947:17:::1;:37::i;:::-;44008:30;::::0;548:25:1;;;44019:10:0::1;::::0;44008:30:::1;::::0;536:2:1;521:18;44008:30:0::1;402:177:1::0;43369:696:0::1;43299:773;43244:828:::0;:::o;38563:781::-;38445:11;;-1:-1:-1;;;38445:11:0;;;;38444:12;38436:53;;;;-1:-1:-1;;;38436:53:0;;8268:2:1;38436:53:0;;;8250:21:1;8307:2;8287:18;;;8280:30;8346;8326:18;;;8319:58;8394:18;;38436:53:0;8066:352:1;38436:53:0;33398:9:::1;::::0;-1:-1:-1;;;;;33398:9:0::1;33411:10;33398:23;33390:72;;;;-1:-1:-1::0;;;33390:72:0::1;;;;;;;:::i;:::-;38713:4:::2;:12:::0;;-1:-1:-1;;;;;38713:12:0;;::::2;-1:-1:-1::0;;;;;;38713:12:0;;::::2;;::::0;;;-1:-1:-1;38736:14:0;;;;::::2;::::0;;::::2;;::::0;;38761:8:::2;:20:::0;;;;::::2;::::0;;;::::2;::::0;;;::::2;::::0;;38835:78:::2;::::0;;::::2;::::0;::::2;::::0;;38859:12:::2;38835:78:::0;;;::::2;::::0;;::::2;::::0;;;;;;;;;38924:14:::2;:36:::0;;-1:-1:-1;38924:36:0;::::2;::::0;;;;;;::::2;::::0;;::::2;::::0;;::::2;::::0;;;;;;;;;;;;;;;;;;;38996:1:::2;38973:20;:24:::0;38924:36:::2;39059:18;:22:::0;39171:1:::2;39146:22;:26:::0;39265:11:::2;:18:::0;;-1:-1:-1;;;;39265:18:0::2;-1:-1:-1::0;;;39265:18:0::2;::::0;;39299:37;;548:25:1;;;38835:78:0;39311:10:::2;::::0;39299:37:::2;::::0;521:18:1;39299:37:0::2;;;;;;;38702:642;38563:781:::0;;;:::o;41638:109::-;41714:8;;:25;;;-1:-1:-1;;;41714:25:0;;;;41687:7;;-1:-1:-1;;;;;41714:8:0;;:23;;:25;;;;;;;;;;;;;;:8;:25;;;;;;;;;;;;;;39564:629;33398:9;;-1:-1:-1;;;;;33398:9:0;33411:10;33398:23;33390:72;;;;-1:-1:-1;;;33390:72:0;;;;;;;:::i;:::-;39742:19:::1;39717:21;:44;;:75;;;;;39790:2;39765:21;:27;;39717:75;:108;;;;;39823:2;39796:23;:29;;39717:108;39709:156;;;::::0;-1:-1:-1;;;39709:156:0;;8625:2:1;39709:156:0::1;::::0;::::1;8607:21:1::0;8664:2;8644:18;;;8637:30;8703:34;8683:18;;;8676:62;-1:-1:-1;;;8754:18:1;;;8747:33;8797:19;;39709:156:0::1;8423:399:1::0;39709:156:0::1;39921:1;39897:21;:25;:52;;;;;39948:1;39926:19;:23;39897:52;:83;;;;;39979:1;39953:23;:27;39897:83;39889:131;;;::::0;-1:-1:-1;;;39889:131:0;;9029:2:1;39889:131:0::1;::::0;::::1;9011:21:1::0;9068:2;9048:18;;;9041:30;9107:34;9087:18;;;9080:62;-1:-1:-1;;;9158:18:1;;;9151:33;9201:19;;39889:131:0::1;8827:399:1::0;39889:131:0::1;40031:20;:44:::0;;;;40086:18:::1;:40:::0;40137:22:::1;:48:::0;39564:629::o;43161:75::-;43216:10;35978:7;36005:18;;;:9;:18;;;;;;43197:31;;42742:411;:::i;32402:201::-;31389:13;:11;:13::i;:::-;-1:-1:-1;;;;;32491:22:0;::::1;32483:73;;;::::0;-1:-1:-1;;;32483:73:0;;9433:2:1;32483:73:0::1;::::0;::::1;9415:21:1::0;9472:2;9452:18;;;9445:30;9511:34;9491:18;;;9484:62;-1:-1:-1;;;9562:18:1;;;9555:36;9608:19;;32483:73:0::1;9231:402:1::0;32483:73:0::1;32567:28;32586:8;32567:18;:28::i;40428:139::-:0;40480:22;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;40480:22:0;40522:14;40537:21;:19;:21::i;:::-;40522:37;;;;;;;;:::i;:::-;;;;;;;;;;;40515:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40428:139;:::o;40725:168::-;40794:22;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;40794:22:0;40836:14;40851:33;40874:9;-1:-1:-1;;;;;40674:17:0;40647:7;40674:17;;;:6;:17;;;;;:35;;40575:142;40851:33;40836:49;;;;;;;;:::i;:::-;;;;;;;;;;;40829:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40725:168;;;:::o;4014:98::-;4072:7;4099:5;4103:1;4099;:5;:::i;:::-;4092:12;;4014:98;;;;;:::o;4371:::-;4429:7;4456:5;4460:1;4456;:5;:::i;4770:98::-;4828:7;4855:5;4859:1;4855;:5;:::i;3633:98::-;3691:7;3718:5;3722:1;3718;:5;:::i;31668:132::-;31576:6;;-1:-1:-1;;;;;31576:6:0;682:10;31732:23;31724:68;;;;-1:-1:-1;;;31724:68:0;;10762:2:1;31724:68:0;;;10744:21:1;;;10781:18;;;10774:30;10840:34;10820:18;;;10813:62;10892:18;;31724:68:0;10560:356:1;33721:257:0;-1:-1:-1;;;;;33798:26:0;;33790:84;;;;-1:-1:-1;;;33790:84:0;;11123:2:1;33790:84:0;;;11105:21:1;11162:2;11142:18;;;11135:30;11201:34;11181:18;;;11174:62;-1:-1:-1;;;11252:18:1;;;11245:43;11305:19;;33790:84:0;10921:409:1;33790:84:0;33890:45;;-1:-1:-1;;;;;33890:45:0;;;33918:1;;33890:45;;33918:1;;33890:45;33946:9;:24;;-1:-1:-1;;;;;;33946:24:0;-1:-1:-1;;;;;33946:24:0;;;;;;;;;;33721:257::o;36287:374::-;36382:10;36347:22;36372:21;;;:9;:21;;;;;;36412:24;;;;36404:89;;;;-1:-1:-1;;;36404:89:0;;11537:2:1;36404:89:0;;;11519:21:1;11576:2;11556:18;;;11549:30;11615:34;11595:18;;;11588:62;-1:-1:-1;;;11666:18:1;;;11659:50;11726:19;;36404:89:0;11335:416:1;36404:89:0;36519:12;;:24;;36536:6;36519:16;:24::i;:::-;36504:12;:39;36578:26;:14;36597:6;36578:18;:26::i;:::-;36564:10;36554:21;;;;:9;:21;;;;;:50;;;;36615:5;;:38;;-1:-1:-1;;;;;36615:5:0;;;;36646:6;24311:177;24421:58;;-1:-1:-1;;;;;11948:32:1;;24421:58:0;;;11930:51:1;11997:18;;;11990:34;;;24394:86:0;;24414:5;;-1:-1:-1;;;24444:23:0;11903:18:1;;24421:58:0;;;;-1:-1:-1;;24421:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;24421:58:0;-1:-1:-1;;;;;;24421:58:0;;;;;;;;;;24394:19;:86::i;32763:191::-;32856:6;;;-1:-1:-1;;;;;32873:17:0;;;-1:-1:-1;;;;;;32873:17:0;;;;;;;32906:40;;32856:6;;;32873:17;32856:6;;32906:40;;32837:16;;32906:40;32826:128;32763:191;:::o;24733:205::-;24861:68;;-1:-1:-1;;;;;12255:32:1;;;24861:68:0;;;12237:51:1;12324:32;;12304:18;;;12297:60;12373:18;;;12366:34;;;24834:96:0;;24854:5;;-1:-1:-1;;;24884:27:0;12210:18:1;;24861:68:0;12035:371:1;24834:96:0;24733:205;;;;:::o;36039:240::-;36111:12;;:24;;36128:6;36111:16;:24::i;:::-;36096:12;:39;36180:10;36170:21;;;;:9;:21;;;;;;:33;;36196:6;36170:25;:33::i;:::-;36156:10;36146:21;;;;:9;:21;;;;;:57;;;;36214:5;;:57;;-1:-1:-1;;;;;36214:5:0;;;;36257:4;36264:6;36214:22;:57::i;28657:649::-;29081:23;29107:69;29135:4;29107:69;;;;;;;;;;;;;;;;;29115:5;-1:-1:-1;;;;;29107:27:0;;;:69;;;;;:::i;:::-;29081:95;;29195:10;:17;29216:1;29195:22;:56;;;;29232:10;29221:30;;;;;;;;;;;;:::i;:::-;29187:111;;;;-1:-1:-1;;;29187:111:0;;12895:2:1;29187:111:0;;;12877:21:1;12934:2;12914:18;;;12907:30;12973:34;12953:18;;;12946:62;-1:-1:-1;;;13024:18:1;;;13017:40;13074:19;;29187:111:0;12693:406:1;18193:229:0;18330:12;18362:52;18384:6;18392:4;18398:1;18401:12;18330;19567;19581:23;19608:6;-1:-1:-1;;;;;19608:11:0;19627:5;19634:4;19608:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19566:73;;;;19657:69;19684:6;19692:7;19701:10;19713:12;19657:26;:69::i;:::-;19650:76;19279:455;-1:-1:-1;;;;;;;19279:455:0:o;21852:644::-;22037:12;22066:7;22062:427;;;22094:10;:17;22115:1;22094:22;22090:290;;-1:-1:-1;;;;;15733:19:0;;;22304:60;;;;-1:-1:-1;;;22304:60:0;;14019:2:1;22304:60:0;;;14001:21:1;14058:2;14038:18;;;14031:30;14097:31;14077:18;;;14070:59;14146:18;;22304:60:0;13817:353:1;22304:60:0;-1:-1:-1;22401:10:0;22394:17;;22062:427;22444:33;22452:10;22464:12;23199:17;;:21;23195:388;;23431:10;23425:17;23488:15;23475:10;23471:2;23467:19;23460:44;23195:388;23558:12;23551:20;;-1:-1:-1;;;23551:20:0;;;;;;;;:::i;14:131:1:-;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;150:247;209:6;262:2;250:9;241:7;237:23;233:32;230:52;;;278:1;275;268:12;230:52;317:9;304:23;336:31;361:5;336:31;:::i;:::-;386:5;150:247;-1:-1:-1;;;150:247:1:o;776:226::-;835:6;888:2;876:9;867:7;863:23;859:32;856:52;;;904:1;901;894:12;856:52;-1:-1:-1;949:23:1;;776:226;-1:-1:-1;776:226:1:o;1229:522::-;1320:6;1328;1336;1389:2;1377:9;1368:7;1364:23;1360:32;1357:52;;;1405:1;1402;1395:12;1357:52;1444:9;1431:23;1463:31;1488:5;1463:31;:::i;:::-;1513:5;-1:-1:-1;1591:2:1;1576:18;;1563:32;;-1:-1:-1;1673:2:1;1658:18;;1645:32;1686:33;1645:32;1686:33;:::i;:::-;1738:7;1728:17;;;1229:522;;;;;:::o;2514:575::-;2637:6;2645;2653;2706:2;2694:9;2685:7;2681:23;2677:32;2674:52;;;2722:1;2719;2712:12;2674:52;2761:9;2748:23;2780:31;2805:5;2780:31;:::i;:::-;2830:5;-1:-1:-1;2887:2:1;2872:18;;2859:32;2900:33;2859:32;2900:33;:::i;:::-;2952:7;-1:-1:-1;3011:2:1;2996:18;;2983:32;3024:33;2983:32;3024:33;:::i;3094:466::-;3171:6;3179;3187;3240:2;3228:9;3219:7;3215:23;3211:32;3208:52;;;3256:1;3253;3246:12;3208:52;-1:-1:-1;;3301:23:1;;;3421:2;3406:18;;3393:32;;-1:-1:-1;3524:2:1;3509:18;;;3496:32;;3094:466;-1:-1:-1;3094:466:1:o;3565:184::-;3635:6;3688:2;3676:9;3667:7;3663:23;3659:32;3656:52;;;3704:1;3701;3694:12;3656:52;-1:-1:-1;3727:16:1;;3565:184;-1:-1:-1;3565:184:1:o;3754:400::-;3956:2;3938:21;;;3995:2;3975:18;;;3968:30;4034:34;4029:2;4014:18;;4007:62;-1:-1:-1;;;4100:2:1;4085:18;;4078:34;4144:3;4129:19;;3754:400::o;4159:402::-;4361:2;4343:21;;;4400:2;4380:18;;;4373:30;4439:34;4434:2;4419:18;;4412:62;-1:-1:-1;;;4505:2:1;4490:18;;4483:36;4551:3;4536:19;;4159:402::o;9638:127::-;9699:10;9694:3;9690:20;9687:1;9680:31;9730:4;9727:1;9720:15;9754:4;9751:1;9744:15;9770:127;9831:10;9826:3;9822:20;9819:1;9812:31;9862:4;9859:1;9852:15;9886:4;9883:1;9876:15;9902:128;9969:9;;;9990:11;;;9987:37;;;10004:18;;:::i;10035:168::-;10108:9;;;10139;;10156:15;;;10150:22;;10136:37;10126:71;;10177:18;;:::i;10208:217::-;10248:1;10274;10264:132;;10318:10;10313:3;10309:20;10306:1;10299:31;10353:4;10350:1;10343:15;10381:4;10378:1;10371:15;10264:132;-1:-1:-1;10410:9:1;;10208:217::o;10430:125::-;10495:9;;;10516:10;;;10513:36;;;10529:18;;:::i;12411:277::-;12478:6;12531:2;12519:9;12510:7;12506:23;12502:32;12499:52;;;12547:1;12544;12537:12;12499:52;12579:9;12573:16;12632:5;12625:13;12618:21;12611:5;12608:32;12598:60;;12654:1;12651;12644:12;13511:301;13640:3;13678:6;13672:13;13724:6;13717:4;13709:6;13705:17;13700:3;13694:37;13786:1;13750:16;;13775:13;;;-1:-1:-1;13750:16:1;13511:301;-1:-1:-1;13511:301:1:o;14175:418::-;14324:2;14313:9;14306:21;14287:4;14356:6;14350:13;14399:6;14394:2;14383:9;14379:18;14372:34;14458:6;14453:2;14445:6;14441:15;14436:2;14425:9;14421:18;14415:50;14514:1;14509:2;14500:6;14489:9;14485:22;14481:31;14474:42;14584:2;14577;14573:7;14568:2;14560:6;14556:15;14552:29;14541:9;14537:45;14533:54;14525:62;;;14175:418;;;;:::o
Swarm Source
ipfs://5fdd1985eeb6cef6f3a2ecc44bff81cb7977c28625e62ba0de2b70bb26b41dcb
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 35 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.