编译器
0.8.17+commit.8df45f5f
文件 1 的 6:GenericErrors.sol
pragma solidity ^0.8.17;
error NotAContract();
文件 2 的 6:IERC20.sol
pragma solidity ^0.8.17;
interface IERC20 {
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address to, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address from, address to, uint256 amount) external returns (bool);
}
文件 3 的 6:IWETH.sol
pragma solidity >=0.5.0;
interface IWETH {
function deposit() external payable;
function transfer(address dst, uint256 wad) external returns (bool);
function withdraw(uint256 wad) external;
}
文件 4 的 6:LowLevelERC20Transfer.sol
pragma solidity ^0.8.17;
import {IERC20} from "../interfaces/generic/IERC20.sol";
import {ERC20TransferFail, ERC20TransferFromFail} from "../errors/LowLevelErrors.sol";
import {NotAContract} from "../errors/GenericErrors.sol";
contract LowLevelERC20Transfer {
function _executeERC20TransferFrom(address currency, address from, address to, uint256 amount) internal {
if (currency.code.length == 0) {
revert NotAContract();
}
(bool status, bytes memory data) = currency.call(abi.encodeCall(IERC20.transferFrom, (from, to, amount)));
if (!status) {
revert ERC20TransferFromFail();
}
if (data.length > 0) {
if (!abi.decode(data, (bool))) {
revert ERC20TransferFromFail();
}
}
}
function _executeERC20DirectTransfer(address currency, address to, uint256 amount) internal {
if (currency.code.length == 0) {
revert NotAContract();
}
(bool status, bytes memory data) = currency.call(abi.encodeCall(IERC20.transfer, (to, amount)));
if (!status) {
revert ERC20TransferFail();
}
if (data.length > 0) {
if (!abi.decode(data, (bool))) {
revert ERC20TransferFail();
}
}
}
}
文件 5 的 6:LowLevelErrors.sol
pragma solidity ^0.8.17;
error ETHTransferFail();
error ERC20ApprovalFail();
error ERC20TransferFail();
error ERC20TransferFromFail();
error ERC721TransferFromFail();
error ERC1155SafeTransferFromFail();
error ERC1155SafeBatchTransferFromFail();
文件 6 的 6:ProtocolFeeRecipient.sol
pragma solidity 0.8.17;
import {LowLevelERC20Transfer} from "@looksrare/contracts-libs/contracts/lowLevelCallers/LowLevelERC20Transfer.sol";
import {IWETH} from "@looksrare/contracts-libs/contracts/interfaces/generic/IWETH.sol";
import {IERC20} from "@looksrare/contracts-libs/contracts/interfaces/generic/IERC20.sol";
contract ProtocolFeeRecipient is LowLevelERC20Transfer {
address public immutable FEE_SHARING_SETTER;
IWETH public immutable WETH;
error NothingToTransfer();
constructor(address _feeSharingSetter, address _weth) {
FEE_SHARING_SETTER = _feeSharingSetter;
WETH = IWETH(_weth);
}
function transferETH() external {
uint256 ethBalance = address(this).balance;
if (ethBalance != 0) {
WETH.deposit{value: ethBalance}();
}
uint256 wethBalance = IERC20(address(WETH)).balanceOf(address(this));
if (wethBalance == 0) {
revert NothingToTransfer();
}
_executeERC20DirectTransfer(address(WETH), FEE_SHARING_SETTER, wethBalance);
}
function transferERC20(address currency) external {
uint256 balance = IERC20(currency).balanceOf(address(this));
if (balance == 0) {
revert NothingToTransfer();
}
_executeERC20DirectTransfer(currency, FEE_SHARING_SETTER, balance);
}
receive() external payable {}
}
{
"compilationTarget": {
"contracts/ProtocolFeeRecipient.sol": "ProtocolFeeRecipient"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 888888
},
"remappings": [
":@chainlink/=node_modules/@chainlink/",
":@ensdomains/=node_modules/@ensdomains/",
":@eth-optimism/=node_modules/@eth-optimism/",
":@looksrare/=node_modules/@looksrare/",
":@openzeppelin/=node_modules/@openzeppelin/",
":ds-test/=lib/forge-std/lib/ds-test/src/",
":eth-gas-reporter/=node_modules/eth-gas-reporter/",
":forge-std/=lib/forge-std/src/",
":hardhat/=node_modules/hardhat/",
":murky/=lib/murky/src/",
":openzeppelin-contracts/=lib/murky/lib/openzeppelin-contracts/",
":solmate/=node_modules/solmate/"
]
}
[{"inputs":[{"internalType":"address","name":"_feeSharingSetter","type":"address"},{"internalType":"address","name":"_weth","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ERC20TransferFail","type":"error"},{"inputs":[],"name":"NotAContract","type":"error"},{"inputs":[],"name":"NothingToTransfer","type":"error"},{"inputs":[],"name":"FEE_SHARING_SETTER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"contract IWETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"currency","type":"address"}],"name":"transferERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]