creation_sourcecode: {{
    "language": "Solidity",
    "sources": {
      "Deposit.sol": {
        "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"IERC20Lite.sol\";\n\n/**\n * @title    Deposit contract\n * @notice   Creates a contract with a known address and withdraws tokens from it.\n *           After deployment, the Vault will call fetch() to withdraw tokens.\n * @dev      Any change in this contract, including comments, will affect the final\n *           bytecode and therefore will affect the create2 derived addresses.\n *           Do NOT modify unless the consequences of doing so are fully understood.\n */\ncontract Deposit {\n    address payable private immutable vault;\n\n    /**\n     * @notice  Upon deployment it fetches the tokens (native or ERC20) to the Vault.\n     * @param token  The address of the token to fetch\n     */\n    constructor(address token) {\n        vault = payable(msg.sender);\n        // Slightly cheaper to use msg.sender instead of Vault.\n        if (token == 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) {\n            // solhint-disable-next-line avoid-low-level-calls\n            (bool success, ) = msg.sender.call{value: address(this).balance}(\"\");\n            require(success);\n        } else {\n            // IERC20Lite.transfer doesn't have a return bool to avoid reverts on non-standard ERC20s\n            IERC20Lite(token).transfer(msg.sender, IERC20Lite(token).balanceOf(address(this)));\n        }\n    }\n\n    /**\n     * @notice  Allows the Vault to fetch ERC20 tokens from this contract.\n     * @param token  The address of the token to fetch\n     */\n    function fetch(address token) external {\n        require(msg.sender == vault);\n        // IERC20Lite.transfer doesn't have a return bool to avoid reverts on non-standard ERC20s\n        IERC20Lite(token).transfer(msg.sender, IERC20Lite(token).balanceOf(address(this)));\n    }\n\n    /// @notice Receives native tokens, emits an event and sends them to the Vault. Note that this\n    // requires the sender to forward some more gas than for a simple transfer.\n    receive() external payable {\n        // solhint-disable-next-line avoid-low-level-calls\n        (bool success, ) = vault.call{value: address(this).balance}(\"\");\n        require(success);\n    }\n}\n"
      },
      "IERC20Lite.sol": {
        "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @title    ERC20 Lite Interface\n * @notice   The interface for functions ERC20Lite implements. This is intended to\n *           be used only in the Deposit contract.\n * @dev      Any change in this contract, including comments, will affect the final\n *           bytecode and therefore will affect the create2 derived addresses.\n *           Do NOT modify unless the consequences of doing so are fully understood.\n */\ninterface IERC20Lite {\n    /// @dev Removed the return bool to avoid reverts on non-standard ERC20s.\n    function transfer(address, uint256) external;\n\n    function balanceOf(address) external view returns (uint256);\n}\n"
      }
    },
    "settings": {
      "evmVersion": "paris",
      "optimizer": {
        "enabled": true,
        "runs": 800
      },
      "libraries": {
        "Deposit.sol": {}
      },
      "outputSelection": {
        "*": {
          "*": [
            "evm.bytecode",
            "evm.deployedBytecode",
            "devdoc",
            "userdoc",
            "metadata",
            "abi"
          ]
        }
      }
    }
  }}