ETH Price: $2,879.78 (-10.62%)
Gas: 12 Gwei

Contract

0x8207666522c9a47a44f4E93f6839358AFDF17B79
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Convert To Full ...191844452024-02-08 15:50:47147 days ago1707407447IN
0x82076665...AFDF17B79
0 ETH0.0517138164.35836326
Convert To Full ...191837092024-02-08 13:20:59147 days ago1707398459IN
0x82076665...AFDF17B79
0 ETH0.0684515886.19314703
Convert To Full ...191836522024-02-08 13:09:35147 days ago1707397775IN
0x82076665...AFDF17B79
0 ETH0.0763599592.72161201
Convert To Full ...191830992024-02-08 11:17:59147 days ago1707391079IN
0x82076665...AFDF17B79
0 ETH0.0499053261.97240343
Convert To Full ...191826492024-02-08 9:47:35147 days ago1707385655IN
0x82076665...AFDF17B79
0 ETH0.1780889645.26738887
Convert To Full ...191826122024-02-08 9:40:11147 days ago1707385211IN
0x82076665...AFDF17B79
0 ETH0.1892468945.39869209
Convert To Full ...191822162024-02-08 8:20:23147 days ago1707380423IN
0x82076665...AFDF17B79
0 ETH0.0390263548.10556113
Convert To Full ...191812512024-02-08 5:06:23148 days ago1707368783IN
0x82076665...AFDF17B79
0 ETH0.0270300232.43381908
Convert To Full ...191809092024-02-08 3:56:59148 days ago1707364619IN
0x82076665...AFDF17B79
0 ETH0.0919318926.09363495
Convert To Full ...191798262024-02-08 0:15:59148 days ago1707351359IN
0x82076665...AFDF17B79
0 ETH0.0362046147.68075203
Convert To Full ...191785442024-02-07 19:57:47148 days ago1707335867IN
0x82076665...AFDF17B79
0 ETH0.09471255116.80118187
Convert To Full ...191755522024-02-07 9:53:59148 days ago1707299639IN
0x82076665...AFDF17B79
0 ETH0.024572230.12662115
Convert To Full ...191752492024-02-07 8:52:59148 days ago1707295979IN
0x82076665...AFDF17B79
0 ETH0.0192871224.64301115
Convert To Full ...191641732024-02-05 19:34:59150 days ago1707161699IN
0x82076665...AFDF17B79
0 ETH0.015390822.08159693
Convert To Full ...191622142024-02-05 12:57:23150 days ago1707137843IN
0x82076665...AFDF17B79
0 ETH0.0140432817.5797972
Convert To Full ...191580452024-02-04 22:55:35151 days ago1707087335IN
0x82076665...AFDF17B79
0 ETH0.0101109313.24035676
Convert To Full ...191570182024-02-04 19:27:23151 days ago1707074843IN
0x82076665...AFDF17B79
0 ETH0.0154803820.40745759
Convert To Full ...191541722024-02-04 9:51:35151 days ago1707040295IN
0x82076665...AFDF17B79
0 ETH0.0113589316.17459834
Convert To Full ...191495062024-02-03 18:07:35152 days ago1706983655IN
0x82076665...AFDF17B79
0 ETH0.0176767922.85816629
Convert To Full ...191354312024-02-01 18:41:59154 days ago1706812919IN
0x82076665...AFDF17B79
0 ETH0.0485463260.84093739
Convert To Full ...191318162024-02-01 6:31:11154 days ago1706769071IN
0x82076665...AFDF17B79
0 ETH0.0161156618.35097641
Convert To Full ...191305922024-02-01 2:21:59155 days ago1706754119IN
0x82076665...AFDF17B79
0 ETH0.0295213224.02733544
Convert To Full ...191294532024-01-31 22:31:59155 days ago1706740319IN
0x82076665...AFDF17B79
0 ETH0.0244747630.43916407
Convert To Full ...191268772024-01-31 13:51:35155 days ago1706709095IN
0x82076665...AFDF17B79
0 ETH0.0180338726.02834797
Convert To Full ...191240112024-01-31 4:12:23156 days ago1706674343IN
0x82076665...AFDF17B79
0 ETH0.0236073818.4827736
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
FullRangeConvertor

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 1000 runs

Other Settings:
istanbul EvmVersion
File 1 of 8 : FullRangeConvertor.sol
// SPDX-License-Identifier: UNLICENSED
// Code Author: UNCX by SDDTech

pragma solidity 0.8.19;

import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "../uniswap-updated/INonfungiblePositionManager.sol";
import "@uniswap/v3-periphery/contracts/libraries/TransferHelper.sol";
import "@uniswap/v3-core/contracts/interfaces/IUniswapV3Factory.sol";
import "../IUNCX_ProofOfReservesV2_UniV3.sol";

contract FullRangeConvertor is IERC721Receiver, ReentrancyGuard {

    IUNCX_ProofOfReservesV2_UniV3 public UNIV3_V2_LOCKER;

    constructor(IUNCX_ProofOfReservesV2_UniV3 _univ3_v2_locker) {
      UNIV3_V2_LOCKER = _univ3_v2_locker;
    }

    function convertToFullRangeAndLock (IUNCX_ProofOfReservesV2_UniV3.LockParams memory _lockParams, uint256 _amount0Min, uint256 _amount1Min) external nonReentrant returns (uint256 newLockId) {
      _lockParams.nftPositionManager.safeTransferFrom(msg.sender, address(this), _lockParams.nft_id);

      INonfungiblePositionManager.Position memory position;
      (
        , // nonce
        , // operator
        , // token0
        , // token1
        position.fee, // fee
        position.tickLower, // tickLower
        position.tickUpper, // tickUpper
        , // liquidity
        , // feeGrowthInside0LastX128
        , // feeGrowthInside1LastX128
        , // tokensOwed0
          // tokensOwed1
      ) = _lockParams.nftPositionManager.positions(_lockParams.nft_id);

      IUniswapV3Factory factory = IUniswapV3Factory(_lockParams.nftPositionManager.factory());
      int24 maxTick = tickSpacingToMaxTick(factory.feeAmountTickSpacing(position.fee));
      
      uint256 nftToLock;
      if (position.tickLower == -maxTick && position.tickUpper == maxTick) {
          nftToLock = _lockParams.nft_id;
      } else {
        // convert the position to full range by minting a new full range NFT
        nftToLock = _convertPositionToFullRange(_lockParams.nftPositionManager, _lockParams.nft_id, maxTick, _lockParams.dustRecipient, _amount0Min, _amount1Min);
      }
      
      _lockParams.nftPositionManager.approve(address(UNIV3_V2_LOCKER), nftToLock);
      _lockParams.nft_id = nftToLock;
      newLockId = UNIV3_V2_LOCKER.lock(_lockParams);
    }

    function _convertPositionToFullRange (INonfungiblePositionManager _nftPositionManager, uint256 _tokenId, int24 _maxTick, address _dustRecipient, uint256 _amount0Min, uint256 _amount1Min) private returns (uint256) {
        INonfungiblePositionManager.MintParams memory mintParams;
        uint128 positionLiquidity;
        (
          , // nonce
          , // operator
          mintParams.token0, // token0
          mintParams.token1, // token1
          mintParams.fee, // fee
          , // tickLower
          , // tickUpper
          positionLiquidity,
          , // feeGrowthInside0LastX128
          , // feeGrowthInside1LastX128
          , // tokensOwed0
           // tokensOwed1
        ) = _nftPositionManager.positions(_tokenId);

        _nftPositionManager.decreaseLiquidity(INonfungiblePositionManager.DecreaseLiquidityParams(_tokenId, positionLiquidity, 0, 0, block.timestamp));
        _nftPositionManager.collect(INonfungiblePositionManager.CollectParams(_tokenId, address(this), type(uint128).max, type(uint128).max));

        mintParams.tickLower = -_maxTick;
        mintParams.tickUpper = _maxTick;
        mintParams.amount0Desired = IERC20(mintParams.token0).balanceOf(address(this));
        mintParams.amount1Desired = IERC20(mintParams.token1).balanceOf(address(this));
        mintParams.amount0Min = _amount0Min;
        mintParams.amount1Min = _amount1Min;
        mintParams.recipient = address(this);
        mintParams.deadline = block.timestamp;

        TransferHelper.safeApprove(mintParams.token0, address(_nftPositionManager), mintParams.amount0Desired);
        TransferHelper.safeApprove(mintParams.token1, address(_nftPositionManager), mintParams.amount1Desired);

        (uint256 newNftId,,,) = _nftPositionManager.mint(mintParams);

        _nftPositionManager.burn(_tokenId);

        // Refund the tokens which dont fit into full range liquidity
        uint256 balance0 = IERC20(mintParams.token0).balanceOf(address(this));
        uint256 balance1 = IERC20(mintParams.token1).balanceOf(address(this));
        if (balance0 > 0) {
            TransferHelper.safeTransfer(mintParams.token0, _dustRecipient, balance0);
        }
        if (balance1 > 0) {
            TransferHelper.safeTransfer(mintParams.token1, _dustRecipient, balance1);
        }
        return newNftId;
    }

    /**
    * @dev gets the maximum tick for a tickSpacing
    * source: https://github.com/Uniswap/v3-core/blob/main/contracts/libraries/Tick.sol
    */
    function tickSpacingToMaxTick(int24 tickSpacing) public pure returns (int24 maxTick) {
        maxTick = (887272 / tickSpacing) * tickSpacing;
    }

    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) public pure override returns (bytes4) {
        return IERC721Receiver.onERC721Received.selector;
    }
}

File 2 of 8 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;
    }

    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

File 3 of 8 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}

File 4 of 8 : IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

File 5 of 8 : IUniswapV3Factory.sol
// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity >=0.5.0;

/// @title The interface for the Uniswap V3 Factory
/// @notice The Uniswap V3 Factory facilitates creation of Uniswap V3 pools and control over the protocol fees
interface IUniswapV3Factory {
    /// @notice Emitted when the owner of the factory is changed
    /// @param oldOwner The owner before the owner was changed
    /// @param newOwner The owner after the owner was changed
    event OwnerChanged(address indexed oldOwner, address indexed newOwner);

    /// @notice Emitted when a pool is created
    /// @param token0 The first token of the pool by address sort order
    /// @param token1 The second token of the pool by address sort order
    /// @param fee The fee collected upon every swap in the pool, denominated in hundredths of a bip
    /// @param tickSpacing The minimum number of ticks between initialized ticks
    /// @param pool The address of the created pool
    event PoolCreated(
        address indexed token0,
        address indexed token1,
        uint24 indexed fee,
        int24 tickSpacing,
        address pool
    );

    /// @notice Emitted when a new fee amount is enabled for pool creation via the factory
    /// @param fee The enabled fee, denominated in hundredths of a bip
    /// @param tickSpacing The minimum number of ticks between initialized ticks for pools created with the given fee
    event FeeAmountEnabled(uint24 indexed fee, int24 indexed tickSpacing);

    /// @notice Returns the current owner of the factory
    /// @dev Can be changed by the current owner via setOwner
    /// @return The address of the factory owner
    function owner() external view returns (address);

    /// @notice Returns the tick spacing for a given fee amount, if enabled, or 0 if not enabled
    /// @dev A fee amount can never be removed, so this value should be hard coded or cached in the calling context
    /// @param fee The enabled fee, denominated in hundredths of a bip. Returns 0 in case of unenabled fee
    /// @return The tick spacing
    function feeAmountTickSpacing(uint24 fee) external view returns (int24);

    /// @notice Returns the pool address for a given pair of tokens and a fee, or address 0 if it does not exist
    /// @dev tokenA and tokenB may be passed in either token0/token1 or token1/token0 order
    /// @param tokenA The contract address of either token0 or token1
    /// @param tokenB The contract address of the other token
    /// @param fee The fee collected upon every swap in the pool, denominated in hundredths of a bip
    /// @return pool The pool address
    function getPool(
        address tokenA,
        address tokenB,
        uint24 fee
    ) external view returns (address pool);

    /// @notice Creates a pool for the given two tokens and fee
    /// @param tokenA One of the two tokens in the desired pool
    /// @param tokenB The other of the two tokens in the desired pool
    /// @param fee The desired fee for the pool
    /// @dev tokenA and tokenB may be passed in either order: token0/token1 or token1/token0. tickSpacing is retrieved
    /// from the fee. The call will revert if the pool already exists, the fee is invalid, or the token arguments
    /// are invalid.
    /// @return pool The address of the newly created pool
    function createPool(
        address tokenA,
        address tokenB,
        uint24 fee
    ) external returns (address pool);

    /// @notice Updates the owner of the factory
    /// @dev Must be called by the current owner
    /// @param _owner The new owner of the factory
    function setOwner(address _owner) external;

    /// @notice Enables a fee amount with the given tickSpacing
    /// @dev Fee amounts may never be removed once enabled
    /// @param fee The fee amount to enable, denominated in hundredths of a bip (i.e. 1e-6)
    /// @param tickSpacing The spacing between ticks to be enforced for all pools created with the given fee amount
    function enableFeeAmount(uint24 fee, int24 tickSpacing) external;
}

File 6 of 8 : TransferHelper.sol
// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity >=0.6.0;

import '@openzeppelin/contracts/token/ERC20/IERC20.sol';

library TransferHelper {
    /// @notice Transfers tokens from the targeted address to the given destination
    /// @notice Errors with 'STF' if transfer fails
    /// @param token The contract address of the token to be transferred
    /// @param from The originating address from which the tokens will be transferred
    /// @param to The destination address of the transfer
    /// @param value The amount to be transferred
    function safeTransferFrom(
        address token,
        address from,
        address to,
        uint256 value
    ) internal {
        (bool success, bytes memory data) =
            token.call(abi.encodeWithSelector(IERC20.transferFrom.selector, from, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'STF');
    }

    /// @notice Transfers tokens from msg.sender to a recipient
    /// @dev Errors with ST if transfer fails
    /// @param token The contract address of the token which will be transferred
    /// @param to The recipient of the transfer
    /// @param value The value of the transfer
    function safeTransfer(
        address token,
        address to,
        uint256 value
    ) internal {
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transfer.selector, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'ST');
    }

    /// @notice Approves the stipulated contract to spend the given allowance in the given token
    /// @dev Errors with 'SA' if transfer fails
    /// @param token The contract address of the token to be approved
    /// @param to The target of the approval
    /// @param value The amount of the given token the target will be allowed to spend
    function safeApprove(
        address token,
        address to,
        uint256 value
    ) internal {
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.approve.selector, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'SA');
    }

    /// @notice Transfers ETH to the recipient address
    /// @dev Fails with `STE`
    /// @param to The destination of the transfer
    /// @param value The value to be transferred
    function safeTransferETH(address to, uint256 value) internal {
        (bool success, ) = to.call{value: value}(new bytes(0));
        require(success, 'STE');
    }
}

File 7 of 8 : IUNCX_ProofOfReservesV2_UniV3.sol
// SPDX-License-Identifier: UNLICENSED
// ALL RIGHTS RESERVED
// UNCX by SDDTech reserves all rights on this code. You may not copy these contracts.

pragma solidity 0.8.19;

import "./uniswap-updated/INonfungiblePositionManager.sol";

/**
 * @dev Interface of the UNCX UniswapV3 Liquidity Locker
 */
interface IUNCX_ProofOfReservesV2_UniV3 {
    struct FeeStruct {
        string name; // name by which the fee is accessed
        uint256 lpFee; // 100 = 1%, 10,000 = 100%
        uint256 collectFee; // 100 = 1%, 10,000 = 100%
        uint256 flatFee; // in amount tokens
        address flatFeeToken; // address(0) = ETH otherwise ERC20 address expected
    }

    struct Lock {
        uint256 lock_id; // unique nonce per lock
        INonfungiblePositionManager nftPositionManager; // the nft position manager of the uniswap fork
        address pool; // the pool address
        uint256 nft_id; // the nft token id of the nft belonging to the nftPositionManager (there could be two nfts with id = 1, belonging to different amm forks and position managers)
        address owner; // the owner who can collect and withdraw
        address pendingOwner; //  two step process ownership transfer, the pending owner must accept ownership to own the lock
        address additionalCollector; // an additional address allowed to call collect (ideal for contracts to auto collect without having to use owner)
        address collectAddress; // The address to which automatic collections are sent
        uint256 unlockDate; // unlock date of the lock in seconds
        uint16 countryCode; // the country code of the locker / business
        uint256 ucf; // collect fee
    }

    struct LockParams {
        INonfungiblePositionManager nftPositionManager; // the NFT Position manager of the Uniswap V3 fork
        uint256 nft_id; // the nft token_id
        address dustRecipient; // receiver of dust tokens which do not fit into liquidity and initial collection fees
        address owner; // owner of the lock
        address additionalCollector; // an additional address allowed to call collect (ideal for contracts to auto collect without having to use owner)
        address collectAddress; // The address to which automatic collections are sent
        uint256 unlockDate; // unlock date of the lock in seconds
        uint16 countryCode; // the country code of the locker / business
        string feeName; // The fee name key you wish to accept, use "DEFAULT" if in doubt
        bytes[] r; // use an empty array => []
    }

    // User functions
    function lock (LockParams calldata params) external payable returns (uint256 lockId);
    function collect (uint256 lockId, address recipient, uint128 amount0Max, uint128 amount1Max) external returns (uint256 amount0, uint256 amount1, uint256 fee0, uint256 fee1);
    function withdraw (uint256 lockId, address receiver) external;
    function migrate (uint256 lockId) external;
    function relock(uint256 lockId, uint256 unlockDate) external;
    function setAdditionalCollector (uint256 lockId, address additionalCollector) external;
    function setCollectAddress (uint256 lockId, address collectAddress) external;
    function transferLockOwnership (uint256 lockId, address newOwner) external;
    function acceptLockOwnership (uint256 lockId) external;
    function decreaseLiquidity(uint256 lockId, INonfungiblePositionManager.DecreaseLiquidityParams calldata params) external payable returns (uint256 amount0, uint256 amount1);
    function increaseLiquidity(uint256 lockId, INonfungiblePositionManager.IncreaseLiquidityParams calldata params) external payable returns (uint128 liquidity, uint256 amount0, uint256 amount1);

    // Admin functions
    function setMigrator(address migrator) external;
    function setUCF(uint256 lockId, uint256 ucf) external;
    function setMigrateInContract (address migrateInContract) external;

    // Getters
    function getLocksLength() external view returns (uint256);
    function getLock(uint256 lockId) external view returns (Lock memory lock);

    function getNumUserLocks(address user) external view returns (uint256 numLocks);
    function getUserLockAtIndex(address user, uint256 index) external view returns (Lock memory lock);

    function getFee (string memory name) external view returns (FeeStruct memory);
    function getAmountsForLiquidity (int24 currentTick, int24 tickLower, int24 tickHigher, uint128 liquidity) external pure returns (uint256 amount0, uint256 amount1);

    // Events
    event onLock(
        uint256 lock_id,
        address nftPositionManager,
        uint256 nft_id,
        address owner,
        address additionalCollector,
        address collectAddress,
        uint256 unlockDate,
        uint16 countryCode,
        uint256 collectFee,
        address poolAddress,
        INonfungiblePositionManager.Position position
    );

    event onWithdraw(uint256 lock_id, address owner, address receiver);

    event onLockOwnershipTransferStarted(uint256 lockId, address currentOwner, address pendingOwner);

    event onTransferLockOwnership(uint256 lockId, address oldOwner, address newOwner);

    event onMigrate(uint256 lockId);

    event onSetAdditionalCollector(uint256 lockId, address additionalCollector);

    event onSetCollectAddress(uint256 lockId, address collectAddress);

    event onSetMigrator(address migrator);

    event onRelock(uint256 lockId, uint256 unlockDate);

    event onIncreaseLiquidity(uint256 lockId);

    event onDecreaseLiquidity(uint256 lockId);

    event onRemoveFee(bytes32 nameHash);

    event onAddFee(bytes32 nameHash, string name, uint256 lpFee, uint256 collectFee, uint256 flatFee, address flatFeeToken);

    event onEditFee(bytes32 nameHash, string name, uint256 lpFee, uint256 collectFee, uint256 flatFee, address flatFeeToken);

    event onSetUCF(uint256 lockId, uint256 ucf);
    
}

File 8 of 8 : INonfungiblePositionManager.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.9;

// Importing from @uniswap doesnt work with @openzepplins latest release so this is refactored
// Source: https://github.com/Uniswap/v3-periphery/blob/main/contracts/interfaces/INonfungiblePositionManager.sol

interface INonfungiblePositionManager {

    function approve(address to, uint256 tokenId) external;
    
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

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

    function mint(
        MintParams calldata params
    )
        external
        payable
        returns (
            uint256 tokenId,
            uint128 liquidity,
            uint256 amount0,
            uint256 amount1
        );

    struct Position {
        uint96 nonce;
        address operator;
        address token0;
        address token1;
        uint24 fee;
        int24 tickLower;
        int24 tickUpper;
        uint128 liquidity;
        uint256 feeGrowthInside0LastX128;
        uint256 feeGrowthInside1LastX128;
        uint128 tokensOwed0;
        uint128 tokensOwed1;
    }

    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
        );

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

    /// @notice Increases the amount of liquidity in a position, with tokens paid by the `msg.sender`
    /// @param params tokenId The ID of the token for which liquidity is being increased,
    /// amount0Desired The desired amount of token0 to be spent,
    /// amount1Desired The desired amount of token1 to be spent,
    /// amount0Min The minimum amount of token0 to spend, which serves as a slippage check,
    /// amount1Min The minimum amount of token1 to spend, which serves as a slippage check,
    /// deadline The time by which the transaction must be included to effect the change
    /// @return liquidity The new liquidity amount as a result of the increase
    /// @return amount0 The amount of token0 to acheive resulting liquidity
    /// @return amount1 The amount of token1 to acheive resulting liquidity
    function increaseLiquidity(IncreaseLiquidityParams calldata params)
        external
        payable
        returns (
            uint128 liquidity,
            uint256 amount0,
            uint256 amount1
        );

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

    /// @notice Decreases the amount of liquidity in a position and accounts it to the position
    /// @param params tokenId The ID of the token for which liquidity is being decreased,
    /// amount The amount by which liquidity will be decreased,
    /// amount0Min The minimum amount of token0 that should be accounted for the burned liquidity,
    /// amount1Min The minimum amount of token1 that should be accounted for the burned liquidity,
    /// deadline The time by which the transaction must be included to effect the change
    /// @return amount0 The amount of token0 accounted to the position's tokens owed
    /// @return amount1 The amount of token1 accounted to the position's tokens owed
    function decreaseLiquidity(DecreaseLiquidityParams calldata params)
        external
        payable
        returns (uint256 amount0, uint256 amount1);

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

    function collect(
        CollectParams calldata params
    ) external payable returns (uint256 amount0, uint256 amount1);

    function factory() external view returns (address);

    function burn(uint256 tokenId) external payable;
}

Settings
{
  "evmVersion": "istanbul",
  "optimizer": {
    "enabled": true,
    "runs": 1000
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract IUNCX_ProofOfReservesV2_UniV3","name":"_univ3_v2_locker","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"UNIV3_V2_LOCKER","outputs":[{"internalType":"contract IUNCX_ProofOfReservesV2_UniV3","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"contract INonfungiblePositionManager","name":"nftPositionManager","type":"address"},{"internalType":"uint256","name":"nft_id","type":"uint256"},{"internalType":"address","name":"dustRecipient","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"additionalCollector","type":"address"},{"internalType":"address","name":"collectAddress","type":"address"},{"internalType":"uint256","name":"unlockDate","type":"uint256"},{"internalType":"uint16","name":"countryCode","type":"uint16"},{"internalType":"string","name":"feeName","type":"string"},{"internalType":"bytes[]","name":"r","type":"bytes[]"}],"internalType":"struct IUNCX_ProofOfReservesV2_UniV3.LockParams","name":"_lockParams","type":"tuple"},{"internalType":"uint256","name":"_amount0Min","type":"uint256"},{"internalType":"uint256","name":"_amount1Min","type":"uint256"}],"name":"convertToFullRangeAndLock","outputs":[{"internalType":"uint256","name":"newLockId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"int24","name":"tickSpacing","type":"int24"}],"name":"tickSpacingToMaxTick","outputs":[{"internalType":"int24","name":"maxTick","type":"int24"}],"stateMutability":"pure","type":"function"}]

608060405234801561001057600080fd5b5060405161184d38038061184d83398101604081905261002f91610059565b6001600081905580546001600160a01b0319166001600160a01b0392909216919091179055610089565b60006020828403121561006b57600080fd5b81516001600160a01b038116811461008257600080fd5b9392505050565b6117b5806100986000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c8063150b7a0214610051578063395bd9db146100bf57806355be236b146100e0578063e526dd481461010b575b600080fd5b61008961005f366004610ed0565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020015b60405180910390f35b6100d26100cd36600461111e565b610131565b6040519081526020016100b6565b6001546100f3906001600160a01b031681565b6040516001600160a01b0390911681526020016100b6565b61011e610119366004611250565b610550565b60405160029190910b81526020016100b6565b600061013b610570565b835160208501516040517f42842e0e00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101919091526001600160a01b03909116906342842e0e90606401600060405180830381600087803b1580156101ab57600080fd5b505af11580156101bf573d6000803e3d6000fd5b50506040805161018081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810191909152915061022b9050565b8451602086015160405163133f757160e31b81526001600160a01b03909216916399fbab88916102619160040190815260200190565b61018060405180830381865afa15801561027f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102a391906112b6565b50505050600291820b60c08a0152500b60a087015262ffffff16608086015250508651604080517fc45a01550000000000000000000000000000000000000000000000000000000081529051600094506001600160a01b03909216925063c45a01559160048083019260209291908290030181865afa15801561032a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061034e9190611397565b60808301516040517f22afcccb00000000000000000000000000000000000000000000000000000000815262ffffff90911660048201529091506000906103e4906001600160a01b038416906322afcccb90602401602060405180830381865afa1580156103c0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061011991906113b4565b905060006103f1826113e7565b60020b8460a0015160020b14801561041257508160020b8460c0015160020b145b156104225750602087015161043f565b61043c88600001518960200151848b604001518b8b6105ce565b90505b875160015460405163095ea7b360e01b81526001600160a01b0391821660048201526024810184905291169063095ea7b390604401600060405180830381600087803b15801561048e57600080fd5b505af11580156104a2573d6000803e3d6000fd5b50505050602088018190526001546040517fa35a96b80000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063a35a96b8906104f6908b906004016114ae565b6020604051808303816000875af1158015610515573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105399190611595565b9450505050506105496001600055565b9392505050565b60008161056081620d89e86115ae565b61056a91906115f6565b92915050565b6002600054036105c75760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b6002600055565b6040805161016081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081018290526101208101829052610140810182905260405163133f757160e31b8152600481018890526000906001600160a01b038a16906399fbab889060240161018060405180830381865afa15801561066f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061069391906112b6565b909192939495969798999a50909192939495969798995090919293949550909192939450909192509091509050508560000186602001876040018397508462ffffff1662ffffff16815250846001600160a01b03166001600160a01b0316815250846001600160a01b03166001600160a01b031681525050505050886001600160a01b0316630c49ccbe6040518060a001604052808b8152602001846fffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001428152506040518263ffffffff1660e01b81526004016107bb9190600060a082019050825182526fffffffffffffffffffffffffffffffff602084015116602083015260408301516040830152606083015160608301526080830151608083015292915050565b60408051808303816000875af11580156107d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107fd919061161d565b50506040805160808101825289815230602082019081526fffffffffffffffffffffffffffffffff8284018181526060840182815294517ffc6f78650000000000000000000000000000000000000000000000000000000081529351600485015291516001600160a01b03908116602485015291518116604484015292519092166064820152908a169063fc6f78659060840160408051808303816000875af11580156108ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d2919061161d565b5050866108de906113e7565b600290810b606084015287900b608083015281516040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610937573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095b9190611595565b60a083015260208201516040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa1580156109aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ce9190611595565b60c083015260e0820185905261010082018490523061012083015242610140830152815160a0830151610a0391908b90610c36565b610a1682602001518a8460c00151610c36565b6040517f883164560000000000000000000000000000000000000000000000000000000081526000906001600160a01b038b1690638831645690610a5e908690600401611641565b6080604051808303816000875af1158015610a7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa19190611705565b50506040517f42966c68000000000000000000000000000000000000000000000000000000008152600481018c9052919250506001600160a01b038b16906342966c6890602401600060405180830381600087803b158015610b0257600080fd5b505af1158015610b16573d6000803e3d6000fd5b505084516040516370a0823160e01b8152306004820152600093506001600160a01b0390911691506370a0823190602401602060405180830381865afa158015610b64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b889190611595565b60208501516040516370a0823160e01b81523060048201529192506000916001600160a01b03909116906370a0823190602401602060405180830381865afa158015610bd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bfc9190611595565b90508115610c11578451610c11908a84610d66565b8015610c2657610c2685602001518a83610d66565b50909a9950505050505050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1663095ea7b360e01b1790529151600092839290871691610ca79190611741565b6000604051808303816000865af19150503d8060008114610ce4576040519150601f19603f3d011682016040523d82523d6000602084013e610ce9565b606091505b5091509150818015610d13575080511580610d13575080806020019051810190610d13919061175d565b610d5f5760405162461bcd60e51b815260206004820152600260248201527f534100000000000000000000000000000000000000000000000000000000000060448201526064016105be565b5050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790529151600092839290871691610df09190611741565b6000604051808303816000865af19150503d8060008114610e2d576040519150601f19603f3d011682016040523d82523d6000602084013e610e32565b606091505b5091509150818015610e5c575080511580610e5c575080806020019051810190610e5c919061175d565b610d5f5760405162461bcd60e51b815260206004820152600260248201527f535400000000000000000000000000000000000000000000000000000000000060448201526064016105be565b6001600160a01b0381168114610ebd57600080fd5b50565b8035610ecb81610ea8565b919050565b600080600080600060808688031215610ee857600080fd5b8535610ef381610ea8565b94506020860135610f0381610ea8565b935060408601359250606086013567ffffffffffffffff80821115610f2757600080fd5b818801915088601f830112610f3b57600080fd5b813581811115610f4a57600080fd5b896020828501011115610f5c57600080fd5b9699959850939650602001949392505050565b634e487b7160e01b600052604160045260246000fd5b604051610140810167ffffffffffffffff81118282101715610fa957610fa9610f6f565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715610fd857610fd8610f6f565b604052919050565b803561ffff81168114610ecb57600080fd5b600067ffffffffffffffff83111561100c5761100c610f6f565b61101f601f8401601f1916602001610faf565b905082815283838301111561103357600080fd5b828260208301376000602084830101529392505050565b600082601f83011261105b57600080fd5b61054983833560208501610ff2565b600082601f83011261107b57600080fd5b8135602067ffffffffffffffff8083111561109857611098610f6f565b8260051b6110a7838201610faf565b93845285810183019383810190888611156110c157600080fd5b84880192505b85831015611112578235848111156110df5760008081fd5b8801603f81018a136110f15760008081fd5b6111028a8783013560408401610ff2565b83525091840191908401906110c7565b98975050505050505050565b60008060006060848603121561113357600080fd5b833567ffffffffffffffff8082111561114b57600080fd5b90850190610140828803121561116057600080fd5b611168610f85565b61117183610ec0565b81526020830135602082015261118960408401610ec0565b604082015261119a60608401610ec0565b60608201526111ab60808401610ec0565b60808201526111bc60a08401610ec0565b60a082015260c083013560c08201526111d760e08401610fe0565b60e082015261010080840135838111156111f057600080fd5b6111fc8a82870161104a565b828401525050610120808401358381111561121657600080fd5b6112228a82870161106a565b9183019190915250976020870135975060409096013595945050505050565b8060020b8114610ebd57600080fd5b60006020828403121561126257600080fd5b813561054981611241565b8051610ecb81610ea8565b805162ffffff81168114610ecb57600080fd5b8051610ecb81611241565b80516fffffffffffffffffffffffffffffffff81168114610ecb57600080fd5b6000806000806000806000806000806000806101808d8f0312156112d957600080fd5b8c516bffffffffffffffffffffffff811681146112f557600080fd5b9b5061130360208e0161126d565b9a5061131160408e0161126d565b995061131f60608e0161126d565b985061132d60808e01611278565b975061133b60a08e0161128b565b965061134960c08e0161128b565b955061135760e08e01611296565b94506101008d015193506101208d015192506113766101408e01611296565b91506113856101608e01611296565b90509295989b509295989b509295989b565b6000602082840312156113a957600080fd5b815161054981610ea8565b6000602082840312156113c657600080fd5b815161054981611241565b634e487b7160e01b600052601160045260246000fd5b60008160020b627fffff198103611400576114006113d1565b60000392915050565b60005b8381101561142457818101518382015260200161140c565b50506000910152565b60008151808452611445816020860160208601611409565b601f01601f19169290920160200192915050565b600081518084526020808501808196508360051b8101915082860160005b858110156114a157828403895261148f84835161142d565b98850198935090840190600101611477565b5091979650505050505050565b602081526114c86020820183516001600160a01b03169052565b60208201516040820152600060408301516114ee60608401826001600160a01b03169052565b5060608301516001600160a01b03811660808401525060808301516001600160a01b03811660a08401525060a08301516001600160a01b03811660c08401525060c083015160e083015260e083015161010061154f8185018361ffff169052565b80850151915050610140610120818186015261156f61016086018461142d565b90860151858203601f19018387015290925061158b8382611459565b9695505050505050565b6000602082840312156115a757600080fd5b5051919050565b60008160020b8360020b806115d357634e487b7160e01b600052601260045260246000fd5b627fffff198214600019821416156115ed576115ed6113d1565b90059392505050565b60008260020b8260020b028060020b9150808214611616576116166113d1565b5092915050565b6000806040838503121561163057600080fd5b505080516020909101519092909150565b81516001600160a01b031681526101608101602083015161166d60208401826001600160a01b03169052565b506040830151611684604084018262ffffff169052565b506060830151611699606084018260020b9052565b5060808301516116ae608084018260020b9052565b5060a083015160a083015260c083015160c083015260e083015160e0830152610100808401518184015250610120808401516116f4828501826001600160a01b03169052565b505061014092830151919092015290565b6000806000806080858703121561171b57600080fd5b8451935061172b60208601611296565b6040860151606090960151949790965092505050565b60008251611753818460208701611409565b9190910192915050565b60006020828403121561176f57600080fd5b8151801515811461054957600080fdfea2646970667358221220bb0199babc734c960c21a1c08f1f20c66e25adbaf27a58b4141162565409abab64736f6c634300081300330000000000000000000000007f5c649856f900d15c83741f45ae46f5c6858234

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061004c5760003560e01c8063150b7a0214610051578063395bd9db146100bf57806355be236b146100e0578063e526dd481461010b575b600080fd5b61008961005f366004610ed0565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020015b60405180910390f35b6100d26100cd36600461111e565b610131565b6040519081526020016100b6565b6001546100f3906001600160a01b031681565b6040516001600160a01b0390911681526020016100b6565b61011e610119366004611250565b610550565b60405160029190910b81526020016100b6565b600061013b610570565b835160208501516040517f42842e0e00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101919091526001600160a01b03909116906342842e0e90606401600060405180830381600087803b1580156101ab57600080fd5b505af11580156101bf573d6000803e3d6000fd5b50506040805161018081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810191909152915061022b9050565b8451602086015160405163133f757160e31b81526001600160a01b03909216916399fbab88916102619160040190815260200190565b61018060405180830381865afa15801561027f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102a391906112b6565b50505050600291820b60c08a0152500b60a087015262ffffff16608086015250508651604080517fc45a01550000000000000000000000000000000000000000000000000000000081529051600094506001600160a01b03909216925063c45a01559160048083019260209291908290030181865afa15801561032a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061034e9190611397565b60808301516040517f22afcccb00000000000000000000000000000000000000000000000000000000815262ffffff90911660048201529091506000906103e4906001600160a01b038416906322afcccb90602401602060405180830381865afa1580156103c0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061011991906113b4565b905060006103f1826113e7565b60020b8460a0015160020b14801561041257508160020b8460c0015160020b145b156104225750602087015161043f565b61043c88600001518960200151848b604001518b8b6105ce565b90505b875160015460405163095ea7b360e01b81526001600160a01b0391821660048201526024810184905291169063095ea7b390604401600060405180830381600087803b15801561048e57600080fd5b505af11580156104a2573d6000803e3d6000fd5b50505050602088018190526001546040517fa35a96b80000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063a35a96b8906104f6908b906004016114ae565b6020604051808303816000875af1158015610515573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105399190611595565b9450505050506105496001600055565b9392505050565b60008161056081620d89e86115ae565b61056a91906115f6565b92915050565b6002600054036105c75760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b6002600055565b6040805161016081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081018290526101208101829052610140810182905260405163133f757160e31b8152600481018890526000906001600160a01b038a16906399fbab889060240161018060405180830381865afa15801561066f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061069391906112b6565b909192939495969798999a50909192939495969798995090919293949550909192939450909192509091509050508560000186602001876040018397508462ffffff1662ffffff16815250846001600160a01b03166001600160a01b0316815250846001600160a01b03166001600160a01b031681525050505050886001600160a01b0316630c49ccbe6040518060a001604052808b8152602001846fffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001428152506040518263ffffffff1660e01b81526004016107bb9190600060a082019050825182526fffffffffffffffffffffffffffffffff602084015116602083015260408301516040830152606083015160608301526080830151608083015292915050565b60408051808303816000875af11580156107d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107fd919061161d565b50506040805160808101825289815230602082019081526fffffffffffffffffffffffffffffffff8284018181526060840182815294517ffc6f78650000000000000000000000000000000000000000000000000000000081529351600485015291516001600160a01b03908116602485015291518116604484015292519092166064820152908a169063fc6f78659060840160408051808303816000875af11580156108ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d2919061161d565b5050866108de906113e7565b600290810b606084015287900b608083015281516040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610937573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095b9190611595565b60a083015260208201516040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa1580156109aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ce9190611595565b60c083015260e0820185905261010082018490523061012083015242610140830152815160a0830151610a0391908b90610c36565b610a1682602001518a8460c00151610c36565b6040517f883164560000000000000000000000000000000000000000000000000000000081526000906001600160a01b038b1690638831645690610a5e908690600401611641565b6080604051808303816000875af1158015610a7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa19190611705565b50506040517f42966c68000000000000000000000000000000000000000000000000000000008152600481018c9052919250506001600160a01b038b16906342966c6890602401600060405180830381600087803b158015610b0257600080fd5b505af1158015610b16573d6000803e3d6000fd5b505084516040516370a0823160e01b8152306004820152600093506001600160a01b0390911691506370a0823190602401602060405180830381865afa158015610b64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b889190611595565b60208501516040516370a0823160e01b81523060048201529192506000916001600160a01b03909116906370a0823190602401602060405180830381865afa158015610bd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bfc9190611595565b90508115610c11578451610c11908a84610d66565b8015610c2657610c2685602001518a83610d66565b50909a9950505050505050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1663095ea7b360e01b1790529151600092839290871691610ca79190611741565b6000604051808303816000865af19150503d8060008114610ce4576040519150601f19603f3d011682016040523d82523d6000602084013e610ce9565b606091505b5091509150818015610d13575080511580610d13575080806020019051810190610d13919061175d565b610d5f5760405162461bcd60e51b815260206004820152600260248201527f534100000000000000000000000000000000000000000000000000000000000060448201526064016105be565b5050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790529151600092839290871691610df09190611741565b6000604051808303816000865af19150503d8060008114610e2d576040519150601f19603f3d011682016040523d82523d6000602084013e610e32565b606091505b5091509150818015610e5c575080511580610e5c575080806020019051810190610e5c919061175d565b610d5f5760405162461bcd60e51b815260206004820152600260248201527f535400000000000000000000000000000000000000000000000000000000000060448201526064016105be565b6001600160a01b0381168114610ebd57600080fd5b50565b8035610ecb81610ea8565b919050565b600080600080600060808688031215610ee857600080fd5b8535610ef381610ea8565b94506020860135610f0381610ea8565b935060408601359250606086013567ffffffffffffffff80821115610f2757600080fd5b818801915088601f830112610f3b57600080fd5b813581811115610f4a57600080fd5b896020828501011115610f5c57600080fd5b9699959850939650602001949392505050565b634e487b7160e01b600052604160045260246000fd5b604051610140810167ffffffffffffffff81118282101715610fa957610fa9610f6f565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715610fd857610fd8610f6f565b604052919050565b803561ffff81168114610ecb57600080fd5b600067ffffffffffffffff83111561100c5761100c610f6f565b61101f601f8401601f1916602001610faf565b905082815283838301111561103357600080fd5b828260208301376000602084830101529392505050565b600082601f83011261105b57600080fd5b61054983833560208501610ff2565b600082601f83011261107b57600080fd5b8135602067ffffffffffffffff8083111561109857611098610f6f565b8260051b6110a7838201610faf565b93845285810183019383810190888611156110c157600080fd5b84880192505b85831015611112578235848111156110df5760008081fd5b8801603f81018a136110f15760008081fd5b6111028a8783013560408401610ff2565b83525091840191908401906110c7565b98975050505050505050565b60008060006060848603121561113357600080fd5b833567ffffffffffffffff8082111561114b57600080fd5b90850190610140828803121561116057600080fd5b611168610f85565b61117183610ec0565b81526020830135602082015261118960408401610ec0565b604082015261119a60608401610ec0565b60608201526111ab60808401610ec0565b60808201526111bc60a08401610ec0565b60a082015260c083013560c08201526111d760e08401610fe0565b60e082015261010080840135838111156111f057600080fd5b6111fc8a82870161104a565b828401525050610120808401358381111561121657600080fd5b6112228a82870161106a565b9183019190915250976020870135975060409096013595945050505050565b8060020b8114610ebd57600080fd5b60006020828403121561126257600080fd5b813561054981611241565b8051610ecb81610ea8565b805162ffffff81168114610ecb57600080fd5b8051610ecb81611241565b80516fffffffffffffffffffffffffffffffff81168114610ecb57600080fd5b6000806000806000806000806000806000806101808d8f0312156112d957600080fd5b8c516bffffffffffffffffffffffff811681146112f557600080fd5b9b5061130360208e0161126d565b9a5061131160408e0161126d565b995061131f60608e0161126d565b985061132d60808e01611278565b975061133b60a08e0161128b565b965061134960c08e0161128b565b955061135760e08e01611296565b94506101008d015193506101208d015192506113766101408e01611296565b91506113856101608e01611296565b90509295989b509295989b509295989b565b6000602082840312156113a957600080fd5b815161054981610ea8565b6000602082840312156113c657600080fd5b815161054981611241565b634e487b7160e01b600052601160045260246000fd5b60008160020b627fffff198103611400576114006113d1565b60000392915050565b60005b8381101561142457818101518382015260200161140c565b50506000910152565b60008151808452611445816020860160208601611409565b601f01601f19169290920160200192915050565b600081518084526020808501808196508360051b8101915082860160005b858110156114a157828403895261148f84835161142d565b98850198935090840190600101611477565b5091979650505050505050565b602081526114c86020820183516001600160a01b03169052565b60208201516040820152600060408301516114ee60608401826001600160a01b03169052565b5060608301516001600160a01b03811660808401525060808301516001600160a01b03811660a08401525060a08301516001600160a01b03811660c08401525060c083015160e083015260e083015161010061154f8185018361ffff169052565b80850151915050610140610120818186015261156f61016086018461142d565b90860151858203601f19018387015290925061158b8382611459565b9695505050505050565b6000602082840312156115a757600080fd5b5051919050565b60008160020b8360020b806115d357634e487b7160e01b600052601260045260246000fd5b627fffff198214600019821416156115ed576115ed6113d1565b90059392505050565b60008260020b8260020b028060020b9150808214611616576116166113d1565b5092915050565b6000806040838503121561163057600080fd5b505080516020909101519092909150565b81516001600160a01b031681526101608101602083015161166d60208401826001600160a01b03169052565b506040830151611684604084018262ffffff169052565b506060830151611699606084018260020b9052565b5060808301516116ae608084018260020b9052565b5060a083015160a083015260c083015160c083015260e083015160e0830152610100808401518184015250610120808401516116f4828501826001600160a01b03169052565b505061014092830151919092015290565b6000806000806080858703121561171b57600080fd5b8451935061172b60208601611296565b6040860151606090960151949790965092505050565b60008251611753818460208701611409565b9190910192915050565b60006020828403121561176f57600080fd5b8151801515811461054957600080fdfea2646970667358221220bb0199babc734c960c21a1c08f1f20c66e25adbaf27a58b4141162565409abab64736f6c63430008130033

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

0000000000000000000000007f5c649856f900d15c83741f45ae46f5c6858234

-----Decoded View---------------
Arg [0] : _univ3_v2_locker (address): 0x7f5C649856F900d15C83741f45AE46f5C6858234

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000007f5c649856f900d15c83741f45ae46f5c6858234


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
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.