Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 17 from a total of 17 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Pre Sale | 18880371 | 238 days ago | IN | 0.11 ETH | 0.00158894 | ||||
Pre Sale | 18831796 | 245 days ago | IN | 0.55 ETH | 0.00265087 | ||||
Pre Sale | 18777495 | 252 days ago | IN | 0.11 ETH | 0.00352758 | ||||
Pre Sale | 18771051 | 253 days ago | IN | 0.11 ETH | 0.005623 | ||||
Launchpad | 18768454 | 254 days ago | IN | 0 ETH | 0.00089261 | ||||
Launchpad | 18768452 | 254 days ago | IN | 0 ETH | 0.00085529 | ||||
Launchpad | 18768450 | 254 days ago | IN | 0 ETH | 0.00454069 | ||||
Pre Sale | 18726787 | 260 days ago | IN | 0.0001 ETH | 0.00404552 | ||||
Pre Sale | 18726778 | 260 days ago | IN | 0.0001 ETH | 0.00373093 | ||||
Pre Sale | 18726771 | 260 days ago | IN | 0.0001 ETH | 0.0036433 | ||||
Pre Sale | 18726667 | 260 days ago | IN | 0.0001 ETH | 0.00484171 | ||||
Launchpad | 18726590 | 260 days ago | IN | 0 ETH | 0.00707408 | ||||
Pre Sale | 18676452 | 267 days ago | IN | 0.0001 ETH | 0.00246152 | ||||
Pre Sale | 18675992 | 267 days ago | IN | 0.0001 ETH | 0.00243756 | ||||
Pre Sale | 18675907 | 267 days ago | IN | 0.0001 ETH | 0.00304432 | ||||
Launchpad | 18675382 | 267 days ago | IN | 0 ETH | 0.00458315 | ||||
0x60806040 | 18668398 | 268 days ago | IN | 0 ETH | 0.05765945 |
Latest 11 internal transactions
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
18880371 | 238 days ago | 0.11 ETH | ||||
18831796 | 245 days ago | 0.55 ETH | ||||
18777495 | 252 days ago | 0.11 ETH | ||||
18771051 | 253 days ago | 0.11 ETH | ||||
18726787 | 260 days ago | 0.0001 ETH | ||||
18726778 | 260 days ago | 0.0001 ETH | ||||
18726771 | 260 days ago | 0.0001 ETH | ||||
18726667 | 260 days ago | 0.0001 ETH | ||||
18676452 | 267 days ago | 0.0001 ETH | ||||
18675992 | 267 days ago | 0.0001 ETH | ||||
18675907 | 267 days ago | 0.0001 ETH |
Loading...
Loading
Contract Name:
LaunchPad
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; import "@openzeppelin/[email protected]/token/ERC20/IERC20.sol"; import "@openzeppelin/[email protected]/token/ERC20/utils/SafeERC20.sol"; import "@openzeppelin/[email protected]/utils/Address.sol"; import "@openzeppelin/[email protected]/access/AccessControl.sol"; import "@openzeppelin/[email protected]/security/ReentrancyGuard.sol"; contract LaunchPad is AccessControl, ReentrancyGuard { using Address for address; using SafeERC20 for IERC20; bytes32 public constant OPERATOR_ROLE = keccak256("OPERATOR_ROLE"); event PreSaleClaimed(uint256 indexed roundID, address indexed sender, uint256 indexed preSaleID, uint256 preSaleNum); event Refund(uint256 indexed roundID, address indexed recipient, uint256 amount); struct Project { address target; // nft or deposit or any contract address payable receipt; // receive payment address payment; // ETH or ERC20 uint256 nftPrice; // nft nftPrice uint256 totalSales; // nft totalSales uint256 startTime; // start uint256 endTime; // end mapping(address => mapping(uint256 => uint256)) preSaleRecords; //preSale records } // roundID => Project mapping(uint256 => Project) private round; constructor(address admin, address operator) { _setupRole(DEFAULT_ADMIN_ROLE, admin); _grantRole(OPERATOR_ROLE, operator); } receive() external payable {} /** * @dev Initializes a new presale round. * This function sets up the details for a new launchpad project with a specified ID. It requires several parameters: * - The target address of the presale. * - The receipt address where funds will be sent. * - The address of the ERC20 token to be used for payments (if any). * - The price of each NFT in the presale. * - The start and end times for the presale round. * * Note: This function can only be called by an account with the `OPERATOR_ROLE`. * * @param _roundID The ID of the presale round to set up. * @param _target The target address of the presale. * @param _receipt The receipt address where funds will be sent. * @param _payment The address of the ERC20 token to be used for payments (if any). * @param _nftPrice The price of each NFT in the presale. * @param _startTime The start time for the presale round. * @param _endTime The end time for the presale round. */ function launchpad(uint256 _roundID, address _target, address payable _receipt, address _payment, uint256 _nftPrice, uint256 _startTime, uint256 _endTime) public onlyRole(OPERATOR_ROLE) { require(_endTime > block.timestamp, "Invalid time"); require(_target != address(0), "Invalid target"); require(_receipt != address(0), "Invalid receipt"); require(_nftPrice > 0, "nftPrice > 0"); Project storage project = round[_roundID]; require(project.target == address(0), "Already setting"); project.target = _target; project.receipt = _receipt; project.payment = _payment; project.nftPrice = _nftPrice; project.startTime = _startTime; project.endTime = _endTime; } /** * @dev Executes a presale transaction. * This function allows a user to participate in a presale round by purchasing a specific amount of tokens. * The function performs several checks to validate the transaction: * - Checks that the current time is within the project's start and end times. * - Verifies that the `preSaleID` has not been used before by the sender. * - Checks that the `preSaleNum` is greater than 0. * - If the project's payment address is the zero address, it checks that the value sent with the transaction is * greater or equal to the total cost of the tokens. Any excess value is refunded to the sender. * - If the project's payment address is not the zero address, it checks that no ether was sent with the transaction, * and transfers the total cost of tokens from the sender to the project's receipt address using an ERC20 token transfer. * * After the checks and transfers, the function increments the project's total sales by `preSaleNum`, * and records the total payment for the `preSaleID` of the sender. * * Finally, it emits a `PreSaleClaimed` event. * * @param roundID The ID of the Project. * @param preSaleID The ID of the presale. * @param preSaleNum The number of tokens to purchase in the presale. */ function preSale(uint256 roundID, uint256 preSaleID, uint256 preSaleNum) public payable nonReentrant { Project storage project = round[roundID]; // Verify time require(project.startTime <= block.timestamp, "The LaunchPad activity has not started"); require(project.endTime >= block.timestamp, "The LaunchPad activity has ended"); // Verify preSaleID and preSaleNum require(project.preSaleRecords[msg.sender][preSaleID] == 0, "Duplicate preSaleID"); require(preSaleNum > 0, "preSaleNum>0"); // Receipt token && Refund token uint256 total = project.nftPrice * preSaleNum; if (project.payment == address(0)) { require(msg.value >= total, "Insufficient token"); uint256 _refund = msg.value - total; if (_refund > 0) { // Refund the excess token payable(msg.sender).transfer(_refund); } // Transfer the total payment to the project receipt address project.receipt.transfer(total); } else { require(msg.value == 0, "Needn't pay mainnet token"); // Transfer the total payment from the sender to the project receipt address IERC20(project.payment).safeTransferFrom(msg.sender, project.receipt, total); } // Increment the total sales for the project unchecked{ project.totalSales += preSaleNum; } // Record the total payment for the preSaleID of the sender project.preSaleRecords[msg.sender][preSaleID] = total; emit PreSaleClaimed(roundID, msg.sender, preSaleID, preSaleNum); } /** * @dev Initiates refunds for a special project. * This function allows the project owner to refund amounts to multiple recipients. * It requires the round ID, the source address of the funds, an array of recipient addresses and an array of amounts. * * The function performs several checks to validate the parameters: * - Verifies that the length of the recipients array is equal to the length of the amounts array. * * After the checks, it retrieves the ERC20 token used for payments in the presale round, * and for each recipient in the array, it transfers the corresponding amount from the source address to the recipient. * It then emits a `Refund` event for each transfer. * * Note: This function can only be called by an account with appropriate permissions (typically the contract owner). * * @param roundID The ID of the presale round. * @param recipients An array of addresses to refund. * @param amounts An array of amounts to refund to each recipient. */ function refund(uint256 roundID, address[] calldata recipients, uint256[] calldata amounts) external payable nonReentrant { require(recipients.length == amounts.length, "Wrong senders array-length"); uint256 total; for (uint256 i = 0; i < recipients.length; i++) { require(amounts[i] > 0, "Amount should greater than zero"); total += amounts[i]; } // Get the project associated with the given roundID Project storage project = round[roundID]; if (project.payment == address(0)) { require(msg.value >= total, "Insufficient amount token"); uint256 _refund = msg.value - total; if (_refund > 0) { // Refund the excess token payable(msg.sender).transfer(_refund); } // Iterate over each recipient and transfer the corresponding amount of tokens for (uint256 i = 0; i < recipients.length; i++) { // Transfer tokens to the recipient payable(recipients[i]).transfer(amounts[i]); emit Refund(roundID, recipients[i], amounts[i]); } } else { require(msg.value == 0, "Needn't pay mainnet token"); address erc20Token = project.payment; // Iterate over each recipient and transfer the corresponding amount of tokens for (uint256 i = 0; i < recipients.length; i++) { // Transfer tokens to the recipient IERC20(erc20Token).safeTransferFrom(msg.sender, recipients[i], amounts[i]); emit Refund(roundID, recipients[i], amounts[i]); } } } // Returns project details by the roundID. function getProject(uint256 roundID) external view returns (address, address, address, uint256, uint256, uint256, uint256){ Project storage project = round[roundID]; return (project.target, project.receipt, project.payment, project.nftPrice, project.totalSales, project.startTime, project.endTime); } // Returns project totalSales by the roundID. function getProjectTotalSales(uint256 roundID) external view returns (uint256){ Project storage project = round[roundID]; return project.totalSales; } // Returns project preSaleRecords by the roundID. function getProjectPreSale(uint256 roundID, address user, uint256 preSaleID) external view returns (uint256){ Project storage project = round[roundID]; return project.preSaleRecords[user][preSaleID]; } /** * @dev Executes a function call on another contract. * @param dest The address of the contract to call. * @param value The amount of ether/matic/mainnet token to send with the call. * @param func The function signature and parameters to call. */ function execute(address dest, uint256 value, bytes calldata func) external onlyRole(OPERATOR_ROLE) { _call(dest, value, func); } /** * @dev Executes a batch of function calls on multiple contracts. * This function allows this contract to execute a batch of function calls on multiple contracts by specifying * an array of destination addresses, an array of values to send with each call, and an array of function signatures * and parameters for each call. * @param dest An array of addresses of the contracts to call. * @param value An array of amounts of ether/matic/mainnet token to send with each call. * @param func An array of function signatures and parameters to call for each destination. */ function executeBatch(address[] calldata dest, uint256[] calldata value, bytes[] calldata func) external onlyRole(OPERATOR_ROLE) { require(dest.length == func.length && (value.length == 0 || value.length == func.length), "Wrong array lengths"); if (value.length == 0) { for (uint256 i = 0; i < dest.length; i++) { _call(dest[i], 0, func[i]); } } else { for (uint256 i = 0; i < dest.length; i++) { _call(dest[i], value[i], func[i]); } } } /** * @dev Executes a low-level call to another contract. * This internal function allows the contract to execute a low-level call to another contract, * by specifying the target address, the value to send with the call, and the data to send. * * It performs the call and checks if it was successful. If not, it reverts the transaction and returns * the error message from the failed call. * * Note: Use this function with caution as low-level calls can be dangerous. * * @param target The address of the contract to call. * @param value The amount of ether/mainnet token to send with the call. * @param data The data to send with the call. */ function _call(address target, uint256 value, bytes memory data) internal { (bool success, bytes memory result) = target.call{value: value}(data); if (!success) { assembly { revert(add(result, 32), mload(result)) } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (access/AccessControl.sol) pragma solidity ^0.8.0; import "./IAccessControl.sol"; import "../utils/Context.sol"; import "../utils/Strings.sol"; import "../utils/introspection/ERC165.sol"; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(account), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleGranted} event. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleRevoked} event. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. * * May emit a {RoleRevoked} event. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * May emit a {RoleGranted} event. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; import "../extensions/draft-IERC20Permit.sol"; import "../../../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) pragma solidity ^0.8.0; import "./math/Math.sol"; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // �� `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // �� `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"roundID","type":"uint256"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"uint256","name":"preSaleID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"preSaleNum","type":"uint256"}],"name":"PreSaleClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"roundID","type":"uint256"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Refund","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dest","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"func","type":"bytes"}],"name":"execute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"dest","type":"address[]"},{"internalType":"uint256[]","name":"value","type":"uint256[]"},{"internalType":"bytes[]","name":"func","type":"bytes[]"}],"name":"executeBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"roundID","type":"uint256"}],"name":"getProject","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"roundID","type":"uint256"},{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"preSaleID","type":"uint256"}],"name":"getProjectPreSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"roundID","type":"uint256"}],"name":"getProjectTotalSales","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_roundID","type":"uint256"},{"internalType":"address","name":"_target","type":"address"},{"internalType":"address payable","name":"_receipt","type":"address"},{"internalType":"address","name":"_payment","type":"address"},{"internalType":"uint256","name":"_nftPrice","type":"uint256"},{"internalType":"uint256","name":"_startTime","type":"uint256"},{"internalType":"uint256","name":"_endTime","type":"uint256"}],"name":"launchpad","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"roundID","type":"uint256"},{"internalType":"uint256","name":"preSaleID","type":"uint256"},{"internalType":"uint256","name":"preSaleNum","type":"uint256"}],"name":"preSale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"roundID","type":"uint256"},{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"refund","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162001e2d38038062001e2d833981016040819052620000349162000146565b600180556200004560008362000079565b620000717f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9298262000089565b50506200017e565b62000085828262000089565b5050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff1662000085576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620000e53390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b80516001600160a01b03811681146200014157600080fd5b919050565b600080604083850312156200015a57600080fd5b620001658362000129565b9150620001756020840162000129565b90509250929050565b611c9f806200018e6000396000f3fe6080604052600436106100f75760003560e01c8063a217fddf1161008a578063f0e4954611610059578063f0e49546146102de578063f0f3f2c8146102f1578063f5b541a61461039f578063ff479f88146103c157600080fd5b8063a217fddf14610259578063b61d27f61461026e578063d547741f1461028e578063ef8234a7146102ae57600080fd5b806336568abe116100c657806336568abe146101ab57806347e1da2a146101cb5780636140af36146101eb57806391d148541461023957600080fd5b806301ffc9a71461010357806310861a9414610138578063248a9ca31461014d5780632f2ff15d1461018b57600080fd5b366100fe57005b600080fd5b34801561010f57600080fd5b5061012361011e3660046116e9565b6103e1565b60405190151581526020015b60405180910390f35b61014b610146366004611713565b610418565b005b34801561015957600080fd5b5061017d61016836600461173f565b60009081526020819052604090206001015490565b60405190815260200161012f565b34801561019757600080fd5b5061014b6101a636600461176d565b610757565b3480156101b757600080fd5b5061014b6101c636600461176d565b61077c565b3480156101d757600080fd5b5061014b6101e63660046117e9565b6107fa565b3480156101f757600080fd5b5061017d610206366004611883565b60009283526002602090815260408085206001600160a01b03949094168552600790930181528284209184525290205490565b34801561024557600080fd5b5061012361025436600461176d565b61099d565b34801561026557600080fd5b5061017d600081565b34801561027a57600080fd5b5061014b6102893660046118bb565b6109c6565b34801561029a57600080fd5b5061014b6102a936600461176d565b610a26565b3480156102ba57600080fd5b5061017d6102c936600461173f565b60009081526002602052604090206004015490565b61014b6102ec366004611944565b610a4b565b3480156102fd57600080fd5b5061035961030c36600461173f565b600090815260026020819052604090912080546001820154928201546003830154600484015460058501546006909501546001600160a01b03948516979685169694909316949193909290565b604080516001600160a01b039889168152968816602088015294909616938501939093526060840191909152608083015260a082015260c081019190915260e00161012f565b3480156103ab57600080fd5b5061017d600080516020611c4a83398151915281565b3480156103cd57600080fd5b5061014b6103dc3660046119be565b610e85565b60006001600160e01b03198216637965db0b60e01b148061041257506301ffc9a760e01b6001600160e01b03198316145b92915050565b61042061105a565b600083815260026020526040902060058101544210156104965760405162461bcd60e51b815260206004820152602660248201527f546865204c61756e636850616420616374697669747920686173206e6f7420736044820152651d185c9d195960d21b60648201526084015b60405180910390fd5b42816006015410156104ea5760405162461bcd60e51b815260206004820181905260248201527f546865204c61756e63685061642061637469766974792068617320656e646564604482015260640161048d565b33600090815260078201602090815260408083208684529091529020541561054a5760405162461bcd60e51b8152602060048201526013602482015272111d5c1b1a58d85d19481c1c9954d85b195251606a1b604482015260640161048d565b600082116105895760405162461bcd60e51b815260206004820152600c60248201526b070726553616c654e756d3e360a41b604482015260640161048d565b600082826003015461059b9190611a42565b60028301549091506001600160a01b031661067b57803410156105f55760405162461bcd60e51b815260206004820152601260248201527124b739bab33334b1b4b2b73a103a37b5b2b760711b604482015260640161048d565b60006106018234611a59565b9050801561063857604051339082156108fc029083906000818181858888f19350505050158015610636573d6000803e3d6000fd5b505b60018301546040516001600160a01b039091169083156108fc029084906000818181858888f19350505050158015610674573d6000803e3d6000fd5b50506106e8565b34156106c55760405162461bcd60e51b81526020600482015260196024820152782732b2b23713ba103830bc9036b0b4b73732ba103a37b5b2b760391b604482015260640161048d565b600182015460028301546106e8916001600160a01b0391821691339116846110b3565b600482018054840190553360008181526007840160209081526040808320888452825291829020849055905185815286929188917ffc56c93abd69974b6f339698650e3c044f5463dab795e579b486279febe08b31910160405180910390a4505061075260018055565b505050565b60008281526020819052604090206001015461077281611113565b6107528383611120565b6001600160a01b03811633146107ec5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b606482015260840161048d565b6107f682826111a4565b5050565b600080516020611c4a83398151915261081281611113565b8582148015610828575083158061082857508382145b61086a5760405162461bcd60e51b815260206004820152601360248201527257726f6e67206172726179206c656e6774687360681b604482015260640161048d565b60008490036109205760005b8681101561091a5761090888888381811061089357610893611a6c565b90506020020160208101906108a89190611a82565b60008686858181106108bc576108bc611a6c565b90506020028101906108ce9190611a9f565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061120992505050565b8061091281611ae6565b915050610876565b50610994565b60005b868110156109925761098088888381811061094057610940611a6c565b90506020020160208101906109559190611a82565b87878481811061096757610967611a6c565b905060200201358686858181106108bc576108bc611a6c565b8061098a81611ae6565b915050610923565b505b50505050505050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b600080516020611c4a8339815191526109de81611113565b610a1f858585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061120992505050565b5050505050565b600082815260208190526040902060010154610a4181611113565b61075283836111a4565b610a5361105a565b828114610aa25760405162461bcd60e51b815260206004820152601a60248201527f57726f6e672073656e646572732061727261792d6c656e677468000000000000604482015260640161048d565b6000805b84811015610b4e576000848483818110610ac257610ac2611a6c565b9050602002013511610b165760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e742073686f756c642067726561746572207468616e207a65726f00604482015260640161048d565b838382818110610b2857610b28611a6c565b9050602002013582610b3a9190611aff565b915080610b4681611ae6565b915050610aa6565b506000868152600260208190526040909120908101546001600160a01b0316610d225781341015610bc15760405162461bcd60e51b815260206004820152601960248201527f496e73756666696369656e7420616d6f756e7420746f6b656e00000000000000604482015260640161048d565b6000610bcd8334611a59565b90508015610c0457604051339082156108fc029083906000818181858888f19350505050158015610c02573d6000803e3d6000fd5b505b60005b86811015610d1b57878782818110610c2157610c21611a6c565b9050602002016020810190610c369190611a82565b6001600160a01b03166108fc878784818110610c5457610c54611a6c565b905060200201359081150290604051600060405180830381858888f19350505050158015610c86573d6000803e3d6000fd5b50878782818110610c9957610c99611a6c565b9050602002016020810190610cae9190611a82565b6001600160a01b0316897f21e12a7cad0da5928167e1084ea4d5fdf8d9af66657a2543a9ac76a0ca081477888885818110610ceb57610ceb611a6c565b90506020020135604051610d0191815260200190565b60405180910390a380610d1381611ae6565b915050610c07565b5050610e7a565b3415610d6c5760405162461bcd60e51b81526020600482015260196024820152782732b2b23713ba103830bc9036b0b4b73732ba103a37b5b2b760391b604482015260640161048d565b60028101546001600160a01b031660005b86811015610e7757610de333898984818110610d9b57610d9b611a6c565b9050602002016020810190610db09190611a82565b888885818110610dc257610dc2611a6c565b90506020020135856001600160a01b03166110b3909392919063ffffffff16565b878782818110610df557610df5611a6c565b9050602002016020810190610e0a9190611a82565b6001600160a01b0316897f21e12a7cad0da5928167e1084ea4d5fdf8d9af66657a2543a9ac76a0ca081477888885818110610e4757610e47611a6c565b90506020020135604051610e5d91815260200190565b60405180910390a380610e6f81611ae6565b915050610d7d565b50505b5050610a1f60018055565b600080516020611c4a833981519152610e9d81611113565b428211610edb5760405162461bcd60e51b815260206004820152600c60248201526b496e76616c69642074696d6560a01b604482015260640161048d565b6001600160a01b038716610f225760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a59081d185c99d95d60921b604482015260640161048d565b6001600160a01b038616610f6a5760405162461bcd60e51b815260206004820152600f60248201526e125b9d985b1a59081c9958d95a5c1d608a1b604482015260640161048d565b60008411610fa95760405162461bcd60e51b815260206004820152600c60248201526b06e66745072696365203e20360a41b604482015260640161048d565b600088815260026020526040902080546001600160a01b0316156110015760405162461bcd60e51b815260206004820152600f60248201526e416c72656164792073657474696e6760881b604482015260640161048d565b80546001600160a01b039889166001600160a01b0319918216178255600182018054988a169882169890981790975560028101805496909816959096169490941790955560038401919091556005830155506006015550565b6002600154036110ac5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161048d565b6002600155565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261110d908590611279565b50505050565b61111d813361134b565b50565b61112a828261099d565b6107f6576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556111603390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6111ae828261099d565b156107f6576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600080846001600160a01b031684846040516112259190611b36565b60006040518083038185875af1925050503d8060008114611262576040519150601f19603f3d011682016040523d82523d6000602084013e611267565b606091505b509150915081610a1f57805160208201fd5b60006112ce826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166113a49092919063ffffffff16565b80519091501561075257808060200190518101906112ec9190611b52565b6107525760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161048d565b611355828261099d565b6107f657611362816113bb565b61136d8360206113cd565b60405160200161137e929190611b74565b60408051601f198184030181529082905262461bcd60e51b825261048d91600401611be9565b60606113b38484600085611570565b949350505050565b60606104126001600160a01b03831660145b606060006113dc836002611a42565b6113e7906002611aff565b67ffffffffffffffff8111156113ff576113ff611c1c565b6040519080825280601f01601f191660200182016040528015611429576020820181803683370190505b509050600360fc1b8160008151811061144457611444611a6c565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061147357611473611a6c565b60200101906001600160f81b031916908160001a9053506000611497846002611a42565b6114a2906001611aff565b90505b600181111561151a576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106114d6576114d6611a6c565b1a60f81b8282815181106114ec576114ec611a6c565b60200101906001600160f81b031916908160001a90535060049490941c9361151381611c32565b90506114a5565b5083156115695760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161048d565b9392505050565b6060824710156115d15760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161048d565b600080866001600160a01b031685876040516115ed9190611b36565b60006040518083038185875af1925050503d806000811461162a576040519150601f19603f3d011682016040523d82523d6000602084013e61162f565b606091505b50915091506116408783838761164b565b979650505050505050565b606083156116ba5782516000036116b3576001600160a01b0385163b6116b35760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161048d565b50816113b3565b6113b383838151156116cf5781518083602001fd5b8060405162461bcd60e51b815260040161048d9190611be9565b6000602082840312156116fb57600080fd5b81356001600160e01b03198116811461156957600080fd5b60008060006060848603121561172857600080fd5b505081359360208301359350604090920135919050565b60006020828403121561175157600080fd5b5035919050565b6001600160a01b038116811461111d57600080fd5b6000806040838503121561178057600080fd5b82359150602083013561179281611758565b809150509250929050565b60008083601f8401126117af57600080fd5b50813567ffffffffffffffff8111156117c757600080fd5b6020830191508360208260051b85010111156117e257600080fd5b9250929050565b6000806000806000806060878903121561180257600080fd5b863567ffffffffffffffff8082111561181a57600080fd5b6118268a838b0161179d565b9098509650602089013591508082111561183f57600080fd5b61184b8a838b0161179d565b9096509450604089013591508082111561186457600080fd5b5061187189828a0161179d565b979a9699509497509295939492505050565b60008060006060848603121561189857600080fd5b8335925060208401356118aa81611758565b929592945050506040919091013590565b600080600080606085870312156118d157600080fd5b84356118dc81611758565b935060208501359250604085013567ffffffffffffffff8082111561190057600080fd5b818701915087601f83011261191457600080fd5b81358181111561192357600080fd5b88602082850101111561193557600080fd5b95989497505060200194505050565b60008060008060006060868803121561195c57600080fd5b85359450602086013567ffffffffffffffff8082111561197b57600080fd5b61198789838a0161179d565b909650945060408801359150808211156119a057600080fd5b506119ad8882890161179d565b969995985093965092949392505050565b600080600080600080600060e0888a0312156119d957600080fd5b8735965060208801356119eb81611758565b955060408801356119fb81611758565b94506060880135611a0b81611758565b9699959850939660808101359560a0820135955060c0909101359350915050565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761041257610412611a2c565b8181038181111561041257610412611a2c565b634e487b7160e01b600052603260045260246000fd5b600060208284031215611a9457600080fd5b813561156981611758565b6000808335601e19843603018112611ab657600080fd5b83018035915067ffffffffffffffff821115611ad157600080fd5b6020019150368190038213156117e257600080fd5b600060018201611af857611af8611a2c565b5060010190565b8082018082111561041257610412611a2c565b60005b83811015611b2d578181015183820152602001611b15565b50506000910152565b60008251611b48818460208701611b12565b9190910192915050565b600060208284031215611b6457600080fd5b8151801515811461156957600080fd5b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351611bac816017850160208801611b12565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351611bdd816028840160208801611b12565b01602801949350505050565b6020815260008251806020840152611c08816040850160208701611b12565b601f01601f19169190910160400192915050565b634e487b7160e01b600052604160045260246000fd5b600081611c4157611c41611a2c565b50600019019056fe97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929a26469706673582212206b459dcede70eb0a6f2ce0904725b7df47f7866056a354a02f84b7d11d3e4cf464736f6c634300081100330000000000000000000000004b87a2728f68952b0f62d5d244a429e8e4d251a3000000000000000000000000eeb9c7e8c0dcb6466a2a5ac6cd11a0cd6603dbeb
Deployed Bytecode
0x6080604052600436106100f75760003560e01c8063a217fddf1161008a578063f0e4954611610059578063f0e49546146102de578063f0f3f2c8146102f1578063f5b541a61461039f578063ff479f88146103c157600080fd5b8063a217fddf14610259578063b61d27f61461026e578063d547741f1461028e578063ef8234a7146102ae57600080fd5b806336568abe116100c657806336568abe146101ab57806347e1da2a146101cb5780636140af36146101eb57806391d148541461023957600080fd5b806301ffc9a71461010357806310861a9414610138578063248a9ca31461014d5780632f2ff15d1461018b57600080fd5b366100fe57005b600080fd5b34801561010f57600080fd5b5061012361011e3660046116e9565b6103e1565b60405190151581526020015b60405180910390f35b61014b610146366004611713565b610418565b005b34801561015957600080fd5b5061017d61016836600461173f565b60009081526020819052604090206001015490565b60405190815260200161012f565b34801561019757600080fd5b5061014b6101a636600461176d565b610757565b3480156101b757600080fd5b5061014b6101c636600461176d565b61077c565b3480156101d757600080fd5b5061014b6101e63660046117e9565b6107fa565b3480156101f757600080fd5b5061017d610206366004611883565b60009283526002602090815260408085206001600160a01b03949094168552600790930181528284209184525290205490565b34801561024557600080fd5b5061012361025436600461176d565b61099d565b34801561026557600080fd5b5061017d600081565b34801561027a57600080fd5b5061014b6102893660046118bb565b6109c6565b34801561029a57600080fd5b5061014b6102a936600461176d565b610a26565b3480156102ba57600080fd5b5061017d6102c936600461173f565b60009081526002602052604090206004015490565b61014b6102ec366004611944565b610a4b565b3480156102fd57600080fd5b5061035961030c36600461173f565b600090815260026020819052604090912080546001820154928201546003830154600484015460058501546006909501546001600160a01b03948516979685169694909316949193909290565b604080516001600160a01b039889168152968816602088015294909616938501939093526060840191909152608083015260a082015260c081019190915260e00161012f565b3480156103ab57600080fd5b5061017d600080516020611c4a83398151915281565b3480156103cd57600080fd5b5061014b6103dc3660046119be565b610e85565b60006001600160e01b03198216637965db0b60e01b148061041257506301ffc9a760e01b6001600160e01b03198316145b92915050565b61042061105a565b600083815260026020526040902060058101544210156104965760405162461bcd60e51b815260206004820152602660248201527f546865204c61756e636850616420616374697669747920686173206e6f7420736044820152651d185c9d195960d21b60648201526084015b60405180910390fd5b42816006015410156104ea5760405162461bcd60e51b815260206004820181905260248201527f546865204c61756e63685061642061637469766974792068617320656e646564604482015260640161048d565b33600090815260078201602090815260408083208684529091529020541561054a5760405162461bcd60e51b8152602060048201526013602482015272111d5c1b1a58d85d19481c1c9954d85b195251606a1b604482015260640161048d565b600082116105895760405162461bcd60e51b815260206004820152600c60248201526b070726553616c654e756d3e360a41b604482015260640161048d565b600082826003015461059b9190611a42565b60028301549091506001600160a01b031661067b57803410156105f55760405162461bcd60e51b815260206004820152601260248201527124b739bab33334b1b4b2b73a103a37b5b2b760711b604482015260640161048d565b60006106018234611a59565b9050801561063857604051339082156108fc029083906000818181858888f19350505050158015610636573d6000803e3d6000fd5b505b60018301546040516001600160a01b039091169083156108fc029084906000818181858888f19350505050158015610674573d6000803e3d6000fd5b50506106e8565b34156106c55760405162461bcd60e51b81526020600482015260196024820152782732b2b23713ba103830bc9036b0b4b73732ba103a37b5b2b760391b604482015260640161048d565b600182015460028301546106e8916001600160a01b0391821691339116846110b3565b600482018054840190553360008181526007840160209081526040808320888452825291829020849055905185815286929188917ffc56c93abd69974b6f339698650e3c044f5463dab795e579b486279febe08b31910160405180910390a4505061075260018055565b505050565b60008281526020819052604090206001015461077281611113565b6107528383611120565b6001600160a01b03811633146107ec5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b606482015260840161048d565b6107f682826111a4565b5050565b600080516020611c4a83398151915261081281611113565b8582148015610828575083158061082857508382145b61086a5760405162461bcd60e51b815260206004820152601360248201527257726f6e67206172726179206c656e6774687360681b604482015260640161048d565b60008490036109205760005b8681101561091a5761090888888381811061089357610893611a6c565b90506020020160208101906108a89190611a82565b60008686858181106108bc576108bc611a6c565b90506020028101906108ce9190611a9f565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061120992505050565b8061091281611ae6565b915050610876565b50610994565b60005b868110156109925761098088888381811061094057610940611a6c565b90506020020160208101906109559190611a82565b87878481811061096757610967611a6c565b905060200201358686858181106108bc576108bc611a6c565b8061098a81611ae6565b915050610923565b505b50505050505050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b600080516020611c4a8339815191526109de81611113565b610a1f858585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061120992505050565b5050505050565b600082815260208190526040902060010154610a4181611113565b61075283836111a4565b610a5361105a565b828114610aa25760405162461bcd60e51b815260206004820152601a60248201527f57726f6e672073656e646572732061727261792d6c656e677468000000000000604482015260640161048d565b6000805b84811015610b4e576000848483818110610ac257610ac2611a6c565b9050602002013511610b165760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e742073686f756c642067726561746572207468616e207a65726f00604482015260640161048d565b838382818110610b2857610b28611a6c565b9050602002013582610b3a9190611aff565b915080610b4681611ae6565b915050610aa6565b506000868152600260208190526040909120908101546001600160a01b0316610d225781341015610bc15760405162461bcd60e51b815260206004820152601960248201527f496e73756666696369656e7420616d6f756e7420746f6b656e00000000000000604482015260640161048d565b6000610bcd8334611a59565b90508015610c0457604051339082156108fc029083906000818181858888f19350505050158015610c02573d6000803e3d6000fd5b505b60005b86811015610d1b57878782818110610c2157610c21611a6c565b9050602002016020810190610c369190611a82565b6001600160a01b03166108fc878784818110610c5457610c54611a6c565b905060200201359081150290604051600060405180830381858888f19350505050158015610c86573d6000803e3d6000fd5b50878782818110610c9957610c99611a6c565b9050602002016020810190610cae9190611a82565b6001600160a01b0316897f21e12a7cad0da5928167e1084ea4d5fdf8d9af66657a2543a9ac76a0ca081477888885818110610ceb57610ceb611a6c565b90506020020135604051610d0191815260200190565b60405180910390a380610d1381611ae6565b915050610c07565b5050610e7a565b3415610d6c5760405162461bcd60e51b81526020600482015260196024820152782732b2b23713ba103830bc9036b0b4b73732ba103a37b5b2b760391b604482015260640161048d565b60028101546001600160a01b031660005b86811015610e7757610de333898984818110610d9b57610d9b611a6c565b9050602002016020810190610db09190611a82565b888885818110610dc257610dc2611a6c565b90506020020135856001600160a01b03166110b3909392919063ffffffff16565b878782818110610df557610df5611a6c565b9050602002016020810190610e0a9190611a82565b6001600160a01b0316897f21e12a7cad0da5928167e1084ea4d5fdf8d9af66657a2543a9ac76a0ca081477888885818110610e4757610e47611a6c565b90506020020135604051610e5d91815260200190565b60405180910390a380610e6f81611ae6565b915050610d7d565b50505b5050610a1f60018055565b600080516020611c4a833981519152610e9d81611113565b428211610edb5760405162461bcd60e51b815260206004820152600c60248201526b496e76616c69642074696d6560a01b604482015260640161048d565b6001600160a01b038716610f225760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a59081d185c99d95d60921b604482015260640161048d565b6001600160a01b038616610f6a5760405162461bcd60e51b815260206004820152600f60248201526e125b9d985b1a59081c9958d95a5c1d608a1b604482015260640161048d565b60008411610fa95760405162461bcd60e51b815260206004820152600c60248201526b06e66745072696365203e20360a41b604482015260640161048d565b600088815260026020526040902080546001600160a01b0316156110015760405162461bcd60e51b815260206004820152600f60248201526e416c72656164792073657474696e6760881b604482015260640161048d565b80546001600160a01b039889166001600160a01b0319918216178255600182018054988a169882169890981790975560028101805496909816959096169490941790955560038401919091556005830155506006015550565b6002600154036110ac5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161048d565b6002600155565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261110d908590611279565b50505050565b61111d813361134b565b50565b61112a828261099d565b6107f6576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556111603390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6111ae828261099d565b156107f6576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600080846001600160a01b031684846040516112259190611b36565b60006040518083038185875af1925050503d8060008114611262576040519150601f19603f3d011682016040523d82523d6000602084013e611267565b606091505b509150915081610a1f57805160208201fd5b60006112ce826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166113a49092919063ffffffff16565b80519091501561075257808060200190518101906112ec9190611b52565b6107525760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161048d565b611355828261099d565b6107f657611362816113bb565b61136d8360206113cd565b60405160200161137e929190611b74565b60408051601f198184030181529082905262461bcd60e51b825261048d91600401611be9565b60606113b38484600085611570565b949350505050565b60606104126001600160a01b03831660145b606060006113dc836002611a42565b6113e7906002611aff565b67ffffffffffffffff8111156113ff576113ff611c1c565b6040519080825280601f01601f191660200182016040528015611429576020820181803683370190505b509050600360fc1b8160008151811061144457611444611a6c565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061147357611473611a6c565b60200101906001600160f81b031916908160001a9053506000611497846002611a42565b6114a2906001611aff565b90505b600181111561151a576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106114d6576114d6611a6c565b1a60f81b8282815181106114ec576114ec611a6c565b60200101906001600160f81b031916908160001a90535060049490941c9361151381611c32565b90506114a5565b5083156115695760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161048d565b9392505050565b6060824710156115d15760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161048d565b600080866001600160a01b031685876040516115ed9190611b36565b60006040518083038185875af1925050503d806000811461162a576040519150601f19603f3d011682016040523d82523d6000602084013e61162f565b606091505b50915091506116408783838761164b565b979650505050505050565b606083156116ba5782516000036116b3576001600160a01b0385163b6116b35760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161048d565b50816113b3565b6113b383838151156116cf5781518083602001fd5b8060405162461bcd60e51b815260040161048d9190611be9565b6000602082840312156116fb57600080fd5b81356001600160e01b03198116811461156957600080fd5b60008060006060848603121561172857600080fd5b505081359360208301359350604090920135919050565b60006020828403121561175157600080fd5b5035919050565b6001600160a01b038116811461111d57600080fd5b6000806040838503121561178057600080fd5b82359150602083013561179281611758565b809150509250929050565b60008083601f8401126117af57600080fd5b50813567ffffffffffffffff8111156117c757600080fd5b6020830191508360208260051b85010111156117e257600080fd5b9250929050565b6000806000806000806060878903121561180257600080fd5b863567ffffffffffffffff8082111561181a57600080fd5b6118268a838b0161179d565b9098509650602089013591508082111561183f57600080fd5b61184b8a838b0161179d565b9096509450604089013591508082111561186457600080fd5b5061187189828a0161179d565b979a9699509497509295939492505050565b60008060006060848603121561189857600080fd5b8335925060208401356118aa81611758565b929592945050506040919091013590565b600080600080606085870312156118d157600080fd5b84356118dc81611758565b935060208501359250604085013567ffffffffffffffff8082111561190057600080fd5b818701915087601f83011261191457600080fd5b81358181111561192357600080fd5b88602082850101111561193557600080fd5b95989497505060200194505050565b60008060008060006060868803121561195c57600080fd5b85359450602086013567ffffffffffffffff8082111561197b57600080fd5b61198789838a0161179d565b909650945060408801359150808211156119a057600080fd5b506119ad8882890161179d565b969995985093965092949392505050565b600080600080600080600060e0888a0312156119d957600080fd5b8735965060208801356119eb81611758565b955060408801356119fb81611758565b94506060880135611a0b81611758565b9699959850939660808101359560a0820135955060c0909101359350915050565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761041257610412611a2c565b8181038181111561041257610412611a2c565b634e487b7160e01b600052603260045260246000fd5b600060208284031215611a9457600080fd5b813561156981611758565b6000808335601e19843603018112611ab657600080fd5b83018035915067ffffffffffffffff821115611ad157600080fd5b6020019150368190038213156117e257600080fd5b600060018201611af857611af8611a2c565b5060010190565b8082018082111561041257610412611a2c565b60005b83811015611b2d578181015183820152602001611b15565b50506000910152565b60008251611b48818460208701611b12565b9190910192915050565b600060208284031215611b6457600080fd5b8151801515811461156957600080fd5b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351611bac816017850160208801611b12565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351611bdd816028840160208801611b12565b01602801949350505050565b6020815260008251806020840152611c08816040850160208701611b12565b601f01601f19169190910160400192915050565b634e487b7160e01b600052604160045260246000fd5b600081611c4157611c41611a2c565b50600019019056fe97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929a26469706673582212206b459dcede70eb0a6f2ce0904725b7df47f7866056a354a02f84b7d11d3e4cf464736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000004b87a2728f68952b0f62d5d244a429e8e4d251a3000000000000000000000000eeb9c7e8c0dcb6466a2a5ac6cd11a0cd6603dbeb
-----Decoded View---------------
Arg [0] : admin (address): 0x4b87A2728f68952B0F62d5d244a429e8e4D251a3
Arg [1] : operator (address): 0xEeB9C7E8c0DCB6466a2a5aC6Cd11a0CD6603DBEb
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000004b87a2728f68952b0f62d5d244a429e8e4d251a3
Arg [1] : 000000000000000000000000eeb9c7e8c0dcb6466a2a5ac6cd11a0cd6603dbeb
Deployed Bytecode Sourcemap
397:12469:12:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2606:202:0;;;;;;;;;;-1:-1:-1;2606:202:0;;;;;:::i;:::-;;:::i;:::-;;;470:14:13;;463:22;445:41;;433:2;418:18;2606:202:0;;;;;;;;4777:1714:12;;;;;;:::i;:::-;;:::i;:::-;;4378:129:0;;;;;;;;;;-1:-1:-1;4378:129:0;;;;;:::i;:::-;4452:7;4478:12;;;;;;;;;;:22;;;;4378:129;;;;1149:25:13;;;1137:2;1122:18;4378:129:0;1003:177:13;4803:145:0;;;;;;;;;;-1:-1:-1;4803:145:0;;;;;:::i;:::-;;:::i;5912:214::-;;;;;;;;;;-1:-1:-1;5912:214:0;;;;;:::i;:::-;;:::i;11271:564:12:-;;;;;;;;;;-1:-1:-1;11271:564:12;;;;;:::i;:::-;;:::i;9979:224::-;;;;;;;;;;-1:-1:-1;9979:224:12;;;;;:::i;:::-;10079:7;10124:14;;;:5;:14;;;;;;;;-1:-1:-1;;;;;10156:28:12;;;;;;:22;;;;:28;;;;;:39;;;;;;;;9979:224;2895:145:0;;;;;;;;;;-1:-1:-1;2895:145:0;;;;;:::i;:::-;;:::i;2027:49::-;;;;;;;;;;-1:-1:-1;2027:49:0;2072:4;2027:49;;10496:143:12;;;;;;;;;;-1:-1:-1;10496:143:12;;;;;:::i;:::-;;:::i;5228:147:0:-;;;;;;;;;;-1:-1:-1;5228:147:0;;;;;:::i;:::-;;:::i;9743:173:12:-;;;;;;;;;;-1:-1:-1;9743:173:12;;;;;:::i;:::-;9813:7;9858:14;;;:5;:14;;;;;9890:18;;;;9743:173;7576:1729;;;;;;:::i;:::-;;:::i;9361:323::-;;;;;;;;;;-1:-1:-1;9361:323:12;;;;;:::i;:::-;9421:7;9520:14;;;:5;:14;;;;;;;;9553;;;9569:15;;;9586;;;;9603:16;;;;9621:18;;;;9641:17;;;;9660:15;;;;;-1:-1:-1;;;;;9553:14:12;;;;9569:15;;;;9586;;;;;9603:16;;9621:18;;9660:15;9361:323;;;;;-1:-1:-1;;;;;5888:15:13;;;5870:34;;5940:15;;;5935:2;5920:18;;5913:43;5992:15;;;;5972:18;;;5965:43;;;;6039:2;6024:18;;6017:34;;;;6082:3;6067:19;;6060:35;5850:3;6111:19;;6104:35;6170:3;6155:19;;6148:35;;;;5819:3;5804:19;9361:323:12;5517:672:13;524:66:12;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;524:66:12;;2621:776;;;;;;;;;;-1:-1:-1;2621:776:12;;;;;:::i;:::-;;:::i;2606:202:0:-;2691:4;-1:-1:-1;;;;;;2714:47:0;;-1:-1:-1;;;2714:47:0;;:87;;-1:-1:-1;;;;;;;;;;937:40:9;;;2765:36:0;2707:94;2606:202;-1:-1:-1;;2606:202:0:o;4777:1714:12:-;2261:21:2;:19;:21::i;:::-;4889:23:12::1;4915:14:::0;;;:5:::1;:14;::::0;;;;4974:17:::1;::::0;::::1;::::0;4995:15:::1;-1:-1:-1::0;4974:36:12::1;4966:87;;;::::0;-1:-1:-1;;;4966:87:12;;7214:2:13;4966:87:12::1;::::0;::::1;7196:21:13::0;7253:2;7233:18;;;7226:30;7292:34;7272:18;;;7265:62;-1:-1:-1;;;7343:18:13;;;7336:36;7389:19;;4966:87:12::1;;;;;;;;;5091:15;5072:7;:15;;;:34;;5064:79;;;::::0;-1:-1:-1;;;5064:79:12;;7621:2:13;5064:79:12::1;::::0;::::1;7603:21:13::0;;;7640:18;;;7633:30;7699:34;7679:18;;;7672:62;7751:18;;5064:79:12::1;7419:356:13::0;5064:79:12::1;5231:10;5208:34;::::0;;;:22:::1;::::0;::::1;:34;::::0;;;;;;;:45;;;;;;;;;:50;5200:82:::1;;;::::0;-1:-1:-1;;;5200:82:12;;7982:2:13;5200:82:12::1;::::0;::::1;7964:21:13::0;8021:2;8001:18;;;7994:30;-1:-1:-1;;;8040:18:13;;;8033:49;8099:18;;5200:82:12::1;7780:343:13::0;5200:82:12::1;5314:1;5301:10;:14;5293:39;;;::::0;-1:-1:-1;;;5293:39:12;;8330:2:13;5293:39:12::1;::::0;::::1;8312:21:13::0;8369:2;8349:18;;;8342:30;-1:-1:-1;;;8388:18:13;;;8381:42;8440:18;;5293:39:12::1;8128:336:13::0;5293:39:12::1;5385:13;5420:10;5401:7;:16;;;:29;;;;:::i;:::-;5445:15;::::0;::::1;::::0;5385:45;;-1:-1:-1;;;;;;5445:15:12::1;5441:698;;5512:5;5499:9;:18;;5491:49;;;::::0;-1:-1:-1;;;5491:49:12;;8976:2:13;5491:49:12::1;::::0;::::1;8958:21:13::0;9015:2;8995:18;;;8988:30;-1:-1:-1;;;9034:18:13;;;9027:48;9092:18;;5491:49:12::1;8774:342:13::0;5491:49:12::1;5555:15;5573:17;5585:5:::0;5573:9:::1;:17;:::i;:::-;5555:35:::0;-1:-1:-1;5609:11:12;;5605:133:::1;;5685:37;::::0;5693:10:::1;::::0;5685:37;::::1;;;::::0;5714:7;;5685:37:::1;::::0;;;5714:7;5693:10;5685:37;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;5605:133;5828:15;::::0;::::1;::::0;:31:::1;::::0;-1:-1:-1;;;;;5828:15:12;;::::1;::::0;:31;::::1;;;::::0;5853:5;;5828:15:::1;:31:::0;:15;:31;5853:5;5828:15;:31;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;5476:395;5441:698;;;5900:9;:14:::0;5892:52:::1;;;::::0;-1:-1:-1;;;5892:52:12;;9456:2:13;5892:52:12::1;::::0;::::1;9438:21:13::0;9495:2;9475:18;;;9468:30;-1:-1:-1;;;9514:18:13;;;9507:55;9579:18;;5892:52:12::1;9254:349:13::0;5892:52:12::1;6104:15;::::0;::::1;::::0;6058::::1;::::0;::::1;::::0;6051:76:::1;::::0;-1:-1:-1;;;;;6058:15:12;;::::1;::::0;6092:10:::1;::::0;6104:15:::1;6121:5:::0;6051:40:::1;:76::i;:::-;6229:18;::::0;::::1;:32:::0;;;::::1;::::0;;6377:10:::1;-1:-1:-1::0;6354:34:12;;;:22:::1;::::0;::::1;:34;::::0;;;;;;;:45;;;;;;;;;:53;;;6425:58;;1149:25:13;;;6354:45:12;;6377:10;6440:7;;6425:58:::1;::::0;1122:18:13;6425:58:12::1;;;;;;;4878:1613;;2303:20:2::0;1716:1;2809:22;;2629:209;2303:20;4777:1714:12;;;:::o;4803:145:0:-;4452:7;4478:12;;;;;;;;;;:22;;;2505:16;2516:4;2505:10;:16::i;:::-;4916:25:::1;4927:4;4933:7;4916:10;:25::i;5912:214::-:0;-1:-1:-1;;;;;6007:23:0;;719:10:7;6007:23:0;5999:83;;;;-1:-1:-1;;;5999:83:0;;9810:2:13;5999:83:0;;;9792:21:13;9849:2;9829:18;;;9822:30;9888:34;9868:18;;;9861:62;-1:-1:-1;;;9939:18:13;;;9932:45;9994:19;;5999:83:0;9608:411:13;5999:83:0;6093:26;6105:4;6111:7;6093:11;:26::i;:::-;5912:214;;:::o;11271:564:12:-;-1:-1:-1;;;;;;;;;;;2505:16:0;2516:4;2505:10;:16::i;:::-;11419:26:12;;::::1;:80:::0;::::1;;;-1:-1:-1::0;11450:17:12;;;:48:::1;;-1:-1:-1::0;11471:27:12;;::::1;11450:48;11411:112;;;::::0;-1:-1:-1;;;11411:112:12;;10226:2:13;11411:112:12::1;::::0;::::1;10208:21:13::0;10265:2;10245:18;;;10238:30;-1:-1:-1;;;10284:18:13;;;10277:49;10343:18;;11411:112:12::1;10024:343:13::0;11411:112:12::1;11554:1;11538:17:::0;;;11534:294:::1;;11577:9;11572:103;11592:15:::0;;::::1;11572:103;;;11633:26;11639:4;;11644:1;11639:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;11648:1;11651:4;;11656:1;11651:7;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;11633:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;11633:5:12::1;::::0;-1:-1:-1;;;11633:26:12:i:1;:::-;11609:3:::0;::::1;::::0;::::1;:::i;:::-;;;;11572:103;;;;11534:294;;;11712:9;11707:110;11727:15:::0;;::::1;11707:110;;;11768:33;11774:4;;11779:1;11774:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;11783:5;;11789:1;11783:8;;;;;;;:::i;:::-;;;;;;;11793:4;;11798:1;11793:7;;;;;;;:::i;11768:33::-;11744:3:::0;::::1;::::0;::::1;:::i;:::-;;;;11707:110;;;;11534:294;11271:564:::0;;;;;;;:::o;2895:145:0:-;2981:4;3004:12;;;;;;;;;;;-1:-1:-1;;;;;3004:29:0;;;;;;;;;;;;;;;2895:145::o;10496:143:12:-;-1:-1:-1;;;;;;;;;;;2505:16:0;2516:4;2505:10;:16::i;:::-;10607:24:12::1;10613:4;10619:5;10626:4;;10607:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;10607:5:12::1;::::0;-1:-1:-1;;;10607:24:12:i:1;:::-;10496:143:::0;;;;;:::o;5228:147:0:-;4452:7;4478:12;;;;;;;;;;:22;;;2505:16;2516:4;2505:10;:16::i;:::-;5342:26:::1;5354:4;5360:7;5342:11;:26::i;7576:1729:12:-:0;2261:21:2;:19;:21::i;:::-;7717:35:12;;::::1;7709:74;;;::::0;-1:-1:-1;;;7709:74:12;;11624:2:13;7709:74:12::1;::::0;::::1;11606:21:13::0;11663:2;11643:18;;;11636:30;11702:28;11682:18;;;11675:56;11748:18;;7709:74:12::1;11422:350:13::0;7709:74:12::1;7794:13;::::0;7818:167:::1;7838:21:::0;;::::1;7818:167;;;7902:1;7889:7;;7897:1;7889:10;;;;;;;:::i;:::-;;;;;;;:14;7881:58;;;::::0;-1:-1:-1;;;7881:58:12;;11979:2:13;7881:58:12::1;::::0;::::1;11961:21:13::0;12018:2;11998:18;;;11991:30;12057:33;12037:18;;;12030:61;12108:18;;7881:58:12::1;11777:355:13::0;7881:58:12::1;7963:7;;7971:1;7963:10;;;;;;;:::i;:::-;;;;;;;7954:19;;;;;:::i;:::-;::::0;-1:-1:-1;7861:3:12;::::1;::::0;::::1;:::i;:::-;;;;7818:167;;;-1:-1:-1::0;8057:23:12::1;8083:14:::0;;;:5:::1;:14;::::0;;;;;;;8114:15;;::::1;::::0;-1:-1:-1;;;;;8114:15:12::1;8110:1188;;8181:5;8168:9;:18;;8160:56;;;::::0;-1:-1:-1;;;8160:56:12;;12469:2:13;8160:56:12::1;::::0;::::1;12451:21:13::0;12508:2;12488:18;;;12481:30;12547:27;12527:18;;;12520:55;12592:18;;8160:56:12::1;12267:349:13::0;8160:56:12::1;8231:15;8249:17;8261:5:::0;8249:9:::1;:17;:::i;:::-;8231:35:::0;-1:-1:-1;8285:11:12;;8281:133:::1;;8361:37;::::0;8369:10:::1;::::0;8361:37;::::1;;;::::0;8390:7;;8361:37:::1;::::0;;;8390:7;8369:10;8361:37;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;8281:133;8525:9;8520:247;8540:21:::0;;::::1;8520:247;;;8648:10;;8659:1;8648:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;8640:31:12::1;:43;8672:7;;8680:1;8672:10;;;;;;;:::i;:::-;;;;;;;8640:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;8725:10;;8736:1;8725:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;8709:42:12::1;8716:7;8709:42;8740:7;;8748:1;8740:10;;;;;;;:::i;:::-;;;;;;;8709:42;;;;1149:25:13::0;;1137:2;1122:18;;1003:177;8709:42:12::1;;;;;;;;8563:3:::0;::::1;::::0;::::1;:::i;:::-;;;;8520:247;;;;8145:633;8110:1188;;;8807:9;:14:::0;8799:52:::1;;;::::0;-1:-1:-1;;;8799:52:12;;9456:2:13;8799:52:12::1;::::0;::::1;9438:21:13::0;9495:2;9475:18;;;9468:30;-1:-1:-1;;;9514:18:13;;;9507:55;9579:18;;8799:52:12::1;9254:349:13::0;8799:52:12::1;8887:15;::::0;::::1;::::0;-1:-1:-1;;;;;8887:15:12::1;8866:18;9009:278;9029:21:::0;;::::1;9009:278;;;9129:74;9165:10;9177;;9188:1;9177:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;9192:7;;9200:1;9192:10;;;;;;;:::i;:::-;;;;;;;9136;-1:-1:-1::0;;;;;9129:35:12::1;;;:74;;;;;;:::i;:::-;9245:10;;9256:1;9245:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;9229:42:12::1;9236:7;9229:42;9260:7;;9268:1;9260:10;;;;;;;:::i;:::-;;;;;;;9229:42;;;;1149:25:13::0;;1137:2;1122:18;;1003:177;9229:42:12::1;;;;;;;;9052:3:::0;::::1;::::0;::::1;:::i;:::-;;;;9009:278;;;;8784:514;8110:1188;7698:1607;;2303:20:2::0;1716:1;2809:22;;2629:209;2621:776:12;-1:-1:-1;;;;;;;;;;;2505:16:0;2516:4;2505:10;:16::i;:::-;2837:15:12::1;2826:8;:26;2818:51;;;::::0;-1:-1:-1;;;2818:51:12;;12823:2:13;2818:51:12::1;::::0;::::1;12805:21:13::0;12862:2;12842:18;;;12835:30;-1:-1:-1;;;12881:18:13;;;12874:42;12933:18;;2818:51:12::1;12621:336:13::0;2818:51:12::1;-1:-1:-1::0;;;;;2888:21:12;::::1;2880:48;;;::::0;-1:-1:-1;;;2880:48:12;;13164:2:13;2880:48:12::1;::::0;::::1;13146:21:13::0;13203:2;13183:18;;;13176:30;-1:-1:-1;;;13222:18:13;;;13215:44;13276:18;;2880:48:12::1;12962:338:13::0;2880:48:12::1;-1:-1:-1::0;;;;;2947:22:12;::::1;2939:50;;;::::0;-1:-1:-1;;;2939:50:12;;13507:2:13;2939:50:12::1;::::0;::::1;13489:21:13::0;13546:2;13526:18;;;13519:30;-1:-1:-1;;;13565:18:13;;;13558:45;13620:18;;2939:50:12::1;13305:339:13::0;2939:50:12::1;3020:1;3008:9;:13;3000:38;;;::::0;-1:-1:-1;;;3000:38:12;;13851:2:13;3000:38:12::1;::::0;::::1;13833:21:13::0;13890:2;13870:18;;;13863:30;-1:-1:-1;;;13909:18:13;;;13902:42;13961:18;;3000:38:12::1;13649:336:13::0;3000:38:12::1;3051:23;3077:15:::0;;;:5:::1;:15;::::0;;;;3113:14;;-1:-1:-1;;;;;3113:14:12::1;:28:::0;3105:56:::1;;;::::0;-1:-1:-1;;;3105:56:12;;14192:2:13;3105:56:12::1;::::0;::::1;14174:21:13::0;14231:2;14211:18;;;14204:30;-1:-1:-1;;;14250:18:13;;;14243:45;14305:18;;3105:56:12::1;13990:339:13::0;3105:56:12::1;3174:24:::0;;-1:-1:-1;;;;;3174:24:12;;::::1;-1:-1:-1::0;;;;;;3174:24:12;;::::1;;::::0;;;3209:15;::::1;:26:::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;3246:15:::1;::::0;::::1;:26:::0;;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;3283:16:::1;::::0;::::1;:28:::0;;;;3322:17:::1;::::0;::::1;:30:::0;-1:-1:-1;3363:15:12::1;;:26:::0;-1:-1:-1;2621:776:12:o;2336:287:2:-;1759:1;2468:7;;:19;2460:63;;;;-1:-1:-1;;;2460:63:2;;14536:2:13;2460:63:2;;;14518:21:13;14575:2;14555:18;;;14548:30;14614:33;14594:18;;;14587:61;14665:18;;2460:63:2;14334:355:13;2460:63:2;1759:1;2598:7;:18;2336:287::o;974:241:5:-;1139:68;;;-1:-1:-1;;;;;14952:15:13;;;1139:68:5;;;14934:34:13;15004:15;;14984:18;;;14977:43;15036:18;;;;15029:34;;;1139:68:5;;;;;;;;;;14869:18:13;;;;1139:68:5;;;;;;;;-1:-1:-1;;;;;1139:68:5;-1:-1:-1;;;1139:68:5;;;1112:96;;1132:5;;1112:19;:96::i;:::-;974:241;;;;:::o;3334:103:0:-;3400:30;3411:4;719:10:7;3400::0;:30::i;:::-;3334:103;:::o;7461:233::-;7544:22;7552:4;7558:7;7544;:22::i;:::-;7539:149;;7582:6;:12;;;;;;;;;;;-1:-1:-1;;;;;7582:29:0;;;;;;;;;:36;;-1:-1:-1;;7582:36:0;7614:4;7582:36;;;7664:12;719:10:7;;640:96;7664:12:0;-1:-1:-1;;;;;7637:40:0;7655:7;-1:-1:-1;;;;;7637:40:0;7649:4;7637:40;;;;;;;;;;7461:233;;:::o;7865:234::-;7948:22;7956:4;7962:7;7948;:22::i;:::-;7944:149;;;8018:5;7986:12;;;;;;;;;;;-1:-1:-1;;;;;7986:29:0;;;;;;;;;;:37;;-1:-1:-1;;7986:37:0;;;8042:40;719:10:7;;7986:12:0;;8042:40;;8018:5;8042:40;7865:234;;:::o;12570:293:12:-;12656:12;12670:19;12693:6;-1:-1:-1;;;;;12693:11:12;12712:5;12719:4;12693:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12655:69;;;;12740:7;12735:121;;12822:6;12816:13;12811:2;12803:6;12799:15;12792:38;3747:706:5;4166:23;4192:69;4220:4;4192:69;;;;;;;;;;;;;;;;;4200:5;-1:-1:-1;;;;;4192:27:5;;;:69;;;;;:::i;:::-;4275:17;;4166:95;;-1:-1:-1;4275:21:5;4271:176;;4370:10;4359:30;;;;;;;;;;;;:::i;:::-;4351:85;;;;-1:-1:-1;;;4351:85:5;;16105:2:13;4351:85:5;;;16087:21:13;16144:2;16124:18;;;16117:30;16183:34;16163:18;;;16156:62;-1:-1:-1;;;16234:18:13;;;16227:40;16284:19;;4351:85:5;15903:406:13;3718:479:0;3806:22;3814:4;3820:7;3806;:22::i;:::-;3801:390;;3989:28;4009:7;3989:19;:28::i;:::-;4088:38;4116:4;4123:2;4088:19;:38::i;:::-;3896:252;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;3896:252:0;;;;;;;;;;-1:-1:-1;;;3844:336:0;;;;;;;:::i;3873:223:6:-;4006:12;4037:52;4059:6;4067:4;4073:1;4076:12;4037:21;:52::i;:::-;4030:59;3873:223;-1:-1:-1;;;;3873:223:6:o;2102:149:8:-;2160:13;2192:52;-1:-1:-1;;;;;2204:22:8;;311:2;1513:437;1588:13;1613:19;1645:10;1649:6;1645:1;:10;:::i;:::-;:14;;1658:1;1645:14;:::i;:::-;1635:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1635:25:8;;1613:47;;-1:-1:-1;;;1670:6:8;1677:1;1670:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;1670:15:8;;;;;;;;;-1:-1:-1;;;1695:6:8;1702:1;1695:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;1695:15:8;;;;;;;;-1:-1:-1;1725:9:8;1737:10;1741:6;1737:1;:10;:::i;:::-;:14;;1750:1;1737:14;:::i;:::-;1725:26;;1720:128;1757:1;1753;:5;1720:128;;;-1:-1:-1;;;1800:5:8;1808:3;1800:11;1791:21;;;;;;;:::i;:::-;;;;1779:6;1786:1;1779:9;;;;;;;;:::i;:::-;;;;:33;-1:-1:-1;;;;;1779:33:8;;;;;;;;-1:-1:-1;1836:1:8;1826:11;;;;;1760:3;;;:::i;:::-;;;1720:128;;;-1:-1:-1;1865:10:8;;1857:55;;;;-1:-1:-1;;;1857:55:8;;18007:2:13;1857:55:8;;;17989:21:13;;;18026:18;;;18019:30;18085:34;18065:18;;;18058:62;18137:18;;1857:55:8;17805:356:13;1857:55:8;1936:6;1513:437;-1:-1:-1;;;1513:437:8:o;4960:446:6:-;5125:12;5182:5;5157:21;:30;;5149:81;;;;-1:-1:-1;;;5149:81:6;;18368:2:13;5149:81:6;;;18350:21:13;18407:2;18387:18;;;18380:30;18446:34;18426:18;;;18419:62;-1:-1:-1;;;18497:18:13;;;18490:36;18543:19;;5149:81:6;18166:402:13;5149:81:6;5241:12;5255:23;5282:6;-1:-1:-1;;;;;5282:11:6;5301:5;5308:4;5282:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5240:73;;;;5330:69;5357:6;5365:7;5374:10;5386:12;5330:26;:69::i;:::-;5323:76;4960:446;-1:-1:-1;;;;;;;4960:446:6:o;7466:628::-;7646:12;7674:7;7670:418;;;7701:10;:17;7722:1;7701:22;7697:286;;-1:-1:-1;;;;;1465:19:6;;;7908:60;;;;-1:-1:-1;;;7908:60:6;;18775:2:13;7908:60:6;;;18757:21:13;18814:2;18794:18;;;18787:30;18853:31;18833:18;;;18826:59;18902:18;;7908:60:6;18573:353:13;7908:60:6;-1:-1:-1;8003:10:6;7996:17;;7670:418;8044:33;8052:10;8064:12;8775:17;;:21;8771:379;;9003:10;8997:17;9059:15;9046:10;9042:2;9038:19;9031:44;8771:379;9126:12;9119:20;;-1:-1:-1;;;9119:20:6;;;;;;;;:::i;14:286:13:-;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:13;;209:43;;199:71;;266:1;263;256:12;497:316;574:6;582;590;643:2;631:9;622:7;618:23;614:32;611:52;;;659:1;656;649:12;611:52;-1:-1:-1;;682:23:13;;;752:2;737:18;;724:32;;-1:-1:-1;803:2:13;788:18;;;775:32;;497:316;-1:-1:-1;497:316:13:o;818:180::-;877:6;930:2;918:9;909:7;905:23;901:32;898:52;;;946:1;943;936:12;898:52;-1:-1:-1;969:23:13;;818:180;-1:-1:-1;818:180:13:o;1185:131::-;-1:-1:-1;;;;;1260:31:13;;1250:42;;1240:70;;1306:1;1303;1296:12;1321:315;1389:6;1397;1450:2;1438:9;1429:7;1425:23;1421:32;1418:52;;;1466:1;1463;1456:12;1418:52;1502:9;1489:23;1479:33;;1562:2;1551:9;1547:18;1534:32;1575:31;1600:5;1575:31;:::i;:::-;1625:5;1615:15;;;1321:315;;;;;:::o;1641:367::-;1704:8;1714:6;1768:3;1761:4;1753:6;1749:17;1745:27;1735:55;;1786:1;1783;1776:12;1735:55;-1:-1:-1;1809:20:13;;1852:18;1841:30;;1838:50;;;1884:1;1881;1874:12;1838:50;1921:4;1913:6;1909:17;1897:29;;1981:3;1974:4;1964:6;1961:1;1957:14;1949:6;1945:27;1941:38;1938:47;1935:67;;;1998:1;1995;1988:12;1935:67;1641:367;;;;;:::o;2013:1099::-;2182:6;2190;2198;2206;2214;2222;2275:2;2263:9;2254:7;2250:23;2246:32;2243:52;;;2291:1;2288;2281:12;2243:52;2331:9;2318:23;2360:18;2401:2;2393:6;2390:14;2387:34;;;2417:1;2414;2407:12;2387:34;2456:70;2518:7;2509:6;2498:9;2494:22;2456:70;:::i;:::-;2545:8;;-1:-1:-1;2430:96:13;-1:-1:-1;2633:2:13;2618:18;;2605:32;;-1:-1:-1;2649:16:13;;;2646:36;;;2678:1;2675;2668:12;2646:36;2717:72;2781:7;2770:8;2759:9;2755:24;2717:72;:::i;:::-;2808:8;;-1:-1:-1;2691:98:13;-1:-1:-1;2896:2:13;2881:18;;2868:32;;-1:-1:-1;2912:16:13;;;2909:36;;;2941:1;2938;2931:12;2909:36;;2980:72;3044:7;3033:8;3022:9;3018:24;2980:72;:::i;:::-;2013:1099;;;;-1:-1:-1;2013:1099:13;;-1:-1:-1;2013:1099:13;;3071:8;;2013:1099;-1:-1:-1;;;2013:1099:13:o;3117:383::-;3194:6;3202;3210;3263:2;3251:9;3242:7;3238:23;3234:32;3231:52;;;3279:1;3276;3269:12;3231:52;3315:9;3302:23;3292:33;;3375:2;3364:9;3360:18;3347:32;3388:31;3413:5;3388:31;:::i;:::-;3117:383;;3438:5;;-1:-1:-1;;;3490:2:13;3475:18;;;;3462:32;;3117:383::o;3687:794::-;3775:6;3783;3791;3799;3852:2;3840:9;3831:7;3827:23;3823:32;3820:52;;;3868:1;3865;3858:12;3820:52;3907:9;3894:23;3926:31;3951:5;3926:31;:::i;:::-;3976:5;-1:-1:-1;4028:2:13;4013:18;;4000:32;;-1:-1:-1;4083:2:13;4068:18;;4055:32;4106:18;4136:14;;;4133:34;;;4163:1;4160;4153:12;4133:34;4201:6;4190:9;4186:22;4176:32;;4246:7;4239:4;4235:2;4231:13;4227:27;4217:55;;4268:1;4265;4258:12;4217:55;4308:2;4295:16;4334:2;4326:6;4323:14;4320:34;;;4350:1;4347;4340:12;4320:34;4395:7;4390:2;4381:6;4377:2;4373:15;4369:24;4366:37;4363:57;;;4416:1;4413;4406:12;4363:57;3687:794;;;;-1:-1:-1;;4447:2:13;4439:11;;-1:-1:-1;;;3687:794:13:o;4671:841::-;4802:6;4810;4818;4826;4834;4887:2;4875:9;4866:7;4862:23;4858:32;4855:52;;;4903:1;4900;4893:12;4855:52;4939:9;4926:23;4916:33;;5000:2;4989:9;4985:18;4972:32;5023:18;5064:2;5056:6;5053:14;5050:34;;;5080:1;5077;5070:12;5050:34;5119:70;5181:7;5172:6;5161:9;5157:22;5119:70;:::i;:::-;5208:8;;-1:-1:-1;5093:96:13;-1:-1:-1;5296:2:13;5281:18;;5268:32;;-1:-1:-1;5312:16:13;;;5309:36;;;5341:1;5338;5331:12;5309:36;;5380:72;5444:7;5433:8;5422:9;5418:24;5380:72;:::i;:::-;4671:841;;;;-1:-1:-1;4671:841:13;;-1:-1:-1;5471:8:13;;5354:98;4671:841;-1:-1:-1;;;4671:841:13:o;6194:813::-;6315:6;6323;6331;6339;6347;6355;6363;6416:3;6404:9;6395:7;6391:23;6387:33;6384:53;;;6433:1;6430;6423:12;6384:53;6469:9;6456:23;6446:33;;6529:2;6518:9;6514:18;6501:32;6542:31;6567:5;6542:31;:::i;:::-;6592:5;-1:-1:-1;6649:2:13;6634:18;;6621:32;6662:33;6621:32;6662:33;:::i;:::-;6714:7;-1:-1:-1;6773:2:13;6758:18;;6745:32;6786:33;6745:32;6786:33;:::i;:::-;6194:813;;;;-1:-1:-1;6194:813:13;;6892:3;6877:19;;6864:33;;6944:3;6929:19;;6916:33;;-1:-1:-1;6996:3:13;6981:19;;;6968:33;;-1:-1:-1;6194:813:13;-1:-1:-1;;6194:813:13:o;8469:127::-;8530:10;8525:3;8521:20;8518:1;8511:31;8561:4;8558:1;8551:15;8585:4;8582:1;8575:15;8601:168;8674:9;;;8705;;8722:15;;;8716:22;;8702:37;8692:71;;8743:18;;:::i;9121:128::-;9188:9;;;9209:11;;;9206:37;;;9223:18;;:::i;10372:127::-;10433:10;10428:3;10424:20;10421:1;10414:31;10464:4;10461:1;10454:15;10488:4;10485:1;10478:15;10504:247;10563:6;10616:2;10604:9;10595:7;10591:23;10587:32;10584:52;;;10632:1;10629;10622:12;10584:52;10671:9;10658:23;10690:31;10715:5;10690:31;:::i;10756:521::-;10833:4;10839:6;10899:11;10886:25;10993:2;10989:7;10978:8;10962:14;10958:29;10954:43;10934:18;10930:68;10920:96;;11012:1;11009;11002:12;10920:96;11039:33;;11091:20;;;-1:-1:-1;11134:18:13;11123:30;;11120:50;;;11166:1;11163;11156:12;11120:50;11199:4;11187:17;;-1:-1:-1;11230:14:13;11226:27;;;11216:38;;11213:58;;;11267:1;11264;11257:12;11282:135;11321:3;11342:17;;;11339:43;;11362:18;;:::i;:::-;-1:-1:-1;11409:1:13;11398:13;;11282:135::o;12137:125::-;12202:9;;;12223:10;;;12220:36;;;12236:18;;:::i;15074:250::-;15159:1;15169:113;15183:6;15180:1;15177:13;15169:113;;;15259:11;;;15253:18;15240:11;;;15233:39;15205:2;15198:10;15169:113;;;-1:-1:-1;;15316:1:13;15298:16;;15291:27;15074:250::o;15329:287::-;15458:3;15496:6;15490:13;15512:66;15571:6;15566:3;15559:4;15551:6;15547:17;15512:66;:::i;:::-;15594:16;;;;;15329:287;-1:-1:-1;;15329:287:13:o;15621:277::-;15688:6;15741:2;15729:9;15720:7;15716:23;15712:32;15709:52;;;15757:1;15754;15747:12;15709:52;15789:9;15783:16;15842:5;15835:13;15828:21;15821:5;15818:32;15808:60;;15864:1;15861;15854:12;16314:812;16725:25;16720:3;16713:38;16695:3;16780:6;16774:13;16796:75;16864:6;16859:2;16854:3;16850:12;16843:4;16835:6;16831:17;16796:75;:::i;:::-;-1:-1:-1;;;16930:2:13;16890:16;;;16922:11;;;16915:40;16980:13;;17002:76;16980:13;17064:2;17056:11;;17049:4;17037:17;;17002:76;:::i;:::-;17098:17;17117:2;17094:26;;16314:812;-1:-1:-1;;;;16314:812:13:o;17131:396::-;17280:2;17269:9;17262:21;17243:4;17312:6;17306:13;17355:6;17350:2;17339:9;17335:18;17328:34;17371:79;17443:6;17438:2;17427:9;17423:18;17418:2;17410:6;17406:15;17371:79;:::i;:::-;17511:2;17490:15;-1:-1:-1;;17486:29:13;17471:45;;;;17518:2;17467:54;;17131:396;-1:-1:-1;;17131:396:13:o;17532:127::-;17593:10;17588:3;17584:20;17581:1;17574:31;17624:4;17621:1;17614:15;17648:4;17645:1;17638:15;17664:136;17703:3;17731:5;17721:39;;17740:18;;:::i;:::-;-1:-1:-1;;;17776:18:13;;17664:136::o
Swarm Source
ipfs://6b459dcede70eb0a6f2ce0904725b7df47f7866056a354a02f84b7d11d3e4cf4
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.