More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 6,379 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Hyperswap | 12400077 | 48 mins ago | IN | 0.0000121 S | 0.01047622 | ||||
Hyperswap | 12400030 | 48 mins ago | IN | 0.0000121 S | 0.01047622 | ||||
Hyperswap | 12399981 | 49 mins ago | IN | 0.0000121 S | 0.01047622 | ||||
Hyperswap | 12399948 | 49 mins ago | IN | 0.0000121 S | 0.01047622 | ||||
Hyperswap | 12399909 | 49 mins ago | IN | 0.0000121 S | 0.01047622 | ||||
Hyperswap | 12399876 | 50 mins ago | IN | 0.0000121 S | 0.01047622 | ||||
Hyperswap | 12399833 | 50 mins ago | IN | 0.0000121 S | 0.01047622 | ||||
Hyperswap | 12399782 | 50 mins ago | IN | 0.0000121 S | 0.01047622 | ||||
Hyperswap | 12399738 | 51 mins ago | IN | 0.0000121 S | 0.01047622 | ||||
Hyperswap | 12399692 | 51 mins ago | IN | 0.0000121 S | 0.01047622 | ||||
Hyperswap | 12399648 | 51 mins ago | IN | 0.0000121 S | 0.01047622 | ||||
Hyperswap | 12399606 | 52 mins ago | IN | 0.0000121 S | 0.01047622 | ||||
Hyperswap | 12399557 | 52 mins ago | IN | 0.0000121 S | 0.01047622 | ||||
Hyperswap | 12399522 | 52 mins ago | IN | 0.0000121 S | 0.01047622 | ||||
Hyperswap | 12399485 | 53 mins ago | IN | 0.0000121 S | 0.01047622 | ||||
Hyperswap | 12399399 | 53 mins ago | IN | 0.0000121 S | 0.01219606 | ||||
Hyperswap | 12399357 | 54 mins ago | IN | 0.0000121 S | 0.01047622 | ||||
Hyperswap | 12399324 | 54 mins ago | IN | 0.0000121 S | 0.01047622 | ||||
Hyperswap | 12399298 | 54 mins ago | IN | 0.0000121 S | 0.01047622 | ||||
Hyperswap | 12399259 | 55 mins ago | IN | 0.0000121 S | 0.01047622 | ||||
Hyperswap | 12399220 | 55 mins ago | IN | 0.0000121 S | 0.01066284 | ||||
Hyperswap | 12399183 | 55 mins ago | IN | 0.0000121 S | 0.01047622 | ||||
Hyperswap | 12399145 | 56 mins ago | IN | 0.0000121 S | 0.01047622 | ||||
Hyperswap | 12399093 | 56 mins ago | IN | 0.0000121 S | 0.01047622 | ||||
Hyperswap | 12399052 | 56 mins ago | IN | 0.0000121 S | 0.01047622 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
12400077 | 48 mins ago | 0.0000121 S | ||||
12400030 | 48 mins ago | 0.0000121 S | ||||
12399981 | 49 mins ago | 0.0000121 S | ||||
12399948 | 49 mins ago | 0.0000121 S | ||||
12399909 | 49 mins ago | 0.0000121 S | ||||
12399876 | 50 mins ago | 0.0000121 S | ||||
12399833 | 50 mins ago | 0.0000121 S | ||||
12399782 | 50 mins ago | 0.0000121 S | ||||
12399738 | 51 mins ago | 0.0000121 S | ||||
12399692 | 51 mins ago | 0.0000121 S | ||||
12399648 | 51 mins ago | 0.0000121 S | ||||
12399606 | 52 mins ago | 0.0000121 S | ||||
12399557 | 52 mins ago | 0.0000121 S | ||||
12399522 | 52 mins ago | 0.0000121 S | ||||
12399485 | 53 mins ago | 0.0000121 S | ||||
12399399 | 53 mins ago | 0.0000121 S | ||||
12399357 | 54 mins ago | 0.0000121 S | ||||
12399324 | 54 mins ago | 0.0000121 S | ||||
12399298 | 54 mins ago | 0.0000121 S | ||||
12399259 | 55 mins ago | 0.0000121 S | ||||
12399220 | 55 mins ago | 0.0000121 S | ||||
12399183 | 55 mins ago | 0.0000121 S | ||||
12399145 | 56 mins ago | 0.0000121 S | ||||
12399093 | 56 mins ago | 0.0000121 S | ||||
12399052 | 56 mins ago | 0.0000121 S |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
HypersonicRouterV1
Compiler Version
v0.8.28+commit.7893614a
Contract Source Code (Solidity)
/** *Submitted for verification at SonicScan.org on 2024-12-15 */ /* ████████████████ @title HYPERSONIC ROUTER V1 ▓▓▓▓▓▓▓▓▓▓▓█████ ██████████ @website https://hypersonic.exchange ▓▓▓▓▓▓▓▓▓████████ ████▓▓▓▓▓▓▓ @documentation https://docs.hypersonic.exchange ▒▒▒▒▒▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒▒▒▒ @github https://github.com/hypersonicexchange ▒▒▒▓▓▓▓▓▓▓▓▓▓▓▓▓▒▒▒▒░ ▓▓▓▓▓▓▓▓▓▓▓▓▒░ ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓███████▓▒░░▒▓████████▓▒░▒▓███████▓▒░ ░▒▓███████▓▒░░▒▓██████▓▒░░▒▓███████▓▒░░▒▓█▓▒░░▒▓██████▓▒░ ███████▒▒▒▒▒▒▒▒ ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░ ▓▓▓▓▓▒▒▒▒▒▒▒▒ ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░▒▓█▓▒░ ██▓▒▒▒▒▒▒▒▒▒ ░▒▓████████▓▒░░▒▓██████▓▒░░▒▓███████▓▒░░▒▓██████▓▒░ ░▒▓███████▓▒░ ░▒▓██████▓▒░░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░▒▓█▓▒░ ▓▓▓▓▓▒▒░░ ░▒▓█▓▒░░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░ ░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░▒▓█▓▒░ ▒▒▓▒▒▒ ░▒▓█▓▒░░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░ ░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░ ▒▒▒▒ ░▒▓█▓▒░░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓████████▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓███████▓▒░ ░▒▓██████▓▒░░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓██████▓▒░ */ // SPDX-License-Identifier: MIT pragma solidity 0.8.28; // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // OpenZeppelin Contracts (last updated v4.7.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 anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing 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); } } // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-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. */ 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]. */ 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.8.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 * ==== * * [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://diligence.consensys.net/posts/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.5.11/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); } } } /** * @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; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } 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)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } 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"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } 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"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // OpenZeppelin Contracts (last updated v4.6.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); } // @dev IWETH interface IWETH { function deposit() external payable; function withdraw(uint256) external; function transfer(address to, uint256 value) external returns (bool); function transferFrom(address from, address to, uint256 value) external returns (bool); } // @dev Minimal interface for playing with a Hypersonic executor. interface IHYPERSONICEXECUTOR { struct GenericInfo { address in_token; address out_token; uint256 in_amount; uint256 min_out_amount; } function execute(GenericInfo calldata info, bytes calldata path) external payable returns (uint256); } contract HypersonicRouterV1 is Ownable { using SafeERC20 for IERC20; /********************** CONSTANTS *****************************/ address private constant ETH_ADDRESS = address(0); uint256 private constant BASIS_POINTS = 10000; uint256 private constant STORAGE_SLOT = 0xc0ffee0000000000000000000000000000000000000000000000000000000000; /*********************** MUTABLES *****************************/ IHYPERSONICEXECUTOR public HYPERSONIC_EXECUTOR; uint256 public MAX_POS_SLIPPAGE_FEE; uint64 public MAX_REFERRAL_FEE; uint32 public TOTAL_REF; address private _owner; /********************** IMMUTABLES ****************************/ IWETH public immutable WETH; /************************ EVENTS ****************************/ /// @dev Generic event emitted for each swap from one token for another. event Swap(address indexed user, address in_token, address out_token, uint256 in_amount, uint256 out_amount); /// @dev Event emitted when a referral fee is paid. event ReferralFeePaid(uint32 indexed referral_code, address indexed beneficiary, address out_token, uint256 fee_amount); /// @dev Event emitted when a new referrer is registered. event ReferralRegistered(address indexed beneficiary, uint32 indexed referral_code, uint64 referral_fee); /// @dev Event emitted when a referrer is updated. event ReferralUpdated(address indexed beneficiary, uint32 indexed referral_code, uint64 new_referral_fee); /// @dev Emitted when `HYPERSONIC_EXECUTOR` is updated to a new version. event ExecutorUpdated(address new_executor); /************************ ERRORS ****************************/ /// @dev Throws if trying to swap token0 for token0. error SameToken(address token); /// @dev Splippage protection, throws if min_output > output. error InsufficientOutput(uint256 output, uint256 min_output); /// @dev Caller not owner. error Unauthorized(address sender, address owner); /// @dev Not `HYPERSONIC_EXECUTOR`. error InvalidExecutor(); /// @dev Throws if ETH transfer fail. error NativeTransferFailed(); /// @dev Throws if Referrer fee > MAX_REFERRAL_FEE. error FeeTooHigh(uint64 fee, uint64 MAX_REFERRAL_FEE); /// @dev Throws if try to desactivate an unexisting referral_code. error NoActiveReferral(); /*********************** STRUCTS ****************************/ /// @dev Struct only used internally for assembly operations. struct GenericInfo { address in_token; address out_token; uint256 in_amount; uint256 min_out_amount; uint32 referral_code; } /// @dev Struct with all information for a given referral. struct ReferralInfo { uint64 referral_fee; address beneficiary; bool registered; } /// @dev Contains ReferralInfo struct for a `referral_code`. mapping(uint32 => ReferralInfo) public referral_lookup; /// @dev Contains `referral_code` from beneficiary address. mapping(address => uint32) public beneficiary_code; constructor( address _weth, address _executor, uint256 _initMPSF, uint64 _initMRF ) Ownable() { WETH = IWETH(_weth); HYPERSONIC_EXECUTOR = IHYPERSONICEXECUTOR(_executor); MAX_POS_SLIPPAGE_FEE = _initMPSF; MAX_REFERRAL_FEE = _initMRF; } /*************************************************************** HYPERSWAP ***************************************************************/ /// @notice Optimized hyperswap using compact calldata encoding. /// @param info Encoded GenericInfo struct. /// @param path Encoded path to be executed by `HYPERSONIC_EXECUTOR`. function hyperswap(bytes calldata info, bytes calldata path) external payable returns (uint256) { GenericInfo memory swap_info; assembly { function get_address(curr_pos) -> res, new_pos { let pre := shr(240, calldataload(curr_pos)) switch pre case 0x0000 { res := 0 new_pos := add(curr_pos, 2) } case 0x0001 { res := and(shr(96, calldataload(add(curr_pos, 2))), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) new_pos := add(curr_pos, 22) } default { res := sload(add(STORAGE_SLOT, sub(pre, 2))) new_pos := add(curr_pos, 2) } } function get_amount(curr_pos) -> res, new_pos { let l := shr(248, calldataload(curr_pos)) res := shr(sub(256, mul(l, 8)), calldataload(add(curr_pos, 1))) new_pos := add(curr_pos, add(l, 1)) } let pos := info.offset let end := add(info.offset, info.length) let res res, pos := get_address(pos) mstore(swap_info, res) res, pos := get_address(pos) mstore(add(swap_info, 0x20), res) let amount amount, pos := get_amount(pos) mstore(add(swap_info, 0x40), amount) amount, pos := get_amount(pos) mstore(add(swap_info, 0x60), amount) let r_bytes := sub(end, pos) if gt(r_bytes, 3) { let referral_code := shr(224, calldataload(pos)) mstore(add(swap_info, 0x80), referral_code) } } return _execute_hyperswap(swap_info, path); } /// @notice Internal function to execute the hyperswap after decoding params. /// @dev Separated to avoid stack too deep err. function _execute_hyperswap(GenericInfo memory swap_info, bytes calldata path) internal returns (uint256 user_amount) { if (swap_info.in_token == swap_info.out_token) revert SameToken(swap_info.in_token); address IN = _handle_input(swap_info.in_token, swap_info.in_amount); address OUT = _get_output(swap_info.out_token); IERC20(IN).approve(address(HYPERSONIC_EXECUTOR), swap_info.in_amount); uint256 out_amount = HYPERSONIC_EXECUTOR.execute(IHYPERSONICEXECUTOR.GenericInfo({ in_token: IN, out_token: OUT, in_amount: swap_info.in_amount, min_out_amount: swap_info.min_out_amount }), path); if (out_amount < swap_info.min_out_amount) revert InsufficientOutput(out_amount, swap_info.min_out_amount); out_amount = _process_slippage(out_amount, swap_info.min_out_amount); uint256 ref_fee = 0; if (swap_info.referral_code != 0) ref_fee = _process_referral(swap_info.referral_code, out_amount, OUT); user_amount = out_amount - ref_fee; _handle_output(swap_info.out_token, user_amount); emit Swap(msg.sender, swap_info.in_token, swap_info.out_token, swap_info.in_amount, user_amount); return user_amount; } /************************************************************** HELPERS **************************************************************/ /// @notice View function to get a cached address by index. /// @param index Index to lookup into STORAGE_SLOT for usage when storage is cheaper than calldata. function get_from_cache(uint256 index) external view returns (address result) { assembly { result := sload(add(STORAGE_SLOT, index)) } } /// @notice Internal function to handle input wrapping or input transferFrom. function _handle_input(address in_token, uint256 in_amount) internal returns (address) { if (in_token == ETH_ADDRESS) { require(msg.value == in_amount, "WRONG_INPUT"); _wrapETH(); return address(WETH); } else { IERC20(in_token).safeTransferFrom(msg.sender, address(this), in_amount); return in_token; } } /// @notice Internal function to handle output unwrapping and/or output transfer. function _handle_output(address out_token, uint256 out_amount) internal { if (out_token == ETH_ADDRESS) { _unwrapETH(out_amount); payable(msg.sender).transfer(out_amount); } else IERC20(out_token).safeTransfer(msg.sender, out_amount); } /// @notice Internal (reduce code repetition). function _get_output(address out_token) internal view returns (address) { return out_token == ETH_ADDRESS ? address(WETH) : out_token; } /// @notice Internal function to calculate if positive slippage to collect. function _process_slippage(uint256 amount_out, uint256 min_amount_out) internal view returns (uint256) { if (amount_out > min_amount_out) return amount_out - (((amount_out - min_amount_out) * MAX_POS_SLIPPAGE_FEE) / BASIS_POINTS); else return amount_out; } /// @notice Internal function to process referral and pay the fee if applicable. function _process_referral(uint32 referral_code, uint256 out_amount, address out_token) internal returns (uint256 fee_amount) { ReferralInfo memory referral = referral_lookup[referral_code]; if (!referral.registered) return 0; fee_amount = (out_amount * referral.referral_fee) / BASIS_POINTS; if (fee_amount == 0) return 0; IERC20(out_token).safeTransfer(referral.beneficiary, fee_amount); emit ReferralFeePaid(referral_code, referral.beneficiary, out_token, fee_amount); return fee_amount; } /************************************************************** WRAPPING **************************************************************/ /// @notice Internal function to wrap Native to WNative. function _wrapETH() internal { WETH.deposit{value: msg.value}(); } /// @notice Internal function to unwrap WNative to Native. function _unwrapETH(uint256 amount) internal { WETH.withdraw(amount); } /// @notice External function for a direct wrap Native to WNative. function wrapETH() external payable { uint256 amount = msg.value; WETH.deposit{value: amount}(); require(WETH.transfer(msg.sender, amount)); } /// @notice External function for a direct unwrap WNative to Native. function unwrapETH(uint256 amount) external { require(WETH.transferFrom(msg.sender, address(this), amount)); WETH.withdraw(amount); payable(msg.sender).transfer(amount); } /************************************************************** REFERRAL **************************************************************/ /// @notice Register as a referrer or update your referral fee. /// @param referral_fee The fee percentage in basis points. function register_ref_code(uint64 referral_fee) external { if (referral_fee > MAX_REFERRAL_FEE) revert FeeTooHigh(referral_fee, MAX_REFERRAL_FEE); uint32 code = beneficiary_code[msg.sender]; if (code != 0) { ReferralInfo storage referral = referral_lookup[code]; referral.referral_fee = referral_fee; emit ReferralUpdated(msg.sender, code, referral_fee); } else { TOTAL_REF++; uint32 new_code = TOTAL_REF; referral_lookup[new_code] = ReferralInfo({ referral_fee: referral_fee, beneficiary: msg.sender, registered: true }); beneficiary_code[msg.sender] = new_code; emit ReferralRegistered(msg.sender, new_code, referral_fee); } } /************************************************************** CONFIG **************************************************************/ // @notice Add new address to cache storage slot for usage when storage is cheaper than calldata. /// @param idx Storage index. /// @param addr Address to cache. function add_CACHE(uint256 idx, address addr) external onlyOwner { assembly { sstore(add(STORAGE_SLOT, idx), addr) } } /// @notice Add new addresses in bulk to cache storage slot for usage when storage is cheaper than calldata. /// @param idxs Array of storage index. /// @param addrs Array of addresses to cache. function bulk_CACHE(uint256[] calldata idxs, address[] calldata addrs) external onlyOwner { assembly { let len := addrs.length for { let i := 0 } lt(i, len) { i := add(i, 1) } { let idx := calldataload(add(idxs.offset, mul(i, 0x20))) let addr := calldataload(add(addrs.offset, mul(i, 0x20))) sstore(add(STORAGE_SLOT, idx), addr) } } } /// @notice Update `HYPERSONIC_EXECUTOR` version. function set_EXEC(address _executor) external onlyOwner { HYPERSONIC_EXECUTOR = IHYPERSONICEXECUTOR(_executor); emit ExecutorUpdated(_executor); } /// @notice Update `MAX_POS_SLIPPAGE_FEE`. function set_MPSF(uint256 _MPSF) external onlyOwner { MAX_POS_SLIPPAGE_FEE = _MPSF; } /// @notice Update `MAX_REFERRAL_FEE`. function set_MRF(uint64 _MRF) external onlyOwner { MAX_REFERRAL_FEE = _MRF; } /************************************************************** WITHDRAWALS **************************************************************/ /// @notice Withdraw Native. function eth_withdraw() external onlyOwner { uint256 amount = address(this).balance; payable(owner()).transfer(amount); } /// @notice Withdraw an ERC20. function s_withdraw(address token) external onlyOwner { uint256 amount = IERC20(token).balanceOf(address(this)); IERC20(token).safeTransfer(owner(), amount); } /// @notice Withdraw multiple ERC20s. function m_withdraw(address[] memory tokens) external onlyOwner { for (uint256 i = 0; i < tokens.length; i++) { uint256 amount = IERC20(tokens[i]).balanceOf(address(this)); IERC20(tokens[i]).safeTransfer(owner(), amount); } } receive() external payable {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_weth","type":"address"},{"internalType":"address","name":"_executor","type":"address"},{"internalType":"uint256","name":"_initMPSF","type":"uint256"},{"internalType":"uint64","name":"_initMRF","type":"uint64"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint64","name":"fee","type":"uint64"},{"internalType":"uint64","name":"MAX_REFERRAL_FEE","type":"uint64"}],"name":"FeeTooHigh","type":"error"},{"inputs":[{"internalType":"uint256","name":"output","type":"uint256"},{"internalType":"uint256","name":"min_output","type":"uint256"}],"name":"InsufficientOutput","type":"error"},{"inputs":[],"name":"InvalidExecutor","type":"error"},{"inputs":[],"name":"NativeTransferFailed","type":"error"},{"inputs":[],"name":"NoActiveReferral","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SameToken","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"new_executor","type":"address"}],"name":"ExecutorUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint32","name":"referral_code","type":"uint32"},{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"address","name":"out_token","type":"address"},{"indexed":false,"internalType":"uint256","name":"fee_amount","type":"uint256"}],"name":"ReferralFeePaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":true,"internalType":"uint32","name":"referral_code","type":"uint32"},{"indexed":false,"internalType":"uint64","name":"referral_fee","type":"uint64"}],"name":"ReferralRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":true,"internalType":"uint32","name":"referral_code","type":"uint32"},{"indexed":false,"internalType":"uint64","name":"new_referral_fee","type":"uint64"}],"name":"ReferralUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address","name":"in_token","type":"address"},{"indexed":false,"internalType":"address","name":"out_token","type":"address"},{"indexed":false,"internalType":"uint256","name":"in_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"out_amount","type":"uint256"}],"name":"Swap","type":"event"},{"inputs":[],"name":"HYPERSONIC_EXECUTOR","outputs":[{"internalType":"contract IHYPERSONICEXECUTOR","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_POS_SLIPPAGE_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_REFERRAL_FEE","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOTAL_REF","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"contract IWETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"idx","type":"uint256"},{"internalType":"address","name":"addr","type":"address"}],"name":"add_CACHE","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"beneficiary_code","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"idxs","type":"uint256[]"},{"internalType":"address[]","name":"addrs","type":"address[]"}],"name":"bulk_CACHE","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"eth_withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"get_from_cache","outputs":[{"internalType":"address","name":"result","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"info","type":"bytes"},{"internalType":"bytes","name":"path","type":"bytes"}],"name":"hyperswap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokens","type":"address[]"}],"name":"m_withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"","type":"uint32"}],"name":"referral_lookup","outputs":[{"internalType":"uint64","name":"referral_fee","type":"uint64"},{"internalType":"address","name":"beneficiary","type":"address"},{"internalType":"bool","name":"registered","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"referral_fee","type":"uint64"}],"name":"register_ref_code","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"s_withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_executor","type":"address"}],"name":"set_EXEC","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_MPSF","type":"uint256"}],"name":"set_MPSF","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"_MRF","type":"uint64"}],"name":"set_MRF","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"unwrapETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wrapETH","outputs":[],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60a060405234801561000f575f5ffd5b506040516123f33803806123f383398101604081905261002e916100f2565b61003733610088565b6001600160a01b03938416608052600180546001600160a01b0319169390941692909217909255600291909155600380546001600160401b0319166001600160401b0390921691909117905561014a565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b03811681146100ed575f5ffd5b919050565b5f5f5f5f60808587031215610105575f5ffd5b61010e856100d7565b935061011c602086016100d7565b6040860151606087015191945092506001600160401b038116811461013f575f5ffd5b939692955090935050565b60805161225961019a5f395f818161046701528181610be701528181610c9401528181610e3401528181610eea0152818161163c015281816116b001528181611a010152611b1101526122595ff3fe60806040526004361061017a575f3560e01c806375b0b2b0116100d1578063adb084c61161007c578063e7909b6b11610057578063e7909b6b146104f8578063ef624e1414610517578063f2fde38b14610557575f5ffd5b8063adb084c614610489578063b7a2908e146104a8578063d2a69501146104d9575f5ffd5b8063a2c5292c116100ac578063a2c5292c14610394578063a85ef6781461044e578063ad5c464814610456575f5ffd5b806375b0b2b01461033857806380502b92146103575780638da5cb5b1461036b575f5ffd5b8063468c32bf116101315780636de271991161010c5780636de27199146102f2578063707abc9b14610311578063715018a614610324575f5ffd5b8063468c32bf146102775780634bc4e085146102965780636b2b65fd146102d3575f5ffd5b80631e61079c116101615780631e61079c146101ce5780631f47cc1914610207578063397630df14610258575f5ffd5b8062f22c7c146101855780630b7008ef146101ad575f5ffd5b3661018157005b5f5ffd5b348015610190575f5ffd5b5061019a60025481565b6040519081526020015b60405180910390f35b3480156101b8575f5ffd5b506101cc6101c7366004611cd2565b610576565b005b3480156101d9575f5ffd5b506003546101ee9067ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016101a4565b348015610212575f5ffd5b506001546102339073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101a4565b348015610263575f5ffd5b506101cc610272366004611d21565b6105b9565b348015610282575f5ffd5b506101cc610291366004611cd2565b6105e8565b3480156102a1575f5ffd5b506003546102be9068010000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016101a4565b3480156102de575f5ffd5b506101cc6102ed366004611d93565b610880565b3480156102fd575f5ffd5b506101cc61030c366004611dff565b6108d2565b61019a61031f366004611e54565b6108df565b34801561032f575f5ffd5b506101cc610a3b565b348015610343575f5ffd5b506101cc610352366004611ee1565b610a4e565b348015610362575f5ffd5b506101cc610b78565b348015610376575f5ffd5b505f5473ffffffffffffffffffffffffffffffffffffffff16610233565b34801561039f575f5ffd5b506104116103ae366004611fca565b60046020525f908152604090205467ffffffffffffffff81169068010000000000000000810473ffffffffffffffffffffffffffffffffffffffff16907c0100000000000000000000000000000000000000000000000000000000900460ff1683565b6040805167ffffffffffffffff909416845273ffffffffffffffffffffffffffffffffffffffff90921660208401521515908201526060016101a4565b6101cc610be1565b348015610461575f5ffd5b506102337f000000000000000000000000000000000000000000000000000000000000000081565b348015610494575f5ffd5b506101cc6104a3366004611fed565b610d22565b3480156104b3575f5ffd5b506102be6104c2366004611fed565b60056020525f908152604090205463ffffffff1681565b3480156104e4575f5ffd5b506101cc6104f3366004611dff565b610df9565b348015610503575f5ffd5b506101cc610512366004611fed565b610f80565b348015610522575f5ffd5b50610233610531366004611dff565b7fc0ffee0000000000000000000000000000000000000000000000000000000000015490565b348015610562575f5ffd5b506101cc610571366004611fed565b611001565b61057e6110b5565b600380547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b6105c16110b5565b7fc0ffee000000000000000000000000000000000000000000000000000000000090910155565b60035467ffffffffffffffff908116908216111561064f576003546040517f981138dc00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff808416600483015290911660248201526044015b60405180910390fd5b335f9081526005602052604090205463ffffffff1680156106f05763ffffffff81165f8181526004602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff871690811782559251928352929133917f7bdccc6a3028815e0b8561c740b6f55b667f11805262237e04cedb63743a294491015b60405180910390a3505050565b6003805468010000000000000000900463ffffffff1690600861071283612033565b82546101009290920a63ffffffff8181021990931691831602179091556003546040805160608101825267ffffffffffffffff878116808352336020808501828152600186880190815268010000000000000000988990049099165f818152600484528881209751885493519b5197167fffffffff000000000000000000000000000000000000000000000000000000009093169290921773ffffffffffffffffffffffffffffffffffffffff909a16909802989098177fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff167c01000000000000000000000000000000000000000000000000000000009415159490940293909317909355828652600582529483902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001685179055915193845291935083927fae145c854d2f303a503186833b62c44a378fe26d76cce58bb13ec4e5a8fa144b91016106e3565b5050565b6108886110b5565b805f5b818110156108ca576020810284810135908701357fc0ffee0000000000000000000000000000000000000000000000000000000000015560010161088b565b505050505050565b6108da6110b5565b600255565b6040805160a0810182525f80825260208201819052918101829052606081018290526080810182905261097a565b5f80823560f01c8080156109545760018114610962577fc0ffedfffffffffffffffffffffffffffffffffffffffffffffffffffffffffe8201549350600285019250610973565b5f9350600285019250610973565b600285013560601c93506016850192505b5050915091565b858587015f6109888361090d565b935090508084526109988361090d565b60208601919091526001808201356008833560f890811c8281026101009081039490941c60408b015260029501858101359481013590911c9182029092039290921c60608801520190810193507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe92039190910190506003811115610a2257813560e01c60808401525b5050610a2f818585611135565b9150505b949350505050565b610a436110b5565b610a4c5f61145f565b565b610a566110b5565b5f5b815181101561087c575f828281518110610a7457610a74612057565b60209081029190910101516040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa158015610ae8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b0c9190612084565b9050610b6f610b2f5f5473ffffffffffffffffffffffffffffffffffffffff1690565b82858581518110610b4257610b42612057565b602002602001015173ffffffffffffffffffffffffffffffffffffffff166114d39092919063ffffffff16565b50600101610a58565b610b806110b5565b47610b9f5f5473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f1935050505015801561087c573d5f5f3e3d5ffd5b5f3490507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004015f604051808303818588803b158015610c4b575f5ffd5b505af1158015610c5d573d5f5f3e3d5ffd5b50506040517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018590527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16935063a9059cbb925060440190506020604051808303815f875af1158015610cf3573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d17919061209b565b610d1f575f5ffd5b50565b610d2a6110b5565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015610d94573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610db89190612084565b905061087c610ddb5f5473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff841690836114d3565b6040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906323b872dd906064016020604051808303815f875af1158015610e8f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eb3919061209b565b610ebb575f5ffd5b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632e1a7d4d906024015f604051808303815f87803b158015610f40575f5ffd5b505af1158015610f52573d5f5f3e3d5ffd5b505060405133925083156108fc02915083905f818181858888f1935050505015801561087c573d5f5f3e3d5ffd5b610f886110b5565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fd9436ef9ce00ffeabc5da2489701502d3bd1a5ed7b254a1981fc5ffef9828e119060200160405180910390a150565b6110096110b5565b73ffffffffffffffffffffffffffffffffffffffff81166110ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610646565b610d1f8161145f565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610a4c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610646565b5f836020015173ffffffffffffffffffffffffffffffffffffffff16845f015173ffffffffffffffffffffffffffffffffffffffff16036111bd5783516040517f8519674700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610646565b5f6111cf855f015186604001516115ac565b90505f6111df866020015161168b565b60015460408881015190517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9283166004820152602481019190915291925083169063095ea7b3906044016020604051808303815f875af115801561125d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611281919061209b565b506001546040805160808101825273ffffffffffffffffffffffffffffffffffffffff8581168252848116602083015289830151828401526060808b01519083015291517f19b44cd90000000000000000000000000000000000000000000000000000000081525f9392909216916319b44cd991611305918a908a906004016120ba565b6020604051808303815f875af1158015611321573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113459190612084565b905086606001518110156113955760608701516040517f2c19b8b8000000000000000000000000000000000000000000000000000000008152610646918391600401918252602082015260400190565b6113a38188606001516116d5565b60808801519091505f9063ffffffff16156113ca576113c788608001518385611714565b90505b6113d48183612158565b94506113e4886020015186611885565b87516020808a01516040808c0151815173ffffffffffffffffffffffffffffffffffffffff95861681529490921692840192909252908201526060810186905233907fcd3829a3813dc3cdd188fd3d01dcf3268c16be2fdd2dd21d0665418816e460629060800160405180910390a2505050505b9392505050565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526115a79084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526118f4565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff831661166057813414611631576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f57524f4e475f494e5055540000000000000000000000000000000000000000006044820152606401610646565b6116396119ff565b507f0000000000000000000000000000000000000000000000000000000000000000611685565b61168273ffffffffffffffffffffffffffffffffffffffff8416333085611a7e565b50815b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff8216156116ae5781611685565b7f000000000000000000000000000000000000000000000000000000000000000092915050565b5f8183111561168257600254612710906116ef8486612158565b6116f9919061216b565b6117039190612182565b61170d9084612158565b9050611685565b63ffffffff83165f9081526004602090815260408083208151606081018352905467ffffffffffffffff8116825268010000000000000000810473ffffffffffffffffffffffffffffffffffffffff16938201939093527c010000000000000000000000000000000000000000000000000000000090920460ff1615159082018190526117a4575f915050611458565b8051612710906117be9067ffffffffffffffff168661216b565b6117c89190612182565b9150815f036117da575f915050611458565b60208101516118019073ffffffffffffffffffffffffffffffffffffffff851690846114d3565b806020015173ffffffffffffffffffffffffffffffffffffffff168563ffffffff167f26261ce6e184ecf9fa8bd5f5fced12c4ee8bd9730f6598723cd82dd50a7c2104858560405161187592919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b60405180910390a3509392505050565b73ffffffffffffffffffffffffffffffffffffffff82166118d3576118a981611ae2565b604051339082156108fc029083905f818181858888f193505050501580156115a7573d5f5f3e3d5ffd5b61087c73ffffffffffffffffffffffffffffffffffffffff831633836114d3565b5f611955826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611b679092919063ffffffff16565b8051909150156115a75780806020019051810190611973919061209b565b6115a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610646565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004015f604051808303818588803b158015611a65575f5ffd5b505af1158015611a77573d5f5f3e3d5ffd5b5050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052611adc9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611525565b50505050565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632e1a7d4d906024015f604051808303815f87803b158015611a65575f5ffd5b6060610a3384845f85855f5f8673ffffffffffffffffffffffffffffffffffffffff168587604051611b9991906121ba565b5f6040518083038185875af1925050503d805f8114611bd3576040519150601f19603f3d011682016040523d82523d5f602084013e611bd8565b606091505b5091509150611be987838387611bf4565b979650505050505050565b60608315611c895782515f03611c825773ffffffffffffffffffffffffffffffffffffffff85163b611c82576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610646565b5081610a33565b610a338383815115611c9e5781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064691906121d0565b5f60208284031215611ce2575f5ffd5b813567ffffffffffffffff81168114611458575f5ffd5b803573ffffffffffffffffffffffffffffffffffffffff81168114611d1c575f5ffd5b919050565b5f5f60408385031215611d32575f5ffd5b82359150611d4260208401611cf9565b90509250929050565b5f5f83601f840112611d5b575f5ffd5b50813567ffffffffffffffff811115611d72575f5ffd5b6020830191508360208260051b8501011115611d8c575f5ffd5b9250929050565b5f5f5f5f60408587031215611da6575f5ffd5b843567ffffffffffffffff811115611dbc575f5ffd5b611dc887828801611d4b565b909550935050602085013567ffffffffffffffff811115611de7575f5ffd5b611df387828801611d4b565b95989497509550505050565b5f60208284031215611e0f575f5ffd5b5035919050565b5f5f83601f840112611e26575f5ffd5b50813567ffffffffffffffff811115611e3d575f5ffd5b602083019150836020828501011115611d8c575f5ffd5b5f5f5f5f60408587031215611e67575f5ffd5b843567ffffffffffffffff811115611e7d575f5ffd5b611e8987828801611e16565b909550935050602085013567ffffffffffffffff811115611ea8575f5ffd5b611df387828801611e16565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f60208284031215611ef1575f5ffd5b813567ffffffffffffffff811115611f07575f5ffd5b8201601f81018413611f17575f5ffd5b803567ffffffffffffffff811115611f3157611f31611eb4565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f830116810181811067ffffffffffffffff82111715611f7c57611f7c611eb4565b604052918252602081840181019290810187841115611f99575f5ffd5b6020850194505b83851015611fbf57611fb185611cf9565b815260209485019401611fa0565b509695505050505050565b5f60208284031215611fda575f5ffd5b813563ffffffff81168114611458575f5ffd5b5f60208284031215611ffd575f5ffd5b61145882611cf9565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f63ffffffff821663ffffffff810361204e5761204e612006565b60010192915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f60208284031215612094575f5ffd5b5051919050565b5f602082840312156120ab575f5ffd5b81518015158114611458575f5ffd5b73ffffffffffffffffffffffffffffffffffffffff845116815273ffffffffffffffffffffffffffffffffffffffff6020850151166020820152604084015160408201526060840151606082015260a060808201528160a0820152818360c08301375f81830160c090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016010192915050565b8181038181111561168557611685612006565b808202811582820484141761168557611685612006565b5f826121b5577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b5f82518060208501845e5f920191825250919050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168401019150509291505056fea2646970667358221220c1703858a74ddedd97df6beb8e86e4abe9c2ebd7617f1ab3961c696fd0ecab3064736f6c634300081c0033000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000064
Deployed Bytecode
0x60806040526004361061017a575f3560e01c806375b0b2b0116100d1578063adb084c61161007c578063e7909b6b11610057578063e7909b6b146104f8578063ef624e1414610517578063f2fde38b14610557575f5ffd5b8063adb084c614610489578063b7a2908e146104a8578063d2a69501146104d9575f5ffd5b8063a2c5292c116100ac578063a2c5292c14610394578063a85ef6781461044e578063ad5c464814610456575f5ffd5b806375b0b2b01461033857806380502b92146103575780638da5cb5b1461036b575f5ffd5b8063468c32bf116101315780636de271991161010c5780636de27199146102f2578063707abc9b14610311578063715018a614610324575f5ffd5b8063468c32bf146102775780634bc4e085146102965780636b2b65fd146102d3575f5ffd5b80631e61079c116101615780631e61079c146101ce5780631f47cc1914610207578063397630df14610258575f5ffd5b8062f22c7c146101855780630b7008ef146101ad575f5ffd5b3661018157005b5f5ffd5b348015610190575f5ffd5b5061019a60025481565b6040519081526020015b60405180910390f35b3480156101b8575f5ffd5b506101cc6101c7366004611cd2565b610576565b005b3480156101d9575f5ffd5b506003546101ee9067ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016101a4565b348015610212575f5ffd5b506001546102339073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101a4565b348015610263575f5ffd5b506101cc610272366004611d21565b6105b9565b348015610282575f5ffd5b506101cc610291366004611cd2565b6105e8565b3480156102a1575f5ffd5b506003546102be9068010000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016101a4565b3480156102de575f5ffd5b506101cc6102ed366004611d93565b610880565b3480156102fd575f5ffd5b506101cc61030c366004611dff565b6108d2565b61019a61031f366004611e54565b6108df565b34801561032f575f5ffd5b506101cc610a3b565b348015610343575f5ffd5b506101cc610352366004611ee1565b610a4e565b348015610362575f5ffd5b506101cc610b78565b348015610376575f5ffd5b505f5473ffffffffffffffffffffffffffffffffffffffff16610233565b34801561039f575f5ffd5b506104116103ae366004611fca565b60046020525f908152604090205467ffffffffffffffff81169068010000000000000000810473ffffffffffffffffffffffffffffffffffffffff16907c0100000000000000000000000000000000000000000000000000000000900460ff1683565b6040805167ffffffffffffffff909416845273ffffffffffffffffffffffffffffffffffffffff90921660208401521515908201526060016101a4565b6101cc610be1565b348015610461575f5ffd5b506102337f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad3881565b348015610494575f5ffd5b506101cc6104a3366004611fed565b610d22565b3480156104b3575f5ffd5b506102be6104c2366004611fed565b60056020525f908152604090205463ffffffff1681565b3480156104e4575f5ffd5b506101cc6104f3366004611dff565b610df9565b348015610503575f5ffd5b506101cc610512366004611fed565b610f80565b348015610522575f5ffd5b50610233610531366004611dff565b7fc0ffee0000000000000000000000000000000000000000000000000000000000015490565b348015610562575f5ffd5b506101cc610571366004611fed565b611001565b61057e6110b5565b600380547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b6105c16110b5565b7fc0ffee000000000000000000000000000000000000000000000000000000000090910155565b60035467ffffffffffffffff908116908216111561064f576003546040517f981138dc00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff808416600483015290911660248201526044015b60405180910390fd5b335f9081526005602052604090205463ffffffff1680156106f05763ffffffff81165f8181526004602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff871690811782559251928352929133917f7bdccc6a3028815e0b8561c740b6f55b667f11805262237e04cedb63743a294491015b60405180910390a3505050565b6003805468010000000000000000900463ffffffff1690600861071283612033565b82546101009290920a63ffffffff8181021990931691831602179091556003546040805160608101825267ffffffffffffffff878116808352336020808501828152600186880190815268010000000000000000988990049099165f818152600484528881209751885493519b5197167fffffffff000000000000000000000000000000000000000000000000000000009093169290921773ffffffffffffffffffffffffffffffffffffffff909a16909802989098177fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff167c01000000000000000000000000000000000000000000000000000000009415159490940293909317909355828652600582529483902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001685179055915193845291935083927fae145c854d2f303a503186833b62c44a378fe26d76cce58bb13ec4e5a8fa144b91016106e3565b5050565b6108886110b5565b805f5b818110156108ca576020810284810135908701357fc0ffee0000000000000000000000000000000000000000000000000000000000015560010161088b565b505050505050565b6108da6110b5565b600255565b6040805160a0810182525f80825260208201819052918101829052606081018290526080810182905261097a565b5f80823560f01c8080156109545760018114610962577fc0ffedfffffffffffffffffffffffffffffffffffffffffffffffffffffffffe8201549350600285019250610973565b5f9350600285019250610973565b600285013560601c93506016850192505b5050915091565b858587015f6109888361090d565b935090508084526109988361090d565b60208601919091526001808201356008833560f890811c8281026101009081039490941c60408b015260029501858101359481013590911c9182029092039290921c60608801520190810193507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe92039190910190506003811115610a2257813560e01c60808401525b5050610a2f818585611135565b9150505b949350505050565b610a436110b5565b610a4c5f61145f565b565b610a566110b5565b5f5b815181101561087c575f828281518110610a7457610a74612057565b60209081029190910101516040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa158015610ae8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b0c9190612084565b9050610b6f610b2f5f5473ffffffffffffffffffffffffffffffffffffffff1690565b82858581518110610b4257610b42612057565b602002602001015173ffffffffffffffffffffffffffffffffffffffff166114d39092919063ffffffff16565b50600101610a58565b610b806110b5565b47610b9f5f5473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f1935050505015801561087c573d5f5f3e3d5ffd5b5f3490507f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad3873ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004015f604051808303818588803b158015610c4b575f5ffd5b505af1158015610c5d573d5f5f3e3d5ffd5b50506040517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018590527f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad3873ffffffffffffffffffffffffffffffffffffffff16935063a9059cbb925060440190506020604051808303815f875af1158015610cf3573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d17919061209b565b610d1f575f5ffd5b50565b610d2a6110b5565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015610d94573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610db89190612084565b905061087c610ddb5f5473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff841690836114d3565b6040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018290527f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad3873ffffffffffffffffffffffffffffffffffffffff16906323b872dd906064016020604051808303815f875af1158015610e8f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eb3919061209b565b610ebb575f5ffd5b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018290527f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad3873ffffffffffffffffffffffffffffffffffffffff1690632e1a7d4d906024015f604051808303815f87803b158015610f40575f5ffd5b505af1158015610f52573d5f5f3e3d5ffd5b505060405133925083156108fc02915083905f818181858888f1935050505015801561087c573d5f5f3e3d5ffd5b610f886110b5565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fd9436ef9ce00ffeabc5da2489701502d3bd1a5ed7b254a1981fc5ffef9828e119060200160405180910390a150565b6110096110b5565b73ffffffffffffffffffffffffffffffffffffffff81166110ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610646565b610d1f8161145f565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610a4c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610646565b5f836020015173ffffffffffffffffffffffffffffffffffffffff16845f015173ffffffffffffffffffffffffffffffffffffffff16036111bd5783516040517f8519674700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610646565b5f6111cf855f015186604001516115ac565b90505f6111df866020015161168b565b60015460408881015190517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9283166004820152602481019190915291925083169063095ea7b3906044016020604051808303815f875af115801561125d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611281919061209b565b506001546040805160808101825273ffffffffffffffffffffffffffffffffffffffff8581168252848116602083015289830151828401526060808b01519083015291517f19b44cd90000000000000000000000000000000000000000000000000000000081525f9392909216916319b44cd991611305918a908a906004016120ba565b6020604051808303815f875af1158015611321573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113459190612084565b905086606001518110156113955760608701516040517f2c19b8b8000000000000000000000000000000000000000000000000000000008152610646918391600401918252602082015260400190565b6113a38188606001516116d5565b60808801519091505f9063ffffffff16156113ca576113c788608001518385611714565b90505b6113d48183612158565b94506113e4886020015186611885565b87516020808a01516040808c0151815173ffffffffffffffffffffffffffffffffffffffff95861681529490921692840192909252908201526060810186905233907fcd3829a3813dc3cdd188fd3d01dcf3268c16be2fdd2dd21d0665418816e460629060800160405180910390a2505050505b9392505050565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526115a79084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526118f4565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff831661166057813414611631576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f57524f4e475f494e5055540000000000000000000000000000000000000000006044820152606401610646565b6116396119ff565b507f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38611685565b61168273ffffffffffffffffffffffffffffffffffffffff8416333085611a7e565b50815b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff8216156116ae5781611685565b7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad3892915050565b5f8183111561168257600254612710906116ef8486612158565b6116f9919061216b565b6117039190612182565b61170d9084612158565b9050611685565b63ffffffff83165f9081526004602090815260408083208151606081018352905467ffffffffffffffff8116825268010000000000000000810473ffffffffffffffffffffffffffffffffffffffff16938201939093527c010000000000000000000000000000000000000000000000000000000090920460ff1615159082018190526117a4575f915050611458565b8051612710906117be9067ffffffffffffffff168661216b565b6117c89190612182565b9150815f036117da575f915050611458565b60208101516118019073ffffffffffffffffffffffffffffffffffffffff851690846114d3565b806020015173ffffffffffffffffffffffffffffffffffffffff168563ffffffff167f26261ce6e184ecf9fa8bd5f5fced12c4ee8bd9730f6598723cd82dd50a7c2104858560405161187592919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b60405180910390a3509392505050565b73ffffffffffffffffffffffffffffffffffffffff82166118d3576118a981611ae2565b604051339082156108fc029083905f818181858888f193505050501580156115a7573d5f5f3e3d5ffd5b61087c73ffffffffffffffffffffffffffffffffffffffff831633836114d3565b5f611955826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611b679092919063ffffffff16565b8051909150156115a75780806020019051810190611973919061209b565b6115a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610646565b7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad3873ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004015f604051808303818588803b158015611a65575f5ffd5b505af1158015611a77573d5f5f3e3d5ffd5b5050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052611adc9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611525565b50505050565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018290527f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad3873ffffffffffffffffffffffffffffffffffffffff1690632e1a7d4d906024015f604051808303815f87803b158015611a65575f5ffd5b6060610a3384845f85855f5f8673ffffffffffffffffffffffffffffffffffffffff168587604051611b9991906121ba565b5f6040518083038185875af1925050503d805f8114611bd3576040519150601f19603f3d011682016040523d82523d5f602084013e611bd8565b606091505b5091509150611be987838387611bf4565b979650505050505050565b60608315611c895782515f03611c825773ffffffffffffffffffffffffffffffffffffffff85163b611c82576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610646565b5081610a33565b610a338383815115611c9e5781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064691906121d0565b5f60208284031215611ce2575f5ffd5b813567ffffffffffffffff81168114611458575f5ffd5b803573ffffffffffffffffffffffffffffffffffffffff81168114611d1c575f5ffd5b919050565b5f5f60408385031215611d32575f5ffd5b82359150611d4260208401611cf9565b90509250929050565b5f5f83601f840112611d5b575f5ffd5b50813567ffffffffffffffff811115611d72575f5ffd5b6020830191508360208260051b8501011115611d8c575f5ffd5b9250929050565b5f5f5f5f60408587031215611da6575f5ffd5b843567ffffffffffffffff811115611dbc575f5ffd5b611dc887828801611d4b565b909550935050602085013567ffffffffffffffff811115611de7575f5ffd5b611df387828801611d4b565b95989497509550505050565b5f60208284031215611e0f575f5ffd5b5035919050565b5f5f83601f840112611e26575f5ffd5b50813567ffffffffffffffff811115611e3d575f5ffd5b602083019150836020828501011115611d8c575f5ffd5b5f5f5f5f60408587031215611e67575f5ffd5b843567ffffffffffffffff811115611e7d575f5ffd5b611e8987828801611e16565b909550935050602085013567ffffffffffffffff811115611ea8575f5ffd5b611df387828801611e16565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f60208284031215611ef1575f5ffd5b813567ffffffffffffffff811115611f07575f5ffd5b8201601f81018413611f17575f5ffd5b803567ffffffffffffffff811115611f3157611f31611eb4565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f830116810181811067ffffffffffffffff82111715611f7c57611f7c611eb4565b604052918252602081840181019290810187841115611f99575f5ffd5b6020850194505b83851015611fbf57611fb185611cf9565b815260209485019401611fa0565b509695505050505050565b5f60208284031215611fda575f5ffd5b813563ffffffff81168114611458575f5ffd5b5f60208284031215611ffd575f5ffd5b61145882611cf9565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f63ffffffff821663ffffffff810361204e5761204e612006565b60010192915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f60208284031215612094575f5ffd5b5051919050565b5f602082840312156120ab575f5ffd5b81518015158114611458575f5ffd5b73ffffffffffffffffffffffffffffffffffffffff845116815273ffffffffffffffffffffffffffffffffffffffff6020850151166020820152604084015160408201526060840151606082015260a060808201528160a0820152818360c08301375f81830160c090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016010192915050565b8181038181111561168557611685612006565b808202811582820484141761168557611685612006565b5f826121b5577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b5f82518060208501845e5f920191825250919050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168401019150509291505056fea2646970667358221220c1703858a74ddedd97df6beb8e86e4abe9c2ebd7617f1ab3961c696fd0ecab3064736f6c634300081c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000064
-----Decoded View---------------
Arg [0] : _weth (address): 0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38
Arg [1] : _executor (address): 0x0000000000000000000000000000000000000000
Arg [2] : _initMPSF (uint256): 100
Arg [3] : _initMRF (uint64): 100
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000064
Deployed Bytecode Sourcemap
26585:14631:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27080:35;;;;;;;;;;;;;;;;;;;160:25:1;;;148:2;133:18;27080:35:0;;;;;;;;40165:91;;;;;;;;;;-1:-1:-1;40165:91:0;;;;;:::i;:::-;;:::i;:::-;;27122:30;;;;;;;;;;-1:-1:-1;27122:30:0;;;;;;;;;;;659:18:1;647:31;;;629:50;;617:2;602:18;27122:30:0;485:200:1;27027:46:0;;;;;;;;;;-1:-1:-1;27027:46:0;;;;;;;;;;;893:42:1;881:55;;;863:74;;851:2;836:18;27027:46:0;690:253:1;38903:154:0;;;;;;;;;;-1:-1:-1;38903:154:0;;;;;:::i;:::-;;:::i;37758:782::-;;;;;;;;;;-1:-1:-1;37758:782:0;;;;;:::i;:::-;;:::i;27159:23::-;;;;;;;;;;-1:-1:-1;27159:23:0;;;;;;;;;;;;;;1628:10:1;1616:23;;;1598:42;;1586:2;1571:18;27159:23:0;1454:192:1;39275:451:0;;;;;;;;;;-1:-1:-1;39275:451:0;;;;;:::i;:::-;;:::i;40014:99::-;;;;;;;;;;-1:-1:-1;40014:99:0;;;;;:::i;:::-;;:::i;30461:1880::-;;;;;;:::i;:::-;;:::i;6451:103::-;;;;;;;;;;;;;:::i;40902:274::-;;;;;;;;;;-1:-1:-1;40902:274:0;;;;;:::i;:::-;;:::i;40481:144::-;;;;;;;;;;;;;:::i;5803:87::-;;;;;;;;;;-1:-1:-1;5849:7:0;5876:6;;;5803:87;;29574:54;;;;;;;;;;-1:-1:-1;29574:54:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6212:18:1;6200:31;;;6182:50;;6280:42;6268:55;;;6263:2;6248:18;;6241:83;6367:14;6360:22;6340:18;;;6333:50;6170:2;6155:18;29574:54:0;5988:401:1;36974:174:0;;;:::i;27290:27::-;;;;;;;;;;;;;;;40669:182;;;;;;;;;;-1:-1:-1;40669:182:0;;;;;:::i;:::-;;:::i;29700:50::-;;;;;;;;;;-1:-1:-1;29700:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;37230:203;;;;;;;;;;-1:-1:-1;37230:203:0;;;;;:::i;:::-;;:::i;39789:169::-;;;;;;;;;;-1:-1:-1;39789:169:0;;;;;:::i;:::-;;:::i;34128:172::-;;;;;;;;;;-1:-1:-1;34128:172:0;;;;;:::i;:::-;34261:12;34257:24;34251:31;;34128:172;6709:201;;;;;;;;;;-1:-1:-1;6709:201:0;;;;;:::i;:::-;;:::i;40165:91::-;5689:13;:11;:13::i;:::-;40225:16:::1;:23:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;40165:91::o;38903:154::-;5689:13;:11;:13::i;:::-;39014:12:::1;39010:22:::0;;::::1;39003:36:::0;38903:154::o;37758:782::-;37845:16;;;;;;37830:31;;;;37826:86;;;37895:16;;37870:42;;;;;37895:16;7017:31:1;;;37870:42:0;;;6999:50:1;37895:16:0;;;7065:18:1;;;7058:59;6972:18;;37870:42:0;;;;;;;;37826:86;37954:10;37923:11;37937:28;;;:16;:28;;;;;;;;37980:9;;37976:557;;38038:21;;;38006:29;38038:21;;;:15;:21;;;;;;;;;38074:36;;;;;;;;;;;;38130:47;;629:50:1;;;38038:21:0;;38146:10;;38130:47;;602:18:1;38130:47:0;;;;;;;;37991:198;37815:725;37758:782;:::o;37976:557::-;38210:9;:11;;;;;;;;:9;:11;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;38254:9;;38306:87;;;;;;;;;;;;;;;38362:10;38306:87;;;;;;;-1:-1:-1;38306:87:0;;;;;;38254:9;;;;;;;;-1:-1:-1;38278:25:0;;;:15;:25;;;;;:115;;;;;;;;;;;;;;;;;;38306:87;38278:115;;;;;;;;;;;;;;;;;;;;;;;;;;;38408:28;;;:16;:28;;;;;;:39;;;;;;;;38467:54;;629:50:1;;;38254:9:0;;-1:-1:-1;38254:9:0;;38467:54;;602:18:1;38467:54:0;485:200:1;37976:557:0;37815:725;37758:782;:::o;39275:451::-;5689:13;:11;:13::i;:::-;39415:12:::1;39456:1;39441:267;39466:3;39463:1;39460:10;39441:267;;;39557:4;39550:12:::0;::::1;39607:31:::0;;::::1;39594:45;39533:30:::0;;::::1;39520:44;39668:12;39664:22;39657:36:::0;39485:1:::1;39478:9;39441:267;;;39445:14;;39275:451:::0;;;;:::o;40014:99::-;5689:13;:11;:13::i;:::-;40077:20:::1;:28:::0;40014:99::o;30461:1880::-;-1:-1:-1;;;;;;;;30548:7:0;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;30631:662:0;;;30665:3;;30717:22;;30712:3;30708:32;;30786:112;;;;30921:6;30916:200;;;;31179:30;;;31173:37;;-1:-1:-1;31206:1:0;31243:16;;;-1:-1:-1;30758:520:0;;30786:112;30829:1;30822:8;;30877:1;30867:8;30863:16;30852:27;;30786:112;;30916:200;30998:1;30984:16;;30971:30;30967:2;30963:39;;-1:-1:-1;31094:2:0;31080:17;;;-1:-1:-1;30758:520:0;;;30631:662;;;:::o;31307:255::-;31587:11;31640;31627;31623:29;31666:7;31699:16;31711:3;31699:16;:::i;:::-;31687:28;;;;31747:3;31736:9;31729:22;31777:16;31789:3;31777:16;:::i;:::-;31829:4;31814:20;;31807:33;;;;31490:1;31476:16;;;31463:30;31458:1;31390:22;;31385:3;31381:32;;;31451:9;;;31446:3;31442:19;;;31438:56;;;;31944:4;31929:20;;31922:36;31476:16;31523:24;;31476:16;;;31463:30;31523:24;;;31390:22;31381:32;;;31451:9;;;31442:19;;;31438:56;;;;32038:4;32023:20;;32016:36;31523:24;;;;;-1:-1:-1;32081:13:0;;;;;;;;-1:-1:-1;32123:1:0;32111:14;;32108:162;;;32176:17;;32171:3;32167:27;32234:4;32219:20;;32212:43;32108:162;;;32298:35;32317:9;32328:4;;32298:18;:35::i;:::-;32291:42;;;30461:1880;;;;;;;:::o;6451:103::-;5689:13;:11;:13::i;:::-;6516:30:::1;6543:1;6516:18;:30::i;:::-;6451:103::o:0;40902:274::-;5689:13;:11;:13::i;:::-;40982:9:::1;40977:192;41001:6;:13;40997:1;:17;40977:192;;;41036:14;41060:6;41067:1;41060:9;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;41053:42:::1;::::0;;;;41089:4:::1;41053:42;::::0;::::1;863:74:1::0;41053:27:0::1;::::0;;::::1;::::0;::::1;::::0;836:18:1;;41053:42:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41036:59;;41110:47;41141:7;5849::::0;5876:6;;;;5803:87;41141:7:::1;41150:6;41117;41124:1;41117:9;;;;;;;;:::i;:::-;;;;;;;41110:30;;;;:47;;;;;:::i;:::-;-1:-1:-1::0;41016:3:0::1;;40977:192;;40481:144:::0;5689:13;:11;:13::i;:::-;40552:21:::1;40592:7;5849::::0;5876:6;;;;5803:87;40592:7:::1;40584:25;;:33;40610:6;40584:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36974:174:::0;37021:14;37038:9;37021:26;;37058:4;:12;;;37078:6;37058:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;37106:33:0;;;;;37120:10;37106:33;;;8062:74:1;8152:18;;;8145:34;;;37106:4:0;:13;;;-1:-1:-1;37106:13:0;;-1:-1:-1;8035:18:1;;;-1:-1:-1;37106:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37098:42;;;;;;37010:138;36974:174::o;40669:182::-;5689:13;:11;:13::i;:::-;40751:38:::1;::::0;;;;40783:4:::1;40751:38;::::0;::::1;863:74:1::0;40734:14:0::1;::::0;40751:23:::1;::::0;::::1;::::0;::::1;::::0;836:18:1;;40751:38:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40734:55;;40800:43;40827:7;5849::::0;5876:6;;;;5803:87;40827:7:::1;40800:26;::::0;::::1;::::0;40836:6;40800:26:::1;:43::i;37230:203::-:0;37293:52;;;;;37311:10;37293:52;;;8674:74:1;37331:4:0;8764:18:1;;;8757:83;8856:18;;;8849:34;;;37293:4:0;:17;;;;;8647:18:1;;37293:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37285:61;;;;;;37357:21;;;;;;;;160:25:1;;;37357:4:0;:13;;;;;133:18:1;;37357:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;37389:36:0;;37397:10;;-1:-1:-1;37389:36:0;;;;;-1:-1:-1;37418:6:0;;37389:36;;;;37418:6;37397:10;37389:36;;;;;;;;;;;;;;;;;;;39789:169;5689:13;:11;:13::i;:::-;39856:19:::1;:52:::0;;;::::1;;::::0;::::1;::::0;;::::1;::::0;;;39924:26:::1;::::0;863:74:1;;;39924:26:0::1;::::0;851:2:1;836:18;39924:26:0::1;;;;;;;39789:169:::0;:::o;6709:201::-;5689:13;:11;:13::i;:::-;6798:22:::1;::::0;::::1;6790:73;;;::::0;::::1;::::0;;9096:2:1;6790:73:0::1;::::0;::::1;9078:21:1::0;9135:2;9115:18;;;9108:30;9174:34;9154:18;;;9147:62;9245:8;9225:18;;;9218:36;9271:19;;6790:73:0::1;8894:402:1::0;6790:73:0::1;6874:28;6893:8;6874:18;:28::i;5968:132::-:0;5849:7;5876:6;6032:23;5876:6;4520:10;6032:23;6024:68;;;;;;;9503:2:1;6024:68:0;;;9485:21:1;;;9522:18;;;9515:30;9581:34;9561:18;;;9554:62;9633:18;;6024:68:0;9301:356:1;32485:1286:0;32582:19;32640:9;:19;;;32618:41;;:9;:18;;;:41;;;32614:83;;32678:18;;32668:29;;;;;893:42:1;881:55;;;32668:29:0;;;863:74:1;836:18;;32668:29:0;690:253:1;32614:83:0;32708:10;32721:54;32735:9;:18;;;32755:9;:19;;;32721:13;:54::i;:::-;32708:67;;32786:11;32800:32;32812:9;:19;;;32800:11;:32::i;:::-;32871:19;;32893;;;;;32844:69;;;;;:18;32871:19;;;32844:69;;;8062:74:1;8152:18;;;8145:34;;;;32786:46:0;;-1:-1:-1;32844:18:0;;;;;8035::1;;32844:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;32945:19:0;;32973:203;;;;;;;;32945:19;32973:203;;;;;;;;;;;;33089:19;;;;32973:203;;;;;33140:24;;;;32973:203;;;;32945:238;;;;;32924:18;;32945:19;;;;;:27;;:238;;33178:4;;;;32945:238;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32924:259;;33211:9;:24;;;33198:10;:37;33194:106;;;33275:24;;;;33244:56;;;;;;;33263:10;;33244:56;;10715:25:1;;;10771:2;10756:18;;10749:34;10703:2;10688:18;;10541:248;33194:106:0;33324:55;33342:10;33354:9;:24;;;33324:17;:55::i;:::-;33424:23;;;;33311:68;;-1:-1:-1;33390:15:0;;33424:28;;;33420:103;;33464:59;33482:9;:23;;;33507:10;33519:3;33464:17;:59::i;:::-;33454:69;;33420:103;33548:20;33561:7;33548:10;:20;:::i;:::-;33534:34;;33579:48;33594:9;:19;;;33615:11;33579:14;:48::i;:::-;33660:18;;33680:19;;;;;33701;;;;;33643:91;;;11176:55:1;;;11158:74;;11268:55;;;;11248:18;;;11241:83;;;;11340:18;;;11333:34;11398:2;11383:18;;11376:34;;;33648:10:0;;33643:91;;11145:3:1;11130:19;33643:91:0;;;;;;;33745:18;;;;32485:1286;;;;;;:::o;7070:191::-;7144:16;7163:6;;;7180:17;;;;;;;;;;7213:40;;7163:6;;;;;;;7213:40;;7144:16;7213:40;7133:128;7070:191;:::o;19393:211::-;19537:58;;8092:42:1;8080:55;;19537:58:0;;;8062:74:1;8152:18;;;8145:34;;;19510:86:0;;19530:5;;19560:23;;8035:18:1;;19537:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19510:19;:86::i;:::-;19393:211;;;:::o;34391:401::-;34469:7;34493:23;;;34489:296;;34554:9;34541;:22;34533:46;;;;;;;11623:2:1;34533:46:0;;;11605:21:1;11662:2;11642:18;;;11635:30;11701:13;11681:18;;;11674:41;11732:18;;34533:46:0;11421:335:1;34533:46:0;34594:10;:8;:10::i;:::-;-1:-1:-1;34634:4:0;34619:20;;34489:296;34672:71;:33;;;34706:10;34726:4;34733:9;34672:33;:71::i;:::-;-1:-1:-1;34765:8:0;34489:296;34391:401;;;;:::o;35232:150::-;35295:7;35322:24;;;;:52;;35365:9;35322:52;;;35357:4;35315:59;35232:150;-1:-1:-1;;35232:150:0:o;35471:279::-;35565:7;35602:14;35589:10;:27;35585:157;;;35672:20;;26830:5;;35641:27;35654:14;35641:10;:27;:::i;:::-;35640:52;;;;:::i;:::-;35639:69;;;;:::i;:::-;35625:84;;:10;:84;:::i;:::-;35618:91;;;;35844:561;36012:30;;;35950:18;36012:30;;;:15;:30;;;;;;;;35981:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36053:34;;36086:1;36079:8;;;;;36053:34;36125:21;;26830:5;;36112:34;;;;:10;:34;:::i;:::-;36111:51;;;;:::i;:::-;36098:64;;36177:10;36191:1;36177:15;36173:29;;36201:1;36194:8;;;;;36173:29;36244:20;;;;36213:64;;:30;;;;36266:10;36213:30;:64::i;:::-;36325:8;:20;;;36294:75;;36310:13;36294:75;;;36347:9;36358:10;36294:75;;;;;;8092:42:1;8080:55;;;;8062:74;;8167:2;8152:18;;8145:34;8050:2;8035:18;;7888:297;36294:75:0;;;;;;;;36380:17;35844:561;;;;;:::o;34887:285::-;34974:24;;;34970:194;;35015:22;35026:10;35015;:22::i;:::-;35052:40;;35060:10;;35052:40;;;;;35081:10;;35052:40;;;;35081:10;35060;35052:40;;;;;;;;;;;;;;;;;;;34970:194;35110:54;:30;;;35141:10;35153;35110:30;:54::i;22460:716::-;22884:23;22910:69;22938:4;22910:69;;;;;;;;;;;;;;;;;22918:5;22910:27;;;;:69;;;;;:::i;:::-;22994:17;;22884:95;;-1:-1:-1;22994:21:0;22990:179;;23091:10;23080:30;;;;;;;;;;;;:::i;:::-;23072:85;;;;;;;12415:2:1;23072:85:0;;;12397:21:1;12454:2;12434:18;;;12427:30;12493:34;12473:18;;;12466:62;12564:12;12544:18;;;12537:40;12594:19;;23072:85:0;12213:406:1;36658:80:0;36698:4;:12;;;36718:9;36698:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36658:80::o;19612:248::-;19783:68;;8704:42:1;8692:55;;;19783:68:0;;;8674:74:1;8784:55;;8764:18;;;8757:83;8856:18;;;8849:34;;;19756:96:0;;19776:5;;19806:27;;8647:18:1;;19783:68:0;8472:417:1;19756:96:0;19612:248;;;;:::o;36810:84::-;36865:21;;;;;;;;160:25:1;;;36865:4:0;:13;;;;;133:18:1;;36865:21:0;;;;;;;;;;;;;;;;;;;13429:229;13566:12;13598:52;13620:6;13628:4;13634:1;13637:12;13566;14837;14851:23;14878:6;:11;;14897:5;14904:4;14878:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14836:73;;;;14927:69;14954:6;14962:7;14971:10;14983:12;14927:26;:69::i;:::-;14920:76;14549:455;-1:-1:-1;;;;;;;14549:455:0:o;17122:644::-;17307:12;17336:7;17332:427;;;17364:10;:17;17385:1;17364:22;17360:290;;10967:19;;;;17574:60;;;;;;;13539:2:1;17574:60:0;;;13521:21:1;13578:2;13558:18;;;13551:30;13617:31;13597:18;;;13590:59;13666:18;;17574:60:0;13337:353:1;17574:60:0;-1:-1:-1;17671:10:0;17664:17;;17332:427;17714:33;17722:10;17734:12;18469:17;;:21;18465:388;;18701:10;18695:17;18758:15;18745:10;18741:2;18737:19;18730:44;18465:388;18828:12;18821:20;;;;;;;;;;;:::i;196:284:1:-;254:6;307:2;295:9;286:7;282:23;278:32;275:52;;;323:1;320;313:12;275:52;362:9;349:23;412:18;405:5;401:30;394:5;391:41;381:69;;446:1;443;436:12;948:196;1016:20;;1076:42;1065:54;;1055:65;;1045:93;;1134:1;1131;1124:12;1045:93;948:196;;;:::o;1149:300::-;1217:6;1225;1278:2;1266:9;1257:7;1253:23;1249:32;1246:52;;;1294:1;1291;1284:12;1246:52;1339:23;;;-1:-1:-1;1405:38:1;1439:2;1424:18;;1405:38;:::i;:::-;1395:48;;1149:300;;;;;:::o;1651:367::-;1714:8;1724:6;1778:3;1771:4;1763:6;1759:17;1755:27;1745:55;;1796:1;1793;1786:12;1745:55;-1:-1:-1;1819:20:1;;1862:18;1851:30;;1848:50;;;1894:1;1891;1884:12;1848:50;1931:4;1923:6;1919:17;1907:29;;1991:3;1984:4;1974:6;1971:1;1967:14;1959:6;1955:27;1951:38;1948:47;1945:67;;;2008:1;2005;1998:12;1945:67;1651:367;;;;;:::o;2023:768::-;2145:6;2153;2161;2169;2222:2;2210:9;2201:7;2197:23;2193:32;2190:52;;;2238:1;2235;2228:12;2190:52;2278:9;2265:23;2311:18;2303:6;2300:30;2297:50;;;2343:1;2340;2333:12;2297:50;2382:70;2444:7;2435:6;2424:9;2420:22;2382:70;:::i;:::-;2471:8;;-1:-1:-1;2356:96:1;-1:-1:-1;;2559:2:1;2544:18;;2531:32;2588:18;2575:32;;2572:52;;;2620:1;2617;2610:12;2572:52;2659:72;2723:7;2712:8;2701:9;2697:24;2659:72;:::i;:::-;2023:768;;;;-1:-1:-1;2750:8:1;-1:-1:-1;;;;2023:768:1:o;2796:226::-;2855:6;2908:2;2896:9;2887:7;2883:23;2879:32;2876:52;;;2924:1;2921;2914:12;2876:52;-1:-1:-1;2969:23:1;;2796:226;-1:-1:-1;2796:226:1:o;3027:347::-;3078:8;3088:6;3142:3;3135:4;3127:6;3123:17;3119:27;3109:55;;3160:1;3157;3150:12;3109:55;-1:-1:-1;3183:20:1;;3226:18;3215:30;;3212:50;;;3258:1;3255;3248:12;3212:50;3295:4;3287:6;3283:17;3271:29;;3347:3;3340:4;3331:6;3323;3319:19;3315:30;3312:39;3309:59;;;3364:1;3361;3354:12;3379:712;3469:6;3477;3485;3493;3546:2;3534:9;3525:7;3521:23;3517:32;3514:52;;;3562:1;3559;3552:12;3514:52;3602:9;3589:23;3635:18;3627:6;3624:30;3621:50;;;3667:1;3664;3657:12;3621:50;3706:58;3756:7;3747:6;3736:9;3732:22;3706:58;:::i;:::-;3783:8;;-1:-1:-1;3680:84:1;-1:-1:-1;;3871:2:1;3856:18;;3843:32;3900:18;3887:32;;3884:52;;;3932:1;3929;3922:12;3884:52;3971:60;4023:7;4012:8;4001:9;3997:24;3971:60;:::i;4096:184::-;4148:77;4145:1;4138:88;4245:4;4242:1;4235:15;4269:4;4266:1;4259:15;4285:1186;4369:6;4422:2;4410:9;4401:7;4397:23;4393:32;4390:52;;;4438:1;4435;4428:12;4390:52;4478:9;4465:23;4511:18;4503:6;4500:30;4497:50;;;4543:1;4540;4533:12;4497:50;4566:22;;4619:4;4611:13;;4607:27;-1:-1:-1;4597:55:1;;4648:1;4645;4638:12;4597:55;4688:2;4675:16;4714:18;4706:6;4703:30;4700:56;;;4736:18;;:::i;:::-;4782:6;4779:1;4775:14;4818:2;4812:9;4877:66;4872:2;4868;4864:11;4860:84;4852:6;4848:97;5011:6;4999:10;4996:22;4975:18;4963:10;4960:34;4957:62;4954:88;;;5022:18;;:::i;:::-;5058:2;5051:22;5108;;;5158:2;5188:11;;;5184:20;;;5108:22;5146:15;;5216:19;;;5213:39;;;5248:1;5245;5238:12;5213:39;5280:2;5276;5272:11;5261:22;;5292:148;5308:6;5303:3;5300:15;5292:148;;;5374:23;5393:3;5374:23;:::i;:::-;5362:36;;5427:2;5325:12;;;;5418;5292:148;;;-1:-1:-1;5459:6:1;4285:1186;-1:-1:-1;;;;;;4285:1186:1:o;5707:276::-;5765:6;5818:2;5806:9;5797:7;5793:23;5789:32;5786:52;;;5834:1;5831;5824:12;5786:52;5873:9;5860:23;5923:10;5916:5;5912:22;5905:5;5902:33;5892:61;;5949:1;5946;5939:12;6638:186;6697:6;6750:2;6738:9;6729:7;6725:23;6721:32;6718:52;;;6766:1;6763;6756:12;6718:52;6789:29;6808:9;6789:29;:::i;7128:184::-;7180:77;7177:1;7170:88;7277:4;7274:1;7267:15;7301:4;7298:1;7291:15;7317:188;7355:3;7399:10;7392:5;7388:22;7434:10;7425:7;7422:23;7419:49;;7448:18;;:::i;:::-;7497:1;7484:15;;7317:188;-1:-1:-1;;7317:188:1:o;7510:184::-;7562:77;7559:1;7552:88;7659:4;7656:1;7649:15;7683:4;7680:1;7673:15;7699:184;7769:6;7822:2;7810:9;7801:7;7797:23;7793:32;7790:52;;;7838:1;7835;7828:12;7790:52;-1:-1:-1;7861:16:1;;7699:184;-1:-1:-1;7699:184:1:o;8190:277::-;8257:6;8310:2;8298:9;8289:7;8285:23;8281:32;8278:52;;;8326:1;8323;8316:12;8278:52;8358:9;8352:16;8411:5;8404:13;8397:21;8390:5;8387:32;8377:60;;8433:1;8430;8423:12;9662:874;9922:42;9913:6;9907:13;9903:62;9892:9;9885:81;10034:42;10026:4;10018:6;10014:17;10008:24;10004:73;9997:4;9986:9;9982:20;9975:103;10134:4;10126:6;10122:17;10116:24;10109:4;10098:9;10094:20;10087:54;10197:4;10189:6;10185:17;10179:24;10172:4;10161:9;10157:20;10150:54;10241:3;10235;10224:9;10220:19;10213:32;10282:6;10276:3;10265:9;10261:19;10254:35;10340:6;10332;10326:3;10315:9;10311:19;10298:49;10397:1;10367:22;;;10391:3;10363:32;;;10356:43;;;;10451:2;10439:15;;;10456:66;10435:88;10420:104;10416:114;;9662:874;-1:-1:-1;;9662:874:1:o;10794:128::-;10861:9;;;10882:11;;;10879:37;;;10896:18;;:::i;11761:168::-;11834:9;;;11865;;11882:15;;;11876:22;;11862:37;11852:71;;11903:18;;:::i;11934:274::-;11974:1;12000;11990:189;;12035:77;12032:1;12025:88;12136:4;12133:1;12126:15;12164:4;12161:1;12154:15;11990:189;-1:-1:-1;12193:9:1;;11934:274::o;13031:301::-;13160:3;13198:6;13192:13;13244:6;13237:4;13229:6;13225:17;13220:3;13214:37;13306:1;13270:16;;13295:13;;;-1:-1:-1;13270:16:1;13031:301;-1:-1:-1;13031:301:1:o;13695:477::-;13844:2;13833:9;13826:21;13807:4;13876:6;13870:13;13919:6;13914:2;13903:9;13899:18;13892:34;13978:6;13973:2;13965:6;13961:15;13956:2;13945:9;13941:18;13935:50;14034:1;14029:2;14020:6;14009:9;14005:22;14001:31;13994:42;14163:2;14093:66;14088:2;14080:6;14076:15;14072:88;14061:9;14057:104;14053:113;14045:121;;;13695:477;;;;:::o
Swarm Source
ipfs://c1703858a74ddedd97df6beb8e86e4abe9c2ebd7617f1ab3961c696fd0ecab30
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 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.