Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
This contract has been verified via Sourcify.
View contract in Sourcify repository
- Contract name:
- OwnedSubscriptionManager
- Optimization enabled
- true
- Compiler version
- v0.8.17+commit.8df45f5f
- Optimization runs
- 5000
- EVM Version
- london
- Verified at
- 2026-03-03T08:00:50.692224Z
Constructor Arguments
000000000000000000000000ad031eee55f595df6dbd61e9ef3b908fad1b3671
Arg [0] (address) : 0xad031eee55f595df6dbd61e9ef3b908fad1b3671
src/filter/OwnedSubscriptionManager.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;
import {IOperatorFilterRegistry} from "../../src/interfaces/IOperatorFilterRegistry.sol";
import {OwnableWithConfirmation} from "../../src/utils/OwnableWithConfirmation.sol";
contract OwnedSubscriptionManager is OwnableWithConfirmation {
IOperatorFilterRegistry immutable registry =
IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);
constructor(address _initialOwner) OwnableWithConfirmation(_initialOwner) {
registry.register(address(this));
}
}
/
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;
import {IOwnable} from "../interfaces/IOwnable.sol";
/// @title Ownable
/// @author Rohan Kulkarni
/// @author Iain Nash
/// @notice Modified from OpenZeppelin Contracts v4.7.3 (access/OwnableUpgradeable.sol)
/// - Uses custom errors declared in IOwnable
/// - Adds optional two-step ownership transfer (`safeTransferOwnership` + `acceptOwnership`)
abstract contract OwnableWithConfirmation is IOwnable {
/// ///
/// STORAGE ///
/// ///
/// @dev The address of the owner
address internal _owner;
/// @dev The address of the pending owner
address internal _pendingOwner;
/// ///
/// MODIFIERS ///
/// ///
/// @dev Ensures the caller is the owner
modifier onlyOwner() {
if (msg.sender != _owner) revert ONLY_OWNER();
_;
}
/// @dev Ensures the caller is the pending owner
modifier onlyPendingOwner() {
if (msg.sender != _pendingOwner) revert ONLY_PENDING_OWNER();
_;
}
/// ///
/// FUNCTIONS ///
/// ///
/// @dev Initializes contract ownership
/// @param _initialOwner The initial owner address
constructor(address _initialOwner) {
_owner = _initialOwner;
emit OwnershipTransferred(address(0), _initialOwner);
}
/// @notice The address of the owner
function owner() public view virtual returns (address) {
return _owner;
}
/// @notice The address of the pending owner
function pendingOwner() public view returns (address) {
return _pendingOwner;
}
/// @notice Forces an ownership transfer from the last owner
/// @param _newOwner The new owner address
function transferOwnership(address _newOwner) public onlyOwner {
_transferOwnership(_newOwner);
}
/// @notice Forces an ownership transfer from any sender
/// @param _newOwner New owner to transfer contract to
/// @dev Ensure is called only from trusted internal code, no access control checks.
function _transferOwnership(address _newOwner) internal {
emit OwnershipTransferred(_owner, _newOwner);
_owner = _newOwner;
if (_pendingOwner != address(0)) delete _pendingOwner;
}
/// @notice Initiates a two-step ownership transfer
/// @param _newOwner The new owner address
function safeTransferOwnership(address _newOwner) public onlyOwner {
_pendingOwner = _newOwner;
emit OwnerPending(_owner, _newOwner);
}
/// @notice Accepts an ownership transfer
function acceptOwnership() public onlyPendingOwner {
emit OwnershipTransferred(_owner, msg.sender);
_owner = _pendingOwner;
delete _pendingOwner;
}
/// @notice Cancels a pending ownership transfer
function cancelOwnershipTransfer() public onlyOwner {
emit OwnerCanceled(_owner, _pendingOwner);
delete _pendingOwner;
}
}
/
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;
/**
* @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.
*
* This ownership interface matches OZ's ownable interface.
*
*/
interface IOwnable {
error ONLY_OWNER();
error ONLY_PENDING_OWNER();
event OwnershipTransferred(
address indexed previousOwner,
address indexed newOwner
);
event OwnerPending(
address indexed previousOwner,
address indexed potentialNewOwner
);
event OwnerCanceled(
address indexed previousOwner,
address indexed potentialNewOwner
);
/**
* @dev Returns the address of the current owner.
*/
function owner() external view returns (address);
}
/
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;
interface IOperatorFilterRegistry {
function isOperatorAllowed(address registrant, address operator) external view returns (bool);
function register(address registrant) external;
function registerAndSubscribe(address registrant, address subscription) external;
function registerAndCopyEntries(address registrant, address registrantToCopy) external;
function updateOperator(address registrant, address operator, bool filtered) external;
function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
function subscribe(address registrant, address registrantToSubscribe) external;
function unsubscribe(address registrant, bool copyExistingEntries) external;
function subscriptionOf(address addr) external returns (address registrant);
function subscribers(address registrant) external returns (address[] memory);
function subscriberAt(address registrant, uint256 index) external returns (address);
function copyEntriesOf(address registrant, address registrantToCopy) external;
function isOperatorFiltered(address registrant, address operator) external returns (bool);
function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
function filteredOperators(address addr) external returns (address[] memory);
function filteredCodeHashes(address addr) external returns (bytes32[] memory);
function filteredOperatorAt(address registrant, uint256 index) external returns (address);
function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
function isRegistered(address addr) external returns (bool);
function codeHashOf(address addr) external returns (bytes32);
function unregister(address registrant) external;
}
Compiler Settings
{"remappings":[":@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/",":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",":ERC721A-Upgradeable/=lib/ERC721A-Upgradeable/contracts/",":base64/=lib/base64/",":ds-test/=lib/forge-std/lib/ds-test/src/",":erc721a-upgradeable/=lib/ERC721A-Upgradeable/contracts/",":forge-std/=lib/forge-std/src/",":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/",":openzeppelin-contracts/=lib/openzeppelin-contracts/"],"optimizer":{"runs":5000,"enabled":true},"metadata":{"bytecodeHash":"ipfs"},"libraries":{},"evmVersion":"london","compilationTarget":{"src/filter/OwnedSubscriptionManager.sol":"OwnedSubscriptionManager"}}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_initialOwner","internalType":"address"}]},{"type":"error","name":"ONLY_OWNER","inputs":[]},{"type":"error","name":"ONLY_PENDING_OWNER","inputs":[]},{"type":"event","name":"OwnerCanceled","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"potentialNewOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"OwnerPending","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"potentialNewOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"acceptOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"cancelOwnershipTransfer","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"pendingOwner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"safeTransferOwnership","inputs":[{"type":"address","name":"_newOwner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"_newOwner","internalType":"address"}]}]
Contract Creation Code
0x60a06040526daaeb6d7670e522a718067333cd4e60805234801561002257600080fd5b50604051610642380380610642833981016040819052610041916100ed565b600080546001600160a01b0319166001600160a01b03831690811782556040518392907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350608051604051632210724360e11b81523060048201526001600160a01b0390911690634420e48690602401600060405180830381600087803b1580156100cf57600080fd5b505af11580156100e3573d6000803e3d6000fd5b505050505061011d565b6000602082840312156100ff57600080fd5b81516001600160a01b038116811461011657600080fd5b9392505050565b60805161050d6101356000396000505061050d6000f3fe608060405234801561001057600080fd5b50600436106100725760003560e01c80638da5cb5b116100505780638da5cb5b1461009c578063e30c3978146100df578063f2fde38b146100fd57600080fd5b806323452b9c14610077578063395db2cd1461008157806379ba509714610094575b600080fd5b61007f610110565b005b61007f61008f36600461049a565b6101d5565b61007f61029c565b60005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b60015473ffffffffffffffffffffffffffffffffffffffff166100b6565b61007f61010b36600461049a565b61037e565b60005473ffffffffffffffffffffffffffffffffffffffff163314610161576040517fd238ed5900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001546000805460405173ffffffffffffffffffffffffffffffffffffffff93841693909116917f682679deecef4dcd49674845cc1e3a075fea9073680aa445a8207d5a4bdea3da91a3600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60005473ffffffffffffffffffffffffffffffffffffffff163314610226576040517fd238ed5900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917f4f2638f5949b9614ef8d5e268cb51348ad7f434a34812bf64b6e95014fbd357e9190a350565b60015473ffffffffffffffffffffffffffffffffffffffff1633146102ed576040517f065cd53100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008054604051339273ffffffffffffffffffffffffffffffffffffffff909216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360018054600080547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff841617909155169055565b60005473ffffffffffffffffffffffffffffffffffffffff1633146103cf576040517fd238ed5900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103d8816103db565b50565b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8381169190911790915560015416156103d857600180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905550565b6000602082840312156104ac57600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146104d057600080fd5b939250505056fea2646970667358221220d32cab87e14abb2acd03692dd6983e7b3b1aa370e27692ad8a36cb9bf439d78564736f6c63430008110033000000000000000000000000ad031eee55f595df6dbd61e9ef3b908fad1b3671
Deployed ByteCode
0x608060405234801561001057600080fd5b50600436106100725760003560e01c80638da5cb5b116100505780638da5cb5b1461009c578063e30c3978146100df578063f2fde38b146100fd57600080fd5b806323452b9c14610077578063395db2cd1461008157806379ba509714610094575b600080fd5b61007f610110565b005b61007f61008f36600461049a565b6101d5565b61007f61029c565b60005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b60015473ffffffffffffffffffffffffffffffffffffffff166100b6565b61007f61010b36600461049a565b61037e565b60005473ffffffffffffffffffffffffffffffffffffffff163314610161576040517fd238ed5900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001546000805460405173ffffffffffffffffffffffffffffffffffffffff93841693909116917f682679deecef4dcd49674845cc1e3a075fea9073680aa445a8207d5a4bdea3da91a3600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60005473ffffffffffffffffffffffffffffffffffffffff163314610226576040517fd238ed5900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917f4f2638f5949b9614ef8d5e268cb51348ad7f434a34812bf64b6e95014fbd357e9190a350565b60015473ffffffffffffffffffffffffffffffffffffffff1633146102ed576040517f065cd53100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008054604051339273ffffffffffffffffffffffffffffffffffffffff909216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360018054600080547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff841617909155169055565b60005473ffffffffffffffffffffffffffffffffffffffff1633146103cf576040517fd238ed5900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103d8816103db565b50565b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8381169190911790915560015416156103d857600180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905550565b6000602082840312156104ac57600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146104d057600080fd5b939250505056fea2646970667358221220d32cab87e14abb2acd03692dd6983e7b3b1aa370e27692ad8a36cb9bf439d78564736f6c63430008110033