编译器
0.8.24+commit.e11b9ed9
文件 1 的 6:ERC20AntiBot.sol
pragma solidity ^0.8.24;
import {IERC20AntiBot} from "./interfaces/services/IERC20AntiBot.sol";
import {Indexable} from "./utils/Indexable.sol";
import {Payable} from "./utils/Payable.sol";
contract ERC20AntiBot is IERC20AntiBot, Payable, Indexable {
constructor(
address _indexer,
address _payments,
string memory _serviceId
) Indexable(_indexer) Payable(_payments, _serviceId) {}
mapping(address => mapping(address => uint256)) private buyBlock;
mapping(address => Options) private canUseAntiBot;
mapping(address => mapping(address => bool)) public exempts;
function isBotDetected(address _from) public view returns (bool) {
if (isExempt(msg.sender, _from)) return false;
if (isActive(msg.sender)) {
return (buyBlock[msg.sender][_from] == block.number);
}
return false;
}
function registerBlock(address _to) external {
if (isActive(msg.sender)) {
buyBlock[msg.sender][_to] = block.number;
}
}
function _setCanUseAntiBot(
address _tokenAddress,
Options memory _options
) internal {
canUseAntiBot[_tokenAddress] = _options;
}
function setCanUseAntiBot(
bytes32 projectId,
address _tokenAddress
) external payable onlyProjectOwner(_tokenAddress) {
if (canUseAntiBot[_tokenAddress].active)
revert TokenAlreadyActiveOnAntiBot();
Options memory _options = Options(true, true);
_setCanUseAntiBot(_tokenAddress, _options);
payService(projectId, _tokenAddress, 1);
}
function setActive(
address _tokenAddress,
bool _active
) external onlyProjectOwner(_tokenAddress) {
if (!canUseAntiBot[_tokenAddress].active)
revert TokenNotActiveOnAntiBot();
canUseAntiBot[_tokenAddress].applied = _active;
}
function setExempt(
address _tokenAddress,
address _traderAddress,
bool _exempt
) external onlyProjectOwner(_tokenAddress) {
if (!canUseAntiBot[_tokenAddress].active)
revert TokenNotActiveOnAntiBot();
exempts[_tokenAddress][_traderAddress] = _exempt;
}
function isExempt(
address _tokenAddress,
address _traderAddress
) public view returns (bool) {
return exempts[_tokenAddress][_traderAddress];
}
function isActive(address _tokenAddress) public view returns (bool) {
if (!canUseAntiBot[_tokenAddress].active) return false;
return canUseAntiBot[_tokenAddress].applied;
}
function canUse(address _tokenAddress) public view returns (bool) {
return canUseAntiBot[_tokenAddress].active;
}
}
文件 2 的 6:IERC20AntiBot.sol
pragma solidity ^0.8.24;
interface IERC20AntiBot {
struct Options {
bool applied;
bool active;
}
error TokenNotActiveOnAntiBot();
error TokenAlreadyActiveOnAntiBot();
function isBotDetected(address _from) external returns (bool);
function registerBlock(address _to) external;
function setCanUseAntiBot(
bytes32 projectId,
address _tokenAddress
) external payable;
function setExempt(
address _tokenAddress,
address _traderAddress,
bool _exempt
) external;
function isExempt(
address _tokenAddress,
address _traderAddress
) external returns (bool);
function setActive(address _tokenAddress, bool _active) external;
function isActive(address _tokenAddress) external returns (bool);
function canUse(address _tokenAddress) external returns (bool);
}
文件 3 的 6:IIndexer.sol
pragma solidity ^0.8.24;
interface IIndexer {
struct Contract {
address contractAddress;
string contracType;
string name;
string symbol;
}
struct Project {
address owner;
Contract[] contracts;
}
error ProjectContractAlreadyRegistered();
error ProjectIndexAlreadyRegistered();
event ProjectRegistered(
bytes32 projectId,
address owner,
address contractAddress,
string contractType
);
function registerProject(
bytes32 _projectId,
address _owner,
address _contract,
string memory _contractType,
string memory _name,
string memory _symbol
) external;
function isProjectIndexRegistered(
bytes32 _projectId
) external returns (bool);
function isContractRegistered(address _contract) external returns (bool);
function getProjectOwner(bytes32 _projectId) external returns (address);
function getProjectAddressOwner(
address _projectAddress
) external returns (address);
function getProjectInfoByProjectAddress(
address _projectAddress
) external returns (address, Contract[] memory);
function getProjectInfoByIndex(
bytes32 _projectId
) external returns (address, Contract[] memory);
}
文件 4 的 6:IPayments.sol
pragma solidity ^0.8.24;
interface IPayments {
struct Service {
bytes32 serviceId;
uint256 pricePerItem;
bool active;
}
struct Invoice {
address user;
Service service;
uint256 qty;
uint256 total;
uint256 timestamp;
}
event ServiceAdded(bytes32 serviceId, string name, uint256 price);
event ServiceSet(bytes32 serviceId, bool active);
event ServicePaid(
bytes32 projectId,
address contractAddress,
bytes32 serviceId,
address user,
uint256 amount,
uint256 timestamp
);
event ServiceWithdraw(
bytes32 projectId,
address contractAddress,
bytes32 serviceId,
uint256 amount
);
error ServiceNotActive(bytes32 serviceId);
error InvalidTotalAmount();
error ServiceAlreadyPaid(
bytes32 projectId,
address contractAddress,
bytes32 serviceId
);
function addService(bytes32 _serviceId, uint256 _pricePerItem) external;
function setService(bytes32 _serviceId, bool _active) external;
function payService(
bytes32 _projectId,
address _contract,
bytes32 _serviceId,
uint256 _qty
) external payable;
function withdraw(
bytes32 _projectId,
address _contract,
bytes32 _serviceId,
address payable _to
) external;
function withdrawAll(address payable _to) external;
}
文件 5 的 6:Indexable.sol
pragma solidity ^0.8.24;
import {IIndexer} from "../interfaces/marketplace/IIndexer.sol";
abstract contract Indexable {
address public indexer = address(0);
bytes32 public projectId;
error NotPtojectOwner();
constructor(address _indexer) {
indexer = _indexer;
}
modifier onlyProjectOwner(address _address) {
if (getProjectAddressOwner(_address) != msg.sender)
revert NotPtojectOwner();
_;
}
function registerProject(
bytes32 _projectId,
address _owner,
address _contract,
string memory _contractType,
string memory _name,
string memory _symbol
) public {
IIndexer(indexer).registerProject(
_projectId,
_owner,
_contract,
_contractType,
_name,
_symbol
);
}
function isContractRegistered(
address _projectAddress
) public returns (bool) {
return IIndexer(indexer).isContractRegistered(_projectAddress);
}
function getProjectOwner(bytes32 _projectId) public returns (address) {
return IIndexer(indexer).getProjectOwner(_projectId);
}
function getProjectAddressOwner(
address _projectAddress
) public returns (address) {
return IIndexer(indexer).getProjectAddressOwner(_projectAddress);
}
}
文件 6 的 6:Payable.sol
pragma solidity ^0.8.24;
import {IPayments} from "../interfaces/marketplace/IPayments.sol";
abstract contract Payable {
address public payments = address(0);
bytes32 public serviceId;
constructor(address _payments, string memory _serviceId) {
payments = _payments;
serviceId = keccak256(abi.encodePacked(_serviceId));
}
function payService(
bytes32 _projectId,
address _token,
uint256 qty
) public payable {
IPayments(payments).payService{value: msg.value}(
_projectId,
_token,
serviceId,
qty
);
}
receive() external payable {}
}
{
"compilationTarget": {
"contracts/ERC20AntiBot.sol": "ERC20AntiBot"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 1000
},
"remappings": []
}
[{"inputs":[{"internalType":"address","name":"_indexer","type":"address"},{"internalType":"address","name":"_payments","type":"address"},{"internalType":"string","name":"_serviceId","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"NotPtojectOwner","type":"error"},{"inputs":[],"name":"TokenAlreadyActiveOnAntiBot","type":"error"},{"inputs":[],"name":"TokenNotActiveOnAntiBot","type":"error"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"canUse","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"exempts","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_projectAddress","type":"address"}],"name":"getProjectAddressOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_projectId","type":"bytes32"}],"name":"getProjectOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"indexer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"}],"name":"isBotDetected","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_projectAddress","type":"address"}],"name":"isContractRegistered","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"address","name":"_traderAddress","type":"address"}],"name":"isExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_projectId","type":"bytes32"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"payService","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"payments","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"projectId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"registerBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_projectId","type":"bytes32"},{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_contract","type":"address"},{"internalType":"string","name":"_contractType","type":"string"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"name":"registerProject","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"serviceId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"bool","name":"_active","type":"bool"}],"name":"setActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"projectId","type":"bytes32"},{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"setCanUseAntiBot","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"address","name":"_traderAddress","type":"address"},{"internalType":"bool","name":"_exempt","type":"bool"}],"name":"setExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]