Address Contract Verified
Address
0xFC775e36eA0Da8E0b70B264a988827180aE8cB5F
Balance
0 ETH
Nonce
1
Code Size
1164 bytes
Creator
0x207E8047...82f8 at tx 0x93a12412...9b1f33
Indexed Transactions
0
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