Cryo Explorer Ethereum Mainnet

Address Contract Verified

Address 0xFC775e36eA0Da8E0b70B264a988827180aE8cB5F
Balance 0 ETH
Nonce 1
Code Size 1164 bytes
Indexed Transactions 0
External Etherscan · Sourcify

Contract Bytecode

1164 bytes
0x608060405234801561000f575f80fd5b5060043610610060575f3560e01c8063715018a6146100645780638da5cb5b1461006e578063ab63e69c1461008d578063f2fde38b146100a0578063f71a55f8146100b3578063fbac3951146100c6575b5f80fd5b61006c610101565b005b5f546040516001600160a01b0390911681526020015b60405180910390f35b61006c61009b366004610329565b610114565b61006c6100ae3660046103b3565b6101c6565b61006c6100c1366004610329565b610208565b6100f16100d43660046103b3565b6001600160a01b03165f9081526001602052604090205460ff1690565b6040519015158152602001610084565b6101096102ae565b6101125f6102da565b565b61011c6102ae565b5f5b81811015610188575f60015f85858581811061013c5761013c6103d3565b905060200201602081019061015191906103b3565b6001600160a01b0316815260208101919091526040015f20805460ff1916911515919091179055610181816103e7565b905061011e565b507f825ac0fb57c227a7d56aba274d9e0e69c9c6b837841a26298e3e0148c201ba2882826040516101ba92919061040b565b60405180910390a15050565b6101ce6102ae565b6001600160a01b0381166101fc57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b610205816102da565b50565b6102106102ae565b5f5b8181101561027c576001805f858585818110610230576102306103d3565b905060200201602081019061024591906103b3565b6001600160a01b0316815260208101919091526040015f20805460ff1916911515919091179055610275816103e7565b9050610212565b507f3a615a701ac9b684212c0070be113e8c7847390b2cb8a03c9998684e2a86ae2982826040516101ba92919061040b565b5f546001600160a01b031633146101125760405163118cdaa760e01b81523360048201526024016101f3565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f806020838503121561033a575f80fd5b823567ffffffffffffffff80821115610351575f80fd5b818501915085601f830112610364575f80fd5b813581811115610372575f80fd5b8660208260051b8501011115610386575f80fd5b60209290920196919550909350505050565b80356001600160a01b03811681146103ae575f80fd5b919050565b5f602082840312156103c3575f80fd5b6103cc82610398565b9392505050565b634e487b7160e01b5f52603260045260245ffd5b5f6001820161040457634e487b7160e01b5f52601160045260245ffd5b5060010190565b60208082528181018390525f908460408401835b8681101561044b576001600160a01b0361043884610398565b168252918301919083019060010161041f565b50969550505050505056fea26469706673582212205077d9d524eff38cf7da73dd3279bd38f985565a54483e47b1c83338af59f93464736f6c63430008140033

Verified Source Code Full Match

Compiler: v0.8.20+commit.a1b79de6 EVM: shanghai Optimization: Yes (200 runs)
Blocklist.sol 51 lines
pragma solidity 0.8.20;

import {Ownable} from "openzeppelin/access/Ownable.sol";
import {IBlockList} from "../../src/interfaces/ITransferBlockList.sol";

/**
 * @title Blocklist
 * @author Ondo Finance
 * @notice This contract manages the blocklist status for accounts.
 */
contract Blocklist is IBlockList, Ownable {
    constructor(address owner) Ownable(owner) {}

    // {<address> => is account blocked}
    mapping(address => bool) private blockedAddresses;

    /**
     * @notice Function to add a list of accounts to the blocklist
     *
     * @param accounts Array of addresses to block
     */
    function addToBlocklist(address[] calldata accounts) external onlyOwner {
        for (uint256 i; i < accounts.length; ++i) {
            blockedAddresses[accounts[i]] = true;
        }
        emit BlockedAddressesAdded(accounts);
    }

    /**
     * @notice Function to remove a list of accounts from the blocklist
     *
     * @param accounts Array of addresses to unblock
     */
    function removeFromBlocklist(address[] calldata accounts) external onlyOwner {
        for (uint256 i; i < accounts.length; ++i) {
            blockedAddresses[accounts[i]] = false;
        }
        emit BlockedAddressesRemoved(accounts);
    }

    /**
     * @notice Function to check if an account is blocked
     *
     * @param addr Address to check
     *
     * @return True if account is blocked, false otherwise
     */
    function isBlocked(address addr) external view returns (bool) {
        return blockedAddresses[addr];
    }
}
Ownable.sol 100 lines
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

pragma solidity ^0.8.20;

import {Context} from "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * The initial owner is set to the address provided by the deployer. This can
 * later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}
ITransferBlockList.sol 39 lines
// SPDX-License-Identifier: MIT
pragma solidity 0.8.20;

// @dev inspired by ONDO-USDY
interface IBlockListClient {
    /// @notice Returns the address of the blocklist that this client setup
    function blocklist() external view returns (address);

    /// @notice Update the blocklist address
    function setBlocklist(address registry) external;

    /// @notice Check if a address is blocked or not
    function isBlocked(address account) external view returns (bool);

    /**
     * @dev Event for when the blocklist reference is set
     * @param oldBlocklist The old blocklist
     * @param newBlocklist The new blocklist
     */
    event BlocklistSet(address oldBlocklist, address newBlocklist);
}

interface IBlockList {
    function addToBlocklist(address[] calldata accounts) external;
    function removeFromBlocklist(address[] calldata accounts) external;
    function isBlocked(address account) external view returns (bool);

    /**
     * @notice Event emitted when addresses are added to the blocklist
     * @param accounts The addresses that were added to the blocklist
     */
    event BlockedAddressesAdded(address[] accounts);

    /**
     * @notice Event emitted when addresses are removed from the blocklist
     * @param accounts The addresses that were removed from the blocklist
     */
    event BlockedAddressesRemoved(address[] accounts);
}
Context.sol 28 lines
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)

pragma solidity ^0.8.20;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
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;
    }
}

Read Contract

isBlocked 0xfbac3951 → bool
owner 0x8da5cb5b → address

Write Contract 4 functions

These functions modify contract state and require a wallet transaction to execute.

addToBlocklist 0xf71a55f8
address[] accounts
removeFromBlocklist 0xab63e69c
address[] accounts
renounceOwnership 0x715018a6
No parameters
transferOwnership 0xf2fde38b
address newOwner

Recent Transactions

No transactions found for this address