ERC-20
Overview
Max Total Supply
79.323693 syUSD
Holders
4
Market
Price
$0.00 @ 0.000000 ETH
Onchain Market Cap
-
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 6 Decimals)
Loading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
BoringVault
Compiler Version
v0.8.21+commit.d9974bed
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.21; import {Address} from "@openzeppelin/contracts/utils/Address.sol"; import {ERC721Holder} from "@openzeppelin/contracts/token/ERC721/utils/ERC721Holder.sol"; import {ERC1155Holder} from "@openzeppelin/contracts/token/ERC1155/utils/ERC1155Holder.sol"; import {FixedPointMathLib} from "@solmate/utils/FixedPointMathLib.sol"; import {SafeTransferLib} from "@solmate/utils/SafeTransferLib.sol"; import {ERC20} from "@solmate/tokens/ERC20.sol"; import {BeforeTransferHook} from "../../src/interfaces/BeforeTransferHook.sol"; import {Auth, Authority} from "@solmate/auth/Auth.sol"; contract BoringVault is ERC20, Auth, ERC721Holder, ERC1155Holder { using Address for address; using SafeTransferLib for ERC20; using FixedPointMathLib for uint256; // ========================================= STATE ========================================= /** * @notice Contract responsbile for implementing `beforeTransfer`. */ BeforeTransferHook public hook; //============================== EVENTS =============================== event Enter(address indexed from, address indexed asset, uint256 amount, address indexed to, uint256 shares); event Exit(address indexed to, address indexed asset, uint256 amount, address indexed from, uint256 shares); //============================== CONSTRUCTOR =============================== constructor(address _owner, string memory _name, string memory _symbol, uint8 _decimals) ERC20(_name, _symbol, _decimals) Auth(_owner, Authority(address(0))) {} //============================== MANAGE =============================== /** * @notice Allows manager to make an arbitrary function call from this contract. * @dev Callable by MANAGER_ROLE. */ function manage(address target, bytes calldata data, uint256 value) external requiresAuth returns (bytes memory result) { result = target.functionCallWithValue(data, value); } /** * @notice Allows manager to make arbitrary function calls from this contract. * @dev Callable by MANAGER_ROLE. */ function manage(address[] calldata targets, bytes[] calldata data, uint256[] calldata values) external requiresAuth returns (bytes[] memory results) { uint256 targetsLength = targets.length; results = new bytes[](targetsLength); for (uint256 i; i < targetsLength; ++i) { results[i] = targets[i].functionCallWithValue(data[i], values[i]); } } //============================== ENTER =============================== /** * @notice Allows minter to mint shares, in exchange for assets. * @dev If assetAmount is zero, no assets are transferred in. * @dev Callable by MINTER_ROLE. */ function enter(address from, ERC20 asset, uint256 assetAmount, address to, uint256 shareAmount) external requiresAuth { // Transfer assets in if (assetAmount > 0) asset.safeTransferFrom(from, address(this), assetAmount); // Mint shares. _mint(to, shareAmount); emit Enter(from, address(asset), assetAmount, to, shareAmount); } //============================== EXIT =============================== /** * @notice Allows burner to burn shares, in exchange for assets. * @dev If assetAmount is zero, no assets are transferred out. * @dev Callable by BURNER_ROLE. */ function exit(address to, ERC20 asset, uint256 assetAmount, address from, uint256 shareAmount) external requiresAuth { // Burn shares. _burn(from, shareAmount); // Transfer assets out. if (assetAmount > 0) asset.safeTransfer(to, assetAmount); emit Exit(to, address(asset), assetAmount, from, shareAmount); } //============================== BEFORE TRANSFER HOOK =============================== /** * @notice Sets the share locker. * @notice If set to zero address, the share locker logic is disabled. * @dev Callable by OWNER_ROLE. */ function setBeforeTransferHook(address _hook) external requiresAuth { hook = BeforeTransferHook(_hook); } /** * @notice Call `beforeTransferHook` passing in `from` `to`, and `msg.sender`. */ function _callBeforeTransfer(address from, address to) internal view { if (address(hook) != address(0)) hook.beforeTransfer(from, to, msg.sender); } function transfer(address to, uint256 amount) public override returns (bool) { _callBeforeTransfer(msg.sender, to); return super.transfer(to, amount); } function transferFrom(address from, address to, uint256 amount) public override returns (bool) { _callBeforeTransfer(from, to); return super.transferFrom(from, to, amount); } //============================== RECEIVE =============================== receive() external payable {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.20; import {IERC165} from "../../utils/introspection/IERC165.sol"; /** * @dev Interface that must be implemented by smart contracts in order to receive * ERC-1155 token transfers. */ interface IERC1155Receiver is IERC165 { /** * @dev Handles the receipt of a single ERC-1155 token type. This function is * called at the end of a `safeTransferFrom` after the balance has been updated. * * NOTE: To accept the transfer, this must return * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * (i.e. 0xf23a6e61, or its own function selector). * * @param operator The address which initiated the transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param id The ID of the token being transferred * @param value The amount of tokens being transferred * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** * @dev Handles the receipt of a multiple ERC-1155 token types. This function * is called at the end of a `safeBatchTransferFrom` after the balances have * been updated. * * NOTE: To accept the transfer(s), this must return * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * (i.e. 0xbc197c81, or its own function selector). * * @param operator The address which initiated the batch transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param ids An array containing ids of each token being transferred (order and length must match values array) * @param values An array containing amounts of each token being transferred (order and length must match ids array) * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (token/ERC1155/utils/ERC1155Holder.sol) pragma solidity ^0.8.20; import {IERC165, ERC165} from "../../../utils/introspection/ERC165.sol"; import {IERC1155Receiver} from "../IERC1155Receiver.sol"; /** * @dev Simple implementation of `IERC1155Receiver` that will allow a contract to hold ERC-1155 tokens. * * IMPORTANT: When inheriting this contract, you must include a way to use the received tokens, otherwise they will be * stuck. */ abstract contract ERC1155Holder is ERC165, IERC1155Receiver { /// @inheritdoc IERC165 function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId); } function onERC1155Received( address, address, uint256, uint256, bytes memory ) public virtual override returns (bytes4) { return this.onERC1155Received.selector; } function onERC1155BatchReceived( address, address, uint256[] memory, uint256[] memory, bytes memory ) public virtual override returns (bytes4) { return this.onERC1155BatchReceived.selector; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.20; /** * @title ERC-721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC-721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be * reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/utils/ERC721Holder.sol) pragma solidity ^0.8.20; import {IERC721Receiver} from "../IERC721Receiver.sol"; /** * @dev Implementation of the {IERC721Receiver} interface. * * Accepts all token transfers. * Make sure the contract is able to use its token with {IERC721-safeTransferFrom}, {IERC721-approve} or * {IERC721-setApprovalForAll}. */ abstract contract ERC721Holder is IERC721Receiver { /** * @dev See {IERC721Receiver-onERC721Received}. * * Always returns `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received(address, address, uint256, bytes memory) public virtual returns (bytes4) { return this.onERC721Received.selector; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.2.0) (utils/Address.sol) pragma solidity ^0.8.20; import {Errors} from "./Errors.sol"; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev There's no code at `target` (it is not a contract). */ error AddressEmptyCode(address target); /** * @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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { if (address(this).balance < amount) { revert Errors.InsufficientBalance(address(this).balance, amount); } (bool success, bytes memory returndata) = recipient.call{value: amount}(""); if (!success) { _revert(returndata); } } /** * @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 or custom error, it is bubbled * up by this function (like regular Solidity function calls). However, if * the call reverted with no returned reason, this function reverts with a * {Errors.FailedCall} error. * * 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. */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0); } /** * @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`. */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { if (address(this).balance < value) { revert Errors.InsufficientBalance(address(this).balance, value); } (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case * of an unsuccessful call. */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata ) internal view returns (bytes memory) { if (!success) { _revert(returndata); } else { // only check if target is a contract if the call was successful and the return data is empty // otherwise we already know that it was a contract if (returndata.length == 0 && target.code.length == 0) { revert AddressEmptyCode(target); } return returndata; } } /** * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the * revert reason or with a default {Errors.FailedCall} error. */ function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) { if (!success) { _revert(returndata); } else { return returndata; } } /** * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}. */ function _revert(bytes memory returndata) 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 assembly ("memory-safe") { revert(add(returndata, 0x20), mload(returndata)) } } else { revert Errors.FailedCall(); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol) pragma solidity ^0.8.20; /** * @dev Collection of common custom errors used in multiple contracts * * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library. * It is recommended to avoid relying on the error API for critical functionality. * * _Available since v5.1._ */ library Errors { /** * @dev The ETH balance of the account is not enough to perform the operation. */ error InsufficientBalance(uint256 balance, uint256 needed); /** * @dev A call to an address target failed. The target may have reverted. */ error FailedCall(); /** * @dev The deployment failed. */ error FailedDeployment(); /** * @dev A necessary precompile is missing. */ error MissingPrecompile(address); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/ERC165.sol) pragma solidity ^0.8.20; import {IERC165} from "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC-165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` */ abstract contract ERC165 is IERC165 { /// @inheritdoc IERC165 function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/IERC165.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC-165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[ERC]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity >=0.8.0; /// @notice Provides a flexible and updatable auth pattern which is completely separate from application logic. /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/auth/Auth.sol) /// @author Modified from Dappsys (https://github.com/dapphub/ds-auth/blob/master/src/auth.sol) abstract contract Auth { event OwnershipTransferred(address indexed user, address indexed newOwner); event AuthorityUpdated(address indexed user, Authority indexed newAuthority); address public owner; Authority public authority; constructor(address _owner, Authority _authority) { owner = _owner; authority = _authority; emit OwnershipTransferred(msg.sender, _owner); emit AuthorityUpdated(msg.sender, _authority); } modifier requiresAuth() virtual { require(isAuthorized(msg.sender, msg.sig), "UNAUTHORIZED"); _; } function isAuthorized(address user, bytes4 functionSig) internal view virtual returns (bool) { Authority auth = authority; // Memoizing authority saves us a warm SLOAD, around 100 gas. // Checking if the caller is the owner only after calling the authority saves gas in most cases, but be // aware that this makes protected functions uncallable even to the owner if the authority is out of order. return (address(auth) != address(0) && auth.canCall(user, address(this), functionSig)) || user == owner; } function setAuthority(Authority newAuthority) public virtual { // We check if the caller is the owner first because we want to ensure they can // always swap out the authority even if it's reverting or using up a lot of gas. require(msg.sender == owner || authority.canCall(msg.sender, address(this), msg.sig)); authority = newAuthority; emit AuthorityUpdated(msg.sender, newAuthority); } function transferOwnership(address newOwner) public virtual requiresAuth { owner = newOwner; emit OwnershipTransferred(msg.sender, newOwner); } } /// @notice A generic interface for a contract which provides authorization data to an Auth instance. /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/auth/Auth.sol) /// @author Modified from Dappsys (https://github.com/dapphub/ds-auth/blob/master/src/auth.sol) interface Authority { function canCall( address user, address target, bytes4 functionSig ) external view returns (bool); }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity >=0.8.0; /// @notice Modern and gas efficient ERC20 + EIP-2612 implementation. /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol) /// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol) /// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it. abstract contract ERC20 { /*////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ event Transfer(address indexed from, address indexed to, uint256 amount); event Approval(address indexed owner, address indexed spender, uint256 amount); /*////////////////////////////////////////////////////////////// METADATA STORAGE //////////////////////////////////////////////////////////////*/ string public name; string public symbol; uint8 public immutable decimals; /*////////////////////////////////////////////////////////////// ERC20 STORAGE //////////////////////////////////////////////////////////////*/ uint256 public totalSupply; mapping(address => uint256) public balanceOf; mapping(address => mapping(address => uint256)) public allowance; /*////////////////////////////////////////////////////////////// EIP-2612 STORAGE //////////////////////////////////////////////////////////////*/ uint256 internal immutable INITIAL_CHAIN_ID; bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR; mapping(address => uint256) public nonces; /*////////////////////////////////////////////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////*/ constructor( string memory _name, string memory _symbol, uint8 _decimals ) { name = _name; symbol = _symbol; decimals = _decimals; INITIAL_CHAIN_ID = block.chainid; INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator(); } /*////////////////////////////////////////////////////////////// ERC20 LOGIC //////////////////////////////////////////////////////////////*/ function approve(address spender, uint256 amount) public virtual returns (bool) { allowance[msg.sender][spender] = amount; emit Approval(msg.sender, spender, amount); return true; } function transfer(address to, uint256 amount) public virtual returns (bool) { balanceOf[msg.sender] -= amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(msg.sender, to, amount); return true; } function transferFrom( address from, address to, uint256 amount ) public virtual returns (bool) { uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals. if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount; balanceOf[from] -= amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(from, to, amount); return true; } /*////////////////////////////////////////////////////////////// EIP-2612 LOGIC //////////////////////////////////////////////////////////////*/ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) public virtual { require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED"); // Unchecked because the only math done is incrementing // the owner's nonce which cannot realistically overflow. unchecked { address recoveredAddress = ecrecover( keccak256( abi.encodePacked( "\x19\x01", DOMAIN_SEPARATOR(), keccak256( abi.encode( keccak256( "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" ), owner, spender, value, nonces[owner]++, deadline ) ) ) ), v, r, s ); require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER"); allowance[recoveredAddress][spender] = value; } emit Approval(owner, spender, value); } function DOMAIN_SEPARATOR() public view virtual returns (bytes32) { return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator(); } function computeDomainSeparator() internal view virtual returns (bytes32) { return keccak256( abi.encode( keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), keccak256(bytes(name)), keccak256("1"), block.chainid, address(this) ) ); } /*////////////////////////////////////////////////////////////// INTERNAL MINT/BURN LOGIC //////////////////////////////////////////////////////////////*/ function _mint(address to, uint256 amount) internal virtual { totalSupply += amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(address(0), to, amount); } function _burn(address from, uint256 amount) internal virtual { balanceOf[from] -= amount; // Cannot underflow because a user's balance // will never be larger than the total supply. unchecked { totalSupply -= amount; } emit Transfer(from, address(0), amount); } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity >=0.8.0; /// @notice Arithmetic library with operations for fixed-point numbers. /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/FixedPointMathLib.sol) /// @author Inspired by USM (https://github.com/usmfum/USM/blob/master/contracts/WadMath.sol) library FixedPointMathLib { /*////////////////////////////////////////////////////////////// SIMPLIFIED FIXED POINT OPERATIONS //////////////////////////////////////////////////////////////*/ uint256 internal constant MAX_UINT256 = 2**256 - 1; uint256 internal constant WAD = 1e18; // The scalar of ETH and most ERC20s. function mulWadDown(uint256 x, uint256 y) internal pure returns (uint256) { return mulDivDown(x, y, WAD); // Equivalent to (x * y) / WAD rounded down. } function mulWadUp(uint256 x, uint256 y) internal pure returns (uint256) { return mulDivUp(x, y, WAD); // Equivalent to (x * y) / WAD rounded up. } function divWadDown(uint256 x, uint256 y) internal pure returns (uint256) { return mulDivDown(x, WAD, y); // Equivalent to (x * WAD) / y rounded down. } function divWadUp(uint256 x, uint256 y) internal pure returns (uint256) { return mulDivUp(x, WAD, y); // Equivalent to (x * WAD) / y rounded up. } /*////////////////////////////////////////////////////////////// LOW LEVEL FIXED POINT OPERATIONS //////////////////////////////////////////////////////////////*/ function mulDivDown( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 z) { /// @solidity memory-safe-assembly assembly { // Equivalent to require(denominator != 0 && (y == 0 || x <= type(uint256).max / y)) if iszero(mul(denominator, iszero(mul(y, gt(x, div(MAX_UINT256, y)))))) { revert(0, 0) } // Divide x * y by the denominator. z := div(mul(x, y), denominator) } } function mulDivUp( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 z) { /// @solidity memory-safe-assembly assembly { // Equivalent to require(denominator != 0 && (y == 0 || x <= type(uint256).max / y)) if iszero(mul(denominator, iszero(mul(y, gt(x, div(MAX_UINT256, y)))))) { revert(0, 0) } // If x * y modulo the denominator is strictly greater than 0, // 1 is added to round up the division of x * y by the denominator. z := add(gt(mod(mul(x, y), denominator), 0), div(mul(x, y), denominator)) } } function rpow( uint256 x, uint256 n, uint256 scalar ) internal pure returns (uint256 z) { /// @solidity memory-safe-assembly assembly { switch x case 0 { switch n case 0 { // 0 ** 0 = 1 z := scalar } default { // 0 ** n = 0 z := 0 } } default { switch mod(n, 2) case 0 { // If n is even, store scalar in z for now. z := scalar } default { // If n is odd, store x in z for now. z := x } // Shifting right by 1 is like dividing by 2. let half := shr(1, scalar) for { // Shift n right by 1 before looping to halve it. n := shr(1, n) } n { // Shift n right by 1 each iteration to halve it. n := shr(1, n) } { // Revert immediately if x ** 2 would overflow. // Equivalent to iszero(eq(div(xx, x), x)) here. if shr(128, x) { revert(0, 0) } // Store x squared. let xx := mul(x, x) // Round to the nearest number. let xxRound := add(xx, half) // Revert if xx + half overflowed. if lt(xxRound, xx) { revert(0, 0) } // Set x to scaled xxRound. x := div(xxRound, scalar) // If n is even: if mod(n, 2) { // Compute z * x. let zx := mul(z, x) // If z * x overflowed: if iszero(eq(div(zx, x), z)) { // Revert if x is non-zero. if iszero(iszero(x)) { revert(0, 0) } } // Round to the nearest number. let zxRound := add(zx, half) // Revert if zx + half overflowed. if lt(zxRound, zx) { revert(0, 0) } // Return properly scaled zxRound. z := div(zxRound, scalar) } } } } } /*////////////////////////////////////////////////////////////// GENERAL NUMBER UTILITIES //////////////////////////////////////////////////////////////*/ function sqrt(uint256 x) internal pure returns (uint256 z) { /// @solidity memory-safe-assembly assembly { let y := x // We start y at x, which will help us make our initial estimate. z := 181 // The "correct" value is 1, but this saves a multiplication later. // This segment is to get a reasonable initial estimate for the Babylonian method. With a bad // start, the correct # of bits increases ~linearly each iteration instead of ~quadratically. // We check y >= 2^(k + 8) but shift right by k bits // each branch to ensure that if x >= 256, then y >= 256. if iszero(lt(y, 0x10000000000000000000000000000000000)) { y := shr(128, y) z := shl(64, z) } if iszero(lt(y, 0x1000000000000000000)) { y := shr(64, y) z := shl(32, z) } if iszero(lt(y, 0x10000000000)) { y := shr(32, y) z := shl(16, z) } if iszero(lt(y, 0x1000000)) { y := shr(16, y) z := shl(8, z) } // Goal was to get z*z*y within a small factor of x. More iterations could // get y in a tighter range. Currently, we will have y in [256, 256*2^16). // We ensured y >= 256 so that the relative difference between y and y+1 is small. // That's not possible if x < 256 but we can just verify those cases exhaustively. // Now, z*z*y <= x < z*z*(y+1), and y <= 2^(16+8), and either y >= 256, or x < 256. // Correctness can be checked exhaustively for x < 256, so we assume y >= 256. // Then z*sqrt(y) is within sqrt(257)/sqrt(256) of sqrt(x), or about 20bps. // For s in the range [1/256, 256], the estimate f(s) = (181/1024) * (s+1) is in the range // (1/2.84 * sqrt(s), 2.84 * sqrt(s)), with largest error when s = 1 and when s = 256 or 1/256. // Since y is in [256, 256*2^16), let a = y/65536, so that a is in [1/256, 256). Then we can estimate // sqrt(y) using sqrt(65536) * 181/1024 * (a + 1) = 181/4 * (y + 65536)/65536 = 181 * (y + 65536)/2^18. // There is no overflow risk here since y < 2^136 after the first branch above. z := shr(18, mul(z, add(y, 65536))) // A mul() is saved from starting z at 181. // Given the worst case multiplicative error of 2.84 above, 7 iterations should be enough. z := shr(1, add(z, div(x, z))) z := shr(1, add(z, div(x, z))) z := shr(1, add(z, div(x, z))) z := shr(1, add(z, div(x, z))) z := shr(1, add(z, div(x, z))) z := shr(1, add(z, div(x, z))) z := shr(1, add(z, div(x, z))) // If x+1 is a perfect square, the Babylonian method cycles between // floor(sqrt(x)) and ceil(sqrt(x)). This statement ensures we return floor. // See: https://en.wikipedia.org/wiki/Integer_square_root#Using_only_integer_division // Since the ceil is rare, we save gas on the assignment and repeat division in the rare case. // If you don't care whether the floor or ceil square root is returned, you can remove this statement. z := sub(z, lt(div(x, z), z)) } } function unsafeMod(uint256 x, uint256 y) internal pure returns (uint256 z) { /// @solidity memory-safe-assembly assembly { // Mod x by y. Note this will return // 0 instead of reverting if y is zero. z := mod(x, y) } } function unsafeDiv(uint256 x, uint256 y) internal pure returns (uint256 r) { /// @solidity memory-safe-assembly assembly { // Divide x by y. Note this will return // 0 instead of reverting if y is zero. r := div(x, y) } } function unsafeDivUp(uint256 x, uint256 y) internal pure returns (uint256 z) { /// @solidity memory-safe-assembly assembly { // Add 1 to x * y if x % y > 0. Note this will // return 0 instead of reverting if y is zero. z := add(gt(mod(x, y), 0), div(x, y)) } } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity >=0.8.0; import {ERC20} from "../tokens/ERC20.sol"; /// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values. /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/SafeTransferLib.sol) /// @dev Use with caution! Some functions in this library knowingly create dirty bits at the destination of the free memory pointer. library SafeTransferLib { /*////////////////////////////////////////////////////////////// ETH OPERATIONS //////////////////////////////////////////////////////////////*/ function safeTransferETH(address to, uint256 amount) internal { bool success; /// @solidity memory-safe-assembly assembly { // Transfer the ETH and store if it succeeded or not. success := call(gas(), to, amount, 0, 0, 0, 0) } require(success, "ETH_TRANSFER_FAILED"); } /*////////////////////////////////////////////////////////////// ERC20 OPERATIONS //////////////////////////////////////////////////////////////*/ function safeTransferFrom( ERC20 token, address from, address to, uint256 amount ) internal { bool success; /// @solidity memory-safe-assembly assembly { // Get a pointer to some free memory. let freeMemoryPointer := mload(0x40) // Write the abi-encoded calldata into memory, beginning with the function selector. mstore(freeMemoryPointer, 0x23b872dd00000000000000000000000000000000000000000000000000000000) mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) // Append and mask the "from" argument. mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Append and mask the "to" argument. mstore(add(freeMemoryPointer, 68), amount) // Append the "amount" argument. Masking not required as it's a full 32 byte type. // We use 100 because the length of our calldata totals up like so: 4 + 32 * 3. // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space. success := call(gas(), token, 0, freeMemoryPointer, 100, 0, 32) // Set success to whether the call reverted, if not we check it either // returned exactly 1 (can't just be non-zero data), or had no return data and token has code. if and(iszero(and(eq(mload(0), 1), gt(returndatasize(), 31))), success) { success := iszero(or(iszero(extcodesize(token)), returndatasize())) } } require(success, "TRANSFER_FROM_FAILED"); } function safeTransfer( ERC20 token, address to, uint256 amount ) internal { bool success; /// @solidity memory-safe-assembly assembly { // Get a pointer to some free memory. let freeMemoryPointer := mload(0x40) // Write the abi-encoded calldata into memory, beginning with the function selector. mstore(freeMemoryPointer, 0xa9059cbb00000000000000000000000000000000000000000000000000000000) mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Append and mask the "to" argument. mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument. Masking not required as it's a full 32 byte type. // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2. // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space. success := call(gas(), token, 0, freeMemoryPointer, 68, 0, 32) // Set success to whether the call reverted, if not we check it either // returned exactly 1 (can't just be non-zero data), or had no return data and token has code. if and(iszero(and(eq(mload(0), 1), gt(returndatasize(), 31))), success) { success := iszero(or(iszero(extcodesize(token)), returndatasize())) } } require(success, "TRANSFER_FAILED"); } function safeApprove( ERC20 token, address to, uint256 amount ) internal { bool success; /// @solidity memory-safe-assembly assembly { // Get a pointer to some free memory. let freeMemoryPointer := mload(0x40) // Write the abi-encoded calldata into memory, beginning with the function selector. mstore(freeMemoryPointer, 0x095ea7b300000000000000000000000000000000000000000000000000000000) mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Append and mask the "to" argument. mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument. Masking not required as it's a full 32 byte type. // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2. // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space. success := call(gas(), token, 0, freeMemoryPointer, 68, 0, 32) // Set success to whether the call reverted, if not we check it either // returned exactly 1 (can't just be non-zero data), or had no return data and token has code. if and(iszero(and(eq(mload(0), 1), gt(returndatasize(), 31))), success) { success := iszero(or(iszero(extcodesize(token)), returndatasize())) } } require(success, "APPROVE_FAILED"); } }
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.21; interface BeforeTransferHook { function beforeTransfer(address from, address to, address operator) external view; }
{ "evmVersion": "shanghai", "metadata": { "appendCBOR": true, "bytecodeHash": "ipfs", "useLiteralContent": false }, "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "remappings": [ "@ccip/=lib/boring-vault/lib/ccip/", "@devtools-oapp-evm/=lib/boring-vault/lib/OAppAuth/lib/devtools/packages/oapp-evm/contracts/oapp/", "@ds-test/=lib/boring-vault/lib/forge-std/lib/ds-test/src/", "@forge-std/=lib/boring-vault/lib/forge-std/src/", "@layerzerolabs/lz-evm-messagelib-v2/=lib/boring-vault/lib/OAppAuth/node_modules/@layerzerolabs/lz-evm-messagelib-v2/", "@layerzerolabs/lz-evm-protocol-v2/=lib/boring-vault/lib/OAppAuth/lib/LayerZero-V2/packages/layerzero-v2/evm/protocol/", "@layerzerolabs/oapp-evm/=lib/boring-vault/lib/OAppAuth/lib/devtools/packages/oapp-evm/", "@lz-oapp-evm/=lib/boring-vault/lib/OAppAuth/lib/LayerZero-V2/packages/layerzero-v2/evm/oapp/contracts/oapp/", "@oapp-auth/=lib/boring-vault/lib/OAppAuth/src/", "@openzeppelin/=lib/boring-vault/lib/openzeppelin-contracts/", "@solmate/=lib/boring-vault/lib/solmate/src/", "LayerZero-V2/=lib/boring-vault/lib/OAppAuth/lib/", "OAppAuth/=lib/boring-vault/lib/OAppAuth/", "boring-vault/=lib/boring-vault/", "ccip/=lib/boring-vault/lib/ccip/contracts/", "ds-test/=lib/solmate/lib/ds-test/src/", "erc4626-tests/=lib/boring-vault/lib/openzeppelin-contracts/lib/erc4626-tests/", "forge-std/=lib/forge-std/src/", "halmos-cheatcodes/=lib/boring-vault/lib/OAppAuth/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/", "openzeppelin-contracts/=lib/boring-vault/lib/openzeppelin-contracts/", "solady/=lib/solady/src/", "solidity-bytes-utils/=lib/boring-vault/lib/OAppAuth/node_modules/solidity-bytes-utils/", "solmate/=lib/solmate/src/", "yearn-vaults/=lib/yearn-vaults/contracts/", "@sbu/=lib/boring-vault/lib/OAppAuth/lib/solidity-bytes-utils/", "morpho-blue/=lib/boring-vault/lib/morpho-blue/" ], "viaIR": false }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"contract Authority","name":"newAuthority","type":"address"}],"name":"AuthorityUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"Enter","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"Exit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"authority","outputs":[{"internalType":"contract Authority","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"contract ERC20","name":"asset","type":"address"},{"internalType":"uint256","name":"assetAmount","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"shareAmount","type":"uint256"}],"name":"enter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"contract ERC20","name":"asset","type":"address"},{"internalType":"uint256","name":"assetAmount","type":"uint256"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"shareAmount","type":"uint256"}],"name":"exit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"hook","outputs":[{"internalType":"contract BeforeTransferHook","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"targets","type":"address[]"},{"internalType":"bytes[]","name":"data","type":"bytes[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"manage","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"manage","outputs":[{"internalType":"bytes","name":"result","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract Authority","name":"newAuthority","type":"address"}],"name":"setAuthority","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_hook","type":"address"}],"name":"setBeforeTransferHook","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60e060405234801562000010575f80fd5b506040516200227138038062002271833981016040819052620000339162000263565b835f848484836200004584826200038c565b5060016200005483826200038c565b5060ff81166080524660a0526200006a6200010b565b60c0525050600680546001600160a01b038086166001600160a01b03199283168117909355600780549186169190921617905560405190915033907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a36040516001600160a01b0382169033907fa3396fd7f6e0a21b50e5089d2da70d5ac0a3bbbd1f617a93f134b76389980198905f90a3505050505050620004ce565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516200013d919062000454565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001c9575f80fd5b81516001600160401b0380821115620001e657620001e6620001a5565b604051601f8301601f19908116603f01168101908282118183101715620002115762000211620001a5565b816040528381526020925086838588010111156200022d575f80fd5b5f91505b8382101562000250578582018301518183018401529082019062000231565b5f93810190920192909252949350505050565b5f805f806080858703121562000277575f80fd5b84516001600160a01b03811681146200028e575f80fd5b60208601519094506001600160401b0380821115620002ab575f80fd5b620002b988838901620001b9565b94506040870151915080821115620002cf575f80fd5b50620002de87828801620001b9565b925050606085015160ff81168114620002f5575f80fd5b939692955090935050565b600181811c908216806200031557607f821691505b6020821081036200033457634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000387575f81815260208120601f850160051c81016020861015620003625750805b601f850160051c820191505b8181101562000383578281556001016200036e565b5050505b505050565b81516001600160401b03811115620003a857620003a8620001a5565b620003c081620003b9845462000300565b846200033a565b602080601f831160018114620003f6575f8415620003de5750858301515b5f19600386901b1c1916600185901b17855562000383565b5f85815260208120601f198616915b82811015620004265788860151825594840194600190910190840162000405565b50858210156200044457878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f808354620004638162000300565b600182811680156200047e57600181146200049457620004c2565b60ff1984168752821515830287019450620004c2565b875f526020805f205f5b85811015620004b95781548a8201529084019082016200049e565b50505082870194505b50929695505050505050565b60805160a05160c051611d78620004f95f395f61092901525f6108f401525f6102e00152611d785ff3fe60806040526004361061017e575f3560e01c80637ecebe00116100cd578063bc197c8111610087578063dd62ed3e11610062578063dd62ed3e146104cd578063f23a6e6114610503578063f2fde38b1461052e578063f6e715d01461054d575f80fd5b8063bc197c8114610464578063bf7e214f1461048f578063d505accf146104ae575f80fd5b80637ecebe00146103915780637f5a7c7b146103bc5780638929565f146103f35780638da5cb5b1461041257806395d89b4114610431578063a9059cbb14610445575f80fd5b8063224d8703116101385780633644e515116101135780633644e5151461031457806339d6ba321461032857806370a08231146103475780637a9e5e4b14610372575f80fd5b8063224d87031461028457806323b872dd146102b0578063313ce567146102cf575f80fd5b806301ffc9a71461018957806306fdde03146101bd578063095ea7b3146101de578063150b7a02146101fd57806318160ddd1461024057806318457e6114610263575f80fd5b3661018557005b5f80fd5b348015610194575f80fd5b506101a86101a336600461149c565b61056c565b60405190151581526020015b60405180910390f35b3480156101c8575f80fd5b506101d16105a2565b6040516101b49190611510565b3480156101e9575f80fd5b506101a86101f8366004611536565b61062d565b348015610208575f80fd5b50610227610217366004611611565b630a85bd0160e11b949350505050565b6040516001600160e01b031990911681526020016101b4565b34801561024b575f80fd5b5061025560025481565b6040519081526020016101b4565b34801561026e575f80fd5b5061028261027d366004611679565b610698565b005b34801561028f575f80fd5b506102a361029e366004611718565b61075d565b6040516101b491906117ab565b3480156102bb575f80fd5b506101a86102ca36600461180b565b6108d1565b3480156102da575f80fd5b506103027f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff90911681526020016101b4565b34801561031f575f80fd5b506102556108f1565b348015610333575f80fd5b50610282610342366004611679565b61094b565b348015610352575f80fd5b50610255610361366004611849565b60036020525f908152604090205481565b34801561037d575f80fd5b5061028261038c366004611849565b6109f9565b34801561039c575f80fd5b506102556103ab366004611849565b60056020525f908152604090205481565b3480156103c7575f80fd5b506008546103db906001600160a01b031681565b6040516001600160a01b0390911681526020016101b4565b3480156103fe575f80fd5b5061028261040d366004611849565b610ade565b34801561041d575f80fd5b506006546103db906001600160a01b031681565b34801561043c575f80fd5b506101d1610b31565b348015610450575f80fd5b506101a861045f366004611536565b610b3e565b34801561046f575f80fd5b5061022761047e3660046118e1565b63bc197c8160e01b95945050505050565b34801561049a575f80fd5b506007546103db906001600160a01b031681565b3480156104b9575f80fd5b506102826104c8366004611988565b610b53565b3480156104d8575f80fd5b506102556104e73660046119f9565b600460209081525f928352604080842090915290825290205481565b34801561050e575f80fd5b5061022761051d366004611a30565b63f23a6e6160e01b95945050505050565b348015610539575f80fd5b50610282610548366004611849565b610d91565b348015610558575f80fd5b506101d1610567366004611a94565b610e0d565b5f6001600160e01b03198216630271189760e51b148061059c57506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f80546105ae90611b18565b80601f01602080910402602001604051908101604052809291908181526020018280546105da90611b18565b80156106255780601f106105fc57610100808354040283529160200191610625565b820191905f5260205f20905b81548152906001019060200180831161060857829003601f168201915b505050505081565b335f8181526004602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906106879086815260200190565b60405180910390a350600192915050565b6106ad335f356001600160e01b031916610e93565b6106d25760405162461bcd60e51b81526004016106c990611b50565b60405180910390fd5b6106dc8282610f3a565b82156106f6576106f66001600160a01b0385168685610fa1565b816001600160a01b0316846001600160a01b0316866001600160a01b03167fe0c82280a1164680e0cf43be7db4c4c9f985423623ad7a544fb76c772bdc6043868560405161074e929190918252602082015260400190565b60405180910390a45050505050565b6060610774335f356001600160e01b031916610e93565b6107905760405162461bcd60e51b81526004016106c990611b50565b858067ffffffffffffffff8111156107aa576107aa611560565b6040519080825280602002602001820160405280156107dd57816020015b60608152602001906001900390816107c85790505b5091505f5b818110156108c5576108978787838181106107ff576107ff611b76565b90506020028101906108119190611b8a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525089925088915085905081811061085957610859611b76565b905060200201358b8b8581811061087257610872611b76565b90506020020160208101906108879190611849565b6001600160a01b03169190611030565b8382815181106108a9576108a9611b76565b6020026020010181905250806108be90611be1565b90506107e2565b50509695505050505050565b5f6108dc84846110d0565b6108e784848461114d565b90505b9392505050565b5f7f0000000000000000000000000000000000000000000000000000000000000000461461092657610921611227565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b610960335f356001600160e01b031916610e93565b61097c5760405162461bcd60e51b81526004016106c990611b50565b8215610997576109976001600160a01b0385168630866112bf565b6109a18282611363565b816001600160a01b0316846001600160a01b0316866001600160a01b03167fea00f88768a86184a6e515238a549c171769fe7460a011d6fd0bcd48ca078ea4868560405161074e929190918252602082015260400190565b6006546001600160a01b0316331480610a8b575060075460405163b700961360e01b81526001600160a01b039091169063b700961390610a4c90339030906001600160e01b03195f351690600401611bf9565b602060405180830381865afa158015610a67573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a8b9190611c26565b610a93575f80fd5b600780546001600160a01b0319166001600160a01b03831690811790915560405133907fa3396fd7f6e0a21b50e5089d2da70d5ac0a3bbbd1f617a93f134b76389980198905f90a350565b610af3335f356001600160e01b031916610e93565b610b0f5760405162461bcd60e51b81526004016106c990611b50565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b600180546105ae90611b18565b5f610b4933846110d0565b6108ea83836113b2565b42841015610ba35760405162461bcd60e51b815260206004820152601760248201527f5045524d49545f444541444c494e455f4558504952454400000000000000000060448201526064016106c9565b5f6001610bae6108f1565b6001600160a01b038a81165f8181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e08301909152805192019190912061190160f01b6101008301526101028201929092526101228101919091526101420160408051601f1981840301815282825280516020918201205f84529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610cb6573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811615801590610cec5750876001600160a01b0316816001600160a01b0316145b610d295760405162461bcd60e51b815260206004820152600e60248201526d24a72b20a624a22fa9a4a3a722a960911b60448201526064016106c9565b6001600160a01b039081165f9081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b610da6335f356001600160e01b031916610e93565b610dc25760405162461bcd60e51b81526004016106c990611b50565b600680546001600160a01b0319166001600160a01b03831690811790915560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a350565b6060610e24335f356001600160e01b031916610e93565b610e405760405162461bcd60e51b81526004016106c990611b50565b610e8a84848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050506001600160a01b03881691905084611030565b95945050505050565b6007545f906001600160a01b03168015801590610f1a575060405163b700961360e01b81526001600160a01b0382169063b700961390610edb90879030908890600401611bf9565b602060405180830381865afa158015610ef6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f1a9190611c26565b80610f3257506006546001600160a01b038581169116145b949350505050565b6001600160a01b0382165f9081526003602052604081208054839290610f61908490611c45565b90915550506002805482900390556040518181525f906001600160a01b038416905f80516020611d23833981519152906020015b60405180910390a35050565b5f60405163a9059cbb60e01b81526001600160a01b038416600482015282602482015260205f6044835f895af191505080601f3d1160015f511416151615610feb5750823b153d17155b8061102a5760405162461bcd60e51b815260206004820152600f60248201526e1514905394d1915497d19052531151608a1b60448201526064016106c9565b50505050565b60608147101561105c5760405163cf47918160e01b8152476004820152602481018390526044016106c9565b5f80856001600160a01b031684866040516110779190611c58565b5f6040518083038185875af1925050503d805f81146110b1576040519150601f19603f3d011682016040523d82523d5f602084013e6110b6565b606091505b50915091506110c6868383611415565b9695505050505050565b6008546001600160a01b03161561114957600854604051630abd626b60e41b81526001600160a01b03848116600483015283811660248301523360448301529091169063abd626b0906064015f6040518083038186803b158015611132575f80fd5b505afa158015611144573d5f803e3d5ffd5b505050505b5050565b6001600160a01b0383165f9081526004602090815260408083203384529091528120545f1981146111a6576111828382611c45565b6001600160a01b0386165f9081526004602090815260408083203384529091529020555b6001600160a01b0385165f90815260036020526040812080548592906111cd908490611c45565b90915550506001600160a01b038085165f81815260036020526040908190208054870190555190918716905f80516020611d23833981519152906112149087815260200190565b60405180910390a3506001949350505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516112579190611c73565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f6040516323b872dd60e01b81526001600160a01b03851660048201526001600160a01b038416602482015282604482015260205f6064835f8a5af191505080601f3d1160015f5114161516156113185750833b153d17155b8061135c5760405162461bcd60e51b81526020600482015260146024820152731514905394d1915497d19493d357d1905253115160621b60448201526064016106c9565b5050505050565b8060025f8282546113749190611d0f565b90915550506001600160a01b0382165f818152600360209081526040808320805486019055518481525f80516020611d238339815191529101610f95565b335f908152600360205260408120805483919083906113d2908490611c45565b90915550506001600160a01b0383165f81815260036020526040908190208054850190555133905f80516020611d23833981519152906106879086815260200190565b60608261142a5761142582611471565b6108ea565b815115801561144157506001600160a01b0384163b155b1561146a57604051639996b31560e01b81526001600160a01b03851660048201526024016106c9565b50806108ea565b80511561148057805160208201fd5b60405163d6bda27560e01b815260040160405180910390fd5b50565b5f602082840312156114ac575f80fd5b81356001600160e01b0319811681146108ea575f80fd5b5f5b838110156114dd5781810151838201526020016114c5565b50505f910152565b5f81518084526114fc8160208601602086016114c3565b601f01601f19169290920160200192915050565b602081525f6108ea60208301846114e5565b6001600160a01b0381168114611499575f80fd5b5f8060408385031215611547575f80fd5b823561155281611522565b946020939093013593505050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561159d5761159d611560565b604052919050565b5f82601f8301126115b4575f80fd5b813567ffffffffffffffff8111156115ce576115ce611560565b6115e1601f8201601f1916602001611574565b8181528460208386010111156115f5575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215611624575f80fd5b843561162f81611522565b9350602085013561163f81611522565b925060408501359150606085013567ffffffffffffffff811115611661575f80fd5b61166d878288016115a5565b91505092959194509250565b5f805f805f60a0868803121561168d575f80fd5b853561169881611522565b945060208601356116a881611522565b93506040860135925060608601356116bf81611522565b949793965091946080013592915050565b5f8083601f8401126116e0575f80fd5b50813567ffffffffffffffff8111156116f7575f80fd5b6020830191508360208260051b8501011115611711575f80fd5b9250929050565b5f805f805f806060878903121561172d575f80fd5b863567ffffffffffffffff80821115611744575f80fd5b6117508a838b016116d0565b90985096506020890135915080821115611768575f80fd5b6117748a838b016116d0565b9096509450604089013591508082111561178c575f80fd5b5061179989828a016116d0565b979a9699509497509295939492505050565b5f602080830181845280855180835260408601915060408160051b87010192508387015f5b828110156117fe57603f198886030184526117ec8583516114e5565b945092850192908501906001016117d0565b5092979650505050505050565b5f805f6060848603121561181d575f80fd5b833561182881611522565b9250602084013561183881611522565b929592945050506040919091013590565b5f60208284031215611859575f80fd5b81356108ea81611522565b5f82601f830112611873575f80fd5b8135602067ffffffffffffffff82111561188f5761188f611560565b8160051b61189e828201611574565b92835284810182019282810190878511156118b7575f80fd5b83870192505b848310156118d6578235825291830191908301906118bd565b979650505050505050565b5f805f805f60a086880312156118f5575f80fd5b853561190081611522565b9450602086013561191081611522565b9350604086013567ffffffffffffffff8082111561192c575f80fd5b61193889838a01611864565b9450606088013591508082111561194d575f80fd5b61195989838a01611864565b9350608088013591508082111561196e575f80fd5b5061197b888289016115a5565b9150509295509295909350565b5f805f805f805f60e0888a03121561199e575f80fd5b87356119a981611522565b965060208801356119b981611522565b95506040880135945060608801359350608088013560ff811681146119dc575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611a0a575f80fd5b8235611a1581611522565b91506020830135611a2581611522565b809150509250929050565b5f805f805f60a08688031215611a44575f80fd5b8535611a4f81611522565b94506020860135611a5f81611522565b93506040860135925060608601359150608086013567ffffffffffffffff811115611a88575f80fd5b61197b888289016115a5565b5f805f8060608587031215611aa7575f80fd5b8435611ab281611522565b9350602085013567ffffffffffffffff80821115611ace575f80fd5b818701915087601f830112611ae1575f80fd5b813581811115611aef575f80fd5b886020828501011115611b00575f80fd5b95986020929092019750949560400135945092505050565b600181811c90821680611b2c57607f821691505b602082108103611b4a57634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252600c908201526b15539055551213d49256915160a21b604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b5f808335601e19843603018112611b9f575f80fd5b83018035915067ffffffffffffffff821115611bb9575f80fd5b602001915036819003821315611711575f80fd5b634e487b7160e01b5f52601160045260245ffd5b5f60018201611bf257611bf2611bcd565b5060010190565b6001600160a01b0393841681529190921660208201526001600160e01b0319909116604082015260600190565b5f60208284031215611c36575f80fd5b815180151581146108ea575f80fd5b8181038181111561059c5761059c611bcd565b5f8251611c698184602087016114c3565b9190910192915050565b5f80835481600182811c915080831680611c8e57607f831692505b60208084108203611cad57634e487b7160e01b86526022600452602486fd5b818015611cc15760018114611cd657611d01565b60ff1986168952841515850289019650611d01565b5f8a8152602090205f5b86811015611cf95781548b820152908501908301611ce0565b505084890196505b509498975050505050505050565b8082018082111561059c5761059c611bcd56feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212203351da6d516b6d584b0035ca953a990bc44a9c740f5de7da00ad7d12c94ff6af64736f6c63430008150033000000000000000000000000771263e3bc6acda5ae388a3f8a0c2dd7a17275fc000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000010537461626c65205969656c64205553440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000057379555344000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x60806040526004361061017e575f3560e01c80637ecebe00116100cd578063bc197c8111610087578063dd62ed3e11610062578063dd62ed3e146104cd578063f23a6e6114610503578063f2fde38b1461052e578063f6e715d01461054d575f80fd5b8063bc197c8114610464578063bf7e214f1461048f578063d505accf146104ae575f80fd5b80637ecebe00146103915780637f5a7c7b146103bc5780638929565f146103f35780638da5cb5b1461041257806395d89b4114610431578063a9059cbb14610445575f80fd5b8063224d8703116101385780633644e515116101135780633644e5151461031457806339d6ba321461032857806370a08231146103475780637a9e5e4b14610372575f80fd5b8063224d87031461028457806323b872dd146102b0578063313ce567146102cf575f80fd5b806301ffc9a71461018957806306fdde03146101bd578063095ea7b3146101de578063150b7a02146101fd57806318160ddd1461024057806318457e6114610263575f80fd5b3661018557005b5f80fd5b348015610194575f80fd5b506101a86101a336600461149c565b61056c565b60405190151581526020015b60405180910390f35b3480156101c8575f80fd5b506101d16105a2565b6040516101b49190611510565b3480156101e9575f80fd5b506101a86101f8366004611536565b61062d565b348015610208575f80fd5b50610227610217366004611611565b630a85bd0160e11b949350505050565b6040516001600160e01b031990911681526020016101b4565b34801561024b575f80fd5b5061025560025481565b6040519081526020016101b4565b34801561026e575f80fd5b5061028261027d366004611679565b610698565b005b34801561028f575f80fd5b506102a361029e366004611718565b61075d565b6040516101b491906117ab565b3480156102bb575f80fd5b506101a86102ca36600461180b565b6108d1565b3480156102da575f80fd5b506103027f000000000000000000000000000000000000000000000000000000000000000681565b60405160ff90911681526020016101b4565b34801561031f575f80fd5b506102556108f1565b348015610333575f80fd5b50610282610342366004611679565b61094b565b348015610352575f80fd5b50610255610361366004611849565b60036020525f908152604090205481565b34801561037d575f80fd5b5061028261038c366004611849565b6109f9565b34801561039c575f80fd5b506102556103ab366004611849565b60056020525f908152604090205481565b3480156103c7575f80fd5b506008546103db906001600160a01b031681565b6040516001600160a01b0390911681526020016101b4565b3480156103fe575f80fd5b5061028261040d366004611849565b610ade565b34801561041d575f80fd5b506006546103db906001600160a01b031681565b34801561043c575f80fd5b506101d1610b31565b348015610450575f80fd5b506101a861045f366004611536565b610b3e565b34801561046f575f80fd5b5061022761047e3660046118e1565b63bc197c8160e01b95945050505050565b34801561049a575f80fd5b506007546103db906001600160a01b031681565b3480156104b9575f80fd5b506102826104c8366004611988565b610b53565b3480156104d8575f80fd5b506102556104e73660046119f9565b600460209081525f928352604080842090915290825290205481565b34801561050e575f80fd5b5061022761051d366004611a30565b63f23a6e6160e01b95945050505050565b348015610539575f80fd5b50610282610548366004611849565b610d91565b348015610558575f80fd5b506101d1610567366004611a94565b610e0d565b5f6001600160e01b03198216630271189760e51b148061059c57506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f80546105ae90611b18565b80601f01602080910402602001604051908101604052809291908181526020018280546105da90611b18565b80156106255780601f106105fc57610100808354040283529160200191610625565b820191905f5260205f20905b81548152906001019060200180831161060857829003601f168201915b505050505081565b335f8181526004602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906106879086815260200190565b60405180910390a350600192915050565b6106ad335f356001600160e01b031916610e93565b6106d25760405162461bcd60e51b81526004016106c990611b50565b60405180910390fd5b6106dc8282610f3a565b82156106f6576106f66001600160a01b0385168685610fa1565b816001600160a01b0316846001600160a01b0316866001600160a01b03167fe0c82280a1164680e0cf43be7db4c4c9f985423623ad7a544fb76c772bdc6043868560405161074e929190918252602082015260400190565b60405180910390a45050505050565b6060610774335f356001600160e01b031916610e93565b6107905760405162461bcd60e51b81526004016106c990611b50565b858067ffffffffffffffff8111156107aa576107aa611560565b6040519080825280602002602001820160405280156107dd57816020015b60608152602001906001900390816107c85790505b5091505f5b818110156108c5576108978787838181106107ff576107ff611b76565b90506020028101906108119190611b8a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525089925088915085905081811061085957610859611b76565b905060200201358b8b8581811061087257610872611b76565b90506020020160208101906108879190611849565b6001600160a01b03169190611030565b8382815181106108a9576108a9611b76565b6020026020010181905250806108be90611be1565b90506107e2565b50509695505050505050565b5f6108dc84846110d0565b6108e784848461114d565b90505b9392505050565b5f7f00000000000000000000000000000000000000000000000000000000000b67d2461461092657610921611227565b905090565b507fd0a7417473cb0384171d158c52b04f2cc2951106cab596e25fd8ec3a3416174190565b610960335f356001600160e01b031916610e93565b61097c5760405162461bcd60e51b81526004016106c990611b50565b8215610997576109976001600160a01b0385168630866112bf565b6109a18282611363565b816001600160a01b0316846001600160a01b0316866001600160a01b03167fea00f88768a86184a6e515238a549c171769fe7460a011d6fd0bcd48ca078ea4868560405161074e929190918252602082015260400190565b6006546001600160a01b0316331480610a8b575060075460405163b700961360e01b81526001600160a01b039091169063b700961390610a4c90339030906001600160e01b03195f351690600401611bf9565b602060405180830381865afa158015610a67573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a8b9190611c26565b610a93575f80fd5b600780546001600160a01b0319166001600160a01b03831690811790915560405133907fa3396fd7f6e0a21b50e5089d2da70d5ac0a3bbbd1f617a93f134b76389980198905f90a350565b610af3335f356001600160e01b031916610e93565b610b0f5760405162461bcd60e51b81526004016106c990611b50565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b600180546105ae90611b18565b5f610b4933846110d0565b6108ea83836113b2565b42841015610ba35760405162461bcd60e51b815260206004820152601760248201527f5045524d49545f444541444c494e455f4558504952454400000000000000000060448201526064016106c9565b5f6001610bae6108f1565b6001600160a01b038a81165f8181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e08301909152805192019190912061190160f01b6101008301526101028201929092526101228101919091526101420160408051601f1981840301815282825280516020918201205f84529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610cb6573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811615801590610cec5750876001600160a01b0316816001600160a01b0316145b610d295760405162461bcd60e51b815260206004820152600e60248201526d24a72b20a624a22fa9a4a3a722a960911b60448201526064016106c9565b6001600160a01b039081165f9081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b610da6335f356001600160e01b031916610e93565b610dc25760405162461bcd60e51b81526004016106c990611b50565b600680546001600160a01b0319166001600160a01b03831690811790915560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a350565b6060610e24335f356001600160e01b031916610e93565b610e405760405162461bcd60e51b81526004016106c990611b50565b610e8a84848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050506001600160a01b03881691905084611030565b95945050505050565b6007545f906001600160a01b03168015801590610f1a575060405163b700961360e01b81526001600160a01b0382169063b700961390610edb90879030908890600401611bf9565b602060405180830381865afa158015610ef6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f1a9190611c26565b80610f3257506006546001600160a01b038581169116145b949350505050565b6001600160a01b0382165f9081526003602052604081208054839290610f61908490611c45565b90915550506002805482900390556040518181525f906001600160a01b038416905f80516020611d23833981519152906020015b60405180910390a35050565b5f60405163a9059cbb60e01b81526001600160a01b038416600482015282602482015260205f6044835f895af191505080601f3d1160015f511416151615610feb5750823b153d17155b8061102a5760405162461bcd60e51b815260206004820152600f60248201526e1514905394d1915497d19052531151608a1b60448201526064016106c9565b50505050565b60608147101561105c5760405163cf47918160e01b8152476004820152602481018390526044016106c9565b5f80856001600160a01b031684866040516110779190611c58565b5f6040518083038185875af1925050503d805f81146110b1576040519150601f19603f3d011682016040523d82523d5f602084013e6110b6565b606091505b50915091506110c6868383611415565b9695505050505050565b6008546001600160a01b03161561114957600854604051630abd626b60e41b81526001600160a01b03848116600483015283811660248301523360448301529091169063abd626b0906064015f6040518083038186803b158015611132575f80fd5b505afa158015611144573d5f803e3d5ffd5b505050505b5050565b6001600160a01b0383165f9081526004602090815260408083203384529091528120545f1981146111a6576111828382611c45565b6001600160a01b0386165f9081526004602090815260408083203384529091529020555b6001600160a01b0385165f90815260036020526040812080548592906111cd908490611c45565b90915550506001600160a01b038085165f81815260036020526040908190208054870190555190918716905f80516020611d23833981519152906112149087815260200190565b60405180910390a3506001949350505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516112579190611c73565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f6040516323b872dd60e01b81526001600160a01b03851660048201526001600160a01b038416602482015282604482015260205f6064835f8a5af191505080601f3d1160015f5114161516156113185750833b153d17155b8061135c5760405162461bcd60e51b81526020600482015260146024820152731514905394d1915497d19493d357d1905253115160621b60448201526064016106c9565b5050505050565b8060025f8282546113749190611d0f565b90915550506001600160a01b0382165f818152600360209081526040808320805486019055518481525f80516020611d238339815191529101610f95565b335f908152600360205260408120805483919083906113d2908490611c45565b90915550506001600160a01b0383165f81815260036020526040908190208054850190555133905f80516020611d23833981519152906106879086815260200190565b60608261142a5761142582611471565b6108ea565b815115801561144157506001600160a01b0384163b155b1561146a57604051639996b31560e01b81526001600160a01b03851660048201526024016106c9565b50806108ea565b80511561148057805160208201fd5b60405163d6bda27560e01b815260040160405180910390fd5b50565b5f602082840312156114ac575f80fd5b81356001600160e01b0319811681146108ea575f80fd5b5f5b838110156114dd5781810151838201526020016114c5565b50505f910152565b5f81518084526114fc8160208601602086016114c3565b601f01601f19169290920160200192915050565b602081525f6108ea60208301846114e5565b6001600160a01b0381168114611499575f80fd5b5f8060408385031215611547575f80fd5b823561155281611522565b946020939093013593505050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561159d5761159d611560565b604052919050565b5f82601f8301126115b4575f80fd5b813567ffffffffffffffff8111156115ce576115ce611560565b6115e1601f8201601f1916602001611574565b8181528460208386010111156115f5575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215611624575f80fd5b843561162f81611522565b9350602085013561163f81611522565b925060408501359150606085013567ffffffffffffffff811115611661575f80fd5b61166d878288016115a5565b91505092959194509250565b5f805f805f60a0868803121561168d575f80fd5b853561169881611522565b945060208601356116a881611522565b93506040860135925060608601356116bf81611522565b949793965091946080013592915050565b5f8083601f8401126116e0575f80fd5b50813567ffffffffffffffff8111156116f7575f80fd5b6020830191508360208260051b8501011115611711575f80fd5b9250929050565b5f805f805f806060878903121561172d575f80fd5b863567ffffffffffffffff80821115611744575f80fd5b6117508a838b016116d0565b90985096506020890135915080821115611768575f80fd5b6117748a838b016116d0565b9096509450604089013591508082111561178c575f80fd5b5061179989828a016116d0565b979a9699509497509295939492505050565b5f602080830181845280855180835260408601915060408160051b87010192508387015f5b828110156117fe57603f198886030184526117ec8583516114e5565b945092850192908501906001016117d0565b5092979650505050505050565b5f805f6060848603121561181d575f80fd5b833561182881611522565b9250602084013561183881611522565b929592945050506040919091013590565b5f60208284031215611859575f80fd5b81356108ea81611522565b5f82601f830112611873575f80fd5b8135602067ffffffffffffffff82111561188f5761188f611560565b8160051b61189e828201611574565b92835284810182019282810190878511156118b7575f80fd5b83870192505b848310156118d6578235825291830191908301906118bd565b979650505050505050565b5f805f805f60a086880312156118f5575f80fd5b853561190081611522565b9450602086013561191081611522565b9350604086013567ffffffffffffffff8082111561192c575f80fd5b61193889838a01611864565b9450606088013591508082111561194d575f80fd5b61195989838a01611864565b9350608088013591508082111561196e575f80fd5b5061197b888289016115a5565b9150509295509295909350565b5f805f805f805f60e0888a03121561199e575f80fd5b87356119a981611522565b965060208801356119b981611522565b95506040880135945060608801359350608088013560ff811681146119dc575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611a0a575f80fd5b8235611a1581611522565b91506020830135611a2581611522565b809150509250929050565b5f805f805f60a08688031215611a44575f80fd5b8535611a4f81611522565b94506020860135611a5f81611522565b93506040860135925060608601359150608086013567ffffffffffffffff811115611a88575f80fd5b61197b888289016115a5565b5f805f8060608587031215611aa7575f80fd5b8435611ab281611522565b9350602085013567ffffffffffffffff80821115611ace575f80fd5b818701915087601f830112611ae1575f80fd5b813581811115611aef575f80fd5b886020828501011115611b00575f80fd5b95986020929092019750949560400135945092505050565b600181811c90821680611b2c57607f821691505b602082108103611b4a57634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252600c908201526b15539055551213d49256915160a21b604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b5f808335601e19843603018112611b9f575f80fd5b83018035915067ffffffffffffffff821115611bb9575f80fd5b602001915036819003821315611711575f80fd5b634e487b7160e01b5f52601160045260245ffd5b5f60018201611bf257611bf2611bcd565b5060010190565b6001600160a01b0393841681529190921660208201526001600160e01b0319909116604082015260600190565b5f60208284031215611c36575f80fd5b815180151581146108ea575f80fd5b8181038181111561059c5761059c611bcd565b5f8251611c698184602087016114c3565b9190910192915050565b5f80835481600182811c915080831680611c8e57607f831692505b60208084108203611cad57634e487b7160e01b86526022600452602486fd5b818015611cc15760018114611cd657611d01565b60ff1986168952841515850289019650611d01565b5f8a8152602090205f5b86811015611cf95781548b820152908501908301611ce0565b505084890196505b509498975050505050505050565b8082018082111561059c5761059c611bcd56feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212203351da6d516b6d584b0035ca953a990bc44a9c740f5de7da00ad7d12c94ff6af64736f6c63430008150033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000771263e3bc6acda5ae388a3f8a0c2dd7a17275fc000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000010537461626c65205969656c64205553440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000057379555344000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _owner (address): 0x771263e3Bc6aCDa5aE388A3F8A0c2dd7A17275FC
Arg [1] : _name (string): Stable Yield USD
Arg [2] : _symbol (string): syUSD
Arg [3] : _decimals (uint8): 6
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 000000000000000000000000771263e3bc6acda5ae388a3f8a0c2dd7a17275fc
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000010
Arg [5] : 537461626c65205969656c642055534400000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [7] : 7379555344000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
640:4408:12:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;617:221:1;;;;;;;;;;-1:-1:-1;617:221:1;;;;;:::i;:::-;;:::i;:::-;;;470:14:14;;463:22;445:41;;433:2;418:18;617:221:1;;;;;;;;1031:18:9;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;2461:211::-;;;;;;;;;;-1:-1:-1;2461:211:9;;;;;:::i;:::-;;:::i;639:153:3:-;;;;;;;;;;-1:-1:-1;639:153:3;;;;;:::i;:::-;-1:-1:-1;;;639:153:3;;;;;;;;;;-1:-1:-1;;;;;;3488:33:14;;;3470:52;;3458:2;3443:18;639:153:3;3326:202:14;1304:26:9;;;;;;;;;;;;;;;;;;;3679:25:14;;;3667:2;3652:18;1304:26:9;3533:177:14;3539:373:12;;;;;;;;;;-1:-1:-1;3539:373:12;;;;;:::i;:::-;;:::i;:::-;;2190:417;;;;;;;;;;-1:-1:-1;2190:417:12;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;4739:194::-;;;;;;;;;;-1:-1:-1;4739:194:12;;;;;:::i;:::-;;:::i;1083:31:9:-;;;;;;;;;;;;;;;;;;7316:4:14;7304:17;;;7286:36;;7274:2;7259:18;1083:31:9;7144:184:14;5327:177:9;;;;;;;;;;;;;:::i;2877:392:12:-;;;;;;;;;;-1:-1:-1;2877:392:12;;;;;:::i;:::-;;:::i;1337:44:9:-;;;;;;;;;;-1:-1:-1;1337:44:9;;;;;:::i;:::-;;;;;;;;;;;;;;1523:434:8;;;;;;;;;;-1:-1:-1;1523:434:8;;;;;:::i;:::-;;:::i;1751:41:9:-;;;;;;;;;;-1:-1:-1;1751:41:9;;;;;:::i;:::-;;;;;;;;;;;;;;1006:30:12;;;;;;;;;;-1:-1:-1;1006:30:12;;;;-1:-1:-1;;;;;1006:30:12;;;;;;-1:-1:-1;;;;;8227:32:14;;;8209:51;;8197:2;8182:18;1006:30:12;8036:230:14;4173:117:12;;;;;;;;;;-1:-1:-1;4173:117:12;;;;;:::i;:::-;;:::i;562:20:8:-;;;;;;;;;;-1:-1:-1;562:20:8;;;;-1:-1:-1;;;;;562:20:8;;;1056::9;;;;;;;;;;;;;:::i;4561:172:12:-;;;;;;;;;;-1:-1:-1;4561:172:12;;;;;:::i;:::-;;:::i;1069:247:1:-;;;;;;;;;;-1:-1:-1;1069:247:1;;;;;:::i;:::-;-1:-1:-1;;;1069:247:1;;;;;;;;589:26:8;;;;;;;;;;-1:-1:-1;589:26:8;;;;-1:-1:-1;;;;;589:26:8;;;3838:1483:9;;;;;;;;;;-1:-1:-1;3838:1483:9;;;;;:::i;:::-;;:::i;1388:64::-;;;;;;;;;;-1:-1:-1;1388:64:9;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;844:219:1;;;;;;;;;;-1:-1:-1;844:219:1;;;;;:::i;:::-;-1:-1:-1;;;844:219:1;;;;;;;;1963:164:8;;;;;;;;;;-1:-1:-1;1963:164:8;;;;;:::i;:::-;;:::i;1832:215:12:-;;;;;;;;;;-1:-1:-1;1832:215:12;;;;;:::i;:::-;;:::i;617:221:1:-;719:4;-1:-1:-1;;;;;;742:49:1;;-1:-1:-1;;;742:49:1;;:89;;-1:-1:-1;;;;;;;;;;829:40:6;;;795:36:1;735:96;617:221;-1:-1:-1;;617:221:1:o;1031:18:9:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2461:211::-;2561:10;2535:4;2551:21;;;:9;:21;;;;;;;;-1:-1:-1;;;;;2551:30:9;;;;;;;;;;:39;;;2606:37;2535:4;;2551:30;;2606:37;;;;2584:6;3679:25:14;;3667:2;3652:18;;3533:177;2606:37:9;;;;;;;;-1:-1:-1;2661:4:9;2461:211;;;;:::o;3539:373:12:-;902:33:8;915:10;927:7;;-1:-1:-1;;;;;;927:7:8;902:12;:33::i;:::-;894:58;;;;-1:-1:-1;;;894:58:8;;;;;;;:::i;:::-;;;;;;;;;3710:24:12::1;3716:4;3722:11;3710:5;:24::i;:::-;3781:15:::0;;3777:56:::1;;3798:35;-1:-1:-1::0;;;;;3798:18:12;::::1;3817:2:::0;3821:11;3798:18:::1;:35::i;:::-;3887:4;-1:-1:-1::0;;;;;3849:56:12::1;3866:5;-1:-1:-1::0;;;;;3849:56:12::1;3854:2;-1:-1:-1::0;;;;;3849:56:12::1;;3874:11;3893;3849:56;;;;;;14385:25:14::0;;;14441:2;14426:18;;14419:34;14373:2;14358:18;;14211:248;3849:56:12::1;;;;;;;;3539:373:::0;;;;;:::o;2190:417::-;2339:22;902:33:8;915:10;927:7;;-1:-1:-1;;;;;;927:7:8;902:12;:33::i;:::-;894:58;;;;-1:-1:-1;;;894:58:8;;;;;;;:::i;:::-;2401:7:12;;2435:26:::1;::::0;::::1;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2425:36;;2476:9;2471:130;2491:13;2487:1;:17;2471:130;;;2538:52;2571:4;;2576:1;2571:7;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;2538:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;2580:6:12;;-1:-1:-1;2580:6:12;;-1:-1:-1;2587:1:12;;-1:-1:-1;2580:9:12;;::::1;;;;;:::i;:::-;;;;;;;2538:7;;2546:1;2538:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;2538:32:12::1;::::0;:52;:32:::1;:52::i;:::-;2525:7;2533:1;2525:10;;;;;;;;:::i;:::-;;;;;;:65;;;;2506:3;;;;:::i;:::-;;;2471:130;;;;2367:240;2190:417:::0;;;;;;;;:::o;4739:194::-;4828:4;4844:29;4864:4;4870:2;4844:19;:29::i;:::-;4890:36;4909:4;4915:2;4919:6;4890:18;:36::i;:::-;4883:43;;4739:194;;;;;;:::o;5327:177:9:-;5384:7;5427:16;5410:13;:33;:87;;5473:24;:22;:24::i;:::-;5403:94;;5327:177;:::o;5410:87::-;-1:-1:-1;5446:24:9;;5327:177::o;2877:392:12:-;902:33:8;915:10;927:7;;-1:-1:-1;;;;;;927:7:8;902:12;:33::i;:::-;894:58;;;;-1:-1:-1;;;894:58:8;;;;;;;:::i;:::-;3059:15:12;;3055:77:::1;;3076:56;-1:-1:-1::0;;;;;3076:22:12;::::1;3099:4:::0;3113::::1;3120:11:::0;3076:22:::1;:56::i;:::-;3167:22;3173:2;3177:11;3167:5;:22::i;:::-;3246:2;-1:-1:-1::0;;;;;3205:57:12::1;3225:5;-1:-1:-1::0;;;;;3205:57:12::1;3211:4;-1:-1:-1::0;;;;;3205:57:12::1;;3233:11;3250;3205:57;;;;;;14385:25:14::0;;;14441:2;14426:18;;14419:34;14373:2;14358:18;;14211:248;1523:434:8;1794:5;;-1:-1:-1;;;;;1794:5:8;1780:10;:19;;:76;;-1:-1:-1;1803:9:8;;:53;;-1:-1:-1;;;1803:53:8;;-1:-1:-1;;;;;1803:9:8;;;;:17;;:53;;1821:10;;1841:4;;-1:-1:-1;;;;;;1803:9:8;1848:7;;;1803:53;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1772:85;;;;;;1868:9;:24;;-1:-1:-1;;;;;;1868:24:8;-1:-1:-1;;;;;1868:24:8;;;;;;;;1908:42;;1925:10;;1908:42;;-1:-1:-1;;1908:42:8;1523:434;:::o;4173:117:12:-;902:33:8;915:10;927:7;;-1:-1:-1;;;;;;927:7:8;902:12;:33::i;:::-;894:58;;;;-1:-1:-1;;;894:58:8;;;;;;;:::i;:::-;4251:4:12::1;:32:::0;;-1:-1:-1;;;;;;4251:32:12::1;-1:-1:-1::0;;;;;4251:32:12;;;::::1;::::0;;;::::1;::::0;;4173:117::o;1056:20:9:-;;;;;;;:::i;4561:172:12:-;4632:4;4648:35;4668:10;4680:2;4648:19;:35::i;:::-;4700:26;4715:2;4719:6;4700:14;:26::i;3838:1483:9:-;4057:15;4045:8;:27;;4037:63;;;;-1:-1:-1;;;4037:63:9;;16283:2:14;4037:63:9;;;16265:21:14;16322:2;16302:18;;;16295:30;16361:25;16341:18;;;16334:53;16404:18;;4037:63:9;16081:347:14;4037:63:9;4265:24;4292:805;4428:18;:16;:18::i;:::-;-1:-1:-1;;;;;4873:13:9;;;;;;;:6;:13;;;;;;;;;:15;;;;;;;;4511:449;;4555:165;4511:449;;;16720:25:14;16799:18;;;16792:43;;;;16871:15;;;16851:18;;;16844:43;16903:18;;;16896:34;;;16946:19;;;16939:35;;;;16990:19;;;;16983:35;;;4511:449:9;;;;;;;;;;16692:19:14;;;4511:449:9;;;4472:514;;;;;;;;-1:-1:-1;;;4350:658:9;;;17287:27:14;17330:11;;;17323:27;;;;17366:12;;;17359:28;;;;17403:12;;4350:658:9;;;-1:-1:-1;;4350:658:9;;;;;;;;;4319:707;;4350:658;4319:707;;;;4292:805;;;;;;;;;17653:25:14;17726:4;17714:17;;17694:18;;;17687:45;17748:18;;;17741:34;;;17791:18;;;17784:34;;;17625:19;;4292:805:9;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4292:805:9;;-1:-1:-1;;4292:805:9;;;-1:-1:-1;;;;;;;5120:30:9;;;;;;:59;;;5174:5;-1:-1:-1;;;;;5154:25:9;:16;-1:-1:-1;;;;;5154:25:9;;5120:59;5112:86;;;;-1:-1:-1;;;5112:86:9;;18031:2:14;5112:86:9;;;18013:21:14;18070:2;18050:18;;;18043:30;-1:-1:-1;;;18089:18:14;;;18082:44;18143:18;;5112:86:9;17829:338:14;5112:86:9;-1:-1:-1;;;;;5213:27:9;;;;;;;:9;:27;;;;;;;;:36;;;;;;;;;;;;;:44;;;5283:31;3679:25:14;;;5213:36:9;;5283:31;;;;;3652:18:14;5283:31:9;;;;;;;3838:1483;;;;;;;:::o;1963:164:8:-;902:33;915:10;927:7;;-1:-1:-1;;;;;;927:7:8;902:12;:33::i;:::-;894:58;;;;-1:-1:-1;;;894:58:8;;;;;;;:::i;:::-;2046:5:::1;:16:::0;;-1:-1:-1;;;;;;2046:16:8::1;-1:-1:-1::0;;;;;2046:16:8;::::1;::::0;;::::1;::::0;;;2078:42:::1;::::0;2099:10:::1;::::0;2078:42:::1;::::0;-1:-1:-1;;2078:42:8::1;1963:164:::0;:::o;1832:215:12:-;1955:19;902:33:8;915:10;927:7;;-1:-1:-1;;;;;;927:7:8;902:12;:33::i;:::-;894:58;;;;-1:-1:-1;;;894:58:8;;;;;;;:::i;:::-;1999:41:12::1;2028:4;;1999:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;1999:28:12;::::1;::::0;;-1:-1:-1;2034:5:12;1999:28:::1;:41::i;:::-;1990:50:::0;1832:215;-1:-1:-1;;;;;1832:215:12:o;977:540:8:-;1097:9;;1064:4;;-1:-1:-1;;;;;1097:9:8;1415:27;;;;;:77;;-1:-1:-1;1446:46:8;;-1:-1:-1;;;1446:46:8;;-1:-1:-1;;;;;1446:12:8;;;;;:46;;1459:4;;1473;;1480:11;;1446:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1414:96;;;-1:-1:-1;1505:5:8;;-1:-1:-1;;;;;1497:13:8;;;1505:5;;1497:13;1414:96;1407:103;977:540;-1:-1:-1;;;;977:540:8:o;6481:328:9:-;-1:-1:-1;;;;;6553:15:9;;;;;;:9;:15;;;;;:25;;6572:6;;6553:15;:25;;6572:6;;6553:25;:::i;:::-;;;;-1:-1:-1;;6721:11:9;:21;;;;;;;6768:34;;3679:25:14;;;-1:-1:-1;;;;;;;6768:34:9;;;-1:-1:-1;;;;;;;;;;;6768:34:9;3667:2:14;3652:18;6768:34:9;;;;;;;;6481:328;;:::o;2832:1464:11:-;2944:12;3114:4;3108:11;-1:-1:-1;;;3237:17:11;3230:93;-1:-1:-1;;;;;3374:2:11;3370:51;3366:1;3347:17;3343:25;3336:86;3508:6;3503:2;3484:17;3480:26;3473:42;3855:2;3852:1;3848:2;3829:17;3826:1;3819:5;3812;3807:51;3796:62;;;4125:7;4118:2;4100:16;4097:24;4093:1;4089;4083:8;4080:15;4076:46;4069:54;4065:68;4062:172;;;-1:-1:-1;4180:18:11;;4173:26;4201:16;4170:48;4163:56;4062:172;4262:7;4254:35;;;;-1:-1:-1;;;4254:35:11;;18507:2:14;4254:35:11;;;18489:21:14;18546:2;18526:18;;;18519:30;-1:-1:-1;;;18565:18:14;;;18558:45;18620:18;;4254:35:11;18305:339:14;4254:35:11;2934:1362;2832:1464;;;:::o;2975:407:4:-;3074:12;3126:5;3102:21;:29;3098:123;;;3154:56;;-1:-1:-1;;;3154:56:4;;3181:21;3154:56;;;14385:25:14;14426:18;;;14419:34;;;14358:18;;3154:56:4;14211:248:14;3098:123:4;3231:12;3245:23;3272:6;-1:-1:-1;;;;;3272:11:4;3291:5;3298:4;3272:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3230:73;;;;3320:55;3347:6;3355:7;3364:10;3320:26;:55::i;:::-;3313:62;2975:407;-1:-1:-1;;;;;;2975:407:4:o;4395:160:12:-;4486:4;;-1:-1:-1;;;;;4486:4:12;4478:27;4474:74;;4507:4;;:41;;-1:-1:-1;;;4507:41:12;;-1:-1:-1;;;;;19199:15:14;;;4507:41:12;;;19181:34:14;19251:15;;;19231:18;;;19224:43;4537:10:12;19283:18:14;;;19276:43;4507:4:12;;;;:19;;19116:18:14;;4507:41:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4474:74;4395:160;;:::o;3057:592:9:-;-1:-1:-1;;;;;3209:15:9;;3175:4;3209:15;;;:9;:15;;;;;;;;3225:10;3209:27;;;;;;;;-1:-1:-1;;3287:28:9;;3283:80;;3347:16;3357:6;3347:7;:16;:::i;:::-;-1:-1:-1;;;;;3317:15:9;;;;;;:9;:15;;;;;;;;3333:10;3317:27;;;;;;;:46;3283:80;-1:-1:-1;;;;;3374:15:9;;;;;;:9;:15;;;;;:25;;3393:6;;3374:15;:25;;3393:6;;3374:25;:::i;:::-;;;;-1:-1:-1;;;;;;;3545:13:9;;;;;;;:9;:13;;;;;;;:23;;;;;;3594:26;3545:13;;3594:26;;;-1:-1:-1;;;;;;;;;;;3594:26:9;;;3562:6;3679:25:14;;3667:2;3652:18;;3533:177;3594:26:9;;;;;;;;-1:-1:-1;3638:4:9;;3057:592;-1:-1:-1;;;;3057:592:9:o;5510:446::-;5575:7;5672:95;5805:4;5789:22;;;;;;:::i;:::-;;;;;;;;;;5640:295;;;20856:25:14;;;;20897:18;;20890:34;;;;5833:14:9;20940:18:14;;;20933:34;5869:13:9;20983:18:14;;;20976:34;5912:4:9;21026:19:14;;;21019:61;20828:19;;5640:295:9;;;;;;;;;;;;5613:336;;;;;;5594:355;;5510:446;:::o;1187:1639:11:-;1325:12;1495:4;1489:11;-1:-1:-1;;;1618:17:11;1611:93;-1:-1:-1;;;;;1755:4:11;1751:53;1747:1;1728:17;1724:25;1717:88;-1:-1:-1;;;;;1897:2:11;1893:51;1888:2;1869:17;1865:26;1858:87;2031:6;2026:2;2007:17;2003:26;1996:42;2380:2;2377:1;2372:3;2353:17;2350:1;2343:5;2336;2331:52;2320:63;;;2650:7;2643:2;2625:16;2622:24;2618:1;2614;2608:8;2605:15;2601:46;2594:54;2590:68;2587:172;;;-1:-1:-1;2705:18:11;;2698:26;2726:16;2695:48;2688:56;2587:172;2787:7;2779:40;;;;-1:-1:-1;;;2779:40:11;;21293:2:14;2779:40:11;;;21275:21:14;21332:2;21312:18;;;21305:30;-1:-1:-1;;;21351:18:14;;;21344:50;21411:18;;2779:40:11;21091:344:14;2779:40:11;1315:1511;1187:1639;;;;:::o;6150:325:9:-;6235:6;6220:11;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;6387:13:9;;;;;;:9;:13;;;;;;;;:23;;;;;;6436:32;3679:25:14;;;-1:-1:-1;;;;;;;;;;;6436:32:9;3652:18:14;6436:32:9;3533:177:14;2678:373:9;2774:10;2748:4;2764:21;;;:9;:21;;;;;:31;;2789:6;;2764:21;2748:4;;2764:31;;2789:6;;2764:31;:::i;:::-;;;;-1:-1:-1;;;;;;;2941:13:9;;;;;;:9;:13;;;;;;;:23;;;;;;2990:32;2999:10;;-1:-1:-1;;;;;;;;;;;2990:32:9;;;2958:6;3679:25:14;;3667:2;3652:18;;3533:177;4437:582:4;4581:12;4610:7;4605:408;;4633:19;4641:10;4633:7;:19::i;:::-;4605:408;;;4857:17;;:22;:49;;;;-1:-1:-1;;;;;;4883:18:4;;;:23;4857:49;4853:119;;;4933:24;;-1:-1:-1;;;4933:24:4;;-1:-1:-1;;;;;8227:32:14;;4933:24:4;;;8209:51:14;8182:18;;4933:24:4;8036:230:14;4853:119:4;-1:-1:-1;4992:10:4;4985:17;;5559:434;5690:17;;:21;5686:301;;5894:10;5888:17;5881:4;5869:10;5865:21;5858:48;5686:301;5957:19;;-1:-1:-1;;;5957:19:4;;;;;;;;;;;5686:301;5559:434;:::o;14:286:14:-;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;167:23;;-1:-1:-1;;;;;;219:32:14;;209:43;;199:71;;266:1;263;256:12;497:250;582:1;592:113;606:6;603:1;600:13;592:113;;;682:11;;;676:18;663:11;;;656:39;628:2;621:10;592:113;;;-1:-1:-1;;739:1:14;721:16;;714:27;497:250::o;752:271::-;794:3;832:5;826:12;859:6;854:3;847:19;875:76;944:6;937:4;932:3;928:14;921:4;914:5;910:16;875:76;:::i;:::-;1005:2;984:15;-1:-1:-1;;980:29:14;971:39;;;;1012:4;967:50;;752:271;-1:-1:-1;;752:271:14:o;1028:220::-;1177:2;1166:9;1159:21;1140:4;1197:45;1238:2;1227:9;1223:18;1215:6;1197:45;:::i;1253:131::-;-1:-1:-1;;;;;1328:31:14;;1318:42;;1308:70;;1374:1;1371;1364:12;1389:315;1457:6;1465;1518:2;1506:9;1497:7;1493:23;1489:32;1486:52;;;1534:1;1531;1524:12;1486:52;1573:9;1560:23;1592:31;1617:5;1592:31;:::i;:::-;1642:5;1694:2;1679:18;;;;1666:32;;-1:-1:-1;;;1389:315:14:o;1709:127::-;1770:10;1765:3;1761:20;1758:1;1751:31;1801:4;1798:1;1791:15;1825:4;1822:1;1815:15;1841:275;1912:2;1906:9;1977:2;1958:13;;-1:-1:-1;;1954:27:14;1942:40;;2012:18;1997:34;;2033:22;;;1994:62;1991:88;;;2059:18;;:::i;:::-;2095:2;2088:22;1841:275;;-1:-1:-1;1841:275:14:o;2121:530::-;2163:5;2216:3;2209:4;2201:6;2197:17;2193:27;2183:55;;2234:1;2231;2224:12;2183:55;2270:6;2257:20;2296:18;2292:2;2289:26;2286:52;;;2318:18;;:::i;:::-;2362:55;2405:2;2386:13;;-1:-1:-1;;2382:27:14;2411:4;2378:38;2362:55;:::i;:::-;2442:2;2433:7;2426:19;2488:3;2481:4;2476:2;2468:6;2464:15;2460:26;2457:35;2454:55;;;2505:1;2502;2495:12;2454:55;2570:2;2563:4;2555:6;2551:17;2544:4;2535:7;2531:18;2518:55;2618:1;2593:16;;;2611:4;2589:27;2582:38;;;;2597:7;2121:530;-1:-1:-1;;;2121:530:14:o;2656:665::-;2751:6;2759;2767;2775;2828:3;2816:9;2807:7;2803:23;2799:33;2796:53;;;2845:1;2842;2835:12;2796:53;2884:9;2871:23;2903:31;2928:5;2903:31;:::i;:::-;2953:5;-1:-1:-1;3010:2:14;2995:18;;2982:32;3023:33;2982:32;3023:33;:::i;:::-;3075:7;-1:-1:-1;3129:2:14;3114:18;;3101:32;;-1:-1:-1;3184:2:14;3169:18;;3156:32;3211:18;3200:30;;3197:50;;;3243:1;3240;3233:12;3197:50;3266:49;3307:7;3298:6;3287:9;3283:22;3266:49;:::i;:::-;3256:59;;;2656:665;;;;;;;:::o;3715:681::-;3824:6;3832;3840;3848;3856;3909:3;3897:9;3888:7;3884:23;3880:33;3877:53;;;3926:1;3923;3916:12;3877:53;3965:9;3952:23;3984:31;4009:5;3984:31;:::i;:::-;4034:5;-1:-1:-1;4091:2:14;4076:18;;4063:32;4104:33;4063:32;4104:33;:::i;:::-;4156:7;-1:-1:-1;4210:2:14;4195:18;;4182:32;;-1:-1:-1;4266:2:14;4251:18;;4238:32;4279:33;4238:32;4279:33;:::i;:::-;3715:681;;;;-1:-1:-1;3715:681:14;;4385:3;4370:19;4357:33;;3715:681;-1:-1:-1;;3715:681:14:o;4401:367::-;4464:8;4474:6;4528:3;4521:4;4513:6;4509:17;4505:27;4495:55;;4546:1;4543;4536:12;4495:55;-1:-1:-1;4569:20:14;;4612:18;4601:30;;4598:50;;;4644:1;4641;4634:12;4598:50;4681:4;4673:6;4669:17;4657:29;;4741:3;4734:4;4724:6;4721:1;4717:14;4709:6;4705:27;4701:38;4698:47;4695:67;;;4758:1;4755;4748:12;4695:67;4401:367;;;;;:::o;4773:1099::-;4942:6;4950;4958;4966;4974;4982;5035:2;5023:9;5014:7;5010:23;5006:32;5003:52;;;5051:1;5048;5041:12;5003:52;5091:9;5078:23;5120:18;5161:2;5153:6;5150:14;5147:34;;;5177:1;5174;5167:12;5147:34;5216:70;5278:7;5269:6;5258:9;5254:22;5216:70;:::i;:::-;5305:8;;-1:-1:-1;5190:96:14;-1:-1:-1;5393:2:14;5378:18;;5365:32;;-1:-1:-1;5409:16:14;;;5406:36;;;5438:1;5435;5428:12;5406:36;5477:72;5541:7;5530:8;5519:9;5515:24;5477:72;:::i;:::-;5568:8;;-1:-1:-1;5451:98:14;-1:-1:-1;5656:2:14;5641:18;;5628:32;;-1:-1:-1;5672:16:14;;;5669:36;;;5701:1;5698;5691:12;5669:36;;5740:72;5804:7;5793:8;5782:9;5778:24;5740:72;:::i;:::-;4773:1099;;;;-1:-1:-1;4773:1099:14;;-1:-1:-1;4773:1099:14;;5831:8;;4773:1099;-1:-1:-1;;;4773:1099:14:o;5877:801::-;6037:4;6066:2;6106;6095:9;6091:18;6136:2;6125:9;6118:21;6159:6;6194;6188:13;6225:6;6217;6210:22;6263:2;6252:9;6248:18;6241:25;;6325:2;6315:6;6312:1;6308:14;6297:9;6293:30;6289:39;6275:53;;6363:2;6355:6;6351:15;6384:1;6394:255;6408:6;6405:1;6402:13;6394:255;;;6501:2;6497:7;6485:9;6477:6;6473:22;6469:36;6464:3;6457:49;6529:40;6562:6;6553;6547:13;6529:40;:::i;:::-;6519:50;-1:-1:-1;6627:12:14;;;;6592:15;;;;6430:1;6423:9;6394:255;;;-1:-1:-1;6666:6:14;;5877:801;-1:-1:-1;;;;;;;5877:801:14:o;6683:456::-;6760:6;6768;6776;6829:2;6817:9;6808:7;6804:23;6800:32;6797:52;;;6845:1;6842;6835:12;6797:52;6884:9;6871:23;6903:31;6928:5;6903:31;:::i;:::-;6953:5;-1:-1:-1;7010:2:14;6995:18;;6982:32;7023:33;6982:32;7023:33;:::i;:::-;6683:456;;7075:7;;-1:-1:-1;;;7129:2:14;7114:18;;;;7101:32;;6683:456::o;7515:247::-;7574:6;7627:2;7615:9;7606:7;7602:23;7598:32;7595:52;;;7643:1;7640;7633:12;7595:52;7682:9;7669:23;7701:31;7726:5;7701:31;:::i;8479:712::-;8533:5;8586:3;8579:4;8571:6;8567:17;8563:27;8553:55;;8604:1;8601;8594:12;8553:55;8640:6;8627:20;8666:4;8689:18;8685:2;8682:26;8679:52;;;8711:18;;:::i;:::-;8757:2;8754:1;8750:10;8780:28;8804:2;8800;8796:11;8780:28;:::i;:::-;8842:15;;;8912;;;8908:24;;;8873:12;;;;8944:15;;;8941:35;;;8972:1;8969;8962:12;8941:35;9008:2;9000:6;8996:15;8985:26;;9020:142;9036:6;9031:3;9028:15;9020:142;;;9102:17;;9090:30;;9053:12;;;;9140;;;;9020:142;;;9180:5;8479:712;-1:-1:-1;;;;;;;8479:712:14:o;9196:1071::-;9350:6;9358;9366;9374;9382;9435:3;9423:9;9414:7;9410:23;9406:33;9403:53;;;9452:1;9449;9442:12;9403:53;9491:9;9478:23;9510:31;9535:5;9510:31;:::i;:::-;9560:5;-1:-1:-1;9617:2:14;9602:18;;9589:32;9630:33;9589:32;9630:33;:::i;:::-;9682:7;-1:-1:-1;9740:2:14;9725:18;;9712:32;9763:18;9793:14;;;9790:34;;;9820:1;9817;9810:12;9790:34;9843:61;9896:7;9887:6;9876:9;9872:22;9843:61;:::i;:::-;9833:71;;9957:2;9946:9;9942:18;9929:32;9913:48;;9986:2;9976:8;9973:16;9970:36;;;10002:1;9999;9992:12;9970:36;10025:63;10080:7;10069:8;10058:9;10054:24;10025:63;:::i;:::-;10015:73;;10141:3;10130:9;10126:19;10113:33;10097:49;;10171:2;10161:8;10158:16;10155:36;;;10187:1;10184;10177:12;10155:36;;10210:51;10253:7;10242:8;10231:9;10227:24;10210:51;:::i;:::-;10200:61;;;9196:1071;;;;;;;;:::o;10497:829::-;10608:6;10616;10624;10632;10640;10648;10656;10709:3;10697:9;10688:7;10684:23;10680:33;10677:53;;;10726:1;10723;10716:12;10677:53;10765:9;10752:23;10784:31;10809:5;10784:31;:::i;:::-;10834:5;-1:-1:-1;10891:2:14;10876:18;;10863:32;10904:33;10863:32;10904:33;:::i;:::-;10956:7;-1:-1:-1;11010:2:14;10995:18;;10982:32;;-1:-1:-1;11061:2:14;11046:18;;11033:32;;-1:-1:-1;11117:3:14;11102:19;;11089:33;11166:4;11153:18;;11141:31;;11131:59;;11186:1;11183;11176:12;11131:59;10497:829;;;;-1:-1:-1;10497:829:14;;;;11209:7;11263:3;11248:19;;11235:33;;-1:-1:-1;11315:3:14;11300:19;;;11287:33;;10497:829;-1:-1:-1;;10497:829:14:o;11331:388::-;11399:6;11407;11460:2;11448:9;11439:7;11435:23;11431:32;11428:52;;;11476:1;11473;11466:12;11428:52;11515:9;11502:23;11534:31;11559:5;11534:31;:::i;:::-;11584:5;-1:-1:-1;11641:2:14;11626:18;;11613:32;11654:33;11613:32;11654:33;:::i;:::-;11706:7;11696:17;;;11331:388;;;;;:::o;11724:734::-;11828:6;11836;11844;11852;11860;11913:3;11901:9;11892:7;11888:23;11884:33;11881:53;;;11930:1;11927;11920:12;11881:53;11969:9;11956:23;11988:31;12013:5;11988:31;:::i;:::-;12038:5;-1:-1:-1;12095:2:14;12080:18;;12067:32;12108:33;12067:32;12108:33;:::i;:::-;12160:7;-1:-1:-1;12214:2:14;12199:18;;12186:32;;-1:-1:-1;12265:2:14;12250:18;;12237:32;;-1:-1:-1;12320:3:14;12305:19;;12292:33;12348:18;12337:30;;12334:50;;;12380:1;12377;12370:12;12334:50;12403:49;12444:7;12435:6;12424:9;12420:22;12403:49;:::i;12463:794::-;12551:6;12559;12567;12575;12628:2;12616:9;12607:7;12603:23;12599:32;12596:52;;;12644:1;12641;12634:12;12596:52;12683:9;12670:23;12702:31;12727:5;12702:31;:::i;:::-;12752:5;-1:-1:-1;12808:2:14;12793:18;;12780:32;12831:18;12861:14;;;12858:34;;;12888:1;12885;12878:12;12858:34;12926:6;12915:9;12911:22;12901:32;;12971:7;12964:4;12960:2;12956:13;12952:27;12942:55;;12993:1;12990;12983:12;12942:55;13033:2;13020:16;13059:2;13051:6;13048:14;13045:34;;;13075:1;13072;13065:12;13045:34;13120:7;13115:2;13106:6;13102:2;13098:15;13094:24;13091:37;13088:57;;;13141:1;13138;13131:12;13088:57;12463:794;;13172:2;13164:11;;;;;-1:-1:-1;13194:6:14;;13247:2;13232:18;13219:32;;-1:-1:-1;12463:794:14;-1:-1:-1;;;12463:794:14:o;13485:380::-;13564:1;13560:12;;;;13607;;;13628:61;;13682:4;13674:6;13670:17;13660:27;;13628:61;13735:2;13727:6;13724:14;13704:18;13701:38;13698:161;;13781:10;13776:3;13772:20;13769:1;13762:31;13816:4;13813:1;13806:15;13844:4;13841:1;13834:15;13698:161;;13485:380;;;:::o;13870:336::-;14072:2;14054:21;;;14111:2;14091:18;;;14084:30;-1:-1:-1;;;14145:2:14;14130:18;;14123:42;14197:2;14182:18;;13870:336::o;14464:127::-;14525:10;14520:3;14516:20;14513:1;14506:31;14556:4;14553:1;14546:15;14580:4;14577:1;14570:15;14596:521;14673:4;14679:6;14739:11;14726:25;14833:2;14829:7;14818:8;14802:14;14798:29;14794:43;14774:18;14770:68;14760:96;;14852:1;14849;14842:12;14760:96;14879:33;;14931:20;;;-1:-1:-1;14974:18:14;14963:30;;14960:50;;;15006:1;15003;14996:12;14960:50;15039:4;15027:17;;-1:-1:-1;15070:14:14;15066:27;;;15056:38;;15053:58;;;15107:1;15104;15097:12;15122:127;15183:10;15178:3;15174:20;15171:1;15164:31;15214:4;15211:1;15204:15;15238:4;15235:1;15228:15;15254:135;15293:3;15314:17;;;15311:43;;15334:18;;:::i;:::-;-1:-1:-1;15381:1:14;15370:13;;15254:135::o;15394:400::-;-1:-1:-1;;;;;15650:15:14;;;15632:34;;15702:15;;;;15697:2;15682:18;;15675:43;-1:-1:-1;;;;;;15754:33:14;;;15749:2;15734:18;;15727:61;15582:2;15567:18;;15394:400::o;15799:277::-;15866:6;15919:2;15907:9;15898:7;15894:23;15890:32;15887:52;;;15935:1;15932;15925:12;15887:52;15967:9;15961:16;16020:5;16013:13;16006:21;15999:5;15996:32;15986:60;;16042:1;16039;16032:12;18172:128;18239:9;;;18260:11;;;18257:37;;;18274:18;;:::i;18649:287::-;18778:3;18816:6;18810:13;18832:66;18891:6;18886:3;18879:4;18871:6;18867:17;18832:66;:::i;:::-;18914:16;;;;;18649:287;-1:-1:-1;;18649:287:14:o;19459:1133::-;19589:3;19618:1;19651:6;19645:13;19681:3;19703:1;19731:9;19727:2;19723:18;19713:28;;19791:2;19780:9;19776:18;19813;19803:61;;19857:4;19849:6;19845:17;19835:27;;19803:61;19883:2;19931;19923:6;19920:14;19900:18;19897:38;19894:165;;-1:-1:-1;;;19958:33:14;;20014:4;20011:1;20004:15;20044:4;19965:3;20032:17;19894:165;20075:18;20102:133;;;;20249:1;20244:323;;;;20068:499;;20102:133;-1:-1:-1;;20135:24:14;;20123:37;;20208:14;;20201:22;20189:35;;20180:45;;;-1:-1:-1;20102:133:14;;20244:323;19406:1;19399:14;;;19443:4;19430:18;;20342:1;20356:165;20370:6;20367:1;20364:13;20356:165;;;20448:14;;20435:11;;;20428:35;20491:16;;;;20385:10;;20356:165;;;20360:3;;20550:6;20545:3;20541:16;20534:23;;20068:499;-1:-1:-1;20583:3:14;;19459:1133;-1:-1:-1;;;;;;;;19459:1133:14:o;21440:125::-;21505:9;;;21526:10;;;21523:36;;;21539:18;;:::i
Swarm Source
ipfs://3351da6d516b6d584b0035ca953a990bc44a9c740f5de7da00ad7d12c94ff6af
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.