Overview
S Balance
S Value
$0.00More Info
Private Name Tags
ContractCreator
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
IchiSwapXCLPAdapter
Compiler Version
v0.8.27+commit.40a35a09
Contract Source Code (Solidity)
/** *Submitted for verification at SonicScan.org on 2025-01-08 */ // SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.20 ^0.8.26; // lib/openzeppelin-contracts/contracts/interfaces/draft-IERC6093.sol // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol) /** * @dev Standard ERC20 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens. */ interface IERC20Errors { /** * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. * @param balance Current balance for the interacting account. * @param needed Minimum amount required to perform a transfer. */ error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC20InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC20InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers. * @param spender Address that may be allowed to operate on tokens without being their owner. * @param allowance Amount of tokens a `spender` is allowed to operate with. * @param needed Minimum amount required to perform a transfer. */ error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC20InvalidApprover(address approver); /** * @dev Indicates a failure with the `spender` to be approved. Used in approvals. * @param spender Address that may be allowed to operate on tokens without being their owner. */ error ERC20InvalidSpender(address spender); } /** * @dev Standard ERC721 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens. */ interface IERC721Errors { /** * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20. * Used in balance queries. * @param owner Address of the current owner of a token. */ error ERC721InvalidOwner(address owner); /** * @dev Indicates a `tokenId` whose `owner` is the zero address. * @param tokenId Identifier number of a token. */ error ERC721NonexistentToken(uint256 tokenId); /** * @dev Indicates an error related to the ownership over a particular token. Used in transfers. * @param sender Address whose tokens are being transferred. * @param tokenId Identifier number of a token. * @param owner Address of the current owner of a token. */ error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC721InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC721InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `operator`’s approval. Used in transfers. * @param operator Address that may be allowed to operate on tokens without being their owner. * @param tokenId Identifier number of a token. */ error ERC721InsufficientApproval(address operator, uint256 tokenId); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC721InvalidApprover(address approver); /** * @dev Indicates a failure with the `operator` to be approved. Used in approvals. * @param operator Address that may be allowed to operate on tokens without being their owner. */ error ERC721InvalidOperator(address operator); } /** * @dev Standard ERC1155 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens. */ interface IERC1155Errors { /** * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. * @param balance Current balance for the interacting account. * @param needed Minimum amount required to perform a transfer. * @param tokenId Identifier number of a token. */ error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC1155InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC1155InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `operator`’s approval. Used in transfers. * @param operator Address that may be allowed to operate on tokens without being their owner. * @param owner Address of the current owner of a token. */ error ERC1155MissingApprovalForAll(address operator, address owner); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC1155InvalidApprover(address approver); /** * @dev Indicates a failure with the `operator` to be approved. Used in approvals. * @param operator Address that may be allowed to operate on tokens without being their owner. */ error ERC1155InvalidOperator(address operator); /** * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation. * Used in batch transfers. * @param idsLength Length of the array of token identifiers * @param valuesLength Length of the array of token amounts */ error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength); } // lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol) /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 value) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets a `value` amount of tokens as the allowance of `spender` over the * caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 value) external returns (bool); } // lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Permit.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Permit.sol) /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. * * ==== Security Considerations * * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be * considered as an intention to spend the allowance in any specific way. The second is that because permits have * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be * generally recommended is: * * ```solidity * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public { * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {} * doThing(..., value); * } * * function doThing(..., uint256 value) public { * token.safeTransferFrom(msg.sender, address(this), value); * ... * } * ``` * * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also * {SafeERC20-safeTransferFrom}). * * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so * contracts should have entry points that don't rely on permit. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. * * CAUTION: See Security Considerations above. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // lib/openzeppelin-contracts/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol) /** * @dev Collection of functions related to the address type */ library Address { /** * @dev The ETH balance of the account is not enough to perform the operation. */ error AddressInsufficientBalance(address account); /** * @dev There's no code at `target` (it is not a contract). */ error AddressEmptyCode(address target); /** * @dev A call to an address target failed. The target may have reverted. */ error FailedInnerCall(); /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { if (address(this).balance < amount) { revert AddressInsufficientBalance(address(this)); } (bool success, ) = recipient.call{value: amount}(""); if (!success) { revert FailedInnerCall(); } } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason or custom error, it is bubbled * up by this function (like regular Solidity function calls). However, if * the call reverted with no returned reason, this function reverts with a * {FailedInnerCall} error. * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { if (address(this).balance < value) { revert AddressInsufficientBalance(address(this)); } (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an * unsuccessful call. */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata ) internal view returns (bytes memory) { if (!success) { _revert(returndata); } else { // only check if target is a contract if the call was successful and the return data is empty // otherwise we already know that it was a contract if (returndata.length == 0 && target.code.length == 0) { revert AddressEmptyCode(target); } return returndata; } } /** * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the * revert reason or with a default {FailedInnerCall} error. */ function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) { if (!success) { _revert(returndata); } else { return returndata; } } /** * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}. */ function _revert(bytes memory returndata) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert FailedInnerCall(); } } } // lib/openzeppelin-contracts/contracts/utils/Context.sol // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } } // lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol) /** * @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); } // src/interfaces/IAdapter.sol interface IAdapter { function balanceLP() external view returns (uint256); function addLiquidity( uint256 _amountPeg, uint256 _amountStable,uint256 _minAmountLP ) external; function removeLiquidity(uint256 amountLP, uint256 minPeg, uint256 minStable) external; function buyPegCoin(uint256 amountStable,uint256 minAmountPeg) external; function sellPegCoin(uint256 amountPeg, uint256 minAmounStable) external; function getReward(address profitManager) external; function withdrawERC20ToAMO(address token, uint256 amount) external; function withdrawEtherToAMO(uint256 amount) external; function withdrawAllToAMO() external; } // src/interfaces/IichiSwapX.sol interface ISwapRouterCLP { struct ExactInputSingleParams { address tokenIn; address tokenOut; address recipient; uint256 deadline; uint256 amountIn; uint256 amountOutMinimum; uint160 limitSqrtPrice; } function exactInputSingle(ExactInputSingleParams calldata params) external payable returns (uint256 amountOut); } interface IichiSwapXPool { function token0() external view returns (address); function token1() external view returns (address); function globalState() external view returns (uint160 price, int24 tick, uint16 lastFee, uint8 pluginConfig, uint16 communityFee, bool unlocked); } interface IichiVault { function deposit(uint256 deposit0, uint256 deposit1, address to) external; function withdraw(uint256 shares, address to) external; } interface ISwapXGauge { function deposit(uint256 amount) external; function withdraw(uint256 amount) external; function getReward() external; } // lib/openzeppelin-contracts/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * The initial owner is set to the address provided by the deployer. This can * later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol) /** * @dev Interface for the optional metadata functions from the ERC20 standard. */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721.sol) /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon * a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or * {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon * a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the address zero. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // lib/openzeppelin-contracts/contracts/access/Ownable2Step.sol // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable2Step.sol) /** * @dev Contract module which provides access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * The initial owner is specified at deployment time in the constructor for `Ownable`. This * can later be changed with {transferOwnership} and {acceptOwnership}. * * This module is used through inheritance. It will make available all functions * from parent (Ownable). */ abstract contract Ownable2Step is Ownable { address private _pendingOwner; event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner); /** * @dev Returns the address of the pending owner. */ function pendingOwner() public view virtual returns (address) { return _pendingOwner; } /** * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one. * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual override onlyOwner { _pendingOwner = newOwner; emit OwnershipTransferStarted(owner(), newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner. * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual override { delete _pendingOwner; super._transferOwnership(newOwner); } /** * @dev The new owner accepts the ownership transfer. */ function acceptOwnership() public virtual { address sender = _msgSender(); if (pendingOwner() != sender) { revert OwnableUnauthorizedAccount(sender); } _transferOwnership(sender); } } // lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/utils/SafeERC20.sol) /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; /** * @dev An operation with an ERC20 token failed. */ error SafeERC20FailedOperation(address token); /** * @dev Indicates a failed `decreaseAllowance` request. */ error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease); /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value))); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value))); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); forceApprove(token, spender, oldAllowance + value); } /** * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no * value, non-reverting calls are assumed to be successful. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal { unchecked { uint256 currentAllowance = token.allowance(address(this), spender); if (currentAllowance < requestedDecrease) { revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease); } forceApprove(token, spender, currentAllowance - requestedDecrease); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval * to be set to zero before setting it to a non-zero value, such as USDT. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value)); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0))); _callOptionalReturn(token, approvalCall); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data); if (returndata.length != 0 && !abi.decode(returndata, (bool))) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). * * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && address(token).code.length > 0; } } // lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/ERC20.sol) /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * * TIP: For a detailed writeup see our guide * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * The default value of {decimals} is 18. To change this, you should override * this function so it returns a different value. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. */ abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors { mapping(address account => uint256) private _balances; mapping(address account => mapping(address spender => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the default value returned by this function, unless * it's overridden. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `value`. */ function transfer(address to, uint256 value) public virtual returns (bool) { address owner = _msgSender(); _transfer(owner, to, value); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 value) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, value); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `value`. * - the caller must have allowance for ``from``'s tokens of at least * `value`. */ function transferFrom(address from, address to, uint256 value) public virtual returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, value); _transfer(from, to, value); return true; } /** * @dev Moves a `value` amount of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * NOTE: This function is not virtual, {_update} should be overridden instead. */ function _transfer(address from, address to, uint256 value) internal { if (from == address(0)) { revert ERC20InvalidSender(address(0)); } if (to == address(0)) { revert ERC20InvalidReceiver(address(0)); } _update(from, to, value); } /** * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from` * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding * this function. * * Emits a {Transfer} event. */ function _update(address from, address to, uint256 value) internal virtual { if (from == address(0)) { // Overflow check required: The rest of the code assumes that totalSupply never overflows _totalSupply += value; } else { uint256 fromBalance = _balances[from]; if (fromBalance < value) { revert ERC20InsufficientBalance(from, fromBalance, value); } unchecked { // Overflow not possible: value <= fromBalance <= totalSupply. _balances[from] = fromBalance - value; } } if (to == address(0)) { unchecked { // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply. _totalSupply -= value; } } else { unchecked { // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256. _balances[to] += value; } } emit Transfer(from, to, value); } /** * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0). * Relies on the `_update` mechanism * * Emits a {Transfer} event with `from` set to the zero address. * * NOTE: This function is not virtual, {_update} should be overridden instead. */ function _mint(address account, uint256 value) internal { if (account == address(0)) { revert ERC20InvalidReceiver(address(0)); } _update(address(0), account, value); } /** * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply. * Relies on the `_update` mechanism. * * Emits a {Transfer} event with `to` set to the zero address. * * NOTE: This function is not virtual, {_update} should be overridden instead */ function _burn(address account, uint256 value) internal { if (account == address(0)) { revert ERC20InvalidSender(address(0)); } _update(account, address(0), value); } /** * @dev Sets `value` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. * * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument. */ function _approve(address owner, address spender, uint256 value) internal { _approve(owner, spender, value, true); } /** * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event. * * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any * `Approval` event during `transferFrom` operations. * * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to * true using the following override: * ``` * function _approve(address owner, address spender, uint256 value, bool) internal virtual override { * super._approve(owner, spender, value, true); * } * ``` * * Requirements are the same as {_approve}. */ function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual { if (owner == address(0)) { revert ERC20InvalidApprover(address(0)); } if (spender == address(0)) { revert ERC20InvalidSpender(address(0)); } _allowances[owner][spender] = value; if (emitEvent) { emit Approval(owner, spender, value); } } /** * @dev Updates `owner` s allowance for `spender` based on spent `value`. * * Does not update the allowance value in case of infinite allowance. * Revert if not enough allowance is available. * * Does not emit an {Approval} event. */ function _spendAllowance(address owner, address spender, uint256 value) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { if (currentAllowance < value) { revert ERC20InsufficientAllowance(spender, currentAllowance, value); } unchecked { _approve(owner, spender, currentAllowance - value, false); } } } } // src/dex/ichiSwapXAdapter.sol contract IchiSwapXCLPAdapter is IAdapter, Ownable2Step { using SafeERC20 for IERC20; // === Security constructor() Ownable(msg.sender) {} address public AMO; modifier onlyAMO() { require(msg.sender == AMO, "Not AMO"); _; } uint256 public constant ONE = 1e18; uint256 public buySlippage = (1e18 * 997) / 1000; // 0.3% uint256 public sellSlippage = (1e18 * 997) / 1000; // 0.3% function configSecurity( uint256 _buySlippage, uint256 _sellSlippage ) external onlyOwner { buySlippage = _buySlippage; sellSlippage = _sellSlippage; } // === ICHI/SwapX Adapter === address public pegCoin; address public stableCoin; bool pegIsZero; // if true, pegCoin is token0 of the pair bool allowPeg; // if true, allow pegCoin to be added; else allow stableCoin to be added uint256 decimalDiff; address public pool; address public vault; address public gauge; address public router; address public rewardToken; // @audit: one-shot address configuration bool _addressConfiged; function configAddress( address _AMO, address _pegCoin, address _stableCoin, bool _allowPeg, address _pool, address _vault, address _gauge, address _router, address _rewardToken ) external onlyOwner { // @audit: one-shot address configuration require(!_addressConfiged, "Address already configured"); _addressConfiged = true; AMO = _AMO; pegCoin = _pegCoin; stableCoin = _stableCoin; allowPeg = _allowPeg; pool = _pool; vault = _vault; gauge = _gauge; router = _router; rewardToken = _rewardToken; address token0 = IichiSwapXPool(pool).token0(); address token1 = IichiSwapXPool(pool).token1(); if (token0 == pegCoin) { pegIsZero = true; require(token1 == stableCoin, "Invalid Pair"); } else if (token1 == pegCoin) { pegIsZero = false; require(token0 == stableCoin, "Invalid Pair"); } else { revert("Invalid Pair"); } uint8 decimalsPeg = ERC20(pegCoin).decimals(); uint8 decimalsStable = ERC20(stableCoin).decimals(); decimalDiff = 10 ** (decimalsPeg - decimalsStable); } function _setAllowanceToZero(address token, address spender) internal { uint256 allowance = IERC20(token).allowance(address(this), spender); if (allowance > 0) { IERC20(token).safeDecreaseAllowance(spender, allowance); } } function _transferTokenTo(address token, address recipient) internal { uint balance = IERC20(token).balanceOf(address(this)); if (balance > 0) IERC20(token).safeTransfer(recipient, balance); } function _transferPegAndStableToAMO() internal { _transferTokenTo(pegCoin, AMO); _transferTokenTo(stableCoin, AMO); } int24 public tickLower; int24 public tickUpper; function configTickParams(int24 _tickLower, int24 _tickUpper) external onlyOwner { tickLower = _tickLower; tickUpper = _tickUpper; } modifier onlyCalm() { (,int24 tick,,,,) = IichiSwapXPool(pool).globalState(); require(tick >= tickLower && tick <= tickUpper, "Not in the tick"); _; } // Add liquidity to the ichi vault function addLiquidity(uint256 _amountPeg, uint256 _amountStable, uint256 _minAmountLP) external override onlyAMO onlyCalm { // 0 - input validation // Note: only add one side of the pair is allowed bool _allowPeg = allowPeg; bool _pegIsZero = pegIsZero; if (allowPeg) { require(_amountStable == 0, "Only one side of the pair is allowed"); require(IERC20(pegCoin).balanceOf(address(this)) >= _amountPeg, "No Enough PegCoin"); } else { require(_amountPeg == 0, "Only one side of the pair is allowed"); require(IERC20(stableCoin).balanceOf(address(this)) >= _amountStable, "No Enough StableCoin"); } // 2 - deposit into ICHI vault uint amount0; uint amount1; if (_pegIsZero) { if (_allowPeg) { amount0 = _amountPeg; amount1 = 0; } else { amount0 = 0; amount1 = _amountStable; } } else { if (_allowPeg) { amount0 = 0; amount1 = _amountPeg; } else { amount0 = _amountStable; amount1 = 0; } } uint balOfLPBefore = IERC20(vault).balanceOf(address(this)); if (_allowPeg) { IERC20(pegCoin).safeIncreaseAllowance(vault, _amountPeg); } else { IERC20(stableCoin).safeIncreaseAllowance(vault, _amountStable); } IichiVault(vault).deposit(amount0, amount1, address(this)); uint balOfLPAfter = IERC20(vault).balanceOf(address(this)); uint amountLP = balOfLPAfter - balOfLPBefore; require(amountLP >= _minAmountLP, "AMO: Insufficient LP"); // stake into gauge IERC20(vault).safeIncreaseAllowance(gauge, balOfLPAfter); ISwapXGauge(gauge).deposit(balOfLPAfter); _transferPegAndStableToAMO(); // @audit: decrease allowance for the router _setAllowanceToZero(stableCoin, vault); _setAllowanceToZero(pegCoin, vault); _setAllowanceToZero(vault, gauge); } // We do not need to check slippage when redeeming. function removeLiquidity(uint256 _amountLP, uint256 _minPeg, uint256 _minStable) external override onlyAMO { require(_amountLP > 0, "Invalid Amounts"); _redeemLiquidity(_amountLP, _minPeg, _minStable); _transferPegAndStableToAMO(); } function _redeemLiquidity(uint256 _amountLP, uint256, uint256) internal { // step - 1: check LP (liquidity) balance require(balanceLP() >= _amountLP, "AMO: Insufficient LP"); // step - 2: withdraw vault token from gauge ISwapXGauge(gauge).withdraw(_amountLP); // step - 3: remove liquidity IichiVault(vault).withdraw(_amountLP, AMO); // @note: token balance slippage is checked in the AMO } function buyPegCoin(uint256 amountStable, uint256 minAmountPeg) external override onlyAMO { // step - 0: input validation require(amountStable > 0, "Invalid Amounts"); require(minAmountPeg >= amountStable * decimalDiff * buySlippage / ONE, "Invalid Min Amount"); require(IERC20(stableCoin).balanceOf(address(this)) >= amountStable, "No Enough StableCoin"); // step - 1: approve IERC20(stableCoin).safeIncreaseAllowance(router, amountStable); // step - 2: swap ISwapRouterCLP.ExactInputSingleParams memory params = ISwapRouterCLP.ExactInputSingleParams({ tokenIn: stableCoin, tokenOut: pegCoin, recipient: AMO, deadline: block.timestamp, amountIn: amountStable, amountOutMinimum: minAmountPeg, limitSqrtPrice: 0 }); ISwapRouterCLP(router).exactInputSingle(params); // @audit: decrease allowance for the router _setAllowanceToZero(stableCoin, router); } function sellPegCoin(uint256 amountPeg, uint256 minAmounStable) external override onlyAMO { // step - 0: input validation require(amountPeg > 0, "Invalid Amounts"); require(minAmounStable * decimalDiff >= amountPeg * sellSlippage / ONE, "Invalid Min Amount"); require(IERC20(pegCoin).balanceOf(address(this)) >= amountPeg, "Not Enough PegCoin"); // step - 1: approve IERC20(pegCoin).safeIncreaseAllowance(router, amountPeg); // step - 2: swap ISwapRouterCLP.ExactInputSingleParams memory params = ISwapRouterCLP.ExactInputSingleParams({ tokenIn: pegCoin, tokenOut: stableCoin, recipient: AMO, deadline: block.timestamp, amountIn: amountPeg, amountOutMinimum: minAmounStable, limitSqrtPrice: 0 }); ISwapRouterCLP(router).exactInputSingle(params); // @audit: decrease allowance for the router _setAllowanceToZero(pegCoin, router); } function getReward(address profitManager) external override onlyAMO { ISwapXGauge(gauge).getReward(); _transferTokenTo(rewardToken, profitManager); } // == GOVERNANCE == function withdrawERC20ToAMO(address token, uint256 amount) external override { require(msg.sender == AMO || msg.sender == owner(), "Not AMO or owner"); uint balance = IERC20(token).balanceOf(address(this)); if (balance >= amount) { IERC20(token).safeTransfer(AMO, amount); } else { IERC20(token).safeTransfer(AMO, balance); } } function withdrawEtherToAMO(uint256 amount) external override { require(msg.sender == AMO || msg.sender == owner(), "Not AMO or owner"); payable(AMO).transfer(amount); } function withdrawAllToAMO() external override onlyOwner { _redeemLiquidity(balanceLP(), 0, 0); _transferPegAndStableToAMO(); } // This function can only be called by the multi sig owner in emergency. // It is to avoid using proxy contract and in case any assets are stuck in the contract. function rescue(address target, uint256 value, bytes calldata data) external onlyOwner { (bool success,) = target.call{value: value}(data); require(success, "Rescue: Call failed"); } // === VIEW FUNCTIONS === function balanceLP() public view override returns (uint256) { return IERC20(vault).balanceOf(address(this)) + IERC20(gauge).balanceOf(address(this)); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"currentAllowance","type":"uint256"},{"internalType":"uint256","name":"requestedDecrease","type":"uint256"}],"name":"SafeERC20FailedDecreaseAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"AMO","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ONE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountPeg","type":"uint256"},{"internalType":"uint256","name":"_amountStable","type":"uint256"},{"internalType":"uint256","name":"_minAmountLP","type":"uint256"}],"name":"addLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"balanceLP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountStable","type":"uint256"},{"internalType":"uint256","name":"minAmountPeg","type":"uint256"}],"name":"buyPegCoin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buySlippage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_AMO","type":"address"},{"internalType":"address","name":"_pegCoin","type":"address"},{"internalType":"address","name":"_stableCoin","type":"address"},{"internalType":"bool","name":"_allowPeg","type":"bool"},{"internalType":"address","name":"_pool","type":"address"},{"internalType":"address","name":"_vault","type":"address"},{"internalType":"address","name":"_gauge","type":"address"},{"internalType":"address","name":"_router","type":"address"},{"internalType":"address","name":"_rewardToken","type":"address"}],"name":"configAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buySlippage","type":"uint256"},{"internalType":"uint256","name":"_sellSlippage","type":"uint256"}],"name":"configSecurity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"int24","name":"_tickLower","type":"int24"},{"internalType":"int24","name":"_tickUpper","type":"int24"}],"name":"configTickParams","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gauge","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"profitManager","type":"address"}],"name":"getReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pegCoin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountLP","type":"uint256"},{"internalType":"uint256","name":"_minPeg","type":"uint256"},{"internalType":"uint256","name":"_minStable","type":"uint256"}],"name":"removeLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"rescue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountPeg","type":"uint256"},{"internalType":"uint256","name":"minAmounStable","type":"uint256"}],"name":"sellPegCoin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellSlippage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stableCoin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tickLower","outputs":[{"internalType":"int24","name":"","type":"int24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tickUpper","outputs":[{"internalType":"int24","name":"","type":"int24"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawAllToAMO","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawERC20ToAMO","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawEtherToAMO","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052670dd60e37b9108000600355670dd60e37b91080006004553480156026575f5ffd5b503380604b57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6052816057565b5060c0565b600180546001600160a01b0319169055606e816071565b50565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6128db806100cd5f395ff3fe608060405234801561000f575f5ffd5b50600436106101dc575f3560e01c8063857620e111610109578063dd4010521161009e578063f2fde38b1161006e578063f2fde38b146103da578063f7c618c1146103ed578063f887ea4014610400578063fbfa77cf14610413575f5ffd5b8063dd40105214610390578063de7f9602146103a3578063e28302ae146103b6578063e30c3978146103c9575f5ffd5b8063a8ee96b4116100d9578063a8ee96b414610348578063bc9faa3d1461035b578063c00007b01461036e578063c2ee3a0814610381575f5ffd5b8063857620e1146102ff5780638da5cb5b14610312578063992642e514610322578063a6f19c8414610335575f5ffd5b8063422f10431161017f578063715018a61161014f578063715018a6146102d357806379ba5097146102db578063826c75f4146102e35780638401232e146102f6575f5ffd5b8063422f10431461027257806355b812a81461028557806359c4f905146102ac5780635fa6c0b9146102c0575f5ffd5b806316f0115b116101ba57806316f0115b14610224578063327da6171461024f5780633386600c146102625780633fd594651461026a575f5ffd5b80630b07140e146101e057806312760556146101f557806312f6e13914610208575b5f5ffd5b6101f36101ee3660046123a5565b610426565b005b6101f36102033660046123dd565b6104d4565b61021160045481565b6040519081526020015b60405180910390f35b600854610237906001600160a01b031681565b6040516001600160a01b03909116815260200161021b565b6101f361025d366004612493565b61094c565b6101f3610c25565b610211610c49565b6101f36102803660046124b3565b610d2c565b600c5461029990600160c01b900460020b81565b60405160029190910b815260200161021b565b600c5461029990600160a81b900460020b81565b6101f36102ce3660046124dc565b6113eb565b6101f36114a6565b6101f36114b7565b6101f36102f1366004612561565b6114fb565b61021160035481565b6101f361030d3660046124b3565b61160e565b5f546001600160a01b0316610237565b600654610237906001600160a01b031681565b600a54610237906001600160a01b031681565b6101f3610356366004612493565b6116a6565b600254610237906001600160a01b031681565b6101f361037c36600461258b565b61197b565b610211670de0b6b3a764000081565b6101f361039e3660046125b4565b611a38565b600554610237906001600160a01b031681565b6101f36103c4366004612493565b611aab565b6001546001600160a01b0316610237565b6101f36103e836600461258b565b611abe565b600c54610237906001600160a01b031681565b600b54610237906001600160a01b031681565b600954610237906001600160a01b031681565b6002546001600160a01b031633148061044857505f546001600160a01b031633145b6104995760405162461bcd60e51b815260206004820152601060248201527f4e6f7420414d4f206f72206f776e65720000000000000000000000000000000060448201526064015b60405180910390fd5b6002546040516001600160a01b039091169082156108fc029083905f818181858888f193505050501580156104d0573d5f5f3e3d5ffd5b5050565b6104dc611b3b565b600c54600160a01b900460ff16156105365760405162461bcd60e51b815260206004820152601a60248201527f4164647265737320616c726561647920636f6e666967757265640000000000006044820152606401610490565b600c8054600280546001600160a01b03808e1673ffffffffffffffffffffffffffffffffffffffff1992831617909255600580548d8416908316179055600680548b1515600160a81b027fffffffffffffffffffff00ff00000000000000000000000000000000000000009091168d851617179055600880548a84169083168117909155600980548a8516908416179055600a8054898516908416179055600b80548885169316929092179091559084167fffffffffffffffffffffff00000000000000000000000000000000000000000090921691909117600160a01b17909155604080517f0dfe168100000000000000000000000000000000000000000000000000000000815290515f9291630dfe16819160048281019260209291908290030181865afa15801561066c573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061069091906125eb565b90505f60085f9054906101000a90046001600160a01b03166001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106e3573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061070791906125eb565b6005549091506001600160a01b0390811690831603610783576006805460ff60a01b198116600160a01b179091556001600160a01b0382811691161461077e5760405162461bcd60e51b815260206004820152600c60248201526b24b73b30b634b2102830b4b960a11b6044820152606401610490565b610828565b6005546001600160a01b03908116908216036107f1576006805460ff60a01b1981169091556001600160a01b0383811691161461077e5760405162461bcd60e51b815260206004820152600c60248201526b24b73b30b634b2102830b4b960a11b6044820152606401610490565b60405162461bcd60e51b815260206004820152600c60248201526b24b73b30b634b2102830b4b960a11b6044820152606401610490565b600554604080517f313ce56700000000000000000000000000000000000000000000000000000000815290515f926001600160a01b03169163313ce5679160048083019260209291908290030181865afa158015610888573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108ac919061261b565b90505f60065f9054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108ff573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610923919061261b565b905061092f8183612648565b61093a90600a612744565b60075550505050505050505050505050565b6002546001600160a01b031633146109905760405162461bcd60e51b81526020600482015260076024820152664e6f7420414d4f60c81b6044820152606401610490565b5f82116109d15760405162461bcd60e51b815260206004820152600f60248201526e496e76616c696420416d6f756e747360881b6044820152606401610490565b670de0b6b3a7640000600454836109e89190612752565b6109f29190612769565b6007546109ff9083612752565b1015610a4d5760405162461bcd60e51b815260206004820152601260248201527f496e76616c6964204d696e20416d6f756e7400000000000000000000000000006044820152606401610490565b6005546040516370a0823160e01b815230600482015283916001600160a01b0316906370a0823190602401602060405180830381865afa158015610a93573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ab79190612788565b1015610b055760405162461bcd60e51b815260206004820152601260248201527f4e6f7420456e6f75676820506567436f696e00000000000000000000000000006044820152606401610490565b600b54600554610b22916001600160a01b03918216911684611b67565b6040805160e0810182526005546001600160a01b039081168252600654811660208301908152600254821683850190815242606085019081526080850188815260a086018881525f60c08801908152600b54985163178ca23160e31b8152885188166004820152955187166024870152935186166044860152915160648501525160848401525160a483015251821660c48201529192169063bc6511889060e4016020604051808303815f875af1158015610bdf573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c039190612788565b50600554600b54610c20916001600160a01b039081169116611bf4565b505050565b610c2d611b3b565b610c3f610c38610c49565b5f5f611c81565b610c47611dc9565b565b600a546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015610c8f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cb39190612788565b6009546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610cf9573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d1d9190612788565b610d27919061279f565b905090565b6002546001600160a01b03163314610d705760405162461bcd60e51b81526020600482015260076024820152664e6f7420414d4f60c81b6044820152606401610490565b600854604080517fe76c01e400000000000000000000000000000000000000000000000000000000815290515f926001600160a01b03169163e76c01e49160048083019260c09291908290030181865afa158015610dd0573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610df491906127c3565b5050600c549294505050600160a81b9004600290810b9083900b1280159150610e2e5750600c54600160c01b9004600290810b9082900b13155b610e7a5760405162461bcd60e51b815260206004820152600f60248201527f4e6f7420696e20746865207469636b00000000000000000000000000000000006044820152606401610490565b60065460ff600160a81b8204811691600160a01b9004168115610fae578415610ef15760405162461bcd60e51b8152602060048201526024808201527f4f6e6c79206f6e652073696465206f6620746865207061697220697320616c6c6044820152631bddd95960e21b6064820152608401610490565b6005546040516370a0823160e01b815230600482015287916001600160a01b0316906370a0823190602401602060405180830381865afa158015610f37573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f5b9190612788565b1015610fa95760405162461bcd60e51b815260206004820152601160248201527f4e6f20456e6f75676820506567436f696e0000000000000000000000000000006044820152606401610490565b6110c0565b85156110085760405162461bcd60e51b8152602060048201526024808201527f4f6e6c79206f6e652073696465206f6620746865207061697220697320616c6c6044820152631bddd95960e21b6064820152608401610490565b6006546040516370a0823160e01b815230600482015286916001600160a01b0316906370a0823190602401602060405180830381865afa15801561104e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110729190612788565b10156110c05760405162461bcd60e51b815260206004820152601460248201527f4e6f20456e6f75676820537461626c65436f696e0000000000000000000000006044820152606401610490565b5f5f82156110e25783156110d857508690505f6110f8565b505f9050856110f8565b83156110f257505f9050866110f8565b508590505f5b6009546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa15801561113e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111629190612788565b9050841561118c57600954600554611187916001600160a01b0391821691168b611b67565b6111a9565b6009546006546111a9916001600160a01b0391821691168a611b67565b6009546040517f8dbdbe6d00000000000000000000000000000000000000000000000000000000815260048101859052602481018490523060448201526001600160a01b0390911690638dbdbe6d906064015f604051808303815f87803b158015611212575f5ffd5b505af1158015611224573d5f5f3e3d5ffd5b50506009546040516370a0823160e01b81523060048201525f93506001600160a01b0390911691506370a0823190602401602060405180830381865afa158015611270573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112949190612788565b90505f6112a1838361283c565b9050888110156112f35760405162461bcd60e51b815260206004820152601460248201527f414d4f3a20496e73756666696369656e74204c500000000000000000000000006044820152606401610490565b600a54600954611310916001600160a01b03918216911684611b67565b600a546040517fb6b55f25000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b039091169063b6b55f25906024015f604051808303815f87803b15801561136c575f5ffd5b505af115801561137e573d5f5f3e3d5ffd5b5050505061138a611dc9565b6006546009546113a6916001600160a01b039081169116611bf4565b6005546009546113c2916001600160a01b039081169116611bf4565b600954600a546113de916001600160a01b039081169116611bf4565b5050505050505050505050565b6113f3611b3b565b5f846001600160a01b031684848460405161140f92919061284f565b5f6040518083038185875af1925050503d805f8114611449576040519150601f19603f3d011682016040523d82523d5f602084013e61144e565b606091505b505090508061149f5760405162461bcd60e51b815260206004820152601360248201527f5265736375653a2043616c6c206661696c6564000000000000000000000000006044820152606401610490565b5050505050565b6114ae611b3b565b610c475f611e01565b60015433906001600160a01b031681146114ef5760405163118cdaa760e01b81526001600160a01b0382166004820152602401610490565b6114f881611e01565b50565b6002546001600160a01b031633148061151d57505f546001600160a01b031633145b6115695760405162461bcd60e51b815260206004820152601060248201527f4e6f7420414d4f206f72206f776e6572000000000000000000000000000000006044820152606401610490565b6040516370a0823160e01b81523060048201525f906001600160a01b038416906370a0823190602401602060405180830381865afa1580156115ad573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115d19190612788565b90508181106115f457600254610c20906001600160a01b03858116911684611e27565b600254610c20906001600160a01b03858116911683611e27565b6002546001600160a01b031633146116525760405162461bcd60e51b81526020600482015260076024820152664e6f7420414d4f60c81b6044820152606401610490565b5f83116116935760405162461bcd60e51b815260206004820152600f60248201526e496e76616c696420416d6f756e747360881b6044820152606401610490565b61169e838383611c81565b610c20611dc9565b6002546001600160a01b031633146116ea5760405162461bcd60e51b81526020600482015260076024820152664e6f7420414d4f60c81b6044820152606401610490565b5f821161172b5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c696420416d6f756e747360881b6044820152606401610490565b670de0b6b3a7640000600354600754846117459190612752565b61174f9190612752565b6117599190612769565b8110156117a85760405162461bcd60e51b815260206004820152601260248201527f496e76616c6964204d696e20416d6f756e7400000000000000000000000000006044820152606401610490565b6006546040516370a0823160e01b815230600482015283916001600160a01b0316906370a0823190602401602060405180830381865afa1580156117ee573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118129190612788565b10156118605760405162461bcd60e51b815260206004820152601460248201527f4e6f20456e6f75676820537461626c65436f696e0000000000000000000000006044820152606401610490565b600b5460065461187d916001600160a01b03918216911684611b67565b6040805160e0810182526006546001600160a01b039081168252600554811660208301908152600254821683850190815242606085019081526080850188815260a086018881525f60c08801908152600b54985163178ca23160e31b8152885188166004820152955187166024870152935186166044860152915160648501525160848401525160a483015251821660c48201529192169063bc6511889060e4016020604051808303815f875af115801561193a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061195e9190612788565b50600654600b54610c20916001600160a01b039081169116611bf4565b6002546001600160a01b031633146119bf5760405162461bcd60e51b81526020600482015260076024820152664e6f7420414d4f60c81b6044820152606401610490565b600a5f9054906101000a90046001600160a01b03166001600160a01b0316633d18b9126040518163ffffffff1660e01b81526004015f604051808303815f87803b158015611a0b575f5ffd5b505af1158015611a1d573d5f5f3e3d5ffd5b5050600c546114f892506001600160a01b0316905082611e9b565b611a40611b3b565b600c80547fffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff16600160a81b62ffffff948516027fffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff1617600160c01b9290931691909102919091179055565b611ab3611b3b565b600391909155600455565b611ac6611b3b565b600180546001600160a01b03831673ffffffffffffffffffffffffffffffffffffffff199091168117909155611b035f546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b5f546001600160a01b03163314610c475760405163118cdaa760e01b8152336004820152602401610490565b604051636eb1769f60e11b81523060048201526001600160a01b0383811660248301525f919085169063dd62ed3e90604401602060405180830381865afa158015611bb4573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bd89190612788565b9050611bee8484611be9858561279f565b611f1f565b50505050565b604051636eb1769f60e11b81523060048201526001600160a01b0382811660248301525f919084169063dd62ed3e90604401602060405180830381865afa158015611c41573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c659190612788565b90508015610c2057610c206001600160a01b0384168383611fdc565b82611c8a610c49565b1015611cd85760405162461bcd60e51b815260206004820152601460248201527f414d4f3a20496e73756666696369656e74204c500000000000000000000000006044820152606401610490565b600a546040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018590526001600160a01b0390911690632e1a7d4d906024015f604051808303815f87803b158015611d34575f5ffd5b505af1158015611d46573d5f5f3e3d5ffd5b50506009546002546040517ef714ce000000000000000000000000000000000000000000000000000000008152600481018890526001600160a01b0391821660248201529116925062f714ce91506044015f604051808303815f87803b158015611dae575f5ffd5b505af1158015611dc0573d5f5f3e3d5ffd5b50505050505050565b600554600254611de5916001600160a01b039081169116611e9b565b600654600254610c47916001600160a01b039081169116611e9b565b6001805473ffffffffffffffffffffffffffffffffffffffff191690556114f8816120af565b6040516001600160a01b03838116602483015260448201839052610c2091859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061210b565b6040516370a0823160e01b81523060048201525f906001600160a01b038416906370a0823190602401602060405180830381865afa158015611edf573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f039190612788565b90508015610c2057610c206001600160a01b0384168383611e27565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b300000000000000000000000000000000000000000000000000000000179052611f9e8482612185565b611bee576040516001600160a01b0384811660248301525f6044830152611fd291869182169063095ea7b390606401611e54565b611bee848261210b565b604051636eb1769f60e11b81523060048201526001600160a01b0383811660248301525f919085169063dd62ed3e90604401602060405180830381865afa158015612029573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061204d9190612788565b9050818110156120a2576040517fe570110f0000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201526024810182905260448101839052606401610490565b611bee8484848403611f1f565b5f80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f61211f6001600160a01b03841683612228565b905080515f14158015612143575080806020019051810190612141919061285e565b155b15610c20576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0384166004820152602401610490565b5f5f5f846001600160a01b0316846040516121a09190612879565b5f604051808303815f865af19150503d805f81146121d9576040519150601f19603f3d011682016040523d82523d5f602084013e6121de565b606091505b5091509150818015612208575080511580612208575080806020019051810190612208919061285e565b801561221d57505f856001600160a01b03163b115b925050505b92915050565b606061223583835f61223c565b9392505050565b60608147101561227a576040517fcd786059000000000000000000000000000000000000000000000000000000008152306004820152602401610490565b5f5f856001600160a01b031684866040516122959190612879565b5f6040518083038185875af1925050503d805f81146122cf576040519150601f19603f3d011682016040523d82523d5f602084013e6122d4565b606091505b50915091506122e48683836122ee565b9695505050505050565b606082612303576122fe82612363565b612235565b815115801561231a57506001600160a01b0384163b155b1561235c576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610490565b5080612235565b8051156123735780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f602082840312156123b5575f5ffd5b5035919050565b6001600160a01b03811681146114f8575f5ffd5b80151581146114f8575f5ffd5b5f5f5f5f5f5f5f5f5f6101208a8c0312156123f6575f5ffd5b8935612401816123bc565b985060208a0135612411816123bc565b975060408a0135612421816123bc565b965060608a0135612431816123d0565b955060808a0135612441816123bc565b945060a08a0135612451816123bc565b935060c08a0135612461816123bc565b925060e08a0135612471816123bc565b91506101008a0135612482816123bc565b809150509295985092959850929598565b5f5f604083850312156124a4575f5ffd5b50508035926020909101359150565b5f5f5f606084860312156124c5575f5ffd5b505081359360208301359350604090920135919050565b5f5f5f5f606085870312156124ef575f5ffd5b84356124fa816123bc565b935060208501359250604085013567ffffffffffffffff81111561251c575f5ffd5b8501601f8101871361252c575f5ffd5b803567ffffffffffffffff811115612542575f5ffd5b876020828401011115612553575f5ffd5b949793965060200194505050565b5f5f60408385031215612572575f5ffd5b823561257d816123bc565b946020939093013593505050565b5f6020828403121561259b575f5ffd5b8135612235816123bc565b8060020b81146114f8575f5ffd5b5f5f604083850312156125c5575f5ffd5b82356125d0816125a6565b915060208301356125e0816125a6565b809150509250929050565b5f602082840312156125fb575f5ffd5b8151612235816123bc565b805160ff81168114612616575f5ffd5b919050565b5f6020828403121561262b575f5ffd5b61223582612606565b634e487b7160e01b5f52601160045260245ffd5b60ff828116828216039081111561222257612222612634565b6001815b600184111561269c5780850481111561268057612680612634565b600184161561268e57908102905b60019390931c928002612665565b935093915050565b5f826126b257506001612222565b816126be57505f612222565b81600181146126d457600281146126de576126fa565b6001915050612222565b60ff8411156126ef576126ef612634565b50506001821b612222565b5060208310610133831016604e8410600b841016171561271d575081810a612222565b6127295f198484612661565b805f190482111561273c5761273c612634565b029392505050565b5f61223560ff8416836126a4565b808202811582820484141761222257612222612634565b5f8261278357634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215612798575f5ffd5b5051919050565b8082018082111561222257612222612634565b805161ffff81168114612616575f5ffd5b5f5f5f5f5f5f60c087890312156127d8575f5ffd5b86516127e3816123bc565b60208801519096506127f4816125a6565b9450612802604088016127b2565b935061281060608801612606565b925061281e608088016127b2565b915060a087015161282e816123d0565b809150509295509295509295565b8181038181111561222257612222612634565b818382375f9101908152919050565b5f6020828403121561286e575f5ffd5b8151612235816123d0565b5f82515f5b81811015612898576020818601810151858301520161287e565b505f92019182525091905056fea264697066735822122061ac35910c61215ed601f0d5cb4c5267724d64183c23aabe54ad3db4c4895a5f64736f6c634300081b0033
Deployed Bytecode
0x608060405234801561000f575f5ffd5b50600436106101dc575f3560e01c8063857620e111610109578063dd4010521161009e578063f2fde38b1161006e578063f2fde38b146103da578063f7c618c1146103ed578063f887ea4014610400578063fbfa77cf14610413575f5ffd5b8063dd40105214610390578063de7f9602146103a3578063e28302ae146103b6578063e30c3978146103c9575f5ffd5b8063a8ee96b4116100d9578063a8ee96b414610348578063bc9faa3d1461035b578063c00007b01461036e578063c2ee3a0814610381575f5ffd5b8063857620e1146102ff5780638da5cb5b14610312578063992642e514610322578063a6f19c8414610335575f5ffd5b8063422f10431161017f578063715018a61161014f578063715018a6146102d357806379ba5097146102db578063826c75f4146102e35780638401232e146102f6575f5ffd5b8063422f10431461027257806355b812a81461028557806359c4f905146102ac5780635fa6c0b9146102c0575f5ffd5b806316f0115b116101ba57806316f0115b14610224578063327da6171461024f5780633386600c146102625780633fd594651461026a575f5ffd5b80630b07140e146101e057806312760556146101f557806312f6e13914610208575b5f5ffd5b6101f36101ee3660046123a5565b610426565b005b6101f36102033660046123dd565b6104d4565b61021160045481565b6040519081526020015b60405180910390f35b600854610237906001600160a01b031681565b6040516001600160a01b03909116815260200161021b565b6101f361025d366004612493565b61094c565b6101f3610c25565b610211610c49565b6101f36102803660046124b3565b610d2c565b600c5461029990600160c01b900460020b81565b60405160029190910b815260200161021b565b600c5461029990600160a81b900460020b81565b6101f36102ce3660046124dc565b6113eb565b6101f36114a6565b6101f36114b7565b6101f36102f1366004612561565b6114fb565b61021160035481565b6101f361030d3660046124b3565b61160e565b5f546001600160a01b0316610237565b600654610237906001600160a01b031681565b600a54610237906001600160a01b031681565b6101f3610356366004612493565b6116a6565b600254610237906001600160a01b031681565b6101f361037c36600461258b565b61197b565b610211670de0b6b3a764000081565b6101f361039e3660046125b4565b611a38565b600554610237906001600160a01b031681565b6101f36103c4366004612493565b611aab565b6001546001600160a01b0316610237565b6101f36103e836600461258b565b611abe565b600c54610237906001600160a01b031681565b600b54610237906001600160a01b031681565b600954610237906001600160a01b031681565b6002546001600160a01b031633148061044857505f546001600160a01b031633145b6104995760405162461bcd60e51b815260206004820152601060248201527f4e6f7420414d4f206f72206f776e65720000000000000000000000000000000060448201526064015b60405180910390fd5b6002546040516001600160a01b039091169082156108fc029083905f818181858888f193505050501580156104d0573d5f5f3e3d5ffd5b5050565b6104dc611b3b565b600c54600160a01b900460ff16156105365760405162461bcd60e51b815260206004820152601a60248201527f4164647265737320616c726561647920636f6e666967757265640000000000006044820152606401610490565b600c8054600280546001600160a01b03808e1673ffffffffffffffffffffffffffffffffffffffff1992831617909255600580548d8416908316179055600680548b1515600160a81b027fffffffffffffffffffff00ff00000000000000000000000000000000000000009091168d851617179055600880548a84169083168117909155600980548a8516908416179055600a8054898516908416179055600b80548885169316929092179091559084167fffffffffffffffffffffff00000000000000000000000000000000000000000090921691909117600160a01b17909155604080517f0dfe168100000000000000000000000000000000000000000000000000000000815290515f9291630dfe16819160048281019260209291908290030181865afa15801561066c573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061069091906125eb565b90505f60085f9054906101000a90046001600160a01b03166001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106e3573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061070791906125eb565b6005549091506001600160a01b0390811690831603610783576006805460ff60a01b198116600160a01b179091556001600160a01b0382811691161461077e5760405162461bcd60e51b815260206004820152600c60248201526b24b73b30b634b2102830b4b960a11b6044820152606401610490565b610828565b6005546001600160a01b03908116908216036107f1576006805460ff60a01b1981169091556001600160a01b0383811691161461077e5760405162461bcd60e51b815260206004820152600c60248201526b24b73b30b634b2102830b4b960a11b6044820152606401610490565b60405162461bcd60e51b815260206004820152600c60248201526b24b73b30b634b2102830b4b960a11b6044820152606401610490565b600554604080517f313ce56700000000000000000000000000000000000000000000000000000000815290515f926001600160a01b03169163313ce5679160048083019260209291908290030181865afa158015610888573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108ac919061261b565b90505f60065f9054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108ff573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610923919061261b565b905061092f8183612648565b61093a90600a612744565b60075550505050505050505050505050565b6002546001600160a01b031633146109905760405162461bcd60e51b81526020600482015260076024820152664e6f7420414d4f60c81b6044820152606401610490565b5f82116109d15760405162461bcd60e51b815260206004820152600f60248201526e496e76616c696420416d6f756e747360881b6044820152606401610490565b670de0b6b3a7640000600454836109e89190612752565b6109f29190612769565b6007546109ff9083612752565b1015610a4d5760405162461bcd60e51b815260206004820152601260248201527f496e76616c6964204d696e20416d6f756e7400000000000000000000000000006044820152606401610490565b6005546040516370a0823160e01b815230600482015283916001600160a01b0316906370a0823190602401602060405180830381865afa158015610a93573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ab79190612788565b1015610b055760405162461bcd60e51b815260206004820152601260248201527f4e6f7420456e6f75676820506567436f696e00000000000000000000000000006044820152606401610490565b600b54600554610b22916001600160a01b03918216911684611b67565b6040805160e0810182526005546001600160a01b039081168252600654811660208301908152600254821683850190815242606085019081526080850188815260a086018881525f60c08801908152600b54985163178ca23160e31b8152885188166004820152955187166024870152935186166044860152915160648501525160848401525160a483015251821660c48201529192169063bc6511889060e4016020604051808303815f875af1158015610bdf573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c039190612788565b50600554600b54610c20916001600160a01b039081169116611bf4565b505050565b610c2d611b3b565b610c3f610c38610c49565b5f5f611c81565b610c47611dc9565b565b600a546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015610c8f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cb39190612788565b6009546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610cf9573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d1d9190612788565b610d27919061279f565b905090565b6002546001600160a01b03163314610d705760405162461bcd60e51b81526020600482015260076024820152664e6f7420414d4f60c81b6044820152606401610490565b600854604080517fe76c01e400000000000000000000000000000000000000000000000000000000815290515f926001600160a01b03169163e76c01e49160048083019260c09291908290030181865afa158015610dd0573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610df491906127c3565b5050600c549294505050600160a81b9004600290810b9083900b1280159150610e2e5750600c54600160c01b9004600290810b9082900b13155b610e7a5760405162461bcd60e51b815260206004820152600f60248201527f4e6f7420696e20746865207469636b00000000000000000000000000000000006044820152606401610490565b60065460ff600160a81b8204811691600160a01b9004168115610fae578415610ef15760405162461bcd60e51b8152602060048201526024808201527f4f6e6c79206f6e652073696465206f6620746865207061697220697320616c6c6044820152631bddd95960e21b6064820152608401610490565b6005546040516370a0823160e01b815230600482015287916001600160a01b0316906370a0823190602401602060405180830381865afa158015610f37573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f5b9190612788565b1015610fa95760405162461bcd60e51b815260206004820152601160248201527f4e6f20456e6f75676820506567436f696e0000000000000000000000000000006044820152606401610490565b6110c0565b85156110085760405162461bcd60e51b8152602060048201526024808201527f4f6e6c79206f6e652073696465206f6620746865207061697220697320616c6c6044820152631bddd95960e21b6064820152608401610490565b6006546040516370a0823160e01b815230600482015286916001600160a01b0316906370a0823190602401602060405180830381865afa15801561104e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110729190612788565b10156110c05760405162461bcd60e51b815260206004820152601460248201527f4e6f20456e6f75676820537461626c65436f696e0000000000000000000000006044820152606401610490565b5f5f82156110e25783156110d857508690505f6110f8565b505f9050856110f8565b83156110f257505f9050866110f8565b508590505f5b6009546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa15801561113e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111629190612788565b9050841561118c57600954600554611187916001600160a01b0391821691168b611b67565b6111a9565b6009546006546111a9916001600160a01b0391821691168a611b67565b6009546040517f8dbdbe6d00000000000000000000000000000000000000000000000000000000815260048101859052602481018490523060448201526001600160a01b0390911690638dbdbe6d906064015f604051808303815f87803b158015611212575f5ffd5b505af1158015611224573d5f5f3e3d5ffd5b50506009546040516370a0823160e01b81523060048201525f93506001600160a01b0390911691506370a0823190602401602060405180830381865afa158015611270573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112949190612788565b90505f6112a1838361283c565b9050888110156112f35760405162461bcd60e51b815260206004820152601460248201527f414d4f3a20496e73756666696369656e74204c500000000000000000000000006044820152606401610490565b600a54600954611310916001600160a01b03918216911684611b67565b600a546040517fb6b55f25000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b039091169063b6b55f25906024015f604051808303815f87803b15801561136c575f5ffd5b505af115801561137e573d5f5f3e3d5ffd5b5050505061138a611dc9565b6006546009546113a6916001600160a01b039081169116611bf4565b6005546009546113c2916001600160a01b039081169116611bf4565b600954600a546113de916001600160a01b039081169116611bf4565b5050505050505050505050565b6113f3611b3b565b5f846001600160a01b031684848460405161140f92919061284f565b5f6040518083038185875af1925050503d805f8114611449576040519150601f19603f3d011682016040523d82523d5f602084013e61144e565b606091505b505090508061149f5760405162461bcd60e51b815260206004820152601360248201527f5265736375653a2043616c6c206661696c6564000000000000000000000000006044820152606401610490565b5050505050565b6114ae611b3b565b610c475f611e01565b60015433906001600160a01b031681146114ef5760405163118cdaa760e01b81526001600160a01b0382166004820152602401610490565b6114f881611e01565b50565b6002546001600160a01b031633148061151d57505f546001600160a01b031633145b6115695760405162461bcd60e51b815260206004820152601060248201527f4e6f7420414d4f206f72206f776e6572000000000000000000000000000000006044820152606401610490565b6040516370a0823160e01b81523060048201525f906001600160a01b038416906370a0823190602401602060405180830381865afa1580156115ad573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115d19190612788565b90508181106115f457600254610c20906001600160a01b03858116911684611e27565b600254610c20906001600160a01b03858116911683611e27565b6002546001600160a01b031633146116525760405162461bcd60e51b81526020600482015260076024820152664e6f7420414d4f60c81b6044820152606401610490565b5f83116116935760405162461bcd60e51b815260206004820152600f60248201526e496e76616c696420416d6f756e747360881b6044820152606401610490565b61169e838383611c81565b610c20611dc9565b6002546001600160a01b031633146116ea5760405162461bcd60e51b81526020600482015260076024820152664e6f7420414d4f60c81b6044820152606401610490565b5f821161172b5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c696420416d6f756e747360881b6044820152606401610490565b670de0b6b3a7640000600354600754846117459190612752565b61174f9190612752565b6117599190612769565b8110156117a85760405162461bcd60e51b815260206004820152601260248201527f496e76616c6964204d696e20416d6f756e7400000000000000000000000000006044820152606401610490565b6006546040516370a0823160e01b815230600482015283916001600160a01b0316906370a0823190602401602060405180830381865afa1580156117ee573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118129190612788565b10156118605760405162461bcd60e51b815260206004820152601460248201527f4e6f20456e6f75676820537461626c65436f696e0000000000000000000000006044820152606401610490565b600b5460065461187d916001600160a01b03918216911684611b67565b6040805160e0810182526006546001600160a01b039081168252600554811660208301908152600254821683850190815242606085019081526080850188815260a086018881525f60c08801908152600b54985163178ca23160e31b8152885188166004820152955187166024870152935186166044860152915160648501525160848401525160a483015251821660c48201529192169063bc6511889060e4016020604051808303815f875af115801561193a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061195e9190612788565b50600654600b54610c20916001600160a01b039081169116611bf4565b6002546001600160a01b031633146119bf5760405162461bcd60e51b81526020600482015260076024820152664e6f7420414d4f60c81b6044820152606401610490565b600a5f9054906101000a90046001600160a01b03166001600160a01b0316633d18b9126040518163ffffffff1660e01b81526004015f604051808303815f87803b158015611a0b575f5ffd5b505af1158015611a1d573d5f5f3e3d5ffd5b5050600c546114f892506001600160a01b0316905082611e9b565b611a40611b3b565b600c80547fffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff16600160a81b62ffffff948516027fffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff1617600160c01b9290931691909102919091179055565b611ab3611b3b565b600391909155600455565b611ac6611b3b565b600180546001600160a01b03831673ffffffffffffffffffffffffffffffffffffffff199091168117909155611b035f546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b5f546001600160a01b03163314610c475760405163118cdaa760e01b8152336004820152602401610490565b604051636eb1769f60e11b81523060048201526001600160a01b0383811660248301525f919085169063dd62ed3e90604401602060405180830381865afa158015611bb4573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bd89190612788565b9050611bee8484611be9858561279f565b611f1f565b50505050565b604051636eb1769f60e11b81523060048201526001600160a01b0382811660248301525f919084169063dd62ed3e90604401602060405180830381865afa158015611c41573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c659190612788565b90508015610c2057610c206001600160a01b0384168383611fdc565b82611c8a610c49565b1015611cd85760405162461bcd60e51b815260206004820152601460248201527f414d4f3a20496e73756666696369656e74204c500000000000000000000000006044820152606401610490565b600a546040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018590526001600160a01b0390911690632e1a7d4d906024015f604051808303815f87803b158015611d34575f5ffd5b505af1158015611d46573d5f5f3e3d5ffd5b50506009546002546040517ef714ce000000000000000000000000000000000000000000000000000000008152600481018890526001600160a01b0391821660248201529116925062f714ce91506044015f604051808303815f87803b158015611dae575f5ffd5b505af1158015611dc0573d5f5f3e3d5ffd5b50505050505050565b600554600254611de5916001600160a01b039081169116611e9b565b600654600254610c47916001600160a01b039081169116611e9b565b6001805473ffffffffffffffffffffffffffffffffffffffff191690556114f8816120af565b6040516001600160a01b03838116602483015260448201839052610c2091859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061210b565b6040516370a0823160e01b81523060048201525f906001600160a01b038416906370a0823190602401602060405180830381865afa158015611edf573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f039190612788565b90508015610c2057610c206001600160a01b0384168383611e27565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b300000000000000000000000000000000000000000000000000000000179052611f9e8482612185565b611bee576040516001600160a01b0384811660248301525f6044830152611fd291869182169063095ea7b390606401611e54565b611bee848261210b565b604051636eb1769f60e11b81523060048201526001600160a01b0383811660248301525f919085169063dd62ed3e90604401602060405180830381865afa158015612029573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061204d9190612788565b9050818110156120a2576040517fe570110f0000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201526024810182905260448101839052606401610490565b611bee8484848403611f1f565b5f80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f61211f6001600160a01b03841683612228565b905080515f14158015612143575080806020019051810190612141919061285e565b155b15610c20576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0384166004820152602401610490565b5f5f5f846001600160a01b0316846040516121a09190612879565b5f604051808303815f865af19150503d805f81146121d9576040519150601f19603f3d011682016040523d82523d5f602084013e6121de565b606091505b5091509150818015612208575080511580612208575080806020019051810190612208919061285e565b801561221d57505f856001600160a01b03163b115b925050505b92915050565b606061223583835f61223c565b9392505050565b60608147101561227a576040517fcd786059000000000000000000000000000000000000000000000000000000008152306004820152602401610490565b5f5f856001600160a01b031684866040516122959190612879565b5f6040518083038185875af1925050503d805f81146122cf576040519150601f19603f3d011682016040523d82523d5f602084013e6122d4565b606091505b50915091506122e48683836122ee565b9695505050505050565b606082612303576122fe82612363565b612235565b815115801561231a57506001600160a01b0384163b155b1561235c576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610490565b5080612235565b8051156123735780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f602082840312156123b5575f5ffd5b5035919050565b6001600160a01b03811681146114f8575f5ffd5b80151581146114f8575f5ffd5b5f5f5f5f5f5f5f5f5f6101208a8c0312156123f6575f5ffd5b8935612401816123bc565b985060208a0135612411816123bc565b975060408a0135612421816123bc565b965060608a0135612431816123d0565b955060808a0135612441816123bc565b945060a08a0135612451816123bc565b935060c08a0135612461816123bc565b925060e08a0135612471816123bc565b91506101008a0135612482816123bc565b809150509295985092959850929598565b5f5f604083850312156124a4575f5ffd5b50508035926020909101359150565b5f5f5f606084860312156124c5575f5ffd5b505081359360208301359350604090920135919050565b5f5f5f5f606085870312156124ef575f5ffd5b84356124fa816123bc565b935060208501359250604085013567ffffffffffffffff81111561251c575f5ffd5b8501601f8101871361252c575f5ffd5b803567ffffffffffffffff811115612542575f5ffd5b876020828401011115612553575f5ffd5b949793965060200194505050565b5f5f60408385031215612572575f5ffd5b823561257d816123bc565b946020939093013593505050565b5f6020828403121561259b575f5ffd5b8135612235816123bc565b8060020b81146114f8575f5ffd5b5f5f604083850312156125c5575f5ffd5b82356125d0816125a6565b915060208301356125e0816125a6565b809150509250929050565b5f602082840312156125fb575f5ffd5b8151612235816123bc565b805160ff81168114612616575f5ffd5b919050565b5f6020828403121561262b575f5ffd5b61223582612606565b634e487b7160e01b5f52601160045260245ffd5b60ff828116828216039081111561222257612222612634565b6001815b600184111561269c5780850481111561268057612680612634565b600184161561268e57908102905b60019390931c928002612665565b935093915050565b5f826126b257506001612222565b816126be57505f612222565b81600181146126d457600281146126de576126fa565b6001915050612222565b60ff8411156126ef576126ef612634565b50506001821b612222565b5060208310610133831016604e8410600b841016171561271d575081810a612222565b6127295f198484612661565b805f190482111561273c5761273c612634565b029392505050565b5f61223560ff8416836126a4565b808202811582820484141761222257612222612634565b5f8261278357634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215612798575f5ffd5b5051919050565b8082018082111561222257612222612634565b805161ffff81168114612616575f5ffd5b5f5f5f5f5f5f60c087890312156127d8575f5ffd5b86516127e3816123bc565b60208801519096506127f4816125a6565b9450612802604088016127b2565b935061281060608801612606565b925061281e608088016127b2565b915060a087015161282e816123d0565b809150509295509295509295565b8181038181111561222257612222612634565b818382375f9101908152919050565b5f6020828403121561286e575f5ffd5b8151612235816123d0565b5f82515f5b81811015612898576020818601810151858301520161287e565b505f92019182525091905056fea264697066735822122061ac35910c61215ed601f0d5cb4c5267724d64183c23aabe54ad3db4c4895a5f64736f6c634300081b0033
Deployed Bytecode Sourcemap
51571:10248:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60878:192;;;;;;:::i;:::-;;:::i;:::-;;52732:1319;;;;;;:::i;:::-;;:::i;51959:49::-;;;;;;;;;2074:25:1;;;2062:2;2047:18;51959:49:0;;;;;;;;52510:19;;;;;-1:-1:-1;;;;;52510:19:0;;;;;;-1:-1:-1;;;;;2274:55:1;;;2256:74;;2244:2;2229:18;52510:19:0;2110:226:1;59220:1034:0;;;;;;:::i;:::-;;:::i;61078:149::-;;;:::i;61652:164::-;;;:::i;55158:2193::-;;;;;;:::i;:::-;;:::i;54734:22::-;;;;;-1:-1:-1;;;54734:22:0;;;;;;;;;3334:1:1;3323:21;;;;3305:40;;3293:2;3278:18;54734:22:0;3163:188:1;54705:22:0;;;;;-1:-1:-1;;;54705:22:0;;;;;;61408:205;;;;;;:::i;:::-;;:::i;25993:103::-;;;:::i;34303:235::-;;;:::i;60467:403::-;;;;;;:::i;:::-;;:::i;51896:48::-;;;;;;57416:265;;;;;;:::i;:::-;;:::i;25318:87::-;25364:7;25391:6;-1:-1:-1;;;;;25391:6:0;25318:87;;52294:25;;;;;-1:-1:-1;;;;;52294:25:0;;;52563:20;;;;;-1:-1:-1;;;;;52563:20:0;;;58157:1055;;;;;;:::i;:::-;;:::i;51733:18::-;;;;;-1:-1:-1;;;;;51733:18:0;;;60262:172;;;;;;:::i;:::-;;:::i;51855:34::-;;51885:4;51855:34;;54765:155;;;;;;:::i;:::-;;:::i;52265:22::-;;;;;-1:-1:-1;;;;;52265:22:0;;;52025:197;;;;;;:::i;:::-;;:::i;33391:101::-;33471:13;;-1:-1:-1;;;;;33471:13:0;33391:101;;33691:181;;;;;;:::i;:::-;;:::i;52618:26::-;;;;;-1:-1:-1;;;;;52618:26:0;;;52590:21;;;;;-1:-1:-1;;;;;52590:21:0;;;52536:20;;;;;-1:-1:-1;;;;;52536:20:0;;;60878:192;60973:3;;-1:-1:-1;;;;;60973:3:0;60959:10;:17;;:42;;-1:-1:-1;25364:7:0;25391:6;-1:-1:-1;;;;;25391:6:0;60980:10;:21;60959:42;60951:71;;;;-1:-1:-1;;;60951:71:0;;5536:2:1;60951:71:0;;;5518:21:1;5575:2;5555:18;;;5548:30;5614:18;5594;;;5587:46;5650:18;;60951:71:0;;;;;;;;;61041:3;;61033:29;;-1:-1:-1;;;;;61041:3:0;;;;61033:29;;;;;61055:6;;61041:3;61033:29;61041:3;61033:29;61055:6;61041:3;61033:29;;;;;;;;;;;;;;;;;;;;;60878:192;:::o;52732:1319::-;25204:13;:11;:13::i;:::-;53088:16:::1;::::0;-1:-1:-1;;;53088:16:0;::::1;;;53087:17;53079:56;;;::::0;-1:-1:-1;;;53079:56:0;;5881:2:1;53079:56:0::1;::::0;::::1;5863:21:1::0;5920:2;5900:18;;;5893:30;5959:28;5939:18;;;5932:56;6005:18;;53079:56:0::1;5679:350:1::0;53079:56:0::1;53146:16;:23:::0;;53180:3:::1;:10:::0;;-1:-1:-1;;;;;53180:10:0;;::::1;-1:-1:-1::0;;53180:10:0;;::::1;;::::0;;;53201:7:::1;:18:::0;;;;::::1;::::0;;::::1;;::::0;;53230:10:::1;:24:::0;;53265:20;::::1;;-1:-1:-1::0;;;53265:20:0::1;::::0;;;;53230:24;;::::1;53265:20:::0;::::1;::::0;;53296:4:::1;:12:::0;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;53319:5:::1;:14:::0;;;;::::1;::::0;;::::1;;::::0;;-1:-1:-1;53344:14:0;;;;::::1;::::0;;::::1;;::::0;;53369:6:::1;:16:::0;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;53396:26;;::::1;::::0;;;;;;;;-1:-1:-1;;;53396:26:0;;;;53452:29:::1;::::0;;;;;;;53146:23;;53296:12;53452:27:::1;::::0;-1:-1:-1;53452:29:0;;::::1;::::0;::::1;::::0;;;;;;;;53296:12;53452:29:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53435:46;;53492:14;53524:4;;;;;;;;;-1:-1:-1::0;;;;;53524:4:0::1;-1:-1:-1::0;;;;;53509:27:0::1;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53563:7;::::0;53492:46;;-1:-1:-1;;;;;;53563:7:0;;::::1;53553:17:::0;;::::1;::::0;53549:314:::1;;53587:9;:16:::0;;-1:-1:-1;;;;53587:16:0;::::1;-1:-1:-1::0;;;53587:16:0::1;::::0;;;-1:-1:-1;;;;;53626:20:0;;::::1;53636:10:::0;;53626:20:::1;53618:45;;;::::0;-1:-1:-1;;;53618:45:0;;6492:2:1;53618:45:0::1;::::0;::::1;6474:21:1::0;6531:2;6511:18;;;6504:30;-1:-1:-1;;;6550:18:1;;;6543:42;6602:18;;53618:45:0::1;6290:336:1::0;53618:45:0::1;53549:314;;;53695:7;::::0;-1:-1:-1;;;;;53695:7:0;;::::1;53685:17:::0;;::::1;::::0;53681:182:::1;;53719:9;:17:::0;;-1:-1:-1;;;;53719:17:0;::::1;::::0;;;-1:-1:-1;;;;;53759:20:0;;::::1;53769:10:::0;;53759:20:::1;53751:45;;;::::0;-1:-1:-1;;;53751:45:0;;6492:2:1;53751:45:0::1;::::0;::::1;6474:21:1::0;6531:2;6511:18;;;6504:30;-1:-1:-1;;;6550:18:1;;;6543:42;6602:18;;53751:45:0::1;6290:336:1::0;53681:182:0::1;53829:22;::::0;-1:-1:-1;;;53829:22:0;;6492:2:1;53829:22:0::1;::::0;::::1;6474:21:1::0;6531:2;6511:18;;;6504:30;-1:-1:-1;;;6550:18:1;;;6543:42;6602:18;;53829:22:0::1;6290:336:1::0;53681:182:0::1;53901:7;::::0;53895:25:::1;::::0;;;;;;;53875:17:::1;::::0;-1:-1:-1;;;;;53901:7:0::1;::::0;53895:23:::1;::::0;:25:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;53901:7;53895:25:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53875:45;;53931:20;53960:10;;;;;;;;;-1:-1:-1::0;;;;;53960:10:0::1;-1:-1:-1::0;;;;;53954:26:0::1;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53931:51:::0;-1:-1:-1;54014:28:0::1;53931:51:::0;54014:11;:28:::1;:::i;:::-;54007:36;::::0;:2:::1;:36;:::i;:::-;53993:11;:50:::0;-1:-1:-1;;;;;;;;;;;;;52732:1319:0:o;59220:1034::-;51812:3;;-1:-1:-1;;;;;51812:3:0;51798:10;:17;51790:37;;;;-1:-1:-1;;;51790:37:0;;8984:2:1;51790:37:0;;;8966:21:1;9023:1;9003:18;;;8996:29;-1:-1:-1;;;9041:18:1;;;9034:37;9088:18;;51790:37:0;8782:330:1;51790:37:0;59380:1:::1;59368:9;:13;59360:41;;;::::0;-1:-1:-1;;;59360:41:0;;9319:2:1;59360:41:0::1;::::0;::::1;9301:21:1::0;9358:2;9338:18;;;9331:30;-1:-1:-1;;;9377:18:1;;;9370:45;9432:18;;59360:41:0::1;9117:339:1::0;59360:41:0::1;51885:4;59464:12;;59452:9;:24;;;;:::i;:::-;:30;;;;:::i;:::-;59437:11;::::0;59420:28:::1;::::0;:14;:28:::1;:::i;:::-;:62;;59412:93;;;::::0;-1:-1:-1;;;59412:93:0;;10115:2:1;59412:93:0::1;::::0;::::1;10097:21:1::0;10154:2;10134:18;;;10127:30;10193:20;10173:18;;;10166:48;10231:18;;59412:93:0::1;9913:342:1::0;59412:93:0::1;59531:7;::::0;59524:40:::1;::::0;-1:-1:-1;;;59524:40:0;;59558:4:::1;59524:40;::::0;::::1;2256:74:1::0;59568:9:0;;-1:-1:-1;;;;;59531:7:0::1;::::0;59524:25:::1;::::0;2229:18:1;;59524:40:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;59516:84;;;::::0;-1:-1:-1;;;59516:84:0;;10651:2:1;59516:84:0::1;::::0;::::1;10633:21:1::0;10690:2;10670:18;;;10663:30;10729:20;10709:18;;;10702:48;10767:18;;59516:84:0::1;10449:342:1::0;59516:84:0::1;59679:6;::::0;59648:7:::1;::::0;59641:56:::1;::::0;-1:-1:-1;;;;;59648:7:0;;::::1;::::0;59679:6:::1;59687:9:::0;59641:37:::1;:56::i;:::-;59789:298;::::0;;::::1;::::0;::::1;::::0;;59851:7:::1;::::0;-1:-1:-1;;;;;59851:7:0;;::::1;59789:298:::0;;59883:10:::1;::::0;;::::1;59789:298;::::0;::::1;::::0;;;59919:3:::1;::::0;;::::1;59789:298:::0;;;;;;59947:15:::1;59789:298:::0;;;;;;;;;;;;;;;;;;-1:-1:-1;59789:298:0;;;;;;60113:6:::1;::::0;60098:47;;-1:-1:-1;;;60098:47:0;;11043:13:1;;11039:62;;60098:47:0::1;::::0;::::1;11021:81:1::0;11144:24;;11140:73;;11118:20;;;11111:103;11256:24;;11252:73;;11230:20;;;11223:103;11364:24;;11342:20;;;11335:54;11427:24;11405:20;;;11398:54;11490:24;11468:20;;;11461:54;11557:24;11553:73;;11531:20;;;11524:103;59789:298:0;;60113:6:::1;::::0;60098:39:::1;::::0;10993:19:1;;60098:47:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;60230:7:0::1;::::0;60239:6:::1;::::0;60210:36:::1;::::0;-1:-1:-1;;;;;60230:7:0;;::::1;::::0;60239:6:::1;60210:19;:36::i;:::-;59310:944;59220:1034:::0;;:::o;61078:149::-;25204:13;:11;:13::i;:::-;61145:35:::1;61162:11;:9;:11::i;:::-;61175:1;61178;61145:16;:35::i;:::-;61191:28;:26;:28::i;:::-;61078:149::o:0;61652:164::-;61777:5;;61770:38;;-1:-1:-1;;;61770:38:0;;61802:4;61770:38;;;2256:74:1;61703:7:0;;-1:-1:-1;;;;;61777:5:0;;61770:23;;2229:18:1;;61770:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61736:5;;61729:38;;-1:-1:-1;;;61729:38:0;;61761:4;61729:38;;;2256:74:1;-1:-1:-1;;;;;61736:5:0;;;;61729:23;;2229:18:1;;61729:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:79;;;;:::i;:::-;61722:86;;61652:164;:::o;55158:2193::-;51812:3;;-1:-1:-1;;;;;51812:3:0;51798:10;:17;51790:37;;;;-1:-1:-1;;;51790:37:0;;8984:2:1;51790:37:0;;;8966:21:1;9023:1;9003:18;;;8996:29;-1:-1:-1;;;9041:18:1;;;9034:37;9088:18;;51790:37:0;8782:330:1;51790:37:0;54994:4:::1;::::0;54979:34:::1;::::0;;;;;;;54961:10:::1;::::0;-1:-1:-1;;;;;54994:4:0::1;::::0;54979:32:::1;::::0;:34:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;54994:4;54979:34:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;55040:9:0::1;::::0;54959:54;;-1:-1:-1;;;;;;55040:9:0;::::1;;::::0;;::::1;55032:17:::0;;;::::1;;::::0;::::1;::::0;-1:-1:-1;55032:38:0::1;;-1:-1:-1::0;55061:9:0::1;::::0;-1:-1:-1;;;55061:9:0;::::1;;::::0;;::::1;55053:17:::0;;;::::1;;;55032:38;55024:66;;;::::0;-1:-1:-1;;;55024:66:0;;12902:2:1;55024:66:0::1;::::0;::::1;12884:21:1::0;12941:2;12921:18;;;12914:30;12980:17;12960:18;;;12953:45;13015:18;;55024:66:0::1;12700:339:1::0;55024:66:0::1;55400:8:::2;::::0;::::2;-1:-1:-1::0;;;55400:8:0;::::2;::::0;::::2;::::0;-1:-1:-1;;;55437:9:0;::::2;;55457:412:::0;::::2;;;55494:18:::0;;55486:67:::2;;;::::0;-1:-1:-1;;;55486:67:0;;13246:2:1;55486:67:0::2;::::0;::::2;13228:21:1::0;13285:2;13265:18;;;13258:30;13324:34;13304:18;;;13297:62;-1:-1:-1;;;13375:18:1;;;13368:34;13419:19;;55486:67:0::2;13044:400:1::0;55486:67:0::2;55583:7;::::0;55576:40:::2;::::0;-1:-1:-1;;;55576:40:0;;55610:4:::2;55576:40;::::0;::::2;2256:74:1::0;55620:10:0;;-1:-1:-1;;;;;55583:7:0::2;::::0;55576:25:::2;::::0;2229:18:1;;55576:40:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;55568:84;;;::::0;-1:-1:-1;;;55568:84:0;;13651:2:1;55568:84:0::2;::::0;::::2;13633:21:1::0;13690:2;13670:18;;;13663:30;13729:19;13709:18;;;13702:47;13766:18;;55568:84:0::2;13449:341:1::0;55568:84:0::2;55457:412;;;55693:15:::0;;55685:64:::2;;;::::0;-1:-1:-1;;;55685:64:0;;13246:2:1;55685:64:0::2;::::0;::::2;13228:21:1::0;13285:2;13265:18;;;13258:30;13324:34;13304:18;;;13297:62;-1:-1:-1;;;13375:18:1;;;13368:34;13419:19;;55685:64:0::2;13044:400:1::0;55685:64:0::2;55779:10;::::0;55772:43:::2;::::0;-1:-1:-1;;;55772:43:0;;55809:4:::2;55772:43;::::0;::::2;2256:74:1::0;55819:13:0;;-1:-1:-1;;;;;55779:10:0::2;::::0;55772:28:::2;::::0;2229:18:1;;55772:43:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:60;;55764:93;;;::::0;-1:-1:-1;;;55764:93:0;;13997:2:1;55764:93:0::2;::::0;::::2;13979:21:1::0;14036:2;14016:18;;;14009:30;14075:22;14055:18;;;14048:50;14115:18;;55764:93:0::2;13795:344:1::0;55764:93:0::2;55921:12;55944;55971:10;55967:462;;;56002:9;55998:194;;;-1:-1:-1::0;56042:10:0;;-1:-1:-1;56081:1:0::2;55967:462;;55998:194;-1:-1:-1::0;56133:1:0::2;::::0;-1:-1:-1;56163:13:0;55967:462:::2;;;56228:9;56224:194;;;-1:-1:-1::0;56268:1:0::2;::::0;-1:-1:-1;56298:10:0;56224:194:::2;;;-1:-1:-1::0;56359:13:0;;-1:-1:-1;56401:1:0::2;56224:194;56467:5;::::0;56460:38:::2;::::0;-1:-1:-1;;;56460:38:0;;56492:4:::2;56460:38;::::0;::::2;2256:74:1::0;56439:18:0::2;::::0;-1:-1:-1;;;;;56467:5:0::2;::::0;56460:23:::2;::::0;2229:18:1;;56460:38:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56439:59;;56513:9;56509:193;;;56577:5;::::0;56546:7:::2;::::0;56539:56:::2;::::0;-1:-1:-1;;;;;56546:7:0;;::::2;::::0;56577:5:::2;56584:10:::0;56539:37:::2;:56::i;:::-;56509:193;;;56669:5;::::0;56635:10:::2;::::0;56628:62:::2;::::0;-1:-1:-1;;;;;56635:10:0;;::::2;::::0;56669:5:::2;56676:13:::0;56628:40:::2;:62::i;:::-;56723:5;::::0;56712:58:::2;::::0;;;;::::2;::::0;::::2;14346:25:1::0;;;14387:18;;;14380:34;;;56764:4:0::2;14430:18:1::0;;;14423:83;-1:-1:-1;;;;;56723:5:0;;::::2;::::0;56712:25:::2;::::0;14319:18:1;;56712:58:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;56808:5:0::2;::::0;56801:38:::2;::::0;-1:-1:-1;;;56801:38:0;;56833:4:::2;56801:38;::::0;::::2;2256:74:1::0;56781:17:0::2;::::0;-1:-1:-1;;;;;;56808:5:0;;::::2;::::0;-1:-1:-1;56801:23:0::2;::::0;2229:18:1;;56801:38:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56781:58:::0;-1:-1:-1;56850:13:0::2;56866:28;56881:13:::0;56781:58;56866:28:::2;:::i;:::-;56850:44;;56925:12;56913:8;:24;;56905:57;;;::::0;-1:-1:-1;;;56905:57:0;;14852:2:1;56905:57:0::2;::::0;::::2;14834:21:1::0;14891:2;14871:18;;;14864:30;14930:22;14910:18;;;14903:50;14970:18;;56905:57:0::2;14650:344:1::0;56905:57:0::2;57040:5;::::0;57011::::2;::::0;57004:56:::2;::::0;-1:-1:-1;;;;;57011:5:0;;::::2;::::0;57040::::2;57047:12:::0;57004:35:::2;:56::i;:::-;57083:5;::::0;57071:40:::2;::::0;;;;::::2;::::0;::::2;2074:25:1::0;;;-1:-1:-1;;;;;57083:5:0;;::::2;::::0;57071:26:::2;::::0;2047:18:1;;57071:40:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57122:28;:26;:28::i;:::-;57235:10;::::0;57247:5:::2;::::0;57215:38:::2;::::0;-1:-1:-1;;;;;57235:10:0;;::::2;::::0;57247:5:::2;57215:19;:38::i;:::-;57284:7;::::0;57293:5:::2;::::0;57264:35:::2;::::0;-1:-1:-1;;;;;57284:7:0;;::::2;::::0;57293:5:::2;57264:19;:35::i;:::-;57330:5;::::0;57337::::2;::::0;57310:33:::2;::::0;-1:-1:-1;;;;;57330:5:0;;::::2;::::0;57337::::2;57310:19;:33::i;:::-;55280:2071;;;;;;;54948:162:::1;55158:2193:::0;;;:::o;61408:205::-;25204:13;:11;:13::i;:::-;61507:12:::1;61524:6;-1:-1:-1::0;;;;;61524:11:0::1;61543:5;61550:4;;61524:31;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61506:49;;;61574:7;61566:39;;;::::0;-1:-1:-1;;;61566:39:0;;15477:2:1;61566:39:0::1;::::0;::::1;15459:21:1::0;15516:2;15496:18;;;15489:30;15555:21;15535:18;;;15528:49;15594:18;;61566:39:0::1;15275:343:1::0;61566:39:0::1;61495:118;61408:205:::0;;;;:::o;25993:103::-;25204:13;:11;:13::i;:::-;26058:30:::1;26085:1;26058:18;:30::i;34303:235::-:0;33471:13;;20740:10;;-1:-1:-1;;;;;33471:13:0;34400:24;;34396:98;;34448:34;;-1:-1:-1;;;34448:34:0;;-1:-1:-1;;;;;2274:55:1;;34448:34:0;;;2256:74:1;2229:18;;34448:34:0;2110:226:1;34396:98:0;34504:26;34523:6;34504:18;:26::i;:::-;34345:193;34303:235::o;60467:403::-;60577:3;;-1:-1:-1;;;;;60577:3:0;60563:10;:17;;:42;;-1:-1:-1;25364:7:0;25391:6;-1:-1:-1;;;;;25391:6:0;60584:10;:21;60563:42;60555:71;;;;-1:-1:-1;;;60555:71:0;;5536:2:1;60555:71:0;;;5518:21:1;5575:2;5555:18;;;5548:30;5614:18;5594;;;5587:46;5650:18;;60555:71:0;5334:340:1;60555:71:0;60652:38;;-1:-1:-1;;;60652:38:0;;60684:4;60652:38;;;2256:74:1;60637:12:0;;-1:-1:-1;;;;;60652:23:0;;;;;2229:18:1;;60652:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60637:53;;60716:6;60705:7;:17;60701:162;;60766:3;;60739:39;;-1:-1:-1;;;;;60739:26:0;;;;60766:3;60771:6;60739:26;:39::i;60701:162::-;60838:3;;60811:40;;-1:-1:-1;;;;;60811:26:0;;;;60838:3;60843:7;60811:26;:40::i;57416:265::-;51812:3;;-1:-1:-1;;;;;51812:3:0;51798:10;:17;51790:37;;;;-1:-1:-1;;;51790:37:0;;8984:2:1;51790:37:0;;;8966:21:1;9023:1;9003:18;;;8996:29;-1:-1:-1;;;9041:18:1;;;9034:37;9088:18;;51790:37:0;8782:330:1;51790:37:0;57554:1:::1;57542:9;:13;57534:41;;;::::0;-1:-1:-1;;;57534:41:0;;9319:2:1;57534:41:0::1;::::0;::::1;9301:21:1::0;9358:2;9338:18;;;9331:30;-1:-1:-1;;;9377:18:1;;;9370:45;9432:18;;57534:41:0::1;9117:339:1::0;57534:41:0::1;57586:48;57603:9;57614:7;57623:10;57586:16;:48::i;:::-;57645:28;:26;:28::i;58157:1055::-:0;51812:3;;-1:-1:-1;;;;;51812:3:0;51798:10;:17;51790:37;;;;-1:-1:-1;;;51790:37:0;;8984:2:1;51790:37:0;;;8966:21:1;9023:1;9003:18;;;8996:29;-1:-1:-1;;;9041:18:1;;;9034:37;9088:18;;51790:37:0;8782:330:1;51790:37:0;58320:1:::1;58305:12;:16;58297:44;;;::::0;-1:-1:-1;;;58297:44:0;;9319:2:1;58297:44:0::1;::::0;::::1;9301:21:1::0;9358:2;9338:18;;;9331:30;-1:-1:-1;;;9377:18:1;;;9370:45;9432:18;;58297:44:0::1;9117:339:1::0;58297:44:0::1;51885:4;58405:11;;58391;;58376:12;:26;;;;:::i;:::-;:40;;;;:::i;:::-;:46;;;;:::i;:::-;58360:12;:62;;58352:93;;;::::0;-1:-1:-1;;;58352:93:0;;10115:2:1;58352:93:0::1;::::0;::::1;10097:21:1::0;10154:2;10134:18;;;10127:30;10193:20;10173:18;;;10166:48;10231:18;;58352:93:0::1;9913:342:1::0;58352:93:0::1;58471:10;::::0;58464:43:::1;::::0;-1:-1:-1;;;58464:43:0;;58501:4:::1;58464:43;::::0;::::1;2256:74:1::0;58511:12:0;;-1:-1:-1;;;;;58471:10:0::1;::::0;58464:28:::1;::::0;2229:18:1;;58464:43:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:59;;58456:92;;;::::0;-1:-1:-1;;;58456:92:0;;13997:2:1;58456:92:0::1;::::0;::::1;13979:21:1::0;14036:2;14016:18;;;14009:30;14075:22;14055:18;;;14048:50;14115:18;;58456:92:0::1;13795:344:1::0;58456:92:0::1;58630:6;::::0;58596:10:::1;::::0;58589:62:::1;::::0;-1:-1:-1;;;;;58596:10:0;;::::1;::::0;58630:6:::1;58638:12:::0;58589:40:::1;:62::i;:::-;58743:299;::::0;;::::1;::::0;::::1;::::0;;58805:10:::1;::::0;-1:-1:-1;;;;;58805:10:0;;::::1;58743:299:::0;;58840:7:::1;::::0;;::::1;58743:299;::::0;::::1;::::0;;;58873:3:::1;::::0;;::::1;58743:299:::0;;;;;;58901:15:::1;58743:299:::0;;;;;;;;;;;;;;;;;;-1:-1:-1;58743:299:0;;;;;;59068:6:::1;::::0;59053:47;;-1:-1:-1;;;59053:47:0;;11043:13:1;;11039:62;;59053:47:0::1;::::0;::::1;11021:81:1::0;11144:24;;11140:73;;11118:20;;;11111:103;11256:24;;11252:73;;11230:20;;;11223:103;11364:24;;11342:20;;;11335:54;11427:24;11405:20;;;11398:54;11490:24;11468:20;;;11461:54;11557:24;11553:73;;11531:20;;;11524:103;58743:299:0;;59068:6:::1;::::0;59053:39:::1;::::0;10993:19:1;;59053:47:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;59185:10:0::1;::::0;59197:6:::1;::::0;59165:39:::1;::::0;-1:-1:-1;;;;;59185:10:0;;::::1;::::0;59197:6:::1;59165:19;:39::i;60262:172::-:0;51812:3;;-1:-1:-1;;;;;51812:3:0;51798:10;:17;51790:37;;;;-1:-1:-1;;;51790:37:0;;8984:2:1;51790:37:0;;;8966:21:1;9023:1;9003:18;;;8996:29;-1:-1:-1;;;9041:18:1;;;9034:37;9088:18;;51790:37:0;8782:330:1;51790:37:0;60353:5:::1;;;;;;;;;-1:-1:-1::0;;;;;60353:5:0::1;-1:-1:-1::0;;;;;60341:28:0::1;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;60399:11:0::1;::::0;60382:44:::1;::::0;-1:-1:-1;;;;;;60399:11:0::1;::::0;-1:-1:-1;60412:13:0;60382:16:::1;:44::i;54765:155::-:0;25204:13;:11;:13::i;:::-;54857:9:::1;:22:::0;;54890;;-1:-1:-1;;;54857:22:0::1;::::0;;;::::1;54890::::0;;;-1:-1:-1;;;54890:22:0;;;;;;;::::1;::::0;;;::::1;::::0;;54765:155::o;52025:197::-;25204:13;:11;:13::i;:::-;52149:11:::1;:26:::0;;;;52186:12:::1;:28:::0;52025:197::o;33691:181::-;25204:13;:11;:13::i;:::-;33781::::1;:24:::0;;-1:-1:-1;;;;;33781:24:0;::::1;-1:-1:-1::0;;33781:24:0;;::::1;::::0;::::1;::::0;;;33846:7:::1;25364::::0;25391:6;-1:-1:-1;;;;;25391:6:0;;25318:87;33846:7:::1;-1:-1:-1::0;;;;;33821:43:0::1;;;;;;;;;;;33691:181:::0;:::o;25483:166::-;25364:7;25391:6;-1:-1:-1;;;;;25391:6:0;20740:10;25543:23;25539:103;;25590:40;;-1:-1:-1;;;25590:40:0;;20740:10;25590:40;;;2256:74:1;2229:18;;25590:40:0;2110:226:1;36535:228:0;36655:39;;-1:-1:-1;;;36655:39:0;;36679:4;36655:39;;;15797:74:1;-1:-1:-1;;;;;15907:55:1;;;15887:18;;;15880:83;36632:20:0;;36655:15;;;;;;15770:18:1;;36655:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36632:62;-1:-1:-1;36705:50:0;36718:5;36725:7;36734:20;36749:5;36632:62;36734:20;:::i;:::-;36705:12;:50::i;:::-;36621:142;36535:228;;;:::o;54059:267::-;54160:47;;-1:-1:-1;;;54160:47:0;;54192:4;54160:47;;;15797:74:1;-1:-1:-1;;;;;15907:55:1;;;15887:18;;;15880:83;54140:17:0;;54160:23;;;;;;15770:18:1;;54160:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54140:67;-1:-1:-1;54222:13:0;;54218:101;;54252:55;-1:-1:-1;;;;;54252:35:0;;54288:7;54297:9;54252:35;:55::i;57689:460::-;57846:9;57831:11;:9;:11::i;:::-;:24;;57823:57;;;;-1:-1:-1;;;57823:57:0;;14852:2:1;57823:57:0;;;14834:21:1;14891:2;14871:18;;;14864:30;14930:22;14910:18;;;14903:50;14970:18;;57823:57:0;14650:344:1;57823:57:0;57959:5;;57947:38;;;;;;;;2074:25:1;;;-1:-1:-1;;;;;57959:5:0;;;;57947:27;;2047:18:1;;57947:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;58046:5:0;;58073:3;;58035:42;;;;;;;;16148:25:1;;;-1:-1:-1;;;;;58073:3:0;;;16189:18:1;;;16182:83;58046:5:0;;;-1:-1:-1;58035:26:0;;-1:-1:-1;16121:18:1;;58035:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57689:460;;;:::o;54557:140::-;54632:7;;54641:3;;54615:30;;-1:-1:-1;;;;;54632:7:0;;;;54641:3;54615:16;:30::i;:::-;54673:10;;54685:3;;54656:33;;-1:-1:-1;;;;;54673:10:0;;;;54685:3;54656:16;:33::i;34062:156::-;34152:13;34145:20;;-1:-1:-1;;34145:20:0;;;34176:34;34201:8;34176:24;:34::i;35741:162::-;35851:43;;-1:-1:-1;;;;;16468:55:1;;;35851:43:0;;;16450:74:1;16540:18;;;16533:34;;;35824:71:0;;35844:5;;35866:14;;;;;16423:18:1;;35851:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35824:19;:71::i;54334:215::-;54429:38;;-1:-1:-1;;;54429:38:0;;54461:4;54429:38;;;2256:74:1;54414:12:0;;-1:-1:-1;;;;;54429:23:0;;;;;2229:18:1;;54429:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54414:53;-1:-1:-1;54482:11:0;;54478:63;;54495:46;-1:-1:-1;;;;;54495:26:0;;54522:9;54533:7;54495:26;:46::i;37774:387::-;37890:47;;;-1:-1:-1;;;;;16468:55:1;;37890:47:0;;;16450:74:1;16540:18;;;;16533:34;;;37890:47:0;;;;;;;;;;16423:18:1;;;;37890:47:0;;;;;;;;;;;;;;37955:44;37905:13;37890:47;37955:23;:44::i;:::-;37950:204;;38043:43;;-1:-1:-1;;;;;16468:55:1;;;38043:43:0;;;16450:74:1;38083:1:0;16540:18:1;;;16533:34;38016:71:0;;38036:5;;38058:13;;;;;16423:18:1;;38043:43:0;16276:297:1;38016:71:0;38102:40;38122:5;38129:12;38102:19;:40::i;36972:476::-;37133:39;;-1:-1:-1;;;37133:39:0;;37157:4;37133:39;;;15797:74:1;-1:-1:-1;;;;;15907:55:1;;;15887:18;;;15880:83;37106:24:0;;37133:15;;;;;;15770:18:1;;37133:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37106:66;;37210:17;37191:16;:36;37187:162;;;37255:78;;;;;-1:-1:-1;;;;;17108:55:1;;37255:78:0;;;17090:74:1;17180:18;;;17173:34;;;17223:18;;;17216:34;;;17063:18;;37255:78:0;16888:368:1;37187:162:0;37363:66;37376:5;37383:7;37411:17;37392:16;:36;37363:12;:66::i;26631:191::-;26705:16;26724:6;;-1:-1:-1;;;;;26741:17:0;;;-1:-1:-1;;26741:17:0;;;;;;26774:40;;26724:6;;;;;;;26774:40;;26705:16;26774:40;26694:128;26631:191;:::o;38552:638::-;38976:23;39002:33;-1:-1:-1;;;;;39002:27:0;;39030:4;39002:27;:33::i;:::-;38976:59;;39050:10;:17;39071:1;39050:22;;:57;;;;;39088:10;39077:30;;;;;;;;;;;;:::i;:::-;39076:31;39050:57;39046:137;;;39131:40;;;;;-1:-1:-1;;;;;2274:55:1;;39131:40:0;;;2256:74:1;2229:18;;39131:40:0;2110:226:1;39701:585:0;39784:4;40091:12;40105:23;40140:5;-1:-1:-1;;;;;40132:19:0;40152:4;40132:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40090:67;;;;40175:7;:69;;;;-1:-1:-1;40187:17:0;;:22;;:56;;;40224:10;40213:30;;;;;;;;;;;;:::i;:::-;40175:103;;;;;40277:1;40256:5;-1:-1:-1;;;;;40248:26:0;;:30;40175:103;40168:110;;;;39701:585;;;;;:::o;16339:153::-;16414:12;16446:38;16468:6;16476:4;16482:1;16446:21;:38::i;:::-;16439:45;16339:153;-1:-1:-1;;;16339:153:0:o;16827:398::-;16926:12;16979:5;16955:21;:29;16951:110;;;17008:41;;;;;17043:4;17008:41;;;2256:74:1;2229:18;;17008:41:0;2110:226:1;16951:110:0;17072:12;17086:23;17113:6;-1:-1:-1;;;;;17113:11:0;17132:5;17139:4;17113:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17071:73;;;;17162:55;17189:6;17197:7;17206:10;17162:26;:55::i;:::-;17155:62;16827:398;-1:-1:-1;;;;;;16827:398:0:o;18303:597::-;18451:12;18481:7;18476:417;;18505:19;18513:10;18505:7;:19::i;:::-;18476:417;;;18733:17;;:22;:49;;;;-1:-1:-1;;;;;;18759:18:0;;;:23;18733:49;18729:121;;;18810:24;;;;;-1:-1:-1;;;;;2274:55:1;;18810:24:0;;;2256:74:1;2229:18;;18810:24:0;2110:226:1;18729:121:0;-1:-1:-1;18871:10:0;18864:17;;19453:528;19586:17;;:21;19582:392;;19818:10;19812:17;19875:15;19862:10;19858:2;19854:19;19847:44;19582:392;19945:17;;;;;;;;;;;;;;14:226:1;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;187:23:1;;14:226;-1:-1:-1;14:226:1:o;245:154::-;-1:-1:-1;;;;;324:5:1;320:54;313:5;310:65;300:93;;389:1;386;379:12;404:118;490:5;483:13;476:21;469:5;466:32;456:60;;512:1;509;502:12;527:1396;655:6;663;671;679;687;695;703;711;719;772:3;760:9;751:7;747:23;743:33;740:53;;;789:1;786;779:12;740:53;828:9;815:23;847:31;872:5;847:31;:::i;:::-;897:5;-1:-1:-1;954:2:1;939:18;;926:32;967:33;926:32;967:33;:::i;:::-;1019:7;-1:-1:-1;1078:2:1;1063:18;;1050:32;1091:33;1050:32;1091:33;:::i;:::-;1143:7;-1:-1:-1;1202:2:1;1187:18;;1174:32;1215:30;1174:32;1215:30;:::i;:::-;1264:7;-1:-1:-1;1323:3:1;1308:19;;1295:33;1337;1295;1337;:::i;:::-;1389:7;-1:-1:-1;1448:3:1;1433:19;;1420:33;1462;1420;1462;:::i;:::-;1514:7;-1:-1:-1;1573:3:1;1558:19;;1545:33;1587;1545;1587;:::i;:::-;1639:7;-1:-1:-1;1698:3:1;1683:19;;1670:33;1712;1670;1712;:::i;:::-;1764:7;-1:-1:-1;1844:3:1;1829:19;;1816:33;1858;1816;1858;:::i;:::-;1910:7;1900:17;;;527:1396;;;;;;;;;;;:::o;2341:346::-;2409:6;2417;2470:2;2458:9;2449:7;2445:23;2441:32;2438:52;;;2486:1;2483;2476:12;2438:52;-1:-1:-1;;2531:23:1;;;2651:2;2636:18;;;2623:32;;-1:-1:-1;2341:346:1:o;2692:466::-;2769:6;2777;2785;2838:2;2826:9;2817:7;2813:23;2809:32;2806:52;;;2854:1;2851;2844:12;2806:52;-1:-1:-1;;2899:23:1;;;3019:2;3004:18;;2991:32;;-1:-1:-1;3122:2:1;3107:18;;;3094:32;;2692:466;-1:-1:-1;2692:466:1:o;3356:841::-;3444:6;3452;3460;3468;3521:2;3509:9;3500:7;3496:23;3492:32;3489:52;;;3537:1;3534;3527:12;3489:52;3576:9;3563:23;3595:31;3620:5;3595:31;:::i;:::-;3645:5;-1:-1:-1;3723:2:1;3708:18;;3695:32;;-1:-1:-1;3804:2:1;3789:18;;3776:32;3831:18;3820:30;;3817:50;;;3863:1;3860;3853:12;3817:50;3886:22;;3939:4;3931:13;;3927:27;-1:-1:-1;3917:55:1;;3968:1;3965;3958:12;3917:55;4008:2;3995:16;4034:18;4026:6;4023:30;4020:50;;;4066:1;4063;4056:12;4020:50;4111:7;4106:2;4097:6;4093:2;4089:15;4085:24;4082:37;4079:57;;;4132:1;4129;4122:12;4079:57;3356:841;;;;-1:-1:-1;4163:2:1;4155:11;;-1:-1:-1;;;3356:841:1:o;4202:367::-;4270:6;4278;4331:2;4319:9;4310:7;4306:23;4302:32;4299:52;;;4347:1;4344;4337:12;4299:52;4386:9;4373:23;4405:31;4430:5;4405:31;:::i;:::-;4455:5;4533:2;4518:18;;;;4505:32;;-1:-1:-1;;;4202:367:1:o;4574:247::-;4633:6;4686:2;4674:9;4665:7;4661:23;4657:32;4654:52;;;4702:1;4699;4692:12;4654:52;4741:9;4728:23;4760:31;4785:5;4760:31;:::i;4826:118::-;4913:5;4910:1;4899:20;4892:5;4889:31;4879:59;;4934:1;4931;4924:12;4949:380;5013:6;5021;5074:2;5062:9;5053:7;5049:23;5045:32;5042:52;;;5090:1;5087;5080:12;5042:52;5129:9;5116:23;5148:29;5171:5;5148:29;:::i;:::-;5196:5;-1:-1:-1;5253:2:1;5238:18;;5225:32;5266:31;5225:32;5266:31;:::i;:::-;5316:7;5306:17;;;4949:380;;;;;:::o;6034:251::-;6104:6;6157:2;6145:9;6136:7;6132:23;6128:32;6125:52;;;6173:1;6170;6163:12;6125:52;6205:9;6199:16;6224:31;6249:5;6224:31;:::i;6631:160::-;6708:13;;6761:4;6750:16;;6740:27;;6730:55;;6781:1;6778;6771:12;6730:55;6631:160;;;:::o;6796:204::-;6864:6;6917:2;6905:9;6896:7;6892:23;6888:32;6885:52;;;6933:1;6930;6923:12;6885:52;6956:38;6984:9;6956:38;:::i;7005:184::-;-1:-1:-1;;;7054:1:1;7047:88;7154:4;7151:1;7144:15;7178:4;7175:1;7168:15;7194:151;7284:4;7277:12;;;7263;;;7259:31;;7302:14;;7299:40;;;7319:18;;:::i;7350:375::-;7438:1;7456:5;7470:249;7491:1;7481:8;7478:15;7470:249;;;7541:4;7536:3;7532:14;7526:4;7523:24;7520:50;;;7550:18;;:::i;:::-;7600:1;7590:8;7586:16;7583:49;;;7614:16;;;;7583:49;7697:1;7693:16;;;;;7653:15;;7470:249;;;7350:375;;;;;;:::o;7730:902::-;7779:5;7809:8;7799:80;;-1:-1:-1;7850:1:1;7864:5;;7799:80;7898:4;7888:76;;-1:-1:-1;7935:1:1;7949:5;;7888:76;7980:4;7998:1;7993:59;;;;8066:1;8061:174;;;;7973:262;;7993:59;8023:1;8014:10;;8037:5;;;8061:174;8098:3;8088:8;8085:17;8082:43;;;8105:18;;:::i;:::-;-1:-1:-1;;8161:1:1;8147:16;;8220:5;;7973:262;;8319:2;8309:8;8306:16;8300:3;8294:4;8291:13;8287:36;8281:2;8271:8;8268:16;8263:2;8257:4;8254:12;8250:35;8247:77;8244:203;;;-1:-1:-1;8356:19:1;;;8432:5;;8244:203;8479:42;-1:-1:-1;;8504:8:1;8498:4;8479:42;:::i;:::-;8557:6;8553:1;8549:6;8545:19;8536:7;8533:32;8530:58;;;8568:18;;:::i;:::-;8606:20;;7730:902;-1:-1:-1;;;7730:902:1:o;8637:140::-;8695:5;8724:47;8765:4;8755:8;8751:19;8745:4;8724:47;:::i;9461:168::-;9534:9;;;9565;;9582:15;;;9576:22;;9562:37;9552:71;;9603:18;;:::i;9634:274::-;9674:1;9700;9690:189;;-1:-1:-1;;;9732:1:1;9725:88;9836:4;9833:1;9826:15;9864:4;9861:1;9854:15;9690:189;-1:-1:-1;9893:9:1;;9634:274::o;10260:184::-;10330:6;10383:2;10371:9;10362:7;10358:23;10354:32;10351:52;;;10399:1;10396;10389:12;10351:52;-1:-1:-1;10422:16:1;;10260:184;-1:-1:-1;10260:184:1:o;11638:125::-;11703:9;;;11724:10;;;11721:36;;;11737:18;;:::i;11768:163::-;11846:13;;11899:6;11888:18;;11878:29;;11868:57;;11921:1;11918;11911:12;11936:759;12042:6;12050;12058;12066;12074;12082;12135:3;12123:9;12114:7;12110:23;12106:33;12103:53;;;12152:1;12149;12142:12;12103:53;12184:9;12178:16;12203:31;12228:5;12203:31;:::i;:::-;12303:2;12288:18;;12282:25;12253:5;;-1:-1:-1;12316:31:1;12282:25;12316:31;:::i;:::-;12366:7;-1:-1:-1;12392:48:1;12436:2;12421:18;;12392:48;:::i;:::-;12382:58;;12459:47;12502:2;12491:9;12487:18;12459:47;:::i;:::-;12449:57;;12525:49;12569:3;12558:9;12554:19;12525:49;:::i;:::-;12515:59;;12619:3;12608:9;12604:19;12598:26;12633:30;12655:7;12633:30;:::i;:::-;12682:7;12672:17;;;11936:759;;;;;;;;:::o;14517:128::-;14584:9;;;14605:11;;;14602:37;;;14619:18;;:::i;14999:271::-;15182:6;15174;15169:3;15156:33;15138:3;15208:16;;15233:13;;;15208:16;14999:271;-1:-1:-1;14999:271:1:o;17261:245::-;17328:6;17381:2;17369:9;17360:7;17356:23;17352:32;17349:52;;;17397:1;17394;17387:12;17349:52;17429:9;17423:16;17448:28;17470:5;17448:28;:::i;17511:412::-;17640:3;17678:6;17672:13;17703:1;17713:129;17727:6;17724:1;17721:13;17713:129;;;17825:4;17809:14;;;17805:25;;17799:32;17786:11;;;17779:53;17742:12;17713:129;;;-1:-1:-1;17897:1:1;17861:16;;17886:13;;;-1:-1:-1;17861:16:1;17511:412;-1:-1:-1;17511:412:1:o
Swarm Source
ipfs://61ac35910c61215ed601f0d5cb4c5267724d64183c23aabe54ad3db4c4895a5f
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 35 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.