ETH Price: $2,798.12 (+1.06%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
0x60c06040232310972025-08-27 7:54:4788 days ago1756281287IN
 Create: EkuboAdapter
0 ETH0.000835470.3994083
VIEW ADVANCED FILTER
Age:180D
Reset Filter

Showing the last 25 internal transactions (View Advanced Filter)

Advanced mode:
Parent Transaction Hash Method Block
From
To
Deposit238648952025-11-23 23:35:472 mins ago1763940947
0x5E18E052...DED3f10F2
0.00654494 ETH
Transfer238648952025-11-23 23:35:472 mins ago1763940947
0x5E18E052...DED3f10F2
0.00654494 ETH
Deposit238648712025-11-23 23:30:597 mins ago1763940659
0x5E18E052...DED3f10F2
0.08464322 ETH
Transfer238648712025-11-23 23:30:597 mins ago1763940659
0x5E18E052...DED3f10F2
0.08464322 ETH
Transfer238648632025-11-23 23:29:239 mins ago1763940563
0x5E18E052...DED3f10F2
0.00625866 ETH
Transfer238648632025-11-23 23:29:239 mins ago1763940563
0x5E18E052...DED3f10F2
0.00625866 ETH
Transfer238648632025-11-23 23:29:239 mins ago1763940563
0x5E18E052...DED3f10F2
0.00070722 ETH
Transfer238648632025-11-23 23:29:239 mins ago1763940563
0x5E18E052...DED3f10F2
0.00070722 ETH
Deposit238648632025-11-23 23:29:239 mins ago1763940563
0x5E18E052...DED3f10F2
0.00070722 ETH
Transfer238648632025-11-23 23:29:239 mins ago1763940563
0x5E18E052...DED3f10F2
0.00070722 ETH
Transfer238648322025-11-23 23:22:5915 mins ago1763940179
0x5E18E052...DED3f10F2
0.162 ETH
Transfer238648322025-11-23 23:22:5915 mins ago1763940179
0x5E18E052...DED3f10F2
0.162 ETH
Transfer238648132025-11-23 23:19:1119 mins ago1763939951
0x5E18E052...DED3f10F2
0.1242 ETH
Transfer238648132025-11-23 23:19:1119 mins ago1763939951
0x5E18E052...DED3f10F2
0.1242 ETH
Transfer238648042025-11-23 23:17:2321 mins ago1763939843
0x5E18E052...DED3f10F2
0.27758001 ETH
Transfer238648042025-11-23 23:17:2321 mins ago1763939843
0x5E18E052...DED3f10F2
0.27758001 ETH
Transfer238647582025-11-23 23:08:1130 mins ago1763939291
0x5E18E052...DED3f10F2
1.03411341 ETH
Transfer238647582025-11-23 23:08:1130 mins ago1763939291
0x5E18E052...DED3f10F2
1.03411341 ETH
Deposit238647582025-11-23 23:08:1130 mins ago1763939291
0x5E18E052...DED3f10F2
0.29609562 ETH
Transfer238647582025-11-23 23:08:1130 mins ago1763939291
0x5E18E052...DED3f10F2
0.29609562 ETH
Transfer238647462025-11-23 23:05:3532 mins ago1763939135
0x5E18E052...DED3f10F2
0.40800236 ETH
Transfer238647462025-11-23 23:05:3532 mins ago1763939135
0x5E18E052...DED3f10F2
0.40800236 ETH
Deposit238646412025-11-23 22:44:1154 mins ago1763937851
0x5E18E052...DED3f10F2
0.26906014 ETH
Transfer238646412025-11-23 22:44:1154 mins ago1763937851
0x5E18E052...DED3f10F2
0.26906014 ETH
Transfer238646382025-11-23 22:43:3554 mins ago1763937815
0x5E18E052...DED3f10F2
0.5 ETH
VIEW ADVANCED FILTER
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
EkuboAdapter

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
london EvmVersion
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
pragma abicoder v2;

import "../interfaces/IAdapter.sol";
import "../interfaces/IEkubo.sol";
import "../interfaces/IERC20.sol";
import "../libraries/SafeERC20.sol";
import "../interfaces/IWETH.sol";

using PoolKeyLibrary for PoolKey;

contract EkuboAdapter is IAdapter {
    address public immutable WETH;
    address public immutable EKUBO_CORE;

    address internal constant ETH = address(0);
    uint96 constant MIN_SQRT_RATIO_RAW = 4611797791050542631 + 1;
    uint96 constant MAX_SQRT_RATIO_RAW = 79227682466138141934206691491 - 1;
    uint256 internal constant ORIGIN_PAYER =
        0x3ca20afc2ccc0000000000000000000000000000000000000000000000000000;
    uint256 constant ADDRESS_MASK = 0x000000000000000000000000ffffffffffffffffffffffffffffffffffffffff;

    struct SwapParams {
        address to;
        PoolKey poolKey;
        int128 amount;
        bool isToken1;
        uint96 sqrtRatioLimit;
        uint256 skipAhead;
        uint128 _token0Debts;
        uint128 _token1Debts;
    }

    SwapParams private _swapParams;

    constructor(address payable weth, address ekuboCore) {
        WETH = weth;
        EKUBO_CORE = ekuboCore;
    }

    function _ekuboSwap(
        address to,
        address,
        bytes memory moreInfo,
        uint256 payerOrigin
    ) private {
        (PoolKey memory poolKey, bool isToken1) = abi.decode(
            moreInfo,
            (PoolKey, bool)
        );

        address fromToken = isToken1 ? poolKey.token1 : poolKey.token0;

        uint256 inputBalance;
        if (fromToken == ETH) {
            inputBalance = IERC20(WETH).balanceOf(address(this));
        } else {
            inputBalance = IERC20(fromToken).balanceOf(address(this));
        }

        require(inputBalance > 0, "No tokens to swap");
        int128 swapAmount = int128(uint128(inputBalance));

        uint96 sqrtRatioLimit = isPriceIncreasing(swapAmount, isToken1)
            ? MAX_SQRT_RATIO_RAW
            : MIN_SQRT_RATIO_RAW;

        _swapParams = SwapParams({
            to: to,
            poolKey: poolKey,
            amount: swapAmount,
            isToken1: isToken1,
            sqrtRatioLimit: sqrtRatioLimit,
            skipAhead: 0,
            _token0Debts: 0,
            _token1Debts: 0
        });

        // lock() -> locked() callback
        IEkuboCore(EKUBO_CORE).lock();

        delete _swapParams;

        // Return back excess fromTokens
        address _payerOrigin;
        if ((payerOrigin & ORIGIN_PAYER) == ORIGIN_PAYER) {
            _payerOrigin = address(uint160(uint256(payerOrigin) & ADDRESS_MASK));
        }
        if (_payerOrigin != address(0)) {
            if (fromToken == ETH && address(this).balance > 0) {
                (bool success, ) = _payerOrigin.call{
                    value: address(this).balance
                }("");
                require(success, "Transfer to payerOrigin failed");
            } else if (fromToken != ETH) {
                uint256 leftBalance = IERC20(fromToken).balanceOf(
                    address(this)
                );
                if (leftBalance > 0) {
                    SafeERC20.safeTransfer(IERC20(fromToken), _payerOrigin, leftBalance);
                }
            }
        }
    }

    function locked(uint256 id) external returns (bytes memory) {
        require(msg.sender == EKUBO_CORE, "Only Ekubo Core can call");

        SwapParams memory params = _swapParams;

        (int128 delta0, int128 delta1) = IEkuboCore(EKUBO_CORE).swap_611415377(
            params.poolKey,
            params.amount,
            params.isToken1,
            params.sqrtRatioLimit,
            params.skipAhead
        );

        address fromToken = params.isToken1
            ? params.poolKey.token1
            : params.poolKey.token0;
        // Handle debt
        // if either token is ETH, it must be token0, as tokens are sorted when pool initializing
        if (delta0 > 0) {
            if (fromToken == ETH) {
                // Withdraw all WETH to ETH, but only transfer the exact debt amount
                uint256 wethBalance = IERC20(WETH).balanceOf(address(this));
                IWETH(WETH).withdraw(wethBalance);
                
                // Only send the exact debt amount, not the full balance
                uint256 debtAmount = uint128(delta0);
                (bool success, ) = EKUBO_CORE.call{value: debtAmount}("");
                require(success, "Transfer ETH debt to Ekubo Core failed");
                
                // Remaining ETH will be refunded to user in the refund logic
            } else {
                // Only record debt for ERC20 tokens that will trigger payCallback
                _swapParams._token0Debts = uint128(delta0);
                IEkuboCore(EKUBO_CORE).pay(params.poolKey.token0);
            }
        }
        if (delta1 > 0) {
            _swapParams._token1Debts = uint128(delta1);
            IEkuboCore(EKUBO_CORE).pay(params.poolKey.token1);
        }

        // Withdraw to tokens
        address outputToken = params.isToken1
            ? params.poolKey.token0
            : params.poolKey.token1;
        uint128 outputAmount = uint128(params.isToken1 ? -delta0 : -delta1);

        if (outputAmount > 0) {
            if (outputToken == ETH) {
                IEkuboCore(EKUBO_CORE).withdraw(
                    outputToken,
                    address(this),
                    outputAmount
                );
                IWETH(WETH).deposit{value: outputAmount}();
                SafeERC20.safeTransfer(IERC20(WETH), params.to, outputAmount);
            } else {
                IEkuboCore(EKUBO_CORE).withdraw(
                    outputToken,
                    params.to,
                    outputAmount
                );
            }
        }

        return "";
    }

    /// @notice Pay callback - Triggered by Core pay()
    function payCallback(uint256 /* id */, address token) external {
        require(msg.sender == EKUBO_CORE, "Only Ekubo Core can call");

        // Determine which debt to pay based on token address
        uint256 debtAmount;
        if (token == _swapParams.poolKey.token0) {
            debtAmount = _swapParams._token0Debts;
            _swapParams._token0Debts = 0; // Clear the debt
        } else if (token == _swapParams.poolKey.token1) {
            debtAmount = _swapParams._token1Debts;
            _swapParams._token1Debts = 0; // Clear the debt
        } else {
            revert("Unknown token for debt payment");
        }
        
        require(debtAmount > 0, "No debt recorded for this token");
        
        uint256 balance = IERC20(token).balanceOf(address(this));
        require(balance >= debtAmount, "Insufficient balance to pay debt");
        
        // Transfer only the exact debt amount
        SafeERC20.safeTransfer(IERC20(token), EKUBO_CORE, debtAmount);
    }

    function sellBase(
        address to,
        address pool,
        bytes memory moreInfo
    ) external override {
        uint256 payerOrigin;
        assembly {
            let size := calldatasize()
            payerOrigin := calldataload(sub(size, 32))
        }
        _ekuboSwap(to, pool, moreInfo, payerOrigin);
    }

    function sellQuote(
        address to,
        address pool,
        bytes memory moreInfo
    ) external override {
        uint256 payerOrigin;
        assembly {
            let size := calldatasize()
            payerOrigin := calldataload(sub(size, 32))
        }
        _ekuboSwap(to, pool, moreInfo, payerOrigin);
    }

    function isPriceIncreasing(
        int128 amount,
        bool isToken1
    ) private pure returns (bool increasing) {
        assembly ("memory-safe") {
            increasing := xor(isToken1, slt(amount, 0))
        }
    }

    receive() external payable {}
}

/// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
pragma abicoder v2;

interface IAdapter {
    function sellBase(
        address to,
        address pool,
        bytes memory data
    ) external;

    function sellQuote(
        address to,
        address pool,
        bytes memory data
    ) external;
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

// Ekubo Config type - address (20 bytes) | fee (8 bytes) | tickSpacing (4 bytes)
type Config is bytes32;

// Ekubo PoolKey structure
struct PoolKey {
    address token0;
    address token1;
    Config config;
}

// PoolKey helper functions
library PoolKeyLibrary {
    function tickSpacing(PoolKey memory pk) internal pure returns (uint32 r) {
        assembly ("memory-safe") {
            r := and(mload(add(64, pk)), 0xffffffff)
        }
    }

    function fee(PoolKey memory pk) internal pure returns (uint64 r) {
        assembly ("memory-safe") {
            r := and(mload(add(60, pk)), 0xffffffffffffffff)
        }
    }

    function extension(PoolKey memory pk) internal pure returns (address r) {
        assembly ("memory-safe") {
            r := and(mload(add(52, pk)), 0xffffffffffffffffffffffffffffffffffffffff)
        }
    }

    // Construct Config
    function toConfig(uint64 _fee, uint32 _tickSpacing, address _extension) internal pure returns (Config c) {
        assembly ("memory-safe") {
            c := add(add(shl(96, _extension), shl(32, _fee)), _tickSpacing)
        }
    }

    // Calculate poolId
    function toPoolId(PoolKey memory key) internal pure returns (bytes32 result) {
        assembly ("memory-safe") {
            // Perform keccak256 hash on the entire PoolKey structure
            result := keccak256(key, 96)  // 20 + 20 + 32 = 72 bytes, but official code uses 96
        }
    }
}

// Ekubo Core interface
interface IEkuboCore {
    function lock() external;
    
    function swap_611415377(
        PoolKey memory poolKey,
        int128 amount,
        bool isToken1,
        uint96 sqrtRatioLimit,
        uint256 skipAhead
    ) external payable returns (int128 delta0, int128 delta1);
    
    function clear(address token) external returns (uint256 paid);
    
    function withdraw(address token, address to, uint128 amount) external;
    
    function pay(address token) external returns (uint128 payment);
    
    // Get pool state
    function poolState(bytes32 poolId) external view returns (
        uint160 sqrtRatio,
        int24 tick,
        uint128 liquidity
    );
}

// Ekubo Locker callback interface
interface IEkuboLocker {
    function locked(uint256 id) external returns (bytes memory);
    
    function payCallback(uint256 id, address token) external;
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface IERC20 {
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
    event Transfer(address indexed from, address indexed to, uint256 value);

    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function decimals() external view returns (uint8);

    function totalSupply() external view returns (uint256);

    function balanceOf(address owner) external view returns (uint256);

    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);

    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool);
}

/// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./SafeMath.sol";
import "./Address.sol";
import "./RevertReasonForwarder.sol";
import "../interfaces/IERC20.sol";
import "../interfaces/IERC20Permit.sol";
import "../interfaces/IDaiLikePermit.sol";

// File @1inch/solidity-utils/contracts/libraries/[email protected]

library SafeERC20 {
    error SafeTransferFailed();
    error SafeTransferFromFailed();
    error ForceApproveFailed();
    error SafeIncreaseAllowanceFailed();
    error SafeDecreaseAllowanceFailed();
    error SafePermitBadLength();

    // Ensures method do not revert or return boolean `true`, admits call to non-smart-contract
    function safeTransferFrom(IERC20 token, address from, address to, uint256 amount) internal {
        bytes4 selector = token.transferFrom.selector;
        bool success;
        /// @solidity memory-safe-assembly
        assembly { // solhint-disable-line no-inline-assembly
            let data := mload(0x40)

            mstore(data, selector)
            mstore(add(data, 0x04), from)
            mstore(add(data, 0x24), to)
            mstore(add(data, 0x44), amount)
            success := call(gas(), token, 0, data, 100, 0x0, 0x20)
            if success {
                switch returndatasize()
                case 0 { success := gt(extcodesize(token), 0) }
                default { success := and(gt(returndatasize(), 31), eq(mload(0), 1)) }
            }
        }
        if (!success) revert SafeTransferFromFailed();
    }

    // Ensures method do not revert or return boolean `true`, admits call to non-smart-contract
    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        if (!_makeCall(token, token.transfer.selector, to, value)) {
            revert SafeTransferFailed();
        }
    }

    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        forceApprove(token, spender, value);
    }

    // If `approve(from, to, amount)` fails, try to `approve(from, to, 0)` before retry
    function forceApprove(IERC20 token, address spender, uint256 value) internal {
        if (!_makeCall(token, token.approve.selector, spender, value)) {
            if (!_makeCall(token, token.approve.selector, spender, 0) ||
                !_makeCall(token, token.approve.selector, spender, value))
            {
                revert ForceApproveFailed();
            }
        }
    }

    

    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 allowance = token.allowance(address(this), spender);
        if (value > type(uint256).max - allowance) revert SafeIncreaseAllowanceFailed();
        forceApprove(token, spender, allowance + value);
    }

    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 allowance = token.allowance(address(this), spender);
        if (value > allowance) revert SafeDecreaseAllowanceFailed();
        forceApprove(token, spender, allowance - value);
    }

    function safePermit(IERC20 token, bytes calldata permit) internal {
        bool success;
        if (permit.length == 32 * 7) {
            success = _makeCalldataCall(token, IERC20Permit.permit.selector, permit);
        } else if (permit.length == 32 * 8) {
            success = _makeCalldataCall(token, IDaiLikePermit.permit.selector, permit);
        } else {
            revert SafePermitBadLength();
        }
        if (!success) RevertReasonForwarder.reRevert();
    }

    function _makeCall(IERC20 token, bytes4 selector, address to, uint256 amount) private returns(bool success) {
        /// @solidity memory-safe-assembly
        assembly { // solhint-disable-line no-inline-assembly
            let data := mload(0x40)

            mstore(data, selector)
            mstore(add(data, 0x04), to)
            mstore(add(data, 0x24), amount)
            success := call(gas(), token, 0, data, 0x44, 0x0, 0x20)
            if success {
                switch returndatasize()
                case 0 { success := gt(extcodesize(token), 0) }
                default { success := and(gt(returndatasize(), 31), eq(mload(0), 1)) }
            }
        }
    }

    function _makeCalldataCall(IERC20 token, bytes4 selector, bytes calldata args) private returns(bool success) {
        /// @solidity memory-safe-assembly
        assembly { // solhint-disable-line no-inline-assembly
            let len := add(4, args.length)
            let data := mload(0x40)

            mstore(data, selector)
            calldatacopy(add(data, 0x04), args.offset, args.length)
            success := call(gas(), token, 0, data, len, 0x0, 0x20)
            if success {
                switch returndatasize()
                case 0 { success := gt(extcodesize(token), 0) }
                default { success := and(gt(returndatasize(), 31), eq(mload(0), 1)) }
            }
        }
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
pragma abicoder v2;

interface IWETH {
    function totalSupply() external view returns (uint256);

    function balanceOf(address account) external view returns (uint256);

    function transfer(address recipient, uint256 amount)
        external
        returns (bool);

    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    function approve(address spender, uint256 amount) external returns (bool);

    function transferFrom(
        address src,
        address dst,
        uint256 wad
    ) external returns (bool);

    function deposit() external payable;

    function withdraw(uint256 wad) external;
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

library SafeMath {
    uint256 constant WAD = 10**18;
    uint256 constant RAY = 10**27;

    function wad() public pure returns (uint256) {
        return WAD;
    }

    function ray() public pure returns (uint256) {
        return RAY;
    }

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }

    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a <= b ? a : b;
    }

    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a >= b ? a : b;
    }

    function sqrt(uint256 a) internal pure returns (uint256 b) {
        if (a > 3) {
            b = a;
            uint256 x = a / 2 + 1;
            while (x < b) {
                b = x;
                x = (a / x + x) / 2;
            }
        } else if (a != 0) {
            b = 1;
        }
    }

    function wmul(uint256 a, uint256 b) internal pure returns (uint256) {
        return mul(a, b) / WAD;
    }

    function wmulRound(uint256 a, uint256 b) internal pure returns (uint256) {
        return add(mul(a, b), WAD / 2) / WAD;
    }

    function rmul(uint256 a, uint256 b) internal pure returns (uint256) {
        return mul(a, b) / RAY;
    }

    function rmulRound(uint256 a, uint256 b) internal pure returns (uint256) {
        return add(mul(a, b), RAY / 2) / RAY;
    }

    function wdiv(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(mul(a, WAD), b);
    }

    function wdivRound(uint256 a, uint256 b) internal pure returns (uint256) {
        return add(mul(a, WAD), b / 2) / b;
    }

    function rdiv(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(mul(a, RAY), b);
    }

    function rdivRound(uint256 a, uint256 b) internal pure returns (uint256) {
        return add(mul(a, RAY), b / 2) / b;
    }

    function wpow(uint256 x, uint256 n) internal pure returns (uint256) {
        uint256 result = WAD;
        while (n > 0) {
            if (n % 2 != 0) {
                result = wmul(result, x);
            }
            x = wmul(x, x);
            n /= 2;
        }
        return result;
    }

    function rpow(uint256 x, uint256 n) internal pure returns (uint256) {
        uint256 result = RAY;
        while (n > 0) {
            if (n % 2 != 0) {
                result = rmul(result, x);
            }
            x = rmul(x, x);
            n /= 2;
        }
        return result;
    }

    function divCeil(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 quotient = div(a, b);
        uint256 remainder = a - quotient * b;
        if (remainder > 0) {
            return quotient + 1;
        } else {
            return quotient;
        }
    }
}

/// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

/**
 * @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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            codehash := extcodehash(account)
        }
        return (codehash != accountHash && codehash != 0x0);
    }

    /**
     * @dev Converts an `address` into `address payable`. Note that this is
     * simply a type cast: the actual underlying value is not changed.
     *
     * _Available since v2.4.0._
     */
    function toPayable(address account)
        internal
        pure
        returns (address payable)
    {
        return payable(account);
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     *
     * _Available since v2.4.0._
     */
    function sendValue(address recipient, uint256 amount) internal {
        require(
            address(this).balance >= amount,
            "Address: insufficient balance"
        );

        // solhint-disable-next-line avoid-call-value
        (bool success, ) = recipient.call{value: amount}("");
        require(
            success,
            "Address: unable to send value, recipient may have reverted"
        );
    }
}

File 9 of 11 : RevertReasonForwarder.sol
/// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

library RevertReasonForwarder {
    function reRevert() internal pure {
        // bubble up revert reason from latest external call
        /// @solidity memory-safe-assembly
        assembly { // solhint-disable-line no-inline-assembly
            let ptr := mload(0x40)
            returndatacopy(ptr, 0, returndatasize())
            revert(ptr, returndatasize())
        }
    }
}

// SPDX-License-Identifier: MIT
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);
}

File 11 of 11 : IDaiLikePermit.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

/// @title Interface for DAI-style permits
interface IDaiLikePermit {
    function permit(
        address holder,
        address spender,
        uint256 nonce,
        uint256 expiry,
        bool allowed,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;
}

Settings
{
  "remappings": [
    "@ensdomains/=node_modules/@ensdomains/",
    "@openzeppelin/=node_modules/@openzeppelin/",
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "eth-gas-reporter/=node_modules/eth-gas-reporter/",
    "forge-std/=lib/forge-std/src/",
    "hardhat/=node_modules/hardhat/",
    "@dex/=contracts/8/",
    "@uniswap/=node_modules/@uniswap/",
    "@zetachain/=node_modules/@zetachain/"
  ],
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs"
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "london",
  "viaIR": false
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address payable","name":"weth","type":"address"},{"internalType":"address","name":"ekuboCore","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"SafeTransferFailed","type":"error"},{"inputs":[],"name":"EKUBO_CORE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"locked","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"token","type":"address"}],"name":"payCallback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"pool","type":"address"},{"internalType":"bytes","name":"moreInfo","type":"bytes"}],"name":"sellBase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"pool","type":"address"},{"internalType":"bytes","name":"moreInfo","type":"bytes"}],"name":"sellQuote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040523480156200001157600080fd5b506040516200271738038062002717833981810160405281019062000037919062000156565b8173ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508073ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff168152505050506200019d565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620000d982620000ac565b9050919050565b620000eb81620000cc565b8114620000f757600080fd5b50565b6000815190506200010b81620000e0565b92915050565b60006200011e82620000ac565b9050919050565b620001308162000111565b81146200013c57600080fd5b50565b600081519050620001508162000125565b92915050565b6000806040838503121562000170576200016f620000a7565b5b60006200018085828601620000fa565b925050602062000193858286016200013f565b9150509250929050565b60805160a0516124eb6200022c6000396000818161019201528181610509015281816105790152818161084f01528181610aae01528181610bbc01528181610cab01528181610dec01528181610f540152818161100601526114c00152600081816105530152818161096e01528181610a0a01528181610e7b01528181610f11015261109301526124eb6000f3fe6080604052600436106100595760003560e01c806330e6ae3114610065578063599d07141461008e5780636f7929f2146100b7578063ad5c4648146100e0578063b45a3c0e1461010b578063bb6a797b1461014857610060565b3661006057005b600080fd5b34801561007157600080fd5b5061008c60048036038101906100879190611b1a565b610173565b005b34801561009a57600080fd5b506100b560048036038101906100b09190611bbf565b610190565b005b3480156100c357600080fd5b506100de60048036038101906100d99190611b1a565b610534565b005b3480156100ec57600080fd5b506100f5610551565b6040516101029190611c0e565b60405180910390f35b34801561011757600080fd5b50610132600480360381019061012d9190611c29565b610575565b60405161013f9190611cd5565b60405180910390f35b34801561015457600080fd5b5061015d611004565b60405161016a9190611c0e565b60405180910390f35b600036602081033591505061018a84848484611028565b50505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461021e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161021590611d54565b60405180910390fd5b60008060010160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036102f157600060060160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16905060008060060160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506103ff565b600060010160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036103c357600060060160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16905060008060060160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506103fe565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103f590611dc0565b60405180910390fd5b5b60008111610442576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161043990611e2c565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161047d9190611c0e565b602060405180830381865afa15801561049a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104be9190611e61565b905081811015610503576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104fa90611eda565b60405180910390fd5b61052e837f0000000000000000000000000000000000000000000000000000000000000000846118af565b50505050565b600036602081033591505061054b84848484611028565b50505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60607f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610605576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105fc90611d54565b60405180910390fd5b600080604051806101000160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182016040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201548152505081526020016004820160009054906101000a9004600f0b600f0b600f0b81526020016004820160109054906101000a900460ff161515151581526020016004820160119054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152602001600582015481526020016006820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016006820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16600084602001518560400151866060015187608001518860a001516040518663ffffffff1660e01b81526004016108bf959493929190611fe3565b60408051808303816000875af11580156108dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109019190612062565b915091506000836060015161091e57836020015160000151610928565b8360200151602001515b9050600083600f0b1315610c6157600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b7e5760007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016109c59190611c0e565b602060405180830381865afa1580156109e2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a069190611e61565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b8152600401610a6191906120a2565b600060405180830381600087803b158015610a7b57600080fd5b505af1158015610a8f573d6000803e3d6000fd5b505050506000846fffffffffffffffffffffffffffffffff16905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1682604051610af0906120ee565b60006040518083038185875af1925050503d8060008114610b2d576040519150601f19603f3d011682016040523d82523d6000602084013e610b32565b606091505b5050905080610b76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6d90612175565b60405180910390fd5b505050610c60565b82600060060160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16630c11dedd8560200151600001516040518263ffffffff1660e01b8152600401610c1b9190611c0e565b6020604051808303816000875af1158015610c3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c5e91906121dd565b505b5b600082600f0b1315610d4f5781600060060160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16630c11dedd8560200151602001516040518263ffffffff1660e01b8152600401610d0a9190611c0e565b6020604051808303816000875af1158015610d29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4d91906121dd565b505b60008460600151610d6857846020015160200151610d72565b8460200151600001515b905060008560600151610d8e5783610d8990612239565b610d99565b84610d9890612239565b5b90506000816fffffffffffffffffffffffffffffffff161115610fe757600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f52577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166303a65ab68330846040518463ffffffff1660e01b8152600401610e4793929190612290565b600060405180830381600087803b158015610e6157600080fd5b505af1158015610e75573d6000803e3d6000fd5b505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826fffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016000604051808303818588803b158015610ef357600080fd5b505af1158015610f07573d6000803e3d6000fd5b5050505050610f4d7f00000000000000000000000000000000000000000000000000000000000000008760000151836fffffffffffffffffffffffffffffffff166118af565b610fe6565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166303a65ab6838860000151846040518463ffffffff1660e01b8152600401610fb393929190612290565b600060405180830381600087803b158015610fcd57600080fd5b505af1158015610fe1573d6000803e3d6000fd5b505050505b5b604051806020016040528060008152509650505050505050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000808380602001905181019061103f919061239d565b9150915060008161105457826000015161105a565b82602001515b905060008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611132577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016110ea9190611c0e565b602060405180830381865afa158015611107573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112b9190611e61565b90506111af565b8173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161116b9190611c0e565b602060405180830381865afa158015611188573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ac9190611e61565b90505b600081116111f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e990612429565b60405180910390fd5b6000819050600061120382866118fd565b6112155767400065a8177fae28611223565b6bffff9a5889f795069a41a8a25b90506040518061010001604052808b73ffffffffffffffffffffffffffffffffffffffff16815260200187815260200183600f0b81526020018615158152602001826bffffffffffffffffffffffff1681526020016000815260200160006fffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff168152506000808201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020155505060408201518160040160006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555060608201518160040160106101000a81548160ff02191690831515021790555060808201518160040160116101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff16021790555060a0820151816005015560c08201518160060160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060e08201518160060160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055509050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f83d08ba6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561152657600080fd5b505af115801561153a573d6000803e3d6000fd5b505050506000806000820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560018201600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600282016000905550506004820160006101000a8154906fffffffffffffffffffffffffffffffff02191690556004820160106101000a81549060ff02191690556004820160116101000a8154906bffffffffffffffffffffffff021916905560058201600090556006820160006101000a8154906fffffffffffffffffffffffffffffffff02191690556006820160106101000a8154906fffffffffffffffffffffffffffffffff0219169055505060007f3ca20afc2ccc0000000000000000000000000000000000000000000000000000808916036116b05773ffffffffffffffffffffffffffffffffffffffff881690505b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146118a257600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480156117205750600047115b156117d75760008173ffffffffffffffffffffffffffffffffffffffff164760405161174b906120ee565b60006040518083038185875af1925050503d8060008114611788576040519150601f19603f3d011682016040523d82523d6000602084013e61178d565b606091505b50509050806117d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c890612495565b60405180910390fd5b506118a1565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146118a05760008573ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016118469190611c0e565b602060405180830381865afa158015611863573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118879190611e61565b9050600081111561189e5761189d8683836118af565b5b505b5b5b5050505050505050505050565b6118c28363a9059cbb60e01b848461190c565b6118f8576040517ffb7f507900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b60008083128218905092915050565b60006040518481528360048201528260248201526020600060448360008a5af191508115611959573d6000811461194f57600160005114601f3d11169250611957565b6000873b1192505b505b50949350505050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006119a182611976565b9050919050565b6119b181611996565b81146119bc57600080fd5b50565b6000813590506119ce816119a8565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611a27826119de565b810181811067ffffffffffffffff82111715611a4657611a456119ef565b5b80604052505050565b6000611a59611962565b9050611a658282611a1e565b919050565b600067ffffffffffffffff821115611a8557611a846119ef565b5b611a8e826119de565b9050602081019050919050565b82818337600083830152505050565b6000611abd611ab884611a6a565b611a4f565b905082815260208101848484011115611ad957611ad86119d9565b5b611ae4848285611a9b565b509392505050565b600082601f830112611b0157611b006119d4565b5b8135611b11848260208601611aaa565b91505092915050565b600080600060608486031215611b3357611b3261196c565b5b6000611b41868287016119bf565b9350506020611b52868287016119bf565b925050604084013567ffffffffffffffff811115611b7357611b72611971565b5b611b7f86828701611aec565b9150509250925092565b6000819050919050565b611b9c81611b89565b8114611ba757600080fd5b50565b600081359050611bb981611b93565b92915050565b60008060408385031215611bd657611bd561196c565b5b6000611be485828601611baa565b9250506020611bf5858286016119bf565b9150509250929050565b611c0881611996565b82525050565b6000602082019050611c236000830184611bff565b92915050565b600060208284031215611c3f57611c3e61196c565b5b6000611c4d84828501611baa565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611c90578082015181840152602081019050611c75565b60008484015250505050565b6000611ca782611c56565b611cb18185611c61565b9350611cc1818560208601611c72565b611cca816119de565b840191505092915050565b60006020820190508181036000830152611cef8184611c9c565b905092915050565b600082825260208201905092915050565b7f4f6e6c7920456b75626f20436f72652063616e2063616c6c0000000000000000600082015250565b6000611d3e601883611cf7565b9150611d4982611d08565b602082019050919050565b60006020820190508181036000830152611d6d81611d31565b9050919050565b7f556e6b6e6f776e20746f6b656e20666f722064656274207061796d656e740000600082015250565b6000611daa601e83611cf7565b9150611db582611d74565b602082019050919050565b60006020820190508181036000830152611dd981611d9d565b9050919050565b7f4e6f2064656274207265636f7264656420666f72207468697320746f6b656e00600082015250565b6000611e16601f83611cf7565b9150611e2182611de0565b602082019050919050565b60006020820190508181036000830152611e4581611e09565b9050919050565b600081519050611e5b81611b93565b92915050565b600060208284031215611e7757611e7661196c565b5b6000611e8584828501611e4c565b91505092915050565b7f496e73756666696369656e742062616c616e636520746f207061792064656274600082015250565b6000611ec4602083611cf7565b9150611ecf82611e8e565b602082019050919050565b60006020820190508181036000830152611ef381611eb7565b9050919050565b611f0381611996565b82525050565b6000819050919050565b6000611f1e82611f09565b9050919050565b611f2e81611f13565b82525050565b606082016000820151611f4a6000850182611efa565b506020820151611f5d6020850182611efa565b506040820151611f706040850182611f25565b50505050565b600081600f0b9050919050565b611f8c81611f76565b82525050565b60008115159050919050565b611fa781611f92565b82525050565b60006bffffffffffffffffffffffff82169050919050565b611fce81611fad565b82525050565b611fdd81611b89565b82525050565b600060e082019050611ff86000830188611f34565b6120056060830187611f83565b6120126080830186611f9e565b61201f60a0830185611fc5565b61202c60c0830184611fd4565b9695505050505050565b61203f81611f76565b811461204a57600080fd5b50565b60008151905061205c81612036565b92915050565b600080604083850312156120795761207861196c565b5b60006120878582860161204d565b92505060206120988582860161204d565b9150509250929050565b60006020820190506120b76000830184611fd4565b92915050565b600081905092915050565b50565b60006120d86000836120bd565b91506120e3826120c8565b600082019050919050565b60006120f9826120cb565b9150819050919050565b7f5472616e7366657220455448206465627420746f20456b75626f20436f72652060008201527f6661696c65640000000000000000000000000000000000000000000000000000602082015250565b600061215f602683611cf7565b915061216a82612103565b604082019050919050565b6000602082019050818103600083015261218e81612152565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6121ba81612195565b81146121c557600080fd5b50565b6000815190506121d7816121b1565b92915050565b6000602082840312156121f3576121f261196c565b5b6000612201848285016121c8565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061224482611f76565b91507fffffffffffffffffffffffffffffffff8000000000000000000000000000000082036122765761227561220a565b5b816000039050919050565b61228a81612195565b82525050565b60006060820190506122a56000830186611bff565b6122b26020830185611bff565b6122bf6040830184612281565b949350505050565b600080fd5b6000815190506122db816119a8565b92915050565b6122ea81611f09565b81146122f557600080fd5b50565b600081519050612307816122e1565b92915050565b600060608284031215612323576123226122c7565b5b61232d6060611a4f565b9050600061233d848285016122cc565b6000830152506020612351848285016122cc565b6020830152506040612365848285016122f8565b60408301525092915050565b61237a81611f92565b811461238557600080fd5b50565b60008151905061239781612371565b92915050565b600080608083850312156123b4576123b361196c565b5b60006123c28582860161230d565b92505060606123d385828601612388565b9150509250929050565b7f4e6f20746f6b656e7320746f2073776170000000000000000000000000000000600082015250565b6000612413601183611cf7565b915061241e826123dd565b602082019050919050565b6000602082019050818103600083015261244281612406565b9050919050565b7f5472616e7366657220746f2070617965724f726967696e206661696c65640000600082015250565b600061247f601e83611cf7565b915061248a82612449565b602082019050919050565b600060208201905081810360008301526124ae81612472565b905091905056fea26469706673582212202a75b5bb82f6d6a77f97e18f2c8f4d926ee4c24a0192956cca4c970a053cfaec64736f6c63430008110033000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000e0e0e08a6a4b9dc7bd67bcb7aade5cf48157d444

Deployed Bytecode

0x6080604052600436106100595760003560e01c806330e6ae3114610065578063599d07141461008e5780636f7929f2146100b7578063ad5c4648146100e0578063b45a3c0e1461010b578063bb6a797b1461014857610060565b3661006057005b600080fd5b34801561007157600080fd5b5061008c60048036038101906100879190611b1a565b610173565b005b34801561009a57600080fd5b506100b560048036038101906100b09190611bbf565b610190565b005b3480156100c357600080fd5b506100de60048036038101906100d99190611b1a565b610534565b005b3480156100ec57600080fd5b506100f5610551565b6040516101029190611c0e565b60405180910390f35b34801561011757600080fd5b50610132600480360381019061012d9190611c29565b610575565b60405161013f9190611cd5565b60405180910390f35b34801561015457600080fd5b5061015d611004565b60405161016a9190611c0e565b60405180910390f35b600036602081033591505061018a84848484611028565b50505050565b7f000000000000000000000000e0e0e08a6a4b9dc7bd67bcb7aade5cf48157d44473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461021e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161021590611d54565b60405180910390fd5b60008060010160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036102f157600060060160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16905060008060060160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506103ff565b600060010160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036103c357600060060160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16905060008060060160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506103fe565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103f590611dc0565b60405180910390fd5b5b60008111610442576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161043990611e2c565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161047d9190611c0e565b602060405180830381865afa15801561049a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104be9190611e61565b905081811015610503576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104fa90611eda565b60405180910390fd5b61052e837f000000000000000000000000e0e0e08a6a4b9dc7bd67bcb7aade5cf48157d444846118af565b50505050565b600036602081033591505061054b84848484611028565b50505050565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b60607f000000000000000000000000e0e0e08a6a4b9dc7bd67bcb7aade5cf48157d44473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610605576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105fc90611d54565b60405180910390fd5b600080604051806101000160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182016040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201548152505081526020016004820160009054906101000a9004600f0b600f0b600f0b81526020016004820160109054906101000a900460ff161515151581526020016004820160119054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152602001600582015481526020016006820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016006820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506000807f000000000000000000000000e0e0e08a6a4b9dc7bd67bcb7aade5cf48157d44473ffffffffffffffffffffffffffffffffffffffff16600084602001518560400151866060015187608001518860a001516040518663ffffffff1660e01b81526004016108bf959493929190611fe3565b60408051808303816000875af11580156108dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109019190612062565b915091506000836060015161091e57836020015160000151610928565b8360200151602001515b9050600083600f0b1315610c6157600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b7e5760007f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016109c59190611c0e565b602060405180830381865afa1580156109e2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a069190611e61565b90507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b8152600401610a6191906120a2565b600060405180830381600087803b158015610a7b57600080fd5b505af1158015610a8f573d6000803e3d6000fd5b505050506000846fffffffffffffffffffffffffffffffff16905060007f000000000000000000000000e0e0e08a6a4b9dc7bd67bcb7aade5cf48157d44473ffffffffffffffffffffffffffffffffffffffff1682604051610af0906120ee565b60006040518083038185875af1925050503d8060008114610b2d576040519150601f19603f3d011682016040523d82523d6000602084013e610b32565b606091505b5050905080610b76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6d90612175565b60405180910390fd5b505050610c60565b82600060060160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055507f000000000000000000000000e0e0e08a6a4b9dc7bd67bcb7aade5cf48157d44473ffffffffffffffffffffffffffffffffffffffff16630c11dedd8560200151600001516040518263ffffffff1660e01b8152600401610c1b9190611c0e565b6020604051808303816000875af1158015610c3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c5e91906121dd565b505b5b600082600f0b1315610d4f5781600060060160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055507f000000000000000000000000e0e0e08a6a4b9dc7bd67bcb7aade5cf48157d44473ffffffffffffffffffffffffffffffffffffffff16630c11dedd8560200151602001516040518263ffffffff1660e01b8152600401610d0a9190611c0e565b6020604051808303816000875af1158015610d29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4d91906121dd565b505b60008460600151610d6857846020015160200151610d72565b8460200151600001515b905060008560600151610d8e5783610d8990612239565b610d99565b84610d9890612239565b5b90506000816fffffffffffffffffffffffffffffffff161115610fe757600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f52577f000000000000000000000000e0e0e08a6a4b9dc7bd67bcb7aade5cf48157d44473ffffffffffffffffffffffffffffffffffffffff166303a65ab68330846040518463ffffffff1660e01b8152600401610e4793929190612290565b600060405180830381600087803b158015610e6157600080fd5b505af1158015610e75573d6000803e3d6000fd5b505050507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826fffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016000604051808303818588803b158015610ef357600080fd5b505af1158015610f07573d6000803e3d6000fd5b5050505050610f4d7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28760000151836fffffffffffffffffffffffffffffffff166118af565b610fe6565b7f000000000000000000000000e0e0e08a6a4b9dc7bd67bcb7aade5cf48157d44473ffffffffffffffffffffffffffffffffffffffff166303a65ab6838860000151846040518463ffffffff1660e01b8152600401610fb393929190612290565b600060405180830381600087803b158015610fcd57600080fd5b505af1158015610fe1573d6000803e3d6000fd5b505050505b5b604051806020016040528060008152509650505050505050919050565b7f000000000000000000000000e0e0e08a6a4b9dc7bd67bcb7aade5cf48157d44481565b6000808380602001905181019061103f919061239d565b9150915060008161105457826000015161105a565b82602001515b905060008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611132577f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016110ea9190611c0e565b602060405180830381865afa158015611107573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112b9190611e61565b90506111af565b8173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161116b9190611c0e565b602060405180830381865afa158015611188573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ac9190611e61565b90505b600081116111f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e990612429565b60405180910390fd5b6000819050600061120382866118fd565b6112155767400065a8177fae28611223565b6bffff9a5889f795069a41a8a25b90506040518061010001604052808b73ffffffffffffffffffffffffffffffffffffffff16815260200187815260200183600f0b81526020018615158152602001826bffffffffffffffffffffffff1681526020016000815260200160006fffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff168152506000808201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020155505060408201518160040160006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555060608201518160040160106101000a81548160ff02191690831515021790555060808201518160040160116101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff16021790555060a0820151816005015560c08201518160060160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060e08201518160060160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055509050507f000000000000000000000000e0e0e08a6a4b9dc7bd67bcb7aade5cf48157d44473ffffffffffffffffffffffffffffffffffffffff1663f83d08ba6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561152657600080fd5b505af115801561153a573d6000803e3d6000fd5b505050506000806000820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560018201600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600282016000905550506004820160006101000a8154906fffffffffffffffffffffffffffffffff02191690556004820160106101000a81549060ff02191690556004820160116101000a8154906bffffffffffffffffffffffff021916905560058201600090556006820160006101000a8154906fffffffffffffffffffffffffffffffff02191690556006820160106101000a8154906fffffffffffffffffffffffffffffffff0219169055505060007f3ca20afc2ccc0000000000000000000000000000000000000000000000000000808916036116b05773ffffffffffffffffffffffffffffffffffffffff881690505b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146118a257600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480156117205750600047115b156117d75760008173ffffffffffffffffffffffffffffffffffffffff164760405161174b906120ee565b60006040518083038185875af1925050503d8060008114611788576040519150601f19603f3d011682016040523d82523d6000602084013e61178d565b606091505b50509050806117d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c890612495565b60405180910390fd5b506118a1565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146118a05760008573ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016118469190611c0e565b602060405180830381865afa158015611863573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118879190611e61565b9050600081111561189e5761189d8683836118af565b5b505b5b5b5050505050505050505050565b6118c28363a9059cbb60e01b848461190c565b6118f8576040517ffb7f507900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b60008083128218905092915050565b60006040518481528360048201528260248201526020600060448360008a5af191508115611959573d6000811461194f57600160005114601f3d11169250611957565b6000873b1192505b505b50949350505050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006119a182611976565b9050919050565b6119b181611996565b81146119bc57600080fd5b50565b6000813590506119ce816119a8565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611a27826119de565b810181811067ffffffffffffffff82111715611a4657611a456119ef565b5b80604052505050565b6000611a59611962565b9050611a658282611a1e565b919050565b600067ffffffffffffffff821115611a8557611a846119ef565b5b611a8e826119de565b9050602081019050919050565b82818337600083830152505050565b6000611abd611ab884611a6a565b611a4f565b905082815260208101848484011115611ad957611ad86119d9565b5b611ae4848285611a9b565b509392505050565b600082601f830112611b0157611b006119d4565b5b8135611b11848260208601611aaa565b91505092915050565b600080600060608486031215611b3357611b3261196c565b5b6000611b41868287016119bf565b9350506020611b52868287016119bf565b925050604084013567ffffffffffffffff811115611b7357611b72611971565b5b611b7f86828701611aec565b9150509250925092565b6000819050919050565b611b9c81611b89565b8114611ba757600080fd5b50565b600081359050611bb981611b93565b92915050565b60008060408385031215611bd657611bd561196c565b5b6000611be485828601611baa565b9250506020611bf5858286016119bf565b9150509250929050565b611c0881611996565b82525050565b6000602082019050611c236000830184611bff565b92915050565b600060208284031215611c3f57611c3e61196c565b5b6000611c4d84828501611baa565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611c90578082015181840152602081019050611c75565b60008484015250505050565b6000611ca782611c56565b611cb18185611c61565b9350611cc1818560208601611c72565b611cca816119de565b840191505092915050565b60006020820190508181036000830152611cef8184611c9c565b905092915050565b600082825260208201905092915050565b7f4f6e6c7920456b75626f20436f72652063616e2063616c6c0000000000000000600082015250565b6000611d3e601883611cf7565b9150611d4982611d08565b602082019050919050565b60006020820190508181036000830152611d6d81611d31565b9050919050565b7f556e6b6e6f776e20746f6b656e20666f722064656274207061796d656e740000600082015250565b6000611daa601e83611cf7565b9150611db582611d74565b602082019050919050565b60006020820190508181036000830152611dd981611d9d565b9050919050565b7f4e6f2064656274207265636f7264656420666f72207468697320746f6b656e00600082015250565b6000611e16601f83611cf7565b9150611e2182611de0565b602082019050919050565b60006020820190508181036000830152611e4581611e09565b9050919050565b600081519050611e5b81611b93565b92915050565b600060208284031215611e7757611e7661196c565b5b6000611e8584828501611e4c565b91505092915050565b7f496e73756666696369656e742062616c616e636520746f207061792064656274600082015250565b6000611ec4602083611cf7565b9150611ecf82611e8e565b602082019050919050565b60006020820190508181036000830152611ef381611eb7565b9050919050565b611f0381611996565b82525050565b6000819050919050565b6000611f1e82611f09565b9050919050565b611f2e81611f13565b82525050565b606082016000820151611f4a6000850182611efa565b506020820151611f5d6020850182611efa565b506040820151611f706040850182611f25565b50505050565b600081600f0b9050919050565b611f8c81611f76565b82525050565b60008115159050919050565b611fa781611f92565b82525050565b60006bffffffffffffffffffffffff82169050919050565b611fce81611fad565b82525050565b611fdd81611b89565b82525050565b600060e082019050611ff86000830188611f34565b6120056060830187611f83565b6120126080830186611f9e565b61201f60a0830185611fc5565b61202c60c0830184611fd4565b9695505050505050565b61203f81611f76565b811461204a57600080fd5b50565b60008151905061205c81612036565b92915050565b600080604083850312156120795761207861196c565b5b60006120878582860161204d565b92505060206120988582860161204d565b9150509250929050565b60006020820190506120b76000830184611fd4565b92915050565b600081905092915050565b50565b60006120d86000836120bd565b91506120e3826120c8565b600082019050919050565b60006120f9826120cb565b9150819050919050565b7f5472616e7366657220455448206465627420746f20456b75626f20436f72652060008201527f6661696c65640000000000000000000000000000000000000000000000000000602082015250565b600061215f602683611cf7565b915061216a82612103565b604082019050919050565b6000602082019050818103600083015261218e81612152565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6121ba81612195565b81146121c557600080fd5b50565b6000815190506121d7816121b1565b92915050565b6000602082840312156121f3576121f261196c565b5b6000612201848285016121c8565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061224482611f76565b91507fffffffffffffffffffffffffffffffff8000000000000000000000000000000082036122765761227561220a565b5b816000039050919050565b61228a81612195565b82525050565b60006060820190506122a56000830186611bff565b6122b26020830185611bff565b6122bf6040830184612281565b949350505050565b600080fd5b6000815190506122db816119a8565b92915050565b6122ea81611f09565b81146122f557600080fd5b50565b600081519050612307816122e1565b92915050565b600060608284031215612323576123226122c7565b5b61232d6060611a4f565b9050600061233d848285016122cc565b6000830152506020612351848285016122cc565b6020830152506040612365848285016122f8565b60408301525092915050565b61237a81611f92565b811461238557600080fd5b50565b60008151905061239781612371565b92915050565b600080608083850312156123b4576123b361196c565b5b60006123c28582860161230d565b92505060606123d385828601612388565b9150509250929050565b7f4e6f20746f6b656e7320746f2073776170000000000000000000000000000000600082015250565b6000612413601183611cf7565b915061241e826123dd565b602082019050919050565b6000602082019050818103600083015261244281612406565b9050919050565b7f5472616e7366657220746f2070617965724f726967696e206661696c65640000600082015250565b600061247f601e83611cf7565b915061248a82612449565b602082019050919050565b600060208201905081810360008301526124ae81612472565b905091905056fea26469706673582212202a75b5bb82f6d6a77f97e18f2c8f4d926ee4c24a0192956cca4c970a053cfaec64736f6c63430008110033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000e0e0e08a6a4b9dc7bd67bcb7aade5cf48157d444

-----Decoded View---------------
Arg [0] : weth (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [1] : ekuboCore (address): 0xe0e0e08A6A4b9Dc7bD67BCB7aadE5cF48157d444

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [1] : 000000000000000000000000e0e0e08a6a4b9dc7bd67bcb7aade5cf48157d444


Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
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.