Overview
TokenID
5
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
MemberLounge
Compiler Version
v0.8.9+commit.e5eed63a
Optimization Enabled:
Yes with 1000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; //----------------------------------------------------------------------------- // geneticchain.io - NextGen Generative NFT Platform //----------------------------------------------------------------------------- /*\_____________________________________________________________ .¿yy¿. __ MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM```````/MMM\\\\\ \\$$$$$$S/ . MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM`` `/ yyyy ` _____J$$$^^^^/%#// MMMMMMMMMMMMMMMMMMMYYYMMM```` `\/ .¿yü / $ùpüüü%%% | ``|//|` __ MMMMMYYYYMMMMMMM/` `| ___.¿yüy¿. .d$$$$ / $$$$SSSSM | | || MMNNNNNNM M/`` ``\/` .¿ù%%/. |.d$$$$$$$b.$$$*°^ / o$$$ __ | | || MMMMMMMMM M .¿yy¿. .dX$$$$$$7.|$$$$"^"$$$$$$o` /MM o$$$ MM | | || MMYYYYYYM \\$$$$$$S/ .S$$o"^"4$$$$$$$` _ `SSSSS\ ____ MM |___|_|| MM ____ J$$$^^^^/%#//oSSS` YSSSSSS / pyyyüüü%%%XXXÙ$$$$ MM pyyyyyyy, `` ,$$$o .$$$` ___ pyyyyyyyyyyyy//+ / $$$$$$SSSSSSSÙM$$$. `` .S&&T$T$$$byyd$$$$\ \$$7 `` //o$$SSXMMSSSS | / $$/&&X _ ___ %$$$byyd$$$X\$`/S$$$$$$$S\ o$$l .\\YS$$X>$X _ ___| | / $$/%$$b.,.d$$$\`7$$$$$$$$7`.$ `"***"` __ o$$l __ 7$$$X>$$b.,.d$$$\ | / $$.`7$$$$$$$$%` `*+SX+*|_\\$ /. ..\MM o$$L MM !$$$$\$$$$$$$$$%|__| / $$// `*+XX*\'` `____ ` `/MMMMMMM /$$X, `` ,S$$$$\ `*+XX*\'`____ / %SXX . ., NERV ___.¿yüy¿. /MMMMM 7$$$byyd$$$>$X\ .,,_ $$$$ ` ___ .y%%ü¿. _______ $.d$$$$$$$S. `MMMM `/S$$$$$$$\\$J`.\\$$$ : $\`.¿yüy¿. `\\ $$$$$$S.//XXSSo $$$$$"^"$$$$. /MMM y `"**"`"Xo$7J$$$$$\ $.d$$$$$$$b. ^``/$$$$.`$$$$o $$$$\ _ 'SSSo /MMM M/.__ .,\Y$$$\\$$O` _/ $d$$$*°\ pyyyüüü%%%W $$$o.$$$$/ S$$$. ` S$To MMM MMMM` \$P*$$X+ b$$l MM $$$$` _ $$$$$$SSSSM $$$X.$T&&X o$$$. ` S$To MMM MMMX` $<.\X\` -X$$l MM $$$$ / $$/&&X X$$$/$/X$$dyS$$>. ` S$X%/ `MM MMMM/ `"` . -$$$l MM yyyy / $$/%$$b.__.d$$$$/$.'7$$$$$$$. ` %SXXX. MM MMMMM// ./M .<$$S, `` ,S$$> / $$.`7$$$$$$$$$$$/S//_'*+%%XX\ `._ /MM MMMMMMMMMMMMM\ /$$$$byyd$$$$\ / $$// `*+XX+*XXXX ,. .\MMMMMMMMMMM GENETIC/MMMMM\. /$$$$$$$$$$\| / %SXX ,_ . .\MMMMMMMMMMMMMMMMMMMMMMMM CHAIN/MMMMMMMM/__ `*+YY+*`_\| /_______//MMMMMMMMMMMMMMMMMMMMMMMMMMM/-/-/-\*/ //----------------------------------------------------------------------------- // Genetic Chain: Member Lounge //----------------------------------------------------------------------------- // Author: papaver (@tronicdreams) //----------------------------------------------------------------------------- import "openzeppelin-solidity/contracts/access/Ownable.sol"; import "openzeppelin-solidity/contracts/token/ERC721/IERC721.sol"; import "openzeppelin-solidity/contracts/token/ERC721/IERC721Receiver.sol"; import "openzeppelin-solidity/contracts/token/ERC1155/ERC1155.sol"; //------------------------------------------------------------------------------ // GeneticChainMetadata //------------------------------------------------------------------------------ /** * @title GeneticChain - MemberLounge */ contract MemberLounge is ERC1155, IERC721Receiver, Ownable { //------------------------------------------------------------------------- // structs //------------------------------------------------------------------------- struct Token { uint16 passList; uint56 maxSupply; uint56 totalSupply; int64 minStakeTime; int64 createdTS; } struct Pass { uint8 passId; uint16 tokenId; int64 stakedTS; } //------------------------------------------------------------------------- // events //------------------------------------------------------------------------- /** * Emited when a new token is created. */ event TokenCreated(uint256 tokenId, uint16 passList, uint56 maxSupply, int64 minStakeTime, int64 createdTS); /** * Emited when a new pass is staked. */ event Staked(address indexed owner, address pass, uint256 tokenId, int64 stakedTS); /** * Emited when a new pass is staked. */ event Unstaked(address indexed owner, address pass, uint256 tokenId); /** * Emited when a reward is claimed. */ event RewardsClaimed(address indexed owner, uint256 tokenId, uint256 amount); //------------------------------------------------------------------------- // constants //------------------------------------------------------------------------- address constant kDeadAddy = 0x000000000000000000000000000000000000dEaD; // token name/symbol string constant private _name = "Genetic Chain Member Lounge"; string constant private _symbol = "GCML"; // contract info string public _contractUri; //------------------------------------------------------------------------- // fields //------------------------------------------------------------------------- // track tokens Token[] private _tokens; // handle token uri overrides mapping (uint256 => string) private _ipfsHash; // roles mapping (address => bool) private _minterAddress; mapping (address => bool) private _burnerAddress; // staking IERC721[] private _passes; mapping (address => uint8) private _passIdx; mapping (address => Pass[]) private _stakedPasses; // claim mapping (uint256 => bool) private _claims; //------------------------------------------------------------------------- // ctor //------------------------------------------------------------------------- constructor( string memory baseUri, string memory contractUri, address[] memory passes) ERC1155(baseUri) { // start token index at 1 _tokens.push(); // start pass index at 1 else we can't use 0 index to indicate // an invalid pass inside _passIdx _passes.push(); // save contract uri _contractUri = contractUri; // register passes for (uint256 i = 0; i < passes.length; ++i) { _registerPassContract(passes[i]); } } //------------------------------------------------------------------------- // modifiers //------------------------------------------------------------------------- modifier validTokenId(uint256 tokenId) { require(_created(tokenId), "invalid token"); _; } //------------------------------------------------------------------------- /** * Verify caller is authorized minter. */ modifier isMinter() { require(_minterAddress[_msgSender()] || owner() == _msgSender(), "caller not minter"); _; } //------------------------------------------------------------------------- /** * Verify caller is authorized burner. */ modifier isBurner() { require(_burnerAddress[_msgSender()], "caller not burner"); _; } //------------------------------------------------------------------------- // internal //------------------------------------------------------------------------- /** * @dev Returns whether the specified token was created. */ function _created(uint256 id) internal view returns (bool) { return id < _tokens.length && _tokens[id].createdTS > 0; } //------------------------------------------------------------------------- /** * @dev Returns whether the specified token has supply. */ function _exists(uint256 id) internal view returns (bool) { return id < _tokens.length && _tokens[id].totalSupply > 0; } //------------------------------------------------------------------------- function _registerPassContract(address pass) internal { require(IERC165(pass).supportsInterface(type(IERC721).interfaceId), "not IERC721 compliant"); _passIdx[pass] = uint8(_passes.length); _passes.push(IERC721(pass)); } //------------------------------------------------------------------------- function _mkClaimId(address claimee, uint256 tokenId) internal pure returns(uint256) { return uint256(uint160(claimee)) << 96 | tokenId; } //------------------------------------------------------------------------- function _inPassList(uint8 passId, uint16 passList) internal pure returns(bool) { return passList & uint16(1 << (passId - 1)) != 0; } //------------------------------------------------------------------------- function _calculateRewards(address claimee, uint256 tokenId) internal view returns(uint256 rewards) { // token to calculate rewards for Token storage token = _tokens[tokenId]; // claim rewards for passes staked long enough uint256 stakedCount = _stakedPasses[claimee].length; for (uint256 i = 0; i < stakedCount; ++i) { Pass storage stakedPass = _stakedPasses[claimee][i]; int64 timeElapsed = token.createdTS - stakedPass.stakedTS; if (timeElapsed >= token.minStakeTime && _inPassList(stakedPass.passId, token.passList)) { rewards += 1; } } } //------------------------------------------------------------------------- // ERC165 //------------------------------------------------------------------------- /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC1155) returns (bool) { return interfaceId == type(IERC721Receiver).interfaceId || super.supportsInterface(interfaceId); } //------------------------------------------------------------------------- // ERC1155 //------------------------------------------------------------------------- /** * @dev See {ERC1155-_mint}. */ function _mint( address account, uint256 id, uint256 amount, bytes memory data) internal virtual override validTokenId(id) { super._mint(account, id, amount, data); _tokens[id].totalSupply += uint56(amount); require(_tokens[id].totalSupply <= _tokens[id].maxSupply, 'amount exceed maxsupply'); } //------------------------------------------------------------------------- /** * @dev See {ERC1155-_mintBatch}. */ function _mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data) internal virtual override { super._mintBatch(to, ids, amounts, data); unchecked { for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; require(_created(id), 'invalid token'); _tokens[id].totalSupply += uint56(amounts[i]); require(_tokens[id].totalSupply <= _tokens[id].maxSupply, 'amount exceed maxsupply'); } } } //------------------------------------------------------------------------- /** * @dev See {ERC1155-_burn}. */ function _burn(address account, uint256 id, uint256 amount) internal virtual override validTokenId(id) { super._burn(account, id, amount); unchecked { _tokens[id].totalSupply -= uint56(amount); } } //------------------------------------------------------------------------- /** * @dev See {ERC1155-_burnBatch}. */ function _burnBatch( address account, uint256[] memory ids, uint256[] memory amounts) internal virtual override { super._burnBatch(account, ids, amounts); unchecked { for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; _tokens[id].totalSupply -= uint56(amounts[i]); } } } //------------------------------------------------------------------------- /** * @dev See {IERC1155MetadataURI-uri}. * * Each token should have it's own override. */ function uri(uint256 id) public view override validTokenId(id) returns (string memory) { // append hash or use base return bytes(_ipfsHash[id]).length == 0 ? super.uri(id) : string(abi.encodePacked(super.uri(id), "/", _ipfsHash[id])); } //------------------------------------------------------------------------- // admin //------------------------------------------------------------------------- /** * Authorize minter address. */ function registerMinterAddress(address minter) public onlyOwner { require(!_minterAddress[minter], "address already registered"); _minterAddress[minter] = true; } //------------------------------------------------------------------------- /** * Remove minter address. */ function revokeMinterAddress(address minter) public onlyOwner { require(_minterAddress[minter], "address not registered"); delete _minterAddress[minter]; } //------------------------------------------------------------------------- /** * Authorize burner address. */ function registerBurnerAddress(address burner) public onlyOwner { require(!_burnerAddress[burner], "address already registered"); _burnerAddress[burner] = true; } //------------------------------------------------------------------------- /** * Remove burner address. */ function revokeBurnerAddress(address burner) public onlyOwner { require(_burnerAddress[burner], "address not registered"); delete _burnerAddress[burner]; } //------------------------------------------------------------------------- /** * @dev Update default tokenUri used for all tokens. * * Should use the `\{id\}` replace mechanism to load the token id. */ function setURI(string memory tokenUri) public onlyOwner { _setURI(tokenUri); emit URI(tokenUri, 0); } //------------------------------------------------------------------------- /** * @dev Override token's ipfs hash. */ function setTokenIpfsHash(uint256 id, string memory ipfsHash) public onlyOwner validTokenId(id) { _ipfsHash[id] = ipfsHash; emit URI(uri(id), id); } //------------------------------------------------------------------------- /** * @dev Override token's pass list. */ function setTokenPassList(uint256 id, uint16 passList) public onlyOwner validTokenId(id) { _tokens[id].passList = passList; } //------------------------------------------------------------------------- /** * @dev Override token's max supply. */ function setTokenMaxSupply(uint256 id, uint56 maxSupply) public onlyOwner validTokenId(id) { require(maxSupply >= _tokens[id].totalSupply, 'max must exceed total'); _tokens[id].maxSupply = maxSupply; } //------------------------------------------------------------------------- /** * @dev Override token's minimum stake time. */ function setTokenMinStakeTime(uint256 id, int64 minStakeTime) public onlyOwner validTokenId(id) { _tokens[id].minStakeTime = minStakeTime; } //------------------------------------------------------------------------- /** * @dev Override token's minimum stake time. */ function editToken(uint256 id, uint16 passList, uint56 maxSupply, int64 minStakeTime, string memory ipfsHash) public onlyOwner validTokenId(id) { require(maxSupply >= _tokens[id].totalSupply, 'max must exceed total'); _tokens[id].passList = passList; _tokens[id].maxSupply = maxSupply; _tokens[id].minStakeTime = minStakeTime; _ipfsHash[id] = ipfsHash; emit URI(uri(id), id); } //------------------------------------------------------------------------- /** * @dev Create a new token. * @param passList uint16 Passes eligible for reward. * @param amount uint256 Mint amount tokens to caller. * @param minStakeTime int64 Minimum time pass stake required to qualify * @param maxSupply uint56 Max mintable supply for this token. * @param ipfsHash string Override ipfsHash for newly created token. */ function create(uint16 passList, uint256 amount, uint56 maxSupply, int64 minStakeTime, string memory ipfsHash) public onlyOwner { require(amount > 0, 'invalid amount'); require(bytes(ipfsHash).length > 0, 'invalid ipfshash'); // grab token id uint256 tokenId = _tokens.length; // add token int64 createdAt = int64(int256(block.timestamp)); Token memory token = Token(passList, maxSupply, 0, minStakeTime, createdAt); _tokens.push(token); // override token's ipfsHash _ipfsHash[tokenId] = ipfsHash; emit URI(uri(tokenId), tokenId); // mint a single token _mint(msg.sender, tokenId, amount, ""); // created event emit TokenCreated(tokenId, passList, maxSupply, minStakeTime, createdAt); } //------------------------------------------------------------------------- function mint(address to, uint256 id, uint256 amount) public isMinter { require(amount > 0, 'invalid amount'); _mint(to, id, amount, ""); } //------------------------------------------------------------------------- function mintBatch(address to, uint256[] calldata ids, uint256[] calldata amounts) external isMinter { _mintBatch(to, ids, amounts, ""); } //------------------------------------------------------------------------- function burn(address to, uint256 id, uint256 amount) public isBurner { require(amount > 0, 'invalid amount'); _burn(to, id, amount); } //------------------------------------------------------------------------- function burnBatch(address to, uint256[] calldata ids, uint256[] calldata amounts) external isBurner { _burnBatch(to, ids, amounts); } //------------------------------------------------------------------------- // accessors //------------------------------------------------------------------------- /** * @dev Conform to {IERC721Metadata-name}. */ function name() public pure returns (string memory) { return _name; } //------------------------------------------------------------------------- /** * @dev Conform to {IERC721Metadata-symbol}. */ function symbol() public pure returns (string memory) { return _symbol; } //------------------------------------------------------------------------- /** * @dev Total amount of tokens in with a given id. */ function totalSupply(uint256 id) public view returns (uint256) { return id < _tokens.length ? _tokens[id].totalSupply : 0; } //------------------------------------------------------------------------- // IERC721Receiver //------------------------------------------------------------------------- /** * @dev See {IERC721Receiver-onERC721Received}. */ function onERC721Received( address, address, uint256, bytes calldata) public pure override returns (bytes4) { return this.onERC721Received.selector ^ 0x23b872dd; } //------------------------------------------------------------------------- // interface //------------------------------------------------------------------------- /** * @dev Return token info. */ function getToken(uint256 id) public view validTokenId(id) returns (Token memory, string memory) { return (_tokens[id], _ipfsHash[id]); } //------------------------------------------------------------------------- /** * @dev Return list of all tokens. */ function allTokens() public view returns (Token[] memory) { // return empty so all token indecies line up return _tokens; } //------------------------------------------------------------------------- /** * @dev Return list of pass contracts. */ function allPassContracts() public view returns (address[] memory) { // keep the first empty entry so index lines up with id uint256 count = _passes.length; address[] memory passes = new address[](count); for (uint256 i = 0; i < count; ++i) { passes[i] = address(_passes[i]); } return passes; } //------------------------------------------------------------------------- /** * @dev Return list of passes staked by staker. */ function getStakedPasses(address staker) public view returns (Pass[] memory stakedPasses) { stakedPasses = _stakedPasses[staker]; } //------------------------------------------------------------------------- /** * @dev Query pass for owners balance. */ function balanceOfPass(address pass, address owner) public view returns (uint256) { require(_passIdx[pass] != 0, 'invalid pass address'); // grab pass uint8 passId = _passIdx[pass]; IERC721 pass721 = _passes[passId]; // return pass balance return pass721.balanceOf(owner); } //------------------------------------------------------------------------- /** * @dev Stake single pass. */ function stakePass(address pass, uint256 tokenId) public { require(_passIdx[pass] != 0, 'invalid pass address'); address sender = _msgSender(); // grab pass uint8 passId = _passIdx[pass]; IERC721 pass721 = _passes[passId]; // verify ownership require(pass721.ownerOf(tokenId) == sender, 'not pass owner'); // transfer here pass721.transferFrom(sender, address(this), tokenId); // save staked info int64 stakedTS = int64(int256(block.timestamp)); Pass memory stakedPass = Pass( passId, uint16(tokenId), stakedTS); _stakedPasses[sender].push(stakedPass); // track skate event emit Staked(sender, pass, tokenId, stakedTS); } //------------------------------------------------------------------------- /** * @dev Unstake single pass. */ function unstakePass(address pass, uint256 tokenId) public { require(_passIdx[pass] != 0, 'invalid pass address'); address sender = _msgSender(); // grab pass uint8 passId = _passIdx[pass]; IERC721 pass721 = _passes[passId]; // find pass uint256 stakedCount = _stakedPasses[sender].length; for (uint256 i = 0; i < stakedCount; ++i) { Pass storage stakedPass = _stakedPasses[sender][i]; if (stakedPass.passId == passId && stakedPass.tokenId == tokenId) { // transfer pass back to owner pass721.transferFrom(address(this), sender, tokenId); // keep array compact uint256 lastIndex = stakedCount - 1; if (i != lastIndex) { _stakedPasses[sender][i] = _stakedPasses[sender][lastIndex]; } // cleanup _stakedPasses[sender].pop(); // track unskate event emit Unstaked(sender, pass, tokenId); // no need to continue return; } } // invalid pass require(false, 'pass not found'); } //------------------------------------------------------------------------- /** * @dev Unstake all passes staked in contract. */ function unstakeAllPasses() public { address sender = _msgSender(); require(_stakedPasses[sender].length > 0, 'no passes staked'); // unstake all passes uint256 stakedCount = _stakedPasses[sender].length; for (uint256 i = 0; i < stakedCount; ++i) { Pass storage stakedPass = _stakedPasses[sender][i]; IERC721 pass721 = _passes[stakedPass.passId]; // transfer pass back to owner pass721.transferFrom(address(this), sender, stakedPass.tokenId); // track unskate event emit Unstaked(sender, address(pass721), stakedPass.tokenId); // cleanup delete _stakedPasses[sender][i]; } // cleanup delete _stakedPasses[sender]; } //------------------------------------------------------------------------- /** * Calculate rewards available for user for given tokenId. */ function calculateRewards(uint256 tokenId, address user) public view validTokenId(tokenId) returns(uint256) { uint256 claimId = _mkClaimId(user, tokenId); return _claims[claimId] ? 0 : _calculateRewards(user, tokenId); } //------------------------------------------------------------------------- function calculateRewardsBatch(uint256[] memory tokenIds, address user) public view returns(uint256[] memory) { uint256 count = tokenIds.length; uint256[] memory rewards = new uint256[](count); for (uint256 i = 0; i < count; ++i) { rewards[i] = calculateRewards(tokenIds[i], user); } return rewards; } //------------------------------------------------------------------------- /** * @dev Claim single token for all passes. */ function claim(uint256 tokenId) public validTokenId(tokenId) { address sender = _msgSender(); require(_stakedPasses[sender].length > 0, 'no passes staked'); // check claim uint256 claimId = _mkClaimId(sender, tokenId); require(!_claims[claimId], 'rewards claimed'); // process all passes uint256 rewards = _calculateRewards(sender, tokenId); require(rewards > 0, 'no rewards'); // mark as claimed _claims[claimId] = true; // mint token for claimee _mint(sender, tokenId, rewards, ""); // record event emit RewardsClaimed(sender, tokenId, rewards); } //------------------------------------------------------------------------- /** * @dev Claim multiple tokens at once. */ function claimBatch(uint256[] calldata tokenIds) public { require(tokenIds.length > 0, 'no token ids'); uint256 tokenCount = tokenIds.length; for (uint256 i = 0; i < tokenCount; ++i) { claim(tokenIds[i]); } } //------------------------------------------------------------------------- function setContractURI(string memory contractUri) external onlyOwner { _contractUri = contractUri; } //------------------------------------------------------------------------- function contractURI() public view returns (string memory) { return _contractUri; } }
// SPDX-License-Identifier: MIT 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 () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), 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 { emit OwnershipTransferred(_owner, address(0)); _owner = 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"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } }
// SPDX-License-Identifier: MIT 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 { require(_msgSender() != operator, "ERC1155: setting approval status for self"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_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(to != address(0), "ERC1155: transfer to the zero address"); require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not owner nor approved" ); 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"); _balances[id][from] = fromBalance - amount; _balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); _doSafeTransferAcceptanceCheck(operator, 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(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); require(to != address(0), "ERC1155: transfer to the zero address"); require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: transfer caller is not owner nor approved" ); 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"); _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 `account`. * * Emits a {TransferSingle} event. * * Requirements: * * - `account` cannot be the zero address. * - If `account` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _mint(address account, uint256 id, uint256 amount, bytes memory data) internal virtual { require(account != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), account, _asSingletonArray(id), _asSingletonArray(amount), data); _balances[id][account] += amount; emit TransferSingle(operator, address(0), account, id, amount); _doSafeTransferAcceptanceCheck(operator, address(0), account, 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 (uint 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 `account` * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens of token type `id`. */ function _burn(address account, uint256 id, uint256 amount) internal virtual { require(account != address(0), "ERC1155: burn from the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, account, address(0), _asSingletonArray(id), _asSingletonArray(amount), ""); uint256 accountBalance = _balances[id][account]; require(accountBalance >= amount, "ERC1155: burn amount exceeds balance"); _balances[id][account] = accountBalance - amount; emit TransferSingle(operator, account, 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 account, uint256[] memory ids, uint256[] memory amounts) internal virtual { require(account != address(0), "ERC1155: burn from the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, account, address(0), ids, amounts, ""); for (uint i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 accountBalance = _balances[id][account]; require(accountBalance >= amount, "ERC1155: burn amount exceeds balance"); _balances[id][account] = accountBalance - amount; } emit TransferBatch(operator, account, address(0), ids, amounts); } /** * @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(to).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(to).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 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 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. To accept the transfer, this must return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` (i.e. 0xf23a6e61, or its own function selector). @param operator The address which initiated the transfer (i.e. msg.sender) @param from The address which previously owned the token @param id The ID of the token being transferred @param value The amount of tokens being transferred @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns(bytes4); /** @dev Handles the receipt of a multiple ERC1155 token types. This function is called at the end of a `safeBatchTransferFrom` after the balances have been updated. To accept the transfer(s), this must return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` (i.e. 0xbc197c81, or its own function selector). @param operator The address which initiated the batch transfer (i.e. msg.sender) @param from The address which previously owned the token @param ids An array containing ids of each token being transferred (order and length must match values array) @param values An array containing amounts of each token being transferred (order and length must match ids array) @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns(bytes4); }
// SPDX-License-Identifier: MIT 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 pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @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 * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 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"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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 // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } }
// SPDX-License-Identifier: MIT 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 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); }
{ "remappings": [], "optimizer": { "enabled": true, "runs": 1000 }, "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":"baseUri","type":"string"},{"internalType":"string","name":"contractUri","type":"string"},{"internalType":"address[]","name":"passes","type":"address[]"}],"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":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":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardsClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"address","name":"pass","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"int64","name":"stakedTS","type":"int64"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint16","name":"passList","type":"uint16"},{"indexed":false,"internalType":"uint56","name":"maxSupply","type":"uint56"},{"indexed":false,"internalType":"int64","name":"minStakeTime","type":"int64"},{"indexed":false,"internalType":"int64","name":"createdTS","type":"int64"}],"name":"TokenCreated","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":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"address","name":"pass","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Unstaked","type":"event"},{"inputs":[],"name":"_contractUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allPassContracts","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allTokens","outputs":[{"components":[{"internalType":"uint16","name":"passList","type":"uint16"},{"internalType":"uint56","name":"maxSupply","type":"uint56"},{"internalType":"uint56","name":"totalSupply","type":"uint56"},{"internalType":"int64","name":"minStakeTime","type":"int64"},{"internalType":"int64","name":"createdTS","type":"int64"}],"internalType":"struct MemberLounge.Token[]","name":"","type":"tuple[]"}],"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":"pass","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOfPass","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"user","type":"address"}],"name":"calculateRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"address","name":"user","type":"address"}],"name":"calculateRewardsBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"claimBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"passList","type":"uint16"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint56","name":"maxSupply","type":"uint56"},{"internalType":"int64","name":"minStakeTime","type":"int64"},{"internalType":"string","name":"ipfsHash","type":"string"}],"name":"create","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint16","name":"passList","type":"uint16"},{"internalType":"uint56","name":"maxSupply","type":"uint56"},{"internalType":"int64","name":"minStakeTime","type":"int64"},{"internalType":"string","name":"ipfsHash","type":"string"}],"name":"editToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"getStakedPasses","outputs":[{"components":[{"internalType":"uint8","name":"passId","type":"uint8"},{"internalType":"uint16","name":"tokenId","type":"uint16"},{"internalType":"int64","name":"stakedTS","type":"int64"}],"internalType":"struct MemberLounge.Pass[]","name":"stakedPasses","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getToken","outputs":[{"components":[{"internalType":"uint16","name":"passList","type":"uint16"},{"internalType":"uint56","name":"maxSupply","type":"uint56"},{"internalType":"uint56","name":"totalSupply","type":"uint56"},{"internalType":"int64","name":"minStakeTime","type":"int64"},{"internalType":"int64","name":"createdTS","type":"int64"}],"internalType":"struct MemberLounge.Token","name":"","type":"tuple"},{"internalType":"string","name":"","type":"string"}],"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":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"mintBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"burner","type":"address"}],"name":"registerBurnerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"registerMinterAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"burner","type":"address"}],"name":"revokeBurnerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"revokeMinterAddress","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":"string","name":"contractUri","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"string","name":"ipfsHash","type":"string"}],"name":"setTokenIpfsHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint56","name":"maxSupply","type":"uint56"}],"name":"setTokenMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"int64","name":"minStakeTime","type":"int64"}],"name":"setTokenMinStakeTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint16","name":"passList","type":"uint16"}],"name":"setTokenPassList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"tokenUri","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pass","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"stakePass","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"totalSupply","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":[],"name":"unstakeAllPasses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pass","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"unstakePass","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162005bd238038062005bd28339810160408190526200003491620003ea565b82620000408162000109565b50600380546001600160a01b0319163390811790915560405181906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506005805460019081019091556009805490910181556000528151620000b190600490602085019062000266565b5060005b8151811015620000ff57620000ec828281518110620000d857620000d862000501565b60200260200101516200012260201b60201c565b620000f78162000517565b9050620000b5565b50505050620005a9565b80516200011e90600290602084019062000266565b5050565b6040516301ffc9a760e01b81526380ac58cd60e01b60048201526001600160a01b038216906301ffc9a79060240160206040518083038186803b1580156200016957600080fd5b505afa1580156200017e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001a4919062000541565b620001f55760405162461bcd60e51b815260206004820152601560248201527f6e6f74204945524337323120636f6d706c69616e740000000000000000000000604482015260640160405180910390fd5b600980546001600160a01b03929092166000818152600a60205260408120805460ff191660ff909516949094179093558154600181018355919092527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0180546001600160a01b0319169091179055565b82805462000274906200056c565b90600052602060002090601f016020900481019282620002985760008555620002e3565b82601f10620002b357805160ff1916838001178555620002e3565b82800160010185558215620002e3579182015b82811115620002e3578251825591602001919060010190620002c6565b50620002f1929150620002f5565b5090565b5b80821115620002f15760008155600101620002f6565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156200034d576200034d6200030c565b604052919050565b600082601f8301126200036757600080fd5b81516001600160401b038111156200038357620003836200030c565b602062000399601f8301601f1916820162000322565b8281528582848701011115620003ae57600080fd5b60005b83811015620003ce578581018301518282018401528201620003b1565b83811115620003e05760008385840101525b5095945050505050565b6000806000606084860312156200040057600080fd5b83516001600160401b03808211156200041857600080fd5b620004268783880162000355565b94506020915081860151818111156200043e57600080fd5b6200044c8882890162000355565b9450506040860151818111156200046257600080fd5b8601601f810188136200047457600080fd5b8051828111156200048957620004896200030c565b8060051b92506200049c84840162000322565b818152928201840192848101908a851115620004b757600080fd5b928501925b84841015620004f157835192506001600160a01b0383168314620004e05760008081fd5b8282529285019290850190620004bc565b8096505050505050509250925092565b634e487b7160e01b600052603260045260246000fd5b60006000198214156200053a57634e487b7160e01b600052601160045260246000fd5b5060010190565b6000602082840312156200055457600080fd5b815180151581146200056557600080fd5b9392505050565b600181811c908216806200058157607f821691505b60208210811415620005a357634e487b7160e01b600052602260045260246000fd5b50919050565b61561980620005b96000396000f3fe608060405234801561001057600080fd5b50600436106102fe5760003560e01c806378677e0e1161019c578063bd85b039116100ee578063e985e9c511610097578063f374511e11610071578063f374511e146106fd578063f5149fe31461071d578063f5298aca1461073057600080fd5b8063e985e9c51461069b578063f242432a146106d7578063f2fde38b146106ea57600080fd5b8063df7317c3116100c8578063df7317c31461065f578063e4b50cb814610672578063e8a3d4851461069357600080fd5b8063bd85b03914610631578063d81d0a1514610644578063d9ce2f6d1461065757600080fd5b806395d89b4111610150578063a2f434651161012a578063a2f43465146105f6578063af1bb0e114610609578063ba8bce551461061e57600080fd5b806395d89b41146105975780639f4a31a8146105d0578063a22cb465146105e357600080fd5b80638d1eb723116101815780638d1eb723146105565780638da5cb5b14610569578063938e3d7b1461058457600080fd5b806378677e0e14610530578063836527be1461054357600080fd5b806336608af8116102555780635fa82826116102095780636ff97f1d116101e35780636ff97f1d14610500578063715018a61461051557806371f1a3a11461051d57600080fd5b80635fa82826146104c757806362abebce146104da5780636b20c454146104ed57600080fd5b806343277ba41161023a57806343277ba41461048c5780634b457935146104945780634e1273f4146104a757600080fd5b806336608af814610466578063379607f51461047957600080fd5b80630e89341c116102b75780631768642211610291578063176864221461042d57806327e6680c146104405780632eb2c2d61461045357600080fd5b80630e89341c146103b6578063150b7a02146103c9578063156e29f61461041a57600080fd5b806302fe5305116102e857806302fe53051461034c57806306fdde03146103615780630c05bf6c146103a357600080fd5b8062fdd58e1461030357806301ffc9a714610329575b600080fd5b610316610311366004614729565b610743565b6040519081526020015b60405180910390f35b61033c61033736600461476b565b6107ec565b6040519015158152602001610320565b61035f61035a366004614846565b610830565b005b60408051808201909152601b81527f47656e6574696320436861696e204d656d626572204c6f756e6765000000000060208201525b60405161032091906148db565b61035f6103b13660046148ee565b6108bd565b6103966103c4366004614935565b6109b0565b6104016103d736600461494e565b7f36b308df0000000000000000000000000000000000000000000000000000000095945050505050565b6040516001600160e01b03199091168152602001610320565b61035f6104283660046149ed565b610a67565b61031661043b366004614a22565b610b3c565b61035f61044e366004614729565b610bcb565b61035f610461366004614ae7565b610f62565b61035f610474366004614bac565b611291565b61035f610487366004614935565b61136e565b61035f611563565b61035f6104a2366004614bd8565b611786565b6104ba6104b5366004614bf5565b61185b565b6040516103209190614cf3565b61035f6104d5366004614bd8565b611999565b61035f6104e8366004614d52565b611a6a565b61035f6104fb366004614d94565b611afa565b610508611bce565b6040516103209190614e17565b61035f611c74565b61031661052b366004614ea9565b611d13565b61035f61053e366004614eee565b611e51565b61035f610551366004614bd8565b611fab565b6104ba610564366004614f11565b612080565b6003546040516001600160a01b039091168152602001610320565b61035f610592366004614846565b612130565b60408051808201909152600481527f47434d4c000000000000000000000000000000000000000000000000000000006020820152610396565b61035f6105de366004614f6a565b61218b565b61035f6105f1366004614fd6565b6123ca565b61035f610604366004615009565b6124b5565b610611612798565b604051610320919061503f565b61035f61062c366004614bd8565b612862565b61031661063f366004614935565b612933565b61035f610652366004614d94565b612985565b610396612a75565b61035f61066d366004615080565b612b03565b610685610680366004614935565b612bc9565b6040516103209291906150a3565b610396612d59565b61033c6106a9366004614ea9565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b61035f6106e5366004615107565b612deb565b61035f6106f8366004614bd8565b613029565b61071061070b366004614bd8565b613156565b6040516103209190615164565b61035f61072b366004614729565b6131e9565b61035f61073e3660046149ed565b6134d6565b60006001600160a01b0383166107c65760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201527f65726f206164647265737300000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b031982167f150b7a0200000000000000000000000000000000000000000000000000000000148061082a575061082a82613581565b92915050565b6003546001600160a01b031633146108785760405162461bcd60e51b815260206004820181905260248201526000805160206155c483398151915260448201526064016107bd565b6108818161361c565b60007f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b826040516108b291906148db565b60405180910390a250565b6003546001600160a01b031633146109055760405162461bcd60e51b815260206004820181905260248201526000805160206155c483398151915260448201526064016107bd565b8161090f8161362f565b61094b5760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b2103a37b5b2b760991b60448201526064016107bd565b6000838152600660209081526040909120835161096a92850190614637565b50827f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b610996856109b0565b6040516109a391906148db565b60405180910390a2505050565b6060816109bc8161362f565b6109f85760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b2103a37b5b2b760991b60448201526064016107bd565b60008381526006602052604090208054610a11906151c7565b159050610a5557610a2183613670565b6000848152600660209081526040918290209151610a41939291016151fc565b604051602081830303815290604052610a5e565b610a5e83613670565b91505b50919050565b3360009081526007602052604090205460ff1680610a8f57506003546001600160a01b031633145b610adb5760405162461bcd60e51b815260206004820152601160248201527f63616c6c6572206e6f74206d696e74657200000000000000000000000000000060448201526064016107bd565b60008111610b1c5760405162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a5908185b5bdd5b9d60921b60448201526064016107bd565b610b3783838360405180602001604052806000815250613704565b505050565b600082610b488161362f565b610b845760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b2103a37b5b2b760991b60448201526064016107bd565b606083901b6bffffffffffffffffffffffff191684176000818152600c602052604090205460ff16610bbf57610bba8486613873565b610bc2565b60005b95945050505050565b6001600160a01b0382166000908152600a602052604090205460ff16610c335760405162461bcd60e51b815260206004820152601460248201527f696e76616c69642070617373206164647265737300000000000000000000000060448201526064016107bd565b6001600160a01b0382166000908152600a602052604081205460098054339360ff90931692919083908110610c6a57610c6a6152d8565b60009182526020808320909101546001600160a01b038681168452600b909252604083205491169250905b81811015610f11576001600160a01b0385166000908152600b60205260408120805483908110610cc757610cc76152d8565b6000918252602090912001805490915060ff8681169116148015610cf457508054610100900461ffff1687145b15610f00576040516323b872dd60e01b81523060048201526001600160a01b038781166024830152604482018990528516906323b872dd90606401600060405180830381600087803b158015610d4957600080fd5b505af1158015610d5d573d6000803e3d6000fd5b505050506000600184610d709190615304565b9050808314610e4f576001600160a01b0387166000908152600b60205260409020805482908110610da357610da36152d8565b90600052602060002001600b6000896001600160a01b03166001600160a01b031681526020019081526020016000208481548110610de357610de36152d8565b6000918252602090912082549101805460ff19811660ff9093169283178255835461ffff61010091829004160262ffffff1990911690921791909117808255915467ffffffffffffffff63010000009182900416026affffffffffffffff000000199092169190911790555b6001600160a01b0387166000908152600b60205260409020805480610e7657610e7661531b565b600082815260209020810160001990810180546affffffffffffffffffffff191690550190556040516001600160a01b038816907fd8654fcc8cf5b36d30b3f5e4688fc78118e6d68de60b9994e09902268b57c3e390610eed908c908c906001600160a01b03929092168252602082015260400190565b60405180910390a2505050505050505050565b50610f0a81615331565b9050610c95565b5060405162461bcd60e51b815260206004820152600e60248201527f70617373206e6f7420666f756e6400000000000000000000000000000000000060448201526064016107bd565b505050505050565b8151835114610fc45760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b60648201526084016107bd565b6001600160a01b0384166110285760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b60648201526084016107bd565b6001600160a01b038516331480611044575061104485336106a9565b6110b65760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f742060448201527f6f776e6572206e6f7220617070726f766564000000000000000000000000000060648201526084016107bd565b3360005b845181101561122b5760008582815181106110d7576110d76152d8565b6020026020010151905060008583815181106110f5576110f56152d8565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156111885760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201526939103a3930b739b332b960b11b60648201526084016107bd565b6111928282615304565b60008085815260200190815260200160002060008c6001600160a01b03166001600160a01b03168152602001908152602001600020819055508160008085815260200190815260200160002060008b6001600160a01b03166001600160a01b031681526020019081526020016000206000828254611210919061534c565b925050819055505050508061122490615331565b90506110ba565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161127b929190615364565b60405180910390a4610f5a818787878787613974565b6003546001600160a01b031633146112d95760405162461bcd60e51b815260206004820181905260248201526000805160206155c483398151915260448201526064016107bd565b816112e38161362f565b61131f5760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b2103a37b5b2b760991b60448201526064016107bd565b8160058481548110611333576113336152d8565b6000918252602090912001805467ffffffffffffffff92909216600160801b0267ffffffffffffffff60801b19909216919091179055505050565b806113788161362f565b6113b45760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b2103a37b5b2b760991b60448201526064016107bd565b336000818152600b60205260409020546114105760405162461bcd60e51b815260206004820152601060248201527f6e6f20706173736573207374616b65640000000000000000000000000000000060448201526064016107bd565b606081901b6bffffffffffffffffffffffff191683176000818152600c602052604090205460ff16156114855760405162461bcd60e51b815260206004820152600f60248201527f7265776172647320636c61696d6564000000000000000000000000000000000060448201526064016107bd565b60006114918386613873565b9050600081116114e35760405162461bcd60e51b815260206004820152600a60248201527f6e6f20726577617264730000000000000000000000000000000000000000000060448201526064016107bd565b6000828152600c60209081526040808320805460ff191660011790558051918201905290815261151890849087908490613704565b60408051868152602081018390526001600160a01b038516917fdacbdde355ba930696a362ea6738feb9f8bd52dfb3d81947558fd3217e23e325910160405180910390a25050505050565b336000818152600b60205260409020546115bf5760405162461bcd60e51b815260206004820152601060248201527f6e6f20706173736573207374616b65640000000000000000000000000000000060448201526064016107bd565b6001600160a01b0381166000908152600b6020526040812054905b81811015611760576001600160a01b0383166000908152600b6020526040812080548390811061160c5761160c6152d8565b600091825260208220018054600980549294509160ff909116908110611634576116346152d8565b60009182526020909120015482546040516323b872dd60e01b81523060048201526001600160a01b03888116602483015261010090920461ffff1660448201529116915081906323b872dd90606401600060405180830381600087803b15801561169d57600080fd5b505af11580156116b1573d6000803e3d6000fd5b50508354604080516001600160a01b03868116825261010090930461ffff16602082015291891693507fd8654fcc8cf5b36d30b3f5e4688fc78118e6d68de60b9994e09902268b57c3e392500160405180910390a26001600160a01b0385166000908152600b60205260409020805484908110611730576117306152d8565b600091825260209091200180546affffffffffffffffffffff1916905550611759905081615331565b90506115da565b506001600160a01b0382166000908152600b60205260408120611782916146bb565b5050565b6003546001600160a01b031633146117ce5760405162461bcd60e51b815260206004820181905260248201526000805160206155c483398151915260448201526064016107bd565b6001600160a01b03811660009081526008602052604090205460ff16156118375760405162461bcd60e51b815260206004820152601a60248201527f6164647265737320616c7265616479207265676973746572656400000000000060448201526064016107bd565b6001600160a01b03166000908152600860205260409020805460ff19166001179055565b606081518351146118d45760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e67746860448201527f206d69736d61746368000000000000000000000000000000000000000000000060648201526084016107bd565b6000835167ffffffffffffffff8111156118f0576118f061478f565b604051908082528060200260200182016040528015611919578160200160208202803683370190505b50905060005b84518110156119915761196485828151811061193d5761193d6152d8565b6020026020010151858381518110611957576119576152d8565b6020026020010151610743565b828281518110611976576119766152d8565b602090810291909101015261198a81615331565b905061191f565b509392505050565b6003546001600160a01b031633146119e15760405162461bcd60e51b815260206004820181905260248201526000805160206155c483398151915260448201526064016107bd565b6001600160a01b03811660009081526007602052604090205460ff16611a495760405162461bcd60e51b815260206004820152601660248201527f61646472657373206e6f7420726567697374657265640000000000000000000060448201526064016107bd565b6001600160a01b03166000908152600760205260409020805460ff19169055565b80611ab75760405162461bcd60e51b815260206004820152600c60248201527f6e6f20746f6b656e20696473000000000000000000000000000000000000000060448201526064016107bd565b8060005b81811015611af457611ae4848483818110611ad857611ad86152d8565b9050602002013561136e565b611aed81615331565b9050611abb565b50505050565b3360009081526008602052604090205460ff16611b595760405162461bcd60e51b815260206004820152601160248201527f63616c6c6572206e6f74206275726e657200000000000000000000000000000060448201526064016107bd565b611bc78585858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808902828101820190935288825290935088925087918291850190849080828437600092019190915250613b2992505050565b5050505050565b60606005805480602002602001604051908101604052809291908181526020016000905b82821015611c6b5760008481526020908190206040805160a0810182529185015461ffff8116835266ffffffffffffff620100008204811684860152600160481b82041691830191909152600160801b8104600790810b6060840152600160c01b909104900b6080820152825260019092019101611bf2565b50505050905090565b6003546001600160a01b03163314611cbc5760405162461bcd60e51b815260206004820181905260248201526000805160206155c483398151915260448201526064016107bd565b6003546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a36003805473ffffffffffffffffffffffffffffffffffffffff19169055565b6001600160a01b0382166000908152600a602052604081205460ff16611d7b5760405162461bcd60e51b815260206004820152601460248201527f696e76616c69642070617373206164647265737300000000000000000000000060448201526064016107bd565b6001600160a01b0383166000908152600a60205260408120546009805460ff909216929183908110611daf57611daf6152d8565b6000918252602090912001546040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b038681166004830152909116915081906370a082319060240160206040518083038186803b158015611e1957600080fd5b505afa158015611e2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bc29190615389565b6003546001600160a01b03163314611e995760405162461bcd60e51b815260206004820181905260248201526000805160206155c483398151915260448201526064016107bd565b81611ea38161362f565b611edf5760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b2103a37b5b2b760991b60448201526064016107bd565b60058381548110611ef257611ef26152d8565b60009182526020909120015466ffffffffffffff600160481b90910481169083161015611f615760405162461bcd60e51b815260206004820152601560248201527f6d6178206d7573742065786365656420746f74616c000000000000000000000060448201526064016107bd565b8160058481548110611f7557611f756152d8565b9060005260206000200160000160026101000a81548166ffffffffffffff021916908366ffffffffffffff160217905550505050565b6003546001600160a01b03163314611ff35760405162461bcd60e51b815260206004820181905260248201526000805160206155c483398151915260448201526064016107bd565b6001600160a01b03811660009081526007602052604090205460ff161561205c5760405162461bcd60e51b815260206004820152601a60248201527f6164647265737320616c7265616479207265676973746572656400000000000060448201526064016107bd565b6001600160a01b03166000908152600760205260409020805460ff19166001179055565b815160609060008167ffffffffffffffff8111156120a0576120a061478f565b6040519080825280602002602001820160405280156120c9578160200160208202803683370190505b50905060005b82811015612127576120fa8682815181106120ec576120ec6152d8565b602002602001015186610b3c565b82828151811061210c5761210c6152d8565b602090810291909101015261212081615331565b90506120cf565b50949350505050565b6003546001600160a01b031633146121785760405162461bcd60e51b815260206004820181905260248201526000805160206155c483398151915260448201526064016107bd565b8051611782906004906020840190614637565b6003546001600160a01b031633146121d35760405162461bcd60e51b815260206004820181905260248201526000805160206155c483398151915260448201526064016107bd565b846121dd8161362f565b6122195760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b2103a37b5b2b760991b60448201526064016107bd565b6005868154811061222c5761222c6152d8565b60009182526020909120015466ffffffffffffff600160481b9091048116908516101561229b5760405162461bcd60e51b815260206004820152601560248201527f6d6178206d7573742065786365656420746f74616c000000000000000000000060448201526064016107bd565b84600587815481106122af576122af6152d8565b9060005260206000200160000160006101000a81548161ffff021916908361ffff16021790555083600587815481106122ea576122ea6152d8565b9060005260206000200160000160026101000a81548166ffffffffffffff021916908366ffffffffffffff160217905550826005878154811061232f5761232f6152d8565b60009182526020808320909101805467ffffffffffffffff94909416600160801b0267ffffffffffffffff60801b19909416939093179092558781526006825260409020835161238192850190614637565b50857f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b6123ad886109b0565b6040516123ba91906148db565b60405180910390a2505050505050565b336001600160a01b03831614156124495760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c2073746174757360448201527f20666f722073656c66000000000000000000000000000000000000000000000060648201526084016107bd565b3360008181526001602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6003546001600160a01b031633146124fd5760405162461bcd60e51b815260206004820181905260248201526000805160206155c483398151915260448201526064016107bd565b6000841161253e5760405162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a5908185b5bdd5b9d60921b60448201526064016107bd565b600081511161258f5760405162461bcd60e51b815260206004820152601060248201527f696e76616c69642069706673686173680000000000000000000000000000000060448201526064016107bd565b600580546040805160a08101825261ffff808a16825266ffffffffffffff8089166020808501918252600085870181815260078c810b60608901908152429182900b60808a0190815260018c018d559b845288517f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db08c0180549751945192519d5167ffffffffffffffff908116600160c01b0277ffffffffffffffffffffffffffffffffffffffffffffffff91909f16600160801b0267ffffffffffffffff60801b19948b16600160481b02949094167fffffffffffffffff000000000000000000000000000000ffffffffffffffffff96909a16620100000268ffffffffffffffffff1990991692909a169190911796909617929092169590951717949094169790971790558482526006865292902085519394929391926126d59290870190614637565b50827f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b612701856109b0565b60405161270e91906148db565b60405180910390a261273133848960405180602001604052806000815250613704565b6040805184815261ffff8a16602082015266ffffffffffffff881681830152600787810b606083015284900b608082015290517f56b8c632f24b2e1ff86b679e5440f331423d390a41a3e0eccd74274e139a77fa9181900360a00190a15050505050505050565b60095460609060008167ffffffffffffffff8111156127b9576127b961478f565b6040519080825280602002602001820160405280156127e2578160200160208202803683370190505b50905060005b8281101561285b5760098181548110612803576128036152d8565b9060005260206000200160009054906101000a90046001600160a01b0316828281518110612833576128336152d8565b6001600160a01b039092166020928302919091019091015261285481615331565b90506127e8565b5092915050565b6003546001600160a01b031633146128aa5760405162461bcd60e51b815260206004820181905260248201526000805160206155c483398151915260448201526064016107bd565b6001600160a01b03811660009081526008602052604090205460ff166129125760405162461bcd60e51b815260206004820152601660248201527f61646472657373206e6f7420726567697374657265640000000000000000000060448201526064016107bd565b6001600160a01b03166000908152600860205260409020805460ff19169055565b6005546000908210612946576000612976565b60058281548110612959576129596152d8565b600091825260209091200154600160481b900466ffffffffffffff165b66ffffffffffffff1692915050565b3360009081526007602052604090205460ff16806129ad57506003546001600160a01b031633145b6129f95760405162461bcd60e51b815260206004820152601160248201527f63616c6c6572206e6f74206d696e74657200000000000000000000000000000060448201526064016107bd565b611bc78585858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808902828101820190935288825290935088925087918291850190849080828437600092018290525060408051602081019091529081529250613bd6915050565b60048054612a82906151c7565b80601f0160208091040260200160405190810160405280929190818152602001828054612aae906151c7565b8015612afb5780601f10612ad057610100808354040283529160200191612afb565b820191906000526020600020905b815481529060010190602001808311612ade57829003601f168201915b505050505081565b6003546001600160a01b03163314612b4b5760405162461bcd60e51b815260206004820181905260248201526000805160206155c483398151915260448201526064016107bd565b81612b558161362f565b612b915760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b2103a37b5b2b760991b60448201526064016107bd565b8160058481548110612ba557612ba56152d8565b6000918252602090912001805461ffff191661ffff92909216919091179055505050565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152606082612c008161362f565b612c3c5760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b2103a37b5b2b760991b60448201526064016107bd565b60058481548110612c4f57612c4f6152d8565b6000918252602080832087845260068252604093849020845160a081018652919093015461ffff8116825266ffffffffffffff620100008204811693830193909352600160481b810490921693810193909352600160801b8104600790810b6060850152600160c01b909104900b608083015280548190612ccf906151c7565b80601f0160208091040260200160405190810160405280929190818152602001828054612cfb906151c7565b8015612d485780601f10612d1d57610100808354040283529160200191612d48565b820191906000526020600020905b815481529060010190602001808311612d2b57829003601f168201915b505050505090509250925050915091565b606060048054612d68906151c7565b80601f0160208091040260200160405190810160405280929190818152602001828054612d94906151c7565b8015612de15780601f10612db657610100808354040283529160200191612de1565b820191906000526020600020905b815481529060010190602001808311612dc457829003601f168201915b5050505050905090565b6001600160a01b038416612e4f5760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b60648201526084016107bd565b6001600160a01b038516331480612e6b5750612e6b85336106a9565b612edd5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201527f20617070726f766564000000000000000000000000000000000000000000000060648201526084016107bd565b33612ef6818787612eed88613d83565b611bc788613d83565b6000848152602081815260408083206001600160a01b038a16845290915290205483811015612f7a5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201526939103a3930b739b332b960b11b60648201526084016107bd565b612f848482615304565b6000868152602081815260408083206001600160a01b038c81168552925280832093909355881681529081208054869290612fc090849061534c565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4613020828888888888613dce565b50505050505050565b6003546001600160a01b031633146130715760405162461bcd60e51b815260206004820181905260248201526000805160206155c483398151915260448201526064016107bd565b6001600160a01b0381166130ed5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016107bd565b6003546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a36003805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6001600160a01b0381166000908152600b60209081526040808320805482518185028101850190935280835260609492939192909184015b828210156131de576000848152602090819020604080516060810182529185015460ff8116835261ffff610100820416838501526301000000900460070b9082015282526001909201910161318e565b505050509050919050565b6001600160a01b0382166000908152600a602052604090205460ff166132515760405162461bcd60e51b815260206004820152601460248201527f696e76616c69642070617373206164647265737300000000000000000000000060448201526064016107bd565b6001600160a01b0382166000908152600a602052604081205460098054339360ff90931692919083908110613288576132886152d8565b6000918252602090912001546040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018690526001600160a01b039182169250908416908290636352211e9060240160206040518083038186803b1580156132f557600080fd5b505afa158015613309573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061332d91906153a2565b6001600160a01b0316146133835760405162461bcd60e51b815260206004820152600e60248201527f6e6f742070617373206f776e657200000000000000000000000000000000000060448201526064016107bd565b6040516323b872dd60e01b81526001600160a01b038481166004830152306024830152604482018690528216906323b872dd90606401600060405180830381600087803b1580156133d357600080fd5b505af11580156133e7573d6000803e3d6000fd5b5050604080516060808201835260ff878116835261ffff8a8116602080860191825242600781900b8789018181526001600160a01b038f81166000818152600b87528c81208054600181018255908252908790208c51910180549851945167ffffffffffffffff166301000000026affffffffffffffff0000001995909a166101000262ffffff1990991691909a16179690961791909116959095179095558751938f1684529083018d90529582019290925293955091935090917ff7ebc54823f2cdb7ca0acdfbfd855d00ac987f8b7cb4deb30652b4787cbc7466910160405180910390a250505050505050565b3360009081526008602052604090205460ff166135355760405162461bcd60e51b815260206004820152601160248201527f63616c6c6572206e6f74206275726e657200000000000000000000000000000060448201526064016107bd565b600081116135765760405162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a5908185b5bdd5b9d60921b60448201526064016107bd565b610b37838383613ed9565b60006001600160e01b031982167fd9b67a260000000000000000000000000000000000000000000000000000000014806135e457506001600160e01b031982167f0e89341c00000000000000000000000000000000000000000000000000000000145b8061082a57507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b031983161461082a565b8051611782906002906020840190614637565b6005546000908210801561082a5750600060058381548110613653576136536152d8565b600091825260209091200154600160c01b900460070b1392915050565b60606002805461367f906151c7565b80601f01602080910402602001604051908101604052809291908181526020018280546136ab906151c7565b80156136f85780601f106136cd576101008083540402835291602001916136f8565b820191906000526020600020905b8154815290600101906020018083116136db57829003601f168201915b50505050509050919050565b8261370e8161362f565b61374a5760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b2103a37b5b2b760991b60448201526064016107bd565b61375685858585613f86565b826005858154811061376a5761376a6152d8565b60009182526020909120018054600990613795908490600160481b900466ffffffffffffff166153bf565b92506101000a81548166ffffffffffffff021916908366ffffffffffffff160217905550600584815481106137cc576137cc6152d8565b9060005260206000200160000160029054906101000a900466ffffffffffffff1666ffffffffffffff1660058581548110613809576138096152d8565b600091825260209091200154600160481b900466ffffffffffffff161115611bc75760405162461bcd60e51b815260206004820152601760248201527f616d6f756e7420657863656564206d6178737570706c7900000000000000000060448201526064016107bd565b60008060058381548110613889576138896152d8565b600091825260208083206001600160a01b0388168452600b909152604083205491019250905b8181101561396b576001600160a01b0386166000908152600b602052604081208054839081106138e1576138e16152d8565b6000918252602082200180548654919350613912916301000000909104600790810b91600160c01b9004900b6153ea565b8554909150600160801b9004600790810b9082900b128015906139455750815485546139459160ff169061ffff16614087565b156139585761395560018761534c565b95505b50508061396490615331565b90506138af565b50505092915050565b6001600160a01b0384163b15610f5a5760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906139b8908990899088908890889060040161543c565b602060405180830381600087803b1580156139d257600080fd5b505af1925050508015613a02575060408051601f3d908101601f191682019092526139ff9181019061549a565b60015b613ab857613a0e6154b7565b806308c379a01415613a485750613a236154d3565b80613a2e5750613a4a565b8060405162461bcd60e51b81526004016107bd91906148db565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e204552433131353560448201527f526563656976657220696d706c656d656e74657200000000000000000000000060648201526084016107bd565b6001600160e01b0319811663bc197c8160e01b146130205760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a656374656044820152676420746f6b656e7360c01b60648201526084016107bd565b613b348383836140ad565b60005b8251811015611af4576000838281518110613b5457613b546152d8565b60200260200101519050828281518110613b7057613b706152d8565b602002602001015160058281548110613b8b57613b8b6152d8565b6000918252602090912001805466ffffffffffffff600160481b808304821694909403169092026fffffffffffffff0000000000000000001990921691909117905550600101613b37565b613be2848484846142ef565b60005b8351811015611bc7576000848281518110613c0257613c026152d8565b60200260200101519050613c158161362f565b613c515760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b2103a37b5b2b760991b60448201526064016107bd565b838281518110613c6357613c636152d8565b602002602001015160058281548110613c7e57613c7e6152d8565b6000918252602090912001805466ffffffffffffff600160481b8083048216909401169092026fffffffffffffff000000000000000000199092169190911790556005805482908110613cd357613cd36152d8565b9060005260206000200160000160029054906101000a900466ffffffffffffff1666ffffffffffffff1660058281548110613d1057613d106152d8565b600091825260209091200154600160481b900466ffffffffffffff161115613d7a5760405162461bcd60e51b815260206004820152601760248201527f616d6f756e7420657863656564206d6178737570706c7900000000000000000060448201526064016107bd565b50600101613be5565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110613dbd57613dbd6152d8565b602090810291909101015292915050565b6001600160a01b0384163b15610f5a5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190613e12908990899088908890889060040161555d565b602060405180830381600087803b158015613e2c57600080fd5b505af1925050508015613e5c575060408051601f3d908101601f19168201909252613e599181019061549a565b60015b613e6857613a0e6154b7565b6001600160e01b0319811663f23a6e6160e01b146130205760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a656374656044820152676420746f6b656e7360c01b60648201526084016107bd565b81613ee38161362f565b613f1f5760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b2103a37b5b2b760991b60448201526064016107bd565b613f2a8484846144b5565b8160058481548110613f3e57613f3e6152d8565b6000918252602090912001805466ffffffffffffff600160481b808304821694909403169092026fffffffffffffff0000000000000000001990921691909117905550505050565b6001600160a01b038416613fe65760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016107bd565b33613ff781600087612eed88613d83565b6000848152602081815260408083206001600160a01b03891684529091528120805485929061402790849061534c565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611bc781600087878787613dce565b60006140946001846155a0565b60ff166001901b821661ffff1660001415905092915050565b6001600160a01b03831661410f5760405162461bcd60e51b815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201526265737360e81b60648201526084016107bd565b80518251146141715760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b60648201526084016107bd565b604080516020810190915260009081905233905b83518110156142905760008482815181106141a2576141a26152d8565b6020026020010151905060008483815181106141c0576141c06152d8565b602090810291909101810151600084815280835260408082206001600160a01b038c16835290935291909120549091508181101561424c5760405162461bcd60e51b8152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604482015263616e636560e01b60648201526084016107bd565b6142568282615304565b6000938452602084815260408086206001600160a01b038c168752909152909320929092555081905061428881615331565b915050614185565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb86866040516142e1929190615364565b60405180910390a450505050565b6001600160a01b03841661434f5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016107bd565b81518351146143b15760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b60648201526084016107bd565b3360005b845181101561444d578381815181106143d0576143d06152d8565b60200260200101516000808784815181106143ed576143ed6152d8565b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b031681526020019081526020016000206000828254614435919061534c565b9091555081905061444581615331565b9150506143b5565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161449e929190615364565b60405180910390a4611bc781600087878787613974565b6001600160a01b0383166145175760405162461bcd60e51b815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201526265737360e81b60648201526084016107bd565b336145478185600061452887613d83565b61453187613d83565b5050604080516020810190915260009052505050565b6000838152602081815260408083206001600160a01b0388168452909152902054828110156145c45760405162461bcd60e51b8152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604482015263616e636560e01b60648201526084016107bd565b6145ce8382615304565b6000858152602081815260408083206001600160a01b038a811680865291845282852095909555815189815292830188905292938616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b828054614643906151c7565b90600052602060002090601f01602090048101928261466557600085556146ab565b82601f1061467e57805160ff19168380011785556146ab565b828001600101855582156146ab579182015b828111156146ab578251825591602001919060010190614690565b506146b79291506146dc565b5090565b50805460008255906000526020600020908101906146d991906146f1565b50565b5b808211156146b757600081556001016146dd565b5b808211156146b75780546affffffffffffffffffffff191681556001016146f2565b6001600160a01b03811681146146d957600080fd5b6000806040838503121561473c57600080fd5b823561474781614714565b946020939093013593505050565b6001600160e01b0319811681146146d957600080fd5b60006020828403121561477d57600080fd5b813561478881614755565b9392505050565b634e487b7160e01b600052604160045260246000fd5b601f8201601f1916810167ffffffffffffffff811182821017156147cb576147cb61478f565b6040525050565b600082601f8301126147e357600080fd5b813567ffffffffffffffff8111156147fd576147fd61478f565b604051614814601f8301601f1916602001826147a5565b81815284602083860101111561482957600080fd5b816020850160208301376000918101602001919091529392505050565b60006020828403121561485857600080fd5b813567ffffffffffffffff81111561486f57600080fd5b61487b848285016147d2565b949350505050565b60005b8381101561489e578181015183820152602001614886565b83811115611af45750506000910152565b600081518084526148c7816020860160208601614883565b601f01601f19169290920160200192915050565b60208152600061478860208301846148af565b6000806040838503121561490157600080fd5b82359150602083013567ffffffffffffffff81111561491f57600080fd5b61492b858286016147d2565b9150509250929050565b60006020828403121561494757600080fd5b5035919050565b60008060008060006080868803121561496657600080fd5b853561497181614714565b9450602086013561498181614714565b935060408601359250606086013567ffffffffffffffff808211156149a557600080fd5b818801915088601f8301126149b957600080fd5b8135818111156149c857600080fd5b8960208285010111156149da57600080fd5b9699959850939650602001949392505050565b600080600060608486031215614a0257600080fd5b8335614a0d81614714565b95602085013595506040909401359392505050565b60008060408385031215614a3557600080fd5b823591506020830135614a4781614714565b809150509250929050565b600067ffffffffffffffff821115614a6c57614a6c61478f565b5060051b60200190565b600082601f830112614a8757600080fd5b81356020614a9482614a52565b604051614aa182826147a5565b83815260059390931b8501820192828101915086841115614ac157600080fd5b8286015b84811015614adc5780358352918301918301614ac5565b509695505050505050565b600080600080600060a08688031215614aff57600080fd5b8535614b0a81614714565b94506020860135614b1a81614714565b9350604086013567ffffffffffffffff80821115614b3757600080fd5b614b4389838a01614a76565b94506060880135915080821115614b5957600080fd5b614b6589838a01614a76565b93506080880135915080821115614b7b57600080fd5b50614b88888289016147d2565b9150509295509295909350565b8035600781900b8114614ba757600080fd5b919050565b60008060408385031215614bbf57600080fd5b82359150614bcf60208401614b95565b90509250929050565b600060208284031215614bea57600080fd5b813561478881614714565b60008060408385031215614c0857600080fd5b823567ffffffffffffffff80821115614c2057600080fd5b818501915085601f830112614c3457600080fd5b81356020614c4182614a52565b604051614c4e82826147a5565b83815260059390931b8501820192828101915089841115614c6e57600080fd5b948201945b83861015614c95578535614c8681614714565b82529482019490820190614c73565b96505086013592505080821115614cab57600080fd5b5061492b85828601614a76565b600081518084526020808501945080840160005b83811015614ce857815187529582019590820190600101614ccc565b509495945050505050565b6020815260006147886020830184614cb8565b60008083601f840112614d1857600080fd5b50813567ffffffffffffffff811115614d3057600080fd5b6020830191508360208260051b8501011115614d4b57600080fd5b9250929050565b60008060208385031215614d6557600080fd5b823567ffffffffffffffff811115614d7c57600080fd5b614d8885828601614d06565b90969095509350505050565b600080600080600060608688031215614dac57600080fd5b8535614db781614714565b9450602086013567ffffffffffffffff80821115614dd457600080fd5b614de089838a01614d06565b90965094506040880135915080821115614df957600080fd5b50614e0688828901614d06565b969995985093965092949392505050565b6020808252825182820181905260009190848201906040850190845b81811015614e9d57614e8a83855161ffff8151168252602081015166ffffffffffffff80821660208501528060408401511660408501525050606081015160070b6060830152608081015160070b60808301525050565b9284019260a09290920191600101614e33565b50909695505050505050565b60008060408385031215614ebc57600080fd5b8235614ec781614714565b91506020830135614a4781614714565b803566ffffffffffffff81168114614ba757600080fd5b60008060408385031215614f0157600080fd5b82359150614bcf60208401614ed7565b60008060408385031215614f2457600080fd5b823567ffffffffffffffff811115614f3b57600080fd5b614f4785828601614a76565b9250506020830135614a4781614714565b803561ffff81168114614ba757600080fd5b600080600080600060a08688031215614f8257600080fd5b85359450614f9260208701614f58565b9350614fa060408701614ed7565b9250614fae60608701614b95565b9150608086013567ffffffffffffffff811115614fca57600080fd5b614b88888289016147d2565b60008060408385031215614fe957600080fd5b8235614ff481614714565b915060208301358015158114614a4757600080fd5b600080600080600060a0868803121561502157600080fd5b61502a86614f58565b945060208601359350614fa060408701614ed7565b6020808252825182820181905260009190848201906040850190845b81811015614e9d5783516001600160a01b03168352928401929184019160010161505b565b6000806040838503121561509357600080fd5b82359150614bcf60208401614f58565b6150f1818461ffff8151168252602081015166ffffffffffffff80821660208501528060408401511660408501525050606081015160070b6060830152608081015160070b60808301525050565b60c060a0820152600061487b60c08301846148af565b600080600080600060a0868803121561511f57600080fd5b853561512a81614714565b9450602086013561513a81614714565b93506040860135925060608601359150608086013567ffffffffffffffff811115614fca57600080fd5b602080825282518282018190526000919060409081850190868401855b828110156151ba578151805160ff1685528681015161ffff168786015285015160070b8585015260609093019290850190600101615181565b5091979650505050505050565b600181811c908216806151db57607f821691505b60208210811415610a6157634e487b7160e01b600052602260045260246000fd5b60008351602061520f8285838901614883565b7f2f00000000000000000000000000000000000000000000000000000000000000918401918252845460019060009080831c8184168061525057607f821691505b85821081141561526e57634e487b7160e01b84526022600452602484fd5b8080156152825760018114615297576152c8565b60ff19841688870152828801860194506152c8565b60008b81526020902060005b848110156152be5781548a82018901529087019088016152a3565b5050858389010194505b50929a9950505050505050505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082821015615316576153166152ee565b500390565b634e487b7160e01b600052603160045260246000fd5b6000600019821415615345576153456152ee565b5060010190565b6000821982111561535f5761535f6152ee565b500190565b6040815260006153776040830185614cb8565b8281036020840152610bc28185614cb8565b60006020828403121561539b57600080fd5b5051919050565b6000602082840312156153b457600080fd5b815161478881614714565b600066ffffffffffffff8083168185168083038211156153e1576153e16152ee565b01949350505050565b60008160070b8360070b6000811281677fffffffffffffff1901831281151615615416576154166152ee565b81677fffffffffffffff018313811615615432576154326152ee565b5090039392505050565b60006001600160a01b03808816835280871660208401525060a0604083015261546860a0830186614cb8565b828103606084015261547a8186614cb8565b9050828103608084015261548e81856148af565b98975050505050505050565b6000602082840312156154ac57600080fd5b815161478881614755565b600060033d11156154d05760046000803e5060005160e01c5b90565b600060443d10156154e15790565b6040516003193d81016004833e81513d67ffffffffffffffff816024840111818411171561551157505050505090565b82850191508151818111156155295750505050505090565b843d87010160208285010111156155435750505050505090565b615552602082860101876147a5565b509095945050505050565b60006001600160a01b03808816835280871660208401525084604083015283606083015260a0608083015261559560a08301846148af565b979650505050505050565b600060ff821660ff8416808210156155ba576155ba6152ee565b9003939250505056fe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a2646970667358221220de153d1b9d58481444bcb4b510590340bf20dbad71cf038a4dec996c49639ced64736f6c63430008090033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000002168747470733a2f2f697066732e67656e65746963636861696e2e696f2f6970667300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005068747470733a2f2f697066732e67656e65746963636861696e2e696f2f697066732f516d526544645155797a54784b6350564b4c6f3961315a715742705048475878473535736169706b5258426f4553000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005000000000000000000000000e6c5bc36214d9a09b208f397fe47bd421a5e02d9000000000000000000000000321b125cf85b0e9fbcf6554a71adb10d8138388a000000000000000000000000f91180a67a2c607523b5e32f98732d8cddd6538a000000000000000000000000a9833d5d3ff75a32709a8da2e66a7df9d2c83aa00000000000000000000000001bc2f28fb7e3be8b5905541a90e4312a9976ace1
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102fe5760003560e01c806378677e0e1161019c578063bd85b039116100ee578063e985e9c511610097578063f374511e11610071578063f374511e146106fd578063f5149fe31461071d578063f5298aca1461073057600080fd5b8063e985e9c51461069b578063f242432a146106d7578063f2fde38b146106ea57600080fd5b8063df7317c3116100c8578063df7317c31461065f578063e4b50cb814610672578063e8a3d4851461069357600080fd5b8063bd85b03914610631578063d81d0a1514610644578063d9ce2f6d1461065757600080fd5b806395d89b4111610150578063a2f434651161012a578063a2f43465146105f6578063af1bb0e114610609578063ba8bce551461061e57600080fd5b806395d89b41146105975780639f4a31a8146105d0578063a22cb465146105e357600080fd5b80638d1eb723116101815780638d1eb723146105565780638da5cb5b14610569578063938e3d7b1461058457600080fd5b806378677e0e14610530578063836527be1461054357600080fd5b806336608af8116102555780635fa82826116102095780636ff97f1d116101e35780636ff97f1d14610500578063715018a61461051557806371f1a3a11461051d57600080fd5b80635fa82826146104c757806362abebce146104da5780636b20c454146104ed57600080fd5b806343277ba41161023a57806343277ba41461048c5780634b457935146104945780634e1273f4146104a757600080fd5b806336608af814610466578063379607f51461047957600080fd5b80630e89341c116102b75780631768642211610291578063176864221461042d57806327e6680c146104405780632eb2c2d61461045357600080fd5b80630e89341c146103b6578063150b7a02146103c9578063156e29f61461041a57600080fd5b806302fe5305116102e857806302fe53051461034c57806306fdde03146103615780630c05bf6c146103a357600080fd5b8062fdd58e1461030357806301ffc9a714610329575b600080fd5b610316610311366004614729565b610743565b6040519081526020015b60405180910390f35b61033c61033736600461476b565b6107ec565b6040519015158152602001610320565b61035f61035a366004614846565b610830565b005b60408051808201909152601b81527f47656e6574696320436861696e204d656d626572204c6f756e6765000000000060208201525b60405161032091906148db565b61035f6103b13660046148ee565b6108bd565b6103966103c4366004614935565b6109b0565b6104016103d736600461494e565b7f36b308df0000000000000000000000000000000000000000000000000000000095945050505050565b6040516001600160e01b03199091168152602001610320565b61035f6104283660046149ed565b610a67565b61031661043b366004614a22565b610b3c565b61035f61044e366004614729565b610bcb565b61035f610461366004614ae7565b610f62565b61035f610474366004614bac565b611291565b61035f610487366004614935565b61136e565b61035f611563565b61035f6104a2366004614bd8565b611786565b6104ba6104b5366004614bf5565b61185b565b6040516103209190614cf3565b61035f6104d5366004614bd8565b611999565b61035f6104e8366004614d52565b611a6a565b61035f6104fb366004614d94565b611afa565b610508611bce565b6040516103209190614e17565b61035f611c74565b61031661052b366004614ea9565b611d13565b61035f61053e366004614eee565b611e51565b61035f610551366004614bd8565b611fab565b6104ba610564366004614f11565b612080565b6003546040516001600160a01b039091168152602001610320565b61035f610592366004614846565b612130565b60408051808201909152600481527f47434d4c000000000000000000000000000000000000000000000000000000006020820152610396565b61035f6105de366004614f6a565b61218b565b61035f6105f1366004614fd6565b6123ca565b61035f610604366004615009565b6124b5565b610611612798565b604051610320919061503f565b61035f61062c366004614bd8565b612862565b61031661063f366004614935565b612933565b61035f610652366004614d94565b612985565b610396612a75565b61035f61066d366004615080565b612b03565b610685610680366004614935565b612bc9565b6040516103209291906150a3565b610396612d59565b61033c6106a9366004614ea9565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b61035f6106e5366004615107565b612deb565b61035f6106f8366004614bd8565b613029565b61071061070b366004614bd8565b613156565b6040516103209190615164565b61035f61072b366004614729565b6131e9565b61035f61073e3660046149ed565b6134d6565b60006001600160a01b0383166107c65760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201527f65726f206164647265737300000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b031982167f150b7a0200000000000000000000000000000000000000000000000000000000148061082a575061082a82613581565b92915050565b6003546001600160a01b031633146108785760405162461bcd60e51b815260206004820181905260248201526000805160206155c483398151915260448201526064016107bd565b6108818161361c565b60007f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b826040516108b291906148db565b60405180910390a250565b6003546001600160a01b031633146109055760405162461bcd60e51b815260206004820181905260248201526000805160206155c483398151915260448201526064016107bd565b8161090f8161362f565b61094b5760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b2103a37b5b2b760991b60448201526064016107bd565b6000838152600660209081526040909120835161096a92850190614637565b50827f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b610996856109b0565b6040516109a391906148db565b60405180910390a2505050565b6060816109bc8161362f565b6109f85760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b2103a37b5b2b760991b60448201526064016107bd565b60008381526006602052604090208054610a11906151c7565b159050610a5557610a2183613670565b6000848152600660209081526040918290209151610a41939291016151fc565b604051602081830303815290604052610a5e565b610a5e83613670565b91505b50919050565b3360009081526007602052604090205460ff1680610a8f57506003546001600160a01b031633145b610adb5760405162461bcd60e51b815260206004820152601160248201527f63616c6c6572206e6f74206d696e74657200000000000000000000000000000060448201526064016107bd565b60008111610b1c5760405162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a5908185b5bdd5b9d60921b60448201526064016107bd565b610b3783838360405180602001604052806000815250613704565b505050565b600082610b488161362f565b610b845760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b2103a37b5b2b760991b60448201526064016107bd565b606083901b6bffffffffffffffffffffffff191684176000818152600c602052604090205460ff16610bbf57610bba8486613873565b610bc2565b60005b95945050505050565b6001600160a01b0382166000908152600a602052604090205460ff16610c335760405162461bcd60e51b815260206004820152601460248201527f696e76616c69642070617373206164647265737300000000000000000000000060448201526064016107bd565b6001600160a01b0382166000908152600a602052604081205460098054339360ff90931692919083908110610c6a57610c6a6152d8565b60009182526020808320909101546001600160a01b038681168452600b909252604083205491169250905b81811015610f11576001600160a01b0385166000908152600b60205260408120805483908110610cc757610cc76152d8565b6000918252602090912001805490915060ff8681169116148015610cf457508054610100900461ffff1687145b15610f00576040516323b872dd60e01b81523060048201526001600160a01b038781166024830152604482018990528516906323b872dd90606401600060405180830381600087803b158015610d4957600080fd5b505af1158015610d5d573d6000803e3d6000fd5b505050506000600184610d709190615304565b9050808314610e4f576001600160a01b0387166000908152600b60205260409020805482908110610da357610da36152d8565b90600052602060002001600b6000896001600160a01b03166001600160a01b031681526020019081526020016000208481548110610de357610de36152d8565b6000918252602090912082549101805460ff19811660ff9093169283178255835461ffff61010091829004160262ffffff1990911690921791909117808255915467ffffffffffffffff63010000009182900416026affffffffffffffff000000199092169190911790555b6001600160a01b0387166000908152600b60205260409020805480610e7657610e7661531b565b600082815260209020810160001990810180546affffffffffffffffffffff191690550190556040516001600160a01b038816907fd8654fcc8cf5b36d30b3f5e4688fc78118e6d68de60b9994e09902268b57c3e390610eed908c908c906001600160a01b03929092168252602082015260400190565b60405180910390a2505050505050505050565b50610f0a81615331565b9050610c95565b5060405162461bcd60e51b815260206004820152600e60248201527f70617373206e6f7420666f756e6400000000000000000000000000000000000060448201526064016107bd565b505050505050565b8151835114610fc45760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b60648201526084016107bd565b6001600160a01b0384166110285760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b60648201526084016107bd565b6001600160a01b038516331480611044575061104485336106a9565b6110b65760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f742060448201527f6f776e6572206e6f7220617070726f766564000000000000000000000000000060648201526084016107bd565b3360005b845181101561122b5760008582815181106110d7576110d76152d8565b6020026020010151905060008583815181106110f5576110f56152d8565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156111885760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201526939103a3930b739b332b960b11b60648201526084016107bd565b6111928282615304565b60008085815260200190815260200160002060008c6001600160a01b03166001600160a01b03168152602001908152602001600020819055508160008085815260200190815260200160002060008b6001600160a01b03166001600160a01b031681526020019081526020016000206000828254611210919061534c565b925050819055505050508061122490615331565b90506110ba565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161127b929190615364565b60405180910390a4610f5a818787878787613974565b6003546001600160a01b031633146112d95760405162461bcd60e51b815260206004820181905260248201526000805160206155c483398151915260448201526064016107bd565b816112e38161362f565b61131f5760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b2103a37b5b2b760991b60448201526064016107bd565b8160058481548110611333576113336152d8565b6000918252602090912001805467ffffffffffffffff92909216600160801b0267ffffffffffffffff60801b19909216919091179055505050565b806113788161362f565b6113b45760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b2103a37b5b2b760991b60448201526064016107bd565b336000818152600b60205260409020546114105760405162461bcd60e51b815260206004820152601060248201527f6e6f20706173736573207374616b65640000000000000000000000000000000060448201526064016107bd565b606081901b6bffffffffffffffffffffffff191683176000818152600c602052604090205460ff16156114855760405162461bcd60e51b815260206004820152600f60248201527f7265776172647320636c61696d6564000000000000000000000000000000000060448201526064016107bd565b60006114918386613873565b9050600081116114e35760405162461bcd60e51b815260206004820152600a60248201527f6e6f20726577617264730000000000000000000000000000000000000000000060448201526064016107bd565b6000828152600c60209081526040808320805460ff191660011790558051918201905290815261151890849087908490613704565b60408051868152602081018390526001600160a01b038516917fdacbdde355ba930696a362ea6738feb9f8bd52dfb3d81947558fd3217e23e325910160405180910390a25050505050565b336000818152600b60205260409020546115bf5760405162461bcd60e51b815260206004820152601060248201527f6e6f20706173736573207374616b65640000000000000000000000000000000060448201526064016107bd565b6001600160a01b0381166000908152600b6020526040812054905b81811015611760576001600160a01b0383166000908152600b6020526040812080548390811061160c5761160c6152d8565b600091825260208220018054600980549294509160ff909116908110611634576116346152d8565b60009182526020909120015482546040516323b872dd60e01b81523060048201526001600160a01b03888116602483015261010090920461ffff1660448201529116915081906323b872dd90606401600060405180830381600087803b15801561169d57600080fd5b505af11580156116b1573d6000803e3d6000fd5b50508354604080516001600160a01b03868116825261010090930461ffff16602082015291891693507fd8654fcc8cf5b36d30b3f5e4688fc78118e6d68de60b9994e09902268b57c3e392500160405180910390a26001600160a01b0385166000908152600b60205260409020805484908110611730576117306152d8565b600091825260209091200180546affffffffffffffffffffff1916905550611759905081615331565b90506115da565b506001600160a01b0382166000908152600b60205260408120611782916146bb565b5050565b6003546001600160a01b031633146117ce5760405162461bcd60e51b815260206004820181905260248201526000805160206155c483398151915260448201526064016107bd565b6001600160a01b03811660009081526008602052604090205460ff16156118375760405162461bcd60e51b815260206004820152601a60248201527f6164647265737320616c7265616479207265676973746572656400000000000060448201526064016107bd565b6001600160a01b03166000908152600860205260409020805460ff19166001179055565b606081518351146118d45760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e67746860448201527f206d69736d61746368000000000000000000000000000000000000000000000060648201526084016107bd565b6000835167ffffffffffffffff8111156118f0576118f061478f565b604051908082528060200260200182016040528015611919578160200160208202803683370190505b50905060005b84518110156119915761196485828151811061193d5761193d6152d8565b6020026020010151858381518110611957576119576152d8565b6020026020010151610743565b828281518110611976576119766152d8565b602090810291909101015261198a81615331565b905061191f565b509392505050565b6003546001600160a01b031633146119e15760405162461bcd60e51b815260206004820181905260248201526000805160206155c483398151915260448201526064016107bd565b6001600160a01b03811660009081526007602052604090205460ff16611a495760405162461bcd60e51b815260206004820152601660248201527f61646472657373206e6f7420726567697374657265640000000000000000000060448201526064016107bd565b6001600160a01b03166000908152600760205260409020805460ff19169055565b80611ab75760405162461bcd60e51b815260206004820152600c60248201527f6e6f20746f6b656e20696473000000000000000000000000000000000000000060448201526064016107bd565b8060005b81811015611af457611ae4848483818110611ad857611ad86152d8565b9050602002013561136e565b611aed81615331565b9050611abb565b50505050565b3360009081526008602052604090205460ff16611b595760405162461bcd60e51b815260206004820152601160248201527f63616c6c6572206e6f74206275726e657200000000000000000000000000000060448201526064016107bd565b611bc78585858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808902828101820190935288825290935088925087918291850190849080828437600092019190915250613b2992505050565b5050505050565b60606005805480602002602001604051908101604052809291908181526020016000905b82821015611c6b5760008481526020908190206040805160a0810182529185015461ffff8116835266ffffffffffffff620100008204811684860152600160481b82041691830191909152600160801b8104600790810b6060840152600160c01b909104900b6080820152825260019092019101611bf2565b50505050905090565b6003546001600160a01b03163314611cbc5760405162461bcd60e51b815260206004820181905260248201526000805160206155c483398151915260448201526064016107bd565b6003546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a36003805473ffffffffffffffffffffffffffffffffffffffff19169055565b6001600160a01b0382166000908152600a602052604081205460ff16611d7b5760405162461bcd60e51b815260206004820152601460248201527f696e76616c69642070617373206164647265737300000000000000000000000060448201526064016107bd565b6001600160a01b0383166000908152600a60205260408120546009805460ff909216929183908110611daf57611daf6152d8565b6000918252602090912001546040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b038681166004830152909116915081906370a082319060240160206040518083038186803b158015611e1957600080fd5b505afa158015611e2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bc29190615389565b6003546001600160a01b03163314611e995760405162461bcd60e51b815260206004820181905260248201526000805160206155c483398151915260448201526064016107bd565b81611ea38161362f565b611edf5760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b2103a37b5b2b760991b60448201526064016107bd565b60058381548110611ef257611ef26152d8565b60009182526020909120015466ffffffffffffff600160481b90910481169083161015611f615760405162461bcd60e51b815260206004820152601560248201527f6d6178206d7573742065786365656420746f74616c000000000000000000000060448201526064016107bd565b8160058481548110611f7557611f756152d8565b9060005260206000200160000160026101000a81548166ffffffffffffff021916908366ffffffffffffff160217905550505050565b6003546001600160a01b03163314611ff35760405162461bcd60e51b815260206004820181905260248201526000805160206155c483398151915260448201526064016107bd565b6001600160a01b03811660009081526007602052604090205460ff161561205c5760405162461bcd60e51b815260206004820152601a60248201527f6164647265737320616c7265616479207265676973746572656400000000000060448201526064016107bd565b6001600160a01b03166000908152600760205260409020805460ff19166001179055565b815160609060008167ffffffffffffffff8111156120a0576120a061478f565b6040519080825280602002602001820160405280156120c9578160200160208202803683370190505b50905060005b82811015612127576120fa8682815181106120ec576120ec6152d8565b602002602001015186610b3c565b82828151811061210c5761210c6152d8565b602090810291909101015261212081615331565b90506120cf565b50949350505050565b6003546001600160a01b031633146121785760405162461bcd60e51b815260206004820181905260248201526000805160206155c483398151915260448201526064016107bd565b8051611782906004906020840190614637565b6003546001600160a01b031633146121d35760405162461bcd60e51b815260206004820181905260248201526000805160206155c483398151915260448201526064016107bd565b846121dd8161362f565b6122195760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b2103a37b5b2b760991b60448201526064016107bd565b6005868154811061222c5761222c6152d8565b60009182526020909120015466ffffffffffffff600160481b9091048116908516101561229b5760405162461bcd60e51b815260206004820152601560248201527f6d6178206d7573742065786365656420746f74616c000000000000000000000060448201526064016107bd565b84600587815481106122af576122af6152d8565b9060005260206000200160000160006101000a81548161ffff021916908361ffff16021790555083600587815481106122ea576122ea6152d8565b9060005260206000200160000160026101000a81548166ffffffffffffff021916908366ffffffffffffff160217905550826005878154811061232f5761232f6152d8565b60009182526020808320909101805467ffffffffffffffff94909416600160801b0267ffffffffffffffff60801b19909416939093179092558781526006825260409020835161238192850190614637565b50857f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b6123ad886109b0565b6040516123ba91906148db565b60405180910390a2505050505050565b336001600160a01b03831614156124495760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c2073746174757360448201527f20666f722073656c66000000000000000000000000000000000000000000000060648201526084016107bd565b3360008181526001602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6003546001600160a01b031633146124fd5760405162461bcd60e51b815260206004820181905260248201526000805160206155c483398151915260448201526064016107bd565b6000841161253e5760405162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a5908185b5bdd5b9d60921b60448201526064016107bd565b600081511161258f5760405162461bcd60e51b815260206004820152601060248201527f696e76616c69642069706673686173680000000000000000000000000000000060448201526064016107bd565b600580546040805160a08101825261ffff808a16825266ffffffffffffff8089166020808501918252600085870181815260078c810b60608901908152429182900b60808a0190815260018c018d559b845288517f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db08c0180549751945192519d5167ffffffffffffffff908116600160c01b0277ffffffffffffffffffffffffffffffffffffffffffffffff91909f16600160801b0267ffffffffffffffff60801b19948b16600160481b02949094167fffffffffffffffff000000000000000000000000000000ffffffffffffffffff96909a16620100000268ffffffffffffffffff1990991692909a169190911796909617929092169590951717949094169790971790558482526006865292902085519394929391926126d59290870190614637565b50827f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b612701856109b0565b60405161270e91906148db565b60405180910390a261273133848960405180602001604052806000815250613704565b6040805184815261ffff8a16602082015266ffffffffffffff881681830152600787810b606083015284900b608082015290517f56b8c632f24b2e1ff86b679e5440f331423d390a41a3e0eccd74274e139a77fa9181900360a00190a15050505050505050565b60095460609060008167ffffffffffffffff8111156127b9576127b961478f565b6040519080825280602002602001820160405280156127e2578160200160208202803683370190505b50905060005b8281101561285b5760098181548110612803576128036152d8565b9060005260206000200160009054906101000a90046001600160a01b0316828281518110612833576128336152d8565b6001600160a01b039092166020928302919091019091015261285481615331565b90506127e8565b5092915050565b6003546001600160a01b031633146128aa5760405162461bcd60e51b815260206004820181905260248201526000805160206155c483398151915260448201526064016107bd565b6001600160a01b03811660009081526008602052604090205460ff166129125760405162461bcd60e51b815260206004820152601660248201527f61646472657373206e6f7420726567697374657265640000000000000000000060448201526064016107bd565b6001600160a01b03166000908152600860205260409020805460ff19169055565b6005546000908210612946576000612976565b60058281548110612959576129596152d8565b600091825260209091200154600160481b900466ffffffffffffff165b66ffffffffffffff1692915050565b3360009081526007602052604090205460ff16806129ad57506003546001600160a01b031633145b6129f95760405162461bcd60e51b815260206004820152601160248201527f63616c6c6572206e6f74206d696e74657200000000000000000000000000000060448201526064016107bd565b611bc78585858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808902828101820190935288825290935088925087918291850190849080828437600092018290525060408051602081019091529081529250613bd6915050565b60048054612a82906151c7565b80601f0160208091040260200160405190810160405280929190818152602001828054612aae906151c7565b8015612afb5780601f10612ad057610100808354040283529160200191612afb565b820191906000526020600020905b815481529060010190602001808311612ade57829003601f168201915b505050505081565b6003546001600160a01b03163314612b4b5760405162461bcd60e51b815260206004820181905260248201526000805160206155c483398151915260448201526064016107bd565b81612b558161362f565b612b915760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b2103a37b5b2b760991b60448201526064016107bd565b8160058481548110612ba557612ba56152d8565b6000918252602090912001805461ffff191661ffff92909216919091179055505050565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152606082612c008161362f565b612c3c5760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b2103a37b5b2b760991b60448201526064016107bd565b60058481548110612c4f57612c4f6152d8565b6000918252602080832087845260068252604093849020845160a081018652919093015461ffff8116825266ffffffffffffff620100008204811693830193909352600160481b810490921693810193909352600160801b8104600790810b6060850152600160c01b909104900b608083015280548190612ccf906151c7565b80601f0160208091040260200160405190810160405280929190818152602001828054612cfb906151c7565b8015612d485780601f10612d1d57610100808354040283529160200191612d48565b820191906000526020600020905b815481529060010190602001808311612d2b57829003601f168201915b505050505090509250925050915091565b606060048054612d68906151c7565b80601f0160208091040260200160405190810160405280929190818152602001828054612d94906151c7565b8015612de15780601f10612db657610100808354040283529160200191612de1565b820191906000526020600020905b815481529060010190602001808311612dc457829003601f168201915b5050505050905090565b6001600160a01b038416612e4f5760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b60648201526084016107bd565b6001600160a01b038516331480612e6b5750612e6b85336106a9565b612edd5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201527f20617070726f766564000000000000000000000000000000000000000000000060648201526084016107bd565b33612ef6818787612eed88613d83565b611bc788613d83565b6000848152602081815260408083206001600160a01b038a16845290915290205483811015612f7a5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201526939103a3930b739b332b960b11b60648201526084016107bd565b612f848482615304565b6000868152602081815260408083206001600160a01b038c81168552925280832093909355881681529081208054869290612fc090849061534c565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4613020828888888888613dce565b50505050505050565b6003546001600160a01b031633146130715760405162461bcd60e51b815260206004820181905260248201526000805160206155c483398151915260448201526064016107bd565b6001600160a01b0381166130ed5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016107bd565b6003546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a36003805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6001600160a01b0381166000908152600b60209081526040808320805482518185028101850190935280835260609492939192909184015b828210156131de576000848152602090819020604080516060810182529185015460ff8116835261ffff610100820416838501526301000000900460070b9082015282526001909201910161318e565b505050509050919050565b6001600160a01b0382166000908152600a602052604090205460ff166132515760405162461bcd60e51b815260206004820152601460248201527f696e76616c69642070617373206164647265737300000000000000000000000060448201526064016107bd565b6001600160a01b0382166000908152600a602052604081205460098054339360ff90931692919083908110613288576132886152d8565b6000918252602090912001546040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018690526001600160a01b039182169250908416908290636352211e9060240160206040518083038186803b1580156132f557600080fd5b505afa158015613309573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061332d91906153a2565b6001600160a01b0316146133835760405162461bcd60e51b815260206004820152600e60248201527f6e6f742070617373206f776e657200000000000000000000000000000000000060448201526064016107bd565b6040516323b872dd60e01b81526001600160a01b038481166004830152306024830152604482018690528216906323b872dd90606401600060405180830381600087803b1580156133d357600080fd5b505af11580156133e7573d6000803e3d6000fd5b5050604080516060808201835260ff878116835261ffff8a8116602080860191825242600781900b8789018181526001600160a01b038f81166000818152600b87528c81208054600181018255908252908790208c51910180549851945167ffffffffffffffff166301000000026affffffffffffffff0000001995909a166101000262ffffff1990991691909a16179690961791909116959095179095558751938f1684529083018d90529582019290925293955091935090917ff7ebc54823f2cdb7ca0acdfbfd855d00ac987f8b7cb4deb30652b4787cbc7466910160405180910390a250505050505050565b3360009081526008602052604090205460ff166135355760405162461bcd60e51b815260206004820152601160248201527f63616c6c6572206e6f74206275726e657200000000000000000000000000000060448201526064016107bd565b600081116135765760405162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a5908185b5bdd5b9d60921b60448201526064016107bd565b610b37838383613ed9565b60006001600160e01b031982167fd9b67a260000000000000000000000000000000000000000000000000000000014806135e457506001600160e01b031982167f0e89341c00000000000000000000000000000000000000000000000000000000145b8061082a57507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b031983161461082a565b8051611782906002906020840190614637565b6005546000908210801561082a5750600060058381548110613653576136536152d8565b600091825260209091200154600160c01b900460070b1392915050565b60606002805461367f906151c7565b80601f01602080910402602001604051908101604052809291908181526020018280546136ab906151c7565b80156136f85780601f106136cd576101008083540402835291602001916136f8565b820191906000526020600020905b8154815290600101906020018083116136db57829003601f168201915b50505050509050919050565b8261370e8161362f565b61374a5760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b2103a37b5b2b760991b60448201526064016107bd565b61375685858585613f86565b826005858154811061376a5761376a6152d8565b60009182526020909120018054600990613795908490600160481b900466ffffffffffffff166153bf565b92506101000a81548166ffffffffffffff021916908366ffffffffffffff160217905550600584815481106137cc576137cc6152d8565b9060005260206000200160000160029054906101000a900466ffffffffffffff1666ffffffffffffff1660058581548110613809576138096152d8565b600091825260209091200154600160481b900466ffffffffffffff161115611bc75760405162461bcd60e51b815260206004820152601760248201527f616d6f756e7420657863656564206d6178737570706c7900000000000000000060448201526064016107bd565b60008060058381548110613889576138896152d8565b600091825260208083206001600160a01b0388168452600b909152604083205491019250905b8181101561396b576001600160a01b0386166000908152600b602052604081208054839081106138e1576138e16152d8565b6000918252602082200180548654919350613912916301000000909104600790810b91600160c01b9004900b6153ea565b8554909150600160801b9004600790810b9082900b128015906139455750815485546139459160ff169061ffff16614087565b156139585761395560018761534c565b95505b50508061396490615331565b90506138af565b50505092915050565b6001600160a01b0384163b15610f5a5760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906139b8908990899088908890889060040161543c565b602060405180830381600087803b1580156139d257600080fd5b505af1925050508015613a02575060408051601f3d908101601f191682019092526139ff9181019061549a565b60015b613ab857613a0e6154b7565b806308c379a01415613a485750613a236154d3565b80613a2e5750613a4a565b8060405162461bcd60e51b81526004016107bd91906148db565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e204552433131353560448201527f526563656976657220696d706c656d656e74657200000000000000000000000060648201526084016107bd565b6001600160e01b0319811663bc197c8160e01b146130205760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a656374656044820152676420746f6b656e7360c01b60648201526084016107bd565b613b348383836140ad565b60005b8251811015611af4576000838281518110613b5457613b546152d8565b60200260200101519050828281518110613b7057613b706152d8565b602002602001015160058281548110613b8b57613b8b6152d8565b6000918252602090912001805466ffffffffffffff600160481b808304821694909403169092026fffffffffffffff0000000000000000001990921691909117905550600101613b37565b613be2848484846142ef565b60005b8351811015611bc7576000848281518110613c0257613c026152d8565b60200260200101519050613c158161362f565b613c515760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b2103a37b5b2b760991b60448201526064016107bd565b838281518110613c6357613c636152d8565b602002602001015160058281548110613c7e57613c7e6152d8565b6000918252602090912001805466ffffffffffffff600160481b8083048216909401169092026fffffffffffffff000000000000000000199092169190911790556005805482908110613cd357613cd36152d8565b9060005260206000200160000160029054906101000a900466ffffffffffffff1666ffffffffffffff1660058281548110613d1057613d106152d8565b600091825260209091200154600160481b900466ffffffffffffff161115613d7a5760405162461bcd60e51b815260206004820152601760248201527f616d6f756e7420657863656564206d6178737570706c7900000000000000000060448201526064016107bd565b50600101613be5565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110613dbd57613dbd6152d8565b602090810291909101015292915050565b6001600160a01b0384163b15610f5a5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190613e12908990899088908890889060040161555d565b602060405180830381600087803b158015613e2c57600080fd5b505af1925050508015613e5c575060408051601f3d908101601f19168201909252613e599181019061549a565b60015b613e6857613a0e6154b7565b6001600160e01b0319811663f23a6e6160e01b146130205760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a656374656044820152676420746f6b656e7360c01b60648201526084016107bd565b81613ee38161362f565b613f1f5760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b2103a37b5b2b760991b60448201526064016107bd565b613f2a8484846144b5565b8160058481548110613f3e57613f3e6152d8565b6000918252602090912001805466ffffffffffffff600160481b808304821694909403169092026fffffffffffffff0000000000000000001990921691909117905550505050565b6001600160a01b038416613fe65760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016107bd565b33613ff781600087612eed88613d83565b6000848152602081815260408083206001600160a01b03891684529091528120805485929061402790849061534c565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611bc781600087878787613dce565b60006140946001846155a0565b60ff166001901b821661ffff1660001415905092915050565b6001600160a01b03831661410f5760405162461bcd60e51b815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201526265737360e81b60648201526084016107bd565b80518251146141715760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b60648201526084016107bd565b604080516020810190915260009081905233905b83518110156142905760008482815181106141a2576141a26152d8565b6020026020010151905060008483815181106141c0576141c06152d8565b602090810291909101810151600084815280835260408082206001600160a01b038c16835290935291909120549091508181101561424c5760405162461bcd60e51b8152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604482015263616e636560e01b60648201526084016107bd565b6142568282615304565b6000938452602084815260408086206001600160a01b038c168752909152909320929092555081905061428881615331565b915050614185565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb86866040516142e1929190615364565b60405180910390a450505050565b6001600160a01b03841661434f5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016107bd565b81518351146143b15760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b60648201526084016107bd565b3360005b845181101561444d578381815181106143d0576143d06152d8565b60200260200101516000808784815181106143ed576143ed6152d8565b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b031681526020019081526020016000206000828254614435919061534c565b9091555081905061444581615331565b9150506143b5565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161449e929190615364565b60405180910390a4611bc781600087878787613974565b6001600160a01b0383166145175760405162461bcd60e51b815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201526265737360e81b60648201526084016107bd565b336145478185600061452887613d83565b61453187613d83565b5050604080516020810190915260009052505050565b6000838152602081815260408083206001600160a01b0388168452909152902054828110156145c45760405162461bcd60e51b8152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604482015263616e636560e01b60648201526084016107bd565b6145ce8382615304565b6000858152602081815260408083206001600160a01b038a811680865291845282852095909555815189815292830188905292938616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b828054614643906151c7565b90600052602060002090601f01602090048101928261466557600085556146ab565b82601f1061467e57805160ff19168380011785556146ab565b828001600101855582156146ab579182015b828111156146ab578251825591602001919060010190614690565b506146b79291506146dc565b5090565b50805460008255906000526020600020908101906146d991906146f1565b50565b5b808211156146b757600081556001016146dd565b5b808211156146b75780546affffffffffffffffffffff191681556001016146f2565b6001600160a01b03811681146146d957600080fd5b6000806040838503121561473c57600080fd5b823561474781614714565b946020939093013593505050565b6001600160e01b0319811681146146d957600080fd5b60006020828403121561477d57600080fd5b813561478881614755565b9392505050565b634e487b7160e01b600052604160045260246000fd5b601f8201601f1916810167ffffffffffffffff811182821017156147cb576147cb61478f565b6040525050565b600082601f8301126147e357600080fd5b813567ffffffffffffffff8111156147fd576147fd61478f565b604051614814601f8301601f1916602001826147a5565b81815284602083860101111561482957600080fd5b816020850160208301376000918101602001919091529392505050565b60006020828403121561485857600080fd5b813567ffffffffffffffff81111561486f57600080fd5b61487b848285016147d2565b949350505050565b60005b8381101561489e578181015183820152602001614886565b83811115611af45750506000910152565b600081518084526148c7816020860160208601614883565b601f01601f19169290920160200192915050565b60208152600061478860208301846148af565b6000806040838503121561490157600080fd5b82359150602083013567ffffffffffffffff81111561491f57600080fd5b61492b858286016147d2565b9150509250929050565b60006020828403121561494757600080fd5b5035919050565b60008060008060006080868803121561496657600080fd5b853561497181614714565b9450602086013561498181614714565b935060408601359250606086013567ffffffffffffffff808211156149a557600080fd5b818801915088601f8301126149b957600080fd5b8135818111156149c857600080fd5b8960208285010111156149da57600080fd5b9699959850939650602001949392505050565b600080600060608486031215614a0257600080fd5b8335614a0d81614714565b95602085013595506040909401359392505050565b60008060408385031215614a3557600080fd5b823591506020830135614a4781614714565b809150509250929050565b600067ffffffffffffffff821115614a6c57614a6c61478f565b5060051b60200190565b600082601f830112614a8757600080fd5b81356020614a9482614a52565b604051614aa182826147a5565b83815260059390931b8501820192828101915086841115614ac157600080fd5b8286015b84811015614adc5780358352918301918301614ac5565b509695505050505050565b600080600080600060a08688031215614aff57600080fd5b8535614b0a81614714565b94506020860135614b1a81614714565b9350604086013567ffffffffffffffff80821115614b3757600080fd5b614b4389838a01614a76565b94506060880135915080821115614b5957600080fd5b614b6589838a01614a76565b93506080880135915080821115614b7b57600080fd5b50614b88888289016147d2565b9150509295509295909350565b8035600781900b8114614ba757600080fd5b919050565b60008060408385031215614bbf57600080fd5b82359150614bcf60208401614b95565b90509250929050565b600060208284031215614bea57600080fd5b813561478881614714565b60008060408385031215614c0857600080fd5b823567ffffffffffffffff80821115614c2057600080fd5b818501915085601f830112614c3457600080fd5b81356020614c4182614a52565b604051614c4e82826147a5565b83815260059390931b8501820192828101915089841115614c6e57600080fd5b948201945b83861015614c95578535614c8681614714565b82529482019490820190614c73565b96505086013592505080821115614cab57600080fd5b5061492b85828601614a76565b600081518084526020808501945080840160005b83811015614ce857815187529582019590820190600101614ccc565b509495945050505050565b6020815260006147886020830184614cb8565b60008083601f840112614d1857600080fd5b50813567ffffffffffffffff811115614d3057600080fd5b6020830191508360208260051b8501011115614d4b57600080fd5b9250929050565b60008060208385031215614d6557600080fd5b823567ffffffffffffffff811115614d7c57600080fd5b614d8885828601614d06565b90969095509350505050565b600080600080600060608688031215614dac57600080fd5b8535614db781614714565b9450602086013567ffffffffffffffff80821115614dd457600080fd5b614de089838a01614d06565b90965094506040880135915080821115614df957600080fd5b50614e0688828901614d06565b969995985093965092949392505050565b6020808252825182820181905260009190848201906040850190845b81811015614e9d57614e8a83855161ffff8151168252602081015166ffffffffffffff80821660208501528060408401511660408501525050606081015160070b6060830152608081015160070b60808301525050565b9284019260a09290920191600101614e33565b50909695505050505050565b60008060408385031215614ebc57600080fd5b8235614ec781614714565b91506020830135614a4781614714565b803566ffffffffffffff81168114614ba757600080fd5b60008060408385031215614f0157600080fd5b82359150614bcf60208401614ed7565b60008060408385031215614f2457600080fd5b823567ffffffffffffffff811115614f3b57600080fd5b614f4785828601614a76565b9250506020830135614a4781614714565b803561ffff81168114614ba757600080fd5b600080600080600060a08688031215614f8257600080fd5b85359450614f9260208701614f58565b9350614fa060408701614ed7565b9250614fae60608701614b95565b9150608086013567ffffffffffffffff811115614fca57600080fd5b614b88888289016147d2565b60008060408385031215614fe957600080fd5b8235614ff481614714565b915060208301358015158114614a4757600080fd5b600080600080600060a0868803121561502157600080fd5b61502a86614f58565b945060208601359350614fa060408701614ed7565b6020808252825182820181905260009190848201906040850190845b81811015614e9d5783516001600160a01b03168352928401929184019160010161505b565b6000806040838503121561509357600080fd5b82359150614bcf60208401614f58565b6150f1818461ffff8151168252602081015166ffffffffffffff80821660208501528060408401511660408501525050606081015160070b6060830152608081015160070b60808301525050565b60c060a0820152600061487b60c08301846148af565b600080600080600060a0868803121561511f57600080fd5b853561512a81614714565b9450602086013561513a81614714565b93506040860135925060608601359150608086013567ffffffffffffffff811115614fca57600080fd5b602080825282518282018190526000919060409081850190868401855b828110156151ba578151805160ff1685528681015161ffff168786015285015160070b8585015260609093019290850190600101615181565b5091979650505050505050565b600181811c908216806151db57607f821691505b60208210811415610a6157634e487b7160e01b600052602260045260246000fd5b60008351602061520f8285838901614883565b7f2f00000000000000000000000000000000000000000000000000000000000000918401918252845460019060009080831c8184168061525057607f821691505b85821081141561526e57634e487b7160e01b84526022600452602484fd5b8080156152825760018114615297576152c8565b60ff19841688870152828801860194506152c8565b60008b81526020902060005b848110156152be5781548a82018901529087019088016152a3565b5050858389010194505b50929a9950505050505050505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082821015615316576153166152ee565b500390565b634e487b7160e01b600052603160045260246000fd5b6000600019821415615345576153456152ee565b5060010190565b6000821982111561535f5761535f6152ee565b500190565b6040815260006153776040830185614cb8565b8281036020840152610bc28185614cb8565b60006020828403121561539b57600080fd5b5051919050565b6000602082840312156153b457600080fd5b815161478881614714565b600066ffffffffffffff8083168185168083038211156153e1576153e16152ee565b01949350505050565b60008160070b8360070b6000811281677fffffffffffffff1901831281151615615416576154166152ee565b81677fffffffffffffff018313811615615432576154326152ee565b5090039392505050565b60006001600160a01b03808816835280871660208401525060a0604083015261546860a0830186614cb8565b828103606084015261547a8186614cb8565b9050828103608084015261548e81856148af565b98975050505050505050565b6000602082840312156154ac57600080fd5b815161478881614755565b600060033d11156154d05760046000803e5060005160e01c5b90565b600060443d10156154e15790565b6040516003193d81016004833e81513d67ffffffffffffffff816024840111818411171561551157505050505090565b82850191508151818111156155295750505050505090565b843d87010160208285010111156155435750505050505090565b615552602082860101876147a5565b509095945050505050565b60006001600160a01b03808816835280871660208401525084604083015283606083015260a0608083015261559560a08301846148af565b979650505050505050565b600060ff821660ff8416808210156155ba576155ba6152ee565b9003939250505056fe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a2646970667358221220de153d1b9d58481444bcb4b510590340bf20dbad71cf038a4dec996c49639ced64736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000002168747470733a2f2f697066732e67656e65746963636861696e2e696f2f6970667300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005068747470733a2f2f697066732e67656e65746963636861696e2e696f2f697066732f516d526544645155797a54784b6350564b4c6f3961315a715742705048475878473535736169706b5258426f4553000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005000000000000000000000000e6c5bc36214d9a09b208f397fe47bd421a5e02d9000000000000000000000000321b125cf85b0e9fbcf6554a71adb10d8138388a000000000000000000000000f91180a67a2c607523b5e32f98732d8cddd6538a000000000000000000000000a9833d5d3ff75a32709a8da2e66a7df9d2c83aa00000000000000000000000001bc2f28fb7e3be8b5905541a90e4312a9976ace1
-----Decoded View---------------
Arg [0] : baseUri (string): https://ipfs.geneticchain.io/ipfs
Arg [1] : contractUri (string): https://ipfs.geneticchain.io/ipfs/QmReDdQUyzTxKcPVKLo9a1ZqWBpPHGXxG55saipkRXBoES
Arg [2] : passes (address[]): 0xe6c5bc36214d9a09b208F397fe47Bd421a5e02D9,0x321B125CF85B0E9fBcF6554a71ADb10d8138388a,0xF91180A67A2c607523b5e32f98732D8cDDD6538A,0xa9833D5D3ff75A32709A8dA2E66A7dF9D2c83Aa0,0x1bC2f28Fb7E3be8b5905541a90e4312A9976ACE1
-----Encoded View---------------
16 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000021
Arg [4] : 68747470733a2f2f697066732e67656e65746963636861696e2e696f2f697066
Arg [5] : 7300000000000000000000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000050
Arg [7] : 68747470733a2f2f697066732e67656e65746963636861696e2e696f2f697066
Arg [8] : 732f516d526544645155797a54784b6350564b4c6f3961315a71574270504847
Arg [9] : 5878473535736169706b5258426f455300000000000000000000000000000000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [11] : 000000000000000000000000e6c5bc36214d9a09b208f397fe47bd421a5e02d9
Arg [12] : 000000000000000000000000321b125cf85b0e9fbcf6554a71adb10d8138388a
Arg [13] : 000000000000000000000000f91180a67a2c607523b5e32f98732d8cddd6538a
Arg [14] : 000000000000000000000000a9833d5d3ff75a32709a8da2e66a7df9d2c83aa0
Arg [15] : 0000000000000000000000001bc2f28fb7e3be8b5905541a90e4312a9976ace1
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.