Source Code
Overview
HYPE Balance
HYPE Value
$0.00Latest 1 from a total of 1 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Transfer Ownersh... | 14094514 | 129 days ago | IN | 0 HYPE | 0.00004715 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Cross-Chain Transactions
Loading...
Loading
Contract Name:
LiquidSwapAdapter
Compiler Version
v0.8.24+commit.e11b9ed9
Optimization Enabled:
No with 200 runs
Other Settings:
cancun EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity 0.8.24;
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import {ReentrancyGuard} from "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import {ILiquidSwap} from "../interfaces/ILiquidSwap.sol";
import {IWrappedHype} from "../interfaces/IWrappedHype.sol";
/// @title LiquidSwapAdapter
/// @author HyperLend
/// @notice Contract used to swap tokens on LiquidSwap, using a uniswap-like interface for integration.
contract LiquidSwapAdapter is ReentrancyGuard, Ownable {
using SafeERC20 for IERC20;
ILiquidSwap public liquidSwapRouter =
ILiquidSwap(0x744489Ee3d540777A66f2cf297479745e0852f7A);
IWrappedHype public WHYPE =
IWrappedHype(0x5555555555555555555555555555555555555555);
constructor() Ownable(msg.sender) {}
function setSwapPath(
address[] calldata tokens,
address tokenIn,
address tokenOut,
ILiquidSwap.Swap[][] calldata hops
) external {
bytes32 baseSlot = keccak256(abi.encodePacked(tokenIn, tokenOut));
assembly {
tstore(baseSlot, number())
}
_storeTokens(baseSlot, tokens);
_storeHops(baseSlot, hops);
}
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
address, // referrer (unused)
uint256 deadline
) external nonReentrant {
require(block.timestamp < deadline, "Swapper: expired");
address tokenIn = path[0];
address tokenOut = path[path.length - 1];
bytes32 baseSlot = keccak256(abi.encodePacked(tokenIn, tokenOut));
uint256 lastUpdate;
assembly {
lastUpdate := tload(baseSlot)
}
require(lastUpdate == block.number, "Swapper: path not set");
address[] memory tokens = _loadTokens(baseSlot);
ILiquidSwap.Swap[][] memory hops = _loadHops(baseSlot);
IERC20(tokenIn).transferFrom(msg.sender, address(this), amountIn);
IERC20(tokenIn).approve(address(liquidSwapRouter), amountIn);
liquidSwapRouter.executeSwaps(
tokens,
amountIn,
amountOutMin,
amountOutMin,
hops,
0,
owner()
);
if (address(this).balance > 0) {
WHYPE.deposit{value: address(this).balance}();
}
uint256 balanceOut = IERC20(tokenOut).balanceOf(address(this));
require(balanceOut >= amountOutMin, "Swapper: insufficient output");
IERC20(tokenOut).transfer(to, balanceOut);
}
function getSwapRoute(
address tokenIn,
address tokenOut
) external view returns (ILiquidSwap.Swap[][] memory) {
bytes32 baseSlot = keccak256(abi.encodePacked(tokenIn, tokenOut));
return _loadHops(baseSlot);
}
// --- Internal Helper Functions for Transient Storage ---
function _storeTokens(
bytes32 baseSlot,
address[] calldata tokens
) internal {
bytes32 tokensSlot = keccak256(abi.encodePacked(baseSlot, "tokens"));
uint256 len = tokens.length;
assembly {
tstore(tokensSlot, len)
}
for (uint256 i = 0; i < len; ++i) {
address token = tokens[i];
assembly {
tstore(add(tokensSlot, add(i, 1)), token)
}
}
}
function _storeHops(
bytes32 baseSlot,
ILiquidSwap.Swap[][] calldata hops
) internal {
bytes32 hopsSlot = keccak256(abi.encodePacked(baseSlot, "hops"));
uint256 outerLen = hops.length;
assembly {
tstore(hopsSlot, outerLen)
}
for (uint256 i = 0; i < outerLen; ++i) {
uint256 innerLen = hops[i].length;
bytes32 hop_i_Slot = keccak256(abi.encodePacked(hopsSlot, i));
assembly {
tstore(hop_i_Slot, innerLen)
}
for (uint256 j = 0; j < innerLen; ++j) {
// Each Swap struct will take 4 slots
bytes32 swap_j_slot_base = keccak256(
abi.encodePacked(hop_i_Slot, j)
);
ILiquidSwap.Swap calldata swap = hops[i][j];
address tokenIn = swap.tokenIn;
address tokenOut = swap.tokenOut;
uint256 amountIn = swap.amountIn;
uint8 routerIndex = swap.routerIndex;
uint24 fee = swap.fee;
bool stable = swap.stable;
assembly {
// Pack routerIndex, fee, and stable into one slot
// stable (1 bit) << 32 | fee (24 bits) << 8 | routerIndex (8 bits)
let packedData := or(
or(routerIndex, shl(8, fee)),
shl(32, stable)
)
// Store struct fields in 4 consecutive slots
tstore(swap_j_slot_base, tokenIn)
tstore(add(swap_j_slot_base, 1), tokenOut)
tstore(add(swap_j_slot_base, 2), amountIn)
tstore(add(swap_j_slot_base, 3), packedData)
}
}
}
}
function _loadTokens(
bytes32 baseSlot
) internal view returns (address[] memory tokens) {
bytes32 tokensSlot = keccak256(abi.encodePacked(baseSlot, "tokens"));
uint256 len;
assembly {
len := tload(tokensSlot)
}
if (len == 0) return tokens;
tokens = new address[](len);
for (uint256 i = 0; i < len; ++i) {
address token;
assembly {
token := tload(add(tokensSlot, add(i, 1)))
}
tokens[i] = token;
}
}
function _loadHops(
bytes32 baseSlot
) internal view returns (ILiquidSwap.Swap[][] memory hops) {
bytes32 hopsSlot = keccak256(abi.encodePacked(baseSlot, "hops"));
uint256 outerLen;
assembly {
outerLen := tload(hopsSlot)
}
if (outerLen == 0) return hops;
hops = new ILiquidSwap.Swap[][](outerLen);
for (uint256 i = 0; i < outerLen; ++i) {
bytes32 hop_i_Slot = keccak256(abi.encodePacked(hopsSlot, i));
uint256 innerLen;
assembly {
innerLen := tload(hop_i_Slot)
}
if (innerLen > 0) {
hops[i] = new ILiquidSwap.Swap[](innerLen);
ILiquidSwap.Swap[] memory innerHop = hops[i];
for (uint256 j = 0; j < innerLen; ++j) {
bytes32 swap_j_slot_base = keccak256(
abi.encodePacked(hop_i_Slot, j)
);
address tokenIn;
address tokenOut;
uint256 amountIn;
uint8 routerIndex;
uint24 fee;
bool stable;
assembly {
tokenIn := tload(swap_j_slot_base)
tokenOut := tload(add(swap_j_slot_base, 1))
amountIn := tload(add(swap_j_slot_base, 2))
let packedData := tload(add(swap_j_slot_base, 3))
// Unpack the data
routerIndex := and(packedData, 0xff) // lowest 8 bits
fee := and(shr(8, packedData), 0xffffff) // next 24 bits
stable := shr(32, packedData) // high bit
}
innerHop[j] = ILiquidSwap.Swap({
tokenIn: tokenIn,
tokenOut: tokenOut,
routerIndex: routerIndex,
fee: fee,
amountIn: amountIn,
stable: stable
});
}
}
}
}
fallback() external payable {}
receive() external payable {}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)
pragma solidity ^0.8.20;
import {Context} from "../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* The initial owner is set to the address provided by the deployer. This can
* later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
/**
* @dev The caller account is not authorized to perform an operation.
*/
error OwnableUnauthorizedAccount(address account);
/**
* @dev The owner is not a valid owner account. (eg. `address(0)`)
*/
error OwnableInvalidOwner(address owner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the address provided by the deployer as the initial owner.
*/
constructor(address initialOwner) {
if (initialOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(initialOwner);
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
if (owner() != _msgSender()) {
revert OwnableUnauthorizedAccount(_msgSender());
}
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
if (newOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)
pragma solidity >=0.4.16;
/**
* @dev Interface of the ERC-20 standard as defined in the ERC.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the value of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the value of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves a `value` amount of tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 value) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets a `value` amount of tokens as the allowance of `spender` over the
* caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 value) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the
* allowance mechanism. `value` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 value) external returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)
pragma solidity ^0.8.20;
import {IERC20} from "../IERC20.sol";
import {IERC1363} from "../../../interfaces/IERC1363.sol";
/**
* @title SafeERC20
* @dev Wrappers around ERC-20 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 {
/**
* @dev An operation with an ERC-20 token failed.
*/
error SafeERC20FailedOperation(address token);
/**
* @dev Indicates a failed `decreaseAllowance` request.
*/
error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);
/**
* @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,
* non-reverting calls are assumed to be successful.
*/
function safeTransfer(IERC20 token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));
}
/**
* @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the
* calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.
*/
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));
}
/**
* @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.
*/
function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {
return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));
}
/**
* @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.
*/
function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {
return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));
}
/**
* @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,
* non-reverting calls are assumed to be successful.
*
* IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the "client"
* smart contract uses ERC-7674 to set temporary allowances, then the "client" smart contract should avoid using
* this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract
* that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.
*/
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 oldAllowance = token.allowance(address(this), spender);
forceApprove(token, spender, oldAllowance + value);
}
/**
* @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no
* value, non-reverting calls are assumed to be successful.
*
* IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the "client"
* smart contract uses ERC-7674 to set temporary allowances, then the "client" smart contract should avoid using
* this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract
* that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.
*/
function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {
unchecked {
uint256 currentAllowance = token.allowance(address(this), spender);
if (currentAllowance < requestedDecrease) {
revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);
}
forceApprove(token, spender, currentAllowance - requestedDecrease);
}
}
/**
* @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,
* non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval
* to be set to zero before setting it to a non-zero value, such as USDT.
*
* NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function
* only sets the "standard" allowance. Any temporary allowance will remain active, in addition to the value being
* set here.
*/
function forceApprove(IERC20 token, address spender, uint256 value) internal {
bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));
if (!_callOptionalReturnBool(token, approvalCall)) {
_callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));
_callOptionalReturn(token, approvalCall);
}
}
/**
* @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no
* code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when
* targeting contracts.
*
* Reverts if the returned value is other than `true`.
*/
function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {
if (to.code.length == 0) {
safeTransfer(token, to, value);
} else if (!token.transferAndCall(to, value, data)) {
revert SafeERC20FailedOperation(address(token));
}
}
/**
* @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target
* has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when
* targeting contracts.
*
* Reverts if the returned value is other than `true`.
*/
function transferFromAndCallRelaxed(
IERC1363 token,
address from,
address to,
uint256 value,
bytes memory data
) internal {
if (to.code.length == 0) {
safeTransferFrom(token, from, to, value);
} else if (!token.transferFromAndCall(from, to, value, data)) {
revert SafeERC20FailedOperation(address(token));
}
}
/**
* @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no
* code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when
* targeting contracts.
*
* NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.
* Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}
* once without retrying, and relies on the returned value to be true.
*
* Reverts if the returned value is other than `true`.
*/
function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {
if (to.code.length == 0) {
forceApprove(token, to, value);
} else if (!token.approveAndCall(to, value, data)) {
revert SafeERC20FailedOperation(address(token));
}
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*
* This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
uint256 returnSize;
uint256 returnValue;
assembly ("memory-safe") {
let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)
// bubble errors
if iszero(success) {
let ptr := mload(0x40)
returndatacopy(ptr, 0, returndatasize())
revert(ptr, returndatasize())
}
returnSize := returndatasize()
returnValue := mload(0)
}
if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {
revert SafeERC20FailedOperation(address(token));
}
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*
* This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.
*/
function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {
bool success;
uint256 returnSize;
uint256 returnValue;
assembly ("memory-safe") {
success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)
returnSize := returndatasize()
returnValue := mload(0)
}
return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)
pragma solidity ^0.8.20;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,
* consider using {ReentrancyGuardTransient} instead.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant NOT_ENTERED = 1;
uint256 private constant ENTERED = 2;
uint256 private _status;
/**
* @dev Unauthorized reentrant call.
*/
error ReentrancyGuardReentrantCall();
constructor() {
_status = NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and making it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
// On the first call to nonReentrant, _status will be NOT_ENTERED
if (_status == ENTERED) {
revert ReentrancyGuardReentrantCall();
}
// Any calls to nonReentrant after this point will fail
_status = ENTERED;
}
function _nonReentrantAfter() private {
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = NOT_ENTERED;
}
/**
* @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
* `nonReentrant` function in the call stack.
*/
function _reentrancyGuardEntered() internal view returns (bool) {
return _status == ENTERED;
}
}interface ILiquidSwap {
struct Swap {
address tokenIn;
address tokenOut;
uint8 routerIndex; // 1 for KittenSwap, 2 for HyperSwap V2, 3 for HyperSwap V3, 4 for Laminar, 5 for KittenSwap V3
uint24 fee; // Only used for HyperSwap V3 (UniswapV3) and Laminar
uint256 amountIn; // Represents input amount for exact input swaps, or output amount for exact output swaps
bool stable; // Whether the pool is stable (only used for KittenSwap)
}
function executeSwaps(
address[] calldata tokens,
uint256 amountIn,
uint256 minAmountOut,
uint256 expectedAmountOut,
Swap[][] calldata hopSwaps,
uint256 feeBps,
address feeRecipient
) external payable returns (uint256 userAmountOut);
function executeMultiHopSwap(
address[] calldata tokens,
uint256 amountIn,
uint256 minAmountOut,
Swap[][] calldata hopSwaps
) external payable returns (uint256 totalAmountOut);
}interface IWrappedHype {
function deposit() payable external;
function withdraw(uint256 wad) external;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
pragma solidity ^0.8.20;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)
pragma solidity >=0.6.2;
import {IERC20} from "./IERC20.sol";
import {IERC165} from "./IERC165.sol";
/**
* @title IERC1363
* @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].
*
* Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract
* after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.
*/
interface IERC1363 is IERC20, IERC165 {
/*
* Note: the ERC-165 identifier for this interface is 0xb0202a11.
* 0xb0202a11 ===
* bytes4(keccak256('transferAndCall(address,uint256)')) ^
* bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^
* bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^
* bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^
* bytes4(keccak256('approveAndCall(address,uint256)')) ^
* bytes4(keccak256('approveAndCall(address,uint256,bytes)'))
*/
/**
* @dev Moves a `value` amount of tokens from the caller's account to `to`
* and then calls {IERC1363Receiver-onTransferReceived} on `to`.
* @param to The address which you want to transfer to.
* @param value The amount of tokens to be transferred.
* @return A boolean value indicating whether the operation succeeded unless throwing.
*/
function transferAndCall(address to, uint256 value) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from the caller's account to `to`
* and then calls {IERC1363Receiver-onTransferReceived} on `to`.
* @param to The address which you want to transfer to.
* @param value The amount of tokens to be transferred.
* @param data Additional data with no specified format, sent in call to `to`.
* @return A boolean value indicating whether the operation succeeded unless throwing.
*/
function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism
* and then calls {IERC1363Receiver-onTransferReceived} on `to`.
* @param from The address which you want to send tokens from.
* @param to The address which you want to transfer to.
* @param value The amount of tokens to be transferred.
* @return A boolean value indicating whether the operation succeeded unless throwing.
*/
function transferFromAndCall(address from, address to, uint256 value) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism
* and then calls {IERC1363Receiver-onTransferReceived} on `to`.
* @param from The address which you want to send tokens from.
* @param to The address which you want to transfer to.
* @param value The amount of tokens to be transferred.
* @param data Additional data with no specified format, sent in call to `to`.
* @return A boolean value indicating whether the operation succeeded unless throwing.
*/
function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);
/**
* @dev Sets a `value` amount of tokens as the allowance of `spender` over the
* caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.
* @param spender The address which will spend the funds.
* @param value The amount of tokens to be spent.
* @return A boolean value indicating whether the operation succeeded unless throwing.
*/
function approveAndCall(address spender, uint256 value) external returns (bool);
/**
* @dev Sets a `value` amount of tokens as the allowance of `spender` over the
* caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.
* @param spender The address which will spend the funds.
* @param value The amount of tokens to be spent.
* @param data Additional data with no specified format, sent in call to `spender`.
* @return A boolean value indicating whether the operation succeeded unless throwing.
*/
function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)
pragma solidity >=0.4.16;
import {IERC20} from "../token/ERC20/IERC20.sol";// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)
pragma solidity >=0.4.16;
import {IERC165} from "../utils/introspection/IERC165.sol";// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)
pragma solidity >=0.4.16;
/**
* @dev Interface of the ERC-165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[ERC].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}{
"remappings": [
"@openzeppelin/=node_modules/@openzeppelin/",
"eth-gas-reporter/=node_modules/eth-gas-reporter/",
"forge-std/=lib/forge-std/src/",
"hardhat/=node_modules/hardhat/"
],
"optimizer": {
"enabled": false,
"runs": 200
},
"metadata": {
"useLiteralContent": false,
"bytecodeHash": "ipfs",
"appendCBOR": true
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"evmVersion": "cancun",
"viaIR": true
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"WHYPE","outputs":[{"internalType":"contract IWrappedHype","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"getSwapRoute","outputs":[{"components":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint8","name":"routerIndex","type":"uint8"},{"internalType":"uint24","name":"fee","type":"uint24"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct ILiquidSwap.Swap[][]","name":"","type":"tuple[][]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidSwapRouter","outputs":[{"internalType":"contract ILiquidSwap","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"components":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint8","name":"routerIndex","type":"uint8"},{"internalType":"uint24","name":"fee","type":"uint24"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct ILiquidSwap.Swap[][]","name":"hops","type":"tuple[][]"}],"name":"setSwapPath","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
6080604052346200002d576200001462000135565b6200001e62000033565b6120a16200041d82396120a190f35b62000039565b60405190565b5f80fd5b60018060a01b031690565b90565b620000646200005e6200006a926200003d565b62000048565b6200003d565b90565b62000078906200004b565b90565b62000086906200006d565b90565b5f1b90565b90620000a160018060a01b039162000089565b9181191691161790565b620000b6906200006d565b90565b90565b90620000d6620000d0620000de92620000ab565b620000b9565b82546200008e565b9055565b620000ed906200004b565b90565b620000fb90620000e2565b90565b6200010990620000e2565b90565b90565b9062000129620001236200013192620000fe565b6200010c565b82546200008e565b9055565b6200014033620001ff565b6200016b6200016373744489ee3d540777a66f2cf297479745e0852f7a6200007b565b6002620000bc565b620001966200018e735555555555555555555555555555555555555555620000f0565b60036200010f565b565b90565b620001b4620001ae620001ba9262000198565b62000048565b6200003d565b90565b620001c8906200019b565b90565b620001d6906200003d565b90565b620001e490620001cb565b9052565b9190620001fd905f60208501940190620001d9565b565b6200020962000271565b806200022a620002236200021d5f620001bd565b620001cb565b91620001cb565b146200023d576200023b90620003af565b565b6200026d6200024c5f620001bd565b6200025662000033565b918291631e4fbdf760e01b835260048301620001e8565b0390fd5b6200027b62000317565b565b90565b90565b6200029c62000296620002a2926200027d565b62000048565b62000280565b90565b620002b1600162000283565b90565b90620002c25f199162000089565b9181191691161790565b620002e5620002df620002eb9262000280565b62000048565b62000280565b90565b90565b906200030b620003056200031392620002cc565b620002ee565b8254620002b4565b9055565b6200032c62000325620002a5565b5f620002f1565b565b5f1c90565b60018060a01b031690565b6200034d62000353916200032e565b62000333565b90565b6200036290546200033e565b90565b62000370906200004b565b90565b6200037e9062000365565b90565b90565b906200039e62000398620003a69262000373565b62000381565b82546200008e565b9055565b5f0190565b620003bb600162000356565b620003c882600162000384565b9062000400620003f97f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09362000373565b9162000373565b916200040b62000033565b806200041781620003aa565b0390a356fe60806040526004361015610018575b361561001657005b005b6100225f356100a1565b8063102b34a31461009c57806359f613a414610097578063715018a6146100925780638da5cb5b1461008d578063ac3893ba14610088578063e5c1a34814610083578063e9f87eda1461007e5763f2fde38b0361000e57610780565b610728565b61063b565b610593565b610473565b61041e565b6103e4565b610302565b60e01c90565b60405190565b5f80fd5b5f80fd5b5f80fd5b60018060a01b031690565b6100cd906100b9565b90565b6100d9816100c4565b036100e057565b5f80fd5b905035906100f1826100d0565b565b919060408382031261011b578061010f610118925f86016100e4565b936020016100e4565b90565b6100b1565b5190565b60209181520190565b60200190565b5190565b60209181520190565b60200190565b61014f906100c4565b9052565b60ff1690565b61016290610153565b9052565b62ffffff1690565b61017790610166565b9052565b90565b6101879061017b565b9052565b151590565b6101999061018b565b9052565b9060a080610207936101b55f8201515f860190610146565b6101c760208201516020860190610146565b6101d960408201516040860190610159565b6101eb6060820151606086019061016e565b6101fd6080820151608086019061017e565b0151910190610190565b565b906102168160c09361019d565b0190565b60200190565b9061023d61023761023084610133565b8093610137565b92610140565b905f5b81811061024d5750505090565b9091926102666102606001928651610209565b9461021a565b9101919091610240565b9061027a91610220565b90565b60200190565b9061029761029083610120565b8092610124565b90816102a86020830284019461012d565b925f915b8383106102bb57505050505090565b909192939460206102dd6102d783856001950387528951610270565b9761027d565b93019301919392906102ac565b6102ff9160208201915f818403910152610283565b90565b346103335761032f61031e6103183660046100f3565b9061085a565b6103266100a7565b918291826102ea565b0390f35b6100ad565b5f91031261034257565b6100b1565b1c90565b60018060a01b031690565b61036690600861036b9302610347565b61034b565b90565b906103799154610356565b90565b61038860035f9061036e565b90565b90565b6103a261039d6103a7926100b9565b61038b565b6100b9565b90565b6103b39061038e565b90565b6103bf906103aa565b90565b6103cb906103b6565b9052565b91906103e2905f602085019401906103c2565b565b34610414576103f4366004610338565b6104106103ff61037c565b6104076100a7565b918291826103cf565b0390f35b6100ad565b5f0190565b3461044c5761042e366004610338565b6104366108fc565b61043e6100a7565b8061044881610419565b0390f35b6100ad565b61045a906100c4565b9052565b9190610471905f60208501940190610451565b565b346104a357610483366004610338565b61049f61048e61093b565b6104966100a7565b9182918261045e565b0390f35b6100ad565b6104b18161017b565b036104b857565b5f80fd5b905035906104c9826104a8565b565b5f80fd5b5f80fd5b5f80fd5b909182601f830112156105115781359167ffffffffffffffff831161050c57602001926020830284011161050757565b6104d3565b6104cf565b6104cb565b9160c08383031261058e5761052d825f85016104bc565b9261053b83602083016104bc565b92604082013567ffffffffffffffff8111610589578161055c9184016104d7565b92909361058661056f84606085016100e4565b9361057d81608086016100e4565b9360a0016104bc565b90565b6100b5565b6100b1565b346105c8576105b26105a6366004610516565b959490949391936112a9565b6105ba6100a7565b806105c481610419565b0390f35b6100ad565b60018060a01b031690565b6105e89060086105ed9302610347565b6105cd565b90565b906105fb91546105d8565b90565b61060a60025f906105f0565b90565b610616906103aa565b90565b6106229061060d565b9052565b9190610639905f60208501940190610619565b565b3461066b5761064b366004610338565b6106676106566105fe565b61065e6100a7565b91829182610626565b0390f35b6100ad565b909182601f830112156106aa5781359167ffffffffffffffff83116106a55760200192602083028401116106a057565b6104d3565b6104cf565b6104cb565b608081830312610723575f81013567ffffffffffffffff811161071e57826106d89183016104d7565b9290936106e882602085016100e4565b926106f683604083016100e4565b92606082013567ffffffffffffffff8111610719576107159201610670565b9091565b6100b5565b6100b5565b6100b1565b3461075d5761074761073b3660046106af565b949390939291926112ba565b61074f6100a7565b8061075981610419565b0390f35b6100ad565b9060208282031261077b57610778915f016100e4565b90565b6100b1565b346107ae57610798610793366004610762565b611383565b6107a06100a7565b806107aa81610419565b0390f35b6100ad565b606090565b60601b90565b6107c7906107b8565b90565b6107d3906107be565b90565b6107e26107e7916100c4565b6107ca565b9052565b6014816107fd610805938396956107d6565b0180926107d6565b0190565b601f801991011690565b634e487b7160e01b5f52604160045260245ffd5b9061083190610809565b810190811067ffffffffffffffff82111761084b57604052565b610813565b60200190565b5190565b906108916108a99261086a6107b3565b506108826108766100a7565b938492602084016107eb565b60208201810382520382610827565b6108a361089d82610856565b91610850565b20611683565b90565b6108b461191e565b6108bc6108e9565b565b90565b6108d56108d06108da926108be565b61038b565b6100b9565b90565b6108e6906108c1565b90565b6108fa6108f55f6108dd565b6119c2565b565b6109046108ac565b565b5f90565b5f1c90565b60018060a01b031690565b61092661092b9161090a565b61090f565b90565b610938905461091a565b90565b610943610906565b5061094e600161092e565b90565b90610968969594939291610963611ac8565b610e17565b610970611b32565b565b60209181520190565b5f7f537761707065723a206578706972656400000000000000000000000000000000910152565b6109af6010602092610972565b6109b88161097b565b0190565b6109d19060208101905f8183039101526109a2565b90565b156109db57565b6109e36100a7565b62461bcd60e51b8152806109f9600482016109bc565b0390fd5b634e487b7160e01b5f52603260045260245ffd5b9190811015610a21576020020190565b6109fd565b610a3a610a35610a3f926108be565b61038b565b61017b565b90565b35610a4c816100d0565b90565b5090565b90565b610a6a610a65610a6f92610a53565b61038b565b61017b565b90565b634e487b7160e01b5f52601160045260245ffd5b610a95610a9b9193929361017b565b9261017b565b8203918211610aa657565b610a72565b5f90565b5f7f537761707065723a2070617468206e6f74207365740000000000000000000000910152565b610ae36015602092610972565b610aec81610aaf565b0190565b610b059060208101905f818303910152610ad6565b90565b15610b0f57565b610b176100a7565b62461bcd60e51b815280610b2d60048201610af0565b0390fd5b610b3a9061038e565b90565b610b4690610b31565b90565b610b52906103aa565b90565b610b5e906103aa565b90565b5f80fd5b60e01b90565b610b748161018b565b03610b7b57565b5f80fd5b90505190610b8c82610b6b565b565b90602082820312610ba757610ba4915f01610b7f565b90565b6100b1565b610bb59061017b565b9052565b604090610be2610be99496959396610bd860608401985f850190610451565b6020830190610451565b0190610bac565b565b610bf36100a7565b3d5f823e3d90fd5b610c07610c0c9161090a565b6105cd565b90565b610c199054610bfb565b90565b916020610c3d929493610c3660408201965f830190610451565b0190610bac565b565b90505190610c4c826104a8565b565b90602082820312610c6757610c64915f01610c3f565b90565b6100b1565b5190565b60209181520190565b60200190565b90610c8c81602093610146565b0190565b60200190565b90610cb3610cad610ca684610c6c565b8093610c70565b92610c79565b905f5b818110610cc35750505090565b909192610cdc610cd66001928651610c7f565b94610c90565b9101919091610cb6565b610cef90610a26565b9052565b9291610d6396989795610d4460c096610d3a610d5c96610d30610d25610d519860e08c01908c5f818403910152610c96565b9660208b0190610bac565b6040890190610bac565b6060870190610bac565b8482036080860152610283565b9660a0830190610ce6565b0190610451565b565b610d71610d769161090a565b61034b565b90565b610d839054610d65565b90565b5f910312610d9057565b6100b1565b5f7f537761707065723a20696e73756666696369656e74206f757470757400000000910152565b610dc9601c602092610972565b610dd281610d95565b0190565b610deb9060208101905f818303910152610dbc565b90565b15610df557565b610dfd6100a7565b62461bcd60e51b815280610e1360048201610dd6565b0390fd5b94509294610e879192610e40610e8292610e3a610e34429261017b565b9161017b565b106109d4565b610e5c610e578583610e515f610a26565b91610a11565b610a42565b93610e7c610e6c82938093610a4f565b610e766001610a56565b90610a86565b91610a11565b610a42565b9281610eb48591610ea5610e996100a7565b938492602084016107eb565b60208201810382520382610827565b610ec6610ec082610856565b91610850565b2090610ed0610aab565b50610eee825c610ee8610ee24361017b565b9161017b565b14610b08565b610f00610efa83611c23565b92611683565b92610f12610f0d82610b3d565b610b49565b9060206323b872dd923390610f435f610f2a30610b55565b96610f4e89610f376100a7565b998a9788968795610b65565b855260048501610bb9565b03925af19081156112a457610f7192610f6c92611278575b50610b3d565b610b49565b91602063095ea7b393610f8c610f876002610c0f565b61060d565b90610faa5f8697610fb5610f9e6100a7565b998a9687958694610b65565b845260048401610c1c565b03925af192831561127357602093611248575b5061100e5f610fdf610fda6002610c0f565b61060d565b9261101963a22c27fe91959789908a908591610ff961093b565b936110026100a7565b9c8d9b8c9a8b99610b65565b895260048901610cf3565b03925af1801561124357611217575b5061103230610b55565b3161104561103f5f610a26565b9161017b565b1161117b575b611093602061106161105c85610b3d565b610b49565b6370a082319061108861107330610b55565b9261107c6100a7565b95869485938493610b65565b83526004830161045e565b03915afa8015611176576020936110ce6110d3926110d8945f91611149575b50946110c76110c1879261017b565b9161017b565b1015610dee565b610b3d565b610b49565b6110fb5f63a9059cbb9593956111066110ef6100a7565b97889687958694610b65565b845260048401610c1c565b03925af1801561114457611118575b50565b6111389060203d811161113d575b6111308183610827565b810190610b8e565b611115565b503d611126565b610beb565b6111699150873d811161116f575b6111618183610827565b810190610c4e565b5f6110b2565b503d611157565b610beb565b61118d6111886003610d79565b6103b6565b63d0e30db061119b30610b55565b319190813b15611212575f916111bd916111b36100a7565b9485938492610b65565b8252816111cc60048201610419565b03925af1801561120d576111e1575b5061104b565b611200905f3d8111611206575b6111f88183610827565b810190610d86565b5f6111db565b503d6111ee565b610beb565b610b61565b6112379060203d811161123c575b61122f8183610827565b810190610c4e565b611028565b503d611225565b610beb565b61126790843d811161126c575b61125f8183610827565b810190610b8e565b610fc8565b503d611255565b610beb565b6112989060203d811161129d575b6112908183610827565b810190610b8e565b610f66565b503d611286565b610beb565b906112b8969594939291610951565b565b61131595936112ed61130d93946112de6112d26100a7565b938492602084016107eb565b60208201810382520382610827565b6112ff6112f982610856565b91610850565b209243845d83919091611cf9565b919091611e89565b565b6113289061132361191e565b61132a565b565b8061134561133f61133a5f6108dd565b6100c4565b916100c4565b1461135557611353906119c2565b565b61137f6113615f6108dd565b6113696100a7565b918291631e4fbdf760e01b83526004830161045e565b0390fd5b61138c90611317565b565b90565b90565b6113a06113a59161138e565b611391565b9052565b905090565b5f7f686f707300000000000000000000000000000000000000000000000000000000910152565b6113e1600480926113a9565b6113ea816113ae565b0190565b806113fe60209261140494611394565b016113d5565b90565b9061141a6114136100a7565b9283610827565b565b67ffffffffffffffff81116114345760208091020190565b610813565b9061144b6114468361141c565b611407565b918252565b606090565b5f5b82811061146357505050565b60209061146e611450565b8184015201611457565b9061149d61148583611439565b92602080611493869361141c565b9201910390611455565b565b60016114ab910161017b565b90565b90565b6114bd6114c29161017b565b6114ae565b9052565b6020816114d86114e093839695611394565b0180926114b1565b0190565b67ffffffffffffffff81116114fc5760208091020190565b610813565b9061151361150e836114e4565b611407565b918252565b61152260c0611407565b90565b5f90565b5f90565b5f90565b5f90565b5f90565b611541611518565b906020808080808087611552611525565b81520161155d611525565b815201611568611529565b81520161157361152d565b81520161157e611531565b815201611589611535565b81525050565b611597611539565b90565b5f5b8281106115a857505050565b6020906115b361158f565b818401520161159c565b906115e26115ca83611501565b926020806115d886936114e4565b920191039061159a565b565b906115ee82610120565b8110156115ff576020809102010190565b6109fd565b5f90565b5f90565b5f90565b61161a60c0611407565b90565b90611627906100c4565b9052565b9061163590610153565b9052565b9061164390610166565b9052565b906116519061017b565b9052565b9061165f9061018b565b9052565b9061166d82610133565b81101561167e576020809102010190565b6109fd565b906116a76116b66116926107b3565b9361169b6100a7565b928391602083016113ee565b60208201810382520382610827565b6116c86116c282610856565b91610850565b206116d1610aab565b50805c92836116e86116e25f610a26565b9161017b565b1461191757506116f783611478565b916117015f610a26565b5b8061171561170f8761017b565b9161017b565b10156119105782611747829161173861172c6100a7565b938492602084016114c6565b60208201810382520382610827565b61175961175382610856565b91610850565b20611762610aab565b50805c90816117796117735f610a26565b9161017b565b1161178f575b505061178a9061149f565b611702565b939590946117b56117a2879594956115bd565b8286916117af83836115e4565b526115e4565b51506117c28185906115e4565b51966117cd5f610a26565b5b806117e16117db8a61017b565b9161017b565b10156118ff576118fa906118f38861181a839161180b6117ff6100a7565b938492602084016114c6565b60208201810382520382610827565b61182c61182682610856565b91610850565b20611835610906565b5061183e610906565b50611847610aab565b50611850611604565b50611859611608565b5061186261160c565b506118e0815c916118d7600182015c936118ce6003600285015c94015c936118c560ff8616956118bc62ffffff8260081c169160201c959997919395976118b36118aa611610565b9b5f8d0161161d565b60208b0161161d565b6040890161162b565b60608701611639565b60808501611647565b60a08301611655565b8b83916118ed8383611663565b52611663565b515061149f565b6117ce565b509450945094509061178a5f61177f565b5091925050565b9192505090565b61192661093b565b61193f61193961193461205e565b6100c4565b916100c4565b0361194657565b61196f61195161205e565b6119596100a7565b91829163118cdaa760e01b83526004830161045e565b0390fd5b5f1b90565b9061198960018060a01b0391611973565b9181191691161790565b61199c906103aa565b90565b90565b906119b76119b26119be92611993565b61199f565b8254611978565b9055565b6119cc600161092e565b6119d78260016119a2565b90611a0b611a057f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e093611993565b91611993565b91611a146100a7565b80611a1e81610419565b0390a3565b90565b611a32611a379161090a565b611a23565b90565b611a449054611a26565b90565b90565b611a5e611a59611a6392611a47565b61038b565b61017b565b90565b611a706002611a4a565b90565b90611a7f5f1991611973565b9181191691161790565b611a9d611a98611aa29261017b565b61038b565b61017b565b90565b90565b90611abd611ab8611ac492611a89565b611aa5565b8254611a73565b9055565b611ad15f611a3a565b611aea611ae4611adf611a66565b61017b565b9161017b565b14611b0257611b00611afa611a66565b5f611aa8565b565b611b0a6100a7565b633ee5aeb560e01b815280611b2160048201610419565b0390fd5b611b2f6001610a56565b90565b611b43611b3d611b25565b5f611aa8565b565b606090565b5f7f746f6b656e730000000000000000000000000000000000000000000000000000910152565b611b7d600680926113a9565b611b8681611b4a565b0190565b80611b9a602092611ba094611394565b01611b71565b90565b67ffffffffffffffff8111611bbb5760208091020190565b610813565b90611bd2611bcd83611ba3565b611407565b918252565b369037565b90611c01611be983611bc0565b92602080611bf78693611ba3565b9201910390611bd7565b565b90611c0d82610c6c565b811015611c1e576020809102010190565b6109fd565b611c46611c55611c31611b45565b92611c3a6100a7565b92839160208301611b8a565b60208201810382520382610827565b611c67611c6182610856565b91610850565b20611c70610aab565b50805c9182611c87611c815f610a26565b9161017b565b14611cf35750611c9682611bdc565b92611ca05f610a26565b5b80611cb4611cae8661017b565b9161017b565b1015611ced57611ce890611cc6610906565b50611ce36001820185015c611cde8891849092611c03565b61161d565b61149f565b611ca1565b50915050565b91505090565b611d26611d1791949394611d0b6100a7565b92839160208301611b8a565b60208201810382520382610827565b611d38611d3282610856565b91610850565b2090611d45818590610a4f565b9283835d611d525f610a26565b5b80611d66611d608761017b565b9161017b565b1015611d9557611d9090611d84611d7f85898491610a11565b610a42565b6001820186015d61149f565b611d53565b509350505050565b5090565b5f80fd5b5f80fd5b5f80fd5b903590600160200381360303821215611def570180359067ffffffffffffffff8211611dea576020019160c0820236038313611de557565b611da9565b611da5565b611da1565b90821015611e0f576020611e0b9202810190611dad565b9091565b6109fd565b5090565b9190811015611e285760c0020190565b6109fd565b35611e37816104a8565b90565b611e4381610153565b03611e4a57565b5f80fd5b35611e5881611e3a565b90565b611e6481610166565b03611e6b57565b5f80fd5b35611e7981611e5b565b90565b35611e8681610b6b565b90565b611eb3611ea491611e986100a7565b928391602083016113ee565b60208201810382520382610827565b611ec5611ebf82610856565b91610850565b2091611ed2828290611d9d565b9283815d611edf5f610a26565b945b85611ef4611eee8761017b565b9161017b565b101561205657611f0f611f0985858991611df4565b90611e14565b9482611f3c8891611f2d611f216100a7565b938492602084016114c6565b60208201810382520382610827565b611f4e611f4882610856565b91610850565b209286845d611f5c5f610a26565b5b80611f70611f6a8a61017b565b9161017b565b101561203f5761203a9085611fa68291611f97611f8b6100a7565b938492602084016114c6565b60208201810382520382610827565b611fb8611fb282610856565b91610850565b206003611fd3611fcc8d8c908c9091611df4565b8591611e18565b91611fdf5f8401610a42565b92611fec60208201610a42565b611ff860808301611e2d565b9161200560408201611e4e565b61201d60a061201660608501611e6f565b9301611e7c565b60201b9160081b171794835d600183015d600282015d015d61149f565b611f5d565b5095509561204e91925061149f565b949390611ee1565b945050505050565b612066610906565b50339056fea26469706673582212201602633d61b15ad7dcc2b9aed0e2d7fd61597a864fa568480bf5ea74ecc3c6aa64736f6c63430008180033
Deployed Bytecode
0x60806040526004361015610018575b361561001657005b005b6100225f356100a1565b8063102b34a31461009c57806359f613a414610097578063715018a6146100925780638da5cb5b1461008d578063ac3893ba14610088578063e5c1a34814610083578063e9f87eda1461007e5763f2fde38b0361000e57610780565b610728565b61063b565b610593565b610473565b61041e565b6103e4565b610302565b60e01c90565b60405190565b5f80fd5b5f80fd5b5f80fd5b60018060a01b031690565b6100cd906100b9565b90565b6100d9816100c4565b036100e057565b5f80fd5b905035906100f1826100d0565b565b919060408382031261011b578061010f610118925f86016100e4565b936020016100e4565b90565b6100b1565b5190565b60209181520190565b60200190565b5190565b60209181520190565b60200190565b61014f906100c4565b9052565b60ff1690565b61016290610153565b9052565b62ffffff1690565b61017790610166565b9052565b90565b6101879061017b565b9052565b151590565b6101999061018b565b9052565b9060a080610207936101b55f8201515f860190610146565b6101c760208201516020860190610146565b6101d960408201516040860190610159565b6101eb6060820151606086019061016e565b6101fd6080820151608086019061017e565b0151910190610190565b565b906102168160c09361019d565b0190565b60200190565b9061023d61023761023084610133565b8093610137565b92610140565b905f5b81811061024d5750505090565b9091926102666102606001928651610209565b9461021a565b9101919091610240565b9061027a91610220565b90565b60200190565b9061029761029083610120565b8092610124565b90816102a86020830284019461012d565b925f915b8383106102bb57505050505090565b909192939460206102dd6102d783856001950387528951610270565b9761027d565b93019301919392906102ac565b6102ff9160208201915f818403910152610283565b90565b346103335761032f61031e6103183660046100f3565b9061085a565b6103266100a7565b918291826102ea565b0390f35b6100ad565b5f91031261034257565b6100b1565b1c90565b60018060a01b031690565b61036690600861036b9302610347565b61034b565b90565b906103799154610356565b90565b61038860035f9061036e565b90565b90565b6103a261039d6103a7926100b9565b61038b565b6100b9565b90565b6103b39061038e565b90565b6103bf906103aa565b90565b6103cb906103b6565b9052565b91906103e2905f602085019401906103c2565b565b34610414576103f4366004610338565b6104106103ff61037c565b6104076100a7565b918291826103cf565b0390f35b6100ad565b5f0190565b3461044c5761042e366004610338565b6104366108fc565b61043e6100a7565b8061044881610419565b0390f35b6100ad565b61045a906100c4565b9052565b9190610471905f60208501940190610451565b565b346104a357610483366004610338565b61049f61048e61093b565b6104966100a7565b9182918261045e565b0390f35b6100ad565b6104b18161017b565b036104b857565b5f80fd5b905035906104c9826104a8565b565b5f80fd5b5f80fd5b5f80fd5b909182601f830112156105115781359167ffffffffffffffff831161050c57602001926020830284011161050757565b6104d3565b6104cf565b6104cb565b9160c08383031261058e5761052d825f85016104bc565b9261053b83602083016104bc565b92604082013567ffffffffffffffff8111610589578161055c9184016104d7565b92909361058661056f84606085016100e4565b9361057d81608086016100e4565b9360a0016104bc565b90565b6100b5565b6100b1565b346105c8576105b26105a6366004610516565b959490949391936112a9565b6105ba6100a7565b806105c481610419565b0390f35b6100ad565b60018060a01b031690565b6105e89060086105ed9302610347565b6105cd565b90565b906105fb91546105d8565b90565b61060a60025f906105f0565b90565b610616906103aa565b90565b6106229061060d565b9052565b9190610639905f60208501940190610619565b565b3461066b5761064b366004610338565b6106676106566105fe565b61065e6100a7565b91829182610626565b0390f35b6100ad565b909182601f830112156106aa5781359167ffffffffffffffff83116106a55760200192602083028401116106a057565b6104d3565b6104cf565b6104cb565b608081830312610723575f81013567ffffffffffffffff811161071e57826106d89183016104d7565b9290936106e882602085016100e4565b926106f683604083016100e4565b92606082013567ffffffffffffffff8111610719576107159201610670565b9091565b6100b5565b6100b5565b6100b1565b3461075d5761074761073b3660046106af565b949390939291926112ba565b61074f6100a7565b8061075981610419565b0390f35b6100ad565b9060208282031261077b57610778915f016100e4565b90565b6100b1565b346107ae57610798610793366004610762565b611383565b6107a06100a7565b806107aa81610419565b0390f35b6100ad565b606090565b60601b90565b6107c7906107b8565b90565b6107d3906107be565b90565b6107e26107e7916100c4565b6107ca565b9052565b6014816107fd610805938396956107d6565b0180926107d6565b0190565b601f801991011690565b634e487b7160e01b5f52604160045260245ffd5b9061083190610809565b810190811067ffffffffffffffff82111761084b57604052565b610813565b60200190565b5190565b906108916108a99261086a6107b3565b506108826108766100a7565b938492602084016107eb565b60208201810382520382610827565b6108a361089d82610856565b91610850565b20611683565b90565b6108b461191e565b6108bc6108e9565b565b90565b6108d56108d06108da926108be565b61038b565b6100b9565b90565b6108e6906108c1565b90565b6108fa6108f55f6108dd565b6119c2565b565b6109046108ac565b565b5f90565b5f1c90565b60018060a01b031690565b61092661092b9161090a565b61090f565b90565b610938905461091a565b90565b610943610906565b5061094e600161092e565b90565b90610968969594939291610963611ac8565b610e17565b610970611b32565b565b60209181520190565b5f7f537761707065723a206578706972656400000000000000000000000000000000910152565b6109af6010602092610972565b6109b88161097b565b0190565b6109d19060208101905f8183039101526109a2565b90565b156109db57565b6109e36100a7565b62461bcd60e51b8152806109f9600482016109bc565b0390fd5b634e487b7160e01b5f52603260045260245ffd5b9190811015610a21576020020190565b6109fd565b610a3a610a35610a3f926108be565b61038b565b61017b565b90565b35610a4c816100d0565b90565b5090565b90565b610a6a610a65610a6f92610a53565b61038b565b61017b565b90565b634e487b7160e01b5f52601160045260245ffd5b610a95610a9b9193929361017b565b9261017b565b8203918211610aa657565b610a72565b5f90565b5f7f537761707065723a2070617468206e6f74207365740000000000000000000000910152565b610ae36015602092610972565b610aec81610aaf565b0190565b610b059060208101905f818303910152610ad6565b90565b15610b0f57565b610b176100a7565b62461bcd60e51b815280610b2d60048201610af0565b0390fd5b610b3a9061038e565b90565b610b4690610b31565b90565b610b52906103aa565b90565b610b5e906103aa565b90565b5f80fd5b60e01b90565b610b748161018b565b03610b7b57565b5f80fd5b90505190610b8c82610b6b565b565b90602082820312610ba757610ba4915f01610b7f565b90565b6100b1565b610bb59061017b565b9052565b604090610be2610be99496959396610bd860608401985f850190610451565b6020830190610451565b0190610bac565b565b610bf36100a7565b3d5f823e3d90fd5b610c07610c0c9161090a565b6105cd565b90565b610c199054610bfb565b90565b916020610c3d929493610c3660408201965f830190610451565b0190610bac565b565b90505190610c4c826104a8565b565b90602082820312610c6757610c64915f01610c3f565b90565b6100b1565b5190565b60209181520190565b60200190565b90610c8c81602093610146565b0190565b60200190565b90610cb3610cad610ca684610c6c565b8093610c70565b92610c79565b905f5b818110610cc35750505090565b909192610cdc610cd66001928651610c7f565b94610c90565b9101919091610cb6565b610cef90610a26565b9052565b9291610d6396989795610d4460c096610d3a610d5c96610d30610d25610d519860e08c01908c5f818403910152610c96565b9660208b0190610bac565b6040890190610bac565b6060870190610bac565b8482036080860152610283565b9660a0830190610ce6565b0190610451565b565b610d71610d769161090a565b61034b565b90565b610d839054610d65565b90565b5f910312610d9057565b6100b1565b5f7f537761707065723a20696e73756666696369656e74206f757470757400000000910152565b610dc9601c602092610972565b610dd281610d95565b0190565b610deb9060208101905f818303910152610dbc565b90565b15610df557565b610dfd6100a7565b62461bcd60e51b815280610e1360048201610dd6565b0390fd5b94509294610e879192610e40610e8292610e3a610e34429261017b565b9161017b565b106109d4565b610e5c610e578583610e515f610a26565b91610a11565b610a42565b93610e7c610e6c82938093610a4f565b610e766001610a56565b90610a86565b91610a11565b610a42565b9281610eb48591610ea5610e996100a7565b938492602084016107eb565b60208201810382520382610827565b610ec6610ec082610856565b91610850565b2090610ed0610aab565b50610eee825c610ee8610ee24361017b565b9161017b565b14610b08565b610f00610efa83611c23565b92611683565b92610f12610f0d82610b3d565b610b49565b9060206323b872dd923390610f435f610f2a30610b55565b96610f4e89610f376100a7565b998a9788968795610b65565b855260048501610bb9565b03925af19081156112a457610f7192610f6c92611278575b50610b3d565b610b49565b91602063095ea7b393610f8c610f876002610c0f565b61060d565b90610faa5f8697610fb5610f9e6100a7565b998a9687958694610b65565b845260048401610c1c565b03925af192831561127357602093611248575b5061100e5f610fdf610fda6002610c0f565b61060d565b9261101963a22c27fe91959789908a908591610ff961093b565b936110026100a7565b9c8d9b8c9a8b99610b65565b895260048901610cf3565b03925af1801561124357611217575b5061103230610b55565b3161104561103f5f610a26565b9161017b565b1161117b575b611093602061106161105c85610b3d565b610b49565b6370a082319061108861107330610b55565b9261107c6100a7565b95869485938493610b65565b83526004830161045e565b03915afa8015611176576020936110ce6110d3926110d8945f91611149575b50946110c76110c1879261017b565b9161017b565b1015610dee565b610b3d565b610b49565b6110fb5f63a9059cbb9593956111066110ef6100a7565b97889687958694610b65565b845260048401610c1c565b03925af1801561114457611118575b50565b6111389060203d811161113d575b6111308183610827565b810190610b8e565b611115565b503d611126565b610beb565b6111699150873d811161116f575b6111618183610827565b810190610c4e565b5f6110b2565b503d611157565b610beb565b61118d6111886003610d79565b6103b6565b63d0e30db061119b30610b55565b319190813b15611212575f916111bd916111b36100a7565b9485938492610b65565b8252816111cc60048201610419565b03925af1801561120d576111e1575b5061104b565b611200905f3d8111611206575b6111f88183610827565b810190610d86565b5f6111db565b503d6111ee565b610beb565b610b61565b6112379060203d811161123c575b61122f8183610827565b810190610c4e565b611028565b503d611225565b610beb565b61126790843d811161126c575b61125f8183610827565b810190610b8e565b610fc8565b503d611255565b610beb565b6112989060203d811161129d575b6112908183610827565b810190610b8e565b610f66565b503d611286565b610beb565b906112b8969594939291610951565b565b61131595936112ed61130d93946112de6112d26100a7565b938492602084016107eb565b60208201810382520382610827565b6112ff6112f982610856565b91610850565b209243845d83919091611cf9565b919091611e89565b565b6113289061132361191e565b61132a565b565b8061134561133f61133a5f6108dd565b6100c4565b916100c4565b1461135557611353906119c2565b565b61137f6113615f6108dd565b6113696100a7565b918291631e4fbdf760e01b83526004830161045e565b0390fd5b61138c90611317565b565b90565b90565b6113a06113a59161138e565b611391565b9052565b905090565b5f7f686f707300000000000000000000000000000000000000000000000000000000910152565b6113e1600480926113a9565b6113ea816113ae565b0190565b806113fe60209261140494611394565b016113d5565b90565b9061141a6114136100a7565b9283610827565b565b67ffffffffffffffff81116114345760208091020190565b610813565b9061144b6114468361141c565b611407565b918252565b606090565b5f5b82811061146357505050565b60209061146e611450565b8184015201611457565b9061149d61148583611439565b92602080611493869361141c565b9201910390611455565b565b60016114ab910161017b565b90565b90565b6114bd6114c29161017b565b6114ae565b9052565b6020816114d86114e093839695611394565b0180926114b1565b0190565b67ffffffffffffffff81116114fc5760208091020190565b610813565b9061151361150e836114e4565b611407565b918252565b61152260c0611407565b90565b5f90565b5f90565b5f90565b5f90565b5f90565b611541611518565b906020808080808087611552611525565b81520161155d611525565b815201611568611529565b81520161157361152d565b81520161157e611531565b815201611589611535565b81525050565b611597611539565b90565b5f5b8281106115a857505050565b6020906115b361158f565b818401520161159c565b906115e26115ca83611501565b926020806115d886936114e4565b920191039061159a565b565b906115ee82610120565b8110156115ff576020809102010190565b6109fd565b5f90565b5f90565b5f90565b61161a60c0611407565b90565b90611627906100c4565b9052565b9061163590610153565b9052565b9061164390610166565b9052565b906116519061017b565b9052565b9061165f9061018b565b9052565b9061166d82610133565b81101561167e576020809102010190565b6109fd565b906116a76116b66116926107b3565b9361169b6100a7565b928391602083016113ee565b60208201810382520382610827565b6116c86116c282610856565b91610850565b206116d1610aab565b50805c92836116e86116e25f610a26565b9161017b565b1461191757506116f783611478565b916117015f610a26565b5b8061171561170f8761017b565b9161017b565b10156119105782611747829161173861172c6100a7565b938492602084016114c6565b60208201810382520382610827565b61175961175382610856565b91610850565b20611762610aab565b50805c90816117796117735f610a26565b9161017b565b1161178f575b505061178a9061149f565b611702565b939590946117b56117a2879594956115bd565b8286916117af83836115e4565b526115e4565b51506117c28185906115e4565b51966117cd5f610a26565b5b806117e16117db8a61017b565b9161017b565b10156118ff576118fa906118f38861181a839161180b6117ff6100a7565b938492602084016114c6565b60208201810382520382610827565b61182c61182682610856565b91610850565b20611835610906565b5061183e610906565b50611847610aab565b50611850611604565b50611859611608565b5061186261160c565b506118e0815c916118d7600182015c936118ce6003600285015c94015c936118c560ff8616956118bc62ffffff8260081c169160201c959997919395976118b36118aa611610565b9b5f8d0161161d565b60208b0161161d565b6040890161162b565b60608701611639565b60808501611647565b60a08301611655565b8b83916118ed8383611663565b52611663565b515061149f565b6117ce565b509450945094509061178a5f61177f565b5091925050565b9192505090565b61192661093b565b61193f61193961193461205e565b6100c4565b916100c4565b0361194657565b61196f61195161205e565b6119596100a7565b91829163118cdaa760e01b83526004830161045e565b0390fd5b5f1b90565b9061198960018060a01b0391611973565b9181191691161790565b61199c906103aa565b90565b90565b906119b76119b26119be92611993565b61199f565b8254611978565b9055565b6119cc600161092e565b6119d78260016119a2565b90611a0b611a057f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e093611993565b91611993565b91611a146100a7565b80611a1e81610419565b0390a3565b90565b611a32611a379161090a565b611a23565b90565b611a449054611a26565b90565b90565b611a5e611a59611a6392611a47565b61038b565b61017b565b90565b611a706002611a4a565b90565b90611a7f5f1991611973565b9181191691161790565b611a9d611a98611aa29261017b565b61038b565b61017b565b90565b90565b90611abd611ab8611ac492611a89565b611aa5565b8254611a73565b9055565b611ad15f611a3a565b611aea611ae4611adf611a66565b61017b565b9161017b565b14611b0257611b00611afa611a66565b5f611aa8565b565b611b0a6100a7565b633ee5aeb560e01b815280611b2160048201610419565b0390fd5b611b2f6001610a56565b90565b611b43611b3d611b25565b5f611aa8565b565b606090565b5f7f746f6b656e730000000000000000000000000000000000000000000000000000910152565b611b7d600680926113a9565b611b8681611b4a565b0190565b80611b9a602092611ba094611394565b01611b71565b90565b67ffffffffffffffff8111611bbb5760208091020190565b610813565b90611bd2611bcd83611ba3565b611407565b918252565b369037565b90611c01611be983611bc0565b92602080611bf78693611ba3565b9201910390611bd7565b565b90611c0d82610c6c565b811015611c1e576020809102010190565b6109fd565b611c46611c55611c31611b45565b92611c3a6100a7565b92839160208301611b8a565b60208201810382520382610827565b611c67611c6182610856565b91610850565b20611c70610aab565b50805c9182611c87611c815f610a26565b9161017b565b14611cf35750611c9682611bdc565b92611ca05f610a26565b5b80611cb4611cae8661017b565b9161017b565b1015611ced57611ce890611cc6610906565b50611ce36001820185015c611cde8891849092611c03565b61161d565b61149f565b611ca1565b50915050565b91505090565b611d26611d1791949394611d0b6100a7565b92839160208301611b8a565b60208201810382520382610827565b611d38611d3282610856565b91610850565b2090611d45818590610a4f565b9283835d611d525f610a26565b5b80611d66611d608761017b565b9161017b565b1015611d9557611d9090611d84611d7f85898491610a11565b610a42565b6001820186015d61149f565b611d53565b509350505050565b5090565b5f80fd5b5f80fd5b5f80fd5b903590600160200381360303821215611def570180359067ffffffffffffffff8211611dea576020019160c0820236038313611de557565b611da9565b611da5565b611da1565b90821015611e0f576020611e0b9202810190611dad565b9091565b6109fd565b5090565b9190811015611e285760c0020190565b6109fd565b35611e37816104a8565b90565b611e4381610153565b03611e4a57565b5f80fd5b35611e5881611e3a565b90565b611e6481610166565b03611e6b57565b5f80fd5b35611e7981611e5b565b90565b35611e8681610b6b565b90565b611eb3611ea491611e986100a7565b928391602083016113ee565b60208201810382520382610827565b611ec5611ebf82610856565b91610850565b2091611ed2828290611d9d565b9283815d611edf5f610a26565b945b85611ef4611eee8761017b565b9161017b565b101561205657611f0f611f0985858991611df4565b90611e14565b9482611f3c8891611f2d611f216100a7565b938492602084016114c6565b60208201810382520382610827565b611f4e611f4882610856565b91610850565b209286845d611f5c5f610a26565b5b80611f70611f6a8a61017b565b9161017b565b101561203f5761203a9085611fa68291611f97611f8b6100a7565b938492602084016114c6565b60208201810382520382610827565b611fb8611fb282610856565b91610850565b206003611fd3611fcc8d8c908c9091611df4565b8591611e18565b91611fdf5f8401610a42565b92611fec60208201610a42565b611ff860808301611e2d565b9161200560408201611e4e565b61201d60a061201660608501611e6f565b9301611e7c565b60201b9160081b171794835d600183015d600282015d015d61149f565b611f5d565b5095509561204e91925061149f565b949390611ee1565b945050505050565b612066610906565b50339056fea26469706673582212201602633d61b15ad7dcc2b9aed0e2d7fd61597a864fa568480bf5ea74ecc3c6aa64736f6c63430008180033
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in HYPE
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.