ETH Price: $2,734.86 (+0.89%)

Token

Wheyfus anonymous :3 (UwU)
 

Overview

Max Total Supply

9,023 UwU

Holders

776

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
10 UwU
0xc810ae5eed622f817dd581010d44c589f5b0af65
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# 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
File 1 of 50 : Wheyfu.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma 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.
*
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 2 of 50 : Math.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 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 infinity
Up, // Toward infinity
Zero // Toward zero
}
/**
* @dev Returns the largest of two numbers.
*/
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return a >= b ? a : b;
}
/**
* @dev Returns the smallest of two numbers.
*/
function min(uint256 a, uint256 b) internal pure returns (uint256) {
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 3 of 50 : IERC721.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 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);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 4 of 50 : IERC721Enumerable.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 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.
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 5 of 50 : ERC721.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: AGPL-3.0-only
pragma 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);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 6 of 50 : ERC721A.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.2.2
// Creator: Chiru Labs
pragma 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.
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 7 of 50 : Owned.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: AGPL-3.0-only
pragma 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
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 8 of 50 : LSSVMPairMissingEnumerableETH.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// SPDX-License-Identifier: AGPL-3.0
pragma solidity ^0.8.0;
import {LSSVMPairETH} from "./LSSVMPairETH.sol";
import {LSSVMPairMissingEnumerable} from "./LSSVMPairMissingEnumerable.sol";
import {ILSSVMPairFactoryLike} from "./ILSSVMPairFactoryLike.sol";
contract LSSVMPairMissingEnumerableETH is
LSSVMPairMissingEnumerable,
LSSVMPairETH
{
function pairVariant()
public
pure
override
returns (ILSSVMPairFactoryLike.PairVariant)
{
return ILSSVMPairFactoryLike.PairVariant.MISSING_ENUMERABLE_ETH;
}
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 9 of 50 : PuttyV2.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity 0.8.16;
/**
██████╗ ██╗ ██╗████████╗████████╗██╗ ██╗ ██╗ ██╗██████╗
██╔══██╗██║ ██║╚══██╔══╝╚══██╔══╝╚██╗ ██╔╝ ██║ ██║╚════██╗
██████╔╝██║ ██║ ██║ ██║ ╚████╔╝ ██║ ██║ █████╔╝
██╔═══╝ ██║ ██║ ██║ ██║ ╚██╔╝ ╚██╗ ██╔╝██╔═══╝
██║ ╚██████╔╝ ██║ ██║ ██║ ╚████╔╝ ███████╗
╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ╚═══╝ ╚══════╝
_..._
.' '. _
/ .-""-\ _/ \
.-| /:. | | | bussin
| \ |:. /.-'-./
| .-'-;:__.' =/
.'= *=| _.='
/ _. | ; minister you satoshi
;-.-'| \ |
/ | \ _\ _\
\__/'._;. ==' ==\
\ \ |
/ / /
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 10 of 50 : SafeTransferLib.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: AGPL-3.0-only
pragma 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");
}
/*//////////////////////////////////////////////////////////////
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 11 of 50 : MintBurnToken.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma 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);
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 12 of 50 : OptionBonding.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma 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
*/
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 13 of 50 : FeeBonding.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma 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 {
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 14 of 50 : IERC165.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// 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);
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 15 of 50 : IERC721A.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.2.2
// Creator: Chiru Labs
pragma 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();
/**
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 16 of 50 : LSSVMPairETH.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: AGPL-3.0
pragma 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 LSSVMPair
function _pullTokenInputAndPayProtocolFee(
uint256 inputAmount,
bool, /*isRouter*/
address, /*routerCaller*/
ILSSVMPairFactoryLike _factory,
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 17 of 50 : LSSVMPairMissingEnumerable.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: AGPL-3.0
pragma 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 tracking
EnumerableSet.UintSet private idSet;
/// @inheritdoc LSSVMPair
function _sendAnyNFTsToRecipient(
IERC721 _nft,
address nftRecipient,
uint256 numNFTs
) internal override {
// Send NFTs to recipient
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 18 of 50 : ILSSVMPairFactoryLike.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: AGPL-3.0
pragma 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)
external
view
returns (bool allowed, bool wasEverAllowed);
function isPair(address potentialPair, PairVariant variant)
external
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 19 of 50 : IWETH.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// SPDX-License-Identifier: MIT
pragma 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);
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 20 of 50 : SignatureChecker.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 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,
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 21 of 50 : draft-EIP712.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 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._
*/
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 22 of 50 : Strings.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 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.sol
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 23 of 50 : ERC165Checker.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 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 0xffffffff
bytes4 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_Invalid
return
_supportsERC165Interface(account, type(IERC165).interfaceId) &&
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 24 of 50 : Ownable.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 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.
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 25 of 50 : PuttyV2Nft.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity 0.8.16;
import "solmate/tokens/ERC721.sol";
// removes balanceOf modifications
// questionable tradeoff but given our use-case it's reasonable
abstract contract PuttyV2Nft is ERC721("Putty", "OPUT") {
// remove balanceOf modifications
function _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 modifications
function transferFrom(
address from,
address to,
uint256 id
) public override {
require(from == _ownerOf[id], "WRONG_FROM");
require(to != address(0), "INVALID_RECIPIENT");
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 26 of 50 : PuttyV2Handler.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma 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 {}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 27 of 50 : ERC20.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: AGPL-3.0-only
pragma 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;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 28 of 50 : IERC20.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 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.
*/
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 29 of 50 : IERC1271.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 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);
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 30 of 50 : BondingNft.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma 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;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 31 of 50 : LSSVMPair.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: AGPL-3.0
pragma 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 TOKEN
abstract contract LSSVMPair is
OwnableWithTransferCallback,
ReentrancyGuard,
ERC1155Holder
{
enum PoolType {
TOKEN,
NFT,
TRADE
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 32 of 50 : ICurve.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// SPDX-License-Identifier: AGPL-3.0
pragma solidity ^0.8.0;
import {CurveErrorCodes} from "./CurveErrorCodes.sol";
interface ICurve {
/**
@notice Validates if a delta value is valid for the curve. The criteria for
validity can be different for each type of curve, for instance ExponentialCurve
requires 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 the
            pool, 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)
external
view
returns (bool valid);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 33 of 50 : EnumerableSet.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 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;
* }
* ```
*
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 34 of 50 : LSSVMRouter.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: AGPL-3.0
pragma 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;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 35 of 50 : ECDSA.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 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) {
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 36 of 50 : Address.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 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
* ====
*
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 37 of 50 : IERC1271.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 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);
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 38 of 50 : IERC165.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// 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);
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 39 of 50 : Context.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 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;
}
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 40 of 50 : IERC1155.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 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,
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 41 of 50 : OwnableWithTransferCallback.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: AGPL-3.0
pragma 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;
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 42 of 50 : ReentrancyGuard.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 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 Ownable
pragma solidity ^0.8.0;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 43 of 50 : CurveErrorCodes.sol
1
2
3
4
5
6
7
8
9
10
// SPDX-License-Identifier: AGPL-3.0
pragma solidity ^0.8.0;
contract CurveErrorCodes {
enum Error {
OK, // No error
INVALID_NUMITEMS, // The numItem value is 0
SPOT_PRICE_OVERFLOW // The updated spot price doesn't fit into 128 bits
}
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 44 of 50 : ERC1155Holder.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 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;
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 45 of 50 : ERC165Checker.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 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 0xffffffff
bytes4 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_Invalid
return
supportsERC165InterfaceUnchecked(account, type(IERC165).interfaceId) &&
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 46 of 50 : IOwnershipTransferCallback.sol
1
2
3
4
5
6
7
// SPDX-License-Identifier: AGPL-3.0
pragma solidity ^0.8.4;
interface IOwnershipTransferCallback {
function onOwnershipTransfer(address oldOwner) external;
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 47 of 50 : Address.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 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
* ====
*
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 48 of 50 : ERC1155Receiver.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 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);
}
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 49 of 50 : IERC1155Receiver.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 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
*/
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 50 of 50 : ERC165.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 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) {
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Settings
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
{
"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": {
"*": {
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Contract Security Audit

Contract ABI

[{"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"}]

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.