Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 5,390 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Public Mint | 16306673 | 731 days ago | IN | 0 ETH | 0.00060418 | ||||
Whitelist Mint | 16276877 | 735 days ago | IN | 0 ETH | 0.00065063 | ||||
Whitelist Mint | 16276877 | 735 days ago | IN | 0 ETH | 0.00065063 | ||||
Whitelist Mint | 16275399 | 735 days ago | IN | 0 ETH | 0.00043538 | ||||
Whitelist Mint | 16266209 | 737 days ago | IN | 0 ETH | 0.00034984 | ||||
Public Mint | 16250687 | 739 days ago | IN | 0 ETH | 0.0004813 | ||||
Public Mint | 16249923 | 739 days ago | IN | 0 ETH | 0.00048582 | ||||
Public Mint | 16249767 | 739 days ago | IN | 0 ETH | 0.00036022 | ||||
Whitelist Mint | 16249495 | 739 days ago | IN | 0 ETH | 0.00038075 | ||||
Whitelist Mint | 16249470 | 739 days ago | IN | 0 ETH | 0.0006833 | ||||
Public Mint | 16249399 | 739 days ago | IN | 0 ETH | 0.00077935 | ||||
Public Mint | 16249262 | 739 days ago | IN | 0 ETH | 0.00061082 | ||||
Public Mint | 16249245 | 739 days ago | IN | 0 ETH | 0.00054015 | ||||
Whitelist Mint | 16249245 | 739 days ago | IN | 0 ETH | 0.00047491 | ||||
Whitelist Mint | 16249245 | 739 days ago | IN | 0 ETH | 0.00047491 | ||||
Whitelist Mint | 16249244 | 739 days ago | IN | 0 ETH | 0.000491 | ||||
Public Mint | 16249241 | 739 days ago | IN | 0 ETH | 0.00057616 | ||||
Public Mint | 16249241 | 739 days ago | IN | 0 ETH | 0.00057596 | ||||
Public Mint | 16249241 | 739 days ago | IN | 0 ETH | 0.00057635 | ||||
Public Mint | 16249215 | 739 days ago | IN | 0 ETH | 0.00061217 | ||||
Public Mint | 16249215 | 739 days ago | IN | 0 ETH | 0.00061196 | ||||
Public Mint | 16249213 | 739 days ago | IN | 0 ETH | 0.00064796 | ||||
Public Mint | 16249213 | 739 days ago | IN | 0 ETH | 0.00064839 | ||||
Whitelist Mint | 16249213 | 739 days ago | IN | 0 ETH | 0.00056989 | ||||
Whitelist Mint | 16249213 | 739 days ago | IN | 0 ETH | 0.00058097 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
16249085 | 739 days ago | 0.01111377 ETH |
Loading...
Loading
Contract Name:
PacificRimPaymentContract
Compiler Version
v0.8.13+commit.abaa5c0e
Optimization Enabled:
Yes with 200 runs
Other Settings:
byzantium EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/utils/math/SafeMath.sol"; import "@openzeppelin/contracts/access/AccessControl.sol"; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; interface IERC721 { function mint(address to, uint256 tokenId) external; } contract PacificRimPaymentContract is Ownable, AccessControl, ReentrancyGuard { using SafeMath for uint256; bytes32 public constant ADMIN_ROLE = keccak256("ADMIN_ROLE"); bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); IERC721 NFT; uint256 private ethAmount; uint256 private cappedSupply; uint256 private mintedSupply; uint256 private preSaleTime; uint256 private preSaleDuration; uint256 private preSaleMintLimit; uint256 private whitelistSaleTime; uint256 private whitelistSaleDuration; uint256 private whitelistSaleMintLimit; uint256 private publicSaleTime; uint256 private publicSaleDuration; uint256 private preSalePerTransactionMintLimit; uint256 private whitelistSalePerTransactionMintLimit; uint256 private publicSalePerTransactionMintLimit; address payable private withdrawAddress; // address who can withdraw eth address private signatureAddress; mapping(address => uint256) private mintBalancePreSale; // in case of presale mint and whitlist mint mapping(address => uint256) private mintBalanceWhitelistSale; mapping(bytes => bool) private signatures; event preSaleMint(address indexed to, uint256[] tokenId, uint256 indexed price); event whitelistSaleMint(address indexed to, uint256[] tokenId, uint256 indexed price); event publicSaleMint(address indexed to, uint256[] tokenId, uint256 indexed price); event preSaleTimeUpdate(uint256 indexed time); event preSaleDurationUpdate(uint256 indexed duration); event whitelistSaleTimeUpdate(uint256 indexed time); event whitelistSaleDurationUpdate(uint256 indexed duration); event publicSaleTimeUpdate(uint256 indexed time); event publicSaleDurationUpdate(uint256 indexed duration); event ETHFundsWithdrawn(uint256 indexed amount, address indexed _address); event withdrawAddressUpdated(address indexed newAddress); event NFTAddressUpdated(address indexed newAddress); event updateETHAmount(address indexed owner, uint256 indexed amount); event signatureAddressUpdated(address indexed _address); event airdropNFT(address[] to, uint256[] tokenId); event cappedSupplyUpdate(address indexed owner, uint256 indexed supply); event preSaleMintingLimit(address indexed owner, uint256 indexed limit); event whitelistSaleMintingLimit(address indexed owner, uint256 indexed limit); event preSalePerTransactionMintLimitUpdated(uint256 indexed _perTransactionMintLimit); event whitelistSalePerTransactionMintLimitUpdated(uint256 indexed _perTransactionMintLimit); event publicSalePerTransactionMintLimitUpdated(uint256 indexed _perTransactionMintLimit); constructor(address _NFTaddress,address payable _withdrawAddress) { NFT = IERC721(_NFTaddress); ethAmount = 0 ether; cappedSupply = 5000; mintedSupply = 0; preSaleMintLimit = 2; preSalePerTransactionMintLimit = 2; whitelistSaleMintLimit = 1; whitelistSalePerTransactionMintLimit = 1; publicSalePerTransactionMintLimit = 1; preSaleTime = 1671813900; preSaleDuration = 900; whitelistSaleTime = 1671814801; whitelistSaleDuration = 3600; publicSaleTime = 1671818401; publicSaleDuration = 157766400; withdrawAddress = _withdrawAddress; signatureAddress = 0x6e90605AB3D87FC62b50D8d5526EFdd02B6678c4; _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); _setupRole(ADMIN_ROLE, 0x6AB132Cf61F582535397fc7E36089DD49Fef5C59); _setupRole(MINTER_ROLE, 0x93BD8b204D06C4510400048781cc279Baf8480e7); } function presaleMint(uint256[] memory _tokenId, bytes32 _hash, bytes memory _signature) public payable{ require(msg.value == ethAmount.mul(_tokenId.length),"Dapp: Invalid value!"); require(block.timestamp >= preSaleTime,"Dapp: Presale not started!"); require(block.timestamp <= preSaleTime.add(preSaleDuration),"Dapp: Presale ended!"); require(mintBalancePreSale[msg.sender].add(_tokenId.length) <= preSaleMintLimit,"Dapp: Wallet's presale mint limit exceeded!"); require(mintedSupply.add(_tokenId.length) <= cappedSupply,"Dapp: Max supply limit exceeded!"); require(recover(_hash,_signature) == signatureAddress,"Dapp: Invalid signature!"); require(!signatures[_signature],"Dapp: Signature already used!"); require( _tokenId.length <= preSalePerTransactionMintLimit,"Dapp: Token id length greater than presale per transacton mint limit!"); for(uint index=0; index<_tokenId.length; index++){ NFT.mint(msg.sender, _tokenId[index]); mintedSupply++; mintBalancePreSale[msg.sender]++; } signatures[_signature] = true; emit preSaleMint(msg.sender, _tokenId, msg.value); } function whitelistMint(uint256[] memory _tokenId, bytes32 _hash, bytes memory _signature) public payable{ require(msg.value == ethAmount.mul(_tokenId.length),"Dapp: Invalid value!"); require(block.timestamp >= whitelistSaleTime,"Dapp: Whitelisted sale not started!"); require(block.timestamp <= whitelistSaleTime.add(whitelistSaleDuration),"Dapp: Whitelisted sale ended!"); require(mintBalanceWhitelistSale[msg.sender].add(_tokenId.length) <= whitelistSaleMintLimit,"Dapp: Wallet's whitelisted sale mint limit exceeded!"); require(mintedSupply.add(_tokenId.length) <= cappedSupply,"Dapp: Max supply limit exceeded!"); require(recover(_hash,_signature) == signatureAddress,"Dapp: Invalid signature!"); require(!signatures[_signature],"Dapp: Signature already used!"); require( _tokenId.length <= whitelistSalePerTransactionMintLimit,"Dapp: Token id length greater than whitelist sale per transacton mint limit!"); for(uint index=0; index<_tokenId.length; index++){ NFT.mint(msg.sender, _tokenId[index]); mintedSupply++; mintBalanceWhitelistSale[msg.sender]++; } signatures[_signature] = true; emit whitelistSaleMint(msg.sender, _tokenId, msg.value); } function publicMint(uint256[] memory _tokenId, bytes32 _hash, bytes memory _signature) public payable{ require(msg.value == ethAmount.mul(_tokenId.length),"Dapp: Invalid value!"); require(block.timestamp >= publicSaleTime,"Dapp: Public sale not started!"); require(block.timestamp <= publicSaleTime.add(publicSaleDuration),"Dapp: Public sale ended!"); require(mintedSupply.add(_tokenId.length) <= cappedSupply,"Dapp: Max supply limit exceeded!"); require(recover(_hash,_signature) == signatureAddress,"Dapp: Invalid signature!"); require(!signatures[_signature],"Dapp: Signature already used!"); require(_tokenId.length <= publicSalePerTransactionMintLimit,"Dapp: Token id length greater than public per transacton mint limit!"); for(uint index=0; index<_tokenId.length; index++){ NFT.mint(msg.sender, _tokenId[index]); mintedSupply++; } signatures[_signature] = true; emit publicSaleMint(msg.sender, _tokenId, msg.value); } function updatePresaleTime(uint256 _presaleTime) public { require(hasRole(ADMIN_ROLE, _msgSender()),"Dapp: Must have admin role to update."); require(_presaleTime>block.timestamp,"Dapp: Start time should be greater than current time!"); preSaleTime = _presaleTime; emit preSaleTimeUpdate(_presaleTime); } function updatePresaleDuration(uint256 _presaleDuration) public { require(hasRole(ADMIN_ROLE, _msgSender()),"Dapp: Must have admin role to update."); require(_presaleDuration>0,"Dapp: Invalid duration value!"); preSaleDuration = _presaleDuration; emit preSaleDurationUpdate(_presaleDuration); } function updateWhitelistSaleTime(uint256 _whitelistSaleTime) public { require(hasRole(ADMIN_ROLE, _msgSender()),"Dapp: Must have admin role to update."); require(_whitelistSaleTime>preSaleTime.add(preSaleDuration),"Dapp: Whitelist sale start time should be greater than presale duration!"); whitelistSaleTime = _whitelistSaleTime; emit whitelistSaleTimeUpdate(_whitelistSaleTime); } function updateWhitelistSaleDuration(uint256 _whitelistSaleDuration) public { require(_whitelistSaleDuration>0,"Dapp: Invalid duration value!"); require(hasRole(ADMIN_ROLE, _msgSender()),"Dapp: Must have admin role to update."); whitelistSaleDuration = _whitelistSaleDuration; emit whitelistSaleDurationUpdate(_whitelistSaleDuration); } function updatePublicSaleTime(uint256 _publicSaleTime) public { require(_publicSaleTime>whitelistSaleTime.add(whitelistSaleDuration),"Dapp: Public sale start time should be greater than whitelist sale duration!"); require(hasRole(ADMIN_ROLE, _msgSender()),"Dapp: Must have admin role to update."); publicSaleTime = _publicSaleTime; emit publicSaleTimeUpdate(_publicSaleTime); } function updatePublicSaleDuration(uint256 _publicSaleDuration) public { require(_publicSaleDuration>0,"Dapp: Invalid duration value!"); require(hasRole(ADMIN_ROLE, _msgSender()),"Dapp: Must have admin role to update."); publicSaleDuration = _publicSaleDuration; emit publicSaleDurationUpdate(_publicSaleDuration); } function withdrawEthFunds(uint256 _amount) public onlyOwner nonReentrant{ require(_amount > 0,"Dapp: invalid amount."); withdrawAddress.transfer(_amount); emit ETHFundsWithdrawn(_amount, msg.sender); } function updateWithdrawAddress(address payable _withdrawAddress) public onlyOwner{ require(_withdrawAddress != withdrawAddress,"Dapp: Invalid address."); require(_withdrawAddress != address(0),"Dapp: Invalid address."); withdrawAddress = _withdrawAddress; emit withdrawAddressUpdated(_withdrawAddress); } function airdrop(address[] memory to, uint256[] memory tokenId) public { require(hasRole(MINTER_ROLE, _msgSender()),"Dapp: Must have minter role to mint."); require(to.length == tokenId.length,"Dapp: Length of token id and address are not equal!"); require(mintedSupply.add(tokenId.length) <= cappedSupply,"Dapp: Capped value rached!"); for (uint index = 0; index < to.length; index++) { NFT.mint(to[index], tokenId[index]); mintedSupply++; } emit airdropNFT(to, tokenId); } function updateCapValue(uint256 _value) public { require(hasRole(ADMIN_ROLE, _msgSender()),"Dapp: Must have admin role to update."); require(_value > mintedSupply, "Dapp: Invalid capped value!"); require(_value != 0, "Dapp: Capped value cannot be zero!"); cappedSupply = _value; emit cappedSupplyUpdate(msg.sender, _value); } function updatePreSaleMintLimit(uint256 _limit) public { require(hasRole(ADMIN_ROLE, _msgSender()),"Dapp: Must have admin role to update."); require(_limit != 0, "Dapp: Cannot set to zero!"); preSaleMintLimit = _limit; emit preSaleMintingLimit(msg.sender, _limit); } function updateWhitelistSaleMintLimit(uint256 _limit) public { require(hasRole(ADMIN_ROLE, _msgSender()),"Dapp: Must have admin role to update."); require(_limit != 0, "Dapp: Cannot set to zero!"); whitelistSaleMintLimit = _limit; emit whitelistSaleMintingLimit(msg.sender, _limit); } function updateNFTAddress(address _address) public { require(hasRole(ADMIN_ROLE, _msgSender()),"Dapp: Must have admin role to update."); require(_address != address(0),"Dapp: Invalid address!"); require(IERC721(_address) != NFT, "Dapp: Address already exist."); NFT = IERC721(_address); emit NFTAddressUpdated(_address); } function updateEthAmount(uint256 _amount) public { require(hasRole(ADMIN_ROLE, _msgSender()),"Dapp: Must have admin role to update."); require(_amount != ethAmount, "Dapp: Invalid amount!"); ethAmount = _amount; emit updateETHAmount(msg.sender, _amount); } function updateSignatureAddress(address _signatureAddress) public { require(hasRole(ADMIN_ROLE, _msgSender()),"Dapp: Must have admin role to update."); require(_signatureAddress != address(0),"Dapp: Invalid address!"); require(_signatureAddress != signatureAddress,"Dapp! Old address passed again!"); signatureAddress = _signatureAddress; emit signatureAddressUpdated(_signatureAddress); } function updatePublicSalePerTransactionMintLimit(uint256 _publicSalePerTransactionMintLimit) public { require(hasRole(ADMIN_ROLE, _msgSender()),"Dapp: Must have admin role to update."); require(_publicSalePerTransactionMintLimit>0,"Dapp: Invalid value!"); require(_publicSalePerTransactionMintLimit!=publicSalePerTransactionMintLimit,"Dapp: Limit value is same as previous!"); publicSalePerTransactionMintLimit = _publicSalePerTransactionMintLimit; emit publicSalePerTransactionMintLimitUpdated(_publicSalePerTransactionMintLimit); } function updatePreSalePerTransactionMintLimit(uint256 _preSalePerTransactionMintLimit) public { require(hasRole(ADMIN_ROLE, _msgSender()),"Dapp: Must have admin role to update."); require(_preSalePerTransactionMintLimit>0,"Dapp: Invalid value!"); require(_preSalePerTransactionMintLimit!=preSalePerTransactionMintLimit,"Dapp: Limit value is same as previous!"); require(_preSalePerTransactionMintLimit<=preSaleMintLimit,"Dapp: Per transaction mint limit cannot be greater than presale mint limit!"); preSalePerTransactionMintLimit = _preSalePerTransactionMintLimit; emit preSalePerTransactionMintLimitUpdated(_preSalePerTransactionMintLimit); } function updateWhitelistSalePerTransactionMintLimit(uint256 _whitelistSalePerTransactionMintLimit) public { require(hasRole(ADMIN_ROLE, _msgSender()),"Dapp: Must have admin role to update."); require(_whitelistSalePerTransactionMintLimit>0,"Dapp: Invalid value!"); require(_whitelistSalePerTransactionMintLimit!=whitelistSalePerTransactionMintLimit,"Dapp: Limit value is same as previous!"); require(_whitelistSalePerTransactionMintLimit<=whitelistSaleMintLimit,"Dapp: Per transaction mint limit cannot be greater than whitelist sale mint limit!"); whitelistSalePerTransactionMintLimit = _whitelistSalePerTransactionMintLimit; emit whitelistSalePerTransactionMintLimitUpdated(_whitelistSalePerTransactionMintLimit); } function getEthAmount() public view returns(uint256){ return ethAmount; } function getCappedSupply() public view returns(uint256){ return cappedSupply; } function getmintedSupply() public view returns(uint256){ return mintedSupply; } function getPreSaleTime() public view returns(uint256){ return preSaleTime; } function getPreSaleDuration() public view returns(uint256){ return preSaleDuration; } function getPreSaleMintLimit() public view returns(uint256){ return preSaleMintLimit; } function getWhitelistSaleTime() public view returns(uint256){ return whitelistSaleTime; } function getWhitelistSaleDuration() public view returns(uint256){ return whitelistSaleDuration; } function getWhitelistSaleMintLimit() public view returns(uint256){ return whitelistSaleMintLimit; } function getPublicSaleTime() public view returns(uint256){ return publicSaleTime; } function getPublicSaleDuration() public view returns(uint256){ return publicSaleDuration; } function getWithdrawAddress() public view returns(address){ return withdrawAddress; } function getMintBalancePreSale(address _address) public view returns(uint256){ return mintBalancePreSale[_address]; } function getMintBalanceWhitelistedSale(address _address) public view returns(uint256){ return mintBalanceWhitelistSale[_address]; } function getSignatureAddress() public view returns(address _signatureAddress){ _signatureAddress = signatureAddress; } function checkSignatureValidity(bytes memory _signature) public view returns(bool){ return signatures[_signature]; } function getPublicSalePerTransactionMintLimit() public view returns(uint256){ return publicSalePerTransactionMintLimit; } function getWhitelistSalePerTransactionMintLimit() public view returns(uint256){ return whitelistSalePerTransactionMintLimit; } function getPreSalePerTransactionMintLimit() public view returns(uint256){ return preSalePerTransactionMintLimit; } function getNFTAdress() public view returns(IERC721){ return NFT; } function recover(bytes32 _hash, bytes memory _signature) public pure returns (address) { bytes32 r; bytes32 s; uint8 v; // Check the signature length if (_signature.length != 65) { return (address(0)); } // Divide the signature in r, s and v variables // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. // solium-disable-next-line security/no-inline-assembly assembly { r := mload(add(_signature, 0x20)) s := mload(add(_signature, 0x40)) v := byte(0, mload(add(_signature, 0x60))) } // Version of signature should be 27 or 28, but 0 and 1 are also possible versions if (v < 27) { v += 27; } // If the version is correct return the signer address if (v != 27 && v != 28) { return (address(0)); } else { // solium-disable-next-line arg-overflow return ecrecover(_hash, v, r, s); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ 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. * * _Available since v3.4._ */ 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. * * _Available since v3.4._ */ 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. * * _Available since v3.4._ */ 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. * * _Available since v3.4._ */ 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 addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @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 up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (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; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 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. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); 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 (rounding == Rounding.Up && 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 down. * * 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 + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * 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 + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * 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 + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * 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 10, 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 + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) pragma solidity ^0.8.0; import "./math/Math.sol"; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @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), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @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) { 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] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); 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); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (access/AccessControl.sol) pragma solidity ^0.8.0; import "./IAccessControl.sol"; import "../utils/Context.sol"; import "../utils/Strings.sol"; import "../utils/introspection/ERC165.sol"; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(account), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleGranted} event. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleRevoked} event. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. * * May emit a {RoleRevoked} event. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * May emit a {RoleGranted} event. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } }
{ "remappings": [], "optimizer": { "enabled": true, "runs": 200 }, "evmVersion": "byzantium", "libraries": {}, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_NFTaddress","type":"address"},{"internalType":"address payable","name":"_withdrawAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"_address","type":"address"}],"name":"ETHFundsWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"}],"name":"NFTAddressUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"to","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"tokenId","type":"uint256[]"}],"name":"airdropNFT","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"supply","type":"uint256"}],"name":"cappedSupplyUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"duration","type":"uint256"}],"name":"preSaleDurationUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"tokenId","type":"uint256[]"},{"indexed":true,"internalType":"uint256","name":"price","type":"uint256"}],"name":"preSaleMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"limit","type":"uint256"}],"name":"preSaleMintingLimit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_perTransactionMintLimit","type":"uint256"}],"name":"preSalePerTransactionMintLimitUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"time","type":"uint256"}],"name":"preSaleTimeUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"duration","type":"uint256"}],"name":"publicSaleDurationUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"tokenId","type":"uint256[]"},{"indexed":true,"internalType":"uint256","name":"price","type":"uint256"}],"name":"publicSaleMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_perTransactionMintLimit","type":"uint256"}],"name":"publicSalePerTransactionMintLimitUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"time","type":"uint256"}],"name":"publicSaleTimeUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_address","type":"address"}],"name":"signatureAddressUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"updateETHAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"duration","type":"uint256"}],"name":"whitelistSaleDurationUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"tokenId","type":"uint256[]"},{"indexed":true,"internalType":"uint256","name":"price","type":"uint256"}],"name":"whitelistSaleMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"limit","type":"uint256"}],"name":"whitelistSaleMintingLimit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_perTransactionMintLimit","type":"uint256"}],"name":"whitelistSalePerTransactionMintLimitUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"time","type":"uint256"}],"name":"whitelistSaleTimeUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"}],"name":"withdrawAddressUpdated","type":"event"},{"inputs":[],"name":"ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"to","type":"address[]"},{"internalType":"uint256[]","name":"tokenId","type":"uint256[]"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"checkSignatureValidity","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCappedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getEthAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getMintBalancePreSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getMintBalanceWhitelistedSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNFTAdress","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPreSaleDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPreSaleMintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPreSalePerTransactionMintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPreSaleTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPublicSaleDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPublicSalePerTransactionMintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPublicSaleTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSignatureAddress","outputs":[{"internalType":"address","name":"_signatureAddress","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWhitelistSaleDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWhitelistSaleMintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWhitelistSalePerTransactionMintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWhitelistSaleTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWithdrawAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getmintedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenId","type":"uint256[]"},{"internalType":"bytes32","name":"_hash","type":"bytes32"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenId","type":"uint256[]"},{"internalType":"bytes32","name":"_hash","type":"bytes32"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_hash","type":"bytes32"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"recover","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"updateCapValue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"updateEthAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"updateNFTAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"updatePreSaleMintLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_preSalePerTransactionMintLimit","type":"uint256"}],"name":"updatePreSalePerTransactionMintLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_presaleDuration","type":"uint256"}],"name":"updatePresaleDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_presaleTime","type":"uint256"}],"name":"updatePresaleTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_publicSaleDuration","type":"uint256"}],"name":"updatePublicSaleDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_publicSalePerTransactionMintLimit","type":"uint256"}],"name":"updatePublicSalePerTransactionMintLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_publicSaleTime","type":"uint256"}],"name":"updatePublicSaleTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_signatureAddress","type":"address"}],"name":"updateSignatureAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_whitelistSaleDuration","type":"uint256"}],"name":"updateWhitelistSaleDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"updateWhitelistSaleMintLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_whitelistSalePerTransactionMintLimit","type":"uint256"}],"name":"updateWhitelistSalePerTransactionMintLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_whitelistSaleTime","type":"uint256"}],"name":"updateWhitelistSaleTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_withdrawAddress","type":"address"}],"name":"updateWithdrawAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenId","type":"uint256[]"},{"internalType":"bytes32","name":"_hash","type":"bytes32"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawEthFunds","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162003c0a38038062003c0a83398101604081905262000034916200031a565b6200005a6200004b640100000000620001ca810204565b640100000000620001ce810204565b6001600281815560038054600160a060020a03808716600160a060020a0319928316179092556000600481905561138860055560068190556009849055600f93909355600c84905560108490556011939093556363a5db0c6007556103846008556363a5de91600a55610e10600b556363a5eca1600d556309675300600e556012805491851691841691909117905560138054909216736e90605ab3d87fc62b50d8d5526efdd02b6678c417909155620001309062000121640100000000620001ca810204565b6401000000006200021e810204565b620001797fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775736ab132cf61f582535397fc7e36089dd49fef5c596401000000006200021e810204565b620001c27f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a67393bd8b204d06c4510400048781cc279baf8480e76401000000006200021e810204565b505062000359565b3390565b60008054600160a060020a03838116600160a060020a0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b62000233828264010000000062000237810204565b5050565b6200024c8282640100000000620002d6810204565b62000233576000828152600160208181526040808420600160a060020a0386168552909152909120805460ff1916909117905562000292640100000000620001ca810204565b600160a060020a031681600160a060020a0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000918252600160209081526040808420600160a060020a0393909316845291905290205460ff1690565b600160a060020a03811681146200031757600080fd5b50565b600080604083850312156200032e57600080fd5b82516200033b8162000301565b60208401519092506200034e8162000301565b809150509250929050565b6138a180620003696000396000f3fe6080604052600436106103395760003560e060020a9004806375b238fc116101af578063a9bf1f39116100fb578063d539139311610099578063e487aaca11610073578063e487aaca1461092d578063e8e7f8001461094d578063f2fde38b1461096b578063fb5534f61461098b57600080fd5b8063d5391393146108c4578063d547741f146108f8578063d58e1f1d1461091857600080fd5b8063bd1d6561116100d5578063bd1d65611461085a578063c6708c5f1461086f578063c9a9fa591461088f578063d10a0e0e146108af57600080fd5b8063a9bf1f3914610809578063acd870b314610829578063b8806c731461083c57600080fd5b806391d14854116101685780639d5e7796116101425780639d5e7796146107a1578063a217fddf146107c1578063a3f4b573146107d6578063a87ec416146107f657600080fd5b806391d1485414610741578063935ece3114610761578063941e79fc1461078157600080fd5b806375b238fc146106975780637aef860f146106b9578063856835fd146106ce57806387e4be4c146106e35780638da5cb5b1461070357806390ccfd271461072157600080fd5b80634eab9f9c1161028957806367243482116102275780636be3c44a116102015780636be3c44a146106385780636f28a25a146106585780636fe30f2a1461066d578063715018a61461068257600080fd5b806367243482146105cd57806368015d07146105ed57806369ce40e31461062357600080fd5b80635e763d7b116102635780635e763d7b146105795780635f4ca50b1461058e57806360ba9010146105a357806363a24212146105b857600080fd5b80634eab9f9c1461052657806352ee91b8146105465780635b23014d1461056457600080fd5b8063248a9ca3116102f6578063354d5571116102d0578063354d5571146104a657806336568abe146104c657806347ad55cb146104e657806349db8b8a1461050657600080fd5b8063248a9ca31461043557806325554e85146104665780632f2ff15d1461048657600080fd5b806301ffc9a71461033e578063087d01df146103735780631525957614610392578063159d2d0d146103a757806319045a25146103dd5780631c908fa414610415575b600080fd5b34801561034a57600080fd5b5061035e61035936600461302c565b6109ab565b60405190151581526020015b60405180910390f35b34801561037f57600080fd5b506004545b60405190815260200161036a565b6103a56103a03660046131c7565b610a3e565b005b3480156103b357600080fd5b506103846103c2366004613249565b600160a060020a031660009081526015602052604090205490565b3480156103e957600080fd5b506103fd6103f8366004613266565b610e96565b604051600160a060020a03909116815260200161036a565b34801561042157600080fd5b506103a56104303660046132ad565b610f6e565b34801561044157600080fd5b506103846104503660046132ad565b6000908152600160208190526040909120015490565b34801561047257600080fd5b5061035e6104813660046132c6565b611046565b34801561049257600080fd5b506103a56104a1366004613303565b611071565b3480156104b257600080fd5b506103a56104c13660046132ad565b61109c565b3480156104d257600080fd5b506103a56104e1366004613303565b6111b2565b3480156104f257600080fd5b506103a56105013660046132ad565b611241565b34801561051257600080fd5b506103a56105213660046132ad565b611357565b34801561053257600080fd5b506103a56105413660046132ad565b611416565b34801561055257600080fd5b50600354600160a060020a03166103fd565b34801561057057600080fd5b50600f54610384565b34801561058557600080fd5b50600a54610384565b34801561059a57600080fd5b50600854610384565b3480156105af57600080fd5b50600c54610384565b3480156105c457600080fd5b50600654610384565b3480156105d957600080fd5b506103a56105e8366004613333565b611568565b3480156105f957600080fd5b50610384610608366004613249565b600160a060020a031660009081526014602052604090205490565b34801561062f57600080fd5b50600754610384565b34801561064457600080fd5b506103a56106533660046132ad565b6117ff565b34801561066457600080fd5b50600e54610384565b34801561067957600080fd5b50601054610384565b34801561068e57600080fd5b506103a56118e1565b3480156106a357600080fd5b5061038460008051602061384c83398151915281565b3480156106c557600080fd5b50600d54610384565b3480156106da57600080fd5b50601154610384565b3480156106ef57600080fd5b506103a56106fe366004613249565b6118f5565b34801561070f57600080fd5b50600054600160a060020a03166103fd565b34801561072d57600080fd5b506103a561073c3660046132ad565b611a3d565b34801561074d57600080fd5b5061035e61075c366004613303565b611aca565b34801561076d57600080fd5b506103a561077c366004613249565b611af5565b34801561078d57600080fd5b506103a561079c3660046132ad565b611c3d565b3480156107ad57600080fd5b506103a56107bc3660046132ad565b611cfc565b3480156107cd57600080fd5b50610384600081565b3480156107e257600080fd5b506103a56107f1366004613249565b611e35565b6103a56108043660046131c7565b611f4e565b34801561081557600080fd5b506103a56108243660046132ad565b61236a565b6103a56108373660046131c7565b6124bc565b34801561084857600080fd5b50601354600160a060020a03166103fd565b34801561086657600080fd5b50600954610384565b34801561087b57600080fd5b506103a561088a3660046132ad565b612824565b34801561089b57600080fd5b506103a56108aa3660046132ad565b6128b1565b3480156108bb57600080fd5b50600554610384565b3480156108d057600080fd5b506103847f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b34801561090457600080fd5b506103a5610913366004613303565b612962565b34801561092457600080fd5b50600b54610384565b34801561093957600080fd5b506103a56109483660046132ad565b612988565b34801561095957600080fd5b50601254600160a060020a03166103fd565b34801561097757600080fd5b506103a5610986366004613249565b612a48565b34801561099757600080fd5b506103a56109a63660046132ad565b612ad8565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1982167f7965db0b000000000000000000000000000000000000000000000000000000001480610a3857507f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff198316145b92915050565b8251600454610a4c91612b65565b3414610a765760405160e560020a62461bcd028152600401610a6d906133e8565b60405180910390fd5b600a54421015610af15760405160e560020a62461bcd02815260206004820152602360248201527f446170703a2057686974656c69737465642073616c65206e6f7420737461727460448201527f65642100000000000000000000000000000000000000000000000000000000006064820152608401610a6d565b600b54600a54610b0091612b78565b421115610b525760405160e560020a62461bcd02815260206004820152601d60248201527f446170703a2057686974656c69737465642073616c6520656e646564210000006044820152606401610a6d565b600c54835133600090815260156020526040902054610b7091612b78565b1115610be75760405160e560020a62461bcd02815260206004820152603460248201527f446170703a2057616c6c657427732077686974656c69737465642073616c652060448201527f6d696e74206c696d6974206578636565646564210000000000000000000000006064820152608401610a6d565b6005548351600654610bf891612b78565b1115610c195760405160e560020a62461bcd028152600401610a6d9061341f565b601354600160a060020a0316610c2f8383610e96565b600160a060020a031614610c585760405160e560020a62461bcd028152600401610a6d90613454565b601681604051610c6891906134bb565b9081526040519081900360200190205460ff1615610c9b5760405160e560020a62461bcd028152600401610a6d906134d7565b60105483511115610d3d5760405160e560020a62461bcd02815260206004820152604c60248201527f446170703a20546f6b656e206964206c656e677468206772656174657220746860448201527f616e2077686974656c6973742073616c6520706572207472616e736163746f6e60648201527f206d696e74206c696d6974210000000000000000000000000000000000000000608482015260a401610a6d565b60005b8351811015610e24576003548451600160a060020a03909116906340c10f19903390879085908110610d7457610d7461350e565b602090810291909101015160405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b158015610dc357600080fd5b505af1158015610dd7573d6000803e3d6000fd5b505060068054925090506000610dec8361356c565b9091555050336000908152601560205260408120805491610e0c8361356c565b91905055508080610e1c9061356c565b915050610d40565b506001601682604051610e3791906134bb565b908152604051908190036020018120805492151560ff1990931692909217909155349033907f9a919bbc77ed97b8ee30890f9d36c37715cf150e94cf712a4b167218eb6c250b90610e899087906135c0565b60405180910390a3505050565b6000806000808451604114610eb15760009350505050610a38565b50505060208201516040830151606084015160001a601b811015610edd57610eda601b826135d3565b90505b8060ff16601b14158015610ef557508060ff16601c14155b15610f065760009350505050610a38565b60408051600081526020810180835288905260ff831691810191909152606081018490526080810183905260019060a0016020604051602081039080840390855afa158015610f59573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b610f76612b84565b610f7e612be1565b60008111610fd15760405160e560020a62461bcd02815260206004820152601560248201527f446170703a20696e76616c696420616d6f756e742e00000000000000000000006044820152606401610a6d565b601254604051600160a060020a039091169082156108fc029083906000818181858888f1935050505015801561100b573d6000803e3d6000fd5b50604051339082907f716b6b4f19c87431e31a39cfe75a0eb2adfe88d4cae625f10f589fe05d4b17b490600090a36110436001600255565b50565b600060168260405161105891906134bb565b9081526040519081900360200190205460ff1692915050565b6000828152600160208190526040909120015461108d81612c3b565b6110978383612c45565b505050565b6110b460008051602061384c83398151915233611aca565b6110d35760405160e560020a62461bcd028152600401610a6d906135f8565b6008546007546110e291612b78565b811161117f5760405160e560020a62461bcd02815260206004820152604860248201527f446170703a2057686974656c6973742073616c652073746172742074696d652060448201527f73686f756c642062652067726561746572207468616e2070726573616c65206460648201527f75726174696f6e21000000000000000000000000000000000000000000000000608482015260a401610a6d565b600a81905560405181907f87c995ad1196654584a0c48847363693d25cef5f94700e2ffb9bb065c9f8da0990600090a250565b600160a060020a03811633146112335760405160e560020a62461bcd02815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c6600000000000000000000000000000000006064820152608401610a6d565b61123d8282612cb0565b5050565b600b54600a5461125091612b78565b81116112ed5760405160e560020a62461bcd02815260206004820152604c60248201527f446170703a205075626c69632073616c652073746172742074696d652073686f60448201527f756c642062652067726561746572207468616e2077686974656c69737420736160648201527f6c65206475726174696f6e210000000000000000000000000000000000000000608482015260a401610a6d565b61130560008051602061384c83398151915233611aca565b6113245760405160e560020a62461bcd028152600401610a6d906135f8565b600d81905560405181907f2860c6ff4cc623c51b03f657f335da7ebb2686a4877805dd6b6af1149b61100190600090a250565b61136f60008051602061384c83398151915233611aca565b61138e5760405160e560020a62461bcd028152600401610a6d906135f8565b806000036113e15760405160e560020a62461bcd02815260206004820152601960248201527f446170703a2043616e6e6f742073657420746f207a65726f21000000000000006044820152606401610a6d565b600c819055604051819033907fdff29d7e55d1efaeddd46d1af773852d1919487edd7a5d38a1c92a521f2c67b790600090a350565b61142e60008051602061384c83398151915233611aca565b61144d5760405160e560020a62461bcd028152600401610a6d906135f8565b600081116114705760405160e560020a62461bcd028152600401610a6d906133e8565b600f5481036114945760405160e560020a62461bcd028152600401610a6d90613655565b6009548111156115355760405160e560020a62461bcd02815260206004820152604b60248201527f446170703a20506572207472616e73616374696f6e206d696e74206c696d697460448201527f2063616e6e6f742062652067726561746572207468616e2070726573616c652060648201527f6d696e74206c696d697421000000000000000000000000000000000000000000608482015260a401610a6d565b600f81905560405181907f7ab55882f370db479b228f84f68c9717fae61157896e12f87202a41e90eb249f90600090a250565b6115927f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a633611aca565b6116065760405160e560020a62461bcd028152602060048201526024808201527f446170703a204d7573742068617665206d696e74657220726f6c6520746f206d60448201527f696e742e000000000000000000000000000000000000000000000000000000006064820152608401610a6d565b80518251146116805760405160e560020a62461bcd02815260206004820152603360248201527f446170703a204c656e677468206f6620746f6b656e20696420616e642061646460448201527f7265737320617265206e6f7420657175616c21000000000000000000000000006064820152608401610a6d565b600554815160065461169191612b78565b11156116e25760405160e560020a62461bcd02815260206004820152601a60248201527f446170703a204361707065642076616c756520726163686564210000000000006044820152606401610a6d565b60005b82518110156117c1576003548351600160a060020a03909116906340c10f19908590849081106117175761171761350e565b60200260200101518484815181106117315761173161350e565b602090810291909101015160405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b15801561178057600080fd5b505af1158015611794573d6000803e3d6000fd5b5050600680549250905060006117a98361356c565b919050555080806117b99061356c565b9150506116e5565b507f4dd3a4f3d7b6fc264a0173f5c9985a4db9ef4ffb7d8f4ab67b5d9180b2350bb582826040516117f39291906136b2565b60405180910390a15050565b61181760008051602061384c83398151915233611aca565b6118365760405160e560020a62461bcd028152600401610a6d906135f8565b4281116118ae5760405160e560020a62461bcd02815260206004820152603560248201527f446170703a2053746172742074696d652073686f756c6420626520677265617460448201527f6572207468616e2063757272656e742074696d652100000000000000000000006064820152608401610a6d565b600781905560405181907f0a67a2aabc14cfa19c32e1353ff9a85c9daa258797b07107b9b724e92c5734e390600090a250565b6118e9612b84565b6118f36000612d17565b565b61190d60008051602061384c83398151915233611aca565b61192c5760405160e560020a62461bcd028152600401610a6d906135f8565b600160a060020a0381166119855760405160e560020a62461bcd02815260206004820152601660248201527f446170703a20496e76616c6964206164647265737321000000000000000000006044820152606401610a6d565b600354600160a060020a03908116908216036119e65760405160e560020a62461bcd02815260206004820152601c60248201527f446170703a204164647265737320616c72656164792065786973742e000000006044820152606401610a6d565b6003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383169081179091556040517fc0a15db954f8aded5cda5092ae26da70558a30c4e12c48e77d87564c3197edf590600090a250565b60008111611a605760405160e560020a62461bcd028152600401610a6d90613712565b611a7860008051602061384c83398151915233611aca565b611a975760405160e560020a62461bcd028152600401610a6d906135f8565b600e81905560405181907ff0718ee8a5336b3858b0f91bd44a363ce6b6c88657602bab715f1eb8ac212c1290600090a250565b6000918252600160209081526040808420600160a060020a0393909316845291905290205460ff1690565b611b0d60008051602061384c83398151915233611aca565b611b2c5760405160e560020a62461bcd028152600401610a6d906135f8565b600160a060020a038116611b855760405160e560020a62461bcd02815260206004820152601660248201527f446170703a20496e76616c6964206164647265737321000000000000000000006044820152606401610a6d565b601354600160a060020a0390811690821603611be65760405160e560020a62461bcd02815260206004820152601f60248201527f4461707021204f6c6420616464726573732070617373656420616761696e21006044820152606401610a6d565b6013805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383169081179091556040517f4a248c5528ceb1689bd8bb911364e48cf3a3bd211a6a28e5bcf286be2530215e90600090a250565b611c5560008051602061384c83398151915233611aca565b611c745760405160e560020a62461bcd028152600401610a6d906135f8565b80600003611cc75760405160e560020a62461bcd02815260206004820152601960248201527f446170703a2043616e6e6f742073657420746f207a65726f21000000000000006044820152606401610a6d565b6009819055604051819033907f24a8cd2f6e6b16a37401043a7f8e287fda8fd351e51862caba4042441137cc3290600090a350565b611d1460008051602061384c83398151915233611aca565b611d335760405160e560020a62461bcd028152600401610a6d906135f8565b6006548111611d875760405160e560020a62461bcd02815260206004820152601b60248201527f446170703a20496e76616c6964206361707065642076616c75652100000000006044820152606401610a6d565b80600003611e005760405160e560020a62461bcd02815260206004820152602260248201527f446170703a204361707065642076616c75652063616e6e6f74206265207a657260448201527f6f210000000000000000000000000000000000000000000000000000000000006064820152608401610a6d565b6005819055604051819033907f3c5452dd2567c67153647c3d0087cbb075dc9842cf3df629410fe08e7690241590600090a350565b611e3d612b84565b601254600160a060020a0390811690821603611e9e5760405160e560020a62461bcd02815260206004820152601660248201527f446170703a20496e76616c696420616464726573732e000000000000000000006044820152606401610a6d565b600160a060020a038116611ef75760405160e560020a62461bcd02815260206004820152601660248201527f446170703a20496e76616c696420616464726573732e000000000000000000006044820152606401610a6d565b6012805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383169081179091556040517fc20ba575ba1a10765cf60b1ef8f69798c58b0e585f6b65c863e8c821d479974f90600090a250565b8251600454611f5c91612b65565b3414611f7d5760405160e560020a62461bcd028152600401610a6d906133e8565b600754421015611fd25760405160e560020a62461bcd02815260206004820152601a60248201527f446170703a2050726573616c65206e6f742073746172746564210000000000006044820152606401610a6d565b600854600754611fe191612b78565b4211156120335760405160e560020a62461bcd02815260206004820152601460248201527f446170703a2050726573616c6520656e646564210000000000000000000000006044820152606401610a6d565b60095483513360009081526014602052604090205461205191612b78565b11156120c85760405160e560020a62461bcd02815260206004820152602b60248201527f446170703a2057616c6c657427732070726573616c65206d696e74206c696d6960448201527f74206578636565646564210000000000000000000000000000000000000000006064820152608401610a6d565b60055483516006546120d991612b78565b11156120fa5760405160e560020a62461bcd028152600401610a6d9061341f565b601354600160a060020a03166121108383610e96565b600160a060020a0316146121395760405160e560020a62461bcd028152600401610a6d90613454565b60168160405161214991906134bb565b9081526040519081900360200190205460ff161561217c5760405160e560020a62461bcd028152600401610a6d906134d7565b600f548351111561221e5760405160e560020a62461bcd02815260206004820152604560248201527f446170703a20546f6b656e206964206c656e677468206772656174657220746860448201527f616e2070726573616c6520706572207472616e736163746f6e206d696e74206c60648201527f696d697421000000000000000000000000000000000000000000000000000000608482015260a401610a6d565b60005b8351811015612305576003548451600160a060020a03909116906340c10f199033908790859081106122555761225561350e565b602090810291909101015160405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b1580156122a457600080fd5b505af11580156122b8573d6000803e3d6000fd5b5050600680549250905060006122cd8361356c565b90915550503360009081526014602052604081208054916122ed8361356c565b919050555080806122fd9061356c565b915050612221565b50600160168260405161231891906134bb565b908152604051908190036020018120805492151560ff1990931692909217909155349033907f5c6c85260d426224019535f1a9a280eabcb2d791f4e3b0daa088fdea2934946190610e899087906135c0565b61238260008051602061384c83398151915233611aca565b6123a15760405160e560020a62461bcd028152600401610a6d906135f8565b600081116123c45760405160e560020a62461bcd028152600401610a6d906133e8565b60105481036123e85760405160e560020a62461bcd028152600401610a6d90613655565b600c548111156124895760405160e560020a62461bcd02815260206004820152605260248201527f446170703a20506572207472616e73616374696f6e206d696e74206c696d697460448201527f2063616e6e6f742062652067726561746572207468616e2077686974656c697360648201527f742073616c65206d696e74206c696d6974210000000000000000000000000000608482015260a401610a6d565b601081905560405181907f31bf1961b53294781ccb5ce83eb960d9a7b6a4576bb23bbc73df6a1336a5c78690600090a250565b82516004546124ca91612b65565b34146124eb5760405160e560020a62461bcd028152600401610a6d906133e8565b600d544210156125405760405160e560020a62461bcd02815260206004820152601e60248201527f446170703a205075626c69632073616c65206e6f7420737461727465642100006044820152606401610a6d565b600e54600d5461254f91612b78565b4211156125a15760405160e560020a62461bcd02815260206004820152601860248201527f446170703a205075626c69632073616c6520656e6465642100000000000000006044820152606401610a6d565b60055483516006546125b291612b78565b11156125d35760405160e560020a62461bcd028152600401610a6d9061341f565b601354600160a060020a03166125e98383610e96565b600160a060020a0316146126125760405160e560020a62461bcd028152600401610a6d90613454565b60168160405161262291906134bb565b9081526040519081900360200190205460ff16156126555760405160e560020a62461bcd028152600401610a6d906134d7565b601154835111156126f85760405160e560020a62461bcd028152602060048201526044602482018190527f446170703a20546f6b656e206964206c656e6774682067726561746572207468908201527f616e207075626c696320706572207472616e736163746f6e206d696e74206c6960648201527f6d69742100000000000000000000000000000000000000000000000000000000608482015260a401610a6d565b60005b83518110156127bf576003548451600160a060020a03909116906340c10f1990339087908590811061272f5761272f61350e565b602090810291909101015160405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b15801561277e57600080fd5b505af1158015612792573d6000803e3d6000fd5b5050600680549250905060006127a78361356c565b919050555080806127b79061356c565b9150506126fb565b5060016016826040516127d291906134bb565b908152604051908190036020018120805492151560ff1990931692909217909155349033907f8d4a5846f8144c6d20eb049decc00dfd27fbd837ded68fb98d58c0a55063562890610e899087906135c0565b61283c60008051602061384c83398151915233611aca565b61285b5760405160e560020a62461bcd028152600401610a6d906135f8565b6000811161287e5760405160e560020a62461bcd028152600401610a6d90613712565b600881905560405181907fc0a87c35e0ac24e811245c9030c9972d202ee96db095f472c165bd6717f0c31e90600090a250565b6128c960008051602061384c83398151915233611aca565b6128e85760405160e560020a62461bcd028152600401610a6d906135f8565b6000811161290b5760405160e560020a62461bcd028152600401610a6d906133e8565b601154810361292f5760405160e560020a62461bcd028152600401610a6d90613655565b601181905560405181907f1b4612aa250cd8490cfb2c691609870d750fbd9bc7957df9e8f518d0090163b990600090a250565b6000828152600160208190526040909120015461297e81612c3b565b6110978383612cb0565b6129a060008051602061384c83398151915233611aca565b6129bf5760405160e560020a62461bcd028152600401610a6d906135f8565b6004548103612a135760405160e560020a62461bcd02815260206004820152601560248201527f446170703a20496e76616c696420616d6f756e742100000000000000000000006044820152606401610a6d565b6004819055604051819033907fb292d15dc3c8b14286cd6adca45b366ad431dcd897f7f9aa2363ab18335b0b3890600090a350565b612a50612b84565b600160a060020a038116612acf5760405160e560020a62461bcd02815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610a6d565b61104381612d17565b60008111612afb5760405160e560020a62461bcd028152600401610a6d90613712565b612b1360008051602061384c83398151915233611aca565b612b325760405160e560020a62461bcd028152600401610a6d906135f8565b600b81905560405181907f4debd9e4ca1bbdc627dc2647b231bce0f073f54d08f42e96c1975bb7ab2afe8890600090a250565b6000612b718284613749565b9392505050565b6000612b718284613768565b600054600160a060020a031633146118f35760405160e560020a62461bcd02815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a6d565b6002805403612c355760405160e560020a62461bcd02815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a6d565b60028055565b6110438133612d74565b612c4f8282611aca565b61123d576000828152600160208181526040808420600160a060020a0386168086529252808420805460ff19169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b612cba8282611aca565b1561123d576000828152600160209081526040808320600160a060020a0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60008054600160a060020a0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b612d7e8282611aca565b61123d57612d8b81612dd0565b612d96836020612de2565b604051602001612da7929190613780565b60408051601f198184030181529082905260e560020a62461bcd028252610a6d91600401613801565b6060610a38600160a060020a03831660145b60606000612df1836002613749565b612dfc906002613768565b67ffffffffffffffff811115612e1457612e1461306b565b6040519080825280601f01601f191660200182016040528015612e3e576020820181803683370190505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612e7557612e7561350e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612ed857612ed861350e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000612f14846002613749565b612f1f906001613768565b90505b6001811115612fda577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110612f6057612f6061350e565b1a7f010000000000000000000000000000000000000000000000000000000000000002828281518110612f9557612f9561350e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350601090940493612fd381613834565b9050612f22565b508315612b715760405160e560020a62461bcd02815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610a6d565b60006020828403121561303e57600080fd5b81357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1981168114612b7157600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156130c3576130c361306b565b604052919050565b600067ffffffffffffffff8211156130e5576130e561306b565b5060209081020190565b600082601f83011261310057600080fd5b81356020613115613110836130cb565b61309a565b8281529181028401810191818101908684111561313157600080fd5b8286015b8481101561314c5780358352918301918301613135565b509695505050505050565b600082601f83011261316857600080fd5b813567ffffffffffffffff8111156131825761318261306b565b613195601f8201601f191660200161309a565b8181528460208386010111156131aa57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000606084860312156131dc57600080fd5b833567ffffffffffffffff808211156131f457600080fd5b613200878388016130ef565b945060208601359350604086013591508082111561321d57600080fd5b5061322a86828701613157565b9150509250925092565b600160a060020a038116811461104357600080fd5b60006020828403121561325b57600080fd5b8135612b7181613234565b6000806040838503121561327957600080fd5b82359150602083013567ffffffffffffffff81111561329757600080fd5b6132a385828601613157565b9150509250929050565b6000602082840312156132bf57600080fd5b5035919050565b6000602082840312156132d857600080fd5b813567ffffffffffffffff8111156132ef57600080fd5b6132fb84828501613157565b949350505050565b6000806040838503121561331657600080fd5b82359150602083013561332881613234565b809150509250929050565b6000806040838503121561334657600080fd5b823567ffffffffffffffff8082111561335e57600080fd5b818501915085601f83011261337257600080fd5b81356020613382613110836130cb565b8281529181028401810191818101908984111561339e57600080fd5b948201945b838610156133c55785356133b681613234565b825294820194908201906133a3565b965050860135925050808211156133db57600080fd5b506132a3858286016130ef565b60208082526014908201527f446170703a20496e76616c69642076616c756521000000000000000000000000604082015260600190565b6020808252818101527f446170703a204d617820737570706c79206c696d697420657863656564656421604082015260600190565b60208082526018908201527f446170703a20496e76616c6964207369676e6174757265210000000000000000604082015260600190565b60005b838110156134a657818101518382015260200161348e565b838111156134b5576000848401525b50505050565b600082516134cd81846020870161348b565b9190910192915050565b6020808252601d908201527f446170703a205369676e617475726520616c7265616479207573656421000000604082015260600190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006001820161357e5761357e61353d565b5060010190565b600081518084526020808501945080840160005b838110156135b557815187529582019590820190600101613599565b509495945050505050565b602081526000612b716020830184613585565b600060ff821660ff84168060ff038211156135f0576135f061353d565b019392505050565b60208082526025908201527f446170703a204d75737420686176652061646d696e20726f6c6520746f20757060408201527f646174652e000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526026908201527f446170703a204c696d69742076616c75652069732073616d652061732070726560408201527f76696f7573210000000000000000000000000000000000000000000000000000606082015260800190565b604080825283519082018190526000906020906060840190828701845b828110156136f4578151600160a060020a0316845292840192908401906001016136cf565b505050838103828501526137088186613585565b9695505050505050565b6020808252601d908201527f446170703a20496e76616c6964206475726174696f6e2076616c756521000000604082015260600190565b60008160001904831182151516156137635761376361353d565b500290565b6000821982111561377b5761377b61353d565b500190565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516137b881601785016020880161348b565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516137f581602884016020880161348b565b01602801949350505050565b602081526000825180602084015261382081604085016020870161348b565b601f01601f19169190910160400192915050565b6000816138435761384361353d565b50600019019056fea49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775a2646970667358221220a3668dbac4e9c3205de34949fbe8c324aaaf5795da740bfe0eac9a43eb9a502264736f6c634300080d0033000000000000000000000000f429210d0f619f71eaa34f37a6a9545068ef166b000000000000000000000000617544d9c9cee9ebc19dd7d12728dbb72aa36fef
Deployed Bytecode
0x6080604052600436106103395760003560e060020a9004806375b238fc116101af578063a9bf1f39116100fb578063d539139311610099578063e487aaca11610073578063e487aaca1461092d578063e8e7f8001461094d578063f2fde38b1461096b578063fb5534f61461098b57600080fd5b8063d5391393146108c4578063d547741f146108f8578063d58e1f1d1461091857600080fd5b8063bd1d6561116100d5578063bd1d65611461085a578063c6708c5f1461086f578063c9a9fa591461088f578063d10a0e0e146108af57600080fd5b8063a9bf1f3914610809578063acd870b314610829578063b8806c731461083c57600080fd5b806391d14854116101685780639d5e7796116101425780639d5e7796146107a1578063a217fddf146107c1578063a3f4b573146107d6578063a87ec416146107f657600080fd5b806391d1485414610741578063935ece3114610761578063941e79fc1461078157600080fd5b806375b238fc146106975780637aef860f146106b9578063856835fd146106ce57806387e4be4c146106e35780638da5cb5b1461070357806390ccfd271461072157600080fd5b80634eab9f9c1161028957806367243482116102275780636be3c44a116102015780636be3c44a146106385780636f28a25a146106585780636fe30f2a1461066d578063715018a61461068257600080fd5b806367243482146105cd57806368015d07146105ed57806369ce40e31461062357600080fd5b80635e763d7b116102635780635e763d7b146105795780635f4ca50b1461058e57806360ba9010146105a357806363a24212146105b857600080fd5b80634eab9f9c1461052657806352ee91b8146105465780635b23014d1461056457600080fd5b8063248a9ca3116102f6578063354d5571116102d0578063354d5571146104a657806336568abe146104c657806347ad55cb146104e657806349db8b8a1461050657600080fd5b8063248a9ca31461043557806325554e85146104665780632f2ff15d1461048657600080fd5b806301ffc9a71461033e578063087d01df146103735780631525957614610392578063159d2d0d146103a757806319045a25146103dd5780631c908fa414610415575b600080fd5b34801561034a57600080fd5b5061035e61035936600461302c565b6109ab565b60405190151581526020015b60405180910390f35b34801561037f57600080fd5b506004545b60405190815260200161036a565b6103a56103a03660046131c7565b610a3e565b005b3480156103b357600080fd5b506103846103c2366004613249565b600160a060020a031660009081526015602052604090205490565b3480156103e957600080fd5b506103fd6103f8366004613266565b610e96565b604051600160a060020a03909116815260200161036a565b34801561042157600080fd5b506103a56104303660046132ad565b610f6e565b34801561044157600080fd5b506103846104503660046132ad565b6000908152600160208190526040909120015490565b34801561047257600080fd5b5061035e6104813660046132c6565b611046565b34801561049257600080fd5b506103a56104a1366004613303565b611071565b3480156104b257600080fd5b506103a56104c13660046132ad565b61109c565b3480156104d257600080fd5b506103a56104e1366004613303565b6111b2565b3480156104f257600080fd5b506103a56105013660046132ad565b611241565b34801561051257600080fd5b506103a56105213660046132ad565b611357565b34801561053257600080fd5b506103a56105413660046132ad565b611416565b34801561055257600080fd5b50600354600160a060020a03166103fd565b34801561057057600080fd5b50600f54610384565b34801561058557600080fd5b50600a54610384565b34801561059a57600080fd5b50600854610384565b3480156105af57600080fd5b50600c54610384565b3480156105c457600080fd5b50600654610384565b3480156105d957600080fd5b506103a56105e8366004613333565b611568565b3480156105f957600080fd5b50610384610608366004613249565b600160a060020a031660009081526014602052604090205490565b34801561062f57600080fd5b50600754610384565b34801561064457600080fd5b506103a56106533660046132ad565b6117ff565b34801561066457600080fd5b50600e54610384565b34801561067957600080fd5b50601054610384565b34801561068e57600080fd5b506103a56118e1565b3480156106a357600080fd5b5061038460008051602061384c83398151915281565b3480156106c557600080fd5b50600d54610384565b3480156106da57600080fd5b50601154610384565b3480156106ef57600080fd5b506103a56106fe366004613249565b6118f5565b34801561070f57600080fd5b50600054600160a060020a03166103fd565b34801561072d57600080fd5b506103a561073c3660046132ad565b611a3d565b34801561074d57600080fd5b5061035e61075c366004613303565b611aca565b34801561076d57600080fd5b506103a561077c366004613249565b611af5565b34801561078d57600080fd5b506103a561079c3660046132ad565b611c3d565b3480156107ad57600080fd5b506103a56107bc3660046132ad565b611cfc565b3480156107cd57600080fd5b50610384600081565b3480156107e257600080fd5b506103a56107f1366004613249565b611e35565b6103a56108043660046131c7565b611f4e565b34801561081557600080fd5b506103a56108243660046132ad565b61236a565b6103a56108373660046131c7565b6124bc565b34801561084857600080fd5b50601354600160a060020a03166103fd565b34801561086657600080fd5b50600954610384565b34801561087b57600080fd5b506103a561088a3660046132ad565b612824565b34801561089b57600080fd5b506103a56108aa3660046132ad565b6128b1565b3480156108bb57600080fd5b50600554610384565b3480156108d057600080fd5b506103847f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b34801561090457600080fd5b506103a5610913366004613303565b612962565b34801561092457600080fd5b50600b54610384565b34801561093957600080fd5b506103a56109483660046132ad565b612988565b34801561095957600080fd5b50601254600160a060020a03166103fd565b34801561097757600080fd5b506103a5610986366004613249565b612a48565b34801561099757600080fd5b506103a56109a63660046132ad565b612ad8565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1982167f7965db0b000000000000000000000000000000000000000000000000000000001480610a3857507f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff198316145b92915050565b8251600454610a4c91612b65565b3414610a765760405160e560020a62461bcd028152600401610a6d906133e8565b60405180910390fd5b600a54421015610af15760405160e560020a62461bcd02815260206004820152602360248201527f446170703a2057686974656c69737465642073616c65206e6f7420737461727460448201527f65642100000000000000000000000000000000000000000000000000000000006064820152608401610a6d565b600b54600a54610b0091612b78565b421115610b525760405160e560020a62461bcd02815260206004820152601d60248201527f446170703a2057686974656c69737465642073616c6520656e646564210000006044820152606401610a6d565b600c54835133600090815260156020526040902054610b7091612b78565b1115610be75760405160e560020a62461bcd02815260206004820152603460248201527f446170703a2057616c6c657427732077686974656c69737465642073616c652060448201527f6d696e74206c696d6974206578636565646564210000000000000000000000006064820152608401610a6d565b6005548351600654610bf891612b78565b1115610c195760405160e560020a62461bcd028152600401610a6d9061341f565b601354600160a060020a0316610c2f8383610e96565b600160a060020a031614610c585760405160e560020a62461bcd028152600401610a6d90613454565b601681604051610c6891906134bb565b9081526040519081900360200190205460ff1615610c9b5760405160e560020a62461bcd028152600401610a6d906134d7565b60105483511115610d3d5760405160e560020a62461bcd02815260206004820152604c60248201527f446170703a20546f6b656e206964206c656e677468206772656174657220746860448201527f616e2077686974656c6973742073616c6520706572207472616e736163746f6e60648201527f206d696e74206c696d6974210000000000000000000000000000000000000000608482015260a401610a6d565b60005b8351811015610e24576003548451600160a060020a03909116906340c10f19903390879085908110610d7457610d7461350e565b602090810291909101015160405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b158015610dc357600080fd5b505af1158015610dd7573d6000803e3d6000fd5b505060068054925090506000610dec8361356c565b9091555050336000908152601560205260408120805491610e0c8361356c565b91905055508080610e1c9061356c565b915050610d40565b506001601682604051610e3791906134bb565b908152604051908190036020018120805492151560ff1990931692909217909155349033907f9a919bbc77ed97b8ee30890f9d36c37715cf150e94cf712a4b167218eb6c250b90610e899087906135c0565b60405180910390a3505050565b6000806000808451604114610eb15760009350505050610a38565b50505060208201516040830151606084015160001a601b811015610edd57610eda601b826135d3565b90505b8060ff16601b14158015610ef557508060ff16601c14155b15610f065760009350505050610a38565b60408051600081526020810180835288905260ff831691810191909152606081018490526080810183905260019060a0016020604051602081039080840390855afa158015610f59573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b610f76612b84565b610f7e612be1565b60008111610fd15760405160e560020a62461bcd02815260206004820152601560248201527f446170703a20696e76616c696420616d6f756e742e00000000000000000000006044820152606401610a6d565b601254604051600160a060020a039091169082156108fc029083906000818181858888f1935050505015801561100b573d6000803e3d6000fd5b50604051339082907f716b6b4f19c87431e31a39cfe75a0eb2adfe88d4cae625f10f589fe05d4b17b490600090a36110436001600255565b50565b600060168260405161105891906134bb565b9081526040519081900360200190205460ff1692915050565b6000828152600160208190526040909120015461108d81612c3b565b6110978383612c45565b505050565b6110b460008051602061384c83398151915233611aca565b6110d35760405160e560020a62461bcd028152600401610a6d906135f8565b6008546007546110e291612b78565b811161117f5760405160e560020a62461bcd02815260206004820152604860248201527f446170703a2057686974656c6973742073616c652073746172742074696d652060448201527f73686f756c642062652067726561746572207468616e2070726573616c65206460648201527f75726174696f6e21000000000000000000000000000000000000000000000000608482015260a401610a6d565b600a81905560405181907f87c995ad1196654584a0c48847363693d25cef5f94700e2ffb9bb065c9f8da0990600090a250565b600160a060020a03811633146112335760405160e560020a62461bcd02815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c6600000000000000000000000000000000006064820152608401610a6d565b61123d8282612cb0565b5050565b600b54600a5461125091612b78565b81116112ed5760405160e560020a62461bcd02815260206004820152604c60248201527f446170703a205075626c69632073616c652073746172742074696d652073686f60448201527f756c642062652067726561746572207468616e2077686974656c69737420736160648201527f6c65206475726174696f6e210000000000000000000000000000000000000000608482015260a401610a6d565b61130560008051602061384c83398151915233611aca565b6113245760405160e560020a62461bcd028152600401610a6d906135f8565b600d81905560405181907f2860c6ff4cc623c51b03f657f335da7ebb2686a4877805dd6b6af1149b61100190600090a250565b61136f60008051602061384c83398151915233611aca565b61138e5760405160e560020a62461bcd028152600401610a6d906135f8565b806000036113e15760405160e560020a62461bcd02815260206004820152601960248201527f446170703a2043616e6e6f742073657420746f207a65726f21000000000000006044820152606401610a6d565b600c819055604051819033907fdff29d7e55d1efaeddd46d1af773852d1919487edd7a5d38a1c92a521f2c67b790600090a350565b61142e60008051602061384c83398151915233611aca565b61144d5760405160e560020a62461bcd028152600401610a6d906135f8565b600081116114705760405160e560020a62461bcd028152600401610a6d906133e8565b600f5481036114945760405160e560020a62461bcd028152600401610a6d90613655565b6009548111156115355760405160e560020a62461bcd02815260206004820152604b60248201527f446170703a20506572207472616e73616374696f6e206d696e74206c696d697460448201527f2063616e6e6f742062652067726561746572207468616e2070726573616c652060648201527f6d696e74206c696d697421000000000000000000000000000000000000000000608482015260a401610a6d565b600f81905560405181907f7ab55882f370db479b228f84f68c9717fae61157896e12f87202a41e90eb249f90600090a250565b6115927f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a633611aca565b6116065760405160e560020a62461bcd028152602060048201526024808201527f446170703a204d7573742068617665206d696e74657220726f6c6520746f206d60448201527f696e742e000000000000000000000000000000000000000000000000000000006064820152608401610a6d565b80518251146116805760405160e560020a62461bcd02815260206004820152603360248201527f446170703a204c656e677468206f6620746f6b656e20696420616e642061646460448201527f7265737320617265206e6f7420657175616c21000000000000000000000000006064820152608401610a6d565b600554815160065461169191612b78565b11156116e25760405160e560020a62461bcd02815260206004820152601a60248201527f446170703a204361707065642076616c756520726163686564210000000000006044820152606401610a6d565b60005b82518110156117c1576003548351600160a060020a03909116906340c10f19908590849081106117175761171761350e565b60200260200101518484815181106117315761173161350e565b602090810291909101015160405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b15801561178057600080fd5b505af1158015611794573d6000803e3d6000fd5b5050600680549250905060006117a98361356c565b919050555080806117b99061356c565b9150506116e5565b507f4dd3a4f3d7b6fc264a0173f5c9985a4db9ef4ffb7d8f4ab67b5d9180b2350bb582826040516117f39291906136b2565b60405180910390a15050565b61181760008051602061384c83398151915233611aca565b6118365760405160e560020a62461bcd028152600401610a6d906135f8565b4281116118ae5760405160e560020a62461bcd02815260206004820152603560248201527f446170703a2053746172742074696d652073686f756c6420626520677265617460448201527f6572207468616e2063757272656e742074696d652100000000000000000000006064820152608401610a6d565b600781905560405181907f0a67a2aabc14cfa19c32e1353ff9a85c9daa258797b07107b9b724e92c5734e390600090a250565b6118e9612b84565b6118f36000612d17565b565b61190d60008051602061384c83398151915233611aca565b61192c5760405160e560020a62461bcd028152600401610a6d906135f8565b600160a060020a0381166119855760405160e560020a62461bcd02815260206004820152601660248201527f446170703a20496e76616c6964206164647265737321000000000000000000006044820152606401610a6d565b600354600160a060020a03908116908216036119e65760405160e560020a62461bcd02815260206004820152601c60248201527f446170703a204164647265737320616c72656164792065786973742e000000006044820152606401610a6d565b6003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383169081179091556040517fc0a15db954f8aded5cda5092ae26da70558a30c4e12c48e77d87564c3197edf590600090a250565b60008111611a605760405160e560020a62461bcd028152600401610a6d90613712565b611a7860008051602061384c83398151915233611aca565b611a975760405160e560020a62461bcd028152600401610a6d906135f8565b600e81905560405181907ff0718ee8a5336b3858b0f91bd44a363ce6b6c88657602bab715f1eb8ac212c1290600090a250565b6000918252600160209081526040808420600160a060020a0393909316845291905290205460ff1690565b611b0d60008051602061384c83398151915233611aca565b611b2c5760405160e560020a62461bcd028152600401610a6d906135f8565b600160a060020a038116611b855760405160e560020a62461bcd02815260206004820152601660248201527f446170703a20496e76616c6964206164647265737321000000000000000000006044820152606401610a6d565b601354600160a060020a0390811690821603611be65760405160e560020a62461bcd02815260206004820152601f60248201527f4461707021204f6c6420616464726573732070617373656420616761696e21006044820152606401610a6d565b6013805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383169081179091556040517f4a248c5528ceb1689bd8bb911364e48cf3a3bd211a6a28e5bcf286be2530215e90600090a250565b611c5560008051602061384c83398151915233611aca565b611c745760405160e560020a62461bcd028152600401610a6d906135f8565b80600003611cc75760405160e560020a62461bcd02815260206004820152601960248201527f446170703a2043616e6e6f742073657420746f207a65726f21000000000000006044820152606401610a6d565b6009819055604051819033907f24a8cd2f6e6b16a37401043a7f8e287fda8fd351e51862caba4042441137cc3290600090a350565b611d1460008051602061384c83398151915233611aca565b611d335760405160e560020a62461bcd028152600401610a6d906135f8565b6006548111611d875760405160e560020a62461bcd02815260206004820152601b60248201527f446170703a20496e76616c6964206361707065642076616c75652100000000006044820152606401610a6d565b80600003611e005760405160e560020a62461bcd02815260206004820152602260248201527f446170703a204361707065642076616c75652063616e6e6f74206265207a657260448201527f6f210000000000000000000000000000000000000000000000000000000000006064820152608401610a6d565b6005819055604051819033907f3c5452dd2567c67153647c3d0087cbb075dc9842cf3df629410fe08e7690241590600090a350565b611e3d612b84565b601254600160a060020a0390811690821603611e9e5760405160e560020a62461bcd02815260206004820152601660248201527f446170703a20496e76616c696420616464726573732e000000000000000000006044820152606401610a6d565b600160a060020a038116611ef75760405160e560020a62461bcd02815260206004820152601660248201527f446170703a20496e76616c696420616464726573732e000000000000000000006044820152606401610a6d565b6012805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383169081179091556040517fc20ba575ba1a10765cf60b1ef8f69798c58b0e585f6b65c863e8c821d479974f90600090a250565b8251600454611f5c91612b65565b3414611f7d5760405160e560020a62461bcd028152600401610a6d906133e8565b600754421015611fd25760405160e560020a62461bcd02815260206004820152601a60248201527f446170703a2050726573616c65206e6f742073746172746564210000000000006044820152606401610a6d565b600854600754611fe191612b78565b4211156120335760405160e560020a62461bcd02815260206004820152601460248201527f446170703a2050726573616c6520656e646564210000000000000000000000006044820152606401610a6d565b60095483513360009081526014602052604090205461205191612b78565b11156120c85760405160e560020a62461bcd02815260206004820152602b60248201527f446170703a2057616c6c657427732070726573616c65206d696e74206c696d6960448201527f74206578636565646564210000000000000000000000000000000000000000006064820152608401610a6d565b60055483516006546120d991612b78565b11156120fa5760405160e560020a62461bcd028152600401610a6d9061341f565b601354600160a060020a03166121108383610e96565b600160a060020a0316146121395760405160e560020a62461bcd028152600401610a6d90613454565b60168160405161214991906134bb565b9081526040519081900360200190205460ff161561217c5760405160e560020a62461bcd028152600401610a6d906134d7565b600f548351111561221e5760405160e560020a62461bcd02815260206004820152604560248201527f446170703a20546f6b656e206964206c656e677468206772656174657220746860448201527f616e2070726573616c6520706572207472616e736163746f6e206d696e74206c60648201527f696d697421000000000000000000000000000000000000000000000000000000608482015260a401610a6d565b60005b8351811015612305576003548451600160a060020a03909116906340c10f199033908790859081106122555761225561350e565b602090810291909101015160405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b1580156122a457600080fd5b505af11580156122b8573d6000803e3d6000fd5b5050600680549250905060006122cd8361356c565b90915550503360009081526014602052604081208054916122ed8361356c565b919050555080806122fd9061356c565b915050612221565b50600160168260405161231891906134bb565b908152604051908190036020018120805492151560ff1990931692909217909155349033907f5c6c85260d426224019535f1a9a280eabcb2d791f4e3b0daa088fdea2934946190610e899087906135c0565b61238260008051602061384c83398151915233611aca565b6123a15760405160e560020a62461bcd028152600401610a6d906135f8565b600081116123c45760405160e560020a62461bcd028152600401610a6d906133e8565b60105481036123e85760405160e560020a62461bcd028152600401610a6d90613655565b600c548111156124895760405160e560020a62461bcd02815260206004820152605260248201527f446170703a20506572207472616e73616374696f6e206d696e74206c696d697460448201527f2063616e6e6f742062652067726561746572207468616e2077686974656c697360648201527f742073616c65206d696e74206c696d6974210000000000000000000000000000608482015260a401610a6d565b601081905560405181907f31bf1961b53294781ccb5ce83eb960d9a7b6a4576bb23bbc73df6a1336a5c78690600090a250565b82516004546124ca91612b65565b34146124eb5760405160e560020a62461bcd028152600401610a6d906133e8565b600d544210156125405760405160e560020a62461bcd02815260206004820152601e60248201527f446170703a205075626c69632073616c65206e6f7420737461727465642100006044820152606401610a6d565b600e54600d5461254f91612b78565b4211156125a15760405160e560020a62461bcd02815260206004820152601860248201527f446170703a205075626c69632073616c6520656e6465642100000000000000006044820152606401610a6d565b60055483516006546125b291612b78565b11156125d35760405160e560020a62461bcd028152600401610a6d9061341f565b601354600160a060020a03166125e98383610e96565b600160a060020a0316146126125760405160e560020a62461bcd028152600401610a6d90613454565b60168160405161262291906134bb565b9081526040519081900360200190205460ff16156126555760405160e560020a62461bcd028152600401610a6d906134d7565b601154835111156126f85760405160e560020a62461bcd028152602060048201526044602482018190527f446170703a20546f6b656e206964206c656e6774682067726561746572207468908201527f616e207075626c696320706572207472616e736163746f6e206d696e74206c6960648201527f6d69742100000000000000000000000000000000000000000000000000000000608482015260a401610a6d565b60005b83518110156127bf576003548451600160a060020a03909116906340c10f1990339087908590811061272f5761272f61350e565b602090810291909101015160405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b15801561277e57600080fd5b505af1158015612792573d6000803e3d6000fd5b5050600680549250905060006127a78361356c565b919050555080806127b79061356c565b9150506126fb565b5060016016826040516127d291906134bb565b908152604051908190036020018120805492151560ff1990931692909217909155349033907f8d4a5846f8144c6d20eb049decc00dfd27fbd837ded68fb98d58c0a55063562890610e899087906135c0565b61283c60008051602061384c83398151915233611aca565b61285b5760405160e560020a62461bcd028152600401610a6d906135f8565b6000811161287e5760405160e560020a62461bcd028152600401610a6d90613712565b600881905560405181907fc0a87c35e0ac24e811245c9030c9972d202ee96db095f472c165bd6717f0c31e90600090a250565b6128c960008051602061384c83398151915233611aca565b6128e85760405160e560020a62461bcd028152600401610a6d906135f8565b6000811161290b5760405160e560020a62461bcd028152600401610a6d906133e8565b601154810361292f5760405160e560020a62461bcd028152600401610a6d90613655565b601181905560405181907f1b4612aa250cd8490cfb2c691609870d750fbd9bc7957df9e8f518d0090163b990600090a250565b6000828152600160208190526040909120015461297e81612c3b565b6110978383612cb0565b6129a060008051602061384c83398151915233611aca565b6129bf5760405160e560020a62461bcd028152600401610a6d906135f8565b6004548103612a135760405160e560020a62461bcd02815260206004820152601560248201527f446170703a20496e76616c696420616d6f756e742100000000000000000000006044820152606401610a6d565b6004819055604051819033907fb292d15dc3c8b14286cd6adca45b366ad431dcd897f7f9aa2363ab18335b0b3890600090a350565b612a50612b84565b600160a060020a038116612acf5760405160e560020a62461bcd02815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610a6d565b61104381612d17565b60008111612afb5760405160e560020a62461bcd028152600401610a6d90613712565b612b1360008051602061384c83398151915233611aca565b612b325760405160e560020a62461bcd028152600401610a6d906135f8565b600b81905560405181907f4debd9e4ca1bbdc627dc2647b231bce0f073f54d08f42e96c1975bb7ab2afe8890600090a250565b6000612b718284613749565b9392505050565b6000612b718284613768565b600054600160a060020a031633146118f35760405160e560020a62461bcd02815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a6d565b6002805403612c355760405160e560020a62461bcd02815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a6d565b60028055565b6110438133612d74565b612c4f8282611aca565b61123d576000828152600160208181526040808420600160a060020a0386168086529252808420805460ff19169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b612cba8282611aca565b1561123d576000828152600160209081526040808320600160a060020a0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60008054600160a060020a0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b612d7e8282611aca565b61123d57612d8b81612dd0565b612d96836020612de2565b604051602001612da7929190613780565b60408051601f198184030181529082905260e560020a62461bcd028252610a6d91600401613801565b6060610a38600160a060020a03831660145b60606000612df1836002613749565b612dfc906002613768565b67ffffffffffffffff811115612e1457612e1461306b565b6040519080825280601f01601f191660200182016040528015612e3e576020820181803683370190505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612e7557612e7561350e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612ed857612ed861350e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000612f14846002613749565b612f1f906001613768565b90505b6001811115612fda577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110612f6057612f6061350e565b1a7f010000000000000000000000000000000000000000000000000000000000000002828281518110612f9557612f9561350e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350601090940493612fd381613834565b9050612f22565b508315612b715760405160e560020a62461bcd02815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610a6d565b60006020828403121561303e57600080fd5b81357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1981168114612b7157600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156130c3576130c361306b565b604052919050565b600067ffffffffffffffff8211156130e5576130e561306b565b5060209081020190565b600082601f83011261310057600080fd5b81356020613115613110836130cb565b61309a565b8281529181028401810191818101908684111561313157600080fd5b8286015b8481101561314c5780358352918301918301613135565b509695505050505050565b600082601f83011261316857600080fd5b813567ffffffffffffffff8111156131825761318261306b565b613195601f8201601f191660200161309a565b8181528460208386010111156131aa57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000606084860312156131dc57600080fd5b833567ffffffffffffffff808211156131f457600080fd5b613200878388016130ef565b945060208601359350604086013591508082111561321d57600080fd5b5061322a86828701613157565b9150509250925092565b600160a060020a038116811461104357600080fd5b60006020828403121561325b57600080fd5b8135612b7181613234565b6000806040838503121561327957600080fd5b82359150602083013567ffffffffffffffff81111561329757600080fd5b6132a385828601613157565b9150509250929050565b6000602082840312156132bf57600080fd5b5035919050565b6000602082840312156132d857600080fd5b813567ffffffffffffffff8111156132ef57600080fd5b6132fb84828501613157565b949350505050565b6000806040838503121561331657600080fd5b82359150602083013561332881613234565b809150509250929050565b6000806040838503121561334657600080fd5b823567ffffffffffffffff8082111561335e57600080fd5b818501915085601f83011261337257600080fd5b81356020613382613110836130cb565b8281529181028401810191818101908984111561339e57600080fd5b948201945b838610156133c55785356133b681613234565b825294820194908201906133a3565b965050860135925050808211156133db57600080fd5b506132a3858286016130ef565b60208082526014908201527f446170703a20496e76616c69642076616c756521000000000000000000000000604082015260600190565b6020808252818101527f446170703a204d617820737570706c79206c696d697420657863656564656421604082015260600190565b60208082526018908201527f446170703a20496e76616c6964207369676e6174757265210000000000000000604082015260600190565b60005b838110156134a657818101518382015260200161348e565b838111156134b5576000848401525b50505050565b600082516134cd81846020870161348b565b9190910192915050565b6020808252601d908201527f446170703a205369676e617475726520616c7265616479207573656421000000604082015260600190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006001820161357e5761357e61353d565b5060010190565b600081518084526020808501945080840160005b838110156135b557815187529582019590820190600101613599565b509495945050505050565b602081526000612b716020830184613585565b600060ff821660ff84168060ff038211156135f0576135f061353d565b019392505050565b60208082526025908201527f446170703a204d75737420686176652061646d696e20726f6c6520746f20757060408201527f646174652e000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526026908201527f446170703a204c696d69742076616c75652069732073616d652061732070726560408201527f76696f7573210000000000000000000000000000000000000000000000000000606082015260800190565b604080825283519082018190526000906020906060840190828701845b828110156136f4578151600160a060020a0316845292840192908401906001016136cf565b505050838103828501526137088186613585565b9695505050505050565b6020808252601d908201527f446170703a20496e76616c6964206475726174696f6e2076616c756521000000604082015260600190565b60008160001904831182151516156137635761376361353d565b500290565b6000821982111561377b5761377b61353d565b500190565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516137b881601785016020880161348b565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516137f581602884016020880161348b565b01602801949350505050565b602081526000825180602084015261382081604085016020870161348b565b601f01601f19169190910160400192915050565b6000816138435761384361353d565b50600019019056fea49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775a2646970667358221220a3668dbac4e9c3205de34949fbe8c324aaaf5795da740bfe0eac9a43eb9a502264736f6c634300080d0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000f429210d0f619f71eaa34f37a6a9545068ef166b000000000000000000000000617544d9c9cee9ebc19dd7d12728dbb72aa36fef
-----Decoded View---------------
Arg [0] : _NFTaddress (address): 0xf429210d0F619F71eAa34f37A6A9545068ef166B
Arg [1] : _withdrawAddress (address): 0x617544D9c9ceE9EbC19dD7d12728dbb72aA36feF
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000f429210d0f619f71eaa34f37a6a9545068ef166b
Arg [1] : 000000000000000000000000617544d9c9cee9ebc19dd7d12728dbb72aa36fef
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.