Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
9,023 UwU
Holders
776
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
10 UwULoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
Wheyfu
Compiler Version
v0.8.16+commit.07a7930e
Optimization Enabled:
Yes with 1000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity 0.8.16;import {Math} from "@openzeppelin/contracts/utils/math/Math.sol";import {IERC721} from "@openzeppelin/contracts/token/ERC721/IERC721.sol";import {IERC721Enumerable} from "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol";import {ERC721, ERC721TokenReceiver} from "solmate/tokens/ERC721.sol";import {ERC721A} from "ERC721A/ERC721A.sol";import {Owned} from "solmate/auth/Owned.sol";import {LSSVMPairMissingEnumerableETH} from "lssvm/LSSVMPairMissingEnumerableETH.sol";import {PuttyV2} from "putty-v2/PuttyV2.sol";import {SafeTransferLib} from "solmate/utils/SafeTransferLib.sol";import {MintBurnToken} from "./lib/MintBurnToken.sol";import {OptionBonding} from "./OptionBonding.sol";import {FeeBonding} from "./FeeBonding.sol";/*** @notice hiya! ~~ welcome to wheyfus :3 ~* General overview:** Wheyfus is an NFT collection with a max supply of 30,000.* 9000 is distributed via a free mint.* 18000 is reserved for yield farming (distributed over 900 days).* 3000 is minted to the team.*
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/Math.sol)pragma solidity ^0.8.0;/*** @dev Standard math utilities missing in the Solidity language.*/library Math {enum Rounding {Down, // Toward negative infinityUp, // Toward infinityZero // Toward zero}/*** @dev Returns the largest of two numbers.*/function max(uint256 a, uint256 b) internal pure returns (uint256) {return a >= b ? a : b;}/*** @dev Returns the smallest of two numbers.*/function min(uint256 a, uint256 b) internal pure returns (uint256) {
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.7.0) (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);
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)pragma solidity ^0.8.0;import "../IERC721.sol";/*** @title ERC-721 Non-Fungible Token Standard, optional enumeration extension* @dev See https://eips.ethereum.org/EIPS/eip-721*/interface IERC721Enumerable is IERC721 {/*** @dev Returns the total amount of tokens stored by the contract.*/function totalSupply() external view returns (uint256);/*** @dev Returns a token ID owned by `owner` at a given `index` of its token list.* Use along with {balanceOf} to enumerate all of ``owner``'s tokens.*/function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);/*** @dev Returns a token ID at a given `index` of all the tokens stored by the contract.* Use along with {totalSupply} to enumerate all tokens.
1234567891011121314151617181920212223242526// SPDX-License-Identifier: AGPL-3.0-onlypragma solidity >=0.8.0;/// @notice Modern, minimalist, and gas efficient ERC-721 implementation./// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC721.sol)abstract contract ERC721 {/*//////////////////////////////////////////////////////////////EVENTS//////////////////////////////////////////////////////////////*/event Transfer(address indexed from, address indexed to, uint256 indexed id);event Approval(address indexed owner, address indexed spender, uint256 indexed id);event ApprovalForAll(address indexed owner, address indexed operator, bool approved);/*//////////////////////////////////////////////////////////////METADATA STORAGE/LOGIC//////////////////////////////////////////////////////////////*/string public name;string public symbol;function tokenURI(uint256 id) public view virtual returns (string memory);
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// ERC721A Contracts v4.2.2// Creator: Chiru Labspragma solidity ^0.8.4;import './IERC721A.sol';/*** @dev Interface of ERC721 token receiver.*/interface ERC721A__IERC721Receiver {function onERC721Received(address operator,address from,uint256 tokenId,bytes calldata data) external returns (bytes4);}/*** @title ERC721A** @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721)* Non-Fungible Token Standard, including the Metadata extension.* Optimized for lower gas during batch mints.
1234567891011121314151617181920212223242526// SPDX-License-Identifier: AGPL-3.0-onlypragma solidity >=0.8.0;/// @notice Simple single owner authorization mixin./// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/auth/Owned.sol)abstract contract Owned {/*//////////////////////////////////////////////////////////////EVENTS//////////////////////////////////////////////////////////////*/event OwnerUpdated(address indexed user, address indexed newOwner);/*//////////////////////////////////////////////////////////////OWNERSHIP STORAGE//////////////////////////////////////////////////////////////*/address public owner;modifier onlyOwner() virtual {require(msg.sender == owner, "UNAUTHORIZED");_;}/*//////////////////////////////////////////////////////////////CONSTRUCTOR
1234567891011121314151617181920// SPDX-License-Identifier: AGPL-3.0pragma solidity ^0.8.0;import {LSSVMPairETH} from "./LSSVMPairETH.sol";import {LSSVMPairMissingEnumerable} from "./LSSVMPairMissingEnumerable.sol";import {ILSSVMPairFactoryLike} from "./ILSSVMPairFactoryLike.sol";contract LSSVMPairMissingEnumerableETH isLSSVMPairMissingEnumerable,LSSVMPairETH{function pairVariant()publicpureoverridereturns (ILSSVMPairFactoryLike.PairVariant){return ILSSVMPairFactoryLike.PairVariant.MISSING_ENUMERABLE_ETH;}}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity 0.8.16;/**██████╗ ██╗ ██╗████████╗████████╗██╗ ██╗ ██╗ ██╗██████╗██╔══██╗██║ ██║╚══██╔══╝╚══██╔══╝╚██╗ ██╔╝ ██║ ██║╚════██╗██████╔╝██║ ██║ ██║ ██║ ╚████╔╝ ██║ ██║ █████╔╝██╔═══╝ ██║ ██║ ██║ ██║ ╚██╔╝ ╚██╗ ██╔╝██╔═══╝██║ ╚██████╔╝ ██║ ██║ ██║ ╚████╔╝ ███████╗╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ╚═══╝ ╚══════╝_..._.' '. _/ .-""-\ _/ \.-| /:. | | | bussin| \ |:. /.-'-./| .-'-;:__.' =/.'= *=| _.='/ _. | ; minister you satoshi;-.-'| \ |/ | \ _\ _\\__/'._;. ==' ==\\ \ |/ / /
1234567891011121314151617181920212223242526// SPDX-License-Identifier: AGPL-3.0-onlypragma solidity >=0.8.0;import {ERC20} from "../tokens/ERC20.sol";/// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values./// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/SafeTransferLib.sol)/// @dev Use with caution! Some functions in this library knowingly create dirty bits at the destination of the free memory pointer./// @dev Note that none of the functions in this library check that a token has code at all! That responsibility is delegated to the caller.library SafeTransferLib {/*//////////////////////////////////////////////////////////////ETH OPERATIONS//////////////////////////////////////////////////////////////*/function safeTransferETH(address to, uint256 amount) internal {bool success;assembly {// Transfer the ETH and store if it succeeded or not.success := call(gas(), to, amount, 0, 0, 0, 0)}require(success, "ETH_TRANSFER_FAILED");}/*//////////////////////////////////////////////////////////////
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity 0.8.16;import {ERC20} from "solmate/tokens/ERC20.sol";import {Owned} from "solmate/auth/Owned.sol";contract MintBurnToken is ERC20, Owned {mapping(address => bool) public whitelistedMinterBurner;constructor(string memory _name, string memory _symbol, uint8 _decimals)ERC20(_name, _symbol, _decimals)Owned(msg.sender){}modifier onlyMinterBurner() virtual {require(whitelistedMinterBurner[msg.sender], "UNAUTHORIZED");_;}function setMinterBurner(address target, bool authorized) public onlyOwner {whitelistedMinterBurner[target] = authorized;}function mint(address to, uint256 amount) public onlyMinterBurner {_mint(to, amount);}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity 0.8.16;import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";import {Math} from "@openzeppelin/contracts/utils/math/Math.sol";import {IERC1271} from "@openzeppelin/contracts/interfaces/IERC1271.sol";import {Owned} from "solmate/auth/Owned.sol";import {PuttyV2} from "putty-v2/PuttyV2.sol";import {MintBurnToken} from "./lib/MintBurnToken.sol";import {BondingNft} from "./lib/BondingNft.sol";/*** @notice Option bonding stufffff.** LP's stake their LP tokens for preset bond durations. In return they receive* call option token rewards which are distributed linearly over time. Option token* rewards can be claimed after the bond matures. The longer the bond duration, the* higher the yield boost.** The option ERC20 tokens can be converted for actual call option contracts on putty via the* convertToOption() method. Each call option has a strike of 0.1 ether per NFT and expires* in 5 years from now. When the option is exercised, the wheyfus are minted to your wallet.** @author 0xacedia*/
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity 0.8.16;import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";import {Math} from "@openzeppelin/contracts/utils/math/Math.sol";import {IERC1271} from "@openzeppelin/contracts/interfaces/IERC1271.sol";import {ERC721} from "solmate/tokens/ERC721.sol";import {Owned} from "solmate/auth/Owned.sol";import {PuttyV2} from "putty-v2/PuttyV2.sol";import {LSSVMPairMissingEnumerableETH} from "lssvm/LSSVMPairMissingEnumerableETH.sol";import {SafeTransferLib} from "solmate/utils/SafeTransferLib.sol";import {MintBurnToken} from "./lib/MintBurnToken.sol";import {BondingNft} from "./lib/BondingNft.sol";/*** @notice Fee bonding stuff.** LP's stake their LP tokens for preset bond durations. In return they receive* fee rewards from the shared sudo xyk pool. Fees can be claimed after the bond matures.* The longer the bond duration, the higher the yield boost. Fees are distributed via the* skim() method.** @author 0xacedia*/contract FeeBonding {
12345678910111213141516171819202122232425// 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);}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// ERC721A Contracts v4.2.2// Creator: Chiru Labspragma solidity ^0.8.4;/*** @dev Interface of ERC721A.*/interface IERC721A {/*** The caller must own the token or be an approved operator.*/error ApprovalCallerNotOwnerNorApproved();/*** The token does not exist.*/error ApprovalQueryForNonexistentToken();/*** The caller cannot approve to their own address.*/error ApproveToCaller();/**
1234567891011121314151617181920212223242526// SPDX-License-Identifier: AGPL-3.0pragma solidity ^0.8.0;import {ERC20} from "solmate/tokens/ERC20.sol";import {IERC721} from "@openzeppelin/contracts/token/ERC721/IERC721.sol";import {SafeTransferLib} from "solmate/utils/SafeTransferLib.sol";import {LSSVMPair} from "./LSSVMPair.sol";import {ILSSVMPairFactoryLike} from "./ILSSVMPairFactoryLike.sol";import {ICurve} from "./bonding-curves/ICurve.sol";/**@title An NFT/Token pair where the token is ETH@author boredGenius and 0xmons*/abstract contract LSSVMPairETH is LSSVMPair {using SafeTransferLib for address payable;using SafeTransferLib for ERC20;uint256 internal constant IMMUTABLE_PARAMS_LENGTH = 61;/// @inheritdoc LSSVMPairfunction _pullTokenInputAndPayProtocolFee(uint256 inputAmount,bool, /*isRouter*/address, /*routerCaller*/ILSSVMPairFactoryLike _factory,
1234567891011121314151617181920212223242526// SPDX-License-Identifier: AGPL-3.0pragma solidity ^0.8.0;import {IERC721} from "@openzeppelin/contracts/token/ERC721/IERC721.sol";import {EnumerableSet} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";import {LSSVMPair} from "./LSSVMPair.sol";import {LSSVMRouter} from "./LSSVMRouter.sol";import {ILSSVMPairFactoryLike} from "./ILSSVMPairFactoryLike.sol";/**@title An NFT/Token pair for an NFT that does not implement ERC721Enumerable@author boredGenius and 0xmons*/abstract contract LSSVMPairMissingEnumerable is LSSVMPair {using EnumerableSet for EnumerableSet.UintSet;// Used for internal ID trackingEnumerableSet.UintSet private idSet;/// @inheritdoc LSSVMPairfunction _sendAnyNFTsToRecipient(IERC721 _nft,address nftRecipient,uint256 numNFTs) internal override {// Send NFTs to recipient
1234567891011121314151617181920212223242526// SPDX-License-Identifier: AGPL-3.0pragma solidity ^0.8.0;import {LSSVMRouter} from "./LSSVMRouter.sol";interface ILSSVMPairFactoryLike {enum PairVariant {ENUMERABLE_ETH,MISSING_ENUMERABLE_ETH,ENUMERABLE_ERC20,MISSING_ENUMERABLE_ERC20}function protocolFeeMultiplier() external view returns (uint256);function protocolFeeRecipient() external view returns (address payable);function callAllowed(address target) external view returns (bool);function routerStatus(LSSVMRouter router)externalviewreturns (bool allowed, bool wasEverAllowed);function isPair(address potentialPair, PairVariant variant)external
12345678910111213141516171819202122232425// SPDX-License-Identifier: MITpragma solidity 0.8.16;interface IWETH {event Approval(address indexed src, address indexed guy, uint256 wad);event Transfer(address indexed src, address indexed dst, uint256 wad);event Deposit(address indexed dst, uint256 wad);event Withdrawal(address indexed src, uint256 wad);function deposit() external payable;function withdraw(uint256 wad) external;function totalSupply() external view returns (uint256);function approve(address guy, uint256 wad) external returns (bool);function transfer(address dst, uint256 wad) external returns (bool);function transferFrom(address src,address dst,uint256 wad) external returns (bool);}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/SignatureChecker.sol)pragma solidity ^0.8.0;import "./ECDSA.sol";import "../Address.sol";import "../../interfaces/IERC1271.sol";/*** @dev Signature verification helper that can be used instead of `ECDSA.recover` to seamlessly support both ECDSA* signatures from externally owned accounts (EOAs) as well as ERC1271 signatures from smart contract wallets like* Argent and Gnosis Safe.** _Available since v4.1._*/library SignatureChecker {/*** @dev Checks if a signature is valid for a given signer and data hash. If the signer is a smart contract, the* signature is validated against that smart contract using ERC1271, otherwise it's validated using `ECDSA.recover`.** NOTE: Unlike ECDSA signatures, contract signatures are revocable, and the outcome of this function can thus* change through time. It could return true at block N and false at block N+1 (or the opposite).*/function isValidSignatureNow(address signer,
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol)pragma solidity ^0.8.0;import "./ECDSA.sol";/*** @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.** The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,* thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding* they need in their contracts using a combination of `abi.encode` and `keccak256`.** This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding* scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA* ({_hashTypedDataV4}).** The implementation of the domain separator was designed to be as efficient as possible while still properly updating* the chain id to protect against replay attacks on an eventual fork of the chain.** NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method* https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].** _Available since v3.4._*/
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)pragma solidity ^0.8.0;/*** @dev String operations.*/library Strings {bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";uint8 private constant _ADDRESS_LENGTH = 20;/*** @dev Converts a `uint256` to its ASCII `string` decimal representation.*/function toString(uint256 value) internal pure returns (string memory) {// Inspired by OraclizeAPI's implementation - MIT licence// https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.solif (value == 0) {return "0";}uint256 temp = value;uint256 digits;while (temp != 0) {digits++;
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165Checker.sol)pragma solidity ^0.8.0;import "./IERC165.sol";/*** @dev Library used to query support of an interface declared via {IERC165}.** Note that these functions return the actual result of the query: they do not* `revert` if an interface is not supported. It is up to the caller to decide* what to do in these cases.*/library ERC165Checker {// As per the EIP-165 spec, no interface should ever match 0xffffffffbytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff;/*** @dev Returns true if `account` supports the {IERC165} interface,*/function supportsERC165(address account) internal view returns (bool) {// Any contract that implements ERC165 must explicitly indicate support of// InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalidreturn_supportsERC165Interface(account, type(IERC165).interfaceId) &&
1234567891011121314151617181920212223242526// 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.
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity 0.8.16;import "solmate/tokens/ERC721.sol";// removes balanceOf modifications// questionable tradeoff but given our use-case it's reasonableabstract contract PuttyV2Nft is ERC721("Putty", "OPUT") {// remove balanceOf modificationsfunction _mint(address to, uint256 id) internal override {require(to != address(0), "INVALID_RECIPIENT");require(_ownerOf[id] == address(0), "ALREADY_MINTED");_ownerOf[id] = to;emit Transfer(address(0), to, id);}// remove balanceOf modificationsfunction transferFrom(address from,address to,uint256 id) public override {require(from == _ownerOf[id], "WRONG_FROM");require(to != address(0), "INVALID_RECIPIENT");
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity 0.8.16;import "./PuttyV2.sol";interface IPuttyV2Handler {function onFillOrder(PuttyV2.Order memory order,address taker,uint256[] memory floorAssetTokenIds) external;function onExercise(PuttyV2.Order memory order,address exerciser,uint256[] memory floorAssetTokenIds) external;}contract PuttyV2Handler {function onFillOrder(PuttyV2.Order memory order,address taker,uint256[] memory floorAssetTokenIds) public virtual {}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: AGPL-3.0-onlypragma solidity >=0.8.0;/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation./// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol)/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it.abstract contract ERC20 {/*//////////////////////////////////////////////////////////////EVENTS//////////////////////////////////////////////////////////////*/event Transfer(address indexed from, address indexed to, uint256 amount);event Approval(address indexed owner, address indexed spender, uint256 amount);/*//////////////////////////////////////////////////////////////METADATA STORAGE//////////////////////////////////////////////////////////////*/string public name;string public symbol;uint8 public immutable decimals;
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)pragma solidity ^0.8.0;/*** @dev Interface of the ERC20 standard as defined in the EIP.*/interface IERC20 {/*** @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);/*** @dev Returns the amount of tokens in existence.*/
12345678910111213141516171819// SPDX-License-Identifier: MIT// OpenZeppelin Contracts v4.4.1 (interfaces/IERC1271.sol)pragma solidity ^0.8.0;/*** @dev Interface of the ERC1271 standard signature validation method for* contracts as defined in https://eips.ethereum.org/EIPS/eip-1271[ERC-1271].** _Available since v4.1._*/interface IERC1271 {/*** @dev Should return whether the signature provided is valid for the provided data* @param hash Hash of the data to be signed* @param signature Signature byte array associated with _data*/function isValidSignature(bytes32 hash, bytes memory signature) external view returns (bytes4 magicValue);}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity 0.8.16;import {ERC721} from "solmate/tokens/ERC721.sol";import {Owned} from "solmate/auth/Owned.sol";/*** @dev Removes all the balanceOf parts for gas savings.*/contract BondingNft is ERC721, Owned {constructor(string memory name, string memory symbol) ERC721(name, symbol) Owned(msg.sender) {}function mint(address to, uint256 id) public onlyOwner {_mint(to, id);}function burn(uint256 id) public onlyOwner {_burn(id);}function _mint(address to, uint256 id) internal override {require(to != address(0), "INVALID_RECIPIENT");require(_ownerOf[id] == address(0), "ALREADY_MINTED");_ownerOf[id] = to;
1234567891011121314151617181920212223242526// SPDX-License-Identifier: AGPL-3.0pragma solidity ^0.8.0;import {ERC20} from "solmate/tokens/ERC20.sol";import {IERC721} from "@openzeppelin/contracts/token/ERC721/IERC721.sol";import {IERC1155} from "@openzeppelin/contracts/token/ERC1155/IERC1155.sol";import {OwnableWithTransferCallback} from "./lib/OwnableWithTransferCallback.sol";import {ReentrancyGuard} from "./lib/ReentrancyGuard.sol";import {ICurve} from "./bonding-curves/ICurve.sol";import {LSSVMRouter} from "./LSSVMRouter.sol";import {ILSSVMPairFactoryLike} from "./ILSSVMPairFactoryLike.sol";import {CurveErrorCodes} from "./bonding-curves/CurveErrorCodes.sol";import {ERC1155Holder} from "@openzeppelin/contracts/token/ERC1155/utils/ERC1155Holder.sol";/// @title The base contract for an NFT/TOKEN AMM pair/// @author boredGenius and 0xmons/// @notice This implements the core swap logic from NFT to TOKENabstract contract LSSVMPair isOwnableWithTransferCallback,ReentrancyGuard,ERC1155Holder{enum PoolType {TOKEN,NFT,TRADE
12345678910111213141516171819202122232425// SPDX-License-Identifier: AGPL-3.0pragma solidity ^0.8.0;import {CurveErrorCodes} from "./CurveErrorCodes.sol";interface ICurve {/**@notice Validates if a delta value is valid for the curve. The criteria forvalidity can be different for each type of curve, for instance ExponentialCurverequires delta to be greater than 1.@param delta The delta value to be validated@return valid True if delta is valid, false otherwise*/function validateDelta(uint128 delta) external pure returns (bool valid);/**@notice Validates if a new spot price is valid for the curve. Spot price is generally assumed to be the immediate sell price of 1 NFT to thepool, in units of the pool's paired token.@param newSpotPrice The new spot price to be set@return valid True if the new spot price is valid, false otherwise*/function validateSpotPrice(uint128 newSpotPrice)externalviewreturns (bool valid);
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.7.0) (utils/structs/EnumerableSet.sol)pragma solidity ^0.8.0;/*** @dev Library for managing* https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive* types.** Sets have the following properties:** - Elements are added, removed, and checked for existence in constant time* (O(1)).* - Elements are enumerated in O(n). No guarantees are made on the ordering.** ```* contract Example {* // Add the library methods* using EnumerableSet for EnumerableSet.AddressSet;** // Declare a set state variable* EnumerableSet.AddressSet private mySet;* }* ```*
1234567891011121314151617181920212223242526// SPDX-License-Identifier: AGPL-3.0pragma solidity ^0.8.0;import {IERC721} from "@openzeppelin/contracts/token/ERC721/IERC721.sol";import {ERC20} from "solmate/tokens/ERC20.sol";import {SafeTransferLib} from "solmate/utils/SafeTransferLib.sol";import {LSSVMPair} from "./LSSVMPair.sol";import {ILSSVMPairFactoryLike} from "./ILSSVMPairFactoryLike.sol";import {CurveErrorCodes} from "./bonding-curves/CurveErrorCodes.sol";contract LSSVMRouter {using SafeTransferLib for address payable;using SafeTransferLib for ERC20;struct PairSwapAny {LSSVMPair pair;uint256 numItems;}struct PairSwapSpecific {LSSVMPair pair;uint256[] nftIds;}struct RobustPairSwapAny {PairSwapAny swapInfo;
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/ECDSA.sol)pragma solidity ^0.8.0;import "../Strings.sol";/*** @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.** These functions can be used to verify that a message was signed by the holder* of the private keys of a given address.*/library ECDSA {enum RecoverError {NoError,InvalidSignature,InvalidSignatureLength,InvalidSignatureS,InvalidSignatureV}function _throwError(RecoverError error) private pure {if (error == RecoverError.NoError) {return; // no error: do nothing} else if (error == RecoverError.InvalidSignature) {
1234567891011121314151617181920212223242526// 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* ====*
12345678910111213141516171819// SPDX-License-Identifier: MIT// OpenZeppelin Contracts v4.4.1 (interfaces/IERC1271.sol)pragma solidity ^0.8.0;/*** @dev Interface of the ERC1271 standard signature validation method for* contracts as defined in https://eips.ethereum.org/EIPS/eip-1271[ERC-1271].** _Available since v4.1._*/interface IERC1271 {/*** @dev Should return whether the signature provided is valid for the provided data* @param hash Hash of the data to be signed* @param signature Signature byte array associated with _data*/function isValidSignature(bytes32 hash, bytes memory signature) external view returns (bytes4 magicValue);}
12345678910111213141516171819202122232425// 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);}
123456789101112131415161718192021222324// 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;}}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol)pragma solidity ^0.8.0;import "../../utils/introspection/IERC165.sol";/*** @dev Required interface of an ERC1155 compliant contract, as defined in the* https://eips.ethereum.org/EIPS/eip-1155[EIP].** _Available since v3.1._*/interface IERC1155 is IERC165 {/*** @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.*/event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);/*** @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all* transfers.*/event TransferBatch(address indexed operator,address indexed from,
1234567891011121314151617181920212223242526// SPDX-License-Identifier: AGPL-3.0pragma solidity ^0.8.4;import {ERC165Checker} from "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol";import {IOwnershipTransferCallback} from "./IOwnershipTransferCallback.sol";import {Address} from "@openzeppelin/contracts/utils/Address.sol";abstract contract OwnableWithTransferCallback {using ERC165Checker for address;using Address for address;bytes4 constant TRANSFER_CALLBACK =type(IOwnershipTransferCallback).interfaceId;error Ownable_NotOwner();error Ownable_NewOwnerZeroAddress();address private _owner;event OwnershipTransferred(address indexed newOwner);/// @dev Initializes the contract setting the deployer as the initial owner.function __Ownable_init(address initialOwner) internal {_owner = initialOwner;}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// Forked from OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol),// removed initializer check as we already do that in our modified Ownablepragma 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
12345678910// SPDX-License-Identifier: AGPL-3.0pragma solidity ^0.8.0;contract CurveErrorCodes {enum Error {OK, // No errorINVALID_NUMITEMS, // The numItem value is 0SPOT_PRICE_OVERFLOW // The updated spot price doesn't fit into 128 bits}}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/utils/ERC1155Holder.sol)pragma solidity ^0.8.0;import "./ERC1155Receiver.sol";/*** Simple implementation of `ERC1155Receiver` that will allow a contract to hold ERC1155 tokens.** IMPORTANT: When inheriting this contract, you must include a way to use the received tokens, otherwise they will be* stuck.** @dev _Available since v3.1._*/contract ERC1155Holder is ERC1155Receiver {function onERC1155Received(address,address,uint256,uint256,bytes memory) public virtual override returns (bytes4) {return this.onERC1155Received.selector;}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165Checker.sol)pragma solidity ^0.8.0;import "./IERC165.sol";/*** @dev Library used to query support of an interface declared via {IERC165}.** Note that these functions return the actual result of the query: they do not* `revert` if an interface is not supported. It is up to the caller to decide* what to do in these cases.*/library ERC165Checker {// As per the EIP-165 spec, no interface should ever match 0xffffffffbytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff;/*** @dev Returns true if `account` supports the {IERC165} interface,*/function supportsERC165(address account) internal view returns (bool) {// Any contract that implements ERC165 must explicitly indicate support of// InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_InvalidreturnsupportsERC165InterfaceUnchecked(account, type(IERC165).interfaceId) &&
1234567// SPDX-License-Identifier: AGPL-3.0pragma solidity ^0.8.4;interface IOwnershipTransferCallback {function onOwnershipTransfer(address oldOwner) external;}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.7.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* ====*
12345678910111213141516171819// SPDX-License-Identifier: MIT// OpenZeppelin Contracts v4.4.1 (token/ERC1155/utils/ERC1155Receiver.sol)pragma solidity ^0.8.0;import "../IERC1155Receiver.sol";import "../../../utils/introspection/ERC165.sol";/*** @dev _Available since v3.1._*/abstract contract ERC1155Receiver is ERC165, IERC1155Receiver {/*** @dev See {IERC165-supportsInterface}.*/function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);}}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)pragma solidity ^0.8.0;import "../../utils/introspection/IERC165.sol";/*** @dev _Available since v3.1._*/interface IERC1155Receiver is IERC165 {/*** @dev Handles the receipt of a single ERC1155 token type. This function is* called at the end of a `safeTransferFrom` after the balance has been updated.** NOTE: To accept the transfer, this must return* `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`* (i.e. 0xf23a6e61, or its own function selector).** @param operator The address which initiated the transfer (i.e. msg.sender)* @param from The address which previously owned the token* @param id The ID of the token being transferred* @param value The amount of tokens being transferred* @param data Additional data with no specified format* @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed*/
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)pragma solidity ^0.8.0;import "./IERC165.sol";/*** @dev Implementation of the {IERC165} interface.** Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check* for the additional interface id that will be supported. For example:** ```solidity* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);* }* ```** Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.*/abstract contract ERC165 is IERC165 {/*** @dev See {IERC165-supportsInterface}.*/function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
1234567891011121314151617181920212223242526{"remappings": ["@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/","ERC721A/=lib/ERC721A/contracts/","base64/=lib/base64/","ds-test/=lib/forge-std/lib/ds-test/src/","forge-std/=lib/forge-std/src/","hot-chain-svg/=lib/hot-chain-svg/contracts/","lssvm/=lib/lssvm/src/","openzeppelin-contracts-upgradeable/=lib/lssvm/lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts/=lib/openzeppelin-contracts/","openzeppelin/=lib/putty-v2/lib/openzeppelin-contracts/contracts/","prb-math/=lib/lssvm/lib/prb-math/contracts/","putty-v2/=lib/putty-v2/src/","solmate/=lib/solmate/src/","weird-erc20/=lib/lssvm/lib/solmate/lib/weird-erc20/src/"],"optimizer": {"enabled": true,"runs": 1000},"metadata": {"bytecodeHash": "ipfs"},"outputSelection": {"*": {
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_lpToken","type":"address"},{"internalType":"address","name":"_callOptionToken","type":"address"},{"internalType":"address","name":"_putty","type":"address"},{"internalType":"address","name":"_weth","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nftAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"AddLiquidity","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"bondId","type":"uint256"},{"components":[{"internalType":"uint256","name":"rewardPerTokenCheckpoint","type":"uint256"},{"internalType":"uint128","name":"depositAmount","type":"uint128"},{"internalType":"uint32","name":"depositTimestamp","type":"uint32"},{"internalType":"uint8","name":"termIndex","type":"uint8"}],"indexed":false,"internalType":"struct FeeBonding.FeeBond","name":"bond","type":"tuple"}],"name":"FeeStake","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"bondId","type":"uint256"},{"components":[{"internalType":"uint256","name":"rewardPerTokenCheckpoint","type":"uint256"},{"internalType":"uint128","name":"depositAmount","type":"uint128"},{"internalType":"uint32","name":"depositTimestamp","type":"uint32"},{"internalType":"uint8","name":"termIndex","type":"uint8"}],"indexed":false,"internalType":"struct FeeBonding.FeeBond","name":"bond","type":"tuple"}],"name":"FeeUnstake","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"bondId","type":"uint256"},{"components":[{"internalType":"uint256","name":"rewardPerTokenCheckpoint","type":"uint256"},{"internalType":"uint128","name":"depositAmount","type":"uint128"},{"internalType":"uint32","name":"depositTimestamp","type":"uint32"},{"internalType":"uint8","name":"termIndex","type":"uint8"}],"indexed":false,"internalType":"struct OptionBonding.OptionBond","name":"bond","type":"tuple"}],"name":"OptionStake","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"bondId","type":"uint256"},{"components":[{"internalType":"uint256","name":"rewardPerTokenCheckpoint","type":"uint256"},{"internalType":"uint128","name":"depositAmount","type":"uint128"},{"internalType":"uint32","name":"depositTimestamp","type":"uint32"},{"internalType":"uint8","name":"termIndex","type":"uint8"}],"indexed":false,"internalType":"struct OptionBonding.OptionBond","name":"bond","type":"tuple"}],"name":"OptionUnstake","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nftAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"RemoveLiquidity","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REWARD_DURATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STRIKE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOTAL_REWARDS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256","name":"minPrice","type":"uint256"},{"internalType":"uint256","name":"maxPrice","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256","name":"minPrice","type":"uint256"},{"internalType":"uint256","name":"maxPrice","type":"uint256"},{"internalType":"uint256","name":"termIndex","type":"uint256"}],"name":"addLiquidityAndFeeStake","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256","name":"minPrice","type":"uint256"},{"internalType":"uint256","name":"maxPrice","type":"uint256"},{"internalType":"uint256","name":"termIndex","type":"uint256"}],"name":"addLiquidityAndOptionStake","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"bonds","outputs":[{"components":[{"internalType":"uint256","name":"rewardPerTokenCheckpoint","type":"uint256"},{"internalType":"uint128","name":"depositAmount","type":"uint128"},{"internalType":"uint32","name":"depositTimestamp","type":"uint32"},{"internalType":"uint8","name":"termIndex","type":"uint8"}],"internalType":"struct OptionBonding.OptionBond","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"callOptionToken","outputs":[{"internalType":"contract MintBurnToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"closeWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"closedWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numAssets","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"convertToOption","outputs":[{"internalType":"uint256","name":"longTokenId","type":"uint256"},{"components":[{"internalType":"address","name":"maker","type":"address"},{"internalType":"bool","name":"isCall","type":"bool"},{"internalType":"bool","name":"isLong","type":"bool"},{"internalType":"address","name":"baseAsset","type":"address"},{"internalType":"uint256","name":"strike","type":"uint256"},{"internalType":"uint256","name":"premium","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"expiration","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"address[]","name":"whitelist","type":"address[]"},{"internalType":"address[]","name":"floorTokens","type":"address[]"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"internalType":"struct PuttyV2.ERC20Asset[]","name":"erc20Assets","type":"tuple[]"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"internalType":"struct PuttyV2.ERC721Asset[]","name":"erc721Assets","type":"tuple[]"}],"internalType":"struct PuttyV2.Order","name":"shortOrder","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeBondingNft","outputs":[{"internalType":"contract BondingNft","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"feeBonds","outputs":[{"components":[{"internalType":"uint256","name":"rewardPerTokenCheckpoint","type":"uint256"},{"internalType":"uint128","name":"depositAmount","type":"uint128"},{"internalType":"uint32","name":"depositTimestamp","type":"uint32"},{"internalType":"uint8","name":"termIndex","type":"uint8"}],"internalType":"struct FeeBonding.FeeBond","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"feeEarned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeRewardPerTokenStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint128","name":"amount","type":"uint128"},{"internalType":"uint256","name":"termIndex","type":"uint256"}],"name":"feeStake","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeStakedTotalSupply","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeTotalBondSupply","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"feeUnstake","outputs":[{"internalType":"uint256","name":"rewardAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"finishAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"isValidSignature","outputs":[{"internalType":"bytes4","name":"magicValue","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastUpdateTime","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpToken","outputs":[{"internalType":"contract MintBurnToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"mintTo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintWhitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintingOption","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftReserves","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"optionBondTotalSupply","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"optionBondingNft","outputs":[{"internalType":"contract BondingNft","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"optionEarned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"optionExpiration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"optionRewardPerTokenStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint128","name":"amount","type":"uint128"},{"internalType":"uint256","name":"termIndex","type":"uint256"}],"name":"optionStake","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"optionStakedTotalSupply","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"optionUnstake","outputs":[{"internalType":"uint256","name":"callOptionAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"contract LSSVMPairMissingEnumerableETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"putty","outputs":[{"internalType":"contract PuttyV2","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256","name":"minPrice","type":"uint256"},{"internalType":"uint256","name":"maxPrice","type":"uint256"}],"name":"removeLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardPerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_pair","type":"address"}],"name":"setPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenUri","type":"address"}],"name":"setTokenUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"skim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"termBoosters","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"terms","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenReserves","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenUri","outputs":[{"internalType":"contract ERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"whitelistMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"maker","type":"address"},{"internalType":"bool","name":"isCall","type":"bool"},{"internalType":"bool","name":"isLong","type":"bool"},{"internalType":"address","name":"baseAsset","type":"address"},{"internalType":"uint256","name":"strike","type":"uint256"},{"internalType":"uint256","name":"premium","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"expiration","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"address[]","name":"whitelist","type":"address[]"},{"internalType":"address[]","name":"floorTokens","type":"address[]"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"internalType":"struct PuttyV2.ERC20Asset[]","name":"erc20Assets","type":"tuple[]"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"internalType":"struct PuttyV2.ERC721Asset[]","name":"erc721Assets","type":"tuple[]"}],"internalType":"struct PuttyV2.Order[]","name":"orders","type":"tuple[]"},{"internalType":"address","name":"recipient","type":"address"}],"name":"withdrawWeth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6102a060405260006101e081815262093a806102005262278d00610220526276a7006102405262ed4e00610260526301e1338061028052620000449190600662000433565b506040805160c081018252670de0b6b3a76400008152670f43fc2c04ee000060208201526710a741a462780000918101919091526714d1120d7b1600006060820152671bc16d674ec8000060808201526729a2241af62c000060a0820152620000b29060019060066200048b565b506040805160c0810182526000815262093a80602082015262278d00918101919091526276a700606082015262ed4e0060808201526301e1338060a08201526200010190600790600662000433565b506040805160c081018252670de0b6b3a76400008152670f43fc2c04ee000060208201526710a741a462780000918101919091526714d1120d7b1600006060820152671bc16d674ec8000060808201526729a2241af62c000060a08201526200016f9060089060066200048b565b506200018a6304a286006903cfc82e37e9a7400000620004f9565b60c0526200019d4263096601806200051c565b60e052620001b06304a28600426200051c565b6101005242610120819052600a805463ffffffff191663ffffffff9092169190911790556001600c556014805460ff19169055348015620001f057600080fd5b5060405162006b0c38038062006b0c833981016040819052620002139162000561565b6040518060400160405280601481526020017f5768657966757320616e6f6e796d6f7573203a330000000000000000000000008152506040518060400160405280600381526020016255775560e81b81525085858585338a806001600160a01b031660a0816001600160a01b0316815250506040516200029390620004d4565b60408082526013908201527f576865796675204c502046656520426f6e6473000000000000000000000000006060820152608060208201819052600590820152642ba628232160d91b60a082015260c001604051809103906000f08015801562000301573d6000803e3d6000fd5b506001600160a01b03908116608052600680546001600160a01b03191691841691821790556040519091506000907f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d76908290a3506001600160a01b0380851661016052838116610140528281166101a05281166101c0526040516200038690620004d4565b60408082526016908201527f576865796675204c50204f7074696f6e20426f6e6473000000000000000000006060820152608060208201819052600590820152642ba62827a160d91b60a082015260c001604051809103906000f080158015620003f4573d6000803e3d6000fd5b506001600160a01b03166101805250600d92506200041791508490508262000663565b50600e62000426828262000663565b505050505050506200072f565b82805482825590600052602060002090810192821562000479579160200282015b8281111562000479578251829063ffffffff1690559160200191906001019062000454565b5062000487929150620004e2565b5090565b82805482825590600052602060002090810192821562000479579160200282015b828111156200047957825182906001600160401b0316905591602001919060010190620004ac565b611396806200577683390190565b5b80821115620004875760008155600101620004e3565b6000826200051757634e487b7160e01b600052601260045260246000fd5b500490565b808201808211156200053e57634e487b7160e01b600052601160045260246000fd5b92915050565b80516001600160a01b03811681146200055c57600080fd5b919050565b600080600080608085870312156200057857600080fd5b620005838562000544565b9350620005936020860162000544565b9250620005a36040860162000544565b9150620005b36060860162000544565b905092959194509250565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620005e957607f821691505b6020821081036200060a57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200065e57600081815260208120601f850160051c81016020861015620006395750805b601f850160051c820191505b818110156200065a5782815560010162000645565b5050505b505050565b81516001600160401b038111156200067f576200067f620005be565b6200069781620006908454620005d4565b8462000610565b602080601f831160018114620006cf5760008415620006b65750858301515b600019600386901b1c1916600185901b1785556200065a565b600085815260208120601f198616915b828110156200070057888601518255948401946001909101908401620006df565b50858210156200071f5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c051614f036200087360003960008181610865015281816128b201526130bd015260008181610831015281816122a9015281816122fb0152818161233401528181612a8f01528181612fe60152613f14015260008181610cf701528181611669015281816118270152613702015260008181610ac2015281816113bc0152818161148d0152818161196401528181612c0701528181612cef015261366f0152600081816109e6015281816119fa01526129cb01526000610e90015260008181610b160152818161385c01526138860152600081816108d301526128fc015260008181610c0501526138d401526000818161214001526126640152600081816107fd015281816121d30152818161238701526125410152614f036000f3fe60806040526004361061049f5760003560e01c80635c532b461161025e578063a0712d6811610143578063c212a523116100bb578063cd3daf9d1161008a578063d86f1ab01161006f578063d86f1ab014610f29578063e985e9c514610f3f578063ecc389ba14610f7a57600080fd5b8063cd3daf9d14610eef578063d50cb36414610f0457600080fd5b8063c212a52314610e5e578063c744656514610e7e578063c87b56dd14610eb2578063c8f33c9114610ed257600080fd5b8063b2b5334911610112578063b88d4fde116100f7578063b88d4fde14610dda578063c00119ce14610dfa578063c0aa0e8a14610e3e57600080fd5b8063b2b5334914610da4578063b723b34e14610dba57600080fd5b8063a0712d6814610d2e578063a16a642114610d4e578063a22cb46514610d64578063a8aa1b3114610d8457600080fd5b80637c61ab1e116101d65780638da5cb5b116101a557806395d89b411161018a57806395d89b4114610cd05780639fab026314610ce5578063a035b1fe14610d1957600080fd5b80638da5cb5b14610c9a5780639278cd1a14610cba57600080fd5b80637c61ab1e14610c275780637d01d04d14610c475780637dd0804814610c675780638187f51614610c7a57600080fd5b80636352211e1161022d5780636d23d956116102125780636d23d95614610b3857806370a0823114610bd35780637b0a47ee14610bf357600080fd5b80636352211e14610ae457806367d3b48814610b0457600080fd5b80635c532b46146109b45780635d63fcf4146109d45780635f1c17c014610a085780635fcbd28514610ab057600080fd5b806325513e131161038457806342842e0e116102fc5780634cddc728116102cb5780634dada002116102b05780634dada0021461096b578063586b9a7c146109875780635ade228a1461099c57600080fd5b80634cddc7281461092a5780634d49e87d1461095857600080fd5b806342842e0e146108a157806343c94f3e146108c15780634912fc74146108f55780634bad95101461091557600080fd5b80633781826e116103535780633de4e06b116103385780633de4e06b1461081f5780633fc8cef31461085357806341a6ba711461088757600080fd5b80633781826e146107cb5780633848eecf146107eb57600080fd5b806325513e1314610743578063255f5f551461077557806332cb6b0c14610795578063355e0c5d146107ab57600080fd5b806313af40351161041757806319096746116103e65780631daba63b116103cb5780631daba63b146106ee5780631dd19cb41461070e57806323b872dd1461072357600080fd5b806319096746146106b95780631c2655c5146106d957600080fd5b806313af40351461061e578063150b7a021461063e5780631626ba7e1461068357806318160ddd146106a357600080fd5b8063081812fc1161046e578063097114221161045357806309711422146105b357806309cf6091146105d35780630ba84e85146105f157600080fd5b8063081812fc14610543578063095ea7b31461059157600080fd5b806301ffc9a7146104ab57806304c80eaa146104e057806306fdde031461050e57806307b9d49c1461053057600080fd5b366104a657005b600080fd5b3480156104b757600080fd5b506104cb6104c63660046140cc565b610fa2565b60405190151581526020015b60405180910390f35b3480156104ec57600080fd5b506105006104fb3660046140e9565b610fe6565b6040519081526020016104d7565b34801561051a57600080fd5b5061052361107c565b6040516104d79190614152565b61050061053e3660046141b1565b61110a565b34801561054f57600080fd5b5061057961055e3660046140e9565b6011602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016104d7565b34801561059d57600080fd5b506105b16105ac36600461422b565b611130565b005b3480156105bf57600080fd5b506105b16105ce366004614257565b611226565b3480156105df57600080fd5b506105006903cfc82e37e9a740000081565b3480156105fd57600080fd5b5061050061060c3660046142a8565b60166020526000908152604090205481565b34801561062a57600080fd5b506105b16106393660046142a8565b61157f565b34801561064a57600080fd5b5061066a6106593660046142c5565b630a85bd0160e11b95945050505050565b6040516001600160e01b031990911681526020016104d7565b34801561068f57600080fd5b5061066a61069e3660046143fd565b611614565b3480156106af57600080fd5b5061050060135481565b3480156106c557600080fd5b506105006106d43660046140e9565b611650565b3480156106e557600080fd5b50610500611a9e565b3480156106fa57600080fd5b506105b161070936600461422b565b611b33565b34801561071a57600080fd5b50610500611c8a565b34801561072f57600080fd5b506105b161073e366004614487565b611e19565b34801561074f57600080fd5b506003546107609063ffffffff1681565b60405163ffffffff90911681526020016104d7565b34801561078157600080fd5b506105006107903660046144dd565b611fef565b3480156107a157600080fd5b5061050061753081565b3480156107b757600080fd5b50601854610579906001600160a01b031681565b3480156107d757600080fd5b506105006107e63660046140e9565b612277565b3480156107f757600080fd5b506105797f000000000000000000000000000000000000000000000000000000000000000081565b34801561082b57600080fd5b506105797f000000000000000000000000000000000000000000000000000000000000000081565b34801561085f57600080fd5b506105797f000000000000000000000000000000000000000000000000000000000000000081565b34801561089357600080fd5b506014546104cb9060ff1681565b3480156108ad57600080fd5b506105b16108bc366004614487565b612298565b3480156108cd57600080fd5b506105007f000000000000000000000000000000000000000000000000000000000000000081565b34801561090157600080fd5b506105006109103660046140e9565b61236e565b34801561092157600080fd5b50610500612718565b34801561093657600080fd5b5061094a6109453660046144fb565b61277b565b6040516104d79291906146a4565b610500610966366004614257565b612afa565b34801561097757600080fd5b5061050067016345785d8a000081565b34801561099357600080fd5b506105b1612dee565b3480156109a857600080fd5b506105006304a2860081565b3480156109c057600080fd5b506105b16109cf3660046142a8565b612e46565b3480156109e057600080fd5b506105797f000000000000000000000000000000000000000000000000000000000000000081565b348015610a1457600080fd5b50610aa3610a233660046140e9565b604080516080810182526000808252602082018190529181018290526060810191909152506000908152600b60209081526040918290208251608081018452815481526001909101546001600160801b03811692820192909252600160801b820463ffffffff1692810192909252600160a01b900460ff16606082015290565b6040516104d791906146bd565b348015610abc57600080fd5b506105797f000000000000000000000000000000000000000000000000000000000000000081565b348015610af057600080fd5b50610579610aff3660046140e9565b612eb1565b348015610b1057600080fd5b506105007f000000000000000000000000000000000000000000000000000000000000000081565b348015610b4457600080fd5b50610aa3610b533660046140e9565b604080516080810182526000808252602082018190529181018290526060810191909152506000908152600460209081526040918290208251608081018452815481526001909101546001600160801b03811692820192909252600160801b820463ffffffff1692810192909252600160a01b900460ff16606082015290565b348015610bdf57600080fd5b50610500610bee3660046142a8565b612f1b565b348015610bff57600080fd5b506105007f000000000000000000000000000000000000000000000000000000000000000081565b348015610c3357600080fd5b506105b1610c4236600461484d565b612f8f565b348015610c5357600080fd5b50610500610c623660046140e9565b6131a9565b610500610c753660046141b1565b613228565b348015610c8657600080fd5b506105b1610c953660046142a8565b613243565b348015610ca657600080fd5b50600654610579906001600160a01b031681565b348015610cc657600080fd5b5061050060025481565b348015610cdc57600080fd5b50610523613315565b348015610cf157600080fd5b506105797f000000000000000000000000000000000000000000000000000000000000000081565b348015610d2557600080fd5b50610500613322565b348015610d3a57600080fd5b50610500610d493660046140e9565b613367565b348015610d5a57600080fd5b5061050060095481565b348015610d7057600080fd5b506105b1610d7f366004614a36565b61337d565b348015610d9057600080fd5b50601754610579906001600160a01b031681565b348015610db057600080fd5b50610500600c5481565b348015610dc657600080fd5b50610500610dd5366004614a6f565b6133e9565b348015610de657600080fd5b506105b1610df53660046142c5565b6133f6565b348015610e0657600080fd5b50600a54610e26906801000000000000000090046001600160801b031681565b6040516001600160801b0390911681526020016104d7565b348015610e4a57600080fd5b50610500610e593660046140e9565b6134eb565b348015610e6a57600080fd5b50610500610e793660046144dd565b6134fb565b348015610e8a57600080fd5b506105007f000000000000000000000000000000000000000000000000000000000000000081565b348015610ebe57600080fd5b50610523610ecd3660046140e9565b613797565b348015610ede57600080fd5b50600a546107609063ffffffff1681565b348015610efb57600080fd5b50610500613822565b348015610f1057600080fd5b50600a5461076090640100000000900463ffffffff1681565b348015610f3557600080fd5b5061050060155481565b348015610f4b57600080fd5b506104cb610f5a366004614a94565b601260209081526000928352604080842090915290825290205460ff1681565b348015610f8657600080fd5b50600354610e269064010000000090046001600160801b031681565b60006001600160e01b031982167f780e9d63000000000000000000000000000000000000000000000000000000001480610fe05750610fe082613928565b92915050565b60008181526004602052604081206001808201548154849291600160a01b900460ff1690811061101857611018614ac2565b600091825260209091200154600183015461103c91906001600160801b0316614aee565b90506ec097ce7bc90715b34b9f100000000082600001546002546110609190614b0d565b61106a9083614aee565b6110749190614b20565b949350505050565b600d805461108990614b42565b80601f01602080910402602001604051908101604052809291908181526020018280546110b590614b42565b80156111025780601f106110d757610100808354040283529160200191611102565b820191906000526020600020905b8154815290600101906020018083116110e557829003601f168201915b505050505081565b60008061111987878787612afa565b905061112581846134fb565b979650505050505050565b6000818152600f60205260409020546001600160a01b03163381148061117957506001600160a01b038116600090815260126020908152604080832033845290915290205460ff165b6111ca5760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064015b60405180910390fd5b60008281526011602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611230613322565b90508181111580156112425750828110155b61128e5760405162461bcd60e51b815260206004820152600e60248201527f507269636520736c69707061676500000000000000000000000000000000000060448201526064016111c1565b6000611298612718565b905060006112a4611a9e565b90506000816112b38885614aee565b6112bd9190614b20565b90506112db6112cc8285614b0d565b6112d68985614b0d565b6139c1565b6017546040516378a1085360e11b8152600481018390526001600160a01b039091169063f14210a690602401600060405180830381600087803b15801561132157600080fd5b505af1158015611335573d6000803e3d6000fd5b50506017546040517f13edab810000000000000000000000000000000000000000000000000000000081526001600160a01b0390911692506313edab8191506113869030908c908c90600401614b7c565b600060405180830381600087803b1580156113a057600080fd5b505af11580156113b4573d6000803e3d6000fd5b5050505060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611418573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061143c9190614bde565b905060008361144b8a84614aee565b6114559190614b20565b6040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018290529091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690639dc29fac90604401600060405180830381600087803b1580156114d957600080fd5b505af11580156114ed573d6000803e3d6000fd5b5050505060005b898110156115275761151f30338d8d8581811061151357611513614ac2565b90506020020135613ac3565b6001016114f4565b506115323384613ce3565b60408051848152602081018b90529081018290527f462ff1f90b66e3549a190bb471a2276749250543bad2ce9c21f706d882a59dad9060600160405180910390a150505050505050505050565b6006546001600160a01b031633146115c85760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016111c1565b600680546001600160a01b0319166001600160a01b03831690811790915560405133907f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d7690600090a350565b6000600c54600214611627576000611649565b7f1626ba7e000000000000000000000000000000000000000000000000000000005b9392505050565b6040516331a9108f60e11b8152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690636352211e90602401602060405180830381865afa1580156116b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116dc9190614bf7565b6001600160a01b0316336001600160a01b0316146117285760405162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b60448201526064016111c1565b6000828152600b60209081526040918290208251608081018452815481526001909101546001600160801b03811692820192909252600160801b820463ffffffff1692810192909252600160a01b900460ff166060820181905260078054909190811061179757611797614ac2565b9060005260206000200154816040015163ffffffff166117b79190614c14565b4210156118065760405162461bcd60e51b815260206004820152601060248201527f426f6e64206e6f74206d6174757265640000000000000000000000000000000060448201526064016111c1565b61180e613822565b600955604051630852cd8d60e31b8152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906342966c6890602401600060405180830381600087803b15801561187357600080fd5b505af1158015611887573d6000803e3d6000fd5b5050600a805463ffffffff19164263ffffffff16179055505060208101516060820151600880546001600160801b0390931692670de0b6b3a76400009260ff169081106118d6576118d6614ac2565b9060005260206000200154826118ec9190614aee565b6118f69190614b20565b600a805460089061191d9084906801000000000000000090046001600160801b0316614c27565b82546001600160801b039182166101009390930a92830291909202199091161790555060405163a9059cbb60e01b8152336004820152602481018290526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af11580156119ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119d19190614c4e565b506119db846131a9565b6040516340c10f1960e01b8152336004820152602481018290529093507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906340c10f1990604401600060405180830381600087803b158015611a4657600080fd5b505af1158015611a5a573d6000803e3d6000fd5b505050507fe44694c943742657abee88b2aec7c98d7f392a3302dd496e31b5544e537e15e08483604051611a8f929190614c6b565b60405180910390a15050919050565b601754604080517f12b495a800000000000000000000000000000000000000000000000000000000815290516000926001600160a01b0316916312b495a89160048083019260209291908290030181865afa158015611b01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b259190614cb2565b6001600160801b0316905090565b6006546001600160a01b03163314611b7c5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016111c1565b60145460ff1615611bcf5760405162461bcd60e51b815260206004820152601960248201527f57686974656c69737420686173206265656e20636c6f7365640000000000000060448201526064016111c1565b6001600160a01b0382166000908152601660205260408120546015805491928392611bfb908490614b0d565b925050819055508160156000828254611c149190614c14565b90915550506015546175301015611c6d5760405162461bcd60e51b815260206004820152601a60248201527f4d617820737570706c7920616c7265616479207265616368656400000000000060448201526064016111c1565b506001600160a01b03909116600090815260166020526040902055565b600080600560009054906101000a90046001600160a01b03166001600160a01b031663398482d86040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ce0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d049190614cb2565b6005546001600160801b039190911691506000906001600160a01b0316318210611d2f576000611d47565b600554611d479083906001600160a01b031631614b0d565b6005546040516378a1085360e11b8152600481018390529192506001600160a01b03169063f14210a690602401600060405180830381600087803b158015611d8e57600080fd5b505af1158015611da2573d6000803e3d6000fd5b50505050600081118015611dc8575060035464010000000090046001600160801b031615155b15610fe05760035464010000000090046001600160801b0316611df382670de0b6b3a7640000614aee565b611dfd9190614b20565b60026000828254611e0e9190614c14565b909155505092915050565b6000818152600f60205260409020546001600160a01b03848116911614611e6f5760405162461bcd60e51b815260206004820152600a60248201526957524f4e475f46524f4d60b01b60448201526064016111c1565b6001600160a01b038216611eb95760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b60448201526064016111c1565b336001600160a01b0384161480611ef357506001600160a01b038316600090815260126020908152604080832033845290915290205460ff165b80611f1457506000818152601160205260409020546001600160a01b031633145b611f605760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016111c1565b6001600160a01b038084166000818152601060209081526040808320805460001901905593861680835284832080546001019055858352600f825284832080546001600160a01b03199081168317909155601190925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000611ff9611c8a565b50600380546001919060009061201690849063ffffffff16614ccf565b82546101009290920a63ffffffff818102199093169183160217909155600354811660008181526004602052604090206002548155600181810180546001600160801b038a166001600160a01b031990911617600160801b42909616959095029490941760ff60a01b1916600160a01b60ff8916021790935582549194509250670de0b6b3a76400009190859081106120b1576120b1614ac2565b9060005260206000200154856001600160801b03166120d09190614aee565b6120da9190614b20565b600380546004906120fd90849064010000000090046001600160801b0316614cec565b82546101009290920a6001600160801b038181021990931691831602179091556040516323b872dd60e01b815233600482015230602482015290861660448201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691506323b872dd906064016020604051808303816000875af1158015612192573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121b69190614c4e565b506040516340c10f1960e01b8152336004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906340c10f1990604401600060405180830381600087803b15801561221f57600080fd5b505af1158015612233573d6000803e3d6000fd5b505050507fbcfb553f47b13ce6eaa94a5a3d32329da2677aaaeb218179b18f23aca1db4c998282604051612268929190614d0c565b60405180910390a15092915050565b6008818154811061228757600080fd5b600091825260209091200154905081565b600c546002036122a757505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b03161480156122e9575061753081115b801561231d5750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b1561235e5761235861233182600019614b0d565b837f0000000000000000000000000000000000000000000000000000000000000000613d3e565b50505050565b612369838383613e64565b505050565b6040516331a9108f60e11b8152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690636352211e90602401602060405180830381865afa1580156123d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123fa9190614bf7565b6001600160a01b0316336001600160a01b0316146124465760405162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b60448201526064016111c1565b60008281526004602090815260408083208151608081018352815481526001909101546001600160801b03811693820193909352600160801b830463ffffffff1691810191909152600160a01b90910460ff1660608201819052825491929181106124b3576124b3614ac2565b9060005260206000200154816040015163ffffffff166124d39190614c14565b4210156125225760405162461bcd60e51b815260206004820152601060248201527f426f6e64206e6f74206d6174757265640000000000000000000000000000000060448201526064016111c1565b61252a611c8a565b50604051630852cd8d60e31b8152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906342966c6890602401600060405180830381600087803b15801561258d57600080fd5b505af11580156125a1573d6000803e3d6000fd5b50505050600081602001516001600160801b03169050670de0b6b3a76400006001836060015160ff16815481106125da576125da614ac2565b9060005260206000200154826125f09190614aee565b6125fa9190614b20565b6003805460049061261d90849064010000000090046001600160801b0316614c27565b82546001600160801b039182166101009390930a92830291909202199091161790555060405163a9059cbb60e01b8152336004820152602481018290526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af11580156126ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126d19190614c4e565b506126db84610fe6565b92506126e73384613ce3565b7f68fdf814c7f7091db14b00c71885abc4f242a48abe180938ae773cf9c71eeac48483604051611a8f929190614c6b565b601754604080517f398482d800000000000000000000000000000000000000000000000000000000815290516000926001600160a01b03169163398482d89160048083019260209291908290030181865afa158015611b01573d6000803e3d6000fd5b60006127fe604051806101a0016040528060006001600160a01b0316815260200160001515815260200160001515815260200160006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160008152602001606081526020016060815260200160608152602001606081525090565b6000841161284e5760405162461bcd60e51b815260206004820152601f60248201527f4d75737420636f6e76657274206174206c65617374206f6e652061737365740060448201526064016111c1565b603284111561289f5760405162461bcd60e51b815260206004820152601e60248201527f4d75737420636f6e76657274203530206f72206c65737320617373657473000060448201526064016111c1565b30815260016020820152600060408201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031660608201526128f18467016345785d8a0000614aee565b6080820152612920427f0000000000000000000000000000000000000000000000000000000000000000614b0d565b60c0820152612930426001614c14565b60e0820152610100810183905260408051600180825281830190925290816020015b6040805180820190915260008082526020820152815260200190600190039081612952575050610180820152604080518082019091523081526020810161299b86600019614b0d565b8152508161018001516000815181106129b6576129b6614ac2565b60209081029190910101526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016639dc29fac33612a0387670de0b6b3a7640000614aee565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612a4957600080fd5b505af1158015612a5d573d6000803e3d6000fd5b50505050612a6a81613ece565b6040516323b872dd60e01b8152306004820152336024820152604481018290529092507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd90606401600060405180830381600087803b158015612adb57600080fd5b505af1158015612aef573d6000803e3d6000fd5b505050509250929050565b600080612b05612718565b90506000612b11611a9e565b905060008083118015612b245750600082115b612b2f576000612b39565b612b398284614b20565b9050848111158015612b4b5750858110155b612b975760405162461bcd60e51b815260206004820152600e60248201527f507269636520736c69707061676500000000000000000000000000000000000060448201526064016111c1565b655af3107a40003411612bec5760405162461bcd60e51b815260206004820152601f60248201527f4d7573742073656e64206174206c6561737420302e303030312065746865720060448201526064016111c1565b612c03612bf93485614c14565b6112d68985614c14565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c879190614bde565b90508015612cc657612cc184612c9d3484614aee565b612ca79190614b20565b84612cb28b85614aee565b612cbc9190614b20565b613f98565b612cd0565b612cd08834614aee565b6040516340c10f1960e01b8152336004820152602481018290529095507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906340c10f1990604401600060405180830381600087803b158015612d3b57600080fd5b505af1158015612d4f573d6000803e3d6000fd5b5050505060005b88811015612d8a57601754612d829033906001600160a01b03168c8c8581811061151357611513614ac2565b600101612d56565b50601754612da1906001600160a01b031634613ce3565b60408051348152602081018a90529081018690527ff75993dbe1645872cbbea6395e1feebee76b435baf0e4d62d7eac269c6f57b249060600160405180910390a150505050949350505050565b6006546001600160a01b03163314612e375760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016111c1565b6014805460ff19166001179055565b6006546001600160a01b03163314612e8f5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016111c1565b601880546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600f60205260409020546001600160a01b031680612f165760405162461bcd60e51b815260206004820152600a60248201527f4e4f545f4d494e5445440000000000000000000000000000000000000000000060448201526064016111c1565b919050565b60006001600160a01b038216612f735760405162461bcd60e51b815260206004820152600c60248201527f5a45524f5f41444452455353000000000000000000000000000000000000000060448201526064016111c1565b506001600160a01b031660009081526010602052604090205490565b6006546001600160a01b03163314612fd85760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016111c1565b60005b825181101561308e577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631913cfd784838151811061302557613025614ac2565b60200260200101516040518263ffffffff1660e01b81526004016130499190614d50565b600060405180830381600087803b15801561306357600080fd5b505af1158015613077573d6000803e3d6000fd5b50505050808061308690614d63565b915050612fdb565b506040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb90839083906370a0823190602401602060405180830381865afa158015613116573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061313a9190614bde565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015613185573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123699190614c4e565b6000818152600b602052604081206001810154600880548492600160a01b900460ff169081106131db576131db614ac2565b60009182526020909120015460018301546131ff91906001600160801b0316614aee565b90506ec097ce7bc90715b34b9f1000000000826000015461321e613822565b6110609190614b0d565b60008061323787878787612afa565b90506111258184611fef565b6006546001600160a01b0316331461328c5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016111c1565b6017546001600160a01b0316156132e55760405162461bcd60e51b815260206004820152601060248201527f5061697220616c7265616479207365740000000000000000000000000000000060448201526064016111c1565b601780546001600160a01b03929092166001600160a01b0319928316811790915560058054909216179055565b50565b600e805461108990614b42565b60008061332d612718565b90506000613339611a9e565b905060008211801561334b5750600081115b613356576000613360565b6133608183614b20565b9250505090565b600061337382336133e9565b5050601354919050565b3360008181526012602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000611649838333613d3e565b613401858585611e19565b6001600160a01b0384163b15806134985750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a02906134499033908a90899089908990600401614d7c565b6020604051808303816000875af1158015613468573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061348c9190614dd0565b6001600160e01b031916145b6134e45760405162461bcd60e51b815260206004820152601060248201527f554e534146455f524543495049454e540000000000000000000000000000000060448201526064016111c1565b5050505050565b6007818154811061228757600080fd5b6000613505613822565b600955600a80546001919060049061352c908490640100000000900463ffffffff16614ccf565b82546101009290920a63ffffffff818102199093169183160217909155600a8054640100000000900482166000818152600b6020526040902060095481556001810180546001600160801b038a166001600160a01b031990911617600160801b429096169586021760ff60a01b1916600160a01b60ff8a1602179055825463ffffffff191690931790915560088054919450919250670de0b6b3a76400009190859081106135dc576135dc614ac2565b9060005260206000200154856001600160801b03166135fb9190614aee565b6136059190614b20565b600a805460089061362c9084906801000000000000000090046001600160801b0316614cec565b82546101009290920a6001600160801b038181021990931691831602179091556040516323b872dd60e01b815233600482015230602482015290861660448201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691506323b872dd906064016020604051808303816000875af11580156136c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136e59190614c4e565b506040516340c10f1960e01b8152336004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906340c10f1990604401600060405180830381600087803b15801561374e57600080fd5b505af1158015613762573d6000803e3d6000fd5b505050507fe92e7a07bbbf0885cfe2769d6491097062ce995593b84a32f347b92eb74ac1c78282604051612268929190614d0c565b6018546040517fc87b56dd000000000000000000000000000000000000000000000000000000008152600481018390526060916001600160a01b03169063c87b56dd90602401600060405180830381865afa1580156137fa573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610fe09190810190614ded565b600a546000906801000000000000000090046001600160801b0316810361384a575060095490565b600a546000906138809063ffffffff167f0000000000000000000000000000000000000000000000000000000000000000613f98565b6138aa427f0000000000000000000000000000000000000000000000000000000000000000613f98565b6138b49190614b0d565b600a549091506801000000000000000090046001600160801b03166138f97f000000000000000000000000000000000000000000000000000000000000000083614aee565b61390b90670de0b6b3a7640000614aee565b6139159190614b20565b6009546139229190614c14565b91505090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316148061398b57507f80ac58cd000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610fe05750506001600160e01b0319167f5b5e139f000000000000000000000000000000000000000000000000000000001490565b6017546040517fd8a1890c0000000000000000000000000000000000000000000000000000000081526001600160801b03841660048201526001600160a01b039091169063d8a1890c90602401600060405180830381600087803b158015613a2857600080fd5b505af1158015613a3c573d6000803e3d6000fd5b50506017546040517f6809f6640000000000000000000000000000000000000000000000000000000081526001600160801b03851660048201526001600160a01b039091169250636809f6649150602401600060405180830381600087803b158015613aa757600080fd5b505af1158015613abb573d6000803e3d6000fd5b505050505050565b6000818152600f60205260409020546001600160a01b03848116911614613b195760405162461bcd60e51b815260206004820152600a60248201526957524f4e475f46524f4d60b01b60448201526064016111c1565b6001600160a01b038216613b635760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b60448201526064016111c1565b6001600160a01b038084166000818152601060209081526040808320805460001901905593861680835284832080546001019055858352600f825284832080546001600160a01b03199081168317909155601190925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a46001600160a01b0382163b1580613c975750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4015b6020604051808303816000875af1158015613c67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c8b9190614dd0565b6001600160e01b031916145b6123695760405162461bcd60e51b815260206004820152601060248201527f554e534146455f524543495049454e540000000000000000000000000000000060448201526064016111c1565b600080600080600085875af19050806123695760405162461bcd60e51b815260206004820152601360248201527f4554485f5452414e534645525f4641494c45440000000000000000000000000060448201526064016111c1565b6001600160a01b038116600090815260166020526040812054841115613da65760405162461bcd60e51b815260206004820152601f60248201527f4e6f742077686974656c697374656420666f72207468697320616d6f756e740060448201526064016111c1565b6013545b84601354613db89190614c14565b811015613de557613dd384613dce836001614c14565b613fae565b80613ddd81614d63565b915050613daa565b506001600160a01b03831660009081526010602052604081208054869290613e0e908490614c14565b925050819055508360136000828254613e279190614c14565b90915550506001600160a01b03821660009081526016602052604081208054869290613e54908490614b0d565b9091555050601354949350505050565b613e6f838383611e19565b6001600160a01b0382163b1580613c975750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a401613c48565b6002600c5560408051600080825260208201928390527f68840dd40000000000000000000000000000000000000000000000000000000090925260606001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166368840dd4613f4886848660248101614e64565b6020604051808303816000875af1158015613f67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f8b9190614bde565b6001600c55949350505050565b6000818310613fa75781611649565b5090919050565b6001600160a01b038216613ff85760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b60448201526064016111c1565b6000818152600f60205260409020546001600160a01b03161561405d5760405162461bcd60e51b815260206004820152600e60248201527f414c52454144595f4d494e54454400000000000000000000000000000000000060448201526064016111c1565b6000818152600f602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160e01b03198116811461331257600080fd5b6000602082840312156140de57600080fd5b8135611649816140b6565b6000602082840312156140fb57600080fd5b5035919050565b60005b8381101561411d578181015183820152602001614105565b50506000910152565b6000815180845261413e816020860160208601614102565b601f01601f19169290920160200192915050565b6020815260006116496020830184614126565b60008083601f84011261417757600080fd5b50813567ffffffffffffffff81111561418f57600080fd5b6020830191508360208260051b85010111156141aa57600080fd5b9250929050565b6000806000806000608086880312156141c957600080fd5b853567ffffffffffffffff8111156141e057600080fd5b6141ec88828901614165565b9099909850602088013597604081013597506060013595509350505050565b6001600160a01b038116811461331257600080fd5b8035612f168161420b565b6000806040838503121561423e57600080fd5b82356142498161420b565b946020939093013593505050565b6000806000806060858703121561426d57600080fd5b843567ffffffffffffffff81111561428457600080fd5b61429087828801614165565b90989097506020870135966040013595509350505050565b6000602082840312156142ba57600080fd5b81356116498161420b565b6000806000806000608086880312156142dd57600080fd5b85356142e88161420b565b945060208601356142f88161420b565b935060408601359250606086013567ffffffffffffffff8082111561431c57600080fd5b818801915088601f83011261433057600080fd5b81358181111561433f57600080fd5b89602082850101111561435157600080fd5b9699959850939650602001949392505050565b634e487b7160e01b600052604160045260246000fd5b6040516101a0810167ffffffffffffffff8111828210171561439e5761439e614364565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156143cd576143cd614364565b604052919050565b600067ffffffffffffffff8211156143ef576143ef614364565b50601f01601f191660200190565b6000806040838503121561441057600080fd5b82359150602083013567ffffffffffffffff81111561442e57600080fd5b8301601f8101851361443f57600080fd5b803561445261444d826143d5565b6143a4565b81815286602083850101111561446757600080fd5b816020840160208301376000602083830101528093505050509250929050565b60008060006060848603121561449c57600080fd5b83356144a78161420b565b925060208401356144b78161420b565b929592945050506040919091013590565b6001600160801b038116811461331257600080fd5b600080604083850312156144f057600080fd5b8235614249816144c8565b6000806040838503121561450e57600080fd5b50508035926020909101359150565b600081518084526020808501945080840160005b838110156145565781516001600160a01b031687529582019590820190600101614531565b509495945050505050565b600081518084526020808501945080840160005b8381101561455657815180516001600160a01b031688528301518388015260409096019590820190600101614575565b80516001600160a01b0316825260006101a060208301516145ca602086018215159052565b5060408301516145de604086018215159052565b5060608301516145f960608601826001600160a01b03169052565b506080830151608085015260a083015160a085015260c083015160c085015260e083015160e08501526101008084015181860152506101208084015182828701526146468387018261451d565b925050506101408084015185830382870152614662838261451d565b92505050610160808401518583038287015261467e8382614561565b92505050610180808401518583038287015261469a8382614561565b9695505050505050565b82815260406020820152600061107460408301846145a5565b815181526020808301516001600160801b03169082015260408083015163ffffffff169082015260608083015160ff169082015260808101610fe0565b600067ffffffffffffffff82111561471457614714614364565b5060051b60200190565b801515811461331257600080fd5b8035612f168161471e565b600082601f83011261474857600080fd5b8135602061475861444d836146fa565b82815260059290921b8401810191818101908684111561477757600080fd5b8286015b8481101561479b57803561478e8161420b565b835291830191830161477b565b509695505050505050565b600082601f8301126147b757600080fd5b813560206147c761444d836146fa565b82815260069290921b840181019181810190868411156147e657600080fd5b8286015b8481101561479b57604080828a0312156148045760008081fd5b805181810181811067ffffffffffffffff8211171561482557614825614364565b9091528135906148348261420b565b90815281850135858201528352918301916040016147ea565b6000806040838503121561486057600080fd5b823567ffffffffffffffff8082111561487857600080fd5b818501915085601f83011261488c57600080fd5b8135602061489c61444d836146fa565b82815260059290921b840181019181810190898411156148bb57600080fd5b8286015b84811015614a19578035868111156148d657600080fd5b87016101a0818d03601f190112156148ed57600080fd5b6148f561437a565b614900868301614220565b815261490e6040830161472c565b8682015261491e6060830161472c565b604082015261492f60808301614220565b606082015260a0820135608082015260c082013560a082015260e082013560c082015261010082013560e08201526101208201356101008201526101408201358881111561497c57600080fd5b61498a8e8883860101614737565b61012083015250610160820135888111156149a457600080fd5b6149b28e8883860101614737565b6101408301525061018080830135898111156149cd57600080fd5b6149db8f89838701016147a6565b610160840152506101a0830135898111156149f557600080fd5b614a038f89838701016147a6565b91830191909152508452509183019183016148bf565b509650614a299050878201614220565b9450505050509250929050565b60008060408385031215614a4957600080fd5b8235614a548161420b565b91506020830135614a648161471e565b809150509250929050565b60008060408385031215614a8257600080fd5b823591506020830135614a648161420b565b60008060408385031215614aa757600080fd5b8235614ab28161420b565b91506020830135614a648161420b565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615614b0857614b08614ad8565b500290565b81810381811115610fe057610fe0614ad8565b600082614b3d57634e487b7160e01b600052601260045260246000fd5b500490565b600181811c90821680614b5657607f821691505b602082108103614b7657634e487b7160e01b600052602260045260246000fd5b50919050565b6001600160a01b03841681526040602082015281604082015260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115614bc457600080fd5b8260051b8085606085013791909101606001949350505050565b600060208284031215614bf057600080fd5b5051919050565b600060208284031215614c0957600080fd5b81516116498161420b565b80820180821115610fe057610fe0614ad8565b6001600160801b03828116828216039080821115614c4757614c47614ad8565b5092915050565b600060208284031215614c6057600080fd5b81516116498161471e565b82815260a081016116496020830184805182526001600160801b03602082015116602083015263ffffffff604082015116604083015260ff60608201511660608301525050565b600060208284031215614cc457600080fd5b8151611649816144c8565b63ffffffff818116838216019080821115614c4757614c47614ad8565b6001600160801b03818116838216019080821115614c4757614c47614ad8565b82815260a08101611649602083018480548252600101546001600160801b0381166020830152608081901c63ffffffff16604083015260a01c60ff16606090910152565b60208152600061164960208301846145a5565b600060018201614d7557614d75614ad8565b5060010190565b60006001600160a01b03808816835280871660208401525084604083015260806060830152826080830152828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b600060208284031215614de257600080fd5b8151611649816140b6565b600060208284031215614dff57600080fd5b815167ffffffffffffffff811115614e1657600080fd5b8201601f81018413614e2757600080fd5b8051614e3561444d826143d5565b818152856020838501011115614e4a57600080fd5b614e5b826020830160208601614102565b95945050505050565b606081526000614e7760608301866145a5565b602083820381850152614e8a8287614126565b8481036040860152855180825282870193509082019060005b81811015614ebf57845183529383019391830191600101614ea3565b50909897505050505050505056fea26469706673582212201b04b511c5626fcd22953ba534ee7e24a01bb31b8c714bae08eb7eacd16df90b64736f6c6343000810003360806040523480156200001157600080fd5b506040516200139638038062001396833981016040819052620000349162000170565b338282600062000045838262000269565b50600162000054828262000269565b5050600680546001600160a01b0319166001600160a01b0384169081179091556040519091506000907f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d76908290a350505062000335565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620000d357600080fd5b81516001600160401b0380821115620000f057620000f0620000ab565b604051601f8301601f19908116603f011681019082821181831017156200011b576200011b620000ab565b816040528381526020925086838588010111156200013857600080fd5b600091505b838210156200015c57858201830151818301840152908201906200013d565b600093810190920192909252949350505050565b600080604083850312156200018457600080fd5b82516001600160401b03808211156200019c57600080fd5b620001aa86838701620000c1565b93506020850151915080821115620001c157600080fd5b50620001d085828601620000c1565b9150509250929050565b600181811c90821680620001ef57607f821691505b6020821081036200021057634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200026457600081815260208120601f850160051c810160208610156200023f5750805b601f850160051c820191505b8181101562000260578281556001016200024b565b5050505b505050565b81516001600160401b03811115620002855762000285620000ab565b6200029d81620002968454620001da565b8462000216565b602080601f831160018114620002d55760008415620002bc5750858301515b600019600386901b1c1916600185901b17855562000260565b600085815260208120601f198616915b828110156200030657888601518255948401946001909101908401620002e5565b5085821015620003255787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61105180620003456000396000f3fe608060405234801561001057600080fd5b506004361061011b5760003560e01c806342966c68116100b257806395d89b4111610081578063b88d4fde11610066578063b88d4fde14610274578063c87b56dd14610287578063e985e9c5146102a857600080fd5b806395d89b4114610259578063a22cb4651461026157600080fd5b806342966c68146101ff5780636352211e1461021257806370a08231146102255780638da5cb5b1461024657600080fd5b806313af4035116100ee57806313af4035146101b357806323b872dd146101c657806340c10f19146101d957806342842e0e146101ec57600080fd5b806301ffc9a71461012057806306fdde0314610148578063081812fc1461015d578063095ea7b31461019e575b600080fd5b61013361012e366004610d22565b6102d6565b60405190151581526020015b60405180910390f35b610150610373565b60405161013f9190610d46565b61018661016b366004610d94565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b03909116815260200161013f565b6101b16101ac366004610dc4565b610401565b005b6101b16101c1366004610dee565b6104f7565b6101b16101d4366004610e09565b61058c565b6101b16101e7366004610dc4565b610761565b6101b16101fa366004610e09565b6107b8565b6101b161020d366004610d94565b6108bd565b610186610220366004610d94565b610912565b610238610233366004610dee565b610969565b60405190815260200161013f565b600654610186906001600160a01b031681565b6101506109ce565b6101b161026f366004610e45565b6109db565b6101b1610282366004610e81565b610a47565b610150610295366004610d94565b5060408051602081019091526000815290565b6101336102b6366004610f1c565b600560209081526000928352604080842090915290825290205460ff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316148061033957507f80ac58cd000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b8061036d57507f5b5e139f000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b6000805461038090610f4f565b80601f01602080910402602001604051908101604052809291908181526020018280546103ac90610f4f565b80156103f95780601f106103ce576101008083540402835291602001916103f9565b820191906000526020600020905b8154815290600101906020018083116103dc57829003601f168201915b505050505081565b6000818152600260205260409020546001600160a01b03163381148061044a57506001600160a01b038116600090815260056020908152604080832033845290915290205460ff165b61049b5760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064015b60405180910390fd5b60008281526004602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6006546001600160a01b031633146105405760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610492565b600680546001600160a01b0319166001600160a01b03831690811790915560405133907f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d7690600090a350565b6000818152600260205260409020546001600160a01b038481169116146105f55760405162461bcd60e51b815260206004820152600a60248201527f57524f4e475f46524f4d000000000000000000000000000000000000000000006044820152606401610492565b6001600160a01b03821661064b5760405162461bcd60e51b815260206004820152601160248201527f494e56414c49445f524543495049454e540000000000000000000000000000006044820152606401610492565b336001600160a01b038416148061068557506001600160a01b038316600090815260056020908152604080832033845290915290205460ff165b806106a657506000818152600460205260409020546001600160a01b031633145b6106f25760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a45440000000000000000000000000000000000006044820152606401610492565b600081815260026020908152604080832080546001600160a01b038088166001600160a01b031992831681179093556004909452828520805490911690559051849391928716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6006546001600160a01b031633146107aa5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610492565b6107b48282610b3c565b5050565b6107c383838361058c565b6001600160a01b0382163b158061086c5750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af115801561083c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108609190610f89565b6001600160e01b031916145b6108b85760405162461bcd60e51b815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610492565b505050565b6006546001600160a01b031633146109065760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610492565b61090f81610c50565b50565b6000818152600260205260409020546001600160a01b0316806109645760405162461bcd60e51b815260206004820152600a6024820152691393d517d3525395115160b21b6044820152606401610492565b919050565b60006001600160a01b0382166109c15760405162461bcd60e51b815260206004820152600c60248201527f5a45524f5f4144445245535300000000000000000000000000000000000000006044820152606401610492565b61036d6001600019610fa6565b6001805461038090610f4f565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610a5285858561058c565b6001600160a01b0384163b1580610ae95750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a0290610a9a9033908a90899089908990600401610fc7565b6020604051808303816000875af1158015610ab9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610add9190610f89565b6001600160e01b031916145b610b355760405162461bcd60e51b815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610492565b5050505050565b6001600160a01b038216610b925760405162461bcd60e51b815260206004820152601160248201527f494e56414c49445f524543495049454e540000000000000000000000000000006044820152606401610492565b6000818152600260205260409020546001600160a01b031615610bf75760405162461bcd60e51b815260206004820152600e60248201527f414c52454144595f4d494e5445440000000000000000000000000000000000006044820152606401610492565b60008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000818152600260205260409020546001600160a01b031680610ca25760405162461bcd60e51b815260206004820152600a6024820152691393d517d3525395115160b21b6044820152606401610492565b600082815260026020908152604080832080546001600160a01b031990811690915560049092528083208054909216909155518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6001600160e01b03198116811461090f57600080fd5b600060208284031215610d3457600080fd5b8135610d3f81610d0c565b9392505050565b600060208083528351808285015260005b81811015610d7357858101830151858201604001528201610d57565b506000604082860101526040601f19601f8301168501019250505092915050565b600060208284031215610da657600080fd5b5035919050565b80356001600160a01b038116811461096457600080fd5b60008060408385031215610dd757600080fd5b610de083610dad565b946020939093013593505050565b600060208284031215610e0057600080fd5b610d3f82610dad565b600080600060608486031215610e1e57600080fd5b610e2784610dad565b9250610e3560208501610dad565b9150604084013590509250925092565b60008060408385031215610e5857600080fd5b610e6183610dad565b915060208301358015158114610e7657600080fd5b809150509250929050565b600080600080600060808688031215610e9957600080fd5b610ea286610dad565b9450610eb060208701610dad565b935060408601359250606086013567ffffffffffffffff80821115610ed457600080fd5b818801915088601f830112610ee857600080fd5b813581811115610ef757600080fd5b896020828501011115610f0957600080fd5b9699959850939650602001949392505050565b60008060408385031215610f2f57600080fd5b610f3883610dad565b9150610f4660208401610dad565b90509250929050565b600181811c90821680610f6357607f821691505b602082108103610f8357634e487b7160e01b600052602260045260246000fd5b50919050565b600060208284031215610f9b57600080fd5b8151610d3f81610d0c565b8181038181111561036d57634e487b7160e01b600052601160045260246000fd5b60006001600160a01b03808816835280871660208401525084604083015260806060830152826080830152828460a0840137600060a0848401015260a0601f19601f8501168301019050969550505050505056fea2646970667358221220ab505b0fa2a68c2e7a7b99fefd55dd57b30afd94e202e9ec829346cdb98433e764736f6c63430008100033000000000000000000000000a775b9cd6335c028693e7b0b3b6f76fc90aea8ce00000000000000000000000060167eace2d0a650313c22df7e613043f571e0d30000000000000000000000008ad3668b088bf7abee6488da8f6570e8c3586c22000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Deployed Bytecode
0x60806040526004361061049f5760003560e01c80635c532b461161025e578063a0712d6811610143578063c212a523116100bb578063cd3daf9d1161008a578063d86f1ab01161006f578063d86f1ab014610f29578063e985e9c514610f3f578063ecc389ba14610f7a57600080fd5b8063cd3daf9d14610eef578063d50cb36414610f0457600080fd5b8063c212a52314610e5e578063c744656514610e7e578063c87b56dd14610eb2578063c8f33c9114610ed257600080fd5b8063b2b5334911610112578063b88d4fde116100f7578063b88d4fde14610dda578063c00119ce14610dfa578063c0aa0e8a14610e3e57600080fd5b8063b2b5334914610da4578063b723b34e14610dba57600080fd5b8063a0712d6814610d2e578063a16a642114610d4e578063a22cb46514610d64578063a8aa1b3114610d8457600080fd5b80637c61ab1e116101d65780638da5cb5b116101a557806395d89b411161018a57806395d89b4114610cd05780639fab026314610ce5578063a035b1fe14610d1957600080fd5b80638da5cb5b14610c9a5780639278cd1a14610cba57600080fd5b80637c61ab1e14610c275780637d01d04d14610c475780637dd0804814610c675780638187f51614610c7a57600080fd5b80636352211e1161022d5780636d23d956116102125780636d23d95614610b3857806370a0823114610bd35780637b0a47ee14610bf357600080fd5b80636352211e14610ae457806367d3b48814610b0457600080fd5b80635c532b46146109b45780635d63fcf4146109d45780635f1c17c014610a085780635fcbd28514610ab057600080fd5b806325513e131161038457806342842e0e116102fc5780634cddc728116102cb5780634dada002116102b05780634dada0021461096b578063586b9a7c146109875780635ade228a1461099c57600080fd5b80634cddc7281461092a5780634d49e87d1461095857600080fd5b806342842e0e146108a157806343c94f3e146108c15780634912fc74146108f55780634bad95101461091557600080fd5b80633781826e116103535780633de4e06b116103385780633de4e06b1461081f5780633fc8cef31461085357806341a6ba711461088757600080fd5b80633781826e146107cb5780633848eecf146107eb57600080fd5b806325513e1314610743578063255f5f551461077557806332cb6b0c14610795578063355e0c5d146107ab57600080fd5b806313af40351161041757806319096746116103e65780631daba63b116103cb5780631daba63b146106ee5780631dd19cb41461070e57806323b872dd1461072357600080fd5b806319096746146106b95780631c2655c5146106d957600080fd5b806313af40351461061e578063150b7a021461063e5780631626ba7e1461068357806318160ddd146106a357600080fd5b8063081812fc1161046e578063097114221161045357806309711422146105b357806309cf6091146105d35780630ba84e85146105f157600080fd5b8063081812fc14610543578063095ea7b31461059157600080fd5b806301ffc9a7146104ab57806304c80eaa146104e057806306fdde031461050e57806307b9d49c1461053057600080fd5b366104a657005b600080fd5b3480156104b757600080fd5b506104cb6104c63660046140cc565b610fa2565b60405190151581526020015b60405180910390f35b3480156104ec57600080fd5b506105006104fb3660046140e9565b610fe6565b6040519081526020016104d7565b34801561051a57600080fd5b5061052361107c565b6040516104d79190614152565b61050061053e3660046141b1565b61110a565b34801561054f57600080fd5b5061057961055e3660046140e9565b6011602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016104d7565b34801561059d57600080fd5b506105b16105ac36600461422b565b611130565b005b3480156105bf57600080fd5b506105b16105ce366004614257565b611226565b3480156105df57600080fd5b506105006903cfc82e37e9a740000081565b3480156105fd57600080fd5b5061050061060c3660046142a8565b60166020526000908152604090205481565b34801561062a57600080fd5b506105b16106393660046142a8565b61157f565b34801561064a57600080fd5b5061066a6106593660046142c5565b630a85bd0160e11b95945050505050565b6040516001600160e01b031990911681526020016104d7565b34801561068f57600080fd5b5061066a61069e3660046143fd565b611614565b3480156106af57600080fd5b5061050060135481565b3480156106c557600080fd5b506105006106d43660046140e9565b611650565b3480156106e557600080fd5b50610500611a9e565b3480156106fa57600080fd5b506105b161070936600461422b565b611b33565b34801561071a57600080fd5b50610500611c8a565b34801561072f57600080fd5b506105b161073e366004614487565b611e19565b34801561074f57600080fd5b506003546107609063ffffffff1681565b60405163ffffffff90911681526020016104d7565b34801561078157600080fd5b506105006107903660046144dd565b611fef565b3480156107a157600080fd5b5061050061753081565b3480156107b757600080fd5b50601854610579906001600160a01b031681565b3480156107d757600080fd5b506105006107e63660046140e9565b612277565b3480156107f757600080fd5b506105797f0000000000000000000000002600c3a0d5b51698bd951ece63b131ad088a25ca81565b34801561082b57600080fd5b506105797f0000000000000000000000008ad3668b088bf7abee6488da8f6570e8c3586c2281565b34801561085f57600080fd5b506105797f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b34801561089357600080fd5b506014546104cb9060ff1681565b3480156108ad57600080fd5b506105b16108bc366004614487565b612298565b3480156108cd57600080fd5b506105007f000000000000000000000000000000000000000000000000000000006c8657f081565b34801561090157600080fd5b506105006109103660046140e9565b61236e565b34801561092157600080fd5b50610500612718565b34801561093657600080fd5b5061094a6109453660046144fb565b61277b565b6040516104d79291906146a4565b610500610966366004614257565b612afa565b34801561097757600080fd5b5061050067016345785d8a000081565b34801561099357600080fd5b506105b1612dee565b3480156109a857600080fd5b506105006304a2860081565b3480156109c057600080fd5b506105b16109cf3660046142a8565b612e46565b3480156109e057600080fd5b506105797f00000000000000000000000060167eace2d0a650313c22df7e613043f571e0d381565b348015610a1457600080fd5b50610aa3610a233660046140e9565b604080516080810182526000808252602082018190529181018290526060810191909152506000908152600b60209081526040918290208251608081018452815481526001909101546001600160801b03811692820192909252600160801b820463ffffffff1692810192909252600160a01b900460ff16606082015290565b6040516104d791906146bd565b348015610abc57600080fd5b506105797f000000000000000000000000a775b9cd6335c028693e7b0b3b6f76fc90aea8ce81565b348015610af057600080fd5b50610579610aff3660046140e9565b612eb1565b348015610b1057600080fd5b506105007f0000000000000000000000000000000000000000000000000000000067c2dc7081565b348015610b4457600080fd5b50610aa3610b533660046140e9565b604080516080810182526000808252602082018190529181018290526060810191909152506000908152600460209081526040918290208251608081018452815481526001909101546001600160801b03811692820192909252600160801b820463ffffffff1692810192909252600160a01b900460ff16606082015290565b348015610bdf57600080fd5b50610500610bee3660046142a8565b612f1b565b348015610bff57600080fd5b506105007f0000000000000000000000000000000000000000000000000000d287fb79cd0981565b348015610c3357600080fd5b506105b1610c4236600461484d565b612f8f565b348015610c5357600080fd5b50610500610c623660046140e9565b6131a9565b610500610c753660046141b1565b613228565b348015610c8657600080fd5b506105b1610c953660046142a8565b613243565b348015610ca657600080fd5b50600654610579906001600160a01b031681565b348015610cc657600080fd5b5061050060025481565b348015610cdc57600080fd5b50610523613315565b348015610cf157600080fd5b506105797f000000000000000000000000d2b87d87267e24fb5003fba7805a1b9623d1948781565b348015610d2557600080fd5b50610500613322565b348015610d3a57600080fd5b50610500610d493660046140e9565b613367565b348015610d5a57600080fd5b5061050060095481565b348015610d7057600080fd5b506105b1610d7f366004614a36565b61337d565b348015610d9057600080fd5b50601754610579906001600160a01b031681565b348015610db057600080fd5b50610500600c5481565b348015610dc657600080fd5b50610500610dd5366004614a6f565b6133e9565b348015610de657600080fd5b506105b1610df53660046142c5565b6133f6565b348015610e0657600080fd5b50600a54610e26906801000000000000000090046001600160801b031681565b6040516001600160801b0390911681526020016104d7565b348015610e4a57600080fd5b50610500610e593660046140e9565b6134eb565b348015610e6a57600080fd5b50610500610e793660046144dd565b6134fb565b348015610e8a57600080fd5b506105007f000000000000000000000000000000000000000000000000000000006320567081565b348015610ebe57600080fd5b50610523610ecd3660046140e9565b613797565b348015610ede57600080fd5b50600a546107609063ffffffff1681565b348015610efb57600080fd5b50610500613822565b348015610f1057600080fd5b50600a5461076090640100000000900463ffffffff1681565b348015610f3557600080fd5b5061050060155481565b348015610f4b57600080fd5b506104cb610f5a366004614a94565b601260209081526000928352604080842090915290825290205460ff1681565b348015610f8657600080fd5b50600354610e269064010000000090046001600160801b031681565b60006001600160e01b031982167f780e9d63000000000000000000000000000000000000000000000000000000001480610fe05750610fe082613928565b92915050565b60008181526004602052604081206001808201548154849291600160a01b900460ff1690811061101857611018614ac2565b600091825260209091200154600183015461103c91906001600160801b0316614aee565b90506ec097ce7bc90715b34b9f100000000082600001546002546110609190614b0d565b61106a9083614aee565b6110749190614b20565b949350505050565b600d805461108990614b42565b80601f01602080910402602001604051908101604052809291908181526020018280546110b590614b42565b80156111025780601f106110d757610100808354040283529160200191611102565b820191906000526020600020905b8154815290600101906020018083116110e557829003601f168201915b505050505081565b60008061111987878787612afa565b905061112581846134fb565b979650505050505050565b6000818152600f60205260409020546001600160a01b03163381148061117957506001600160a01b038116600090815260126020908152604080832033845290915290205460ff165b6111ca5760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064015b60405180910390fd5b60008281526011602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611230613322565b90508181111580156112425750828110155b61128e5760405162461bcd60e51b815260206004820152600e60248201527f507269636520736c69707061676500000000000000000000000000000000000060448201526064016111c1565b6000611298612718565b905060006112a4611a9e565b90506000816112b38885614aee565b6112bd9190614b20565b90506112db6112cc8285614b0d565b6112d68985614b0d565b6139c1565b6017546040516378a1085360e11b8152600481018390526001600160a01b039091169063f14210a690602401600060405180830381600087803b15801561132157600080fd5b505af1158015611335573d6000803e3d6000fd5b50506017546040517f13edab810000000000000000000000000000000000000000000000000000000081526001600160a01b0390911692506313edab8191506113869030908c908c90600401614b7c565b600060405180830381600087803b1580156113a057600080fd5b505af11580156113b4573d6000803e3d6000fd5b5050505060007f000000000000000000000000a775b9cd6335c028693e7b0b3b6f76fc90aea8ce6001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611418573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061143c9190614bde565b905060008361144b8a84614aee565b6114559190614b20565b6040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018290529091507f000000000000000000000000a775b9cd6335c028693e7b0b3b6f76fc90aea8ce6001600160a01b031690639dc29fac90604401600060405180830381600087803b1580156114d957600080fd5b505af11580156114ed573d6000803e3d6000fd5b5050505060005b898110156115275761151f30338d8d8581811061151357611513614ac2565b90506020020135613ac3565b6001016114f4565b506115323384613ce3565b60408051848152602081018b90529081018290527f462ff1f90b66e3549a190bb471a2276749250543bad2ce9c21f706d882a59dad9060600160405180910390a150505050505050505050565b6006546001600160a01b031633146115c85760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016111c1565b600680546001600160a01b0319166001600160a01b03831690811790915560405133907f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d7690600090a350565b6000600c54600214611627576000611649565b7f1626ba7e000000000000000000000000000000000000000000000000000000005b9392505050565b6040516331a9108f60e11b8152600481018290526000907f000000000000000000000000d2b87d87267e24fb5003fba7805a1b9623d194876001600160a01b031690636352211e90602401602060405180830381865afa1580156116b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116dc9190614bf7565b6001600160a01b0316336001600160a01b0316146117285760405162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b60448201526064016111c1565b6000828152600b60209081526040918290208251608081018452815481526001909101546001600160801b03811692820192909252600160801b820463ffffffff1692810192909252600160a01b900460ff166060820181905260078054909190811061179757611797614ac2565b9060005260206000200154816040015163ffffffff166117b79190614c14565b4210156118065760405162461bcd60e51b815260206004820152601060248201527f426f6e64206e6f74206d6174757265640000000000000000000000000000000060448201526064016111c1565b61180e613822565b600955604051630852cd8d60e31b8152600481018490527f000000000000000000000000d2b87d87267e24fb5003fba7805a1b9623d194876001600160a01b0316906342966c6890602401600060405180830381600087803b15801561187357600080fd5b505af1158015611887573d6000803e3d6000fd5b5050600a805463ffffffff19164263ffffffff16179055505060208101516060820151600880546001600160801b0390931692670de0b6b3a76400009260ff169081106118d6576118d6614ac2565b9060005260206000200154826118ec9190614aee565b6118f69190614b20565b600a805460089061191d9084906801000000000000000090046001600160801b0316614c27565b82546001600160801b039182166101009390930a92830291909202199091161790555060405163a9059cbb60e01b8152336004820152602481018290526001600160a01b037f000000000000000000000000a775b9cd6335c028693e7b0b3b6f76fc90aea8ce169063a9059cbb906044016020604051808303816000875af11580156119ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119d19190614c4e565b506119db846131a9565b6040516340c10f1960e01b8152336004820152602481018290529093507f00000000000000000000000060167eace2d0a650313c22df7e613043f571e0d36001600160a01b0316906340c10f1990604401600060405180830381600087803b158015611a4657600080fd5b505af1158015611a5a573d6000803e3d6000fd5b505050507fe44694c943742657abee88b2aec7c98d7f392a3302dd496e31b5544e537e15e08483604051611a8f929190614c6b565b60405180910390a15050919050565b601754604080517f12b495a800000000000000000000000000000000000000000000000000000000815290516000926001600160a01b0316916312b495a89160048083019260209291908290030181865afa158015611b01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b259190614cb2565b6001600160801b0316905090565b6006546001600160a01b03163314611b7c5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016111c1565b60145460ff1615611bcf5760405162461bcd60e51b815260206004820152601960248201527f57686974656c69737420686173206265656e20636c6f7365640000000000000060448201526064016111c1565b6001600160a01b0382166000908152601660205260408120546015805491928392611bfb908490614b0d565b925050819055508160156000828254611c149190614c14565b90915550506015546175301015611c6d5760405162461bcd60e51b815260206004820152601a60248201527f4d617820737570706c7920616c7265616479207265616368656400000000000060448201526064016111c1565b506001600160a01b03909116600090815260166020526040902055565b600080600560009054906101000a90046001600160a01b03166001600160a01b031663398482d86040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ce0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d049190614cb2565b6005546001600160801b039190911691506000906001600160a01b0316318210611d2f576000611d47565b600554611d479083906001600160a01b031631614b0d565b6005546040516378a1085360e11b8152600481018390529192506001600160a01b03169063f14210a690602401600060405180830381600087803b158015611d8e57600080fd5b505af1158015611da2573d6000803e3d6000fd5b50505050600081118015611dc8575060035464010000000090046001600160801b031615155b15610fe05760035464010000000090046001600160801b0316611df382670de0b6b3a7640000614aee565b611dfd9190614b20565b60026000828254611e0e9190614c14565b909155505092915050565b6000818152600f60205260409020546001600160a01b03848116911614611e6f5760405162461bcd60e51b815260206004820152600a60248201526957524f4e475f46524f4d60b01b60448201526064016111c1565b6001600160a01b038216611eb95760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b60448201526064016111c1565b336001600160a01b0384161480611ef357506001600160a01b038316600090815260126020908152604080832033845290915290205460ff165b80611f1457506000818152601160205260409020546001600160a01b031633145b611f605760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016111c1565b6001600160a01b038084166000818152601060209081526040808320805460001901905593861680835284832080546001019055858352600f825284832080546001600160a01b03199081168317909155601190925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000611ff9611c8a565b50600380546001919060009061201690849063ffffffff16614ccf565b82546101009290920a63ffffffff818102199093169183160217909155600354811660008181526004602052604090206002548155600181810180546001600160801b038a166001600160a01b031990911617600160801b42909616959095029490941760ff60a01b1916600160a01b60ff8916021790935582549194509250670de0b6b3a76400009190859081106120b1576120b1614ac2565b9060005260206000200154856001600160801b03166120d09190614aee565b6120da9190614b20565b600380546004906120fd90849064010000000090046001600160801b0316614cec565b82546101009290920a6001600160801b038181021990931691831602179091556040516323b872dd60e01b815233600482015230602482015290861660448201527f000000000000000000000000a775b9cd6335c028693e7b0b3b6f76fc90aea8ce6001600160a01b031691506323b872dd906064016020604051808303816000875af1158015612192573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121b69190614c4e565b506040516340c10f1960e01b8152336004820152602481018390527f0000000000000000000000002600c3a0d5b51698bd951ece63b131ad088a25ca6001600160a01b0316906340c10f1990604401600060405180830381600087803b15801561221f57600080fd5b505af1158015612233573d6000803e3d6000fd5b505050507fbcfb553f47b13ce6eaa94a5a3d32329da2677aaaeb218179b18f23aca1db4c998282604051612268929190614d0c565b60405180910390a15092915050565b6008818154811061228757600080fd5b600091825260209091200154905081565b600c546002036122a757505050565b7f0000000000000000000000008ad3668b088bf7abee6488da8f6570e8c3586c226001600160a01b0316836001600160a01b03161480156122e9575061753081115b801561231d5750336001600160a01b037f0000000000000000000000008ad3668b088bf7abee6488da8f6570e8c3586c2216145b1561235e5761235861233182600019614b0d565b837f0000000000000000000000008ad3668b088bf7abee6488da8f6570e8c3586c22613d3e565b50505050565b612369838383613e64565b505050565b6040516331a9108f60e11b8152600481018290526000907f0000000000000000000000002600c3a0d5b51698bd951ece63b131ad088a25ca6001600160a01b031690636352211e90602401602060405180830381865afa1580156123d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123fa9190614bf7565b6001600160a01b0316336001600160a01b0316146124465760405162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b60448201526064016111c1565b60008281526004602090815260408083208151608081018352815481526001909101546001600160801b03811693820193909352600160801b830463ffffffff1691810191909152600160a01b90910460ff1660608201819052825491929181106124b3576124b3614ac2565b9060005260206000200154816040015163ffffffff166124d39190614c14565b4210156125225760405162461bcd60e51b815260206004820152601060248201527f426f6e64206e6f74206d6174757265640000000000000000000000000000000060448201526064016111c1565b61252a611c8a565b50604051630852cd8d60e31b8152600481018490527f0000000000000000000000002600c3a0d5b51698bd951ece63b131ad088a25ca6001600160a01b0316906342966c6890602401600060405180830381600087803b15801561258d57600080fd5b505af11580156125a1573d6000803e3d6000fd5b50505050600081602001516001600160801b03169050670de0b6b3a76400006001836060015160ff16815481106125da576125da614ac2565b9060005260206000200154826125f09190614aee565b6125fa9190614b20565b6003805460049061261d90849064010000000090046001600160801b0316614c27565b82546001600160801b039182166101009390930a92830291909202199091161790555060405163a9059cbb60e01b8152336004820152602481018290526001600160a01b037f000000000000000000000000a775b9cd6335c028693e7b0b3b6f76fc90aea8ce169063a9059cbb906044016020604051808303816000875af11580156126ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126d19190614c4e565b506126db84610fe6565b92506126e73384613ce3565b7f68fdf814c7f7091db14b00c71885abc4f242a48abe180938ae773cf9c71eeac48483604051611a8f929190614c6b565b601754604080517f398482d800000000000000000000000000000000000000000000000000000000815290516000926001600160a01b03169163398482d89160048083019260209291908290030181865afa158015611b01573d6000803e3d6000fd5b60006127fe604051806101a0016040528060006001600160a01b0316815260200160001515815260200160001515815260200160006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160008152602001606081526020016060815260200160608152602001606081525090565b6000841161284e5760405162461bcd60e51b815260206004820152601f60248201527f4d75737420636f6e76657274206174206c65617374206f6e652061737365740060448201526064016111c1565b603284111561289f5760405162461bcd60e51b815260206004820152601e60248201527f4d75737420636f6e76657274203530206f72206c65737320617373657473000060448201526064016111c1565b30815260016020820152600060408201527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031660608201526128f18467016345785d8a0000614aee565b6080820152612920427f000000000000000000000000000000000000000000000000000000006c8657f0614b0d565b60c0820152612930426001614c14565b60e0820152610100810183905260408051600180825281830190925290816020015b6040805180820190915260008082526020820152815260200190600190039081612952575050610180820152604080518082019091523081526020810161299b86600019614b0d565b8152508161018001516000815181106129b6576129b6614ac2565b60209081029190910101526001600160a01b037f00000000000000000000000060167eace2d0a650313c22df7e613043f571e0d316639dc29fac33612a0387670de0b6b3a7640000614aee565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612a4957600080fd5b505af1158015612a5d573d6000803e3d6000fd5b50505050612a6a81613ece565b6040516323b872dd60e01b8152306004820152336024820152604481018290529092507f0000000000000000000000008ad3668b088bf7abee6488da8f6570e8c3586c226001600160a01b0316906323b872dd90606401600060405180830381600087803b158015612adb57600080fd5b505af1158015612aef573d6000803e3d6000fd5b505050509250929050565b600080612b05612718565b90506000612b11611a9e565b905060008083118015612b245750600082115b612b2f576000612b39565b612b398284614b20565b9050848111158015612b4b5750858110155b612b975760405162461bcd60e51b815260206004820152600e60248201527f507269636520736c69707061676500000000000000000000000000000000000060448201526064016111c1565b655af3107a40003411612bec5760405162461bcd60e51b815260206004820152601f60248201527f4d7573742073656e64206174206c6561737420302e303030312065746865720060448201526064016111c1565b612c03612bf93485614c14565b6112d68985614c14565b60007f000000000000000000000000a775b9cd6335c028693e7b0b3b6f76fc90aea8ce6001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c879190614bde565b90508015612cc657612cc184612c9d3484614aee565b612ca79190614b20565b84612cb28b85614aee565b612cbc9190614b20565b613f98565b612cd0565b612cd08834614aee565b6040516340c10f1960e01b8152336004820152602481018290529095507f000000000000000000000000a775b9cd6335c028693e7b0b3b6f76fc90aea8ce6001600160a01b0316906340c10f1990604401600060405180830381600087803b158015612d3b57600080fd5b505af1158015612d4f573d6000803e3d6000fd5b5050505060005b88811015612d8a57601754612d829033906001600160a01b03168c8c8581811061151357611513614ac2565b600101612d56565b50601754612da1906001600160a01b031634613ce3565b60408051348152602081018a90529081018690527ff75993dbe1645872cbbea6395e1feebee76b435baf0e4d62d7eac269c6f57b249060600160405180910390a150505050949350505050565b6006546001600160a01b03163314612e375760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016111c1565b6014805460ff19166001179055565b6006546001600160a01b03163314612e8f5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016111c1565b601880546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600f60205260409020546001600160a01b031680612f165760405162461bcd60e51b815260206004820152600a60248201527f4e4f545f4d494e5445440000000000000000000000000000000000000000000060448201526064016111c1565b919050565b60006001600160a01b038216612f735760405162461bcd60e51b815260206004820152600c60248201527f5a45524f5f41444452455353000000000000000000000000000000000000000060448201526064016111c1565b506001600160a01b031660009081526010602052604090205490565b6006546001600160a01b03163314612fd85760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016111c1565b60005b825181101561308e577f0000000000000000000000008ad3668b088bf7abee6488da8f6570e8c3586c226001600160a01b0316631913cfd784838151811061302557613025614ac2565b60200260200101516040518263ffffffff1660e01b81526004016130499190614d50565b600060405180830381600087803b15801561306357600080fd5b505af1158015613077573d6000803e3d6000fd5b50505050808061308690614d63565b915050612fdb565b506040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b03169063a9059cbb90839083906370a0823190602401602060405180830381865afa158015613116573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061313a9190614bde565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015613185573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123699190614c4e565b6000818152600b602052604081206001810154600880548492600160a01b900460ff169081106131db576131db614ac2565b60009182526020909120015460018301546131ff91906001600160801b0316614aee565b90506ec097ce7bc90715b34b9f1000000000826000015461321e613822565b6110609190614b0d565b60008061323787878787612afa565b90506111258184611fef565b6006546001600160a01b0316331461328c5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016111c1565b6017546001600160a01b0316156132e55760405162461bcd60e51b815260206004820152601060248201527f5061697220616c7265616479207365740000000000000000000000000000000060448201526064016111c1565b601780546001600160a01b03929092166001600160a01b0319928316811790915560058054909216179055565b50565b600e805461108990614b42565b60008061332d612718565b90506000613339611a9e565b905060008211801561334b5750600081115b613356576000613360565b6133608183614b20565b9250505090565b600061337382336133e9565b5050601354919050565b3360008181526012602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000611649838333613d3e565b613401858585611e19565b6001600160a01b0384163b15806134985750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a02906134499033908a90899089908990600401614d7c565b6020604051808303816000875af1158015613468573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061348c9190614dd0565b6001600160e01b031916145b6134e45760405162461bcd60e51b815260206004820152601060248201527f554e534146455f524543495049454e540000000000000000000000000000000060448201526064016111c1565b5050505050565b6007818154811061228757600080fd5b6000613505613822565b600955600a80546001919060049061352c908490640100000000900463ffffffff16614ccf565b82546101009290920a63ffffffff818102199093169183160217909155600a8054640100000000900482166000818152600b6020526040902060095481556001810180546001600160801b038a166001600160a01b031990911617600160801b429096169586021760ff60a01b1916600160a01b60ff8a1602179055825463ffffffff191690931790915560088054919450919250670de0b6b3a76400009190859081106135dc576135dc614ac2565b9060005260206000200154856001600160801b03166135fb9190614aee565b6136059190614b20565b600a805460089061362c9084906801000000000000000090046001600160801b0316614cec565b82546101009290920a6001600160801b038181021990931691831602179091556040516323b872dd60e01b815233600482015230602482015290861660448201527f000000000000000000000000a775b9cd6335c028693e7b0b3b6f76fc90aea8ce6001600160a01b031691506323b872dd906064016020604051808303816000875af11580156136c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136e59190614c4e565b506040516340c10f1960e01b8152336004820152602481018390527f000000000000000000000000d2b87d87267e24fb5003fba7805a1b9623d194876001600160a01b0316906340c10f1990604401600060405180830381600087803b15801561374e57600080fd5b505af1158015613762573d6000803e3d6000fd5b505050507fe92e7a07bbbf0885cfe2769d6491097062ce995593b84a32f347b92eb74ac1c78282604051612268929190614d0c565b6018546040517fc87b56dd000000000000000000000000000000000000000000000000000000008152600481018390526060916001600160a01b03169063c87b56dd90602401600060405180830381865afa1580156137fa573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610fe09190810190614ded565b600a546000906801000000000000000090046001600160801b0316810361384a575060095490565b600a546000906138809063ffffffff167f0000000000000000000000000000000000000000000000000000000067c2dc70613f98565b6138aa427f0000000000000000000000000000000000000000000000000000000067c2dc70613f98565b6138b49190614b0d565b600a549091506801000000000000000090046001600160801b03166138f97f0000000000000000000000000000000000000000000000000000d287fb79cd0983614aee565b61390b90670de0b6b3a7640000614aee565b6139159190614b20565b6009546139229190614c14565b91505090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316148061398b57507f80ac58cd000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610fe05750506001600160e01b0319167f5b5e139f000000000000000000000000000000000000000000000000000000001490565b6017546040517fd8a1890c0000000000000000000000000000000000000000000000000000000081526001600160801b03841660048201526001600160a01b039091169063d8a1890c90602401600060405180830381600087803b158015613a2857600080fd5b505af1158015613a3c573d6000803e3d6000fd5b50506017546040517f6809f6640000000000000000000000000000000000000000000000000000000081526001600160801b03851660048201526001600160a01b039091169250636809f6649150602401600060405180830381600087803b158015613aa757600080fd5b505af1158015613abb573d6000803e3d6000fd5b505050505050565b6000818152600f60205260409020546001600160a01b03848116911614613b195760405162461bcd60e51b815260206004820152600a60248201526957524f4e475f46524f4d60b01b60448201526064016111c1565b6001600160a01b038216613b635760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b60448201526064016111c1565b6001600160a01b038084166000818152601060209081526040808320805460001901905593861680835284832080546001019055858352600f825284832080546001600160a01b03199081168317909155601190925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a46001600160a01b0382163b1580613c975750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4015b6020604051808303816000875af1158015613c67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c8b9190614dd0565b6001600160e01b031916145b6123695760405162461bcd60e51b815260206004820152601060248201527f554e534146455f524543495049454e540000000000000000000000000000000060448201526064016111c1565b600080600080600085875af19050806123695760405162461bcd60e51b815260206004820152601360248201527f4554485f5452414e534645525f4641494c45440000000000000000000000000060448201526064016111c1565b6001600160a01b038116600090815260166020526040812054841115613da65760405162461bcd60e51b815260206004820152601f60248201527f4e6f742077686974656c697374656420666f72207468697320616d6f756e740060448201526064016111c1565b6013545b84601354613db89190614c14565b811015613de557613dd384613dce836001614c14565b613fae565b80613ddd81614d63565b915050613daa565b506001600160a01b03831660009081526010602052604081208054869290613e0e908490614c14565b925050819055508360136000828254613e279190614c14565b90915550506001600160a01b03821660009081526016602052604081208054869290613e54908490614b0d565b9091555050601354949350505050565b613e6f838383611e19565b6001600160a01b0382163b1580613c975750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a401613c48565b6002600c5560408051600080825260208201928390527f68840dd40000000000000000000000000000000000000000000000000000000090925260606001600160a01b037f0000000000000000000000008ad3668b088bf7abee6488da8f6570e8c3586c22166368840dd4613f4886848660248101614e64565b6020604051808303816000875af1158015613f67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f8b9190614bde565b6001600c55949350505050565b6000818310613fa75781611649565b5090919050565b6001600160a01b038216613ff85760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b60448201526064016111c1565b6000818152600f60205260409020546001600160a01b03161561405d5760405162461bcd60e51b815260206004820152600e60248201527f414c52454144595f4d494e54454400000000000000000000000000000000000060448201526064016111c1565b6000818152600f602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160e01b03198116811461331257600080fd5b6000602082840312156140de57600080fd5b8135611649816140b6565b6000602082840312156140fb57600080fd5b5035919050565b60005b8381101561411d578181015183820152602001614105565b50506000910152565b6000815180845261413e816020860160208601614102565b601f01601f19169290920160200192915050565b6020815260006116496020830184614126565b60008083601f84011261417757600080fd5b50813567ffffffffffffffff81111561418f57600080fd5b6020830191508360208260051b85010111156141aa57600080fd5b9250929050565b6000806000806000608086880312156141c957600080fd5b853567ffffffffffffffff8111156141e057600080fd5b6141ec88828901614165565b9099909850602088013597604081013597506060013595509350505050565b6001600160a01b038116811461331257600080fd5b8035612f168161420b565b6000806040838503121561423e57600080fd5b82356142498161420b565b946020939093013593505050565b6000806000806060858703121561426d57600080fd5b843567ffffffffffffffff81111561428457600080fd5b61429087828801614165565b90989097506020870135966040013595509350505050565b6000602082840312156142ba57600080fd5b81356116498161420b565b6000806000806000608086880312156142dd57600080fd5b85356142e88161420b565b945060208601356142f88161420b565b935060408601359250606086013567ffffffffffffffff8082111561431c57600080fd5b818801915088601f83011261433057600080fd5b81358181111561433f57600080fd5b89602082850101111561435157600080fd5b9699959850939650602001949392505050565b634e487b7160e01b600052604160045260246000fd5b6040516101a0810167ffffffffffffffff8111828210171561439e5761439e614364565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156143cd576143cd614364565b604052919050565b600067ffffffffffffffff8211156143ef576143ef614364565b50601f01601f191660200190565b6000806040838503121561441057600080fd5b82359150602083013567ffffffffffffffff81111561442e57600080fd5b8301601f8101851361443f57600080fd5b803561445261444d826143d5565b6143a4565b81815286602083850101111561446757600080fd5b816020840160208301376000602083830101528093505050509250929050565b60008060006060848603121561449c57600080fd5b83356144a78161420b565b925060208401356144b78161420b565b929592945050506040919091013590565b6001600160801b038116811461331257600080fd5b600080604083850312156144f057600080fd5b8235614249816144c8565b6000806040838503121561450e57600080fd5b50508035926020909101359150565b600081518084526020808501945080840160005b838110156145565781516001600160a01b031687529582019590820190600101614531565b509495945050505050565b600081518084526020808501945080840160005b8381101561455657815180516001600160a01b031688528301518388015260409096019590820190600101614575565b80516001600160a01b0316825260006101a060208301516145ca602086018215159052565b5060408301516145de604086018215159052565b5060608301516145f960608601826001600160a01b03169052565b506080830151608085015260a083015160a085015260c083015160c085015260e083015160e08501526101008084015181860152506101208084015182828701526146468387018261451d565b925050506101408084015185830382870152614662838261451d565b92505050610160808401518583038287015261467e8382614561565b92505050610180808401518583038287015261469a8382614561565b9695505050505050565b82815260406020820152600061107460408301846145a5565b815181526020808301516001600160801b03169082015260408083015163ffffffff169082015260608083015160ff169082015260808101610fe0565b600067ffffffffffffffff82111561471457614714614364565b5060051b60200190565b801515811461331257600080fd5b8035612f168161471e565b600082601f83011261474857600080fd5b8135602061475861444d836146fa565b82815260059290921b8401810191818101908684111561477757600080fd5b8286015b8481101561479b57803561478e8161420b565b835291830191830161477b565b509695505050505050565b600082601f8301126147b757600080fd5b813560206147c761444d836146fa565b82815260069290921b840181019181810190868411156147e657600080fd5b8286015b8481101561479b57604080828a0312156148045760008081fd5b805181810181811067ffffffffffffffff8211171561482557614825614364565b9091528135906148348261420b565b90815281850135858201528352918301916040016147ea565b6000806040838503121561486057600080fd5b823567ffffffffffffffff8082111561487857600080fd5b818501915085601f83011261488c57600080fd5b8135602061489c61444d836146fa565b82815260059290921b840181019181810190898411156148bb57600080fd5b8286015b84811015614a19578035868111156148d657600080fd5b87016101a0818d03601f190112156148ed57600080fd5b6148f561437a565b614900868301614220565b815261490e6040830161472c565b8682015261491e6060830161472c565b604082015261492f60808301614220565b606082015260a0820135608082015260c082013560a082015260e082013560c082015261010082013560e08201526101208201356101008201526101408201358881111561497c57600080fd5b61498a8e8883860101614737565b61012083015250610160820135888111156149a457600080fd5b6149b28e8883860101614737565b6101408301525061018080830135898111156149cd57600080fd5b6149db8f89838701016147a6565b610160840152506101a0830135898111156149f557600080fd5b614a038f89838701016147a6565b91830191909152508452509183019183016148bf565b509650614a299050878201614220565b9450505050509250929050565b60008060408385031215614a4957600080fd5b8235614a548161420b565b91506020830135614a648161471e565b809150509250929050565b60008060408385031215614a8257600080fd5b823591506020830135614a648161420b565b60008060408385031215614aa757600080fd5b8235614ab28161420b565b91506020830135614a648161420b565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615614b0857614b08614ad8565b500290565b81810381811115610fe057610fe0614ad8565b600082614b3d57634e487b7160e01b600052601260045260246000fd5b500490565b600181811c90821680614b5657607f821691505b602082108103614b7657634e487b7160e01b600052602260045260246000fd5b50919050565b6001600160a01b03841681526040602082015281604082015260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115614bc457600080fd5b8260051b8085606085013791909101606001949350505050565b600060208284031215614bf057600080fd5b5051919050565b600060208284031215614c0957600080fd5b81516116498161420b565b80820180821115610fe057610fe0614ad8565b6001600160801b03828116828216039080821115614c4757614c47614ad8565b5092915050565b600060208284031215614c6057600080fd5b81516116498161471e565b82815260a081016116496020830184805182526001600160801b03602082015116602083015263ffffffff604082015116604083015260ff60608201511660608301525050565b600060208284031215614cc457600080fd5b8151611649816144c8565b63ffffffff818116838216019080821115614c4757614c47614ad8565b6001600160801b03818116838216019080821115614c4757614c47614ad8565b82815260a08101611649602083018480548252600101546001600160801b0381166020830152608081901c63ffffffff16604083015260a01c60ff16606090910152565b60208152600061164960208301846145a5565b600060018201614d7557614d75614ad8565b5060010190565b60006001600160a01b03808816835280871660208401525084604083015260806060830152826080830152828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b600060208284031215614de257600080fd5b8151611649816140b6565b600060208284031215614dff57600080fd5b815167ffffffffffffffff811115614e1657600080fd5b8201601f81018413614e2757600080fd5b8051614e3561444d826143d5565b818152856020838501011115614e4a57600080fd5b614e5b826020830160208601614102565b95945050505050565b606081526000614e7760608301866145a5565b602083820381850152614e8a8287614126565b8481036040860152855180825282870193509082019060005b81811015614ebf57845183529383019391830191600101614ea3565b50909897505050505050505056fea26469706673582212201b04b511c5626fcd22953ba534ee7e24a01bb31b8c714bae08eb7eacd16df90b64736f6c63430008100033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000a775b9cd6335c028693e7b0b3b6f76fc90aea8ce00000000000000000000000060167eace2d0a650313c22df7e613043f571e0d30000000000000000000000008ad3668b088bf7abee6488da8f6570e8c3586c22000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
-----Decoded View---------------
Arg [0] : _lpToken (address): 0xA775B9Cd6335C028693e7b0b3b6f76fC90aea8Ce
Arg [1] : _callOptionToken (address): 0x60167eAcE2D0A650313C22dF7E613043F571e0d3
Arg [2] : _putty (address): 0x8Ad3668B088Bf7abEE6488Da8F6570e8c3586c22
Arg [3] : _weth (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000a775b9cd6335c028693e7b0b3b6f76fc90aea8ce
Arg [1] : 00000000000000000000000060167eace2d0a650313c22df7e613043f571e0d3
Arg [2] : 0000000000000000000000008ad3668b088bf7abee6488da8f6570e8c3586c22
Arg [3] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.