ERC-721
Overview
Max Total Supply
256 CELL
Holders
49
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 CELLLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
CellMates
Compiler Version
v0.8.24+commit.e11b9ed9
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.19; import "./Metadata.sol"; /* CellMates (CELL) An experimental hybrid of ERC-20 & ERC-721. - 256 total supply - 1 ETH + 128 CELL initial liquidity - 0.1 ETH mint from contract price - sellable on both Uniswap and Opensea - fully on-chain artwork based on cellular automata https://cellmates.io */ interface Receiver { function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes calldata _data) external returns (bytes4); } interface Router { function WETH() external pure returns (address); function factory() external pure returns (address); function addLiquidityETH(address, uint256, uint256, uint256, address, uint256) external payable returns (uint256, uint256, uint256); } interface Factory { function createPair(address, address) external returns (address); } contract CellMates { uint256 constant private UINT_MAX = type(uint256).max; uint256 constant private TOTAL_SUPPLY = 256; uint256 constant private LIQUIDITY_TOKENS = 128; Router constant private ROUTER = Router(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); uint256 constant private M1 = 0x5555555555555555555555555555555555555555555555555555555555555555; uint256 constant private M2 = 0x3333333333333333333333333333333333333333333333333333333333333333; uint256 constant private M4 = 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f; uint256 constant private H01 = 0x0101010101010101010101010101010101010101010101010101010101010101; bytes32 constant private TRANSFER_TOPIC = keccak256(bytes("Transfer(address,address,uint256)")); bytes32 constant private APPROVAL_TOPIC = keccak256(bytes("Approval(address,address,uint256)")); uint256 constant public MINT_COST = 0.1 ether; uint8 constant public decimals = 0; struct User { bytes32 mask; mapping(address => uint256) allowance; mapping(address => bool) approved; } struct Info { bytes32 salt; address pair; address owner; Metadata metadata; mapping(address => User) users; mapping(uint256 => address) approved; address[] holders; } Info private info; mapping(bytes4 => bool) public supportsInterface; event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); event ERC20Transfer(bytes32 indexed topic0, address indexed from, address indexed to, uint256 tokens) anonymous; event Approval(address indexed owner, address indexed spender, uint256 indexed tokenId); event ERC20Approval(bytes32 indexed topic0, address indexed owner, address indexed spender, uint256 tokens) anonymous; event ApprovalForAll(address indexed owner, address indexed operator, bool approved); modifier _onlyOwner() { require(msg.sender == owner()); _; } constructor() payable { require(msg.value > 0); info.owner = 0xFaDED72464D6e76e37300B467673b36ECc4d2ccF; info.metadata = new Metadata(); supportsInterface[0x01ffc9a7] = true; // ERC-165 supportsInterface[0x80ac58cd] = true; // ERC-721 supportsInterface[0x5b5e139f] = true; // Metadata info.salt = keccak256(abi.encodePacked("Salt:", blockhash(block.number - 1))); } function setOwner(address _owner) external _onlyOwner { info.owner = _owner; } function setMetadata(Metadata _metadata) external _onlyOwner { info.metadata = _metadata; } function initialize() external { require(pair() == address(0x0)); address _this = address(this); address _weth = ROUTER.WETH(); info.users[_this].mask = bytes32(UINT_MAX); info.holders.push(_this); emit ERC20Transfer(TRANSFER_TOPIC, address(0x0), _this, TOTAL_SUPPLY); for (uint256 i = 0; i < TOTAL_SUPPLY; i++) { emit Transfer(address(0x0), _this, TOTAL_SUPPLY + i + 1); } _approveERC20(_this, address(ROUTER), LIQUIDITY_TOKENS); info.pair = Factory(ROUTER.factory()).createPair(_weth, _this); ROUTER.addLiquidityETH{value:_this.balance}(_this, LIQUIDITY_TOKENS, 0, 0, owner(), block.timestamp); _transferERC20(_this, 0xEC513e5959dBB02F314fc2F30041FCA2685119F3, 10); // marketing + giveaways _transferERC20(_this, owner(), 10); // developer tokens } function mint(uint256 _tokens) external payable { address _this = address(this); uint256 _available = balanceOf(_this); require(_tokens <= _available); uint256 _cost = _tokens * MINT_COST; require(msg.value >= _cost); _transferERC20(_this, msg.sender, _tokens); payable(owner()).transfer(_cost); if (msg.value > _cost) { payable(msg.sender).transfer(msg.value - _cost); } } function approve(address _spender, uint256 _tokens) external returns (bool) { if (_tokens > TOTAL_SUPPLY && _tokens <= 2 * TOTAL_SUPPLY) { _approveNFT(_spender, _tokens); } else { _approveERC20(msg.sender, _spender, _tokens); } return true; } function setApprovalForAll(address _operator, bool _approved) external { info.users[msg.sender].approved[_operator] = _approved; emit ApprovalForAll(msg.sender, _operator, _approved); } function transfer(address _to, uint256 _tokens) external returns (bool) { _transferERC20(msg.sender, _to, _tokens); return true; } function transferFrom(address _from, address _to, uint256 _tokens) external returns (bool) { if (_tokens > TOTAL_SUPPLY && _tokens <= 2 * TOTAL_SUPPLY) { _transferNFT(_from, _to, _tokens); } else { uint256 _allowance = allowance(_from, msg.sender); require(_allowance >= _tokens); if (_allowance != UINT_MAX) { info.users[_from].allowance[msg.sender] -= _tokens; } _transferERC20(_from, _to, _tokens); } return true; } function safeTransferFrom(address _from, address _to, uint256 _tokenId) external { safeTransferFrom(_from, _to, _tokenId, ""); } function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes memory _data) public { _transferNFT(_from, _to, _tokenId); uint32 _size; assembly { _size := extcodesize(_to) } if (_size > 0) { require(Receiver(_to).onERC721Received(msg.sender, _from, _tokenId, _data) == 0x150b7a02); } } function bulkTransfer(address _to, uint256[] memory _tokenIds) external { _transferNFTs(_to, _tokenIds); } function owner() public view returns (address) { return info.owner; } function pair() public view returns (address) { return info.pair; } function holders() public view returns (address[] memory) { return info.holders; } function salt() external view returns (bytes32) { return info.salt; } function metadata() external view returns (address) { return address(info.metadata); } function name() external view returns (string memory) { return info.metadata.name(); } function symbol() external view returns (string memory) { return info.metadata.symbol(); } function tokenURI(uint256 _tokenId) public view returns (string memory) { return info.metadata.tokenURI(_tokenId); } function totalSupply() public pure returns (uint256) { return TOTAL_SUPPLY; } function maskOf(address _user) public view returns (bytes32) { return info.users[_user].mask; } function balanceOf(address _user) public view returns (uint256) { return _popcount(maskOf(_user)); } function allowance(address _user, address _spender) public view returns (uint256) { return info.users[_user].allowance[_spender]; } function ownerOf(uint256 _tokenId) public view returns (address) { unchecked { require(_tokenId > TOTAL_SUPPLY && _tokenId <= 2 * TOTAL_SUPPLY); bytes32 _mask = bytes32(1 << (_tokenId - TOTAL_SUPPLY - 1)); address[] memory _holders = holders(); for (uint256 i = 0; i < _holders.length; i++) { if (maskOf(_holders[i]) & _mask == _mask) { return _holders[i]; } } return address(0x0); } } function getApproved(uint256 _tokenId) public view returns (address) { require(_tokenId > TOTAL_SUPPLY && _tokenId <= 2 * TOTAL_SUPPLY); return info.approved[_tokenId]; } function isApprovedForAll(address _owner, address _operator) public view returns (bool) { return info.users[_owner].approved[_operator]; } function getToken(uint256 _tokenId) public view returns (address tokenOwner, address approved, string memory uri) { return (ownerOf(_tokenId), getApproved(_tokenId), tokenURI(_tokenId)); } function getTokens(uint256[] memory _tokenIds) external view returns (address[] memory owners, address[] memory approveds, string[] memory uris) { uint256 _length = _tokenIds.length; owners = new address[](_length); approveds = new address[](_length); uris = new string[](_length); for (uint256 i = 0; i < _length; i++) { (owners[i], approveds[i], uris[i]) = getToken(_tokenIds[i]); } } function _approveERC20(address _owner, address _spender, uint256 _tokens) internal { info.users[_owner].allowance[_spender] = _tokens; emit ERC20Approval(APPROVAL_TOPIC, _owner, _spender, _tokens); } function _approveNFT(address _spender, uint256 _tokenId) internal { bytes32 _mask = bytes32(1 << (_tokenId - TOTAL_SUPPLY - 1)); require(maskOf(msg.sender) & _mask == _mask); info.approved[_tokenId] = _spender; emit Approval(msg.sender, _spender, _tokenId); } function _transferERC20(address _from, address _to, uint256 _tokens) internal { unchecked { bytes32 _mask; uint256 _pos = 0; uint256 _count = 0; uint256 _n = uint256(maskOf(_from)); uint256[] memory _tokenIds = new uint256[](_tokens); while (_n > 0 && _count < _tokens) { if (_n & 1 == 1) { _mask |= bytes32(1 << _pos); _tokenIds[_count++] = TOTAL_SUPPLY + _pos + 1; } _pos++; _n >>= 1; } require(_count == _tokens); require(maskOf(_from) & _mask == _mask); _transfer(_from, _to, _mask, _tokenIds); } } function _transferNFT(address _from, address _to, uint256 _tokenId) internal { unchecked { require(_tokenId > TOTAL_SUPPLY && _tokenId <= 2 * TOTAL_SUPPLY); bytes32 _mask = bytes32(1 << (_tokenId - TOTAL_SUPPLY - 1)); require(maskOf(_from) & _mask == _mask); require(msg.sender == _from || msg.sender == getApproved(_tokenId) || isApprovedForAll(_from, msg.sender)); uint256[] memory _tokenIds = new uint256[](1); _tokenIds[0] = _tokenId; _transfer(_from, _to, _mask, _tokenIds); } } function _transferNFTs(address _to, uint256[] memory _tokenIds) internal { unchecked { bytes32 _mask; for (uint256 i = 0; i < _tokenIds.length; i++) { _mask |= bytes32(1 << (_tokenIds[i] - TOTAL_SUPPLY - 1)); } require(_popcount(_mask) == _tokenIds.length); require(maskOf(msg.sender) & _mask == _mask); _transfer(msg.sender, _to, _mask, _tokenIds); } } function _transfer(address _from, address _to, bytes32 _mask, uint256[] memory _tokenIds) internal { unchecked { require(_tokenIds.length > 0); for (uint256 i = 0; i < _tokenIds.length; i++) { if (getApproved(_tokenIds[i]) != address(0x0)) { info.approved[_tokenIds[i]] = address(0x0); emit Approval(address(0x0), address(0x0), _tokenIds[i]); } emit Transfer(_from, _to, _tokenIds[i]); } info.users[_from].mask ^= _mask; bool _from0 = maskOf(_from) == 0x0; bool _to0 = maskOf(_to) == 0x0; info.users[_to].mask |= _mask; if (_from0) { uint256 _index; address[] memory _holders = holders(); for (uint256 i = 0; i < _holders.length; i++) { if (_holders[i] == _from) { _index = i; break; } } if (_to0) { info.holders[_index] = _to; } else { info.holders[_index] = _holders[_holders.length - 1]; info.holders.pop(); } } else if (_to0) { info.holders.push(_to); } require(maskOf(_from) & maskOf(_to) == 0x0); emit ERC20Transfer(TRANSFER_TOPIC, _from, _to, _tokenIds.length); } } function _popcount(bytes32 _b) internal pure returns (uint256) { uint256 _n = uint256(_b); if (_n == UINT_MAX) { return 256; } unchecked { _n -= (_n >> 1) & M1; _n = (_n & M2) + ((_n >> 2) & M2); _n = (_n + (_n >> 4)) & M4; _n = (_n * H01) >> 248; } return _n; } } contract Deploy { CellMates immutable public cellmates; constructor() payable { cellmates = new CellMates{value:msg.value}(); cellmates.initialize(); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.19; interface CM { function salt() external view returns (bytes32); } contract Metadata { string public name = "CellMates"; string public symbol = "CELL"; string constant private TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; bytes3 constant private BG_COLOR = 0xd1d3dc; uint256 constant private PADDING = 2; struct Size { uint248 size; uint8 chance; } Size[] private sizes; struct Color { bytes3 primaryColor; bytes3 outlineColor; uint8 chance; string name; } Color[] private colors; CM immutable public cellmates; constructor() { cellmates = CM(msg.sender); // sizes sizes.push(Size(14, 120)); sizes.push(Size(16, 80)); sizes.push(Size(18, 50)); sizes.push(Size(20, 20)); sizes.push(Size(22, 10)); sizes.push(Size(24, 5)); // colors colors.push(Color(0x179629, 0x15491f, 100, "Slimy Green")); colors.push(Color(0xc9a91c, 0x5f5120, 75, "Pacific Blue")); colors.push(Color(0x009fff, 0x144d79, 55, "Orange Peel")); colors.push(Color(0x3bb5cf, 0x235763, 35, "Old Gold")); colors.push(Color(0x908070, 0x463f38, 25, "Slate Gray")); colors.push(Color(0xac8fe6, 0x53466d, 15, "Charm Pink")); colors.push(Color(0x2b2ca6, 0x191d52, 10, "Metallic Red")); colors.push(Color(0xa95178, 0x522b3d, 5, "Royal Purple")); } function tokenURI(uint256 _tokenId) external view returns (string memory) { unchecked { ( , uint256 _size, uint256 _colorIndex) = _getTokenInfo(_tokenId); string memory _json = string(abi.encodePacked('{"name":"CELL #', _uint2str(_tokenId), '","description":"An experimental hybrid of ERC-20 & ERC-721.","external_url":"https://cellmates.io/#/token/', _uint2str(_tokenId), '",')); _json = string(abi.encodePacked(_json, '"image":"', svgURI(_tokenId), '","attributes":[')); _json = string(abi.encodePacked(_json, '{"trait_type":"Size","value":', _uint2str(_size - 2 * PADDING), '},')); _json = string(abi.encodePacked(_json, '{"trait_type":"Color","value":"', colors[_colorIndex].name, '"}')); _json = string(abi.encodePacked(_json, ']}')); return string(abi.encodePacked('data:application/json;base64,', _encode(bytes(_json)))); } } function svgURI(uint256 _tokenId) public view returns (string memory) { return string(abi.encodePacked('data:image/svg+xml;base64,', _encode(bytes(getSVG(_tokenId))))); } function bmpURI(uint256 _tokenId) public view returns (string memory) { return string(abi.encodePacked('data:image/bmp;base64,', _encode(getBMP(_tokenId)))); } function getSVG(uint256 _tokenId) public view returns (string memory) { return string(abi.encodePacked('<svg xmlns="http://www.w3.org/2000/svg" version="1.1" preserveAspectRatio="xMidYMid meet" viewBox="0 0 512 512" width="100%" height="100%"><defs><style type="text/css">svg{image-rendering:optimizeSpeed;image-rendering:-moz-crisp-edges;image-rendering:-o-crisp-edges;image-rendering:-webkit-optimize-contrast;image-rendering:pixelated;image-rendering:optimize-contrast;-ms-interpolation-mode:nearest-neighbor;background-color:', _col2str(BG_COLOR), ';background-image:url(', bmpURI(_tokenId), ');background-repeat:no-repeat;background-size:contain;background-position:50% 50%;}</style></defs></svg>')); } function getBMP(uint256 _tokenId) public view returns (bytes memory) { (bytes32 _seed, uint256 _size, uint256 _colorIndex) = _getTokenInfo(_tokenId); return _getBMP(_makePalette(colors[_colorIndex].primaryColor, colors[_colorIndex].outlineColor), _convertToColors(_addOutline(_expandAndReflect(_step(_step(_getInitialState(_seed, _size)))))), _size); } function _getTokenInfo(uint256 _tokenId) internal view returns (bytes32 seed, uint256 size, uint256 colorIndex) { unchecked { seed = keccak256(abi.encodePacked("Seed:", _tokenId, cellmates.salt())); size = _sampleSize(seed); colorIndex = _sampleColor(seed); } } function _sampleSize(bytes32 _seed) internal view returns (uint256 size) { unchecked { uint256 _total = 0; for (uint256 i = 0; i < sizes.length; i++) { _total += sizes[i].chance; } uint256 _target = uint256(keccak256(abi.encodePacked("Size:", _seed))) % _total; _total = 0; for (uint256 i = 0; i < sizes.length; i++) { _total += sizes[i].chance; if (_target < _total) { return sizes[i].size; } } } } function _sampleColor(bytes32 _seed) internal view returns (uint256 colorIndex) { unchecked { uint256 _total = 0; for (uint256 i = 0; i < colors.length; i++) { _total += colors[i].chance; } uint256 _target = uint256(keccak256(abi.encodePacked("Color:", _seed))) % _total; _total = 0; for (uint256 i = 0; i < colors.length; i++) { _total += colors[i].chance; if (_target < _total) { return i; } } } } function _getInitialState(bytes32 _seed, uint256 _size) internal pure returns (uint8[][] memory state) { unchecked { uint256 _rollingSeed = uint256(keccak256(abi.encodePacked("State:", _seed))); state = new uint8[][](_size - 2 * PADDING - 2); for (uint256 y = 0; y < state.length; y++) { state[y] = new uint8[](_size / 2 - PADDING - 1); for (uint256 x = 0; x < state[y].length; x++) { state[y][x] = uint8(_rollingSeed % 2); if (_rollingSeed < type(uint16).max) { _rollingSeed = uint256(keccak256(abi.encodePacked("Roll:", _seed, _rollingSeed))); } else { _rollingSeed /= 2; } } } } } function _getNeighborhood(uint8[][] memory _state) internal pure returns (uint8[][] memory neighborhood) { unchecked { neighborhood = new uint8[][](_state.length); for (uint256 y = 0; y < _state.length; y++) { neighborhood[y] = new uint8[](_state[y].length); for (uint256 x = 0; x < _state[y].length; x++) { uint8 _count = 0; if (y > 0) { _count += _state[y - 1][x]; } if (y < _state.length - 1) { _count += _state[y + 1][x]; } if (x > 0) { _count += _state[y][x - 1]; } if (x < _state[y].length - 1) { _count += _state[y][x + 1]; } neighborhood[y][x] = _count; } } } } function _step(uint8[][] memory _state) internal pure returns (uint8[][] memory newState) { unchecked { uint8[][] memory _neighborhood = _getNeighborhood(_state); newState = new uint8[][](_state.length); for (uint256 y = 0; y < _state.length; y++) { newState[y] = new uint8[](_state[y].length); for (uint256 x = 0; x < _state[y].length; x++) { newState[y][x] = ((_state[y][x] == 0 && _neighborhood[y][x] <= 1) || (_state[y][x] == 1 && (_neighborhood[y][x] == 2 || _neighborhood[y][x] == 3))) ? 1 : 0; } } } } function _expandAndReflect(uint8[][] memory _state) internal pure returns (uint8[][] memory newState) { unchecked { newState = new uint8[][](_state.length + 2 * PADDING + 2); for (uint256 y = 0; y < newState.length; y++) { newState[y] = new uint8[](_state.length + 2 * PADDING + 2); for (uint256 x = 0; x < newState[y].length; x++) { if (y > PADDING && y <= _state.length + PADDING && x > PADDING && x <= _state.length + PADDING) { newState[y][x] = _state[y - PADDING - 1][x > _state[y - PADDING - 1].length + PADDING ? _state.length + PADDING - x : x - PADDING - 1]; } else { newState[y][x] = 0; } } } } } function _addOutline(uint8[][] memory _state) internal pure returns (uint8[][] memory newState) { unchecked { uint8[][] memory _neighborhood = _getNeighborhood(_state); newState = new uint8[][](_state.length); for (uint256 y = 0; y < _state.length; y++) { newState[y] = new uint8[](_state[y].length); for (uint256 x = 0; x < _state[y].length; x++) { newState[y][x] = _state[y][x] == 0 && _neighborhood[y][x] > 0 ? 2 : _state[y][x]; } } } } function _convertToColors(uint8[][] memory _state) internal pure returns (bytes memory cols) { unchecked { uint256 _scanline = _state[0].length; if (_scanline % 4 != 0) { _scanline += 4 - (_scanline % 4); } cols = new bytes(_state.length * _scanline); for (uint256 y = 0; y < _state.length; y++) { for (uint256 x = 0; x < _state[y].length; x++) { cols[(_state.length - y - 1) * _scanline + x] = bytes1(_state[y][x]); } } } } function _makePalette(bytes3 _primaryColor, bytes3 _outlineColor) internal pure returns (bytes memory) { unchecked { return abi.encodePacked(BG_COLOR, bytes1(0), _primaryColor, bytes1(0), _outlineColor, bytes1(0)); } } function _getBMP(bytes memory _palette, bytes memory _colors, uint256 _size) internal pure returns (bytes memory) { unchecked { uint32 _bufSize = 14 + 40 + uint32(_palette.length); bytes memory _buf = new bytes(_bufSize - _palette.length); _buf[0] = 0x42; _buf[1] = 0x4d; uint32 _tmp = _bufSize + uint32(_colors.length); uint32 b; for (uint i = 2; i < 6; i++) { assembly { b := and(_tmp, 0xff) _tmp := shr(8, _tmp) } _buf[i] = bytes1(uint8(b)); } _tmp = _bufSize; for (uint i = 10; i < 14; i++) { assembly { b := and(_tmp, 0xff) _tmp := shr(8, _tmp) } _buf[i] = bytes1(uint8(b)); } _buf[14] = 0x28; _tmp = uint32(_size); for (uint i = 18; i < 22; i++) { assembly { b := and(_tmp, 0xff) _tmp := shr(8, _tmp) } _buf[i] = bytes1(uint8(b)); _buf[i + 4] = bytes1(uint8(b)); } _buf[26] = 0x01; _buf[28] = 0x08; _tmp = uint32(_colors.length); for (uint i = 34; i < 38; i++) { assembly { b := and(_tmp, 0xff) _tmp := shr(8, _tmp) } _buf[i] = bytes1(uint8(b)); } _tmp = uint32(_palette.length / 4); for (uint i = 46; i < 50; i++) { assembly { b := and(_tmp, 0xff) _tmp := shr(8, _tmp) } _buf[i] = bytes1(uint8(b)); _buf[i + 4] = bytes1(uint8(b)); } return abi.encodePacked(_buf, _palette, _colors); } } function _uint2str(uint256 _value) internal pure returns (string memory) { unchecked { uint256 _digits = 1; uint256 _n = _value; while (_n > 9) { _n /= 10; _digits++; } bytes memory _out = new bytes(_digits); for (uint256 i = 0; i < _out.length; i++) { uint256 _dec = (_value / (10**(_out.length - i - 1))) % 10; _out[i] = bytes1(uint8(_dec) + 48); } return string(_out); } } function _col2str(bytes3 _col) internal pure returns (string memory str) { unchecked { str = "#"; for (uint256 i = 0; i < 6; i++) { uint256 _hex = (uint24(_col) >> (4 * (i + 1 - 2 * (i % 2)))) % 16; bytes memory _char = new bytes(1); _char[0] = bytes1(uint8(_hex) + (_hex > 9 ? 87 : 48)); str = string(abi.encodePacked(str, string(_char))); } } } function _encode(bytes memory _data) internal pure returns (string memory result) { unchecked { if (_data.length == 0) return ''; string memory _table = TABLE; uint256 _encodedLen = 4 * ((_data.length + 2) / 3); result = new string(_encodedLen + 32); assembly { mstore(result, _encodedLen) let tablePtr := add(_table, 1) let dataPtr := _data let endPtr := add(dataPtr, mload(_data)) let resultPtr := add(result, 32) for {} lt(dataPtr, endPtr) {} { dataPtr := add(dataPtr, 3) let input := mload(dataPtr) mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(18, input), 0x3F))))) resultPtr := add(resultPtr, 1) mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(12, input), 0x3F))))) resultPtr := add(resultPtr, 1) mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr( 6, input), 0x3F))))) resultPtr := add(resultPtr, 1) mstore(resultPtr, shl(248, mload(add(tablePtr, and( input, 0x3F))))) resultPtr := add(resultPtr, 1) } switch mod(mload(_data), 3) case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) } case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) } } return result; } } }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","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":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":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"},{"inputs":[],"name":"MINT_COST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","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":"_tokens","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"bulkTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"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":"uint256","name":"_tokenId","type":"uint256"}],"name":"getToken","outputs":[{"internalType":"address","name":"tokenOwner","type":"address"},{"internalType":"address","name":"approved","type":"address"},{"internalType":"string","name":"uri","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"getTokens","outputs":[{"internalType":"address[]","name":"owners","type":"address[]"},{"internalType":"address[]","name":"approveds","type":"address[]"},{"internalType":"string[]","name":"uris","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"holders","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","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":"address","name":"_user","type":"address"}],"name":"maskOf","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadata","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"nonpayable","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":"nonpayable","type":"function"},{"inputs":[],"name":"salt","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract Metadata","name":"_metadata","type":"address"}],"name":"setMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"","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":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokens","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokens","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040525f341162000010575f80fd5b600280546001600160a01b03191673faded72464d6e76e37300b467673b36ecc4d2ccf179055604051620000449062000159565b604051809103905ff0801580156200005e573d5f803e3d5ffd5b50600380546001600160a01b0319166001600160a01b039290921691909117905560076020527f1142c8ae8ad77901cd97fce843895a9ccf91a8cbd5b191350a94c1d957b07f74805460ff1990811660019081179092557f2379132be4428a30bdcf8f40c0757cba23c7e3f4204cd933dabcc3d42093e8048054821683179055635b5e139f60e01b5f527f7108cf076693445f3e0461801864e91d74eb5e0eee196ef60b5961a16cd35b938054909116821790556200011e904362000167565b6040516429b0b63a1d60d91b60208201529040602582015260450160408051601f1981840301815291905280516020909101205f556200018d565b612cfd80620021aa83390190565b818103818111156200018757634e487b7160e01b5f52601160045260245ffd5b92915050565b61200f806200019b5f395ff3fe6080604052600436106101d0575f3560e01c80638188f71c116100fd578063bfa0b13311610092578063dd62ed3e11610062578063dd62ed3e14610537578063e4b50cb81461057f578063e985e9c5146105ad578063f3cb8385146105f8575f80fd5b8063bfa0b133146104cb578063c662e481146104de578063c87b56dd146104f9578063d28a476114610518575f80fd5b8063a22cb465116100cd578063a22cb46514610451578063a8aa1b3114610470578063a9059cbb1461048d578063b88d4fde146104ac575f80fd5b80638188f71c146103ec5780638da5cb5b1461040d57806395d89b411461042a578063a0712d681461043e575f80fd5b80632497ab151161017357806342842e0e1161014357806342842e0e1461037b5780636352211e1461039a57806370a08231146103b95780638129fc1c146103d8575f80fd5b80632497ab15146102ec578063313ce5671461030b57806332ba0a1e14610330578063392f37e91461035e575f80fd5b8063095ea7b3116101ae578063095ea7b31461026f57806313af40351461028e57806318160ddd146102af57806323b872dd146102cd575f80fd5b806301ffc9a7146101d457806306fdde0314610217578063081812fc14610238575b5f80fd5b3480156101df575f80fd5b506102026101ee36600461195c565b60076020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b348015610222575f80fd5b5061022b610617565b60405161020e91906119cb565b348015610243575f80fd5b506102576102523660046119dd565b61068a565b6040516001600160a01b03909116815260200161020e565b34801561027a575f80fd5b50610202610289366004611a08565b6106cb565b348015610299575f80fd5b506102ad6102a8366004611a32565b610712565b005b3480156102ba575f80fd5b506101005b60405190815260200161020e565b3480156102d8575f80fd5b506102026102e7366004611a4d565b61074a565b3480156102f7575f80fd5b506102bf610306366004611a32565b610809565b348015610316575f80fd5b5061031e5f81565b60405160ff909116815260200161020e565b34801561033b575f80fd5b5061034f61034a366004611b4d565b610823565b60405161020e93929190611bca565b348015610369575f80fd5b506003546001600160a01b0316610257565b348015610386575f80fd5b506102ad610395366004611a4d565b6109a7565b3480156103a5575f80fd5b506102576103b43660046119dd565b6109c6565b3480156103c4575f80fd5b506102bf6103d3366004611a32565b610a61565b3480156103e3575f80fd5b506102ad610a73565b3480156103f7575f80fd5b50610400610e38565b60405161020e9190611c4f565b348015610418575f80fd5b506002546001600160a01b0316610257565b348015610435575f80fd5b5061022b610e9a565b6102ad61044c3660046119dd565b610ee1565b34801561045c575f80fd5b506102ad61046b366004611c61565b610fa1565b34801561047b575f80fd5b506001546001600160a01b0316610257565b348015610498575f80fd5b506102026104a7366004611a08565b611010565b3480156104b7575f80fd5b506102ad6104c6366004611cc3565b61101c565b3480156104d6575f80fd5b505f546102bf565b3480156104e9575f80fd5b506102bf67016345785d8a000081565b348015610504575f80fd5b5061022b6105133660046119dd565b6110c2565b348015610523575f80fd5b506102ad610532366004611d6b565b611130565b348015610542575f80fd5b506102bf610551366004611db8565b6001600160a01b039182165f9081526004602090815260408083209390941682526001909201909152205490565b34801561058a575f80fd5b5061059e6105993660046119dd565b61113a565b60405161020e93929190611de4565b3480156105b8575f80fd5b506102026105c7366004611db8565b6001600160a01b039182165f9081526004602090815260408083209390941682526002909201909152205460ff1690565b348015610603575f80fd5b506102ad610612366004611a32565b611166565b600354604080516306fdde0360e01b815290516060926001600160a01b0316916306fdde03916004808301925f9291908290030181865afa15801561065e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526106859190810190611e18565b905090565b5f610100821180156106a857506106a46101006002611e95565b8211155b6106b0575f80fd5b505f908152600560205260409020546001600160a01b031690565b5f610100821180156106e957506106e56101006002611e95565b8211155b156106fd576106f8838361119e565b610708565b61070833848461122b565b5060015b92915050565b6002546001600160a01b03163314610728575f80fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b5f6101008211801561076857506107646101006002611e95565b8211155b1561077d57610778848484611294565b6107ff565b6001600160a01b0384165f908152600460209081526040808320338452600101909152902054828110156107af575f80fd5b5f1981146107f2576001600160a01b0385165f908152600460209081526040808320338452600101909152812080548592906107ec908490611eac565b90915550505b6107fd858585611381565b505b5060019392505050565b6001600160a01b03165f9081526004602052604090205490565b60608060605f845190508067ffffffffffffffff81111561084657610846611a8b565b60405190808252806020026020018201604052801561086f578160200160208202803683370190505b5093508067ffffffffffffffff81111561088b5761088b611a8b565b6040519080825280602002602001820160405280156108b4578160200160208202803683370190505b5092508067ffffffffffffffff8111156108d0576108d0611a8b565b60405190808252806020026020018201604052801561090357816020015b60608152602001906001900390816108ee5790505b5091505f5b8181101561099e5761093286828151811061092557610925611ebf565b602002602001015161113a565b87848151811061094457610944611ebf565b6020026020010187858151811061095d5761095d611ebf565b6020026020010187868151811061097657610976611ebf565b60209081029190910101929092526001600160a01b0392831690915291169052600101610908565b50509193909250565b6109c183838360405180602001604052805f81525061101c565b505050565b5f610100821180156109da57506102008211155b6109e2575f80fd5b60016101001983011b5f6109f4610e38565b90505f5b8151811015610a57578283610a25848481518110610a1857610a18611ebf565b6020026020010151610809565b1603610a4f57818181518110610a3d57610a3d611ebf565b60200260200101519350505050919050565b6001016109f8565b505f949350505050565b5f61070c610a6e83610809565b61146e565b5f610a866001546001600160a01b031690565b6001600160a01b031614610a98575f80fd5b5f3090505f737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610aed573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b119190611ed3565b6001600160a01b0383165f8181526004602090815260408083205f199055600680546001810182559084527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b031916851790558051606081019091526021808252949550929391929190611fb99083013980519060200120610100604051610ba591815260200190565b60405180910390a35f5b610100811015610c0d57610bc581610100611eee565b610bd0906001611eee565b6040516001600160a01b038516905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4600101610baf565b50610c2e82737a250d5630b4cf539739df2c5dacb4c659f2488d608061122b565b737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c7e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ca29190611ed3565b6040516364e329cb60e11b81526001600160a01b0383811660048301528481166024830152919091169063c9c65396906044016020604051808303815f875af1158015610cf1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d159190611ed3565b600180546001600160a01b039283166001600160a01b0319909116179055737a250d5630b4cf539739df2c5dacb4c659f2488d9063f305d719908416318460805f80610d696002546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015610dcf573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190610df49190611f01565b505050610e178273ec513e5959dbb02f314fc2f30041fca2685119f3600a611381565b610e3482610e2d6002546001600160a01b031690565b600a611381565b5050565b60605f600601805480602002602001604051908101604052809291908181526020018280548015610e9057602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610e72575b5050505050905090565b600354604080516395d89b4160e01b815290516060926001600160a01b0316916395d89b41916004808301925f9291908290030181865afa15801561065e573d5f803e3d5ffd5b305f610eec82610a61565b905080831115610efa575f80fd5b5f610f0d67016345785d8a000085611e95565b905080341015610f1b575f80fd5b610f26833386611381565b6002546040516001600160a01b039091169082156108fc029083905f818181858888f19350505050158015610f5d573d5f803e3d5ffd5b5080341115610f9b57336108fc610f748334611eac565b6040518115909202915f818181858888f19350505050158015610f99573d5f803e3d5ffd5b505b50505050565b335f8181526004602090815260408083206001600160a01b0387168085526002909101835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b5f610708338484611381565b611027848484611294565b823b63ffffffff811615610f9957604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611067903390899088908890600401611f2c565b6020604051808303815f875af1158015611083573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110a79190611f68565b6001600160e01b03191663150b7a0260e01b14610f99575f80fd5b60035460405163c87b56dd60e01b8152600481018390526060916001600160a01b03169063c87b56dd906024015f60405180830381865afa158015611109573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261070c9190810190611e18565b610e34828261152b565b5f806060611147846109c6565b6111508561068a565b611159866110c2565b9250925092509193909250565b6002546001600160a01b0316331461117c575f80fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b5f60016111ad61010084611eac565b6111b79190611eac565b6001901b905080806111c833610809565b16146111d2575f80fd5b5f8281526005602052604080822080546001600160a01b0319166001600160a01b0387169081179091559051849233917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a4505050565b6001600160a01b038084165f8181526004602090815260408083209487168084526001909501825291829020859055815160608101909252602180835290611f9890830139805190602001208360405161128791815260200190565b60405180910390a3505050565b610100811180156112a757506102008111155b6112af575f80fd5b60016101001982011b80806112c386610809565b16146112cd575f80fd5b336001600160a01b03851614806112fd57506112e88261068a565b6001600160a01b0316336001600160a01b0316145b8061132d57506001600160a01b0384165f90815260046020908152604080832033845260020190915290205460ff165b611335575f80fd5b6040805160018082528183019092525f916020808301908036833701905050905082815f8151811061136957611369611ebf565b602002602001018181525050610f99858584846115a1565b5f80808061138e87610809565b90505f8567ffffffffffffffff8111156113aa576113aa611a8b565b6040519080825280602002602001820160405280156113d3578160200160208202803683370190505b5090505b5f821180156113e557508583105b156114385781600116600103611428578051600180861b9690961795840193610101860191839190811061141b5761141b611ebf565b6020026020010181815250505b6001938401939190911c906113d7565b858314611443575f80fd5b848561144e8a610809565b1614611458575f80fd5b611464888887846115a1565b5050505050505050565b5f8160018101611482575061010092915050565b7f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c92915050565b5f805b825181101561156f57600161010084838151811061154e5761154e611ebf565b602002602001015103036001901b5f1b82179150808060010191505061152e565b50815161157b8261146e565b14611584575f80fd5b808161158f33610809565b1614611599575f80fd5b6109c1338483855b5f8151116115ad575f80fd5b5f5b81518110156116ee575f6001600160a01b03166115e48383815181106115d7576115d7611ebf565b602002602001015161068a565b6001600160a01b03161461168c575f806005015f84848151811061160a5761160a611ebf565b602002602001015181526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555081818151811061165457611654611ebf565b60209081029190910101516040515f9081907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925908290a45b81818151811061169e5761169e611ebf565b6020026020010151846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46001016115af565b506001600160a01b0384165f90815260046020526040812080548418905561171585610809565b1590505f61172285610809565b6001600160a01b0386165f9081526004602052604090208054861790551590508115611882575f80611752610e38565b90505f5b81518110156117a157886001600160a01b031682828151811061177b5761177b611ebf565b60200260200101516001600160a01b031603611799578092506117a1565b600101611756565b5082156117ee57865f60060183815481106117be576117be611ebf565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555061187b565b8060018251038151811061180457611804611ebf565b60200260200101515f600601838154811061182157611821611ebf565b5f91825260209091200180546001600160a01b0319166001600160a01b0392909216919091179055600680548061185a5761185a611f83565b5f8281526020902081015f1990810180546001600160a01b03191690550190555b50506118d3565b80156118d357600680546001810182555f919091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0319166001600160a01b0387161790555b6118dc85610809565b6118e587610809565b16156118ef575f80fd5b846001600160a01b0316866001600160a01b0316604051806060016040528060218152602001611fb96021913980519060200120855160405161193491815260200190565b60405180910390a3505050505050565b6001600160e01b031981168114611959575f80fd5b50565b5f6020828403121561196c575f80fd5b813561197781611944565b9392505050565b5f5b83811015611998578181015183820152602001611980565b50505f910152565b5f81518084526119b781602086016020860161197e565b601f01601f19169290920160200192915050565b602081525f61197760208301846119a0565b5f602082840312156119ed575f80fd5b5035919050565b6001600160a01b0381168114611959575f80fd5b5f8060408385031215611a19575f80fd5b8235611a24816119f4565b946020939093013593505050565b5f60208284031215611a42575f80fd5b8135611977816119f4565b5f805f60608486031215611a5f575f80fd5b8335611a6a816119f4565b92506020840135611a7a816119f4565b929592945050506040919091013590565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611ac857611ac8611a8b565b604052919050565b5f82601f830112611adf575f80fd5b8135602067ffffffffffffffff821115611afb57611afb611a8b565b8160051b611b0a828201611a9f565b9283528481018201928281019087851115611b23575f80fd5b83870192505b84831015611b4257823582529183019190830190611b29565b979650505050505050565b5f60208284031215611b5d575f80fd5b813567ffffffffffffffff811115611b73575f80fd5b611b7f84828501611ad0565b949350505050565b5f815180845260208085019450602084015f5b83811015611bbf5781516001600160a01b031687529582019590820190600101611b9a565b509495945050505050565b606081525f611bdc6060830186611b87565b602083820381850152611bef8287611b87565b915083820360408501528185518084528284019150828160051b8501018388015f5b83811015611c3f57601f19878403018552611c2d8383516119a0565b94860194925090850190600101611c11565b50909a9950505050505050505050565b602081525f6119776020830184611b87565b5f8060408385031215611c72575f80fd5b8235611c7d816119f4565b915060208301358015158114611c91575f80fd5b809150509250929050565b5f67ffffffffffffffff821115611cb557611cb5611a8b565b50601f01601f191660200190565b5f805f8060808587031215611cd6575f80fd5b8435611ce1816119f4565b93506020850135611cf1816119f4565b925060408501359150606085013567ffffffffffffffff811115611d13575f80fd5b8501601f81018713611d23575f80fd5b8035611d36611d3182611c9c565b611a9f565b818152886020838501011115611d4a575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215611d7c575f80fd5b8235611d87816119f4565b9150602083013567ffffffffffffffff811115611da2575f80fd5b611dae85828601611ad0565b9150509250929050565b5f8060408385031215611dc9575f80fd5b8235611dd4816119f4565b91506020830135611c91816119f4565b6001600160a01b038481168252831660208201526060604082018190525f90611e0f908301846119a0565b95945050505050565b5f60208284031215611e28575f80fd5b815167ffffffffffffffff811115611e3e575f80fd5b8201601f81018413611e4e575f80fd5b8051611e5c611d3182611c9c565b818152856020838501011115611e70575f80fd5b611e0f82602083016020860161197e565b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141761070c5761070c611e81565b8181038181111561070c5761070c611e81565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215611ee3575f80fd5b8151611977816119f4565b8082018082111561070c5761070c611e81565b5f805f60608486031215611f13575f80fd5b8351925060208401519150604084015190509250925092565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f90611f5e908301846119a0565b9695505050505050565b5f60208284031215611f78575f80fd5b815161197781611944565b634e487b7160e01b5f52603160045260245ffdfe417070726f76616c28616464726573732c616464726573732c75696e74323536295472616e7366657228616464726573732c616464726573732c75696e7432353629a2646970667358221220f4b836ae68fc88d6c843ec14fd1046bbaf04ffa4e944e597dc5263124291361d64736f6c6343000818003360e0604052600960a09081526843656c6c4d6174657360b81b60c0525f9062000029908262000950565b5060408051808201909152600481526310d1531360e21b602082015260019062000054908262000950565b5034801562000061575f80fd5b50336080908152604080518082018252600e81526078602080830191825260028054600181810183555f8381529551945160ff908116600160f81b9081026001600160f81b03978816177f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace948501558851808a018a5260108152605081880190815286548086018855878b52915190518416830290891617908501558851808a018a5260128152603281880190815286548086018855878b52915190518416830290891617908501558851808a018a52601480825281880190815286548086018855878b52915190518416830290891617908501558851808a018a5260168152600a81880190815286548086018855878b52915190518416830290891617908501558851808a018a5260188152600581880190815286548086018855878b5291519051841690920291909716179590920194909455855196870186526217962960e81b87526215491f60e81b87840190815260648888019081528751808901909852600b88526a29b634b6bc9023b932b2b760a91b94880194909452606088019687526003805495860181559095528651939091025f8051602062002cdd833981519152810180549551935190921666010000000000000260ff60301b1960e894851c63010000000265ffffffffffff199097169590941c94909417949094179190911691909117815591515f8051602062002cbd833981519152909101906200028c908262000950565b50506040805160808101825262326a4760ea1b81526202fa8960ed1b6020808301918252604b8385019081528451808601909552600c85526b5061636966696320426c756560a01b9185019190915260608301938452600380546001810182555f91909152835160029091025f8051602062002cdd833981519152810180549451935160ff1666010000000000000260ff60301b1960e895861c63010000000265ffffffffffff199097169490951c9390931794909417929092161782559251919350915f8051602062002cbd83398151915201906200036d908262000950565b505060408051608081018252619fff60e81b815262144d7960e81b602080830191825260378385019081528451808601909552600b85526a13dc985b99d9481419595b60aa1b9185019190915260608301938452600380546001810182555f91909152835160029091025f8051602062002cdd833981519152810180549451935160ff1666010000000000000260ff60301b1960e895861c63010000000265ffffffffffff199097169490951c9390931794909417929092161782559251919350915f8051602062002cbd83398151915201906200044c908262000950565b505060408051608081018252623bb5cf60e81b81526223576360e81b602080830191825260238385019081528451808601909552600885526713db190811dbdb1960c21b9185019190915260608301938452600380546001810182555f91909152835160029091025f8051602062002cdd833981519152810180549451935160ff1666010000000000000260ff60301b1960e895861c63010000000265ffffffffffff199097169490951c9390931794909417929092161782559251919350915f8051602062002cbd833981519152019062000529908262000950565b5050604080516080810182526209080760ec1b81526208c7e760eb1b602080830191825260198385019081528451808601909552600a855269536c617465204772617960b01b9185019190915260608301938452600380546001810182555f91909152835160029091025f8051602062002cdd833981519152810180549451935160ff1666010000000000000260ff60301b1960e895861c63010000000265ffffffffffff199097169490951c9390931794909417929092161782559251919350915f8051602062002cbd833981519152019062000608908262000950565b505060408051608081018252625647f360e91b81526253466d60e81b6020808301918252600f8385019081528451808601909552600a855269436861726d2050696e6b60b01b9185019190915260608301938452600380546001810182555f91909152835160029091025f8051602062002cdd833981519152810180549451935160ff1666010000000000000260ff60301b1960e895861c63010000000265ffffffffffff199097169490951c9390931794909417929092161782559251919350915f8051602062002cbd8339815191520190620006e7908262000950565b5050604080516080810182526215965360e91b8152620c8ea960e91b6020808301918252600a8385019081528451808601909552600c85526b13595d185b1b1a58c814995960a21b9185019190915260608301938452600380546001810182555f91909152835160029091025f8051602062002cdd833981519152810180549451935160ff1666010000000000000260ff60301b1960e895861c63010000000265ffffffffffff199097169490951c9390931794909417929092161782559251919350915f8051602062002cbd8339815191520190620007c8908262000950565b50506040805160808101825262152a2f60eb1b815262522b3d60e81b602080830191825260058385019081528451808601909552600c85526b526f79616c20507572706c6560a01b9185019190915260608301938452600380546001810182555f91909152835160029091025f8051602062002cdd833981519152810180549451935160ff1666010000000000000260ff60301b1960e895861c63010000000265ffffffffffff199097169490951c9390931794909417929092161782559251919350915f8051602062002cbd8339815191520190620008a9908262000950565b50505062000a1c565b634e487b7160e01b5f52604160045260245ffd5b600181811c90821680620008db57607f821691505b602082108103620008fa57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156200094b57805f5260205f20601f840160051c81016020851015620009275750805b601f840160051c820191505b8181101562000948575f815560010162000933565b50505b505050565b81516001600160401b038111156200096c576200096c620008b2565b62000984816200097d8454620008c6565b8462000900565b602080601f831160018114620009ba575f8415620009a25750858301515b5f19600386901b1c1916600185901b17855562000a14565b5f85815260208120601f198616915b82811015620009ea57888601518255948401946001909101908401620009c9565b508582101562000a0857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b60805161228262000a3b5f395f818160be01526105f801526122825ff3fe608060405234801561000f575f80fd5b5060043610610084575f3560e01c806395d89b411161005857806395d89b411461010b578063be985ac914610113578063c87b56dd14610126578063ca54cc3f14610139575f80fd5b8062b958f31461008857806306fdde03146100b15780633dd860b3146100b957806348b62fe4146100f8575b5f80fd5b61009b610096366004611a26565b61014c565b6040516100a89190611a8a565b60405180910390f35b61009b610185565b6100e07f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100a8565b61009b610106366004611a26565b610210565b61009b610316565b61009b610121366004611a26565b610323565b61009b610134366004611a26565b61034e565b61009b610147366004611a26565b61048b565b606061015f61015a83610210565b6104a9565b60405160200161016f9190611abe565b6040516020818303038152906040529050919050565b5f805461019190611afb565b80601f01602080910402602001604051908101604052809291908181526020018280546101bd90611afb565b80156102085780601f106101df57610100808354040283529160200191610208565b820191905f5260205f20905b8154815290600101906020018083116101eb57829003601f168201915b505050505081565b60605f805f61021e856105f2565b92509250925061030d6102da6003838154811061023d5761023d611b2d565b5f9182526020909120600290910201546003805460e89290921b918590811061026857610268611b2d565b5f9182526020909120600290910201546301000000900460e81b604051623474f760ea1b60208201525f602382018190526001600160e81b031980851660248401526027830182905283166028830152602b820152606090602c01604051602081830303815290604052905092915050565b6103076103026102fd6102f86102f36102f38a8a6106cb565b610899565b610b39565b610d65565b610f6f565b8461109e565b95945050505050565b6001805461019190611afb565b6060610334623474f760ea1b61140e565b61033d8361014c565b60405160200161016f929190611b41565b60605f8061035b846105f2565b92509250505f61036a856114d7565b610373866114d7565b604051602001610384929190611e12565b60405160208183030381529060405290508061039f8661048b565b6040516020016103b0929190611ef4565b60408051601f198184030181529190529050806103d060031985016114d7565b6040516020016103e1929190611f54565b6040516020818303038152906040529050806003838154811061040657610406611b2d565b905f5260205f209060020201600101604051602001610426929190611fba565b60405160208183030381529060405290508060405160200161044891906120b0565b6040516020818303038152906040529050610462816104a9565b60405160200161047291906120d5565b6040516020818303038152906040529350505050919050565b606061049961015a83610323565b60405160200161016f9190612119565b606081515f036104c657505060408051602081019091525f815290565b5f60405180606001604052806040815260200161220d6040913990505f60038451600201816104f7576104f761215d565b046004029050806020016001600160401b0381111561051857610518612171565b6040519080825280601f01601f191660200182016040528015610542576020820181803683370190505b509250808352600182018485518101602086015b818310156105b05760039283018051603f601282901c811687015160f890811b8552600c83901c8216880151811b6001860152600683901c8216880151811b60028601529116860151901b93820193909352600401610556565b6003885106600181146105ca57600281146105db576105e6565b613d3d60f01b6001198301526105e6565b603d60f81b5f198301525b50505050505050919050565b5f805f837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663bfa0b1336040518163ffffffff1660e01b8152600401602060405180830381865afa158015610652573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106769190612185565b6040516429b2b2b21d60d91b6020820152602581019290925260458201526065016040516020818303038152906040528051906020012092506106b8836115b4565b91506106c3836116c3565b929491935050565b6040516529ba30ba329d60d11b6020820152602681018390526060905f9060460160408051601f198184030181529190528051602090910120905060051983016001600160401b0381111561072257610722612171565b60405190808252806020026020018201604052801561075557816020015b60608152602001906001900390816107405790505b5091505f5b82518110156108915760021960028504016001600160401b0381111561078257610782612171565b6040519080825280602002602001820160405280156107ab578160200160208202803683370190505b508382815181106107be576107be611b2d565b60200260200101819052505f5b8382815181106107dd576107dd611b2d565b602002602001015151811015610888576002830684838151811061080357610803611b2d565b6020026020010151828151811061081c5761081c611b2d565b60ff9092166020928302919091019091015261ffff83101561087957604051642937b6361d60d91b60208201526025810187905260458101849052606501604051602081830303815290604052805190602001205f1c9250610880565b6002830492505b6001016107cb565b5060010161075a565b505092915050565b60605f6108a5836117b3565b905082516001600160401b038111156108c0576108c0612171565b6040519080825280602002602001820160405280156108f357816020015b60608152602001906001900390816108de5790505b5091505f5b8351811015610b325783818151811061091357610913611b2d565b6020026020010151516001600160401b0381111561093357610933612171565b60405190808252806020026020018201604052801561095c578160200160208202803683370190505b5083828151811061096f5761096f611b2d565b60200260200101819052505f5b84828151811061098e5761098e611b2d565b602002602001015151811015610b29578482815181106109b0576109b0611b2d565b602002602001015181815181106109c9576109c9611b2d565b602002602001015160ff165f148015610a18575060018383815181106109f1576109f1611b2d565b60200260200101518281518110610a0a57610a0a611b2d565b602002602001015160ff1611155b80610ad75750848281518110610a3057610a30611b2d565b60200260200101518181518110610a4957610a49611b2d565b602002602001015160ff166001148015610ad75750828281518110610a7057610a70611b2d565b60200260200101518181518110610a8957610a89611b2d565b602002602001015160ff1660021480610ad75750828281518110610aaf57610aaf611b2d565b60200260200101518181518110610ac857610ac8611b2d565b602002602001015160ff166003145b610ae1575f610ae4565b60015b848381518110610af657610af6611b2d565b60200260200101518281518110610b0f57610b0f611b2d565b60ff9092166020928302919091019091015260010161097c565b506001016108f8565b5050919050565b80516060906006016001600160401b03811115610b5857610b58612171565b604051908082528060200260200182016040528015610b8b57816020015b6060815260200190600190039081610b765790505b5090505f5b8151811015610d5f5782516006016001600160401b03811115610bb557610bb5612171565b604051908082528060200260200182016040528015610bde578160200160208202803683370190505b50828281518110610bf157610bf1611b2d565b60200260200101819052505f5b828281518110610c1057610c10611b2d565b602002602001015151811015610d5657600282118015610c34575060028451018211155b8015610c405750600281115b8015610c50575060028451018111155b15610d0d57836001600284030381518110610c6d57610c6d611b2d565b60200260200101516002856001600286030381518110610c8f57610c8f611b2d565b602002602001015151018211610ca9576002198201610cb1565b816002865101035b81518110610cc157610cc1611b2d565b6020026020010151838381518110610cdb57610cdb611b2d565b60200260200101518281518110610cf457610cf4611b2d565b602002602001019060ff16908160ff1681525050610d4e565b5f838381518110610d2057610d20611b2d565b60200260200101518281518110610d3957610d39611b2d565b602002602001019060ff16908160ff16815250505b600101610bfe565b50600101610b90565b50919050565b60605f610d71836117b3565b905082516001600160401b03811115610d8c57610d8c612171565b604051908082528060200260200182016040528015610dbf57816020015b6060815260200190600190039081610daa5790505b5091505f5b8351811015610b3257838181518110610ddf57610ddf611b2d565b6020026020010151516001600160401b03811115610dff57610dff612171565b604051908082528060200260200182016040528015610e28578160200160208202803683370190505b50838281518110610e3b57610e3b611b2d565b60200260200101819052505f5b848281518110610e5a57610e5a611b2d565b602002602001015151811015610f6657848281518110610e7c57610e7c611b2d565b60200260200101518181518110610e9557610e95611b2d565b602002602001015160ff165f148015610ee257505f838381518110610ebc57610ebc611b2d565b60200260200101518281518110610ed557610ed5611b2d565b602002602001015160ff16115b610f1e57848281518110610ef857610ef8611b2d565b60200260200101518181518110610f1157610f11611b2d565b6020026020010151610f21565b60025b848381518110610f3357610f33611b2d565b60200260200101518281518110610f4c57610f4c611b2d565b60ff90921660209283029190910190910152600101610e48565b50600101610dc4565b60605f825f81518110610f8457610f84611b2d565b602002602001015151905060048181610f9f57610f9f61215d565b0615610fae5760048106600403015b808351026001600160401b03811115610fc957610fc9612171565b6040519080825280601f01601f191660200182016040528015610ff3576020820181803683370190505b5091505f5b8351811015610b32575f5b84828151811061101557611015611b2d565b6020026020010151518110156110955784828151811061103757611037611b2d565b6020026020010151818151811061105057611050611b2d565b602002602001015160f81b8482856001868a51030302018151811061107757611077611b2d565b60200101906001600160f81b03191690815f1a905350600101611003565b50600101610ff8565b825160609060368101905f9063ffffffff8316036001600160401b038111156110c9576110c9612171565b6040519080825280601f01601f1916602001820160405280156110f3576020820181803683370190505b509050604260f81b815f8151811061110d5761110d611b2d565b60200101906001600160f81b03191690815f1a905350604d60f81b8160018151811061113b5761113b611b2d565b60200101906001600160f81b03191690815f1a905350845182015f60025b60068110156111a25760ff831691508260081c92508160f81b84828151811061118457611184611b2d565b60200101906001600160f81b03191690815f1a905350600101611159565b50839150600a5b600e8110156111f25760ff831691508260081c92508160f81b8482815181106111d4576111d4611b2d565b60200101906001600160f81b03191690815f1a9053506001016111a9565b50602860f81b83600e8151811061120b5761120b611b2d565b60200101906001600160f81b03191690815f1a90535085915060125b601681101561129f5760ff831691508260081c92508160f81b84828151811061125257611252611b2d565b60200101906001600160f81b03191690815f1a9053508160f81b84826004018151811061128157611281611b2d565b60200101906001600160f81b03191690815f1a905350600101611227565b50600160f81b83601a815181106112b8576112b8611b2d565b60200101906001600160f81b03191690815f1a905350600860f81b83601c815181106112e6576112e6611b2d565b60200101906001600160f81b03191690815f1a9053508651915060225b602681101561134c5760ff831691508260081c92508160f81b84828151811061132e5761132e611b2d565b60200101906001600160f81b03191690815f1a905350600101611303565b50600488518161135e5761135e61215d565b049150602e5b60328110156113dc5760ff831691508260081c92508160f81b84828151811061138f5761138f611b2d565b60200101906001600160f81b03191690815f1a9053508160f81b8482600401815181106113be576113be611b2d565b60200101906001600160f81b03191690815f1a905350600101611364565b508288886040516020016113f29392919061219c565b6040516020818303038152906040529450505050509392505050565b6040805180820190915260018152602360f81b60208201525f5b6006811015610d5f57604080516001808252818301909252600f60e886901c600285851602850384016004021c16915f91906020820181803683370190505090506009821161147857603061147b565b60575b820160f81b815f8151811061149257611492611b2d565b60200101906001600160f81b03191690815f1a90535083816040516020016114bb9291906121de565b60408051808303601f1901815291905293505050600101611428565b60606001825b60098111156114f65760019190910190600a90046114dd565b5f826001600160401b0381111561150f5761150f612171565b6040519080825280601f01601f191660200182016040528015611539576020820181803683370190505b5090505f5b81518110156115ab575f600a60018385510303600a0a88816115625761156261215d565b04816115705761157061215d565b0690508060300160f81b83838151811061158c5761158c611b2d565b60200101906001600160f81b03191690815f1a9053505060010161153e565b50949350505050565b5f80805b6002548110156115f757600281815481106115d5576115d5611b2d565b5f91825260209091200154600160f81b900460ff1691909101906001016115b8565b506040516429b4bd329d60d91b6020820152602581018490525f908290604501604051602081830303815290604052805190602001205f1c8161163c5761163c61215d565b0690505f91505f5b6002548110156116bb576002818154811061166157611661611b2d565b5f91825260209091200154600160f81b900460ff169290920191828210156116b3576002818154811061169657611696611b2d565b5f918252602090912001546001600160f81b031695945050505050565b600101611644565b505050919050565b5f80805b60035481101561170e57600381815481106116e4576116e4611b2d565b5f9182526020909120600290910201546601000000000000900460ff1691909101906001016116c7565b506040516521b7b637b91d60d11b6020820152602681018490525f908290604601604051602081830303815290604052805190602001205f1c816117545761175461215d565b0690505f91505f5b6003548110156116bb576003818154811061177957611779611b2d565b5f9182526020909120600290910201546601000000000000900460ff169290920191828210156117ab57949350505050565b60010161175c565b606081516001600160401b038111156117ce576117ce612171565b60405190808252806020026020018201604052801561180157816020015b60608152602001906001900390816117ec5790505b5090505f5b8251811015610d5f5782818151811061182157611821611b2d565b6020026020010151516001600160401b0381111561184157611841612171565b60405190808252806020026020018201604052801561186a578160200160208202803683370190505b5082828151811061187d5761187d611b2d565b60200260200101819052505f5b83828151811061189c5761189c611b2d565b602002602001015151811015611a1d575f82156118ee578460018403815181106118c8576118c8611b2d565b602002602001015182815181106118e1576118e1611b2d565b6020026020010151810190505b60018551038310156119355784836001018151811061190f5761190f611b2d565b6020026020010151828151811061192857611928611b2d565b6020026020010151810190505b81156119765784838151811061194d5761194d611b2d565b6020026020010151600183038151811061196957611969611b2d565b6020026020010151810190505b600185848151811061198a5761198a611b2d565b602002602001015151038210156119d6578483815181106119ad576119ad611b2d565b602002602001015182600101815181106119c9576119c9611b2d565b6020026020010151810190505b808484815181106119e9576119e9611b2d565b60200260200101518381518110611a0257611a02611b2d565b60ff909216602092830291909101909101525060010161188a565b50600101611806565b5f60208284031215611a36575f80fd5b5035919050565b5f5b83811015611a57578181015183820152602001611a3f565b50505f910152565b5f8151808452611a76816020860160208601611a3d565b601f01601f19169290920160200192915050565b602081525f611a9c6020830184611a5f565b9392505050565b5f8151611ab4818560208601611a3d565b9290920192915050565b7519185d184e9a5b5859d94bd89b5c0ed8985cd94d8d0b60521b81525f8251611aee816016850160208701611a3d565b9190910160160192915050565b600181811c90821680611b0f57607f821691505b602082108103610d5f57634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b7f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323081527f30302f737667222076657273696f6e3d22312e3122207072657365727665417360208201527f70656374526174696f3d22784d6964594d6964206d656574222076696577426f60408201527f783d223020302035313220353132222077696474683d2231303025222068656960608201527f6768743d2231303025223e3c646566733e3c7374796c6520747970653d22746560808201527f78742f637373223e7376677b696d6167652d72656e646572696e673a6f70746960a08201527f6d697a6553706565643b696d6167652d72656e646572696e673a2d6d6f7a2d6360c08201527f726973702d65646765733b696d6167652d72656e646572696e673a2d6f2d637260e08201527f6973702d65646765733b696d6167652d72656e646572696e673a2d7765626b696101008201527f742d6f7074696d697a652d636f6e74726173743b696d6167652d72656e6465726101208201527f696e673a706978656c617465643b696d6167652d72656e646572696e673a6f706101408201527f74696d697a652d636f6e74726173743b2d6d732d696e746572706f6c6174696f6101608201527f6e2d6d6f64653a6e6561726573742d6e65696768626f723b6261636b67726f7561018082015268373216b1b7b637b91d60b91b6101a08201525f611e0a611d84611d7e611d5c6101a9860188611aa3565b75076c4c2c6d6cee4deeadcc85ad2dac2ceca74eae4d8560531b815260160190565b85611aa3565b7f293b6261636b67726f756e642d7265706561743a6e6f2d7265706561743b626181527f636b67726f756e642d73697a653a636f6e7461696e3b6261636b67726f756e6460208201527f2d706f736974696f6e3a353025203530253b7d3c2f7374796c653e3c2f646566604082015267399f1e17b9bb339f60c11b606082015260680190565b949350505050565b6e7b226e616d65223a2243454c4c202360881b815282515f90611e3c81600f850160208801611a3d565b7f222c226465736372697074696f6e223a22416e206578706572696d656e74616c600f918401918201527f20687962726964206f66204552432d32302026204552432d3732312e222c2265602f8201527f787465726e616c5f75726c223a2268747470733a2f2f63656c6c6d617465732e604f8201526a696f2f232f746f6b656e2f60a81b606f8201528351611ed981607a840160208801611a3d565b61088b60f21b607a9290910191820152607c01949350505050565b5f8351611f05818460208801611a3d565b681134b6b0b3b2911d1160b91b9083019081528351611f2b816009840160208801611a3d565b6f222c2261747472696275746573223a5b60801b60099290910191820152601901949350505050565b5f8351611f65818460208801611a3d565b7f7b2274726169745f74797065223a2253697a65222c2276616c7565223a0000009083019081528351611f9f81601d840160208801611a3d565b611f4b60f21b601d9290910191820152601f01949350505050565b5f83516020611fcd828560208901611a3d565b7f7b2274726169745f74797065223a22436f6c6f72222c2276616c7565223a22009184019182528454601f905f90600181811c908083168061201057607f831692505b60208310810361202e57634e487b7160e01b5f52602260045260245ffd5b808015612042576001811461205d5761208d565b60ff198516601f8a0152601f84151585028a0101955061208d565b5f8c8152602090205f5b858110156120825781548b82018a0152908401908901612067565b5050601f848a010195505b50505050506120a48161227d60f01b815260020190565b98975050505050505050565b5f82516120c1818460208701611a3d565b615d7d60f01b920191825250600201919050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081525f825161210c81601d850160208701611a3d565b91909101601d0192915050565b7f646174613a696d6167652f7376672b786d6c3b6261736536342c00000000000081525f825161215081601a850160208701611a3d565b91909101601a0192915050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215612195575f80fd5b5051919050565b5f84516121ad818460208901611a3d565b8451908301906121c1818360208901611a3d565b84519101906121d4818360208801611a3d565b0195945050505050565b5f83516121ef818460208801611a3d565b835190830190612203818360208801611a3d565b0194935050505056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa264697066735822122026ff2cc1347cca993fc184052b2f8387d820d65e13c63a98168aa60b662b448264736f6c63430008180033c2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85cc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b
Deployed Bytecode
0x6080604052600436106101d0575f3560e01c80638188f71c116100fd578063bfa0b13311610092578063dd62ed3e11610062578063dd62ed3e14610537578063e4b50cb81461057f578063e985e9c5146105ad578063f3cb8385146105f8575f80fd5b8063bfa0b133146104cb578063c662e481146104de578063c87b56dd146104f9578063d28a476114610518575f80fd5b8063a22cb465116100cd578063a22cb46514610451578063a8aa1b3114610470578063a9059cbb1461048d578063b88d4fde146104ac575f80fd5b80638188f71c146103ec5780638da5cb5b1461040d57806395d89b411461042a578063a0712d681461043e575f80fd5b80632497ab151161017357806342842e0e1161014357806342842e0e1461037b5780636352211e1461039a57806370a08231146103b95780638129fc1c146103d8575f80fd5b80632497ab15146102ec578063313ce5671461030b57806332ba0a1e14610330578063392f37e91461035e575f80fd5b8063095ea7b3116101ae578063095ea7b31461026f57806313af40351461028e57806318160ddd146102af57806323b872dd146102cd575f80fd5b806301ffc9a7146101d457806306fdde0314610217578063081812fc14610238575b5f80fd5b3480156101df575f80fd5b506102026101ee36600461195c565b60076020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b348015610222575f80fd5b5061022b610617565b60405161020e91906119cb565b348015610243575f80fd5b506102576102523660046119dd565b61068a565b6040516001600160a01b03909116815260200161020e565b34801561027a575f80fd5b50610202610289366004611a08565b6106cb565b348015610299575f80fd5b506102ad6102a8366004611a32565b610712565b005b3480156102ba575f80fd5b506101005b60405190815260200161020e565b3480156102d8575f80fd5b506102026102e7366004611a4d565b61074a565b3480156102f7575f80fd5b506102bf610306366004611a32565b610809565b348015610316575f80fd5b5061031e5f81565b60405160ff909116815260200161020e565b34801561033b575f80fd5b5061034f61034a366004611b4d565b610823565b60405161020e93929190611bca565b348015610369575f80fd5b506003546001600160a01b0316610257565b348015610386575f80fd5b506102ad610395366004611a4d565b6109a7565b3480156103a5575f80fd5b506102576103b43660046119dd565b6109c6565b3480156103c4575f80fd5b506102bf6103d3366004611a32565b610a61565b3480156103e3575f80fd5b506102ad610a73565b3480156103f7575f80fd5b50610400610e38565b60405161020e9190611c4f565b348015610418575f80fd5b506002546001600160a01b0316610257565b348015610435575f80fd5b5061022b610e9a565b6102ad61044c3660046119dd565b610ee1565b34801561045c575f80fd5b506102ad61046b366004611c61565b610fa1565b34801561047b575f80fd5b506001546001600160a01b0316610257565b348015610498575f80fd5b506102026104a7366004611a08565b611010565b3480156104b7575f80fd5b506102ad6104c6366004611cc3565b61101c565b3480156104d6575f80fd5b505f546102bf565b3480156104e9575f80fd5b506102bf67016345785d8a000081565b348015610504575f80fd5b5061022b6105133660046119dd565b6110c2565b348015610523575f80fd5b506102ad610532366004611d6b565b611130565b348015610542575f80fd5b506102bf610551366004611db8565b6001600160a01b039182165f9081526004602090815260408083209390941682526001909201909152205490565b34801561058a575f80fd5b5061059e6105993660046119dd565b61113a565b60405161020e93929190611de4565b3480156105b8575f80fd5b506102026105c7366004611db8565b6001600160a01b039182165f9081526004602090815260408083209390941682526002909201909152205460ff1690565b348015610603575f80fd5b506102ad610612366004611a32565b611166565b600354604080516306fdde0360e01b815290516060926001600160a01b0316916306fdde03916004808301925f9291908290030181865afa15801561065e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526106859190810190611e18565b905090565b5f610100821180156106a857506106a46101006002611e95565b8211155b6106b0575f80fd5b505f908152600560205260409020546001600160a01b031690565b5f610100821180156106e957506106e56101006002611e95565b8211155b156106fd576106f8838361119e565b610708565b61070833848461122b565b5060015b92915050565b6002546001600160a01b03163314610728575f80fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b5f6101008211801561076857506107646101006002611e95565b8211155b1561077d57610778848484611294565b6107ff565b6001600160a01b0384165f908152600460209081526040808320338452600101909152902054828110156107af575f80fd5b5f1981146107f2576001600160a01b0385165f908152600460209081526040808320338452600101909152812080548592906107ec908490611eac565b90915550505b6107fd858585611381565b505b5060019392505050565b6001600160a01b03165f9081526004602052604090205490565b60608060605f845190508067ffffffffffffffff81111561084657610846611a8b565b60405190808252806020026020018201604052801561086f578160200160208202803683370190505b5093508067ffffffffffffffff81111561088b5761088b611a8b565b6040519080825280602002602001820160405280156108b4578160200160208202803683370190505b5092508067ffffffffffffffff8111156108d0576108d0611a8b565b60405190808252806020026020018201604052801561090357816020015b60608152602001906001900390816108ee5790505b5091505f5b8181101561099e5761093286828151811061092557610925611ebf565b602002602001015161113a565b87848151811061094457610944611ebf565b6020026020010187858151811061095d5761095d611ebf565b6020026020010187868151811061097657610976611ebf565b60209081029190910101929092526001600160a01b0392831690915291169052600101610908565b50509193909250565b6109c183838360405180602001604052805f81525061101c565b505050565b5f610100821180156109da57506102008211155b6109e2575f80fd5b60016101001983011b5f6109f4610e38565b90505f5b8151811015610a57578283610a25848481518110610a1857610a18611ebf565b6020026020010151610809565b1603610a4f57818181518110610a3d57610a3d611ebf565b60200260200101519350505050919050565b6001016109f8565b505f949350505050565b5f61070c610a6e83610809565b61146e565b5f610a866001546001600160a01b031690565b6001600160a01b031614610a98575f80fd5b5f3090505f737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610aed573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b119190611ed3565b6001600160a01b0383165f8181526004602090815260408083205f199055600680546001810182559084527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b031916851790558051606081019091526021808252949550929391929190611fb99083013980519060200120610100604051610ba591815260200190565b60405180910390a35f5b610100811015610c0d57610bc581610100611eee565b610bd0906001611eee565b6040516001600160a01b038516905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4600101610baf565b50610c2e82737a250d5630b4cf539739df2c5dacb4c659f2488d608061122b565b737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c7e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ca29190611ed3565b6040516364e329cb60e11b81526001600160a01b0383811660048301528481166024830152919091169063c9c65396906044016020604051808303815f875af1158015610cf1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d159190611ed3565b600180546001600160a01b039283166001600160a01b0319909116179055737a250d5630b4cf539739df2c5dacb4c659f2488d9063f305d719908416318460805f80610d696002546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015610dcf573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190610df49190611f01565b505050610e178273ec513e5959dbb02f314fc2f30041fca2685119f3600a611381565b610e3482610e2d6002546001600160a01b031690565b600a611381565b5050565b60605f600601805480602002602001604051908101604052809291908181526020018280548015610e9057602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610e72575b5050505050905090565b600354604080516395d89b4160e01b815290516060926001600160a01b0316916395d89b41916004808301925f9291908290030181865afa15801561065e573d5f803e3d5ffd5b305f610eec82610a61565b905080831115610efa575f80fd5b5f610f0d67016345785d8a000085611e95565b905080341015610f1b575f80fd5b610f26833386611381565b6002546040516001600160a01b039091169082156108fc029083905f818181858888f19350505050158015610f5d573d5f803e3d5ffd5b5080341115610f9b57336108fc610f748334611eac565b6040518115909202915f818181858888f19350505050158015610f99573d5f803e3d5ffd5b505b50505050565b335f8181526004602090815260408083206001600160a01b0387168085526002909101835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b5f610708338484611381565b611027848484611294565b823b63ffffffff811615610f9957604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611067903390899088908890600401611f2c565b6020604051808303815f875af1158015611083573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110a79190611f68565b6001600160e01b03191663150b7a0260e01b14610f99575f80fd5b60035460405163c87b56dd60e01b8152600481018390526060916001600160a01b03169063c87b56dd906024015f60405180830381865afa158015611109573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261070c9190810190611e18565b610e34828261152b565b5f806060611147846109c6565b6111508561068a565b611159866110c2565b9250925092509193909250565b6002546001600160a01b0316331461117c575f80fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b5f60016111ad61010084611eac565b6111b79190611eac565b6001901b905080806111c833610809565b16146111d2575f80fd5b5f8281526005602052604080822080546001600160a01b0319166001600160a01b0387169081179091559051849233917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a4505050565b6001600160a01b038084165f8181526004602090815260408083209487168084526001909501825291829020859055815160608101909252602180835290611f9890830139805190602001208360405161128791815260200190565b60405180910390a3505050565b610100811180156112a757506102008111155b6112af575f80fd5b60016101001982011b80806112c386610809565b16146112cd575f80fd5b336001600160a01b03851614806112fd57506112e88261068a565b6001600160a01b0316336001600160a01b0316145b8061132d57506001600160a01b0384165f90815260046020908152604080832033845260020190915290205460ff165b611335575f80fd5b6040805160018082528183019092525f916020808301908036833701905050905082815f8151811061136957611369611ebf565b602002602001018181525050610f99858584846115a1565b5f80808061138e87610809565b90505f8567ffffffffffffffff8111156113aa576113aa611a8b565b6040519080825280602002602001820160405280156113d3578160200160208202803683370190505b5090505b5f821180156113e557508583105b156114385781600116600103611428578051600180861b9690961795840193610101860191839190811061141b5761141b611ebf565b6020026020010181815250505b6001938401939190911c906113d7565b858314611443575f80fd5b848561144e8a610809565b1614611458575f80fd5b611464888887846115a1565b5050505050505050565b5f8160018101611482575061010092915050565b7f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c92915050565b5f805b825181101561156f57600161010084838151811061154e5761154e611ebf565b602002602001015103036001901b5f1b82179150808060010191505061152e565b50815161157b8261146e565b14611584575f80fd5b808161158f33610809565b1614611599575f80fd5b6109c1338483855b5f8151116115ad575f80fd5b5f5b81518110156116ee575f6001600160a01b03166115e48383815181106115d7576115d7611ebf565b602002602001015161068a565b6001600160a01b03161461168c575f806005015f84848151811061160a5761160a611ebf565b602002602001015181526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555081818151811061165457611654611ebf565b60209081029190910101516040515f9081907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925908290a45b81818151811061169e5761169e611ebf565b6020026020010151846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46001016115af565b506001600160a01b0384165f90815260046020526040812080548418905561171585610809565b1590505f61172285610809565b6001600160a01b0386165f9081526004602052604090208054861790551590508115611882575f80611752610e38565b90505f5b81518110156117a157886001600160a01b031682828151811061177b5761177b611ebf565b60200260200101516001600160a01b031603611799578092506117a1565b600101611756565b5082156117ee57865f60060183815481106117be576117be611ebf565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555061187b565b8060018251038151811061180457611804611ebf565b60200260200101515f600601838154811061182157611821611ebf565b5f91825260209091200180546001600160a01b0319166001600160a01b0392909216919091179055600680548061185a5761185a611f83565b5f8281526020902081015f1990810180546001600160a01b03191690550190555b50506118d3565b80156118d357600680546001810182555f919091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0319166001600160a01b0387161790555b6118dc85610809565b6118e587610809565b16156118ef575f80fd5b846001600160a01b0316866001600160a01b0316604051806060016040528060218152602001611fb96021913980519060200120855160405161193491815260200190565b60405180910390a3505050505050565b6001600160e01b031981168114611959575f80fd5b50565b5f6020828403121561196c575f80fd5b813561197781611944565b9392505050565b5f5b83811015611998578181015183820152602001611980565b50505f910152565b5f81518084526119b781602086016020860161197e565b601f01601f19169290920160200192915050565b602081525f61197760208301846119a0565b5f602082840312156119ed575f80fd5b5035919050565b6001600160a01b0381168114611959575f80fd5b5f8060408385031215611a19575f80fd5b8235611a24816119f4565b946020939093013593505050565b5f60208284031215611a42575f80fd5b8135611977816119f4565b5f805f60608486031215611a5f575f80fd5b8335611a6a816119f4565b92506020840135611a7a816119f4565b929592945050506040919091013590565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611ac857611ac8611a8b565b604052919050565b5f82601f830112611adf575f80fd5b8135602067ffffffffffffffff821115611afb57611afb611a8b565b8160051b611b0a828201611a9f565b9283528481018201928281019087851115611b23575f80fd5b83870192505b84831015611b4257823582529183019190830190611b29565b979650505050505050565b5f60208284031215611b5d575f80fd5b813567ffffffffffffffff811115611b73575f80fd5b611b7f84828501611ad0565b949350505050565b5f815180845260208085019450602084015f5b83811015611bbf5781516001600160a01b031687529582019590820190600101611b9a565b509495945050505050565b606081525f611bdc6060830186611b87565b602083820381850152611bef8287611b87565b915083820360408501528185518084528284019150828160051b8501018388015f5b83811015611c3f57601f19878403018552611c2d8383516119a0565b94860194925090850190600101611c11565b50909a9950505050505050505050565b602081525f6119776020830184611b87565b5f8060408385031215611c72575f80fd5b8235611c7d816119f4565b915060208301358015158114611c91575f80fd5b809150509250929050565b5f67ffffffffffffffff821115611cb557611cb5611a8b565b50601f01601f191660200190565b5f805f8060808587031215611cd6575f80fd5b8435611ce1816119f4565b93506020850135611cf1816119f4565b925060408501359150606085013567ffffffffffffffff811115611d13575f80fd5b8501601f81018713611d23575f80fd5b8035611d36611d3182611c9c565b611a9f565b818152886020838501011115611d4a575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215611d7c575f80fd5b8235611d87816119f4565b9150602083013567ffffffffffffffff811115611da2575f80fd5b611dae85828601611ad0565b9150509250929050565b5f8060408385031215611dc9575f80fd5b8235611dd4816119f4565b91506020830135611c91816119f4565b6001600160a01b038481168252831660208201526060604082018190525f90611e0f908301846119a0565b95945050505050565b5f60208284031215611e28575f80fd5b815167ffffffffffffffff811115611e3e575f80fd5b8201601f81018413611e4e575f80fd5b8051611e5c611d3182611c9c565b818152856020838501011115611e70575f80fd5b611e0f82602083016020860161197e565b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141761070c5761070c611e81565b8181038181111561070c5761070c611e81565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215611ee3575f80fd5b8151611977816119f4565b8082018082111561070c5761070c611e81565b5f805f60608486031215611f13575f80fd5b8351925060208401519150604084015190509250925092565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f90611f5e908301846119a0565b9695505050505050565b5f60208284031215611f78575f80fd5b815161197781611944565b634e487b7160e01b5f52603160045260245ffdfe417070726f76616c28616464726573732c616464726573732c75696e74323536295472616e7366657228616464726573732c616464726573732c75696e7432353629a2646970667358221220f4b836ae68fc88d6c843ec14fd1046bbaf04ffa4e944e597dc5263124291361d64736f6c63430008180033
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.