ERC-721
Overview
Max Total Supply
3,293 TEKOMON
Holders
237
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 TEKOMONLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
Tekomon
Compiler Version
v0.8.24+commit.e11b9ed9
Optimization Enabled:
No with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; /* 1st on-chain Pocket Monster Game. @TekoMonERC 1st scaled ERC20721 collection & game. 1st mover on the ERC20721t standard, learn more at TekoMon.io/about 3,000 total supply Stealth Launch Welcome to TekoMon! $TEKOMON + $wTEKOMON TekoMon.io Your legendary journey awaits. */ import {ERC20721T} from "./ERC20721T.sol"; error Paused(); error Restricted(); error IncorrectAmountOfEther(); error TooFewTokensRemaining(); error WalletMaximumReached(); error SaleInactive(); contract Tekomon is ERC20721T { uint256 public price = 0.05 ether; uint256 public walletCap = 100; bool public saleActive = true; bool public paused; string baseURI = "https://nftstorage.link/ipfs/bafkreictkp324gwa2rjht4afojdtdrtrq2fufyuqciigbi7n2xrj5ofiqu/?"; // pre-reveal mapping(address => uint8) public admin; constructor() ERC20721T("Tekomon", "TEKOMON") { admin[msg.sender] = 1; } // RESTRICTED // modifier restricted() { if (admin[msg.sender] != 1) revert Restricted(); _; } modifier whenNotPaused() { if (paused) revert Paused(); _; } function setPrice(uint256 _price) external restricted { price = _price; } function setWalletCap(uint256 _walletCap) external restricted { walletCap = _walletCap; } function setSaleActive(bool active) external restricted { saleActive = active; } function setPaused(bool _paused) external restricted { paused = _paused; } function setBaseURI(string memory URI) external restricted { baseURI = URI; } function setAdmin(address account, bool privileged) external restricted { admin[account] = privileged ? 1 : 0; } function setWrapper(address _contract) external restricted { _setWrapper(_contract); } function reserve(uint256 amount, address recipient) external restricted { _safeMint(recipient, amount); } function withdraw() external restricted { payable(msg.sender).transfer(address(this).balance); } // EXTERNAL // function mint(uint256 quantity) external payable whenNotPaused { if (!saleActive) revert SaleInactive(); if (quantity + _numberMinted(msg.sender) > walletCap) revert WalletMaximumReached(); if (_totalMinted() + quantity > _maxSupply()) revert TooFewTokensRemaining(); if (msg.value != price * quantity) revert IncorrectAmountOfEther(); _safeMint(msg.sender, quantity); } function burn(uint256 tokenId) external whenNotPaused { _burn(tokenId, true); } function exists(uint256 tokenId) external view returns (bool) { return _exists(tokenId); } // INTERNAL // function _baseURI() internal view override returns (string memory) { return baseURI; } function _maxSupply() internal pure override returns (uint256) { return 3000; } function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal override whenNotPaused { super._beforeTokenTransfers(from, to, startTokenId, quantity); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import "./IERC20721T.sol"; interface IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } contract ERC20721T is IERC20721T { struct TokenApprovalRef { address value; } struct UserApprovalRef { mapping(address => uint256) allowance; mapping(address => bool) approved; } uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; uint256 private constant _BITPOS_NUMBER_MINTED = 64; uint256 private constant _BITPOS_NUMBER_BURNED = 128; uint256 private constant _BITPOS_AUX = 192; uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; uint256 private constant _BITPOS_START_TIMESTAMP = 160; uint256 private constant _BITMASK_BURNED = 1 << 224; uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; uint256 private constant _BITPOS_EXTRA_DATA = 232; uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; bytes32 private constant _ERC721_TRANSFER_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; bytes32 private constant _ERC20_TRANSFER_SIGNATURE = keccak256(bytes("Transfer(address,address,uint256)")); bytes32 private constant _ERC20_APPROVAL_SIGNATURE = keccak256(bytes("Approval(address,address,uint256)")); address private _wrapper; uint256 private _currentIndex; uint256 private _burnCounter; uint256 public decimals; string private _name; string private _symbol; mapping(uint256 => uint256) private _packedOwnerships; mapping(address => uint256) private _packedAddressData; mapping(uint256 => TokenApprovalRef) private _tokenApprovals; mapping(address => UserApprovalRef) private _userApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } function _maxSupply() internal view virtual returns (uint256) { return 1000; } function _startTokenId() internal view virtual returns (uint256) { return _maxSupply() + 1; } function _nextTokenId() internal view virtual returns (uint256) { return _currentIndex; } function wrapper() public view virtual returns (address) { return _wrapper; } function totalSupply() public view virtual returns (uint256) { unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } function _totalMinted() internal view virtual returns (uint256) { unchecked { return _currentIndex - _startTokenId(); } } function _totalBurned() internal view virtual returns (uint256) { return _burnCounter; } function balanceOf(address owner) public view virtual returns (uint256) { if (owner == address(0)) _revert(BalanceQueryForZeroAddress.selector); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } function allowance( address owner, address spender ) external view returns (uint256) { return _userApprovals[owner].allowance[spender]; } function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } function _setWrapper(address w) internal virtual { _wrapper = w; } function supportsInterface( bytes4 interfaceId ) public view virtual returns (bool) { return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } function name() public view virtual returns (string memory) { return _name; } function symbol() public view virtual returns (string memory) { return _symbol; } function tokenURI( uint256 tokenId ) public view virtual returns (string memory) { if (!_exists(tokenId)) _revert(URIQueryForNonexistentToken.selector); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ""; } function _baseURI() internal view virtual returns (string memory) { return ""; } function ownerOf(uint256 tokenId) public view virtual returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } function _ownershipOf( uint256 tokenId ) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } function _ownershipAt( uint256 index ) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } function _ownershipIsInitialized( uint256 index ) internal view virtual returns (bool) { return _packedOwnerships[index] != 0; } function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } function _packedOwnershipOf( uint256 tokenId ) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; if (packed & _BITMASK_BURNED == 0) { while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } _revert(OwnerQueryForNonexistentToken.selector); } function _unpackedOwnership( uint256 packed ) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } function _packOwnershipData( address owner, uint256 flags ) private view returns (uint256 result) { assembly { owner := and(owner, _BITMASK_ADDRESS) result := or( owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags) ) } } function _nextInitializedFlag( uint256 quantity ) private pure returns (uint256 result) { assembly { result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } function approve( address _spender, uint256 quantityOrTokenId ) external returns (bool) { uint256 max = _maxSupply() + 1; if (quantityOrTokenId > max && quantityOrTokenId <= max * 2) { _approveERC721(_spender, quantityOrTokenId); } else { _approveERC20(msg.sender, _spender, quantityOrTokenId); } return true; } function _approveERC721(address to, uint256 tokenId) internal virtual { address owner = ownerOf(tokenId); if (_msgSender() != owner) if (!isApprovedForAll(owner, _msgSender())) { _revert(ApprovalCallerNotOwnerNorApproved.selector); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } function _approveERC20( address _owner, address _spender, uint256 _tokens ) internal { _userApprovals[_owner].allowance[_spender] = _tokens; emit ERC20Approval( _ERC20_APPROVAL_SIGNATURE, _owner, _spender, _tokens ); } function getApproved( uint256 tokenId ) public view virtual returns (address) { if (!_exists(tokenId)) _revert(ApprovalQueryForNonexistentToken.selector); return _tokenApprovals[tokenId].value; } function setApprovalForAll(address operator, bool approved) public virtual { _userApprovals[_msgSender()].approved[operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } function isApprovedForAll( address owner, address operator ) public view virtual returns (bool) { return _userApprovals[owner].approved[operator] || _wrapper == operator; } function tokensOfOwner( address owner ) public view returns (uint256[] memory) { uint256 start = _startTokenId(); uint256 stop = _nextTokenId(); uint256[] memory tokenIds; if (start != stop) tokenIds = _tokensOfOwnerIn(owner, start, stop); return tokenIds; } function _tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) private view returns (uint256[] memory) { unchecked { if (start >= stop) _revert(InvalidQueryRange.selector); if (start < _startTokenId()) { start = _startTokenId(); } uint256 stopLimit = _nextTokenId(); if (stop >= stopLimit) { stop = stopLimit; } uint256[] memory tokenIds; uint256 tokenIdsMaxLength = balanceOf(owner); bool startLtStop = start < stop; assembly { tokenIdsMaxLength := mul(tokenIdsMaxLength, startLtStop) } if (tokenIdsMaxLength != 0) { if (stop - start <= tokenIdsMaxLength) { tokenIdsMaxLength = stop - start; } assembly { tokenIds := mload(0x40) mstore( 0x40, add(tokenIds, shl(5, add(tokenIdsMaxLength, 1))) ) } TokenOwnership memory ownership = _explicitOwnershipOf(start); address currOwnershipAddr; if (!ownership.burned) { currOwnershipAddr = ownership.addr; } uint256 tokenIdsIdx; do { ownership = _ownershipAt(start); assembly { switch mload(add(ownership, 0x40)) case 0 { if mload(ownership) { currOwnershipAddr := mload(ownership) } if iszero(shl(96, xor(currOwnershipAddr, owner))) { tokenIdsIdx := add(tokenIdsIdx, 1) mstore( add(tokenIds, shl(5, tokenIdsIdx)), start ) } } default { currOwnershipAddr := 0 } start := add(start, 1) } } while (!(start == stop || tokenIdsIdx == tokenIdsMaxLength)); assembly { mstore(tokenIds, tokenIdsIdx) } } return tokenIds; } } function _explicitOwnershipOf( uint256 tokenId ) internal view virtual returns (TokenOwnership memory ownership) { unchecked { if (tokenId >= _startTokenId()) { if (tokenId < _nextTokenId()) { // If the `tokenId` is within bounds, // scan backwards for the initialized ownership slot. while (!_ownershipIsInitialized(tokenId)) --tokenId; return _ownershipAt(tokenId); } } } } function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; } function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) internal view virtual returns (bool result) { assembly { owner := and(owner, _BITMASK_ADDRESS) msgSender := and(msgSender, _BITMASK_ADDRESS) result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } function _getApprovedSlotAndAddress( uint256 tokenId ) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } function transfer( address to, uint256 quantity ) public payable virtual returns (bool) { _transfer(msg.sender, to, quantity); return true; } function _transfer(address from, address to, uint256 quantity) internal { uint256[] memory tokens = tokensOfOwner(from); if (tokens.length < quantity) _revert(InsufficientBalance.selector); batchTransfer( from, to, tokens.length > quantity ? _getLimitedArray(tokens, quantity) : tokens ); } function transferFrom( address from, address to, uint256 quantityOrTokenId ) public payable virtual returns (bool) { uint256 max = _maxSupply(); if (quantityOrTokenId <= max) { _transfer(from, to, quantityOrTokenId); } else if (quantityOrTokenId <= max * 2) { _transferFrom(from, to, quantityOrTokenId); emit ERC20Transfer(_ERC20_TRANSFER_SIGNATURE, from, to, 1); } else { return false; } return true; } function _transferFrom(address from, address to, uint256 tokenId) internal { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) _revert(TransferFromIncorrectOwner.selector); ( uint256 approvedAddressSlot, address approvedAddress ) = _getApprovedSlotAndAddress(tokenId); if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSender())) if (!isApprovedForAll(from, _msgSender())) if (_userApprovals[from].allowance[msg.sender] < 1) _revert(TransferCallerNotOwnerNorApproved.selector); if (to == address(0)) _revert(TransferToZeroAddress.selector); _beforeTokenTransfers(from, to, tokenId, 1); assembly { if approvedAddress { sstore(approvedAddressSlot, 0) } } unchecked { --_packedAddressData[from]; ++_packedAddressData[to]; _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; if (_packedOwnerships[nextTokenId] == 0) { if (nextTokenId != _currentIndex) { _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } if (_userApprovals[from].allowance[msg.sender] > 0) { _userApprovals[from].allowance[msg.sender]--; } if (from == _wrapper) { emit Locked(tokenId); emit MetadataUpdate(tokenId); } else if (to == _wrapper) { emit Unlocked(tokenId); emit MetadataUpdate(tokenId); } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } function batchTransfer( address from, address to, uint256[] memory tokenIds ) public { emit ERC20Transfer( _ERC20_TRANSFER_SIGNATURE, from, to, tokenIds.length ); for (uint256 i; i < tokenIds.length; i++) { _transferFrom(from, to, tokenIds[i]); } } function safeTransferFrom( address from, address to, uint256 tokenId ) public payable virtual { safeTransferFrom(from, to, tokenId, ""); } function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public payable virtual { emit ERC20Transfer(_ERC20_TRANSFER_SIGNATURE, from, to, 1); _transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { _revert(TransferToNonERC721ReceiverImplementer.selector); } } function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try IERC721Receiver(to).onERC721Received( _msgSender(), from, tokenId, _data ) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { _revert(TransferToNonERC721ReceiverImplementer.selector); } else { assembly { revert(add(32, reason), mload(reason)) } } } } function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) _revert(MintZeroQuantity.selector); _beforeTokenTransfers(address(0), to, startTokenId, quantity); unchecked { _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; assembly { toMasked := and(to, _BITMASK_ADDRESS) log4( 0, 0, _ERC721_TRANSFER_SIGNATURE, 0, toMasked, startTokenId ) for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { log4(0, 0, _ERC721_TRANSFER_SIGNATURE, 0, toMasked, tokenId) } } emit ERC20Transfer( _ERC20_TRANSFER_SIGNATURE, address(0), to, quantity ); if (toMasked == 0) _revert(MintToZeroAddress.selector); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) _revert(MintToZeroAddress.selector); if (quantity == 0) _revert(MintZeroQuantity.selector); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) _revert(MintERC2309QuantityExceedsLimit.selector); _beforeTokenTransfers(address(0), to, startTokenId, quantity); unchecked { _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer( startTokenId, startTokenId + quantity - 1, address(0), to ); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if ( !_checkContractOnERC721Received( address(0), to, index++, _data ) ) { _revert( TransferToNonERC721ReceiverImplementer.selector ); } } while (index < end); if (_currentIndex != end) revert(); } } } function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ""); } function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); ( uint256 approvedAddressSlot, address approvedAddress ) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSender())) if (!isApprovedForAll(from, _msgSender())) _revert(TransferCallerNotOwnerNorApproved.selector); } _beforeTokenTransfers(from, address(0), tokenId, 1); assembly { if approvedAddress { sstore(approvedAddressSlot, 0) } } unchecked { _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; if (_packedOwnerships[nextTokenId] == 0) { if (nextTokenId != _currentIndex) { _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit ERC20Transfer(_ERC20_TRANSFER_SIGNATURE, from, address(0), 1); emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); unchecked { _burnCounter++; } } function _getLimitedArray( uint256[] memory originalArray, uint256 length ) internal pure returns (uint256[] memory) { if (length > originalArray.length) _revert(InvalidArrayOperation.selector); uint256[] memory limitedArray = new uint256[](length); for (uint256 i = 0; i < length; i++) { limitedArray[i] = originalArray[i]; } return limitedArray; } function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) _revert(OwnershipNotInitializedForExtraData.selector); uint256 extraDataCasted; assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _toString( uint256 value ) internal pure virtual returns (string memory str) { assembly { let m := add(mload(0x40), 0xa0) mstore(0x40, m) str := sub(m, 0x20) mstore(str, 0) let end := str for { let temp := value } 1 { } { str := sub(str, 1) mstore8(str, add(48, mod(temp, 10))) temp := div(temp, 10) if iszero(temp) { break } } let length := sub(end, str) str := sub(str, 0x20) mstore(str, length) } } function _revert(bytes4 errorSelector) internal pure { assembly { mstore(0x00, errorSelector) revert(0x00, 0x04) } } } contract ERC20721TWrapper is IERC20721TWrapper { uint256 private _totalSupply; string private _name; string private _symbol; mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; IERC20721T public immutable base; constructor( string memory name_, string memory symbol_, address _baseContract ) { _name = name_; _symbol = symbol_; base = IERC20721T(_baseContract); } function wrappedTokenPool() public view returns (uint256[] memory) { return base.tokensOfOwner(address(this)); } function wrap(uint256 quantity) public payable virtual { uint256[] memory tokens = base.tokensOfOwner(msg.sender); if (tokens.length < quantity) _revert(InsufficientNFTBalance.selector); base.batchTransfer( msg.sender, address(this), _getLimitedArray(tokens, quantity) ); _mint(msg.sender, quantity * 10 ** decimals()); emit Wrap(msg.sender, quantity); } function wrap(uint256[] calldata tokenIds) public payable virtual { base.batchTransfer(msg.sender, address(this), tokenIds); _mint(msg.sender, tokenIds.length * 10 ** decimals()); emit Wrap(msg.sender, tokenIds.length); } function unwrap(uint256 quantity) public payable virtual { base.transfer(msg.sender, quantity); _burn(msg.sender, quantity * 10 ** decimals()); emit Unwrap(msg.sender, quantity); } function unwrap(uint256[] calldata tokenIds) public payable virtual { base.batchTransfer(address(this), msg.sender, tokenIds); _burn(msg.sender, tokenIds.length * 10 ** decimals()); emit Unwrap(msg.sender, tokenIds.length); } function name() public view virtual returns (string memory) { return _name; } function symbol() public view virtual returns (string memory) { return _symbol; } function decimals() public view virtual returns (uint8) { return 18; } function totalSupply() public view virtual returns (uint256) { return _totalSupply; } function balanceOf(address account) public view virtual returns (uint256) { return _balances[account]; } function transfer(address to, uint256 value) public virtual returns (bool) { address owner = _msgSender(); _transfer(owner, to, value); return true; } function allowance( address owner, address spender ) public view virtual returns (uint256) { return _allowances[owner][spender]; } function approve( address spender, uint256 value ) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, value); return true; } function transferFrom( address from, address to, uint256 value ) public virtual returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, value); _transfer(from, to, value); return true; } function _transfer(address from, address to, uint256 value) internal { if (from == address(0)) { revert ERC20InvalidSender(address(0)); } if (to == address(0)) { revert ERC20InvalidReceiver(address(0)); } _update(from, to, value); } function _update(address from, address to, uint256 value) internal virtual { if (from == address(0)) { _totalSupply += value; } else { uint256 fromBalance = _balances[from]; if (fromBalance < value) { revert ERC20InsufficientBalance(from, fromBalance, value); } unchecked { _balances[from] = fromBalance - value; } } if (to == address(0)) { unchecked { _totalSupply -= value; } } else { unchecked { _balances[to] += value; } } emit Transfer(from, to, value); } function _mint(address account, uint256 value) internal { if (account == address(0)) { revert ERC20InvalidReceiver(address(0)); } _update(address(0), account, value); } function _burn(address account, uint256 value) internal { if (account == address(0)) { revert ERC20InvalidSender(address(0)); } _update(account, address(0), value); } function _approve(address owner, address spender, uint256 value) internal { _approve(owner, spender, value, true); } function _approve( address owner, address spender, uint256 value, bool emitEvent ) internal virtual { if (owner == address(0)) { revert ERC20InvalidApprover(address(0)); } if (spender == address(0)) { revert ERC20InvalidSpender(address(0)); } _allowances[owner][spender] = value; if (emitEvent) { emit Approval(owner, spender, value); } } function _spendAllowance( address owner, address spender, uint256 value ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { if (currentAllowance < value) { revert ERC20InsufficientAllowance( spender, currentAllowance, value ); } unchecked { _approve(owner, spender, currentAllowance - value, false); } } } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _getLimitedArray( uint256[] memory originalArray, uint256 length ) internal pure returns (uint256[] memory) { if (length > originalArray.length) _revert(InvalidArrayOperation.selector); uint256[] memory limitedArray = new uint256[](length); for (uint256 i = 0; i < length; i++) { limitedArray[i] = originalArray[i]; } return limitedArray; } function _revert(bytes4 errorSelector) internal pure { assembly { mstore(0x00, errorSelector) revert(0x00, 0x04) } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; interface IERC20721T { struct TokenOwnership { address addr; uint64 startTimestamp; bool burned; uint24 extraData; } error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error BalanceQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerQueryForNonexistentToken(); error TransferCallerNotOwnerNorApproved(); error TransferFromIncorrectOwner(); error TransferToNonERC721ReceiverImplementer(); error TransferToZeroAddress(); error URIQueryForNonexistentToken(); error MintERC2309QuantityExceedsLimit(); error OwnershipNotInitializedForExtraData(); error InvalidQueryRange(); error InsufficientBalance(); error InvalidArrayOperation(); event ERC20Transfer( bytes32 indexed topic0, address indexed from, address indexed to, uint256 tokens ) anonymous; event ERC20Approval( bytes32 indexed topic0, address indexed owner, address indexed spender, uint256 tokens ) anonymous; event Transfer( address indexed from, address indexed to, uint256 indexed tokenId ); event Approval( address indexed owner, address indexed approved, uint256 indexed tokenId ); event ApprovalForAll( address indexed owner, address indexed operator, bool approved ); event ConsecutiveTransfer( uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to ); event Locked(uint256 tokenId); event Unlocked(uint256 tokenId); event MetadataUpdate(uint256 _tokenId); function decimals() external view returns (uint256); function name() external view returns (string memory); function symbol() external view returns (string memory); function tokenURI(uint256 tokenId) external view returns (string memory); function ownerOf(uint256 tokenId) external view returns (address); function approve( address _spender, uint256 quantityOrTokenId ) external returns (bool); function getApproved(uint256 tokenId) external view returns (address); function setApprovalForAll(address operator, bool approved) external; function isApprovedForAll( address owner, address operator ) external view returns (bool); function tokensOfOwner( address owner ) external view returns (uint256[] memory); function transfer( address to, uint256 quantity ) external payable returns (bool); function transferFrom( address from, address to, uint256 quantityOrTokenId ) external payable returns (bool); function batchTransfer( address from, address to, uint256[] memory tokenIds ) external; function safeTransferFrom( address from, address to, uint256 tokenId ) external payable; function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) external payable; function supportsInterface(bytes4 interfaceId) external view returns (bool); } interface IERC20721TWrapper { error ERC20InsufficientBalance( address sender, uint256 balance, uint256 needed ); error ERC20InvalidSender(address sender); error ERC20InvalidReceiver(address receiver); error ERC20InsufficientAllowance( address spender, uint256 allowance, uint256 needed ); error ERC20InvalidApprover(address approver); error ERC20InvalidSpender(address spender); error InvalidArrayOperation(); error InsufficientNFTBalance(); event Wrap(address account, uint256 quantity); event Unwrap(address account, uint256 quantity); event Transfer(address indexed from, address indexed to, uint256 value); event Approval( address indexed owner, address indexed spender, uint256 value ); function base() external view returns (IERC20721T); function wrappedTokenPool() external view returns (uint256[] memory); function wrap(uint256 quantity) external payable; function wrap(uint256[] calldata tokenIds) external payable; function unwrap(uint256 quantity) external payable; function unwrap(uint256[] calldata tokenIds) external payable; function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address to, uint256 value) external returns (bool); function allowance( address owner, address spender ) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transferFrom( address from, address to, uint256 value ) external returns (bool); }
{ "evmVersion": "paris", "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"IncorrectAmountOfEther","type":"error"},{"inputs":[],"name":"InsufficientBalance","type":"error"},{"inputs":[],"name":"InvalidArrayOperation","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"Paused","type":"error"},{"inputs":[],"name":"Restricted","type":"error"},{"inputs":[],"name":"SaleInactive","type":"error"},{"inputs":[],"name":"TooFewTokensRemaining","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"WalletMaximumReached","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","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":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":true,"inputs":[{"indexed":true,"internalType":"bytes32","name":"topic0","type":"bytes32"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"ERC20Approval","type":"event"},{"anonymous":true,"inputs":[{"indexed":true,"internalType":"bytes32","name":"topic0","type":"bytes32"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"ERC20Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Locked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"MetadataUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Unlocked","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"admin","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"quantityOrTokenId","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"reserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"saleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"privileged","type":"bool"}],"name":"setAdmin","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":"URI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"active","type":"bool"}],"name":"setSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_walletCap","type":"uint256"}],"name":"setWalletCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"}],"name":"setWrapper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"quantityOrTokenId","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"walletCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wrapper","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405266b1a2bc2ec50000600a556064600b556001600c60006101000a81548160ff0219169083151502179055506040518060800160405280605a815260200162004510605a9139600d908162000059919062000418565b503480156200006757600080fd5b506040518060400160405280600781526020017f54656b6f6d6f6e000000000000000000000000000000000000000000000000008152506040518060400160405280600781526020017f54454b4f4d4f4e000000000000000000000000000000000000000000000000008152508160049081620000e5919062000418565b508060059081620000f7919062000418565b50620001086200016f60201b60201c565b60018190555050506001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff16021790555062000569565b60006001620001836200019460201b60201c565b6200018f91906200052e565b905090565b6000610bb8905090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200022057607f821691505b602082108103620002365762000235620001d8565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620002a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000261565b620002ac868362000261565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620002f9620002f3620002ed84620002c4565b620002ce565b620002c4565b9050919050565b6000819050919050565b6200031583620002d8565b6200032d620003248262000300565b8484546200026e565b825550505050565b600090565b6200034462000335565b620003518184846200030a565b505050565b5b8181101562000379576200036d6000826200033a565b60018101905062000357565b5050565b601f821115620003c85762000392816200023c565b6200039d8462000251565b81016020851015620003ad578190505b620003c5620003bc8562000251565b83018262000356565b50505b505050565b600082821c905092915050565b6000620003ed60001984600802620003cd565b1980831691505092915050565b6000620004088383620003da565b9150826002028217905092915050565b62000423826200019e565b67ffffffffffffffff8111156200043f576200043e620001a9565b5b6200044b825462000207565b620004588282856200037d565b600060209050601f8311600181146200049057600084156200047b578287015190505b620004878582620003fa565b865550620004f7565b601f198416620004a0866200023c565b60005b82811015620004ca57848901518255600182019150602085019450602081019050620004a3565b86831015620004ea5784890151620004e6601f891682620003da565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200053b82620002c4565b91506200054883620002c4565b9250828201905080821115620005635762000562620004ff565b5b92915050565b613f9780620005796000396000f3fe60806040526004361061021a5760003560e01c80636352211e11610123578063a035b1fe116100ab578063b88d4fde1161006f578063b88d4fde146107d3578063c2167d93146107ef578063c87b56dd14610818578063dd62ed3e14610855578063e985e9c5146108925761021a565b8063a035b1fe14610708578063a0712d6814610733578063a22cb4651461074f578063a9059cbb14610778578063ac210cc7146107a85761021a565b806370a08231116100f257806370a0823114610611578063841718a61461064e5780638462151c1461067757806391b7f5ed146106b457806395d89b41146106dd5761021a565b80636352211e1461054357806363a846f81461058057806365a64668146105bd57806368428a1b146105e65761021a565b80633593cebc116101a65780634b0bddd2116101755780634b0bddd21461045e5780634f558e791461048757806355f804b3146104c457806358950c22146104ed5780635c975abb146105185761021a565b80633593cebc146103d95780633ccfd60b1461040257806342842e0e1461041957806342966c68146104355761021a565b8063095ea7b3116101ed578063095ea7b3146102ed57806316c38b3c1461032a57806318160ddd1461035357806323b872dd1461037e578063313ce567146103ae5761021a565b806301ffc9a71461021f57806303339bcb1461025c57806306fdde0314610285578063081812fc146102b0575b600080fd5b34801561022b57600080fd5b50610246600480360381019061024191906130b8565b6108cf565b6040516102539190613100565b60405180910390f35b34801561026857600080fd5b50610283600480360381019061027e91906131af565b610961565b005b34801561029157600080fd5b5061029a6109f8565b6040516102a7919061327f565b60405180910390f35b3480156102bc57600080fd5b506102d760048036038101906102d291906132a1565b610a8a565b6040516102e491906132dd565b60405180910390f35b3480156102f957600080fd5b50610314600480360381019061030f91906132f8565b610ae8565b6040516103219190613100565b60405180910390f35b34801561033657600080fd5b50610351600480360381019061034c9190613364565b610b47565b005b34801561035f57600080fd5b50610368610bed565b60405161037591906133a0565b60405180910390f35b610398600480360381019061039391906133bb565b610c04565b6040516103a59190613100565b60405180910390f35b3480156103ba57600080fd5b506103c3610cc8565b6040516103d091906133a0565b60405180910390f35b3480156103e557600080fd5b5061040060048036038101906103fb9190613556565b610cce565b005b34801561040e57600080fd5b50610417610d77565b005b610433600480360381019061042e91906133bb565b610e49565b005b34801561044157600080fd5b5061045c600480360381019061045791906132a1565b610e69565b005b34801561046a57600080fd5b50610485600480360381019061048091906135c5565b610ebe565b005b34801561049357600080fd5b506104ae60048036038101906104a991906132a1565b610fb1565b6040516104bb9190613100565b60405180910390f35b3480156104d057600080fd5b506104eb60048036038101906104e691906136ba565b610fc3565b005b3480156104f957600080fd5b5061050261105f565b60405161050f91906133a0565b60405180910390f35b34801561052457600080fd5b5061052d611065565b60405161053a9190613100565b60405180910390f35b34801561054f57600080fd5b5061056a600480360381019061056591906132a1565b611078565b60405161057791906132dd565b60405180910390f35b34801561058c57600080fd5b506105a760048036038101906105a29190613703565b61108a565b6040516105b4919061374c565b60405180910390f35b3480156105c957600080fd5b506105e460048036038101906105df91906132a1565b6110aa565b005b3480156105f257600080fd5b506105fb61113d565b6040516106089190613100565b60405180910390f35b34801561061d57600080fd5b5061063860048036038101906106339190613703565b611150565b60405161064591906133a0565b60405180910390f35b34801561065a57600080fd5b5061067560048036038101906106709190613364565b6111e7565b005b34801561068357600080fd5b5061069e60048036038101906106999190613703565b61128d565b6040516106ab9190613825565b60405180910390f35b3480156106c057600080fd5b506106db60048036038101906106d691906132a1565b6112c9565b005b3480156106e957600080fd5b506106f261135c565b6040516106ff919061327f565b60405180910390f35b34801561071457600080fd5b5061071d6113ee565b60405161072a91906133a0565b60405180910390f35b61074d600480360381019061074891906132a1565b6113f4565b005b34801561075b57600080fd5b50610776600480360381019061077191906135c5565b611576565b005b610792600480360381019061078d91906132f8565b611684565b60405161079f9190613100565b60405180910390f35b3480156107b457600080fd5b506107bd61169b565b6040516107ca91906132dd565b60405180910390f35b6107ed60048036038101906107e891906138e8565b6116c4565b005b3480156107fb57600080fd5b5061081660048036038101906108119190613703565b61177b565b005b34801561082457600080fd5b5061083f600480360381019061083a91906132a1565b611810565b60405161084c919061327f565b60405180910390f35b34801561086157600080fd5b5061087c6004803603810190610877919061396b565b61188d565b60405161088991906133a0565b60405180910390f35b34801561089e57600080fd5b506108b960048036038101906108b4919061396b565b611917565b6040516108c69190613100565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061092a57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061095a5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff16146109ea576040517fccc0891300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109f48183611a04565b5050565b606060048054610a07906139da565b80601f0160208091040260200160405190810160405280929190818152602001828054610a33906139da565b8015610a805780601f10610a5557610100808354040283529160200191610a80565b820191906000526020600020905b815481529060010190602001808311610a6357829003601f168201915b5050505050905090565b6000610a9582611a22565b610aaa57610aa963cf4700e460e01b611a81565b5b6008600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000806001610af5611a8b565b610aff9190613a3a565b90508083118015610b1c5750600281610b189190613a6e565b8311155b15610b3057610b2b8484611a95565b610b3c565b610b3b338585611bb8565b5b600191505092915050565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1614610bd0576040517fccc0891300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600c60016101000a81548160ff02191690831515021790555050565b6000610bf7611ca5565b6002546001540303905090565b600080610c0f611a8b565b9050808311610c2857610c23858585611cc0565b610cbb565b600281610c359190613a6e565b8311610cb057610c46858585611d10565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16604051806060016040528060218152602001613f4160219139805190602001206001604051610ca39190613af5565b60405180910390a3610cba565b6000915050610cc1565b5b60019150505b9392505050565b60035481565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16604051806060016040528060218152602001613f4160219139805190602001208351604051610d2b91906133a0565b60405180910390a360005b8151811015610d7157610d648484848481518110610d5757610d56613b10565b5b6020026020010151611d10565b8080600101915050610d36565b50505050565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1614610e00576040517fccc0891300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610e46573d6000803e3d6000fd5b50565b610e64838383604051806020016040528060008152506116c4565b505050565b600c60019054906101000a900460ff1615610eb0576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ebb8160016122ff565b50565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1614610f47576040517fccc0891300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80610f53576000610f56565b60015b600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055505050565b6000610fbc82611a22565b9050919050565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff161461104c576040517fccc0891300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600d908161105b9190613ce1565b5050565b600b5481565b600c60019054906101000a900460ff1681565b600061108382612596565b9050919050565b600e6020528060005260406000206000915054906101000a900460ff1681565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1614611133576040517fccc0891300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600b8190555050565b600c60009054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361119657611195638f4eb60460e01b611a81565b5b67ffffffffffffffff600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1614611270576040517fccc0891300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b60606000611299611ca5565b905060006112a5612642565b905060608183146112be576112bb85848461264c565b90505b809350505050919050565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1614611352576040517fccc0891300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600a8190555050565b60606005805461136b906139da565b80601f0160208091040260200160405190810160405280929190818152602001828054611397906139da565b80156113e45780601f106113b9576101008083540402835291602001916113e4565b820191906000526020600020905b8154815290600101906020018083116113c757829003601f168201915b5050505050905090565b600a5481565b600c60019054906101000a900460ff161561143b576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600c60009054906101000a900460ff16611481576040517f3f88677400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b5461148d33612772565b826114989190613a3a565b11156114d0576040517f1a710ac000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114d8611a8b565b816114e16127c9565b6114eb9190613a3a565b1115611523576040517f53ae7e1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600a546115319190613a6e565b3414611569576040517feb4033ac00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6115733382611a04565b50565b80600960006115836127dc565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116336127dc565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116789190613100565b60405180910390a35050565b6000611691338484611cc0565b6001905092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16604051806060016040528060218152602001613f41602191398051906020012060016040516117219190613af5565b60405180910390a3611734848484611d10565b60008373ffffffffffffffffffffffffffffffffffffffff163b146117755761175f848484846127e4565b6117745761177363d1a57ed660e01b611a81565b5b5b50505050565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1614611804576040517fccc0891300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61180d81612923565b50565b606061181b82611a22565b6118305761182f63a14c4b5060e01b611a81565b5b600061183a612966565b9050600081510361185a5760405180602001604052806000815250611885565b80611864846129f8565b604051602001611875929190613def565b6040516020818303038152906040525b915050919050565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806119fc57508173ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b905092915050565b611a1e828260405180602001604052806000815250612a48565b5050565b600081611a2d611ca5565b11158015611a3c575060015482105b8015611a7a575060007c0100000000000000000000000000000000000000000000000000000000600660008581526020019081526020016000205416145b9050919050565b8060005260046000fd5b6000610bb8905090565b6000611aa082611078565b90508073ffffffffffffffffffffffffffffffffffffffff16611ac16127dc565b73ffffffffffffffffffffffffffffffffffffffff1614611b0357611aed81611ae86127dc565b611917565b611b0257611b0163cfb3b94260e01b611a81565b5b5b826008600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b80600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16604051806060016040528060218152602001613f20602191398051906020012083604051611c9891906133a0565b60405180910390a3505050565b60006001611cb1611a8b565b611cbb9190613a3a565b905090565b6000611ccb8461128d565b90508181511015611ce757611ce663f4d678b860e01b611a81565b5b611d0a848484845111611cfa5783611d05565b611d048486612ac5565b5b610cce565b50505050565b6000611d1b82612596565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611d6157611d6063a114810060e01b611a81565b5b600080611d6d84612b8b565b91509150611d838187611d7e6127dc565b612bb2565b611e3757611d9886611d936127dc565b611917565b611e36576001600960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015611e3557611e346359c896be60e01b611a81565b5b5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611e7c57611e7b63ea553b3460e01b611a81565b5b611e898686866001612bf6565b8015611e9457600082555b600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550611f6285611f3e888887612c4f565b7c020000000000000000000000000000000000000000000000000000000017612c77565b600660008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603611fe85760006001850190506000600660008381526020019081526020016000205403611fe6576001548114611fe5578360066000838152602001908152602001600020819055505b5b505b6000600960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111561210657600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061210090613e13565b91905055505b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16036121cc577f032bc66be43dbccb7487781d168eb7bda224628a3b2c3388bdf69b532a3a16118460405161218891906133a0565b60405180910390a17ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7846040516121bf91906133a0565b60405180910390a161228f565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361228e577ff27b6ce5b2f5e68ddb2fd95a8a909d4ecf1daaac270935fff052feacb24f18428460405161224e91906133a0565b60405180910390a17ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce78460405161228591906133a0565b60405180910390a15b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122f78686866001612ca2565b505050505050565b600061230a83612596565b9050600081905060008061231d86612b8b565b9150915084156123655761233981846123346127dc565b612bb2565b6123645761234e836123496127dc565b611917565b612363576123626359c896be60e01b611a81565b5b5b5b612373836000886001612bf6565b801561237e57600082555b600160806001901b03600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612426836123e385600088612c4f565b7c02000000000000000000000000000000000000000000000000000000007c01000000000000000000000000000000000000000000000000000000001717612c77565b600660008881526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008516036124ac57600060018701905060006006600083815260200190815260200160002054036124aa5760015481146124a9578460066000838152602001908152602001600020819055505b5b505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16604051806060016040528060218152602001613f416021913980519060200120600160405161250a9190613af5565b60405180910390a385600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461257c836000886001612ca2565b600260008154809291906001019190505550505050505050565b600080829050806125a5611ca5565b1161262b5760015481101561262a5760006006600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612628575b6000810361261e5760066000836001900393508381526020019081526020016000205490506125f4565b809250505061263d565b505b5b61263b63df2d9b4260e01b611a81565b505b919050565b6000600154905090565b6060818310612666576126656332c1995a60e01b611a81565b5b61266e611ca5565b8310156126805761267d611ca5565b92505b600061268a612642565b9050808310612697578092505b606060006126a487611150565b9050600085871090508082029150600082146127645781878703116126c95786860391505b60405192506001820160051b830160405260006126e588612ca8565b9050600081604001516126fa57816000015190505b60005b6127068a612cfe565b925060408301516000811461271e5760009250612744565b83511561272a57835192505b8b831860601b612743576001820191508a8260051b8801525b5b5060018a019950888a148061275857508481145b156126fd578086525050505b829450505050509392505050565b600067ffffffffffffffff6040600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b60006127d3611ca5565b60015403905090565b600033905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261280a6127dc565b8786866040518563ffffffff1660e01b815260040161282c9493929190613e91565b6020604051808303816000875af192505050801561286857506040513d601f19601f820116820180604052508101906128659190613ef2565b60015b6128ca573d8060008114612898576040519150601f19603f3d011682016040523d82523d6000602084013e61289d565b606091505b5060008151036128bc576128b763d1a57ed660e01b611a81565b6128c4565b805181602001fd5b5061291a565b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061291b565b5b949350505050565b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6060600d8054612975906139da565b80601f01602080910402602001604051908101604052809291908181526020018280546129a1906139da565b80156129ee5780601f106129c3576101008083540402835291602001916129ee565b820191906000526020600020905b8154815290600101906020018083116129d157829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b600115612a3357600184039350600a81066030018453600a8104905080612a11575b50828103602084039350808452505050919050565b612a528383612d29565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612ac05760006001549050600083820390505b612a9360008683806001019450866127e4565b612aa857612aa763d1a57ed660e01b611a81565b5b818110612a80578160015414612abd57600080fd5b50505b505050565b60608251821115612ae157612ae063b3a6a31060e01b611a81565b5b60008267ffffffffffffffff811115612afd57612afc613413565b5b604051908082528060200260200182016040528015612b2b5781602001602082028036833780820191505090505b50905060005b83811015612b8057848181518110612b4c57612b4b613b10565b5b6020026020010151828281518110612b6757612b66613b10565b5b6020026020010181815250508080600101915050612b31565b508091505092915050565b60008060006008600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b600c60019054906101000a900460ff1615612c3d576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612c4984848484612f08565b50505050565b60008060e883901c905060e8612c66868684612f0e565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b612cb0612ffd565b612cb8611ca5565b8210612cf857612cc6612642565b821015612cf7575b612cd782612f17565b612ce75781600190039150612cce565b612cf082612cfe565b9050612cf9565b5b5b919050565b612d06612ffd565b612d226006600084815260200190815260200160002054612f37565b9050919050565b6000600154905060008203612d4957612d4863b562e8dd60e01b611a81565b5b612d566000848385612bf6565b600160406001901b178202600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612dcd83612dbe6000866000612c4f565b612dc785612fed565b17612c77565b6006600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114612e6e57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612e33565b508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff16604051806060016040528060218152602001613f41602191398051906020012086604051612ecc91906133a0565b60405180910390a360008203612eed57612eec632e07630060e01b611a81565b5b806001819055505050612f036000848385612ca2565b505050565b50505050565b60009392505050565b600080600660008481526020019081526020016000205414159050919050565b612f3f612ffd565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b60006001821460e11b9050919050565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61309581613060565b81146130a057600080fd5b50565b6000813590506130b28161308c565b92915050565b6000602082840312156130ce576130cd613056565b5b60006130dc848285016130a3565b91505092915050565b60008115159050919050565b6130fa816130e5565b82525050565b600060208201905061311560008301846130f1565b92915050565b6000819050919050565b61312e8161311b565b811461313957600080fd5b50565b60008135905061314b81613125565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061317c82613151565b9050919050565b61318c81613171565b811461319757600080fd5b50565b6000813590506131a981613183565b92915050565b600080604083850312156131c6576131c5613056565b5b60006131d48582860161313c565b92505060206131e58582860161319a565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561322957808201518184015260208101905061320e565b60008484015250505050565b6000601f19601f8301169050919050565b6000613251826131ef565b61325b81856131fa565b935061326b81856020860161320b565b61327481613235565b840191505092915050565b600060208201905081810360008301526132998184613246565b905092915050565b6000602082840312156132b7576132b6613056565b5b60006132c58482850161313c565b91505092915050565b6132d781613171565b82525050565b60006020820190506132f260008301846132ce565b92915050565b6000806040838503121561330f5761330e613056565b5b600061331d8582860161319a565b925050602061332e8582860161313c565b9150509250929050565b613341816130e5565b811461334c57600080fd5b50565b60008135905061335e81613338565b92915050565b60006020828403121561337a57613379613056565b5b60006133888482850161334f565b91505092915050565b61339a8161311b565b82525050565b60006020820190506133b56000830184613391565b92915050565b6000806000606084860312156133d4576133d3613056565b5b60006133e28682870161319a565b93505060206133f38682870161319a565b92505060406134048682870161313c565b9150509250925092565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61344b82613235565b810181811067ffffffffffffffff8211171561346a57613469613413565b5b80604052505050565b600061347d61304c565b90506134898282613442565b919050565b600067ffffffffffffffff8211156134a9576134a8613413565b5b602082029050602081019050919050565b600080fd5b60006134d26134cd8461348e565b613473565b905080838252602082019050602084028301858111156134f5576134f46134ba565b5b835b8181101561351e578061350a888261313c565b8452602084019350506020810190506134f7565b5050509392505050565b600082601f83011261353d5761353c61340e565b5b813561354d8482602086016134bf565b91505092915050565b60008060006060848603121561356f5761356e613056565b5b600061357d8682870161319a565b935050602061358e8682870161319a565b925050604084013567ffffffffffffffff8111156135af576135ae61305b565b5b6135bb86828701613528565b9150509250925092565b600080604083850312156135dc576135db613056565b5b60006135ea8582860161319a565b92505060206135fb8582860161334f565b9150509250929050565b600080fd5b600067ffffffffffffffff82111561362557613624613413565b5b61362e82613235565b9050602081019050919050565b82818337600083830152505050565b600061365d6136588461360a565b613473565b90508281526020810184848401111561367957613678613605565b5b61368484828561363b565b509392505050565b600082601f8301126136a1576136a061340e565b5b81356136b184826020860161364a565b91505092915050565b6000602082840312156136d0576136cf613056565b5b600082013567ffffffffffffffff8111156136ee576136ed61305b565b5b6136fa8482850161368c565b91505092915050565b60006020828403121561371957613718613056565b5b60006137278482850161319a565b91505092915050565b600060ff82169050919050565b61374681613730565b82525050565b6000602082019050613761600083018461373d565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61379c8161311b565b82525050565b60006137ae8383613793565b60208301905092915050565b6000602082019050919050565b60006137d282613767565b6137dc8185613772565b93506137e783613783565b8060005b838110156138185781516137ff88826137a2565b975061380a836137ba565b9250506001810190506137eb565b5085935050505092915050565b6000602082019050818103600083015261383f81846137c7565b905092915050565b600067ffffffffffffffff82111561386257613861613413565b5b61386b82613235565b9050602081019050919050565b600061388b61388684613847565b613473565b9050828152602081018484840111156138a7576138a6613605565b5b6138b284828561363b565b509392505050565b600082601f8301126138cf576138ce61340e565b5b81356138df848260208601613878565b91505092915050565b6000806000806080858703121561390257613901613056565b5b60006139108782880161319a565b94505060206139218782880161319a565b93505060406139328782880161313c565b925050606085013567ffffffffffffffff8111156139535761395261305b565b5b61395f878288016138ba565b91505092959194509250565b6000806040838503121561398257613981613056565b5b60006139908582860161319a565b92505060206139a18582860161319a565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806139f257607f821691505b602082108103613a0557613a046139ab565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613a458261311b565b9150613a508361311b565b9250828201905080821115613a6857613a67613a0b565b5b92915050565b6000613a798261311b565b9150613a848361311b565b9250828202613a928161311b565b91508282048414831517613aa957613aa8613a0b565b5b5092915050565b6000819050919050565b6000819050919050565b6000613adf613ada613ad584613ab0565b613aba565b61311b565b9050919050565b613aef81613ac4565b82525050565b6000602082019050613b0a6000830184613ae6565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613ba17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613b64565b613bab8683613b64565b95508019841693508086168417925050509392505050565b6000613bde613bd9613bd48461311b565b613aba565b61311b565b9050919050565b6000819050919050565b613bf883613bc3565b613c0c613c0482613be5565b848454613b71565b825550505050565b600090565b613c21613c14565b613c2c818484613bef565b505050565b5b81811015613c5057613c45600082613c19565b600181019050613c32565b5050565b601f821115613c9557613c6681613b3f565b613c6f84613b54565b81016020851015613c7e578190505b613c92613c8a85613b54565b830182613c31565b50505b505050565b600082821c905092915050565b6000613cb860001984600802613c9a565b1980831691505092915050565b6000613cd18383613ca7565b9150826002028217905092915050565b613cea826131ef565b67ffffffffffffffff811115613d0357613d02613413565b5b613d0d82546139da565b613d18828285613c54565b600060209050601f831160018114613d4b5760008415613d39578287015190505b613d438582613cc5565b865550613dab565b601f198416613d5986613b3f565b60005b82811015613d8157848901518255600182019150602085019450602081019050613d5c565b86831015613d9e5784890151613d9a601f891682613ca7565b8355505b6001600288020188555050505b505050505050565b600081905092915050565b6000613dc9826131ef565b613dd38185613db3565b9350613de381856020860161320b565b80840191505092915050565b6000613dfb8285613dbe565b9150613e078284613dbe565b91508190509392505050565b6000613e1e8261311b565b915060008203613e3157613e30613a0b565b5b600182039050919050565b600081519050919050565b600082825260208201905092915050565b6000613e6382613e3c565b613e6d8185613e47565b9350613e7d81856020860161320b565b613e8681613235565b840191505092915050565b6000608082019050613ea660008301876132ce565b613eb360208301866132ce565b613ec06040830185613391565b8181036060830152613ed28184613e58565b905095945050505050565b600081519050613eec8161308c565b92915050565b600060208284031215613f0857613f07613056565b5b6000613f1684828501613edd565b9150509291505056fe417070726f76616c28616464726573732c616464726573732c75696e74323536295472616e7366657228616464726573732c616464726573732c75696e7432353629a264697066735822122048e1d0c88e988f79a5ffdbaa436cbde1c278cba9d98fca6c375d93a828bd00ee64736f6c6343000818003368747470733a2f2f6e667473746f726167652e6c696e6b2f697066732f6261666b72656963746b7033323467776132726a68743461666f6a6474647274727132667566797571636969676269376e3278726a356f666971752f3f
Deployed Bytecode
0x60806040526004361061021a5760003560e01c80636352211e11610123578063a035b1fe116100ab578063b88d4fde1161006f578063b88d4fde146107d3578063c2167d93146107ef578063c87b56dd14610818578063dd62ed3e14610855578063e985e9c5146108925761021a565b8063a035b1fe14610708578063a0712d6814610733578063a22cb4651461074f578063a9059cbb14610778578063ac210cc7146107a85761021a565b806370a08231116100f257806370a0823114610611578063841718a61461064e5780638462151c1461067757806391b7f5ed146106b457806395d89b41146106dd5761021a565b80636352211e1461054357806363a846f81461058057806365a64668146105bd57806368428a1b146105e65761021a565b80633593cebc116101a65780634b0bddd2116101755780634b0bddd21461045e5780634f558e791461048757806355f804b3146104c457806358950c22146104ed5780635c975abb146105185761021a565b80633593cebc146103d95780633ccfd60b1461040257806342842e0e1461041957806342966c68146104355761021a565b8063095ea7b3116101ed578063095ea7b3146102ed57806316c38b3c1461032a57806318160ddd1461035357806323b872dd1461037e578063313ce567146103ae5761021a565b806301ffc9a71461021f57806303339bcb1461025c57806306fdde0314610285578063081812fc146102b0575b600080fd5b34801561022b57600080fd5b50610246600480360381019061024191906130b8565b6108cf565b6040516102539190613100565b60405180910390f35b34801561026857600080fd5b50610283600480360381019061027e91906131af565b610961565b005b34801561029157600080fd5b5061029a6109f8565b6040516102a7919061327f565b60405180910390f35b3480156102bc57600080fd5b506102d760048036038101906102d291906132a1565b610a8a565b6040516102e491906132dd565b60405180910390f35b3480156102f957600080fd5b50610314600480360381019061030f91906132f8565b610ae8565b6040516103219190613100565b60405180910390f35b34801561033657600080fd5b50610351600480360381019061034c9190613364565b610b47565b005b34801561035f57600080fd5b50610368610bed565b60405161037591906133a0565b60405180910390f35b610398600480360381019061039391906133bb565b610c04565b6040516103a59190613100565b60405180910390f35b3480156103ba57600080fd5b506103c3610cc8565b6040516103d091906133a0565b60405180910390f35b3480156103e557600080fd5b5061040060048036038101906103fb9190613556565b610cce565b005b34801561040e57600080fd5b50610417610d77565b005b610433600480360381019061042e91906133bb565b610e49565b005b34801561044157600080fd5b5061045c600480360381019061045791906132a1565b610e69565b005b34801561046a57600080fd5b50610485600480360381019061048091906135c5565b610ebe565b005b34801561049357600080fd5b506104ae60048036038101906104a991906132a1565b610fb1565b6040516104bb9190613100565b60405180910390f35b3480156104d057600080fd5b506104eb60048036038101906104e691906136ba565b610fc3565b005b3480156104f957600080fd5b5061050261105f565b60405161050f91906133a0565b60405180910390f35b34801561052457600080fd5b5061052d611065565b60405161053a9190613100565b60405180910390f35b34801561054f57600080fd5b5061056a600480360381019061056591906132a1565b611078565b60405161057791906132dd565b60405180910390f35b34801561058c57600080fd5b506105a760048036038101906105a29190613703565b61108a565b6040516105b4919061374c565b60405180910390f35b3480156105c957600080fd5b506105e460048036038101906105df91906132a1565b6110aa565b005b3480156105f257600080fd5b506105fb61113d565b6040516106089190613100565b60405180910390f35b34801561061d57600080fd5b5061063860048036038101906106339190613703565b611150565b60405161064591906133a0565b60405180910390f35b34801561065a57600080fd5b5061067560048036038101906106709190613364565b6111e7565b005b34801561068357600080fd5b5061069e60048036038101906106999190613703565b61128d565b6040516106ab9190613825565b60405180910390f35b3480156106c057600080fd5b506106db60048036038101906106d691906132a1565b6112c9565b005b3480156106e957600080fd5b506106f261135c565b6040516106ff919061327f565b60405180910390f35b34801561071457600080fd5b5061071d6113ee565b60405161072a91906133a0565b60405180910390f35b61074d600480360381019061074891906132a1565b6113f4565b005b34801561075b57600080fd5b50610776600480360381019061077191906135c5565b611576565b005b610792600480360381019061078d91906132f8565b611684565b60405161079f9190613100565b60405180910390f35b3480156107b457600080fd5b506107bd61169b565b6040516107ca91906132dd565b60405180910390f35b6107ed60048036038101906107e891906138e8565b6116c4565b005b3480156107fb57600080fd5b5061081660048036038101906108119190613703565b61177b565b005b34801561082457600080fd5b5061083f600480360381019061083a91906132a1565b611810565b60405161084c919061327f565b60405180910390f35b34801561086157600080fd5b5061087c6004803603810190610877919061396b565b61188d565b60405161088991906133a0565b60405180910390f35b34801561089e57600080fd5b506108b960048036038101906108b4919061396b565b611917565b6040516108c69190613100565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061092a57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061095a5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff16146109ea576040517fccc0891300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109f48183611a04565b5050565b606060048054610a07906139da565b80601f0160208091040260200160405190810160405280929190818152602001828054610a33906139da565b8015610a805780601f10610a5557610100808354040283529160200191610a80565b820191906000526020600020905b815481529060010190602001808311610a6357829003601f168201915b5050505050905090565b6000610a9582611a22565b610aaa57610aa963cf4700e460e01b611a81565b5b6008600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000806001610af5611a8b565b610aff9190613a3a565b90508083118015610b1c5750600281610b189190613a6e565b8311155b15610b3057610b2b8484611a95565b610b3c565b610b3b338585611bb8565b5b600191505092915050565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1614610bd0576040517fccc0891300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600c60016101000a81548160ff02191690831515021790555050565b6000610bf7611ca5565b6002546001540303905090565b600080610c0f611a8b565b9050808311610c2857610c23858585611cc0565b610cbb565b600281610c359190613a6e565b8311610cb057610c46858585611d10565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16604051806060016040528060218152602001613f4160219139805190602001206001604051610ca39190613af5565b60405180910390a3610cba565b6000915050610cc1565b5b60019150505b9392505050565b60035481565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16604051806060016040528060218152602001613f4160219139805190602001208351604051610d2b91906133a0565b60405180910390a360005b8151811015610d7157610d648484848481518110610d5757610d56613b10565b5b6020026020010151611d10565b8080600101915050610d36565b50505050565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1614610e00576040517fccc0891300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610e46573d6000803e3d6000fd5b50565b610e64838383604051806020016040528060008152506116c4565b505050565b600c60019054906101000a900460ff1615610eb0576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ebb8160016122ff565b50565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1614610f47576040517fccc0891300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80610f53576000610f56565b60015b600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055505050565b6000610fbc82611a22565b9050919050565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff161461104c576040517fccc0891300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600d908161105b9190613ce1565b5050565b600b5481565b600c60019054906101000a900460ff1681565b600061108382612596565b9050919050565b600e6020528060005260406000206000915054906101000a900460ff1681565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1614611133576040517fccc0891300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600b8190555050565b600c60009054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361119657611195638f4eb60460e01b611a81565b5b67ffffffffffffffff600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1614611270576040517fccc0891300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b60606000611299611ca5565b905060006112a5612642565b905060608183146112be576112bb85848461264c565b90505b809350505050919050565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1614611352576040517fccc0891300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600a8190555050565b60606005805461136b906139da565b80601f0160208091040260200160405190810160405280929190818152602001828054611397906139da565b80156113e45780601f106113b9576101008083540402835291602001916113e4565b820191906000526020600020905b8154815290600101906020018083116113c757829003601f168201915b5050505050905090565b600a5481565b600c60019054906101000a900460ff161561143b576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600c60009054906101000a900460ff16611481576040517f3f88677400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b5461148d33612772565b826114989190613a3a565b11156114d0576040517f1a710ac000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114d8611a8b565b816114e16127c9565b6114eb9190613a3a565b1115611523576040517f53ae7e1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600a546115319190613a6e565b3414611569576040517feb4033ac00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6115733382611a04565b50565b80600960006115836127dc565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116336127dc565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116789190613100565b60405180910390a35050565b6000611691338484611cc0565b6001905092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16604051806060016040528060218152602001613f41602191398051906020012060016040516117219190613af5565b60405180910390a3611734848484611d10565b60008373ffffffffffffffffffffffffffffffffffffffff163b146117755761175f848484846127e4565b6117745761177363d1a57ed660e01b611a81565b5b5b50505050565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1614611804576040517fccc0891300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61180d81612923565b50565b606061181b82611a22565b6118305761182f63a14c4b5060e01b611a81565b5b600061183a612966565b9050600081510361185a5760405180602001604052806000815250611885565b80611864846129f8565b604051602001611875929190613def565b6040516020818303038152906040525b915050919050565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806119fc57508173ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b905092915050565b611a1e828260405180602001604052806000815250612a48565b5050565b600081611a2d611ca5565b11158015611a3c575060015482105b8015611a7a575060007c0100000000000000000000000000000000000000000000000000000000600660008581526020019081526020016000205416145b9050919050565b8060005260046000fd5b6000610bb8905090565b6000611aa082611078565b90508073ffffffffffffffffffffffffffffffffffffffff16611ac16127dc565b73ffffffffffffffffffffffffffffffffffffffff1614611b0357611aed81611ae86127dc565b611917565b611b0257611b0163cfb3b94260e01b611a81565b5b5b826008600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b80600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16604051806060016040528060218152602001613f20602191398051906020012083604051611c9891906133a0565b60405180910390a3505050565b60006001611cb1611a8b565b611cbb9190613a3a565b905090565b6000611ccb8461128d565b90508181511015611ce757611ce663f4d678b860e01b611a81565b5b611d0a848484845111611cfa5783611d05565b611d048486612ac5565b5b610cce565b50505050565b6000611d1b82612596565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611d6157611d6063a114810060e01b611a81565b5b600080611d6d84612b8b565b91509150611d838187611d7e6127dc565b612bb2565b611e3757611d9886611d936127dc565b611917565b611e36576001600960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015611e3557611e346359c896be60e01b611a81565b5b5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611e7c57611e7b63ea553b3460e01b611a81565b5b611e898686866001612bf6565b8015611e9457600082555b600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550611f6285611f3e888887612c4f565b7c020000000000000000000000000000000000000000000000000000000017612c77565b600660008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603611fe85760006001850190506000600660008381526020019081526020016000205403611fe6576001548114611fe5578360066000838152602001908152602001600020819055505b5b505b6000600960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111561210657600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061210090613e13565b91905055505b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16036121cc577f032bc66be43dbccb7487781d168eb7bda224628a3b2c3388bdf69b532a3a16118460405161218891906133a0565b60405180910390a17ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7846040516121bf91906133a0565b60405180910390a161228f565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361228e577ff27b6ce5b2f5e68ddb2fd95a8a909d4ecf1daaac270935fff052feacb24f18428460405161224e91906133a0565b60405180910390a17ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce78460405161228591906133a0565b60405180910390a15b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122f78686866001612ca2565b505050505050565b600061230a83612596565b9050600081905060008061231d86612b8b565b9150915084156123655761233981846123346127dc565b612bb2565b6123645761234e836123496127dc565b611917565b612363576123626359c896be60e01b611a81565b5b5b5b612373836000886001612bf6565b801561237e57600082555b600160806001901b03600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612426836123e385600088612c4f565b7c02000000000000000000000000000000000000000000000000000000007c01000000000000000000000000000000000000000000000000000000001717612c77565b600660008881526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008516036124ac57600060018701905060006006600083815260200190815260200160002054036124aa5760015481146124a9578460066000838152602001908152602001600020819055505b5b505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16604051806060016040528060218152602001613f416021913980519060200120600160405161250a9190613af5565b60405180910390a385600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461257c836000886001612ca2565b600260008154809291906001019190505550505050505050565b600080829050806125a5611ca5565b1161262b5760015481101561262a5760006006600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612628575b6000810361261e5760066000836001900393508381526020019081526020016000205490506125f4565b809250505061263d565b505b5b61263b63df2d9b4260e01b611a81565b505b919050565b6000600154905090565b6060818310612666576126656332c1995a60e01b611a81565b5b61266e611ca5565b8310156126805761267d611ca5565b92505b600061268a612642565b9050808310612697578092505b606060006126a487611150565b9050600085871090508082029150600082146127645781878703116126c95786860391505b60405192506001820160051b830160405260006126e588612ca8565b9050600081604001516126fa57816000015190505b60005b6127068a612cfe565b925060408301516000811461271e5760009250612744565b83511561272a57835192505b8b831860601b612743576001820191508a8260051b8801525b5b5060018a019950888a148061275857508481145b156126fd578086525050505b829450505050509392505050565b600067ffffffffffffffff6040600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b60006127d3611ca5565b60015403905090565b600033905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261280a6127dc565b8786866040518563ffffffff1660e01b815260040161282c9493929190613e91565b6020604051808303816000875af192505050801561286857506040513d601f19601f820116820180604052508101906128659190613ef2565b60015b6128ca573d8060008114612898576040519150601f19603f3d011682016040523d82523d6000602084013e61289d565b606091505b5060008151036128bc576128b763d1a57ed660e01b611a81565b6128c4565b805181602001fd5b5061291a565b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061291b565b5b949350505050565b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6060600d8054612975906139da565b80601f01602080910402602001604051908101604052809291908181526020018280546129a1906139da565b80156129ee5780601f106129c3576101008083540402835291602001916129ee565b820191906000526020600020905b8154815290600101906020018083116129d157829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b600115612a3357600184039350600a81066030018453600a8104905080612a11575b50828103602084039350808452505050919050565b612a528383612d29565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612ac05760006001549050600083820390505b612a9360008683806001019450866127e4565b612aa857612aa763d1a57ed660e01b611a81565b5b818110612a80578160015414612abd57600080fd5b50505b505050565b60608251821115612ae157612ae063b3a6a31060e01b611a81565b5b60008267ffffffffffffffff811115612afd57612afc613413565b5b604051908082528060200260200182016040528015612b2b5781602001602082028036833780820191505090505b50905060005b83811015612b8057848181518110612b4c57612b4b613b10565b5b6020026020010151828281518110612b6757612b66613b10565b5b6020026020010181815250508080600101915050612b31565b508091505092915050565b60008060006008600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b600c60019054906101000a900460ff1615612c3d576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612c4984848484612f08565b50505050565b60008060e883901c905060e8612c66868684612f0e565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b612cb0612ffd565b612cb8611ca5565b8210612cf857612cc6612642565b821015612cf7575b612cd782612f17565b612ce75781600190039150612cce565b612cf082612cfe565b9050612cf9565b5b5b919050565b612d06612ffd565b612d226006600084815260200190815260200160002054612f37565b9050919050565b6000600154905060008203612d4957612d4863b562e8dd60e01b611a81565b5b612d566000848385612bf6565b600160406001901b178202600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612dcd83612dbe6000866000612c4f565b612dc785612fed565b17612c77565b6006600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114612e6e57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612e33565b508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff16604051806060016040528060218152602001613f41602191398051906020012086604051612ecc91906133a0565b60405180910390a360008203612eed57612eec632e07630060e01b611a81565b5b806001819055505050612f036000848385612ca2565b505050565b50505050565b60009392505050565b600080600660008481526020019081526020016000205414159050919050565b612f3f612ffd565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b60006001821460e11b9050919050565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61309581613060565b81146130a057600080fd5b50565b6000813590506130b28161308c565b92915050565b6000602082840312156130ce576130cd613056565b5b60006130dc848285016130a3565b91505092915050565b60008115159050919050565b6130fa816130e5565b82525050565b600060208201905061311560008301846130f1565b92915050565b6000819050919050565b61312e8161311b565b811461313957600080fd5b50565b60008135905061314b81613125565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061317c82613151565b9050919050565b61318c81613171565b811461319757600080fd5b50565b6000813590506131a981613183565b92915050565b600080604083850312156131c6576131c5613056565b5b60006131d48582860161313c565b92505060206131e58582860161319a565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561322957808201518184015260208101905061320e565b60008484015250505050565b6000601f19601f8301169050919050565b6000613251826131ef565b61325b81856131fa565b935061326b81856020860161320b565b61327481613235565b840191505092915050565b600060208201905081810360008301526132998184613246565b905092915050565b6000602082840312156132b7576132b6613056565b5b60006132c58482850161313c565b91505092915050565b6132d781613171565b82525050565b60006020820190506132f260008301846132ce565b92915050565b6000806040838503121561330f5761330e613056565b5b600061331d8582860161319a565b925050602061332e8582860161313c565b9150509250929050565b613341816130e5565b811461334c57600080fd5b50565b60008135905061335e81613338565b92915050565b60006020828403121561337a57613379613056565b5b60006133888482850161334f565b91505092915050565b61339a8161311b565b82525050565b60006020820190506133b56000830184613391565b92915050565b6000806000606084860312156133d4576133d3613056565b5b60006133e28682870161319a565b93505060206133f38682870161319a565b92505060406134048682870161313c565b9150509250925092565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61344b82613235565b810181811067ffffffffffffffff8211171561346a57613469613413565b5b80604052505050565b600061347d61304c565b90506134898282613442565b919050565b600067ffffffffffffffff8211156134a9576134a8613413565b5b602082029050602081019050919050565b600080fd5b60006134d26134cd8461348e565b613473565b905080838252602082019050602084028301858111156134f5576134f46134ba565b5b835b8181101561351e578061350a888261313c565b8452602084019350506020810190506134f7565b5050509392505050565b600082601f83011261353d5761353c61340e565b5b813561354d8482602086016134bf565b91505092915050565b60008060006060848603121561356f5761356e613056565b5b600061357d8682870161319a565b935050602061358e8682870161319a565b925050604084013567ffffffffffffffff8111156135af576135ae61305b565b5b6135bb86828701613528565b9150509250925092565b600080604083850312156135dc576135db613056565b5b60006135ea8582860161319a565b92505060206135fb8582860161334f565b9150509250929050565b600080fd5b600067ffffffffffffffff82111561362557613624613413565b5b61362e82613235565b9050602081019050919050565b82818337600083830152505050565b600061365d6136588461360a565b613473565b90508281526020810184848401111561367957613678613605565b5b61368484828561363b565b509392505050565b600082601f8301126136a1576136a061340e565b5b81356136b184826020860161364a565b91505092915050565b6000602082840312156136d0576136cf613056565b5b600082013567ffffffffffffffff8111156136ee576136ed61305b565b5b6136fa8482850161368c565b91505092915050565b60006020828403121561371957613718613056565b5b60006137278482850161319a565b91505092915050565b600060ff82169050919050565b61374681613730565b82525050565b6000602082019050613761600083018461373d565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61379c8161311b565b82525050565b60006137ae8383613793565b60208301905092915050565b6000602082019050919050565b60006137d282613767565b6137dc8185613772565b93506137e783613783565b8060005b838110156138185781516137ff88826137a2565b975061380a836137ba565b9250506001810190506137eb565b5085935050505092915050565b6000602082019050818103600083015261383f81846137c7565b905092915050565b600067ffffffffffffffff82111561386257613861613413565b5b61386b82613235565b9050602081019050919050565b600061388b61388684613847565b613473565b9050828152602081018484840111156138a7576138a6613605565b5b6138b284828561363b565b509392505050565b600082601f8301126138cf576138ce61340e565b5b81356138df848260208601613878565b91505092915050565b6000806000806080858703121561390257613901613056565b5b60006139108782880161319a565b94505060206139218782880161319a565b93505060406139328782880161313c565b925050606085013567ffffffffffffffff8111156139535761395261305b565b5b61395f878288016138ba565b91505092959194509250565b6000806040838503121561398257613981613056565b5b60006139908582860161319a565b92505060206139a18582860161319a565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806139f257607f821691505b602082108103613a0557613a046139ab565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613a458261311b565b9150613a508361311b565b9250828201905080821115613a6857613a67613a0b565b5b92915050565b6000613a798261311b565b9150613a848361311b565b9250828202613a928161311b565b91508282048414831517613aa957613aa8613a0b565b5b5092915050565b6000819050919050565b6000819050919050565b6000613adf613ada613ad584613ab0565b613aba565b61311b565b9050919050565b613aef81613ac4565b82525050565b6000602082019050613b0a6000830184613ae6565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613ba17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613b64565b613bab8683613b64565b95508019841693508086168417925050509392505050565b6000613bde613bd9613bd48461311b565b613aba565b61311b565b9050919050565b6000819050919050565b613bf883613bc3565b613c0c613c0482613be5565b848454613b71565b825550505050565b600090565b613c21613c14565b613c2c818484613bef565b505050565b5b81811015613c5057613c45600082613c19565b600181019050613c32565b5050565b601f821115613c9557613c6681613b3f565b613c6f84613b54565b81016020851015613c7e578190505b613c92613c8a85613b54565b830182613c31565b50505b505050565b600082821c905092915050565b6000613cb860001984600802613c9a565b1980831691505092915050565b6000613cd18383613ca7565b9150826002028217905092915050565b613cea826131ef565b67ffffffffffffffff811115613d0357613d02613413565b5b613d0d82546139da565b613d18828285613c54565b600060209050601f831160018114613d4b5760008415613d39578287015190505b613d438582613cc5565b865550613dab565b601f198416613d5986613b3f565b60005b82811015613d8157848901518255600182019150602085019450602081019050613d5c565b86831015613d9e5784890151613d9a601f891682613ca7565b8355505b6001600288020188555050505b505050505050565b600081905092915050565b6000613dc9826131ef565b613dd38185613db3565b9350613de381856020860161320b565b80840191505092915050565b6000613dfb8285613dbe565b9150613e078284613dbe565b91508190509392505050565b6000613e1e8261311b565b915060008203613e3157613e30613a0b565b5b600182039050919050565b600081519050919050565b600082825260208201905092915050565b6000613e6382613e3c565b613e6d8185613e47565b9350613e7d81856020860161320b565b613e8681613235565b840191505092915050565b6000608082019050613ea660008301876132ce565b613eb360208301866132ce565b613ec06040830185613391565b8181036060830152613ed28184613e58565b905095945050505050565b600081519050613eec8161308c565b92915050565b600060208284031215613f0857613f07613056565b5b6000613f1684828501613edd565b9150509291505056fe417070726f76616c28616464726573732c616464726573732c75696e74323536295472616e7366657228616464726573732c616464726573732c75696e7432353629a264697066735822122048e1d0c88e988f79a5ffdbaa436cbde1c278cba9d98fca6c375d93a828bd00ee64736f6c63430008180033
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.