creation_sourcecode: {{
    "language": "Solidity",
    "sources": {
      "@uniswap/lib/contracts/libraries/TransferHelper.sol": {
        "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\npragma solidity >=0.6.0;\n\n// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false\nlibrary TransferHelper {\n    function safeApprove(\n        address token,\n        address to,\n        uint256 value\n    ) internal {\n        // bytes4(keccak256(bytes('approve(address,uint256)')));\n        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));\n        require(\n            success && (data.length == 0 || abi.decode(data, (bool))),\n            'TransferHelper::safeApprove: approve failed'\n        );\n    }\n\n    function safeTransfer(\n        address token,\n        address to,\n        uint256 value\n    ) internal {\n        // bytes4(keccak256(bytes('transfer(address,uint256)')));\n        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));\n        require(\n            success && (data.length == 0 || abi.decode(data, (bool))),\n            'TransferHelper::safeTransfer: transfer failed'\n        );\n    }\n\n    function safeTransferFrom(\n        address token,\n        address from,\n        address to,\n        uint256 value\n    ) internal {\n        // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));\n        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));\n        require(\n            success && (data.length == 0 || abi.decode(data, (bool))),\n            'TransferHelper::transferFrom: transferFrom failed'\n        );\n    }\n\n    function safeTransferETH(address to, uint256 value) internal {\n        (bool success, ) = to.call{value: value}(new bytes(0));\n        require(success, 'TransferHelper::safeTransferETH: ETH transfer failed');\n    }\n}\n"
      },
      "contracts/FewETHWrapper.sol": {
        "content": "pragma solidity =0.6.6;\n\nimport '@uniswap/lib/contracts/libraries/TransferHelper.sol';\n\nimport './interfaces/IFewETHWrapper.sol';\nimport './interfaces/IFewWrappedToken.sol';\nimport './interfaces/IERC20.sol';\nimport './interfaces/IWETH.sol';\n\ncontract FewETHWrapper is IFewETHWrapper {\n    address public immutable override WETH;\n    address public immutable override fwWETH;\n\n    constructor(address _WETH, address _fwWETH) public {\n        WETH = _WETH;\n        fwWETH = _fwWETH;\n    }\n\n    receive() external payable {\n        assert(msg.sender == WETH); // only accept ETH via fallback from the WETH contract\n    }\n\n    // **** FEW WRAPPED TOKEN ****\n    function wrapETHToFWWETH(address to)\n        external\n        virtual\n        override\n        payable\n        returns (uint)\n    {\n        IWETH(WETH).deposit{value: msg.value}();\n        IERC20(WETH).approve(fwWETH, msg.value);\n        return IFewWrappedToken(fwWETH).wrapTo(msg.value, to);\n    }\n    function unwrapFWWETHToETH(uint amount, address to)\n        external\n        virtual\n        override\n        returns (uint)\n    {\n        TransferHelper.safeTransferFrom(fwWETH, msg.sender, address(this), amount);\n        IFewWrappedToken(fwWETH).unwrapTo(amount, address(this));\n        IWETH(WETH).withdraw(amount);\n        TransferHelper.safeTransferETH(to, amount);\n        return amount;\n    }\n}\n"
      },
      "contracts/interfaces/IERC20.sol": {
        "content": "pragma solidity >=0.5.0;\n\ninterface IERC20 {\n    event Approval(address indexed owner, address indexed spender, uint value);\n    event Transfer(address indexed from, address indexed to, uint value);\n\n    function name() external view returns (string memory);\n    function symbol() external view returns (string memory);\n    function decimals() external view returns (uint8);\n    function totalSupply() external view returns (uint);\n    function balanceOf(address owner) external view returns (uint);\n    function allowance(address owner, address spender) external view returns (uint);\n\n    function approve(address spender, uint value) external returns (bool);\n    function transfer(address to, uint value) external returns (bool);\n    function transferFrom(address from, address to, uint value) external returns (bool);\n}\n"
      },
      "contracts/interfaces/IFewERC20.sol": {
        "content": "// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.5.0;\n\nimport \"./IERC20.sol\";\n\ninterface IFewERC20 is IERC20 {\n    function DOMAIN_SEPARATOR() external view returns (bytes32);\n    function PERMIT_TYPEHASH() external pure returns (bytes32);\n    function nonces(address owner) external view returns (uint);\n\n    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;\n}\n"
      },
      "contracts/interfaces/IFewETHWrapper.sol": {
        "content": "pragma solidity >=0.6.2;\n\ninterface IFewETHWrapper {\n    function WETH() external pure returns (address);\n    function fwWETH() external pure returns (address);\n\n    function wrapETHToFWWETH(address to) external payable returns (uint);\n    function unwrapFWWETHToETH(uint amount, address to) external returns (uint);\n}\n"
      },
      "contracts/interfaces/IFewWrappedToken.sol": {
        "content": "// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.5.0;\n\nimport \"../interfaces/IFewERC20.sol\";\n\ninterface IFewWrappedToken is IFewERC20 {\n    event Mint(address indexed minter, uint256 amount, address indexed to);\n    event Burn(address indexed burner, uint256 amount, address indexed to);\n    event Wrap(address indexed sender, uint256 amount, address indexed to);\n    event Unwrap(address indexed sender, uint256 amount, address indexed to);\n\n    function factory() external view returns (address);\n    function token() external view returns (address);\n\n    function burn(uint256 amount) external;\n    function burnFrom(address account, uint256 amount) external;\n    function mint(address account, uint256 amount) external;\n    function wrap(uint256 amount) external returns (uint256);\n    function wrapTo(uint256 amount, address to) external returns (uint256);\n    function unwrap(uint256 amount) external returns (uint256);\n    function unwrapTo(uint256 amount, address to) external returns (uint256);\n}\n"
      },
      "contracts/interfaces/IWETH.sol": {
        "content": "pragma solidity >=0.5.0;\n\ninterface IWETH {\n    function deposit() external payable;\n    function transfer(address to, uint value) external returns (bool);\n    function withdraw(uint) external;\n}\n"
      }
    },
    "settings": {
      "optimizer": {
        "enabled": true,
        "runs": 10000
      },
      "outputSelection": {
        "*": {
          "*": [
            "evm.bytecode",
            "evm.deployedBytecode",
            "devdoc",
            "userdoc",
            "metadata",
            "abi"
          ]
        }
      },
      "libraries": {}
    }
  }}