Token
Overview CRC1155
Total Supply:
0 N/A
Holders:
501 addresses
Contract:
Balance
0 N/A
[ Download CSV Export ]
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
ChowTime
Compiler Version
v0.8.10+commit.fc410830
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; import "@openzeppelin/contracts/access//Ownable.sol"; import "@openzeppelin/contracts/utils/Counters.sol"; //import "@openzeppelin/contracts/token/ERC1155/Utils/ERC1155Holder.sol"; contract ChowTime is ERC1155, Ownable { uint256 public constant PLATE = 0; uint256 public constant GOLDEN_PLATE = 1; uint256 public constant STEAK = 2; uint256 public constant CHICKEN = 3; uint256 public constant FISH = 4; uint256 public constant TOFU = 5; uint256 public constant YAM = 6; uint256 public constant BAKED_POTATO = 7; uint256 public constant ASPARAGUS = 8; uint256 public constant BEANS = 9; uint256 public constant PEAS = 10; uint256 public constant BROCCOLI = 11; uint256 public constant CARROT = 12; uint256 public constant LEMONADE = 13; uint256 public constant WATER = 14; uint256 public constant BEER = 15; uint256 public constant WINE = 16; uint256 public constant MARTINI = 17; uint256 public constant JELLO = 18; uint256 public constant APPLE_PIE = 19; uint256 public constant ICE_CREAM = 20; uint256 maxSupply = 100000; uint256 public mintPrice = 1000000000000000000 * 10; bool public _mintingEnabled = false; bool public _boomerEnabled = false; bool public _turnInsEnabled = false; event Debug(string msg, uint256 val); uint256[21] foods; mapping(uint256 => uint256) public tokenMaxSupply; // current supply by food type mapping(uint256 => uint256) public currentSupplyByType; // current amount turned in by food type mapping(uint256 => uint256) public currentTurnedInByType; // current values by food type mapping(uint256 => uint256) public currentValuesByType; mapping(uint256 => uint256[10]) public valuesByBucket; // New Maps mapping(address => uint256) claimsAllowed; // current saleIDX of users mapping(address => uint256[]) sellerSaleIDXs; constructor( string memory uri ) ERC1155(uri) { foods = [ PLATE, GOLDEN_PLATE, STEAK, CHICKEN, FISH, TOFU, YAM, BAKED_POTATO, ASPARAGUS, BEANS, PEAS, BROCCOLI, CARROT, LEMONADE, WATER, BEER, WINE, MARTINI, JELLO, APPLE_PIE, ICE_CREAM ]; tokenMaxSupply[PLATE] = 19500; tokenMaxSupply[GOLDEN_PLATE] = 500; tokenMaxSupply[STEAK] = 2500; tokenMaxSupply[CHICKEN] = 5000; tokenMaxSupply[FISH] = 5000; tokenMaxSupply[TOFU] = 7500; tokenMaxSupply[YAM] = 3000; tokenMaxSupply[BAKED_POTATO] = 2000; tokenMaxSupply[ASPARAGUS] = 4000; tokenMaxSupply[BEANS] = 5000; tokenMaxSupply[PEAS] = 3000; tokenMaxSupply[BROCCOLI] = 1000; tokenMaxSupply[CARROT] = 2000; tokenMaxSupply[LEMONADE] = 7000; tokenMaxSupply[WATER] = 6000; tokenMaxSupply[BEER] = 4000; tokenMaxSupply[WINE] = 2000; tokenMaxSupply[MARTINI] = 1000; tokenMaxSupply[JELLO] = 10000; tokenMaxSupply[APPLE_PIE] = 6000; tokenMaxSupply[ICE_CREAM] = 4000; valuesByBucket[PLATE] = [3,3,3,3,3,3,3,3,3,3]; valuesByBucket[GOLDEN_PLATE] = [60,70,90,70,95,90,75,100,105,75]; valuesByBucket[STEAK] = [20,22,27,31,34,38,43,52,57,60]; valuesByBucket[CHICKEN] = [10,13,16,22,20,15,12,13,14,12]; valuesByBucket[FISH] = [14,11,9,12,15,16,14,17,15,10]; valuesByBucket[TOFU] = [4,3,5,7,4,11,4,3,5,6]; valuesByBucket[YAM] = [3,5,2,6,8,3,4,6,3,3]; valuesByBucket[BAKED_POTATO] = [19,20,22,18,4,3,17,14,13,24]; valuesByBucket[ASPARAGUS] = [8,10,6,5,2,3,3,3,11,10]; valuesByBucket[BEANS] = [8,7,7,8,6,3,2,9,11,7]; valuesByBucket[PEAS] = [4,6,3,7,4,3,2,6,5,8]; valuesByBucket[BROCCOLI] = [4,16,2,14,2,11,3,13,8,10]; valuesByBucket[CARROT] = [18,14,16,15,6,4,4,11,18,20]; valuesByBucket[LEMONADE] = [8,7,6,8,9,8,10,11,7,3]; valuesByBucket[WATER] = [2,3,4,3,4,2,3,3,5,3]; valuesByBucket[BEER] = [18,16,14,12,10,13,15,8,9,4]; valuesByBucket[WINE] = [14,18,20,22,24,26,28,30,32,25]; valuesByBucket[MARTINI] = [35,40,35,30,35,30,25,20,30,35]; valuesByBucket[JELLO] = [18,16,14,12,10,9,7,6,7,6]; valuesByBucket[APPLE_PIE] = [12,9,11,9,13,26,44,26,7,9]; valuesByBucket[ICE_CREAM] = [3,5,7,7,10,11,11,12,11,99]; currentValuesByType[PLATE] = valuesByBucket[PLATE][0]; currentValuesByType[GOLDEN_PLATE] = valuesByBucket[GOLDEN_PLATE][0]; currentValuesByType[STEAK] = valuesByBucket[STEAK][0]; currentValuesByType[CHICKEN] = valuesByBucket[CHICKEN][0]; currentValuesByType[FISH] = valuesByBucket[FISH][0]; currentValuesByType[TOFU] = valuesByBucket[TOFU][0]; currentValuesByType[YAM] = valuesByBucket[YAM][0]; currentValuesByType[BAKED_POTATO] = valuesByBucket[BAKED_POTATO][0]; currentValuesByType[ASPARAGUS] = valuesByBucket[ASPARAGUS][0]; currentValuesByType[BEANS] = valuesByBucket[BEANS][0]; currentValuesByType[PEAS] = valuesByBucket[PEAS][0]; currentValuesByType[BROCCOLI] = valuesByBucket[BROCCOLI][0]; currentValuesByType[CARROT] = valuesByBucket[CARROT][0]; currentValuesByType[LEMONADE] = valuesByBucket[LEMONADE][0]; currentValuesByType[WATER] = valuesByBucket[WATER][0]; currentValuesByType[BEER] = valuesByBucket[BEER][0]; currentValuesByType[WINE] = valuesByBucket[WINE][0]; currentValuesByType[MARTINI] = valuesByBucket[MARTINI][0]; currentValuesByType[JELLO] = valuesByBucket[JELLO][0]; currentValuesByType[APPLE_PIE] = valuesByBucket[APPLE_PIE][0]; currentValuesByType[ICE_CREAM] = valuesByBucket[ICE_CREAM][0]; } function mint(uint256 amount) public payable { require(_mintingEnabled, "minting not yet enabled"); require( msg.value == (uint256(mintPrice * amount)), "invalid amount" ); require(amount < 26, "must mint 25 at a time"); for (uint256 i = 0; i < amount; i++) { uint256 foodType = pickRandomFood(); // emit Debug("found food type", foodType); _mint(msg.sender, foodType, 1, ""); // emit Debug("minted", foodType); currentSupplyByType[foodType]++; maxSupply--; } } // increments turn in counter and recalculates current value function processFoodTurnIn(uint256 foodType) internal { currentTurnedInByType[foodType]++; uint256 percent = (currentTurnedInByType[foodType] * 100) / tokenMaxSupply[foodType]; uint256 bucket = percent / 10; // TODO validate what kind of int math solidity does if (currentValuesByType[foodType] != valuesByBucket[foodType][bucket]) { currentValuesByType[foodType] = valuesByBucket[foodType][bucket]; } } event mealTurnedIn( uint256[5] indexed turnIn, address indexed from, uint256 owed ); function turnInMeal(uint256[5] memory turnIn) public { require(_turnInsEnabled, "not enabled"); require( validMeal(turnIn), "invld meal" ); uint256 owed = 0; for (uint256 i = 0; i < turnIn.length; i++) { require( balanceOf(msg.sender, turnIn[i]) - checkUserFoodForsale(turnIn[i], msg.sender) > 0, "item listed" ); owed += (currentValuesByType[turnIn[i]] * 1000000000000000000); processFoodTurnIn(turnIn[i]); _burn(msg.sender, turnIn[i], 1); } (bool success, ) = payable(msg.sender).call{value: owed}(""); require(success); emit mealTurnedIn(turnIn, msg.sender, owed); } function validMeal(uint256[5] memory turnIn) internal pure returns (bool) { bool containsPlate = false; bool containsProtein = false; bool containsVeggie = false; bool containsDrink = false; bool containsDessert = false; for (uint256 i = 0; i < turnIn.length; i++) { containsPlate = containsPlate || isPlate(turnIn[i]); containsProtein = containsProtein || isProtein(turnIn[i]); containsVeggie = containsVeggie || isVeggie(turnIn[i]); containsDrink = containsDrink || isDrink(turnIn[i]); containsDessert = containsDessert || isDessert(turnIn[i]); } return containsPlate && containsProtein && containsVeggie && containsDrink && containsDessert; } function isPlate(uint256 food) internal pure returns (bool) { return food == PLATE || food == GOLDEN_PLATE; } function isProtein(uint256 food) internal pure returns (bool) { return food == STEAK || food == CHICKEN || food == FISH || food == TOFU; } function isVeggie(uint256 food) internal pure returns (bool) { return food == YAM || food == BAKED_POTATO || food == ASPARAGUS || food == BEANS || food == PEAS || food == BROCCOLI || food == CARROT; } function isDrink(uint256 food) internal pure returns (bool) { return food == LEMONADE || food == WATER || food == BEER || food == WINE || food == MARTINI; } function isDessert(uint256 food) internal pure returns (bool) { return food == JELLO || food == APPLE_PIE || food == ICE_CREAM; } function pickRandomFood() internal view returns (uint256) { //emit Debug("in pickRandomFood", 1); uint256 rand = _random(); uint256 selection = rand % maxSupply; //emit Debug("selection", selection); uint256 last = 0; for (uint256 i = 0; i < foods.length; i++) { uint256 foodType = foods[i]; uint256 remainingSupply = tokenMaxSupply[foodType] - currentSupplyByType[foodType]; //emit Debug("food type", foodType); // emit Debug("max supply", tokenMaxSupply[foodType]); // emit Debug("current supply", currentSupplyByType[foodType]); // emit Debug("remaining supply", remainingSupply); if (selection >= last && selection < last + remainingSupply) { //emit Debug("found food type", foodType); return foodType; } last = last + remainingSupply; } // should never get out of the loop unless minted out... revert("minted out"); } function _random() internal view returns (uint256) { return uint256( keccak256( abi.encodePacked( block.timestamp + block.difficulty + block.gaslimit + block.number + (( uint256( keccak256(abi.encodePacked(block.coinbase)) ) ) / block.timestamp) + (( uint256( keccak256(abi.encodePacked(_msgSender())) ) ) / block.timestamp) ) ) ); } //Marketplace using Counters for Counters.Counter; // Counters.Counter private _itemsSold; Counters.Counter private _marketIDX; struct ChowSale { uint256 foodType; address seller; uint256 price; uint256 amount; bool isForSale; } mapping(uint256 => ChowSale) public forSale; event marketItemListed( uint256 saleIDX, address indexed seller, uint256 indexed foodType, uint256 price, uint256 amount ); function createMarketItem( uint256 foodType, uint256 price, uint256 amount ) public payable { require(checkUserFoodForsale(foodType, msg.sender) == 0, "1 Sale Per"); require(price > 0, "Price > 0"); require(amount > 0, "Amount > 0"); require(balanceOf(msg.sender, foodType) >= amount, "Amount MM"); forSale[_marketIDX.current()] = ChowSale( foodType, msg.sender, price, amount, true ); sellerSaleIDXs[msg.sender].push(_marketIDX.current()); uint256 saleIDX = _marketIDX.current(); _marketIDX.increment(); emit marketItemListed(saleIDX, msg.sender, foodType, price, amount); } event marketItemBought( uint256 foodType, address indexed seller, address indexed buyer, uint256 price, uint256 amount ); function buyChow( uint256 SaleIDX ) public payable { uint256 price = forSale[SaleIDX].price; address seller = forSale[SaleIDX].seller; uint256 amount = forSale[SaleIDX].amount; uint256 foodType = forSale[SaleIDX].foodType; uint256 royal = price / 20; bool state = forSale[SaleIDX].isForSale; require(seller != msg.sender, 'Cant Buy Own Item'); require(state == true, "Not on Sale"); require((price + royal) == msg.value, "Pay MM"); _safeTransferFrom(seller, msg.sender, foodType, amount, ""); (bool success2, ) = seller.call{value: price}(""); require(success2); forSale[SaleIDX].isForSale = false; updateSellerSaleIDXs(seller); emit marketItemBought(foodType, seller, msg.sender, price, amount); } event marketItemRemoved( uint256 saleIDX, address indexed seller ); function removeFromMarket( uint256 saleIDX ) public { address seller = forSale[saleIDX].seller; require(forSale[saleIDX].isForSale == true); require(seller == msg.sender, "Seller MM"); forSale[saleIDX].isForSale = false; updateSellerSaleIDXs(seller); emit marketItemRemoved(saleIDX, msg.sender); } function listForsale(uint256 cursor, uint256 limit) public view returns ( ChowSale[] memory, uint256 ) { require(cursor <= _marketIDX.current(), "invalid cursor"); ChowSale[] memory allSaleItems = new ChowSale[](limit); uint256 added = 0; uint256 i = cursor; for (; i < _marketIDX.current(); i++) { if (forSale[i].isForSale) { allSaleItems[added]=(forSale[i]); added++; } if (added == limit) { break; } } uint256 newCursor = cursor + i; if (i == _marketIDX.current()) { // we've reached end, so no point in fetching more // on the front end it knows we've reached end if the cursor hasn't moved newCursor = cursor; } return (allSaleItems, newCursor); } function updateSellerSaleIDXs(address seller) public { // can only have 1 of every food type, so an array of size 21 should be plenty. uint256[] memory newSaleIDXs = new uint256[](21); uint256 added = 0; for(uint256 i = 0; i < sellerSaleIDXs[seller].length; i++) { if (forSale[sellerSaleIDXs[seller][i]].isForSale) { newSaleIDXs[added] = sellerSaleIDXs[seller][i]; added++; } } sellerSaleIDXs[seller] = newSaleIDXs; } function checkUserFoodForsale(uint256 foodType, address user) public view returns (uint256 rv) { rv = 0; for (uint256 i = 0; i < sellerSaleIDXs[user].length; i++) { if ( (forSale[sellerSaleIDXs[user][i]].isForSale) && (forSale[sellerSaleIDXs[user][i]].seller == user) && (forSale[sellerSaleIDXs[user][i]].foodType == foodType) ) { rv = rv + forSale[sellerSaleIDXs[user][i]].amount; } } return (rv); } function boomerOwnerMint(uint256 amount) public { require(_boomerEnabled, "boomer minting not yet enabled"); require(amount < 26, "must mint 25 at a time"); require(amount <= claimsAllowed[msg.sender], "Too Many"); for (uint256 i = 0; i < amount; i++) { uint256 foodType = pickRandomFood(); _mint(msg.sender, foodType, 1, ""); currentSupplyByType[foodType]++; maxSupply--; claimsAllowed[msg.sender]--; } } function setMintEnabled(bool mintEnabled) public onlyOwner { _mintingEnabled = mintEnabled; } function setTurnInsEnabled(bool turnInsEnabled) public onlyOwner { _turnInsEnabled = turnInsEnabled; } function setBoomerEnabled(bool boomerState) public onlyOwner { _boomerEnabled = boomerState; } function deposit() public payable { require(msg.value > 0, "More than Zero"); } function withdraw() public payable onlyOwner { (bool success, ) = payable(msg.sender).call{ value: address(this).balance }(""); require(success); } function boomerAdd(address[] memory addresses, uint256[] memory amount) public onlyOwner { require(addresses.length == amount.length, "Array items must match"); for (uint256 i = 0; i < addresses.length; i++) { require(addresses[i] != address(0), "Null Adrs"); claimsAllowed[addresses[i]] = amount[i]; } } function boomerAmt (address addr) public view returns (uint256) { return claimsAllowed[addr]; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol) pragma solidity ^0.8.0; import "../IERC1155.sol"; /** * @dev Interface of the optional ERC1155MetadataExtension interface, as defined * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP]. * * _Available since v3.1._ */ interface IERC1155MetadataURI is IERC1155 { /** * @dev Returns the URI for token type `id`. * * If the `\{id\}` substring is present in the URI, it must be replaced by * clients with the actual token type ID. */ function uri(uint256 id) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** * @dev Handles the receipt of a single ERC1155 token type. This function is * called at the end of a `safeTransferFrom` after the balance has been updated. * * NOTE: To accept the transfer, this must return * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * (i.e. 0xf23a6e61, or its own function selector). * * @param operator The address which initiated the transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param id The ID of the token being transferred * @param value The amount of tokens being transferred * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** * @dev Handles the receipt of a multiple ERC1155 token types. This function * is called at the end of a `safeBatchTransferFrom` after the balances have * been updated. * * NOTE: To accept the transfer(s), this must return * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * (i.e. 0xbc197c81, or its own function selector). * * @param operator The address which initiated the batch transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param ids An array containing ids of each token being transferred (order and length must match values array) * @param values An array containing amounts of each token being transferred (order and length must match ids array) * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @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; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC1155/ERC1155.sol) pragma solidity ^0.8.0; import "./IERC1155.sol"; import "./IERC1155Receiver.sol"; import "./extensions/IERC1155MetadataURI.sol"; import "../../utils/Address.sol"; import "../../utils/Context.sol"; import "../../utils/introspection/ERC165.sol"; /** * @dev Implementation of the basic standard multi-token. * See https://eips.ethereum.org/EIPS/eip-1155 * Originally based on code by Enjin: https://github.com/enjin/erc-1155 * * _Available since v3.1._ */ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { using Address for address; // Mapping from token ID to account balances mapping(uint256 => mapping(address => uint256)) private _balances; // Mapping from account to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json string private _uri; /** * @dev See {_setURI}. */ constructor(string memory uri_) { _setURI(uri_); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC1155).interfaceId || interfaceId == type(IERC1155MetadataURI).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the same URI for *all* token types. It relies * on the token type ID substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * Clients calling this function must replace the `\{id\}` substring with the * actual token type ID. */ function uri(uint256) public view virtual override returns (string memory) { return _uri; } /** * @dev See {IERC1155-balanceOf}. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) public view virtual override returns (uint256) { require(account != address(0), "ERC1155: balance query for the zero address"); return _balances[id][account]; } /** * @dev See {IERC1155-balanceOfBatch}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] memory accounts, uint256[] memory ids) public view virtual override returns (uint256[] memory) { require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch"); uint256[] memory batchBalances = new uint256[](accounts.length); for (uint256 i = 0; i < accounts.length; ++i) { batchBalances[i] = balanceOf(accounts[i], ids[i]); } return batchBalances; } /** * @dev See {IERC1155-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC1155-isApprovedForAll}. */ function isApprovedForAll(address account, address operator) public view virtual override returns (bool) { return _operatorApprovals[account][operator]; } /** * @dev See {IERC1155-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not owner nor approved" ); _safeTransferFrom(from, to, id, amount, data); } /** * @dev See {IERC1155-safeBatchTransferFrom}. */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: transfer caller is not owner nor approved" ); _safeBatchTransferFrom(from, to, ids, amounts, data); } /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - `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 memory data ) internal virtual { require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - 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[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, ids, amounts, data); for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; } emit TransferBatch(operator, from, to, ids, amounts); _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data); } /** * @dev Sets a new URI for all token types, by relying on the token type ID * substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * By this mechanism, any occurrence of the `\{id\}` substring in either the * URI or any of the amounts in the JSON file at said URI will be replaced by * clients with the token type ID. * * For example, the `https://token-cdn-domain/\{id\}.json` URI would be * interpreted by clients as * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json` * for token type ID 0x4cce0. * * See {uri}. * * Because these URIs cannot be meaningfully represented by the {URI} event, * this function emits no events. */ function _setURI(string memory newuri) internal virtual { _uri = newuri; } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _mint( address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, _asSingletonArray(id), _asSingletonArray(amount), data); _balances[id][to] += amount; emit TransferSingle(operator, address(0), to, id, amount); _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * 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 _mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); for (uint256 i = 0; i < ids.length; i++) { _balances[ids[i]][to] += amounts[i]; } emit TransferBatch(operator, address(0), to, ids, amounts); _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data); } /** * @dev Destroys `amount` tokens of token type `id` from `from` * * Requirements: * * - `from` cannot be the zero address. * - `from` must have at least `amount` tokens of token type `id`. */ function _burn( address from, uint256 id, uint256 amount ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, address(0), _asSingletonArray(id), _asSingletonArray(amount), ""); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } emit TransferSingle(operator, from, address(0), id, amount); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * Requirements: * * - `ids` and `amounts` must have the same length. */ function _burnBatch( address from, uint256[] memory ids, uint256[] memory amounts ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); for (uint256 i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } } emit TransferBatch(operator, from, address(0), ids, amounts); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC1155: setting approval status for self"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Hook that is called before any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `id` and `amount` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} function _doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) { if (response != IERC1155Receiver.onERC1155Received.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _doSafeBatchTransferAcceptanceCheck( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns ( bytes4 response ) { if (response != IERC1155Receiver.onERC1155BatchReceived.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) { uint256[] memory array = new uint256[](1); array[0] = element; return array; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
{ "remappings": [], "optimizer": { "enabled": true, "runs": 200 }, "evmVersion": "london", "libraries": {}, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"msg","type":"string"},{"indexed":false,"internalType":"uint256","name":"val","type":"uint256"}],"name":"Debug","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"foodType","type":"uint256"},{"indexed":true,"internalType":"address","name":"seller","type":"address"},{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"marketItemBought","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"saleIDX","type":"uint256"},{"indexed":true,"internalType":"address","name":"seller","type":"address"},{"indexed":true,"internalType":"uint256","name":"foodType","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"marketItemListed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"saleIDX","type":"uint256"},{"indexed":true,"internalType":"address","name":"seller","type":"address"}],"name":"marketItemRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256[5]","name":"turnIn","type":"uint256[5]"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"owed","type":"uint256"}],"name":"mealTurnedIn","type":"event"},{"inputs":[],"name":"APPLE_PIE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ASPARAGUS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BAKED_POTATO","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BEANS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BEER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BROCCOLI","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CARROT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CHICKEN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FISH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GOLDEN_PLATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ICE_CREAM","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"JELLO","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LEMONADE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MARTINI","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PEAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PLATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STEAK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOFU","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WATER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WINE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"YAM","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_boomerEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_mintingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_turnInsEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"amount","type":"uint256[]"}],"name":"boomerAdd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"boomerAmt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"boomerOwnerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIDX","type":"uint256"}],"name":"buyChow","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"foodType","type":"uint256"},{"internalType":"address","name":"user","type":"address"}],"name":"checkUserFoodForsale","outputs":[{"internalType":"uint256","name":"rv","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"foodType","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"createMarketItem","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"currentSupplyByType","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"currentTurnedInByType","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"currentValuesByType","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"forSale","outputs":[{"internalType":"uint256","name":"foodType","type":"uint256"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"isForSale","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"cursor","type":"uint256"},{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"listForsale","outputs":[{"components":[{"internalType":"uint256","name":"foodType","type":"uint256"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"isForSale","type":"bool"}],"internalType":"struct ChowTime.ChowSale[]","name":"","type":"tuple[]"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"saleIDX","type":"uint256"}],"name":"removeFromMarket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"boomerState","type":"bool"}],"name":"setBoomerEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"mintEnabled","type":"bool"}],"name":"setMintEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"turnInsEnabled","type":"bool"}],"name":"setTurnInsEnabled","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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[5]","name":"turnIn","type":"uint256[5]"}],"name":"turnInMeal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"seller","type":"address"}],"name":"updateSellerSaleIDXs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"valuesByBucket","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
6080604052620186a0600455678ac7230489e800006005556006805462ffffff191690553480156200003057600080fd5b50604051620051f5380380620051f5833981016040819052620000539162001458565b806200005f81620012cb565b506200006b33620012e4565b604051806102a0016040528060008152602001600181526020016002815260200160038152602001600481526020016005815260200160068152602001600781526020016008815260200160098152602001600a8152602001600b8152602001600c8152602001600d8152602001600e8152602001600f815260200160108152602001601181526020016012815260200160138152602001601481525060079060156200011a92919062001336565b50614c2c7fb9c6de81004e18dedadca3e5eabaab449ca91dff6f58efc9461da635fe77f849556101f47f6de76108811faf2f94afbe5ac6c98e8393206cd093932de1fbfd61bbeec43a02556109c47ff5b6e61a0c14f171ef1c86f003900ef0305e4159fff3317e4fb7c351f2050c87556113887fb0deb225ecd3a242ef7d55f0f81ae3b924e0b6f9da8bc33b306fb32ca5f287f78190557fadacb2ae086d090ae1cbb87d66774fa6d708dd14d5bdc5b6c1e455aa2020dfb7819055611d4c7f0de3fcd0b495fcf96d4f4ab29f8e12012b60a56d458f4c95fdde42b927ce97a055610bb87fb2d730c3da277545f6c9f2c922ea3d0e9fcbd74e29d321b995a837ef61c283f08190556107d07ff83d70dc1f3bc56ae93d2f099ba46d689c41cc22a3494b582010b224cccab8fb819055610fa07ff9305512730c46154741e3ea28f09acb2323e8072d6a6e52c9ab9232e8f79b538190557f82381b488566200bc8ac07e6c827657cb515bed8173d1cbff7359566c5cb20ae939093557fe1bdc6374d0c60f1ea6340bad1b1efb6e5d43dacd7cf8a832c0e80db9e8cfbdd919091556103e87f13fbb933e9e42d70876f2fdd5703151ff3434535d4e79b2ad6e7977a4d9cdd638190557f436d7f9b80485b16af8b06aa4799642bc7c4a8e9b907e663b63d2651d7071acc829055611b587f87c738f80cbcf2f71f2ea18e20218ca256405c1ee252053fa76577061e59e5e1556117707fbf77bd9488c9a5b4115cdcee4ceb140db5bb05bb432ee5d7d8270934afd827d38190557fddf376d6c759c5a6f2110d6401a36fa5f50d373616e637327a6ac309df91ee928490557f4a2542c2307e04e5fdb34335aa42ffce16993a1c067c8b7c35cd9f7feb76adba929092557f0404d4e8b53a7ee1017ab0f22bf1d2a17665f3fd23fd8548621aa9fd1e1a99f6556127107f77b1995d3d8bbcddda5dd519e2715200ecda7be76dd3d2c74a5080cd645be52a557f67e6e742c86fb753810b142f6913ec7c854ad7672b1bd2ca0f94496bb3d7ecf2557f950b5f10cae52b096677df751af6f2067c3289a40edcff5d6f1153d5b53aaecc55604080516101408101825260038082526020828101829052928201819052606082018190526080820181905260a0820181905260c0820181905260e0820181905261010082018190526101208201526000805290805262000498906000805160206200503583398151915290600a62001379565b506040805161014081018252603c815260466020808301829052605a9383018490526060830191909152605f608083015260a0820192909252604b60c08201819052606460e08301526069610100830152610120820152600160005290805262000515906000805160206200515583398151915290600a62001379565b506040805161014081018252601481526016602080830191909152601b92820192909252601f606082015260226080820152602660a0820152602b60c0820152603460e08201526039610100820152603c610120820152600260005290805262000592906000805160206200509583398151915290600a62001379565b506040805161014081018252600a808252600d60208084018290526010948401949094526016606084015260146080840152600f60a0840152600c60c0840181905260e0840191909152600e61010084015261012083015260036000529180526200060f9160008051602062004f95833981519152919062001379565b506040805161014081018252600e808252600b602080840191909152600993830193909352600c6060830152600f60808301819052601060a084015260c0830191909152601160e0830152610100820152600a610120820181905260046000529180526200068f9160008051602062005115833981519152919062001379565b50604080516101408101825260048082526003602080840182905260059484018590526007606085015260808401839052600b60a085015260c084019290925260e0830152610100820183905260066101208301526000929092529080526200070b906000805160206200513583398151915290600a62001379565b506040805161014081018252600380825260056020808401919091526002938301939093526006606083018190526008608084015260a08301829052600460c084015260e0830181905261010083018290526101208301919091526000529080526200078a906000805160206200517583398151915290600a62001379565b5060408051610140810182526013815260146020808301919091526016928201929092526012606082015260046080820152600360a0820152601160c0820152600e60e0820152600d610100820152601861012082015260076000529080526200080790600080516020620050b583398151915290600a62001379565b5060408051610140810182526008808252600a60208084018290526006948401949094526005606084015260026080840152600360a0840181905260c0840181905260e0840152600b6101008401526101208301819052600091909152918052620008849160008051602062005075833981519152919062001379565b506040805161014081018252600880825260076020808401829052938301819052606083019190915260066080830152600360a0830152600260c0830152600960e08301819052600b610100840152610120830191909152600052908052620009009060008051602062004ff583398151915290600a62001379565b506040805161014081018252600480825260066020808401829052600394840185905260076060850152608084019290925260a0830193909352600260c083015260e082019290925260056101008201526008610120820152600a60008190529180526200098091600080516020620050f5833981519152919062001379565b5060408051610140810182526004815260106020808301919091526002928201839052600e60608301526080820192909252600b60a08201819052600360c0830152600d60e08301526008610100830152600a610120830181905260009190915291805262000a0191600080516020620050d5833981519152919062001379565b5060408051610140810182526012808252600e602080840191909152601093830193909352600f606083015260066080830152600460a0830181905260c0830152600b60e08301526101008201526014610120820152600c60005290805262000a7d90600080516020620051d583398151915290600a62001379565b506040805161014081018252600880825260076020808401829052600694840194909452606083018290526009608084015260a0830191909152600a60c08301819052600b60e08401526101008301919091526003610120830152600d60005291805262000afd9160008051602062005055833981519152919062001379565b506040805161014081018252600280825260036020808401829052600494840185905260608401829052608084019490945260a083019190915260c0820181905260e082018190526005610100830152610120820152600e60005290805262000b79906000805160206200501583398151915290600a62001379565b506040805161014081018252601281526010602080830191909152600e92820192909252600c6060820152600a60808201819052600d60a0830152600f60c08301819052600860e08401526009610100840152600461012084015260005291805262000bf79160008051602062005195833981519152919062001379565b506040805161014081018252600e815260126020808301919091526014928201929092526016606082015260186080820152601a60a0820152601c60c0820152601e60e082015261010081018290526019610120820152601060005290805262000c749060008051602062004fb583398151915290600a62001379565b50604080516101408101825260238082526028602080840191909152928201819052601e606083018190526080830182905260a08301819052601960c0840152601460e0840152610100830152610120820152601160005290805262000ced9060008051602062004f7583398151915290600a62001379565b50604080516101408101825260128082526010602080840191909152600e93830193909352600c6060830152600a60808301819052600960a0840152600760c08401819052600660e0850181905261010085019190915261012084015260009190915291805262000d7091600080516020620051b5833981519152919062001379565b506040805161014081018252600c815260096020808301829052600b9383019390935260608201819052600d6080830152601a60a08301819052602c60c084015260e08301526007610100830152610120820152601360005290805262000dfb907f4e0012fa0951f6589fa2425030d7f17b5eef54252953481eb2ad8f58761a72f390600a62001379565b50604080516101408101825260038152600560208083019190915260079282018390526060820192909252600a60808201819052600b60a0830181905260c08301819052600c60e08401526101008301526063610120830152601460005291805262000e799160008051602062004fd5833981519152919062001379565b505060008051602062005035833981519152547f8c60882dec3cf54096060609fdd16c336781b436ca34f3f27a220dfcfa1d48555560008051602062005155833981519152547f820fef5837650fa3b8e45045b88059d8deaf0810350ec511c47ef768a28c2c9b5560008051602062005095833981519152547f5af4fb70d755f38349f04272636124ff9474fedf9ea09deea577daa305383b105560008051602062004f95833981519152547f9e71908050462d95d85d10ec71f33c35476f5af9a2363ff3b4f561b1ea6200505560008051602062005115833981519152547f44ef42eef5af19d25d4e44ae57c825e0d0624b9f37f2474ab961410a0aa295ff5560008051602062005135833981519152547f8f7baaeb89fd2366535b48ed7d56321470a1399e8ab1b2456eb79477a77d951b5560008051602062005175833981519152547fb59afb99c4de88e28b26eef6d7a02f582ab97b4ec5fdb5cf1f0116f112f13bde55600080516020620050b5833981519152547f5b3e240a505832e5e6c9a7abee1f9f8788f1ffd3b8bbc82bdedad1079d3734a65560008051602062005075833981519152547f290280e7d5e2935e0b50d8b53915f33263d19e3d9e4512b77c7193cae76e01685560008051602062004ff5833981519152547f797e2d288100431f5f858c729cd7a996a2a7b4c4d5446876aea0e888879efbfd55600080516020620050f5833981519152547f5d3a18624b866036268575c8d4a80a967939d2f98f317e52ad9d83f3fd01cf2055600080516020620050d5833981519152547fc0a7af8d24ca3b2822488d5a95e9c0d4d417000f20b52d9e8088d689094b58b555600080516020620051d5833981519152547f511ac29f92e205e0d16cf1741c68d1f190f7b76570502b940c90a9f73a430abe5560008051602062005055833981519152547f1daa70a5e2042ce6b5e5c2a631438a85c8d5b368fab842c7f159c1ca28891e8b5560008051602062005015833981519152547fa12e09df5c966bbe741292318caf6ba9a0ea92bd818fc17dc5b209561fcab2445560008051602062005195833981519152547f1f0b3139ea9bd9b6849ca44242d280edc187cc644bff27185e2ebf579b5fb1b65560008051602062004fb5833981519152547fabbe889fb56d47a303749582195f0e5563cf143c45b463593db7a7a32c89da635560008051602062004f75833981519152547fd9bd2b0ffe451d811807bc41cc61e42c60f5fed09725f41ad5d13c018f2aed7c55600080516020620051b5833981519152547f7bd5afea3f03bfa772a537ce124088119fa96205d291db17f5a8484973de9302557f4e0012fa0951f6589fa2425030d7f17b5eef54252953481eb2ad8f58761a72f3547f1fd5eaa72de83680fe3a2f2fdb6ab3d6d4ae9972bd821c832a15a14d64c2c1fd55601460005260008051602062004fd583398151915254601f6020527ffc6be4493634a434b784d30cdf9e61cde2f738d95923b9885cc23d3a6ab785c45562001571565b8051620012e0906002906020840190620013af565b5050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b826015810192821562001367579160200282015b82811115620013675782518255916020019190600101906200134a565b50620013759291506200142b565b5090565b82600a810192821562001367579160200282015b8281111562001367578251829060ff169055916020019190600101906200138d565b828054620013bd9062001534565b90600052602060002090601f016020900481019282620013e1576000855562001367565b82601f10620013fc57805160ff191683800117855562001367565b82800160010185558215620013675791820182811115620013675782518255916020019190600101906200134a565b5b808211156200137557600081556001016200142c565b634e487b7160e01b600052604160045260246000fd5b600060208083850312156200146c57600080fd5b82516001600160401b03808211156200148457600080fd5b818501915085601f8301126200149957600080fd5b815181811115620014ae57620014ae62001442565b604051601f8201601f19908116603f01168101908382118183101715620014d957620014d962001442565b816040528281528886848701011115620014f257600080fd5b600093505b82841015620015165784840186015181850187015292850192620014f7565b82841115620015285760008684830101525b98975050505050505050565b600181811c908216806200154957607f821691505b602082108114156200156b57634e487b7160e01b600052602260045260246000fd5b50919050565b6139f480620015816000396000f3fe60806040526004361061037f5760003560e01c80637b98d213116101d1578063c19ed75c11610102578063dbc49380116100a0578063f2fde38b1161006f578063f2fde38b14610a31578063f46a04eb14610a51578063f9f152f314610a71578063ffcff32c14610a8657600080fd5b8063dbc4938014610986578063dd3331411461099b578063e985e9c5146109c8578063f242432a14610a1157600080fd5b8063c75e7aa7116100dc578063c75e7aa714610934578063ccc3aeec14610949578063d0303c9d1461095e578063d0e30db01461097e57600080fd5b8063c19ed75c146108ea578063c3ba048c1461090a578063c7203ee11461091f57600080fd5b80639bcbf1491161016f578063b6f6a92011610149578063b6f6a9201461085f578063b8c85ae114610874578063b9f6a2fb14610894578063bb6ac8a1146108b457600080fd5b80639bcbf14914610817578063a0712d681461082c578063a22cb4651461083f57600080fd5b80638a0a9ee5116101ab5780638a0a9ee51461077f5780638da5cb5b146107ac57806391a1cebd146107d4578063979c5b201461080257600080fd5b80637b98d21314610730578063819c5f741461075057806381b2069b1461076557600080fd5b80632eb2c2d6116102b65780635691dfe011610254578063649edccb11610223578063649edccb146106d25780636817c76c146106e55780636bab9e4e146106fb578063715018a61461071b57600080fd5b80635691dfe0146106685780635e04f08d1461067d57806361b4c2c3146106925780636457bd04146106b257600080fd5b8063320343da11610290578063320343da1461060b5780633ccfd60b1461061e5780634df3082a146106265780634e1273f41461063b57600080fd5b80632eb2c2d6146105a957806330327708146105c957806330746564146105f657600080fd5b80630f16a5891161032357806319bacab3116102fd57806319bacab3146104d75780631f653da1146104ec5780632831f2f41461050b5780632c55a5431461059457600080fd5b80630f16a5891461048d5780630fe99b73146104ad578063117a01ef146104c257600080fd5b8063032f04741161035f578063032f0474146104145780630b239436146104365780630c96fdea1461044b5780630e89341c1461046057600080fd5b80624221f014610384578062fdd58e146103c457806301ffc9a7146103e4575b600080fd5b34801561039057600080fd5b506103b161039f366004612f51565b601c6020526000908152604090205481565b6040519081526020015b60405180910390f35b3480156103d057600080fd5b506103b16103df366004612f86565b610a9b565b3480156103f057600080fd5b506104046103ff366004612fc6565b610b32565b60405190151581526020016103bb565b34801561042057600080fd5b5061043461042f36600461302d565b610b84565b005b34801561044257600080fd5b506103b1601481565b34801561045757600080fd5b506103b1600781565b34801561046c57600080fd5b5061048061047b366004612f51565b610de2565b6040516103bb91906130f8565b34801561049957600080fd5b506103b16104a836600461310b565b610e76565b3480156104b957600080fd5b506103b1600181565b3480156104ce57600080fd5b506103b1601081565b3480156104e357600080fd5b506103b1600b81565b3480156104f857600080fd5b5060065461040490610100900460ff1681565b34801561051757600080fd5b50610562610526366004612f51565b6024602052600090815260409020805460018201546002830154600384015460049094015492936001600160a01b039092169290919060ff1685565b604080519586526001600160a01b0390941660208601529284019190915260608301521515608082015260a0016103bb565b3480156105a057600080fd5b506103b1600881565b3480156105b557600080fd5b506104346105c4366004613236565b610e9a565b3480156105d557600080fd5b506103b16105e4366004612f51565b601d6020526000908152604090205481565b34801561060257600080fd5b506103b1600381565b6104346106193660046132e0565b610f31565b610434611151565b34801561063257600080fd5b506103b1600f81565b34801561064757600080fd5b5061065b61065636600461330c565b6111d3565b6040516103bb9190613412565b34801561067457600080fd5b506103b1600e81565b34801561068957600080fd5b506103b1600a81565b34801561069e57600080fd5b506104346106ad366004612f51565b6112fd565b3480156106be57600080fd5b506104346106cd366004612f51565b611486565b6104346106e0366004612f51565b61155a565b3480156106f157600080fd5b506103b160055481565b34801561070757600080fd5b50610434610716366004613435565b611770565b34801561072757600080fd5b506104346117b4565b34801561073c57600080fd5b5061043461074b366004613435565b6117ea565b34801561075c57600080fd5b506103b1600281565b34801561077157600080fd5b506006546104049060ff1681565b34801561078b57600080fd5b506103b161079a366004612f51565b601e6020526000908152604090205481565b3480156107b857600080fd5b506003546040516001600160a01b0390911681526020016103bb565b3480156107e057600080fd5b506107f46107ef36600461310b565b611830565b6040516103bb929190613450565b34801561080e57600080fd5b506103b1600681565b34801561082357600080fd5b506103b1600d81565b61043461083a366004612f51565b611a06565b34801561084b57600080fd5b5061043461085a3660046134d0565b611b69565b34801561086b57600080fd5b506103b1600981565b34801561088057600080fd5b5061043461088f366004613503565b611b74565b3480156108a057600080fd5b506006546104049062010000900460ff1681565b3480156108c057600080fd5b506103b16108cf366004613503565b6001600160a01b031660009081526021602052604090205490565b3480156108f657600080fd5b5061043461090536600461330c565b611cb5565b34801561091657600080fd5b506103b1601181565b34801561092b57600080fd5b506103b1600581565b34801561094057600080fd5b506103b1601381565b34801561095557600080fd5b506103b1600c81565b34801561096a57600080fd5b506103b161097936600461351e565b611e11565b610434611fb5565b34801561099257600080fd5b506103b1601281565b3480156109a757600080fd5b506103b16109b6366004612f51565b601f6020526000908152604090205481565b3480156109d457600080fd5b506104046109e3366004613541565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b348015610a1d57600080fd5b50610434610a2c36600461356b565b611ff6565b348015610a3d57600080fd5b50610434610a4c366004613503565b61207d565b348015610a5d57600080fd5b50610434610a6c366004613435565b612115565b348015610a7d57600080fd5b506103b1600081565b348015610a9257600080fd5b506103b1600481565b60006001600160a01b038316610b0c5760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b1480610b6357506001600160e01b031982166303a24d0760e21b145b80610b7e57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60065462010000900460ff16610bca5760405162461bcd60e51b815260206004820152600b60248201526a1b9bdd08195b98589b195960aa1b6044820152606401610b03565b610bd381612152565b610c0c5760405162461bcd60e51b815260206004820152600a6024820152691a5b9d9b19081b59585b60b21b6044820152606401610b03565b6000805b6005811015610d3c576000610c3b848360058110610c3057610c306135d0565b602002015133611e11565b610c5b33868560058110610c5157610c516135d0565b6020020151610a9b565b610c6591906135fc565b11610ca05760405162461bcd60e51b815260206004820152600b60248201526a1a5d195b481b1a5cdd195960aa1b6044820152606401610b03565b601f6000848360058110610cb657610cb66135d0565b6020020151815260200190815260200160002054670de0b6b3a7640000610cdd9190613613565b610ce79083613632565b9150610d08838260058110610cfe57610cfe6135d0565b602002015161226f565b610d2a33848360058110610d1e57610d1e6135d0565b60200201516001612337565b80610d348161364a565b915050610c10565b50604051600090339083908381818185875af1925050503d8060008114610d7f576040519150601f19603f3d011682016040523d82523d6000602084013e610d84565b606091505b5050905080610d9257600080fd5b6040513390610da2908590613665565b604051908190038120848252907f616601795f3be42bb11b6c0c59b83beda513cf05d67b5fb7dffe3d54231e9e7a906020015b60405180910390a3505050565b606060028054610df190613699565b80601f0160208091040260200160405190810160405280929190818152602001828054610e1d90613699565b8015610e6a5780601f10610e3f57610100808354040283529160200191610e6a565b820191906000526020600020905b815481529060010190602001808311610e4d57829003601f168201915b50505050509050919050565b6020805281600052604060002081600a8110610e9157600080fd5b01549150829050565b6001600160a01b038516331480610eb65750610eb685336109e3565b610f1d5760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610b03565b610f2a85858585856124b1565b5050505050565b610f3b8333611e11565b15610f755760405162461bcd60e51b815260206004820152600a602482015269189029b0b632902832b960b11b6044820152606401610b03565b60008211610fb15760405162461bcd60e51b815260206004820152600960248201526805072696365203e20360bc1b6044820152606401610b03565b60008111610fee5760405162461bcd60e51b815260206004820152600a6024820152690416d6f756e74203e20360b41b6044820152606401610b03565b80610ff93385610a9b565b10156110335760405162461bcd60e51b8152602060048201526009602482015268416d6f756e74204d4d60b81b6044820152606401610b03565b6040805160a08101825284815233602082015290810183905260608101829052600160808201526024600061106760235490565b81526020808201929092526040908101600090812084518155848401516001820180546001600160a01b0319166001600160a01b03909216919091179055848301516002820155606085015160038201556080909401516004909401805460ff19169415159490941790935533835260229091529020602354815460018101835560009283526020832001556023549050611106602380546001019055565b6040805182815260208101859052908101839052849033907fa4572903413b96c94b277f98d1e6f61aaaca8922b8df4ac99972250cc67903729060600160405180910390a350505050565b6003546001600160a01b0316331461117b5760405162461bcd60e51b8152600401610b03906136d4565b604051600090339047908381818185875af1925050503d80600081146111bd576040519150601f19603f3d011682016040523d82523d6000602084013e6111c2565b606091505b50509050806111d057600080fd5b50565b606081518351146112385760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610b03565b6000835167ffffffffffffffff81111561125457611254612fea565b60405190808252806020026020018201604052801561127d578160200160208202803683370190505b50905060005b84518110156112f5576112c88582815181106112a1576112a16135d0565b60200260200101518583815181106112bb576112bb6135d0565b6020026020010151610a9b565b8282815181106112da576112da6135d0565b60209081029190910101526112ee8161364a565b9050611283565b509392505050565b600654610100900460ff166113545760405162461bcd60e51b815260206004820152601e60248201527f626f6f6d6572206d696e74696e67206e6f742079657420656e61626c656400006044820152606401610b03565b601a811061139d5760405162461bcd60e51b81526020600482015260166024820152756d757374206d696e7420323520617420612074696d6560501b6044820152606401610b03565b336000908152602160205260409020548111156113e75760405162461bcd60e51b8152602060048201526008602482015267546f6f204d616e7960c01b6044820152606401610b03565b60005b818110156114825760006113fc61268e565b905061141a338260016040518060200160405280600081525061277a565b6000818152601d602052604081208054916114348361364a565b90915550506004805490600061144983613709565b909155505033600090815260216020526040812080549161146983613709565b919050555050808061147a9061364a565b9150506113ea565b5050565b60008181526024602052604090206001808201546004909201546001600160a01b039092169160ff161515146114bb57600080fd5b6001600160a01b03811633146114ff5760405162461bcd60e51b815260206004820152600960248201526853656c6c6572204d4d60b81b6044820152606401610b03565b6000828152602460205260409020600401805460ff1916905561152181611b74565b60405182815233907f95dc9eaff78bf5a6f5d87a16719a65a37e7ff0829eb29ff1a6f559544945a31d9060200160405180910390a25050565b6000818152602460205260408120600281015460018201546003830154925491936001600160a01b03909116929190611594601486613736565b60008781526024602052604090206004015490915060ff166001600160a01b0385163314156115f95760405162461bcd60e51b815260206004820152601160248201527043616e7420427579204f776e204974656d60781b6044820152606401610b03565b6001811515146116395760405162461bcd60e51b815260206004820152600b60248201526a4e6f74206f6e2053616c6560a81b6044820152606401610b03565b346116448388613632565b1461167a5760405162461bcd60e51b8152602060048201526006602482015265506179204d4d60d01b6044820152606401610b03565b6116968533858760405180602001604052806000815250612884565b6000856001600160a01b03168760405160006040518083038185875af1925050503d80600081146116e3576040519150601f19603f3d011682016040523d82523d6000602084013e6116e8565b606091505b50509050806116f657600080fd5b6000888152602460205260409020600401805460ff1916905561171886611b74565b604080518581526020810189905290810186905233906001600160a01b038816907f74621dce25b6386582838985f8481246c5094b8168fb672895baef7c02e05c229060600160405180910390a35050505050505050565b6003546001600160a01b0316331461179a5760405162461bcd60e51b8152600401610b03906136d4565b600680549115156101000261ff0019909216919091179055565b6003546001600160a01b031633146117de5760405162461bcd60e51b8152600401610b03906136d4565b6117e860006129a1565b565b6003546001600160a01b031633146118145760405162461bcd60e51b8152600401610b03906136d4565b60068054911515620100000262ff000019909216919091179055565b6060600061183d60235490565b84111561187d5760405162461bcd60e51b815260206004820152600e60248201526d34b73b30b634b21031bab939b7b960911b6044820152606401610b03565b60008367ffffffffffffffff81111561189857611898612fea565b60405190808252806020026020018201604052801561190657816020015b6118f36040518060a001604052806000815260200160006001600160a01b0316815260200160008152602001600081526020016000151581525090565b8152602001906001900390816118b65790505b5090506000855b6023548110156119d75760008181526024602052604090206004015460ff16156119b857600081815260246020908152604091829020825160a0810184528154815260018201546001600160a01b0316928101929092526002810154928201929092526003820154606082015260049091015460ff1615156080820152835184908490811061199e5761199e6135d0565b602002602001018190525081806119b49061364a565b9250505b858214156119c5576119d7565b806119cf8161364a565b91505061190d565b60006119e38289613632565b90506119ee60235490565b8214156119f85750865b929792965091945050505050565b60065460ff16611a585760405162461bcd60e51b815260206004820152601760248201527f6d696e74696e67206e6f742079657420656e61626c65640000000000000000006044820152606401610b03565b80600554611a669190613613565b3414611aa55760405162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a5908185b5bdd5b9d60921b6044820152606401610b03565b601a8110611aee5760405162461bcd60e51b81526020600482015260166024820152756d757374206d696e7420323520617420612074696d6560501b6044820152606401610b03565b60005b81811015611482576000611b0361268e565b9050611b21338260016040518060200160405280600081525061277a565b6000818152601d60205260408120805491611b3b8361364a565b909155505060048054906000611b5083613709565b9190505550508080611b619061364a565b915050611af1565b6114823383836129f3565b6040805160158082526102c08201909252600091602082016102a0803683370190505090506000805b6001600160a01b038416600090815260226020526040902054811015611c85576001600160a01b03841660009081526022602052604081208054602492919084908110611bec57611bec6135d0565b6000918252602080832090910154835282019290925260400190206004015460ff1615611c73576001600160a01b0384166000908152602260205260409020805482908110611c3d57611c3d6135d0565b9060005260206000200154838381518110611c5a57611c5a6135d0565b602090810291909101015281611c6f8161364a565b9250505b80611c7d8161364a565b915050611b9d565b506001600160a01b03831660009081526022602090815260409091208351611caf92850190612ef1565b50505050565b6003546001600160a01b03163314611cdf5760405162461bcd60e51b8152600401610b03906136d4565b8051825114611d295760405162461bcd60e51b8152602060048201526016602482015275082e4e4c2f240d2e8cadae640daeae6e840dac2e8c6d60531b6044820152606401610b03565b60005b8251811015611e0c5760006001600160a01b0316838281518110611d5257611d526135d0565b60200260200101516001600160a01b03161415611d9d5760405162461bcd60e51b81526020600482015260096024820152684e756c6c204164727360b81b6044820152606401610b03565b818181518110611daf57611daf6135d0565b602002602001015160216000858481518110611dcd57611dcd6135d0565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020819055508080611e049061364a565b915050611d2c565b505050565b6000805b6001600160a01b038316600090815260226020526040902054811015611fae576001600160a01b03831660009081526022602052604081208054602492919084908110611e6457611e646135d0565b6000918252602080832090910154835282019290925260400190206004015460ff168015611ee657506001600160a01b03831660008181526022602052604081208054602492919085908110611ebc57611ebc6135d0565b600091825260208083209091015483528201929092526040019020600101546001600160a01b0316145b8015611f3d57506001600160a01b038316600090815260226020526040812080548692602492909185908110611f1e57611f1e6135d0565b9060005260206000200154815260200190815260200160002060000154145b15611f9c576001600160a01b03831660009081526022602052604081208054602492919084908110611f7157611f716135d0565b906000526020600020015481526020019081526020016000206003015482611f999190613632565b91505b80611fa68161364a565b915050611e15565b5092915050565b600034116117e85760405162461bcd60e51b815260206004820152600e60248201526d4d6f7265207468616e205a65726f60901b6044820152606401610b03565b6001600160a01b038516331480612012575061201285336109e3565b6120705760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b6064820152608401610b03565b610f2a8585858585612884565b6003546001600160a01b031633146120a75760405162461bcd60e51b8152600401610b03906136d4565b6001600160a01b03811661210c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b03565b6111d0816129a1565b6003546001600160a01b0316331461213f5760405162461bcd60e51b8152600401610b03906136d4565b6006805460ff1916911515919091179055565b60008080808080805b600581101561223e57858061218a575061218a888260058110612180576121806135d0565b6020020151612acc565b955084806121b257506121b28882600581106121a8576121a86135d0565b6020020151612add565b945083806121da57506121da8882600581106121d0576121d06135d0565b6020020151612b06565b9350828061220257506122028882600581106121f8576121f86135d0565b6020020151612b50565b9250818061222a575061222a888260058110612220576122206135d0565b6020020151612b84565b9150806122368161364a565b91505061215b565b508480156122495750835b80156122525750825b801561225b5750815b80156122645750805b979650505050505050565b6000818152601e602052604081208054916122898361364a565b90915550506000818152601c6020908152604080832054601e9092528220546122b3906064613613565b6122bd9190613736565b905060006122cc600a83613736565b6000848152602080526040902090915081600a81106122ed576122ed6135d0565b01546000848152601f602052604090205414611e0c576000838152602080526040902081600a8110612321576123216135d0565b01546000848152601f6020526040902055505050565b6001600160a01b0383166123995760405162461bcd60e51b815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201526265737360e81b6064820152608401610b03565b336123c9818560006123aa87612ba2565b6123b387612ba2565b5050604080516020810190915260009052505050565b6000838152602081815260408083206001600160a01b0388168452909152902054828110156124465760405162461bcd60e51b8152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604482015263616e636560e01b6064820152608401610b03565b6000848152602081815260408083206001600160a01b03898116808652918452828520888703905582518981529384018890529092908616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b81518351146125135760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b6064820152608401610b03565b6001600160a01b0384166125395760405162461bcd60e51b8152600401610b039061374a565b3360005b845181101561262057600085828151811061255a5761255a6135d0565b602002602001015190506000858381518110612578576125786135d0565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156125c85760405162461bcd60e51b8152600401610b039061378f565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290612605908490613632565b92505081905550505050806126199061364a565b905061253d565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516126709291906137d9565b60405180910390a4612686818787878787612bed565b505050505050565b600080612699612d49565b90506000600454826126ab9190613807565b90506000805b6015811015612744576000600782601581106126cf576126cf6135d0565b01546000818152601d6020908152604080832054601c90925282205492935090916126fa91906135fc565b905083851015801561271457506127118185613632565b85105b15612723575095945050505050565b61272d8185613632565b93505050808061273c9061364a565b9150506126b1565b5060405162461bcd60e51b815260206004820152600a6024820152691b5a5b9d1959081bdd5d60b21b6044820152606401610b03565b6001600160a01b0384166127da5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610b03565b336127f4816000876127eb88612ba2565b610f2a88612ba2565b6000848152602081815260408083206001600160a01b038916845290915281208054859290612824908490613632565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610f2a81600087878787612e36565b6001600160a01b0384166128aa5760405162461bcd60e51b8152600401610b039061374a565b336128ba8187876127eb88612ba2565b6000848152602081815260408083206001600160a01b038a168452909152902054838110156128fb5760405162461bcd60e51b8152600401610b039061378f565b6000858152602081815260408083206001600160a01b038b8116855292528083208785039055908816825281208054869290612938908490613632565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4612998828888888888612e36565b50505050505050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415612a675760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610b03565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319101610dd5565b6000811580610b7e57505060011490565b60006002821480612aee5750600382145b80612af95750600482145b80610b7e57505060051490565b60006006821480612b175750600782145b80612b225750600882145b80612b2d5750600982145b80612b385750600a82145b80612b435750600b82145b80610b7e575050600c1490565b6000600d821480612b615750600e82145b80612b6c5750600f82145b80612b775750601082145b80610b7e57505060111490565b60006012821480612b955750601382145b80610b7e57505060141490565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110612bdc57612bdc6135d0565b602090810291909101015292915050565b6001600160a01b0384163b156126865760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190612c31908990899088908890889060040161381b565b6020604051808303816000875af1925050508015612c6c575060408051601f3d908101601f19168201909252612c6991810190613879565b60015b612d1957612c78613896565b806308c379a01415612cb25750612c8d6138b2565b80612c985750612cb4565b8060405162461bcd60e51b8152600401610b0391906130f8565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610b03565b6001600160e01b0319811663bc197c8160e01b146129985760405162461bcd60e51b8152600401610b039061393c565b6040516bffffffffffffffffffffffff193360601b16602082015260009042906034016040516020818303038152906040528051906020012060001c612d8f9190613736565b6040516bffffffffffffffffffffffff194160601b16602082015242906034016040516020818303038152906040528051906020012060001c612dd29190613736565b4345612dde4442613632565b612de89190613632565b612df29190613632565b612dfc9190613632565b612e069190613632565b604051602001612e1891815260200190565b6040516020818303038152906040528051906020012060001c905090565b6001600160a01b0384163b156126865760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190612e7a9089908990889088908890600401613984565b6020604051808303816000875af1925050508015612eb5575060408051601f3d908101601f19168201909252612eb291810190613879565b60015b612ec157612c78613896565b6001600160e01b0319811663f23a6e6160e01b146129985760405162461bcd60e51b8152600401610b039061393c565b828054828255906000526020600020908101928215612f2c579160200282015b82811115612f2c578251825591602001919060010190612f11565b50612f38929150612f3c565b5090565b5b80821115612f385760008155600101612f3d565b600060208284031215612f6357600080fd5b5035919050565b80356001600160a01b0381168114612f8157600080fd5b919050565b60008060408385031215612f9957600080fd5b612fa283612f6a565b946020939093013593505050565b6001600160e01b0319811681146111d057600080fd5b600060208284031215612fd857600080fd5b8135612fe381612fb0565b9392505050565b634e487b7160e01b600052604160045260246000fd5b601f8201601f1916810167ffffffffffffffff8111828210171561302657613026612fea565b6040525050565b600060a0828403121561303f57600080fd5b82601f83011261304e57600080fd5b60405160a0810181811067ffffffffffffffff8211171561307157613071612fea565b6040528060a084018581111561308657600080fd5b845b818110156130a0578035835260209283019201613088565b509195945050505050565b6000815180845260005b818110156130d1576020818501810151868301820152016130b5565b818111156130e3576000602083870101525b50601f01601f19169290920160200192915050565b602081526000612fe360208301846130ab565b6000806040838503121561311e57600080fd5b50508035926020909101359150565b600067ffffffffffffffff82111561314757613147612fea565b5060051b60200190565b600082601f83011261316257600080fd5b8135602061316f8261312d565b60405161317c8282613000565b83815260059390931b850182019282810191508684111561319c57600080fd5b8286015b848110156131b757803583529183019183016131a0565b509695505050505050565b600082601f8301126131d357600080fd5b813567ffffffffffffffff8111156131ed576131ed612fea565b604051613204601f8301601f191660200182613000565b81815284602083860101111561321957600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a0868803121561324e57600080fd5b61325786612f6a565b945061326560208701612f6a565b9350604086013567ffffffffffffffff8082111561328257600080fd5b61328e89838a01613151565b945060608801359150808211156132a457600080fd5b6132b089838a01613151565b935060808801359150808211156132c657600080fd5b506132d3888289016131c2565b9150509295509295909350565b6000806000606084860312156132f557600080fd5b505081359360208301359350604090920135919050565b6000806040838503121561331f57600080fd5b823567ffffffffffffffff8082111561333757600080fd5b818501915085601f83011261334b57600080fd5b813560206133588261312d565b6040516133658282613000565b83815260059390931b850182019282810191508984111561338557600080fd5b948201945b838610156133aa5761339b86612f6a565b8252948201949082019061338a565b965050860135925050808211156133c057600080fd5b506133cd85828601613151565b9150509250929050565b600081518084526020808501945080840160005b83811015613407578151875295820195908201906001016133eb565b509495945050505050565b602081526000612fe360208301846133d7565b80358015158114612f8157600080fd5b60006020828403121561344757600080fd5b612fe382613425565b6040808252835182820181905260009190606090818501906020808901865b838110156134bc57815180518652838101516001600160a01b0316848701528781015188870152868101518787015260809081015115159086015260a0909401939082019060010161346f565b505095909501959095525092949350505050565b600080604083850312156134e357600080fd5b6134ec83612f6a565b91506134fa60208401613425565b90509250929050565b60006020828403121561351557600080fd5b612fe382612f6a565b6000806040838503121561353157600080fd5b823591506134fa60208401612f6a565b6000806040838503121561355457600080fd5b61355d83612f6a565b91506134fa60208401612f6a565b600080600080600060a0868803121561358357600080fd5b61358c86612f6a565b945061359a60208701612f6a565b93506040860135925060608601359150608086013567ffffffffffffffff8111156135c457600080fd5b6132d3888289016131c2565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008282101561360e5761360e6135e6565b500390565b600081600019048311821515161561362d5761362d6135e6565b500290565b60008219821115613645576136456135e6565b500190565b600060001982141561365e5761365e6135e6565b5060010190565b60008183825b600581101561368a57815183526020928301929091019060010161366b565b50505060a08201905092915050565b600181811c908216806136ad57607f821691505b602082108114156136ce57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600081613718576137186135e6565b506000190190565b634e487b7160e01b600052601260045260246000fd5b60008261374557613745613720565b500490565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6040815260006137ec60408301856133d7565b82810360208401526137fe81856133d7565b95945050505050565b60008261381657613816613720565b500690565b6001600160a01b0386811682528516602082015260a060408201819052600090613847908301866133d7565b828103606084015261385981866133d7565b9050828103608084015261386d81856130ab565b98975050505050505050565b60006020828403121561388b57600080fd5b8151612fe381612fb0565b600060033d11156138af5760046000803e5060005160e01c5b90565b600060443d10156138c05790565b6040516003193d81016004833e81513d67ffffffffffffffff81602484011181841117156138f057505050505090565b82850191508151818111156139085750505050505090565b843d87010160208285010111156139225750505050505090565b61393160208286010187613000565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090612264908301846130ab56fea26469706673582212206b0d24a548f315773de8f72791cfae77b9cc972401177562196c54e0c7854d6e64736f6c634300080a00337920c9d3160db741b0f6d19072d15dc7ceda4a7f0d8a1c2942afadc19e05b9891ae1eab41a4db68d73559dd6c8b7ac16a4bc819634768486d35edbff05543abf4d3b740c43497c2b8a013891c179bec8ff57cc5298acc235c88337170836dfb468a90e0ea8bafdf286d3aad2cf4c289a86bd7890613b612734f6b0c744fc5d015a793908b6b1e129b22d408d0873fee4c5db841fa4390198713664ee60636d3b1667e9fd36254b2d942a8226b8e0c5e11f92c183a421c00d098d69595383c57c29ab76e7ca72530a8284597fb76b039d796325740b21528d71ade454c6f2dbe9e7f56177b5ad88a09094e76870c587190613754ef9a820dc13291851c9b2fd9efabe9d781bd70620c08e691971c5a606188876583449fd126c6df14d174040992c5f9a2e204d4db70ad0f9037679e33061b4c51a386497019bee969e16be28d70c4d67dbb67a7572b58d516df4fd80fb1e4f0d885008ca323361d1acf015c5875e68a5253db0cc263dc35d51c8c56a2d6d16cb4da10cc96c562849a7828c6cdca6eeeefe7460dd90dc1ff3947a92ac0f63a888460e2a5b78eb1765856ed85864af69f7ec271f94daa686978b3a96acf46914b99f1828a3f8265276d5eab630fa9a7f38673f2403ea220372c36a5d3212283a73c030ab2696398da5299fc8f979156774b33c8bc7cb83eda4cbc43b36c7c9490ff8913c488ccd5132cfc71344ea01f2c8cc48b1d1ef44c947093a2a57af948f443fc9749fc356b63244098b9fc668a515fa5d1bce9d670dcb9bfca72dbde3619d2345665d6e6c3f06545e6a2136fce045c431020a9bb703c548701fc932293dd144ab13dc04b7b87c1983abeab2a5846a829278faa2cadb9308d558b7462f6a06783b7b58b7e25408c72c58d55d000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000036f336f0000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x60806040526004361061037f5760003560e01c80637b98d213116101d1578063c19ed75c11610102578063dbc49380116100a0578063f2fde38b1161006f578063f2fde38b14610a31578063f46a04eb14610a51578063f9f152f314610a71578063ffcff32c14610a8657600080fd5b8063dbc4938014610986578063dd3331411461099b578063e985e9c5146109c8578063f242432a14610a1157600080fd5b8063c75e7aa7116100dc578063c75e7aa714610934578063ccc3aeec14610949578063d0303c9d1461095e578063d0e30db01461097e57600080fd5b8063c19ed75c146108ea578063c3ba048c1461090a578063c7203ee11461091f57600080fd5b80639bcbf1491161016f578063b6f6a92011610149578063b6f6a9201461085f578063b8c85ae114610874578063b9f6a2fb14610894578063bb6ac8a1146108b457600080fd5b80639bcbf14914610817578063a0712d681461082c578063a22cb4651461083f57600080fd5b80638a0a9ee5116101ab5780638a0a9ee51461077f5780638da5cb5b146107ac57806391a1cebd146107d4578063979c5b201461080257600080fd5b80637b98d21314610730578063819c5f741461075057806381b2069b1461076557600080fd5b80632eb2c2d6116102b65780635691dfe011610254578063649edccb11610223578063649edccb146106d25780636817c76c146106e55780636bab9e4e146106fb578063715018a61461071b57600080fd5b80635691dfe0146106685780635e04f08d1461067d57806361b4c2c3146106925780636457bd04146106b257600080fd5b8063320343da11610290578063320343da1461060b5780633ccfd60b1461061e5780634df3082a146106265780634e1273f41461063b57600080fd5b80632eb2c2d6146105a957806330327708146105c957806330746564146105f657600080fd5b80630f16a5891161032357806319bacab3116102fd57806319bacab3146104d75780631f653da1146104ec5780632831f2f41461050b5780632c55a5431461059457600080fd5b80630f16a5891461048d5780630fe99b73146104ad578063117a01ef146104c257600080fd5b8063032f04741161035f578063032f0474146104145780630b239436146104365780630c96fdea1461044b5780630e89341c1461046057600080fd5b80624221f014610384578062fdd58e146103c457806301ffc9a7146103e4575b600080fd5b34801561039057600080fd5b506103b161039f366004612f51565b601c6020526000908152604090205481565b6040519081526020015b60405180910390f35b3480156103d057600080fd5b506103b16103df366004612f86565b610a9b565b3480156103f057600080fd5b506104046103ff366004612fc6565b610b32565b60405190151581526020016103bb565b34801561042057600080fd5b5061043461042f36600461302d565b610b84565b005b34801561044257600080fd5b506103b1601481565b34801561045757600080fd5b506103b1600781565b34801561046c57600080fd5b5061048061047b366004612f51565b610de2565b6040516103bb91906130f8565b34801561049957600080fd5b506103b16104a836600461310b565b610e76565b3480156104b957600080fd5b506103b1600181565b3480156104ce57600080fd5b506103b1601081565b3480156104e357600080fd5b506103b1600b81565b3480156104f857600080fd5b5060065461040490610100900460ff1681565b34801561051757600080fd5b50610562610526366004612f51565b6024602052600090815260409020805460018201546002830154600384015460049094015492936001600160a01b039092169290919060ff1685565b604080519586526001600160a01b0390941660208601529284019190915260608301521515608082015260a0016103bb565b3480156105a057600080fd5b506103b1600881565b3480156105b557600080fd5b506104346105c4366004613236565b610e9a565b3480156105d557600080fd5b506103b16105e4366004612f51565b601d6020526000908152604090205481565b34801561060257600080fd5b506103b1600381565b6104346106193660046132e0565b610f31565b610434611151565b34801561063257600080fd5b506103b1600f81565b34801561064757600080fd5b5061065b61065636600461330c565b6111d3565b6040516103bb9190613412565b34801561067457600080fd5b506103b1600e81565b34801561068957600080fd5b506103b1600a81565b34801561069e57600080fd5b506104346106ad366004612f51565b6112fd565b3480156106be57600080fd5b506104346106cd366004612f51565b611486565b6104346106e0366004612f51565b61155a565b3480156106f157600080fd5b506103b160055481565b34801561070757600080fd5b50610434610716366004613435565b611770565b34801561072757600080fd5b506104346117b4565b34801561073c57600080fd5b5061043461074b366004613435565b6117ea565b34801561075c57600080fd5b506103b1600281565b34801561077157600080fd5b506006546104049060ff1681565b34801561078b57600080fd5b506103b161079a366004612f51565b601e6020526000908152604090205481565b3480156107b857600080fd5b506003546040516001600160a01b0390911681526020016103bb565b3480156107e057600080fd5b506107f46107ef36600461310b565b611830565b6040516103bb929190613450565b34801561080e57600080fd5b506103b1600681565b34801561082357600080fd5b506103b1600d81565b61043461083a366004612f51565b611a06565b34801561084b57600080fd5b5061043461085a3660046134d0565b611b69565b34801561086b57600080fd5b506103b1600981565b34801561088057600080fd5b5061043461088f366004613503565b611b74565b3480156108a057600080fd5b506006546104049062010000900460ff1681565b3480156108c057600080fd5b506103b16108cf366004613503565b6001600160a01b031660009081526021602052604090205490565b3480156108f657600080fd5b5061043461090536600461330c565b611cb5565b34801561091657600080fd5b506103b1601181565b34801561092b57600080fd5b506103b1600581565b34801561094057600080fd5b506103b1601381565b34801561095557600080fd5b506103b1600c81565b34801561096a57600080fd5b506103b161097936600461351e565b611e11565b610434611fb5565b34801561099257600080fd5b506103b1601281565b3480156109a757600080fd5b506103b16109b6366004612f51565b601f6020526000908152604090205481565b3480156109d457600080fd5b506104046109e3366004613541565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b348015610a1d57600080fd5b50610434610a2c36600461356b565b611ff6565b348015610a3d57600080fd5b50610434610a4c366004613503565b61207d565b348015610a5d57600080fd5b50610434610a6c366004613435565b612115565b348015610a7d57600080fd5b506103b1600081565b348015610a9257600080fd5b506103b1600481565b60006001600160a01b038316610b0c5760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b1480610b6357506001600160e01b031982166303a24d0760e21b145b80610b7e57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60065462010000900460ff16610bca5760405162461bcd60e51b815260206004820152600b60248201526a1b9bdd08195b98589b195960aa1b6044820152606401610b03565b610bd381612152565b610c0c5760405162461bcd60e51b815260206004820152600a6024820152691a5b9d9b19081b59585b60b21b6044820152606401610b03565b6000805b6005811015610d3c576000610c3b848360058110610c3057610c306135d0565b602002015133611e11565b610c5b33868560058110610c5157610c516135d0565b6020020151610a9b565b610c6591906135fc565b11610ca05760405162461bcd60e51b815260206004820152600b60248201526a1a5d195b481b1a5cdd195960aa1b6044820152606401610b03565b601f6000848360058110610cb657610cb66135d0565b6020020151815260200190815260200160002054670de0b6b3a7640000610cdd9190613613565b610ce79083613632565b9150610d08838260058110610cfe57610cfe6135d0565b602002015161226f565b610d2a33848360058110610d1e57610d1e6135d0565b60200201516001612337565b80610d348161364a565b915050610c10565b50604051600090339083908381818185875af1925050503d8060008114610d7f576040519150601f19603f3d011682016040523d82523d6000602084013e610d84565b606091505b5050905080610d9257600080fd5b6040513390610da2908590613665565b604051908190038120848252907f616601795f3be42bb11b6c0c59b83beda513cf05d67b5fb7dffe3d54231e9e7a906020015b60405180910390a3505050565b606060028054610df190613699565b80601f0160208091040260200160405190810160405280929190818152602001828054610e1d90613699565b8015610e6a5780601f10610e3f57610100808354040283529160200191610e6a565b820191906000526020600020905b815481529060010190602001808311610e4d57829003601f168201915b50505050509050919050565b6020805281600052604060002081600a8110610e9157600080fd5b01549150829050565b6001600160a01b038516331480610eb65750610eb685336109e3565b610f1d5760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610b03565b610f2a85858585856124b1565b5050505050565b610f3b8333611e11565b15610f755760405162461bcd60e51b815260206004820152600a602482015269189029b0b632902832b960b11b6044820152606401610b03565b60008211610fb15760405162461bcd60e51b815260206004820152600960248201526805072696365203e20360bc1b6044820152606401610b03565b60008111610fee5760405162461bcd60e51b815260206004820152600a6024820152690416d6f756e74203e20360b41b6044820152606401610b03565b80610ff93385610a9b565b10156110335760405162461bcd60e51b8152602060048201526009602482015268416d6f756e74204d4d60b81b6044820152606401610b03565b6040805160a08101825284815233602082015290810183905260608101829052600160808201526024600061106760235490565b81526020808201929092526040908101600090812084518155848401516001820180546001600160a01b0319166001600160a01b03909216919091179055848301516002820155606085015160038201556080909401516004909401805460ff19169415159490941790935533835260229091529020602354815460018101835560009283526020832001556023549050611106602380546001019055565b6040805182815260208101859052908101839052849033907fa4572903413b96c94b277f98d1e6f61aaaca8922b8df4ac99972250cc67903729060600160405180910390a350505050565b6003546001600160a01b0316331461117b5760405162461bcd60e51b8152600401610b03906136d4565b604051600090339047908381818185875af1925050503d80600081146111bd576040519150601f19603f3d011682016040523d82523d6000602084013e6111c2565b606091505b50509050806111d057600080fd5b50565b606081518351146112385760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610b03565b6000835167ffffffffffffffff81111561125457611254612fea565b60405190808252806020026020018201604052801561127d578160200160208202803683370190505b50905060005b84518110156112f5576112c88582815181106112a1576112a16135d0565b60200260200101518583815181106112bb576112bb6135d0565b6020026020010151610a9b565b8282815181106112da576112da6135d0565b60209081029190910101526112ee8161364a565b9050611283565b509392505050565b600654610100900460ff166113545760405162461bcd60e51b815260206004820152601e60248201527f626f6f6d6572206d696e74696e67206e6f742079657420656e61626c656400006044820152606401610b03565b601a811061139d5760405162461bcd60e51b81526020600482015260166024820152756d757374206d696e7420323520617420612074696d6560501b6044820152606401610b03565b336000908152602160205260409020548111156113e75760405162461bcd60e51b8152602060048201526008602482015267546f6f204d616e7960c01b6044820152606401610b03565b60005b818110156114825760006113fc61268e565b905061141a338260016040518060200160405280600081525061277a565b6000818152601d602052604081208054916114348361364a565b90915550506004805490600061144983613709565b909155505033600090815260216020526040812080549161146983613709565b919050555050808061147a9061364a565b9150506113ea565b5050565b60008181526024602052604090206001808201546004909201546001600160a01b039092169160ff161515146114bb57600080fd5b6001600160a01b03811633146114ff5760405162461bcd60e51b815260206004820152600960248201526853656c6c6572204d4d60b81b6044820152606401610b03565b6000828152602460205260409020600401805460ff1916905561152181611b74565b60405182815233907f95dc9eaff78bf5a6f5d87a16719a65a37e7ff0829eb29ff1a6f559544945a31d9060200160405180910390a25050565b6000818152602460205260408120600281015460018201546003830154925491936001600160a01b03909116929190611594601486613736565b60008781526024602052604090206004015490915060ff166001600160a01b0385163314156115f95760405162461bcd60e51b815260206004820152601160248201527043616e7420427579204f776e204974656d60781b6044820152606401610b03565b6001811515146116395760405162461bcd60e51b815260206004820152600b60248201526a4e6f74206f6e2053616c6560a81b6044820152606401610b03565b346116448388613632565b1461167a5760405162461bcd60e51b8152602060048201526006602482015265506179204d4d60d01b6044820152606401610b03565b6116968533858760405180602001604052806000815250612884565b6000856001600160a01b03168760405160006040518083038185875af1925050503d80600081146116e3576040519150601f19603f3d011682016040523d82523d6000602084013e6116e8565b606091505b50509050806116f657600080fd5b6000888152602460205260409020600401805460ff1916905561171886611b74565b604080518581526020810189905290810186905233906001600160a01b038816907f74621dce25b6386582838985f8481246c5094b8168fb672895baef7c02e05c229060600160405180910390a35050505050505050565b6003546001600160a01b0316331461179a5760405162461bcd60e51b8152600401610b03906136d4565b600680549115156101000261ff0019909216919091179055565b6003546001600160a01b031633146117de5760405162461bcd60e51b8152600401610b03906136d4565b6117e860006129a1565b565b6003546001600160a01b031633146118145760405162461bcd60e51b8152600401610b03906136d4565b60068054911515620100000262ff000019909216919091179055565b6060600061183d60235490565b84111561187d5760405162461bcd60e51b815260206004820152600e60248201526d34b73b30b634b21031bab939b7b960911b6044820152606401610b03565b60008367ffffffffffffffff81111561189857611898612fea565b60405190808252806020026020018201604052801561190657816020015b6118f36040518060a001604052806000815260200160006001600160a01b0316815260200160008152602001600081526020016000151581525090565b8152602001906001900390816118b65790505b5090506000855b6023548110156119d75760008181526024602052604090206004015460ff16156119b857600081815260246020908152604091829020825160a0810184528154815260018201546001600160a01b0316928101929092526002810154928201929092526003820154606082015260049091015460ff1615156080820152835184908490811061199e5761199e6135d0565b602002602001018190525081806119b49061364a565b9250505b858214156119c5576119d7565b806119cf8161364a565b91505061190d565b60006119e38289613632565b90506119ee60235490565b8214156119f85750865b929792965091945050505050565b60065460ff16611a585760405162461bcd60e51b815260206004820152601760248201527f6d696e74696e67206e6f742079657420656e61626c65640000000000000000006044820152606401610b03565b80600554611a669190613613565b3414611aa55760405162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a5908185b5bdd5b9d60921b6044820152606401610b03565b601a8110611aee5760405162461bcd60e51b81526020600482015260166024820152756d757374206d696e7420323520617420612074696d6560501b6044820152606401610b03565b60005b81811015611482576000611b0361268e565b9050611b21338260016040518060200160405280600081525061277a565b6000818152601d60205260408120805491611b3b8361364a565b909155505060048054906000611b5083613709565b9190505550508080611b619061364a565b915050611af1565b6114823383836129f3565b6040805160158082526102c08201909252600091602082016102a0803683370190505090506000805b6001600160a01b038416600090815260226020526040902054811015611c85576001600160a01b03841660009081526022602052604081208054602492919084908110611bec57611bec6135d0565b6000918252602080832090910154835282019290925260400190206004015460ff1615611c73576001600160a01b0384166000908152602260205260409020805482908110611c3d57611c3d6135d0565b9060005260206000200154838381518110611c5a57611c5a6135d0565b602090810291909101015281611c6f8161364a565b9250505b80611c7d8161364a565b915050611b9d565b506001600160a01b03831660009081526022602090815260409091208351611caf92850190612ef1565b50505050565b6003546001600160a01b03163314611cdf5760405162461bcd60e51b8152600401610b03906136d4565b8051825114611d295760405162461bcd60e51b8152602060048201526016602482015275082e4e4c2f240d2e8cadae640daeae6e840dac2e8c6d60531b6044820152606401610b03565b60005b8251811015611e0c5760006001600160a01b0316838281518110611d5257611d526135d0565b60200260200101516001600160a01b03161415611d9d5760405162461bcd60e51b81526020600482015260096024820152684e756c6c204164727360b81b6044820152606401610b03565b818181518110611daf57611daf6135d0565b602002602001015160216000858481518110611dcd57611dcd6135d0565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020819055508080611e049061364a565b915050611d2c565b505050565b6000805b6001600160a01b038316600090815260226020526040902054811015611fae576001600160a01b03831660009081526022602052604081208054602492919084908110611e6457611e646135d0565b6000918252602080832090910154835282019290925260400190206004015460ff168015611ee657506001600160a01b03831660008181526022602052604081208054602492919085908110611ebc57611ebc6135d0565b600091825260208083209091015483528201929092526040019020600101546001600160a01b0316145b8015611f3d57506001600160a01b038316600090815260226020526040812080548692602492909185908110611f1e57611f1e6135d0565b9060005260206000200154815260200190815260200160002060000154145b15611f9c576001600160a01b03831660009081526022602052604081208054602492919084908110611f7157611f716135d0565b906000526020600020015481526020019081526020016000206003015482611f999190613632565b91505b80611fa68161364a565b915050611e15565b5092915050565b600034116117e85760405162461bcd60e51b815260206004820152600e60248201526d4d6f7265207468616e205a65726f60901b6044820152606401610b03565b6001600160a01b038516331480612012575061201285336109e3565b6120705760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b6064820152608401610b03565b610f2a8585858585612884565b6003546001600160a01b031633146120a75760405162461bcd60e51b8152600401610b03906136d4565b6001600160a01b03811661210c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b03565b6111d0816129a1565b6003546001600160a01b0316331461213f5760405162461bcd60e51b8152600401610b03906136d4565b6006805460ff1916911515919091179055565b60008080808080805b600581101561223e57858061218a575061218a888260058110612180576121806135d0565b6020020151612acc565b955084806121b257506121b28882600581106121a8576121a86135d0565b6020020151612add565b945083806121da57506121da8882600581106121d0576121d06135d0565b6020020151612b06565b9350828061220257506122028882600581106121f8576121f86135d0565b6020020151612b50565b9250818061222a575061222a888260058110612220576122206135d0565b6020020151612b84565b9150806122368161364a565b91505061215b565b508480156122495750835b80156122525750825b801561225b5750815b80156122645750805b979650505050505050565b6000818152601e602052604081208054916122898361364a565b90915550506000818152601c6020908152604080832054601e9092528220546122b3906064613613565b6122bd9190613736565b905060006122cc600a83613736565b6000848152602080526040902090915081600a81106122ed576122ed6135d0565b01546000848152601f602052604090205414611e0c576000838152602080526040902081600a8110612321576123216135d0565b01546000848152601f6020526040902055505050565b6001600160a01b0383166123995760405162461bcd60e51b815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201526265737360e81b6064820152608401610b03565b336123c9818560006123aa87612ba2565b6123b387612ba2565b5050604080516020810190915260009052505050565b6000838152602081815260408083206001600160a01b0388168452909152902054828110156124465760405162461bcd60e51b8152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604482015263616e636560e01b6064820152608401610b03565b6000848152602081815260408083206001600160a01b03898116808652918452828520888703905582518981529384018890529092908616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b81518351146125135760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b6064820152608401610b03565b6001600160a01b0384166125395760405162461bcd60e51b8152600401610b039061374a565b3360005b845181101561262057600085828151811061255a5761255a6135d0565b602002602001015190506000858381518110612578576125786135d0565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156125c85760405162461bcd60e51b8152600401610b039061378f565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290612605908490613632565b92505081905550505050806126199061364a565b905061253d565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516126709291906137d9565b60405180910390a4612686818787878787612bed565b505050505050565b600080612699612d49565b90506000600454826126ab9190613807565b90506000805b6015811015612744576000600782601581106126cf576126cf6135d0565b01546000818152601d6020908152604080832054601c90925282205492935090916126fa91906135fc565b905083851015801561271457506127118185613632565b85105b15612723575095945050505050565b61272d8185613632565b93505050808061273c9061364a565b9150506126b1565b5060405162461bcd60e51b815260206004820152600a6024820152691b5a5b9d1959081bdd5d60b21b6044820152606401610b03565b6001600160a01b0384166127da5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610b03565b336127f4816000876127eb88612ba2565b610f2a88612ba2565b6000848152602081815260408083206001600160a01b038916845290915281208054859290612824908490613632565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610f2a81600087878787612e36565b6001600160a01b0384166128aa5760405162461bcd60e51b8152600401610b039061374a565b336128ba8187876127eb88612ba2565b6000848152602081815260408083206001600160a01b038a168452909152902054838110156128fb5760405162461bcd60e51b8152600401610b039061378f565b6000858152602081815260408083206001600160a01b038b8116855292528083208785039055908816825281208054869290612938908490613632565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4612998828888888888612e36565b50505050505050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415612a675760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610b03565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319101610dd5565b6000811580610b7e57505060011490565b60006002821480612aee5750600382145b80612af95750600482145b80610b7e57505060051490565b60006006821480612b175750600782145b80612b225750600882145b80612b2d5750600982145b80612b385750600a82145b80612b435750600b82145b80610b7e575050600c1490565b6000600d821480612b615750600e82145b80612b6c5750600f82145b80612b775750601082145b80610b7e57505060111490565b60006012821480612b955750601382145b80610b7e57505060141490565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110612bdc57612bdc6135d0565b602090810291909101015292915050565b6001600160a01b0384163b156126865760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190612c31908990899088908890889060040161381b565b6020604051808303816000875af1925050508015612c6c575060408051601f3d908101601f19168201909252612c6991810190613879565b60015b612d1957612c78613896565b806308c379a01415612cb25750612c8d6138b2565b80612c985750612cb4565b8060405162461bcd60e51b8152600401610b0391906130f8565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610b03565b6001600160e01b0319811663bc197c8160e01b146129985760405162461bcd60e51b8152600401610b039061393c565b6040516bffffffffffffffffffffffff193360601b16602082015260009042906034016040516020818303038152906040528051906020012060001c612d8f9190613736565b6040516bffffffffffffffffffffffff194160601b16602082015242906034016040516020818303038152906040528051906020012060001c612dd29190613736565b4345612dde4442613632565b612de89190613632565b612df29190613632565b612dfc9190613632565b612e069190613632565b604051602001612e1891815260200190565b6040516020818303038152906040528051906020012060001c905090565b6001600160a01b0384163b156126865760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190612e7a9089908990889088908890600401613984565b6020604051808303816000875af1925050508015612eb5575060408051601f3d908101601f19168201909252612eb291810190613879565b60015b612ec157612c78613896565b6001600160e01b0319811663f23a6e6160e01b146129985760405162461bcd60e51b8152600401610b039061393c565b828054828255906000526020600020908101928215612f2c579160200282015b82811115612f2c578251825591602001919060010190612f11565b50612f38929150612f3c565b5090565b5b80821115612f385760008155600101612f3d565b600060208284031215612f6357600080fd5b5035919050565b80356001600160a01b0381168114612f8157600080fd5b919050565b60008060408385031215612f9957600080fd5b612fa283612f6a565b946020939093013593505050565b6001600160e01b0319811681146111d057600080fd5b600060208284031215612fd857600080fd5b8135612fe381612fb0565b9392505050565b634e487b7160e01b600052604160045260246000fd5b601f8201601f1916810167ffffffffffffffff8111828210171561302657613026612fea565b6040525050565b600060a0828403121561303f57600080fd5b82601f83011261304e57600080fd5b60405160a0810181811067ffffffffffffffff8211171561307157613071612fea565b6040528060a084018581111561308657600080fd5b845b818110156130a0578035835260209283019201613088565b509195945050505050565b6000815180845260005b818110156130d1576020818501810151868301820152016130b5565b818111156130e3576000602083870101525b50601f01601f19169290920160200192915050565b602081526000612fe360208301846130ab565b6000806040838503121561311e57600080fd5b50508035926020909101359150565b600067ffffffffffffffff82111561314757613147612fea565b5060051b60200190565b600082601f83011261316257600080fd5b8135602061316f8261312d565b60405161317c8282613000565b83815260059390931b850182019282810191508684111561319c57600080fd5b8286015b848110156131b757803583529183019183016131a0565b509695505050505050565b600082601f8301126131d357600080fd5b813567ffffffffffffffff8111156131ed576131ed612fea565b604051613204601f8301601f191660200182613000565b81815284602083860101111561321957600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a0868803121561324e57600080fd5b61325786612f6a565b945061326560208701612f6a565b9350604086013567ffffffffffffffff8082111561328257600080fd5b61328e89838a01613151565b945060608801359150808211156132a457600080fd5b6132b089838a01613151565b935060808801359150808211156132c657600080fd5b506132d3888289016131c2565b9150509295509295909350565b6000806000606084860312156132f557600080fd5b505081359360208301359350604090920135919050565b6000806040838503121561331f57600080fd5b823567ffffffffffffffff8082111561333757600080fd5b818501915085601f83011261334b57600080fd5b813560206133588261312d565b6040516133658282613000565b83815260059390931b850182019282810191508984111561338557600080fd5b948201945b838610156133aa5761339b86612f6a565b8252948201949082019061338a565b965050860135925050808211156133c057600080fd5b506133cd85828601613151565b9150509250929050565b600081518084526020808501945080840160005b83811015613407578151875295820195908201906001016133eb565b509495945050505050565b602081526000612fe360208301846133d7565b80358015158114612f8157600080fd5b60006020828403121561344757600080fd5b612fe382613425565b6040808252835182820181905260009190606090818501906020808901865b838110156134bc57815180518652838101516001600160a01b0316848701528781015188870152868101518787015260809081015115159086015260a0909401939082019060010161346f565b505095909501959095525092949350505050565b600080604083850312156134e357600080fd5b6134ec83612f6a565b91506134fa60208401613425565b90509250929050565b60006020828403121561351557600080fd5b612fe382612f6a565b6000806040838503121561353157600080fd5b823591506134fa60208401612f6a565b6000806040838503121561355457600080fd5b61355d83612f6a565b91506134fa60208401612f6a565b600080600080600060a0868803121561358357600080fd5b61358c86612f6a565b945061359a60208701612f6a565b93506040860135925060608601359150608086013567ffffffffffffffff8111156135c457600080fd5b6132d3888289016131c2565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008282101561360e5761360e6135e6565b500390565b600081600019048311821515161561362d5761362d6135e6565b500290565b60008219821115613645576136456135e6565b500190565b600060001982141561365e5761365e6135e6565b5060010190565b60008183825b600581101561368a57815183526020928301929091019060010161366b565b50505060a08201905092915050565b600181811c908216806136ad57607f821691505b602082108114156136ce57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600081613718576137186135e6565b506000190190565b634e487b7160e01b600052601260045260246000fd5b60008261374557613745613720565b500490565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6040815260006137ec60408301856133d7565b82810360208401526137fe81856133d7565b95945050505050565b60008261381657613816613720565b500690565b6001600160a01b0386811682528516602082015260a060408201819052600090613847908301866133d7565b828103606084015261385981866133d7565b9050828103608084015261386d81856130ab565b98975050505050505050565b60006020828403121561388b57600080fd5b8151612fe381612fb0565b600060033d11156138af5760046000803e5060005160e01c5b90565b600060443d10156138c05790565b6040516003193d81016004833e81513d67ffffffffffffffff81602484011181841117156138f057505050505090565b82850191508151818111156139085750505050505090565b843d87010160208285010111156139225750505050505090565b61393160208286010187613000565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090612264908301846130ab56fea26469706673582212206b0d24a548f315773de8f72791cfae77b9cc972401177562196c54e0c7854d6e64736f6c634300080a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000036f336f0000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : uri (string): o3o
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [2] : 6f336f0000000000000000000000000000000000000000000000000000000000