Spend less on fees, more on crypto. Buy crypto easily with MoonPay Balance. 20M+ users trust MoonPay worldwide.
Ready to onboard to Ethereum? With MetaMask Portfolio, you're in control.
Don’t invest unless you’re prepared to lose all the money you invest.
Ready to simplify your web3 experience? Try the all-in-one web3 app trusted by millions worldwide.
No gas? No problem. MetaMask Gas Station includes gas fees directly in your quote.
Everyday giveaways up to 100 ETH, Lucky Spins. Deposit BONUS 300% and Cashbacks!
5000+ Slots & Live Casino Games, 50+cryptos. Register with Etherscan and get 760% deposit bonus. Win Big$, withdraw it fast.
Slots, Roulette, Poker & more - Proud sponsors of UFC, Everton & StakeF1 team!
Overview
ETH Balance
Eth Value
$25,857.77 (@ $3,321.52/ETH)Token Holdings
Could not find any matches!
- ERC-20 Tokens (10)5,000,652.93312613 uJENNYJenny Metave... (uJENNY)$2,331,595.15@0.46636,557.37704918 XCNOnyxcoin (XCN)$14.64@0.00225,555 KongzDAO.ioERC-20: Kong... (KongzD...)250,000 SKRTSekuritance$112.94@0.00051.7 TokenERC-20 TOKEN*[Suspicious]1,428 TokenERC-20 TOKEN*[Suspicious]394,416.79004059 TokenERC-20 TOKEN*[Suspicious]5,996,502.11218274 TokenERC-20 TOKEN*[Spam]5,555 TokenERC-20 TOKEN*[Spam]463,577,913.280655 TokenERC-20 TOKEN*[Spam]NFT Tokens (96)AFApeFlyerERC-721BZBEANZERC-721CCBCCRAYON CLUB X BAYCERC-721DApeDraw X ApeERC-721GLASSBYSSXLAUGlass by SSX3LAUERC-721GPFGutter Punks Flyerx4ERC-721KKIKuroki Nftx20ERC-721MPMegaParkx22ERC-721claim rewards on pooledeth.netpooledeth.netERC-1155sbxSANDBOXx21ERC-721ERC-721 TOKEN*[Suspicious]ERC-721 TOKEN*[Suspicious]ERC-721 TOKEN*[Suspicious]ERC-721 TOKEN*[Suspicious]ERC-721 TOKEN*[Suspicious]ERC-721 TOKEN*[Suspicious]ERC-721 TOKEN*[Suspicious]ERC-721 TOKEN*x25 [Suspicious]ERC-721 TOKEN*x25 [Suspicious]ERC-721 TOKEN*x6 [Suspicious]ERC-721 TOKEN*x30 [Suspicious]ERC-721 TOKEN*[Suspicious]ERC-721 TOKEN*[Suspicious]ERC-721 TOKEN*[Suspicious]ERC-721 TOKEN*[Suspicious]ERC-721 TOKEN*[Suspicious]ERC-721 TOKEN*[Suspicious]ERC-721 TOKEN*x2 [Suspicious]ERC-721 TOKEN*[Suspicious]ERC-721 TOKEN*[Suspicious]ERC-721 TOKEN*[Suspicious]ERC-721 TOKEN*x25 [Suspicious]ERC-721 TOKEN*x16 [Suspicious]ERC-721 TOKEN*x8 [Suspicious]ERC-1155 TOKEN*[Spam]ERC-721 TOKEN*[Spam]ERC-721 TOKEN*[Spam]ERC-721 TOKEN*[Spam]ERC-721 TOKEN*[Spam]ERC-721 TOKEN*[Spam]ERC-721 TOKEN*[Spam]ERC-721 TOKEN*[Spam]ERC-721 TOKEN*x2 [Spam]ERC-721 TOKEN*[Spam]ERC-721 TOKEN*x2 [Spam]ERC-721 TOKEN*[Spam]ERC-721 TOKEN*[Spam]ERC-721 TOKEN*[Spam]ERC-721 TOKEN*x29 [Spam]ERC-721 TOKEN*x25 [Spam]ERC-721 TOKEN*x23 [Spam]ERC-721 TOKEN*x2 [Spam]ERC-721 TOKEN*[Spam]ERC-721 TOKEN*x4 [Spam]ERC-721 TOKEN*x4 [Spam]ERC-721 TOKEN*x3 [Spam]ERC-721 TOKEN*x2 [Spam]ERC-721 TOKEN*x3 [Spam]ERC-1155 TOKEN*[Spam]ERC-721 TOKEN*[Spam]ERC-721 TOKEN*[Spam]ERC-721 TOKEN*x25 [Spam]ERC-721 TOKEN*x21 [Spam]ERC-721 TOKEN*[Spam]ERC-721 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-721 TOKEN*[Spam]ERC-721 TOKEN*[Spam]ERC-721 TOKEN*[Spam]ERC-721 TOKEN*[Spam]ERC-721 TOKEN*x11 [Spam]ERC-721 TOKEN*x19 [Spam]ERC-721 TOKEN*x28 [Spam]ERC-721 TOKEN*x26 [Spam]ERC-721 TOKEN*x4 [Spam]ERC-721 TOKEN*x4 [Spam]
More Info
Private Name Tags
ContractCreator
TokenTracker
Jenny Metaverse DAO Token (uJENNY) (@$0.4663)Multichain Info
2 addresses found via- Transactions
- Internal Transactions
- Token Transfers (ERC-20)
- NFT Transfers
- Contract
- Events
- Analytics
- Multichain Portfolio
- Cards New
- Info
Advanced Filter- Filter by Tx Type:
- Tx
- Internal Tx
- ERC-20
- NFTs
Latest 25 from a total of 2,196 transactions
Transaction Hash MethodBlockFromToApprove 21470435 2024-12-24 6:06:47 8 days ago 1735020407 IN 0 ETH$0.00 0.00031996 6.86474453 Approve 21436315 2024-12-19 11:37:59 12 days ago 1734608279 IN 0 ETH$0.00 0.00065533 14.13276 Transfer 21396439 2024-12-13 22:01:11 18 days ago 1734127271 IN 0 ETH$0.00 0.0007056 14.97454074 Approve 21361982 2024-12-09 2:33:59 23 days ago 1733711639 IN 0 ETH$0.00 0.00054195 11.62734282 Transfer 21361734 2024-12-09 1:43:47 23 days ago 1733708627 IN 0 ETH$0.00 0.00057637 12.22903033 Transfer 21361715 2024-12-09 1:39:59 23 days ago 1733708399 IN 0 ETH$0.00 0.0006253 13.2670956 Approve 21360036 2024-12-08 20:02:47 23 days ago 1733688167 IN 0 ETH$0.00 0.00056822 12.19413866 Approve 21343800 2024-12-06 13:37:59 25 days ago 1733492279 IN 0 ETH$0.00 0.00108357 23.21785134 Transfer 21343795 2024-12-06 13:36:59 25 days ago 1733492219 IN 0 ETH$0.00 0.0010939 23.22703321 Approve 21337070 2024-12-05 15:04:11 26 days ago 1733411051 IN 0 ETH$0.00 0.00140573 30.3 Approve 21322897 2024-12-03 15:33:23 28 days ago 1733240003 IN 0 ETH$0.00 0.00246371 53.17292985 Approve 21298956 2024-11-30 7:18:59 32 days ago 1732951139 IN 0 ETH$0.00 0.00032475 7 Approve 21287060 2024-11-28 15:22:11 33 days ago 1732807331 IN 0 ETH$0.00 0.00072374 15.6 Approve 21277563 2024-11-27 7:21:23 35 days ago 1732692083 IN 0 ETH$0.00 0.00041733 9 Approve 21234793 2024-11-21 8:04:11 41 days ago 1732176251 IN 0 ETH$0.00 0.0004752 10.18233145 Approve 21170319 2024-11-12 8:10:35 50 days ago 1731399035 IN 0 ETH$0.00 0.00112808 24.17146731 Transfer 21145084 2024-11-08 19:42:23 53 days ago 1731094943 IN 0 ETH$0.00 0.00072086 15.30237437 Approve 21128404 2024-11-06 11:46:59 55 days ago 1730893619 IN 0 ETH$0.00 0.00078305 16.89151404 Transfer 21126444 2024-11-06 5:12:35 56 days ago 1730869955 IN 0 ETH$0.00 0.00155103 29.89429682 Approve 21088168 2024-10-31 20:59:35 61 days ago 1730408375 IN 0 ETH$0.00 0.0004345 9.31019237 Approve 21020425 2024-10-22 10:08:47 71 days ago 1729591727 IN 0 ETH$0.00 0.00031499 6.78952218 Approve 20945352 2024-10-11 22:27:23 81 days ago 1728685643 IN 0 ETH$0.00 0.00050945 10.9810763 Approve 20938369 2024-10-10 23:01:59 82 days ago 1728601319 IN 0 ETH$0.00 0.00046087 9.95192435 Transfer 20938259 2024-10-10 22:39:59 82 days ago 1728599999 IN 0 ETH$0.00 0.00042904 9.1100988 Approve 20929613 2024-10-09 17:44:59 83 days ago 1728495899 IN 0 ETH$0.00 0.00134069 28.7641852 Latest 25 internal transactions (View All)
Advanced mode:Parent Transaction Hash Block FromTo14746931 2022-05-10 5:59:46 967 days ago 1652162386 0.00027118 ETH$0.90 14671943 2022-04-28 8:55:49 979 days ago 1651136149 0.05 ETH$166.08 14671943 2022-04-28 8:55:49 979 days ago 1651136149 0.05 ETH$166.08 14671943 2022-04-28 8:55:49 979 days ago 1651136149 0.05 ETH$166.08 14671943 2022-04-28 8:55:49 979 days ago 1651136149 0.05 ETH$166.08 14671943 2022-04-28 8:55:49 979 days ago 1651136149 0.05 ETH$166.08 14671943 2022-04-28 8:55:49 979 days ago 1651136149 0.05 ETH$166.08 14671943 2022-04-28 8:55:49 979 days ago 1651136149 0.05 ETH$166.08 14671943 2022-04-28 8:55:49 979 days ago 1651136149 0.05 ETH$166.08 14671943 2022-04-28 8:55:49 979 days ago 1651136149 0.05 ETH$166.08 14671943 2022-04-28 8:55:49 979 days ago 1651136149 0.05 ETH$166.08 14671943 2022-04-28 8:55:49 979 days ago 1651136149 0.05 ETH$166.08 14671943 2022-04-28 8:55:49 979 days ago 1651136149 0.05 ETH$166.08 14671943 2022-04-28 8:55:49 979 days ago 1651136149 0.05 ETH$166.08 14671943 2022-04-28 8:55:49 979 days ago 1651136149 1.1 ETH$3,653.67 14671943 2022-04-28 8:55:49 979 days ago 1651136149 0.05 ETH$166.08 14671943 2022-04-28 8:55:49 979 days ago 1651136149 0.05 ETH$166.08 14671943 2022-04-28 8:55:49 979 days ago 1651136149 0.05 ETH$166.08 14671943 2022-04-28 8:55:49 979 days ago 1651136149 0.05 ETH$166.08 14671943 2022-04-28 8:55:49 979 days ago 1651136149 0.05 ETH$166.08 14671943 2022-04-28 8:55:49 979 days ago 1651136149 0.05 ETH$166.08 14671943 2022-04-28 8:55:49 979 days ago 1651136149 0.05 ETH$166.08 14671943 2022-04-28 8:55:49 979 days ago 1651136149 0.05 ETH$166.08 14671943 2022-04-28 8:55:49 979 days ago 1651136149 0.05 ETH$166.08 14671943 2022-04-28 8:55:49 979 days ago 1651136149 0.05 ETH$166.08 Loading...LoadingSimilar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0x3d9233F1...630217cB3The constructor portion of the code might be different and could alter the actual behaviour of the contractContract Name:Converter
Compiler Versionv0.6.12+commit.27d51765
Contract Source Code (Solidity)
- library ERC165Checker
- - function supportsERC165(address accou ...
- - function supportsInterface(address ac ...
- - function supportsAllInterfaces(addres ...
- - function _supportsERC165Interface(add ...
- - function _callERC165SupportsInterface ...
- - function _msgSender()
- - function _msgData()
- interface IERC20
- - function totalSupply()
- - function balanceOf(address account)
- - function transfer(address recipient, ...
- - function allowance(address owner, add ...
- - function approve(address spender, uin ...
- - function transferFrom(address sender, ...
- library SafeMath
- - function add(uint256 a, uint256 b)
- - function sub(uint256 a, uint256 b)
- - function sub(uint256 a, uint256 b, st ...
- - function mul(uint256 a, uint256 b)
- - function div(uint256 a, uint256 b)
- - function div(uint256 a, uint256 b, st ...
- - function mod(uint256 a, uint256 b)
- - function mod(uint256 a, uint256 b, st ...
- contract ERC20 is Context, IERC20
- - function name()
- - function symbol()
- - function decimals()
- - function totalSupply()
- - function balanceOf(address account)
- - function transfer(address recipient, ...
- - function allowance(address owner, add ...
- - function approve(address spender, uin ...
- - function transferFrom(address sender, ...
- - function increaseAllowance(address sp ...
- - function decreaseAllowance(address sp ...
- - function _transfer(address sender, ad ...
- - function _mint(address account, uint2 ...
- - function _burn(address account, uint2 ...
- - function _approve(address owner, addr ...
- - function _setupDecimals(uint8 decimal ...
- - function _beforeTokenTransfer(address ...
- interface IERC165
- - function supportsInterface(bytes4 int ...
- interface IERC721 is IERC165
- - function balanceOf(address owner)
- - function ownerOf(uint256 tokenId)
- - function safeTransferFrom(address fro ...
- - function transferFrom(address from, a ...
- - function approve(address to, uint256 ...
- - function getApproved(uint256 tokenId)
- - function setApprovalForAll(address op ...
- - function isApprovedForAll(address own ...
- - function safeTransferFrom(address fro ...
- interface IERC1155 is IERC165
- - function balanceOf(address account, u ...
- - function balanceOfBatch(address[] cal ...
- - function setApprovalForAll(address op ...
- - function isApprovedForAll(address acc ...
- - function safeTransferFrom(address fro ...
- - function safeBatchTransferFrom(addres ...
- interface IERC1155Receiver is IERC165
- - function onERC1155Received(
- - function onERC1155BatchReceived(
- - function supportsInterface(bytes4 int ...
- - function _registerInterface(bytes4 in ...
- interface IUnicFactory
- - function feeTo()
- - function feeToSetter()
- - function getUToken(address uToken)
- - function uTokens(uint)
- - function uTokensLength()
- - function createUToken(uint256 totalSu ...
- - function setFeeTo(address)
- - function setFeeToSetter(address)
- contract Converter is ERC20, ERC11 ... *
- - function deposit(uint256[] calldata t ...
- - function issue()
- - function refund(address _to)
- - function bid(uint256 nftIndex)
- - function unbid(uint256 nftIndex)
- - function claim(uint256 nftIndex)
- - function approveUnlock(uint256 amount ...
- - function unapproveUnlock(uint256 amou ...
- - function redeemETH(uint256 amount)
- - function getBlockTimestamp()
- - function onERC1155Received(address _o ...
- - function onERC1155BatchReceived(addre ...
/** *Submitted for verification at Etherscan.io on 2021-04-01 */ // File: @openzeppelin/contracts/introspection/ERC165Checker.sol // SPDX-License-Identifier: MIT pragma solidity >=0.6.2 <0.8.0; /** * @dev Library used to query support of an interface declared via {IERC165}. * * Note that these functions return the actual result of the query: they do not * `revert` if an interface is not supported. It is up to the caller to decide * what to do in these cases. */ library ERC165Checker { // As per the EIP-165 spec, no interface should ever match 0xffffffff bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff; /* * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7 */ bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7; /** * @dev Returns true if `account` supports the {IERC165} interface, */ function supportsERC165(address account) internal view returns (bool) { // Any contract that implements ERC165 must explicitly indicate support of // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid return _supportsERC165Interface(account, _INTERFACE_ID_ERC165) && !_supportsERC165Interface(account, _INTERFACE_ID_INVALID); } /** * @dev Returns true if `account` supports the interface defined by * `interfaceId`. Support for {IERC165} itself is queried automatically. * * See {IERC165-supportsInterface}. */ function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) { // query support of both ERC165 as per the spec and support of _interfaceId return supportsERC165(account) && _supportsERC165Interface(account, interfaceId); } /** * @dev Returns true if `account` supports all the interfaces defined in * `interfaceIds`. Support for {IERC165} itself is queried automatically. * * Batch-querying can lead to gas savings by skipping repeated checks for * {IERC165} support. * * See {IERC165-supportsInterface}. */ function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) { // query support of ERC165 itself if (!supportsERC165(account)) { return false; } // query support of each interface in _interfaceIds for (uint256 i = 0; i < interfaceIds.length; i++) { if (!_supportsERC165Interface(account, interfaceIds[i])) { return false; } } // all interfaces supported return true; } /** * @notice Query if a contract implements an interface, does not check ERC165 support * @param account The address of the contract to query for support of an interface * @param interfaceId The interface identifier, as specified in ERC-165 * @return true if the contract at account indicates support of the interface with * identifier interfaceId, false otherwise * @dev Assumes that account contains a contract that supports ERC165, otherwise * the behavior of this method is undefined. This precondition can be checked * with {supportsERC165}. * Interface identification is specified in ERC-165. */ function _supportsERC165Interface(address account, bytes4 interfaceId) private view returns (bool) { // success determines whether the staticcall succeeded and result determines // whether the contract at account indicates support of _interfaceId (bool success, bool result) = _callERC165SupportsInterface(account, interfaceId); return (success && result); } /** * @notice Calls the function with selector 0x01ffc9a7 (ERC165) and suppresses throw * @param account The address of the contract to query for support of an interface * @param interfaceId The interface identifier, as specified in ERC-165 * @return success true if the STATICCALL succeeded, false otherwise * @return result true if the STATICCALL succeeded and the contract at account * indicates support of the interface with identifier interfaceId, false otherwise */ function _callERC165SupportsInterface(address account, bytes4 interfaceId) private view returns (bool, bool) { bytes memory encodedParams = abi.encodeWithSelector(_INTERFACE_ID_ERC165, interfaceId); (bool success, bytes memory result) = account.staticcall{ gas: 30000 }(encodedParams); if (result.length < 32) return (false, false); return (success, abi.decode(result, (bool))); } } // File: @openzeppelin/contracts/GSN/Context.sol pragma solidity >=0.6.0 <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 GSN 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 payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @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); } // File: @openzeppelin/contracts/math/SafeMath.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts/token/ERC20/ERC20.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20 { using SafeMath for uint256; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; uint8 private _decimals; /** * @dev Sets the values for {name} and {symbol}, initializes {decimals} with * a default value of 18. * * To select a different value for {decimals}, use {_setupDecimals}. * * All three of these values are immutable: they can only be set once during * construction. */ constructor (string memory name_, string memory symbol_) public { _name = name_; _symbol = symbol_; _decimals = 18; } /** * @dev Returns the name of the token. */ function name() public view returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is * called. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view returns (uint8) { return _decimals; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Sets {decimals} to a value other than the default one of 18. * * WARNING: This function should only be called from the constructor. Most * applications that interact with token contracts will not expect * {decimals} to ever change, and may work incorrectly if it does. */ function _setupDecimals(uint8 decimals_) internal { _decimals = decimals_; } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { } } // File: @openzeppelin/contracts/introspection/IERC165.sol pragma solidity >=0.6.0 <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); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol pragma solidity >=0.6.2 <0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; } // File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol pragma solidity >=0.6.2 <0.8.0; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data) external; } // File: @openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol pragma solidity >=0.6.0 <0.8.0; /** * _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** @dev Handles the receipt of a single ERC1155 token type. This function is called at the end of a `safeTransferFrom` after the balance has been updated. To accept the transfer, this must return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` (i.e. 0xf23a6e61, or its own function selector). @param operator The address which initiated the transfer (i.e. msg.sender) @param from The address which previously owned the token @param id The ID of the token being transferred @param value The amount of tokens being transferred @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns(bytes4); /** @dev Handles the receipt of a multiple ERC1155 token types. This function is called at the end of a `safeBatchTransferFrom` after the balances have been updated. To accept the transfer(s), this must return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` (i.e. 0xbc197c81, or its own function selector). @param operator The address which initiated the batch transfer (i.e. msg.sender) @param from The address which previously owned the token @param ids An array containing ids of each token being transferred (order and length must match values array) @param values An array containing amounts of each token being transferred (order and length must match ids array) @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns(bytes4); } // File: @openzeppelin/contracts/introspection/ERC165.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts may inherit from this and call {_registerInterface} to declare * their support of an interface. */ abstract contract ERC165 is IERC165 { /* * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7 */ bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7; /** * @dev Mapping of interface ids to whether or not it's supported. */ mapping(bytes4 => bool) private _supportedInterfaces; constructor () internal { // Derived contracts need only register support for their own interfaces, // we register support for ERC165 itself here _registerInterface(_INTERFACE_ID_ERC165); } /** * @dev See {IERC165-supportsInterface}. * * Time complexity O(1), guaranteed to always use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) public view override returns (bool) { return _supportedInterfaces[interfaceId]; } /** * @dev Registers the contract as an implementer of the interface defined by * `interfaceId`. Support of the actual ERC165 interface is automatic and * registering its interface id is not required. * * See {IERC165-supportsInterface}. * * Requirements: * * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`). */ function _registerInterface(bytes4 interfaceId) internal virtual { require(interfaceId != 0xffffffff, "ERC165: invalid interface id"); _supportedInterfaces[interfaceId] = true; } } // File: @openzeppelin/contracts/token/ERC1155/ERC1155Receiver.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev _Available since v3.1._ */ abstract contract ERC1155Receiver is ERC165, IERC1155Receiver { constructor() internal { _registerInterface( ERC1155Receiver(0).onERC1155Received.selector ^ ERC1155Receiver(0).onERC1155BatchReceived.selector ); } } // File: contracts/interfaces/IUnicFactory.sol pragma solidity >=0.5.0; interface IUnicFactory { event TokenCreated(address indexed caller, address indexed uToken); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getUToken(address uToken) external view returns (uint); function uTokens(uint) external view returns (address); function uTokensLength() external view returns (uint); function createUToken(uint256 totalSupply, uint8 decimals, string calldata name, string calldata symbol, uint256 threshold, string calldata description) external returns (address); function setFeeTo(address) external; function setFeeToSetter(address) external; } // File: contracts/Converter.sol pragma solidity 0.6.12; contract Converter is ERC20, ERC1155Receiver { using SafeMath for uint; // List of NFTs that have been deposited struct NFT { address contractAddr; uint256 tokenId; uint256 amount; bool claimed; } struct Bid { address bidder; uint256 amount; uint time; } mapping(uint256 => NFT) public nfts; // Current index and length of nfts uint256 public currentNFTIndex = 0; // If active, NFTs can’t be withdrawn bool public active = false; uint256 public totalBidAmount = 0; uint256 public unlockVotes = 0; uint256 public _threshold; address public issuer; string public _description; uint256 public cap; // Amount of uTokens each user has voted to unlock collection mapping(address => uint256) public unlockApproved; IUnicFactory public factory; // NFT index to Bid mapping(uint256 => Bid) public bids; // NFT index to address to amount mapping(uint256 => mapping(address => uint256)) public bidRefunds; uint public constant TOP_BID_LOCK_TIME = 3 days; event Deposited(uint256[] tokenIDs, uint256[] amounts, address contractAddr); event Refunded(); event Issued(); event BidCreated(address sender, uint256 nftIndex, uint256 bidAmount); event BidRemoved(address sender, uint256 nftIndex); event ClaimedNFT(address winner, uint256 nftIndex, uint256 tokenId); bytes private constant VALIDATOR = bytes('JCMY'); constructor (uint256 totalSupply, uint8 decimals, string memory name, string memory symbol, uint256 threshold, string memory description, address _issuer, IUnicFactory _factory) public ERC20(name, symbol) { _setupDecimals(decimals); issuer = _issuer; _description = description; _threshold = threshold; factory = _factory; cap = totalSupply; } // deposits an nft using the transferFrom action of the NFT contractAddr function deposit(uint256[] calldata tokenIDs, uint256[] calldata amounts, address contractAddr) external { require(msg.sender == issuer, "Converter: Only issuer can deposit"); require(tokenIDs.length <= 50, "Converter: A maximum of 50 tokens can be deposited in one go"); require(tokenIDs.length > 0, "Converter: You must specify at least one token ID"); if (ERC165Checker.supportsInterface(contractAddr, 0xd9b67a26)){ IERC1155(contractAddr).safeBatchTransferFrom(msg.sender, address(this), tokenIDs, amounts, VALIDATOR); for (uint8 i = 0; i < 50; i++){ if (tokenIDs.length == i){ break; } nfts[currentNFTIndex++] = NFT(contractAddr, tokenIDs[i], amounts[i], false); } } else if (ERC165Checker.supportsInterface(contractAddr, 0x80ac58cd)){ for (uint8 i = 0; i < 50; i++){ if (tokenIDs.length == i){ break; } IERC721(contractAddr).transferFrom(msg.sender, address(this), tokenIDs[i]); nfts[currentNFTIndex++] = NFT(contractAddr, tokenIDs[i], 1, false); } } emit Deposited(tokenIDs, amounts, contractAddr); } // Function that locks NFT collateral and issues the uTokens to the issuer function issue() external { require(msg.sender == issuer, "Converter: Only issuer can issue the tokens"); require(active == false, "Converter: Token is already active"); active = true; address feeTo = factory.feeTo(); uint256 feeAmount = 0; if (feeTo != address(0)) { // 0.5% of uToken supply is sent to feeToAddress if fee is on feeAmount = cap.div(200); _mint(feeTo, feeAmount); } _mint(issuer, cap - feeAmount); emit Issued(); } // Function that allows NFTs to be refunded (prior to issue being called) function refund(address _to) external { require(!active, "Converter: Contract is already active - cannot refund"); require(msg.sender == issuer, "Converter: Only issuer can refund"); // Only transfer maximum of 50 at a time to limit gas per call uint8 _i = 0; uint256 _index = currentNFTIndex; bytes memory data; while (_index > 0 && _i < 50){ NFT memory nft = nfts[_index - 1]; if (ERC165Checker.supportsInterface(nft.contractAddr, 0xd9b67a26)){ IERC1155(nft.contractAddr).safeTransferFrom(address(this), _to, nft.tokenId, nft.amount, data); } else if (ERC165Checker.supportsInterface(nft.contractAddr, 0x80ac58cd)){ IERC721(nft.contractAddr).safeTransferFrom(address(this), _to, nft.tokenId); } delete nfts[_index - 1]; _index--; _i++; } currentNFTIndex = _index; emit Refunded(); } function bid(uint256 nftIndex) external payable { require(unlockVotes < _threshold, "Converter: Release threshold has been met, no more bids allowed"); Bid memory topBid = bids[nftIndex]; require(topBid.bidder != msg.sender, "Converter: You have an active bid"); require(topBid.amount < msg.value, "Converter: Bid too low"); require(bidRefunds[nftIndex][msg.sender] == 0, "Converter: Collect bid refund"); bids[nftIndex] = Bid(msg.sender, msg.value, getBlockTimestamp()); bidRefunds[nftIndex][topBid.bidder] = topBid.amount; totalBidAmount += msg.value - topBid.amount; emit BidCreated(msg.sender, nftIndex, msg.value); } function unbid(uint256 nftIndex) external { Bid memory topBid = bids[nftIndex]; bool isTopBidder = topBid.bidder == msg.sender; if (unlockVotes >= _threshold) { require(!isTopBidder, "Converter: Release threshold has been met, winner can't unbid"); } if (isTopBidder) { require(topBid.time + TOP_BID_LOCK_TIME < getBlockTimestamp(), "Converter: Top bid locked"); totalBidAmount -= topBid.amount; bids[nftIndex] = Bid(address(0), 0, getBlockTimestamp()); (bool sent, bytes memory data) = msg.sender.call{value: topBid.amount}(""); require(sent, "Converter: Failed to send Ether"); emit BidRemoved(msg.sender, nftIndex); } else { uint256 refundAmount = bidRefunds[nftIndex][msg.sender]; require(refundAmount > 0, "Converter: no bid found"); bidRefunds[nftIndex][msg.sender] = 0; (bool sent, bytes memory data) = msg.sender.call{value: refundAmount}(""); require(sent, "Converter: Failed to send Ether"); } } // Claim NFT if address is winning bidder function claim(uint256 nftIndex) external { require(unlockVotes >= _threshold, "Converter: Threshold not met"); require(!nfts[nftIndex].claimed, "Converter: Already claimed"); Bid memory topBid = bids[nftIndex]; require(msg.sender == topBid.bidder, "Converter: Only winner can claim"); nfts[nftIndex].claimed = true; NFT memory winningNFT = nfts[nftIndex]; if (ERC165Checker.supportsInterface(winningNFT.contractAddr, 0xd9b67a26)){ bytes memory data; IERC1155(winningNFT.contractAddr).safeTransferFrom(address(this), topBid.bidder, winningNFT.tokenId, winningNFT.amount, data); } else if (ERC165Checker.supportsInterface(winningNFT.contractAddr, 0x80ac58cd)){ IERC721(winningNFT.contractAddr).safeTransferFrom(address(this), topBid.bidder, winningNFT.tokenId); } emit ClaimedNFT(topBid.bidder, nftIndex, winningNFT.tokenId); } // Approve collection unlock function approveUnlock(uint256 amount) external { require(unlockVotes < _threshold, "Converter: Threshold reached"); _transfer(msg.sender, address(this), amount); unlockApproved[msg.sender] += amount; unlockVotes += amount; } // Unapprove collection unlock function unapproveUnlock(uint256 amount) external { require(unlockVotes < _threshold, "Converter: Threshold reached"); require(unlockApproved[msg.sender] >= amount, "Converter: Not enough uTokens locked by user"); unlockVotes -= amount; unlockApproved[msg.sender] -= amount; _transfer(address(this), msg.sender, amount); } // Claim ETH function function redeemETH(uint256 amount) external { require(unlockVotes >= _threshold, "Converter: Threshold not met"); // Deposit uTokens if (amount > 0) { _transfer(msg.sender, address(this), amount); } // Combine approved balance + newly deposited balance uint256 finalBalance = amount + unlockApproved[msg.sender]; // Remove locked uTokens tracked for user unlockApproved[msg.sender] = 0; // Redeem ETH corresponding to uToken amount (bool sent, bytes memory data) = msg.sender.call{value: totalBidAmount.mul(finalBalance).div(this.totalSupply())}(""); require(sent, "Converter: Failed to send Ether"); } function getBlockTimestamp() internal view returns (uint) { // solium-disable-next-line security/no-block-members return block.timestamp; } /** * ERC1155 Token ERC1155Receiver */ function onERC1155Received(address _operator, address _from, uint256 _id, uint256 _value, bytes calldata _data) override external returns(bytes4) { if(keccak256(_data) == keccak256(VALIDATOR)){ return 0xf23a6e61; } } function onERC1155BatchReceived(address _operator, address _from, uint256[] calldata _ids, uint256[] calldata _values, bytes calldata _data) override external returns(bytes4) { if(keccak256(_data) == keccak256(VALIDATOR)){ return 0xbc197c81; } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
[{"inputs":[{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"threshold","type":"uint256"},{"internalType":"string","name":"description","type":"string"},{"internalType":"address","name":"_issuer","type":"address"},{"internalType":"contract IUnicFactory","name":"_factory","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"nftIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bidAmount","type":"uint256"}],"name":"BidCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"nftIndex","type":"uint256"}],"name":"BidRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"winner","type":"address"},{"indexed":false,"internalType":"uint256","name":"nftIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ClaimedNFT","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[]","name":"tokenIDs","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"indexed":false,"internalType":"address","name":"contractAddr","type":"address"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[],"name":"Issued","type":"event"},{"anonymous":false,"inputs":[],"name":"Refunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"TOP_BID_LOCK_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_description","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_threshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"active","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approveUnlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftIndex","type":"uint256"}],"name":"bid","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"bidRefunds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"bids","outputs":[{"internalType":"address","name":"bidder","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"time","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftIndex","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentNFTIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIDs","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"address","name":"contractAddr","type":"address"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"contract IUnicFactory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"issue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"issuer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nfts","outputs":[{"internalType":"address","name":"contractAddr","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"claimed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"internalType":"uint256[]","name":"_values","type":"uint256[]"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"redeemETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"refund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBidAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"unapproveUnlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftIndex","type":"uint256"}],"name":"unbid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"unlockApproved","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unlockVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Deployed Bytecode
0x60806040526004361061021a5760003560e01c806370a0823111610123578063bc197c81116100ab578063dd62ed3e1161006f578063dd62ed3e14610e7a578063e3a7c90314610eff578063ee7a116314610f2a578063f23a6e6114610f55578063fa89401a146110625761021a565b8063bc197c8114610bc4578063c45a015514610d67578063c79045cb14610da8578063cfa84dfe14610dd3578063d383f64614610e635761021a565b806395d89b41116100f257806395d89b41146109c25780639d13fb2414610a52578063a457c2d714610ab7578063a9059cbb14610b28578063af58e6f014610b995761021a565b806370a08231146107fc5780637e067a60146108615780637f3c81601461095c5780637fc6bb3d146109875761021a565b8063265aa621116101a6578063379607f511610175578063379607f51461067457806339509351146106af5780634423c5f114610720578063454a2ab314610793578063525d02b8146107c15761021a565b8063265aa621146105305780632788aeb2146105ac578063313ce5671461061b578063355274ea146106495761021a565b80630e4cfe97116101ed5780630e4cfe97146103bd57806318160ddd146103f85780631d1438481461042357806322a250821461046457806323b872dd1461049f5761021a565b806301ffc9a71461021f57806302fb0c5e1461028f57806306fdde03146102bc578063095ea7b31461034c575b600080fd5b34801561022b57600080fd5b506102776004803603602081101561024257600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690602001909291905050506110b3565b60405180821515815260200191505060405180910390f35b34801561029b57600080fd5b506102a461111b565b60405180821515815260200191505060405180910390f35b3480156102c857600080fd5b506102d161112e565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103115780820151818401526020810190506102f6565b50505050905090810190601f16801561033e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561035857600080fd5b506103a56004803603604081101561036f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506111d0565b60405180821515815260200191505060405180910390f35b3480156103c957600080fd5b506103f6600480360360208110156103e057600080fd5b81019080803590602001909291905050506111ee565b005b34801561040457600080fd5b5061040d6117ac565b6040518082815260200191505060405180910390f35b34801561042f57600080fd5b506104386117b6565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561047057600080fd5b5061049d6004803603602081101561048757600080fd5b81019080803590602001909291905050506117dc565b005b3480156104ab57600080fd5b50610518600480360360608110156104c257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506118c0565b60405180821515815260200191505060405180910390f35b34801561053c57600080fd5b506105696004803603602081101561055357600080fd5b8101908080359060200190929190505050611999565b604051808573ffffffffffffffffffffffffffffffffffffffff168152602001848152602001838152602001821515815260200194505050505060405180910390f35b3480156105b857600080fd5b50610605600480360360408110156105cf57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506119f6565b6040518082815260200191505060405180910390f35b34801561062757600080fd5b50610630611a1b565b604051808260ff16815260200191505060405180910390f35b34801561065557600080fd5b5061065e611a32565b6040518082815260200191505060405180910390f35b34801561068057600080fd5b506106ad6004803603602081101561069757600080fd5b8101908080359060200190929190505050611a38565b005b3480156106bb57600080fd5b50610708600480360360408110156106d257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611fe3565b60405180821515815260200191505060405180910390f35b34801561072c57600080fd5b506107596004803603602081101561074357600080fd5b8101908080359060200190929190505050612096565b604051808473ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390f35b6107bf600480360360208110156107a957600080fd5b81019080803590602001909291905050506120e0565b005b3480156107cd57600080fd5b506107fa600480360360208110156107e457600080fd5b8101908080359060200190929190505050612513565b005b34801561080857600080fd5b5061084b6004803603602081101561081f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506127b8565b6040518082815260200191505060405180910390f35b34801561086d57600080fd5b5061095a6004803603606081101561088457600080fd5b81019080803590602001906401000000008111156108a157600080fd5b8201836020820111156108b357600080fd5b803590602001918460208302840111640100000000831117156108d557600080fd5b9091929391929390803590602001906401000000008111156108f657600080fd5b82018360208201111561090857600080fd5b8035906020019184602083028401116401000000008311171561092a57600080fd5b9091929391929390803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612800565b005b34801561096857600080fd5b50610971612f15565b6040518082815260200191505060405180910390f35b34801561099357600080fd5b506109c0600480360360208110156109aa57600080fd5b8101908080359060200190929190505050612f1b565b005b3480156109ce57600080fd5b506109d7613097565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610a175780820151818401526020810190506109fc565b50505050905090810190601f168015610a445780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610a5e57600080fd5b50610aa160048036036020811015610a7557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613139565b6040518082815260200191505060405180910390f35b348015610ac357600080fd5b50610b1060048036036040811015610ada57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613151565b60405180821515815260200191505060405180910390f35b348015610b3457600080fd5b50610b8160048036036040811015610b4b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061321e565b60405180821515815260200191505060405180910390f35b348015610ba557600080fd5b50610bae61323c565b6040518082815260200191505060405180910390f35b348015610bd057600080fd5b50610d32600480360360a0811015610be757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610c4457600080fd5b820183602082011115610c5657600080fd5b80359060200191846020830284011164010000000083111715610c7857600080fd5b909192939192939080359060200190640100000000811115610c9957600080fd5b820183602082011115610cab57600080fd5b80359060200191846020830284011164010000000083111715610ccd57600080fd5b909192939192939080359060200190640100000000811115610cee57600080fd5b820183602082011115610d0057600080fd5b80359060200191846001830284011164010000000083111715610d2257600080fd5b9091929391929390505050613242565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b348015610d7357600080fd5b50610d7c6132c2565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610db457600080fd5b50610dbd6132e8565b6040518082815260200191505060405180910390f35b348015610ddf57600080fd5b50610de86132ef565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e28578082015181840152602081019050610e0d565b50505050905090810190601f168015610e555780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610e6f57600080fd5b50610e7861338d565b005b348015610e8657600080fd5b50610ee960048036036040811015610e9d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613619565b6040518082815260200191505060405180910390f35b348015610f0b57600080fd5b50610f146136a0565b6040518082815260200191505060405180910390f35b348015610f3657600080fd5b50610f3f6136a6565b6040518082815260200191505060405180910390f35b348015610f6157600080fd5b5061102d600480360360a0811015610f7857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190640100000000811115610fe957600080fd5b820183602082011115610ffb57600080fd5b8035906020019184600183028401116401000000008311171561101d57600080fd5b90919293919293905050506136ac565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b34801561106e57600080fd5b506110b16004803603602081101561108557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061372a565b005b600060066000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b600960009054906101000a900460ff1681565b606060038054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156111c65780601f1061119b576101008083540402835291602001916111c6565b820191906000526020600020905b8154815290600101906020018083116111a957829003601f168201915b5050505050905090565b60006111e46111dd613bcf565b8484613bd7565b6001905092915050565b6111f6614769565b601260008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282015481525050905060003373ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16149050600c54600b541061131a578015611319576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180614958603d913960400191505060405180910390fd5b5b80156115a357611328613dce565b6203f480836040015101106113a5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f436f6e7665727465723a20546f7020626964206c6f636b65640000000000000081525060200191505060405180910390fd5b8160200151600a600082825403925050819055506040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016113f0613dce565b8152506012600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155905050600060603373ffffffffffffffffffffffffffffffffffffffff16846020015160405180600001905060006040518083038185875af1925050503d80600081146114ca576040519150601f19603f3d011682016040523d82523d6000602084013e6114cf565b606091505b509150915081611547576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f436f6e7665727465723a204661696c656420746f2073656e642045746865720081525060200191505060405180910390fd5b7f7fd2c6472e4a5cf47dd45d6e616062bb6b2a25c19206eaa78f5ac8ea80cd5f973386604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a150506117a7565b60006013600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000811161166e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f436f6e7665727465723a206e6f2062696420666f756e6400000000000000000081525060200191505060405180910390fd5b60006013600086815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600060603373ffffffffffffffffffffffffffffffffffffffff168360405180600001905060006040518083038185875af1925050503d8060008114611726576040519150601f19603f3d011682016040523d82523d6000602084013e61172b565b606091505b5091509150816117a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f436f6e7665727465723a204661696c656420746f2073656e642045746865720081525060200191505060405180910390fd5b5050505b505050565b6000600254905090565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c54600b5410611855576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f436f6e7665727465723a205468726573686f6c6420726561636865640000000081525060200191505060405180910390fd5b611860333083613dd6565b80601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555080600b6000828254019250508190555050565b60006118cd848484613dd6565b61198e846118d9613bcf565b611989856040518060600160405280602881526020016149d760289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061193f613bcf565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546140979092919063ffffffff16565b613bd7565b600190509392505050565b60076020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030160009054906101000a900460ff16905084565b6013602052816000526040600020602052806000526040600020600091509150505481565b6000600560009054906101000a900460ff16905090565b600f5481565b600c54600b541015611ab2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f436f6e7665727465723a205468726573686f6c64206e6f74206d65740000000081525060200191505060405180910390fd5b6007600082815260200190815260200160002060030160009054906101000a900460ff1615611b49576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f436f6e7665727465723a20416c726561647920636c61696d656400000000000081525060200191505060405180910390fd5b611b51614769565b601260008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820154815250509050806000015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c80576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f436f6e7665727465723a204f6e6c792077696e6e65722063616e20636c61696d81525060200191505060405180910390fd5b60016007600084815260200190815260200160002060030160006101000a81548160ff021916908315150217905550611cb76147a0565b600760008481526020019081526020016000206040518060800160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282015481526020016003820160009054906101000a900460ff1615151515815250509050611d71816000015163d9b67a2660e01b614157565b15611eaa576060816000015173ffffffffffffffffffffffffffffffffffffffff1663f242432a30856000015185602001518660400151866040518663ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611e3c578082015181840152602081019050611e21565b50505050905090810190601f168015611e695780820380516001836020036101000a031916815260200191505b509650505050505050600060405180830381600087803b158015611e8c57600080fd5b505af1158015611ea0573d6000803e3d6000fd5b5050505050611f79565b611ebf81600001516380ac58cd60e01b614157565b15611f7857806000015173ffffffffffffffffffffffffffffffffffffffff166342842e0e30846000015184602001516040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b158015611f5f57600080fd5b505af1158015611f73573d6000803e3d6000fd5b505050505b5b7feeca06d3fb2f51c15539b63d32d639ef54c363f311045a0cbec5971f7fd355328260000151848360200151604051808473ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a1505050565b600061208c611ff0613bcf565b846120878560016000612001613bcf565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461417c90919063ffffffff16565b613bd7565b6001905092915050565b60126020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154905083565b600c54600b541061213c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603f815260200180614890603f913960400191505060405180910390fd5b612144614769565b601260008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820154815260200160028201548152505090503373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161415612257576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806148cf6021913960400191505060405180910390fd5b348160200151106122d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f436f6e7665727465723a2042696420746f6f206c6f770000000000000000000081525060200191505060405180910390fd5b60006013600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414612396576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f436f6e7665727465723a20436f6c6c6563742062696420726566756e6400000081525060200191505060405180910390fd5b60405180606001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020013481526020016123cb613dce565b8152506012600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010155604082015181600201559050508060200151601360008481526020019081526020016000206000836000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080602001513403600a600082825401925050819055507fbc13236afe4f10fc8d44c86b16e9e6695b2758938a2bedf6ceef72157259447b338334604051808473ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a15050565b600c54600b54101561258d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f436f6e7665727465723a205468726573686f6c64206e6f74206d65740000000081525060200191505060405180910390fd5b60008111156125a2576125a1333083613dd6565b5b6000601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054820190506000601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600060603373ffffffffffffffffffffffffffffffffffffffff166126ef3073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561269157600080fd5b505afa1580156126a5573d6000803e3d6000fd5b505050506040513d60208110156126bb57600080fd5b81019080805190602001909291905050506126e186600a5461420490919063ffffffff16565b61428a90919063ffffffff16565b60405180600001905060006040518083038185875af1925050503d8060008114612735576040519150601f19603f3d011682016040523d82523d6000602084013e61273a565b606091505b5091509150816127b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f436f6e7665727465723a204661696c656420746f2073656e642045746865720081525060200191505060405180910390fd5b50505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146128a6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806148486022913960400191505060405180910390fd5b6032858590501115612903576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c81526020018061491c603c913960400191505060405180910390fd5b6000858590501161295f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526031815260200180614a246031913960400191505060405180910390fd5b6129708163d9b67a2660e01b614157565b15612c5e578073ffffffffffffffffffffffffffffffffffffffff16632eb2c2d63330888888886040518060400160405280600481526020017f4a434d59000000000000000000000000000000000000000000000000000000008152506040518863ffffffff1660e01b8152600401808873ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1681526020018060200180602001806020018481038452898982818152602001925060200280828437600081840152601f19601f8201169050808301925050508481038352878782818152602001925060200280828437600081840152601f19601f820116905080830192505050848103825285818151815260200191508051906020019080838360005b83811015612ab8578082015181840152602081019050612a9d565b50505050905090810190601f168015612ae55780820380516001836020036101000a031916815260200191505b509a5050505050505050505050600060405180830381600087803b158015612b0c57600080fd5b505af1158015612b20573d6000803e3d6000fd5b5050505060005b60328160ff161015612c58578060ff16868690501415612b4657612c58565b60405180608001604052808373ffffffffffffffffffffffffffffffffffffffff16815260200187878460ff16818110612b7c57fe5b90506020020135815260200185858460ff16818110612b9757fe5b90506020020135815260200160001515815250600760006008600081548092919060010191905055815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602082015181600101556040820151816002015560608201518160030160006101000a81548160ff0219169083151502179055509050508080600101915050612b27565b50612e53565b612c6f816380ac58cd60e01b614157565b15612e525760005b60328160ff161015612e50578060ff16868690501415612c9657612e50565b8173ffffffffffffffffffffffffffffffffffffffff166323b872dd333089898660ff16818110612cc357fe5b905060200201356040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b158015612d3a57600080fd5b505af1158015612d4e573d6000803e3d6000fd5b5050505060405180608001604052808373ffffffffffffffffffffffffffffffffffffffff16815260200187878460ff16818110612d8857fe5b9050602002013581526020016001815260200160001515815250600760006008600081548092919060010191905055815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602082015181600101556040820151816002015560608201518160030160006101000a81548160ff0219169083151502179055509050508080600101915050612c77565b505b5b7fa483e688f75a9865537d84843ea1c4d1c5f25f6f00565268e91430c4d75cc01b85858585856040518080602001806020018473ffffffffffffffffffffffffffffffffffffffff1681526020018381038352888882818152602001925060200280828437600081840152601f19601f8201169050808301925050508381038252868682818152602001925060200280828437600081840152601f19601f82011690508083019250505097505050505050505060405180910390a15050505050565b600c5481565b600c54600b5410612f94576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f436f6e7665727465723a205468726573686f6c6420726561636865640000000081525060200191505060405180910390fd5b80601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561302c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001806148f0602c913960400191505060405180910390fd5b80600b6000828254039250508190555080601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540392505081905550613094303383613dd6565b50565b606060048054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561312f5780601f106131045761010080835404028352916020019161312f565b820191906000526020600020905b81548152906001019060200180831161311257829003601f168201915b5050505050905090565b60106020528060005260406000206000915090505481565b600061321461315e613bcf565b8461320f85604051806060016040528060258152602001614ad96025913960016000613188613bcf565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546140979092919063ffffffff16565b613bd7565b6001905092915050565b600061323261322b613bcf565b8484613dd6565b6001905092915050565b60085481565b60006040518060400160405280600481526020017f4a434d5900000000000000000000000000000000000000000000000000000000815250805190602001208383604051808383808284378083019250505092505050604051809103902014156132b55763bc197c8160e01b90506132b6565b5b98975050505050505050565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6203f48081565b600e8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156133855780601f1061335a57610100808354040283529160200191613385565b820191906000526020600020905b81548152906001019060200180831161336857829003601f168201915b505050505081565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613433576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180614aae602b913960400191505060405180910390fd5b60001515600960009054906101000a900460ff1615151461349f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806148046022913960400191505060405180910390fd5b6001600960006101000a81548160ff0219169083151502179055506000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663017e7e586040518163ffffffff1660e01b815260040160206040518083038186803b15801561352457600080fd5b505afa158015613538573d6000803e3d6000fd5b505050506040513d602081101561354e57600080fd5b8101908080519060200190929190505050905060008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146135b9576135ac60c8600f5461428a90919063ffffffff16565b90506135b882826142d4565b5b6135e9600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682600f54036142d4565b7fee1d8c0a784b4733dc46e6e61233f85c6b4e41244a61fe29f41a84d3f8a3d01c60405160405180910390a15050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600b5481565b600a5481565b60006040518060400160405280600481526020017f4a434d59000000000000000000000000000000000000000000000000000000008152508051906020012083836040518083838082843780830192505050925050506040518091039020141561371f5763f23a6e6160e01b9050613720565b5b9695505050505050565b600960009054906101000a900460ff1615613790576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526035815260200180614a556035913960400191505060405180910390fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613836576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806149b66021913960400191505060405180910390fd5b600080600854905060605b600082118015613854575060328360ff16105b15613b96576138616147a0565b600760006001850381526020019081526020016000206040518060800160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282015481526020016003820160009054906101000a900460ff161515151581525050905061391e816000015163d9b67a2660e01b614157565b15613a5057806000015173ffffffffffffffffffffffffffffffffffffffff1663f242432a308784602001518560400151876040518663ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156139e35780820151818401526020810190506139c8565b50505050905090810190601f168015613a105780820380516001836020036101000a031916815260200191505b509650505050505050600060405180830381600087803b158015613a3357600080fd5b505af1158015613a47573d6000803e3d6000fd5b50505050613b1b565b613a6581600001516380ac58cd60e01b614157565b15613b1a57806000015173ffffffffffffffffffffffffffffffffffffffff166342842e0e308784602001516040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b158015613b0157600080fd5b505af1158015613b15573d6000803e3d6000fd5b505050505b5b60076000600185038152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600182016000905560028201600090556003820160006101000a81549060ff02191690555050828060019003935050838060010194505050613841565b816008819055507f8616bbbbad963e4e65b1366f1d75dfb63f9e9704bbbf91fb01bec70849906cf760405160405180910390a150505050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613c5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180614a8a6024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613ce3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806148266022913960400191505060405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b600042905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613e5c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806149ff6025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613ee2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806147e16023913960400191505060405180910390fd5b613eed83838361449b565b613f588160405180606001604052806026815260200161486a602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546140979092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613feb816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461417c90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b6000838311158290614144576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156141095780820151818401526020810190506140ee565b50505050905090810190601f1680156141365780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6000614162836144a0565b8015614174575061417383836144d4565b5b905092915050565b6000808284019050838110156141fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000808314156142175760009050614284565b600082840290508284828161422857fe5b041461427f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806149956021913960400191505060405180910390fd5b809150505b92915050565b60006142cc83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506144fb565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415614377576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b6143836000838361449b565b6143988160025461417c90919063ffffffff16565b6002819055506143ef816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461417c90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b505050565b60006144b3826301ffc9a760e01b6144d4565b80156144cd57506144cb8263ffffffff60e01b6144d4565b155b9050919050565b60008060006144e385856145c1565b915091508180156144f15750805b9250505092915050565b600080831182906145a7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561456c578082015181840152602081019050614551565b50505050905090810190601f1680156145995780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816145b357fe5b049050809150509392505050565b60008060606301ffc9a760e01b8460405160240180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001915050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600060608673ffffffffffffffffffffffffffffffffffffffff16617530846040518082805190602001908083835b602083106146af578051825260208201915060208101905060208303925061468c565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114614710576040519150601f19603f3d011682016040523d82523d6000602084013e614715565b606091505b50915091506020815110156147335760008094509450505050614762565b8181806020019051602081101561474957600080fd5b8101908080519060200190929190505050945094505050505b9250929050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081525090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600015158152509056fe45524332303a207472616e7366657220746f20746865207a65726f2061646472657373436f6e7665727465723a20546f6b656e20697320616c72656164792061637469766545524332303a20617070726f766520746f20746865207a65726f2061646472657373436f6e7665727465723a204f6e6c79206973737565722063616e206465706f73697445524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365436f6e7665727465723a2052656c65617365207468726573686f6c6420686173206265656e206d65742c206e6f206d6f7265206269647320616c6c6f776564436f6e7665727465723a20596f75206861766520616e2061637469766520626964436f6e7665727465723a204e6f7420656e6f7567682075546f6b656e73206c6f636b65642062792075736572436f6e7665727465723a2041206d6178696d756d206f6620353020746f6b656e732063616e206265206465706f736974656420696e206f6e6520676f436f6e7665727465723a2052656c65617365207468726573686f6c6420686173206265656e206d65742c2077696e6e65722063616e277420756e626964536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77436f6e7665727465723a204f6e6c79206973737565722063616e20726566756e6445524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a207472616e736665722066726f6d20746865207a65726f2061646472657373436f6e7665727465723a20596f75206d7573742073706563696679206174206c65617374206f6e6520746f6b656e204944436f6e7665727465723a20436f6e747261637420697320616c726561647920616374697665202d2063616e6e6f7420726566756e6445524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373436f6e7665727465723a204f6e6c79206973737565722063616e2069737375652074686520746f6b656e7345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220162a98375b9a0d32bad20ab3a262d9d279ef87b720c6b243dbb155c10a8de98564736f6c634300060c0033
Deployed Bytecode Sourcemap
39905:10306:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37869:142;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;40435:26;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;16073:83;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18179:169;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;45774:1143;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;17148:100;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;40577:21;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;47989:268;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;18830:321;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;40264:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40932:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;17000:83;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;40638:18;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;46972:975;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;19560:218;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;40851:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45055:711;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;48710:721;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;17311:119;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;41964:1315;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;40545:25;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;48301:374;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;16275:87;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40732:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;20281:269;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;17643:175;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;40347:34;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;49925:281;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;40790:27;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;41004:47;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;40605:26;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43367:562;;;;;;;;;;;;;:::i;:::-;;17881:151;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;40508:30;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;40468:33;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;49665:252;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;44016:1031;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;37869:142;37946:4;37970:20;:33;37991:11;37970:33;;;;;;;;;;;;;;;;;;;;;;;;;;;37963:40;;37869:142;;;:::o;40435:26::-;;;;;;;;;;;;;:::o;16073:83::-;16110:13;16143:5;16136:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16073:83;:::o;18179:169::-;18262:4;18279:39;18288:12;:10;:12::i;:::-;18302:7;18311:6;18279:8;:39::i;:::-;18336:4;18329:11;;18179:169;;;;:::o;45774:1143::-;45827:17;;:::i;:::-;45847:4;:14;45852:8;45847:14;;;;;;;;;;;45827:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45872:16;45908:10;45891:27;;:6;:13;;;:27;;;45872:46;;45948:10;;45933:11;;:25;45929:144;;45984:11;45983:12;45975:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45929:144;46089:11;46085:825;;;46159:19;:17;:19::i;:::-;41045:6;46125;:11;;;:31;:53;46117:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46241:6;:13;;;46223:14;;:31;;;;;;;;;;;46286:39;;;;;;;;46298:1;46286:39;;;;;;46302:1;46286:39;;;;46305:19;:17;:19::i;:::-;46286:39;;;46269:4;:14;46274:8;46269:14;;;;;;;;;;;:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46341:9;46352:17;46373:10;:15;;46396:6;:13;;;46373:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46340:74;;;;46437:4;46429:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46499:32;46510:10;46522:8;46499:32;;;;;;;;;;;;;;;;;;;;;;;;;;46085:825;;;;;46574:20;46597:10;:20;46608:8;46597:20;;;;;;;;;;;:32;46618:10;46597:32;;;;;;;;;;;;;;;;46574:55;;46667:1;46652:12;:16;46644:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46746:1;46711:10;:20;46722:8;46711:20;;;;;;;;;;;:32;46732:10;46711:32;;;;;;;;;;;;;;;:36;;;;46763:9;46774:17;46795:10;:15;;46818:12;46795:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46762:73;;;;46858:4;46850:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46085:825;;;;45774:1143;;;:::o;17148:100::-;17201:7;17228:12;;17221:19;;17148:100;:::o;40577:21::-;;;;;;;;;;;;;:::o;47989:268::-;48070:10;;48056:11;;:24;48048:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48124:44;48134:10;48154:4;48161:6;48124:9;:44::i;:::-;48211:6;48181:14;:26;48196:10;48181:26;;;;;;;;;;;;;;;;:36;;;;;;;;;;;48243:6;48228:11;;:21;;;;;;;;;;;47989:268;:::o;18830:321::-;18936:4;18953:36;18963:6;18971:9;18982:6;18953:9;:36::i;:::-;19000:121;19009:6;19017:12;:10;:12::i;:::-;19031:89;19069:6;19031:89;;;;;;;;;;;;;;;;;:11;:19;19043:6;19031:19;;;;;;;;;;;;;;;:33;19051:12;:10;:12::i;:::-;19031:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;19000:8;:121::i;:::-;19139:4;19132:11;;18830:321;;;;;:::o;40264:35::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;40932:65::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;17000:83::-;17041:5;17066:9;;;;;;;;;;;17059:16;;17000:83;:::o;40638:18::-;;;;:::o;46972:975::-;47048:10;;47033:11;;:25;;47025:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47111:4;:14;47116:8;47111:14;;;;;;;;;;;:22;;;;;;;;;;;;47110:23;47102:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47175:17;;:::i;:::-;47195:4;:14;47200:8;47195:14;;;;;;;;;;;47175:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47242:6;:13;;;47228:27;;:10;:27;;;47220:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47330:4;47305;:14;47310:8;47305:14;;;;;;;;;;;:22;;;:29;;;;;;;;;;;;;;;;;;47345:21;;:::i;:::-;47369:4;:14;47374:8;47369:14;;;;;;;;;;;47345:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47400:68;47432:10;:23;;;47457:10;47400:68;;:31;:68::i;:::-;47396:471;;;47484:17;47525:10;:23;;;47516:50;;;47575:4;47582:6;:13;;;47597:10;:18;;;47617:10;:17;;;47636:4;47516:125;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47396:471;;;;47672:68;47704:10;:23;;;47729:10;47672:68;;:31;:68::i;:::-;47668:199;;;47764:10;:23;;;47756:49;;;47814:4;47821:6;:13;;;47836:10;:18;;;47756:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47668:199;47396:471;47884:55;47895:6;:13;;;47910:8;47920:10;:18;;;47884:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46972:975;;;:::o;19560:218::-;19648:4;19665:83;19674:12;:10;:12::i;:::-;19688:7;19697:50;19736:10;19697:11;:25;19709:12;:10;:12::i;:::-;19697:25;;;;;;;;;;;;;;;:34;19723:7;19697:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;19665:8;:83::i;:::-;19766:4;19759:11;;19560:218;;;;:::o;40851:35::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;45055:711::-;45136:10;;45122:11;;:24;45114:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45225:17;;:::i;:::-;45245:4;:14;45250:8;45245:14;;;;;;;;;;;45225:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45295:10;45278:27;;:6;:13;;;:27;;;;45270:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45378:9;45362:6;:13;;;:25;45354:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45469:1;45433:10;:20;45444:8;45433:20;;;;;;;;;;;:32;45454:10;45433:32;;;;;;;;;;;;;;;;:37;45425:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45534:47;;;;;;;;45538:10;45534:47;;;;;;45550:9;45534:47;;;;45561:19;:17;:19::i;:::-;45534:47;;;45517:4;:14;45522:8;45517:14;;;;;;;;;;;:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45630:6;:13;;;45592:10;:20;45603:8;45592:20;;;;;;;;;;;:35;45613:6;:13;;;45592:35;;;;;;;;;;;;;;;:51;;;;45684:6;:13;;;45672:9;:25;45654:14;;:43;;;;;;;;;;;45715;45726:10;45738:8;45748:9;45715:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45055:711;;:::o;48710:721::-;48788:10;;48773:11;;:25;;48765:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48883:1;48874:6;:10;48870:87;;;48901:44;48911:10;48931:4;48938:6;48901:9;:44::i;:::-;48870:87;49030:20;49062:14;:26;49077:10;49062:26;;;;;;;;;;;;;;;;49053:6;:35;49030:58;;49179:1;49150:14;:26;49165:10;49150:26;;;;;;;;;;;;;;;:30;;;;49248:9;49259:17;49280:10;:15;;49303:56;49340:4;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49303:32;49322:12;49303:14;;:18;;:32;;;;:::i;:::-;:36;;:56;;;;:::i;:::-;49280:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49247:117;;;;49383:4;49375:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48710:721;;;;:::o;17311:119::-;17377:7;17404:9;:18;17414:7;17404:18;;;;;;;;;;;;;;;;17397:25;;17311:119;;;:::o;41964:1315::-;42102:6;;;;;;;;;;;42088:20;;:10;:20;;;42080:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42185:2;42166:8;;:15;;:21;;42158:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42289:1;42271:8;;:15;;:19;42263:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42361:57;42393:12;42407:10;42361:57;;:31;:57::i;:::-;42357:855;;;42443:12;42434:44;;;42479:10;42499:4;42506:8;;42516:7;;41431:13;;;;;;;;;;;;;;;;;42434:101;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42557:7;42552:231;42574:2;42570:1;:6;;;42552:231;;;42624:1;42605:20;;:8;;:15;;:20;42601:73;;;42649:5;;42601:73;42718:49;;;;;;;;42722:12;42718:49;;;;;;42736:8;;42745:1;42736:11;;;;;;;;;;;;;;;42718:49;;;;42749:7;;42757:1;42749:10;;;;;;;;;;;;;;;42718:49;;;;42761:5;42718:49;;;;;42692:4;:23;42697:15;;:17;;;;;;;;;;;;42692:23;;;;;;;;;;;:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42578:3;;;;;;;42552:231;;;;42357:855;;;42813:57;42845:12;42859:10;42813:57;;:31;:57::i;:::-;42809:403;;;42891:7;42886:315;42908:2;42904:1;:6;;;42886:315;;;42958:1;42939:20;;:8;;:15;;:20;42935:73;;;42983:5;;42935:73;43034:12;43026:34;;;43061:10;43081:4;43088:8;;43097:1;43088:11;;;;;;;;;;;;;;;43026:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43145:40;;;;;;;;43149:12;43145:40;;;;;;43163:8;;43172:1;43163:11;;;;;;;;;;;;;;;43145:40;;;;43176:1;43145:40;;;;43179:5;43145:40;;;;;43119:4;:23;43124:15;;:17;;;;;;;;;;;;43119:23;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42912:3;;;;;;;42886:315;;;;42809:403;42357:855;43229:42;43239:8;;43249:7;;43258:12;43229:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41964:1315;;;;;:::o;40545:25::-;;;;:::o;48301:374::-;48384:10;;48370:11;;:24;48362:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48476:6;48446:14;:26;48461:10;48446:26;;;;;;;;;;;;;;;;:36;;48438:93;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48557:6;48542:11;;:21;;;;;;;;;;;48604:6;48574:14;:26;48589:10;48574:26;;;;;;;;;;;;;;;;:36;;;;;;;;;;;48623:44;48641:4;48648:10;48660:6;48623:9;:44::i;:::-;48301:374;:::o;16275:87::-;16314:13;16347:7;16340:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16275:87;:::o;40732:49::-;;;;;;;;;;;;;;;;;:::o;20281:269::-;20374:4;20391:129;20400:12;:10;:12::i;:::-;20414:7;20423:96;20462:15;20423:96;;;;;;;;;;;;;;;;;:11;:25;20435:12;:10;:12::i;:::-;20423:25;;;;;;;;;;;;;;;:34;20449:7;20423:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;20391:8;:129::i;:::-;20538:4;20531:11;;20281:269;;;;:::o;17643:175::-;17729:4;17746:42;17756:12;:10;:12::i;:::-;17770:9;17781:6;17746:9;:42::i;:::-;17806:4;17799:11;;17643:175;;;;:::o;40347:34::-;;;;:::o;49925:281::-;50092:6;41431:13;;;;;;;;;;;;;;;;;50134:20;;;;;;50124:5;;50114:16;;;;;;;;;;;;;;;;;;;;;;;;;;;:40;50111:88;;;50177:10;50170:17;;;;;;50111:88;49925:281;;;;;;;;;;;:::o;40790:27::-;;;;;;;;;;;;;:::o;41004:47::-;41045:6;41004:47;:::o;40605:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43367:562::-;43426:6;;;;;;;;;;;43412:20;;:10;:20;;;43404:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43509:5;43499:15;;:6;;;;;;;;;;;:15;;;43491:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43575:4;43566:6;;:13;;;;;;;;;;;;;;;;;;43590;43606:7;;;;;;;;;;;:13;;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43590:31;;43632:17;43685:1;43668:19;;:5;:19;;;43664:189;;43791:12;43799:3;43791;;:7;;:12;;;;:::i;:::-;43779:24;;43818:23;43824:5;43831:9;43818:5;:23::i;:::-;43664:189;43865:30;43871:6;;;;;;;;;;;43885:9;43879:3;;:15;43865:5;:30::i;:::-;43913:8;;;;;;;;;;43367:562;;:::o;17881:151::-;17970:7;17997:11;:18;18009:5;17997:18;;;;;;;;;;;;;;;:27;18016:7;17997:27;;;;;;;;;;;;;;;;17990:34;;17881:151;;;;:::o;40508:30::-;;;;:::o;40468:33::-;;;;:::o;49665:252::-;49803:6;41431:13;;;;;;;;;;;;;;;;;49845:20;;;;;;49835:5;;49825:16;;;;;;;;;;;;;;;;;;;;;;;;;;;:40;49822:88;;;49888:10;49881:17;;;;;;49822:88;49665:252;;;;;;;;;:::o;44016:1031::-;44074:6;;;;;;;;;;;44073:7;44065:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44171:6;;;;;;;;;;;44157:20;;:10;:20;;;44149:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44300:8;44323:14;44340:15;;44323:32;;44366:17;44396:579;44412:1;44403:6;:10;:21;;;;;44422:2;44417;:7;;;44403:21;44396:579;;;44440:14;;:::i;:::-;44457:4;:16;44471:1;44462:6;:10;44457:16;;;;;;;;;;;44440:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44494:61;44526:3;:16;;;44544:10;44494:61;;:31;:61::i;:::-;44490:390;;;44584:3;:16;;;44575:43;;;44627:4;44634:3;44639;:11;;;44652:3;:10;;;44664:4;44575:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44490:390;;;44708:61;44740:3;:16;;;44758:10;44708:61;;:31;:61::i;:::-;44704:176;;;44797:3;:16;;;44789:42;;;44840:4;44847:3;44852;:11;;;44789:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44704:176;44490:390;44903:4;:16;44917:1;44908:6;:10;44903:16;;;;;;;;;;;;44896:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44936:8;;;;;;;;44959:4;;;;;;;44396:579;;;;45005:6;44987:15;:24;;;;45029:10;;;;;;;;;;44016:1031;;;;:::o;5347:106::-;5400:15;5435:10;5428:17;;5347:106;:::o;23428:346::-;23547:1;23530:19;;:5;:19;;;;23522:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23628:1;23609:21;;:7;:21;;;;23601:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23712:6;23682:11;:18;23694:5;23682:18;;;;;;;;;;;;;;;:27;23701:7;23682:27;;;;;;;;;;;;;;;:36;;;;23750:7;23734:32;;23743:5;23734:32;;;23759:6;23734:32;;;;;;;;;;;;;;;;;;23428:346;;;:::o;49439:162::-;49491:4;49578:15;49571:22;;49439:162;:::o;21040:539::-;21164:1;21146:20;;:6;:20;;;;21138:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21248:1;21227:23;;:9;:23;;;;21219:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21303:47;21324:6;21332:9;21343:6;21303:20;:47::i;:::-;21383:71;21405:6;21383:71;;;;;;;;;;;;;;;;;:9;:17;21393:6;21383:17;;;;;;;;;;;;;;;;:21;;:71;;;;;:::i;:::-;21363:9;:17;21373:6;21363:17;;;;;;;;;;;;;;;:91;;;;21488:32;21513:6;21488:9;:20;21498:9;21488:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;21465:9;:20;21475:9;21465:20;;;;;;;;;;;;;;;:55;;;;21553:9;21536:35;;21545:6;21536:35;;;21564:6;21536:35;;;;;;;;;;;;;;;;;;21040:539;;;:::o;10348:192::-;10434:7;10467:1;10462;:6;;10470:12;10454:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10494:9;10510:1;10506;:5;10494:17;;10531:1;10524:8;;;10348:192;;;;;:::o;1462:290::-;1549:4;1658:23;1673:7;1658:14;:23::i;:::-;:86;;;;;1698:46;1723:7;1732:11;1698:24;:46::i;:::-;1658:86;1651:93;;1462:290;;;;:::o;9445:181::-;9503:7;9523:9;9539:1;9535;:5;9523:17;;9564:1;9559;:6;;9551:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9617:1;9610:8;;;9445:181;;;;:::o;10799:471::-;10857:7;11107:1;11102;:6;11098:47;;;11132:1;11125:8;;;;11098:47;11157:9;11173:1;11169;:5;11157:17;;11202:1;11197;11193;:5;;;;;;:10;11185:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11261:1;11254:8;;;10799:471;;;;;:::o;11746:132::-;11804:7;11831:39;11835:1;11838;11831:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;11824:46;;11746:132;;;;:::o;21861:378::-;21964:1;21945:21;;:7;:21;;;;21937:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22015:49;22044:1;22048:7;22057:6;22015:20;:49::i;:::-;22092:24;22109:6;22092:12;;:16;;:24;;;;:::i;:::-;22077:12;:39;;;;22148:30;22171:6;22148:9;:18;22158:7;22148:18;;;;;;;;;;;;;;;;:22;;:30;;;;:::i;:::-;22127:9;:18;22137:7;22127:18;;;;;;;;;;;;;;;:51;;;;22215:7;22194:37;;22211:1;22194:37;;;22224:6;22194:37;;;;;;;;;;;;;;;;;;21861:378;;:::o;24799:92::-;;;;:::o;837:399::-;901:4;1099:55;1124:7;727:10;1133:20;;1099:24;:55::i;:::-;:129;;;;;1172:56;1197:7;575:10;1206:21;;1172:24;:56::i;:::-;1171:57;1099:129;1092:136;;837:399;;;:::o;3325:401::-;3418:4;3600:12;3614:11;3629:50;3658:7;3667:11;3629:28;:50::i;:::-;3599:80;;;;3700:7;:17;;;;;3711:6;3700:17;3692:26;;;;3325:401;;;;:::o;12374:278::-;12460:7;12492:1;12488;:5;12495:12;12480:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12519:9;12535:1;12531;:5;;;;;;12519:17;;12643:1;12636:8;;;12374:278;;;;;:::o;4253:453::-;4377:4;4383;4405:26;727:10;4457:20;;4479:11;4434:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4405:86;;4503:12;4517:19;4540:7;:18;;4565:5;4573:13;4540:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4502:85;;;;4618:2;4602:6;:13;:18;4598:45;;;4630:5;4637;4622:21;;;;;;;;;4598:45;4662:7;4682:6;4671:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4654:44;;;;;;;4253:453;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://162a98375b9a0d32bad20ab3a262d9d279ef87b720c6b243dbb155c10a8de985
Loading...LoadingLoading...Loading
Loading...Loading
Loading...LoadingLoading...LoadingLoading...LoadingLoading...LoadingLoading...LoadingLoading...LoadingOVERVIEW
Jenny is the first Metaverse DAO to be built on Unicly. It is building one of the most amazing 1-of-1, collectively owned NFT collections in the world.
Multichain Portfolio | 30 Chains
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.
Address QR Code
My Address - Private Name Tag or Note
My Name Tag:
Private Name Tags (up to 35 characters) can be used for easy identification of addressesPrivate Note:
A private note (up to 500 characters) can be attached to this address.
Please DO NOT store any passwords or private keys here.Compiler specific version warnings:
The compiled contract might be susceptible to FullInlinerNonExpressionSplitArgumentEvaluationOrder (low-severity), MissingSideEffectsOnSelectorAccess (low-severity), AbiReencodingHeadOverflowWithStaticArrayCleanup (medium-severity), DirtyBytesArrayToStorage (low-severity), DataLocationChangeInInternalOverride (very low-severity), NestedCalldataArrayAbiReencodingSizeValidation (very low-severity), SignedImmutables (very low-severity), ABIDecodeTwoDimensionalArrayMemory (very low-severity), EmptyByteArrayCopy (medium-severity), DynamicArrayCleanup (medium-severity) Solidity Compiler Bugs.
Connect a Wallet
Connecting wallet for read function is optional, useful if you want to call certain functions or simply use your wallet's node.Connect a Wallet
Connecting wallet for read function is optional, useful if you want to call certain functions or simply use your wallet's node.Connect a Wallet
Connecting wallet for read function is optional, useful if you want to call certain functions or simply use your wallet's node.SignIn
Address Cards
To use this feature, please login to your Etherscan account and return to this page.Before You Copy
Transaction Private Note
This website uses cookies to improve your experience. By continuing to use this website, you agree to its Terms and Privacy Policy.