ETH Price: $1,844.70 (-2.66%)
Gas: 0.3 Gwei
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

1 Internal Transaction found.

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Method Block
From
To
0x60c06040219778962025-03-05 3:07:11356 days ago1741144031  Contract Creation0 ETH
Loading...
Loading
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:
SonicMainnetDecoderAndSanitizer

Compiler Version
v0.8.21+commit.d9974bed

Optimization Enabled:
Yes with 200 runs

Other Settings:
shanghai EvmVersion
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.21;

import {BaseDecoderAndSanitizer} from "src/base/DecodersAndSanitizers/BaseDecoderAndSanitizer.sol";
import {UniswapV3DecoderAndSanitizer} from "src/base/DecodersAndSanitizers/Protocols/UniswapV3DecoderAndSanitizer.sol";
import {ERC4626DecoderAndSanitizer} from "src/base/DecodersAndSanitizers/Protocols/ERC4626DecoderAndSanitizer.sol";
import {EtherFiDecoderAndSanitizer} from "src/base/DecodersAndSanitizers/Protocols/EtherFiDecoderAndSanitizer.sol";
import {NativeWrapperDecoderAndSanitizer} from
    "src/base/DecodersAndSanitizers/Protocols/NativeWrapperDecoderAndSanitizer.sol";
import {OneInchDecoderAndSanitizer} from "src/base/DecodersAndSanitizers/Protocols/OneInchDecoderAndSanitizer.sol";
import {AaveV3DecoderAndSanitizer} from "src/base/DecodersAndSanitizers/Protocols/AaveV3DecoderAndSanitizer.sol";
import {LidoDecoderAndSanitizer} from "src/base/DecodersAndSanitizers/Protocols/LidoDecoderAndSanitizer.sol";
import {FluidFTokenDecoderAndSanitizer} from
    "src/base/DecodersAndSanitizers/Protocols/FluidFTokenDecoderAndSanitizer.sol";
import {OFTDecoderAndSanitizer} from
    "src/base/DecodersAndSanitizers/Protocols/OFTDecoderAndSanitizer.sol";
import {TellerDecoderAndSanitizer} from "src/base/DecodersAndSanitizers/Protocols/TellerDecoderAndSanitizer.sol"; 
import {OdosDecoderAndSanitizer} from "src/base/DecodersAndSanitizers/Protocols/OdosDecoderAndSanitizer.sol"; 
import {FluidDexDecoderAndSanitizer} from "src/base/DecodersAndSanitizers/Protocols/FluidDexDecoderAndSanitizer.sol"; 


contract SonicMainnetDecoderAndSanitizer is
    UniswapV3DecoderAndSanitizer,
    ERC4626DecoderAndSanitizer,
    EtherFiDecoderAndSanitizer,
    NativeWrapperDecoderAndSanitizer,
    OneInchDecoderAndSanitizer,
    AaveV3DecoderAndSanitizer,
    LidoDecoderAndSanitizer,
    FluidFTokenDecoderAndSanitizer,
    OFTDecoderAndSanitizer,
    TellerDecoderAndSanitizer,
    OdosDecoderAndSanitizer
{
    constructor(address _uniswapV3NonFungiblePositionManager, address _odosRouter)
        UniswapV3DecoderAndSanitizer(_uniswapV3NonFungiblePositionManager)
        OdosDecoderAndSanitizer(_odosRouter)
    {}

    //============================== HANDLE FUNCTION COLLISIONS ===============================
    /**
     * @notice EtherFi, NativeWrapper all specify a `deposit()`,
     *         all cases are handled the same way.
     */
    function deposit()
        external
        pure
        override(EtherFiDecoderAndSanitizer, NativeWrapperDecoderAndSanitizer)
        returns (bytes memory addressesFound)
    {
        return addressesFound;
    }

    function wrap(uint256)
        external
        pure
        override(EtherFiDecoderAndSanitizer, LidoDecoderAndSanitizer)
        returns (bytes memory addressesFound)
    {
        // Nothing to sanitize or return
        return addressesFound;
    }

    function unwrap(uint256)
        external
        pure
        override(EtherFiDecoderAndSanitizer, LidoDecoderAndSanitizer)
        returns (bytes memory addressesFound)
    {
        // Nothing to sanitize or return
        return addressesFound;
    }
}

// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.21;

import {DecoderCustomTypes} from "src/interfaces/DecoderCustomTypes.sol";

contract BaseDecoderAndSanitizer {
    error BaseDecoderAndSanitizer__FunctionSelectorNotSupported();
    //============================== IMMUTABLES ===============================

    function approve(address spender, uint256) external pure returns (bytes memory addressesFound) {
        addressesFound = abi.encodePacked(spender);
    }

    function transfer(address _to, uint256) external pure returns (bytes memory addressesFound) {
        addressesFound = abi.encodePacked(_to);
    }

    function claimFees(address feeAsset) external pure returns (bytes memory addressesFound) {
        addressesFound = abi.encodePacked(feeAsset);
    }

    function claimYield(address yieldAsset) external pure returns (bytes memory addressesFound) {
        addressesFound = abi.encodePacked(yieldAsset);
    }

    function withdrawNonBoringToken(address token, uint256 /*amount*/ )
        external
        pure
        returns (bytes memory addressesFound)
    {
        addressesFound = abi.encodePacked(token);
    }

    function withdrawNativeFromDrone() external pure returns (bytes memory addressesFound) {
        return addressesFound;
    }

    //============================== FALLBACK ===============================
    /**
     * @notice The purpose of this function is to revert with a known error,
     *         so that during merkle tree creation we can verify that a
     *         leafs decoder and sanitizer implments the required function
     *         selector.
     */
    fallback() external {
        revert BaseDecoderAndSanitizer__FunctionSelectorNotSupported();
    }
}

// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.21;

import {INonFungiblePositionManager} from "src/interfaces/RawDataDecoderAndSanitizerInterfaces.sol";
import {BaseDecoderAndSanitizer, DecoderCustomTypes} from "src/base/DecodersAndSanitizers/BaseDecoderAndSanitizer.sol";

abstract contract UniswapV3DecoderAndSanitizer is BaseDecoderAndSanitizer {
    //============================== ERRORS ===============================

    error UniswapV3DecoderAndSanitizer__BadPathFormat();
    error UniswapV3DecoderAndSanitizer__BadTokenId();

    //============================== IMMUTABLES ===============================

    /**
     * @notice The networks uniswapV3 nonfungible position manager.
     */
    INonFungiblePositionManager internal immutable uniswapV3NonFungiblePositionManager;

    constructor(address _uniswapV3NonFungiblePositionManager) {
        uniswapV3NonFungiblePositionManager = INonFungiblePositionManager(_uniswapV3NonFungiblePositionManager);
    }

    //============================== UNISWAP V3 ===============================

    function exactInput(DecoderCustomTypes.ExactInputParams calldata params)
        external
        pure
        virtual
        returns (bytes memory addressesFound)
    {
        // Nothing to sanitize
        // Return addresses found
        // Determine how many addresses are in params.path.
        uint256 chunkSize = 23; // 3 bytes for uint24 fee, and 20 bytes for address token
        uint256 pathLength = params.path.length;
        if (pathLength % chunkSize != 20) revert UniswapV3DecoderAndSanitizer__BadPathFormat();
        uint256 pathAddressLength = 1 + (pathLength / chunkSize);
        uint256 pathIndex;
        for (uint256 i; i < pathAddressLength; ++i) {
            addressesFound = abi.encodePacked(addressesFound, params.path[pathIndex:pathIndex + 20]);
            pathIndex += chunkSize;
        }
        addressesFound = abi.encodePacked(addressesFound, params.recipient);
    }

    function mint(DecoderCustomTypes.MintParams calldata params)
        external
        pure
        virtual
        returns (bytes memory addressesFound)
    {
        // Nothing to sanitize
        // Return addresses found
        addressesFound = abi.encodePacked(params.token0, params.token1, params.recipient);
    }

    function increaseLiquidity(DecoderCustomTypes.IncreaseLiquidityParams calldata params)
        external
        view
        virtual
        returns (bytes memory addressesFound)
    {
        // Sanitize raw data
        address owner = uniswapV3NonFungiblePositionManager.ownerOf(params.tokenId);
        // Extract addresses from uniswapV3NonFungiblePositionManager.positions(params.tokenId).
        (, address operator, address token0, address token1,,,,,,,,) =
            uniswapV3NonFungiblePositionManager.positions(params.tokenId);
        addressesFound = abi.encodePacked(operator, token0, token1, owner);
    }

    function decreaseLiquidity(DecoderCustomTypes.DecreaseLiquidityParams calldata params)
        external
        view
        virtual
        returns (bytes memory addressesFound)
    {
        // Sanitize raw data
        // NOTE ownerOf check is done in PositionManager contract as well, but it is added here
        // just for completeness.
        address owner = uniswapV3NonFungiblePositionManager.ownerOf(params.tokenId);

        // No addresses in data
        return abi.encodePacked(owner);
    }

    function collect(DecoderCustomTypes.CollectParams calldata params)
        external
        view
        virtual
        returns (bytes memory addressesFound)
    {
        // Sanitize raw data
        // NOTE ownerOf check is done in PositionManager contract as well, but it is added here
        // just for completeness.
        address owner = uniswapV3NonFungiblePositionManager.ownerOf(params.tokenId);

        // Return addresses found
        addressesFound = abi.encodePacked(params.recipient, owner);
    }

    function burn(uint256 /*tokenId*/ ) external pure virtual returns (bytes memory addressesFound) {
        // positionManager.burn(tokenId) will verify that the tokenId has no liquidity, and no tokens owed.
        // Nothing to sanitize or return
        return addressesFound;
    }
}

// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.21;

import {BaseDecoderAndSanitizer, DecoderCustomTypes} from "src/base/DecodersAndSanitizers/BaseDecoderAndSanitizer.sol";

abstract contract ERC4626DecoderAndSanitizer is BaseDecoderAndSanitizer {
    //============================== ERC4626 ===============================

    function deposit(uint256, address receiver) external pure virtual returns (bytes memory addressesFound) {
        addressesFound = abi.encodePacked(receiver);
    }

    function mint(uint256, address receiver) external pure virtual returns (bytes memory addressesFound) {
        addressesFound = abi.encodePacked(receiver);
    }

    function withdraw(uint256, address receiver, address owner)
        external
        pure
        virtual
        returns (bytes memory addressesFound)
    {
        addressesFound = abi.encodePacked(receiver, owner);
    }

    function redeem(uint256, address receiver, address owner)
        external
        pure
        virtual
        returns (bytes memory addressesFound)
    {
        addressesFound = abi.encodePacked(receiver, owner);
    }
}

// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.21;

import {BaseDecoderAndSanitizer, DecoderCustomTypes} from "src/base/DecodersAndSanitizers/BaseDecoderAndSanitizer.sol";

abstract contract EtherFiDecoderAndSanitizer is BaseDecoderAndSanitizer {
    //============================== ETHERFI ===============================

    function deposit() external pure virtual returns (bytes memory addressesFound) {
        // Nothing to sanitize or return
        return addressesFound;
    }

    function wrap(uint256) external pure virtual returns (bytes memory addressesFound) {
        // Nothing to sanitize or return
        return addressesFound;
    }

    function unwrap(uint256) external pure virtual returns (bytes memory addressesFound) {
        // Nothing to sanitize or return
        return addressesFound;
    }

    function requestWithdraw(address _addr, uint256) external pure virtual returns (bytes memory addressesFound) {
        addressesFound = abi.encodePacked(_addr);
    }

    function claimWithdraw(uint256) external pure virtual returns (bytes memory addressesFound) {
        // Nothing to sanitize or return
        return addressesFound;
    }
}

File 6 of 16 : NativeWrapperDecoderAndSanitizer.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.21;

import {BaseDecoderAndSanitizer, DecoderCustomTypes} from "src/base/DecodersAndSanitizers/BaseDecoderAndSanitizer.sol";

abstract contract NativeWrapperDecoderAndSanitizer is BaseDecoderAndSanitizer {
    //============================== ETHERFI ===============================

    function deposit() external pure virtual returns (bytes memory addressesFound) {
        // Nothing to sanitize or return
        return addressesFound;
    }

    function withdraw(uint256) external pure virtual returns (bytes memory addressesFound) {
        // Nothing to sanitize or return
        return addressesFound;
    }
}

File 7 of 16 : OneInchDecoderAndSanitizer.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.21;

import {BaseDecoderAndSanitizer, DecoderCustomTypes} from "src/base/DecodersAndSanitizers/BaseDecoderAndSanitizer.sol";

abstract contract OneInchDecoderAndSanitizer is BaseDecoderAndSanitizer {
    //============================== ERRORS ===============================

    error OneInchDecoderAndSanitizer__PermitNotSupported();

    //============================== ONEINCH ===============================

    function swap(
        address executor,
        DecoderCustomTypes.SwapDescription calldata desc,
        bytes calldata permit,
        bytes calldata
    ) external pure returns (bytes memory addressesFound) {
        if (permit.length > 0) revert OneInchDecoderAndSanitizer__PermitNotSupported();
        addressesFound = abi.encodePacked(executor, desc.srcToken, desc.dstToken, desc.srcReceiver, desc.dstReceiver);
    }

    function uniswapV3Swap(uint256, uint256, uint256[] calldata pools)
        external
        pure
        returns (bytes memory addressesFound)
    {
        for (uint256 i; i < pools.length; ++i) {
            addressesFound = abi.encodePacked(addressesFound, uint160(pools[i]));
        }
    }
}

// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.21;

import {BaseDecoderAndSanitizer, DecoderCustomTypes} from "src/base/DecodersAndSanitizers/BaseDecoderAndSanitizer.sol";

abstract contract AaveV3DecoderAndSanitizer is BaseDecoderAndSanitizer {
    //============================== AAVEV3 ===============================

    function supply(address asset, uint256, address onBehalfOf, uint16)
        external
        pure
        virtual
        returns (bytes memory addressesFound)
    {
        addressesFound = abi.encodePacked(asset, onBehalfOf);
    }

    function withdraw(address asset, uint256, address to) external pure virtual returns (bytes memory addressesFound) {
        addressesFound = abi.encodePacked(asset, to);
    }

    function borrow(address asset, uint256, uint256, uint16, address onBehalfOf)
        external
        pure
        virtual
        returns (bytes memory addressesFound)
    {
        addressesFound = abi.encodePacked(asset, onBehalfOf);
    }

    function repay(address asset, uint256, uint256, address onBehalfOf)
        external
        pure
        virtual
        returns (bytes memory addressesFound)
    {
        addressesFound = abi.encodePacked(asset, onBehalfOf);
    }

    function setUserUseReserveAsCollateral(address asset, bool)
        external
        pure
        virtual
        returns (bytes memory addressesFound)
    {
        addressesFound = abi.encodePacked(asset);
    }

    function setUserEMode(uint8) external pure virtual returns (bytes memory addressesFound) {
        // Nothing to sanitize or return
        return addressesFound;
    }

    function claimRewards(address[] calldata, /*assets*/ uint256, /*amount*/ address to, address /*reward*/ )
        external
        pure
        virtual
        returns (bytes memory addressesFound)
    {
        addressesFound = abi.encodePacked(to);
    }
}

// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.21;

import {BaseDecoderAndSanitizer, DecoderCustomTypes} from "src/base/DecodersAndSanitizers/BaseDecoderAndSanitizer.sol";

abstract contract LidoDecoderAndSanitizer is BaseDecoderAndSanitizer {
    //============================== LIDO ===============================

    function submit(address referral) external pure virtual returns (bytes memory addressesFound) {
        addressesFound = abi.encodePacked(referral);
    }

    function wrap(uint256) external pure virtual returns (bytes memory addressesFound) {
        // Nothing to sanitize or return
        return addressesFound;
    }

    function unwrap(uint256) external pure virtual returns (bytes memory addressesFound) {
        // Nothing to sanitize or return
        return addressesFound;
    }

    function requestWithdrawals(uint256[] calldata, address _owner)
        external
        pure
        virtual
        returns (bytes memory addressesFound)
    {
        addressesFound = abi.encodePacked(_owner);
    }

    function claimWithdrawal(uint256) external pure virtual returns (bytes memory addressesFound) {
        // Nothing to sanitize or return
        return addressesFound;
    }

    function claimWithdrawals(uint256[] calldata, uint256[] calldata)
        external
        pure
        virtual
        returns (bytes memory addressesFound)
    {
        // Nothing to sanitize or return
        return addressesFound;
    }
}

// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.21;

import {BaseDecoderAndSanitizer, DecoderCustomTypes} from "src/base/DecodersAndSanitizers/BaseDecoderAndSanitizer.sol";

abstract contract FluidFTokenDecoderAndSanitizer is BaseDecoderAndSanitizer {
    //============================== Fluid FToken ===============================

    function deposit(uint256, /*assets_*/ address receiver_, uint256 /*minAmountOut_*/ )
        external
        pure
        virtual
        returns (bytes memory addressesFound)
    {
        addressesFound = abi.encodePacked(receiver_);
    }

    function mint(uint256, /*shares_*/ address receiver_, uint256 /*maxAssets_*/ )
        external
        pure
        virtual
        returns (bytes memory addressesFound)
    {
        addressesFound = abi.encodePacked(receiver_);
    }

    function withdraw(uint256, /*assets_*/ address receiver_, address owner_, uint256 /*maxSharesBurn_*/ )
        external
        pure
        virtual
        returns (bytes memory addressesFound)
    {
        addressesFound = abi.encodePacked(receiver_, owner_);
    }

    function redeem(uint256, /*shares_*/ address receiver_, address owner_, uint256 /*minAmountOut_*/ )
        external
        pure
        virtual
        returns (bytes memory addressesFound)
    {
        addressesFound = abi.encodePacked(receiver_, owner_);
    }
}

File 11 of 16 : OFTDecoderAndSanitizer.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.21;

import {BaseDecoderAndSanitizer, DecoderCustomTypes} from "src/base/DecodersAndSanitizers/BaseDecoderAndSanitizer.sol";

abstract contract OFTDecoderAndSanitizer is BaseDecoderAndSanitizer {
    error OFTDecoderAndSanitizer__NonZeroMessage();
    error OFTDecoderAndSanitizer__NonZeroOFTCommand();

    //============================== OFT ===============================

    function send(
        DecoderCustomTypes.SendParam calldata _sendParam,
        DecoderCustomTypes.MessagingFee calldata, /*_fee*/
        address _refundAddress
    ) external pure virtual returns (bytes memory sensitiveArguments) {
        // Sanitize Message.
        if (_sendParam.composeMsg.length > 0) {
            revert OFTDecoderAndSanitizer__NonZeroMessage();
        }
        if (_sendParam.oftCmd.length > 0) {
            revert OFTDecoderAndSanitizer__NonZeroOFTCommand();
        }

        sensitiveArguments =
            abi.encodePacked(address(uint160(_sendParam.dstEid)), address(bytes20(_sendParam.to << 96)), _refundAddress);
    }
}

// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.21;

import {BaseDecoderAndSanitizer, DecoderCustomTypes} from "src/base/DecodersAndSanitizers/BaseDecoderAndSanitizer.sol";

abstract contract TellerDecoderAndSanitizer is BaseDecoderAndSanitizer {
    //============================== Teller ===============================

    function bulkDeposit(address depositAsset, uint256, /*depositAmount*/ uint256, /*minimumMint*/ address to)
        external
        pure
        returns (bytes memory addressesFound)
    {
        addressesFound = abi.encodePacked(depositAsset, to);
    }

    function bulkWithdraw(address withdrawAsset, uint256, /*shareAmount*/ uint256, /*minimumAssets*/ address to)
        external
        pure
        returns (bytes memory addressesFound)
    {
        addressesFound = abi.encodePacked(withdrawAsset, to);
    }

    function deposit(address depositAsset, uint256, /*depositAmount*/ uint256 /*minimumMint*/ )
        external
        pure
        virtual
        returns (bytes memory addressesFound)
    {
        addressesFound = abi.encodePacked(depositAsset);
    }

    // BoringOnChainQueue.sol
    function requestOnChainWithdraw(address asset, uint128, uint16, uint24)
        external
        pure
        virtual
        returns (bytes memory addressesFound)
    {
        addressesFound = abi.encodePacked(asset);
    }
}

// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.21;

import {BaseDecoderAndSanitizer, DecoderCustomTypes} from "src/base/DecodersAndSanitizers/BaseDecoderAndSanitizer.sol";


abstract contract OdosDecoderAndSanitizer is BaseDecoderAndSanitizer {

    // Reference to the OdosRouterV2 contract
    IOdosRouterV2 internal immutable odosRouter; //temp

    constructor(address _odosRouter) {
        odosRouter = IOdosRouterV2(_odosRouter); 
    }

    function swap(
        DecoderCustomTypes.swapTokenInfo memory tokenInfo,
        bytes calldata /*pathDefinition*/,
        address executor,
        uint32 /*referralCode*/
    ) external pure virtual returns (bytes memory addressesFound) {
        
        addressesFound = abi.encodePacked(tokenInfo.inputToken, tokenInfo.inputReceiver, tokenInfo.outputToken, tokenInfo.outputReceiver, executor); 

    }

    function swapCompact() external view virtual returns (bytes memory addressesFound) {
        DecoderCustomTypes.swapTokenInfo memory tokenInfo;
        address executor;
        uint32 referralCode;
        bytes calldata pathDefinition;

        // Variables to store indices for addresses that need lookup
        Address memory inputTokenLookup;  
        Address memory outputTokenLookup; 
        Address memory executorLookup; 

        {
            address msgSender = msg.sender;
            assembly {
                // Assembly function to get address from calldata
                function getAddress(currPos) -> result, newPos {
                    let inputPos := shr(240, calldataload(currPos))
                    
                    switch inputPos
                    // Reserve the null address as a special case that can be specified with 2 null bytes
                    case 0x0000 {
                        result := 0
                        newPos := add(currPos, 2)
                    }
                    // This case means that the address is encoded in the calldata directly following the code
                    case 0x0001 {
                        result := and(shr(80, calldataload(currPos)), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)
                        newPos := add(currPos, 22)
                    }
                    // For addresses from the addressList, we'll just store the index for later retrieval
                    default {
                        // We'll use this later to know we need to look up from addressList
                        result := 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE
                        newPos := add(currPos, 2)
                    }
                }
                
                let result := 0
                let pos := 4
                let fromList := 0

                // Load in the input and output token addresses
                result, pos := getAddress(pos)
                if eq(result, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE) {
                    let inputPos := shr(240, calldataload(sub(pos, 2))) //sub 2 because we added 2 in `getAddress`, shr 240 bits to get index
                    mstore(add(inputTokenLookup, 0x00), sub(inputPos, 2)) // Store index
                    mstore(add(inputTokenLookup, 0x20), 1)                // Set needsLookup to true
                }
                mstore(tokenInfo, result)

                result, pos := getAddress(pos)
                if eq(result, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE) {
                    let inputPos := shr(240, calldataload(sub(pos, 2)))
                    mstore(add(outputTokenLookup, 0x00), sub(inputPos, 2))
                    mstore(add(outputTokenLookup, 0x20), 1)
                }
                mstore(add(tokenInfo, 0x60), result)

                // Load in the input amount - a 0 byte means the full balance is to be used
                let inputAmountLength := shr(248, calldataload(pos))
                pos := add(pos, 1)

                if inputAmountLength {
                  mstore(add(tokenInfo, 0x20), shr(mul(sub(32, inputAmountLength), 8), calldataload(pos)))
                  pos := add(pos, inputAmountLength)
                }

                // Load in the quoted output amount
                let quoteAmountLength := shr(248, calldataload(pos))
                pos := add(pos, 1)

                let outputQuote := shr(mul(sub(32, quoteAmountLength), 8), calldataload(pos))
                mstore(add(tokenInfo, 0x80), outputQuote)
                pos := add(pos, quoteAmountLength)

                // Load the slippage tolerance and use to get the minimum output amount
                {
                  let slippageTolerance := shr(232, calldataload(pos))
                  mstore(add(tokenInfo, 0xA0), div(mul(outputQuote, sub(0xFFFFFF, slippageTolerance)), 0xFFFFFF))
                }
                pos := add(pos, 3)

                // Load in the executor address
                result, pos := getAddress(pos)
                if eq(result, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE) {
                    let inputPos := shr(240, calldataload(sub(pos, 2)))
                    mstore(add(executorLookup, 0x00), sub(inputPos, 2))
                    mstore(add(executorLookup, 0x20), 1)
                }
                executor := result

                // Load in the destination to send the input to - Zero denotes the executor
                result, pos := getAddress(pos)
                if eq(result, 0) { result := executor }
                mstore(add(tokenInfo, 0x40), result)

                // Load in the destination to send the output to - Zero denotes msg.sender
                result, pos := getAddress(pos)
                if eq(result, 0) { result := msgSender }
                mstore(add(tokenInfo, 0xC0), result)

                // Load in the referralCode
                referralCode := shr(224, calldataload(pos))
                pos := add(pos, 4)

                // Set the offset and size for the pathDefinition portion of the msg.data
                pathDefinition.length := mul(shr(248, calldataload(pos)), 32)
                pathDefinition.offset := add(pos, 1)
            }
        }

        // For inputToken
        if (inputTokenLookup.needsLookup) {
            tokenInfo.inputToken = odosRouter.addressList(inputTokenLookup.tokenIndex);
        }
        
        // For outputToken
        if (outputTokenLookup.needsLookup) {
            tokenInfo.outputToken = odosRouter.addressList(outputTokenLookup.tokenIndex);
        }
        
        // For executor
        if (executorLookup.needsLookup) {
            executor = odosRouter.addressList(executorLookup.tokenIndex);
        }

        addressesFound = abi.encodePacked(tokenInfo.inputToken, tokenInfo.inputReceiver, tokenInfo.outputToken, tokenInfo.outputReceiver, executor); 
    }
} 


interface IOdosRouterV2 {
    function addressList(uint256 index) external view returns (address); 
}

struct Address {    
    uint256 tokenIndex; 
    bool needsLookup; 
}

// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.21;

import {BaseDecoderAndSanitizer} from "src/base/DecodersAndSanitizers/BaseDecoderAndSanitizer.sol";

abstract contract FluidDexDecoderAndSanitizer is BaseDecoderAndSanitizer {
    /// @notice T2 and T3

    /*  
     *  @notice Vault T2 and T3 ((smart collateral, normal debt) / (normal collateral, smart debt))
     *  @notice T2 params on LHS, T3 on RHS -> T2ParamName/T3ParamName
     *  @dev   These use the same function sig, so I'm just grouping them together
     *  @param nftId The ID of the NFT representing the vault position, use 0 for a new position
     *  @param newColToken0/newCol The change in collateral amount (positive for deposit, negative for withdrawal) *  @param newColtoken1/newDebtToken0 The change in debt amount for token0 (positive for borrowing, negative for repayment)
     *  @param colSharesMinMax/newDebtToken1 The change in debt amount for token1 (positive for borrowing, negative for repayment)
     *  @param newDebt/debtSharesMinMax Min or max debt shares to mint or burn (positive for borrowing, negative for repayment)
     *  @param to The address to receive withdrawn collateral or borrowed tokens (if address(0), defaults to msg.sender)
     */
    function operate(
        uint256, /*nftId*/
        int256, /*newColToken0 / newCol*/
        int256, /*newColToken1 / newDebtToken0*/
        int256, /*colSharesMinMax / newDebtToken1*/
        int256, /*newDebt / debtSharesMinMax*/
        address to
    ) external pure virtual returns (bytes memory addressesFound) {
        addressesFound = abi.encodePacked(to);
    }

    /* 
    *  @param nftId The ID of the NFT representing the vault position, use 0 for a new position
    *  @param perfectColShares The change in collateral shares (positive for deposit, negative for withdrawal)
    *  @param colToken0MinMax_ min or max collateral amount of token0 to withdraw or deposit (positive for deposit, negative for withdrawal)
    *  @param colToken1MinMax_ min or max collateral amount of token1 to withdraw or deposit (positive for deposit, negative for withdrawal)
    *  @param newDebt_ The change in debt amount (positive for borrowing, negative for repayment)
    *  @param to_ The address to receive withdrawn collateral or borrowed tokens (if address(0), defaults to msg.sender)
    */
    function operatePerfect(
        uint256, /*nftId*/
        int256, /*perfectColShares*/
        int256, /*colToken0MinMax*/
        int256, /*colToken1MinMax*/
        int256, /*newDebt*/
        address to
    ) external pure virtual returns (bytes memory addressesFound) {
        addressesFound = abi.encodePacked(to);
    }

    /// @notice T4 (smart collateral, smart debt)

    /*
    * @param nftId The ID of the NFT representing the vault position
    * @param newColToken0 The change in collateral amount for token0 (positive for deposit, negative for withdrawal)
    * @param newColToken1 The change in collateral amount for token1 (positive for deposit, negative for withdrawal)
    * @param colSharesMinMax Min or max collateral shares to mint or burn (positive for deposit, negative for withdrawal)
    * @param newDebtToken0 The change in debt amount for token0 (positive for borrowing, negative for repayment)
    * @param newDebtToken1 The change in debt amount for token1 (positive for borrowing, negative for repayment)
    * @param debtSharesMinMax Min or max debt shares to burn or mint (positive for borrowing, negative for repayment)
    * @param to The address to receive funds (if address(0), defaults to msg.sender)    
    */
    function operate(
        uint256, /*nftId*/
        int256, /*newColToken0*/
        int256, /*newColToken1*/
        int256, /*colSharesMinMax*/
        int256, /*newDebtToken0*/
        int256, /*newDebtToken1*/
        int256, /*debtSharesMinMax*/
        address to
    ) external pure virtual returns (bytes memory addressesFound) {
        addressesFound = abi.encodePacked(to);
    }

    /*
    * @param nftId_ The ID of the NFT representing the vault position
    * @param perfectColShares_ The change in collateral shares (positive for deposit, negative for withdrawal)
    * @param colToken0MinMax_ Min or max collateral amount of token0 to withdraw or deposit (positive for deposit, negative for withdrawal)
    * @param colToken1MinMax_ Min or max collateral amount of token1 to withdraw or deposit (positive for deposit, negative for withdrawal)
    * @param perfectDebtShares_ The change in debt shares (positive for borrowing, negative for repayment)
    * @param debtToken0MinMax_ Min or max debt amount for token0 to borrow or payback (positive for borrowing, negative for repayment)
    * @param debtToken1MinMax_ Min or max debt amount for token1 to borrow or payback (positive for borrowing, negative for repayment)
    * @param to_ The address to receive funds (if address(0), defaults to msg.sender)
    */
    function operatePerfect(
        uint256, /*nftId*/
        int256, /*perfectColShares*/
        int256, /*colToken0MinMax*/
        int256, /*colToken1MinMax*/
        int256, /*perfectDebtShares*/
        int256, /*debtToken0MinMax*/
        int256, /*debtToken1MinMax*/
        address to
    ) external pure virtual returns (bytes memory addressesFound) {
        addressesFound = abi.encodePacked(to);
    }
}

File 15 of 16 : DecoderCustomTypes.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.21;

contract DecoderCustomTypes {
    // ========================================= BALANCER =========================================
    struct JoinPoolRequest {
        address[] assets;
        uint256[] maxAmountsIn;
        bytes userData;
        bool fromInternalBalance;
    }

    struct ExitPoolRequest {
        address[] assets;
        uint256[] minAmountsOut;
        bytes userData;
        bool toInternalBalance;
    }

    enum SwapKind {
        GIVEN_IN,
        GIVEN_OUT
    }

    struct SingleSwap {
        bytes32 poolId;
        SwapKind kind;
        address assetIn;
        address assetOut;
        uint256 amount;
        bytes userData;
    }

    struct FundManagement {
        address sender;
        bool fromInternalBalance;
        address recipient;
        bool toInternalBalance;
    }

    // ========================================= UNISWAP V3 =========================================

    struct MintParams {
        address token0;
        address token1;
        uint24 fee;
        int24 tickLower;
        int24 tickUpper;
        uint256 amount0Desired;
        uint256 amount1Desired;
        uint256 amount0Min;
        uint256 amount1Min;
        address recipient;
        uint256 deadline;
    }

    struct IncreaseLiquidityParams {
        uint256 tokenId;
        uint256 amount0Desired;
        uint256 amount1Desired;
        uint256 amount0Min;
        uint256 amount1Min;
        uint256 deadline;
    }

    struct DecreaseLiquidityParams {
        uint256 tokenId;
        uint128 liquidity;
        uint256 amount0Min;
        uint256 amount1Min;
        uint256 deadline;
    }

    struct CollectParams {
        uint256 tokenId;
        address recipient;
        uint128 amount0Max;
        uint128 amount1Max;
    }

    struct ExactInputParams {
        bytes path;
        address recipient;
        uint256 deadline;
        uint256 amountIn;
        uint256 amountOutMinimum;
    }

    struct ExactInputParamsRouter02 {
        bytes path;
        address recipient;
        uint256 amountIn;
        uint256 amountOutMinimum;
    }

    struct PancakeSwapExactInputParams {
        bytes path;
        address recipient;
        uint256 amountIn;
        uint256 amountOutMinimum;
    }

    // ========================================= MORPHO BLUE =========================================

    struct MarketParams {
        address loanToken;
        address collateralToken;
        address oracle;
        address irm;
        uint256 lltv;
    }

    // ========================================= 1INCH =========================================

    struct SwapDescription {
        address srcToken;
        address dstToken;
        address payable srcReceiver;
        address payable dstReceiver;
        uint256 amount;
        uint256 minReturnAmount;
        uint256 flags;
    }

    // ========================================= PENDLE =========================================
    struct TokenInput {
        // TOKEN DATA
        address tokenIn;
        uint256 netTokenIn;
        address tokenMintSy;
        // AGGREGATOR DATA
        address pendleSwap;
        SwapData swapData;
    }

    struct TokenOutput {
        // TOKEN DATA
        address tokenOut;
        uint256 minTokenOut;
        address tokenRedeemSy;
        // AGGREGATOR DATA
        address pendleSwap;
        SwapData swapData;
    }

    struct ApproxParams {
        uint256 guessMin;
        uint256 guessMax;
        uint256 guessOffchain; // pass 0 in to skip this variable
        uint256 maxIteration; // every iteration, the diff between guessMin and guessMax will be divided by 2
        uint256 eps; // the max eps between the returned result & the correct result, base 1e18. Normally this number will be set
            // to 1e15 (1e18/1000 = 0.1%)
    }

    struct SwapData {
        SwapType swapType;
        address extRouter;
        bytes extCalldata;
        bool needScale;
    }

    enum SwapType {
        NONE,
        KYBERSWAP,
        ONE_INCH,
        // ETH_WETH not used in Aggregator
        ETH_WETH
    }

    struct LimitOrderData {
        address limitRouter;
        uint256 epsSkipMarket; // only used for swap operations, will be ignored otherwise
        FillOrderParams[] normalFills;
        FillOrderParams[] flashFills;
        bytes optData;
    }

    struct FillOrderParams {
        Order order;
        bytes signature;
        uint256 makingAmount;
    }

    struct Order {
        uint256 salt;
        uint256 expiry;
        uint256 nonce;
        OrderType orderType;
        address token;
        address YT;
        address maker;
        address receiver;
        uint256 makingAmount;
        uint256 lnImpliedRate;
        uint256 failSafeRate;
        bytes permit;
    }

    enum OrderType {
        SY_FOR_PT,
        PT_FOR_SY,
        SY_FOR_YT,
        YT_FOR_SY
    }

    // ========================================= EIGEN LAYER =========================================

    struct QueuedWithdrawalParams {
        // Array of strategies that the QueuedWithdrawal contains
        address[] strategies;
        // Array containing the amount of shares in each Strategy in the `strategies` array
        uint256[] shares;
        // The address of the withdrawer
        address withdrawer;
    }

    struct Withdrawal {
        // The address that originated the Withdrawal
        address staker;
        // The address that the staker was delegated to at the time that the Withdrawal was created
        address delegatedTo;
        // The address that can complete the Withdrawal + will receive funds when completing the withdrawal
        address withdrawer;
        // Nonce used to guarantee that otherwise identical withdrawals have unique hashes
        uint256 nonce;
        // Block number when the Withdrawal was created
        uint32 startBlock;
        // Array of strategies that the Withdrawal contains
        address[] strategies;
        // Array containing the amount of shares in each Strategy in the `strategies` array
        uint256[] shares;
    }

    struct SignatureWithExpiry {
        // the signature itself, formatted as a single bytes object
        bytes signature;
        // the expiration timestamp (UTC) of the signature
        uint256 expiry;
    }

    struct EarnerTreeMerkleLeaf {
        address earner;
        bytes32 earnerTokenRoot;
    }

    struct TokenTreeMerkleLeaf {
        address token;
        uint256 cumulativeEarnings;
    }

    struct RewardsMerkleClaim {
        uint32 rootIndex;
        uint32 earnerIndex;
        bytes earnerTreeProof;
        EarnerTreeMerkleLeaf earnerLeaf;
        uint32[] tokenIndices;
        bytes[] tokenTreeProofs;
        TokenTreeMerkleLeaf[] tokenLeaves;
    }

    // ========================================= CCIP =========================================

    // If extraArgs is empty bytes, the default is 200k gas limit.
    struct EVM2AnyMessage {
        bytes receiver; // abi.encode(receiver address) for dest EVM chains
        bytes data; // Data payload
        EVMTokenAmount[] tokenAmounts; // Token transfers
        address feeToken; // Address of feeToken. address(0) means you will send msg.value.
        bytes extraArgs; // Populate this with _argsToBytes(EVMExtraArgsV2)
    }

    /// @dev RMN depends on this struct, if changing, please notify the RMN maintainers.
    struct EVMTokenAmount {
        address token; // token address on the local chain.
        uint256 amount; // Amount of tokens.
    }

    struct EVMExtraArgsV1 {
        uint256 gasLimit;
    }

    // ========================================= OFT =========================================

    struct SendParam {
        uint32 dstEid; // Destination endpoint ID.
        bytes32 to; // Recipient address.
        uint256 amountLD; // Amount to send in local decimals.
        uint256 minAmountLD; // Minimum amount to send in local decimals.
        bytes extraOptions; // Additional options supplied by the caller to be used in the LayerZero message.
        bytes composeMsg; // The composed message for the send() operation.
        bytes oftCmd; // The OFT command to be executed, unused in default OFT implementations.
    }

    struct MessagingFee {
        uint256 nativeFee;
        uint256 lzTokenFee;
    }
    // ========================================= L1StandardBridge =========================================

    struct WithdrawalTransaction {
        uint256 nonce;
        address sender;
        address target;
        uint256 value;
        uint256 gasLimit;
        bytes data;
    }

    struct OutputRootProof {
        bytes32 version;
        bytes32 stateRoot;
        bytes32 messagePasserStorageRoot;
        bytes32 latestBlockhash;
    }

    // ========================================= Mantle L1StandardBridge =========================================

    struct MantleWithdrawalTransaction {
        uint256 nonce;
        address sender;
        address target;
        uint256 mntValue;
        uint256 value;
        uint256 gasLimit;
        bytes data;
    }

    // ========================================= Linea Bridge =========================================

    struct ClaimMessageWithProofParams {
        bytes32[] proof;
        uint256 messageNumber;
        uint32 leafIndex;
        address from;
        address to;
        uint256 fee;
        uint256 value;
        address payable feeRecipient;
        bytes32 merkleRoot;
        bytes data;
    }

    // ========================================= Scroll Bridge =========================================

    struct L2MessageProof {
        uint256 batchIndex;
        bytes merkleProof;
    }

    // ========================================= Camelot V3 =========================================

    struct CamelotMintParams {
        address token0;
        address token1;
        int24 tickLower;
        int24 tickUpper;
        uint256 amount0Desired;
        uint256 amount1Desired;
        uint256 amount0Min;
        uint256 amount1Min;
        address recipient;
        uint256 deadline;
    }
    // ========================================= Velodrome V3 =========================================

    struct VelodromeMintParams {
        address token0;
        address token1;
        int24 tickSpacing;
        int24 tickLower;
        int24 tickUpper;
        uint256 amount0Desired;
        uint256 amount1Desired;
        uint256 amount0Min;
        uint256 amount1Min;
        address recipient;
        uint256 deadline;
        uint160 sqrtPriceX96;
    }

    // ========================================= Karak =========================================

    struct QueuedWithdrawal {
        address staker;
        address delegatedTo;
        uint256 nonce;
        uint256 start;
        WithdrawRequest request;
    }

    struct WithdrawRequest {
        address[] vaults;
        uint256[] shares;
        address withdrawer;
    }

    // ========================================= Term Finance ==================================

    /// @dev TermAuctionOfferSubmission represents an offer submission to offeror an amount of money for a specific interest rate
    struct TermAuctionOfferSubmission {
        /// @dev For an existing offer this is the unique onchain identifier for this offer. For a new offer this is a randomized input that will be used to generate the unique onchain identifier.
        bytes32 id;
        /// @dev The address of the offeror
        address offeror;
        /// @dev Hash of the offered price as a percentage of the initial loaned amount vs amount returned at maturity. This stores 9 decimal places
        bytes32 offerPriceHash;
        /// @dev The maximum amount of purchase tokens that can be lent
        uint256 amount;
        /// @dev The address of the ERC20 purchase token
        address purchaseToken;
    }

    // ========================================= Dolomite Finance ==================================

    enum BalanceCheckFlag {
        Both,
        From,
        To,
        None
    }

    // ========================================= Silo Finance ==================================
    /// @dev There are 2 types of accounting in the system: for non-borrowable collateral deposit called "protected" and
    ///      for borrowable collateral deposit called "collateral". System does
    ///      identical calculations for each type of accounting but it uses different data. To avoid code duplication
    ///      this enum is used to decide which data should be read.
    enum CollateralType {
        Protected, // default
        Collateral
    }

    enum ActionType {
        Deposit,
        Mint,
        Repay,
        RepayShares
    }

    struct Action {
        // what do you want to do?
        uint8 actionType;
        // which Silo are you interacting with?
        address silo;
        // what asset do you want to use?
        address asset;
        // options specific for actions
        bytes options;
    }

    struct AnyAction {
        // how much assets or shares do you want to use?
        uint256 amount;
        // are you using Protected, Collateral
        uint8 assetType;
    }

    // ========================================= LBTC Bridge ==================================
    struct DepositBridgeAction {
        uint256 fromChain;
        bytes32 fromContract;
        uint256 toChain;
        address toContract;
        address recipient;
        uint64 amount;
        uint256 nonce;
    }

    // ========================================= Odos ==================================
    
    struct swapTokenInfo {
        address inputToken;
        uint256 inputAmount;
        address inputReceiver;
        address outputToken;
        uint256 outputQuote;
        uint256 outputMin;
        address outputReceiver;
    }
    // ========================================= Level ==================================
    
    /// @dev for reference 
    //enum OrderType {
    //    MINT,
    //    REDEEM
    //}
    
    struct LevelOrder {
        uint8 order_type;
        address benefactor;
        address beneficiary;
        address collateral_asset;
        uint256 collateral_amount;
        uint256 lvlusd_amount;
    }    

    struct Route {
        address[] addresses;
        uint256[] ratios;
    }
}

// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.21;

// Swell
interface INonFungiblePositionManager {
    struct Position {
        // the nonce for permits
        uint96 nonce;
        // the address that is approved for spending this token
        address operator;
        // the ID of the pool with which this token is connected
        uint80 poolId;
        // the tick range of the position
        int24 tickLower;
        int24 tickUpper;
        // the liquidity of the position
        uint128 liquidity;
        // the fee growth of the aggregate position as of the last action on the individual position
        uint256 feeGrowthInside0LastX128;
        uint256 feeGrowthInside1LastX128;
        // how many uncollected tokens are owed to the position, as of the last computation
        uint128 tokensOwed0;
        uint128 tokensOwed1;
    }

    function ownerOf(uint256 tokenId) external view returns (address);
    function positions(uint256 tokenId)
        external
        view
        returns (
            uint96 nonce,
            address operator,
            address token0,
            address token1,
            uint24 fee,
            int24 tickLower,
            int24 tickUpper,
            uint128 liquidity,
            uint256 feeGrowthInside0LastX128,
            uint256 feeGrowthInside1LastX128,
            uint128 tokensOwed0,
            uint128 tokensOwed1
        );
}

interface PancakeSwapV3MasterChef {
    function userPositionInfos(uint256 id)
        external
        view
        returns (
            uint128 liquidity,
            uint128 boostLiquidity,
            int24 tickLower,
            int24 tickUpper,
            uint256 rewardsGrowthInside,
            uint256 reward,
            address user,
            uint256 pid,
            uint256 boostMultiplier
        );
}

interface CamelotNonFungiblePositionManager {
    function ownerOf(uint256 tokenId) external view returns (address);
    function positions(uint256 tokenId)
        external
        view
        returns (
            uint96 nonce,
            address operator,
            address token0,
            address token1,
            int24 tickLower,
            int24 tickUpper,
            uint128 liquidity,
            uint256 feeGrowthInside0LastX128,
            uint256 feeGrowthInside1LastX128,
            uint128 tokensOwed0,
            uint128 tokensOwed1
        );
}

interface IRecipeMarketHub {
    function offerHashToIPOffer(bytes32 offer)
        external
        view
        returns (uint256, bytes32, address, uint256, uint256, uint256);
}

interface IPoolRegistry {
    function poolInfo(uint256 _pid) external view returns (address, address, address, address, uint8); 
}

Settings
{
  "remappings": [
    "@solmate/=lib/solmate/src/",
    "@forge-std/=lib/forge-std/src/",
    "@ds-test/=lib/forge-std/lib/ds-test/src/",
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "@openzeppelin/=lib/openzeppelin-contracts/",
    "@ccip/=lib/ccip/",
    "@oapp-auth/=lib/OAppAuth/src/",
    "@devtools-oapp-evm/=lib/OAppAuth/lib/devtools/packages/oapp-evm/contracts/oapp/",
    "@layerzerolabs/lz-evm-messagelib-v2/=lib/OAppAuth/node_modules/@layerzerolabs/lz-evm-messagelib-v2/",
    "@layerzerolabs/lz-evm-protocol-v2/=lib/OAppAuth/lib/LayerZero-V2/packages/layerzero-v2/evm/protocol/",
    "@layerzerolabs/oapp-evm/=lib/OAppAuth/lib/devtools/packages/oapp-evm/",
    "@lz-oapp-evm/=lib/OAppAuth/lib/LayerZero-V2/packages/layerzero-v2/evm/oapp/contracts/oapp/",
    "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
    "LayerZero-V2/=lib/OAppAuth/lib/",
    "OAppAuth/=lib/OAppAuth/",
    "ccip/=lib/ccip/contracts/",
    "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
    "forge-std/=lib/forge-std/src/",
    "halmos-cheatcodes/=lib/OAppAuth/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/",
    "solidity-bytes-utils/=lib/OAppAuth/node_modules/solidity-bytes-utils/",
    "solmate/=lib/solmate/src/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "shanghai",
  "viaIR": false,
  "libraries": {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_uniswapV3NonFungiblePositionManager","type":"address"},{"internalType":"address","name":"_odosRouter","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"BaseDecoderAndSanitizer__FunctionSelectorNotSupported","type":"error"},{"inputs":[],"name":"OFTDecoderAndSanitizer__NonZeroMessage","type":"error"},{"inputs":[],"name":"OFTDecoderAndSanitizer__NonZeroOFTCommand","type":"error"},{"inputs":[],"name":"OneInchDecoderAndSanitizer__PermitNotSupported","type":"error"},{"inputs":[],"name":"UniswapV3DecoderAndSanitizer__BadPathFormat","type":"error"},{"inputs":[],"name":"UniswapV3DecoderAndSanitizer__BadTokenId","type":"error"},{"stateMutability":"nonpayable","type":"fallback"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"address","name":"onBehalfOf","type":"address"}],"name":"borrow","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"depositAsset","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"bulkDeposit","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"withdrawAsset","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"bulkWithdraw","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"feeAsset","type":"address"}],"name":"claimFees","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"claimRewards","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"claimWithdraw","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"claimWithdrawal","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"name":"claimWithdrawals","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"yieldAsset","type":"address"}],"name":"claimYield","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint128","name":"amount0Max","type":"uint128"},{"internalType":"uint128","name":"amount1Max","type":"uint128"}],"internalType":"struct DecoderCustomTypes.CollectParams","name":"params","type":"tuple"}],"name":"collect","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint128","name":"liquidity","type":"uint128"},{"internalType":"uint256","name":"amount0Min","type":"uint256"},{"internalType":"uint256","name":"amount1Min","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct DecoderCustomTypes.DecreaseLiquidityParams","name":"params","type":"tuple"}],"name":"decreaseLiquidity","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"depositAsset","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"deposit","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"deposit","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"receiver_","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"deposit","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"deposit","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"bytes","name":"path","type":"bytes"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMinimum","type":"uint256"}],"internalType":"struct DecoderCustomTypes.ExactInputParams","name":"params","type":"tuple"}],"name":"exactInput","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount0Desired","type":"uint256"},{"internalType":"uint256","name":"amount1Desired","type":"uint256"},{"internalType":"uint256","name":"amount0Min","type":"uint256"},{"internalType":"uint256","name":"amount1Min","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct DecoderCustomTypes.IncreaseLiquidityParams","name":"params","type":"tuple"}],"name":"increaseLiquidity","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"receiver_","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"token0","type":"address"},{"internalType":"address","name":"token1","type":"address"},{"internalType":"uint24","name":"fee","type":"uint24"},{"internalType":"int24","name":"tickLower","type":"int24"},{"internalType":"int24","name":"tickUpper","type":"int24"},{"internalType":"uint256","name":"amount0Desired","type":"uint256"},{"internalType":"uint256","name":"amount1Desired","type":"uint256"},{"internalType":"uint256","name":"amount0Min","type":"uint256"},{"internalType":"uint256","name":"amount1Min","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct DecoderCustomTypes.MintParams","name":"params","type":"tuple"}],"name":"mint","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"mint","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"receiver_","type":"address"},{"internalType":"address","name":"owner_","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"redeem","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"redeem","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"onBehalfOf","type":"address"}],"name":"repay","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint128","name":"","type":"uint128"},{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint24","name":"","type":"uint24"}],"name":"requestOnChainWithdraw","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"requestWithdraw","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"address","name":"_owner","type":"address"}],"name":"requestWithdrawals","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"dstEid","type":"uint32"},{"internalType":"bytes32","name":"to","type":"bytes32"},{"internalType":"uint256","name":"amountLD","type":"uint256"},{"internalType":"uint256","name":"minAmountLD","type":"uint256"},{"internalType":"bytes","name":"extraOptions","type":"bytes"},{"internalType":"bytes","name":"composeMsg","type":"bytes"},{"internalType":"bytes","name":"oftCmd","type":"bytes"}],"internalType":"struct DecoderCustomTypes.SendParam","name":"_sendParam","type":"tuple"},{"components":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"lzTokenFee","type":"uint256"}],"internalType":"struct DecoderCustomTypes.MessagingFee","name":"","type":"tuple"},{"internalType":"address","name":"_refundAddress","type":"address"}],"name":"send","outputs":[{"internalType":"bytes","name":"sensitiveArguments","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"setUserEMode","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"bool","name":"","type":"bool"}],"name":"setUserUseReserveAsCollateral","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"referral","type":"address"}],"name":"submit","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"onBehalfOf","type":"address"},{"internalType":"uint16","name":"","type":"uint16"}],"name":"supply","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"executor","type":"address"},{"components":[{"internalType":"address","name":"srcToken","type":"address"},{"internalType":"address","name":"dstToken","type":"address"},{"internalType":"address payable","name":"srcReceiver","type":"address"},{"internalType":"address payable","name":"dstReceiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minReturnAmount","type":"uint256"},{"internalType":"uint256","name":"flags","type":"uint256"}],"internalType":"struct DecoderCustomTypes.SwapDescription","name":"desc","type":"tuple"},{"internalType":"bytes","name":"permit","type":"bytes"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"swap","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"inputToken","type":"address"},{"internalType":"uint256","name":"inputAmount","type":"uint256"},{"internalType":"address","name":"inputReceiver","type":"address"},{"internalType":"address","name":"outputToken","type":"address"},{"internalType":"uint256","name":"outputQuote","type":"uint256"},{"internalType":"uint256","name":"outputMin","type":"uint256"},{"internalType":"address","name":"outputReceiver","type":"address"}],"internalType":"struct DecoderCustomTypes.swapTokenInfo","name":"tokenInfo","type":"tuple"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"address","name":"executor","type":"address"},{"internalType":"uint32","name":"","type":"uint32"}],"name":"swap","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"swapCompact","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256[]","name":"pools","type":"uint256[]"}],"name":"uniswapV3Swap","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"unwrap","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"withdraw","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"receiver_","type":"address"},{"internalType":"address","name":"owner_","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"withdraw","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"withdrawNativeFromDrone","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"withdrawNonBoringToken","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"wrap","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"}]

60c060405234801562000010575f80fd5b5060405162001d5338038062001d53833981016040819052620000339162000067565b6001600160a01b039182166080521660a0526200009d565b80516001600160a01b038116811462000062575f80fd5b919050565b5f806040838503121562000079575f80fd5b62000084836200004b565b915062000094602084016200004b565b90509250929050565b60805160a051611c71620000e25f395f8181610b5901528181610bf90152610c9c01525f8181610508015281816106a001528181610738015261101b0152611c715ff3fe608060405234801561000f575f80fd5b5060043610610288575f3560e01c806394bf804d1161015a578063bc157ac1116100cc578063de0e9a3e11610085578063de0e9a3e14610350578063e3afe0a314610485578063e449022e1461049d578063ea598cb014610350578063f844443614610350578063fc6f7865146104b057610288565b8063bc157ac1146103de578063c04b8d5914610445578063c7c7f5b314610458578063d0e30db01461046b578063d668104214610472578063da3ef9d21461046b57610288565b8063a318c1a41161011e578063a318c1a41461040c578063a415bcad1461041f578063a9059cbb146102a1578063b13acedd14610350578063b460af9414610432578063ba0876521461043257610288565b806394bf804d146103cb578063999927df146103035780639d574420146103715780639f40a7b31461040c578063a1903eab1461030357610288565b80633b635ce4116101fe57806369328dec116101b757806369328dec146103a55780636bb3b476146103b85780636e553f65146103cb578063836a1040146103de57806383bd37f9146103f157806388316456146103f957610288565b80633b635ce41461035e5780633e64ce991461037157806342966c6814610350578063573ade81146103715780635a3b74b914610384578063617ba0371461039257610288565b806315a0ea6a1161025057806315a0ea6a14610303578063219f5d1714610316578063236300dc1461032957806328530a471461033c5780632e1a7d4d14610350578063397a1b28146102a157610288565b8063095ea7b3146102a157806309f0e0c2146102a15780630c49ccbe146102ca5780630efe6a8b146102dd57806312aa3caf146102f0575b604051633790be8760e21b815260040160405180910390fd5b6102b46102af3660046110d7565b6104c3565b6040516102c19190611123565b60405180910390f35b6102b46102d836600461116b565b6104ed565b6102b46102eb36600461118c565b6105a3565b6102b46102fe366004611213565b6105ce565b6102b46103113660046112a4565b61065c565b6102b46103243660046112bf565b610685565b6102b4610337366004611310565b610813565b6102b461034a36600461137f565b50606090565b6102b461034a36600461139f565b6102b461036c3660046113c9565b610840565b6102b461037f3660046114cf565b61086a565b6102b46102af366004611516565b6102b46103a0366004611562565b610898565b6102b46103b33660046115b0565b6108ad565b6102b46103c636600461161c565b6108c2565b6102b46103d9366004611668565b6108d5565b6102b46103ec36600461168b565b6108e8565b6102b46108fb565b6102b46104073660046116c0565b610d50565b6102b461041a3660046116d1565b610db3565b6102b461042d366004611716565b610dc8565b6102b4610440366004611761565b610ddd565b6102b4610453366004611795565b610df2565b6102b46104663660046117cf565b610eda565b60606102b4565b6102b461048036600461182d565b610f8b565b6102b4610493366004611875565b6060949350505050565b6102b46104ab3660046118dc565b610f9e565b6102b46104be36600461191f565b611000565b6060826040516020016104d6919061192f565b604051602081830303815290604052905092915050565b6040516331a9108f60e11b8152813560048201526060905f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690636352211e90602401602060405180830381865afa158015610555573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105799190611952565b90508060405160200161058c919061192f565b604051602081830303815290604052915050919050565b6060836040516020016105b6919061192f565b60405160208183030381529060405290509392505050565b606083156105ef5760405163aa8bfebd60e01b815260040160405180910390fd5b866105fd60208801886112a4565b61060d6040890160208a016112a4565b61061d60608a0160408b016112a4565b61062d60808b0160608c016112a4565b60405160200161064195949392919061196d565b60405160208183030381529060405290509695505050505050565b60608160405160200161066f919061192f565b6040516020818303038152906040529050919050565b6040516331a9108f60e11b8152813560048201526060905f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690636352211e90602401602060405180830381865afa1580156106ed573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107119190611952565b60405163133f757160e31b8152843560048201529091505f90819081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906399fbab889060240161018060405180830381865afa15801561077e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107a291906119d3565b505050505050505093509350935050828282866040516020016107f99493929190606094851b6001600160601b0319908116825293851b8416601482015291841b8316602883015290921b16603c82015260500190565b604051602081830303815290604052945050505050919050565b606082604051602001610826919061192f565b604051602081830303815290604052905095945050505050565b6060855f0151866040015187606001518860c001518660405160200161082695949392919061196d565b6060848260405160200161087f929190611aac565b6040516020818303038152906040529050949350505050565b6060848360405160200161087f929190611aac565b606083826040516020016105b6929190611aac565b60608460405160200161087f919061192f565b6060816040516020016104d6919061192f565b6060826040516020016105b6919061192f565b6040805160e0810182525f8082526020820181905291810182905260608181018390526080820183905260a0820183905260c08201929092525f80365f61095560405180604001604052805f81526020015f151581525090565b604080518082019091525f8082526020820152604080518082019091525f8082526020820152336109d8565b5f80823560f01c8080156109ac57600181146109ba576002600160a01b0393506002850192506109d1565b5f93506002850192506109d1565b6001600160a01b03853560501c1693506016850192505b5050915091565b5f60046109e481610981565b915091506002600160a01b038203610a0b576001198082013560f01c018652600160208701525b818b52610a1781610981565b915091506002600160a01b038203610a3e576001198082013560f01c018552600160208601525b60608b0182905260018101903560f81c8015610a69578135600882602003021c60208d015280820191505b50803560f81c6001820191508135600882602003021c8060808e01528183019250823560e81c915062ffffff8262ffffff0382020460a08e01525050600381019050610ab481610981565b915091506002600160a01b038203610adb576001198082013560f01c018452600160208501525b819950610ae781610981565b909250905081610af5578991505b8160408c0152610b0481610981565b909250905081610b12578291505b60c08b0191909152602085810151823560e01c995060058301985060049092013560f81c029550159050610bd657825160405163b810fb4360e01b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b810fb4390602401602060405180830381865afa158015610ba6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bca9190611952565b6001600160a01b031688525b816020015115610c7957815160405163b810fb4360e01b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b810fb4390602401602060405180830381865afa158015610c46573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c6a9190611952565b6001600160a01b031660608901525b806020015115610d1057805160405163b810fb4360e01b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b810fb4390602401602060405180830381865afa158015610ce9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d0d9190611952565b96505b87516040808a015160608b015160c08c01519251610d349493908c9060200161196d565b6040516020818303038152906040529850505050505050505090565b6060610d5f60208301836112a4565b610d6f60408401602085016112a4565b610d81610140850161012086016112a4565b6040516001600160601b0319606094851b8116602083015292841b83166034820152921b166048820152605c0161066f565b6060838360405160200161087f929190611aac565b60608582604051602001610826929190611aac565b606082826040516020016105b6929190611aac565b606060175f610e018480611ace565b9150610e0f90508282611b25565b601414610e2f57604051633e8c06ad60e01b815260040160405180910390fd5b5f610e3a8383611b4c565b610e45906001611b5f565b90505f805b82811015610eb75785610e5d8880611ace565b8490610e6a826014611b5f565b92610e7793929190611b78565b604051602001610e8993929190611b9f565b60408051601f198184030181529190529550610ea58583611b5f565b9150610eb081611bc5565b9050610e4a565b5084610ec960408801602089016112a4565b6040516020016107f9929190611bdd565b60605f610eea60a0860186611ace565b90501115610f0b57604051633483a65b60e11b815260040160405180910390fd5b5f610f1960c0860186611ace565b90501115610f3a57604051630d90fb5b60e21b815260040160405180910390fd5b610f476020850185611c0e565b60405163ffffffff60601b606092831b166020828101919091526001600160601b031990870135831b811660348301529184901b9091166048820152605c016105b6565b6060816040516020016105b6919061192f565b60605f5b82811015610ff75781848483818110610fbd57610fbd611c27565b90506020020135604051602001610fd5929190611bdd565b604051602081830303815290604052915080610ff090611bc5565b9050610fa2565b50949350505050565b6040516331a9108f60e11b8152813560048201526060905f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690636352211e90602401602060405180830381865afa158015611068573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061108c9190611952565b905061109e60408401602085016112a4565b8160405160200161058c929190611aac565b6001600160a01b03811681146110c4575f80fd5b50565b80356110d2816110b0565b919050565b5f80604083850312156110e8575f80fd5b82356110f3816110b0565b946020939093013593505050565b5f5b8381101561111b578181015183820152602001611103565b50505f910152565b602081525f8251806020840152611141816040850160208701611101565b601f01601f19169190910160400192915050565b5f60a08284031215611165575f80fd5b50919050565b5f60a0828403121561117b575f80fd5b6111858383611155565b9392505050565b5f805f6060848603121561119e575f80fd5b83356111a9816110b0565b95602085013595506040909401359392505050565b5f60e08284031215611165575f80fd5b5f8083601f8401126111de575f80fd5b50813567ffffffffffffffff8111156111f5575f80fd5b60208301915083602082850101111561120c575f80fd5b9250929050565b5f805f805f806101408789031215611229575f80fd5b8635611234816110b0565b955061124388602089016111be565b945061010087013567ffffffffffffffff80821115611260575f80fd5b61126c8a838b016111ce565b9096509450610120890135915080821115611285575f80fd5b5061129289828a016111ce565b979a9699509497509295939492505050565b5f602082840312156112b4575f80fd5b8135611185816110b0565b5f60c08284031215611165575f80fd5b5f8083601f8401126112df575f80fd5b50813567ffffffffffffffff8111156112f6575f80fd5b6020830191508360208260051b850101111561120c575f80fd5b5f805f805f60808688031215611324575f80fd5b853567ffffffffffffffff81111561133a575f80fd5b611346888289016112cf565b909650945050602086013592506040860135611361816110b0565b91506060860135611371816110b0565b809150509295509295909350565b5f6020828403121561138f575f80fd5b813560ff81168114611185575f80fd5b5f602082840312156113af575f80fd5b5035919050565b803563ffffffff811681146110d2575f80fd5b5f805f805f8587036101408112156113df575f80fd5b60e08112156113ec575f80fd5b5060405160e0810167ffffffffffffffff828210818311171561141d57634e487b7160e01b5f52604160045260245ffd5b8160405261142a896110c7565b83526020890135602084015261144260408a016110c7565b604084015261145360608a016110c7565b60608401526080890135608084015260a089013560a084015261147860c08a016110c7565b60c084015291965060e08801359180831115611492575f80fd5b50506114a0888289016111ce565b90955093506114b4905061010087016110c7565b91506114c361012087016113b6565b90509295509295909350565b5f805f80608085870312156114e2575f80fd5b84356114ed816110b0565b93506020850135925060408501359150606085013561150b816110b0565b939692955090935050565b5f8060408385031215611527575f80fd5b8235611532816110b0565b915060208301358015158114611546575f80fd5b809150509250929050565b803561ffff811681146110d2575f80fd5b5f805f8060808587031215611575575f80fd5b8435611580816110b0565b9350602085013592506040850135611597816110b0565b91506115a560608601611551565b905092959194509250565b5f805f606084860312156115c2575f80fd5b83356115cd816110b0565b92506020840135915060408401356115e4816110b0565b809150509250925092565b6fffffffffffffffffffffffffffffffff811681146110c4575f80fd5b62ffffff811681146110c4575f80fd5b5f805f806080858703121561162f575f80fd5b843561163a816110b0565b9350602085013561164a816115ef565b925061165860408601611551565b9150606085013561150b8161160c565b5f8060408385031215611679575f80fd5b823591506020830135611546816110b0565b5f805f6060848603121561169d575f80fd5b8335925060208401356116af816110b0565b929592945050506040919091013590565b5f6101608284031215611165575f80fd5b5f805f80608085870312156116e4575f80fd5b8435935060208501356116f6816110b0565b92506040850135611706816110b0565b9396929550929360600135925050565b5f805f805f60a0868803121561172a575f80fd5b8535611735816110b0565b9450602086013593506040860135925061175160608701611551565b91506080860135611371816110b0565b5f805f60608486031215611773575f80fd5b833592506020840135611785816110b0565b915060408401356115e4816110b0565b5f602082840312156117a5575f80fd5b813567ffffffffffffffff8111156117bb575f80fd5b6117c784828501611155565b949350505050565b5f805f83850360808112156117e2575f80fd5b843567ffffffffffffffff8111156117f8575f80fd5b611804878288016111be565b9450506040601f1982011215611818575f80fd5b5060208401915060608401356115e4816110b0565b5f805f6040848603121561183f575f80fd5b833567ffffffffffffffff811115611855575f80fd5b611861868287016112cf565b90945092505060208401356115e4816110b0565b5f805f8060408587031215611888575f80fd5b843567ffffffffffffffff8082111561189f575f80fd5b6118ab888389016112cf565b909650945060208701359150808211156118c3575f80fd5b506118d0878288016112cf565b95989497509550505050565b5f805f80606085870312156118ef575f80fd5b8435935060208501359250604085013567ffffffffffffffff811115611913575f80fd5b6118d0878288016112cf565b5f60808284031215611165575f80fd5b60609190911b6001600160601b031916815260140190565b80516110d2816110b0565b5f60208284031215611962575f80fd5b8151611185816110b0565b6001600160601b0319606096871b8116825294861b8516601482015292851b8416602884015290841b8316603c83015290921b16605082015260640190565b80516110d28161160c565b8051600281900b81146110d2575f80fd5b80516110d2816115ef565b5f805f805f805f805f805f806101808d8f0312156119ef575f80fd5b8c516bffffffffffffffffffffffff81168114611a0a575f80fd5b9b50611a1860208e01611947565b9a50611a2660408e01611947565b9950611a3460608e01611947565b9850611a4260808e016119ac565b9750611a5060a08e016119b7565b9650611a5e60c08e016119b7565b9550611a6c60e08e016119c8565b94506101008d015193506101208d01519250611a8b6101408e016119c8565b9150611a9a6101608e016119c8565b90509295989b509295989b509295989b565b6001600160601b0319606093841b811682529190921b16601482015260280190565b5f808335601e19843603018112611ae3575f80fd5b83018035915067ffffffffffffffff821115611afd575f80fd5b60200191503681900382131561120c575f80fd5b634e487b7160e01b5f52601260045260245ffd5b5f82611b3357611b33611b11565b500690565b634e487b7160e01b5f52601160045260245ffd5b5f82611b5a57611b5a611b11565b500490565b80820180821115611b7257611b72611b38565b92915050565b5f8085851115611b86575f80fd5b83861115611b92575f80fd5b5050820193919092039150565b5f8451611bb0818460208901611101565b8201838582375f930192835250909392505050565b5f60018201611bd657611bd6611b38565b5060010190565b5f8351611bee818460208801611101565b60609390931b6001600160601b0319169190920190815260140192915050565b5f60208284031215611c1e575f80fd5b611185826113b6565b634e487b7160e01b5f52603260045260245ffdfea264697066735822122042f34e0794ec4a7a064408b36cebc99ffe1d5846b691a1bfb9d72e82119680da64736f6c63430008150033000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe88000000000000000000000000cf5540fffcdc3d510b18bfca6d2b9987b0772559

Deployed Bytecode

0x608060405234801561000f575f80fd5b5060043610610288575f3560e01c806394bf804d1161015a578063bc157ac1116100cc578063de0e9a3e11610085578063de0e9a3e14610350578063e3afe0a314610485578063e449022e1461049d578063ea598cb014610350578063f844443614610350578063fc6f7865146104b057610288565b8063bc157ac1146103de578063c04b8d5914610445578063c7c7f5b314610458578063d0e30db01461046b578063d668104214610472578063da3ef9d21461046b57610288565b8063a318c1a41161011e578063a318c1a41461040c578063a415bcad1461041f578063a9059cbb146102a1578063b13acedd14610350578063b460af9414610432578063ba0876521461043257610288565b806394bf804d146103cb578063999927df146103035780639d574420146103715780639f40a7b31461040c578063a1903eab1461030357610288565b80633b635ce4116101fe57806369328dec116101b757806369328dec146103a55780636bb3b476146103b85780636e553f65146103cb578063836a1040146103de57806383bd37f9146103f157806388316456146103f957610288565b80633b635ce41461035e5780633e64ce991461037157806342966c6814610350578063573ade81146103715780635a3b74b914610384578063617ba0371461039257610288565b806315a0ea6a1161025057806315a0ea6a14610303578063219f5d1714610316578063236300dc1461032957806328530a471461033c5780632e1a7d4d14610350578063397a1b28146102a157610288565b8063095ea7b3146102a157806309f0e0c2146102a15780630c49ccbe146102ca5780630efe6a8b146102dd57806312aa3caf146102f0575b604051633790be8760e21b815260040160405180910390fd5b6102b46102af3660046110d7565b6104c3565b6040516102c19190611123565b60405180910390f35b6102b46102d836600461116b565b6104ed565b6102b46102eb36600461118c565b6105a3565b6102b46102fe366004611213565b6105ce565b6102b46103113660046112a4565b61065c565b6102b46103243660046112bf565b610685565b6102b4610337366004611310565b610813565b6102b461034a36600461137f565b50606090565b6102b461034a36600461139f565b6102b461036c3660046113c9565b610840565b6102b461037f3660046114cf565b61086a565b6102b46102af366004611516565b6102b46103a0366004611562565b610898565b6102b46103b33660046115b0565b6108ad565b6102b46103c636600461161c565b6108c2565b6102b46103d9366004611668565b6108d5565b6102b46103ec36600461168b565b6108e8565b6102b46108fb565b6102b46104073660046116c0565b610d50565b6102b461041a3660046116d1565b610db3565b6102b461042d366004611716565b610dc8565b6102b4610440366004611761565b610ddd565b6102b4610453366004611795565b610df2565b6102b46104663660046117cf565b610eda565b60606102b4565b6102b461048036600461182d565b610f8b565b6102b4610493366004611875565b6060949350505050565b6102b46104ab3660046118dc565b610f9e565b6102b46104be36600461191f565b611000565b6060826040516020016104d6919061192f565b604051602081830303815290604052905092915050565b6040516331a9108f60e11b8152813560048201526060905f907f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe886001600160a01b031690636352211e90602401602060405180830381865afa158015610555573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105799190611952565b90508060405160200161058c919061192f565b604051602081830303815290604052915050919050565b6060836040516020016105b6919061192f565b60405160208183030381529060405290509392505050565b606083156105ef5760405163aa8bfebd60e01b815260040160405180910390fd5b866105fd60208801886112a4565b61060d6040890160208a016112a4565b61061d60608a0160408b016112a4565b61062d60808b0160608c016112a4565b60405160200161064195949392919061196d565b60405160208183030381529060405290509695505050505050565b60608160405160200161066f919061192f565b6040516020818303038152906040529050919050565b6040516331a9108f60e11b8152813560048201526060905f907f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe886001600160a01b031690636352211e90602401602060405180830381865afa1580156106ed573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107119190611952565b60405163133f757160e31b8152843560048201529091505f90819081906001600160a01b037f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe8816906399fbab889060240161018060405180830381865afa15801561077e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107a291906119d3565b505050505050505093509350935050828282866040516020016107f99493929190606094851b6001600160601b0319908116825293851b8416601482015291841b8316602883015290921b16603c82015260500190565b604051602081830303815290604052945050505050919050565b606082604051602001610826919061192f565b604051602081830303815290604052905095945050505050565b6060855f0151866040015187606001518860c001518660405160200161082695949392919061196d565b6060848260405160200161087f929190611aac565b6040516020818303038152906040529050949350505050565b6060848360405160200161087f929190611aac565b606083826040516020016105b6929190611aac565b60608460405160200161087f919061192f565b6060816040516020016104d6919061192f565b6060826040516020016105b6919061192f565b6040805160e0810182525f8082526020820181905291810182905260608181018390526080820183905260a0820183905260c08201929092525f80365f61095560405180604001604052805f81526020015f151581525090565b604080518082019091525f8082526020820152604080518082019091525f8082526020820152336109d8565b5f80823560f01c8080156109ac57600181146109ba576002600160a01b0393506002850192506109d1565b5f93506002850192506109d1565b6001600160a01b03853560501c1693506016850192505b5050915091565b5f60046109e481610981565b915091506002600160a01b038203610a0b576001198082013560f01c018652600160208701525b818b52610a1781610981565b915091506002600160a01b038203610a3e576001198082013560f01c018552600160208601525b60608b0182905260018101903560f81c8015610a69578135600882602003021c60208d015280820191505b50803560f81c6001820191508135600882602003021c8060808e01528183019250823560e81c915062ffffff8262ffffff0382020460a08e01525050600381019050610ab481610981565b915091506002600160a01b038203610adb576001198082013560f01c018452600160208501525b819950610ae781610981565b909250905081610af5578991505b8160408c0152610b0481610981565b909250905081610b12578291505b60c08b0191909152602085810151823560e01c995060058301985060049092013560f81c029550159050610bd657825160405163b810fb4360e01b815260048101919091527f000000000000000000000000cf5540fffcdc3d510b18bfca6d2b9987b07725596001600160a01b03169063b810fb4390602401602060405180830381865afa158015610ba6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bca9190611952565b6001600160a01b031688525b816020015115610c7957815160405163b810fb4360e01b815260048101919091527f000000000000000000000000cf5540fffcdc3d510b18bfca6d2b9987b07725596001600160a01b03169063b810fb4390602401602060405180830381865afa158015610c46573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c6a9190611952565b6001600160a01b031660608901525b806020015115610d1057805160405163b810fb4360e01b815260048101919091527f000000000000000000000000cf5540fffcdc3d510b18bfca6d2b9987b07725596001600160a01b03169063b810fb4390602401602060405180830381865afa158015610ce9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d0d9190611952565b96505b87516040808a015160608b015160c08c01519251610d349493908c9060200161196d565b6040516020818303038152906040529850505050505050505090565b6060610d5f60208301836112a4565b610d6f60408401602085016112a4565b610d81610140850161012086016112a4565b6040516001600160601b0319606094851b8116602083015292841b83166034820152921b166048820152605c0161066f565b6060838360405160200161087f929190611aac565b60608582604051602001610826929190611aac565b606082826040516020016105b6929190611aac565b606060175f610e018480611ace565b9150610e0f90508282611b25565b601414610e2f57604051633e8c06ad60e01b815260040160405180910390fd5b5f610e3a8383611b4c565b610e45906001611b5f565b90505f805b82811015610eb75785610e5d8880611ace565b8490610e6a826014611b5f565b92610e7793929190611b78565b604051602001610e8993929190611b9f565b60408051601f198184030181529190529550610ea58583611b5f565b9150610eb081611bc5565b9050610e4a565b5084610ec960408801602089016112a4565b6040516020016107f9929190611bdd565b60605f610eea60a0860186611ace565b90501115610f0b57604051633483a65b60e11b815260040160405180910390fd5b5f610f1960c0860186611ace565b90501115610f3a57604051630d90fb5b60e21b815260040160405180910390fd5b610f476020850185611c0e565b60405163ffffffff60601b606092831b166020828101919091526001600160601b031990870135831b811660348301529184901b9091166048820152605c016105b6565b6060816040516020016105b6919061192f565b60605f5b82811015610ff75781848483818110610fbd57610fbd611c27565b90506020020135604051602001610fd5929190611bdd565b604051602081830303815290604052915080610ff090611bc5565b9050610fa2565b50949350505050565b6040516331a9108f60e11b8152813560048201526060905f907f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe886001600160a01b031690636352211e90602401602060405180830381865afa158015611068573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061108c9190611952565b905061109e60408401602085016112a4565b8160405160200161058c929190611aac565b6001600160a01b03811681146110c4575f80fd5b50565b80356110d2816110b0565b919050565b5f80604083850312156110e8575f80fd5b82356110f3816110b0565b946020939093013593505050565b5f5b8381101561111b578181015183820152602001611103565b50505f910152565b602081525f8251806020840152611141816040850160208701611101565b601f01601f19169190910160400192915050565b5f60a08284031215611165575f80fd5b50919050565b5f60a0828403121561117b575f80fd5b6111858383611155565b9392505050565b5f805f6060848603121561119e575f80fd5b83356111a9816110b0565b95602085013595506040909401359392505050565b5f60e08284031215611165575f80fd5b5f8083601f8401126111de575f80fd5b50813567ffffffffffffffff8111156111f5575f80fd5b60208301915083602082850101111561120c575f80fd5b9250929050565b5f805f805f806101408789031215611229575f80fd5b8635611234816110b0565b955061124388602089016111be565b945061010087013567ffffffffffffffff80821115611260575f80fd5b61126c8a838b016111ce565b9096509450610120890135915080821115611285575f80fd5b5061129289828a016111ce565b979a9699509497509295939492505050565b5f602082840312156112b4575f80fd5b8135611185816110b0565b5f60c08284031215611165575f80fd5b5f8083601f8401126112df575f80fd5b50813567ffffffffffffffff8111156112f6575f80fd5b6020830191508360208260051b850101111561120c575f80fd5b5f805f805f60808688031215611324575f80fd5b853567ffffffffffffffff81111561133a575f80fd5b611346888289016112cf565b909650945050602086013592506040860135611361816110b0565b91506060860135611371816110b0565b809150509295509295909350565b5f6020828403121561138f575f80fd5b813560ff81168114611185575f80fd5b5f602082840312156113af575f80fd5b5035919050565b803563ffffffff811681146110d2575f80fd5b5f805f805f8587036101408112156113df575f80fd5b60e08112156113ec575f80fd5b5060405160e0810167ffffffffffffffff828210818311171561141d57634e487b7160e01b5f52604160045260245ffd5b8160405261142a896110c7565b83526020890135602084015261144260408a016110c7565b604084015261145360608a016110c7565b60608401526080890135608084015260a089013560a084015261147860c08a016110c7565b60c084015291965060e08801359180831115611492575f80fd5b50506114a0888289016111ce565b90955093506114b4905061010087016110c7565b91506114c361012087016113b6565b90509295509295909350565b5f805f80608085870312156114e2575f80fd5b84356114ed816110b0565b93506020850135925060408501359150606085013561150b816110b0565b939692955090935050565b5f8060408385031215611527575f80fd5b8235611532816110b0565b915060208301358015158114611546575f80fd5b809150509250929050565b803561ffff811681146110d2575f80fd5b5f805f8060808587031215611575575f80fd5b8435611580816110b0565b9350602085013592506040850135611597816110b0565b91506115a560608601611551565b905092959194509250565b5f805f606084860312156115c2575f80fd5b83356115cd816110b0565b92506020840135915060408401356115e4816110b0565b809150509250925092565b6fffffffffffffffffffffffffffffffff811681146110c4575f80fd5b62ffffff811681146110c4575f80fd5b5f805f806080858703121561162f575f80fd5b843561163a816110b0565b9350602085013561164a816115ef565b925061165860408601611551565b9150606085013561150b8161160c565b5f8060408385031215611679575f80fd5b823591506020830135611546816110b0565b5f805f6060848603121561169d575f80fd5b8335925060208401356116af816110b0565b929592945050506040919091013590565b5f6101608284031215611165575f80fd5b5f805f80608085870312156116e4575f80fd5b8435935060208501356116f6816110b0565b92506040850135611706816110b0565b9396929550929360600135925050565b5f805f805f60a0868803121561172a575f80fd5b8535611735816110b0565b9450602086013593506040860135925061175160608701611551565b91506080860135611371816110b0565b5f805f60608486031215611773575f80fd5b833592506020840135611785816110b0565b915060408401356115e4816110b0565b5f602082840312156117a5575f80fd5b813567ffffffffffffffff8111156117bb575f80fd5b6117c784828501611155565b949350505050565b5f805f83850360808112156117e2575f80fd5b843567ffffffffffffffff8111156117f8575f80fd5b611804878288016111be565b9450506040601f1982011215611818575f80fd5b5060208401915060608401356115e4816110b0565b5f805f6040848603121561183f575f80fd5b833567ffffffffffffffff811115611855575f80fd5b611861868287016112cf565b90945092505060208401356115e4816110b0565b5f805f8060408587031215611888575f80fd5b843567ffffffffffffffff8082111561189f575f80fd5b6118ab888389016112cf565b909650945060208701359150808211156118c3575f80fd5b506118d0878288016112cf565b95989497509550505050565b5f805f80606085870312156118ef575f80fd5b8435935060208501359250604085013567ffffffffffffffff811115611913575f80fd5b6118d0878288016112cf565b5f60808284031215611165575f80fd5b60609190911b6001600160601b031916815260140190565b80516110d2816110b0565b5f60208284031215611962575f80fd5b8151611185816110b0565b6001600160601b0319606096871b8116825294861b8516601482015292851b8416602884015290841b8316603c83015290921b16605082015260640190565b80516110d28161160c565b8051600281900b81146110d2575f80fd5b80516110d2816115ef565b5f805f805f805f805f805f806101808d8f0312156119ef575f80fd5b8c516bffffffffffffffffffffffff81168114611a0a575f80fd5b9b50611a1860208e01611947565b9a50611a2660408e01611947565b9950611a3460608e01611947565b9850611a4260808e016119ac565b9750611a5060a08e016119b7565b9650611a5e60c08e016119b7565b9550611a6c60e08e016119c8565b94506101008d015193506101208d01519250611a8b6101408e016119c8565b9150611a9a6101608e016119c8565b90509295989b509295989b509295989b565b6001600160601b0319606093841b811682529190921b16601482015260280190565b5f808335601e19843603018112611ae3575f80fd5b83018035915067ffffffffffffffff821115611afd575f80fd5b60200191503681900382131561120c575f80fd5b634e487b7160e01b5f52601260045260245ffd5b5f82611b3357611b33611b11565b500690565b634e487b7160e01b5f52601160045260245ffd5b5f82611b5a57611b5a611b11565b500490565b80820180821115611b7257611b72611b38565b92915050565b5f8085851115611b86575f80fd5b83861115611b92575f80fd5b5050820193919092039150565b5f8451611bb0818460208901611101565b8201838582375f930192835250909392505050565b5f60018201611bd657611bd6611b38565b5060010190565b5f8351611bee818460208801611101565b60609390931b6001600160601b0319169190920190815260140192915050565b5f60208284031215611c1e575f80fd5b611185826113b6565b634e487b7160e01b5f52603260045260245ffdfea264697066735822122042f34e0794ec4a7a064408b36cebc99ffe1d5846b691a1bfb9d72e82119680da64736f6c63430008150033

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

000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe88000000000000000000000000cf5540fffcdc3d510b18bfca6d2b9987b0772559

-----Decoded View---------------
Arg [0] : _uniswapV3NonFungiblePositionManager (address): 0xC36442b4a4522E871399CD717aBDD847Ab11FE88
Arg [1] : _odosRouter (address): 0xCf5540fFFCdC3d510B18bFcA6d2b9987b0772559

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe88
Arg [1] : 000000000000000000000000cf5540fffcdc3d510b18bfca6d2b9987b0772559


Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.