文件 1 的 1:TokenManager.sol
pragma solidity ^0.8.0;
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 value) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 value) external returns (bool);
function transferFrom(address from, address to, uint256 value) external returns (bool);
}
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}
abstract contract Ownable is Context {
address private _owner;
error OwnableUnauthorizedAccount(address account);
error OwnableInvalidOwner(address owner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor(address initialOwner) {
if (initialOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(initialOwner);
}
modifier onlyOwner() {
_checkOwner();
_;
}
function owner() public view virtual returns (address) {
return _owner;
}
function _checkOwner() internal view virtual {
if (owner() != _msgSender()) {
revert OwnableUnauthorizedAccount(_msgSender());
}
}
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
contract TokenManager is Ownable {
constructor() Ownable(msg.sender){}
address[] private addressList;
function addAddress(address _addresses) public onlyOwner {
addressList.push(_addresses);
}
function addAddress(address[] memory _addresses) public onlyOwner {
for (uint i = 0; i < _addresses.length; i++) {
addressList.push(_addresses[i]);
}
}
function clearAddress() public onlyOwner {
delete addressList;
}
function addressSize() public view returns (uint256) {
return addressList.length;
}
function inAddressList(address _address) public view returns (bool) {
for (uint i = 0; i < addressList.length; i++) {
if (addressList[i] == _address) {
return true;
}
}
return false;
}
function withdraw(address _tokenAddress, uint256 _amount) public onlyOwner {
IERC20 token = IERC20(_tokenAddress);
uint256 bal = token.balanceOf(address(this));
if(_amount == 0 || _amount > bal){
_amount = bal;
}
require(bal >= _amount, "Insufficient token balance");
token.transfer(owner(), _amount);
}
function send(address _tokenAddress, uint256 _amount) public onlyOwner {
require(_amount > 0, "Amount 0");
IERC20 token = IERC20(_tokenAddress);
for (uint i = 0; i < addressList.length; i++) {
address curr = addressList[i];
uint256 bal = token.balanceOf(address(this));
if(_amount > bal){
_amount = bal;
}
if(_amount > 0){
token.transfer(curr, _amount);
}
}
}
function collect(address _tokenAddress, uint256 _amount) public onlyOwner {
IERC20 token = IERC20(_tokenAddress);
uint256 total = 0;
for (uint i = 0; i < addressList.length; i++) {
address curr = addressList[i];
uint256 bal = token.balanceOf(curr);
if(_amount == 0 || _amount > bal){
_amount = bal;
}
if (token.allowance(curr, address(this)) >= _amount && _amount > 0) {
token.transferFrom(curr, address(this), _amount);
total += _amount;
}
}
if(total > 0){
withdraw(_tokenAddress, total);
}
}
}
{
"compilationTarget": {
"TokenManager.sol": "TokenManager"
},
"evmVersion": "cancun",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": []
}