creation_sourcecode: {{
    "language": "Solidity",
    "sources": {
      "src/LiquidityLocker.sol": {
        "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.23;\n\nimport { INonfungiblePositionManager } from \"./interfaces/INonfungiblePositionManager.sol\";\nimport { IERC721Receiver } from \"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\";\n\ncontract LiquidityLocker is IERC721Receiver {\n    error NotOwner();\n    error InvalidAddress();\n\n    event OwnerChanged(address indexed newOwner);\n    event FeesClaimed(uint256 amount0, uint256 amount1);\n\n    address public owner;\n    uint256 public tokenId;\n    INonfungiblePositionManager public nonfungiblePositionManager;\n\n    constructor(address _owner, uint256 _tokenId) {\n        owner = _owner;\n        tokenId = _tokenId;\n        nonfungiblePositionManager = INonfungiblePositionManager(0xC36442b4a4522E871399CD717aBDD847Ab11FE88);\n    }\n\n    function claimFees(address feeReceiver) public {\n        if (msg.sender != owner) revert NotOwner();\n        if (feeReceiver == address(0)) revert InvalidAddress();\n\n        INonfungiblePositionManager.CollectParams memory params = INonfungiblePositionManager.CollectParams({\n            tokenId: tokenId,\n            recipient: feeReceiver,\n            amount0Max: type(uint128).max,\n            amount1Max: type(uint128).max\n        });\n\n        nonfungiblePositionManager.collect(params);\n    }\n\n    function changeOwner(address _newOwner) public {\n        if (msg.sender != owner) revert NotOwner();\n        if (_newOwner == address(0)) revert InvalidAddress();\n        owner = _newOwner;\n        emit OwnerChanged(_newOwner);\n    }\n\n    function onERC721Received(\n        address operator,\n        address from,\n        uint256 tokenId,\n        bytes calldata data\n    )\n        external\n        override\n        returns (bytes4)\n    {\n        return IERC721Receiver.onERC721Received.selector;\n    }\n}\n"
      },
      "src/interfaces/INonfungiblePositionManager.sol": {
        "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.23;\n\ninterface INonfungiblePositionManager {\n    struct CollectParams {\n        uint256 tokenId;\n        address recipient;\n        uint128 amount0Max;\n        uint128 amount1Max;\n    }\n\n    /// @notice Collects up to a maximum amount of fees owed to a specific position to the recipient\n    /// @param params tokenId The ID of the NFT for which tokens are being collected,\n    /// recipient The account that should receive the tokens,\n    /// amount0Max The maximum amount of token0 to collect,\n    /// amount1Max The maximum amount of token1 to collect\n    /// @return amount0 The amount of fees collected in token0\n    /// @return amount1 The amount of fees collected in token1\n    function collect(CollectParams calldata params) external payable returns (uint256 amount0, uint256 amount1);\n}\n"
      },
      "node_modules/@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol": {
        "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721Receiver.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @title ERC721 token receiver interface\n * @dev Interface for any contract that wants to support safeTransfers\n * from ERC721 asset contracts.\n */\ninterface IERC721Receiver {\n    /**\n     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\n     * by `operator` from `from`, this function is called.\n     *\n     * It must return its Solidity selector to confirm the token transfer.\n     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be\n     * reverted.\n     *\n     * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\n     */\n    function onERC721Received(\n        address operator,\n        address from,\n        uint256 tokenId,\n        bytes calldata data\n    ) external returns (bytes4);\n}\n"
      }
    },
    "settings": {
      "remappings": [
        "@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/",
        "@prb/test/=node_modules/@prb/test/",
        "forge-std/=node_modules/forge-std/",
        "@uniswap/v3-periphery/=node_modules/@uniswap/v3-periphery/contracts/"
      ],
      "optimizer": {
        "enabled": true,
        "runs": 10000
      },
      "metadata": {
        "useLiteralContent": false,
        "bytecodeHash": "none",
        "appendCBOR": true
      },
      "outputSelection": {
        "*": {
          "*": [
            "evm.bytecode",
            "evm.deployedBytecode",
            "devdoc",
            "userdoc",
            "metadata",
            "abi"
          ]
        }
      },
      "evmVersion": "paris",
      "viaIR": false,
      "libraries": {}
    }
  }}