Overview
ETH Balance
0 ETH
Eth Value
$0.00Token Holdings
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 544 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Swap Exact Token... | 21085837 | 23 days ago | IN | 0 ETH | 0.00264234 | ||||
Swap Exact Token... | 20991683 | 36 days ago | IN | 0 ETH | 0.00387359 | ||||
Swap Exact Nativ... | 20935329 | 44 days ago | IN | 0.011 ETH | 0.00669649 | ||||
Remove Liquidity... | 20860307 | 54 days ago | IN | 0 ETH | 0.00100926 | ||||
Swap Exact Nativ... | 20817337 | 60 days ago | IN | 0.001 ETH | 0.00661599 | ||||
Add Liquidity Na... | 20733951 | 72 days ago | IN | 0.1 ETH | 0.00114718 | ||||
Add Liquidity Na... | 20690763 | 78 days ago | IN | 0.0001 ETH | 0.00035101 | ||||
Swap Exact Token... | 20678860 | 79 days ago | IN | 0 ETH | 0.00104457 | ||||
Swap Exact Nativ... | 20676984 | 80 days ago | IN | 0.001 ETH | 0.00004445 | ||||
Swap Exact Token... | 20658051 | 82 days ago | IN | 0 ETH | 0.00070241 | ||||
Swap Exact Nativ... | 20606040 | 90 days ago | IN | 0.00123962 ETH | 0.0006069 | ||||
Remove Liquidity... | 20603580 | 90 days ago | IN | 0 ETH | 0.00012687 | ||||
Add Liquidity Na... | 20570360 | 95 days ago | IN | 0.8 ETH | 0.00098688 | ||||
Remove Liquidity... | 20543972 | 98 days ago | IN | 0 ETH | 0.00018811 | ||||
Add Liquidity Na... | 20543455 | 98 days ago | IN | 0.05 ETH | 0.0004335 | ||||
Swap Exact Nativ... | 20527195 | 101 days ago | IN | 0.0001 ETH | 0.00343623 | ||||
Remove Liquidity... | 20512611 | 103 days ago | IN | 0 ETH | 0.00109903 | ||||
Add Liquidity Na... | 20505105 | 104 days ago | IN | 0.09 ETH | 0.00032616 | ||||
Add Liquidity Na... | 20505083 | 104 days ago | IN | 0.1 ETH | 0.00039586 | ||||
Add Liquidity Na... | 20469080 | 109 days ago | IN | 0.001 ETH | 0.00065795 | ||||
Add Liquidity Na... | 20468654 | 109 days ago | IN | 0.04 ETH | 0.00120255 | ||||
Approve Spending... | 20466612 | 109 days ago | IN | 0 ETH | 0.00060312 | ||||
Remove Liquidity... | 20437739 | 113 days ago | IN | 0 ETH | 0.00045671 | ||||
Swap Exact Nativ... | 20359724 | 124 days ago | IN | 0.001 ETH | 0.00091948 | ||||
Swap Exact Nativ... | 20330339 | 128 days ago | IN | 0.0002 ETH | 0.00149076 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
20935329 | 44 days ago | 0.011 ETH | ||||
20860307 | 54 days ago | 0.0998587 ETH | ||||
20860307 | 54 days ago | 0.0998587 ETH | ||||
20817337 | 60 days ago | 0.001 ETH | ||||
20733951 | 72 days ago | 0.1 ETH | ||||
20690763 | 78 days ago | 0.0001 ETH | ||||
20658051 | 82 days ago | 0.02778264 ETH | ||||
20658051 | 82 days ago | 0.02778264 ETH | ||||
20606040 | 90 days ago | 0.00123962 ETH | ||||
20603580 | 90 days ago | 0.79904909 ETH | ||||
20603580 | 90 days ago | 0.79904909 ETH | ||||
20570360 | 95 days ago | 0.8 ETH | ||||
20543972 | 98 days ago | 0.37022566 ETH | ||||
20543972 | 98 days ago | 0.37022566 ETH | ||||
20543455 | 98 days ago | 0.05 ETH | ||||
20527195 | 101 days ago | 0.0001 ETH | ||||
20512611 | 103 days ago | 0.18488639 ETH | ||||
20512611 | 103 days ago | 0.18488639 ETH | ||||
20505105 | 104 days ago | 0.09 ETH | ||||
20505083 | 104 days ago | 0.1 ETH | ||||
20469080 | 109 days ago | 0.001 ETH | ||||
20468654 | 109 days ago | 0.04 ETH | ||||
20437739 | 113 days ago | 0.04802326 ETH | ||||
20437739 | 113 days ago | 0.04802326 ETH | ||||
20359724 | 124 days ago | 0.001 ETH |
Loading...
Loading
Contract Name:
WombatRouter
Compiler Version
v0.8.18+commit.87f61d96
Optimization Enabled:
Yes with 1000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.5; import '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol'; import '@openzeppelin/contracts/access/Ownable.sol'; import '../libraries/SignedSafeMath.sol'; import '../interfaces/IPool.sol'; import '../interfaces/IWombatRouter.sol'; interface IWNative { function deposit() external payable; function withdraw(uint256 wad) external; } /** * @title WombatRouter * @notice Allows routing on different wombat pools * @dev Owner is allowed and required to approve token spending by pools via approveSpendingByPool function. * With great thanks to the uniswap team for your contribution to the opensource community * reference: https://github.com/Uniswap/v2-periphery/blob/master/contracts/UniswapV2Router02.sol */ contract WombatRouter is Ownable, IWombatRouter { using SafeERC20 for IERC20; using SignedSafeMath for uint256; IWNative public immutable wNative; constructor(IWNative _wNative) { require(address(_wNative) != address(0), 'WombatRouter: wNative is zero address'); wNative = _wNative; } receive() external payable { require(msg.sender == address(wNative)); } /// @notice approve spending of router tokens by pool /// @param tokens array of tokens to be approved /// @param pool to be approved to spend /// @dev needs to be done after asset deployment for router to be able to support the tokens function approveSpendingByPool(address[] calldata tokens, address pool) external onlyOwner { for (uint256 i; i < tokens.length; ++i) { IERC20(tokens[i]).safeApprove(pool, 0); IERC20(tokens[i]).safeApprove(pool, type(uint256).max); } } function addLiquidityNative( IPool pool, uint256 minimumLiquidity, address to, uint256 deadline, bool shouldStake ) external payable override returns (uint256 liquidity) { wNative.deposit{value: msg.value}(); return pool.deposit(address(wNative), msg.value, minimumLiquidity, to, deadline, shouldStake); } function removeLiquidityNative( IPool pool, uint256 liquidity, uint256 minimumAmount, address to, uint256 deadline ) external override returns (uint256 amount) { address asset = pool.addressOfAsset(address(wNative)); IERC20(asset).transferFrom(address(msg.sender), address(this), liquidity); amount = pool.withdraw(address(wNative), liquidity, minimumAmount, address(this), deadline); wNative.withdraw(amount); _safeTransferNative(to, amount); } function removeLiquidityFromOtherAssetAsNative( IPool pool, address fromToken, uint256 liquidity, uint256 minimumAmount, address to, uint256 deadline ) external returns (uint256 amount) { address asset = pool.addressOfAsset(fromToken); IERC20(asset).transferFrom(address(msg.sender), address(this), liquidity); amount = pool.withdrawFromOtherAsset( fromToken, address(wNative), liquidity, minimumAmount, address(this), deadline ); wNative.withdraw(amount); _safeTransferNative(to, amount); } /// @notice Swaps an exact amount of input tokens for as many output tokens as possible, along the route determined by the path /// @param tokenPath An array of token addresses. path.length must be >= 2. /// @param tokenPath The first element of the path is the input token, the last element is the output token. /// @param poolPath An array of pool addresses. The pools where the pathTokens are contained in order. /// @param amountIn the amount in /// @param minimumamountOut the minimum amount to get for user /// @param to the user to send the tokens to /// @param deadline the deadline to respect /// @return amountOut received by user function swapExactTokensForTokens( address[] calldata tokenPath, address[] calldata poolPath, uint256 amountIn, uint256 minimumamountOut, address to, uint256 deadline ) external override returns (uint256 amountOut) { require(deadline >= block.timestamp, 'expired'); require(tokenPath.length >= 2, 'invalid token path'); require(poolPath.length == tokenPath.length - 1, 'invalid pool path'); // get from token from users IERC20(tokenPath[0]).safeTransferFrom(address(msg.sender), address(this), amountIn); amountOut = _swap(tokenPath, poolPath, amountIn, to); require(amountOut >= minimumamountOut, 'amountOut too low'); } function swapExactNativeForTokens( address[] calldata tokenPath, address[] calldata poolPath, uint256 minimumamountOut, address to, uint256 deadline ) external payable override returns (uint256 amountOut) { require(tokenPath[0] == address(wNative), 'the first address should be wrapped token'); require(deadline >= block.timestamp, 'expired'); require(poolPath.length == tokenPath.length - 1, 'invalid pool path'); // get wrapped tokens wNative.deposit{value: msg.value}(); amountOut = _swap(tokenPath, poolPath, msg.value, to); require(amountOut >= minimumamountOut, 'amountOut too low'); } function swapExactTokensForNative( address[] calldata tokenPath, address[] calldata poolPath, uint256 amountIn, uint256 minimumamountOut, address to, uint256 deadline ) external override returns (uint256 amountOut) { require(tokenPath[tokenPath.length - 1] == address(wNative), 'the last address should be wrapped token'); require(deadline >= block.timestamp, 'expired'); require(poolPath.length == tokenPath.length - 1, 'invalid pool path'); // get from token from users IERC20(tokenPath[0]).safeTransferFrom(address(msg.sender), address(this), amountIn); amountOut = _swap(tokenPath, poolPath, amountIn, address(this)); require(amountOut >= minimumamountOut, 'amountOut too low'); wNative.withdraw(amountOut); _safeTransferNative(to, amountOut); } /// @notice Private function to swap alone the token path /// @dev Assumes router has initial amountIn in balance. /// Assumes tokens being swapped have been approve via the approveSpendingByPool function /// @param tokenPath An array of token addresses. path.length must be >= 2. /// @param tokenPath The first element of the path is the input token, the last element is the output token. /// @param poolPath An array of pool addresses. The pools where the pathTokens are contained in order. /// @param amountIn the amount in /// @param to the user to send the tokens to /// @return amountOut received by user function _swap( address[] calldata tokenPath, address[] calldata poolPath, uint256 amountIn, address to ) internal returns (uint256 amountOut) { // next from amount, starts with amountIn in arg uint256 nextamountIn = amountIn; // first n - 1 swaps for (uint256 i; i < poolPath.length - 1; ++i) { // make the swap with the correct arguments (amountOut, ) = IPool(poolPath[i]).swap( tokenPath[i], tokenPath[i + 1], nextamountIn, 0, // minimum amount received is ensured on calling function address(this), type(uint256).max // deadline is ensured on calling function ); nextamountIn = amountOut; } // last swap uint256 i = poolPath.length - 1; (amountOut, ) = IPool(poolPath[i]).swap( tokenPath[i], tokenPath[i + 1], nextamountIn, 0, // minimum amount received is ensured on calling function to, type(uint256).max // deadline is ensured on calling function ); } /** * @notice Given an input asset amount and an array of token addresses, calculates the * maximum output token amount (accounting for fees and slippage). * @param tokenPath The token swap path * @param poolPath The token pool path * @param amountIn The from amount * @return amountOut The potential final amount user would receive */ function getAmountOut( address[] calldata tokenPath, address[] calldata poolPath, int256 amountIn ) external view override returns (uint256 amountOut, uint256[] memory haircuts) { require(tokenPath.length >= 2, 'invalid token path'); require(poolPath.length == tokenPath.length - 1, 'invalid pool path'); // next from amount, starts with amountIn in arg int256 nextamountIn = amountIn; haircuts = new uint256[](poolPath.length); for (uint256 i; i < poolPath.length; ++i) { // make the swap with the correct arguments (amountOut, haircuts[i]) = IPool(poolPath[i]).quotePotentialSwap( tokenPath[i], tokenPath[i + 1], nextamountIn ); nextamountIn = amountOut.toInt256(); } } /** * @notice Returns the minimum input asset amount required to buy the given output asset amount * (accounting for fees and slippage) * Note: This function should be used as estimation only. The actual swap amount might * be different due to precision error (the error is typically under 1e-6) * @param tokenPath The token swap path * @param poolPath The token pool path * @param amountOut The to amount * @return amountIn The potential final amount user would receive */ function getAmountIn( address[] calldata tokenPath, address[] calldata poolPath, uint256 amountOut ) external view override returns (uint256 amountIn, uint256[] memory haircuts) { require(tokenPath.length >= 2, 'invalid token path'); require(poolPath.length == tokenPath.length - 1, 'invalid pool path'); // next from amount, starts with amountIn in arg int256 nextAmountOut = amountOut.toInt256(); haircuts = new uint256[](poolPath.length); for (uint256 i = poolPath.length; i > 0; --i) { (amountIn, haircuts[i - 1]) = IPool(poolPath[i - 1]).quoteAmountIn( tokenPath[i - 1], tokenPath[i], nextAmountOut ); nextAmountOut = amountIn.toInt256(); } } function _safeTransferNative(address to, uint256 value) internal { (bool success, ) = to.call{value: value}(new bytes(0)); require(success, '_safeTransferNative fails'); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../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. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/IERC20Permit.sol) pragma solidity ^0.8.0; /** * @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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; import "../extensions/IERC20Permit.sol"; import "../../../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value)); } /** * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value)); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Compatible with tokens that require the approval to be set to * 0 before setting it to a non-zero value. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0)); _callOptionalReturn(token, approvalCall); } } /** * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`. * Revert on invalid signature. */ function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). * * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @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; } }
// SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.5; interface IPool { function getTokens() external view returns (address[] memory); function addressOfAsset(address token) external view returns (address); function deposit( address token, uint256 amount, uint256 minimumLiquidity, address to, uint256 deadline, bool shouldStake ) external returns (uint256 liquidity); function withdraw( address token, uint256 liquidity, uint256 minimumAmount, address to, uint256 deadline ) external returns (uint256 amount); function withdrawFromOtherAsset( address fromToken, address toToken, uint256 liquidity, uint256 minimumAmount, address to, uint256 deadline ) external returns (uint256 amount); function swap( address fromToken, address toToken, uint256 fromAmount, uint256 minimumToAmount, address to, uint256 deadline ) external returns (uint256 actualToAmount, uint256 haircut); function quotePotentialDeposit( address token, uint256 amount ) external view returns (uint256 liquidity, uint256 reward); function quotePotentialSwap( address fromToken, address toToken, int256 fromAmount ) external view returns (uint256 potentialOutcome, uint256 haircut); function quotePotentialWithdraw( address token, uint256 liquidity ) external view returns (uint256 amount, uint256 fee); function quoteAmountIn( address fromToken, address toToken, int256 toAmount ) external view returns (uint256 amountIn, uint256 haircut); }
// SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.5; import './IPool.sol'; interface IWombatRouter { function getAmountOut( address[] calldata tokenPath, address[] calldata poolPath, int256 amountIn ) external view returns (uint256 amountOut, uint256[] memory haircuts); /** * @notice Returns the minimum input asset amount required to buy the given output asset amount * (accounting for fees and slippage) * Note: This function should be used as estimation only. The actual swap amount might * be different due to precision error (the error is typically under 1e-6) */ function getAmountIn( address[] calldata tokenPath, address[] calldata poolPath, uint256 amountOut ) external view returns (uint256 amountIn, uint256[] memory haircuts); function swapExactTokensForTokens( address[] calldata tokenPath, address[] calldata poolPath, uint256 fromAmount, uint256 minimumToAmount, address to, uint256 deadline ) external returns (uint256 amountOut); function swapExactNativeForTokens( address[] calldata tokenPath, // the first address should be WBNB address[] calldata poolPath, uint256 minimumamountOut, address to, uint256 deadline ) external payable returns (uint256 amountOut); function swapExactTokensForNative( address[] calldata tokenPath, // the last address should be WBNB address[] calldata poolPath, uint256 amountIn, uint256 minimumamountOut, address to, uint256 deadline ) external returns (uint256 amountOut); function addLiquidityNative( IPool pool, uint256 minimumLiquidity, address to, uint256 deadline, bool shouldStake ) external payable returns (uint256 liquidity); function removeLiquidityNative( IPool pool, uint256 liquidity, uint256 minimumAmount, address to, uint256 deadline ) external returns (uint256 amount); function removeLiquidityFromOtherAssetAsNative( IPool pool, address fromToken, uint256 liquidity, uint256 minimumAmount, address to, uint256 deadline ) external returns (uint256 amount); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.3.2 (utils/math/SignedSafeMath.sol) pragma solidity ^0.8.5; /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SignedSafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SignedSafeMath { int256 public constant WAD = 10 ** 18; //rounds to zero if x*y < WAD / 2 function wdiv(int256 x, int256 y) internal pure returns (int256) { return ((x * WAD) + (y / 2)) / y; } //rounds to zero if x*y < WAD / 2 function wmul(int256 x, int256 y) internal pure returns (int256) { return ((x * y) + (WAD / 2)) / WAD; } // Babylonian Method (typecast as int) function sqrt(int256 y) internal pure returns (int256 z) { if (y > 3) { z = y; int256 x = y / 2 + 1; while (x < z) { z = x; x = (y / x + x) / 2; } } else if (y != 0) { z = 1; } } // Babylonian Method with initial guess (typecast as int) function sqrt(int256 y, int256 guess) internal pure returns (int256 z) { if (y > 3) { if (guess > 0 && guess <= y) { z = guess; } else if (guess < 0 && -guess <= y) { z = -guess; } else { z = y; } int256 x = (y / z + z) / 2; while (x != z) { z = x; x = (y / x + x) / 2; } } else if (y != 0) { z = 1; } } // Convert x to WAD (18 decimals) from d decimals. function toWad(int256 x, uint8 d) internal pure returns (int256) { if (d < 18) { return x * int256(10 ** (18 - d)); } else if (d > 18) { return (x / int256(10 ** (d - 18))); } return x; } // Convert x from WAD (18 decimals) to d decimals. function fromWad(int256 x, uint8 d) internal pure returns (int256) { if (d < 18) { return (x / int256(10 ** (18 - d))); } else if (d > 18) { return x * int256(10 ** (d - 18)); } return x; } function toUint256(int256 value) internal pure returns (uint256) { require(value >= 0, 'value must be positive'); return uint256(value); } function toInt256(uint256 value) internal pure returns (int256) { require(value <= uint256(type(int256).max), 'value must be positive'); return int256(value); } function abs(int256 value) internal pure returns (uint256) { if (value < 0) { return uint256(-value); } else { return uint256(value); } } }
{ "viaIR": true, "optimizer": { "enabled": true, "runs": 1000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IWNative","name":"_wNative","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"contract IPool","name":"pool","type":"address"},{"internalType":"uint256","name":"minimumLiquidity","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"shouldStake","type":"bool"}],"name":"addLiquidityNative","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"address","name":"pool","type":"address"}],"name":"approveSpendingByPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokenPath","type":"address[]"},{"internalType":"address[]","name":"poolPath","type":"address[]"},{"internalType":"uint256","name":"amountOut","type":"uint256"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256[]","name":"haircuts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokenPath","type":"address[]"},{"internalType":"address[]","name":"poolPath","type":"address[]"},{"internalType":"int256","name":"amountIn","type":"int256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256[]","name":"haircuts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IPool","name":"pool","type":"address"},{"internalType":"address","name":"fromToken","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"minimumAmount","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityFromOtherAssetAsNative","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IPool","name":"pool","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"minimumAmount","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityNative","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokenPath","type":"address[]"},{"internalType":"address[]","name":"poolPath","type":"address[]"},{"internalType":"uint256","name":"minimumamountOut","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactNativeForTokens","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokenPath","type":"address[]"},{"internalType":"address[]","name":"poolPath","type":"address[]"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"minimumamountOut","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForNative","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokenPath","type":"address[]"},{"internalType":"address[]","name":"poolPath","type":"address[]"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"minimumamountOut","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wNative","outputs":[{"internalType":"contract IWNative","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60a03461012957601f611c9338819003918201601f19168301916001600160401b0383118484101761012e5780849260209460405283398101031261012957516001600160a01b03808216808303610129576000543360018060a01b0319821617600055604051923391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3156100d95750608052604051611b4e908161014582396080518181816029015281816102110152818161091201528181610b2601528181610ccc01528181610ffa015261108e0152f35b62461bcd60e51b815260206004820152602560248201527f576f6d626174526f757465723a20774e6174697665206973207a65726f206164604482015264647265737360d81b6064820152608490fd5b600080fd5b634e487b7160e01b600052604160045260246000fdfe60806040818152600480361015610056575b505050361561001f57600080fd5b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016330361005157005b600080fd5b600092833560e01c908163018ad0011461101e575080632d68efc914610fda5780633226288e14610ded5780636248fced14610c8e578063715018a614610c275780637eeb195514610a6a57806385335cc0146108d05780638d8f82e6146106e85780638da5cb5b146106c2578063b9e598c1146104cc578063d44107a414610417578063f048d48f146101da5763f2fde38b0361001157346101d65760203660031901126101d65761010761122e565b906101106112f3565b6001600160a01b0380921692831561016d5750506000548273ffffffffffffffffffffffffffffffffffffffff19821617600055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a380f35b906020608492519162461bcd60e51b8352820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152fd5b8280fd5b509190346104135760a0366003190112610413576101f661122e565b92602435610202611202565b916001600160a01b03809616867f0000000000000000000000000000000000000000000000000000000000000000169285519763e9249cc760e01b895284848a01526020988981602481875afa90811561040957918a918a9384916103dc575b5089516323b872dd60e01b8152338882019081523060208201526040810187905290948593849283906060010393165af180156103d2578992899695949260a4926103a5575b508851998a9384927f09a5fca300000000000000000000000000000000000000000000000000000000845288888501526024840152604435604484015230606484015260843560848401525af195861561039b57839661036c575b50813b156101d65785602484928388519586948593632e1a7d4d60e01b85528401525af180156103625790859291610347575b505061034191611a98565b51908152f35b819250610353906113aa565b61035f57808491610336565b80fd5b84513d84823e3d90fd5b9095508681813d8311610394575b61038481836113f0565b8101031261005157519438610303565b503d61037a565b85513d85823e3d90fd5b6103c490853d87116103cb575b6103bc81836113f0565b810190611412565b50386102a8565b503d6103b2565b87513d8a823e3d90fd5b6103fc9150833d8511610402575b6103f481836113f0565b810190611648565b38610262565b503d6103ea565b88513d8b823e3d90fd5b5080fd5b509190346104135761043f61042b36611288565b999199979097969296959395421115611667565b61044c60028410156116b2565b60001983018381116104b9576104639086146116fd565b82156104a6576020898961034161049d8b8b8b8b8b8b610498856001600160a01b0361048e84611396565b1630903390611793565b6117ef565b92831015611748565b8060328b634e487b7160e01b6024945252fd5b60248260118d634e487b7160e01b835252fd5b509190346104135760603660031901126104135767ffffffffffffffff9183358381116104135761050090369086016111d1565b909360249081359081116106be5761051b90369088016111d1565b969092849661052d60028310156116b2565b60001982018281116106ac5761054b908a9493929796959a146116fd565b60443595610558846119e4565b9986945b808610610575578951806105718e8e83611244565b0390f35b90919293949596979a99506001600160a01b0361059b61059688848b611370565b611396565b166105aa610596888787611370565b6001880180891161069a579161061e9c9d916105cb6105968e958a8a611370565b9084519e8f94859384937f4fdd64e50000000000000000000000000000000000000000000000000000000085528d85016040919493929460608201956001600160a01b0380921683521660208201520152565b03915afa801561069057889a899161065d575b5061063c878d611a16565b5261064f6106498b611a2a565b9661134b565b94939291909796959761055c565b9050610680919a50893d8b11610689575b61067881836113f0565b8101906117d9565b99909938610631565b503d61066e565b89513d8a823e3d90fd5b848b60118a634e487b7160e01b835252fd5b8487601186634e487b7160e01b835252fd5b8380fd5b5050346104135781600319360112610413576001600160a01b0360209254169051908152f35b5090346101d657806003193601126101d657813567ffffffffffffffff81116106be5761071890369084016111d1565b929091610723611218565b9061072c6112f3565b6001600160a01b0391821690865b868110610745578780f35b868685610756610596858585611370565b1685876107b6610596878951977f095ea7b300000000000000000000000000000000000000000000000000000000976107b160209a8a8c8201526024988982015260449960008b8301528a82526107ac826113d4565b61142a565b611370565b169286517fdd62ed3e000000000000000000000000000000000000000000000000000000008152308b820152888382015285818581885afa9081156108c557600091610898575b5061083257865194850152830186905260001983820152825261082d9291610828916107ac826113d4565b61134b565b61073a565b60848a7f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f856036868a8d519562461bcd60e51b87528601528401528201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152fd5b908682813d83116108be575b6108ae81836113f0565b8101031261035f575051386107fd565b503d6108a4565b88513d6000823e3d90fd5b5090346101d6576108e036611288565b9560009a9794929995919a198101818111610a5757610903610596828489611370565b906001600160a01b03988992837f0000000000000000000000000000000000000000000000000000000000000000169a8b9116036109ee579061094b61095292421115611667565b85146116fd565b81156109db579185939161097186610978979561048e6109819a611396565b30946117ef565b95861015611748565b813b156101d65784602484928387519586948593632e1a7d4d60e01b85528401525af180156109d1576109bd575b505061034182602094611a98565b6109c782916113aa565b61035f57806109af565b83513d84823e3d90fd5b602489603289634e487b7160e01b835252fd5b60848960208e519162461bcd60e51b8352820152602860248201527f746865206c61737420616464726573732073686f756c6420626520777261707060448201527f656420746f6b656e0000000000000000000000000000000000000000000000006064820152fd5b602489601189634e487b7160e01b835252fd5b5090346101d65760c03660031901126101d657610a8561122e565b91610a8e611218565b9360443593608435926001600160a01b03918285168503610051578216958286519863e9249cc760e01b8a52169283838a015260209889816024818c5afa908115610c00578691610c0a575b5087516323b872dd60e01b8152338582019081523060208201526040810185905290918b918391908290036060019082908a9087165af18015610c00579160c4918b9493610be3575b507f000000000000000000000000000000000000000000000000000000000000000016948689519a8b9485937f0f91f06f000000000000000000000000000000000000000000000000000000008552888501528860248501526044840152606435606484015230608484015260a43560a48401525af195861561039b57839661036c5750813b156101d65785602484928388519586948593632e1a7d4d60e01b85528401525af18015610362579085929161034757505061034191611a98565b610bf990853d87116103cb576103bc81836113f0565b5038610b23565b88513d88823e3d90fd5b610c2191508a3d8c11610402576103f481836113f0565b38610ada565b833461035f578060031936011261035f57610c406112f3565b60006001600160a01b03815473ffffffffffffffffffffffffffffffffffffffff1981168355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b50919060a036600319011261041357610ca561122e565b604435936001600160a01b03808616809603610de95760843592831515809403610de557817f00000000000000000000000000000000000000000000000000000000000000001693843b15610de1578551630d0e30db60e41b815287818681348a5af180156103d257610dc4575b5060c4926020959492889288519a8b9788967f6281baef00000000000000000000000000000000000000000000000000000000885287015234602487015260243560448701526064860152606435608486015260a4850152165af1918215610db95791610d85575b6020925051908152f35b90506020823d8211610db1575b81610d9f602093836113f0565b81010312610051576020915190610d7b565b3d9150610d92565b9051903d90823e3d90fd5b92602095949297610dd660c4956113aa565b979294955092610d13565b8680fd5b8580fd5b8480fd5b5090346101d65760603660031901126101d65767ffffffffffffffff92823584811161041357610e2090369085016111d1565b91909460243590811161041357610e3a90369086016111d1565b91948591610e4b60028610156116b2565b60001994808601818111610fc757610e6b9086959493929a9796146116fd565b610e76604435611a2a565b95610e80856119e4565b998591825b610e97578951806105718e8e83611244565b9091929394959680989a508301838111610f835789610eb7828a88611370565b610ec090611396565b6001600160a01b0316610ed4838686611370565b610edd90611396565b90610ee9878787611370565b610ef290611396565b83517ffca8f3080000000000000000000000000000000000000000000000000000000081526001600160a01b039384168b8201908152939091166020840152604083019e909e528d918290819060600103915afa908115610fbd57879b8892610f96575b50610f61908d611a16565b52610f6b8a611a2a565b928015610f8357880191908298979695949398610e85565b602487601188634e487b7160e01b835252fd5b610f619c50610fb39192508b3d8d116106895761067881836113f0565b9b909b9190610f56565b8a513d89823e3d90fd5b602485601186634e487b7160e01b835252fd5b505034610413578160031936011261041357602090516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b83858460a03660031901126104135767ffffffffffffffff9181358381116104135761104d90369084016111d1565b90936024359081116101d65761106690369085016111d1565b939092611071611202565b9783156111be5761108187611396565b906001600160a01b0391827f000000000000000000000000000000000000000000000000000000000000000016928391160361115757506110c6426084351015611667565b6000198401848111611144576110dd9087146116fd565b803b15610413578190885193848092630d0e30db60e41b825234905af190811561113957509161111b959391602098959361112a575b5034936117ef565b90610341604435831015611748565b611133906113aa565b88611113565b8751903d90823e3d90fd5b602483601186634e487b7160e01b835252fd5b8060208562461bcd60e51b60849452820152602960248201527f74686520666972737420616464726573732073686f756c64206265207772617060448201527f70656420746f6b656e00000000000000000000000000000000000000000000006064820152fd5b506032602492634e487b7160e01b835252fd5b9181601f840112156100515782359167ffffffffffffffff8311610051576020808501948460051b01011161005157565b606435906001600160a01b038216820361005157565b602435906001600160a01b038216820361005157565b600435906001600160a01b038216820361005157565b9060609160408101918152602092816040858094015285518094520193019160005b828110611274575050505090565b835185529381019392810192600101611266565b60c06003198201126100515767ffffffffffffffff9160043583811161005157826112b5916004016111d1565b93909392602435918211610051576112cf916004016111d1565b909160443590606435906084356001600160a01b0381168103610051579060a43590565b6001600160a01b0360005416330361130757565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b600019811461135a5760010190565b634e487b7160e01b600052601160045260246000fd5b91908110156113805760051b0190565b634e487b7160e01b600052603260045260246000fd5b356001600160a01b03811681036100515790565b67ffffffffffffffff81116113be57604052565b634e487b7160e01b600052604160045260246000fd5b6080810190811067ffffffffffffffff8211176113be57604052565b90601f8019910116810190811067ffffffffffffffff8211176113be57604052565b90816020910312610051575180151581036100515790565b6001600160a01b0316604051604081019181831067ffffffffffffffff8411176113be5761149a926040526000806020958685527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656487860152868151910182855af1611494611535565b91611575565b80519082821592831561151d575b505050156114b35750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b61152d9350820181019101611412565b3882816114a8565b3d15611570573d9067ffffffffffffffff82116113be5760405191611564601f8201601f1916602001846113f0565b82523d6000602084013e565b606090565b919290156115d65750815115611589575090565b3b156115925790565b606460405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b8251909150156115e95750805190602001fd5b6040519062461bcd60e51b82528160208060048301528251908160248401526000935b82851061162f575050604492506000838284010152601f80199101168101030190fd5b848101820151868601604401529381019385935061160c565b9081602091031261005157516001600160a01b03811681036100515790565b1561166e57565b606460405162461bcd60e51b815260206004820152600760248201527f65787069726564000000000000000000000000000000000000000000000000006044820152fd5b156116b957565b606460405162461bcd60e51b815260206004820152601260248201527f696e76616c696420746f6b656e207061746800000000000000000000000000006044820152fd5b1561170457565b606460405162461bcd60e51b815260206004820152601160248201527f696e76616c696420706f6f6c20706174680000000000000000000000000000006044820152fd5b1561174f57565b606460405162461bcd60e51b815260206004820152601160248201527f616d6f756e744f757420746f6f206c6f770000000000000000000000000000006044820152fd5b6040516323b872dd60e01b60208201526001600160a01b0392831660248201529290911660448301526064808301939093529181526117d7916107ac6084836113f0565b565b9190826040910312610051576020825192015190565b9592919093926000935b600019840184811161135a578510156118fb576001600160a01b03611822610596878787611370565b169061183261059687898c611370565b90600187019182881161135a576000936118536105966118ac958c8f611370565b60408051639908fc8b60e01b81526001600160a01b03948516600482015291909316602482015260448101939093526000606484015230608484015260001960a4840152909391928492849291839190829060c4820190565b03925af19182156118f157906118cd92916000926118d3575b50509461134b565b936117f9565b6118e99250803d106106895761067881836113f0565b5038806118c5565b513d6000823e3d90fd5b93509590939160001981019281841161135a57610596826119459261193f6105966001600160a01b036119366105968b60009a60409f611370565b16988389611370565b95611370565b8551639908fc8b60e01b81526001600160a01b03938416600482015290831660248201526044810194909452600060648501529416608483015260001960a48301529092839160c49183915af19081156119c0576000916119a4575090565b6119bc915060403d81116106895761067881836113f0565b5090565b6040513d6000823e3d90fd5b67ffffffffffffffff81116113be5760051b60200190565b906119ee826119cc565b6119fb60405191826113f0565b8281528092611a0c601f19916119cc565b0190602036910137565b80518210156113805760209160051b010190565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8111611a545790565b606460405162461bcd60e51b815260206004820152601660248201527f76616c7565206d75737420626520706f736974697665000000000000000000006044820152fd5b604051602081019080821067ffffffffffffffff8311176113be576000938493848094938194604052525af1611acc611535565b5015611ad457565b606460405162461bcd60e51b815260206004820152601960248201527f5f736166655472616e736665724e6174697665206661696c73000000000000006044820152fdfea264697066735822122005143a2d710409b67c8050ecbfd3d7afb234386d0e310c44588ea4a9f662837264736f6c63430008120033000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Deployed Bytecode
0x60806040818152600480361015610056575b505050361561001f57600080fd5b6001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216330361005157005b600080fd5b600092833560e01c908163018ad0011461101e575080632d68efc914610fda5780633226288e14610ded5780636248fced14610c8e578063715018a614610c275780637eeb195514610a6a57806385335cc0146108d05780638d8f82e6146106e85780638da5cb5b146106c2578063b9e598c1146104cc578063d44107a414610417578063f048d48f146101da5763f2fde38b0361001157346101d65760203660031901126101d65761010761122e565b906101106112f3565b6001600160a01b0380921692831561016d5750506000548273ffffffffffffffffffffffffffffffffffffffff19821617600055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a380f35b906020608492519162461bcd60e51b8352820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152fd5b8280fd5b509190346104135760a0366003190112610413576101f661122e565b92602435610202611202565b916001600160a01b03809616867f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2169285519763e9249cc760e01b895284848a01526020988981602481875afa90811561040957918a918a9384916103dc575b5089516323b872dd60e01b8152338882019081523060208201526040810187905290948593849283906060010393165af180156103d2578992899695949260a4926103a5575b508851998a9384927f09a5fca300000000000000000000000000000000000000000000000000000000845288888501526024840152604435604484015230606484015260843560848401525af195861561039b57839661036c575b50813b156101d65785602484928388519586948593632e1a7d4d60e01b85528401525af180156103625790859291610347575b505061034191611a98565b51908152f35b819250610353906113aa565b61035f57808491610336565b80fd5b84513d84823e3d90fd5b9095508681813d8311610394575b61038481836113f0565b8101031261005157519438610303565b503d61037a565b85513d85823e3d90fd5b6103c490853d87116103cb575b6103bc81836113f0565b810190611412565b50386102a8565b503d6103b2565b87513d8a823e3d90fd5b6103fc9150833d8511610402575b6103f481836113f0565b810190611648565b38610262565b503d6103ea565b88513d8b823e3d90fd5b5080fd5b509190346104135761043f61042b36611288565b999199979097969296959395421115611667565b61044c60028410156116b2565b60001983018381116104b9576104639086146116fd565b82156104a6576020898961034161049d8b8b8b8b8b8b610498856001600160a01b0361048e84611396565b1630903390611793565b6117ef565b92831015611748565b8060328b634e487b7160e01b6024945252fd5b60248260118d634e487b7160e01b835252fd5b509190346104135760603660031901126104135767ffffffffffffffff9183358381116104135761050090369086016111d1565b909360249081359081116106be5761051b90369088016111d1565b969092849661052d60028310156116b2565b60001982018281116106ac5761054b908a9493929796959a146116fd565b60443595610558846119e4565b9986945b808610610575578951806105718e8e83611244565b0390f35b90919293949596979a99506001600160a01b0361059b61059688848b611370565b611396565b166105aa610596888787611370565b6001880180891161069a579161061e9c9d916105cb6105968e958a8a611370565b9084519e8f94859384937f4fdd64e50000000000000000000000000000000000000000000000000000000085528d85016040919493929460608201956001600160a01b0380921683521660208201520152565b03915afa801561069057889a899161065d575b5061063c878d611a16565b5261064f6106498b611a2a565b9661134b565b94939291909796959761055c565b9050610680919a50893d8b11610689575b61067881836113f0565b8101906117d9565b99909938610631565b503d61066e565b89513d8a823e3d90fd5b848b60118a634e487b7160e01b835252fd5b8487601186634e487b7160e01b835252fd5b8380fd5b5050346104135781600319360112610413576001600160a01b0360209254169051908152f35b5090346101d657806003193601126101d657813567ffffffffffffffff81116106be5761071890369084016111d1565b929091610723611218565b9061072c6112f3565b6001600160a01b0391821690865b868110610745578780f35b868685610756610596858585611370565b1685876107b6610596878951977f095ea7b300000000000000000000000000000000000000000000000000000000976107b160209a8a8c8201526024988982015260449960008b8301528a82526107ac826113d4565b61142a565b611370565b169286517fdd62ed3e000000000000000000000000000000000000000000000000000000008152308b820152888382015285818581885afa9081156108c557600091610898575b5061083257865194850152830186905260001983820152825261082d9291610828916107ac826113d4565b61134b565b61073a565b60848a7f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f856036868a8d519562461bcd60e51b87528601528401528201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152fd5b908682813d83116108be575b6108ae81836113f0565b8101031261035f575051386107fd565b503d6108a4565b88513d6000823e3d90fd5b5090346101d6576108e036611288565b9560009a9794929995919a198101818111610a5757610903610596828489611370565b906001600160a01b03988992837f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2169a8b9116036109ee579061094b61095292421115611667565b85146116fd565b81156109db579185939161097186610978979561048e6109819a611396565b30946117ef565b95861015611748565b813b156101d65784602484928387519586948593632e1a7d4d60e01b85528401525af180156109d1576109bd575b505061034182602094611a98565b6109c782916113aa565b61035f57806109af565b83513d84823e3d90fd5b602489603289634e487b7160e01b835252fd5b60848960208e519162461bcd60e51b8352820152602860248201527f746865206c61737420616464726573732073686f756c6420626520777261707060448201527f656420746f6b656e0000000000000000000000000000000000000000000000006064820152fd5b602489601189634e487b7160e01b835252fd5b5090346101d65760c03660031901126101d657610a8561122e565b91610a8e611218565b9360443593608435926001600160a01b03918285168503610051578216958286519863e9249cc760e01b8a52169283838a015260209889816024818c5afa908115610c00578691610c0a575b5087516323b872dd60e01b8152338582019081523060208201526040810185905290918b918391908290036060019082908a9087165af18015610c00579160c4918b9493610be3575b507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216948689519a8b9485937f0f91f06f000000000000000000000000000000000000000000000000000000008552888501528860248501526044840152606435606484015230608484015260a43560a48401525af195861561039b57839661036c5750813b156101d65785602484928388519586948593632e1a7d4d60e01b85528401525af18015610362579085929161034757505061034191611a98565b610bf990853d87116103cb576103bc81836113f0565b5038610b23565b88513d88823e3d90fd5b610c2191508a3d8c11610402576103f481836113f0565b38610ada565b833461035f578060031936011261035f57610c406112f3565b60006001600160a01b03815473ffffffffffffffffffffffffffffffffffffffff1981168355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b50919060a036600319011261041357610ca561122e565b604435936001600160a01b03808616809603610de95760843592831515809403610de557817f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21693843b15610de1578551630d0e30db60e41b815287818681348a5af180156103d257610dc4575b5060c4926020959492889288519a8b9788967f6281baef00000000000000000000000000000000000000000000000000000000885287015234602487015260243560448701526064860152606435608486015260a4850152165af1918215610db95791610d85575b6020925051908152f35b90506020823d8211610db1575b81610d9f602093836113f0565b81010312610051576020915190610d7b565b3d9150610d92565b9051903d90823e3d90fd5b92602095949297610dd660c4956113aa565b979294955092610d13565b8680fd5b8580fd5b8480fd5b5090346101d65760603660031901126101d65767ffffffffffffffff92823584811161041357610e2090369085016111d1565b91909460243590811161041357610e3a90369086016111d1565b91948591610e4b60028610156116b2565b60001994808601818111610fc757610e6b9086959493929a9796146116fd565b610e76604435611a2a565b95610e80856119e4565b998591825b610e97578951806105718e8e83611244565b9091929394959680989a508301838111610f835789610eb7828a88611370565b610ec090611396565b6001600160a01b0316610ed4838686611370565b610edd90611396565b90610ee9878787611370565b610ef290611396565b83517ffca8f3080000000000000000000000000000000000000000000000000000000081526001600160a01b039384168b8201908152939091166020840152604083019e909e528d918290819060600103915afa908115610fbd57879b8892610f96575b50610f61908d611a16565b52610f6b8a611a2a565b928015610f8357880191908298979695949398610e85565b602487601188634e487b7160e01b835252fd5b610f619c50610fb39192508b3d8d116106895761067881836113f0565b9b909b9190610f56565b8a513d89823e3d90fd5b602485601186634e487b7160e01b835252fd5b505034610413578160031936011261041357602090516001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2168152f35b83858460a03660031901126104135767ffffffffffffffff9181358381116104135761104d90369084016111d1565b90936024359081116101d65761106690369085016111d1565b939092611071611202565b9783156111be5761108187611396565b906001600160a01b0391827f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216928391160361115757506110c6426084351015611667565b6000198401848111611144576110dd9087146116fd565b803b15610413578190885193848092630d0e30db60e41b825234905af190811561113957509161111b959391602098959361112a575b5034936117ef565b90610341604435831015611748565b611133906113aa565b88611113565b8751903d90823e3d90fd5b602483601186634e487b7160e01b835252fd5b8060208562461bcd60e51b60849452820152602960248201527f74686520666972737420616464726573732073686f756c64206265207772617060448201527f70656420746f6b656e00000000000000000000000000000000000000000000006064820152fd5b506032602492634e487b7160e01b835252fd5b9181601f840112156100515782359167ffffffffffffffff8311610051576020808501948460051b01011161005157565b606435906001600160a01b038216820361005157565b602435906001600160a01b038216820361005157565b600435906001600160a01b038216820361005157565b9060609160408101918152602092816040858094015285518094520193019160005b828110611274575050505090565b835185529381019392810192600101611266565b60c06003198201126100515767ffffffffffffffff9160043583811161005157826112b5916004016111d1565b93909392602435918211610051576112cf916004016111d1565b909160443590606435906084356001600160a01b0381168103610051579060a43590565b6001600160a01b0360005416330361130757565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b600019811461135a5760010190565b634e487b7160e01b600052601160045260246000fd5b91908110156113805760051b0190565b634e487b7160e01b600052603260045260246000fd5b356001600160a01b03811681036100515790565b67ffffffffffffffff81116113be57604052565b634e487b7160e01b600052604160045260246000fd5b6080810190811067ffffffffffffffff8211176113be57604052565b90601f8019910116810190811067ffffffffffffffff8211176113be57604052565b90816020910312610051575180151581036100515790565b6001600160a01b0316604051604081019181831067ffffffffffffffff8411176113be5761149a926040526000806020958685527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656487860152868151910182855af1611494611535565b91611575565b80519082821592831561151d575b505050156114b35750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b61152d9350820181019101611412565b3882816114a8565b3d15611570573d9067ffffffffffffffff82116113be5760405191611564601f8201601f1916602001846113f0565b82523d6000602084013e565b606090565b919290156115d65750815115611589575090565b3b156115925790565b606460405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b8251909150156115e95750805190602001fd5b6040519062461bcd60e51b82528160208060048301528251908160248401526000935b82851061162f575050604492506000838284010152601f80199101168101030190fd5b848101820151868601604401529381019385935061160c565b9081602091031261005157516001600160a01b03811681036100515790565b1561166e57565b606460405162461bcd60e51b815260206004820152600760248201527f65787069726564000000000000000000000000000000000000000000000000006044820152fd5b156116b957565b606460405162461bcd60e51b815260206004820152601260248201527f696e76616c696420746f6b656e207061746800000000000000000000000000006044820152fd5b1561170457565b606460405162461bcd60e51b815260206004820152601160248201527f696e76616c696420706f6f6c20706174680000000000000000000000000000006044820152fd5b1561174f57565b606460405162461bcd60e51b815260206004820152601160248201527f616d6f756e744f757420746f6f206c6f770000000000000000000000000000006044820152fd5b6040516323b872dd60e01b60208201526001600160a01b0392831660248201529290911660448301526064808301939093529181526117d7916107ac6084836113f0565b565b9190826040910312610051576020825192015190565b9592919093926000935b600019840184811161135a578510156118fb576001600160a01b03611822610596878787611370565b169061183261059687898c611370565b90600187019182881161135a576000936118536105966118ac958c8f611370565b60408051639908fc8b60e01b81526001600160a01b03948516600482015291909316602482015260448101939093526000606484015230608484015260001960a4840152909391928492849291839190829060c4820190565b03925af19182156118f157906118cd92916000926118d3575b50509461134b565b936117f9565b6118e99250803d106106895761067881836113f0565b5038806118c5565b513d6000823e3d90fd5b93509590939160001981019281841161135a57610596826119459261193f6105966001600160a01b036119366105968b60009a60409f611370565b16988389611370565b95611370565b8551639908fc8b60e01b81526001600160a01b03938416600482015290831660248201526044810194909452600060648501529416608483015260001960a48301529092839160c49183915af19081156119c0576000916119a4575090565b6119bc915060403d81116106895761067881836113f0565b5090565b6040513d6000823e3d90fd5b67ffffffffffffffff81116113be5760051b60200190565b906119ee826119cc565b6119fb60405191826113f0565b8281528092611a0c601f19916119cc565b0190602036910137565b80518210156113805760209160051b010190565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8111611a545790565b606460405162461bcd60e51b815260206004820152601660248201527f76616c7565206d75737420626520706f736974697665000000000000000000006044820152fd5b604051602081019080821067ffffffffffffffff8311176113be576000938493848094938194604052525af1611acc611535565b5015611ad457565b606460405162461bcd60e51b815260206004820152601960248201527f5f736166655472616e736665724e6174697665206661696c73000000000000006044820152fdfea264697066735822122005143a2d710409b67c8050ecbfd3d7afb234386d0e310c44588ea4a9f662837264736f6c63430008120033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
-----Decoded View---------------
Arg [0] : _wNative (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ 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.