Overview
TokenID
146
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
Jelly7616
Compiler Version
v0.8.23+commit.f704f362
Optimization Enabled:
Yes with 10000 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.23; import { ERC7616 } from "./ERC7616.sol"; import { console2 } from "forge-std/src/console2.sol"; import { IJelly7616 } from "./interfaces/IJelly7616.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; // owner should be in whitelist & should approve all token to this contract // 21,000 blocks in total, which shuold be // 21,000 * 13.5 / 60/ 60 = 78.75 hours contract Jelly7616 is ERC7616, IJelly7616 { uint256 public constant MINT_PRICE = 0.01 ether; uint256 public constant EPOCH_BLOCKS = 200; uint256 public constant TOTAL_QUOTA_EACH_EPOCH = 25_000 ether; uint256 public constant MAX_EPOCH = 40; uint256 public currentEpoch = 0; uint256 public currentEpochEndBlock; address payable teamAddress; string public dataURI; string public baseTokenURI; uint256 public startBlock; // epoch => address => minted amt mapping(uint256 => mapping(address => uint256)) public minters; // epoch => total minted amt mapping(uint256 => uint256) public totalMinted; // epoch => address => isRewardClaimed mapping(uint256 => mapping(address => bool)) public isClaimed; // epoch => sharePerMint mapping(uint256 => uint256) public EpochSharePerMint; // tokenId => attribute mapping(uint256 => uint256) public tokenAttributes; error NoEnoughEth(); error MaxEpochsReached(); error StartBlockAlreadySet(); error MintIsNotStarted(); error NotEligible(); error EpochNotEnded(); error AlreadyClaimed(); event JellyMinted(address indexed minter, uint256 indexed epoch); event JellyBatchMinted(address indexed minter, uint256 indexed epoch, uint256 amount); event JellyClaimed(address indexed minter, uint256 indexed epoch, uint256 amount); event EpochEnded(uint256 indexed epoch, uint256 totalMinted, uint256 sharePerMint); constructor(address teamAddress_, address _owner) ERC7616("Jelly", "JELLY", 18, 10_000, _owner) { teamAddress = payable(teamAddress_); whitelist[teamAddress_] = true; whitelist[address(0)] = true; if (teamAddress_ != _owner) { whitelist[_owner] = true; } } function setStartBlock(uint256 blockNumber_) external onlyOwner { startBlock = blockNumber_; currentEpochEndBlock = blockNumber_ + EPOCH_BLOCKS; } function setDataURI(string memory _dataURI) public onlyOwner { dataURI = _dataURI; } function setTokenURI(string memory _tokenURI) public onlyOwner { baseTokenURI = _tokenURI; } function setNameSymbol(string memory _name, string memory _symbol) public onlyOwner { _setNameSymbol(_name, _symbol); } function mint() public payable { // Perform all minting checks performMintingChecks(); // Perform the mint operation for 1 quantity performMint(1); } function batchMint(uint256 quantity) public payable { require(quantity > 0, "Quantity must be greater than 0"); // Perform all minting checks for the requested quantity performMintingChecks(); // Perform the mint operation for the requested quantity performMint(quantity); // Emit event for minting emit JellyBatchMinted(msg.sender, currentEpoch, quantity); } function performMintingChecks() internal { if (block.number < startBlock || startBlock == 0) { revert MintIsNotStarted(); } endEpoch(); if (currentEpoch == MAX_EPOCH) { revert MaxEpochsReached(); } } function performMint(uint256 quantity) internal { uint256 totalPrice = MINT_PRICE * quantity; if (msg.value < totalPrice) { revert NoEnoughEth(); } uint256 excessAmount = msg.value - totalPrice; unchecked { minters[currentEpoch][msg.sender] += quantity; totalMinted[currentEpoch] += quantity; } // Return the excess ETH to the sender if (excessAmount > 0) { payable(msg.sender).transfer(excessAmount); } teamAddress.transfer(totalPrice); } function getTotalClaimableAmount(address _owner) public view returns (uint256) { uint256 totalClaimable = 0; uint256 curEpoch = getActualCurrentEpoch(); for (uint256 i = 0; i < curEpoch; i++) { if (!isClaimed[i][_owner] && minters[i][_owner] > 0) { // Calculate the claimable amount for each unclaimed epoch uint256 claimableAmt = minters[i][_owner] * EpochSharePerMint[i]; totalClaimable += claimableAmt; } } return totalClaimable; } function getClaimableEpoches(address _owner) public view returns (uint256[] memory) { uint256 claimableCount = 0; for (uint256 i = 0; i < currentEpoch; i++) { if (!isClaimed[i][_owner] && minters[i][_owner] > 0) { claimableCount++; } } uint256[] memory claimableEpochs = new uint256[](claimableCount); uint256 currentIndex = 0; for (uint256 i = 0; i < currentEpoch; i++) { if (!isClaimed[i][_owner] && minters[i][_owner] > 0) { claimableEpochs[currentIndex] = i; currentIndex++; } } return claimableEpochs; } // todo: we should not allow users to claim more than 256 tokens in 1 block // because that would lose the randomness function claimToken(uint256[] calldata epoches) public { endEpoch(); uint256 totalClaimable = 0; uint256 curEpoch = getActualCurrentEpoch(); for (uint256 i = 0; i < epoches.length; i++) { uint256 epoch = epoches[i]; if (epoch >= curEpoch) { revert EpochNotEnded(); } // check if already claimed if (isClaimed[epoch][msg.sender]) { revert AlreadyClaimed(); } if (minters[epoch][msg.sender] > 0) { // Calculate the claimable amount for each unclaimed epoch uint256 claimableAmt = minters[epoch][msg.sender] * EpochSharePerMint[epoch]; totalClaimable += claimableAmt; isClaimed[epoch][msg.sender] = true; emit JellyClaimed(msg.sender, epoch, claimableAmt); } else { revert NotEligible(); } } _transfer(address(0), msg.sender, totalClaimable); } function calculateSharesPerMint(uint256 epoch) internal view returns (uint256) { if (totalMinted[epoch] > 0) { uint256 sharePerMintAtEpoch = TOTAL_QUOTA_EACH_EPOCH / totalMinted[epoch]; return sharePerMintAtEpoch; } else { return 0; } } function endEpoch() internal { if (block.number < currentEpochEndBlock) { return; } uint256 sharePerMint = calculateSharesPerMint(currentEpoch); EpochSharePerMint[currentEpoch] = sharePerMint; emit EpochEnded(currentEpoch, totalMinted[currentEpoch], sharePerMint); currentEpoch = getActualCurrentEpoch(); if (currentEpoch == MAX_EPOCH) { return; } // Update epoch information for the new epoch currentEpochEndBlock = startBlock + (getActualCurrentEpoch() + 1) * EPOCH_BLOCKS; } function getEpochesCollapsed() public view returns (uint256 epochesCollapsed) { if (block.number >= currentEpochEndBlock) { epochesCollapsed = (block.number - startBlock) / EPOCH_BLOCKS - currentEpoch; } else { epochesCollapsed = 0; } } function getActualCurrentEpoch() public view returns (uint256) { uint256 actualEpoch = currentEpoch + getEpochesCollapsed(); return actualEpoch < MAX_EPOCH ? actualEpoch : MAX_EPOCH; } function getActualCurrentEpochStartBlock() public view returns (uint256 actualCurrentEpochStartBlock) { actualCurrentEpochStartBlock = startBlock + EPOCH_BLOCKS * getActualCurrentEpoch(); } function getCurrentEpochEndBlock() public view returns (uint256) { return getActualCurrentEpochStartBlock() + EPOCH_BLOCKS; } function _mint(address to) internal virtual override { if (to == address(0)) { revert("InvalidRecipient"); } unchecked { minted++; } uint256 id = minted; if (_ownerOf[id] != address(0)) { revert("AlreadyExists"); } _ownerOf[id] = to; _owned[to].push(id); _ownedIndex[id] = _owned[to].length - 1; emit Transfer(address(0), to, id); // added the following according uint256 attribute = getRandomNumber(id); tokenAttributes[id] = attribute; } function getRandomNumber(uint256 tokenId) internal view returns (uint256) { return uint256(blockhash(block.number - 1)) + block.timestamp + tokenId; } function getAttribute(uint256 seed) private pure returns (string memory) { bytes memory seedBytes = abi.encodePacked(seed); bytes32 hashResult = keccak256(seedBytes); uint256 hashedNumber = uint256(hashResult); uint256 random = hashedNumber % 256; uint256[] memory weights = new uint256[](9); string[] memory colors = new string[](9); // total weight is 256; weights[0] = 50; // Green colors[0] = "Green"; weights[1] = 40; // Orange colors[1] = "Orange"; weights[2] = 35; // Red colors[2] = "Red"; weights[3] = 31; // Pink colors[3] = "Pink"; weights[4] = 30; // Blue colors[4] = "Blue"; weights[5] = 25; // Teal colors[5] = "Teal"; weights[6] = 20; // Purple colors[6] = "Purple"; weights[7] = 15; // Lavender colors[7] = "Lavender"; weights[8] = 10; // Gold colors[8] = "Gold"; uint256 sum = 0; for (uint256 i = 0; i < weights.length; i++) { sum += weights[i]; if (random < sum) { return colors[i]; } } revert("Invalid random number provided."); } function tokenURI(uint256 id) public view override returns (string memory) { if (bytes(baseTokenURI).length > 0) { return string.concat(baseTokenURI, Strings.toString(id)); } else { uint256 seed = tokenAttributes[id]; string memory color = getAttribute(seed); string memory jsonPreImage = string.concat( string.concat( string.concat('{"name": "Jelly #', Strings.toString(id)), '","description":"A collection of 10,000 Replicants enabled by ERC7616, an experimental token standard.","external_url":"https://jelly.top","image":"' ), string.concat(dataURI, color, ".jpg") ); string memory jsonPostImage = string.concat('","attributes":[{"trait_type":"Color","value":"', color); string memory jsonPostTraits = '"}]}'; return string.concat( "data:application/json;utf8,", string.concat(string.concat(jsonPreImage, jsonPostImage), jsonPostTraits) ); } } fallback() external payable { } receive() external payable { } }
//SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; abstract contract Ownable { event OwnershipTransferred(address indexed user, address indexed newOwner); error Unauthorized(); error InvalidOwner(); address public owner; modifier onlyOwner() virtual { if (msg.sender != owner) revert Unauthorized(); _; } constructor(address _owner) { if (_owner == address(0)) revert InvalidOwner(); owner = _owner; emit OwnershipTransferred(address(0), _owner); } function transferOwnership(address _owner) public virtual onlyOwner { if (_owner == address(0)) revert InvalidOwner(); owner = _owner; emit OwnershipTransferred(msg.sender, _owner); } function revokeOwnership() public virtual onlyOwner { owner = address(0); emit OwnershipTransferred(msg.sender, address(0)); } } abstract contract ERC721Receiver { function onERC721Received(address, address, uint256, bytes calldata) external virtual returns (bytes4) { return ERC721Receiver.onERC721Received.selector; } } /// @notice ERC7616 /// A gas-efficient, mixed ERC20 / ERC721 implementation /// with native liquidity and fractionalization. /// /// This is an experimental standard designed to integrate /// with pre-existing ERC20 / ERC721 support as smoothly as /// possible. /// /// @dev In order to support full functionality of ERC20 and ERC721 /// supply assumptions are made that slightly constraint usage. /// Ensure decimals are sufficiently large (standard 18 recommended) /// as ids are effectively encoded in the lowest range of amounts. /// /// NFTs are spent on ERC20 functions in a FILO queue, this is by /// design. /// abstract contract ERC7616 is Ownable { // Events event ERC20Transfer(address indexed from, address indexed to, uint256 amount); event Approval(address indexed owner, address indexed spender, uint256 amount); event Transfer(address indexed from, address indexed to, uint256 indexed id); event ERC721Approval(address indexed owner, address indexed spender, uint256 indexed id); event ApprovalForAll(address indexed owner, address indexed operator, bool approved); // Errors error NotFound(); error AlreadyExists(); error InvalidRecipient(); error InvalidSender(); error UnsafeRecipient(); error AlreadyWhitelisted(); error AlreadyUnwhitelisted(); error NoEnoughNFT(); // Metadata /// @dev Token name string public name; /// @dev Token symbol string public symbol; /// @dev Decimals for fractional representation uint8 public immutable decimals; /// @dev Total supply in fractionalized representation uint256 public immutable totalSupply; /// @dev Current mint counter, monotonically increasing to ensure accurate ownership uint256 public minted; // Mappings /// @dev Balance of user in fractional representation mapping(address => uint256) public balanceOf; /// @dev Allowance of user in fractional representation mapping(address => mapping(address => uint256)) public allowance; /// @dev Approval in native representaion mapping(uint256 => address) public getApproved; /// @dev Approval for all in native representation mapping(address => mapping(address => bool)) public isApprovedForAll; /// @dev Owner of id in native representation mapping(uint256 => address) internal _ownerOf; /// @dev Array of owned ids in native representation mapping(address => uint256[]) internal _owned; /// @dev Tracks indices for the _owned mapping. id => index in the _owned array mapping(uint256 => uint256) internal _ownedIndex; /// @dev Addresses whitelisted from minting / burning for gas savings (pairs, routers, etc) mapping(address => bool) public whitelist; // Constructor constructor( string memory _name, string memory _symbol, uint8 _decimals, uint256 _totalNativeSupply, address _owner ) Ownable(_owner) { name = _name; symbol = _symbol; decimals = _decimals; totalSupply = _totalNativeSupply * (10 ** decimals); } function tokenOfOwnerByIndex(address owner_, uint256 index_) public view returns (uint256) { return _owned[owner_][index_]; } function nftBalanceOf(address owner) public view virtual returns (uint256) { return _owned[owner].length; } /// @notice Initialization function to set pairs / etc /// saving gas by avoiding mint / burn on unnecessary targets function setWhitelist(address target, bool state) public onlyOwner { if (state == true) { whitelistWithNumOfNFT(target, 0); } else { unwhitelist(target); } } function whitelistWithNumOfNFT(uint256 num) public { whitelistWithNumOfNFT(msg.sender, num); } function whitelistWithNumOfNFT(address target, uint256 num) internal { if (whitelist[target]) { revert AlreadyWhitelisted(); } uint256 nftBalance = nftBalanceOf(target); if (num > nftBalance) { revert NoEnoughNFT(); } whitelist[target] = true; uint256 totalBalance = num * _getUnit(); for (uint256 i = 0; i < nftBalance - num; i++) { _burn(target); } balanceOf[target] -= totalBalance; emit ERC20Transfer(target, address(0), totalBalance); } function unwhitelist() public { unwhitelist(msg.sender); } function unwhitelist(address target) internal { if (!whitelist[target]) { revert AlreadyUnwhitelisted(); } uint256 totalBalance = nftBalanceOf(target) * _getUnit(); uint256 tokens_to_mint = (balanceOf[target] / _getUnit()); for (uint256 i = 0; i < tokens_to_mint; i++) { _mint(target); } _transfer(address(0), msg.sender, totalBalance); whitelist[target] = false; emit ERC20Transfer(address(0), msg.sender, totalBalance); } /// @notice Function to find owner of a given native token function ownerOf(uint256 id) public view virtual returns (address owner) { owner = _ownerOf[id]; if (owner == address(0)) { revert NotFound(); } } /// @notice tokenURI must be implemented by child contract function tokenURI(uint256 id) public view virtual returns (string memory); /// @notice Function for token approvals /// @dev This function assumes id / native if amount less than or equal to current max id function approve(address spender, uint256 amountOrId) public virtual returns (bool) { if (amountOrId <= minted && amountOrId > 0) { address owner = _ownerOf[amountOrId]; if (msg.sender != owner && !isApprovedForAll[owner][msg.sender]) { revert Unauthorized(); } getApproved[amountOrId] = spender; emit Approval(owner, spender, amountOrId); } else { allowance[msg.sender][spender] = amountOrId; emit Approval(msg.sender, spender, amountOrId); } return true; } /// @notice Function native approvals function setApprovalForAll(address operator, bool approved) public virtual { isApprovedForAll[msg.sender][operator] = approved; emit ApprovalForAll(msg.sender, operator, approved); } /// @notice Function for mixed transfers /// @dev This function assumes id / native if amount less than or equal to current max id function transferFrom(address from, address to, uint256 amountOrId) public virtual { if (amountOrId <= minted) { uint256 unit = _getUnit(); if (from != _ownerOf[amountOrId]) { revert InvalidSender(); } if (to == address(0)) { revert InvalidRecipient(); } if (msg.sender != from && !isApprovedForAll[from][msg.sender] && msg.sender != getApproved[amountOrId]) { revert Unauthorized(); } if (!whitelist[from]) { balanceOf[from] -= unit; } if (!whitelist[to]) { unchecked { balanceOf[to] += unit; } } _ownerOf[amountOrId] = to; delete getApproved[amountOrId]; // update _owned for sender uint256 updatedId = _owned[from][_owned[from].length - 1]; _owned[from][_ownedIndex[amountOrId]] = updatedId; // pop _owned[from].pop(); // update index for the moved id _ownedIndex[updatedId] = _ownedIndex[amountOrId]; // push token to to owned _owned[to].push(amountOrId); // update index for to owned _ownedIndex[amountOrId] = _owned[to].length - 1; emit Transfer(from, to, amountOrId); if (whitelist[from] && !whitelist[to]) { emit ERC20Transfer(address(0), to, unit); } else if (!whitelist[from] && whitelist[to]) { emit ERC20Transfer(from, address(0), unit); } else if (!whitelist[from] && !whitelist[to]) { emit ERC20Transfer(from, to, unit); } } else { uint256 allowed = allowance[from][msg.sender]; if (allowed != type(uint256).max) { allowance[from][msg.sender] = allowed - amountOrId; } _transfer(from, to, amountOrId); } } /// @notice Function for fractional transfers function transfer(address to, uint256 amount) public virtual returns (bool) { return _transfer(msg.sender, to, amount); } /// @notice Function for native transfers with contract support function safeTransferFrom(address from, address to, uint256 id) public virtual { transferFrom(from, to, id); if ( to.code.length != 0 && ERC721Receiver(to).onERC721Received(msg.sender, from, id, "") != ERC721Receiver.onERC721Received.selector ) { revert UnsafeRecipient(); } } /// @notice Function for native transfers with contract support and callback data function safeTransferFrom(address from, address to, uint256 id, bytes calldata data) public virtual { transferFrom(from, to, id); if ( to.code.length != 0 && ERC721Receiver(to).onERC721Received(msg.sender, from, id, data) != ERC721Receiver.onERC721Received.selector ) { revert UnsafeRecipient(); } } /// @notice Internal function for fractional transfers function _transfer(address from, address to, uint256 amount) internal returns (bool) { uint256 unit = _getUnit(); uint256 balanceBeforeSender = balanceOf[from]; uint256 balanceBeforeReceiver = balanceOf[to]; if (from != address(0)) { balanceOf[from] -= amount; } unchecked { balanceOf[to] += amount; } // Skip burn for certain addresses to save gas if (!whitelist[from]) { uint256 tokens_to_burn = (balanceBeforeSender / unit) - (balanceOf[from] / unit); for (uint256 i = 0; i < tokens_to_burn; i++) { _burn(from); } } // Skip minting for certain addresses to save gas if (!whitelist[to]) { uint256 tokens_to_mint = (balanceOf[to] / unit) - (balanceBeforeReceiver / unit); for (uint256 i = 0; i < tokens_to_mint; i++) { _mint(to); } } emit ERC20Transfer(from, to, amount); return true; } // Internal utility logic function _getUnit() internal view returns (uint256) { return 200 * 10 ** decimals; } function _mint(address to) internal virtual { if (to == address(0)) { revert InvalidRecipient(); } unchecked { minted++; } uint256 id = minted; if (_ownerOf[id] != address(0)) { revert AlreadyExists(); } _ownerOf[id] = to; _owned[to].push(id); _ownedIndex[id] = _owned[to].length - 1; emit Transfer(address(0), to, id); } function _burn(address from) internal virtual { if (from == address(0)) { revert InvalidSender(); } uint256 id = _owned[from][_owned[from].length - 1]; _owned[from].pop(); delete _ownedIndex[id]; delete _ownerOf[id]; delete getApproved[id]; emit Transfer(from, address(0), id); } function _setNameSymbol(string memory _name, string memory _symbol) internal { name = _name; symbol = _symbol; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.4.22 <0.9.0; /// @dev The original console.sol uses `int` and `uint` for computing function selectors, but it should /// use `int256` and `uint256`. This modified version fixes that. This version is recommended /// over `console.sol` if you don't need compatibility with Hardhat as the logs will show up in /// forge stack traces. If you do need compatibility with Hardhat, you must use `console.sol`. /// Reference: https://github.com/NomicFoundation/hardhat/issues/2178 library console2 { address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67); function _castLogPayloadViewToPure( function(bytes memory) internal view fnIn ) internal pure returns (function(bytes memory) internal pure fnOut) { assembly { fnOut := fnIn } } function _sendLogPayload(bytes memory payload) internal pure { _castLogPayloadViewToPure(_sendLogPayloadView)(payload); } function _sendLogPayloadView(bytes memory payload) private view { uint256 payloadLength = payload.length; address consoleAddress = CONSOLE_ADDRESS; /// @solidity memory-safe-assembly assembly { let payloadStart := add(payload, 32) let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0) } } function log() internal pure { _sendLogPayload(abi.encodeWithSignature("log()")); } function logInt(int256 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(int256)", p0)); } function logUint(uint256 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0)); } function logString(string memory p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function logBool(bool p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function logAddress(address p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function logBytes(bytes memory p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0)); } function logBytes1(bytes1 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0)); } function logBytes2(bytes2 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0)); } function logBytes3(bytes3 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0)); } function logBytes4(bytes4 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0)); } function logBytes5(bytes5 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0)); } function logBytes6(bytes6 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0)); } function logBytes7(bytes7 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0)); } function logBytes8(bytes8 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0)); } function logBytes9(bytes9 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0)); } function logBytes10(bytes10 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0)); } function logBytes11(bytes11 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0)); } function logBytes12(bytes12 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0)); } function logBytes13(bytes13 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0)); } function logBytes14(bytes14 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0)); } function logBytes15(bytes15 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0)); } function logBytes16(bytes16 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0)); } function logBytes17(bytes17 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0)); } function logBytes18(bytes18 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0)); } function logBytes19(bytes19 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0)); } function logBytes20(bytes20 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0)); } function logBytes21(bytes21 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0)); } function logBytes22(bytes22 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0)); } function logBytes23(bytes23 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0)); } function logBytes24(bytes24 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0)); } function logBytes25(bytes25 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0)); } function logBytes26(bytes26 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0)); } function logBytes27(bytes27 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0)); } function logBytes28(bytes28 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0)); } function logBytes29(bytes29 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0)); } function logBytes30(bytes30 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0)); } function logBytes31(bytes31 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0)); } function logBytes32(bytes32 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0)); } function log(uint256 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0)); } function log(int256 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(int256)", p0)); } function log(string memory p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function log(bool p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function log(address p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function log(uint256 p0, uint256 p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256)", p0, p1)); } function log(uint256 p0, string memory p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string)", p0, p1)); } function log(uint256 p0, bool p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool)", p0, p1)); } function log(uint256 p0, address p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address)", p0, p1)); } function log(string memory p0, uint256 p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1)); } function log(string memory p0, int256 p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,int256)", p0, p1)); } function log(string memory p0, string memory p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); } function log(string memory p0, bool p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1)); } function log(string memory p0, address p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1)); } function log(bool p0, uint256 p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256)", p0, p1)); } function log(bool p0, string memory p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1)); } function log(bool p0, bool p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1)); } function log(bool p0, address p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1)); } function log(address p0, uint256 p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256)", p0, p1)); } function log(address p0, string memory p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1)); } function log(address p0, bool p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1)); } function log(address p0, address p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1)); } function log(uint256 p0, uint256 p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address)", p0, p1, p2)); } function log(uint256 p0, string memory p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256)", p0, p1, p2)); } function log(uint256 p0, string memory p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string)", p0, p1, p2)); } function log(uint256 p0, string memory p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool)", p0, p1, p2)); } function log(uint256 p0, string memory p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address)", p0, p1, p2)); } function log(uint256 p0, bool p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256)", p0, p1, p2)); } function log(uint256 p0, bool p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string)", p0, p1, p2)); } function log(uint256 p0, bool p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool)", p0, p1, p2)); } function log(uint256 p0, bool p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address)", p0, p1, p2)); } function log(uint256 p0, address p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256)", p0, p1, p2)); } function log(uint256 p0, address p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string)", p0, p1, p2)); } function log(uint256 p0, address p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool)", p0, p1, p2)); } function log(uint256 p0, address p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address)", p0, p1, p2)); } function log(string memory p0, uint256 p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256)", p0, p1, p2)); } function log(string memory p0, uint256 p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string)", p0, p1, p2)); } function log(string memory p0, uint256 p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool)", p0, p1, p2)); } function log(string memory p0, uint256 p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address)", p0, p1, p2)); } function log(string memory p0, string memory p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256)", p0, p1, p2)); } function log(string memory p0, string memory p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2)); } function log(string memory p0, string memory p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2)); } function log(string memory p0, string memory p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2)); } function log(string memory p0, bool p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256)", p0, p1, p2)); } function log(string memory p0, bool p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2)); } function log(string memory p0, bool p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2)); } function log(string memory p0, bool p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2)); } function log(string memory p0, address p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256)", p0, p1, p2)); } function log(string memory p0, address p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2)); } function log(string memory p0, address p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2)); } function log(string memory p0, address p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2)); } function log(bool p0, uint256 p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256)", p0, p1, p2)); } function log(bool p0, uint256 p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string)", p0, p1, p2)); } function log(bool p0, uint256 p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool)", p0, p1, p2)); } function log(bool p0, uint256 p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address)", p0, p1, p2)); } function log(bool p0, string memory p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256)", p0, p1, p2)); } function log(bool p0, string memory p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2)); } function log(bool p0, string memory p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2)); } function log(bool p0, string memory p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2)); } function log(bool p0, bool p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256)", p0, p1, p2)); } function log(bool p0, bool p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2)); } function log(bool p0, bool p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2)); } function log(bool p0, bool p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2)); } function log(bool p0, address p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256)", p0, p1, p2)); } function log(bool p0, address p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2)); } function log(bool p0, address p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2)); } function log(bool p0, address p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2)); } function log(address p0, uint256 p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256)", p0, p1, p2)); } function log(address p0, uint256 p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string)", p0, p1, p2)); } function log(address p0, uint256 p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool)", p0, p1, p2)); } function log(address p0, uint256 p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address)", p0, p1, p2)); } function log(address p0, string memory p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256)", p0, p1, p2)); } function log(address p0, string memory p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2)); } function log(address p0, string memory p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2)); } function log(address p0, string memory p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2)); } function log(address p0, bool p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256)", p0, p1, p2)); } function log(address p0, bool p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2)); } function log(address p0, bool p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2)); } function log(address p0, bool p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2)); } function log(address p0, address p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256)", p0, p1, p2)); } function log(address p0, address p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2)); } function log(address p0, address p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2)); } function log(address p0, address p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,string)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,address)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3)); } }
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.23; // todo: update interface IJelly7616 { function mint() external payable; function getEpochesCollapsed() external view returns (uint256); function getActualCurrentEpoch() external view returns (uint256); function getActualCurrentEpochStartBlock() external view returns (uint256); function getCurrentEpochEndBlock() external view returns (uint256); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/Strings.sol) pragma solidity ^0.8.20; import {Math} from "./math/Math.sol"; import {SignedMath} from "./math/SignedMath.sol"; /** * @dev String operations. */ library Strings { bytes16 private constant HEX_DIGITS = "0123456789abcdef"; uint8 private constant ADDRESS_LENGTH = 20; /** * @dev The `value` string doesn't fit in the specified `length`. */ error StringsInsufficientHexLength(uint256 value, uint256 length); /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), HEX_DIGITS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `int256` to its ASCII `string` decimal representation. */ function toStringSigned(int256 value) internal pure returns (string memory) { return string.concat(value < 0 ? "-" : "", toString(SignedMath.abs(value))); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { uint256 localValue = value; bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = HEX_DIGITS[localValue & 0xf]; localValue >>= 4; } if (localValue != 0) { revert StringsInsufficientHexLength(value, length); } return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal * representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/math/Math.sol) pragma solidity ^0.8.20; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Muldiv operation overflow. */ error MathOverflowedMulDiv(); enum Rounding { Floor, // Toward negative infinity Ceil, // Toward positive infinity Trunc, // Toward zero Expand // Away from zero } /** * @dev Returns the addition of two unsigned integers, with an overflow flag. */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds towards infinity instead * of rounding towards zero. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { if (b == 0) { // Guarantee the same behavior as in a regular Solidity division. return a / b; } // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or * denominator == 0. * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by * Uniswap Labs also under MIT license. */ function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0 = x * y; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. if (denominator <= prod1) { revert MathOverflowedMulDiv(); } /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. // Always >= 1. See https://cs.stackexchange.com/q/138556/92363. uint256 twos = denominator & (0 - denominator); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also // works in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded * towards zero. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2 of a positive value rounded towards zero. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10 of a positive value rounded towards zero. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256 of a positive value rounded towards zero. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0); } } /** * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers. */ function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) { return uint8(rounding) % 2 == 1; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/math/SignedMath.sol) pragma solidity ^0.8.20; /** * @dev Standard signed math utilities missing in the Solidity language. */ library SignedMath { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } }
{ "remappings": [ "@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/", "@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/", "@prb/test/=node_modules/@prb/test/", "forge-std/=lib/forge-std/", "@solvprotocol/=node_modules/@solvprotocol/", "ds-test/=lib/forge-std/lib/ds-test/src/", "@ensdomains/=node_modules/@ensdomains/", "hardhat/=node_modules/hardhat/" ], "optimizer": { "enabled": true, "runs": 10000 }, "metadata": { "useLiteralContent": false, "bytecodeHash": "none", "appendCBOR": true }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "paris", "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"teamAddress_","type":"address"},{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyClaimed","type":"error"},{"inputs":[],"name":"AlreadyExists","type":"error"},{"inputs":[],"name":"AlreadyUnwhitelisted","type":"error"},{"inputs":[],"name":"AlreadyWhitelisted","type":"error"},{"inputs":[],"name":"EpochNotEnded","type":"error"},{"inputs":[],"name":"InvalidOwner","type":"error"},{"inputs":[],"name":"InvalidRecipient","type":"error"},{"inputs":[],"name":"InvalidSender","type":"error"},{"inputs":[],"name":"MaxEpochsReached","type":"error"},{"inputs":[],"name":"MintIsNotStarted","type":"error"},{"inputs":[],"name":"NoEnoughEth","type":"error"},{"inputs":[],"name":"NoEnoughNFT","type":"error"},{"inputs":[],"name":"NotEligible","type":"error"},{"inputs":[],"name":"NotFound","type":"error"},{"inputs":[],"name":"StartBlockAlreadySet","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"inputs":[],"name":"UnsafeRecipient","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"ERC721Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalMinted","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sharePerMint","type":"uint256"}],"name":"EpochEnded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"minter","type":"address"},{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"JellyBatchMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"minter","type":"address"},{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"JellyClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"minter","type":"address"},{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"}],"name":"JellyMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","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":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"EPOCH_BLOCKS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"EpochSharePerMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_EPOCH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOTAL_QUOTA_EACH_EPOCH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amountOrId","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"batchMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"epoches","type":"uint256[]"}],"name":"claimToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentEpochEndBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dataURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getActualCurrentEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getActualCurrentEpochStartBlock","outputs":[{"internalType":"uint256","name":"actualCurrentEpochStartBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"getClaimableEpoches","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentEpochEndBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getEpochesCollapsed","outputs":[{"internalType":"uint256","name":"epochesCollapsed","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"getTotalClaimableAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"isClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"minters","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nftBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revokeOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_dataURI","type":"string"}],"name":"setDataURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"name":"setNameSymbol","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"blockNumber_","type":"uint256"}],"name":"setStartBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bool","name":"state","type":"bool"}],"name":"setWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenAttributes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"uint256","name":"index_","type":"uint256"}],"name":"tokenOfOwnerByIndex","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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amountOrId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unwhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"whitelistWithNumOfNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60c06040526000600c553480156200001657600080fd5b506040516200428c3803806200428c8339810160408190526200003991620001fe565b604051806040016040528060058152602001644a656c6c7960d81b815250604051806040016040528060058152602001644a454c4c5960d81b8152506012612710848060006001600160a01b0316816001600160a01b031603620000b0576040516349e27cff60e01b815260040160405180910390fd5b600080546001600160a01b0319166001600160a01b03831690811782556040519091907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001620001078682620002dd565b506002620001168582620002dd565b5060ff831660808190526200012d90600a620004be565b620001399083620004d6565b60a0525050600e80546001600160a01b0319166001600160a01b038781169182179092556000818152600b60205260408120805460ff1990811660019081179092559180527fdf7de25b7f1fd6d0b5205f0e18f1f35bd7b8d84cce336588d184533ce43a6f768054909216179055908516149250620001d9915050576001600160a01b0381166000908152600b60205260409020805460ff191660011790555b5050620004f0565b80516001600160a01b0381168114620001f957600080fd5b919050565b600080604083850312156200021257600080fd5b6200021d83620001e1565b91506200022d60208401620001e1565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200026157607f821691505b6020821081036200028257634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620002d8576000816000526020600020601f850160051c81016020861015620002b35750805b601f850160051c820191505b81811015620002d457828155600101620002bf565b5050505b505050565b81516001600160401b03811115620002f957620002f962000236565b62000311816200030a84546200024c565b8462000288565b602080601f831160018114620003495760008415620003305750858301515b600019600386901b1c1916600185901b178555620002d4565b600085815260208120601f198616915b828110156200037a5788860151825594840194600190910190840162000359565b5085821015620003995787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111562000400578160001904821115620003e457620003e4620003a9565b80851615620003f257918102915b93841c9390800290620003c4565b509250929050565b6000826200041957506001620004b8565b816200042857506000620004b8565b81600181146200044157600281146200044c576200046c565b6001915050620004b8565b60ff841115620004605762000460620003a9565b50506001821b620004b8565b5060208310610133831016604e8410600b841016171562000491575081810a620004b8565b6200049d8383620003bf565b8060001904821115620004b457620004b4620003a9565b0290505b92915050565b6000620004cf60ff84168362000408565b9392505050565b8082028115828204841417620004b857620004b8620003a9565b60805160a051613d6f6200051d600039600061044e01526000818161050c01526124730152613d6f6000f3fe60806040526004361061031e5760003560e01c806392fbe481116101a3578063d2ef0795116100eb578063e985e9c51161008f578063f28ca1dd1161006c578063f28ca1dd146109ed578063f2fde38b14610a02578063f35e4a6e14610a22578063f585146d14610a4257005b8063e985e9c514610970578063efe89a14146109ab578063f2824b53146109c057005b8063db0ac1ba116100c8578063db0ac1ba146108cb578063dd62ed3e146108e0578063e0df5b6f14610918578063e942bdd21461093857005b8063d2ef07951461084e578063d50c5c8914610889578063d547cfb7146108b657005b8063afab4c8711610152578063c002d23d1161012f578063c002d23d146107e0578063c516e7c3146107fb578063c87b56dd14610819578063cdc227831461083957005b8063afab4c871461077e578063b88d4fde146107ab578063bf9559c3146107cb57005b80639d7f4ebf116101805780639d7f4ebf14610711578063a22cb4651461073e578063a9059cbb1461075e57005b806392fbe481146106ac57806395d89b41146106cc5780639b19251a146106e157005b806342842e0e116102665780636352211e1161021557806376671808116101f2578063766718081461064e5780638467be0d146106645780638bbae8fe146106775780638da5cb5b1461068c57005b80636352211e146105ec57806370a082311461060c57806374c259c61461063957005b8063504334c211610243578063504334c21461058c57806353d6fd59146105ac578063605d52eb146105cc57005b806342842e0e1461054057806348cd4cb1146105605780634f02c4201461057657005b806318160ddd116102cd57806323b872dd116102aa57806323b872dd146104a55780632b968958146104c55780632f745c59146104da578063313ce567146104fa57005b806318160ddd1461043c57806318d217c3146104705780631900d4ed1461049057005b80630e313e98116102fb5780630e313e98146103d05780631249c58b14610414578063175e53bb1461041c57005b806306fdde0314610327578063081812fc14610352578063095ea7b3146103a057005b3661032557005b005b34801561033357600080fd5b5061033c610a58565b604051610349919061321d565b60405180910390f35b34801561035e57600080fd5b5061038861036d366004613250565b6006602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610349565b3480156103ac57600080fd5b506103c06103bb366004613280565b610ae6565b6040519015158152602001610349565b3480156103dc57600080fd5b506104066103eb3660046132aa565b6001600160a01b031660009081526009602052604090205490565b604051908152602001610349565b610325610c69565b34801561042857600080fd5b50610325610437366004613250565b610c7d565b34801561044857600080fd5b506104067f000000000000000000000000000000000000000000000000000000000000000081565b34801561047c57600080fd5b5061032561048b366004613381565b610c8a565b34801561049c57600080fd5b50610325610cde565b3480156104b157600080fd5b506103256104c03660046133be565b610ce7565b3480156104d157600080fd5b50610325611271565b3480156104e657600080fd5b506104066104f5366004613280565b611309565b34801561050657600080fd5b5061052e7f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff9091168152602001610349565b34801561054c57600080fd5b5061032561055b3660046133be565b611346565b34801561056c57600080fd5b5061040660115481565b34801561058257600080fd5b5061040660035481565b34801561059857600080fd5b506103256105a73660046133fa565b611465565b3480156105b857600080fd5b506103256105c736600461345e565b6114b3565b3480156105d857600080fd5b506104066105e73660046132aa565b611515565b3480156105f857600080fd5b50610388610607366004613250565b6115dd565b34801561061857600080fd5b506104066106273660046132aa565b60046020526000908152604090205481565b34801561064557600080fd5b5061040660c881565b34801561065a57600080fd5b50610406600c5481565b610325610672366004613250565b611631565b34801561068357600080fd5b506104066116ec565b34801561069857600080fd5b50600054610388906001600160a01b031681565b3480156106b857600080fd5b506103256106c736600461349a565b61171d565b3480156106d857600080fd5b5061033c611905565b3480156106ed57600080fd5b506103c06106fc3660046132aa565b600b6020526000908152604090205460ff1681565b34801561071d57600080fd5b5061040661072c366004613250565b60136020526000908152604090205481565b34801561074a57600080fd5b5061032561075936600461345e565b611912565b34801561076a57600080fd5b506103c0610779366004613280565b61199c565b34801561078a57600080fd5b50610406610799366004613250565b60156020526000908152604090205481565b3480156107b757600080fd5b506103256107c636600461350f565b6119b0565b3480156107d757600080fd5b50610406602881565b3480156107ec57600080fd5b50610406662386f26fc1000081565b34801561080757600080fd5b5061040669054b40b1f852bda0000081565b34801561082557600080fd5b5061033c610834366004613250565b611abd565b34801561084557600080fd5b50610406611c6a565b34801561085a57600080fd5b506103c06108693660046135aa565b601460209081526000928352604080842090915290825290205460ff1681565b34801561089557600080fd5b506108a96108a43660046132aa565b611c85565b60405161034991906135d6565b3480156108c257600080fd5b5061033c611df1565b3480156108d757600080fd5b50610406611dfe565b3480156108ec57600080fd5b506104066108fb36600461361a565b600560209081526000928352604080842090915290825290205481565b34801561092457600080fd5b50610325610933366004613381565b611e20565b34801561094457600080fd5b506104066109533660046135aa565b601260209081526000928352604080842090915290825290205481565b34801561097c57600080fd5b506103c061098b36600461361a565b600760209081526000928352604080842090915290825290205460ff1681565b3480156109b757600080fd5b50610406611e70565b3480156109cc57600080fd5b506104066109db366004613250565b60166020526000908152604090205481565b3480156109f957600080fd5b5061033c611ea8565b348015610a0e57600080fd5b50610325610a1d3660046132aa565b611eb5565b348015610a2e57600080fd5b50610325610a3d366004613250565b611f9c565b348015610a4e57600080fd5b50610406600d5481565b60018054610a6590613644565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9190613644565b8015610ade5780601f10610ab357610100808354040283529160200191610ade565b820191906000526020600020905b815481529060010190602001808311610ac157829003601f168201915b505050505081565b60006003548211158015610afa5750600082115b15610c03576000828152600860205260409020546001600160a01b0316338114801590610b4b57506001600160a01b038116600090815260076020908152604080832033845290915290205460ff16155b15610b82576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008381526006602090815260409182902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038881169182179092559251868152908416917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350610c5f565b3360008181526005602090815260408083206001600160a01b03881680855290835292819020869055518581529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35b5060015b92915050565b610c71611ff6565b610c7b6001612081565b565b610c873382612185565b50565b6000546001600160a01b03163314610cce576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600f610cda82826136e7565b5050565b610c7b3361231a565b6003548111611205576000610cfa61246c565b6000838152600860205260409020549091506001600160a01b03858116911614610d50576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038316610d90576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336001600160a01b03851614801590610dcd57506001600160a01b038416600090815260076020908152604080832033845290915290205460ff16155b8015610df057506000828152600660205260409020546001600160a01b03163314155b15610e27576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0384166000908152600b602052604090205460ff16610e75576001600160a01b03841660009081526004602052604081208054839290610e6f9084906137d6565b90915550505b6001600160a01b0383166000908152600b602052604090205460ff16610eb4576001600160a01b03831660009081526004602052604090208054820190555b600082815260086020908152604080832080546001600160a01b038089167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255600684528285208054909116905587168352600990915281208054610f21906001906137d6565b81548110610f3157610f316137e9565b60009182526020808320909101546001600160a01b0388168352600982526040808420878552600a90935290922054815492935083928110610f7557610f756137e9565b60009182526020808320909101929092556001600160a01b0387168152600990915260409020805480610faa57610faa613818565b600082815260208082208301600019908101839055909201909255848252600a8152604080832054848452818420556001600160a01b03871680845260098352908320805460018181018355828652938520018790559252905461100e91906137d6565b6000848152600a602052604080822092909255905184916001600160a01b0380881692908916917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a46001600160a01b0385166000908152600b602052604090205460ff16801561109957506001600160a01b0384166000908152600b602052604090205460ff16155b156110e5576040518281526001600160a01b038516906000907fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487906020015b60405180910390a36111fe565b6001600160a01b0385166000908152600b602052604090205460ff1615801561112657506001600160a01b0384166000908152600b602052604090205460ff165b15611169576040518281526000906001600160a01b038716907fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487906020016110d8565b6001600160a01b0385166000908152600b602052604090205460ff161580156111ab57506001600160a01b0384166000908152600b602052604090205460ff16155b156111fe57836001600160a01b0316856001600160a01b03167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487846040516111f591815260200190565b60405180910390a35b5050505050565b6001600160a01b038316600090815260056020908152604080832033845290915290205460001981146112615761123c82826137d6565b6001600160a01b03851660009081526005602090815260408083203384529091529020555b6111fe8484846124a4565b505050565b6000546001600160a01b031633146112b5576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff000000000000000000000000000000000000000016815560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3565b6001600160a01b0382166000908152600960205260408120805483908110611333576113336137e9565b9060005260206000200154905092915050565b611351838383610ce7565b6001600160a01b0382163b1580159061142e57506040517f150b7a02000000000000000000000000000000000000000000000000000000008082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af11580156113e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114099190613847565b7fffffffff000000000000000000000000000000000000000000000000000000001614155b1561126c576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000546001600160a01b031633146114a9576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cda828261266d565b6000546001600160a01b031633146114f7576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80151560010361150c57610cda826000612185565b610cda8261231a565b600080806115216116ec565b905060005b818110156115d45760008181526014602090815260408083206001600160a01b038916845290915290205460ff16158015611582575060008181526012602090815260408083206001600160a01b038916845290915290205415155b156115cc57600081815260156020908152604080832054601283528184206001600160a01b038a1685529092528220546115bc9190613889565b90506115c881856138a0565b9350505b600101611526565b50909392505050565b6000818152600860205260409020546001600160a01b03168061162c576040517fc5723b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600081116116a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5175616e74697479206d7573742062652067726561746572207468616e20300060448201526064015b60405180910390fd5b6116a8611ff6565b6116b181612081565b600c5460405182815233907f5b136fb1e698389fd0ad0ee2ebe50a59bd7787f2b10321419ed20df0f9214a169060200160405180910390a350565b6000806116f7611e70565b600c5461170491906138a0565b905060288110611715576028611717565b805b91505090565b611725612686565b6000806117306116ec565b905060005b838110156118f8576000858583818110611751576117516137e9565b905060200201359050828110611793576040517f756b785700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081815260146020908152604080832033845290915290205460ff16156117e7576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000818152601260209081526040808320338452909152902054156118bd57600081815260156020908152604080832054601283528184203385529092528220546118329190613889565b905061183e81866138a0565b6000838152601460209081526040808320338085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555184815292975084927fe552a294d5b69fa9228dede48623b191598f8d38db6f7e5d7a8a8ba5c3ff769b910160405180910390a3506118ef565b6040517ff8eb54de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50600101611735565b506111fe600033846124a4565b60028054610a6590613644565b3360008181526007602090815260408083206001600160a01b0387168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60006119a93384846124a4565b9392505050565b6119bb858585610ce7565b6001600160a01b0384163b15801590611a8657506040517f150b7a0200000000000000000000000000000000000000000000000000000000808252906001600160a01b0386169063150b7a0290611a1e9033908a908990899089906004016138b3565b6020604051808303816000875af1158015611a3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a619190613847565b7fffffffff000000000000000000000000000000000000000000000000000000001614155b156111fe576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060600060108054611ace90613644565b90501115611b08576010611ae183612761565b604051602001611af2929190613998565b6040516020818303038152906040529050919050565b60008281526016602052604081205490611b2182612801565b90506000611b2e85612761565b604051602001611b3e91906139bd565b60408051601f1981840301815290829052611b5b91602001613a02565b604051602081830303815290604052600f83604051602001611b7e929190613adb565b60408051601f1981840301815290829052611b9c9291602001613b28565b6040516020818303038152906040529050600082604051602001611bc09190613b4e565b60408051601f198184030181528282018252600483527f227d5d7d000000000000000000000000000000000000000000000000000000006020848101919091529151909350611c13918591859101613b28565b60408051601f1981840301815290829052611c32918390602001613b28565b60408051601f1981840301815290829052611c4f91602001613bb9565b60405160208183030381529060405295505050505050919050565b600060c8611c76611dfe565b611c8091906138a0565b905090565b60606000805b600c54811015611d045760008181526014602090815260408083206001600160a01b038816845290915290205460ff16158015611ce9575060008181526012602090815260408083206001600160a01b038816845290915290205415155b15611cfc5781611cf881613bfe565b9250505b600101611c8b565b5060008167ffffffffffffffff811115611d2057611d206132c5565b604051908082528060200260200182016040528015611d49578160200160208202803683370190505b5090506000805b600c54811015611de75760008181526014602090815260408083206001600160a01b038a16845290915290205460ff16158015611dae575060008181526012602090815260408083206001600160a01b038a16845290915290205415155b15611ddf5780838381518110611dc657611dc66137e9565b602090810291909101015281611ddb81613bfe565b9250505b600101611d50565b5090949350505050565b60108054610a6590613644565b6000611e086116ec565b611e139060c8613889565b601154611c8091906138a0565b6000546001600160a01b03163314611e64576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6010610cda82826136e7565b6000600d544310611ea257600c5460c860115443611e8e91906137d6565b611e989190613c47565b611c8091906137d6565b50600090565b600f8054610a6590613644565b6000546001600160a01b03163314611ef9576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116611f39576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b6000546001600160a01b03163314611fe0576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6011819055611ff060c8826138a0565b600d5550565b6011544310806120065750601154155b1561203d576040517f4ef7443900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612045612686565b6028600c5403610c7b576040517fb85d46bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061209482662386f26fc10000613889565b9050803410156120d0576040517f80b6e14b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006120dc82346137d6565b600c8054600090815260126020908152604080832033845282528083208054890190559254825260139052208054850190559050801561214557604051339082156108fc029083906000818181858888f19350505050158015612143573d6000803e3d6000fd5b505b600e546040516001600160a01b039091169083156108fc029084906000818181858888f1935050505015801561217f573d6000803e3d6000fd5b50505050565b6001600160a01b0382166000908152600b602052604090205460ff16156121d8576040517fb73e95e100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0382166000908152600960205260409020548082111561222b576040517fd220db2600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0383166000908152600b6020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561227461246c565b61227e9084613889565b905060005b61228d84846137d6565b8110156122a55761229d85612d88565b600101612283565b506001600160a01b038416600090815260046020526040812080548392906122ce9084906137d6565b90915550506040518181526000906001600160a01b038616907fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e0314879060200160405180910390a350505050565b6001600160a01b0381166000908152600b602052604090205460ff1661236c576040517fd35cb30a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061237661246c565b6001600160a01b0383166000908152600960205260409020546123999190613889565b905060006123a561246c565b6001600160a01b0384166000908152600460205260409020546123c89190613c47565b905060005b818110156123e6576123de84612ee1565b6001016123cd565b506123f3600033846124a4565b506001600160a01b0383166000908152600b6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055518481523392917fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487910160405180910390a3505050565b60006124997f0000000000000000000000000000000000000000000000000000000000000000600a613d3f565b611c809060c8613889565b6000806124af61246c565b6001600160a01b038087166000818152600460205260408082205493891682529020549293509091901561250b576001600160a01b038716600090815260046020526040812080548792906125059084906137d6565b90915550505b6001600160a01b03808716600090815260046020908152604080832080548a019055928a168252600b9052205460ff16612598576001600160a01b038716600090815260046020526040812054612563908590613c47565b61256d8585613c47565b61257791906137d6565b905060005b818110156125955761258d89612d88565b60010161257c565b50505b6001600160a01b0386166000908152600b602052604090205460ff166126135760006125c48483613c47565b6001600160a01b0388166000908152600460205260409020546125e8908690613c47565b6125f291906137d6565b905060005b818110156126105761260888612ee1565b6001016125f7565b50505b856001600160a01b0316876001600160a01b03167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e0314878760405161265891815260200190565b60405180910390a35060019695505050505050565b600161267983826136e7565b50600261126c82826136e7565b600d5443101561269257565b600061269f600c546130b4565b600c8054600090815260156020908152604080832085905592548083526013825291839020548351908152908101849052929350917f469dcd0c8170c8faf3678737ed5cc64107d6d30846f97438a0feefacbed00ec2910160405180910390a26127076116ec565b600c8190557fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8016127355750565b60c861273f6116ec565b61274a9060016138a0565b6127549190613889565b601154611ff091906138a0565b6060600061276e836130f3565b600101905060008167ffffffffffffffff81111561278e5761278e6132c5565b6040519080825280601f01601f1916602001820160405280156127b8576020820181803683370190505b5090508181016020015b600019017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85049450846127c257509392505050565b606060008260405160200161281891815260200190565b60408051601f198184030181529190528051602082012090915080600061284161010083613d4e565b6040805160098082526101408201909252919250600091906020820161012080368337505060408051600980825261014082019092529293506000929150602082015b60608152602001906001900390816128845790505090506032826000815181106128b0576128b06137e9565b6020026020010181815250506040518060400160405280600581526020017f477265656e00000000000000000000000000000000000000000000000000000081525081600081518110612905576129056137e9565b6020026020010181905250602882600181518110612925576129256137e9565b6020026020010181815250506040518060400160405280600681526020017f4f72616e676500000000000000000000000000000000000000000000000000008152508160018151811061297a5761297a6137e9565b602002602001018190525060238260028151811061299a5761299a6137e9565b6020026020010181815250506040518060400160405280600381526020017f5265640000000000000000000000000000000000000000000000000000000000815250816002815181106129ef576129ef6137e9565b6020026020010181905250601f82600381518110612a0f57612a0f6137e9565b6020026020010181815250506040518060400160405280600481526020017f50696e6b0000000000000000000000000000000000000000000000000000000081525081600381518110612a6457612a646137e9565b6020026020010181905250601e82600481518110612a8457612a846137e9565b6020026020010181815250506040518060400160405280600481526020017f426c75650000000000000000000000000000000000000000000000000000000081525081600481518110612ad957612ad96137e9565b6020026020010181905250601982600581518110612af957612af96137e9565b6020026020010181815250506040518060400160405280600481526020017f5465616c0000000000000000000000000000000000000000000000000000000081525081600581518110612b4e57612b4e6137e9565b6020026020010181905250601482600681518110612b6e57612b6e6137e9565b6020026020010181815250506040518060400160405280600681526020017f507572706c65000000000000000000000000000000000000000000000000000081525081600681518110612bc357612bc36137e9565b6020026020010181905250600f82600781518110612be357612be36137e9565b6020026020010181815250506040518060400160405280600881526020017f4c6176656e64657200000000000000000000000000000000000000000000000081525081600781518110612c3857612c386137e9565b6020026020010181905250600a82600881518110612c5857612c586137e9565b6020026020010181815250506040518060400160405280600481526020017f476f6c640000000000000000000000000000000000000000000000000000000081525081600881518110612cad57612cad6137e9565b60200260200101819052506000805b8351811015612d2557838181518110612cd757612cd76137e9565b602002602001015182612cea91906138a0565b915081851015612d1d57828181518110612d0657612d066137e9565b602002602001015198505050505050505050919050565b600101612cbc565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f496e76616c69642072616e646f6d206e756d6265722070726f76696465642e006044820152606401611697565b6001600160a01b038116612dc8576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03811660009081526009602052604081208054612dee906001906137d6565b81548110612dfe57612dfe6137e9565b9060005260206000200154905060096000836001600160a01b03166001600160a01b03168152602001908152602001600020805480612e3f57612e3f613818565b600082815260208082208301600019908101839055909201909255828252600a815260408083208390556008825280832080547fffffffffffffffffffffffff000000000000000000000000000000000000000090811690915560069092528083208054909216909155518291906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6001600160a01b038116612f51576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f496e76616c6964526563697069656e74000000000000000000000000000000006044820152606401611697565b60038054600101908190556000818152600860205260409020546001600160a01b031615612fdb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f416c7265616479457869737473000000000000000000000000000000000000006044820152606401611697565b600081815260086020908152604080832080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03871690811790915580845260098352908320805460018181018355828652938520018590559252905461304b91906137d6565b6000828152600a602052604080822092909255905182916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4600061309d826131d5565b600092835260166020526040909220919091555050565b600081815260136020526040812054156130eb576000828152601360205260408120546119a99069054b40b1f852bda00000613c47565b506000919050565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061313c577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef81000000008310613168576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061318657662386f26fc10000830492506010015b6305f5e100831061319e576305f5e100830492506008015b61271083106131b257612710830492506004015b606483106131c4576064830492506002015b600a8310610c635760010192915050565b600081426131e46001436137d6565b6131ef9190406138a0565b610c6391906138a0565b60005b838110156132145781810151838201526020016131fc565b50506000910152565b602081526000825180602084015261323c8160408501602087016131f9565b601f01601f19169190910160400192915050565b60006020828403121561326257600080fd5b5035919050565b80356001600160a01b038116811461162c57600080fd5b6000806040838503121561329357600080fd5b61329c83613269565b946020939093013593505050565b6000602082840312156132bc57600080fd5b6119a982613269565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261330557600080fd5b813567ffffffffffffffff80821115613320576133206132c5565b604051601f8301601f19908116603f01168101908282118183101715613348576133486132c5565b8160405283815286602085880101111561336157600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561339357600080fd5b813567ffffffffffffffff8111156133aa57600080fd5b6133b6848285016132f4565b949350505050565b6000806000606084860312156133d357600080fd5b6133dc84613269565b92506133ea60208501613269565b9150604084013590509250925092565b6000806040838503121561340d57600080fd5b823567ffffffffffffffff8082111561342557600080fd5b613431868387016132f4565b9350602085013591508082111561344757600080fd5b50613454858286016132f4565b9150509250929050565b6000806040838503121561347157600080fd5b61347a83613269565b91506020830135801515811461348f57600080fd5b809150509250929050565b600080602083850312156134ad57600080fd5b823567ffffffffffffffff808211156134c557600080fd5b818501915085601f8301126134d957600080fd5b8135818111156134e857600080fd5b8660208260051b85010111156134fd57600080fd5b60209290920196919550909350505050565b60008060008060006080868803121561352757600080fd5b61353086613269565b945061353e60208701613269565b935060408601359250606086013567ffffffffffffffff8082111561356257600080fd5b818801915088601f83011261357657600080fd5b81358181111561358557600080fd5b89602082850101111561359757600080fd5b9699959850939650602001949392505050565b600080604083850312156135bd57600080fd5b823591506135cd60208401613269565b90509250929050565b6020808252825182820181905260009190848201906040850190845b8181101561360e578351835292840192918401916001016135f2565b50909695505050505050565b6000806040838503121561362d57600080fd5b61363683613269565b91506135cd60208401613269565b600181811c9082168061365857607f821691505b602082108103613691577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f82111561126c576000816000526020600020601f850160051c810160208610156136c05750805b601f850160051c820191505b818110156136df578281556001016136cc565b505050505050565b815167ffffffffffffffff811115613701576137016132c5565b6137158161370f8454613644565b84613697565b602080601f83116001811461374a57600084156137325750858301515b600019600386901b1c1916600185901b1785556136df565b600085815260208120601f198616915b828110156137795788860151825594840194600190910190840161375a565b50858210156137975787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81810381811115610c6357610c636137a7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60006020828403121561385957600080fd5b81517fffffffff00000000000000000000000000000000000000000000000000000000811681146119a957600080fd5b8082028115828204841417610c6357610c636137a7565b80820180821115610c6357610c636137a7565b60006001600160a01b03808816835280871660208401525084604083015260806060830152826080830152828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b6000815461391481613644565b6001828116801561392c576001811461395f5761398e565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008416875282151583028701945061398e565b8560005260208060002060005b858110156139855781548a82015290840190820161396c565b50505082870194505b5050505092915050565b60006139a48285613907565b83516139b48183602088016131f9565b01949350505050565b7f7b226e616d65223a20224a656c6c7920230000000000000000000000000000008152600082516139f58160118501602087016131f9565b9190910160110192915050565b60008251613a148184602087016131f9565b7f222c226465736372697074696f6e223a224120636f6c6c656374696f6e206f669201918252507f2031302c303030205265706c6963616e747320656e61626c656420627920455260208201527f43373631362c20616e206578706572696d656e74616c20746f6b656e2073746160408201527f6e646172642e222c2265787465726e616c5f75726c223a2268747470733a2f2f60608201527f6a656c6c792e746f70222c22696d616765223a220000000000000000000000006080820152609401919050565b6000613ae78285613907565b8351613af78183602088016131f9565b7f2e6a7067000000000000000000000000000000000000000000000000000000009101908152600401949350505050565b60008351613b3a8184602088016131f9565b8351908301906139b48183602088016131f9565b7f222c2261747472696275746573223a5b7b2274726169745f74797065223a224381527f6f6c6f72222c2276616c7565223a220000000000000000000000000000000000602082015260008251613bac81602f8501602087016131f9565b91909101602f0192915050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c0000000000815260008251613bf181601b8501602087016131f9565b91909101601b0192915050565b60006000198203613c1157613c116137a7565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082613c5657613c56613c18565b500490565b600181815b80851115613c96578160001904821115613c7c57613c7c6137a7565b80851615613c8957918102915b93841c9390800290613c60565b509250929050565b600082613cad57506001610c63565b81613cba57506000610c63565b8160018114613cd05760028114613cda57613cf6565b6001915050610c63565b60ff841115613ceb57613ceb6137a7565b50506001821b610c63565b5060208310610133831016604e8410600b8410161715613d19575081810a610c63565b613d238383613c5b565b8060001904821115613d3757613d376137a7565b029392505050565b60006119a960ff841683613c9e565b600082613d5d57613d5d613c18565b50069056fea164736f6c6343000817000a00000000000000000000000084c1c60d2e973ef87b1fd175bb9bf1e4e6b8cbc7000000000000000000000000cfc947ff43c8d9c57a82d806ca1d41d8cb999032
Deployed Bytecode
0x60806040526004361061031e5760003560e01c806392fbe481116101a3578063d2ef0795116100eb578063e985e9c51161008f578063f28ca1dd1161006c578063f28ca1dd146109ed578063f2fde38b14610a02578063f35e4a6e14610a22578063f585146d14610a4257005b8063e985e9c514610970578063efe89a14146109ab578063f2824b53146109c057005b8063db0ac1ba116100c8578063db0ac1ba146108cb578063dd62ed3e146108e0578063e0df5b6f14610918578063e942bdd21461093857005b8063d2ef07951461084e578063d50c5c8914610889578063d547cfb7146108b657005b8063afab4c8711610152578063c002d23d1161012f578063c002d23d146107e0578063c516e7c3146107fb578063c87b56dd14610819578063cdc227831461083957005b8063afab4c871461077e578063b88d4fde146107ab578063bf9559c3146107cb57005b80639d7f4ebf116101805780639d7f4ebf14610711578063a22cb4651461073e578063a9059cbb1461075e57005b806392fbe481146106ac57806395d89b41146106cc5780639b19251a146106e157005b806342842e0e116102665780636352211e1161021557806376671808116101f2578063766718081461064e5780638467be0d146106645780638bbae8fe146106775780638da5cb5b1461068c57005b80636352211e146105ec57806370a082311461060c57806374c259c61461063957005b8063504334c211610243578063504334c21461058c57806353d6fd59146105ac578063605d52eb146105cc57005b806342842e0e1461054057806348cd4cb1146105605780634f02c4201461057657005b806318160ddd116102cd57806323b872dd116102aa57806323b872dd146104a55780632b968958146104c55780632f745c59146104da578063313ce567146104fa57005b806318160ddd1461043c57806318d217c3146104705780631900d4ed1461049057005b80630e313e98116102fb5780630e313e98146103d05780631249c58b14610414578063175e53bb1461041c57005b806306fdde0314610327578063081812fc14610352578063095ea7b3146103a057005b3661032557005b005b34801561033357600080fd5b5061033c610a58565b604051610349919061321d565b60405180910390f35b34801561035e57600080fd5b5061038861036d366004613250565b6006602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610349565b3480156103ac57600080fd5b506103c06103bb366004613280565b610ae6565b6040519015158152602001610349565b3480156103dc57600080fd5b506104066103eb3660046132aa565b6001600160a01b031660009081526009602052604090205490565b604051908152602001610349565b610325610c69565b34801561042857600080fd5b50610325610437366004613250565b610c7d565b34801561044857600080fd5b506104067f00000000000000000000000000000000000000000000021e19e0c9bab240000081565b34801561047c57600080fd5b5061032561048b366004613381565b610c8a565b34801561049c57600080fd5b50610325610cde565b3480156104b157600080fd5b506103256104c03660046133be565b610ce7565b3480156104d157600080fd5b50610325611271565b3480156104e657600080fd5b506104066104f5366004613280565b611309565b34801561050657600080fd5b5061052e7f000000000000000000000000000000000000000000000000000000000000001281565b60405160ff9091168152602001610349565b34801561054c57600080fd5b5061032561055b3660046133be565b611346565b34801561056c57600080fd5b5061040660115481565b34801561058257600080fd5b5061040660035481565b34801561059857600080fd5b506103256105a73660046133fa565b611465565b3480156105b857600080fd5b506103256105c736600461345e565b6114b3565b3480156105d857600080fd5b506104066105e73660046132aa565b611515565b3480156105f857600080fd5b50610388610607366004613250565b6115dd565b34801561061857600080fd5b506104066106273660046132aa565b60046020526000908152604090205481565b34801561064557600080fd5b5061040660c881565b34801561065a57600080fd5b50610406600c5481565b610325610672366004613250565b611631565b34801561068357600080fd5b506104066116ec565b34801561069857600080fd5b50600054610388906001600160a01b031681565b3480156106b857600080fd5b506103256106c736600461349a565b61171d565b3480156106d857600080fd5b5061033c611905565b3480156106ed57600080fd5b506103c06106fc3660046132aa565b600b6020526000908152604090205460ff1681565b34801561071d57600080fd5b5061040661072c366004613250565b60136020526000908152604090205481565b34801561074a57600080fd5b5061032561075936600461345e565b611912565b34801561076a57600080fd5b506103c0610779366004613280565b61199c565b34801561078a57600080fd5b50610406610799366004613250565b60156020526000908152604090205481565b3480156107b757600080fd5b506103256107c636600461350f565b6119b0565b3480156107d757600080fd5b50610406602881565b3480156107ec57600080fd5b50610406662386f26fc1000081565b34801561080757600080fd5b5061040669054b40b1f852bda0000081565b34801561082557600080fd5b5061033c610834366004613250565b611abd565b34801561084557600080fd5b50610406611c6a565b34801561085a57600080fd5b506103c06108693660046135aa565b601460209081526000928352604080842090915290825290205460ff1681565b34801561089557600080fd5b506108a96108a43660046132aa565b611c85565b60405161034991906135d6565b3480156108c257600080fd5b5061033c611df1565b3480156108d757600080fd5b50610406611dfe565b3480156108ec57600080fd5b506104066108fb36600461361a565b600560209081526000928352604080842090915290825290205481565b34801561092457600080fd5b50610325610933366004613381565b611e20565b34801561094457600080fd5b506104066109533660046135aa565b601260209081526000928352604080842090915290825290205481565b34801561097c57600080fd5b506103c061098b36600461361a565b600760209081526000928352604080842090915290825290205460ff1681565b3480156109b757600080fd5b50610406611e70565b3480156109cc57600080fd5b506104066109db366004613250565b60166020526000908152604090205481565b3480156109f957600080fd5b5061033c611ea8565b348015610a0e57600080fd5b50610325610a1d3660046132aa565b611eb5565b348015610a2e57600080fd5b50610325610a3d366004613250565b611f9c565b348015610a4e57600080fd5b50610406600d5481565b60018054610a6590613644565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9190613644565b8015610ade5780601f10610ab357610100808354040283529160200191610ade565b820191906000526020600020905b815481529060010190602001808311610ac157829003601f168201915b505050505081565b60006003548211158015610afa5750600082115b15610c03576000828152600860205260409020546001600160a01b0316338114801590610b4b57506001600160a01b038116600090815260076020908152604080832033845290915290205460ff16155b15610b82576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008381526006602090815260409182902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038881169182179092559251868152908416917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350610c5f565b3360008181526005602090815260408083206001600160a01b03881680855290835292819020869055518581529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35b5060015b92915050565b610c71611ff6565b610c7b6001612081565b565b610c873382612185565b50565b6000546001600160a01b03163314610cce576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600f610cda82826136e7565b5050565b610c7b3361231a565b6003548111611205576000610cfa61246c565b6000838152600860205260409020549091506001600160a01b03858116911614610d50576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038316610d90576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336001600160a01b03851614801590610dcd57506001600160a01b038416600090815260076020908152604080832033845290915290205460ff16155b8015610df057506000828152600660205260409020546001600160a01b03163314155b15610e27576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0384166000908152600b602052604090205460ff16610e75576001600160a01b03841660009081526004602052604081208054839290610e6f9084906137d6565b90915550505b6001600160a01b0383166000908152600b602052604090205460ff16610eb4576001600160a01b03831660009081526004602052604090208054820190555b600082815260086020908152604080832080546001600160a01b038089167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255600684528285208054909116905587168352600990915281208054610f21906001906137d6565b81548110610f3157610f316137e9565b60009182526020808320909101546001600160a01b0388168352600982526040808420878552600a90935290922054815492935083928110610f7557610f756137e9565b60009182526020808320909101929092556001600160a01b0387168152600990915260409020805480610faa57610faa613818565b600082815260208082208301600019908101839055909201909255848252600a8152604080832054848452818420556001600160a01b03871680845260098352908320805460018181018355828652938520018790559252905461100e91906137d6565b6000848152600a602052604080822092909255905184916001600160a01b0380881692908916917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a46001600160a01b0385166000908152600b602052604090205460ff16801561109957506001600160a01b0384166000908152600b602052604090205460ff16155b156110e5576040518281526001600160a01b038516906000907fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487906020015b60405180910390a36111fe565b6001600160a01b0385166000908152600b602052604090205460ff1615801561112657506001600160a01b0384166000908152600b602052604090205460ff165b15611169576040518281526000906001600160a01b038716907fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487906020016110d8565b6001600160a01b0385166000908152600b602052604090205460ff161580156111ab57506001600160a01b0384166000908152600b602052604090205460ff16155b156111fe57836001600160a01b0316856001600160a01b03167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487846040516111f591815260200190565b60405180910390a35b5050505050565b6001600160a01b038316600090815260056020908152604080832033845290915290205460001981146112615761123c82826137d6565b6001600160a01b03851660009081526005602090815260408083203384529091529020555b6111fe8484846124a4565b505050565b6000546001600160a01b031633146112b5576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff000000000000000000000000000000000000000016815560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3565b6001600160a01b0382166000908152600960205260408120805483908110611333576113336137e9565b9060005260206000200154905092915050565b611351838383610ce7565b6001600160a01b0382163b1580159061142e57506040517f150b7a02000000000000000000000000000000000000000000000000000000008082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af11580156113e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114099190613847565b7fffffffff000000000000000000000000000000000000000000000000000000001614155b1561126c576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000546001600160a01b031633146114a9576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cda828261266d565b6000546001600160a01b031633146114f7576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80151560010361150c57610cda826000612185565b610cda8261231a565b600080806115216116ec565b905060005b818110156115d45760008181526014602090815260408083206001600160a01b038916845290915290205460ff16158015611582575060008181526012602090815260408083206001600160a01b038916845290915290205415155b156115cc57600081815260156020908152604080832054601283528184206001600160a01b038a1685529092528220546115bc9190613889565b90506115c881856138a0565b9350505b600101611526565b50909392505050565b6000818152600860205260409020546001600160a01b03168061162c576040517fc5723b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600081116116a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5175616e74697479206d7573742062652067726561746572207468616e20300060448201526064015b60405180910390fd5b6116a8611ff6565b6116b181612081565b600c5460405182815233907f5b136fb1e698389fd0ad0ee2ebe50a59bd7787f2b10321419ed20df0f9214a169060200160405180910390a350565b6000806116f7611e70565b600c5461170491906138a0565b905060288110611715576028611717565b805b91505090565b611725612686565b6000806117306116ec565b905060005b838110156118f8576000858583818110611751576117516137e9565b905060200201359050828110611793576040517f756b785700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081815260146020908152604080832033845290915290205460ff16156117e7576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000818152601260209081526040808320338452909152902054156118bd57600081815260156020908152604080832054601283528184203385529092528220546118329190613889565b905061183e81866138a0565b6000838152601460209081526040808320338085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555184815292975084927fe552a294d5b69fa9228dede48623b191598f8d38db6f7e5d7a8a8ba5c3ff769b910160405180910390a3506118ef565b6040517ff8eb54de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50600101611735565b506111fe600033846124a4565b60028054610a6590613644565b3360008181526007602090815260408083206001600160a01b0387168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60006119a93384846124a4565b9392505050565b6119bb858585610ce7565b6001600160a01b0384163b15801590611a8657506040517f150b7a0200000000000000000000000000000000000000000000000000000000808252906001600160a01b0386169063150b7a0290611a1e9033908a908990899089906004016138b3565b6020604051808303816000875af1158015611a3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a619190613847565b7fffffffff000000000000000000000000000000000000000000000000000000001614155b156111fe576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060600060108054611ace90613644565b90501115611b08576010611ae183612761565b604051602001611af2929190613998565b6040516020818303038152906040529050919050565b60008281526016602052604081205490611b2182612801565b90506000611b2e85612761565b604051602001611b3e91906139bd565b60408051601f1981840301815290829052611b5b91602001613a02565b604051602081830303815290604052600f83604051602001611b7e929190613adb565b60408051601f1981840301815290829052611b9c9291602001613b28565b6040516020818303038152906040529050600082604051602001611bc09190613b4e565b60408051601f198184030181528282018252600483527f227d5d7d000000000000000000000000000000000000000000000000000000006020848101919091529151909350611c13918591859101613b28565b60408051601f1981840301815290829052611c32918390602001613b28565b60408051601f1981840301815290829052611c4f91602001613bb9565b60405160208183030381529060405295505050505050919050565b600060c8611c76611dfe565b611c8091906138a0565b905090565b60606000805b600c54811015611d045760008181526014602090815260408083206001600160a01b038816845290915290205460ff16158015611ce9575060008181526012602090815260408083206001600160a01b038816845290915290205415155b15611cfc5781611cf881613bfe565b9250505b600101611c8b565b5060008167ffffffffffffffff811115611d2057611d206132c5565b604051908082528060200260200182016040528015611d49578160200160208202803683370190505b5090506000805b600c54811015611de75760008181526014602090815260408083206001600160a01b038a16845290915290205460ff16158015611dae575060008181526012602090815260408083206001600160a01b038a16845290915290205415155b15611ddf5780838381518110611dc657611dc66137e9565b602090810291909101015281611ddb81613bfe565b9250505b600101611d50565b5090949350505050565b60108054610a6590613644565b6000611e086116ec565b611e139060c8613889565b601154611c8091906138a0565b6000546001600160a01b03163314611e64576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6010610cda82826136e7565b6000600d544310611ea257600c5460c860115443611e8e91906137d6565b611e989190613c47565b611c8091906137d6565b50600090565b600f8054610a6590613644565b6000546001600160a01b03163314611ef9576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116611f39576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b6000546001600160a01b03163314611fe0576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6011819055611ff060c8826138a0565b600d5550565b6011544310806120065750601154155b1561203d576040517f4ef7443900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612045612686565b6028600c5403610c7b576040517fb85d46bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061209482662386f26fc10000613889565b9050803410156120d0576040517f80b6e14b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006120dc82346137d6565b600c8054600090815260126020908152604080832033845282528083208054890190559254825260139052208054850190559050801561214557604051339082156108fc029083906000818181858888f19350505050158015612143573d6000803e3d6000fd5b505b600e546040516001600160a01b039091169083156108fc029084906000818181858888f1935050505015801561217f573d6000803e3d6000fd5b50505050565b6001600160a01b0382166000908152600b602052604090205460ff16156121d8576040517fb73e95e100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0382166000908152600960205260409020548082111561222b576040517fd220db2600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0383166000908152600b6020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561227461246c565b61227e9084613889565b905060005b61228d84846137d6565b8110156122a55761229d85612d88565b600101612283565b506001600160a01b038416600090815260046020526040812080548392906122ce9084906137d6565b90915550506040518181526000906001600160a01b038616907fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e0314879060200160405180910390a350505050565b6001600160a01b0381166000908152600b602052604090205460ff1661236c576040517fd35cb30a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061237661246c565b6001600160a01b0383166000908152600960205260409020546123999190613889565b905060006123a561246c565b6001600160a01b0384166000908152600460205260409020546123c89190613c47565b905060005b818110156123e6576123de84612ee1565b6001016123cd565b506123f3600033846124a4565b506001600160a01b0383166000908152600b6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055518481523392917fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487910160405180910390a3505050565b60006124997f0000000000000000000000000000000000000000000000000000000000000012600a613d3f565b611c809060c8613889565b6000806124af61246c565b6001600160a01b038087166000818152600460205260408082205493891682529020549293509091901561250b576001600160a01b038716600090815260046020526040812080548792906125059084906137d6565b90915550505b6001600160a01b03808716600090815260046020908152604080832080548a019055928a168252600b9052205460ff16612598576001600160a01b038716600090815260046020526040812054612563908590613c47565b61256d8585613c47565b61257791906137d6565b905060005b818110156125955761258d89612d88565b60010161257c565b50505b6001600160a01b0386166000908152600b602052604090205460ff166126135760006125c48483613c47565b6001600160a01b0388166000908152600460205260409020546125e8908690613c47565b6125f291906137d6565b905060005b818110156126105761260888612ee1565b6001016125f7565b50505b856001600160a01b0316876001600160a01b03167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e0314878760405161265891815260200190565b60405180910390a35060019695505050505050565b600161267983826136e7565b50600261126c82826136e7565b600d5443101561269257565b600061269f600c546130b4565b600c8054600090815260156020908152604080832085905592548083526013825291839020548351908152908101849052929350917f469dcd0c8170c8faf3678737ed5cc64107d6d30846f97438a0feefacbed00ec2910160405180910390a26127076116ec565b600c8190557fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8016127355750565b60c861273f6116ec565b61274a9060016138a0565b6127549190613889565b601154611ff091906138a0565b6060600061276e836130f3565b600101905060008167ffffffffffffffff81111561278e5761278e6132c5565b6040519080825280601f01601f1916602001820160405280156127b8576020820181803683370190505b5090508181016020015b600019017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85049450846127c257509392505050565b606060008260405160200161281891815260200190565b60408051601f198184030181529190528051602082012090915080600061284161010083613d4e565b6040805160098082526101408201909252919250600091906020820161012080368337505060408051600980825261014082019092529293506000929150602082015b60608152602001906001900390816128845790505090506032826000815181106128b0576128b06137e9565b6020026020010181815250506040518060400160405280600581526020017f477265656e00000000000000000000000000000000000000000000000000000081525081600081518110612905576129056137e9565b6020026020010181905250602882600181518110612925576129256137e9565b6020026020010181815250506040518060400160405280600681526020017f4f72616e676500000000000000000000000000000000000000000000000000008152508160018151811061297a5761297a6137e9565b602002602001018190525060238260028151811061299a5761299a6137e9565b6020026020010181815250506040518060400160405280600381526020017f5265640000000000000000000000000000000000000000000000000000000000815250816002815181106129ef576129ef6137e9565b6020026020010181905250601f82600381518110612a0f57612a0f6137e9565b6020026020010181815250506040518060400160405280600481526020017f50696e6b0000000000000000000000000000000000000000000000000000000081525081600381518110612a6457612a646137e9565b6020026020010181905250601e82600481518110612a8457612a846137e9565b6020026020010181815250506040518060400160405280600481526020017f426c75650000000000000000000000000000000000000000000000000000000081525081600481518110612ad957612ad96137e9565b6020026020010181905250601982600581518110612af957612af96137e9565b6020026020010181815250506040518060400160405280600481526020017f5465616c0000000000000000000000000000000000000000000000000000000081525081600581518110612b4e57612b4e6137e9565b6020026020010181905250601482600681518110612b6e57612b6e6137e9565b6020026020010181815250506040518060400160405280600681526020017f507572706c65000000000000000000000000000000000000000000000000000081525081600681518110612bc357612bc36137e9565b6020026020010181905250600f82600781518110612be357612be36137e9565b6020026020010181815250506040518060400160405280600881526020017f4c6176656e64657200000000000000000000000000000000000000000000000081525081600781518110612c3857612c386137e9565b6020026020010181905250600a82600881518110612c5857612c586137e9565b6020026020010181815250506040518060400160405280600481526020017f476f6c640000000000000000000000000000000000000000000000000000000081525081600881518110612cad57612cad6137e9565b60200260200101819052506000805b8351811015612d2557838181518110612cd757612cd76137e9565b602002602001015182612cea91906138a0565b915081851015612d1d57828181518110612d0657612d066137e9565b602002602001015198505050505050505050919050565b600101612cbc565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f496e76616c69642072616e646f6d206e756d6265722070726f76696465642e006044820152606401611697565b6001600160a01b038116612dc8576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03811660009081526009602052604081208054612dee906001906137d6565b81548110612dfe57612dfe6137e9565b9060005260206000200154905060096000836001600160a01b03166001600160a01b03168152602001908152602001600020805480612e3f57612e3f613818565b600082815260208082208301600019908101839055909201909255828252600a815260408083208390556008825280832080547fffffffffffffffffffffffff000000000000000000000000000000000000000090811690915560069092528083208054909216909155518291906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6001600160a01b038116612f51576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f496e76616c6964526563697069656e74000000000000000000000000000000006044820152606401611697565b60038054600101908190556000818152600860205260409020546001600160a01b031615612fdb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f416c7265616479457869737473000000000000000000000000000000000000006044820152606401611697565b600081815260086020908152604080832080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03871690811790915580845260098352908320805460018181018355828652938520018590559252905461304b91906137d6565b6000828152600a602052604080822092909255905182916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4600061309d826131d5565b600092835260166020526040909220919091555050565b600081815260136020526040812054156130eb576000828152601360205260408120546119a99069054b40b1f852bda00000613c47565b506000919050565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061313c577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef81000000008310613168576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061318657662386f26fc10000830492506010015b6305f5e100831061319e576305f5e100830492506008015b61271083106131b257612710830492506004015b606483106131c4576064830492506002015b600a8310610c635760010192915050565b600081426131e46001436137d6565b6131ef9190406138a0565b610c6391906138a0565b60005b838110156132145781810151838201526020016131fc565b50506000910152565b602081526000825180602084015261323c8160408501602087016131f9565b601f01601f19169190910160400192915050565b60006020828403121561326257600080fd5b5035919050565b80356001600160a01b038116811461162c57600080fd5b6000806040838503121561329357600080fd5b61329c83613269565b946020939093013593505050565b6000602082840312156132bc57600080fd5b6119a982613269565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261330557600080fd5b813567ffffffffffffffff80821115613320576133206132c5565b604051601f8301601f19908116603f01168101908282118183101715613348576133486132c5565b8160405283815286602085880101111561336157600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561339357600080fd5b813567ffffffffffffffff8111156133aa57600080fd5b6133b6848285016132f4565b949350505050565b6000806000606084860312156133d357600080fd5b6133dc84613269565b92506133ea60208501613269565b9150604084013590509250925092565b6000806040838503121561340d57600080fd5b823567ffffffffffffffff8082111561342557600080fd5b613431868387016132f4565b9350602085013591508082111561344757600080fd5b50613454858286016132f4565b9150509250929050565b6000806040838503121561347157600080fd5b61347a83613269565b91506020830135801515811461348f57600080fd5b809150509250929050565b600080602083850312156134ad57600080fd5b823567ffffffffffffffff808211156134c557600080fd5b818501915085601f8301126134d957600080fd5b8135818111156134e857600080fd5b8660208260051b85010111156134fd57600080fd5b60209290920196919550909350505050565b60008060008060006080868803121561352757600080fd5b61353086613269565b945061353e60208701613269565b935060408601359250606086013567ffffffffffffffff8082111561356257600080fd5b818801915088601f83011261357657600080fd5b81358181111561358557600080fd5b89602082850101111561359757600080fd5b9699959850939650602001949392505050565b600080604083850312156135bd57600080fd5b823591506135cd60208401613269565b90509250929050565b6020808252825182820181905260009190848201906040850190845b8181101561360e578351835292840192918401916001016135f2565b50909695505050505050565b6000806040838503121561362d57600080fd5b61363683613269565b91506135cd60208401613269565b600181811c9082168061365857607f821691505b602082108103613691577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f82111561126c576000816000526020600020601f850160051c810160208610156136c05750805b601f850160051c820191505b818110156136df578281556001016136cc565b505050505050565b815167ffffffffffffffff811115613701576137016132c5565b6137158161370f8454613644565b84613697565b602080601f83116001811461374a57600084156137325750858301515b600019600386901b1c1916600185901b1785556136df565b600085815260208120601f198616915b828110156137795788860151825594840194600190910190840161375a565b50858210156137975787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81810381811115610c6357610c636137a7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60006020828403121561385957600080fd5b81517fffffffff00000000000000000000000000000000000000000000000000000000811681146119a957600080fd5b8082028115828204841417610c6357610c636137a7565b80820180821115610c6357610c636137a7565b60006001600160a01b03808816835280871660208401525084604083015260806060830152826080830152828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b6000815461391481613644565b6001828116801561392c576001811461395f5761398e565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008416875282151583028701945061398e565b8560005260208060002060005b858110156139855781548a82015290840190820161396c565b50505082870194505b5050505092915050565b60006139a48285613907565b83516139b48183602088016131f9565b01949350505050565b7f7b226e616d65223a20224a656c6c7920230000000000000000000000000000008152600082516139f58160118501602087016131f9565b9190910160110192915050565b60008251613a148184602087016131f9565b7f222c226465736372697074696f6e223a224120636f6c6c656374696f6e206f669201918252507f2031302c303030205265706c6963616e747320656e61626c656420627920455260208201527f43373631362c20616e206578706572696d656e74616c20746f6b656e2073746160408201527f6e646172642e222c2265787465726e616c5f75726c223a2268747470733a2f2f60608201527f6a656c6c792e746f70222c22696d616765223a220000000000000000000000006080820152609401919050565b6000613ae78285613907565b8351613af78183602088016131f9565b7f2e6a7067000000000000000000000000000000000000000000000000000000009101908152600401949350505050565b60008351613b3a8184602088016131f9565b8351908301906139b48183602088016131f9565b7f222c2261747472696275746573223a5b7b2274726169745f74797065223a224381527f6f6c6f72222c2276616c7565223a220000000000000000000000000000000000602082015260008251613bac81602f8501602087016131f9565b91909101602f0192915050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c0000000000815260008251613bf181601b8501602087016131f9565b91909101601b0192915050565b60006000198203613c1157613c116137a7565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082613c5657613c56613c18565b500490565b600181815b80851115613c96578160001904821115613c7c57613c7c6137a7565b80851615613c8957918102915b93841c9390800290613c60565b509250929050565b600082613cad57506001610c63565b81613cba57506000610c63565b8160018114613cd05760028114613cda57613cf6565b6001915050610c63565b60ff841115613ceb57613ceb6137a7565b50506001821b610c63565b5060208310610133831016604e8410600b8410161715613d19575081810a610c63565b613d238383613c5b565b8060001904821115613d3757613d376137a7565b029392505050565b60006119a960ff841683613c9e565b600082613d5d57613d5d613c18565b50069056fea164736f6c6343000817000a
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000084c1c60d2e973ef87b1fd175bb9bf1e4e6b8cbc7000000000000000000000000cfc947ff43c8d9c57a82d806ca1d41d8cb999032
-----Decoded View---------------
Arg [0] : teamAddress_ (address): 0x84c1c60d2E973EF87B1Fd175bB9BF1E4e6B8cbC7
Arg [1] : _owner (address): 0xcFC947Ff43c8d9c57a82D806Ca1D41d8cb999032
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000084c1c60d2e973ef87b1fd175bb9bf1e4e6b8cbc7
Arg [1] : 000000000000000000000000cfc947ff43c8d9c57a82d806ca1d41d8cb999032
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.