ApeChain Collection✓ Verified · exact match
HVMTL Feels HVFEELS
0x91c73715…1b0b758f0x91c737152df59db576fca16a41acadb71b0b758fERC-1155
- Items
- 10
- Holders
- 223
- Volume
- 260.58 APE
- Sales
- 32
- Median sale
- 0.45 APE
- Last sale
- 10 WAPE
Loading contract details…
Loading contract details…
eth_getCode1// SPDX-License-Identifier: UNLICENSED2pragma solidity 0.8.28;3 4import {OwnableRoles} from "solady/auth/OwnableRoles.sol";5import {ERC1155} from "solady/tokens/ERC1155.sol";6import {ERC2981} from "solady/tokens/ERC2981.sol";7import {LibString} from "solady/utils/LibString.sol";8import {LibMap} from "solady/utils/LibMap.sol";9import {ITransferValidator} from "../interfaces/ITransferValidator.sol";10import {ICreatorToken} from "../interfaces/ICreatorToken.sol";11 12contract RedeemableStickers is OwnableRoles, ERC1155, ERC2981, ICreatorToken {13 using LibString for uint256;14 using LibString for string;15 using LibMap for LibMap.Uint16Map;16 17 error ZeroAmount();18 error ArrayLengthZero();19 error TokenDoesNotExist();20 error ArrayLengthMismatch();21 error ZeroRandomnessWeight();22 error StickerPackAlreadyExists();23 error NumDrawsForRandomPackZero();24 error RandomnessWeightsSumNot10000();25 error NumDrawsForRandomPackNotZero();26 error CannotSetAmountsForRandomPack();27 error StickerPackNotEnabled(uint256 packId);28 29 event StickerPackSet(uint256 packId, uint256[] tokenIds, uint256[] amounts, bool enabled);30 event StickerPackEnabled(uint256 packId);31 event StickerPackDisabled(uint256 packId);32 33 struct StickerPack {34 LibMap.Uint16Map tokenIds;35 LibMap.Uint16Map amounts;36 LibMap.Uint16Map randomnessWeights;37 bool isRandom;38 bool enabled;39 uint8 numTokens;40 uint8 numDrawsForRandomPack;41 }42 43 string public name;44 string public symbol;45 mapping(uint256 tokenId => uint256 supply) public totalSupply;46 mapping(uint256 tokenId => string uri) private _tokenURIs;47 mapping(uint256 packId => StickerPack pack) private _stickerPacks;48 49 uint256 public constant ADMIN_ROLE = _ROLE_42;50 uint256 public constant MINTER_ROLE = _ROLE_69;51 ITransferValidator private _transferValidator;52 53 constructor(54 address transferValidator,55 address royaltyRecipient,56 uint96 royaltyNumerator,57 address _owner,58 string memory _name,59 string memory _symbol60 ) {61 _initializeOwner(_owner);62 63 name = _name;64 symbol = _symbol;65 _setDefaultRoyalty(royaltyRecipient, royaltyNumerator);66 67 // grant admin to deployer for initial setup68 _grantRoles(tx.origin, ADMIN_ROLE);69 70 if (transferValidator != address(0)) {71 _transferValidator = ITransferValidator(transferValidator);72 emit TransferValidatorUpdated(address(0), transferValidator);73 }74 }75 76 /**77 * @notice Mints a batch of tokens.78 * @param to The address to mint the tokens to.79 * @param packId The ID of the sticker pack to mint.80 */81 function redeemRedemptionCode(address to, uint64 packId, bytes32 redemptionCode) external onlyRoles(MINTER_ROLE) {82 StickerPack storage pack = _stickerPacks[packId];83 if (!pack.enabled) revert StickerPackNotEnabled(packId);84 85 if (pack.isRandom) {86 uint256[] memory cumulativeWeights = new uint256[](pack.numTokens);87 uint256 total = 0;88 for (uint256 i = 0; i < pack.numTokens; ++i) {89 total += pack.randomnessWeights.get(i);90 cumulativeWeights[i] = total;91 }92 93 for (uint256 i = 0; i < pack.numDrawsForRandomPack; ++i) {94 // this is deterministic. Users can "preview" their packs if they want to but cannot influence the contents.95 uint256 r = uint256(keccak256(abi.encodePacked(i, packId, redemptionCode))) % 10_000;96 uint256 tokenId;97 for (uint256 j = 0; j < pack.numTokens; ++j) {98 if (r < cumulativeWeights[j]) {99 tokenId = uint256(pack.tokenIds.get(j));100 break;101 }102 }103 _mint(to, tokenId, 1, "");104 }105 } else {106 uint256[] memory tokenIds = new uint256[](pack.numTokens);107 uint256[] memory amounts = new uint256[](pack.numTokens);108 109 for (uint256 i = 0; i < pack.numTokens; ++i) {110 tokenIds[i] = uint256(pack.tokenIds.get(i));111 amounts[i] = uint256(pack.amounts.get(i));112 }113 114 _batchMint(to, tokenIds, amounts, "");115 }116 }117 118 /**119 * @notice Sets a sticker pack.120 * @param packId The ID of the sticker pack.121 * @param _tokenIds The IDs of the tokens to mint.122 * @param _amounts The amounts of tokens to mint.123 * @param _randomnessWeights The weights of the tokens to mint.124 * @param enabled The enabled status of the sticker pack.125 * @dev If weights are provided, the pack will be random. Weights must sum to 10_000.126 */127 function setStickerPack(128 uint256 packId,129 uint256[] calldata _tokenIds,130 uint256[] calldata _amounts,131 uint256[] calldata _randomnessWeights,132 bool enabled,133 uint8 numDrawsForRandomPack134 ) external onlyRolesOrOwner(ADMIN_ROLE) {135 if (_tokenIds.length == 0) revert ArrayLengthZero();136 137 bool isRandom = _randomnessWeights.length > 0;138 if (isRandom) {139 if (_tokenIds.length != _randomnessWeights.length) revert ArrayLengthMismatch();140 if (_amounts.length > 0) revert CannotSetAmountsForRandomPack();141 if (numDrawsForRandomPack == 0) revert NumDrawsForRandomPackZero();142 } else {143 if (_tokenIds.length != _amounts.length) revert ArrayLengthMismatch();144 if (numDrawsForRandomPack != 0) revert NumDrawsForRandomPackNotZero();145 }146 147 StickerPack storage pack = _stickerPacks[packId];148 if (pack.numTokens > 0) revert StickerPackAlreadyExists();149 150 uint256 totalRandomnessWeight = 0;151 for (uint256 i = 0; i < _tokenIds.length; ++i) {152 uint256 tokenId = _tokenIds[i];153 if (!_exists(tokenId)) revert TokenDoesNotExist();154 155 pack.tokenIds.set(i, uint16(tokenId));156 157 if (isRandom) {158 if (_randomnessWeights[i] == 0) revert ZeroRandomnessWeight();159 160 totalRandomnessWeight += _randomnessWeights[i];161 pack.randomnessWeights.set(i, uint16(_randomnessWeights[i]));162 } else {163 if (_amounts[i] == 0) revert ZeroAmount();164 165 pack.amounts.set(i, uint16(_amounts[i]));166 }167 }168 169 if (isRandom && totalRandomnessWeight != 10_000) revert RandomnessWeightsSumNot10000();170 171 pack.numTokens = uint8(_tokenIds.length);172 pack.enabled = enabled;173 pack.isRandom = isRandom;174 pack.numDrawsForRandomPack = numDrawsForRandomPack;175 176 emit StickerPackSet(packId, _tokenIds, _amounts, enabled);177 }178 179 /**180 * @notice Toggles the enabled status of a sticker pack.181 * @param packId The ID of the sticker pack.182 */183 function toggleStickerPack(uint256 packId) external onlyRolesOrOwner(ADMIN_ROLE) {184 StickerPack storage pack = _stickerPacks[packId];185 pack.enabled = !pack.enabled;186 187 if (pack.enabled) {188 emit StickerPackEnabled(packId);189 } else {190 emit StickerPackDisabled(packId);191 }192 }193 194 /**195 * @dev Sets the royalty information for the token collection.196 * @param receiver The address of the royalty recipient.197 * @param feeNumerator The royalty fee numerator.198 */199 function setRoyaltyInfo(address receiver, uint96 feeNumerator) external onlyRolesOrOwner(ADMIN_ROLE) {200 _setDefaultRoyalty(receiver, feeNumerator);201 }202 203 /**204 * @notice Sets the URIs for specific tokens.205 * @param tokenIds The IDs of the tokens to set URIs for.206 * @param uris The URIs to set for each token.207 */208 function setTokenURIs(uint256[] calldata tokenIds, string[] calldata uris) external onlyRolesOrOwner(ADMIN_ROLE) {209 if (tokenIds.length != uris.length) revert ArrayLengthMismatch();210 211 for (uint256 i = 0; i < tokenIds.length; ++i) {212 uint256 tokenId = tokenIds[i];213 string memory _uri = uris[i];214 215 _tokenURIs[tokenId] = _uri;216 emit URI(_uri, tokenId);217 }218 }219 220 /**221 * @notice Sets the transfer validator for the collection.222 */223 function setTransferValidator(address transferValidator) external onlyRolesOrOwner(ADMIN_ROLE) {224 address oldValidator = address(_transferValidator);225 _transferValidator = ITransferValidator(transferValidator);226 emit TransferValidatorUpdated(oldValidator, transferValidator);227 }228 229 /**230 * @notice Returns the transfer validator for the collection.231 */232 function getTransferValidator() external view returns (address validator) {233 return address(_transferValidator);234 }235 236 /**237 * @notice Returns the function selector for the transfer validator's validation function to be called238 * @notice for transaction simulation.239 */240 function getTransferValidationFunction() external pure returns (bytes4 functionSignature, bool isViewFunction) {241 functionSignature = bytes4(keccak256("validateTransfer(address,address,address,uint256,uint256)"));242 isViewFunction = false;243 }244 245 /**246 * @notice Returns the URI for a token.247 * @param tokenId The ID of the token.248 */249 function uri(uint256 tokenId) public view virtual override returns (string memory) {250 string memory _uri = _tokenURIs[tokenId];251 252 if (bytes(_uri).length == 0) revert TokenDoesNotExist();253 return _uri;254 }255 256 /**257 * @notice Returns true if the interface is supported.258 */259 function supportsInterface(bytes4 interfaceId) public view virtual override(ERC1155, ERC2981) returns (bool) {260 return ERC1155.supportsInterface(interfaceId) || ERC2981.supportsInterface(interfaceId)261 || interfaceId == type(ICreatorToken).interfaceId || super.supportsInterface(interfaceId);262 }263 264 /**265 * @notice Returns true if the token exists.266 * @param tokenId The ID of the token.267 */268 function _exists(uint256 tokenId) internal view returns (bool) {269 return bytes(_tokenURIs[tokenId]).length > 0;270 }271 272 /**273 * @notice Returns true if the token transfer should be validated.274 */275 function _useBeforeTokenTransfer() internal view override returns (bool) {276 return address(_transferValidator) != address(0);277 }278 279 /// @dev Hook that is called before any token transfer.280 /// This includes minting and burning, as well as batched variants.281 ///282 /// The same hook is called on both single and batched variants.283 /// For single transfers, the length of the `id` and `amount` arrays are 1.284 function _beforeTokenTransfer(285 address from,286 address to,287 uint256[] memory ids,288 uint256[] memory amounts,289 bytes memory290 ) internal override {291 if (from != address(0) && to != address(0)) {292 for (uint256 i = 0; i < ids.length; ++i) {293 _transferValidator.validateTransfer(msg.sender, from, to, ids[i], amounts[i]);294 }295 }296 }297}298 [
{
"type": "constructor",
"inputs": [
{
"name": "transferValidator",
"type": "address",
"internalType": "address"
},
{
"name": "royaltyRecipient",
"type": "address",
"internalType": "address"
},
{
"name": "royaltyNumerator",
"type": "uint96",
"internalType": "uint96"
},
{
"name": "_owner",
"type": "address",
"internalType": "address"
},
{
"name": "_name",
"type": "string",
"internalType": "string"
},
{
"name": "_symbol",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "nonpayable"
},
{
"name": "AccountBalanceOverflow",
"type": "error",
"inputs": []
},
{
"name": "AlreadyInitialized",
"type": "error",
"inputs": []
},
{
"name": "ArrayLengthMismatch",
"type": "error",
"inputs": []
},
{
"name": "ArrayLengthZero",
"type": "error",
"inputs": []
},
{
"name": "ArrayLengthsMismatch",
"type": "error",
"inputs": []
},
{
"name": "CannotSetAmountsForRandomPack",
"type": "error",
"inputs": []
},
{
"name": "InsufficientBalance",
"type": "error",
"inputs": []
},
{
"name": "NewOwnerIsZeroAddress",
"type": "error",
"inputs": []
},
{
"name": "NoHandoverRequest",
"type": "error",
"inputs": []
},
{
"name": "NotOwnerNorApproved",
"type": "error",
"inputs": []
},
{
"name": "NumDrawsForRandomPackNotZero",
"type": "error",
"inputs": []
},
{
"name": "NumDrawsForRandomPackZero",
"type": "error",
"inputs": []
},
{
"name": "RandomnessWeightsSumNot10000",
"type": "error",
"inputs": []
},
{
"name": "RoyaltyOverflow",
"type": "error",
"inputs": []
},
{
"name": "RoyaltyReceiverIsZeroAddress",
"type": "error",
"inputs": []
},
{
"name": "StickerPackAlreadyExists",
"type": "error",
"inputs": []
},
{
"name": "StickerPackNotEnabled",
"type": "error",
"inputs": [
{
"name": "packId",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "TokenDoesNotExist",
"type": "error",
"inputs": []
},
{
"name": "TransferToNonERC1155ReceiverImplementer",
"type": "error",
"inputs": []
},
{
"name": "TransferToZeroAddress",
"type": "error",
"inputs": []
},
{
"name": "Unauthorized",
"type": "error",
"inputs": []
},
{
"name": "ZeroAmount",
"type": "error",
"inputs": []
},
{
"name": "ZeroRandomnessWeight",
"type": "error",
"inputs": []
},
{
"name": "ApprovalForAll",
"type": "event",
"inputs": [
{
"name": "owner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "operator",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "isApproved",
"type": "bool",
"indexed": false,
"internalType": "bool"
}
],
"anonymous": false
},
{
"name": "OwnershipHandoverCanceled",
"type": "event",
"inputs": [
{
"name": "pendingOwner",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "OwnershipHandoverRequested",
"type": "event",
"inputs": [
{
"name": "pendingOwner",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "OwnershipTransferred",
"type": "event",
"inputs": [
{
"name": "oldOwner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "newOwner",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "RolesUpdated",
"type": "event",
"inputs": [
{
"name": "user",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "roles",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "StickerPackDisabled",
"type": "event",
"inputs": [
{
"name": "packId",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "StickerPackEnabled",
"type": "event",
"inputs": [
{
"name": "packId",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "StickerPackSet",
"type": "event",
"inputs": [
{
"name": "packId",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "tokenIds",
"type": "uint256[]",
"indexed": false,
"internalType": "uint256[]"
},
{
"name": "amounts",
"type": "uint256[]",
"indexed": false,
"internalType": "uint256[]"
},
{
"name": "enabled",
"type": "bool",
"indexed": false,
"internalType": "bool"
}
],
"anonymous": false
},
{
"name": "TransferBatch",
"type": "event",
"inputs": [
{
"name": "operator",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "from",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "to",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "ids",
"type": "uint256[]",
"indexed": false,
"internalType": "uint256[]"
},
{
"name": "amounts",
"type": "uint256[]",
"indexed": false,
"internalType": "uint256[]"
}
],
"anonymous": false
},
{
"name": "TransferSingle",
"type": "event",
"inputs": [
{
"name": "operator",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "from",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "to",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "id",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "TransferValidatorUpdated",
"type": "event",
"inputs": [
{
"name": "oldValidator",
"type": "address",
"indexed": false,
"internalType": "address"
},
{
"name": "newValidator",
"type": "address",
"indexed": false,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "URI",
"type": "event",
"inputs": [
{
"name": "value",
"type": "string",
"indexed": false,
"internalType": "string"
},
{
"name": "id",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "ADMIN_ROLE",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "MINTER_ROLE",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "balanceOf",
"type": "function",
"inputs": [
{
"name": "owner",
"type": "address",
"internalType": "address"
},
{
"name": "id",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "result",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "balanceOfBatch",
"type": "function",
"inputs": [
{
"name": "owners",
"type": "address[]",
"internalType": "address[]"
},
{
"name": "ids",
"type": "uint256[]",
"internalType": "uint256[]"
}
],
"outputs": [
{
"name": "balances",
"type": "uint256[]",
"internalType": "uint256[]"
}
],
"stateMutability": "view"
},
{
"name": "cancelOwnershipHandover",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "payable"
},
{
"name": "completeOwnershipHandover",
"type": "function",
"inputs": [
{
"name": "pendingOwner",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "payable"
},
{
"name": "getTransferValidationFunction",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "functionSignature",
"type": "bytes4",
"internalType": "bytes4"
},
{
"name": "isViewFunction",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "pure"
},
{
"name": "getTransferValidator",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "validator",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "grantRoles",
"type": "function",
"inputs": [
{
"name": "user",
"type": "address",
"internalType": "address"
},
{
"name": "roles",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "payable"
},
{
"name": "hasAllRoles",
"type": "function",
"inputs": [
{
"name": "user",
"type": "address",
"internalType": "address"
},
{
"name": "roles",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "hasAnyRole",
"type": "function",
"inputs": [
{
"name": "user",
"type": "address",
"internalType": "address"
},
{
"name": "roles",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "isApprovedForAll",
"type": "function",
"inputs": [
{
"name": "owner",
"type": "address",
"internalType": "address"
},
{
"name": "operator",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "result",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "name",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "owner",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "result",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "ownershipHandoverExpiresAt",
"type": "function",
"inputs": [
{
"name": "pendingOwner",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "result",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "redeemRedemptionCode",
"type": "function",
"inputs": [
{
"name": "to",
"type": "address",
"internalType": "address"
},
{
"name": "packId",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "redemptionCode",
"type": "bytes32",
"internalType": "bytes32"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "renounceOwnership",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "payable"
},
{
"name": "renounceRoles",
"type": "function",
"inputs": [
{
"name": "roles",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "payable"
},
{
"name": "requestOwnershipHandover",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "payable"
},
{
"name": "revokeRoles",
"type": "function",
"inputs": [
{
"name": "user",
"type": "address",
"internalType": "address"
},
{
"name": "roles",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "payable"
},
{
"name": "rolesOf",
"type": "function",
"inputs": [
{
"name": "user",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "roles",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "royaltyInfo",
"type": "function",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "salePrice",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "receiver",
"type": "address",
"internalType": "address"
},
{
"name": "royaltyAmount",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "safeBatchTransferFrom",
"type": "function",
"inputs": [
{
"name": "from",
"type": "address",
"internalType": "address"
},
{
"name": "to",
"type": "address",
"internalType": "address"
},
{
"name": "ids",
"type": "uint256[]",
"internalType": "uint256[]"
},
{
"name": "amounts",
"type": "uint256[]",
"internalType": "uint256[]"
},
{
"name": "data",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "safeTransferFrom",
"type": "function",
"inputs": [
{
"name": "from",
"type": "address",
"internalType": "address"
},
{
"name": "to",
"type": "address",
"internalType": "address"
},
{
"name": "id",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "data",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setApprovalForAll",
"type": "function",
"inputs": [
{
"name": "operator",
"type": "address",
"internalType": "address"
},
{
"name": "isApproved",
"type": "bool",
"internalType": "bool"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setRoyaltyInfo",
"type": "function",
"inputs": [
{
"name": "receiver",
"type": "address",
"internalType": "address"
},
{
"name": "feeNumerator",
"type": "uint96",
"internalType": "uint96"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setStickerPack",
"type": "function",
"inputs": [
{
"name": "packId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "_tokenIds",
"type": "uint256[]",
"internalType": "uint256[]"
},
{
"name": "_amounts",
"type": "uint256[]",
"internalType": "uint256[]"
},
{
"name": "_randomnessWeights",
"type": "uint256[]",
"internalType": "uint256[]"
},
{
"name": "enabled",
"type": "bool",
"internalType": "bool"
},
{
"name": "numDrawsForRandomPack",
"type": "uint8",
"internalType": "uint8"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setTokenURIs",
"type": "function",
"inputs": [
{
"name": "tokenIds",
"type": "uint256[]",
"internalType": "uint256[]"
},
{
"name": "uris",
"type": "string[]",
"internalType": "string[]"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setTransferValidator",
"type": "function",
"inputs": [
{
"name": "transferValidator",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "supportsInterface",
"type": "function",
"inputs": [
{
"name": "interfaceId",
"type": "bytes4",
"internalType": "bytes4"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "symbol",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "toggleStickerPack",
"type": "function",
"inputs": [
{
"name": "packId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "totalSupply",
"type": "function",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "supply",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "transferOwnership",
"type": "function",
"inputs": [
{
"name": "newOwner",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "payable"
},
{
"name": "uri",
"type": "function",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
}
]000000000000000000000000721c008fdff27bf06e7e123956e2fe03b63342e3000000000000000000000000f5d2fe3edbc2239d446f620236d50901b12631fd00000000000000000000000000000000000000000000000000000000000001f4000000000000000000000000e1a8d0f2fc32bc91183db2d4e127691c24d0405b00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000b48564d544c204665656c73000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000748564645454c53000000000000000000000000000000000000000000000000000x608060405234610470576124fe8038038061001981610474565b928339810160c0828203126104705761003182610499565b9061003e60208401610499565b60408401516001600160601b03811692908390036104705761006260608601610499565b60808601519095906001600160401b03811161047057826100849183016104ad565b60a08201519092906001600160401b038111610470576100a492016104ad565b6001600160a01b03909516638b78c6d8198190555f7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a38051906001600160401b038211610377575f5490600182811c92168015610466575b60208310146103595781601f8493116103f9575b50602090601f8311600114610396575f9261038b575b50508160011b915f199060031b1c1916175f555b83516001600160401b03811161037757600154600181811c9116801561036d575b602082101461035957601f81116102f6575b50602094601f8211600114610293579481929394955f92610288575b50508160011b915f199060031b1c1916176001555b612710821161027b5760601b801561026e571768aa4ec00224afccfdb755638b78c6d8600c52325f526020600c2065040000000000815417809155600c5160601c7f715ad5ce61fc9595c7b415289d59cf203f23a94fa06f04af7e489a0a76e1fe265f80a36001600160a01b031680610224575b604051611fff90816104ff8239f35b600580546001600160a01b03191682179055604080515f815260208101929092527fcc5dc080ff977b3c3a211fa63ab74f90f658f5ba9d3236e92c8f59570f442aac91a15f610215565b63b4457eaa5f526004601cfd5b63350a88b35f526004601cfd5b015190505f8061018c565b601f1982169560015f52805f20915f5b8881106102de575083600195969798106102c6575b505050811b016001556101a1565b01515f1960f88460031b161c191690555f80806102b8565b919260206001819286850151815501940192016102a3565b60015f527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6601f830160051c8101916020841061034f575b601f0160051c01905b8181106103445750610170565b5f8155600101610337565b909150819061032e565b634e487b7160e01b5f52602260045260245ffd5b90607f169061015e565b634e487b7160e01b5f52604160045260245ffd5b015190505f80610129565b5f8080528281209350601f198516905b8181106103e157509084600195949392106103c9575b505050811b015f5561013d565b01515f1960f88460031b161c191690555f80806103bc565b929360206001819287860151815501950193016103a6565b5f80529091507f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563601f840160051c8101916020851061045c575b90601f859493920160051c01905b81811061044e5750610113565b5f8155849350600101610441565b9091508190610433565b91607f16916100ff565b5f80fd5b6040519190601f01601f191682016001600160401b0381118382101761037757604052565b51906001600160a01b038216820361047057565b81601f82011215610470578051906001600160401b038211610377576104dc601f8301601f1916602001610474565b928284526020838301011161047057815f9260208093018386015e830101529056fe6080806040526004361015610012575f80fd5b5f3560e01c908162fdd58e14611ba15750806301ffc9a714611b0857806302fa7c4714611a9357806306fdde0314611a77578063098144d414611a4f5780630d705df614611a295780630e89341c146119eb578063183a4f6e146119d35780631c10893f146119735780631cd64df41461193a57806325692962146118f15780632a55205a146118725780632de94807146118405780632eb2c2d6146114fa5780634a4ee7b1146114d25780634e1273f41461142b5780634f70ecb3146110b7578063514e62fc1461107f57806354d1f13d1461103b578063715018a614610ff257806375b238fc14610fd25780638da5cb5b14610fa657806395d89b4114610ed8578063a22cb46514610e66578063a9fc664e14610df5578063b6e6e23814610d47578063bd85b03914610d1d578063d539139314610cff578063db3e4c8414610ad4578063e1bf778014610588578063e985e9c514610543578063f04e283e146104f6578063f242432a1461020f578063f2fde38b146101d25763fee81cf41461019c575f80fd5b346101ce5760203660031901126101ce576101b5611bd9565b63389a75e1600c525f52602080600c2054604051908152f35b5f80fd5b60203660031901126101ce576101e6611bd9565b6101ee611f38565b8060601b156102025761020090611f47565b005b637448fbae5f526004601cfd5b346101ce5760a03660031901126101ce57610228611bd9565b610230611bef565b9060443591606435906084356001600160401b0381116101ce57610258903690600401611d58565b600554919490916001600160a01b03166103b7575b60601b679a31110384e0b0c9179160601b679a31110384e0b0c917918060205260601c928260601c9283156103aa57843303610390575b865f5260405f20805480841161038357839003905560205260405f208054908282019182106103765755806020528284337fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6260405fa4823b61030257005b602094829160405197889663f23a6e618852338989015260408801526060870152608086015260a0808601528160c086015260e085013760c401905f601c8401915af115610368575b51630dc5919f60e01b0161035b57005b639c05499b5f526004601cfd5b3d1561034b573d5f823e3d90fd5b6301336cea5f526004601cfd5b63f4d678b85f526004601cfd5b335f526034600c20546102a457634b6e7f185f526004601cfd5b63ea553b345f526004601cfd5b6103d286906040519160408301604052600183526020830152565b6103ed85906040519160408301604052600183526020830152565b906103f9368589611e38565b506001600160a01b03831690811515806104e4575b61041b575b50505061026d565b9197929690956001600160a01b038616959294919290915f5b86518110156104d1576005548b91906001600160a01b03166104618261045a818c611f04565b5194611f04565b5190803b156101ce5760a48c5f8d9381956040519889968795631854b24160e01b875233600488015260248701526044860152606485015260848401525af19182156104c6576001926104b6575b5001610434565b5f6104c091611c3d565b8c6104af565b6040513d5f823e3d90fd5b5094509450945094909550868080610413565b506001600160a01b038616151561040e565b60203660031901126101ce5761050a611bd9565b610512611f38565b63389a75e1600c52805f526020600c209081544211610536575f6102009255611f47565b636f5e88185f526004601cfd5b346101ce5760403660031901126101ce5761055c611bd9565b610564611bef565b90679a31110384e0b0c96020526014525f5260206034600c20546040519015158152f35b346101ce5760603660031901126101ce576105a1611bd9565b602435906001600160401b0382168083036101ce57604435638b78c6d8600c52335f52600160451b6020600c20541615610ac757815f52600460205260405f2092600384019283549060ff8260081c1615610ab5575060ff811615610887575060ff8395935460101c169161061583611ed2565b925f60028701815b8383106108395750505050606082901b15946020946001600160a01b0384169260c09190911b6001600160c01b03191691905f5b895460ff8160181c16821015610200576127106040518a81019084825287604082015285604882015260488152610689606882611c3d565b5190205f9260101c60ff16919006825b8281106107eb575b505050604051906106b28a83611c3d565b5f82526005548b906001600160a01b03166107b6575b6103aa57679a31110384e0b0c98a5287601452805f5260405f2090815460018101908110610376578b925560018252875f337fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604083a4883b610731575b505050600101610651565b60405192839163f23a6e61835233848401525f604084015260608301526001608083015260a08083015280518091818060c08601526107a2575b505060c401601c82015f8b5af115610794575b51630dc5919f60e01b0161035b578a8881610726565b3d1561077e573d5f823e3d90fd5b818560e08601920160045afa50808f61076b565b506107d281906040519160408301604052600183526020830152565b508a60018b6040516040810160405282815201526106c8565b6107f5818c611f04565b51821061080457600101610699565b905061ffff92506108309150859061ffff918160041c5f5260205260f060405f20549160041b161c1690565b168b80806106a1565b61087060019161ffff61086986869e9c9e9061ffff918160041c5f5260205260f060405f20549160041b161c1690565b1690611e8d565b928361087c828a611f04565b52019198969861061d565b915092935060ff915060101c1661089d81611ed2565b906108a781611ed2565b9360018101905f5b838110610a4657505050506020916040516108ca8482611c3d565b5f81528451835103610a39578160601b80156103aa57679a31110384e0b0c9178452825160051b805b610a14575060405160408152835160051b850160408201818660045afa503d604001858201525f6040823d8101895160051b8901838201818c60045afa503d010301917f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb60018060a01b038616933392a4813b61096c57005b60405194859363bc197c81855233868601525f604086015260a06060860152805160051b8601908160c087019160045afa5060a03d80820160808701523d860192805160051b8801908160c086019160045afa503d010160a08501523d019080518501908160c084019160045afa508260c0601b19923d01010301905f601c8401915af115610a06575b516343e6837f60e01b0161035b57005b3d156109f6573d5f823e3d90fd5b80860151818501515f5260405f2080549182019182106103765755601f1901806108f3565b633b800a465f526004601cfd5b8061ffff610a70600193859061ffff918160041c5f5260205260f060405f20549160041b161c1690565b16610a7b8288611f04565b5261ffff610aa382869061ffff918160041c5f5260205260f060405f20549160041b161c1690565b16610aae828a611f04565b52016108af565b63eb68947360e01b5f5260045260245ffd5b6382b429005f526004601cfd5b346101ce57610ae236611d85565b9290610aec611f18565b838303610cf057909136829003601e190191905f5b818110610b0a57005b610b15818387611e7d565b3586821015610cdc578160051b840135858112156101ce5784018035906001600160401b0382116101ce5760200181360381136101ce57610b57913691611e38565b815f52600360205260405f2081516001600160401b038111610cc857610b7d8254611c05565b601f8111610c83575b506020601f8211600114610bfa57927f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b9282610be69360019897965f91610bef575b505f19600383901b1c191690881b1790555b60405191829182611cfe565b0390a201610b01565b90508301518e610bc8565b601f19821690835f52805f20915f5b818110610c6b5750836001989796937f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b9693610be6968b9410610c53575b5050811b019055610bda565b8501515f1960f88460031b161c191690558e80610c47565b9192602060018192868a015181550194019201610c09565b825f5260205f20601f830160051c81019160208410610cbe575b601f0160051c01905b818110610cb35750610b86565b5f8155600101610ca6565b9091508190610c9d565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b63512509d360e11b5f5260045ffd5b346101ce575f3660031901126101ce576020604051600160451b8152f35b346101ce5760203660031901126101ce576004355f526002602052602060405f2054604051908152f35b346101ce5760203660031901126101ce57600435610d63611f18565b5f818152600460205260409020600301805461ff00198116600891821c60ff9081161590921b61ff0016178255905460081c1615610dc85760207f1558c90525729bae8ce21c1d66b97586680012c4e7e930caab20c9c74eba499991604051908152a1005b60207fc65f7a6deef4bf9a7575eef67f9e2a5fdefd81b14ad8074701c6dc59fa3483cd91604051908152a1005b346101ce5760203660031901126101ce577fcc5dc080ff977b3c3a211fa63ab74f90f658f5ba9d3236e92c8f59570f442aac6040610e31611bd9565b610e39611f18565b600580546001600160a01b039283166001600160a01b0319821681179092558351921682526020820152a1005b346101ce5760403660031901126101ce57610e7f611bd9565b6024358015158091036101ce57679a31110384e0b0c960205233601452815f52806034600c20555f5260018060a01b0316337f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160205fa3005b346101ce575f3660031901126101ce576040515f600154610ef881611c05565b8084529060018116908115610f825750600114610f24575b610f2083610bda81850382611c3d565b0390f35b60015f9081527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6939250905b808210610f6857509091508101602001610bda610f10565b919260018160209254838588010152019101909291610f50565b60ff191660208086019190915291151560051b84019091019150610bda9050610f10565b346101ce575f3660031901126101ce57638b78c6d819546040516001600160a01b039091168152602090f35b346101ce575f3660031901126101ce576020604051650400000000008152f35b5f3660031901126101ce57611005611f38565b5f638b78c6d819547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35f638b78c6d81955005b5f3660031901126101ce5763389a75e1600c52335f525f6020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c925f80a2005b346101ce5760403660031901126101ce57611098611bd9565b638b78c6d8600c525f52602060243581600c2054161515604051908152f35b346101ce5760c03660031901126101ce576004356024356001600160401b0381116101ce576110ea903690600401611d28565b90916044356001600160401b0381116101ce5761110b903690600401611d28565b93906064356001600160401b0381116101ce5761112c903690600401611d28565b919095608435801515948582036101ce5760a4359460ff8616998a87036101ce57611155611f18565b891561141c57811580159b9061140157828b03610cf057856113f257156113e3575b885f52600460205260405f2090600382019260ff845460101c166113d4578c92918c915f935f935b80851061126f57505050505081611262575b5061125357805462ffff00191660108a901b62ff0000161792151560081b61ff00169290921782557f3a0bc2b9b828fcbaad681155e2180ea96dbcf774129bdef0c5deb7fad73c33ac986112489561123a93919060ff63ff00000084549260181b1692169063ff0000ff1916171790556040519788978852608060208901526080880191611eae565b918583036040870152611eae565b9060608301520390a1005b635b2708d560e11b5f5260045ffd5b612710915014158b6111b1565b84965093611281919395929489611e7d565b35805f52600360205261129760405f2054611c05565b156113c5578f9061ffff6112d1911687859190916020528160041c5f5260f060405f209260041b1682549182821c1861ffff16901b189055565b1561135c576112e1858486611e7d565b351561134d576112ff6001916112f8878688611e7d565b3590611e8d565b9461134161ffff611311838789611e7d565b351682600286019190916020528160041c5f5260f060405f209260041b1682549182821c1861ffff16901b189055565b01918e9493918e61119f565b630496dde960e11b5f5260045ffd5b93611368818a8c611e7d565b35156113b657806113b161ffff6113826001948d8f611e7d565b3516828486019190916020528160041c5f5260f060405f209260041b1682549182821c1861ffff16901b189055565b611341565b631f2a200560e01b5f5260045ffd5b63677510db60e11b5f5260045ffd5b63941a624d60e01b5f5260045ffd5b6347cc84e160e01b5f5260045ffd5b635fa64a3960e11b5f5260045ffd5b858b03610cf057156111775763544f8eaf60e11b5f5260045ffd5b63e806f59d60e01b5f5260045ffd5b346101ce5761143936611d85565b92918303610a39576040519280845260051b806020858201016040525b61149f57836040518091602082016020835281518091526020604084019201905f5b818110611486575050500390f35b8251845285945060209384019390920191600101611478565b601f1981840181013560601b679a31110384e0b0c9176020528282018101355f9081526040902054858301520180611456565b60403660031901126101ce576102006114e9611bd9565b6114f1611f38565b60243590611f84565b346101ce5760a03660031901126101ce57611513611bd9565b61151b611bef565b6044356001600160401b0381116101ce5761153a903690600401611d28565b9190926064356001600160401b0381116101ce5761155c903690600401611d28565b9190926084356001600160401b0381116101ce5761157e903690600401611d58565b60055491949093916001600160a01b0316611733575b8603610a395760601b679a31110384e0b0c9179060601b679a31110384e0b0c91792816020528160601c948460601c9283156103aa57863303611719575b8760051b958680975b6116cd57505050604051946040865287604087015280896060880137806060016020870152808260808289018b606082015201378387828001977f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb339160808b0190a4833b61164657005b602097816101209387965f52816040519c8d9b63bc197c818d528c8e3391015260408d015260a060608d01528460c08d015260e08c01378160c00160808b0152818a019260e084015261010083013760e0870160a0890152018361010082015201370161010401601c604051015f80515af115610a0657516343e6837f60e01b0161035b57005b80601f190190601f1981860101359084602052601f19908d0101355f5260405f2080548083116103835782900390558260205260405f20908154908101908110610376578291556115db565b335f526034600c20546115d257634b6e7f185f526004601cfd5b61173e36888a611dec565b611749368389611dec565b90611755368789611e38565b506001600160a01b038416908115158061182e575b611777575b505050611594565b959097929893969199945f9760018060a01b038216985b8851811015611819576005548d91906001600160a01b03166117b48261045a818e611f04565b5190803b156101ce5760a48e5f8f9381956040519889968795631854b24160e01b875233600488015260248701526044860152606485015260848401525af19182156104c657600192611809575b500161178e565b5f61181391611c3d565b8e611802565b5094999398509499509450945088808061176f565b506001600160a01b038616151561176a565b346101ce5760203660031901126101ce57611859611bd9565b638b78c6d8600c525f52602080600c2054604051908152f35b346101ce5760403660031901126101ce5760406024356004355f5268aa4ec00224afccfdb7602052815f2054908160601c9182156118d9575b90612710918360601b1890815f1904811182023d3d3e84516001600160a01b03909416845202046020820152f35b5068aa4ec00224afccfdb754606081901c92506118ab565b5f3660031901126101ce5763389a75e1600c52335f526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d5f80a2005b346101ce5760403660031901126101ce576020611955611bd9565b60243590638b78c6d8600c525f528082600c20541614604051908152f35b60403660031901126101ce57611987611bd9565b61198f611f38565b638b78c6d8600c525f526020600c20602435815417809155600c5160601c7f715ad5ce61fc9595c7b415289d59cf203f23a94fa06f04af7e489a0a76e1fe265f80a3005b60203660031901126101ce5761020060043533611f84565b346101ce5760203660031901126101ce576004355f526003602052611a1260405f20611c5e565b8051156113c557610f209060405191829182611cfe565b346101ce575f3660031901126101ce5760408051631854b24160e01b81525f6020820152f35b346101ce575f3660031901126101ce576005546040516001600160a01b039091168152602090f35b346101ce575f3660031901126101ce57610f20610bda5f611c5e565b346101ce5760403660031901126101ce57611aac611bd9565b602435906bffffffffffffffffffffffff82168092036101ce57611ace611f18565b6127108211611afb5760601b8015611aee571768aa4ec00224afccfdb755005b63b4457eaa5f526004601cfd5b63350a88b35f526004601cfd5b346101ce5760203660031901126101ce576004356001600160e01b031981168082036101ce5760209160e01c6301ffc9a7811490630e89341c811463d9b67a268214831717928315611b91575b8315611b80575b508215611b70575b50506040519015158152f35b632a55205a141790508280611b64565b632b435fdb60e21b14925084611b5c565b632a55205a821483179350611b55565b346101ce5760403660031901126101ce57602090611bbd611bd9565b679a31110384e0b0c983526014526024355f5260405f20548152f35b600435906001600160a01b03821682036101ce57565b602435906001600160a01b03821682036101ce57565b90600182811c92168015611c33575b6020831014611c1f57565b634e487b7160e01b5f52602260045260245ffd5b91607f1691611c14565b90601f801991011681019081106001600160401b03821117610cc857604052565b9060405191825f825492611c7184611c05565b8084529360018116908115611cdc5750600114611c98575b50611c9692500383611c3d565b565b90505f9291925260205f20905f915b818310611cc0575050906020611c96928201015f611c89565b6020919350806001915483858901015201910190918492611ca7565b905060209250611c9694915060ff191682840152151560051b8201015f611c89565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b9181601f840112156101ce578235916001600160401b0383116101ce576020808501948460051b0101116101ce57565b9181601f840112156101ce578235916001600160401b0383116101ce57602083818601950101116101ce57565b60406003198201126101ce576004356001600160401b0381116101ce5781611daf91600401611d28565b92909291602435906001600160401b0382116101ce57611dd191600401611d28565b9091565b6001600160401b038111610cc85760051b60200190565b929190611df881611dd5565b93611e066040519586611c3d565b602085838152019160051b81019283116101ce57905b828210611e2857505050565b8135815260209182019101611e1c565b9291926001600160401b038211610cc85760405191611e61601f8201601f191660200184611c3d565b8294818452818301116101ce578281602093845f960137010152565b9190811015610cdc5760051b0190565b91908201809211611e9a57565b634e487b7160e01b5f52601160045260245ffd5b81835290916001600160fb1b0383116101ce5760209260051b809284830137010190565b90611edc82611dd5565b611ee96040519182611c3d565b8281528092611efa601f1991611dd5565b0190602036910137565b8051821015610cdc5760209160051b010190565b638b78c6d8600c52335f52650400000000006020600c20541615611f3857565b638b78c6d819543303610ac757565b60018060a01b031680638b78c6d819547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3638b78c6d81955565b638b78c6d8600c525f526020600c2090815490811618809155600c5160601c7f715ad5ce61fc9595c7b415289d59cf203f23a94fa06f04af7e489a0a76e1fe265f80a356fea2646970667358221220a36a82fb1fd75adb66b31287a7b868d3d33b200fb7582b47df0ead546435ec9664736f6c634300081c0033
0x6080806040526004361015610012575f80fd5b5f3560e01c908162fdd58e14611ba15750806301ffc9a714611b0857806302fa7c4714611a9357806306fdde0314611a77578063098144d414611a4f5780630d705df614611a295780630e89341c146119eb578063183a4f6e146119d35780631c10893f146119735780631cd64df41461193a57806325692962146118f15780632a55205a146118725780632de94807146118405780632eb2c2d6146114fa5780634a4ee7b1146114d25780634e1273f41461142b5780634f70ecb3146110b7578063514e62fc1461107f57806354d1f13d1461103b578063715018a614610ff257806375b238fc14610fd25780638da5cb5b14610fa657806395d89b4114610ed8578063a22cb46514610e66578063a9fc664e14610df5578063b6e6e23814610d47578063bd85b03914610d1d578063d539139314610cff578063db3e4c8414610ad4578063e1bf778014610588578063e985e9c514610543578063f04e283e146104f6578063f242432a1461020f578063f2fde38b146101d25763fee81cf41461019c575f80fd5b346101ce5760203660031901126101ce576101b5611bd9565b63389a75e1600c525f52602080600c2054604051908152f35b5f80fd5b60203660031901126101ce576101e6611bd9565b6101ee611f38565b8060601b156102025761020090611f47565b005b637448fbae5f526004601cfd5b346101ce5760a03660031901126101ce57610228611bd9565b610230611bef565b9060443591606435906084356001600160401b0381116101ce57610258903690600401611d58565b600554919490916001600160a01b03166103b7575b60601b679a31110384e0b0c9179160601b679a31110384e0b0c917918060205260601c928260601c9283156103aa57843303610390575b865f5260405f20805480841161038357839003905560205260405f208054908282019182106103765755806020528284337fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6260405fa4823b61030257005b602094829160405197889663f23a6e618852338989015260408801526060870152608086015260a0808601528160c086015260e085013760c401905f601c8401915af115610368575b51630dc5919f60e01b0161035b57005b639c05499b5f526004601cfd5b3d1561034b573d5f823e3d90fd5b6301336cea5f526004601cfd5b63f4d678b85f526004601cfd5b335f526034600c20546102a457634b6e7f185f526004601cfd5b63ea553b345f526004601cfd5b6103d286906040519160408301604052600183526020830152565b6103ed85906040519160408301604052600183526020830152565b906103f9368589611e38565b506001600160a01b03831690811515806104e4575b61041b575b50505061026d565b9197929690956001600160a01b038616959294919290915f5b86518110156104d1576005548b91906001600160a01b03166104618261045a818c611f04565b5194611f04565b5190803b156101ce5760a48c5f8d9381956040519889968795631854b24160e01b875233600488015260248701526044860152606485015260848401525af19182156104c6576001926104b6575b5001610434565b5f6104c091611c3d565b8c6104af565b6040513d5f823e3d90fd5b5094509450945094909550868080610413565b506001600160a01b038616151561040e565b60203660031901126101ce5761050a611bd9565b610512611f38565b63389a75e1600c52805f526020600c209081544211610536575f6102009255611f47565b636f5e88185f526004601cfd5b346101ce5760403660031901126101ce5761055c611bd9565b610564611bef565b90679a31110384e0b0c96020526014525f5260206034600c20546040519015158152f35b346101ce5760603660031901126101ce576105a1611bd9565b602435906001600160401b0382168083036101ce57604435638b78c6d8600c52335f52600160451b6020600c20541615610ac757815f52600460205260405f2092600384019283549060ff8260081c1615610ab5575060ff811615610887575060ff8395935460101c169161061583611ed2565b925f60028701815b8383106108395750505050606082901b15946020946001600160a01b0384169260c09190911b6001600160c01b03191691905f5b895460ff8160181c16821015610200576127106040518a81019084825287604082015285604882015260488152610689606882611c3d565b5190205f9260101c60ff16919006825b8281106107eb575b505050604051906106b28a83611c3d565b5f82526005548b906001600160a01b03166107b6575b6103aa57679a31110384e0b0c98a5287601452805f5260405f2090815460018101908110610376578b925560018252875f337fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604083a4883b610731575b505050600101610651565b60405192839163f23a6e61835233848401525f604084015260608301526001608083015260a08083015280518091818060c08601526107a2575b505060c401601c82015f8b5af115610794575b51630dc5919f60e01b0161035b578a8881610726565b3d1561077e573d5f823e3d90fd5b818560e08601920160045afa50808f61076b565b506107d281906040519160408301604052600183526020830152565b508a60018b6040516040810160405282815201526106c8565b6107f5818c611f04565b51821061080457600101610699565b905061ffff92506108309150859061ffff918160041c5f5260205260f060405f20549160041b161c1690565b168b80806106a1565b61087060019161ffff61086986869e9c9e9061ffff918160041c5f5260205260f060405f20549160041b161c1690565b1690611e8d565b928361087c828a611f04565b52019198969861061d565b915092935060ff915060101c1661089d81611ed2565b906108a781611ed2565b9360018101905f5b838110610a4657505050506020916040516108ca8482611c3d565b5f81528451835103610a39578160601b80156103aa57679a31110384e0b0c9178452825160051b805b610a14575060405160408152835160051b850160408201818660045afa503d604001858201525f6040823d8101895160051b8901838201818c60045afa503d010301917f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb60018060a01b038616933392a4813b61096c57005b60405194859363bc197c81855233868601525f604086015260a06060860152805160051b8601908160c087019160045afa5060a03d80820160808701523d860192805160051b8801908160c086019160045afa503d010160a08501523d019080518501908160c084019160045afa508260c0601b19923d01010301905f601c8401915af115610a06575b516343e6837f60e01b0161035b57005b3d156109f6573d5f823e3d90fd5b80860151818501515f5260405f2080549182019182106103765755601f1901806108f3565b633b800a465f526004601cfd5b8061ffff610a70600193859061ffff918160041c5f5260205260f060405f20549160041b161c1690565b16610a7b8288611f04565b5261ffff610aa382869061ffff918160041c5f5260205260f060405f20549160041b161c1690565b16610aae828a611f04565b52016108af565b63eb68947360e01b5f5260045260245ffd5b6382b429005f526004601cfd5b346101ce57610ae236611d85565b9290610aec611f18565b838303610cf057909136829003601e190191905f5b818110610b0a57005b610b15818387611e7d565b3586821015610cdc578160051b840135858112156101ce5784018035906001600160401b0382116101ce5760200181360381136101ce57610b57913691611e38565b815f52600360205260405f2081516001600160401b038111610cc857610b7d8254611c05565b601f8111610c83575b506020601f8211600114610bfa57927f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b9282610be69360019897965f91610bef575b505f19600383901b1c191690881b1790555b60405191829182611cfe565b0390a201610b01565b90508301518e610bc8565b601f19821690835f52805f20915f5b818110610c6b5750836001989796937f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b9693610be6968b9410610c53575b5050811b019055610bda565b8501515f1960f88460031b161c191690558e80610c47565b9192602060018192868a015181550194019201610c09565b825f5260205f20601f830160051c81019160208410610cbe575b601f0160051c01905b818110610cb35750610b86565b5f8155600101610ca6565b9091508190610c9d565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b63512509d360e11b5f5260045ffd5b346101ce575f3660031901126101ce576020604051600160451b8152f35b346101ce5760203660031901126101ce576004355f526002602052602060405f2054604051908152f35b346101ce5760203660031901126101ce57600435610d63611f18565b5f818152600460205260409020600301805461ff00198116600891821c60ff9081161590921b61ff0016178255905460081c1615610dc85760207f1558c90525729bae8ce21c1d66b97586680012c4e7e930caab20c9c74eba499991604051908152a1005b60207fc65f7a6deef4bf9a7575eef67f9e2a5fdefd81b14ad8074701c6dc59fa3483cd91604051908152a1005b346101ce5760203660031901126101ce577fcc5dc080ff977b3c3a211fa63ab74f90f658f5ba9d3236e92c8f59570f442aac6040610e31611bd9565b610e39611f18565b600580546001600160a01b039283166001600160a01b0319821681179092558351921682526020820152a1005b346101ce5760403660031901126101ce57610e7f611bd9565b6024358015158091036101ce57679a31110384e0b0c960205233601452815f52806034600c20555f5260018060a01b0316337f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160205fa3005b346101ce575f3660031901126101ce576040515f600154610ef881611c05565b8084529060018116908115610f825750600114610f24575b610f2083610bda81850382611c3d565b0390f35b60015f9081527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6939250905b808210610f6857509091508101602001610bda610f10565b919260018160209254838588010152019101909291610f50565b60ff191660208086019190915291151560051b84019091019150610bda9050610f10565b346101ce575f3660031901126101ce57638b78c6d819546040516001600160a01b039091168152602090f35b346101ce575f3660031901126101ce576020604051650400000000008152f35b5f3660031901126101ce57611005611f38565b5f638b78c6d819547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35f638b78c6d81955005b5f3660031901126101ce5763389a75e1600c52335f525f6020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c925f80a2005b346101ce5760403660031901126101ce57611098611bd9565b638b78c6d8600c525f52602060243581600c2054161515604051908152f35b346101ce5760c03660031901126101ce576004356024356001600160401b0381116101ce576110ea903690600401611d28565b90916044356001600160401b0381116101ce5761110b903690600401611d28565b93906064356001600160401b0381116101ce5761112c903690600401611d28565b919095608435801515948582036101ce5760a4359460ff8616998a87036101ce57611155611f18565b891561141c57811580159b9061140157828b03610cf057856113f257156113e3575b885f52600460205260405f2090600382019260ff845460101c166113d4578c92918c915f935f935b80851061126f57505050505081611262575b5061125357805462ffff00191660108a901b62ff0000161792151560081b61ff00169290921782557f3a0bc2b9b828fcbaad681155e2180ea96dbcf774129bdef0c5deb7fad73c33ac986112489561123a93919060ff63ff00000084549260181b1692169063ff0000ff1916171790556040519788978852608060208901526080880191611eae565b918583036040870152611eae565b9060608301520390a1005b635b2708d560e11b5f5260045ffd5b612710915014158b6111b1565b84965093611281919395929489611e7d565b35805f52600360205261129760405f2054611c05565b156113c5578f9061ffff6112d1911687859190916020528160041c5f5260f060405f209260041b1682549182821c1861ffff16901b189055565b1561135c576112e1858486611e7d565b351561134d576112ff6001916112f8878688611e7d565b3590611e8d565b9461134161ffff611311838789611e7d565b351682600286019190916020528160041c5f5260f060405f209260041b1682549182821c1861ffff16901b189055565b01918e9493918e61119f565b630496dde960e11b5f5260045ffd5b93611368818a8c611e7d565b35156113b657806113b161ffff6113826001948d8f611e7d565b3516828486019190916020528160041c5f5260f060405f209260041b1682549182821c1861ffff16901b189055565b611341565b631f2a200560e01b5f5260045ffd5b63677510db60e11b5f5260045ffd5b63941a624d60e01b5f5260045ffd5b6347cc84e160e01b5f5260045ffd5b635fa64a3960e11b5f5260045ffd5b858b03610cf057156111775763544f8eaf60e11b5f5260045ffd5b63e806f59d60e01b5f5260045ffd5b346101ce5761143936611d85565b92918303610a39576040519280845260051b806020858201016040525b61149f57836040518091602082016020835281518091526020604084019201905f5b818110611486575050500390f35b8251845285945060209384019390920191600101611478565b601f1981840181013560601b679a31110384e0b0c9176020528282018101355f9081526040902054858301520180611456565b60403660031901126101ce576102006114e9611bd9565b6114f1611f38565b60243590611f84565b346101ce5760a03660031901126101ce57611513611bd9565b61151b611bef565b6044356001600160401b0381116101ce5761153a903690600401611d28565b9190926064356001600160401b0381116101ce5761155c903690600401611d28565b9190926084356001600160401b0381116101ce5761157e903690600401611d58565b60055491949093916001600160a01b0316611733575b8603610a395760601b679a31110384e0b0c9179060601b679a31110384e0b0c91792816020528160601c948460601c9283156103aa57863303611719575b8760051b958680975b6116cd57505050604051946040865287604087015280896060880137806060016020870152808260808289018b606082015201378387828001977f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb339160808b0190a4833b61164657005b602097816101209387965f52816040519c8d9b63bc197c818d528c8e3391015260408d015260a060608d01528460c08d015260e08c01378160c00160808b0152818a019260e084015261010083013760e0870160a0890152018361010082015201370161010401601c604051015f80515af115610a0657516343e6837f60e01b0161035b57005b80601f190190601f1981860101359084602052601f19908d0101355f5260405f2080548083116103835782900390558260205260405f20908154908101908110610376578291556115db565b335f526034600c20546115d257634b6e7f185f526004601cfd5b61173e36888a611dec565b611749368389611dec565b90611755368789611e38565b506001600160a01b038416908115158061182e575b611777575b505050611594565b959097929893969199945f9760018060a01b038216985b8851811015611819576005548d91906001600160a01b03166117b48261045a818e611f04565b5190803b156101ce5760a48e5f8f9381956040519889968795631854b24160e01b875233600488015260248701526044860152606485015260848401525af19182156104c657600192611809575b500161178e565b5f61181391611c3d565b8e611802565b5094999398509499509450945088808061176f565b506001600160a01b038616151561176a565b346101ce5760203660031901126101ce57611859611bd9565b638b78c6d8600c525f52602080600c2054604051908152f35b346101ce5760403660031901126101ce5760406024356004355f5268aa4ec00224afccfdb7602052815f2054908160601c9182156118d9575b90612710918360601b1890815f1904811182023d3d3e84516001600160a01b03909416845202046020820152f35b5068aa4ec00224afccfdb754606081901c92506118ab565b5f3660031901126101ce5763389a75e1600c52335f526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d5f80a2005b346101ce5760403660031901126101ce576020611955611bd9565b60243590638b78c6d8600c525f528082600c20541614604051908152f35b60403660031901126101ce57611987611bd9565b61198f611f38565b638b78c6d8600c525f526020600c20602435815417809155600c5160601c7f715ad5ce61fc9595c7b415289d59cf203f23a94fa06f04af7e489a0a76e1fe265f80a3005b60203660031901126101ce5761020060043533611f84565b346101ce5760203660031901126101ce576004355f526003602052611a1260405f20611c5e565b8051156113c557610f209060405191829182611cfe565b346101ce575f3660031901126101ce5760408051631854b24160e01b81525f6020820152f35b346101ce575f3660031901126101ce576005546040516001600160a01b039091168152602090f35b346101ce575f3660031901126101ce57610f20610bda5f611c5e565b346101ce5760403660031901126101ce57611aac611bd9565b602435906bffffffffffffffffffffffff82168092036101ce57611ace611f18565b6127108211611afb5760601b8015611aee571768aa4ec00224afccfdb755005b63b4457eaa5f526004601cfd5b63350a88b35f526004601cfd5b346101ce5760203660031901126101ce576004356001600160e01b031981168082036101ce5760209160e01c6301ffc9a7811490630e89341c811463d9b67a268214831717928315611b91575b8315611b80575b508215611b70575b50506040519015158152f35b632a55205a141790508280611b64565b632b435fdb60e21b14925084611b5c565b632a55205a821483179350611b55565b346101ce5760403660031901126101ce57602090611bbd611bd9565b679a31110384e0b0c983526014526024355f5260405f20548152f35b600435906001600160a01b03821682036101ce57565b602435906001600160a01b03821682036101ce57565b90600182811c92168015611c33575b6020831014611c1f57565b634e487b7160e01b5f52602260045260245ffd5b91607f1691611c14565b90601f801991011681019081106001600160401b03821117610cc857604052565b9060405191825f825492611c7184611c05565b8084529360018116908115611cdc5750600114611c98575b50611c9692500383611c3d565b565b90505f9291925260205f20905f915b818310611cc0575050906020611c96928201015f611c89565b6020919350806001915483858901015201910190918492611ca7565b905060209250611c9694915060ff191682840152151560051b8201015f611c89565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b9181601f840112156101ce578235916001600160401b0383116101ce576020808501948460051b0101116101ce57565b9181601f840112156101ce578235916001600160401b0383116101ce57602083818601950101116101ce57565b60406003198201126101ce576004356001600160401b0381116101ce5781611daf91600401611d28565b92909291602435906001600160401b0382116101ce57611dd191600401611d28565b9091565b6001600160401b038111610cc85760051b60200190565b929190611df881611dd5565b93611e066040519586611c3d565b602085838152019160051b81019283116101ce57905b828210611e2857505050565b8135815260209182019101611e1c565b9291926001600160401b038211610cc85760405191611e61601f8201601f191660200184611c3d565b8294818452818301116101ce578281602093845f960137010152565b9190811015610cdc5760051b0190565b91908201809211611e9a57565b634e487b7160e01b5f52601160045260245ffd5b81835290916001600160fb1b0383116101ce5760209260051b809284830137010190565b90611edc82611dd5565b611ee96040519182611c3d565b8281528092611efa601f1991611dd5565b0190602036910137565b8051821015610cdc5760209160051b010190565b638b78c6d8600c52335f52650400000000006020600c20541615611f3857565b638b78c6d819543303610ac757565b60018060a01b031680638b78c6d819547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3638b78c6d81955565b638b78c6d8600c525f526020600c2090815490811618809155600c5160601c7f715ad5ce61fc9595c7b415289d59cf203f23a94fa06f04af7e489a0a76e1fe265f80a356fea2646970667358221220a36a82fb1fd75adb66b31287a7b868d3d33b200fb7582b47df0ead546435ec9664736f6c634300081c0033