false
false
0

Contract Address Details

0x3d51749Cb2Db7355392100BAc202216BE7071E66

Contract Name
LSSVMRouter
Creator
0x94a47b–b522b5 at 0x5b4ed1–dd9dc3
Balance
0 EOS
Tokens
Fetching tokens...
Transactions
9,634 Transactions
Transfers
0 Transfers
Gas Used
2,357,588,293
Last Balance Update
61719068
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
LSSVMRouter




Optimization enabled
true
Compiler version
v0.8.13+commit.abaa5c0e




Optimization runs
200
EVM Version
default




Verified at
2024-01-31T11:40:27.253673Z

Constructor Arguments

0x000000000000000000000000353f4106641db62384cf0e4f1ef15f8ac9a9fb4b

Arg [0] (address) : 0x353f4106641db62384cf0e4f1ef15f8ac9a9fb4b

              

contracts/v2/LSSVMRouter.sol

Sol2uml
new
// SPDX-License-Identifier: AGPL-3.0
pragma solidity ^0.8.0;
import {IERC721} from "@openzeppelin/contracts/token/ERC721/IERC721.sol";
import {IERC1155} from "@openzeppelin/contracts/token/ERC1155/IERC1155.sol";
import {ERC20} from "@rari-capital/solmate/src/tokens/ERC20.sol";
import {SafeTransferLib} from "@rari-capital/solmate/src/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;
uint256[] nftCounts;
}
struct RobustPairSwapAny {
PairSwapAny swapInfo;
uint256 maxCost;
}
struct RobustPairSwapSpecific {
PairSwapSpecific swapInfo;
uint256 maxCost;
}
struct RobustPairSwapSpecificForToken {
PairSwapSpecific swapInfo;
uint256 minOutput;
}
 
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/token/ERC1155/IERC1155.sol

// 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,
address indexed to,
uint256[] ids,
uint256[] values
);
/**
* @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
* `approved`.
*/
event ApprovalForAll(address indexed account, address indexed operator, bool approved);
/**
* @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
*
* If an {URI} event was emitted for `id`, the standard
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol

// 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
*/
function onERC1155Received(
address operator,
address from,
uint256 id,
uint256 value,
bytes calldata data
) external returns (bytes4);
/**
* @dev Handles the receipt of a multiple ERC1155 token types. This function
* is called at the end of a `safeBatchTransferFrom` after the balances have
* been updated.
*
* NOTE: To accept the transfer(s), this must return
* `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/token/ERC1155/utils/ERC1155Holder.sol

// 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;
}
function onERC1155BatchReceived(
address,
address,
uint256[] memory,
uint256[] memory,
bytes memory
) public virtual override returns (bytes4) {
return this.onERC1155BatchReceived.selector;
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/token/ERC1155/utils/ERC1155Receiver.sol

// 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);
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/token/ERC721/IERC721.sol

// 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);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/utils/Address.sol

// 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
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
 
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/utils/introspection/ERC165.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
pragma solidity ^0.8.0;
import "./IERC165.sol";
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/utils/introspection/ERC165Checker.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.2) (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) &&
!_supportsERC165Interface(account, _INTERFACE_ID_INVALID);
}
/**
* @dev Returns true if `account` supports the interface defined by
* `interfaceId`. Support for {IERC165} itself is queried automatically.
*
* See {IERC165-supportsInterface}.
*/
function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {
// query support of both ERC165 as per the spec and support of _interfaceId
return supportsERC165(account) && _supportsERC165Interface(account, interfaceId);
}
/**
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/utils/introspection/IERC165.sol

// 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);
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@rari-capital/solmate/src/tokens/ERC20.sol

// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;
/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.
/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)
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;
/*///////////////////////////////////////////////////////////////
ERC20 STORAGE
//////////////////////////////////////////////////////////////*/
uint256 public totalSupply;
mapping(address => uint256) public balanceOf;
mapping(address => mapping(address => uint256)) public allowance;
/*///////////////////////////////////////////////////////////////
EIP-2612 STORAGE
//////////////////////////////////////////////////////////////*/
bytes32 public constant PERMIT_TYPEHASH =
keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@rari-capital/solmate/src/utils/SafeTransferLib.sol

// 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 Modified from Gnosis (https://github.com/gnosis/gp-v2-contracts/blob/main/src/contracts/libraries/GPv2SafeERC20.sol)
/// @dev Use with caution! Some functions in this library knowingly create dirty bits at the destination of the free memory pointer.
library SafeTransferLib {
/*///////////////////////////////////////////////////////////////
ETH OPERATIONS
//////////////////////////////////////////////////////////////*/
function safeTransferETH(address to, uint256 amount) internal {
bool callStatus;
assembly {
// Transfer the ETH and store if it succeeded or not.
callStatus := call(gas(), to, amount, 0, 0, 0, 0)
}
require(callStatus, "ETH_TRANSFER_FAILED");
}
/*///////////////////////////////////////////////////////////////
ERC20 OPERATIONS
//////////////////////////////////////////////////////////////*/
function safeTransferFrom(
ERC20 token,
address from,
address to,
uint256 amount
) internal {
bool callStatus;
assembly {
// Get a pointer to some free memory.
let freeMemoryPointer := mload(0x40)
// Write the abi-encoded calldata to memory piece by piece:
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

contracts/v2/ILSSVMPairFactoryLike.sol

// SPDX-License-Identifier: AGPL-3.0
pragma solidity ^0.8.0;
import {LSSVMRouter} from "./LSSVMRouter.sol";
// TODO
interface ILSSVMPairFactoryLike {
enum PairVariant {
ENUMERABLE_ETH,
MISSING_ENUMERABLE_ETH,
ENUMERABLE_ERC20,
MISSING_ENUMERABLE_ERC20,
MISSING_ENUMERABLE_1155_ETH,
MISSING_ENUMERABLE_1155_ERC20
}
function protocolFeeMultiplier() external view returns (uint256);
function protocolFeeRecipient() external view returns (address payable);
function callAllowed(address target) external view returns (bool);
function operatorProtocolFeeRecipients(address nft,address operator) external view returns (address);
function operatorProtocolFeeMultipliers(address nft,address operator) external view returns (uint256);
function getNftOperators(address nft) external view returns (address[] memory);
function routerStatus(LSSVMRouter router)
external
view
returns (bool allowed, bool wasEverAllowed);
function isPair(address potentialPair, PairVariant variant)
external
view
returns (bool);
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

contracts/v2/LSSVMPair.sol

// SPDX-License-Identifier: AGPL-3.0
pragma solidity ^0.8.0;
import {ERC20} from "@rari-capital/solmate/src/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
}
// 90%, must <= 1 - MAX_PROTOCOL_FEE (set in LSSVMPairFactory)
uint256 internal constant MAX_FEE = 0.50e18;
// The current price of the NFT
// @dev This is generally used to mean the immediate sell price for the next marginal NFT.
// However, this should NOT be assumed, as future bonding curves may use spotPrice in different ways.
// Use getBuyNFTQuote and getSellNFTQuote for accurate pricing info.
uint128 public spotPrice;
// The parameter for the pair's bonding curve.
// Units and meaning are bonding curve dependent.
uint128 public delta;
 
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

contracts/v2/bonding-curves/CurveErrorCodes.sol

// 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
}
/**
* @return totalProtocolFeeMultiplier totalProtocol fee multiplier
* @return totalProtocolFeeAmount total protocol fee amount
* @return protocolFeeAmount protocol fee amount
* @return protocolFeeReceiver protocol fee receiver
*/
struct ProtocolFeeStruct {
uint totalProtocolFeeMultiplier;
uint totalProtocolFeeAmount;
uint[] protocolFeeAmount;
address[] protocolFeeReceiver;
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

contracts/v2/bonding-curves/ICurve.sol

// 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);
/**
@notice Given the current state of the pair and the trade, computes how much the user
should pay to purchase an NFT from the pair, the new spot price, and other values.
@param spotPrice The current selling spot price of the pair, in tokens
@param delta The delta parameter of the pair, what it means depends on the curve
@param numItems The number of NFTs the user is buying from the pair
@param feeMultiplier Determines how much fee the LP takes from this trade, 18 decimals
@param protocolFeeMultipliers protocol fee multipliers
@return error Any math calculation errors, only Error.OK means the returned values are valid
@return newSpotPrice The updated selling spot price, in tokens
@return newDelta The updated delta, used to parameterize the bonding curve
@return inputValue The amount that the user should pay, in tokens
@return protocolFeeStruct protocol fee struct
*/
function getBuyInfo(
 
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

contracts/v2/lib/IOwnershipTransferCallback.sol

// SPDX-License-Identifier: AGPL-3.0
pragma solidity ^0.8.4;
interface IOwnershipTransferCallback {
function onOwnershipTransfer(address oldOwner) external;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

contracts/v2/lib/OwnableWithTransferCallback.sol

// 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;
}
/// @dev Returns the address of the current owner.
function owner() public view virtual returns (address) {
return _owner;
}
/// @dev Throws if called by any account other than the owner.
modifier onlyOwner() {
if (owner() != msg.sender) revert Ownable_NotOwner();
_;
}
/// @dev Transfers ownership of the contract to a new account (`newOwner`).
/// Disallows setting to the zero address as a way to more gas-efficiently avoid reinitialization
/// When ownership is transferred, if the new owner implements IOwnershipTransferCallback, we make a callback
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

contracts/v2/lib/ReentrancyGuard.sol

// 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
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
function __ReentrancyGuard_init() internal {
_status = _NOT_ENTERED;
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Compiler Settings

{"outputSelection":{"*":{"*":["*"],"":["*"]}},"optimizer":{"runs":200,"enabled":true,"details":{"yul":false}},"libraries":{}}
              

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_factory","internalType":"contract ILSSVMPairFactoryLike"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract ILSSVMPairFactoryLike"}],"name":"factory","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"pairTransfer1155NFTFrom","inputs":[{"type":"address","name":"nft","internalType":"contract IERC1155"},{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"id","internalType":"uint256"},{"type":"uint256","name":"count","internalType":"uint256"},{"type":"uint8","name":"variant","internalType":"enum ILSSVMPairFactoryLike.PairVariant"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"pairTransferERC20From","inputs":[{"type":"address","name":"token","internalType":"contract ERC20"},{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"uint8","name":"variant","internalType":"enum ILSSVMPairFactoryLike.PairVariant"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"pairTransferNFTFrom","inputs":[{"type":"address","name":"nft","internalType":"contract IERC721"},{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"id","internalType":"uint256"},{"type":"uint8","name":"variant","internalType":"enum ILSSVMPairFactoryLike.PairVariant"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"remainingValue","internalType":"uint256"}],"name":"robustSwapERC20ForAnyNFTs","inputs":[{"type":"tuple[]","name":"swapList","internalType":"struct LSSVMRouter.RobustPairSwapAny[]","components":[{"type":"tuple","name":"swapInfo","internalType":"struct LSSVMRouter.PairSwapAny","components":[{"type":"address","name":"pair","internalType":"contract LSSVMPair"},{"type":"uint256","name":"numItems","internalType":"uint256"}]},{"type":"uint256","name":"maxCost","internalType":"uint256"}]},{"type":"uint256","name":"inputAmount","internalType":"uint256"},{"type":"address","name":"nftRecipient","internalType":"address"},{"type":"uint256","name":"deadline","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"remainingValue","internalType":"uint256"}],"name":"robustSwapERC20ForSpecificNFTs","inputs":[{"type":"tuple[]","name":"swapList","internalType":"struct LSSVMRouter.RobustPairSwapSpecific[]","components":[{"type":"tuple","name":"swapInfo","internalType":"struct LSSVMRouter.PairSwapSpecific","components":[{"type":"address","name":"pair","internalType":"contract LSSVMPair"},{"type":"uint256[]","name":"nftIds","internalType":"uint256[]"},{"type":"uint256[]","name":"nftCounts","internalType":"uint256[]"}]},{"type":"uint256","name":"maxCost","internalType":"uint256"}]},{"type":"uint256","name":"inputAmount","internalType":"uint256"},{"type":"address","name":"nftRecipient","internalType":"address"},{"type":"uint256","name":"deadline","internalType":"uint256"}]},{"type":"function","stateMutability":"payable","outputs":[{"type":"uint256","name":"remainingValue","internalType":"uint256"},{"type":"uint256","name":"outputAmount","internalType":"uint256"}],"name":"robustSwapERC20ForSpecificNFTsAndNFTsToToken","inputs":[{"type":"tuple","name":"params","internalType":"struct LSSVMRouter.RobustPairNFTsFoTokenAndTokenforNFTsTrade","components":[{"type":"tuple[]","name":"tokenToNFTTrades","internalType":"struct LSSVMRouter.RobustPairSwapSpecific[]","components":[{"type":"tuple","name":"swapInfo","internalType":"struct LSSVMRouter.PairSwapSpecific","components":[{"type":"address","name":"pair","internalType":"contract LSSVMPair"},{"type":"uint256[]","name":"nftIds","internalType":"uint256[]"},{"type":"uint256[]","name":"nftCounts","internalType":"uint256[]"}]},{"type":"uint256","name":"maxCost","internalType":"uint256"}]},{"type":"tuple[]","name":"nftToTokenTrades","internalType":"struct LSSVMRouter.RobustPairSwapSpecificForToken[]","components":[{"type":"tuple","name":"swapInfo","internalType":"struct LSSVMRouter.PairSwapSpecific","components":[{"type":"address","name":"pair","internalType":"contract LSSVMPair"},{"type":"uint256[]","name":"nftIds","internalType":"uint256[]"},{"type":"uint256[]","name":"nftCounts","internalType":"uint256[]"}]},{"type":"uint256","name":"minOutput","internalType":"uint256"}]},{"type":"uint256","name":"inputAmount","internalType":"uint256"},{"type":"address","name":"tokenRecipient","internalType":"address payable"},{"type":"address","name":"nftRecipient","internalType":"address"}]}]},{"type":"function","stateMutability":"payable","outputs":[{"type":"uint256","name":"remainingValue","internalType":"uint256"}],"name":"robustSwapETHForAnyNFTs","inputs":[{"type":"tuple[]","name":"swapList","internalType":"struct LSSVMRouter.RobustPairSwapAny[]","components":[{"type":"tuple","name":"swapInfo","internalType":"struct LSSVMRouter.PairSwapAny","components":[{"type":"address","name":"pair","internalType":"contract LSSVMPair"},{"type":"uint256","name":"numItems","internalType":"uint256"}]},{"type":"uint256","name":"maxCost","internalType":"uint256"}]},{"type":"address","name":"ethRecipient","internalType":"address payable"},{"type":"address","name":"nftRecipient","internalType":"address"},{"type":"uint256","name":"deadline","internalType":"uint256"}]},{"type":"function","stateMutability":"payable","outputs":[{"type":"uint256","name":"remainingValue","internalType":"uint256"}],"name":"robustSwapETHForSpecificNFTs","inputs":[{"type":"tuple[]","name":"swapList","internalType":"struct LSSVMRouter.RobustPairSwapSpecific[]","components":[{"type":"tuple","name":"swapInfo","internalType":"struct LSSVMRouter.PairSwapSpecific","components":[{"type":"address","name":"pair","internalType":"contract LSSVMPair"},{"type":"uint256[]","name":"nftIds","internalType":"uint256[]"},{"type":"uint256[]","name":"nftCounts","internalType":"uint256[]"}]},{"type":"uint256","name":"maxCost","internalType":"uint256"}]},{"type":"address","name":"ethRecipient","internalType":"address payable"},{"type":"address","name":"nftRecipient","internalType":"address"},{"type":"uint256","name":"deadline","internalType":"uint256"}]},{"type":"function","stateMutability":"payable","outputs":[{"type":"uint256","name":"remainingValue","internalType":"uint256"},{"type":"uint256","name":"outputAmount","internalType":"uint256"}],"name":"robustSwapETHForSpecificNFTsAndNFTsToToken","inputs":[{"type":"tuple","name":"params","internalType":"struct LSSVMRouter.RobustPairNFTsFoTokenAndTokenforNFTsTrade","components":[{"type":"tuple[]","name":"tokenToNFTTrades","internalType":"struct LSSVMRouter.RobustPairSwapSpecific[]","components":[{"type":"tuple","name":"swapInfo","internalType":"struct LSSVMRouter.PairSwapSpecific","components":[{"type":"address","name":"pair","internalType":"contract LSSVMPair"},{"type":"uint256[]","name":"nftIds","internalType":"uint256[]"},{"type":"uint256[]","name":"nftCounts","internalType":"uint256[]"}]},{"type":"uint256","name":"maxCost","internalType":"uint256"}]},{"type":"tuple[]","name":"nftToTokenTrades","internalType":"struct LSSVMRouter.RobustPairSwapSpecificForToken[]","components":[{"type":"tuple","name":"swapInfo","internalType":"struct LSSVMRouter.PairSwapSpecific","components":[{"type":"address","name":"pair","internalType":"contract LSSVMPair"},{"type":"uint256[]","name":"nftIds","internalType":"uint256[]"},{"type":"uint256[]","name":"nftCounts","internalType":"uint256[]"}]},{"type":"uint256","name":"minOutput","internalType":"uint256"}]},{"type":"uint256","name":"inputAmount","internalType":"uint256"},{"type":"address","name":"tokenRecipient","internalType":"address payable"},{"type":"address","name":"nftRecipient","internalType":"address"}]}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"outputAmount","internalType":"uint256"}],"name":"robustSwapNFTsForToken","inputs":[{"type":"tuple[]","name":"swapList","internalType":"struct LSSVMRouter.RobustPairSwapSpecificForToken[]","components":[{"type":"tuple","name":"swapInfo","internalType":"struct LSSVMRouter.PairSwapSpecific","components":[{"type":"address","name":"pair","internalType":"contract LSSVMPair"},{"type":"uint256[]","name":"nftIds","internalType":"uint256[]"},{"type":"uint256[]","name":"nftCounts","internalType":"uint256[]"}]},{"type":"uint256","name":"minOutput","internalType":"uint256"}]},{"type":"address","name":"tokenRecipient","internalType":"address payable"},{"type":"uint256","name":"deadline","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"remainingValue","internalType":"uint256"}],"name":"swapERC20ForAnyNFTs","inputs":[{"type":"tuple[]","name":"swapList","internalType":"struct LSSVMRouter.PairSwapAny[]","components":[{"type":"address","name":"pair","internalType":"contract LSSVMPair"},{"type":"uint256","name":"numItems","internalType":"uint256"}]},{"type":"uint256","name":"inputAmount","internalType":"uint256"},{"type":"address","name":"nftRecipient","internalType":"address"},{"type":"uint256","name":"deadline","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"remainingValue","internalType":"uint256"}],"name":"swapERC20ForSpecificNFTs","inputs":[{"type":"tuple[]","name":"swapList","internalType":"struct LSSVMRouter.PairSwapSpecific[]","components":[{"type":"address","name":"pair","internalType":"contract LSSVMPair"},{"type":"uint256[]","name":"nftIds","internalType":"uint256[]"},{"type":"uint256[]","name":"nftCounts","internalType":"uint256[]"}]},{"type":"uint256","name":"inputAmount","internalType":"uint256"},{"type":"address","name":"nftRecipient","internalType":"address"},{"type":"uint256","name":"deadline","internalType":"uint256"}]},{"type":"function","stateMutability":"payable","outputs":[{"type":"uint256","name":"remainingValue","internalType":"uint256"}],"name":"swapETHForAnyNFTs","inputs":[{"type":"tuple[]","name":"swapList","internalType":"struct LSSVMRouter.PairSwapAny[]","components":[{"type":"address","name":"pair","internalType":"contract LSSVMPair"},{"type":"uint256","name":"numItems","internalType":"uint256"}]},{"type":"address","name":"ethRecipient","internalType":"address payable"},{"type":"address","name":"nftRecipient","internalType":"address"},{"type":"uint256","name":"deadline","internalType":"uint256"}]},{"type":"function","stateMutability":"payable","outputs":[{"type":"uint256","name":"remainingValue","internalType":"uint256"}],"name":"swapETHForSpecificNFTs","inputs":[{"type":"tuple[]","name":"swapList","internalType":"struct LSSVMRouter.PairSwapSpecific[]","components":[{"type":"address","name":"pair","internalType":"contract LSSVMPair"},{"type":"uint256[]","name":"nftIds","internalType":"uint256[]"},{"type":"uint256[]","name":"nftCounts","internalType":"uint256[]"}]},{"type":"address","name":"ethRecipient","internalType":"address payable"},{"type":"address","name":"nftRecipient","internalType":"address"},{"type":"uint256","name":"deadline","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"outputAmount","internalType":"uint256"}],"name":"swapNFTsForAnyNFTsThroughERC20","inputs":[{"type":"tuple","name":"trade","internalType":"struct LSSVMRouter.NFTsForAnyNFTsTrade","components":[{"type":"tuple[]","name":"nftToTokenTrades","internalType":"struct LSSVMRouter.PairSwapSpecific[]","components":[{"type":"address","name":"pair","internalType":"contract LSSVMPair"},{"type":"uint256[]","name":"nftIds","internalType":"uint256[]"},{"type":"uint256[]","name":"nftCounts","internalType":"uint256[]"}]},{"type":"tuple[]","name":"tokenToNFTTrades","internalType":"struct LSSVMRouter.PairSwapAny[]","components":[{"type":"address","name":"pair","internalType":"contract LSSVMPair"},{"type":"uint256","name":"numItems","internalType":"uint256"}]}]},{"type":"uint256","name":"inputAmount","internalType":"uint256"},{"type":"uint256","name":"minOutput","internalType":"uint256"},{"type":"address","name":"nftRecipient","internalType":"address"},{"type":"uint256","name":"deadline","internalType":"uint256"}]},{"type":"function","stateMutability":"payable","outputs":[{"type":"uint256","name":"outputAmount","internalType":"uint256"}],"name":"swapNFTsForAnyNFTsThroughETH","inputs":[{"type":"tuple","name":"trade","internalType":"struct LSSVMRouter.NFTsForAnyNFTsTrade","components":[{"type":"tuple[]","name":"nftToTokenTrades","internalType":"struct LSSVMRouter.PairSwapSpecific[]","components":[{"type":"address","name":"pair","internalType":"contract LSSVMPair"},{"type":"uint256[]","name":"nftIds","internalType":"uint256[]"},{"type":"uint256[]","name":"nftCounts","internalType":"uint256[]"}]},{"type":"tuple[]","name":"tokenToNFTTrades","internalType":"struct LSSVMRouter.PairSwapAny[]","components":[{"type":"address","name":"pair","internalType":"contract LSSVMPair"},{"type":"uint256","name":"numItems","internalType":"uint256"}]}]},{"type":"uint256","name":"minOutput","internalType":"uint256"},{"type":"address","name":"ethRecipient","internalType":"address payable"},{"type":"address","name":"nftRecipient","internalType":"address"},{"type":"uint256","name":"deadline","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"outputAmount","internalType":"uint256"}],"name":"swapNFTsForSpecificNFTsThroughERC20","inputs":[{"type":"tuple","name":"trade","internalType":"struct LSSVMRouter.NFTsForSpecificNFTsTrade","components":[{"type":"tuple[]","name":"nftToTokenTrades","internalType":"struct LSSVMRouter.PairSwapSpecific[]","components":[{"type":"address","name":"pair","internalType":"contract LSSVMPair"},{"type":"uint256[]","name":"nftIds","internalType":"uint256[]"},{"type":"uint256[]","name":"nftCounts","internalType":"uint256[]"}]},{"type":"tuple[]","name":"tokenToNFTTrades","internalType":"struct LSSVMRouter.PairSwapSpecific[]","components":[{"type":"address","name":"pair","internalType":"contract LSSVMPair"},{"type":"uint256[]","name":"nftIds","internalType":"uint256[]"},{"type":"uint256[]","name":"nftCounts","internalType":"uint256[]"}]}]},{"type":"uint256","name":"inputAmount","internalType":"uint256"},{"type":"uint256","name":"minOutput","internalType":"uint256"},{"type":"address","name":"nftRecipient","internalType":"address"},{"type":"uint256","name":"deadline","internalType":"uint256"}]},{"type":"function","stateMutability":"payable","outputs":[{"type":"uint256","name":"outputAmount","internalType":"uint256"}],"name":"swapNFTsForSpecificNFTsThroughETH","inputs":[{"type":"tuple","name":"trade","internalType":"struct LSSVMRouter.NFTsForSpecificNFTsTrade","components":[{"type":"tuple[]","name":"nftToTokenTrades","internalType":"struct LSSVMRouter.PairSwapSpecific[]","components":[{"type":"address","name":"pair","internalType":"contract LSSVMPair"},{"type":"uint256[]","name":"nftIds","internalType":"uint256[]"},{"type":"uint256[]","name":"nftCounts","internalType":"uint256[]"}]},{"type":"tuple[]","name":"tokenToNFTTrades","internalType":"struct LSSVMRouter.PairSwapSpecific[]","components":[{"type":"address","name":"pair","internalType":"contract LSSVMPair"},{"type":"uint256[]","name":"nftIds","internalType":"uint256[]"},{"type":"uint256[]","name":"nftCounts","internalType":"uint256[]"}]}]},{"type":"uint256","name":"minOutput","internalType":"uint256"},{"type":"address","name":"ethRecipient","internalType":"address payable"},{"type":"address","name":"nftRecipient","internalType":"address"},{"type":"uint256","name":"deadline","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"outputAmount","internalType":"uint256"}],"name":"swapNFTsForToken","inputs":[{"type":"tuple[]","name":"swapList","internalType":"struct LSSVMRouter.PairSwapSpecific[]","components":[{"type":"address","name":"pair","internalType":"contract LSSVMPair"},{"type":"uint256[]","name":"nftIds","internalType":"uint256[]"},{"type":"uint256[]","name":"nftCounts","internalType":"uint256[]"}]},{"type":"uint256","name":"minOutput","internalType":"uint256"},{"type":"address","name":"tokenRecipient","internalType":"address"},{"type":"uint256","name":"deadline","internalType":"uint256"}]},{"type":"receive","stateMutability":"payable"}]
              

Contract Creation Code

0x60a06040523480156200001157600080fd5b50604051620038e8380380620038e883398101604081905262000034916200008d565b6001600160a01b0316608052620000ba565b60006001600160a01b0382165b92915050565b6000620000538262000046565b620000718162000059565b81146200007d57600080fd5b50565b8051620000538162000066565b600060208284031215620000a457620000a4600080fd5b6000620000b2848462000080565b949350505050565b6080516137fd620000eb600039600081816102d9015281816108f401528181610ff70152611e9501526137fd6000f3fe6080604052600436106101235760003560e01c8063ad134450116100a0578063c5cf570411610064578063c5cf570414610308578063c8d43d6114610328578063db42312a14610348578063db714ef81461035b578063fa68cdf21461036e57600080fd5b8063ad13445014610261578063b93d4e5c14610281578063c0bafec814610294578063c2e20c97146102a7578063c45a0155146102c757600080fd5b8063582eaaee116100e7578063582eaaee146101cd578063748ff339146101ee57806384b4f2ab1461020e57806386c8278f14610221578063917e43831461024157600080fd5b80630bd568ea1461012f57806318bcc8fd146101585780632f9b9d4e146101785780634b456d0c1461018b57806355184c2d146101ad57600080fd5b3661012a57005b600080fd5b61014261013d366004612980565b61038e565b60405161014f9190612a0a565b60405180910390f35b34801561016457600080fd5b50610142610173366004612a33565b610660565b610142610186366004612b01565b6106c5565b34801561019757600080fd5b506101ab6101a6366004612b78565b6108dd565b005b3480156101b957600080fd5b506101426101c8366004612be3565b610a16565b6101e06101db366004612c4b565b610a2e565b60405161014f929190612c8d565b3480156101fa57600080fd5b506101ab610209366004612b78565b610fe0565b6101e061021c366004612c4b565b6110f4565b34801561022d57600080fd5b5061014261023c366004612be3565b6116a5565b34801561024d57600080fd5b5061014261025c366004612be3565b61192f565b34801561026d57600080fd5b5061014261027c366004612cf9565b611947565b61014261028f366004612d39565b61195f565b6101426102a2366004612d39565b6119b0565b3480156102b357600080fd5b506101426102c2366004612d9b565b6119f9565b3480156102d357600080fd5b506102fb7f000000000000000000000000000000000000000000000000000000000000000081565b60405161014f9190612e4b565b34801561031457600080fd5b50610142610323366004612e59565b611c8e565b34801561033457600080fd5b506101ab610343366004612e99565b611e7e565b610142610356366004612f23565b611f95565b610142610369366004612980565b611fae565b34801561037a57600080fd5b50610142610389366004612a33565b611fc7565b60008161039a8161200f565b34915060008060005b8881101561063a5760006103f18b8b848181106103c2576103c2612f63565b90506020028101906103d49190612f79565b6103de9080612f9d565b6103ec906040810190612fb7565b612032565b90508a8a8381811061040557610405612f63565b90506020028101906104179190612f79565b6104219080612f9d565b61042f906020810190613013565b6001600160a01b031663a5cb2b91826040518263ffffffff1660e01b815260040161045a9190612a0a565b600060405180830381865afa158015610477573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261049f9190810190613282565b5096509194508c91508b9050838181106104bb576104bb612f63565b90506020028101906104cd9190612f79565b6020013584111580156104f1575060008360028111156104ef576104ef613307565b145b15610631578a8a8381811061050857610508612f63565b905060200281019061051a9190612f79565b6105249080612f9d565b610532906020810190613013565b6001600160a01b0316636cfa1d94858d8d8681811061055357610553612f63565b90506020028101906105659190612f79565b61056f9080612f9d565b61057d906020810190612fb7565b8f8f8881811061058f5761058f612f63565b90506020028101906105a19190612f79565b6105ab9080612f9d565b6105b9906040810190612fb7565b8a8f6001336040518a63ffffffff1660e01b81526004016105e1989796959493929190613373565b60206040518083038185885af11580156105ff573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061062491906133dd565b61062e9087613414565b95505b506001016103a3565b508315610654576106546001600160a01b03881685612073565b50505095945050505050565b60008161066c8161200f565b6106816106798880612fb7565b6000336120a3565b915061068d868361342b565b9150846106b06106a060208a018a612fb7565b6106aa8987613414565b886121fe565b6106ba919061342b565b979650505050505050565b6000816106d18161200f565b34915060008087815b818110156108b6578a8a828181106106f4576106f4612f63565b61070a9260206060909202019081019150613013565b6001600160a01b031663a5cb2b918c8c8481811061072a5761072a612f63565b905060600201600001602001356040518263ffffffff1660e01b81526004016107539190612a0a565b600060405180830381865afa158015610770573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526107989190810190613282565b5096509194508c91508b9050828181106107b4576107b4612f63565b9050606002016040013584111580156107de575060008360028111156107dc576107dc613307565b145b156108ae578a8a828181106107f5576107f5612f63565b61080b9260206060909202019081019150613013565b6001600160a01b03166328b8aee1858d8d8581811061082c5761082c612f63565b90506060020160000160200135878c6001336040518763ffffffff1660e01b815260040161085e959493929190613443565b60206040518083038185885af115801561087c573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906108a191906133dd565b6108ab9087613414565b95505b6001016106da565b5084156108d0576108d06001600160a01b03891686612073565b5050505095945050505050565b6040516308f25a8f60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906308f25a8f9061092b90339085906004016134bd565b602060405180830381865afa158015610948573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061096c91906134eb565b6109915760405162461bcd60e51b81526004016109889061352e565b60405180910390fd5b60028160058111156109a5576109a5613307565b14806109c2575060038160058111156109c0576109c0613307565b145b806109de575060058160058111156109dc576109dc613307565b145b6109fa5760405162461bcd60e51b815260040161098890613563565b610a0f6001600160a01b038616858585612338565b5050505050565b600081610a228161200f565b6106ba878787876121fe565b60408101356000808080610a428680612fb7565b9050905060005b81811015610cf2576000610a70610a608980612fb7565b848181106103c2576103c2612f63565b9050610a7c8880612fb7565b83818110610a8c57610a8c612f63565b9050602002810190610a9e9190612f79565b610aa89080612f9d565b610ab6906020810190613013565b6001600160a01b031663a5cb2b91826040518263ffffffff1660e01b8152600401610ae19190612a0a565b600060405180830381865afa158015610afe573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b269190810190613282565b509750919550610b3a915089905080612fb7565b83818110610b4a57610b4a612f63565b9050602002810190610b5c9190612f79565b602001358511158015610b8057506000846002811115610b7e57610b7e613307565b145b15610ce957610b8f8880612fb7565b83818110610b9f57610b9f612f63565b9050602002810190610bb19190612f79565b610bbb9080612f9d565b610bc9906020810190613013565b6001600160a01b0316636cfa1d94610be18a80612fb7565b85818110610bf157610bf1612f63565b9050602002810190610c039190612f79565b610c0d9080612f9d565b610c1b906020810190612fb7565b610c258c80612fb7565b87818110610c3557610c35612f63565b9050602002810190610c479190612f79565b610c519080612f9d565b610c5f906040810190612fb7565b8a8e6080016020810190610c739190613573565b6001336040518963ffffffff1660e01b8152600401610c99989796959493929190613373565b6020604051808303816000875af1158015610cb8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cdc91906133dd565b610ce69088613414565b96505b50600101610a49565b5060009250610d079150506020850185612fb7565b9050905060005b81811015610fd957600080610d36610d268880612fb7565b858181106103c2576103c2612f63565b90506000610d476020890189612fb7565b85818110610d5757610d57612f63565b9050602002810190610d699190612f79565b610d739080612f9d565b610d81906020810190613013565b6001600160a01b0316630c295e56836040518263ffffffff1660e01b8152600401610dac9190612a0a565b600060405180830381865afa158015610dc9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610df19190810190613282565b50955091925060009150610e029050565b816002811115610e1457610e14613307565b14610e2757836001019350505050610d0e565b50610e356020880188612fb7565b84818110610e4557610e45612f63565b9050602002810190610e579190612f79565b602001358210610fcf57610e6e6020880188612fb7565b84818110610e7e57610e7e612f63565b9050602002810190610e909190612f79565b610e9a9080612f9d565b610ea8906020810190613013565b6001600160a01b031663d95db9cd610ec360208a018a612fb7565b86818110610ed357610ed3612f63565b9050602002810190610ee59190612f79565b610eef9080612f9d565b610efd906020810190612fb7565b610f0a60208c018c612fb7565b88818110610f1a57610f1a612f63565b9050602002810190610f2c9190612f79565b610f369080612f9d565b610f44906040810190612fb7565b60008d6060016020810190610f599190613573565b6001336040518963ffffffff1660e01b8152600401610f7f9897969594939291906135a9565b6020604051808303816000875af1158015610f9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc291906133dd565b610fcc908661342b565b94505b5050600101610d0e565b5050915091565b6040516308f25a8f60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906308f25a8f9061102e90339085906004016134bd565b602060405180830381865afa15801561104b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106f91906134eb565b61108b5760405162461bcd60e51b81526004016109889061352e565b604051632142170760e11b81526001600160a01b038616906342842e0e906110bb908790879087906004016135df565b600060405180830381600087803b1580156110d557600080fd5b505af11580156110e9573d6000803e3d6000fd5b505050505050505050565b3460008080806111048680612fb7565b9050905060005b818110156113a5576000611122610a608980612fb7565b905061112e8880612fb7565b8381811061113e5761113e612f63565b90506020028101906111509190612f79565b61115a9080612f9d565b611168906020810190613013565b6001600160a01b031663a5cb2b91826040518263ffffffff1660e01b81526004016111939190612a0a565b600060405180830381865afa1580156111b0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526111d89190810190613282565b5097509195506111ec915089905080612fb7565b838181106111fc576111fc612f63565b905060200281019061120e9190612f79565b6020013585111580156112325750600084600281111561123057611230613307565b145b1561139c576112418880612fb7565b8381811061125157611251612f63565b90506020028101906112639190612f79565b61126d9080612f9d565b61127b906020810190613013565b6001600160a01b0316636cfa1d94866112948b80612fb7565b868181106112a4576112a4612f63565b90506020028101906112b69190612f79565b6112c09080612f9d565b6112ce906020810190612fb7565b6112d88d80612fb7565b888181106112e8576112e8612f63565b90506020028101906112fa9190612f79565b6113049080612f9d565b611312906040810190612fb7565b8b8f60800160208101906113269190613573565b6001336040518a63ffffffff1660e01b815260040161134c989796959493929190613373565b60206040518083038185885af115801561136a573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061138f91906133dd565b6113999088613414565b96505b5060010161110b565b5084156113cf576113cf856113c06080890160608a01613573565b6001600160a01b031690612073565b50600091506113e390506020850185612fb7565b9050905060005b81811015610fd957600080611402610d268880612fb7565b905060006114136020890189612fb7565b8581811061142357611423612f63565b90506020028101906114359190612f79565b61143f9080612f9d565b61144d906020810190613013565b6001600160a01b0316630c295e56836040518263ffffffff1660e01b81526004016114789190612a0a565b600060405180830381865afa158015611495573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526114bd9190810190613282565b509550919250600091506114ce9050565b8160028111156114e0576114e0613307565b146114f3578360010193505050506113ea565b506115016020880188612fb7565b8481811061151157611511612f63565b90506020028101906115239190612f79565b60200135821061169b5761153a6020880188612fb7565b8481811061154a5761154a612f63565b905060200281019061155c9190612f79565b6115669080612f9d565b611574906020810190613013565b6001600160a01b031663d95db9cd61158f60208a018a612fb7565b8681811061159f5761159f612f63565b90506020028101906115b19190612f79565b6115bb9080612f9d565b6115c9906020810190612fb7565b6115d660208c018c612fb7565b888181106115e6576115e6612f63565b90506020028101906115f89190612f79565b6116029080612f9d565b611610906040810190612fb7565b60008d60600160208101906116259190613573565b6001336040518963ffffffff1660e01b815260040161164b9897969594939291906135a9565b6020604051808303816000875af115801561166a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061168e91906133dd565b611698908661342b565b94505b50506001016113ea565b6000816116b18161200f565b84915060008087815b818110156119215760006116d98c8c848181106103c2576103c2612f63565b90508b8b838181106116ed576116ed612f63565b90506020028101906116ff9190612f79565b6117099080612f9d565b611717906020810190613013565b6001600160a01b031663a5cb2b91826040518263ffffffff1660e01b81526004016117429190612a0a565b600060405180830381865afa15801561175f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526117879190810190613282565b5097509195508d91508c9050838181106117a3576117a3612f63565b90506020028101906117b59190612f79565b6020013585111580156117d9575060008460028111156117d7576117d7613307565b145b15611918578b8b838181106117f0576117f0612f63565b90506020028101906118029190612f79565b61180c9080612f9d565b61181a906020810190613013565b6001600160a01b0316636cfa1d948d8d8581811061183a5761183a612f63565b905060200281019061184c9190612f79565b6118569080612f9d565b611864906020810190612fb7565b8f8f8781811061187657611876612f63565b90506020028101906118889190612f79565b6118929080612f9d565b6118a0906040810190612fb7565b8a8f6001336040518963ffffffff1660e01b81526004016118c8989796959493929190613373565b6020604051808303816000875af11580156118e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190b91906133dd565b6119159088613414565b96505b506001016116ba565b505050505095945050505050565b60008161193b8161200f565b6106ba878787876120a3565b6000816119538161200f565b6106ba8787878761239e565b60008161196b8161200f565b6119806119788880612fb7565b6000306120a3565b915061198c348361342b565b9150856106b061199f60208a018a613607565b6119a98a87613414565b8989612479565b6000816119bc8161200f565b6119c96119788880612fb7565b91506119d5348361342b565b9150856106b06119e860208a018a612fb7565b6119f28a87613414565b8989612664565b600081611a058161200f565b8460005b81811015611c8357600080611a298a8a858181106103c2576103c2612f63565b905060008a8a85818110611a3f57611a3f612f63565b9050602002810190611a519190612f79565b611a5b9080612f9d565b611a69906020810190613013565b6001600160a01b0316630c295e56836040518263ffffffff1660e01b8152600401611a949190612a0a565b600060405180830381865afa158015611ab1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611ad99190810190613282565b50955091925060009150611aea9050565b816002811115611afc57611afc613307565b14611b0f57836001019350505050611a09565b50898984818110611b2257611b22612f63565b9050602002810190611b349190612f79565b602001358210611c7957898984818110611b5057611b50612f63565b9050602002810190611b629190612f79565b611b6c9080612f9d565b611b7a906020810190613013565b6001600160a01b031663d95db9cd8b8b86818110611b9a57611b9a612f63565b9050602002810190611bac9190612f79565b611bb69080612f9d565b611bc4906020810190612fb7565b8d8d88818110611bd657611bd6612f63565b9050602002810190611be89190612f79565b611bf29080612f9d565b611c00906040810190612fb7565b60008e6001336040518963ffffffff1660e01b8152600401611c299897969594939291906135a9565b6020604051808303816000875af1158015611c48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c6c91906133dd565b611c76908761342b565b95505b5050600101611a09565b505050949350505050565b600081611c9a8161200f565b84915060008087815b81811015611921578a8a82818110611cbd57611cbd612f63565b611cd39260206060909202019081019150613013565b6001600160a01b031663a5cb2b918c8c84818110611cf357611cf3612f63565b905060600201600001602001356040518263ffffffff1660e01b8152600401611d1c9190612a0a565b600060405180830381865afa158015611d39573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611d619190810190613282565b5096509194508c91508b905082818110611d7d57611d7d612f63565b905060600201604001358411158015611da757506000836002811115611da557611da5613307565b145b15611e76578a8a82818110611dbe57611dbe612f63565b611dd49260206060909202019081019150613013565b6001600160a01b03166328b8aee18c8c84818110611df457611df4612f63565b90506060020160000160200135868b6001336040518663ffffffff1660e01b8152600401611e26959493929190613443565b6020604051808303816000875af1158015611e45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6991906133dd565b611e739087613414565b95505b600101611ca3565b6040516308f25a8f60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906308f25a8f90611ecc90339085906004016134bd565b602060405180830381865afa158015611ee9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f0d91906134eb565b611f295760405162461bcd60e51b81526004016109889061352e565b604051637921219560e11b81526001600160a01b0387169063f242432a90611f5b90889088908890889060040161365d565b600060405180830381600087803b158015611f7557600080fd5b505af1158015611f89573d6000803e3d6000fd5b50505050505050505050565b600081611fa18161200f565b6106ba8787348888612479565b600081611fba8161200f565b6106ba8787348888612664565b600081611fd38161200f565b611fe06106798880612fb7565b9150611fec868361342b565b9150846106b0611fff60208a018a613607565b6120098987613414565b8861239e565b8042111561202f5760405162461bcd60e51b8152600401610988906136cd565b50565b6000805b8281101561206c5783838281811061205057612050612f63565b9050602002013582612062919061342b565b9150600101612036565b5092915050565b600080600080600085875af190508061209e5760405162461bcd60e51b815260040161098890613707565b505050565b600083815b818110156121d4578686828181106120c2576120c2612f63565b90506020028101906120d49190612f9d565b6120e2906020810190613013565b6001600160a01b031663d95db9cd88888481811061210257612102612f63565b90506020028101906121149190612f9d565b612122906020810190612fb7565b8a8a8681811061213457612134612f63565b90506020028101906121469190612f9d565b612154906040810190612fb7565b60008a6001336040518963ffffffff1660e01b815260040161217d9897969594939291906135a9565b6020604051808303816000875af115801561219c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121c091906133dd565b6121ca908461342b565b92506001016120a8565b50838210156121f55760405162461bcd60e51b815260040161098890613742565b50949350505050565b818360005b8181101561232e5786868281811061221d5761221d612f63565b905060200281019061222f9190612f9d565b61223d906020810190613013565b6001600160a01b0316636cfa1d9488888481811061225d5761225d612f63565b905060200281019061226f9190612f9d565b61227d906020810190612fb7565b8a8a8681811061228f5761228f612f63565b90506020028101906122a19190612f9d565b6122af906040810190612fb7565b888a6001336040518963ffffffff1660e01b81526004016122d7989796959493929190613373565b6020604051808303816000875af11580156122f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061231a91906133dd565b6123249084613414565b9250600101612203565b5050949350505050565b60006040516323b872dd60e01b81526001600160a01b03851660048201526001600160a01b038416602482015282604482015260008060648360008a5af1915050612382816128a5565b610a0f5760405162461bcd60e51b81526004016109889061377d565b818360005b8181101561232e578686828181106123bd576123bd612f63565b6123d39260206040909202019081019150613013565b6001600160a01b03166328b8aee18888848181106123f3576123f3612f63565b9050604002016020013585876001336040518663ffffffff1660e01b8152600401612422959493929190613443565b6020604051808303816000875af1158015612441573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061246591906133dd565b61246f9084613414565b92506001016123a3565b8260008086815b8181101561264a5789898281811061249a5761249a612f63565b6124b09260206040909202019081019150613013565b6001600160a01b031663a5cb2b918b8b848181106124d0576124d0612f63565b905060400201602001356040518263ffffffff1660e01b81526004016124f69190612a0a565b600060405180830381865afa158015612513573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261253b9190810190613282565b5096509194506000915061254c9050565b83600281111561255e5761255e613307565b1461257b5760405162461bcd60e51b8152600401610988906137b7565b89898281811061258d5761258d612f63565b6125a39260206040909202019081019150613013565b6001600160a01b03166328b8aee1858c8c858181106125c4576125c4612f63565b90506040020160200135888a6001336040518763ffffffff1660e01b81526004016125f3959493929190613443565b60206040518083038185885af1158015612611573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061263691906133dd565b6126409086613414565b9450600101612480565b508315610654576106546001600160a01b03871685612073565b8260008086815b8181101561264a57600061269c8b8b8481811061268a5761268a612f63565b90506020028101906103de9190612f9d565b90508a8a838181106126b0576126b0612f63565b90506020028101906126c29190612f9d565b6126d0906020810190613013565b6001600160a01b031663a5cb2b91826040518263ffffffff1660e01b81526004016126fb9190612a0a565b600060405180830381865afa158015612718573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526127409190810190613282565b509750919550600091506127519050565b84600281111561276357612763613307565b146127805760405162461bcd60e51b8152600401610988906137b7565b8a8a8381811061279257612792612f63565b90506020028101906127a49190612f9d565b6127b2906020810190613013565b6001600160a01b0316636cfa1d94868d8d868181106127d3576127d3612f63565b90506020028101906127e59190612f9d565b6127f3906020810190612fb7565b8f8f8881811061280557612805612f63565b90506020028101906128179190612f9d565b612825906040810190612fb7565b8c8e6001336040518a63ffffffff1660e01b815260040161284d989796959493929190613373565b60206040518083038185885af115801561286b573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061289091906133dd565b61289a9087613414565b95505060010161266b565b60003d826128b757806000803e806000fd5b80602081146128cf5780156128e057600092506128e5565b816000803e600051151592506128e5565b600192505b5050919050565b60008083601f84011261290157612901600080fd5b5081356001600160401b0381111561291b5761291b600080fd5b60208301915083602082028301111561293657612936600080fd5b9250929050565b60006001600160a01b0382165b92915050565b6129598161293d565b811461202f57600080fd5b803561294a81612950565b80612959565b803561294a8161296f565b60008060008060006080868803121561299b5761299b600080fd5b85356001600160401b038111156129b4576129b4600080fd5b6129c0888289016128ec565b955095505060206129d388828901612964565b93505060406129e488828901612964565b92505060606129f588828901612975565b9150509295509295909350565b805b82525050565b6020810161294a8284612a02565b600060408284031215612a2d57612a2d600080fd5b50919050565b600080600080600060a08688031215612a4e57612a4e600080fd5b85356001600160401b03811115612a6757612a67600080fd5b612a7388828901612a18565b9550506020612a8488828901612975565b9450506040612a9588828901612975565b9350506060612aa688828901612964565b92505060806129f588828901612975565b60008083601f840112612acc57612acc600080fd5b5081356001600160401b03811115612ae657612ae6600080fd5b60208301915083606082028301111561293657612936600080fd5b600080600080600060808688031215612b1c57612b1c600080fd5b85356001600160401b03811115612b3557612b35600080fd5b6129c088828901612ab7565b600061294a8261293d565b61295981612b41565b803561294a81612b4c565b6006811061202f57600080fd5b803561294a81612b60565b600080600080600060a08688031215612b9357612b93600080fd5b6000612b9f8888612b55565b9550506020612bb088828901612964565b9450506040612bc188828901612964565b9350506060612bd288828901612975565b92505060806129f588828901612b6d565b600080600080600060808688031215612bfe57612bfe600080fd5b85356001600160401b03811115612c1757612c17600080fd5b612c23888289016128ec565b955095505060206129d388828901612975565b600060a08284031215612a2d57612a2d600080fd5b600060208284031215612c6057612c60600080fd5b81356001600160401b03811115612c7957612c79600080fd5b612c8584828501612c36565b949350505050565b60408101612c9b8285612a02565b612ca86020830184612a02565b9392505050565b60008083601f840112612cc457612cc4600080fd5b5081356001600160401b03811115612cde57612cde600080fd5b60208301915083604082028301111561293657612936600080fd5b600080600080600060808688031215612d1457612d14600080fd5b85356001600160401b03811115612d2d57612d2d600080fd5b612c2388828901612caf565b600080600080600060a08688031215612d5457612d54600080fd5b85356001600160401b03811115612d6d57612d6d600080fd5b612d7988828901612a18565b9550506020612d8a88828901612975565b9450506040612a9588828901612964565b60008060008060608587031215612db457612db4600080fd5b84356001600160401b03811115612dcd57612dcd600080fd5b612dd9878288016128ec565b94509450506020612dec87828801612964565b9250506040612dfd87828801612975565b91505092959194509250565b600061294a6001600160a01b038316612e20565b90565b6001600160a01b031690565b600061294a82612e09565b600061294a82612e2c565b612a0481612e37565b6020810161294a8284612e42565b600080600080600060808688031215612e7457612e74600080fd5b85356001600160401b03811115612e8d57612e8d600080fd5b612c2388828901612ab7565b60008060008060008060c08789031215612eb557612eb5600080fd5b6000612ec18989612b55565b9650506020612ed289828a01612964565b9550506040612ee389828a01612964565b9450506060612ef489828a01612975565b9350506080612f0589828a01612975565b92505060a0612f1689828a01612b6d565b9150509295509295509295565b600080600080600060808688031215612f3e57612f3e600080fd5b85356001600160401b03811115612f5757612f57600080fd5b6129c088828901612caf565b634e487b7160e01b600052603260045260246000fd5b60008235603e1936849003018112612f9357612f93600080fd5b9190910192915050565b60008235605e1936849003018112612f9357612f93600080fd5b6000808335601e1936859003018112612fd257612fd2600080fd5b8084019250823591506001600160401b03821115612ff257612ff2600080fd5b6020928301928202360383131561300b5761300b600080fd5b509250929050565b60006020828403121561302857613028600080fd5b6000612c858484612b55565b6003811061202f57600080fd5b805161294a81613034565b805161294a8161296f565b634e487b7160e01b600052604160045260246000fd5b601f19601f83011681018181106001600160401b038211171561309257613092613057565b6040525050565b60006130a460405190565b90506130b0828261306d565b919050565b60006001600160401b038211156130ce576130ce613057565b5060209081020190565b60006130eb6130e6846130b5565b613099565b8381529050602080820190840283018581111561310a5761310a600080fd5b835b8181101561312e578061311f888261304c565b8452506020928301920161310c565b5050509392505050565b600082601f83011261314c5761314c600080fd5b8151612c858482602086016130d8565b805161294a81612950565b60006131756130e6846130b5565b8381529050602080820190840283018581111561319457613194600080fd5b835b8181101561312e57806131a9888261315c565b84525060209283019201613196565b600082601f8301126131cc576131cc600080fd5b8151612c85848260208601613167565b6000608082840312156131f1576131f1600080fd5b6131fb6080613099565b90506000613209848461304c565b825250602061321a8484830161304c565b60208301525060408201516001600160401b0381111561323c5761323c600080fd5b61324884828501613138565b60408301525060608201516001600160401b0381111561326a5761326a600080fd5b613276848285016131b8565b60608301525092915050565b600080600080600060a0868803121561329d5761329d600080fd5b60006132a98888613041565b95505060206132ba8882890161304c565b94505060406132cb8882890161304c565b93505060606132dc8882890161304c565b92505060808601516001600160401b038111156132fb576132fb600080fd5b6129f5888289016131dc565b634e487b7160e01b600052602160045260246000fd5b82818337506000910152565b81835260006020840193506001600160fb1b0383111561334b5761334b600080fd5b60208302925061335c83858461331d565b50500190565b612a048161293d565b801515612a04565b60c08082528101613385818a8c613329565b9050818103602083015261339a81888a613329565b90506133a96040830187612a02565b6133b66060830186613362565b6133c3608083018561336b565b6133d060a0830184613362565b9998505050505050505050565b6000602082840312156133f2576133f2600080fd5b6000612c85848461304c565b634e487b7160e01b600052601160045260246000fd5b600082821015613426576134266133fe565b500390565b6000821982111561343e5761343e6133fe565b500190565b60a081016134518288612a02565b61345e6020830187612a02565b61346b6040830186613362565b613478606083018561336b565b6134856080830184613362565b9695505050505050565b6006811061202f5761202f613307565b806130b08161348f565b600061294a8261349f565b612a04816134a9565b604081016134cb8285613362565b612ca860208301846134b4565b801515612959565b805161294a816134d8565b60006020828403121561350057613500600080fd5b6000612c8584846134e0565b60088152600060208201672737ba103830b4b960c11b815291505b5060200190565b6020808252810161294a8161350c565b600e81526000602082016d2737ba1022a9219918103830b4b960911b81529150613527565b6020808252810161294a8161353e565b60006020828403121561358857613588600080fd5b6000612c858484612964565b600061294a612e1d8381565b612a0481613594565b60c080825281016135bb818a8c613329565b905081810360208301526135d081888a613329565b90506133a960408301876135a0565b606081016135ed8286613362565b6135fa6020830185613362565b612c856040830184612a02565b6000808335601e193685900301811261362257613622600080fd5b8084019250823591506001600160401b0382111561364257613642600080fd5b60208301925060408202360383131561300b5761300b600080fd5b60a0810161366b8287613362565b6136786020830186613362565b6136856040830185612a02565b6136926060830184612a02565b81810360808301526000815260208101613485565b600f81526000602082016e111958591b1a5b99481c185cdcd959608a1b81529150613527565b6020808252810161294a816136a7565b601381526000602082017211551217d514905394d1915497d19052531151606a1b81529150613527565b6020808252810161294a816136dd565b60148152600060208201736f7574707574416d6f756e7420746f6f206c6f7760601b81529150613527565b6020808252810161294a81613717565b60148152600060208201731514905394d1915497d19493d357d1905253115160621b81529150613527565b6020808252810161294a81613752565b60138152600060208201722137b73234b7339031bab93b329032b93937b960691b81529150613527565b6020808252810161294a8161378d56fea26469706673582212201e9073b02cc2dbeb14b151619d7feac58e1672690b8e02f7331838d76a7f815c64736f6c634300080d0033000000000000000000000000353f4106641db62384cf0e4f1ef15f8ac9a9fb4b

Deployed ByteCode

0x6080604052600436106101235760003560e01c8063ad134450116100a0578063c5cf570411610064578063c5cf570414610308578063c8d43d6114610328578063db42312a14610348578063db714ef81461035b578063fa68cdf21461036e57600080fd5b8063ad13445014610261578063b93d4e5c14610281578063c0bafec814610294578063c2e20c97146102a7578063c45a0155146102c757600080fd5b8063582eaaee116100e7578063582eaaee146101cd578063748ff339146101ee57806384b4f2ab1461020e57806386c8278f14610221578063917e43831461024157600080fd5b80630bd568ea1461012f57806318bcc8fd146101585780632f9b9d4e146101785780634b456d0c1461018b57806355184c2d146101ad57600080fd5b3661012a57005b600080fd5b61014261013d366004612980565b61038e565b60405161014f9190612a0a565b60405180910390f35b34801561016457600080fd5b50610142610173366004612a33565b610660565b610142610186366004612b01565b6106c5565b34801561019757600080fd5b506101ab6101a6366004612b78565b6108dd565b005b3480156101b957600080fd5b506101426101c8366004612be3565b610a16565b6101e06101db366004612c4b565b610a2e565b60405161014f929190612c8d565b3480156101fa57600080fd5b506101ab610209366004612b78565b610fe0565b6101e061021c366004612c4b565b6110f4565b34801561022d57600080fd5b5061014261023c366004612be3565b6116a5565b34801561024d57600080fd5b5061014261025c366004612be3565b61192f565b34801561026d57600080fd5b5061014261027c366004612cf9565b611947565b61014261028f366004612d39565b61195f565b6101426102a2366004612d39565b6119b0565b3480156102b357600080fd5b506101426102c2366004612d9b565b6119f9565b3480156102d357600080fd5b506102fb7f000000000000000000000000353f4106641db62384cf0e4f1ef15f8ac9a9fb4b81565b60405161014f9190612e4b565b34801561031457600080fd5b50610142610323366004612e59565b611c8e565b34801561033457600080fd5b506101ab610343366004612e99565b611e7e565b610142610356366004612f23565b611f95565b610142610369366004612980565b611fae565b34801561037a57600080fd5b50610142610389366004612a33565b611fc7565b60008161039a8161200f565b34915060008060005b8881101561063a5760006103f18b8b848181106103c2576103c2612f63565b90506020028101906103d49190612f79565b6103de9080612f9d565b6103ec906040810190612fb7565b612032565b90508a8a8381811061040557610405612f63565b90506020028101906104179190612f79565b6104219080612f9d565b61042f906020810190613013565b6001600160a01b031663a5cb2b91826040518263ffffffff1660e01b815260040161045a9190612a0a565b600060405180830381865afa158015610477573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261049f9190810190613282565b5096509194508c91508b9050838181106104bb576104bb612f63565b90506020028101906104cd9190612f79565b6020013584111580156104f1575060008360028111156104ef576104ef613307565b145b15610631578a8a8381811061050857610508612f63565b905060200281019061051a9190612f79565b6105249080612f9d565b610532906020810190613013565b6001600160a01b0316636cfa1d94858d8d8681811061055357610553612f63565b90506020028101906105659190612f79565b61056f9080612f9d565b61057d906020810190612fb7565b8f8f8881811061058f5761058f612f63565b90506020028101906105a19190612f79565b6105ab9080612f9d565b6105b9906040810190612fb7565b8a8f6001336040518a63ffffffff1660e01b81526004016105e1989796959493929190613373565b60206040518083038185885af11580156105ff573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061062491906133dd565b61062e9087613414565b95505b506001016103a3565b508315610654576106546001600160a01b03881685612073565b50505095945050505050565b60008161066c8161200f565b6106816106798880612fb7565b6000336120a3565b915061068d868361342b565b9150846106b06106a060208a018a612fb7565b6106aa8987613414565b886121fe565b6106ba919061342b565b979650505050505050565b6000816106d18161200f565b34915060008087815b818110156108b6578a8a828181106106f4576106f4612f63565b61070a9260206060909202019081019150613013565b6001600160a01b031663a5cb2b918c8c8481811061072a5761072a612f63565b905060600201600001602001356040518263ffffffff1660e01b81526004016107539190612a0a565b600060405180830381865afa158015610770573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526107989190810190613282565b5096509194508c91508b9050828181106107b4576107b4612f63565b9050606002016040013584111580156107de575060008360028111156107dc576107dc613307565b145b156108ae578a8a828181106107f5576107f5612f63565b61080b9260206060909202019081019150613013565b6001600160a01b03166328b8aee1858d8d8581811061082c5761082c612f63565b90506060020160000160200135878c6001336040518763ffffffff1660e01b815260040161085e959493929190613443565b60206040518083038185885af115801561087c573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906108a191906133dd565b6108ab9087613414565b95505b6001016106da565b5084156108d0576108d06001600160a01b03891686612073565b5050505095945050505050565b6040516308f25a8f60e01b81526001600160a01b037f000000000000000000000000353f4106641db62384cf0e4f1ef15f8ac9a9fb4b16906308f25a8f9061092b90339085906004016134bd565b602060405180830381865afa158015610948573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061096c91906134eb565b6109915760405162461bcd60e51b81526004016109889061352e565b60405180910390fd5b60028160058111156109a5576109a5613307565b14806109c2575060038160058111156109c0576109c0613307565b145b806109de575060058160058111156109dc576109dc613307565b145b6109fa5760405162461bcd60e51b815260040161098890613563565b610a0f6001600160a01b038616858585612338565b5050505050565b600081610a228161200f565b6106ba878787876121fe565b60408101356000808080610a428680612fb7565b9050905060005b81811015610cf2576000610a70610a608980612fb7565b848181106103c2576103c2612f63565b9050610a7c8880612fb7565b83818110610a8c57610a8c612f63565b9050602002810190610a9e9190612f79565b610aa89080612f9d565b610ab6906020810190613013565b6001600160a01b031663a5cb2b91826040518263ffffffff1660e01b8152600401610ae19190612a0a565b600060405180830381865afa158015610afe573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b269190810190613282565b509750919550610b3a915089905080612fb7565b83818110610b4a57610b4a612f63565b9050602002810190610b5c9190612f79565b602001358511158015610b8057506000846002811115610b7e57610b7e613307565b145b15610ce957610b8f8880612fb7565b83818110610b9f57610b9f612f63565b9050602002810190610bb19190612f79565b610bbb9080612f9d565b610bc9906020810190613013565b6001600160a01b0316636cfa1d94610be18a80612fb7565b85818110610bf157610bf1612f63565b9050602002810190610c039190612f79565b610c0d9080612f9d565b610c1b906020810190612fb7565b610c258c80612fb7565b87818110610c3557610c35612f63565b9050602002810190610c479190612f79565b610c519080612f9d565b610c5f906040810190612fb7565b8a8e6080016020810190610c739190613573565b6001336040518963ffffffff1660e01b8152600401610c99989796959493929190613373565b6020604051808303816000875af1158015610cb8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cdc91906133dd565b610ce69088613414565b96505b50600101610a49565b5060009250610d079150506020850185612fb7565b9050905060005b81811015610fd957600080610d36610d268880612fb7565b858181106103c2576103c2612f63565b90506000610d476020890189612fb7565b85818110610d5757610d57612f63565b9050602002810190610d699190612f79565b610d739080612f9d565b610d81906020810190613013565b6001600160a01b0316630c295e56836040518263ffffffff1660e01b8152600401610dac9190612a0a565b600060405180830381865afa158015610dc9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610df19190810190613282565b50955091925060009150610e029050565b816002811115610e1457610e14613307565b14610e2757836001019350505050610d0e565b50610e356020880188612fb7565b84818110610e4557610e45612f63565b9050602002810190610e579190612f79565b602001358210610fcf57610e6e6020880188612fb7565b84818110610e7e57610e7e612f63565b9050602002810190610e909190612f79565b610e9a9080612f9d565b610ea8906020810190613013565b6001600160a01b031663d95db9cd610ec360208a018a612fb7565b86818110610ed357610ed3612f63565b9050602002810190610ee59190612f79565b610eef9080612f9d565b610efd906020810190612fb7565b610f0a60208c018c612fb7565b88818110610f1a57610f1a612f63565b9050602002810190610f2c9190612f79565b610f369080612f9d565b610f44906040810190612fb7565b60008d6060016020810190610f599190613573565b6001336040518963ffffffff1660e01b8152600401610f7f9897969594939291906135a9565b6020604051808303816000875af1158015610f9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc291906133dd565b610fcc908661342b565b94505b5050600101610d0e565b5050915091565b6040516308f25a8f60e01b81526001600160a01b037f000000000000000000000000353f4106641db62384cf0e4f1ef15f8ac9a9fb4b16906308f25a8f9061102e90339085906004016134bd565b602060405180830381865afa15801561104b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106f91906134eb565b61108b5760405162461bcd60e51b81526004016109889061352e565b604051632142170760e11b81526001600160a01b038616906342842e0e906110bb908790879087906004016135df565b600060405180830381600087803b1580156110d557600080fd5b505af11580156110e9573d6000803e3d6000fd5b505050505050505050565b3460008080806111048680612fb7565b9050905060005b818110156113a5576000611122610a608980612fb7565b905061112e8880612fb7565b8381811061113e5761113e612f63565b90506020028101906111509190612f79565b61115a9080612f9d565b611168906020810190613013565b6001600160a01b031663a5cb2b91826040518263ffffffff1660e01b81526004016111939190612a0a565b600060405180830381865afa1580156111b0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526111d89190810190613282565b5097509195506111ec915089905080612fb7565b838181106111fc576111fc612f63565b905060200281019061120e9190612f79565b6020013585111580156112325750600084600281111561123057611230613307565b145b1561139c576112418880612fb7565b8381811061125157611251612f63565b90506020028101906112639190612f79565b61126d9080612f9d565b61127b906020810190613013565b6001600160a01b0316636cfa1d94866112948b80612fb7565b868181106112a4576112a4612f63565b90506020028101906112b69190612f79565b6112c09080612f9d565b6112ce906020810190612fb7565b6112d88d80612fb7565b888181106112e8576112e8612f63565b90506020028101906112fa9190612f79565b6113049080612f9d565b611312906040810190612fb7565b8b8f60800160208101906113269190613573565b6001336040518a63ffffffff1660e01b815260040161134c989796959493929190613373565b60206040518083038185885af115801561136a573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061138f91906133dd565b6113999088613414565b96505b5060010161110b565b5084156113cf576113cf856113c06080890160608a01613573565b6001600160a01b031690612073565b50600091506113e390506020850185612fb7565b9050905060005b81811015610fd957600080611402610d268880612fb7565b905060006114136020890189612fb7565b8581811061142357611423612f63565b90506020028101906114359190612f79565b61143f9080612f9d565b61144d906020810190613013565b6001600160a01b0316630c295e56836040518263ffffffff1660e01b81526004016114789190612a0a565b600060405180830381865afa158015611495573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526114bd9190810190613282565b509550919250600091506114ce9050565b8160028111156114e0576114e0613307565b146114f3578360010193505050506113ea565b506115016020880188612fb7565b8481811061151157611511612f63565b90506020028101906115239190612f79565b60200135821061169b5761153a6020880188612fb7565b8481811061154a5761154a612f63565b905060200281019061155c9190612f79565b6115669080612f9d565b611574906020810190613013565b6001600160a01b031663d95db9cd61158f60208a018a612fb7565b8681811061159f5761159f612f63565b90506020028101906115b19190612f79565b6115bb9080612f9d565b6115c9906020810190612fb7565b6115d660208c018c612fb7565b888181106115e6576115e6612f63565b90506020028101906115f89190612f79565b6116029080612f9d565b611610906040810190612fb7565b60008d60600160208101906116259190613573565b6001336040518963ffffffff1660e01b815260040161164b9897969594939291906135a9565b6020604051808303816000875af115801561166a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061168e91906133dd565b611698908661342b565b94505b50506001016113ea565b6000816116b18161200f565b84915060008087815b818110156119215760006116d98c8c848181106103c2576103c2612f63565b90508b8b838181106116ed576116ed612f63565b90506020028101906116ff9190612f79565b6117099080612f9d565b611717906020810190613013565b6001600160a01b031663a5cb2b91826040518263ffffffff1660e01b81526004016117429190612a0a565b600060405180830381865afa15801561175f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526117879190810190613282565b5097509195508d91508c9050838181106117a3576117a3612f63565b90506020028101906117b59190612f79565b6020013585111580156117d9575060008460028111156117d7576117d7613307565b145b15611918578b8b838181106117f0576117f0612f63565b90506020028101906118029190612f79565b61180c9080612f9d565b61181a906020810190613013565b6001600160a01b0316636cfa1d948d8d8581811061183a5761183a612f63565b905060200281019061184c9190612f79565b6118569080612f9d565b611864906020810190612fb7565b8f8f8781811061187657611876612f63565b90506020028101906118889190612f79565b6118929080612f9d565b6118a0906040810190612fb7565b8a8f6001336040518963ffffffff1660e01b81526004016118c8989796959493929190613373565b6020604051808303816000875af11580156118e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190b91906133dd565b6119159088613414565b96505b506001016116ba565b505050505095945050505050565b60008161193b8161200f565b6106ba878787876120a3565b6000816119538161200f565b6106ba8787878761239e565b60008161196b8161200f565b6119806119788880612fb7565b6000306120a3565b915061198c348361342b565b9150856106b061199f60208a018a613607565b6119a98a87613414565b8989612479565b6000816119bc8161200f565b6119c96119788880612fb7565b91506119d5348361342b565b9150856106b06119e860208a018a612fb7565b6119f28a87613414565b8989612664565b600081611a058161200f565b8460005b81811015611c8357600080611a298a8a858181106103c2576103c2612f63565b905060008a8a85818110611a3f57611a3f612f63565b9050602002810190611a519190612f79565b611a5b9080612f9d565b611a69906020810190613013565b6001600160a01b0316630c295e56836040518263ffffffff1660e01b8152600401611a949190612a0a565b600060405180830381865afa158015611ab1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611ad99190810190613282565b50955091925060009150611aea9050565b816002811115611afc57611afc613307565b14611b0f57836001019350505050611a09565b50898984818110611b2257611b22612f63565b9050602002810190611b349190612f79565b602001358210611c7957898984818110611b5057611b50612f63565b9050602002810190611b629190612f79565b611b6c9080612f9d565b611b7a906020810190613013565b6001600160a01b031663d95db9cd8b8b86818110611b9a57611b9a612f63565b9050602002810190611bac9190612f79565b611bb69080612f9d565b611bc4906020810190612fb7565b8d8d88818110611bd657611bd6612f63565b9050602002810190611be89190612f79565b611bf29080612f9d565b611c00906040810190612fb7565b60008e6001336040518963ffffffff1660e01b8152600401611c299897969594939291906135a9565b6020604051808303816000875af1158015611c48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c6c91906133dd565b611c76908761342b565b95505b5050600101611a09565b505050949350505050565b600081611c9a8161200f565b84915060008087815b81811015611921578a8a82818110611cbd57611cbd612f63565b611cd39260206060909202019081019150613013565b6001600160a01b031663a5cb2b918c8c84818110611cf357611cf3612f63565b905060600201600001602001356040518263ffffffff1660e01b8152600401611d1c9190612a0a565b600060405180830381865afa158015611d39573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611d619190810190613282565b5096509194508c91508b905082818110611d7d57611d7d612f63565b905060600201604001358411158015611da757506000836002811115611da557611da5613307565b145b15611e76578a8a82818110611dbe57611dbe612f63565b611dd49260206060909202019081019150613013565b6001600160a01b03166328b8aee18c8c84818110611df457611df4612f63565b90506060020160000160200135868b6001336040518663ffffffff1660e01b8152600401611e26959493929190613443565b6020604051808303816000875af1158015611e45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6991906133dd565b611e739087613414565b95505b600101611ca3565b6040516308f25a8f60e01b81526001600160a01b037f000000000000000000000000353f4106641db62384cf0e4f1ef15f8ac9a9fb4b16906308f25a8f90611ecc90339085906004016134bd565b602060405180830381865afa158015611ee9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f0d91906134eb565b611f295760405162461bcd60e51b81526004016109889061352e565b604051637921219560e11b81526001600160a01b0387169063f242432a90611f5b90889088908890889060040161365d565b600060405180830381600087803b158015611f7557600080fd5b505af1158015611f89573d6000803e3d6000fd5b50505050505050505050565b600081611fa18161200f565b6106ba8787348888612479565b600081611fba8161200f565b6106ba8787348888612664565b600081611fd38161200f565b611fe06106798880612fb7565b9150611fec868361342b565b9150846106b0611fff60208a018a613607565b6120098987613414565b8861239e565b8042111561202f5760405162461bcd60e51b8152600401610988906136cd565b50565b6000805b8281101561206c5783838281811061205057612050612f63565b9050602002013582612062919061342b565b9150600101612036565b5092915050565b600080600080600085875af190508061209e5760405162461bcd60e51b815260040161098890613707565b505050565b600083815b818110156121d4578686828181106120c2576120c2612f63565b90506020028101906120d49190612f9d565b6120e2906020810190613013565b6001600160a01b031663d95db9cd88888481811061210257612102612f63565b90506020028101906121149190612f9d565b612122906020810190612fb7565b8a8a8681811061213457612134612f63565b90506020028101906121469190612f9d565b612154906040810190612fb7565b60008a6001336040518963ffffffff1660e01b815260040161217d9897969594939291906135a9565b6020604051808303816000875af115801561219c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121c091906133dd565b6121ca908461342b565b92506001016120a8565b50838210156121f55760405162461bcd60e51b815260040161098890613742565b50949350505050565b818360005b8181101561232e5786868281811061221d5761221d612f63565b905060200281019061222f9190612f9d565b61223d906020810190613013565b6001600160a01b0316636cfa1d9488888481811061225d5761225d612f63565b905060200281019061226f9190612f9d565b61227d906020810190612fb7565b8a8a8681811061228f5761228f612f63565b90506020028101906122a19190612f9d565b6122af906040810190612fb7565b888a6001336040518963ffffffff1660e01b81526004016122d7989796959493929190613373565b6020604051808303816000875af11580156122f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061231a91906133dd565b6123249084613414565b9250600101612203565b5050949350505050565b60006040516323b872dd60e01b81526001600160a01b03851660048201526001600160a01b038416602482015282604482015260008060648360008a5af1915050612382816128a5565b610a0f5760405162461bcd60e51b81526004016109889061377d565b818360005b8181101561232e578686828181106123bd576123bd612f63565b6123d39260206040909202019081019150613013565b6001600160a01b03166328b8aee18888848181106123f3576123f3612f63565b9050604002016020013585876001336040518663ffffffff1660e01b8152600401612422959493929190613443565b6020604051808303816000875af1158015612441573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061246591906133dd565b61246f9084613414565b92506001016123a3565b8260008086815b8181101561264a5789898281811061249a5761249a612f63565b6124b09260206040909202019081019150613013565b6001600160a01b031663a5cb2b918b8b848181106124d0576124d0612f63565b905060400201602001356040518263ffffffff1660e01b81526004016124f69190612a0a565b600060405180830381865afa158015612513573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261253b9190810190613282565b5096509194506000915061254c9050565b83600281111561255e5761255e613307565b1461257b5760405162461bcd60e51b8152600401610988906137b7565b89898281811061258d5761258d612f63565b6125a39260206040909202019081019150613013565b6001600160a01b03166328b8aee1858c8c858181106125c4576125c4612f63565b90506040020160200135888a6001336040518763ffffffff1660e01b81526004016125f3959493929190613443565b60206040518083038185885af1158015612611573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061263691906133dd565b6126409086613414565b9450600101612480565b508315610654576106546001600160a01b03871685612073565b8260008086815b8181101561264a57600061269c8b8b8481811061268a5761268a612f63565b90506020028101906103de9190612f9d565b90508a8a838181106126b0576126b0612f63565b90506020028101906126c29190612f9d565b6126d0906020810190613013565b6001600160a01b031663a5cb2b91826040518263ffffffff1660e01b81526004016126fb9190612a0a565b600060405180830381865afa158015612718573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526127409190810190613282565b509750919550600091506127519050565b84600281111561276357612763613307565b146127805760405162461bcd60e51b8152600401610988906137b7565b8a8a8381811061279257612792612f63565b90506020028101906127a49190612f9d565b6127b2906020810190613013565b6001600160a01b0316636cfa1d94868d8d868181106127d3576127d3612f63565b90506020028101906127e59190612f9d565b6127f3906020810190612fb7565b8f8f8881811061280557612805612f63565b90506020028101906128179190612f9d565b612825906040810190612fb7565b8c8e6001336040518a63ffffffff1660e01b815260040161284d989796959493929190613373565b60206040518083038185885af115801561286b573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061289091906133dd565b61289a9087613414565b95505060010161266b565b60003d826128b757806000803e806000fd5b80602081146128cf5780156128e057600092506128e5565b816000803e600051151592506128e5565b600192505b5050919050565b60008083601f84011261290157612901600080fd5b5081356001600160401b0381111561291b5761291b600080fd5b60208301915083602082028301111561293657612936600080fd5b9250929050565b60006001600160a01b0382165b92915050565b6129598161293d565b811461202f57600080fd5b803561294a81612950565b80612959565b803561294a8161296f565b60008060008060006080868803121561299b5761299b600080fd5b85356001600160401b038111156129b4576129b4600080fd5b6129c0888289016128ec565b955095505060206129d388828901612964565b93505060406129e488828901612964565b92505060606129f588828901612975565b9150509295509295909350565b805b82525050565b6020810161294a8284612a02565b600060408284031215612a2d57612a2d600080fd5b50919050565b600080600080600060a08688031215612a4e57612a4e600080fd5b85356001600160401b03811115612a6757612a67600080fd5b612a7388828901612a18565b9550506020612a8488828901612975565b9450506040612a9588828901612975565b9350506060612aa688828901612964565b92505060806129f588828901612975565b60008083601f840112612acc57612acc600080fd5b5081356001600160401b03811115612ae657612ae6600080fd5b60208301915083606082028301111561293657612936600080fd5b600080600080600060808688031215612b1c57612b1c600080fd5b85356001600160401b03811115612b3557612b35600080fd5b6129c088828901612ab7565b600061294a8261293d565b61295981612b41565b803561294a81612b4c565b6006811061202f57600080fd5b803561294a81612b60565b600080600080600060a08688031215612b9357612b93600080fd5b6000612b9f8888612b55565b9550506020612bb088828901612964565b9450506040612bc188828901612964565b9350506060612bd288828901612975565b92505060806129f588828901612b6d565b600080600080600060808688031215612bfe57612bfe600080fd5b85356001600160401b03811115612c1757612c17600080fd5b612c23888289016128ec565b955095505060206129d388828901612975565b600060a08284031215612a2d57612a2d600080fd5b600060208284031215612c6057612c60600080fd5b81356001600160401b03811115612c7957612c79600080fd5b612c8584828501612c36565b949350505050565b60408101612c9b8285612a02565b612ca86020830184612a02565b9392505050565b60008083601f840112612cc457612cc4600080fd5b5081356001600160401b03811115612cde57612cde600080fd5b60208301915083604082028301111561293657612936600080fd5b600080600080600060808688031215612d1457612d14600080fd5b85356001600160401b03811115612d2d57612d2d600080fd5b612c2388828901612caf565b600080600080600060a08688031215612d5457612d54600080fd5b85356001600160401b03811115612d6d57612d6d600080fd5b612d7988828901612a18565b9550506020612d8a88828901612975565b9450506040612a9588828901612964565b60008060008060608587031215612db457612db4600080fd5b84356001600160401b03811115612dcd57612dcd600080fd5b612dd9878288016128ec565b94509450506020612dec87828801612964565b9250506040612dfd87828801612975565b91505092959194509250565b600061294a6001600160a01b038316612e20565b90565b6001600160a01b031690565b600061294a82612e09565b600061294a82612e2c565b612a0481612e37565b6020810161294a8284612e42565b600080600080600060808688031215612e7457612e74600080fd5b85356001600160401b03811115612e8d57612e8d600080fd5b612c2388828901612ab7565b60008060008060008060c08789031215612eb557612eb5600080fd5b6000612ec18989612b55565b9650506020612ed289828a01612964565b9550506040612ee389828a01612964565b9450506060612ef489828a01612975565b9350506080612f0589828a01612975565b92505060a0612f1689828a01612b6d565b9150509295509295509295565b600080600080600060808688031215612f3e57612f3e600080fd5b85356001600160401b03811115612f5757612f57600080fd5b6129c088828901612caf565b634e487b7160e01b600052603260045260246000fd5b60008235603e1936849003018112612f9357612f93600080fd5b9190910192915050565b60008235605e1936849003018112612f9357612f93600080fd5b6000808335601e1936859003018112612fd257612fd2600080fd5b8084019250823591506001600160401b03821115612ff257612ff2600080fd5b6020928301928202360383131561300b5761300b600080fd5b509250929050565b60006020828403121561302857613028600080fd5b6000612c858484612b55565b6003811061202f57600080fd5b805161294a81613034565b805161294a8161296f565b634e487b7160e01b600052604160045260246000fd5b601f19601f83011681018181106001600160401b038211171561309257613092613057565b6040525050565b60006130a460405190565b90506130b0828261306d565b919050565b60006001600160401b038211156130ce576130ce613057565b5060209081020190565b60006130eb6130e6846130b5565b613099565b8381529050602080820190840283018581111561310a5761310a600080fd5b835b8181101561312e578061311f888261304c565b8452506020928301920161310c565b5050509392505050565b600082601f83011261314c5761314c600080fd5b8151612c858482602086016130d8565b805161294a81612950565b60006131756130e6846130b5565b8381529050602080820190840283018581111561319457613194600080fd5b835b8181101561312e57806131a9888261315c565b84525060209283019201613196565b600082601f8301126131cc576131cc600080fd5b8151612c85848260208601613167565b6000608082840312156131f1576131f1600080fd5b6131fb6080613099565b90506000613209848461304c565b825250602061321a8484830161304c565b60208301525060408201516001600160401b0381111561323c5761323c600080fd5b61324884828501613138565b60408301525060608201516001600160401b0381111561326a5761326a600080fd5b613276848285016131b8565b60608301525092915050565b600080600080600060a0868803121561329d5761329d600080fd5b60006132a98888613041565b95505060206132ba8882890161304c565b94505060406132cb8882890161304c565b93505060606132dc8882890161304c565b92505060808601516001600160401b038111156132fb576132fb600080fd5b6129f5888289016131dc565b634e487b7160e01b600052602160045260246000fd5b82818337506000910152565b81835260006020840193506001600160fb1b0383111561334b5761334b600080fd5b60208302925061335c83858461331d565b50500190565b612a048161293d565b801515612a04565b60c08082528101613385818a8c613329565b9050818103602083015261339a81888a613329565b90506133a96040830187612a02565b6133b66060830186613362565b6133c3608083018561336b565b6133d060a0830184613362565b9998505050505050505050565b6000602082840312156133f2576133f2600080fd5b6000612c85848461304c565b634e487b7160e01b600052601160045260246000fd5b600082821015613426576134266133fe565b500390565b6000821982111561343e5761343e6133fe565b500190565b60a081016134518288612a02565b61345e6020830187612a02565b61346b6040830186613362565b613478606083018561336b565b6134856080830184613362565b9695505050505050565b6006811061202f5761202f613307565b806130b08161348f565b600061294a8261349f565b612a04816134a9565b604081016134cb8285613362565b612ca860208301846134b4565b801515612959565b805161294a816134d8565b60006020828403121561350057613500600080fd5b6000612c8584846134e0565b60088152600060208201672737ba103830b4b960c11b815291505b5060200190565b6020808252810161294a8161350c565b600e81526000602082016d2737ba1022a9219918103830b4b960911b81529150613527565b6020808252810161294a8161353e565b60006020828403121561358857613588600080fd5b6000612c858484612964565b600061294a612e1d8381565b612a0481613594565b60c080825281016135bb818a8c613329565b905081810360208301526135d081888a613329565b90506133a960408301876135a0565b606081016135ed8286613362565b6135fa6020830185613362565b612c856040830184612a02565b6000808335601e193685900301811261362257613622600080fd5b8084019250823591506001600160401b0382111561364257613642600080fd5b60208301925060408202360383131561300b5761300b600080fd5b60a0810161366b8287613362565b6136786020830186613362565b6136856040830185612a02565b6136926060830184612a02565b81810360808301526000815260208101613485565b600f81526000602082016e111958591b1a5b99481c185cdcd959608a1b81529150613527565b6020808252810161294a816136a7565b601381526000602082017211551217d514905394d1915497d19052531151606a1b81529150613527565b6020808252810161294a816136dd565b60148152600060208201736f7574707574416d6f756e7420746f6f206c6f7760601b81529150613527565b6020808252810161294a81613717565b60148152600060208201731514905394d1915497d19493d357d1905253115160621b81529150613527565b6020808252810161294a81613752565b60138152600060208201722137b73234b7339031bab93b329032b93937b960691b81529150613527565b6020808252810161294a8161378d56fea26469706673582212201e9073b02cc2dbeb14b151619d7feac58e1672690b8e02f7331838d76a7f815c64736f6c634300080d0033