Cryo Explorer Ethereum Mainnet

Address Contract Verified

Address 0x6120fA4b79AB3672322EE5bA8eD59d4303D0ff06
Balance 0.005000 ETH
Nonce 1
Code Size 3489 bytes
Indexed Transactions 0
External Etherscan · Sourcify

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