Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 1,240 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Rearrange Board ... | 21133451 | 11 days ago | IN | 0 ETH | 0.00090477 | ||||
Claim Verified B... | 21124896 | 12 days ago | IN | 0 ETH | 0.00126092 | ||||
Rearrange Board ... | 21111013 | 14 days ago | IN | 0 ETH | 0.00032278 | ||||
Rearrange Board ... | 21110373 | 14 days ago | IN | 0 ETH | 0.00073046 | ||||
Claim Verified B... | 21110355 | 14 days ago | IN | 0 ETH | 0.0006672 | ||||
Claim Verified B... | 21096513 | 16 days ago | IN | 0 ETH | 0.00048112 | ||||
Claim Verified B... | 21096509 | 16 days ago | IN | 0 ETH | 0.00046364 | ||||
Claim Verified B... | 21096499 | 16 days ago | IN | 0 ETH | 0.00053304 | ||||
Buy Board | 21085270 | 18 days ago | IN | 0 ETH | 0.00136665 | ||||
Claim Verified B... | 21085247 | 18 days ago | IN | 0 ETH | 0.00093954 | ||||
Claim POAP | 21075048 | 19 days ago | IN | 0 ETH | 0.0002648 | ||||
Claim Verified B... | 19761085 | 202 days ago | IN | 0 ETH | 0.00181336 | ||||
Claim Verified B... | 19676968 | 214 days ago | IN | 0 ETH | 0.00274078 | ||||
Claim Verified B... | 19676841 | 214 days ago | IN | 0 ETH | 0.00240072 | ||||
Claim Verified B... | 19676778 | 214 days ago | IN | 0 ETH | 0.00245697 | ||||
Claim Verified B... | 19671854 | 215 days ago | IN | 0 ETH | 0.00093014 | ||||
Claim Verified B... | 19616213 | 223 days ago | IN | 0 ETH | 0.00270924 | ||||
Claim POAP | 19593477 | 226 days ago | IN | 0 ETH | 0.00039728 | ||||
Claim All | 19180064 | 284 days ago | IN | 0 ETH | 0.00495716 | ||||
Claim Verified B... | 19115353 | 293 days ago | IN | 0 ETH | 0.00242207 | ||||
Claim POAP | 19070918 | 299 days ago | IN | 0 ETH | 0.00060564 | ||||
Claim POAP | 19062048 | 301 days ago | IN | 0 ETH | 0.00120306 | ||||
Claim Verified B... | 19059611 | 301 days ago | IN | 0 ETH | 0.00155548 | ||||
Claim Verified B... | 18969659 | 313 days ago | IN | 0 ETH | 0.00265007 | ||||
Claim Verified B... | 18968963 | 314 days ago | IN | 0 ETH | 0.00152358 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
AnonymiceBadges
Compiler Version
v0.8.7+commit.e28d00a7
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
/* solhint-disable quotes */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.7; import "./POAPBoard.sol"; import "./POAPLibrary.sol"; import "./IDescriptor.sol"; import "./IBadgesVerifier.sol"; import "./ICheeth.sol"; contract AnonymiceBadges is POAPBoard { address public cheethAddress; address public descriptorAddress; address public badgesVerifierAddress; bool public isPaused = true; mapping(uint256 => uint256) public boardPrices; mapping(address => string) public boardNames; mapping(address => bool) private _auth; constructor() POAPBoard("Anonymice Collector Cards", "AnonymiceCollectorCards") {} function mint() external pure override { revert("no free mint"); } function claimAll( uint256[] calldata ids, bytes32[][] calldata proofs, uint256[] calldata genesisMice, uint256[] calldata babyMice ) external { for (uint256 index = 0; index < ids.length; index++) { bytes32 leaf = keccak256(abi.encodePacked(msg.sender)); require(MerkleProof.verify(proofs[index], merkleRootsByPOAPId[ids[index]], leaf), "not in whitelist"); _claimPOAP(ids[index], msg.sender); } uint256[] memory badgeIds = IBadgesVerifier(badgesVerifierAddress).claimableBadges( genesisMice, babyMice, msg.sender ); for (uint256 index = 0; index < badgeIds.length; index++) { uint256 badgeId = badgeIds[index]; if (badgeId == 0) break; if (!_poapOwners[badgeId][msg.sender]) { _claimPOAP(badgeIds[index], msg.sender); } } } function claimVerifiedBadge( uint256[] calldata genesisMice, uint256[] calldata babyMice, uint256 badgeIdToClaim ) external { uint256[] memory badgeIds = IBadgesVerifier(badgesVerifierAddress).claimableBadges( genesisMice, babyMice, msg.sender ); for (uint256 index = 0; index < badgeIds.length; index++) { uint256 badgeId = badgeIds[index]; if (badgeId == 0) break; if (badgeIdToClaim == badgeId) { if (!_poapOwners[badgeId][msg.sender]) { _claimPOAP(badgeIds[index], msg.sender); } } } } function getVerifiedBadges(uint256[] memory genesisMice, uint256[] memory babyMice) external view returns (uint256[] memory) { return IBadgesVerifier(badgesVerifierAddress).claimableBadges(genesisMice, babyMice, msg.sender); } function buyBoard(uint256 boardId) external { require(boardPrices[boardId] > 0, "price not set"); ICheeth(cheethAddress).burnFrom(msg.sender, boardPrices[boardId]); if (!_minted(msg.sender)) { _mint(msg.sender); currentBoard[msg.sender] = boardId; } _claimBoard(boardId, msg.sender); } function setBoardName(string memory name) external { boardNames[msg.sender] = name; } function externalClaimBoard(uint256 boardId, address to) external { require(_auth[msg.sender], "no auth"); _claimBoard(boardId, to); } function externalClaimPOAP(uint256 id, address to) external { require(_auth[msg.sender], "no auth"); _claimPOAP(id, to); } function tokenURI(uint256 id) public view override returns (string memory) { return IDescriptor(descriptorAddress).tokenURI(id); } function rearrangeBoardAndName( uint256 boardId, uint256[] memory slots, string memory text ) external { if (boardId != currentBoard[msg.sender]) _swapBoard(boardId, false); _rearrangePOAPs(slots); boardNames[msg.sender] = text; } function previewBoard( uint256 boardId, uint256[] calldata badges, string memory text ) external view returns (string memory) { return IDescriptor(descriptorAddress).buildSvg(boardId, badges, text, true); } function setDescriptorAddress(address _descriptorAddress) external onlyOwner { descriptorAddress = _descriptorAddress; } function setCheethAddress(address _cheethAddress) external onlyOwner { cheethAddress = _cheethAddress; } function setBadgesVerifierAddress(address _badgesVerifierAddress) external onlyOwner { badgesVerifierAddress = _badgesVerifierAddress; } function setAuth(address wallet, bool value) external onlyOwner { _auth[wallet] = value; } function setIsPaused(bool value) external onlyOwner { isPaused = value; } function setBoardPrice(uint256 boardId, uint256 boardPrice) external onlyOwner { boardPrices[boardId] = boardPrice; } } /* solhint-enable quotes */
/* solhint-disable quotes */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.7; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; import "./ERC721UniqueBound.sol"; import "./IPOAPBoard.sol"; import "./POAPLibrary.sol"; contract POAPBoard is Ownable, ERC721UniqueBound { mapping(uint256 => mapping(address => bool)) internal _poapOwners; mapping(address => mapping(uint256 => uint256)) internal _poaps; uint256 public boardCount; uint256 public poapCount; mapping(uint256 => POAPLibrary.Board) public boards; mapping(address => uint256) public currentBoard; mapping(address => uint256) public poapsBalanceOf; mapping(uint256 => bytes32) public merkleRootsByPOAPId; mapping(uint256 => bytes32) public merkleRootsByBoardId; mapping(address => mapping(uint256 => bool)) public availableBoards; mapping(address => mapping(uint256 => uint256)) public poapPositions; constructor(string memory name_, string memory symbol_) ERC721UniqueBound(name_, symbol_) {} function mint() external virtual { _mint(msg.sender); availableBoards[msg.sender][1] = true; currentBoard[msg.sender] = 1; } function claimBoard(uint256 boardId, bytes32[] calldata proof) external { bytes32 leaf = keccak256(abi.encodePacked(msg.sender)); require(MerkleProof.verify(proof, merkleRootsByBoardId[boardId], leaf), "not in whitelist"); _claimBoard(boardId, msg.sender); } function claimPOAP(uint256 id, bytes32[] calldata proof) public { bytes32 leaf = keccak256(abi.encodePacked(msg.sender)); require(MerkleProof.verify(proof, merkleRootsByPOAPId[id], leaf), "not in whitelist"); _claimPOAP(id, msg.sender); } function setCurrentBoard(uint256 boardId) external { _swapBoard(boardId, true); } function rearrangeBoard(uint256 boardId, uint256[] memory slots) external { if (boardId != currentBoard[msg.sender]) _swapBoard(boardId, false); _rearrangePOAPs(slots); } function rearrangePOAPs(uint256[] memory slots) external { _rearrangePOAPs(slots); } function _rearrangePOAPs(uint256[] memory slots) internal { POAPLibrary.Board memory selectedBoard = boards[currentBoard[msg.sender]]; require(slots.length == selectedBoard.slots.length, "wrong size"); for (uint256 index = 0; index < slots.length; index++) { uint256 poapId = slots[index]; for (uint256 innerIndex = 0; innerIndex < index; innerIndex++) { require(poapId == 0 || poapId != slots[innerIndex], "already used"); } poapPositions[msg.sender][index] = _poapOwners[poapId][msg.sender] ? poapId : 0; } } function _swapBoard(uint256 boardId, bool shouldWipe) internal { require(currentBoard[msg.sender] != boardId, "same board"); require(availableBoards[msg.sender][boardId], "locked board"); currentBoard[msg.sender] = boardId; if (shouldWipe) { POAPLibrary.Board memory selectedBoard = boards[boardId]; for (uint256 index = 0; index < selectedBoard.slots.length; index++) { poapPositions[msg.sender][index] = 0; } } } function getAllPOAPs(address wallet) public view returns (uint256[] memory) { uint256 poapsCount = poapsBalanceOf[wallet]; uint256[] memory poaps = new uint256[](poapsCount); for (uint256 index = 0; index < poapsCount; index++) { poaps[index] = _poaps[wallet][index]; } return poaps; } function getBoardPOAPs(address wallet) public view returns (uint256[] memory) { POAPLibrary.Board memory selectedBoard = boards[currentBoard[wallet]]; uint256[] memory poaps = new uint256[](selectedBoard.slots.length); for (uint256 index = 0; index < poaps.length; index++) { poaps[index] = poapPositions[wallet][index]; } return poaps; } function getBoards(address wallet) public view returns (POAPLibrary.Board[] memory) { uint256 walletCount; for (uint256 boardId = 1; boardId <= boardCount; boardId++) { if (availableBoards[wallet][boardId]) { walletCount++; } } POAPLibrary.Board[] memory walletBoards = new POAPLibrary.Board[](walletCount); uint256 walletBoardsIndex; for (uint256 boardId = 1; boardId <= boardCount; boardId++) { if (availableBoards[wallet][boardId]) { walletBoards[walletBoardsIndex++] = boards[boardId]; } } return walletBoards; } function getCurrentBoard(address wallet) public view returns (POAPLibrary.Board memory) { return boards[currentBoard[wallet]]; } function getWalletState(address wallet) external view returns ( uint256[] memory, POAPLibrary.Board[] memory, POAPLibrary.Board memory ) { return (getAllPOAPs(wallet), getBoards(wallet), getCurrentBoard(wallet)); } function getBoard(uint256 boardId) external view returns (POAPLibrary.Board memory) { return boards[boardId]; } function _claimPOAP(uint256 poapId, address to) internal existingPOAP(poapId) { if (_poapOwners[poapId][to]) return; _poapOwners[poapId][to] = true; _poaps[to][poapsBalanceOf[to]] = poapId; poapsBalanceOf[to]++; } function _claimBoard(uint256 boardId, address to) internal existingBoard(boardId) { require(_minted(to), "mint required"); require(!availableBoards[to][boardId], "already claimed"); availableBoards[to][boardId] = true; } // OWNER FUNCTIONS function registerBoard( uint64 width, uint64 height, POAPLibrary.Slot[] memory slots ) external onlyOwner { boardCount++; POAPLibrary.Board storage newBoard = boards[boardCount]; newBoard.id = uint128(boardCount); newBoard.width = width; newBoard.height = height; for (uint256 index = 0; index < slots.length; index++) { newBoard.slots.push(slots[index]); } } function registerPOAP() external onlyOwner { poapCount++; } function setPOAPCount(uint256 count) external onlyOwner { poapCount = count; } function overrideBoard( uint128 id, uint64 width, uint64 height, POAPLibrary.Slot[] memory slots ) external onlyOwner existingBoard(id) { POAPLibrary.Board storage newBoard = boards[id]; newBoard.id = id; newBoard.width = width; newBoard.height = height; uint256 oldSlotsSize = newBoard.slots.length; // 3 for (uint256 index = 0; index < slots.length; index++) { if (oldSlotsSize <= index) { newBoard.slots.push(slots[index]); } else { newBoard.slots[index] = slots[index]; } } } function setMerkleRootsByPOAPId(uint256 poapId, bytes32 merkleRoot) external onlyOwner { merkleRootsByPOAPId[poapId] = merkleRoot; } function setMerkleRootsByBoardId(uint256 boardId, bytes32 merkleRoot) external onlyOwner { merkleRootsByBoardId[boardId] = merkleRoot; } modifier existingBoard(uint256 boardId) { require(boardId <= boardCount, "unknown board"); _; } modifier existingPOAP(uint256 poapId) { require(poapId <= poapCount, "unknown poap"); _; } } /* solhint-enable quotes */
// SPDX-License-Identifier: MIT pragma solidity ^0.8.7; library POAPLibrary { struct Slot { uint32 x; uint32 y; uint32 scale; } struct Board { uint128 id; uint64 width; uint64 height; Slot[] slots; } string internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; function encode(bytes memory data) internal pure returns (string memory) { if (data.length == 0) return ""; // load the table into memory string memory table = TABLE; // multiply by 4/3 rounded up uint256 encodedLen = 4 * ((data.length + 2) / 3); // add some extra buffer at the end required for the writing string memory result = new string(encodedLen + 32); assembly { // set the actual output length mstore(result, encodedLen) // prepare the lookup table let tablePtr := add(table, 1) // input ptr let dataPtr := data let endPtr := add(dataPtr, mload(data)) // result ptr, jump over length let resultPtr := add(result, 32) // run over the input, 3 bytes at a time for { } lt(dataPtr, endPtr) { } { dataPtr := add(dataPtr, 3) // read 3 bytes let input := mload(dataPtr) // write 4 characters 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) } // padding with '=' 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; } function _toString(uint256 value) internal pure returns (string memory ptr) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128. ptr := add(mload(0x40), 128) // Update the free memory pointer to allocate. mstore(0x40, ptr) // Cache the end of the memory to calculate the length later. let end := ptr // We write the string from the rightmost digit to the leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // Costs a bit more than early returning for the zero case, // but cheaper in terms of deployment and overall runtime costs. for { // Initialize and perform the first pass without check. let temp := value // Move the pointer 1 byte leftwards to point to an empty character slot. ptr := sub(ptr, 1) // Write the character to the pointer. 48 is the ASCII index of '0'. mstore8(ptr, add(48, mod(temp, 10))) temp := div(temp, 10) } temp { // Keep dividing `temp` until zero. temp := div(temp, 10) } { // Body of the for loop. ptr := sub(ptr, 1) mstore8(ptr, add(48, mod(temp, 10))) } let length := sub(end, ptr) // Move the pointer 32 bytes leftwards to make room for the length. ptr := sub(ptr, 32) // Store the length. mstore(ptr, length) } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.7; interface IDescriptor { function badgeImages(uint256 badgeId) external view returns (string memory); function boardImages(uint256 boardId) external view returns (string memory); function tokenURI(uint256 tokenId) external view returns (string memory); function getSvg(uint256 id) external view returns (string memory); function buildSvg( uint256 boardId, uint256[] memory poaps, string memory boardName, bool isPreview ) external view returns (string memory); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.7; import "./POAPLibrary.sol"; interface IBadgesVerifier { function claimableBadges( uint256[] memory genesisMice, uint256[] memory babyMice, address wallet ) external view returns (uint256[] memory); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.7; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; interface ICheeth is IERC20 { function burnFrom(address account, uint256 amount) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = keccak256(abi.encodePacked(computedHash, proofElement)); } else { // Hash(current element of the proof + current computed hash) computedHash = keccak256(abi.encodePacked(proofElement, computedHash)); } } return computedHash; } }
// SPDX-License-Identifier: MIT // ERC721A Contracts v4.1.0 // Creator: Chiru Labs pragma solidity ^0.8.7; import "./IERC721UniqueBound.sol"; contract ERC721UniqueBound is IERC721UniqueBound { uint256 private _currentIndex; string private _name; string private _symbol; mapping(uint256 => address) private _ownerships; mapping(address => uint256) private _ownerToTokenId; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } function _startTokenId() internal view virtual returns (uint256) { return 1; } function totalSupply() public view override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _startTokenId(); } } function supportsInterface(bytes4 interfaceId) public view virtual override 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 balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _minted(owner) ? 1 : 0; } function _minted(address owner) internal view returns (bool) { uint256 tokenId = _ownerToTokenId[owner]; return _ownerships[tokenId] == owner; } function ownerOf(uint256 tokenId) public view override returns (address) { return _ownerships[tokenId]; } function tokenOf(address owner) public view override returns (uint256) { return _ownerToTokenId[owner]; } function name() public view virtual override returns (string memory) { return _name; } function symbol() public view virtual override returns (string memory) { return _symbol; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); 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 _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex; } function _mint(address to) internal { if (to == address(0)) revert MintToZeroAddress(); if (_minted(to)) revert MintToExistingOwnerAddress(); _ownerships[_currentIndex] = to; _ownerToTokenId[to] = _currentIndex; emit Transfer(address(0), to, _currentIndex); _currentIndex++; } function _toString(uint256 value) internal pure returns (string memory ptr) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128. ptr := add(mload(0x40), 128) // Update the free memory pointer to allocate. mstore(0x40, ptr) // Cache the end of the memory to calculate the length later. let end := ptr // We write the string from the rightmost digit to the leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // Costs a bit more than early returning for the zero case, // but cheaper in terms of deployment and overall runtime costs. for { // Initialize and perform the first pass without check. let temp := value // Move the pointer 1 byte leftwards to point to an empty character slot. ptr := sub(ptr, 1) // Write the character to the pointer. 48 is the ASCII index of '0'. mstore8(ptr, add(48, mod(temp, 10))) temp := div(temp, 10) } temp { // Keep dividing `temp` until zero. temp := div(temp, 10) } { // Body of the for loop. ptr := sub(ptr, 1) mstore8(ptr, add(48, mod(temp, 10))) } let length := sub(end, ptr) // Move the pointer 32 bytes leftwards to make room for the length. ptr := sub(ptr, 32) // Store the length. mstore(ptr, length) } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.7; import "./POAPLibrary.sol"; interface IPOAPBoard { function totalSupply() external view returns (uint256); function supportsInterface(bytes4 interfaceId) external view returns (bool); event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); function balanceOf(address owner) external view returns (uint256 balance); function ownerOf(uint256 tokenId) external view returns (address owner); function name() external view returns (string memory); function symbol() external view returns (string memory); function tokenURI(uint256 tokenId) external view returns (string memory); function getAllPOAPs(address wallet) external view returns (uint256[] memory); function getBoardPOAPs(address wallet) external view returns (uint256[] memory); function currentBoard(address wallet) external view returns (uint256); function getBoard(uint256 boardId) external view returns (POAPLibrary.Board memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.7; interface IERC721UniqueBound { error MintZeroQuantity(); error MintToZeroAddress(); error MintToExistingOwnerAddress(); error BalanceQueryForZeroAddress(); error URIQueryForNonexistentToken(); function totalSupply() external view returns (uint256); function supportsInterface(bytes4 interfaceId) external view returns (bool); event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); function balanceOf(address owner) external view returns (uint256 balance); function ownerOf(uint256 tokenId) external view returns (address owner); function tokenOf(address owner) 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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
{ "optimizer": { "enabled": true, "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":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToExistingOwnerAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"availableBoards","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"badgesVerifierAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"boardCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"boardNames","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"boardPrices","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"boards","outputs":[{"internalType":"uint128","name":"id","type":"uint128"},{"internalType":"uint64","name":"width","type":"uint64"},{"internalType":"uint64","name":"height","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"boardId","type":"uint256"}],"name":"buyBoard","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cheethAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"bytes32[][]","name":"proofs","type":"bytes32[][]"},{"internalType":"uint256[]","name":"genesisMice","type":"uint256[]"},{"internalType":"uint256[]","name":"babyMice","type":"uint256[]"}],"name":"claimAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"boardId","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"claimBoard","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"claimPOAP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"genesisMice","type":"uint256[]"},{"internalType":"uint256[]","name":"babyMice","type":"uint256[]"},{"internalType":"uint256","name":"badgeIdToClaim","type":"uint256"}],"name":"claimVerifiedBadge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"currentBoard","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"descriptorAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"boardId","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"externalClaimBoard","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"externalClaimPOAP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"getAllPOAPs","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"boardId","type":"uint256"}],"name":"getBoard","outputs":[{"components":[{"internalType":"uint128","name":"id","type":"uint128"},{"internalType":"uint64","name":"width","type":"uint64"},{"internalType":"uint64","name":"height","type":"uint64"},{"components":[{"internalType":"uint32","name":"x","type":"uint32"},{"internalType":"uint32","name":"y","type":"uint32"},{"internalType":"uint32","name":"scale","type":"uint32"}],"internalType":"struct POAPLibrary.Slot[]","name":"slots","type":"tuple[]"}],"internalType":"struct POAPLibrary.Board","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"getBoardPOAPs","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"getBoards","outputs":[{"components":[{"internalType":"uint128","name":"id","type":"uint128"},{"internalType":"uint64","name":"width","type":"uint64"},{"internalType":"uint64","name":"height","type":"uint64"},{"components":[{"internalType":"uint32","name":"x","type":"uint32"},{"internalType":"uint32","name":"y","type":"uint32"},{"internalType":"uint32","name":"scale","type":"uint32"}],"internalType":"struct POAPLibrary.Slot[]","name":"slots","type":"tuple[]"}],"internalType":"struct POAPLibrary.Board[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"getCurrentBoard","outputs":[{"components":[{"internalType":"uint128","name":"id","type":"uint128"},{"internalType":"uint64","name":"width","type":"uint64"},{"internalType":"uint64","name":"height","type":"uint64"},{"components":[{"internalType":"uint32","name":"x","type":"uint32"},{"internalType":"uint32","name":"y","type":"uint32"},{"internalType":"uint32","name":"scale","type":"uint32"}],"internalType":"struct POAPLibrary.Slot[]","name":"slots","type":"tuple[]"}],"internalType":"struct POAPLibrary.Board","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"genesisMice","type":"uint256[]"},{"internalType":"uint256[]","name":"babyMice","type":"uint256[]"}],"name":"getVerifiedBadges","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"getWalletState","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"},{"components":[{"internalType":"uint128","name":"id","type":"uint128"},{"internalType":"uint64","name":"width","type":"uint64"},{"internalType":"uint64","name":"height","type":"uint64"},{"components":[{"internalType":"uint32","name":"x","type":"uint32"},{"internalType":"uint32","name":"y","type":"uint32"},{"internalType":"uint32","name":"scale","type":"uint32"}],"internalType":"struct POAPLibrary.Slot[]","name":"slots","type":"tuple[]"}],"internalType":"struct POAPLibrary.Board[]","name":"","type":"tuple[]"},{"components":[{"internalType":"uint128","name":"id","type":"uint128"},{"internalType":"uint64","name":"width","type":"uint64"},{"internalType":"uint64","name":"height","type":"uint64"},{"components":[{"internalType":"uint32","name":"x","type":"uint32"},{"internalType":"uint32","name":"y","type":"uint32"},{"internalType":"uint32","name":"scale","type":"uint32"}],"internalType":"struct POAPLibrary.Slot[]","name":"slots","type":"tuple[]"}],"internalType":"struct POAPLibrary.Board","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"merkleRootsByBoardId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"merkleRootsByPOAPId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint128","name":"id","type":"uint128"},{"internalType":"uint64","name":"width","type":"uint64"},{"internalType":"uint64","name":"height","type":"uint64"},{"components":[{"internalType":"uint32","name":"x","type":"uint32"},{"internalType":"uint32","name":"y","type":"uint32"},{"internalType":"uint32","name":"scale","type":"uint32"}],"internalType":"struct POAPLibrary.Slot[]","name":"slots","type":"tuple[]"}],"name":"overrideBoard","outputs":[],"stateMutability":"nonpayable","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":"poapCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"poapPositions","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"poapsBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"boardId","type":"uint256"},{"internalType":"uint256[]","name":"badges","type":"uint256[]"},{"internalType":"string","name":"text","type":"string"}],"name":"previewBoard","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"boardId","type":"uint256"},{"internalType":"uint256[]","name":"slots","type":"uint256[]"}],"name":"rearrangeBoard","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"boardId","type":"uint256"},{"internalType":"uint256[]","name":"slots","type":"uint256[]"},{"internalType":"string","name":"text","type":"string"}],"name":"rearrangeBoardAndName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"slots","type":"uint256[]"}],"name":"rearrangePOAPs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"width","type":"uint64"},{"internalType":"uint64","name":"height","type":"uint64"},{"components":[{"internalType":"uint32","name":"x","type":"uint32"},{"internalType":"uint32","name":"y","type":"uint32"},{"internalType":"uint32","name":"scale","type":"uint32"}],"internalType":"struct POAPLibrary.Slot[]","name":"slots","type":"tuple[]"}],"name":"registerBoard","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"registerPOAP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAuth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_badgesVerifierAddress","type":"address"}],"name":"setBadgesVerifierAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"setBoardName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"boardId","type":"uint256"},{"internalType":"uint256","name":"boardPrice","type":"uint256"}],"name":"setBoardPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_cheethAddress","type":"address"}],"name":"setCheethAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"boardId","type":"uint256"}],"name":"setCurrentBoard","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_descriptorAddress","type":"address"}],"name":"setDescriptorAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setIsPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"boardId","type":"uint256"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"setMerkleRootsByBoardId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poapId","type":"uint256"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"setMerkleRootsByPOAPId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"setPOAPCount","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":"address","name":"owner","type":"address"}],"name":"tokenOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526013805460ff60a01b1916600160a01b1790553480156200002457600080fd5b506040518060400160405280601981526020017f416e6f6e796d69636520436f6c6c6563746f72204361726473000000000000008152506040518060400160405280601781526020017f416e6f6e796d696365436f6c6c6563746f7243617264730000000000000000008152508181620000ad620000a7620000e860201b60201c565b620000ec565b8151620000c29060029060208501906200013c565b508051620000d89060039060208401906200013c565b5060018055506200021f92505050565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8280546200014a90620001e2565b90600052602060002090601f0160209004810192826200016e5760008555620001b9565b82601f106200018957805160ff1916838001178555620001b9565b82800160010185558215620001b9579182015b82811115620001b95782518255916020019190600101906200019c565b50620001c7929150620001cb565b5090565b5b80821115620001c75760008155600101620001cc565b600181811c90821680620001f757607f821691505b602082108114156200021957634e487b7160e01b600052602260045260246000fd5b50919050565b613738806200022f6000396000f3fe608060405234801561001057600080fd5b50600436106103995760003560e01c80635bab8340116101e95780639c29b5791161010f578063d0ef63c4116100ad578063fc3e4ddb1161007c578063fc3e4ddb146108d0578063fcf71219146108e3578063fd36b011146108f6578063fd807c981461091657600080fd5b8063d0ef63c414610869578063d55ab9fa1461087c578063e3f4979f146108aa578063f2fde38b146108bd57600080fd5b8063ad38f95a116100e9578063ad38f95a14610826578063b187bd261461082f578063bac7a16d14610843578063c87b56dd1461085657600080fd5b80639c29b579146107ed5780639ff2c0c714610800578063a6c581291461081357600080fd5b806388a390df1161018757806395691a7f1161015657806395691a7f1461072657806395d89b411461075157806397b89ba2146107595780639a7083f91461077957600080fd5b806388a390df146106d75780638da5cb5b146106ea57806390b1de26146106fb578063955189c81461070457600080fd5b80636352211e116101c35780636352211e1461068057806370a08231146106a9578063715018a6146106bc5780637c0c1e42146106c457600080fd5b80635bab8340146106475780635ff800c01461065a57806360fdbc591461066d57600080fd5b80632c97696f116102ce57806342ec38e21161026c5780634cf892f71161023b5780634cf892f7146105fb5780634e63950c1461060e57806350409f851461062157806352dc224f1461063457600080fd5b806342ec38e21461057f57806345e09e54146105a8578063460ddc25146105c8578063487958bd146105e857600080fd5b806338fd37df116102a857806338fd37df146105265780633b465ea8146105395780633cb1a1e01461054c578063416fe8701461055f57600080fd5b80632c97696f146104e05780632e2a4690146104f357806338cd901a1461051e57600080fd5b806318160ddd1161033b578063240976bf11610315578063240976bf1461049457806324dbb7de146104a757806329d7f9eb146104ba5780632b689aa6146104cd57600080fd5b806318160ddd1461043e5780631fc4ce53146104545780632389e78a1461047457600080fd5b80630f759cfc116103775780630f759cfc146103f0578063115288f71461041057806311d7ba9e146104235780631249c58b1461043657600080fd5b806301ffc9a71461039e57806306fdde03146103c65780630b44a218146103db575b600080fd5b6103b16103ac366004612ed6565b610929565b60405190151581526020015b60405180910390f35b6103ce61097b565b6040516103bd9190613495565b6103ee6103e9366004612bf2565b610a0d565b005b6104036103fe366004612e58565b610a6b565b6040516103bd9190613401565b6103ee61041e366004613036565b610afb565b6103ee610431366004613146565b610b52565b6103ee610ba2565b600154600019015b6040519081526020016103bd565b610446610462366004612bd7565b600b6020526000908152604090205481565b61044661048236600461301d565b60146020526000908152604090205481565b6103ee6104a2366004612ebb565b610bd9565b6103ee6104b5366004612f00565b610c21565b6103ee6104c83660046131b2565b610c41565b6104036104db366004612bd7565b610c7d565b6103ce6104ee3660046130a4565b610d45565b601254610506906001600160a01b031681565b6040516001600160a01b0390911681526020016103bd565b6103ee610ddc565b6103ee61053436600461310a565b610e1d565b6103ee610547366004612bd7565b610e47565b6103ee61055a366004613059565b610e93565b61044661056d36600461301d565b600e6020526000908152604090205481565b61044661058d366004612bd7565b6001600160a01b031660009081526005602052604090205490565b6105bb6105b636600461301d565b610f38565b6040516103bd9190613507565b6104466105d6366004612bd7565b600c6020526000908152604090205481565b6105bb6105f6366004612bd7565b61102b565b6103ce610609366004612bd7565b611121565b6103ee61061c36600461301d565b6111bb565b6103ee61062f3660046131b2565b6111ea565b6103ee61064236600461301d565b611226565b601354610506906001600160a01b031681565b610403610668366004612bd7565b61131c565b6103ee61067b366004612d85565b6114aa565b61050661068e36600461301d565b6000908152600460205260409020546001600160a01b031690565b6104466106b7366004612bd7565b6114b3565b6103ee6114fc565b6103ee6106d23660046131b2565b611532565b6103ee6106e536600461301d565b61156e565b6000546001600160a01b0316610506565b61044660085481565b610717610712366004612bd7565b611579565b6040516103bd93929190613414565b610446610734366004612c25565b601060209081526000928352604080842090915290825290205481565b6103ce6115cd565b61076c610767366004612bd7565b6115dc565b6040516103bd91906133ac565b6107be61078736600461301d565b600a602052600090815260409020546001600160801b038116906001600160401b03600160801b8204811691600160c01b90041683565b604080516001600160801b0390941684526001600160401b0392831660208501529116908201526060016103bd565b6103ee6107fb366004612fa1565b6117f0565b601154610506906001600160a01b031681565b6103ee610821366004612d12565b6119ff565b61044660095481565b6013546103b190600160a01b900460ff1681565b6103ee610851366004613059565b611b2f565b6103ce61086436600461301d565b611bd4565b6103ee610877366004613036565b611c55565b6103b161088a366004612c25565b600f60209081526000928352604080842090915290825290205460ff1681565b6103ee6108b8366004612bd7565b611ca8565b6103ee6108cb366004612bd7565b611cf4565b6103ee6108de366004612bd7565b611d8c565b6103ee6108f1366004612c4f565b611dd8565b61044661090436600461301d565b600d6020526000908152604090205481565b6103ee6109243660046131d4565b612010565b60006301ffc9a760e01b6001600160e01b03198316148061095a57506380ac58cd60e01b6001600160e01b03198316145b806109755750635b5e139f60e01b6001600160e01b03198316145b92915050565b60606002805461098a90613672565b80601f01602080910402602001604051908101604052809291908181526020018280546109b690613672565b8015610a035780601f106109d857610100808354040283529160200191610a03565b820191906000526020600020905b8154815290600101906020018083116109e657829003601f168201915b5050505050905090565b6000546001600160a01b03163314610a405760405162461bcd60e51b8152600401610a37906134a8565b60405180910390fd5b6001600160a01b03919091166000908152601660205260409020805460ff1916911515919091179055565b601354604051632cfbb5ff60e11b81526060916001600160a01b0316906359f76bfe90610aa090869086903390600401613457565b60006040518083038186803b158015610ab857600080fd5b505afa158015610acc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610af49190810190612dc1565b9392505050565b3360009081526016602052604090205460ff16610b445760405162461bcd60e51b81526020600482015260076024820152660dcde40c2eae8d60cb1b6044820152606401610a37565b610b4e828261214d565b5050565b336000908152600b60205260409020548314610b7357610b73836000612226565b610b7c826123ec565b3360009081526015602090815260409091208251610b9c9284019061292b565b50505050565b60405162461bcd60e51b815260206004820152600c60248201526b1b9bc8199c9959481b5a5b9d60a21b6044820152606401610a37565b6000546001600160a01b03163314610c035760405162461bcd60e51b8152600401610a37906134a8565b60138054911515600160a01b0260ff60a01b19909216919091179055565b3360009081526015602090815260409091208251610b4e9284019061292b565b6000546001600160a01b03163314610c6b5760405162461bcd60e51b8152600401610a37906134a8565b60009182526014602052604090912055565b6001600160a01b0381166000908152600c6020526040812054606091816001600160401b03811115610cb157610cb16136ec565b604051908082528060200260200182016040528015610cda578160200160208202803683370190505b50905060005b82811015610d3d576001600160a01b03851660009081526007602090815260408083208484529091529020548251839083908110610d2057610d206136d6565b602090810291909101015280610d35816136ad565b915050610ce0565b509392505050565b60125460405163edf2efe360e01b81526060916001600160a01b03169063edf2efe390610d7f90889088908890889060019060040161351a565b60006040518083038186803b158015610d9757600080fd5b505afa158015610dab573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610dd39190810190612f34565b95945050505050565b6000546001600160a01b03163314610e065760405162461bcd60e51b8152600401610a37906134a8565b60098054906000610e16836136ad565b9190505550565b336000908152600b60205260409020548214610e3e57610e3e826000612226565b610b4e816123ec565b6000546001600160a01b03163314610e715760405162461bcd60e51b8152600401610a37906134a8565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160601b03193360601b166020820152600090603401604051602081830303815290604052805190602001209050610f128383808060200260200160405190810160405280939291908181526020018383602002808284376000920182905250898152600d602052604090205492508591506126069050565b610f2e5760405162461bcd60e51b8152600401610a37906134dd565b610b9c843361214d565b60408051608081018252600080825260208201819052918101919091526060808201526000828152600a60209081526040808320815160808101835281546001600160801b03811682526001600160401b03600160801b8204811683870152600160c01b9091041681840152600182018054845181870281018701909552808552919592946060870194939192919084015b8282101561101d576000848152602090819020604080516060810182529185015463ffffffff8082168452600160201b8204811684860152600160401b9091041690820152825260019092019101610fca565b505050915250909392505050565b60408051608081018252600080825260208201819052918101919091526060808201526001600160a01b0382166000908152600b60209081526040808320548352600a8252808320815160808101835281546001600160801b03811682526001600160401b03600160801b8204811683870152600160c01b909104168184015260018201805484518187028101870190955280855291959294606087019493919291908401821561101d576000848152602090819020604080516060810182529185015463ffffffff8082168452600160201b8204811684860152600160401b9091041690820152825260019092019101610fca565b6015602052600090815260409020805461113a90613672565b80601f016020809104026020016040519081016040528092919081815260200182805461116690613672565b80156111b35780601f10611188576101008083540402835291602001916111b3565b820191906000526020600020905b81548152906001019060200180831161119657829003601f168201915b505050505081565b6000546001600160a01b031633146111e55760405162461bcd60e51b8152600401610a37906134a8565b600955565b6000546001600160a01b031633146112145760405162461bcd60e51b8152600401610a37906134a8565b6000918252600d602052604090912055565b6000818152601460205260409020546112715760405162461bcd60e51b815260206004820152600d60248201526c1c1c9a58d9481b9bdd081cd95d609a1b6044820152606401610a37565b6011546000828152601460205260409081902054905163079cc67960e41b815233600482015260248101919091526001600160a01b03909116906379cc679090604401600060405180830381600087803b1580156112ce57600080fd5b505af11580156112e2573d6000803e3d6000fd5b505050506112ef3361261c565b61130f576112fc3361264a565b336000908152600b602052604090208190555b611319813361271a565b50565b6001600160a01b0381166000908152600b60209081526040808320548352600a8252808320815160808101835281546001600160801b03811682526001600160401b03600160801b8204811683870152600160c01b90910416818401526001820180548451818702810187019095528085526060969592948588019390929190879084015b828210156113f4576000848152602090819020604080516060810182529185015463ffffffff8082168452600160201b8204811684860152600160401b90910416908201528252600190920191016113a1565b5050505081525050905060008160600151516001600160401b0381111561141d5761141d6136ec565b604051908082528060200260200182016040528015611446578160200160208202803683370190505b50905060005b8151811015610d3d576001600160a01b0385166000908152601060209081526040808320848452909152902054825183908390811061148d5761148d6136d6565b6020908102919091010152806114a2816136ad565b91505061144c565b611319816123ec565b60006001600160a01b0382166114dc576040516323d3ad8160e21b815260040160405180910390fd5b6114e58261261c565b6114f05760006114f3565b60015b60ff1692915050565b6000546001600160a01b031633146115265760405162461bcd60e51b8152600401610a37906134a8565b6115306000612837565b565b6000546001600160a01b0316331461155c5760405162461bcd60e51b8152600401610a37906134a8565b6000918252600e602052604090912055565b611319816001612226565b6060806115a5604080516080810182526000808252602082018190529181019190915260608082015290565b6115ae84610c7d565b6115b7856115dc565b6115c08661102b565b9250925092509193909250565b60606003805461098a90613672565b6060600060015b6008548111611638576001600160a01b0384166000908152600f6020908152604080832084845290915290205460ff16156116265781611622816136ad565b9250505b80611630816136ad565b9150506115e3565b506000816001600160401b03811115611653576116536136ec565b6040519080825280602002602001820160405280156116a457816020015b60408051608081018252600080825260208083018290529282015260608082015282526000199092019101816116715790505b509050600060015b60085481116117e6576001600160a01b0386166000908152600f6020908152604080832084845290915290205460ff16156117d4576000818152600a60209081526040808320815160808101835281546001600160801b03811682526001600160401b03600160801b8204811683870152600160c01b9091041681840152600182018054845181870281018701909552808552919592946060870194939192919084015b828210156117a3576000848152602090819020604080516060810182529185015463ffffffff8082168452600160201b8204811684860152600160401b9091041690820152825260019092019101611750565b505050915250849050836117b6816136ad565b9450815181106117c8576117c86136d6565b60200260200101819052505b806117de816136ad565b9150506116ac565b5090949350505050565b6000546001600160a01b0316331461181a5760405162461bcd60e51b8152600401610a37906134a8565b836001600160801b03166008548111156118665760405162461bcd60e51b815260206004820152600d60248201526c1d5b9adb9bdddb88189bd85c99609a1b6044820152606401610a37565b6001600160801b0385166000818152600a6020526040812080546001600160401b03878116600160c01b026001600160c01b03918a16600160801b026001600160c01b031990931690951791909117169290921782556001820154905b84518110156119f55780821161195857826001018582815181106118e9576118e96136d6565b60209081029190910181015182546001810184556000938452928290208151930180549282015160409092015163ffffffff908116600160401b0263ffffffff60401b19938216600160201b0267ffffffffffffffff19909516919095161792909217169190911790556119e3565b84818151811061196a5761196a6136d6565b6020026020010151836001018281548110611987576119876136d6565b60009182526020918290208351910180549284015160409094015163ffffffff908116600160401b0263ffffffff60401b19958216600160201b0267ffffffffffffffff19909516919093161792909217929092169190911790555b806119ed816136ad565b9150506118c3565b5050505050505050565b601354604051632cfbb5ff60e11b81526000916001600160a01b0316906359f76bfe90611a3890899089908990899033906004016133bf565b60006040518083038186803b158015611a5057600080fd5b505afa158015611a64573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611a8c9190810190612dc1565b905060005b8151811015611b26576000828281518110611aae57611aae6136d6565b602002602001015190508060001415611ac75750611b26565b80841415611b1357600081815260066020908152604080832033845290915290205460ff16611b1357611b13838381518110611b0557611b056136d6565b60200260200101513361214d565b5080611b1e816136ad565b915050611a91565b50505050505050565b6040516001600160601b03193360601b166020820152600090603401604051602081830303815290604052805190602001209050611bae8383808060200260200160405190810160405280939291908181526020018383602002808284376000920182905250898152600e602052604090205492508591506126069050565b611bca5760405162461bcd60e51b8152600401610a37906134dd565b610b9c843361271a565b60125460405163c87b56dd60e01b8152600481018390526060916001600160a01b03169063c87b56dd9060240160006040518083038186803b158015611c1957600080fd5b505afa158015611c2d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109759190810190612f34565b3360009081526016602052604090205460ff16611c9e5760405162461bcd60e51b81526020600482015260076024820152660dcde40c2eae8d60cb1b6044820152606401610a37565b610b4e828261271a565b6000546001600160a01b03163314611cd25760405162461bcd60e51b8152600401610a37906134a8565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314611d1e5760405162461bcd60e51b8152600401610a37906134a8565b6001600160a01b038116611d835760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a37565b61131981612837565b6000546001600160a01b03163314611db65760405162461bcd60e51b8152600401610a37906134a8565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b60005b87811015611ef2576040516001600160601b03193360601b166020820152600090603401604051602081830303815290604052805190602001209050611ea1888884818110611e2c57611e2c6136d6565b9050602002810190611e3e919061355b565b808060200260200160405190810160405280939291908181526020018383602002808284376000920182905250600d935091508e90508d87818110611e8557611e856136d6565b9050602002013581526020019081526020016000205483612606565b611ebd5760405162461bcd60e51b8152600401610a37906134dd565b611edf8a8a84818110611ed257611ed26136d6565b905060200201353361214d565b5080611eea816136ad565b915050611ddb565b50601354604051632cfbb5ff60e11b81526000916001600160a01b0316906359f76bfe90611f2c90889088908890889033906004016133bf565b60006040518083038186803b158015611f4457600080fd5b505afa158015611f58573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611f809190810190612dc1565b905060005b8151811015612004576000828281518110611fa257611fa26136d6565b602002602001015190508060001415611fbb5750612004565b600081815260066020908152604080832033845290915290205460ff16611ff157611ff1838381518110611b0557611b056136d6565b5080611ffc816136ad565b915050611f85565b50505050505050505050565b6000546001600160a01b0316331461203a5760405162461bcd60e51b8152600401610a37906134a8565b6008805490600061204a836136ad565b90915550506008546000818152600a6020526040812080546001600160401b03868116600160c01b026001600160c01b03918916600160801b026001600160c01b03199093166001600160801b039096169590951791909117169290921782555b825181101561214657816001018382815181106120ca576120ca6136d6565b60209081029190910181015182546001810184556000938452928290208151930180549282015160409092015163ffffffff908116600160401b0263ffffffff60401b19938216600160201b0267ffffffffffffffff19909516919095161792909217169190911790558061213e816136ad565b9150506120ab565b5050505050565b8160095481111561218f5760405162461bcd60e51b815260206004820152600c60248201526b0756e6b6e6f776e20706f61760a41b6044820152606401610a37565b60008381526006602090815260408083206001600160a01b038616845290915290205460ff16156121bf57505050565b60008381526006602090815260408083206001600160a01b038616808552908352818420805460ff1916600117905560078352818420600c80855283862080548752918552928520889055908452915280549161221b836136ad565b91905055505b505050565b336000908152600b60205260409020548214156122725760405162461bcd60e51b815260206004820152600a6024820152691cd85b5948189bd85c9960b21b6044820152606401610a37565b336000908152600f6020908152604080832085845290915290205460ff166122cb5760405162461bcd60e51b815260206004820152600c60248201526b1b1bd8dad95908189bd85c9960a21b6044820152606401610a37565b336000908152600b602052604090208290558015610b4e576000828152600a60209081526040808320815160808101835281546001600160801b03811682526001600160401b03600160801b8204811683870152600160c01b9091041681840152600182018054845181870281018701909552808552919492936060860193909290879084015b828210156123a5576000848152602090819020604080516060810182529185015463ffffffff8082168452600160201b8204811684860152600160401b9091041690820152825260019092019101612352565b5050505081525050905060005b816060015151811015610b9c57336000908152601060209081526040808320848452909152812055806123e4816136ad565b9150506123b2565b336000908152600b60209081526040808320548352600a8252808320815160808101835281546001600160801b03811682526001600160401b03600160801b8204811683870152600160c01b9091041681840152600182018054845181870281018701909552808552919492936060860193909290879084015b828210156124b9576000848152602090819020604080516060810182529185015463ffffffff8082168452600160201b8204811684860152600160401b9091041690820152825260019092019101612466565b505050508152505090508060600151518251146125055760405162461bcd60e51b815260206004820152600a60248201526977726f6e672073697a6560b01b6044820152606401610a37565b60005b8251811015612221576000838281518110612525576125256136d6565b6020026020010151905060005b828110156125ad578115806125605750848181518110612554576125546136d6565b60200260200101518214155b61259b5760405162461bcd60e51b815260206004820152600c60248201526b185b1c9958591e481d5cd95960a21b6044820152606401610a37565b806125a5816136ad565b915050612532565b50600081815260066020908152604080832033845290915290205460ff166125d65760006125d8565b805b33600090815260106020908152604080832086845290915290205550806125fe816136ad565b915050612508565b6000826126138584612887565b14949350505050565b6001600160a01b03908116600081815260056020908152604080832054835260049091529020549091161490565b6001600160a01b03811661267057604051622e076360e81b815260040160405180910390fd5b6126798161261c565b1561269757604051630101657360e41b815260040160405180910390fd5b60018054600090815260046020908152604080832080546001600160a01b0319166001600160a01b0387169081179091559354848452600590925280832082905551909291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a460018054906000612712836136ad565b919050555050565b8160085481111561275d5760405162461bcd60e51b815260206004820152600d60248201526c1d5b9adb9bdddb88189bd85c99609a1b6044820152606401610a37565b6127668261261c565b6127a25760405162461bcd60e51b815260206004820152600d60248201526c1b5a5b9d081c995c5d5a5c9959609a1b6044820152606401610a37565b6001600160a01b0382166000908152600f6020908152604080832086845290915290205460ff16156128085760405162461bcd60e51b815260206004820152600f60248201526e185b1c9958591e4818db185a5b5959608a1b6044820152606401610a37565b506001600160a01b03166000908152600f6020908152604080832093835292905220805460ff19166001179055565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600081815b8451811015610d3d5760008582815181106128a9576128a96136d6565b602002602001015190508083116128eb576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250612918565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080612923816136ad565b91505061288c565b82805461293790613672565b90600052602060002090601f016020900481019282612959576000855561299f565b82601f1061297257805160ff191683800117855561299f565b8280016001018555821561299f579182015b8281111561299f578251825591602001919060010190612984565b506129ab9291506129af565b5090565b5b808211156129ab57600081556001016129b0565b80356001600160a01b03811681146129db57600080fd5b919050565b60008083601f8401126129f257600080fd5b5081356001600160401b03811115612a0957600080fd5b6020830191508360208260051b8501011115612a2457600080fd5b9250929050565b600082601f830112612a3c57600080fd5b81356020612a51612a4c836135fc565b6135cc565b82815281810190858301606080860288018501891015612a7057600080fd5b6000805b87811015612acf5782848c031215612a8a578182fd5b612a926135a4565b612a9b85612bac565b8152612aa8888601612bac565b888201526040612ab9818701612bac565b9082015286529486019492820192600101612a74565b50929998505050505050505050565b600082601f830112612aef57600080fd5b81356020612aff612a4c836135fc565b80838252828201915082860187848660051b8901011115612b1f57600080fd5b60005b85811015612b3e57813584529284019290840190600101612b22565b5090979650505050505050565b803580151581146129db57600080fd5b600082601f830112612b6c57600080fd5b8135612b7a612a4c8261361f565b818152846020838601011115612b8f57600080fd5b816020850160208301376000918101602001919091529392505050565b803563ffffffff811681146129db57600080fd5b80356001600160401b03811681146129db57600080fd5b600060208284031215612be957600080fd5b610af4826129c4565b60008060408385031215612c0557600080fd5b612c0e836129c4565b9150612c1c60208401612b4b565b90509250929050565b60008060408385031215612c3857600080fd5b612c41836129c4565b946020939093013593505050565b6000806000806000806000806080898b031215612c6b57600080fd5b88356001600160401b0380821115612c8257600080fd5b612c8e8c838d016129e0565b909a50985060208b0135915080821115612ca757600080fd5b612cb38c838d016129e0565b909850965060408b0135915080821115612ccc57600080fd5b612cd88c838d016129e0565b909650945060608b0135915080821115612cf157600080fd5b50612cfe8b828c016129e0565b999c989b5096995094979396929594505050565b600080600080600060608688031215612d2a57600080fd5b85356001600160401b0380821115612d4157600080fd5b612d4d89838a016129e0565b90975095506020880135915080821115612d6657600080fd5b50612d73888289016129e0565b96999598509660400135949350505050565b600060208284031215612d9757600080fd5b81356001600160401b03811115612dad57600080fd5b612db984828501612ade565b949350505050565b60006020808385031215612dd457600080fd5b82516001600160401b03811115612dea57600080fd5b8301601f81018513612dfb57600080fd5b8051612e09612a4c826135fc565b80828252848201915084840188868560051b8701011115612e2957600080fd5b600094505b83851015612e4c578051835260019490940193918501918501612e2e565b50979650505050505050565b60008060408385031215612e6b57600080fd5b82356001600160401b0380821115612e8257600080fd5b612e8e86838701612ade565b93506020850135915080821115612ea457600080fd5b50612eb185828601612ade565b9150509250929050565b600060208284031215612ecd57600080fd5b610af482612b4b565b600060208284031215612ee857600080fd5b81356001600160e01b031981168114610af457600080fd5b600060208284031215612f1257600080fd5b81356001600160401b03811115612f2857600080fd5b612db984828501612b5b565b600060208284031215612f4657600080fd5b81516001600160401b03811115612f5c57600080fd5b8201601f81018413612f6d57600080fd5b8051612f7b612a4c8261361f565b818152856020838501011115612f9057600080fd5b610dd3826020830160208601613646565b60008060008060808587031215612fb757600080fd5b84356001600160801b0381168114612fce57600080fd5b9350612fdc60208601612bc0565b9250612fea60408601612bc0565b915060608501356001600160401b0381111561300557600080fd5b61301187828801612a2b565b91505092959194509250565b60006020828403121561302f57600080fd5b5035919050565b6000806040838503121561304957600080fd5b82359150612c1c602084016129c4565b60008060006040848603121561306e57600080fd5b8335925060208401356001600160401b0381111561308b57600080fd5b613097868287016129e0565b9497909650939450505050565b600080600080606085870312156130ba57600080fd5b8435935060208501356001600160401b03808211156130d857600080fd5b6130e4888389016129e0565b909550935060408701359150808211156130fd57600080fd5b5061301187828801612b5b565b6000806040838503121561311d57600080fd5b8235915060208301356001600160401b0381111561313a57600080fd5b612eb185828601612ade565b60008060006060848603121561315b57600080fd5b8335925060208401356001600160401b038082111561317957600080fd5b61318587838801612ade565b9350604086013591508082111561319b57600080fd5b506131a886828701612b5b565b9150509250925092565b600080604083850312156131c557600080fd5b50508035926020909101359150565b6000806000606084860312156131e957600080fd5b6131f284612bc0565b925061320060208501612bc0565b915060408401356001600160401b0381111561321b57600080fd5b6131a886828701612a2b565b6000815180845260208085019450848260051b860182860160005b85811015612b3e57838303895261325a838351613309565b98850198925090840190600101613242565b81835260006001600160fb1b0383111561328557600080fd5b8260051b8083602087013760009401602001938452509192915050565b600081518084526020808501945080840160005b838110156132d2578151875295820195908201906001016132b6565b509495945050505050565b600081518084526132f5816020860160208601613646565b601f01601f19169290920160200192915050565b6000608083016001600160801b0383511684526020808401516001600160401b038082168388015260409150808287015116828801525060608086015160808289015284815180875260a08a0191508583019650600092505b8083101561339f578651805163ffffffff908116845287820151811688850152908601511685830152958501956001929092019190830190613362565b5098975050505050505050565b602081526000610af46020830184613227565b6060815260006133d360608301878961326c565b82810360208401526133e681868861326c565b91505060018060a01b03831660408301529695505050505050565b602081526000610af460208301846132a2565b60608152600061342760608301866132a2565b82810360208401526134398186613227565b9050828103604084015261344d8185613309565b9695505050505050565b60608152600061346a60608301866132a2565b828103602084015261347c81866132a2565b91505060018060a01b0383166040830152949350505050565b602081526000610af460208301846132dd565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526010908201526f1b9bdd081a5b881dda1a5d195b1a5cdd60821b604082015260600190565b602081526000610af46020830184613309565b85815260806020820152600061353460808301868861326c565b828103604084015261354681866132dd565b91505082151560608301529695505050505050565b6000808335601e1984360301811261357257600080fd5b8301803591506001600160401b0382111561358c57600080fd5b6020019150600581901b3603821315612a2457600080fd5b604051606081016001600160401b03811182821017156135c6576135c66136ec565b60405290565b604051601f8201601f191681016001600160401b03811182821017156135f4576135f46136ec565b604052919050565b60006001600160401b03821115613615576136156136ec565b5060051b60200190565b60006001600160401b03821115613638576136386136ec565b50601f01601f191660200190565b60005b83811015613661578181015183820152602001613649565b83811115610b9c5750506000910152565b600181811c9082168061368657607f821691505b602082108114156136a757634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156136cf57634e487b7160e01b600052601160045260246000fd5b5060010190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfea2646970667358221220dd00670a3046a5a8fe7b418594206076f714ac2e6a32bbc4f214067f5f83313864736f6c63430008070033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103995760003560e01c80635bab8340116101e95780639c29b5791161010f578063d0ef63c4116100ad578063fc3e4ddb1161007c578063fc3e4ddb146108d0578063fcf71219146108e3578063fd36b011146108f6578063fd807c981461091657600080fd5b8063d0ef63c414610869578063d55ab9fa1461087c578063e3f4979f146108aa578063f2fde38b146108bd57600080fd5b8063ad38f95a116100e9578063ad38f95a14610826578063b187bd261461082f578063bac7a16d14610843578063c87b56dd1461085657600080fd5b80639c29b579146107ed5780639ff2c0c714610800578063a6c581291461081357600080fd5b806388a390df1161018757806395691a7f1161015657806395691a7f1461072657806395d89b411461075157806397b89ba2146107595780639a7083f91461077957600080fd5b806388a390df146106d75780638da5cb5b146106ea57806390b1de26146106fb578063955189c81461070457600080fd5b80636352211e116101c35780636352211e1461068057806370a08231146106a9578063715018a6146106bc5780637c0c1e42146106c457600080fd5b80635bab8340146106475780635ff800c01461065a57806360fdbc591461066d57600080fd5b80632c97696f116102ce57806342ec38e21161026c5780634cf892f71161023b5780634cf892f7146105fb5780634e63950c1461060e57806350409f851461062157806352dc224f1461063457600080fd5b806342ec38e21461057f57806345e09e54146105a8578063460ddc25146105c8578063487958bd146105e857600080fd5b806338fd37df116102a857806338fd37df146105265780633b465ea8146105395780633cb1a1e01461054c578063416fe8701461055f57600080fd5b80632c97696f146104e05780632e2a4690146104f357806338cd901a1461051e57600080fd5b806318160ddd1161033b578063240976bf11610315578063240976bf1461049457806324dbb7de146104a757806329d7f9eb146104ba5780632b689aa6146104cd57600080fd5b806318160ddd1461043e5780631fc4ce53146104545780632389e78a1461047457600080fd5b80630f759cfc116103775780630f759cfc146103f0578063115288f71461041057806311d7ba9e146104235780631249c58b1461043657600080fd5b806301ffc9a71461039e57806306fdde03146103c65780630b44a218146103db575b600080fd5b6103b16103ac366004612ed6565b610929565b60405190151581526020015b60405180910390f35b6103ce61097b565b6040516103bd9190613495565b6103ee6103e9366004612bf2565b610a0d565b005b6104036103fe366004612e58565b610a6b565b6040516103bd9190613401565b6103ee61041e366004613036565b610afb565b6103ee610431366004613146565b610b52565b6103ee610ba2565b600154600019015b6040519081526020016103bd565b610446610462366004612bd7565b600b6020526000908152604090205481565b61044661048236600461301d565b60146020526000908152604090205481565b6103ee6104a2366004612ebb565b610bd9565b6103ee6104b5366004612f00565b610c21565b6103ee6104c83660046131b2565b610c41565b6104036104db366004612bd7565b610c7d565b6103ce6104ee3660046130a4565b610d45565b601254610506906001600160a01b031681565b6040516001600160a01b0390911681526020016103bd565b6103ee610ddc565b6103ee61053436600461310a565b610e1d565b6103ee610547366004612bd7565b610e47565b6103ee61055a366004613059565b610e93565b61044661056d36600461301d565b600e6020526000908152604090205481565b61044661058d366004612bd7565b6001600160a01b031660009081526005602052604090205490565b6105bb6105b636600461301d565b610f38565b6040516103bd9190613507565b6104466105d6366004612bd7565b600c6020526000908152604090205481565b6105bb6105f6366004612bd7565b61102b565b6103ce610609366004612bd7565b611121565b6103ee61061c36600461301d565b6111bb565b6103ee61062f3660046131b2565b6111ea565b6103ee61064236600461301d565b611226565b601354610506906001600160a01b031681565b610403610668366004612bd7565b61131c565b6103ee61067b366004612d85565b6114aa565b61050661068e36600461301d565b6000908152600460205260409020546001600160a01b031690565b6104466106b7366004612bd7565b6114b3565b6103ee6114fc565b6103ee6106d23660046131b2565b611532565b6103ee6106e536600461301d565b61156e565b6000546001600160a01b0316610506565b61044660085481565b610717610712366004612bd7565b611579565b6040516103bd93929190613414565b610446610734366004612c25565b601060209081526000928352604080842090915290825290205481565b6103ce6115cd565b61076c610767366004612bd7565b6115dc565b6040516103bd91906133ac565b6107be61078736600461301d565b600a602052600090815260409020546001600160801b038116906001600160401b03600160801b8204811691600160c01b90041683565b604080516001600160801b0390941684526001600160401b0392831660208501529116908201526060016103bd565b6103ee6107fb366004612fa1565b6117f0565b601154610506906001600160a01b031681565b6103ee610821366004612d12565b6119ff565b61044660095481565b6013546103b190600160a01b900460ff1681565b6103ee610851366004613059565b611b2f565b6103ce61086436600461301d565b611bd4565b6103ee610877366004613036565b611c55565b6103b161088a366004612c25565b600f60209081526000928352604080842090915290825290205460ff1681565b6103ee6108b8366004612bd7565b611ca8565b6103ee6108cb366004612bd7565b611cf4565b6103ee6108de366004612bd7565b611d8c565b6103ee6108f1366004612c4f565b611dd8565b61044661090436600461301d565b600d6020526000908152604090205481565b6103ee6109243660046131d4565b612010565b60006301ffc9a760e01b6001600160e01b03198316148061095a57506380ac58cd60e01b6001600160e01b03198316145b806109755750635b5e139f60e01b6001600160e01b03198316145b92915050565b60606002805461098a90613672565b80601f01602080910402602001604051908101604052809291908181526020018280546109b690613672565b8015610a035780601f106109d857610100808354040283529160200191610a03565b820191906000526020600020905b8154815290600101906020018083116109e657829003601f168201915b5050505050905090565b6000546001600160a01b03163314610a405760405162461bcd60e51b8152600401610a37906134a8565b60405180910390fd5b6001600160a01b03919091166000908152601660205260409020805460ff1916911515919091179055565b601354604051632cfbb5ff60e11b81526060916001600160a01b0316906359f76bfe90610aa090869086903390600401613457565b60006040518083038186803b158015610ab857600080fd5b505afa158015610acc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610af49190810190612dc1565b9392505050565b3360009081526016602052604090205460ff16610b445760405162461bcd60e51b81526020600482015260076024820152660dcde40c2eae8d60cb1b6044820152606401610a37565b610b4e828261214d565b5050565b336000908152600b60205260409020548314610b7357610b73836000612226565b610b7c826123ec565b3360009081526015602090815260409091208251610b9c9284019061292b565b50505050565b60405162461bcd60e51b815260206004820152600c60248201526b1b9bc8199c9959481b5a5b9d60a21b6044820152606401610a37565b6000546001600160a01b03163314610c035760405162461bcd60e51b8152600401610a37906134a8565b60138054911515600160a01b0260ff60a01b19909216919091179055565b3360009081526015602090815260409091208251610b4e9284019061292b565b6000546001600160a01b03163314610c6b5760405162461bcd60e51b8152600401610a37906134a8565b60009182526014602052604090912055565b6001600160a01b0381166000908152600c6020526040812054606091816001600160401b03811115610cb157610cb16136ec565b604051908082528060200260200182016040528015610cda578160200160208202803683370190505b50905060005b82811015610d3d576001600160a01b03851660009081526007602090815260408083208484529091529020548251839083908110610d2057610d206136d6565b602090810291909101015280610d35816136ad565b915050610ce0565b509392505050565b60125460405163edf2efe360e01b81526060916001600160a01b03169063edf2efe390610d7f90889088908890889060019060040161351a565b60006040518083038186803b158015610d9757600080fd5b505afa158015610dab573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610dd39190810190612f34565b95945050505050565b6000546001600160a01b03163314610e065760405162461bcd60e51b8152600401610a37906134a8565b60098054906000610e16836136ad565b9190505550565b336000908152600b60205260409020548214610e3e57610e3e826000612226565b610b4e816123ec565b6000546001600160a01b03163314610e715760405162461bcd60e51b8152600401610a37906134a8565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160601b03193360601b166020820152600090603401604051602081830303815290604052805190602001209050610f128383808060200260200160405190810160405280939291908181526020018383602002808284376000920182905250898152600d602052604090205492508591506126069050565b610f2e5760405162461bcd60e51b8152600401610a37906134dd565b610b9c843361214d565b60408051608081018252600080825260208201819052918101919091526060808201526000828152600a60209081526040808320815160808101835281546001600160801b03811682526001600160401b03600160801b8204811683870152600160c01b9091041681840152600182018054845181870281018701909552808552919592946060870194939192919084015b8282101561101d576000848152602090819020604080516060810182529185015463ffffffff8082168452600160201b8204811684860152600160401b9091041690820152825260019092019101610fca565b505050915250909392505050565b60408051608081018252600080825260208201819052918101919091526060808201526001600160a01b0382166000908152600b60209081526040808320548352600a8252808320815160808101835281546001600160801b03811682526001600160401b03600160801b8204811683870152600160c01b909104168184015260018201805484518187028101870190955280855291959294606087019493919291908401821561101d576000848152602090819020604080516060810182529185015463ffffffff8082168452600160201b8204811684860152600160401b9091041690820152825260019092019101610fca565b6015602052600090815260409020805461113a90613672565b80601f016020809104026020016040519081016040528092919081815260200182805461116690613672565b80156111b35780601f10611188576101008083540402835291602001916111b3565b820191906000526020600020905b81548152906001019060200180831161119657829003601f168201915b505050505081565b6000546001600160a01b031633146111e55760405162461bcd60e51b8152600401610a37906134a8565b600955565b6000546001600160a01b031633146112145760405162461bcd60e51b8152600401610a37906134a8565b6000918252600d602052604090912055565b6000818152601460205260409020546112715760405162461bcd60e51b815260206004820152600d60248201526c1c1c9a58d9481b9bdd081cd95d609a1b6044820152606401610a37565b6011546000828152601460205260409081902054905163079cc67960e41b815233600482015260248101919091526001600160a01b03909116906379cc679090604401600060405180830381600087803b1580156112ce57600080fd5b505af11580156112e2573d6000803e3d6000fd5b505050506112ef3361261c565b61130f576112fc3361264a565b336000908152600b602052604090208190555b611319813361271a565b50565b6001600160a01b0381166000908152600b60209081526040808320548352600a8252808320815160808101835281546001600160801b03811682526001600160401b03600160801b8204811683870152600160c01b90910416818401526001820180548451818702810187019095528085526060969592948588019390929190879084015b828210156113f4576000848152602090819020604080516060810182529185015463ffffffff8082168452600160201b8204811684860152600160401b90910416908201528252600190920191016113a1565b5050505081525050905060008160600151516001600160401b0381111561141d5761141d6136ec565b604051908082528060200260200182016040528015611446578160200160208202803683370190505b50905060005b8151811015610d3d576001600160a01b0385166000908152601060209081526040808320848452909152902054825183908390811061148d5761148d6136d6565b6020908102919091010152806114a2816136ad565b91505061144c565b611319816123ec565b60006001600160a01b0382166114dc576040516323d3ad8160e21b815260040160405180910390fd5b6114e58261261c565b6114f05760006114f3565b60015b60ff1692915050565b6000546001600160a01b031633146115265760405162461bcd60e51b8152600401610a37906134a8565b6115306000612837565b565b6000546001600160a01b0316331461155c5760405162461bcd60e51b8152600401610a37906134a8565b6000918252600e602052604090912055565b611319816001612226565b6060806115a5604080516080810182526000808252602082018190529181019190915260608082015290565b6115ae84610c7d565b6115b7856115dc565b6115c08661102b565b9250925092509193909250565b60606003805461098a90613672565b6060600060015b6008548111611638576001600160a01b0384166000908152600f6020908152604080832084845290915290205460ff16156116265781611622816136ad565b9250505b80611630816136ad565b9150506115e3565b506000816001600160401b03811115611653576116536136ec565b6040519080825280602002602001820160405280156116a457816020015b60408051608081018252600080825260208083018290529282015260608082015282526000199092019101816116715790505b509050600060015b60085481116117e6576001600160a01b0386166000908152600f6020908152604080832084845290915290205460ff16156117d4576000818152600a60209081526040808320815160808101835281546001600160801b03811682526001600160401b03600160801b8204811683870152600160c01b9091041681840152600182018054845181870281018701909552808552919592946060870194939192919084015b828210156117a3576000848152602090819020604080516060810182529185015463ffffffff8082168452600160201b8204811684860152600160401b9091041690820152825260019092019101611750565b505050915250849050836117b6816136ad565b9450815181106117c8576117c86136d6565b60200260200101819052505b806117de816136ad565b9150506116ac565b5090949350505050565b6000546001600160a01b0316331461181a5760405162461bcd60e51b8152600401610a37906134a8565b836001600160801b03166008548111156118665760405162461bcd60e51b815260206004820152600d60248201526c1d5b9adb9bdddb88189bd85c99609a1b6044820152606401610a37565b6001600160801b0385166000818152600a6020526040812080546001600160401b03878116600160c01b026001600160c01b03918a16600160801b026001600160c01b031990931690951791909117169290921782556001820154905b84518110156119f55780821161195857826001018582815181106118e9576118e96136d6565b60209081029190910181015182546001810184556000938452928290208151930180549282015160409092015163ffffffff908116600160401b0263ffffffff60401b19938216600160201b0267ffffffffffffffff19909516919095161792909217169190911790556119e3565b84818151811061196a5761196a6136d6565b6020026020010151836001018281548110611987576119876136d6565b60009182526020918290208351910180549284015160409094015163ffffffff908116600160401b0263ffffffff60401b19958216600160201b0267ffffffffffffffff19909516919093161792909217929092169190911790555b806119ed816136ad565b9150506118c3565b5050505050505050565b601354604051632cfbb5ff60e11b81526000916001600160a01b0316906359f76bfe90611a3890899089908990899033906004016133bf565b60006040518083038186803b158015611a5057600080fd5b505afa158015611a64573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611a8c9190810190612dc1565b905060005b8151811015611b26576000828281518110611aae57611aae6136d6565b602002602001015190508060001415611ac75750611b26565b80841415611b1357600081815260066020908152604080832033845290915290205460ff16611b1357611b13838381518110611b0557611b056136d6565b60200260200101513361214d565b5080611b1e816136ad565b915050611a91565b50505050505050565b6040516001600160601b03193360601b166020820152600090603401604051602081830303815290604052805190602001209050611bae8383808060200260200160405190810160405280939291908181526020018383602002808284376000920182905250898152600e602052604090205492508591506126069050565b611bca5760405162461bcd60e51b8152600401610a37906134dd565b610b9c843361271a565b60125460405163c87b56dd60e01b8152600481018390526060916001600160a01b03169063c87b56dd9060240160006040518083038186803b158015611c1957600080fd5b505afa158015611c2d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109759190810190612f34565b3360009081526016602052604090205460ff16611c9e5760405162461bcd60e51b81526020600482015260076024820152660dcde40c2eae8d60cb1b6044820152606401610a37565b610b4e828261271a565b6000546001600160a01b03163314611cd25760405162461bcd60e51b8152600401610a37906134a8565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314611d1e5760405162461bcd60e51b8152600401610a37906134a8565b6001600160a01b038116611d835760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a37565b61131981612837565b6000546001600160a01b03163314611db65760405162461bcd60e51b8152600401610a37906134a8565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b60005b87811015611ef2576040516001600160601b03193360601b166020820152600090603401604051602081830303815290604052805190602001209050611ea1888884818110611e2c57611e2c6136d6565b9050602002810190611e3e919061355b565b808060200260200160405190810160405280939291908181526020018383602002808284376000920182905250600d935091508e90508d87818110611e8557611e856136d6565b9050602002013581526020019081526020016000205483612606565b611ebd5760405162461bcd60e51b8152600401610a37906134dd565b611edf8a8a84818110611ed257611ed26136d6565b905060200201353361214d565b5080611eea816136ad565b915050611ddb565b50601354604051632cfbb5ff60e11b81526000916001600160a01b0316906359f76bfe90611f2c90889088908890889033906004016133bf565b60006040518083038186803b158015611f4457600080fd5b505afa158015611f58573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611f809190810190612dc1565b905060005b8151811015612004576000828281518110611fa257611fa26136d6565b602002602001015190508060001415611fbb5750612004565b600081815260066020908152604080832033845290915290205460ff16611ff157611ff1838381518110611b0557611b056136d6565b5080611ffc816136ad565b915050611f85565b50505050505050505050565b6000546001600160a01b0316331461203a5760405162461bcd60e51b8152600401610a37906134a8565b6008805490600061204a836136ad565b90915550506008546000818152600a6020526040812080546001600160401b03868116600160c01b026001600160c01b03918916600160801b026001600160c01b03199093166001600160801b039096169590951791909117169290921782555b825181101561214657816001018382815181106120ca576120ca6136d6565b60209081029190910181015182546001810184556000938452928290208151930180549282015160409092015163ffffffff908116600160401b0263ffffffff60401b19938216600160201b0267ffffffffffffffff19909516919095161792909217169190911790558061213e816136ad565b9150506120ab565b5050505050565b8160095481111561218f5760405162461bcd60e51b815260206004820152600c60248201526b0756e6b6e6f776e20706f61760a41b6044820152606401610a37565b60008381526006602090815260408083206001600160a01b038616845290915290205460ff16156121bf57505050565b60008381526006602090815260408083206001600160a01b038616808552908352818420805460ff1916600117905560078352818420600c80855283862080548752918552928520889055908452915280549161221b836136ad565b91905055505b505050565b336000908152600b60205260409020548214156122725760405162461bcd60e51b815260206004820152600a6024820152691cd85b5948189bd85c9960b21b6044820152606401610a37565b336000908152600f6020908152604080832085845290915290205460ff166122cb5760405162461bcd60e51b815260206004820152600c60248201526b1b1bd8dad95908189bd85c9960a21b6044820152606401610a37565b336000908152600b602052604090208290558015610b4e576000828152600a60209081526040808320815160808101835281546001600160801b03811682526001600160401b03600160801b8204811683870152600160c01b9091041681840152600182018054845181870281018701909552808552919492936060860193909290879084015b828210156123a5576000848152602090819020604080516060810182529185015463ffffffff8082168452600160201b8204811684860152600160401b9091041690820152825260019092019101612352565b5050505081525050905060005b816060015151811015610b9c57336000908152601060209081526040808320848452909152812055806123e4816136ad565b9150506123b2565b336000908152600b60209081526040808320548352600a8252808320815160808101835281546001600160801b03811682526001600160401b03600160801b8204811683870152600160c01b9091041681840152600182018054845181870281018701909552808552919492936060860193909290879084015b828210156124b9576000848152602090819020604080516060810182529185015463ffffffff8082168452600160201b8204811684860152600160401b9091041690820152825260019092019101612466565b505050508152505090508060600151518251146125055760405162461bcd60e51b815260206004820152600a60248201526977726f6e672073697a6560b01b6044820152606401610a37565b60005b8251811015612221576000838281518110612525576125256136d6565b6020026020010151905060005b828110156125ad578115806125605750848181518110612554576125546136d6565b60200260200101518214155b61259b5760405162461bcd60e51b815260206004820152600c60248201526b185b1c9958591e481d5cd95960a21b6044820152606401610a37565b806125a5816136ad565b915050612532565b50600081815260066020908152604080832033845290915290205460ff166125d65760006125d8565b805b33600090815260106020908152604080832086845290915290205550806125fe816136ad565b915050612508565b6000826126138584612887565b14949350505050565b6001600160a01b03908116600081815260056020908152604080832054835260049091529020549091161490565b6001600160a01b03811661267057604051622e076360e81b815260040160405180910390fd5b6126798161261c565b1561269757604051630101657360e41b815260040160405180910390fd5b60018054600090815260046020908152604080832080546001600160a01b0319166001600160a01b0387169081179091559354848452600590925280832082905551909291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a460018054906000612712836136ad565b919050555050565b8160085481111561275d5760405162461bcd60e51b815260206004820152600d60248201526c1d5b9adb9bdddb88189bd85c99609a1b6044820152606401610a37565b6127668261261c565b6127a25760405162461bcd60e51b815260206004820152600d60248201526c1b5a5b9d081c995c5d5a5c9959609a1b6044820152606401610a37565b6001600160a01b0382166000908152600f6020908152604080832086845290915290205460ff16156128085760405162461bcd60e51b815260206004820152600f60248201526e185b1c9958591e4818db185a5b5959608a1b6044820152606401610a37565b506001600160a01b03166000908152600f6020908152604080832093835292905220805460ff19166001179055565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600081815b8451811015610d3d5760008582815181106128a9576128a96136d6565b602002602001015190508083116128eb576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250612918565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080612923816136ad565b91505061288c565b82805461293790613672565b90600052602060002090601f016020900481019282612959576000855561299f565b82601f1061297257805160ff191683800117855561299f565b8280016001018555821561299f579182015b8281111561299f578251825591602001919060010190612984565b506129ab9291506129af565b5090565b5b808211156129ab57600081556001016129b0565b80356001600160a01b03811681146129db57600080fd5b919050565b60008083601f8401126129f257600080fd5b5081356001600160401b03811115612a0957600080fd5b6020830191508360208260051b8501011115612a2457600080fd5b9250929050565b600082601f830112612a3c57600080fd5b81356020612a51612a4c836135fc565b6135cc565b82815281810190858301606080860288018501891015612a7057600080fd5b6000805b87811015612acf5782848c031215612a8a578182fd5b612a926135a4565b612a9b85612bac565b8152612aa8888601612bac565b888201526040612ab9818701612bac565b9082015286529486019492820192600101612a74565b50929998505050505050505050565b600082601f830112612aef57600080fd5b81356020612aff612a4c836135fc565b80838252828201915082860187848660051b8901011115612b1f57600080fd5b60005b85811015612b3e57813584529284019290840190600101612b22565b5090979650505050505050565b803580151581146129db57600080fd5b600082601f830112612b6c57600080fd5b8135612b7a612a4c8261361f565b818152846020838601011115612b8f57600080fd5b816020850160208301376000918101602001919091529392505050565b803563ffffffff811681146129db57600080fd5b80356001600160401b03811681146129db57600080fd5b600060208284031215612be957600080fd5b610af4826129c4565b60008060408385031215612c0557600080fd5b612c0e836129c4565b9150612c1c60208401612b4b565b90509250929050565b60008060408385031215612c3857600080fd5b612c41836129c4565b946020939093013593505050565b6000806000806000806000806080898b031215612c6b57600080fd5b88356001600160401b0380821115612c8257600080fd5b612c8e8c838d016129e0565b909a50985060208b0135915080821115612ca757600080fd5b612cb38c838d016129e0565b909850965060408b0135915080821115612ccc57600080fd5b612cd88c838d016129e0565b909650945060608b0135915080821115612cf157600080fd5b50612cfe8b828c016129e0565b999c989b5096995094979396929594505050565b600080600080600060608688031215612d2a57600080fd5b85356001600160401b0380821115612d4157600080fd5b612d4d89838a016129e0565b90975095506020880135915080821115612d6657600080fd5b50612d73888289016129e0565b96999598509660400135949350505050565b600060208284031215612d9757600080fd5b81356001600160401b03811115612dad57600080fd5b612db984828501612ade565b949350505050565b60006020808385031215612dd457600080fd5b82516001600160401b03811115612dea57600080fd5b8301601f81018513612dfb57600080fd5b8051612e09612a4c826135fc565b80828252848201915084840188868560051b8701011115612e2957600080fd5b600094505b83851015612e4c578051835260019490940193918501918501612e2e565b50979650505050505050565b60008060408385031215612e6b57600080fd5b82356001600160401b0380821115612e8257600080fd5b612e8e86838701612ade565b93506020850135915080821115612ea457600080fd5b50612eb185828601612ade565b9150509250929050565b600060208284031215612ecd57600080fd5b610af482612b4b565b600060208284031215612ee857600080fd5b81356001600160e01b031981168114610af457600080fd5b600060208284031215612f1257600080fd5b81356001600160401b03811115612f2857600080fd5b612db984828501612b5b565b600060208284031215612f4657600080fd5b81516001600160401b03811115612f5c57600080fd5b8201601f81018413612f6d57600080fd5b8051612f7b612a4c8261361f565b818152856020838501011115612f9057600080fd5b610dd3826020830160208601613646565b60008060008060808587031215612fb757600080fd5b84356001600160801b0381168114612fce57600080fd5b9350612fdc60208601612bc0565b9250612fea60408601612bc0565b915060608501356001600160401b0381111561300557600080fd5b61301187828801612a2b565b91505092959194509250565b60006020828403121561302f57600080fd5b5035919050565b6000806040838503121561304957600080fd5b82359150612c1c602084016129c4565b60008060006040848603121561306e57600080fd5b8335925060208401356001600160401b0381111561308b57600080fd5b613097868287016129e0565b9497909650939450505050565b600080600080606085870312156130ba57600080fd5b8435935060208501356001600160401b03808211156130d857600080fd5b6130e4888389016129e0565b909550935060408701359150808211156130fd57600080fd5b5061301187828801612b5b565b6000806040838503121561311d57600080fd5b8235915060208301356001600160401b0381111561313a57600080fd5b612eb185828601612ade565b60008060006060848603121561315b57600080fd5b8335925060208401356001600160401b038082111561317957600080fd5b61318587838801612ade565b9350604086013591508082111561319b57600080fd5b506131a886828701612b5b565b9150509250925092565b600080604083850312156131c557600080fd5b50508035926020909101359150565b6000806000606084860312156131e957600080fd5b6131f284612bc0565b925061320060208501612bc0565b915060408401356001600160401b0381111561321b57600080fd5b6131a886828701612a2b565b6000815180845260208085019450848260051b860182860160005b85811015612b3e57838303895261325a838351613309565b98850198925090840190600101613242565b81835260006001600160fb1b0383111561328557600080fd5b8260051b8083602087013760009401602001938452509192915050565b600081518084526020808501945080840160005b838110156132d2578151875295820195908201906001016132b6565b509495945050505050565b600081518084526132f5816020860160208601613646565b601f01601f19169290920160200192915050565b6000608083016001600160801b0383511684526020808401516001600160401b038082168388015260409150808287015116828801525060608086015160808289015284815180875260a08a0191508583019650600092505b8083101561339f578651805163ffffffff908116845287820151811688850152908601511685830152958501956001929092019190830190613362565b5098975050505050505050565b602081526000610af46020830184613227565b6060815260006133d360608301878961326c565b82810360208401526133e681868861326c565b91505060018060a01b03831660408301529695505050505050565b602081526000610af460208301846132a2565b60608152600061342760608301866132a2565b82810360208401526134398186613227565b9050828103604084015261344d8185613309565b9695505050505050565b60608152600061346a60608301866132a2565b828103602084015261347c81866132a2565b91505060018060a01b0383166040830152949350505050565b602081526000610af460208301846132dd565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526010908201526f1b9bdd081a5b881dda1a5d195b1a5cdd60821b604082015260600190565b602081526000610af46020830184613309565b85815260806020820152600061353460808301868861326c565b828103604084015261354681866132dd565b91505082151560608301529695505050505050565b6000808335601e1984360301811261357257600080fd5b8301803591506001600160401b0382111561358c57600080fd5b6020019150600581901b3603821315612a2457600080fd5b604051606081016001600160401b03811182821017156135c6576135c66136ec565b60405290565b604051601f8201601f191681016001600160401b03811182821017156135f4576135f46136ec565b604052919050565b60006001600160401b03821115613615576136156136ec565b5060051b60200190565b60006001600160401b03821115613638576136386136ec565b50601f01601f191660200190565b60005b83811015613661578181015183820152602001613649565b83811115610b9c5750506000910152565b600181811c9082168061368657607f821691505b602082108114156136a757634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156136cf57634e487b7160e01b600052601160045260246000fd5b5060010190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfea2646970667358221220dd00670a3046a5a8fe7b418594206076f714ac2e6a32bbc4f214067f5f83313864736f6c63430008070033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.