More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 528 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Get Reward | 20243674 | 21 days ago | IN | 0 ETH | 0.00016943 | ||||
Get Reward | 20155474 | 33 days ago | IN | 0 ETH | 0.0002959 | ||||
Get Reward | 19987302 | 57 days ago | IN | 0 ETH | 0.00041315 | ||||
Stake | 19911201 | 67 days ago | IN | 0 ETH | 0.00123641 | ||||
Get Reward | 19911197 | 67 days ago | IN | 0 ETH | 0.00042644 | ||||
Get Reward | 19892579 | 70 days ago | IN | 0 ETH | 0.00019098 | ||||
Stake | 19757764 | 89 days ago | IN | 0 ETH | 0.00060712 | ||||
Get Reward | 19738841 | 92 days ago | IN | 0 ETH | 0.00045701 | ||||
Get Reward | 19707414 | 96 days ago | IN | 0 ETH | 0.00035473 | ||||
Get Reward | 19672791 | 101 days ago | IN | 0 ETH | 0.00040125 | ||||
Get Reward | 19622606 | 108 days ago | IN | 0 ETH | 0.0008873 | ||||
Claim | 19598366 | 111 days ago | IN | 0 ETH | 0.00110937 | ||||
Get Reward | 19344743 | 147 days ago | IN | 0 ETH | 0.00255924 | ||||
Get Reward | 19205015 | 166 days ago | IN | 0 ETH | 0.00123014 | ||||
Get Reward | 19121623 | 178 days ago | IN | 0 ETH | 0.00136256 | ||||
Get Reward | 19109446 | 180 days ago | IN | 0 ETH | 0.00053582 | ||||
Stake | 19109425 | 180 days ago | IN | 0 ETH | 0.00171683 | ||||
Get Reward | 19081329 | 184 days ago | IN | 0 ETH | 0.00071252 | ||||
Get Reward | 19056010 | 187 days ago | IN | 0 ETH | 0.00063725 | ||||
Get Reward | 19056009 | 187 days ago | IN | 0 ETH | 0.00105622 | ||||
Stake | 18938884 | 204 days ago | IN | 0 ETH | 0.00159804 | ||||
Withdraw | 18938871 | 204 days ago | IN | 0 ETH | 0.00102539 | ||||
Withdraw | 18915899 | 207 days ago | IN | 0 ETH | 0.00279751 | ||||
Stake | 18853666 | 216 days ago | IN | 0 ETH | 0.00247893 | ||||
Stake | 18853399 | 216 days ago | IN | 0 ETH | 0.00365724 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
DroolRewards
Compiler Version
v0.8.10+commit.fc410830
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT /* @@@@@@@ @@@@@@@ @@@@@@ @@@@@@ @@@ @@@@@@@@ @@@@@@@@ @@@@@@@@ @@@@@@@@ @@@ @@! @@@ @@! @@@ @@! @@@ @@! @@@ @@! !@! @!@ !@! @!@ !@! @!@ !@! @!@ !@! @!@ !@! @!@!!@! @!@ !@! @!@ !@! @!! !@! !!! !!@!@! !@! !!! !@! !!! !!! !!: !!! !!: :!! !!: !!! !!: !!! !!: :!: !:! :!: !:! :!: !:! :!: !:! :!: :::: :: :: ::: ::::: :: ::::: :: :: :::: :: : : : : : : : : : : : : :: : : */ pragma solidity ^0.8.0; import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "@openzeppelin/contracts/token/ERC721/utils/ERC721Holder.sol"; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import "@openzeppelin/contracts/security/Pausable.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; abstract contract APMFER { function burn(uint256 tokenId) public virtual; function ownerOf(uint256 tokenId) public virtual returns (address); } contract DroolRewards is ERC721Holder, ReentrancyGuard, Ownable, Pausable { using SafeERC20 for IERC20; IERC20 public immutable drool; IERC721 public immutable apt; // Burning APMFER public immutable apmfer; uint public immutable DROOL_PER_SACRIFICE = 420 ether; // Staking uint256 public immutable DROOL_PER_SECOND = 79861111100000; // 6.9 drool per day uint256 public totalSupply; mapping(address => uint) public lastClaim; mapping(address => uint256) public rewards; mapping(address => uint256) public balances; mapping(uint256 => address) public stakedAssets; event Staked(address indexed user, uint256 amount, uint256[] tokenIds); event Withdrawn(address indexed user, uint256 amount, uint256[] tokenIds); event RewardPaid(address indexed user, uint256 reward); // Airdrop bytes32 public immutable merkleRoot; mapping(address => bool) public hasClaimed; error AlreadyClaimed(); error NotInMerkle(); event Claim(address indexed to, uint256 amount); constructor( address _apt, address _apmfer, address _drool, bytes32 _merkleRoot ) { apt = IERC721(_apt); apmfer = APMFER(_apmfer); drool = IERC20(_drool); merkleRoot = _merkleRoot; } // Airdrop Functions function claim(address to, uint256 amount, bytes32[] calldata proof) external { if (hasClaimed[to]) revert AlreadyClaimed(); bytes32 leaf = keccak256(abi.encodePacked(to, amount)); bool isValidLeaf = MerkleProof.verify(proof, merkleRoot, leaf); if (!isValidLeaf) revert NotInMerkle(); hasClaimed[to] = true; drool.safeTransfer(to, amount); emit Claim(to, amount); } // Burning Functions function sacrificeMfers(uint[] memory tokenIds) external { for(uint x = 0; x < tokenIds.length; x++) { require(apmfer.ownerOf(tokenIds[x]) == msg.sender, "You don't own this mfer"); apmfer.burn(tokenIds[x]); } drool.safeTransfer(msg.sender, DROOL_PER_SACRIFICE * tokenIds.length); } function sacrificeMfer(uint tokenId) external { require(apmfer.ownerOf(tokenId) == msg.sender, "You don't own this mfer"); apmfer.burn(tokenId); drool.safeTransfer(msg.sender, DROOL_PER_SACRIFICE); } // Staking Functions function stake(uint256[] memory tokenIds) external nonReentrant whenNotPaused updateReward(msg.sender) { require(tokenIds.length != 0, "Staking: No tokenIds provided"); uint256 amount; for (uint256 i = 0; i < tokenIds.length; i += 1) { apt.safeTransferFrom(msg.sender, address(this), tokenIds[i]); amount += 1; stakedAssets[tokenIds[i]] = msg.sender; } _stake(amount); emit Staked(msg.sender, amount, tokenIds); } function withdraw(uint256[] memory tokenIds) public nonReentrant updateReward(msg.sender) { require(tokenIds.length != 0, "Staking: No tokenIds provided"); uint256 amount; for (uint256 i = 0; i < tokenIds.length; i += 1) { require( stakedAssets[tokenIds[i]] == msg.sender, "Staking: Not the staker of the token" ); apt.safeTransferFrom(address(this), msg.sender, tokenIds[i]); amount += 1; stakedAssets[tokenIds[i]] = address(0); } _withdraw(amount); emit Withdrawn(msg.sender, amount, tokenIds); } function earned(address account) public view returns (uint256) { uint claimed = lastClaim[account]; return (block.timestamp - claimed) * DROOL_PER_SECOND * balances[account]; } function getReward() public nonReentrant updateReward(msg.sender) { uint256 reward = rewards[msg.sender]; if (reward > 0) { rewards[msg.sender] = 0; drool.safeTransfer(msg.sender, reward); emit RewardPaid(msg.sender, reward); } } function exit(uint256[] memory tokenIds) external { withdraw(tokenIds); getReward(); } function _stake(uint256 _amount) internal { totalSupply += _amount; balances[msg.sender] += _amount; } function _withdraw(uint256 _amount) internal { totalSupply -= _amount; balances[msg.sender] -= _amount; } function pause() external onlyOwner { _pause(); } function unpause() external onlyOwner { _unpause(); } modifier updateReward(address account) { uint total = (block.timestamp - lastClaim[account]) * DROOL_PER_SECOND * balances[account]; if (account != address(0)) { rewards[account] += earned(account); lastClaim[account] = block.timestamp; } _; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; import "../../../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/utils/ERC721Holder.sol) pragma solidity ^0.8.0; import "../IERC721Receiver.sol"; /** * @dev Implementation of the {IERC721Receiver} interface. * * Accepts all token transfers. * Make sure the contract is able to use its token with {IERC721-safeTransferFrom}, {IERC721-approve} or {IERC721-setApprovalForAll}. */ contract ERC721Holder is IERC721Receiver { /** * @dev See {IERC721Receiver-onERC721Received}. * * Always returns `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address, address, uint256, bytes memory ) public virtual override returns (bytes4) { return this.onERC721Received.selector; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (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() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // 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 v4.4.1 (security/Pausable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = _efficientHash(computedHash, proofElement); } else { // Hash(current element of the proof + current computed hash) computedHash = _efficientHash(proofElement, computedHash); } } return computedHash; } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } }
// 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 (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// 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; } }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_apt","type":"address"},{"internalType":"address","name":"_apmfer","type":"address"},{"internalType":"address","name":"_drool","type":"address"},{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyClaimed","type":"error"},{"inputs":[],"name":"NotInMerkle","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claim","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"Withdrawn","type":"event"},{"inputs":[],"name":"DROOL_PER_SACRIFICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DROOL_PER_SECOND","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"apmfer","outputs":[{"internalType":"contract APMFER","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"apt","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"drool","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"earned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"exit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"hasClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastClaim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"sacrificeMfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"sacrificeMfers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakedAssets","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6101406040526816c4abbebea010000060e0908152506548a21d289260610100908152503480156200003057600080fd5b5060405162003893380380620038938339818101604052810190620000569190620002bb565b60016000819055506200007e620000726200014860201b60201c565b6200015060201b60201c565b6000600160146101000a81548160ff0219169083151502179055508373ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250508273ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff16815250508173ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1681525050806101208181525050505050506200032d565b600033905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000248826200021b565b9050919050565b6200025a816200023b565b81146200026657600080fd5b50565b6000815190506200027a816200024f565b92915050565b6000819050919050565b620002958162000280565b8114620002a157600080fd5b50565b600081519050620002b5816200028a565b92915050565b60008060008060808587031215620002d857620002d762000216565b5b6000620002e88782880162000269565b9450506020620002fb8782880162000269565b93505060406200030e8782880162000269565b92505060606200032187828801620002a4565b91505092959194509250565b60805160a05160c05160e051610100516101205161349f620003f460003960008181610c4f0152610d6b01526000818161057e015281816108ba01528181610f55015281816115000152611bb501526000818161077701528181611af90152611b910152600081816105f6015281816106e8015281816114210152818161192e0152611a3a015260008181610a690152818161176a0152611b6d01526000818161079801528181610e28015281816111450152818161126d0152611b24015261349f6000f3fe608060405234801561001057600080fd5b50600436106101a85760003560e01c80635c16e15e116100f95780638da5cb5b116100975780639f52b74e116100715780639f52b74e14610481578063a08e87f91461049f578063d274c85b146104bd578063f2fde38b146104db576101a8565b80638da5cb5b1461042b578063983d95ce146104495780639bc335a514610465576101a8565b806373b2e80e116100d357806373b2e80e146103a35780637d8fc88e146103d35780638456cb591461040357806386c1d6aa1461040d576101a8565b80635c16e15e1461034b5780635c975abb1461037b578063715018a614610399576101a8565b806318c08f26116101665780633d13f874116101405780633d13f874146102fd5780633d18b912146103195780633f4ba83a146103235780635c0a869d1461032d576101a8565b806318c08f261461029357806327e235e3146102af5780632eb4a7ab146102df576101a8565b80628cc262146101ad5780630700037d146101dd5780630ed9781c1461020d5780630fbf0a9314610229578063150b7a021461024557806318160ddd14610275575b600080fd5b6101c760048036038101906101c291906123dd565b6104f7565b6040516101d49190612423565b60405180910390f35b6101f760048036038101906101f291906123dd565b6105c5565b6040516102049190612423565b60405180910390f35b6102276004803603810190610222919061246a565b6105dd565b005b610243600480360381019061023e91906125f0565b6107df565b005b61025f600480360381019061025a91906126ee565b610c07565b60405161026c91906127ac565b60405180910390f35b61027d610c1b565b60405161028a9190612423565b60405180910390f35b6102ad60048036038101906102a891906125f0565b610c21565b005b6102c960048036038101906102c491906123dd565b610c35565b6040516102d69190612423565b60405180910390f35b6102e7610c4d565b6040516102f491906127e0565b60405180910390f35b61031760048036038101906103129190612856565b610c71565b005b610321610ec2565b005b61032b6111e5565b005b61033561126b565b6040516103429190612929565b60405180910390f35b610365600480360381019061036091906123dd565b61128f565b6040516103729190612423565b60405180910390f35b6103836112a7565b604051610390919061295f565b60405180910390f35b6103a16112be565b005b6103bd60048036038101906103b891906123dd565b611346565b6040516103ca919061295f565b60405180910390f35b6103ed60048036038101906103e8919061246a565b611366565b6040516103fa9190612989565b60405180910390f35b61040b611399565b005b61041561141f565b60405161042291906129c5565b60405180910390f35b610433611443565b6040516104409190612989565b60405180910390f35b610463600480360381019061045e91906125f0565b61146d565b005b61047f600480360381019061047a91906125f0565b611909565b005b610489611b6b565b6040516104969190612a01565b60405180910390f35b6104a7611b8f565b6040516104b49190612423565b60405180910390f35b6104c5611bb3565b6040516104d29190612423565b60405180910390f35b6104f560048036038101906104f091906123dd565b611bd7565b005b600080600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020547f000000000000000000000000000000000000000000000000000000000000000082426105a99190612a4b565b6105b39190612a7f565b6105bd9190612a7f565b915050919050565b60046020528060005260406000206000915090505481565b3373ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b815260040161064d9190612423565b6020604051808303816000875af115801561066c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106909190612aee565b73ffffffffffffffffffffffffffffffffffffffff16146106e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106dd90612b78565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166342966c68826040518263ffffffff1660e01b815260040161073f9190612423565b600060405180830381600087803b15801561075957600080fd5b505af115801561076d573d6000803e3d6000fd5b505050506107dc337f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16611ccf9092919063ffffffff16565b50565b60026000541415610825576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081c90612be4565b60405180910390fd5b60026000819055506108356112a7565b15610875576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086c90612c50565b60405180910390fd5b336000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020547f0000000000000000000000000000000000000000000000000000000000000000600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054426109249190612a4b565b61092e9190612a7f565b6109389190612a7f565b9050600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614610a1157610977826104f7565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546109c59190612c70565b9250508190555042600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600083511415610a56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4d90612d12565b60405180910390fd5b600080600090505b8451811015610b9f577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166342842e0e3330888581518110610ab857610ab7612d32565b5b60200260200101516040518463ffffffff1660e01b8152600401610ade93929190612d61565b600060405180830381600087803b158015610af857600080fd5b505af1158015610b0c573d6000803e3d6000fd5b50505050600182610b1d9190612c70565b91503360066000878481518110610b3757610b36612d32565b5b6020026020010151815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600181610b989190612c70565b9050610a5e565b50610ba981611d55565b3373ffffffffffffffffffffffffffffffffffffffff167fb18ab713c223cf8d1394fb3018faad3e87f34414cc9d74b6eff3510d05359d858286604051610bf1929190612e56565b60405180910390a2505050600160008190555050565b600063150b7a0260e01b9050949350505050565b60025481565b610c2a8161146d565b610c32610ec2565b50565b60056020528060005260406000206000915090505481565b7f000000000000000000000000000000000000000000000000000000000000000081565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610cf5576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008484604051602001610d0a929190612eef565b6040516020818303038152906040528051906020012090506000610d90848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050507f000000000000000000000000000000000000000000000000000000000000000084611dc7565b905080610dc9576040517f8a585be200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610e6c86867f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16611ccf9092919063ffffffff16565b8573ffffffffffffffffffffffffffffffffffffffff167f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d486604051610eb29190612423565b60405180910390a2505050505050565b60026000541415610f08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eff90612be4565b60405180910390fd5b6002600081905550336000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020547f0000000000000000000000000000000000000000000000000000000000000000600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205442610fbf9190612a4b565b610fc99190612a7f565b610fd39190612a7f565b9050600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146110ac57611012826104f7565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110609190612c70565b9250508190555042600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111156111d8576000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061118933827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16611ccf9092919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e0486826040516111cf9190612423565b60405180910390a25b5050506001600081905550565b6111ed611dde565b73ffffffffffffffffffffffffffffffffffffffff1661120b611443565b73ffffffffffffffffffffffffffffffffffffffff1614611261576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125890612f67565b60405180910390fd5b611269611de6565b565b7f000000000000000000000000000000000000000000000000000000000000000081565b60036020528060005260406000206000915090505481565b6000600160149054906101000a900460ff16905090565b6112c6611dde565b73ffffffffffffffffffffffffffffffffffffffff166112e4611443565b73ffffffffffffffffffffffffffffffffffffffff161461133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133190612f67565b60405180910390fd5b6113446000611e88565b565b60076020528060005260406000206000915054906101000a900460ff1681565b60066020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6113a1611dde565b73ffffffffffffffffffffffffffffffffffffffff166113bf611443565b73ffffffffffffffffffffffffffffffffffffffff1614611415576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140c90612f67565b60405180910390fd5b61141d611f4e565b565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600260005414156114b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114aa90612be4565b60405180910390fd5b6002600081905550336000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020547f0000000000000000000000000000000000000000000000000000000000000000600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020544261156a9190612a4b565b6115749190612a7f565b61157e9190612a7f565b9050600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611657576115bd826104f7565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461160b9190612c70565b9250508190555042600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b60008351141561169c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169390612d12565b60405180910390fd5b600080600090505b84518110156118a1573373ffffffffffffffffffffffffffffffffffffffff16600660008784815181106116db576116da612d32565b5b6020026020010151815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611768576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175f90612ff9565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166342842e0e30338885815181106117b9576117b8612d32565b5b60200260200101516040518463ffffffff1660e01b81526004016117df93929190612d61565b600060405180830381600087803b1580156117f957600080fd5b505af115801561180d573d6000803e3d6000fd5b5050505060018261181e9190612c70565b915060006006600087848151811061183957611838612d32565b5b6020026020010151815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060018161189a9190612c70565b90506116a4565b506118ab81611ff0565b3373ffffffffffffffffffffffffffffffffffffffff167fd40a9786b597b88b3426158112e3930e09cb031c138a150e367cfe17ff20e30282866040516118f3929190612e56565b60405180910390a2505050600160008190555050565b60005b8151811015611af0573373ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16636352211e84848151811061197b5761197a612d32565b5b60200260200101516040518263ffffffff1660e01b815260040161199f9190612423565b6020604051808303816000875af11580156119be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e29190612aee565b73ffffffffffffffffffffffffffffffffffffffff1614611a38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2f90612b78565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166342966c68838381518110611a8757611a86612d32565b5b60200260200101516040518263ffffffff1660e01b8152600401611aab9190612423565b600060405180830381600087803b158015611ac557600080fd5b505af1158015611ad9573d6000803e3d6000fd5b505050508080611ae890613019565b91505061190c565b50611b683382517f0000000000000000000000000000000000000000000000000000000000000000611b229190612a7f565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16611ccf9092919063ffffffff16565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b611bdf611dde565b73ffffffffffffffffffffffffffffffffffffffff16611bfd611443565b73ffffffffffffffffffffffffffffffffffffffff1614611c53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4a90612f67565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611cc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cba906130d4565b60405180910390fd5b611ccc81611e88565b50565b611d508363a9059cbb60e01b8484604051602401611cee9291906130f4565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612062565b505050565b8060026000828254611d679190612c70565b9250508190555080600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dbd9190612c70565b9250508190555050565b600082611dd48584612129565b1490509392505050565b600033905090565b611dee6112a7565b611e2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2490613169565b60405180910390fd5b6000600160146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611e71611dde565b604051611e7e9190612989565b60405180910390a1565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611f566112a7565b15611f96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8d90612c50565b60405180910390fd5b60018060146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611fd9611dde565b604051611fe69190612989565b60405180910390a1565b80600260008282546120029190612a4b565b9250508190555080600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120589190612a4b565b9250508190555050565b60006120c4826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661219e9092919063ffffffff16565b905060008151111561212457808060200190518101906120e491906131b5565b612123576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211a90613254565b60405180910390fd5b5b505050565b60008082905060005b84518110156121935760008582815181106121505761214f612d32565b5b602002602001015190508083116121725761216b83826121b6565b925061217f565b61217c81846121b6565b92505b50808061218b90613019565b915050612132565b508091505092915050565b60606121ad84846000856121cd565b90509392505050565b600082600052816020526040600020905092915050565b606082471015612212576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612209906132e6565b60405180910390fd5b61221b856122e1565b61225a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225190613352565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161228391906133ec565b60006040518083038185875af1925050503d80600081146122c0576040519150601f19603f3d011682016040523d82523d6000602084013e6122c5565b606091505b50915091506122d5828286612304565b92505050949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6060831561231457829050612364565b6000835111156123275782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235b9190613447565b60405180910390fd5b9392505050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123aa8261237f565b9050919050565b6123ba8161239f565b81146123c557600080fd5b50565b6000813590506123d7816123b1565b92915050565b6000602082840312156123f3576123f2612375565b5b6000612401848285016123c8565b91505092915050565b6000819050919050565b61241d8161240a565b82525050565b60006020820190506124386000830184612414565b92915050565b6124478161240a565b811461245257600080fd5b50565b6000813590506124648161243e565b92915050565b6000602082840312156124805761247f612375565b5b600061248e84828501612455565b91505092915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6124e58261249c565b810181811067ffffffffffffffff82111715612504576125036124ad565b5b80604052505050565b600061251761236b565b905061252382826124dc565b919050565b600067ffffffffffffffff821115612543576125426124ad565b5b602082029050602081019050919050565b600080fd5b600061256c61256784612528565b61250d565b9050808382526020820190506020840283018581111561258f5761258e612554565b5b835b818110156125b857806125a48882612455565b845260208401935050602081019050612591565b5050509392505050565b600082601f8301126125d7576125d6612497565b5b81356125e7848260208601612559565b91505092915050565b60006020828403121561260657612605612375565b5b600082013567ffffffffffffffff8111156126245761262361237a565b5b612630848285016125c2565b91505092915050565b600080fd5b600067ffffffffffffffff821115612659576126586124ad565b5b6126628261249c565b9050602081019050919050565b82818337600083830152505050565b600061269161268c8461263e565b61250d565b9050828152602081018484840111156126ad576126ac612639565b5b6126b884828561266f565b509392505050565b600082601f8301126126d5576126d4612497565b5b81356126e584826020860161267e565b91505092915050565b6000806000806080858703121561270857612707612375565b5b6000612716878288016123c8565b9450506020612727878288016123c8565b935050604061273887828801612455565b925050606085013567ffffffffffffffff8111156127595761275861237a565b5b612765878288016126c0565b91505092959194509250565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6127a681612771565b82525050565b60006020820190506127c1600083018461279d565b92915050565b6000819050919050565b6127da816127c7565b82525050565b60006020820190506127f560008301846127d1565b92915050565b600080fd5b60008083601f84011261281657612815612497565b5b8235905067ffffffffffffffff811115612833576128326127fb565b5b60208301915083602082028301111561284f5761284e612554565b5b9250929050565b600080600080606085870312156128705761286f612375565b5b600061287e878288016123c8565b945050602061288f87828801612455565b935050604085013567ffffffffffffffff8111156128b0576128af61237a565b5b6128bc87828801612800565b925092505092959194509250565b6000819050919050565b60006128ef6128ea6128e58461237f565b6128ca565b61237f565b9050919050565b6000612901826128d4565b9050919050565b6000612913826128f6565b9050919050565b61292381612908565b82525050565b600060208201905061293e600083018461291a565b92915050565b60008115159050919050565b61295981612944565b82525050565b60006020820190506129746000830184612950565b92915050565b6129838161239f565b82525050565b600060208201905061299e600083018461297a565b92915050565b60006129af826128f6565b9050919050565b6129bf816129a4565b82525050565b60006020820190506129da60008301846129b6565b92915050565b60006129eb826128f6565b9050919050565b6129fb816129e0565b82525050565b6000602082019050612a1660008301846129f2565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612a568261240a565b9150612a618361240a565b925082821015612a7457612a73612a1c565b5b828203905092915050565b6000612a8a8261240a565b9150612a958361240a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612ace57612acd612a1c565b5b828202905092915050565b600081519050612ae8816123b1565b92915050565b600060208284031215612b0457612b03612375565b5b6000612b1284828501612ad9565b91505092915050565b600082825260208201905092915050565b7f596f7520646f6e2774206f776e2074686973206d666572000000000000000000600082015250565b6000612b62601783612b1b565b9150612b6d82612b2c565b602082019050919050565b60006020820190508181036000830152612b9181612b55565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000612bce601f83612b1b565b9150612bd982612b98565b602082019050919050565b60006020820190508181036000830152612bfd81612bc1565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000612c3a601083612b1b565b9150612c4582612c04565b602082019050919050565b60006020820190508181036000830152612c6981612c2d565b9050919050565b6000612c7b8261240a565b9150612c868361240a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612cbb57612cba612a1c565b5b828201905092915050565b7f5374616b696e673a204e6f20746f6b656e4964732070726f7669646564000000600082015250565b6000612cfc601d83612b1b565b9150612d0782612cc6565b602082019050919050565b60006020820190508181036000830152612d2b81612cef565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000606082019050612d76600083018661297a565b612d83602083018561297a565b612d906040830184612414565b949350505050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612dcd8161240a565b82525050565b6000612ddf8383612dc4565b60208301905092915050565b6000602082019050919050565b6000612e0382612d98565b612e0d8185612da3565b9350612e1883612db4565b8060005b83811015612e49578151612e308882612dd3565b9750612e3b83612deb565b925050600181019050612e1c565b5085935050505092915050565b6000604082019050612e6b6000830185612414565b8181036020830152612e7d8184612df8565b90509392505050565b60008160601b9050919050565b6000612e9e82612e86565b9050919050565b6000612eb082612e93565b9050919050565b612ec8612ec38261239f565b612ea5565b82525050565b6000819050919050565b612ee9612ee48261240a565b612ece565b82525050565b6000612efb8285612eb7565b601482019150612f0b8284612ed8565b6020820191508190509392505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612f51602083612b1b565b9150612f5c82612f1b565b602082019050919050565b60006020820190508181036000830152612f8081612f44565b9050919050565b7f5374616b696e673a204e6f7420746865207374616b6572206f6620746865207460008201527f6f6b656e00000000000000000000000000000000000000000000000000000000602082015250565b6000612fe3602483612b1b565b9150612fee82612f87565b604082019050919050565b6000602082019050818103600083015261301281612fd6565b9050919050565b60006130248261240a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561305757613056612a1c565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006130be602683612b1b565b91506130c982613062565b604082019050919050565b600060208201905081810360008301526130ed816130b1565b9050919050565b6000604082019050613109600083018561297a565b6131166020830184612414565b9392505050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000613153601483612b1b565b915061315e8261311d565b602082019050919050565b6000602082019050818103600083015261318281613146565b9050919050565b61319281612944565b811461319d57600080fd5b50565b6000815190506131af81613189565b92915050565b6000602082840312156131cb576131ca612375565b5b60006131d9848285016131a0565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b600061323e602a83612b1b565b9150613249826131e2565b604082019050919050565b6000602082019050818103600083015261326d81613231565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b60006132d0602683612b1b565b91506132db82613274565b604082019050919050565b600060208201905081810360008301526132ff816132c3565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b600061333c601d83612b1b565b915061334782613306565b602082019050919050565b6000602082019050818103600083015261336b8161332f565b9050919050565b600081519050919050565b600081905092915050565b60005b838110156133a657808201518184015260208101905061338b565b838111156133b5576000848401525b50505050565b60006133c682613372565b6133d0818561337d565b93506133e0818560208601613388565b80840191505092915050565b60006133f882846133bb565b915081905092915050565b600081519050919050565b600061341982613403565b6134238185612b1b565b9350613433818560208601613388565b61343c8161249c565b840191505092915050565b60006020820190508181036000830152613461818461340e565b90509291505056fea2646970667358221220e4a9cc0572c1e5741306d02be45adaf3b6c62aaaf51ce26ba98bb5e7592f6fd864736f6c634300080a00330000000000000000000000005b98ab35514c1c91f33ba12e0778d53e1ebdb106000000000000000000000000d1e2bc3e1054e0009c64f09ed57e6e17f346667f00000000000000000000000016e85e17fc63d3c49dd9884b870d7900238f87772e9a2bdbbac46f031fd8f160014cb6fcd9be533db99dcc386b66aa33a50cefd6
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101a85760003560e01c80635c16e15e116100f95780638da5cb5b116100975780639f52b74e116100715780639f52b74e14610481578063a08e87f91461049f578063d274c85b146104bd578063f2fde38b146104db576101a8565b80638da5cb5b1461042b578063983d95ce146104495780639bc335a514610465576101a8565b806373b2e80e116100d357806373b2e80e146103a35780637d8fc88e146103d35780638456cb591461040357806386c1d6aa1461040d576101a8565b80635c16e15e1461034b5780635c975abb1461037b578063715018a614610399576101a8565b806318c08f26116101665780633d13f874116101405780633d13f874146102fd5780633d18b912146103195780633f4ba83a146103235780635c0a869d1461032d576101a8565b806318c08f261461029357806327e235e3146102af5780632eb4a7ab146102df576101a8565b80628cc262146101ad5780630700037d146101dd5780630ed9781c1461020d5780630fbf0a9314610229578063150b7a021461024557806318160ddd14610275575b600080fd5b6101c760048036038101906101c291906123dd565b6104f7565b6040516101d49190612423565b60405180910390f35b6101f760048036038101906101f291906123dd565b6105c5565b6040516102049190612423565b60405180910390f35b6102276004803603810190610222919061246a565b6105dd565b005b610243600480360381019061023e91906125f0565b6107df565b005b61025f600480360381019061025a91906126ee565b610c07565b60405161026c91906127ac565b60405180910390f35b61027d610c1b565b60405161028a9190612423565b60405180910390f35b6102ad60048036038101906102a891906125f0565b610c21565b005b6102c960048036038101906102c491906123dd565b610c35565b6040516102d69190612423565b60405180910390f35b6102e7610c4d565b6040516102f491906127e0565b60405180910390f35b61031760048036038101906103129190612856565b610c71565b005b610321610ec2565b005b61032b6111e5565b005b61033561126b565b6040516103429190612929565b60405180910390f35b610365600480360381019061036091906123dd565b61128f565b6040516103729190612423565b60405180910390f35b6103836112a7565b604051610390919061295f565b60405180910390f35b6103a16112be565b005b6103bd60048036038101906103b891906123dd565b611346565b6040516103ca919061295f565b60405180910390f35b6103ed60048036038101906103e8919061246a565b611366565b6040516103fa9190612989565b60405180910390f35b61040b611399565b005b61041561141f565b60405161042291906129c5565b60405180910390f35b610433611443565b6040516104409190612989565b60405180910390f35b610463600480360381019061045e91906125f0565b61146d565b005b61047f600480360381019061047a91906125f0565b611909565b005b610489611b6b565b6040516104969190612a01565b60405180910390f35b6104a7611b8f565b6040516104b49190612423565b60405180910390f35b6104c5611bb3565b6040516104d29190612423565b60405180910390f35b6104f560048036038101906104f091906123dd565b611bd7565b005b600080600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020547f000000000000000000000000000000000000000000000000000048a21d28926082426105a99190612a4b565b6105b39190612a7f565b6105bd9190612a7f565b915050919050565b60046020528060005260406000206000915090505481565b3373ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000d1e2bc3e1054e0009c64f09ed57e6e17f346667f73ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b815260040161064d9190612423565b6020604051808303816000875af115801561066c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106909190612aee565b73ffffffffffffffffffffffffffffffffffffffff16146106e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106dd90612b78565b60405180910390fd5b7f000000000000000000000000d1e2bc3e1054e0009c64f09ed57e6e17f346667f73ffffffffffffffffffffffffffffffffffffffff166342966c68826040518263ffffffff1660e01b815260040161073f9190612423565b600060405180830381600087803b15801561075957600080fd5b505af115801561076d573d6000803e3d6000fd5b505050506107dc337f000000000000000000000000000000000000000000000016c4abbebea01000007f00000000000000000000000016e85e17fc63d3c49dd9884b870d7900238f877773ffffffffffffffffffffffffffffffffffffffff16611ccf9092919063ffffffff16565b50565b60026000541415610825576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081c90612be4565b60405180910390fd5b60026000819055506108356112a7565b15610875576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086c90612c50565b60405180910390fd5b336000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020547f000000000000000000000000000000000000000000000000000048a21d289260600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054426109249190612a4b565b61092e9190612a7f565b6109389190612a7f565b9050600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614610a1157610977826104f7565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546109c59190612c70565b9250508190555042600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600083511415610a56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4d90612d12565b60405180910390fd5b600080600090505b8451811015610b9f577f0000000000000000000000005b98ab35514c1c91f33ba12e0778d53e1ebdb10673ffffffffffffffffffffffffffffffffffffffff166342842e0e3330888581518110610ab857610ab7612d32565b5b60200260200101516040518463ffffffff1660e01b8152600401610ade93929190612d61565b600060405180830381600087803b158015610af857600080fd5b505af1158015610b0c573d6000803e3d6000fd5b50505050600182610b1d9190612c70565b91503360066000878481518110610b3757610b36612d32565b5b6020026020010151815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600181610b989190612c70565b9050610a5e565b50610ba981611d55565b3373ffffffffffffffffffffffffffffffffffffffff167fb18ab713c223cf8d1394fb3018faad3e87f34414cc9d74b6eff3510d05359d858286604051610bf1929190612e56565b60405180910390a2505050600160008190555050565b600063150b7a0260e01b9050949350505050565b60025481565b610c2a8161146d565b610c32610ec2565b50565b60056020528060005260406000206000915090505481565b7f2e9a2bdbbac46f031fd8f160014cb6fcd9be533db99dcc386b66aa33a50cefd681565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610cf5576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008484604051602001610d0a929190612eef565b6040516020818303038152906040528051906020012090506000610d90848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050507f2e9a2bdbbac46f031fd8f160014cb6fcd9be533db99dcc386b66aa33a50cefd684611dc7565b905080610dc9576040517f8a585be200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610e6c86867f00000000000000000000000016e85e17fc63d3c49dd9884b870d7900238f877773ffffffffffffffffffffffffffffffffffffffff16611ccf9092919063ffffffff16565b8573ffffffffffffffffffffffffffffffffffffffff167f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d486604051610eb29190612423565b60405180910390a2505050505050565b60026000541415610f08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eff90612be4565b60405180910390fd5b6002600081905550336000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020547f000000000000000000000000000000000000000000000000000048a21d289260600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205442610fbf9190612a4b565b610fc99190612a7f565b610fd39190612a7f565b9050600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146110ac57611012826104f7565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110609190612c70565b9250508190555042600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111156111d8576000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061118933827f00000000000000000000000016e85e17fc63d3c49dd9884b870d7900238f877773ffffffffffffffffffffffffffffffffffffffff16611ccf9092919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e0486826040516111cf9190612423565b60405180910390a25b5050506001600081905550565b6111ed611dde565b73ffffffffffffffffffffffffffffffffffffffff1661120b611443565b73ffffffffffffffffffffffffffffffffffffffff1614611261576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125890612f67565b60405180910390fd5b611269611de6565b565b7f00000000000000000000000016e85e17fc63d3c49dd9884b870d7900238f877781565b60036020528060005260406000206000915090505481565b6000600160149054906101000a900460ff16905090565b6112c6611dde565b73ffffffffffffffffffffffffffffffffffffffff166112e4611443565b73ffffffffffffffffffffffffffffffffffffffff161461133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133190612f67565b60405180910390fd5b6113446000611e88565b565b60076020528060005260406000206000915054906101000a900460ff1681565b60066020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6113a1611dde565b73ffffffffffffffffffffffffffffffffffffffff166113bf611443565b73ffffffffffffffffffffffffffffffffffffffff1614611415576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140c90612f67565b60405180910390fd5b61141d611f4e565b565b7f000000000000000000000000d1e2bc3e1054e0009c64f09ed57e6e17f346667f81565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600260005414156114b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114aa90612be4565b60405180910390fd5b6002600081905550336000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020547f000000000000000000000000000000000000000000000000000048a21d289260600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020544261156a9190612a4b565b6115749190612a7f565b61157e9190612a7f565b9050600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611657576115bd826104f7565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461160b9190612c70565b9250508190555042600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b60008351141561169c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169390612d12565b60405180910390fd5b600080600090505b84518110156118a1573373ffffffffffffffffffffffffffffffffffffffff16600660008784815181106116db576116da612d32565b5b6020026020010151815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611768576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175f90612ff9565b60405180910390fd5b7f0000000000000000000000005b98ab35514c1c91f33ba12e0778d53e1ebdb10673ffffffffffffffffffffffffffffffffffffffff166342842e0e30338885815181106117b9576117b8612d32565b5b60200260200101516040518463ffffffff1660e01b81526004016117df93929190612d61565b600060405180830381600087803b1580156117f957600080fd5b505af115801561180d573d6000803e3d6000fd5b5050505060018261181e9190612c70565b915060006006600087848151811061183957611838612d32565b5b6020026020010151815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060018161189a9190612c70565b90506116a4565b506118ab81611ff0565b3373ffffffffffffffffffffffffffffffffffffffff167fd40a9786b597b88b3426158112e3930e09cb031c138a150e367cfe17ff20e30282866040516118f3929190612e56565b60405180910390a2505050600160008190555050565b60005b8151811015611af0573373ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000d1e2bc3e1054e0009c64f09ed57e6e17f346667f73ffffffffffffffffffffffffffffffffffffffff16636352211e84848151811061197b5761197a612d32565b5b60200260200101516040518263ffffffff1660e01b815260040161199f9190612423565b6020604051808303816000875af11580156119be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e29190612aee565b73ffffffffffffffffffffffffffffffffffffffff1614611a38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2f90612b78565b60405180910390fd5b7f000000000000000000000000d1e2bc3e1054e0009c64f09ed57e6e17f346667f73ffffffffffffffffffffffffffffffffffffffff166342966c68838381518110611a8757611a86612d32565b5b60200260200101516040518263ffffffff1660e01b8152600401611aab9190612423565b600060405180830381600087803b158015611ac557600080fd5b505af1158015611ad9573d6000803e3d6000fd5b505050508080611ae890613019565b91505061190c565b50611b683382517f000000000000000000000000000000000000000000000016c4abbebea0100000611b229190612a7f565b7f00000000000000000000000016e85e17fc63d3c49dd9884b870d7900238f877773ffffffffffffffffffffffffffffffffffffffff16611ccf9092919063ffffffff16565b50565b7f0000000000000000000000005b98ab35514c1c91f33ba12e0778d53e1ebdb10681565b7f000000000000000000000000000000000000000000000016c4abbebea010000081565b7f000000000000000000000000000000000000000000000000000048a21d28926081565b611bdf611dde565b73ffffffffffffffffffffffffffffffffffffffff16611bfd611443565b73ffffffffffffffffffffffffffffffffffffffff1614611c53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4a90612f67565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611cc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cba906130d4565b60405180910390fd5b611ccc81611e88565b50565b611d508363a9059cbb60e01b8484604051602401611cee9291906130f4565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612062565b505050565b8060026000828254611d679190612c70565b9250508190555080600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dbd9190612c70565b9250508190555050565b600082611dd48584612129565b1490509392505050565b600033905090565b611dee6112a7565b611e2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2490613169565b60405180910390fd5b6000600160146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611e71611dde565b604051611e7e9190612989565b60405180910390a1565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611f566112a7565b15611f96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8d90612c50565b60405180910390fd5b60018060146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611fd9611dde565b604051611fe69190612989565b60405180910390a1565b80600260008282546120029190612a4b565b9250508190555080600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120589190612a4b565b9250508190555050565b60006120c4826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661219e9092919063ffffffff16565b905060008151111561212457808060200190518101906120e491906131b5565b612123576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211a90613254565b60405180910390fd5b5b505050565b60008082905060005b84518110156121935760008582815181106121505761214f612d32565b5b602002602001015190508083116121725761216b83826121b6565b925061217f565b61217c81846121b6565b92505b50808061218b90613019565b915050612132565b508091505092915050565b60606121ad84846000856121cd565b90509392505050565b600082600052816020526040600020905092915050565b606082471015612212576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612209906132e6565b60405180910390fd5b61221b856122e1565b61225a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225190613352565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161228391906133ec565b60006040518083038185875af1925050503d80600081146122c0576040519150601f19603f3d011682016040523d82523d6000602084013e6122c5565b606091505b50915091506122d5828286612304565b92505050949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6060831561231457829050612364565b6000835111156123275782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235b9190613447565b60405180910390fd5b9392505050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123aa8261237f565b9050919050565b6123ba8161239f565b81146123c557600080fd5b50565b6000813590506123d7816123b1565b92915050565b6000602082840312156123f3576123f2612375565b5b6000612401848285016123c8565b91505092915050565b6000819050919050565b61241d8161240a565b82525050565b60006020820190506124386000830184612414565b92915050565b6124478161240a565b811461245257600080fd5b50565b6000813590506124648161243e565b92915050565b6000602082840312156124805761247f612375565b5b600061248e84828501612455565b91505092915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6124e58261249c565b810181811067ffffffffffffffff82111715612504576125036124ad565b5b80604052505050565b600061251761236b565b905061252382826124dc565b919050565b600067ffffffffffffffff821115612543576125426124ad565b5b602082029050602081019050919050565b600080fd5b600061256c61256784612528565b61250d565b9050808382526020820190506020840283018581111561258f5761258e612554565b5b835b818110156125b857806125a48882612455565b845260208401935050602081019050612591565b5050509392505050565b600082601f8301126125d7576125d6612497565b5b81356125e7848260208601612559565b91505092915050565b60006020828403121561260657612605612375565b5b600082013567ffffffffffffffff8111156126245761262361237a565b5b612630848285016125c2565b91505092915050565b600080fd5b600067ffffffffffffffff821115612659576126586124ad565b5b6126628261249c565b9050602081019050919050565b82818337600083830152505050565b600061269161268c8461263e565b61250d565b9050828152602081018484840111156126ad576126ac612639565b5b6126b884828561266f565b509392505050565b600082601f8301126126d5576126d4612497565b5b81356126e584826020860161267e565b91505092915050565b6000806000806080858703121561270857612707612375565b5b6000612716878288016123c8565b9450506020612727878288016123c8565b935050604061273887828801612455565b925050606085013567ffffffffffffffff8111156127595761275861237a565b5b612765878288016126c0565b91505092959194509250565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6127a681612771565b82525050565b60006020820190506127c1600083018461279d565b92915050565b6000819050919050565b6127da816127c7565b82525050565b60006020820190506127f560008301846127d1565b92915050565b600080fd5b60008083601f84011261281657612815612497565b5b8235905067ffffffffffffffff811115612833576128326127fb565b5b60208301915083602082028301111561284f5761284e612554565b5b9250929050565b600080600080606085870312156128705761286f612375565b5b600061287e878288016123c8565b945050602061288f87828801612455565b935050604085013567ffffffffffffffff8111156128b0576128af61237a565b5b6128bc87828801612800565b925092505092959194509250565b6000819050919050565b60006128ef6128ea6128e58461237f565b6128ca565b61237f565b9050919050565b6000612901826128d4565b9050919050565b6000612913826128f6565b9050919050565b61292381612908565b82525050565b600060208201905061293e600083018461291a565b92915050565b60008115159050919050565b61295981612944565b82525050565b60006020820190506129746000830184612950565b92915050565b6129838161239f565b82525050565b600060208201905061299e600083018461297a565b92915050565b60006129af826128f6565b9050919050565b6129bf816129a4565b82525050565b60006020820190506129da60008301846129b6565b92915050565b60006129eb826128f6565b9050919050565b6129fb816129e0565b82525050565b6000602082019050612a1660008301846129f2565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612a568261240a565b9150612a618361240a565b925082821015612a7457612a73612a1c565b5b828203905092915050565b6000612a8a8261240a565b9150612a958361240a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612ace57612acd612a1c565b5b828202905092915050565b600081519050612ae8816123b1565b92915050565b600060208284031215612b0457612b03612375565b5b6000612b1284828501612ad9565b91505092915050565b600082825260208201905092915050565b7f596f7520646f6e2774206f776e2074686973206d666572000000000000000000600082015250565b6000612b62601783612b1b565b9150612b6d82612b2c565b602082019050919050565b60006020820190508181036000830152612b9181612b55565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000612bce601f83612b1b565b9150612bd982612b98565b602082019050919050565b60006020820190508181036000830152612bfd81612bc1565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000612c3a601083612b1b565b9150612c4582612c04565b602082019050919050565b60006020820190508181036000830152612c6981612c2d565b9050919050565b6000612c7b8261240a565b9150612c868361240a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612cbb57612cba612a1c565b5b828201905092915050565b7f5374616b696e673a204e6f20746f6b656e4964732070726f7669646564000000600082015250565b6000612cfc601d83612b1b565b9150612d0782612cc6565b602082019050919050565b60006020820190508181036000830152612d2b81612cef565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000606082019050612d76600083018661297a565b612d83602083018561297a565b612d906040830184612414565b949350505050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612dcd8161240a565b82525050565b6000612ddf8383612dc4565b60208301905092915050565b6000602082019050919050565b6000612e0382612d98565b612e0d8185612da3565b9350612e1883612db4565b8060005b83811015612e49578151612e308882612dd3565b9750612e3b83612deb565b925050600181019050612e1c565b5085935050505092915050565b6000604082019050612e6b6000830185612414565b8181036020830152612e7d8184612df8565b90509392505050565b60008160601b9050919050565b6000612e9e82612e86565b9050919050565b6000612eb082612e93565b9050919050565b612ec8612ec38261239f565b612ea5565b82525050565b6000819050919050565b612ee9612ee48261240a565b612ece565b82525050565b6000612efb8285612eb7565b601482019150612f0b8284612ed8565b6020820191508190509392505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612f51602083612b1b565b9150612f5c82612f1b565b602082019050919050565b60006020820190508181036000830152612f8081612f44565b9050919050565b7f5374616b696e673a204e6f7420746865207374616b6572206f6620746865207460008201527f6f6b656e00000000000000000000000000000000000000000000000000000000602082015250565b6000612fe3602483612b1b565b9150612fee82612f87565b604082019050919050565b6000602082019050818103600083015261301281612fd6565b9050919050565b60006130248261240a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561305757613056612a1c565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006130be602683612b1b565b91506130c982613062565b604082019050919050565b600060208201905081810360008301526130ed816130b1565b9050919050565b6000604082019050613109600083018561297a565b6131166020830184612414565b9392505050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000613153601483612b1b565b915061315e8261311d565b602082019050919050565b6000602082019050818103600083015261318281613146565b9050919050565b61319281612944565b811461319d57600080fd5b50565b6000815190506131af81613189565b92915050565b6000602082840312156131cb576131ca612375565b5b60006131d9848285016131a0565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b600061323e602a83612b1b565b9150613249826131e2565b604082019050919050565b6000602082019050818103600083015261326d81613231565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b60006132d0602683612b1b565b91506132db82613274565b604082019050919050565b600060208201905081810360008301526132ff816132c3565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b600061333c601d83612b1b565b915061334782613306565b602082019050919050565b6000602082019050818103600083015261336b8161332f565b9050919050565b600081519050919050565b600081905092915050565b60005b838110156133a657808201518184015260208101905061338b565b838111156133b5576000848401525b50505050565b60006133c682613372565b6133d0818561337d565b93506133e0818560208601613388565b80840191505092915050565b60006133f882846133bb565b915081905092915050565b600081519050919050565b600061341982613403565b6134238185612b1b565b9350613433818560208601613388565b61343c8161249c565b840191505092915050565b60006020820190508181036000830152613461818461340e565b90509291505056fea2646970667358221220e4a9cc0572c1e5741306d02be45adaf3b6c62aaaf51ce26ba98bb5e7592f6fd864736f6c634300080a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000005b98ab35514c1c91f33ba12e0778d53e1ebdb106000000000000000000000000d1e2bc3e1054e0009c64f09ed57e6e17f346667f00000000000000000000000016e85e17fc63d3c49dd9884b870d7900238f87772e9a2bdbbac46f031fd8f160014cb6fcd9be533db99dcc386b66aa33a50cefd6
-----Decoded View---------------
Arg [0] : _apt (address): 0x5B98Ab35514C1C91F33ba12E0778D53E1eBDb106
Arg [1] : _apmfer (address): 0xD1e2Bc3E1054e0009C64f09Ed57E6E17f346667f
Arg [2] : _drool (address): 0x16e85E17FC63D3C49Dd9884b870D7900238F8777
Arg [3] : _merkleRoot (bytes32): 0x2e9a2bdbbac46f031fd8f160014cb6fcd9be533db99dcc386b66aa33a50cefd6
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000005b98ab35514c1c91f33ba12e0778d53e1ebdb106
Arg [1] : 000000000000000000000000d1e2bc3e1054e0009c64f09ed57e6e17f346667f
Arg [2] : 00000000000000000000000016e85e17fc63d3c49dd9884b870d7900238f8777
Arg [3] : 2e9a2bdbbac46f031fd8f160014cb6fcd9be533db99dcc386b66aa33a50cefd6
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.