Address Contract Verified
Address
0x6120fA4b79AB3672322EE5bA8eD59d4303D0ff06
Balance
0.005000 ETH
Nonce
1
Code Size
3489 bytes
Creator
0x47285056...534f at tx 0x33911f6a...dc9eea
Indexed Transactions
0
Contract Bytecode
3489 bytes
0x60806040526004361061012d5760003560e01c8063c0e9d8b0116100a5578063e06118b711610074578063f4b6122211610059578063f4b6122214610379578063f9f6b49b1461038c578063fa12b14c146103ac57600080fd5b8063e06118b714610339578063ec253dbc1461035957600080fd5b8063c0e9d8b01461029a578063d406b88a146102ba578063da20ec6a146102da578063dfc693f0146102f057600080fd5b80636f058fd2116100fc578063a571c0d1116100e1578063a571c0d11461021f578063a6d23e101461023f578063b092abfb1461025f57600080fd5b80636f058fd2146101b75780639f8a13d7146101ef57600080fd5b80630df344af146101395780632ce962cf1461014e5780633fafa1271461016e578063466634291461019757600080fd5b3661013457005b600080fd5b61014c6101473660046109ba565b6103ea565b005b34801561015a57600080fd5b5061014c6101693660046109f8565b6104db565b34801561017a57600080fd5b5061018460035481565b6040519081526020015b60405180910390f35b3480156101a357600080fd5b5061014c6101b2366004610ae2565b610577565b3480156101c357600080fd5b506101d76101d2366004610b98565b610604565b6040516001600160a01b03909116815260200161018e565b3480156101fb57600080fd5b5061020f61020a366004610b98565b610695565b604051901515815260200161018e565b34801561022b57600080fd5b5061014c61023a366004610b98565b6106e1565b34801561024b57600080fd5b506000546101d7906001600160a01b031681565b34801561026b57600080fd5b5061020f61027a366004610bbc565b600660209081526000928352604080842090915290825290205460ff1681565b3480156102a657600080fd5b5061014c6102b5366004610bea565b610719565b3480156102c657600080fd5b5061020f6102d5366004610b98565b6107c4565b3480156102e657600080fd5b5061018460015481565b3480156102fc57600080fd5b5061020f61030b366004610bbc565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561034557600080fd5b506002546101d7906001600160a01b031681565b34801561036557600080fd5b506101d7610374366004610c35565b610839565b61014c610387366004610c4e565b610884565b34801561039857600080fd5b5061020f6103a7366004610b98565b61091b565b3480156103b857600080fd5b5061020f6103c7366004610b98565b6001600160a01b0316600090815260056020526040902054610100900460ff1690565b80336103f582610604565b6001600160a01b03161461041c5760405163e0b2364960e01b815260040160405180910390fd5b6001600160a01b038216600090815260056020526040902054610100900460ff1615610474576040517f3f72e1b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518082018252600180825260208083019182526001600160a01b038616600090815260059091529290922081518154935161ffff1990941690151561ff0019161761010093151593909302929092179091556104d584846001610884565b50505050565b81336104e682610604565b6001600160a01b03161461050d5760405163e0b2364960e01b815260040160405180910390fd5b6001600160a01b038316600090815260056020526040902054610100900460ff1661054b57604051639d38be3360e01b815260040160405180910390fd5b506001600160a01b03919091166000908152600560205260409020805460ff1916911515919091179055565b6002546040517f466634290000000000000000000000000000000000000000000000000000000081526001600160a01b03909116906346663429906105ca90899089908990899089908990600401610ccc565b600060405180830381600087803b1580156105e457600080fd5b505af11580156105f8573d6000803e3d6000fd5b50505050505050505050565b6002546040517f6f058fd20000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301526000921690636f058fd2906024015b6020604051808303816000875af115801561066b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068f9190610d31565b92915050565b6001600160a01b038116600090815260056020526040812054610100900460ff166106c257506000919050565b506001600160a01b031660009081526005602052604090205460ff1690565b6106ea33610695565b15610716573360009081526004602090815260408083206001600160a01b038516845290915290204390555b50565b823361072482610604565b6001600160a01b03161461074b5760405163e0b2364960e01b815260040160405180910390fd5b6001600160a01b038416600090815260056020526040902054610100900460ff1661078957604051639d38be3360e01b815260040160405180910390fd5b506001600160a01b03928316600090815260066020908152604080832094909516825292909252919020805460ff1916911515919091179055565b3360009081526006602090815260408083206001600160a01b038516845290915281205460ff16156107f857506000919050565b61080133610695565b1561083157503360009081526004602090815260408083206001600160a01b039490941683529290522054431490565b506000919050565b6002546040517fec253dbc000000000000000000000000000000000000000000000000000000008152600481018390526000916001600160a01b03169063ec253dbc9060240161064c565b6000546001546040517f8690b8c9000000000000000000000000000000000000000000000000000000008152600481018690526001600160a01b038581166024830152604482019290925260648101849052911690638690b8c99034906084016000604051808303818588803b1580156108fd57600080fd5b505af1158015610911573d6000803e3d6000fd5b5050505050505050565b6002546040517ff9f6b49b0000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152600092169063f9f6b49b906024016020604051808303816000875af1158015610981573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068f9190610d4e565b6001600160a01b038116811461071657600080fd5b600080604083850312156109cd57600080fd5b8235915060208301356109df816109a5565b809150509250929050565b801515811461071657600080fd5b60008060408385031215610a0b57600080fd5b8235610a16816109a5565b915060208301356109df816109ea565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f830112610a6657600080fd5b813567ffffffffffffffff80821115610a8157610a81610a26565b604051601f8301601f19908116603f01168101908282118183101715610aa957610aa9610a26565b81604052838152866020858801011115610ac257600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060008060008060c08789031215610afb57600080fd5b863595506020870135610b0d816109a5565b94506040870135610b1d816109a5565b9350606087013567ffffffffffffffff80821115610b3a57600080fd5b610b468a838b01610a55565b94506080890135915080821115610b5c57600080fd5b610b688a838b01610a55565b935060a0890135915080821115610b7e57600080fd5b50610b8b89828a01610a55565b9150509295509295509295565b600060208284031215610baa57600080fd5b8135610bb5816109a5565b9392505050565b60008060408385031215610bcf57600080fd5b8235610bda816109a5565b915060208301356109df816109a5565b600080600060608486031215610bff57600080fd5b8335610c0a816109a5565b92506020840135610c1a816109a5565b91506040840135610c2a816109ea565b809150509250925092565b600060208284031215610c4757600080fd5b5035919050565b600080600060608486031215610c6357600080fd5b833592506020840135610c75816109a5565b929592945050506040919091013590565b6000815180845260005b81811015610cac57602081850181015186830182015201610c90565b506000602082860101526020601f19601f83011685010191505092915050565b86815260006001600160a01b03808816602084015280871660408401525060c06060830152610cfe60c0830186610c86565b8281036080840152610d108186610c86565b905082810360a0840152610d248185610c86565b9998505050505050505050565b600060208284031215610d4357600080fd5b8151610bb5816109a5565b600060208284031215610d6057600080fd5b8151610bb5816109ea56fea2646970667358221220f7be706641a0a56d6bd42335dfc99d8d6ed778bb3ac9f3ca2a4aa345a15f87a764736f6c63430008180033
Verified Source Code Full Match
Compiler: v0.8.24+commit.e11b9ed9
EVM: paris
Optimization: Yes (1000 runs)
ERC20AntiBot.sol 127 lines
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.24;
/*
&&&&&& &&&&& &%
&&&&&&&&&&&&&&& && &&&&&&&&&&%
&&&&&&& &&&&& #&&&&&&&&&&&&&
&&&&& &&&&&&& && &&&& &% &&&&&&&
&&. &&&&&&&&&& & %&&&&&&& &&&&
&&&& *&&&&&&&&& &&&&&&&&& &&&&
.&&& &&&&&&&& &&&&&&&& &&&
.&&&&&&& &&&&&&& &&&%
&&&&&& &&&&&&
&&&&& /&&&&.
&&&& %&&& #&&&,
&&&&( &&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&
&&&% &&&&&&&&&&&&&&&&&&&&&&&&& &&&
&&& &&&* &&&&&&&&&&&&&&&&&&&&& &&*
&&& .&&&&&& &&&&&&&&&&&&&&&&&&&& &&&&& &&
&&& #&&&&&& &&&&&&&&&&&&&&&&&&&&& &&&&& &&
&&& &&&& &&&&&&&&&&&&&&&&&&&&&& #&& &&&
&&& &&&&&&&&&&&&&&&&&&&&&&&&, *&&&
(&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&%
&&&&&&&&&&&&&&&&& &&&&&
&&&&&&&&&&&&&&&&&& %&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&#
&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&
*/
/*
* ERC20AntiBot contract
* This contract is used to control bad actors using bots on trades
*/
/// @title ERC20AntiBot
/// @author Smithii
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) {}
/// mappings
mapping(address => mapping(address => uint256)) private buyBlock;
mapping(address => Options) private canUseAntiBot;
mapping(address => mapping(address => bool)) public exempts;
/// @inheritdoc IERC20AntiBot
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;
}
/// @inheritdoc IERC20AntiBot
function registerBlock(address _to) external {
if (isActive(msg.sender)) {
buyBlock[msg.sender][_to] = block.number;
}
}
/// set a token address to be registered in the AntiBot
/// @param _tokenAddress the address to check
/// @param _options the options for anti bot
function _setCanUseAntiBot(
address _tokenAddress,
Options memory _options
) internal {
canUseAntiBot[_tokenAddress] = _options;
}
/// @inheritdoc IERC20AntiBot
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);
}
/// @inheritdoc IERC20AntiBot
function setActive(
address _tokenAddress,
bool _active
) external onlyProjectOwner(_tokenAddress) {
if (!canUseAntiBot[_tokenAddress].active)
revert TokenNotActiveOnAntiBot();
canUseAntiBot[_tokenAddress].applied = _active;
}
/// @inheritdoc IERC20AntiBot
function setExempt(
address _tokenAddress,
address _traderAddress,
bool _exempt
) external onlyProjectOwner(_tokenAddress) {
if (!canUseAntiBot[_tokenAddress].active)
revert TokenNotActiveOnAntiBot();
exempts[_tokenAddress][_traderAddress] = _exempt;
}
/// @inheritdoc IERC20AntiBot
function isExempt(
address _tokenAddress,
address _traderAddress
) public view returns (bool) {
return exempts[_tokenAddress][_traderAddress];
}
/// @inheritdoc IERC20AntiBot
function isActive(address _tokenAddress) public view returns (bool) {
if (!canUseAntiBot[_tokenAddress].active) return false;
return canUseAntiBot[_tokenAddress].applied;
}
/// @inheritdoc IERC20AntiBot
function canUse(address _tokenAddress) public view returns (bool) {
return canUseAntiBot[_tokenAddress].active;
}
}
Payable.sol 34 lines
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.24;
/// @title Payable
/// @author Smithii
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));
}
///
/// @param _projectId the project id
/// @param _token the token address
/// @param qty the qty of items to pay
function payService(
bytes32 _projectId,
address _token,
uint256 qty
) public payable {
IPayments(payments).payService{value: msg.value}(
_projectId,
_token,
serviceId,
qty
);
}
receive() external payable {}
}
Indexable.sol 61 lines
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.24;
/// @title Indexable
/// @author Smithii
import {IIndexer} from "../interfaces/marketplace/IIndexer.sol";
abstract contract Indexable {
address public indexer = address(0);
bytes32 public projectId;
/// errors
error NotPtojectOwner();
constructor(address _indexer) {
indexer = _indexer;
}
modifier onlyProjectOwner(address _address) {
if (getProjectAddressOwner(_address) != msg.sender)
revert NotPtojectOwner();
_;
}
/// Registers the project in the Indexer
/// @param _projectId the project id
/// @param _owner the owner of the project
/// @param _contract the contract address
/// @param _contractType the contract type eg. ERC20, ERC721
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
);
}
///
/// @param _projectAddress the project address
function isContractRegistered(
address _projectAddress
) public returns (bool) {
return IIndexer(indexer).isContractRegistered(_projectAddress);
}
///
/// @param _projectId the project id
function getProjectOwner(bytes32 _projectId) public returns (address) {
return IIndexer(indexer).getProjectOwner(_projectId);
}
function getProjectAddressOwner(
address _projectAddress
) public returns (address) {
return IIndexer(indexer).getProjectAddressOwner(_projectAddress);
}
}
IIndexer.sol 77 lines
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.24;
/*
* IIndexer Inteface
*/
/// @title IIndexer
/// @author Smithii
interface IIndexer {
/// Structs
struct Contract {
address contractAddress;
string contracType;
string name;
string symbol;
}
struct Project {
address owner;
Contract[] contracts;
}
/// Errors
error ProjectContractAlreadyRegistered();
error ProjectIndexAlreadyRegistered();
/// Events
event ProjectRegistered(
bytes32 projectId,
address owner,
address contractAddress,
string contractType
);
/// Register a project in the Indexer
/// @param _projectId bytes32 projectId
/// @param _owner the owner of the project
/// @param _contract the contract address
function registerProject(
bytes32 _projectId,
address _owner,
address _contract,
string memory _contractType,
string memory _name,
string memory _symbol
) external;
/// Check if the ProjectIndex is registered
/// @param _projectId bytes32 projectId
/// @return bool if the proyect is aleady registered
function isProjectIndexRegistered(
bytes32 _projectId
) external returns (bool);
/// Check if a contract is registered in the project
/// @param _contract the contract address
/// @return bool if the proyect is aleady registered`
function isContractRegistered(address _contract) external returns (bool);
/// @param _projectId the project Index
function getProjectOwner(bytes32 _projectId) external returns (address);
///
/// @param _projectAddress address of the project
function getProjectAddressOwner(
address _projectAddress
) external returns (address);
///
/// @param _projectAddress address of the project
/// @return address the owner of the project
/// @return address[] the contracts of the project
function getProjectInfoByProjectAddress(
address _projectAddress
) external returns (address, Contract[] memory);
///
/// @param _projectId bytes32 projectId
/// @return address the owner of the project
/// @return address[] the contracts of the project
function getProjectInfoByIndex(
bytes32 _projectId
) external returns (address, Contract[] memory);
}
IPayments.sol 85 lines
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.24;
/*
* IPayments interface
*/
/// @title Payments
/// @author Smithii
interface IPayments {
struct Service {
bytes32 serviceId;
uint256 pricePerItem;
bool active;
}
struct Invoice {
address user;
Service service;
uint256 qty;
uint256 total;
uint256 timestamp;
}
/// Events
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
);
/// Errors
error ServiceNotActive(bytes32 serviceId);
error InvalidTotalAmount();
error ServiceAlreadyPaid(
bytes32 projectId,
address contractAddress,
bytes32 serviceId
);
/// Add a service to the payment program
/// @param _serviceId the service id
/// @param _pricePerItem the price per item
function addService(bytes32 _serviceId, uint256 _pricePerItem) external;
/// Set the service active status
/// @param _serviceId the service id
/// @param _active the active status
function setService(bytes32 _serviceId, bool _active) external;
/// function payService by projectId and contract address
/// @param _projectId bytes32 projectId
/// @param _contract the contract address
/// @param _serviceId the service id
/// @param _qty the qty of items to pay
function payService(
bytes32 _projectId,
address _contract,
bytes32 _serviceId,
uint256 _qty
) external payable;
/// Withdraw per invoice
/// @param _projectId the project id
/// @param _contract the contract address
/// @param _serviceId the service id
/// @param _to the address to withdraw the balance
function withdraw(
bytes32 _projectId,
address _contract,
bytes32 _serviceId,
address payable _to
) external;
/// Withdraw the contract balance
/// @param _to the address to withdraw the balance
function withdrawAll(address payable _to) external;
}
IERC20AntiBot.sol 56 lines
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.24;
/*
* IERC20AntiBot interface
*/
/// @title ERC20AntiBot
/// @author Smithii
interface IERC20AntiBot {
struct Options {
bool applied;
bool active;
}
/// errors
error TokenNotActiveOnAntiBot();
error TokenAlreadyActiveOnAntiBot();
///
/// @param _from the address to check
function isBotDetected(address _from) external returns (bool);
/// Registers the block number of the receiver
/// @param _to the address to register
function registerBlock(address _to) external;
/// Registers and pay for a token address to use the Antibot
/// @param projectId the project id
/// @param _tokenAddress the address to register
function setCanUseAntiBot(
bytes32 projectId,
address _tokenAddress
) external payable;
/// Set the exempt status of a trader
/// @param _tokenAddress the token address
/// @param _traderAddress the trader address
/// @param _exempt the exempt status
function setExempt(
address _tokenAddress,
address _traderAddress,
bool _exempt
) external;
/// helper function to check if the trader is exempt
/// @param _tokenAddress the token address
/// @param _traderAddress the trader address
function isExempt(
address _tokenAddress,
address _traderAddress
) external returns (bool);
///
/// @param _tokenAddress the token address
/// @param _active the active oft he options to be applied
function setActive(address _tokenAddress, bool _active) external;
/// Check if the token address is active to use the Antibot
/// @param _tokenAddress the address to check
function isActive(address _tokenAddress) external returns (bool);
/// Get if the token address can use the Antibot
/// @param _tokenAddress the address to check
function canUse(address _tokenAddress) external returns (bool);
}
Read Contract
canUse 0xfa12b14c → bool
exempts 0xb092abfb → bool
indexer 0xe06118b7 → address
isActive 0x9f8a13d7 → bool
isBotDetected 0xd406b88a → bool
isExempt 0xdfc693f0 → bool
payments 0xa6d23e10 → address
projectId 0x3fafa127 → bytes32
serviceId 0xda20ec6a → bytes32
Write Contract 9 functions
These functions modify contract state and require a wallet transaction to execute.
getProjectAddressOwner 0x6f058fd2
address _projectAddress
returns: address
getProjectOwner 0xec253dbc
bytes32 _projectId
returns: address
isContractRegistered 0xf9f6b49b
address _projectAddress
returns: bool
payService 0xf4b61222
bytes32 _projectId
address _token
uint256 qty
registerBlock 0xa571c0d1
address _to
registerProject 0x46663429
bytes32 _projectId
address _owner
address _contract
string _contractType
string _name
string _symbol
setActive 0x2ce962cf
address _tokenAddress
bool _active
setCanUseAntiBot 0x0df344af
bytes32 projectId
address _tokenAddress
setExempt 0xc0e9d8b0
address _tokenAddress
address _traderAddress
bool _exempt
Recent Transactions
No transactions found for this address