More Info
Private Name Tags
ContractCreator
Latest 7 from a total of 7 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Zap From Native | 13414584 | 8 hrs ago | IN | 1 S | 0.0294195 | ||||
Set Route | 13414479 | 8 hrs ago | IN | 0 S | 0.0048198 | ||||
Set Route | 13414431 | 8 hrs ago | IN | 0 S | 0.00580511 | ||||
Zap From Native ... | 13413078 | 8 hrs ago | IN | 1 S | 0.09680789 | ||||
Zap From WS To H... | 13412150 | 8 hrs ago | IN | 0 S | 0.04018848 | ||||
Set Route | 13411354 | 8 hrs ago | IN | 0 S | 0.0048186 | ||||
Set Route | 13411317 | 8 hrs ago | IN | 0 S | 0.00516213 |
Loading...
Loading
Contract Name:
Zapper
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at SonicScan.org on 2025-03-13 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.17; // OpenZeppelin Contracts (last updated v4.9.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 amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); } // OpenZeppelin Contracts (last updated v4.9.4) (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); } // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://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.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) 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(errorMessage); } } } // OpenZeppelin Contracts (last updated v4.9.3) (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 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.encodeWithSelector(token.transfer.selector, 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.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } /** * @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); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value)); } /** * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value)); } } /** * @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.encodeWithSelector(token.approve.selector, spender, value); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0)); _callOptionalReturn(token, approvalCall); } } /** * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`. * Revert on invalid signature. */ function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } /** * @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.isContract(address(token)); } } // OpenZeppelin Contracts (last updated v4.9.4) (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; } } // OpenZeppelin Contracts (last updated v4.9.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. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev 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 { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @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 { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } interface IDex { struct Route { address from; address to; bool stable; } function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, Route[] calldata routes, address to, uint256 deadline ) external returns (uint256[] memory amounts); function quoteAddLiquidity( address tokenA, address tokenB, bool stable, uint256 amountADesired, uint256 amountBDesired ) external view returns (uint256 amountA, uint256 amountB, uint256 liquidity); function addLiquidity( address tokenA, address tokenB, bool stable, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB, uint256 liquidity); function getAmountsOut(uint256 amountIn, Route[] calldata routes) external view returns (uint256[] memory amounts); } interface IDexV3 { struct ExactInputSingleParams { address tokenIn; address tokenOut; address recipient; uint256 amountIn; uint256 amountOutMinimum; uint160 limitSqrtPrice; } function exactInputSingle(ExactInputSingleParams calldata params) external payable returns (uint256 amountOut); } interface IWETH { function deposit() external payable; function withdraw(uint256) external; function transfer(address to, uint256 value) external returns (bool); } contract Zapper is Ownable { using SafeERC20 for IERC20; address public constant WS = address(0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38); address public constant OS = address(0xb1e25689D55734FD3ffFc939c4C3Eb52DFf8A794); address public constant fHOG = address(0xaFde634d6f38FC59cF94FB9e24a91E31EE6AA5E0); address public constant HOG = address(0xB3804bF38bD170ef65b4De8536d19a8e3600C0A9); address public constant fSnake = address(0x11F5cd8aE75c2f498DE4b874058c489AE473E488); address public constant Snake = address(0x3a516e01f82c1e18916ED69a81Dd498eF64bB157); address public constant ShadowV2Address = address(0x1D368773735ee1E678950B7A97bcA2CafB330CDc); address public constant SwapXV2Address = address(0xF5F7231073b3B41c04BA655e1a7438b1a7b29c27); address public constant SwapXV3Address = address(0xA047e2AbF8263FcA7c368F43e2f960A06FD9949f); IDexV3 public immutable swapXV3; IDex public immutable swapX; IDex public immutable shadow; mapping(address => mapping(address => IDex.Route[])) public routes; mapping(address => mapping(address => bool)) public useShadow; constructor() { shadow = IDex(ShadowV2Address); swapX = IDex(SwapXV2Address); swapXV3 = IDexV3(SwapXV3Address); } function setRoute(address from, address to, IDex.Route[] calldata route, bool useShadowDex) external onlyOwner { delete routes[from][to]; for (uint256 i = 0; i < route.length; i++) { routes[from][to].push(route[i]); } useShadow[from][to] = useShadowDex; } function zapFromERC20(address tokenSource, address tokenA, address tokenB, uint256 amountSource) external { require(amountSource > 0, "Amount must be greater than zero"); require(tokenA != tokenB, "tokenA and tokenB must be different"); IERC20(tokenSource).transferFrom(msg.sender, address(this), amountSource); _processZap(tokenSource, tokenA, tokenB, amountSource, msg.sender); } function zapFromNative(address tokenA, address tokenB) external payable { require(msg.value > 0, "Amount must be greater than zero"); require(tokenA != tokenB, "tokenA and tokenB must be different"); IWETH(WS).deposit{value : msg.value}(); _processZap(address(WS), tokenA, tokenB, msg.value, msg.sender); } function zapFromNativeToHogFHog() external payable { require(msg.value > 0, "Amount must be greater than zero"); IWETH(WS).deposit{value : msg.value}(); IDexV3.ExactInputSingleParams memory params = IDexV3.ExactInputSingleParams({ tokenIn : WS, tokenOut : OS, recipient : address(this), amountIn : msg.value, amountOutMinimum : 1, limitSqrtPrice : 0 }); uint256 amountOS = swapXV3.exactInputSingle(params); _processZap(OS, HOG, fHOG, amountOS, msg.sender); } function zapFromWSToHogFHog(uint256 amountWS) external { require(amountWS > 0, "Amount must be greater than zero"); IERC20(WS).transferFrom(msg.sender, address(this), amountWS); IERC20(WS).safeIncreaseAllowance(address(swapXV3), amountWS); IDexV3.ExactInputSingleParams memory params = IDexV3.ExactInputSingleParams({ tokenIn : WS, tokenOut : OS, recipient : address(this), amountIn : amountWS, amountOutMinimum : 1, limitSqrtPrice : 0 }); uint256 amountOS = swapXV3.exactInputSingle(params); _processZap(OS, HOG, fHOG, amountOS, msg.sender); } function _processZap( address tokenSource, address tokenA, address tokenB, uint256 amountSource, address user ) internal { require(tokenA != tokenB, "tokenA and tokenB must be different"); IDex dexA = useShadow[tokenSource][tokenA] ? shadow : swapX; IDex dexB = useShadow[tokenA][tokenB] ? shadow : swapX; uint256 amountA; uint256 amountB; if (tokenSource == tokenA) { amountA = amountSource; amountB = _executeSwap(dexB, tokenA, tokenB, amountA / 2); } else if (tokenSource == tokenB) { amountB = amountSource; amountA = _executeSwap(dexA, tokenB, tokenA, amountB / 2); } else { amountA = _executeSwap(dexA, tokenSource, tokenA, amountSource); amountB = _executeSwap(dexB, tokenA, tokenB, amountA / 2); } _provideLiquidity(tokenA, tokenB, amountA / 2, amountB, user); } function _executeSwap(IDex dex, address tokenSource, address tokenOut, uint256 amount) internal returns (uint256) { IERC20(tokenSource).safeIncreaseAllowance(address(dex), amount); uint256[] memory amounts = dex.swapExactTokensForTokens(amount, 0, routes[tokenSource][tokenOut], address(this), block.timestamp); return amounts.length > 0 ? amounts[amounts.length - 1] : 0; } function _provideLiquidity( address tokenA, address tokenB, uint256 amountOutA, uint256 amountOutB, address user ) public { IERC20(tokenA).safeIncreaseAllowance(address(swapX), amountOutA); IERC20(tokenB).safeIncreaseAllowance(address(swapX), amountOutB); (uint256 usedA, uint256 usedB,) = swapX.addLiquidity( tokenA, tokenB, false, amountOutA, amountOutB, 1, 1, user, block.timestamp ); if (amountOutA > usedA) { IERC20(tokenA).transfer(user, amountOutA - usedA); } if (amountOutB > usedB) { IERC20(tokenB).transfer(user, amountOutB - usedB); } } function _getAmountOut(IDex dex, address tokenSource, address tokenOut, uint256 amount) public view returns (uint256) { uint256[] memory amounts = dex.getAmountsOut(amount, routes[tokenSource][tokenOut]); return amounts.length > 0 ? amounts[amounts.length - 1] : 0; } function estimateOut( address tokenSource, address tokenA, address tokenB, uint256 amountSource ) external view returns (uint256 liquidity, uint256 leftoverA, uint256 leftoverB) { require(amountSource > 0, "Amount must be greater than zero"); require(tokenA != tokenB, "tokenA and tokenB must be different"); uint256 amountA; uint256 amountB; if (tokenSource == tokenA) { amountA = amountSource; amountB = _getAmountOut(swapX, tokenA, tokenB, amountA / 2); } else if (tokenSource == tokenB) { amountB = amountSource; amountA = _getAmountOut(swapX, tokenB, tokenA, amountB / 2); } else { amountA = _getAmountOut(swapX, tokenSource, tokenA, amountSource); amountB = _getAmountOut(swapX, tokenA, tokenB, amountA / 2); } (uint256 usedA, uint256 usedB, uint256 estimatedLiquidity) = swapX.quoteAddLiquidity(tokenA, tokenB, false, amountA / 2, amountB); return (estimatedLiquidity, amountA / 2 - usedA, amountB - usedB); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"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":"HOG","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ShadowV2Address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Snake","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SwapXV2Address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SwapXV3Address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IDex","name":"dex","type":"address"},{"internalType":"address","name":"tokenSource","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"_getAmountOut","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountOutA","type":"uint256"},{"internalType":"uint256","name":"amountOutB","type":"uint256"},{"internalType":"address","name":"user","type":"address"}],"name":"_provideLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenSource","type":"address"},{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountSource","type":"uint256"}],"name":"estimateOut","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"leftoverA","type":"uint256"},{"internalType":"uint256","name":"leftoverB","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fHOG","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fSnake","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"routes","outputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct IDex.Route[]","name":"route","type":"tuple[]"},{"internalType":"bool","name":"useShadowDex","type":"bool"}],"name":"setRoute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shadow","outputs":[{"internalType":"contract IDex","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapX","outputs":[{"internalType":"contract IDex","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapXV3","outputs":[{"internalType":"contract IDexV3","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"useShadow","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenSource","type":"address"},{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountSource","type":"uint256"}],"name":"zapFromERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"zapFromNative","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"zapFromNativeToHogFHog","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountWS","type":"uint256"}],"name":"zapFromWSToHogFHog","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60e060405234801561001057600080fd5b5061001a33610067565b731d368773735ee1e678950b7a97bca2cafb330cdc60c05273f5f7231073b3b41c04ba655e1a7438b1a7b29c2760a05273a047e2abf8263fca7c368f43e2f960a06fd9949f6080526100b7565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60805160a05160c05161290361014f600039600081816104d901528181611b8b0152611c130152600081816102d801528181610a0d01528181610a7a01528181610ab201528181610ae001528181610b2a01528181610ec801528181610f0901528181610fb201528181611b650152611bed0152600081816101ff015281816106f4015281816107e701526114a701526129036000f3fe6080604052600436106101965760003560e01c80637364d6aa116100e157806396db66f51161008a578063b663bce411610064578063b663bce414610523578063c308fc2d14610551578063d478439c14610564578063f2fde38b146105af57600080fd5b806396db66f51461049f578063ac600a3c146104c7578063af769c04146104fb57600080fd5b80638da5cb5b116100bb5780638da5cb5b146104245780638dfcb72c1461044f5780639092bfe41461047757600080fd5b80637364d6aa146103dc57806378370c9c146103fc5780637bc8fa9f1461041c57600080fd5b80633d86257f116101435780635e1682431161011d5780635e1682431461034a578063600c557d14610372578063715018a6146103c757600080fd5b80633d86257f146102c6578063577c9718146102fa5780635d4093591461032257600080fd5b80630db7f74c116101745780630db7f74c1461024357806319ca8c551461026b578063274ea947146102a657600080fd5b806301e0d3301461019b57806309c04bf7146101ed5780630b2751d914610221575b600080fd5b3480156101a757600080fd5b506101c373b1e25689d55734fd3fffc939c4c3eb52dff8a79481565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156101f957600080fd5b506101c37f000000000000000000000000000000000000000000000000000000000000000081565b34801561022d57600080fd5b5061024161023c3660046121cd565b6105cf565b005b34801561024f57600080fd5b506101c3731d368773735ee1e678950b7a97bca2cafb330cdc81565b34801561027757600080fd5b5061028b610286366004612208565b6108a6565b604080519384526020840192909252908201526060016101e4565b3480156102b257600080fd5b506102416102c1366004612208565b610c43565b3480156102d257600080fd5b506101c37f000000000000000000000000000000000000000000000000000000000000000081565b34801561030657600080fd5b506101c373a047e2abf8263fca7c368f43e2f960a06fd9949f81565b34801561032e57600080fd5b506101c373039e2fb66102314ce7b64ce5ce3e5183bc94ad3881565b34801561035657600080fd5b506101c37311f5cd8ae75c2f498de4b874058c489ae473e48881565b34801561037e57600080fd5b5061039261038d366004612259565b610e19565b6040805173ffffffffffffffffffffffffffffffffffffffff94851681529390921660208401521515908201526060016101e4565b3480156103d357600080fd5b50610241610e98565b3480156103e857600080fd5b506102416103f736600461229a565b610eac565b34801561040857600080fd5b50610241610417366004612307565b6111b8565b6102416112f9565b34801561043057600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166101c3565b34801561045b57600080fd5b506101c373f5f7231073b3b41c04ba655e1a7438b1a7b29c2781565b34801561048357600080fd5b506101c373b3804bf38bd170ef65b4de8536d19a8e3600c0a981565b3480156104ab57600080fd5b506101c373afde634d6f38fc59cf94fb9e24a91e31ee6aa5e081565b3480156104d357600080fd5b506101c37f000000000000000000000000000000000000000000000000000000000000000081565b34801561050757600080fd5b506101c3733a516e01f82c1e18916ed69a81dd498ef64bb15781565b34801561052f57600080fd5b5061054361053e366004612208565b611566565b6040519081526020016101e4565b61024161055f3660046123a9565b611684565b34801561057057600080fd5b5061059f61057f3660046123a9565b600260209081526000928352604080842090915290825290205460ff1681565b60405190151581526020016101e4565b3480156105bb57600080fd5b506102416105ca3660046123e2565b61183f565b6000811161063e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f416d6f756e74206d7573742062652067726561746572207468616e207a65726f60448201526064015b60405180910390fd5b6040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810182905273039e2fb66102314ce7b64ce5ce3e5183bc94ad38906323b872dd906064016020604051808303816000875af11580156106b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d99190612406565b5061071973039e2fb66102314ce7b64ce5ce3e5183bc94ad387f0000000000000000000000000000000000000000000000000000000000000000836118f6565b6040805160c08101825273039e2fb66102314ce7b64ce5ce3e5183bc94ad38815273b1e25689d55734fd3fffc939c4c3eb52dff8a794602082019081523082840190815260608301858152600160808501908152600060a0860181815296517fbab2140e000000000000000000000000000000000000000000000000000000008152865173ffffffffffffffffffffffffffffffffffffffff9081166004830152955186166024820152935185166044850152915160648401525160848301529351821660a48201529192917f00000000000000000000000000000000000000000000000000000000000000009091169063bab2140e9060c4016020604051808303816000875af1158015610832573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108569190612423565b90506108a173b1e25689d55734fd3fffc939c4c3eb52dff8a79473b3804bf38bd170ef65b4de8536d19a8e3600c0a973afde634d6f38fc59cf94fb9e24a91e31ee6aa5e08433611a6c565b505050565b6000806000808411610914576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f416d6f756e74206d7573742062652067726561746572207468616e207a65726f6044820152606401610635565b8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16036109cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f746f6b656e4120616e6420746f6b656e42206d7573742062652064696666657260448201527f656e7400000000000000000000000000000000000000000000000000000000006064820152608401610635565b6000808773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1603610a4057859150610a397f0000000000000000000000000000000000000000000000000000000000000000898961053e60028761246b565b9050610b0f565b8673ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1603610aad575084610aa67f0000000000000000000000000000000000000000000000000000000000000000888a61053e60028661246b565b9150610b0f565b610ad97f00000000000000000000000000000000000000000000000000000000000000008a8a89611566565b9150610b0c7f0000000000000000000000000000000000000000000000000000000000000000898961053e60028761246b565b90505b6000808073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166398a0fb3c8c8c84610b5d60028b61246b565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b16815273ffffffffffffffffffffffffffffffffffffffff94851660048201529390921660248401521515604483015260648201526084810187905260a401606060405180830381865afa158015610be2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0691906124a6565b919450925090508083610c1a60028861246b565b610c2491906124d4565b610c2e84876124d4565b97509750975050505050509450945094915050565b60008111610cad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f416d6f756e74206d7573742062652067726561746572207468616e207a65726f6044820152606401610635565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610d68576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f746f6b656e4120616e6420746f6b656e42206d7573742062652064696666657260448201527f656e7400000000000000000000000000000000000000000000000000000000006064820152608401610635565b6040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810182905273ffffffffffffffffffffffffffffffffffffffff8516906323b872dd906064016020604051808303816000875af1158015610de1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e059190612406565b50610e138484848433611a6c565b50505050565b60016020528260005260406000206020528160005260406000208181548110610e4157600080fd5b60009182526020909120600290910201805460019091015473ffffffffffffffffffffffffffffffffffffffff9182169450908116925074010000000000000000000000000000000000000000900460ff16905083565b610ea0611d1c565b610eaa6000611d9d565b565b610eed73ffffffffffffffffffffffffffffffffffffffff86167f0000000000000000000000000000000000000000000000000000000000000000856118f6565b610f2e73ffffffffffffffffffffffffffffffffffffffff85167f0000000000000000000000000000000000000000000000000000000000000000846118f6565b6040517f5a47ddc300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015285811660248301526000604483018190526064830186905260848301859052600160a4840181905260c484015283821660e4840152426101048401529182917f00000000000000000000000000000000000000000000000000000000000000001690635a47ddc390610124016060604051808303816000875af1158015610ffc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102091906124a6565b5091509150818511156110ea5773ffffffffffffffffffffffffffffffffffffffff871663a9059cbb8461105485896124d4565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526044016020604051808303816000875af11580156110c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e89190612406565b505b808411156111af5773ffffffffffffffffffffffffffffffffffffffff861663a9059cbb8461111984886124d4565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526044016020604051808303816000875af1158015611189573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ad9190612406565b505b50505050505050565b6111c0611d1c565b73ffffffffffffffffffffffffffffffffffffffff808616600090815260016020908152604080832093881683529290529081206111fd9161214c565b60005b8281101561128f5773ffffffffffffffffffffffffffffffffffffffff808716600090815260016020908152604080832093891683529290522084848381811061124c5761124c6124ed565b83546001810185556000948552602090942060609091029290920192600202909101905061127a828261251c565b505080806112879061260d565b915050611200565b5073ffffffffffffffffffffffffffffffffffffffff9485166000908152600260209081526040808320969097168252949094529390922080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016931515939093179092555050565b60003411611363576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f416d6f756e74206d7573742062652067726561746572207468616e207a65726f6044820152606401610635565b73039e2fb66102314ce7b64ce5ce3e5183bc94ad3873ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b1580156113bf57600080fd5b505af11580156113d3573d6000803e3d6000fd5b50506040805160c08101825273039e2fb66102314ce7b64ce5ce3e5183bc94ad38815273b1e25689d55734fd3fffc939c4c3eb52dff8a79460208201908152308284019081523460608401908152600160808501908152600060a0860181815296517fbab2140e000000000000000000000000000000000000000000000000000000008152865173ffffffffffffffffffffffffffffffffffffffff9081166004830152955186166024820152935185166044850152915160648401525160848301529351821660a48201529195509193507f0000000000000000000000000000000000000000000000000000000000000000909116915063bab2140e9060c4016020604051808303816000875af11580156114f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115179190612423565b905061156273b1e25689d55734fd3fffc939c4c3eb52dff8a79473b3804bf38bd170ef65b4de8536d19a8e3600c0a973afde634d6f38fc59cf94fb9e24a91e31ee6aa5e08433611a6c565b5050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320868516845290915280822090517f9881fcb40000000000000000000000000000000000000000000000000000000081529192839290881691639881fcb4916115db9187916004016126bc565b600060405180830381865afa1580156115f8573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261163e9190810190612704565b90506000815111611650576000611678565b806001825161165f91906124d4565b8151811061166f5761166f6124ed565b60200260200101515b9150505b949350505050565b600034116116ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f416d6f756e74206d7573742062652067726561746572207468616e207a65726f6044820152606401610635565b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036117a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f746f6b656e4120616e6420746f6b656e42206d7573742062652064696666657260448201527f656e7400000000000000000000000000000000000000000000000000000000006064820152608401610635565b73039e2fb66102314ce7b64ce5ce3e5183bc94ad3873ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561180557600080fd5b505af1158015611819573d6000803e3d6000fd5b505050505061156273039e2fb66102314ce7b64ce5ce3e5183bc94ad3883833433611a6c565b611847611d1c565b73ffffffffffffffffffffffffffffffffffffffff81166118ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610635565b6118f381611d9d565b50565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff83811660248301526000919085169063dd62ed3e90604401602060405180830381865afa15801561196c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119909190612423565b9050610e13847f095ea7b300000000000000000000000000000000000000000000000000000000856119c286866127e0565b60405173ffffffffffffffffffffffffffffffffffffffff90921660248301526044820152606401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611e12565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611b27576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f746f6b656e4120616e6420746f6b656e42206d7573742062652064696666657260448201527f656e7400000000000000000000000000000000000000000000000000000000006064820152608401610635565b73ffffffffffffffffffffffffffffffffffffffff808616600090815260026020908152604080832093881683529290529081205460ff16611b89577f0000000000000000000000000000000000000000000000000000000000000000611bab565b7f00000000000000000000000000000000000000000000000000000000000000005b73ffffffffffffffffffffffffffffffffffffffff80871660009081526002602090815260408083209389168352929052908120549192509060ff16611c11577f0000000000000000000000000000000000000000000000000000000000000000611c33565b7f00000000000000000000000000000000000000000000000000000000000000005b90506000808773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1603611c8b57859150611c84838989611c7f60028761246b565b611f21565b9050611cfa565b8673ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1603611cd8575084611cd184888a611c7f60028661246b565b9150611cfa565b611ce4848a8a89611f21565b9150611cf7838989611c7f60028761246b565b90505b611d118888611d0a60028661246b565b8489610eac565b505050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610eaa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610635565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000611e74826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611fdb9092919063ffffffff16565b9050805160001480611e95575080806020019051810190611e959190612406565b6108a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610635565b6000611f4473ffffffffffffffffffffffffffffffffffffffff851686846118f6565b73ffffffffffffffffffffffffffffffffffffffff8481166000908152600160209081526040808320878516845290915280822090517ff41766d8000000000000000000000000000000000000000000000000000000008152919288169163f41766d891611fbc9187918691309042906004016127f3565b6000604051808303816000875af11580156115f8573d6000803e3d6000fd5b606061167c8484600085856000808673ffffffffffffffffffffffffffffffffffffffff16858760405161200f9190612860565b60006040518083038185875af1925050503d806000811461204c576040519150601f19603f3d011682016040523d82523d6000602084013e612051565b606091505b50915091506120628783838761206d565b979650505050505050565b606083156121035782516000036120fc5773ffffffffffffffffffffffffffffffffffffffff85163b6120fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610635565b508161167c565b61167c83838151156121185781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610635919061287c565b50805460008255600202906000526020600020908101906118f391905b808211156121c95780547fffffffffffffffffffffffff00000000000000000000000000000000000000001681556001810180547fffffffffffffffffffffff000000000000000000000000000000000000000000169055600201612169565b5090565b6000602082840312156121df57600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff811681146118f357600080fd5b6000806000806080858703121561221e57600080fd5b8435612229816121e6565b93506020850135612239816121e6565b92506040850135612249816121e6565b9396929550929360600135925050565b60008060006060848603121561226e57600080fd5b8335612279816121e6565b92506020840135612289816121e6565b929592945050506040919091013590565b600080600080600060a086880312156122b257600080fd5b85356122bd816121e6565b945060208601356122cd816121e6565b9350604086013592506060860135915060808601356122eb816121e6565b809150509295509295909350565b80151581146118f357600080fd5b60008060008060006080868803121561231f57600080fd5b853561232a816121e6565b9450602086013561233a816121e6565b9350604086013567ffffffffffffffff8082111561235757600080fd5b818801915088601f83011261236b57600080fd5b81358181111561237a57600080fd5b89602060608302850101111561238f57600080fd5b60208301955080945050505060608601356122eb816122f9565b600080604083850312156123bc57600080fd5b82356123c7816121e6565b915060208301356123d7816121e6565b809150509250929050565b6000602082840312156123f457600080fd5b81356123ff816121e6565b9392505050565b60006020828403121561241857600080fd5b81516123ff816122f9565b60006020828403121561243557600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000826124a1577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000806000606084860312156124bb57600080fd5b8351925060208401519150604084015190509250925092565b818103818111156124e7576124e761243c565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8135612527816121e6565b81547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff821617825550600181016020830135612578816121e6565b81547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff82161782555060408301356125c5816122f9565b81547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690151560a01b74ff0000000000000000000000000000000000000000161790555050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361263e5761263e61243c565b5060010190565b6000815480845260208085019450836000528060002060005b838110156126b157815473ffffffffffffffffffffffffffffffffffffffff9081168852600180840154918216858a015260a09190911c60ff16151560408901526060909701966002909201910161265e565b509495945050505050565b82815260406020820152600061167c6040830184612645565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000602080838503121561271757600080fd5b825167ffffffffffffffff8082111561272f57600080fd5b818501915085601f83011261274357600080fd5b815181811115612755576127556126d5565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108582111715612798576127986126d5565b6040529182528482019250838101850191888311156127b657600080fd5b938501935b828510156127d4578451845293850193928501926127bb565b98975050505050505050565b808201808211156124e7576124e761243c565b85815284602082015260a06040820152600061281260a0830186612645565b73ffffffffffffffffffffffffffffffffffffffff94909416606083015250608001529392505050565b60005b8381101561285757818101518382015260200161283f565b50506000910152565b6000825161287281846020870161283c565b9190910192915050565b602081526000825180602084015261289b81604085016020870161283c565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fea264697066735822122069bdd7c147976ef96422fba76e685d37b0e0698895e423a548abda92dc85fd6d64736f6c63430008110033
Deployed Bytecode
0x6080604052600436106101965760003560e01c80637364d6aa116100e157806396db66f51161008a578063b663bce411610064578063b663bce414610523578063c308fc2d14610551578063d478439c14610564578063f2fde38b146105af57600080fd5b806396db66f51461049f578063ac600a3c146104c7578063af769c04146104fb57600080fd5b80638da5cb5b116100bb5780638da5cb5b146104245780638dfcb72c1461044f5780639092bfe41461047757600080fd5b80637364d6aa146103dc57806378370c9c146103fc5780637bc8fa9f1461041c57600080fd5b80633d86257f116101435780635e1682431161011d5780635e1682431461034a578063600c557d14610372578063715018a6146103c757600080fd5b80633d86257f146102c6578063577c9718146102fa5780635d4093591461032257600080fd5b80630db7f74c116101745780630db7f74c1461024357806319ca8c551461026b578063274ea947146102a657600080fd5b806301e0d3301461019b57806309c04bf7146101ed5780630b2751d914610221575b600080fd5b3480156101a757600080fd5b506101c373b1e25689d55734fd3fffc939c4c3eb52dff8a79481565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156101f957600080fd5b506101c37f000000000000000000000000a047e2abf8263fca7c368f43e2f960a06fd9949f81565b34801561022d57600080fd5b5061024161023c3660046121cd565b6105cf565b005b34801561024f57600080fd5b506101c3731d368773735ee1e678950b7a97bca2cafb330cdc81565b34801561027757600080fd5b5061028b610286366004612208565b6108a6565b604080519384526020840192909252908201526060016101e4565b3480156102b257600080fd5b506102416102c1366004612208565b610c43565b3480156102d257600080fd5b506101c37f000000000000000000000000f5f7231073b3b41c04ba655e1a7438b1a7b29c2781565b34801561030657600080fd5b506101c373a047e2abf8263fca7c368f43e2f960a06fd9949f81565b34801561032e57600080fd5b506101c373039e2fb66102314ce7b64ce5ce3e5183bc94ad3881565b34801561035657600080fd5b506101c37311f5cd8ae75c2f498de4b874058c489ae473e48881565b34801561037e57600080fd5b5061039261038d366004612259565b610e19565b6040805173ffffffffffffffffffffffffffffffffffffffff94851681529390921660208401521515908201526060016101e4565b3480156103d357600080fd5b50610241610e98565b3480156103e857600080fd5b506102416103f736600461229a565b610eac565b34801561040857600080fd5b50610241610417366004612307565b6111b8565b6102416112f9565b34801561043057600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166101c3565b34801561045b57600080fd5b506101c373f5f7231073b3b41c04ba655e1a7438b1a7b29c2781565b34801561048357600080fd5b506101c373b3804bf38bd170ef65b4de8536d19a8e3600c0a981565b3480156104ab57600080fd5b506101c373afde634d6f38fc59cf94fb9e24a91e31ee6aa5e081565b3480156104d357600080fd5b506101c37f0000000000000000000000001d368773735ee1e678950b7a97bca2cafb330cdc81565b34801561050757600080fd5b506101c3733a516e01f82c1e18916ed69a81dd498ef64bb15781565b34801561052f57600080fd5b5061054361053e366004612208565b611566565b6040519081526020016101e4565b61024161055f3660046123a9565b611684565b34801561057057600080fd5b5061059f61057f3660046123a9565b600260209081526000928352604080842090915290825290205460ff1681565b60405190151581526020016101e4565b3480156105bb57600080fd5b506102416105ca3660046123e2565b61183f565b6000811161063e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f416d6f756e74206d7573742062652067726561746572207468616e207a65726f60448201526064015b60405180910390fd5b6040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810182905273039e2fb66102314ce7b64ce5ce3e5183bc94ad38906323b872dd906064016020604051808303816000875af11580156106b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d99190612406565b5061071973039e2fb66102314ce7b64ce5ce3e5183bc94ad387f000000000000000000000000a047e2abf8263fca7c368f43e2f960a06fd9949f836118f6565b6040805160c08101825273039e2fb66102314ce7b64ce5ce3e5183bc94ad38815273b1e25689d55734fd3fffc939c4c3eb52dff8a794602082019081523082840190815260608301858152600160808501908152600060a0860181815296517fbab2140e000000000000000000000000000000000000000000000000000000008152865173ffffffffffffffffffffffffffffffffffffffff9081166004830152955186166024820152935185166044850152915160648401525160848301529351821660a48201529192917f000000000000000000000000a047e2abf8263fca7c368f43e2f960a06fd9949f9091169063bab2140e9060c4016020604051808303816000875af1158015610832573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108569190612423565b90506108a173b1e25689d55734fd3fffc939c4c3eb52dff8a79473b3804bf38bd170ef65b4de8536d19a8e3600c0a973afde634d6f38fc59cf94fb9e24a91e31ee6aa5e08433611a6c565b505050565b6000806000808411610914576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f416d6f756e74206d7573742062652067726561746572207468616e207a65726f6044820152606401610635565b8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16036109cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f746f6b656e4120616e6420746f6b656e42206d7573742062652064696666657260448201527f656e7400000000000000000000000000000000000000000000000000000000006064820152608401610635565b6000808773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1603610a4057859150610a397f000000000000000000000000f5f7231073b3b41c04ba655e1a7438b1a7b29c27898961053e60028761246b565b9050610b0f565b8673ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1603610aad575084610aa67f000000000000000000000000f5f7231073b3b41c04ba655e1a7438b1a7b29c27888a61053e60028661246b565b9150610b0f565b610ad97f000000000000000000000000f5f7231073b3b41c04ba655e1a7438b1a7b29c278a8a89611566565b9150610b0c7f000000000000000000000000f5f7231073b3b41c04ba655e1a7438b1a7b29c27898961053e60028761246b565b90505b6000808073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000f5f7231073b3b41c04ba655e1a7438b1a7b29c27166398a0fb3c8c8c84610b5d60028b61246b565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b16815273ffffffffffffffffffffffffffffffffffffffff94851660048201529390921660248401521515604483015260648201526084810187905260a401606060405180830381865afa158015610be2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0691906124a6565b919450925090508083610c1a60028861246b565b610c2491906124d4565b610c2e84876124d4565b97509750975050505050509450945094915050565b60008111610cad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f416d6f756e74206d7573742062652067726561746572207468616e207a65726f6044820152606401610635565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610d68576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f746f6b656e4120616e6420746f6b656e42206d7573742062652064696666657260448201527f656e7400000000000000000000000000000000000000000000000000000000006064820152608401610635565b6040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810182905273ffffffffffffffffffffffffffffffffffffffff8516906323b872dd906064016020604051808303816000875af1158015610de1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e059190612406565b50610e138484848433611a6c565b50505050565b60016020528260005260406000206020528160005260406000208181548110610e4157600080fd5b60009182526020909120600290910201805460019091015473ffffffffffffffffffffffffffffffffffffffff9182169450908116925074010000000000000000000000000000000000000000900460ff16905083565b610ea0611d1c565b610eaa6000611d9d565b565b610eed73ffffffffffffffffffffffffffffffffffffffff86167f000000000000000000000000f5f7231073b3b41c04ba655e1a7438b1a7b29c27856118f6565b610f2e73ffffffffffffffffffffffffffffffffffffffff85167f000000000000000000000000f5f7231073b3b41c04ba655e1a7438b1a7b29c27846118f6565b6040517f5a47ddc300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015285811660248301526000604483018190526064830186905260848301859052600160a4840181905260c484015283821660e4840152426101048401529182917f000000000000000000000000f5f7231073b3b41c04ba655e1a7438b1a7b29c271690635a47ddc390610124016060604051808303816000875af1158015610ffc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102091906124a6565b5091509150818511156110ea5773ffffffffffffffffffffffffffffffffffffffff871663a9059cbb8461105485896124d4565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526044016020604051808303816000875af11580156110c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e89190612406565b505b808411156111af5773ffffffffffffffffffffffffffffffffffffffff861663a9059cbb8461111984886124d4565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526044016020604051808303816000875af1158015611189573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ad9190612406565b505b50505050505050565b6111c0611d1c565b73ffffffffffffffffffffffffffffffffffffffff808616600090815260016020908152604080832093881683529290529081206111fd9161214c565b60005b8281101561128f5773ffffffffffffffffffffffffffffffffffffffff808716600090815260016020908152604080832093891683529290522084848381811061124c5761124c6124ed565b83546001810185556000948552602090942060609091029290920192600202909101905061127a828261251c565b505080806112879061260d565b915050611200565b5073ffffffffffffffffffffffffffffffffffffffff9485166000908152600260209081526040808320969097168252949094529390922080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016931515939093179092555050565b60003411611363576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f416d6f756e74206d7573742062652067726561746572207468616e207a65726f6044820152606401610635565b73039e2fb66102314ce7b64ce5ce3e5183bc94ad3873ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b1580156113bf57600080fd5b505af11580156113d3573d6000803e3d6000fd5b50506040805160c08101825273039e2fb66102314ce7b64ce5ce3e5183bc94ad38815273b1e25689d55734fd3fffc939c4c3eb52dff8a79460208201908152308284019081523460608401908152600160808501908152600060a0860181815296517fbab2140e000000000000000000000000000000000000000000000000000000008152865173ffffffffffffffffffffffffffffffffffffffff9081166004830152955186166024820152935185166044850152915160648401525160848301529351821660a48201529195509193507f000000000000000000000000a047e2abf8263fca7c368f43e2f960a06fd9949f909116915063bab2140e9060c4016020604051808303816000875af11580156114f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115179190612423565b905061156273b1e25689d55734fd3fffc939c4c3eb52dff8a79473b3804bf38bd170ef65b4de8536d19a8e3600c0a973afde634d6f38fc59cf94fb9e24a91e31ee6aa5e08433611a6c565b5050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320868516845290915280822090517f9881fcb40000000000000000000000000000000000000000000000000000000081529192839290881691639881fcb4916115db9187916004016126bc565b600060405180830381865afa1580156115f8573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261163e9190810190612704565b90506000815111611650576000611678565b806001825161165f91906124d4565b8151811061166f5761166f6124ed565b60200260200101515b9150505b949350505050565b600034116116ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f416d6f756e74206d7573742062652067726561746572207468616e207a65726f6044820152606401610635565b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036117a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f746f6b656e4120616e6420746f6b656e42206d7573742062652064696666657260448201527f656e7400000000000000000000000000000000000000000000000000000000006064820152608401610635565b73039e2fb66102314ce7b64ce5ce3e5183bc94ad3873ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561180557600080fd5b505af1158015611819573d6000803e3d6000fd5b505050505061156273039e2fb66102314ce7b64ce5ce3e5183bc94ad3883833433611a6c565b611847611d1c565b73ffffffffffffffffffffffffffffffffffffffff81166118ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610635565b6118f381611d9d565b50565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff83811660248301526000919085169063dd62ed3e90604401602060405180830381865afa15801561196c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119909190612423565b9050610e13847f095ea7b300000000000000000000000000000000000000000000000000000000856119c286866127e0565b60405173ffffffffffffffffffffffffffffffffffffffff90921660248301526044820152606401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611e12565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611b27576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f746f6b656e4120616e6420746f6b656e42206d7573742062652064696666657260448201527f656e7400000000000000000000000000000000000000000000000000000000006064820152608401610635565b73ffffffffffffffffffffffffffffffffffffffff808616600090815260026020908152604080832093881683529290529081205460ff16611b89577f000000000000000000000000f5f7231073b3b41c04ba655e1a7438b1a7b29c27611bab565b7f0000000000000000000000001d368773735ee1e678950b7a97bca2cafb330cdc5b73ffffffffffffffffffffffffffffffffffffffff80871660009081526002602090815260408083209389168352929052908120549192509060ff16611c11577f000000000000000000000000f5f7231073b3b41c04ba655e1a7438b1a7b29c27611c33565b7f0000000000000000000000001d368773735ee1e678950b7a97bca2cafb330cdc5b90506000808773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1603611c8b57859150611c84838989611c7f60028761246b565b611f21565b9050611cfa565b8673ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1603611cd8575084611cd184888a611c7f60028661246b565b9150611cfa565b611ce4848a8a89611f21565b9150611cf7838989611c7f60028761246b565b90505b611d118888611d0a60028661246b565b8489610eac565b505050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610eaa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610635565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000611e74826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611fdb9092919063ffffffff16565b9050805160001480611e95575080806020019051810190611e959190612406565b6108a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610635565b6000611f4473ffffffffffffffffffffffffffffffffffffffff851686846118f6565b73ffffffffffffffffffffffffffffffffffffffff8481166000908152600160209081526040808320878516845290915280822090517ff41766d8000000000000000000000000000000000000000000000000000000008152919288169163f41766d891611fbc9187918691309042906004016127f3565b6000604051808303816000875af11580156115f8573d6000803e3d6000fd5b606061167c8484600085856000808673ffffffffffffffffffffffffffffffffffffffff16858760405161200f9190612860565b60006040518083038185875af1925050503d806000811461204c576040519150601f19603f3d011682016040523d82523d6000602084013e612051565b606091505b50915091506120628783838761206d565b979650505050505050565b606083156121035782516000036120fc5773ffffffffffffffffffffffffffffffffffffffff85163b6120fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610635565b508161167c565b61167c83838151156121185781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610635919061287c565b50805460008255600202906000526020600020908101906118f391905b808211156121c95780547fffffffffffffffffffffffff00000000000000000000000000000000000000001681556001810180547fffffffffffffffffffffff000000000000000000000000000000000000000000169055600201612169565b5090565b6000602082840312156121df57600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff811681146118f357600080fd5b6000806000806080858703121561221e57600080fd5b8435612229816121e6565b93506020850135612239816121e6565b92506040850135612249816121e6565b9396929550929360600135925050565b60008060006060848603121561226e57600080fd5b8335612279816121e6565b92506020840135612289816121e6565b929592945050506040919091013590565b600080600080600060a086880312156122b257600080fd5b85356122bd816121e6565b945060208601356122cd816121e6565b9350604086013592506060860135915060808601356122eb816121e6565b809150509295509295909350565b80151581146118f357600080fd5b60008060008060006080868803121561231f57600080fd5b853561232a816121e6565b9450602086013561233a816121e6565b9350604086013567ffffffffffffffff8082111561235757600080fd5b818801915088601f83011261236b57600080fd5b81358181111561237a57600080fd5b89602060608302850101111561238f57600080fd5b60208301955080945050505060608601356122eb816122f9565b600080604083850312156123bc57600080fd5b82356123c7816121e6565b915060208301356123d7816121e6565b809150509250929050565b6000602082840312156123f457600080fd5b81356123ff816121e6565b9392505050565b60006020828403121561241857600080fd5b81516123ff816122f9565b60006020828403121561243557600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000826124a1577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000806000606084860312156124bb57600080fd5b8351925060208401519150604084015190509250925092565b818103818111156124e7576124e761243c565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8135612527816121e6565b81547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff821617825550600181016020830135612578816121e6565b81547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff82161782555060408301356125c5816122f9565b81547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690151560a01b74ff0000000000000000000000000000000000000000161790555050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361263e5761263e61243c565b5060010190565b6000815480845260208085019450836000528060002060005b838110156126b157815473ffffffffffffffffffffffffffffffffffffffff9081168852600180840154918216858a015260a09190911c60ff16151560408901526060909701966002909201910161265e565b509495945050505050565b82815260406020820152600061167c6040830184612645565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000602080838503121561271757600080fd5b825167ffffffffffffffff8082111561272f57600080fd5b818501915085601f83011261274357600080fd5b815181811115612755576127556126d5565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108582111715612798576127986126d5565b6040529182528482019250838101850191888311156127b657600080fd5b938501935b828510156127d4578451845293850193928501926127bb565b98975050505050505050565b808201808211156124e7576124e761243c565b85815284602082015260a06040820152600061281260a0830186612645565b73ffffffffffffffffffffffffffffffffffffffff94909416606083015250608001529392505050565b60005b8381101561285757818101518382015260200161283f565b50506000910152565b6000825161287281846020870161283c565b9190910192915050565b602081526000825180602084015261289b81604085016020870161283c565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fea264697066735822122069bdd7c147976ef96422fba76e685d37b0e0698895e423a548abda92dc85fd6d64736f6c63430008110033
Deployed Bytecode Sourcemap
28286:7365:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28442:80;;;;;;;;;;;;28479:42;28442:80;;;;;190:42:1;178:55;;;160:74;;148:2;133:18;28442:80:0;;;;;;;;29189:31;;;;;;;;;;;;;;;31280:674;;;;;;;;;;-1:-1:-1;31280:674:0;;;;;:::i;:::-;;:::i;:::-;;28889:93;;;;;;;;;;;;28939:42;28889:93;;34510:1138;;;;;;;;;;-1:-1:-1;34510:1138:0;;;;;:::i;:::-;;:::i;:::-;;;;1640:25:1;;;1696:2;1681:18;;1674:34;;;;1724:18;;;1717:34;1628:2;1613:18;34510:1138:0;1438:319:1;29911:422:0;;;;;;;;;;-1:-1:-1;29911:422:0;;;;;:::i;:::-;;:::i;29227:27::-;;;;;;;;;;;;;;;29088:92;;;;;;;;;;;;29137:42;29088:92;;28355:80;;;;;;;;;;;;28392:42;28355:80;;28706:84;;;;;;;;;;;;28747:42;28706:84;;29298:66;;;;;;;;;;-1:-1:-1;29298:66:0;;;;;:::i;:::-;;:::i;:::-;;;;2673:42:1;2742:15;;;2724:34;;2794:15;;;;2789:2;2774:18;;2767:43;2853:14;2846:22;2826:18;;;2819:50;2651:2;2636:18;29298:66:0;2467:408:1;25836:103:0;;;;;;;;;;;;;:::i;33385:819::-;;;;;;;;;;-1:-1:-1;33385:819:0;;;;;:::i;:::-;;:::i;29594:309::-;;;;;;;;;;-1:-1:-1;29594:309:0;;;;;:::i;:::-;;:::i;30697:575::-;;;:::i;25195:87::-;;;;;;;;;;-1:-1:-1;25241:7:0;25268:6;;;25195:87;;28989:92;;;;;;;;;;;;29038:42;28989:92;;28618:81;;;;;;;;;;;;28656:42;28618:81;;28529:82;;;;;;;;;;;;28568:42;28529:82;;29261:28;;;;;;;;;;;;;;;28797:83;;;;;;;;;;;;28837:42;28797:83;;34212:290;;;;;;;;;;-1:-1:-1;34212:290:0;;;;;:::i;:::-;;:::i;:::-;;;5498:25:1;;;5486:2;5471:18;34212:290:0;5352:177:1;30341:348:0;;;;;;:::i;:::-;;:::i;29371:61::-;;;;;;;;;;-1:-1:-1;29371:61:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6092:14:1;;6085:22;6067:41;;6055:2;6040:18;29371:61:0;5927:187:1;26094:201:0;;;;;;;;;;-1:-1:-1;26094:201:0;;;;;:::i;:::-;;:::i;31280:674::-;31365:1;31354:8;:12;31346:57;;;;;;;6573:2:1;31346:57:0;;;6555:21:1;;;6592:18;;;6585:30;6651:34;6631:18;;;6624:62;6703:18;;31346:57:0;;;;;;;;;31416:60;;;;;31440:10;31416:60;;;6995:34:1;31460:4:0;7045:18:1;;;7038:43;7097:18;;;7090:34;;;28392:42:0;;31416:23;;6907:18:1;;31416:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;31487:60:0;28392:42;31528:7;31538:8;31487:32;:60::i;:::-;31608:215;;;;;;;;28392:42;31608:215;;28479:42;31608:215;;;;;;31716:4;31608:215;;;;;;;;;;;;31781:1;31608:215;;;;;;-1:-1:-1;31608:215:0;;;;;;31855:32;;;;;7695:13:1;;31608:215:0;7691:22:1;;;31855:32:0;;;7673:41:1;7756:24;;7752:33;;7730:20;;;7723:63;7828:24;;7824:33;;7802:20;;;7795:63;7896:24;;7874:20;;;7867:54;7959:24;7937:20;;;7930:54;8026:24;;8022:33;;8000:20;;;7993:63;31608:215:0;;-1:-1:-1;31855:7:0;:24;;;;;;7584:19:1;;31855:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31836:51;;31898:48;28479:42;28656;28568;31925:8;31935:10;31898:11;:48::i;:::-;31335:619;;31280:674;:::o;34510:1138::-;34672:17;34691;34710;34763:1;34748:12;:16;34740:61;;;;;;;6573:2:1;34740:61:0;;;6555:21:1;;;6592:18;;;6585:30;6651:34;6631:18;;;6624:62;6703:18;;34740:61:0;6371:356:1;34740:61:0;34830:6;34820:16;;:6;:16;;;34812:64;;;;;;;8458:2:1;34812:64:0;;;8440:21:1;8497:2;8477:18;;;8470:30;8536:34;8516:18;;;8509:62;8607:5;8587:18;;;8580:33;8630:19;;34812:64:0;8256:399:1;34812:64:0;34889:15;34915;34962:6;34947:21;;:11;:21;;;34943:478;;34995:12;;-1:-1:-1;35032:49:0;35046:5;35053:6;35061;35069:11;35079:1;34995:12;35069:11;:::i;35032:49::-;35022:59;;34943:478;;;35118:6;35103:21;;:11;:21;;;35099:322;;-1:-1:-1;35151:12:0;35188:49;35202:5;35209:6;35217;35225:11;35235:1;35151:12;35225:11;:::i;35188:49::-;35178:59;;35099:322;;;35280:55;35294:5;35301:11;35314:6;35322:12;35280:13;:55::i;:::-;35270:65;-1:-1:-1;35360:49:0;35374:5;35381:6;35389;35397:11;35407:1;35270:65;35397:11;:::i;35360:49::-;35350:59;;35099:322;35434:13;;;35494:23;:5;:23;;35518:6;35526;35434:13;35541:11;35551:1;35541:7;:11;:::i;:::-;35494:68;;;;;;;;;;9391:42:1;9460:15;;;35494:68:0;;;9442:34:1;9512:15;;;;9492:18;;;9485:43;9571:14;9564:22;9544:18;;;9537:50;9603:18;;;9596:34;9646:19;;;9639:35;;;9353:19;;35494:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35433:129;;-1:-1:-1;35433:129:0;-1:-1:-1;35433:129:0;-1:-1:-1;35433:129:0;;35603:11;35613:1;35603:7;:11;:::i;:::-;:19;;;;:::i;:::-;35624:15;35634:5;35624:7;:15;:::i;:::-;35575:65;;;;;;;;;;;34510:1138;;;;;;;;:::o;29911:422::-;30051:1;30036:12;:16;30028:61;;;;;;;6573:2:1;30028:61:0;;;6555:21:1;;;6592:18;;;6585:30;6651:34;6631:18;;;6624:62;6703:18;;30028:61:0;6371:356:1;30028:61:0;30118:6;30108:16;;:6;:16;;;30100:64;;;;;;;8458:2:1;30100:64:0;;;8440:21:1;8497:2;8477:18;;;8470:30;8536:34;8516:18;;;8509:62;8607:5;8587:18;;;8580:33;8630:19;;30100:64:0;8256:399:1;30100:64:0;30175:73;;;;;30208:10;30175:73;;;6995:34:1;30228:4:0;7045:18:1;;;7038:43;7097:18;;;7090:34;;;30175:32:0;;;;;;6907:18:1;;30175:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;30259:66;30271:11;30284:6;30292;30300:12;30314:10;30259:11;:66::i;:::-;29911:422;;;;:::o;29298:66::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29298:66:0;;;;-1:-1:-1;29298:66:0;;;;;;-1:-1:-1;29298:66:0;:::o;25836:103::-;25081:13;:11;:13::i;:::-;25901:30:::1;25928:1;25901:18;:30::i;:::-;25836:103::o:0;33385:819::-;33568:64;:36;;;33613:5;33621:10;33568:36;:64::i;:::-;33643;:36;;;33688:5;33696:10;33643:36;:64::i;:::-;33752:222;;;;;:18;10589:15:1;;;33752:222:0;;;10571:34:1;10641:15;;;10621:18;;;10614:43;33719:13:0;10673:18:1;;;10666:50;;;10732:18;;;10725:34;;;10775:19;;;10768:35;;;33897:1:0;10819:19:1;;;10812:35;;;10863:19;;;10856:35;10928:15;;;10907:19;;;10900:44;33948:15:0;10960:19:1;;;10953:35;33719:13:0;;;33752:5;:18;;;;10482:19:1;;33752:222:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33718:256;;;;;34004:5;33991:10;:18;33987:100;;;34026:23;;;;34050:4;34056:18;34069:5;34056:10;:18;:::i;:::-;34026:49;;;;;;;;;;11203:42:1;11191:55;;;34026:49:0;;;11173:74:1;11263:18;;;11256:34;11146:18;;34026:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;33987:100;34114:5;34101:10;:18;34097:100;;;34136:23;;;;34160:4;34166:18;34179:5;34166:10;:18;:::i;:::-;34136:49;;;;;;;;;;11203:42:1;11191:55;;;34136:49:0;;;11173:74:1;11263:18;;;11256:34;11146:18;;34136:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;34097:100;33557:647;;33385:819;;;;;:::o;29594:309::-;25081:13;:11;:13::i;:::-;29723:12:::1;::::0;;::::1;;::::0;;;:6:::1;:12;::::0;;;;;;;:16;;::::1;::::0;;;;;;;;29716:23:::1;::::0;::::1;:::i;:::-;29755:9;29750:101;29770:16:::0;;::::1;29750:101;;;29808:12;::::0;;::::1;;::::0;;;:6:::1;:12;::::0;;;;;;;:16;;::::1;::::0;;;;;;29830:5;;29836:1;29830:8;;::::1;;;;;:::i;:::-;29808:31:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;29808:31:0;;;::::1;::::0;;;29830:8:::1;::::0;;::::1;::::0;;;::::1;::::0;29808:31:::1;;::::0;;::::1;::::0;-1:-1:-1;29808:31:0::1;29830:8:::0;29808:31;::::1;:::i;:::-;;;29788:3;;;;;:::i;:::-;;;;29750:101;;;-1:-1:-1::0;29861:15:0::1;::::0;;::::1;;::::0;;;:9:::1;:15;::::0;;;;;;;:19;;;::::1;::::0;;;;;;;;;;:34;;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;;-1:-1:-1;;29594:309:0:o;30697:575::-;30779:1;30767:9;:13;30759:58;;;;;;;6573:2:1;30759:58:0;;;6555:21:1;;;6592:18;;;6585:30;6651:34;6631:18;;;6624:62;6703:18;;30759:58:0;6371:356:1;30759:58:0;28392:42;30828:17;;;30854:9;30828:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30925:216:0;;;;;;;;28392:42;30925:216;;28479:42;30925:216;;;;;;31033:4;30925:216;;;;;;31060:9;30925:216;;;;;;31099:1;30925:216;;;;;;-1:-1:-1;30925:216:0;;;;;;31173:32;;;;;7695:13:1;;30925:216:0;7691:22:1;;;31173:32:0;;;7673:41:1;7756:24;;7752:33;;7730:20;;;7723:63;7828:24;;7824:33;;7802:20;;;7795:63;7896:24;;7874:20;;;7867:54;7959:24;7937:20;;;7930:54;8026:24;;8022:33;;8000:20;;;7993:63;30925:216:0;;-1:-1:-1;;;;31173:7:0;:24;;;;-1:-1:-1;31173:24:0;;7584:19:1;;31173:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31154:51;;31216:48;28479:42;28656;28568;31243:8;31253:10;31216:11;:48::i;:::-;30748:524;;30697:575::o;34212:290::-;34368:17;34394:19;;;34321:7;34394:19;;;:6;:19;;;;;;;;:29;;;;;;;;;;;34368:56;;;;;34321:7;;;;34368:17;;;;;;:56;;34386:6;;34368:56;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34341:83;;34459:1;34442:7;:14;:18;:52;;34493:1;34442:52;;;34463:7;34488:1;34471:7;:14;:18;;;;:::i;:::-;34463:27;;;;;;;;:::i;:::-;;;;;;;34442:52;34435:59;;;34212:290;;;;;;;:::o;30341:348::-;30444:1;30432:9;:13;30424:58;;;;;;;6573:2:1;30424:58:0;;;6555:21:1;;;6592:18;;;6585:30;6651:34;6631:18;;;6624:62;6703:18;;30424:58:0;6371:356:1;30424:58:0;30511:6;30501:16;;:6;:16;;;30493:64;;;;;;;8458:2:1;30493:64:0;;;8440:21:1;8497:2;8477:18;;;8470:30;8536:34;8516:18;;;8509:62;8607:5;8587:18;;;8580:33;8630:19;;30493:64:0;8256:399:1;30493:64:0;28392:42;30568:17;;;30594:9;30568:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30617:64;28392:42;30642:6;30650;30658:9;30670:10;30617:11;:64::i;26094:201::-;25081:13;:11;:13::i;:::-;26183:22:::1;::::0;::::1;26175:73;;;::::0;::::1;::::0;;15456:2:1;26175:73:0::1;::::0;::::1;15438:21:1::0;15495:2;15475:18;;;15468:30;15534:34;15514:18;;;15507:62;15605:8;15585:18;;;15578:36;15631:19;;26175:73:0::1;15254:402:1::0;26175:73:0::1;26259:28;26278:8;26259:18;:28::i;:::-;26094:201:::0;:::o;18674:283::-;18794:39;;;;;18818:4;18794:39;;;15896:34:1;18794:15:0;15966::1;;;15946:18;;;15939:43;18771:20:0;;18794:15;;;;;;15808:18:1;;18794:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18771:62;-1:-1:-1;18844:105:0;18864:5;18894:22;18918:7;18927:20;18942:5;18771:62;18927:20;:::i;:::-;18871:77;;11203:42:1;11191:55;;;18871:77:0;;;11173:74:1;11263:18;;;11256:34;11146:18;;18871:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18844:19;:105::i;31962:1001::-;32162:6;32152:16;;:6;:16;;;32144:64;;;;;;;8458:2:1;32144:64:0;;;8440:21:1;8497:2;8477:18;;;8470:30;8536:34;8516:18;;;8509:62;8607:5;8587:18;;;8580:33;8630:19;;32144:64:0;8256:399:1;32144:64:0;32233:22;;;;32221:9;32233:22;;;:9;:22;;;;;;;;:30;;;;;;;;;;;;;;:47;;32275:5;32233:47;;;32266:6;32233:47;32303:17;;;;32291:9;32303:17;;;:9;:17;;;;;;;;:25;;;;;;;;;;;;32221:59;;-1:-1:-1;32291:9:0;32303:25;;:42;;32340:5;32303:42;;;32331:6;32303:42;32291:54;;32358:15;32384;32431:6;32416:21;;:11;:21;;;32412:470;;32464:12;;-1:-1:-1;32501:47:0;32514:4;32520:6;32528;32536:11;32546:1;32464:12;32536:11;:::i;:::-;32501:12;:47::i;:::-;32491:57;;32412:470;;;32585:6;32570:21;;:11;:21;;;32566:316;;-1:-1:-1;32618:12:0;32655:47;32668:4;32674:6;32682;32690:11;32700:1;32618:12;32690:11;:::i;32655:47::-;32645:57;;32566:316;;;32745:53;32758:4;32764:11;32777:6;32785:12;32745;:53::i;:::-;32735:63;-1:-1:-1;32823:47:0;32836:4;32842:6;32850;32858:11;32868:1;32735:63;32858:11;:::i;32823:47::-;32813:57;;32566:316;32894:61;32912:6;32920;32928:11;32938:1;32928:7;:11;:::i;:::-;32941:7;32950:4;32894:17;:61::i;:::-;32133:830;;;;31962:1001;;;;;:::o;25360:132::-;25241:7;25268:6;25424:23;25268:6;23805:10;25424:23;25416:68;;;;;;;16325:2:1;25416:68:0;;;16307:21:1;;;16344:18;;;16337:30;16403:34;16383:18;;;16376:62;16455:18;;25416:68:0;16123:356:1;26455:191:0;26529:16;26548:6;;;26565:17;;;;;;;;;;26598:40;;26548:6;;;;;;;26598:40;;26529:16;26598:40;26518:128;26455:191;:::o;21345:649::-;21769:23;21795:69;21823:4;21795:69;;;;;;;;;;;;;;;;;21803:5;21795:27;;;;:69;;;;;:::i;:::-;21769:95;;21883:10;:17;21904:1;21883:22;:56;;;;21920:10;21909:30;;;;;;;;;;;;:::i;:::-;21875:111;;;;;;;16686:2:1;21875:111:0;;;16668:21:1;16725:2;16705:18;;;16698:30;16764:34;16744:18;;;16737:62;16835:12;16815:18;;;16808:40;16865:19;;21875:111:0;16484:406:1;32971::0;33076:7;33096:63;:41;;;33146:3;33152:6;33096:41;:63::i;:::-;33197:28;33237:19;;;33170:24;33237:19;;;:6;:19;;;;;;;;:29;;;;;;;;;;;33197:102;;;;;33170:24;;33197:28;;;;;:102;;33226:6;;33170:24;;33276:4;;33283:15;;33197:102;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;10796:229;10933:12;10965:52;10987:6;10995:4;11001:1;11004:12;10933;12170;12184:23;12211:6;:11;;12230:5;12237:4;12211:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12169:73;;;;12260:69;12287:6;12295:7;12304:10;12316:12;12260:26;:69::i;:::-;12253:76;11882:455;-1:-1:-1;;;;;;;11882:455:0:o;14455:644::-;14640:12;14669:7;14665:427;;;14697:10;:17;14718:1;14697:22;14693:290;;8336:19;;;;14907:60;;;;;;;18712:2:1;14907:60:0;;;18694:21:1;18751:2;18731:18;;;18724:30;18790:31;18770:18;;;18763:59;18839:18;;14907:60:0;18510:353:1;14907:60:0;-1:-1:-1;15004:10:0;14997:17;;14665:427;15047:33;15055:10;15067:12;15802:17;;:21;15798:388;;16034:10;16028:17;16091:15;16078:10;16074:2;16070:19;16063:44;15798:388;16161:12;16154:20;;;;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;491:180:1:-;550:6;603:2;591:9;582:7;578:23;574:32;571:52;;;619:1;616;609:12;571:52;-1:-1:-1;642:23:1;;491:180;-1:-1:-1;491:180:1:o;676:154::-;762:42;755:5;751:54;744:5;741:65;731:93;;820:1;817;810:12;835:598;921:6;929;937;945;998:3;986:9;977:7;973:23;969:33;966:53;;;1015:1;1012;1005:12;966:53;1054:9;1041:23;1073:31;1098:5;1073:31;:::i;:::-;1123:5;-1:-1:-1;1180:2:1;1165:18;;1152:32;1193:33;1152:32;1193:33;:::i;:::-;1245:7;-1:-1:-1;1304:2:1;1289:18;;1276:32;1317:33;1276:32;1317:33;:::i;:::-;835:598;;;;-1:-1:-1;1369:7:1;;1423:2;1408:18;1395:32;;-1:-1:-1;;835:598:1:o;2006:456::-;2083:6;2091;2099;2152:2;2140:9;2131:7;2127:23;2123:32;2120:52;;;2168:1;2165;2158:12;2120:52;2207:9;2194:23;2226:31;2251:5;2226:31;:::i;:::-;2276:5;-1:-1:-1;2333:2:1;2318:18;;2305:32;2346:33;2305:32;2346:33;:::i;:::-;2006:456;;2398:7;;-1:-1:-1;;;2452:2:1;2437:18;;;;2424:32;;2006:456::o;2880:667::-;2975:6;2983;2991;2999;3007;3060:3;3048:9;3039:7;3035:23;3031:33;3028:53;;;3077:1;3074;3067:12;3028:53;3116:9;3103:23;3135:31;3160:5;3135:31;:::i;:::-;3185:5;-1:-1:-1;3242:2:1;3227:18;;3214:32;3255:33;3214:32;3255:33;:::i;:::-;3307:7;-1:-1:-1;3361:2:1;3346:18;;3333:32;;-1:-1:-1;3412:2:1;3397:18;;3384:32;;-1:-1:-1;3468:3:1;3453:19;;3440:33;3482;3440;3482;:::i;:::-;3534:7;3524:17;;;2880:667;;;;;;;;:::o;3552:118::-;3638:5;3631:13;3624:21;3617:5;3614:32;3604:60;;3660:1;3657;3650:12;3675:1056;3809:6;3817;3825;3833;3841;3894:3;3882:9;3873:7;3869:23;3865:33;3862:53;;;3911:1;3908;3901:12;3862:53;3950:9;3937:23;3969:31;3994:5;3969:31;:::i;:::-;4019:5;-1:-1:-1;4076:2:1;4061:18;;4048:32;4089:33;4048:32;4089:33;:::i;:::-;4141:7;-1:-1:-1;4199:2:1;4184:18;;4171:32;4222:18;4252:14;;;4249:34;;;4279:1;4276;4269:12;4249:34;4317:6;4306:9;4302:22;4292:32;;4362:7;4355:4;4351:2;4347:13;4343:27;4333:55;;4384:1;4381;4374:12;4333:55;4424:2;4411:16;4450:2;4442:6;4439:14;4436:34;;;4466:1;4463;4456:12;4436:34;4522:7;4517:2;4509:4;4501:6;4497:17;4493:2;4489:26;4485:35;4482:48;4479:68;;;4543:1;4540;4533:12;4479:68;4574:2;4570;4566:11;4556:21;;4596:6;4586:16;;;;;4654:4;4643:9;4639:20;4626:34;4669:30;4691:7;4669:30;:::i;5534:388::-;5602:6;5610;5663:2;5651:9;5642:7;5638:23;5634:32;5631:52;;;5679:1;5676;5669:12;5631:52;5718:9;5705:23;5737:31;5762:5;5737:31;:::i;:::-;5787:5;-1:-1:-1;5844:2:1;5829:18;;5816:32;5857:33;5816:32;5857:33;:::i;:::-;5909:7;5899:17;;;5534:388;;;;;:::o;6119:247::-;6178:6;6231:2;6219:9;6210:7;6206:23;6202:32;6199:52;;;6247:1;6244;6237:12;6199:52;6286:9;6273:23;6305:31;6330:5;6305:31;:::i;:::-;6355:5;6119:247;-1:-1:-1;;;6119:247:1:o;7135:245::-;7202:6;7255:2;7243:9;7234:7;7230:23;7226:32;7223:52;;;7271:1;7268;7261:12;7223:52;7303:9;7297:16;7322:28;7344:5;7322:28;:::i;8067:184::-;8137:6;8190:2;8178:9;8169:7;8165:23;8161:32;8158:52;;;8206:1;8203;8196:12;8158:52;-1:-1:-1;8229:16:1;;8067:184;-1:-1:-1;8067:184:1:o;8660:::-;8712:77;8709:1;8702:88;8809:4;8806:1;8799:15;8833:4;8830:1;8823:15;8849:274;8889:1;8915;8905:189;;8950:77;8947:1;8940:88;9051:4;9048:1;9041:15;9079:4;9076:1;9069:15;8905:189;-1:-1:-1;9108:9:1;;8849:274::o;9685:306::-;9773:6;9781;9789;9842:2;9830:9;9821:7;9817:23;9813:32;9810:52;;;9858:1;9855;9848:12;9810:52;9887:9;9881:16;9871:26;;9937:2;9926:9;9922:18;9916:25;9906:35;;9981:2;9970:9;9966:18;9960:25;9950:35;;9685:306;;;;;:::o;9996:128::-;10063:9;;;10084:11;;;10081:37;;;10098:18;;:::i;:::-;9996:128;;;;:::o;11301:184::-;11353:77;11350:1;11343:88;11450:4;11447:1;11440:15;11474:4;11471:1;11464:15;11743:815;11902:5;11889:19;11917:33;11942:7;11917:33;:::i;:::-;11594:11;;11607:66;11590:84;11687:42;11676:54;;11587:144;11574:158;;11959:62;12058:1;12052:4;12048:12;12108:2;12101:5;12097:14;12084:28;12121:33;12146:7;12121:33;:::i;:::-;11594:11;;11607:66;11590:84;11687:42;11676:54;;11587:144;11574:158;;12163:68;12279:2;12272:5;12268:14;12255:28;12292:30;12314:7;12292:30;:::i;:::-;12341:17;;12397:66;12389:75;12486:15;;12479:23;12474:3;12470:33;12505:44;12466:84;12386:165;12367:185;;-1:-1:-1;;11743:815:1:o;12563:195::-;12602:3;12633:66;12626:5;12623:77;12620:103;;12703:18;;:::i;:::-;-1:-1:-1;12750:1:1;12739:13;;12563:195::o;12763:740::-;12829:3;12867:5;12861:12;12894:6;12889:3;12882:19;12920:4;12949:2;12944:3;12940:12;12933:19;;12971:5;12968:1;12961:16;13013:2;13010:1;13000:16;13034:1;13044:434;13058:6;13055:1;13052:13;13044:434;;;13188:13;;13117:42;13184:22;;;13172:35;;13255:1;13243:14;;;13237:21;13292:18;;;13278:12;;;13271:40;13369:3;13365:19;;;;13386:4;13361:30;13354:38;13347:46;13340:4;13331:14;;13324:70;13423:4;13414:14;;;;13463:4;13451:17;;;;13073:9;13044:434;;;-1:-1:-1;13494:3:1;;12763:740;-1:-1:-1;;;;;12763:740:1:o;13508:383::-;13753:6;13742:9;13735:25;13796:2;13791;13780:9;13776:18;13769:30;13716:4;13816:69;13881:2;13870:9;13866:18;13858:6;13816:69;:::i;13896:184::-;13948:77;13945:1;13938:88;14045:4;14042:1;14035:15;14069:4;14066:1;14059:15;14085:1164;14180:6;14211:2;14254;14242:9;14233:7;14229:23;14225:32;14222:52;;;14270:1;14267;14260:12;14222:52;14303:9;14297:16;14332:18;14373:2;14365:6;14362:14;14359:34;;;14389:1;14386;14379:12;14359:34;14427:6;14416:9;14412:22;14402:32;;14472:7;14465:4;14461:2;14457:13;14453:27;14443:55;;14494:1;14491;14484:12;14443:55;14523:2;14517:9;14545:2;14541;14538:10;14535:36;;;14551:18;;:::i;:::-;14597:2;14594:1;14590:10;14629:2;14623:9;14688:66;14683:2;14679;14675:11;14671:84;14663:6;14659:97;14806:6;14794:10;14791:22;14786:2;14774:10;14771:18;14768:46;14765:72;;;14817:18;;:::i;:::-;14853:2;14846:22;14903:18;;;14937:15;;;;-1:-1:-1;14979:11:1;;;14975:20;;;15007:19;;;15004:39;;;15039:1;15036;15029:12;15004:39;15063:11;;;;15083:135;15099:6;15094:3;15091:15;15083:135;;;15165:10;;15153:23;;15116:12;;;;15196;;;;15083:135;;;15237:6;14085:1164;-1:-1:-1;;;;;;;;14085:1164:1:o;15993:125::-;16058:9;;;16079:10;;;16076:36;;;16092:18;;:::i;16895:656::-;17232:6;17221:9;17214:25;17275:6;17270:2;17259:9;17255:18;17248:34;17318:3;17313:2;17302:9;17298:18;17291:31;17195:4;17339:70;17404:3;17393:9;17389:19;17381:6;17339:70;:::i;:::-;17457:42;17445:55;;;;17440:2;17425:18;;17418:83;-1:-1:-1;17532:3:1;17517:19;17510:35;17331:78;16895:656;-1:-1:-1;;;16895:656:1:o;17963:250::-;18048:1;18058:113;18072:6;18069:1;18066:13;18058:113;;;18148:11;;;18142:18;18129:11;;;18122:39;18094:2;18087:10;18058:113;;;-1:-1:-1;;18205:1:1;18187:16;;18180:27;17963:250::o;18218:287::-;18347:3;18385:6;18379:13;18401:66;18460:6;18455:3;18448:4;18440:6;18436:17;18401:66;:::i;:::-;18483:16;;;;;18218:287;-1:-1:-1;;18218:287:1:o;18868:455::-;19017:2;19006:9;18999:21;18980:4;19049:6;19043:13;19092:6;19087:2;19076:9;19072:18;19065:34;19108:79;19180:6;19175:2;19164:9;19160:18;19155:2;19147:6;19143:15;19108:79;:::i;:::-;19239:2;19227:15;19244:66;19223:88;19208:104;;;;19314:2;19204:113;;18868:455;-1:-1:-1;;18868:455:1:o
Swarm Source
ipfs://69bdd7c147976ef96422fba76e685d37b0e0698895e423a548abda92dc85fd6d
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 35 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
[ 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.