Source Code
Overview
HYPE Balance
HYPE Value
$0.00View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Cross-Chain Transactions
Loading...
Loading
Contract Name:
PauserRegistry
Compiler Version
v0.8.26+commit.8a97fa7a
Optimization Enabled:
Yes with 200 runs
Other Settings:
cancun EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.20;
/* ========== IMPORTS ========== */
import {AccessControlEnumerableUpgradeable} from
"@openzeppelin/contracts-upgradeable/access/extensions/AccessControlEnumerableUpgradeable.sol";
import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
import {EnumerableSet} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
import {IPauserRegistry} from "./interfaces/IPauserRegistry.sol";
/**
* @title PauserRegistry
* @notice Registry contract that manages pause states for protocol contracts
* @dev Implements role-based access control for pausing functionality
*/
contract PauserRegistry is IPauserRegistry, Initializable, AccessControlEnumerableUpgradeable {
/// @custom:oz-upgrades-unsafe-allow constructor
constructor() {
_disableInitializers();
}
/* ========== LIBRARIES ========== */
using EnumerableSet for EnumerableSet.AddressSet;
/* ========== STATE VARIABLES ========== */
// Constants
bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");
bytes32 public constant UNPAUSER_ROLE = keccak256("UNPAUSER_ROLE");
bytes32 public constant PAUSE_ALL_ROLE = keccak256("PAUSE_ALL_ROLE");
// Pause state tracking
mapping(address => bool) public isPaused;
// Contract management
EnumerableSet.AddressSet private _authorizedContracts;
/* ========== INITIALIZATION ========== */
/**
* @notice Initializes the registry with admin and role assignments
* @param admin Address that will receive the DEFAULT_ADMIN_ROLE
* @param pauser Address that will receive the PAUSER_ROLE
* @param unpauser Address that will receive the UNPAUSER_ROLE
* @param pauseAll Address that will receive the PAUSE_ALL_ROLE
* @param contracts Initial set of authorized contracts
*/
function initialize(address admin, address pauser, address unpauser, address pauseAll, address[] memory contracts)
public
initializer
{
// Validate input addresses
require(admin != address(0), "Invalid admin address");
require(pauser != address(0), "Invalid pauser address");
require(unpauser != address(0), "Invalid unpauser address");
require(pauseAll != address(0), "Invalid pauseAll address");
// Initialize inherited contracts
__AccessControlEnumerable_init();
// Setup role hierarchy
_setRoleAdmin(PAUSER_ROLE, DEFAULT_ADMIN_ROLE);
_setRoleAdmin(UNPAUSER_ROLE, DEFAULT_ADMIN_ROLE);
_setRoleAdmin(PAUSE_ALL_ROLE, DEFAULT_ADMIN_ROLE);
// Grant roles
_grantRole(DEFAULT_ADMIN_ROLE, admin);
_grantRole(PAUSER_ROLE, pauser);
_grantRole(UNPAUSER_ROLE, unpauser);
_grantRole(PAUSE_ALL_ROLE, pauseAll);
// Register initial contracts
for (uint256 i = 0; i < contracts.length; i++) {
_authorizedContracts.add(contracts[i]);
}
}
/* ========== PAUSE FUNCTIONS ========== */
/**
* @notice Pauses a specific contract
* @param contractAddress Address of the contract to pause
*/
function pauseContract(address contractAddress) external onlyRole(PAUSER_ROLE) {
require(_authorizedContracts.contains(contractAddress), "Contract not authorized");
require(!isPaused[contractAddress], "Contract already paused");
isPaused[contractAddress] = true;
emit ContractPaused(contractAddress);
}
/**
* @notice Unpauses a specific contract
* @param contractAddress Address of the contract to unpause
*/
function unpauseContract(address contractAddress) external onlyRole(UNPAUSER_ROLE) {
require(_authorizedContracts.contains(contractAddress), "Contract not authorized");
require(isPaused[contractAddress], "Contract not paused");
isPaused[contractAddress] = false;
emit ContractUnpaused(contractAddress);
}
/**
* @notice Emergency function to pause all authorized contracts
*/
function emergencyPauseAll() external onlyRole(PAUSE_ALL_ROLE) {
uint256 length = _authorizedContracts.length();
for (uint256 i = 0; i < length; i++) {
address contractAddress = _authorizedContracts.at(i);
if (!isPaused[contractAddress]) {
isPaused[contractAddress] = true;
emit ContractPaused(contractAddress);
}
}
}
/* ========== AUTHORIZATION FUNCTIONS ========== */
/**
* @notice Authorizes a contract to be pausable
* @param contractAddress Address of the contract to authorize
*/
function authorizeContract(address contractAddress) external onlyRole(DEFAULT_ADMIN_ROLE) {
require(contractAddress != address(0), "Invalid contract address");
require(!_authorizedContracts.contains(contractAddress), "Contract already authorized");
_authorizedContracts.add(contractAddress);
emit ContractAuthorized(contractAddress);
}
/**
* @notice Removes authorization from a contract
* @param contractAddress Address of the contract to deauthorize
*/
function deauthorizeContract(address contractAddress) external onlyRole(DEFAULT_ADMIN_ROLE) {
require(_authorizedContracts.contains(contractAddress), "Contract not authorized");
_authorizedContracts.remove(contractAddress);
emit ContractDeauthorized(contractAddress);
}
/* ========== VIEW FUNCTIONS ========== */
/**
* @notice Checks if a contract is authorized
* @param contractAddress The address of the contract to check
* @return bool True if the contract is authorized
*/
function isAuthorizedContract(address contractAddress) external view returns (bool) {
return _authorizedContracts.contains(contractAddress);
}
/**
* @notice Gets all authorized contracts
* @return address[] Array of authorized contract addresses
*/
function getAuthorizedContracts() external view returns (address[] memory) {
return _authorizedContracts.values();
}
/**
* @notice Gets the count of authorized contracts
* @return uint256 Number of authorized contracts
*/
function getAuthorizedContractCount() external view returns (uint256) {
return _authorizedContracts.length();
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (access/extensions/AccessControlEnumerable.sol)
pragma solidity ^0.8.20;
import {IAccessControlEnumerable} from "@openzeppelin/contracts/access/extensions/IAccessControlEnumerable.sol";
import {AccessControlUpgradeable} from "../AccessControlUpgradeable.sol";
import {EnumerableSet} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
import {Initializable} from "../../proxy/utils/Initializable.sol";
/**
* @dev Extension of {AccessControl} that allows enumerating the members of each role.
*/
abstract contract AccessControlEnumerableUpgradeable is Initializable, IAccessControlEnumerable, AccessControlUpgradeable {
using EnumerableSet for EnumerableSet.AddressSet;
/// @custom:storage-location erc7201:openzeppelin.storage.AccessControlEnumerable
struct AccessControlEnumerableStorage {
mapping(bytes32 role => EnumerableSet.AddressSet) _roleMembers;
}
// keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.AccessControlEnumerable")) - 1)) & ~bytes32(uint256(0xff))
bytes32 private constant AccessControlEnumerableStorageLocation = 0xc1f6fe24621ce81ec5827caf0253cadb74709b061630e6b55e82371705932000;
function _getAccessControlEnumerableStorage() private pure returns (AccessControlEnumerableStorage storage $) {
assembly {
$.slot := AccessControlEnumerableStorageLocation
}
}
function __AccessControlEnumerable_init() internal onlyInitializing {
}
function __AccessControlEnumerable_init_unchained() internal onlyInitializing {
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IAccessControlEnumerable).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @dev Returns one of the accounts that have `role`. `index` must be a
* value between 0 and {getRoleMemberCount}, non-inclusive.
*
* Role bearers are not sorted in any particular way, and their ordering may
* change at any point.
*
* WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure
* you perform all queries on the same block. See the following
* https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]
* for more information.
*/
function getRoleMember(bytes32 role, uint256 index) public view virtual returns (address) {
AccessControlEnumerableStorage storage $ = _getAccessControlEnumerableStorage();
return $._roleMembers[role].at(index);
}
/**
* @dev Returns the number of accounts that have `role`. Can be used
* together with {getRoleMember} to enumerate all bearers of a role.
*/
function getRoleMemberCount(bytes32 role) public view virtual returns (uint256) {
AccessControlEnumerableStorage storage $ = _getAccessControlEnumerableStorage();
return $._roleMembers[role].length();
}
/**
* @dev Return all accounts that have `role`
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function getRoleMembers(bytes32 role) public view virtual returns (address[] memory) {
AccessControlEnumerableStorage storage $ = _getAccessControlEnumerableStorage();
return $._roleMembers[role].values();
}
/**
* @dev Overload {AccessControl-_grantRole} to track enumerable memberships
*/
function _grantRole(bytes32 role, address account) internal virtual override returns (bool) {
AccessControlEnumerableStorage storage $ = _getAccessControlEnumerableStorage();
bool granted = super._grantRole(role, account);
if (granted) {
$._roleMembers[role].add(account);
}
return granted;
}
/**
* @dev Overload {AccessControl-_revokeRole} to track enumerable memberships
*/
function _revokeRole(bytes32 role, address account) internal virtual override returns (bool) {
AccessControlEnumerableStorage storage $ = _getAccessControlEnumerableStorage();
bool revoked = super._revokeRole(role, account);
if (revoked) {
$._roleMembers[role].remove(account);
}
return revoked;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (proxy/utils/Initializable.sol)
pragma solidity ^0.8.20;
/**
* @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
* behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an
* external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
* function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
*
* The initialization functions use a version number. Once a version number is used, it is consumed and cannot be
* reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in
* case an upgrade adds a module that needs to be initialized.
*
* For example:
*
* [.hljs-theme-light.nopadding]
* ```solidity
* contract MyToken is ERC20Upgradeable {
* function initialize() initializer public {
* __ERC20_init("MyToken", "MTK");
* }
* }
*
* contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {
* function initializeV2() reinitializer(2) public {
* __ERC20Permit_init("MyToken");
* }
* }
* ```
*
* TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
* possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
*
* CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
* that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
*
* [CAUTION]
* ====
* Avoid leaving a contract uninitialized.
*
* An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation
* contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke
* the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:
*
* [.hljs-theme-light.nopadding]
* ```
* /// @custom:oz-upgrades-unsafe-allow constructor
* constructor() {
* _disableInitializers();
* }
* ```
* ====
*/
abstract contract Initializable {
/**
* @dev Storage of the initializable contract.
*
* It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions
* when using with upgradeable contracts.
*
* @custom:storage-location erc7201:openzeppelin.storage.Initializable
*/
struct InitializableStorage {
/**
* @dev Indicates that the contract has been initialized.
*/
uint64 _initialized;
/**
* @dev Indicates that the contract is in the process of being initialized.
*/
bool _initializing;
}
// keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Initializable")) - 1)) & ~bytes32(uint256(0xff))
bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00;
/**
* @dev The contract is already initialized.
*/
error InvalidInitialization();
/**
* @dev The contract is not initializing.
*/
error NotInitializing();
/**
* @dev Triggered when the contract has been initialized or reinitialized.
*/
event Initialized(uint64 version);
/**
* @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,
* `onlyInitializing` functions can be used to initialize parent contracts.
*
* Similar to `reinitializer(1)`, except that in the context of a constructor an `initializer` may be invoked any
* number of times. This behavior in the constructor can be useful during testing and is not expected to be used in
* production.
*
* Emits an {Initialized} event.
*/
modifier initializer() {
// solhint-disable-next-line var-name-mixedcase
InitializableStorage storage $ = _getInitializableStorage();
// Cache values to avoid duplicated sloads
bool isTopLevelCall = !$._initializing;
uint64 initialized = $._initialized;
// Allowed calls:
// - initialSetup: the contract is not in the initializing state and no previous version was
// initialized
// - construction: the contract is initialized at version 1 (no reininitialization) and the
// current contract is just being deployed
bool initialSetup = initialized == 0 && isTopLevelCall;
bool construction = initialized == 1 && address(this).code.length == 0;
if (!initialSetup && !construction) {
revert InvalidInitialization();
}
$._initialized = 1;
if (isTopLevelCall) {
$._initializing = true;
}
_;
if (isTopLevelCall) {
$._initializing = false;
emit Initialized(1);
}
}
/**
* @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the
* contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be
* used to initialize parent contracts.
*
* A reinitializer may be used after the original initialization step. This is essential to configure modules that
* are added through upgrades and that require initialization.
*
* When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`
* cannot be nested. If one is invoked in the context of another, execution will revert.
*
* Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in
* a contract, executing them in the right order is up to the developer or operator.
*
* WARNING: Setting the version to 2**64 - 1 will prevent any future reinitialization.
*
* Emits an {Initialized} event.
*/
modifier reinitializer(uint64 version) {
// solhint-disable-next-line var-name-mixedcase
InitializableStorage storage $ = _getInitializableStorage();
if ($._initializing || $._initialized >= version) {
revert InvalidInitialization();
}
$._initialized = version;
$._initializing = true;
_;
$._initializing = false;
emit Initialized(version);
}
/**
* @dev Modifier to protect an initialization function so that it can only be invoked by functions with the
* {initializer} and {reinitializer} modifiers, directly or indirectly.
*/
modifier onlyInitializing() {
_checkInitializing();
_;
}
/**
* @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}.
*/
function _checkInitializing() internal view virtual {
if (!_isInitializing()) {
revert NotInitializing();
}
}
/**
* @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.
* Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized
* to any version. It is recommended to use this to lock implementation contracts that are designed to be called
* through proxies.
*
* Emits an {Initialized} event the first time it is successfully executed.
*/
function _disableInitializers() internal virtual {
// solhint-disable-next-line var-name-mixedcase
InitializableStorage storage $ = _getInitializableStorage();
if ($._initializing) {
revert InvalidInitialization();
}
if ($._initialized != type(uint64).max) {
$._initialized = type(uint64).max;
emit Initialized(type(uint64).max);
}
}
/**
* @dev Returns the highest version that has been initialized. See {reinitializer}.
*/
function _getInitializedVersion() internal view returns (uint64) {
return _getInitializableStorage()._initialized;
}
/**
* @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.
*/
function _isInitializing() internal view returns (bool) {
return _getInitializableStorage()._initializing;
}
/**
* @dev Returns a pointer to the storage namespace.
*/
// solhint-disable-next-line var-name-mixedcase
function _getInitializableStorage() private pure returns (InitializableStorage storage $) {
assembly {
$.slot := INITIALIZABLE_STORAGE
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (utils/structs/EnumerableSet.sol)
// This file was procedurally generated from scripts/generate/templates/EnumerableSet.js.
pragma solidity ^0.8.20;
/**
* @dev Library for managing
* https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
* types.
*
* Sets have the following properties:
*
* - Elements are added, removed, and checked for existence in constant time
* (O(1)).
* - Elements are enumerated in O(n). No guarantees are made on the ordering.
*
* ```solidity
* contract Example {
* // Add the library methods
* using EnumerableSet for EnumerableSet.AddressSet;
*
* // Declare a set state variable
* EnumerableSet.AddressSet private mySet;
* }
* ```
*
* As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
* and `uint256` (`UintSet`) are supported.
*
* [WARNING]
* ====
* Trying to delete such a structure from storage will likely result in data corruption, rendering the structure
* unusable.
* See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.
*
* In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an
* array of EnumerableSet.
* ====
*/
library EnumerableSet {
// To implement this library for multiple types with as little code
// repetition as possible, we write it in terms of a generic Set type with
// bytes32 values.
// The Set implementation uses private functions, and user-facing
// implementations (such as AddressSet) are just wrappers around the
// underlying Set.
// This means that we can only create new EnumerableSets for types that fit
// in bytes32.
struct Set {
// Storage of set values
bytes32[] _values;
// Position is the index of the value in the `values` array plus 1.
// Position 0 is used to mean a value is not in the set.
mapping(bytes32 value => uint256) _positions;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function _add(Set storage set, bytes32 value) private returns (bool) {
if (!_contains(set, value)) {
set._values.push(value);
// The value is stored at length-1, but we add 1 to all indexes
// and use 0 as a sentinel value
set._positions[value] = set._values.length;
return true;
} else {
return false;
}
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function _remove(Set storage set, bytes32 value) private returns (bool) {
// We cache the value's position to prevent multiple reads from the same storage slot
uint256 position = set._positions[value];
if (position != 0) {
// Equivalent to contains(set, value)
// To delete an element from the _values array in O(1), we swap the element to delete with the last one in
// the array, and then remove the last element (sometimes called as 'swap and pop').
// This modifies the order of the array, as noted in {at}.
uint256 valueIndex = position - 1;
uint256 lastIndex = set._values.length - 1;
if (valueIndex != lastIndex) {
bytes32 lastValue = set._values[lastIndex];
// Move the lastValue to the index where the value to delete is
set._values[valueIndex] = lastValue;
// Update the tracked position of the lastValue (that was just moved)
set._positions[lastValue] = position;
}
// Delete the slot where the moved value was stored
set._values.pop();
// Delete the tracked position for the deleted slot
delete set._positions[value];
return true;
} else {
return false;
}
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function _contains(Set storage set, bytes32 value) private view returns (bool) {
return set._positions[value] != 0;
}
/**
* @dev Returns the number of values on the set. O(1).
*/
function _length(Set storage set) private view returns (uint256) {
return set._values.length;
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function _at(Set storage set, uint256 index) private view returns (bytes32) {
return set._values[index];
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function _values(Set storage set) private view returns (bytes32[] memory) {
return set._values;
}
// Bytes32Set
struct Bytes32Set {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _add(set._inner, value);
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _remove(set._inner, value);
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
return _contains(set._inner, value);
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(Bytes32Set storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
return _at(set._inner, index);
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
bytes32[] memory store = _values(set._inner);
bytes32[] memory result;
assembly ("memory-safe") {
result := store
}
return result;
}
// AddressSet
struct AddressSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(AddressSet storage set, address value) internal returns (bool) {
return _add(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(AddressSet storage set, address value) internal returns (bool) {
return _remove(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(AddressSet storage set, address value) internal view returns (bool) {
return _contains(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(AddressSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(AddressSet storage set, uint256 index) internal view returns (address) {
return address(uint160(uint256(_at(set._inner, index))));
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(AddressSet storage set) internal view returns (address[] memory) {
bytes32[] memory store = _values(set._inner);
address[] memory result;
assembly ("memory-safe") {
result := store
}
return result;
}
// UintSet
struct UintSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(UintSet storage set, uint256 value) internal returns (bool) {
return _add(set._inner, bytes32(value));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(UintSet storage set, uint256 value) internal returns (bool) {
return _remove(set._inner, bytes32(value));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(UintSet storage set, uint256 value) internal view returns (bool) {
return _contains(set._inner, bytes32(value));
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(UintSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(UintSet storage set, uint256 index) internal view returns (uint256) {
return uint256(_at(set._inner, index));
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(UintSet storage set) internal view returns (uint256[] memory) {
bytes32[] memory store = _values(set._inner);
uint256[] memory result;
assembly ("memory-safe") {
result := store
}
return result;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
/**
* @title IPauserRegistry
* @notice Interface for the PauserRegistry contract that manages protocol pause states
*/
interface IPauserRegistry {
/* ========== EVENTS ========== */
event ContractPaused(address indexed contractAddress);
event ContractUnpaused(address indexed contractAddress);
event ContractAuthorized(address indexed contractAddress);
event ContractDeauthorized(address indexed contractAddress);
/* ========== VIEW FUNCTIONS ========== */
/**
* @notice Checks if a contract is paused
* @param contractAddress The address of the contract to check
* @return bool True if the contract is paused
*/
function isPaused(address contractAddress) external view returns (bool);
/**
* @notice Checks if a contract is authorized
* @param contractAddress The address of the contract to check
* @return bool True if the contract is authorized
*/
function isAuthorizedContract(address contractAddress) external view returns (bool);
/**
* @notice Gets all authorized contracts
* @return address[] Array of authorized contract addresses
*/
function getAuthorizedContracts() external view returns (address[] memory);
/**
* @notice Gets the count of authorized contracts
* @return uint256 Number of authorized contracts
*/
function getAuthorizedContractCount() external view returns (uint256);
/* ========== MUTATIVE FUNCTIONS ========== */
/**
* @notice Pauses a specific contract
* @param contractAddress The address of the contract to pause
*/
function pauseContract(address contractAddress) external;
/**
* @notice Unpauses a specific contract
* @param contractAddress The address of the contract to unpause
*/
function unpauseContract(address contractAddress) external;
/**
* @notice Pauses all authorized contracts
*/
function emergencyPauseAll() external;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (access/extensions/IAccessControlEnumerable.sol)
pragma solidity ^0.8.20;
import {IAccessControl} from "../IAccessControl.sol";
/**
* @dev External interface of AccessControlEnumerable declared to support ERC-165 detection.
*/
interface IAccessControlEnumerable is IAccessControl {
/**
* @dev Returns one of the accounts that have `role`. `index` must be a
* value between 0 and {getRoleMemberCount}, non-inclusive.
*
* Role bearers are not sorted in any particular way, and their ordering may
* change at any point.
*
* WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure
* you perform all queries on the same block. See the following
* https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]
* for more information.
*/
function getRoleMember(bytes32 role, uint256 index) external view returns (address);
/**
* @dev Returns the number of accounts that have `role`. Can be used
* together with {getRoleMember} to enumerate all bearers of a role.
*/
function getRoleMemberCount(bytes32 role) external view returns (uint256);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/AccessControl.sol)
pragma solidity ^0.8.20;
import {IAccessControl} from "@openzeppelin/contracts/access/IAccessControl.sol";
import {ContextUpgradeable} from "../utils/ContextUpgradeable.sol";
import {ERC165Upgradeable} from "../utils/introspection/ERC165Upgradeable.sol";
import {Initializable} from "../proxy/utils/Initializable.sol";
/**
* @dev Contract module that allows children to implement role-based access
* control mechanisms. This is a lightweight version that doesn't allow enumerating role
* members except through off-chain means by accessing the contract event logs. Some
* applications may benefit from on-chain enumerability, for those cases see
* {AccessControlEnumerable}.
*
* Roles are referred to by their `bytes32` identifier. These should be exposed
* in the external API and be unique. The best way to achieve this is by
* using `public constant` hash digests:
*
* ```solidity
* bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
* ```
*
* Roles can be used to represent a set of permissions. To restrict access to a
* function call, use {hasRole}:
*
* ```solidity
* function foo() public {
* require(hasRole(MY_ROLE, msg.sender));
* ...
* }
* ```
*
* Roles can be granted and revoked dynamically via the {grantRole} and
* {revokeRole} functions. Each role has an associated admin role, and only
* accounts that have a role's admin role can call {grantRole} and {revokeRole}.
*
* By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
* that only accounts with this role will be able to grant or revoke other
* roles. More complex role relationships can be created by using
* {_setRoleAdmin}.
*
* WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
* grant and revoke this role. Extra precautions should be taken to secure
* accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}
* to enforce additional security measures for this role.
*/
abstract contract AccessControlUpgradeable is Initializable, ContextUpgradeable, IAccessControl, ERC165Upgradeable {
struct RoleData {
mapping(address account => bool) hasRole;
bytes32 adminRole;
}
bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;
/// @custom:storage-location erc7201:openzeppelin.storage.AccessControl
struct AccessControlStorage {
mapping(bytes32 role => RoleData) _roles;
}
// keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.AccessControl")) - 1)) & ~bytes32(uint256(0xff))
bytes32 private constant AccessControlStorageLocation = 0x02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800;
function _getAccessControlStorage() private pure returns (AccessControlStorage storage $) {
assembly {
$.slot := AccessControlStorageLocation
}
}
/**
* @dev Modifier that checks that an account has a specific role. Reverts
* with an {AccessControlUnauthorizedAccount} error including the required role.
*/
modifier onlyRole(bytes32 role) {
_checkRole(role);
_;
}
function __AccessControl_init() internal onlyInitializing {
}
function __AccessControl_init_unchained() internal onlyInitializing {
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) public view virtual returns (bool) {
AccessControlStorage storage $ = _getAccessControlStorage();
return $._roles[role].hasRole[account];
}
/**
* @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()`
* is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier.
*/
function _checkRole(bytes32 role) internal view virtual {
_checkRole(role, _msgSender());
}
/**
* @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account`
* is missing `role`.
*/
function _checkRole(bytes32 role, address account) internal view virtual {
if (!hasRole(role, account)) {
revert AccessControlUnauthorizedAccount(account, role);
}
}
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) {
AccessControlStorage storage $ = _getAccessControlStorage();
return $._roles[role].adminRole;
}
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*
* May emit a {RoleGranted} event.
*/
function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {
_grantRole(role, account);
}
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*
* May emit a {RoleRevoked} event.
*/
function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {
_revokeRole(role, account);
}
/**
* @dev Revokes `role` from the calling account.
*
* Roles are often managed via {grantRole} and {revokeRole}: this function's
* purpose is to provide a mechanism for accounts to lose their privileges
* if they are compromised (such as when a trusted device is misplaced).
*
* If the calling account had been revoked `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `callerConfirmation`.
*
* May emit a {RoleRevoked} event.
*/
function renounceRole(bytes32 role, address callerConfirmation) public virtual {
if (callerConfirmation != _msgSender()) {
revert AccessControlBadConfirmation();
}
_revokeRole(role, callerConfirmation);
}
/**
* @dev Sets `adminRole` as ``role``'s admin role.
*
* Emits a {RoleAdminChanged} event.
*/
function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
AccessControlStorage storage $ = _getAccessControlStorage();
bytes32 previousAdminRole = getRoleAdmin(role);
$._roles[role].adminRole = adminRole;
emit RoleAdminChanged(role, previousAdminRole, adminRole);
}
/**
* @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted.
*
* Internal function without access restriction.
*
* May emit a {RoleGranted} event.
*/
function _grantRole(bytes32 role, address account) internal virtual returns (bool) {
AccessControlStorage storage $ = _getAccessControlStorage();
if (!hasRole(role, account)) {
$._roles[role].hasRole[account] = true;
emit RoleGranted(role, account, _msgSender());
return true;
} else {
return false;
}
}
/**
* @dev Attempts to revoke `role` to `account` and returns a boolean indicating if `role` was revoked.
*
* Internal function without access restriction.
*
* May emit a {RoleRevoked} event.
*/
function _revokeRole(bytes32 role, address account) internal virtual returns (bool) {
AccessControlStorage storage $ = _getAccessControlStorage();
if (hasRole(role, account)) {
$._roles[role].hasRole[account] = false;
emit RoleRevoked(role, account, _msgSender());
return true;
} else {
return false;
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (access/IAccessControl.sol)
pragma solidity ^0.8.20;
/**
* @dev External interface of AccessControl declared to support ERC-165 detection.
*/
interface IAccessControl {
/**
* @dev The `account` is missing a role.
*/
error AccessControlUnauthorizedAccount(address account, bytes32 neededRole);
/**
* @dev The caller of a function is not the expected one.
*
* NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.
*/
error AccessControlBadConfirmation();
/**
* @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
*
* `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
* {RoleAdminChanged} not being emitted signaling this.
*/
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);
/**
* @dev Emitted when `account` is granted `role`.
*
* `sender` is the account that originated the contract call. This account bears the admin role (for the granted role).
* Expected in cases where the role was granted using the internal {AccessControl-_grantRole}.
*/
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Emitted when `account` is revoked `role`.
*
* `sender` is the account that originated the contract call:
* - if using `revokeRole`, it is the admin role bearer
* - if using `renounceRole`, it is the role bearer (i.e. `account`)
*/
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) external view returns (bool);
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {AccessControl-_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) external view returns (bytes32);
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function grantRole(bytes32 role, address account) external;
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function revokeRole(bytes32 role, address account) external;
/**
* @dev Revokes `role` from the calling account.
*
* Roles are often managed via {grantRole} and {revokeRole}: this function's
* purpose is to provide a mechanism for accounts to lose their privileges
* if they are compromised (such as when a trusted device is misplaced).
*
* If the calling account had been granted `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `callerConfirmation`.
*/
function renounceRole(bytes32 role, address callerConfirmation) external;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
pragma solidity ^0.8.20;
import {Initializable} from "../proxy/utils/Initializable.sol";
/**
* @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 ContextUpgradeable is Initializable {
function __Context_init() internal onlyInitializing {
}
function __Context_init_unchained() internal onlyInitializing {
}
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;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/ERC165.sol)
pragma solidity ^0.8.20;
import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol";
import {Initializable} from "../../proxy/utils/Initializable.sol";
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC-165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*/
abstract contract ERC165Upgradeable is Initializable, IERC165 {
function __ERC165_init() internal onlyInitializing {
}
function __ERC165_init_unchained() internal onlyInitializing {
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/IERC165.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC-165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[ERC].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}{
"remappings": [
"@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
"@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/",
"ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/",
"erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/",
"forge-std/=lib/forge-std/src/",
"halmos-cheatcodes/=lib/openzeppelin-contracts-upgradeable/lib/halmos-cheatcodes/src/",
"openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/",
"openzeppelin-contracts/=lib/openzeppelin-contracts/"
],
"optimizer": {
"enabled": true,
"runs": 200
},
"metadata": {
"useLiteralContent": false,
"bytecodeHash": "ipfs",
"appendCBOR": true
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"evmVersion": "cancun",
"viaIR": true,
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[],"name":"NotInitializing","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"}],"name":"ContractAuthorized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"}],"name":"ContractDeauthorized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"}],"name":"ContractPaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"}],"name":"ContractUnpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"version","type":"uint64"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSE_ALL_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNPAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"authorizeContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"deauthorizeContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyPauseAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAuthorizedContractCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAuthorizedContracts","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMembers","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"pauser","type":"address"},{"internalType":"address","name":"unpauser","type":"address"},{"internalType":"address","name":"pauseAll","type":"address"},{"internalType":"address[]","name":"contracts","type":"address[]"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"isAuthorizedContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"pauseContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"unpauseContract","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
6080806040523460d0577ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460ff8160401c1660c1576002600160401b03196001600160401b03821601605c575b6040516119cf90816100d58239f35b6001600160401b0319166001600160401b039081177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005581527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a15f80604d565b63f92ee8a960e01b5f5260045ffd5b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a71461102e575080630775ef0f14610f09578063248a9ca314610ee35780632f2ff15d14610eb257806336568abe14610e6e5780635b14f18314610e3257806366d0ead314610df057806367561d9314610ced5780636e861c0e14610c7a5780639010d07c14610c2957806391d1485414610bd45780639ac25d0814610bad578063a217fddf14610b93578063a3246ad314610b23578063adb99c8a146109fa578063aff69e8e146109dd578063ca15c873146109a7578063cf2807d914610923578063d547741f146108eb578063d97b9bd5146107ce578063e63ab1e9146107a7578063f8453e7c146101445763fb1bb9de14610119575f80fd5b34610140575f3660031901126101405760206040515f805160206118fa8339815191528152f35b5f80fd5b346101405760a03660031901126101405761015d6110b1565b61016561109b565b604435906001600160a01b03821690818303610140576064356001600160a01b03811692838203610140576084359567ffffffffffffffff871161014057366023880112156101405786600401359667ffffffffffffffff8811610793578760051b90604051986101d9602084018b611109565b8952602460208a01928201019036821161014057602401915b818310610773575050505f8051602061197a833981519152549560ff8760401c16159667ffffffffffffffff81168015908161076b575b6001149081610761575b159081610758575b506107495767ffffffffffffffff1981166001175f8051602061197a833981519152558761071d575b506001600160a01b0382169182156106e0576001600160a01b0386169081156106a257841561065d5787156106185760ff5f8051602061197a8339815191525460401c1615610609575f8051602061191a8339815191525f8181525f8051602061195a8339815191526020527f75442b0a96088b5456bc4ed01394c96a4feec0f883c9494257d76b96ab1c9b6c8054908290556104379961042c9761042195919490936104169390917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff8380a45f805160206118fa8339815191525f8181525f8051602061195a8339815191526020527f475b312747b0505dfd322c59063ca43b615bb2e6d10fdf52fb58877bbcde401280549082905590917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff8380a45f8051602061193a8339815191525f8181525f8051602061195a8339815191526020527fdc314207cff278e37db3e16a95938ebc928999220747a32f1ffdfcabea6a0b5c80549082905590917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff8380a46112c7565b6105c4575b50611363565b610572575b50611409565b610520575b506114af565b6104ce575b505f5b825181101561047057600581901b83016020015160019190610469906001600160a01b0316611682565b500161043f565b5061047757005b68ff0000000000000000195f8051602061197a83398151915254165f8051602061197a833981519152557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a1005b5f8051602061193a8339815191525f525f805160206118da833981519152602052610519907f9d6852fbad269663be81176de10339e40ee764d0c0f09648c27cadabeaa074086116e8565b508261043c565b5f805160206118fa8339815191525f525f805160206118da83398151915260205261056b907f35fb679ccde267a74e2fe0853f3a66562f6f9abdffd8c46dba2632a167443d266116e8565b5085610431565b5f8051602061191a8339815191525f525f805160206118da8339815191526020526105bd907f5b789a035ea1a5723ef3e3892eb7edd1d6eb03ae2175a5bd1558ffe34206e8666116e8565b5088610426565b5f80525f805160206118da833981519152602052610602907f615f0f9e84155bea8cc509fe18befeb1baf65611e38a6ba60964480fb29dfd446116e8565b508b61041b565b631afcd79f60e31b5f5260045ffd5b60405162461bcd60e51b815260206004820152601860248201527f496e76616c6964207061757365416c6c206164647265737300000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601860248201527f496e76616c696420756e706175736572206164647265737300000000000000006044820152606490fd5b60405162461bcd60e51b8152602060048201526016602482015275496e76616c696420706175736572206164647265737360501b6044820152606490fd5b60405162461bcd60e51b8152602060048201526015602482015274496e76616c69642061646d696e206164647265737360581b6044820152606490fd5b68ffffffffffffffffff191668010000000000000001175f8051602061197a8339815191525588610264565b63f92ee8a960e01b5f5260045ffd5b9050158a61023b565b303b159150610233565b899150610229565b82356001600160a01b0381168103610140578152602092830192016101f2565b634e487b7160e01b5f52604160045260245ffd5b34610140575f3660031901126101405760206040515f8051602061191a8339815191528152f35b34610140576020366003190112610140576107e76110b1565b335f9081527f475b312747b0505dfd322c59063ca43b615bb2e6d10fdf52fb58877bbcde4011602052604090205460ff16156108c7576001600160a01b03165f8181526002602052604090205461083f901515611149565b805f525f60205260ff60405f2054161561088c57805f525f60205260405f2060ff1981541690557f5b65b0c1363b3003db9bcc5e1fd8805a6d6bf5bf6dc9d3431ee4494cd7d117665f80a2005b60405162461bcd60e51b815260206004820152601360248201527210dbdb9d1c9858dd081b9bdd081c185d5cd959606a1b6044820152606490fd5b63e2517d3f60e01b5f52336004525f805160206118fa83398151915260245260445ffd5b346101405760403660031901126101405761092160043561090a61109b565b9061091c6109178261112b565b6111e4565b611270565b005b34610140575f3660031901126101405760405180602060015491828152019060015f527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6905f5b8181106109915761098d8561098181870382611109565b604051918291826110c7565b0390f35b825484526020909301926001928301920161096a565b34610140576020366003190112610140576004355f525f805160206118da833981519152602052602060405f2054604051908152f35b34610140575f366003190112610140576020600154604051908152f35b3461014057602036600319011261014057610a136110b1565b335f9081527f75442b0a96088b5456bc4ed01394c96a4feec0f883c9494257d76b96ab1c9b6b602052604090205460ff1615610aff576001600160a01b03165f81815260026020526040902054610a6b901515611149565b805f525f60205260ff60405f205416610aba57805f525f60205260405f20600160ff198254161790557f81990fd9a5c552b8e3677917d8a03c07678f0d2cb68f88b634aca2022e9bd19f5f80a2005b60405162461bcd60e51b815260206004820152601760248201527f436f6e747261637420616c7265616479207061757365640000000000000000006044820152606490fd5b63e2517d3f60e01b5f52336004525f8051602061191a83398151915260245260445ffd5b34610140576020366003190112610140576004355f525f805160206118da83398151915260205260405f206040519081602082549182815201915f5260205f20905f5b818110610b7d5761098d8561098181870382611109565b8254845260209093019260019283019201610b66565b34610140575f3660031901126101405760206040515f8152f35b34610140575f3660031901126101405760206040515f8051602061193a8339815191528152f35b3461014057604036600319011261014057610bed61109b565b6004355f525f8051602061195a83398151915260205260405f209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b34610140576040366003190112610140576004355f525f805160206118da8339815191526020526020610c6160243560405f206112b2565b905460405160039290921b1c6001600160a01b03168152f35b3461014057602036600319011261014057610c936110b1565b610c9b611195565b6001600160a01b03165f81815260026020526040902054610cbd901515611149565b610cc681611735565b507f54142b7cb3ceaa9e564243ce4cc2303723c842a1144192de6b3c594f68b16a9a5f80a2005b3461014057602036600319011261014057610d066110b1565b610d0e611195565b6001600160a01b03168015610dab57610d32815f52600260205260405f2054151590565b610d6657610d3f81611682565b507f8983a1f3c3cb45c24c8226b5b805e3b6eb49686530b808534b2a920129eff6515f80a2005b60405162461bcd60e51b815260206004820152601b60248201527f436f6e747261637420616c726561647920617574686f72697a656400000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601860248201527f496e76616c696420636f6e7472616374206164647265737300000000000000006044820152606490fd5b34610140576020366003190112610140576020610e286001600160a01b03610e166110b1565b165f52600260205260405f2054151590565b6040519015158152f35b34610140576020366003190112610140576001600160a01b03610e536110b1565b165f525f602052602060ff60405f2054166040519015158152f35b3461014057604036600319011261014057610e8761109b565b336001600160a01b03821603610ea35761092190600435611270565b63334bd91960e11b5f5260045ffd5b3461014057604036600319011261014057610921600435610ed161109b565b90610ede6109178261112b565b61122a565b34610140576020366003190112610140576020610f0160043561112b565b604051908152f35b34610140575f36600319011261014057335f9081527fdc314207cff278e37db3e16a95938ebc928999220747a32f1ffdfcabea6a0b5b602052604090205460ff161561100a576001545f5b818110610f5d57005b600154811015610ff6577fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf68101546001600160a01b03165f81815260208190526040902054600192919060ff1615610fb7575b5001610f54565b805f525f60205260405f208360ff198254161790557f81990fd9a5c552b8e3677917d8a03c07678f0d2cb68f88b634aca2022e9bd19f5f80a283610fb0565b634e487b7160e01b5f52603260045260245ffd5b63e2517d3f60e01b5f52336004525f8051602061193a83398151915260245260445ffd5b34610140576020366003190112610140576004359063ffffffff60e01b821680920361014057602091635a05180f60e01b8114908115611070575b5015158152f35b637965db0b60e01b81149150811561108a575b5083611069565b6301ffc9a760e01b14905083611083565b602435906001600160a01b038216820361014057565b600435906001600160a01b038216820361014057565b60206040818301928281528451809452019201905f5b8181106110ea5750505090565b82516001600160a01b03168452602093840193909201916001016110dd565b90601f8019910116810190811067ffffffffffffffff82111761079357604052565b5f525f8051602061195a833981519152602052600160405f20015490565b1561115057565b60405162461bcd60e51b815260206004820152601760248201527f436f6e7472616374206e6f7420617574686f72697a65640000000000000000006044820152606490fd5b335f9081527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d602052604090205460ff16156111cd57565b63e2517d3f60e01b5f52336004525f60245260445ffd5b5f8181525f8051602061195a8339815191526020908152604080832033845290915290205460ff16156112145750565b63e2517d3f60e01b5f523360045260245260445ffd5b6112348282611555565b918261123f57505090565b5f9182525f805160206118da833981519152602052604090912061126c916001600160a01b0316906116e8565b5090565b61127a82826115e6565b918261128557505090565b5f9182525f805160206118da833981519152602052604090912061126c916001600160a01b031690611808565b8054821015610ff6575f5260205f2001905f90565b6001600160a01b0381165f9081527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d602052604090205460ff1661135e576001600160a01b03165f8181527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d60205260408120805460ff191660011790553391905f805160206118ba8339815191528180a4600190565b505f90565b6001600160a01b0381165f9081527f75442b0a96088b5456bc4ed01394c96a4feec0f883c9494257d76b96ab1c9b6b602052604090205460ff1661135e576001600160a01b03165f8181527f75442b0a96088b5456bc4ed01394c96a4feec0f883c9494257d76b96ab1c9b6b60205260408120805460ff191660011790553391905f8051602061191a833981519152905f805160206118ba8339815191529080a4600190565b6001600160a01b0381165f9081527f475b312747b0505dfd322c59063ca43b615bb2e6d10fdf52fb58877bbcde4011602052604090205460ff1661135e576001600160a01b03165f8181527f475b312747b0505dfd322c59063ca43b615bb2e6d10fdf52fb58877bbcde401160205260408120805460ff191660011790553391905f805160206118fa833981519152905f805160206118ba8339815191529080a4600190565b6001600160a01b0381165f9081527fdc314207cff278e37db3e16a95938ebc928999220747a32f1ffdfcabea6a0b5b602052604090205460ff1661135e576001600160a01b03165f8181527fdc314207cff278e37db3e16a95938ebc928999220747a32f1ffdfcabea6a0b5b60205260408120805460ff191660011790553391905f8051602061193a833981519152905f805160206118ba8339815191529080a4600190565b5f8181525f8051602061195a833981519152602090815260408083206001600160a01b038616845290915290205460ff166115e0575f8181525f8051602061195a833981519152602090815260408083206001600160a01b0395909516808452949091528120805460ff19166001179055339291905f805160206118ba8339815191529080a4600190565b50505f90565b5f8181525f8051602061195a833981519152602090815260408083206001600160a01b038616845290915290205460ff16156115e0575f8181525f8051602061195a833981519152602090815260408083206001600160a01b0395909516808452949091528120805460ff19169055339291907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080a4600190565b805f52600260205260405f2054155f1461135e57600154600160401b811015610793576116d16116bb82600185940160015560016112b2565b819391549060031b91821b915f19901b19161790565b9055600154905f52600260205260405f2055600190565b5f8281526001820160205260409020546115e057805490600160401b82101561079357826117206116bb8460018096018555846112b2565b90558054925f520160205260405f2055600190565b5f8181526002602052604090205480156115e0575f1981018181116117f4576001545f198101919082116117f4578181036117bc575b50505060015480156117a8575f19016117858160016112b2565b8154905f199060031b1b191690556001555f5260026020525f6040812055600190565b634e487b7160e01b5f52603160045260245ffd5b6117de6117cd6116bb9360016112b2565b90549060031b1c92839260016112b2565b90555f52600260205260405f20555f808061176b565b634e487b7160e01b5f52601160045260245ffd5b906001820191815f528260205260405f20548015155f146118b1575f1981018181116117f45782545f198101919082116117f45781810361187c575b505050805480156117a8575f19019061185d82826112b2565b8154905f199060031b1b19169055555f526020525f6040812055600190565b61189c61188c6116bb93866112b2565b90549060031b1c928392866112b2565b90555f528360205260405f20555f8080611844565b505050505f9056fe2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0dc1f6fe24621ce81ec5827caf0253cadb74709b061630e6b55e82371705932000427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a56bdc3c9ec86cb7db110a7699b2ade72f0b8819727d9f7d906b012641505fa7702dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a2646970667358221220fc098bf9dd2275c7fbca54fb91db1d1deb1827e218f0d40bdd9124782343220f64736f6c634300081a0033
Deployed Bytecode
0x6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a71461102e575080630775ef0f14610f09578063248a9ca314610ee35780632f2ff15d14610eb257806336568abe14610e6e5780635b14f18314610e3257806366d0ead314610df057806367561d9314610ced5780636e861c0e14610c7a5780639010d07c14610c2957806391d1485414610bd45780639ac25d0814610bad578063a217fddf14610b93578063a3246ad314610b23578063adb99c8a146109fa578063aff69e8e146109dd578063ca15c873146109a7578063cf2807d914610923578063d547741f146108eb578063d97b9bd5146107ce578063e63ab1e9146107a7578063f8453e7c146101445763fb1bb9de14610119575f80fd5b34610140575f3660031901126101405760206040515f805160206118fa8339815191528152f35b5f80fd5b346101405760a03660031901126101405761015d6110b1565b61016561109b565b604435906001600160a01b03821690818303610140576064356001600160a01b03811692838203610140576084359567ffffffffffffffff871161014057366023880112156101405786600401359667ffffffffffffffff8811610793578760051b90604051986101d9602084018b611109565b8952602460208a01928201019036821161014057602401915b818310610773575050505f8051602061197a833981519152549560ff8760401c16159667ffffffffffffffff81168015908161076b575b6001149081610761575b159081610758575b506107495767ffffffffffffffff1981166001175f8051602061197a833981519152558761071d575b506001600160a01b0382169182156106e0576001600160a01b0386169081156106a257841561065d5787156106185760ff5f8051602061197a8339815191525460401c1615610609575f8051602061191a8339815191525f8181525f8051602061195a8339815191526020527f75442b0a96088b5456bc4ed01394c96a4feec0f883c9494257d76b96ab1c9b6c8054908290556104379961042c9761042195919490936104169390917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff8380a45f805160206118fa8339815191525f8181525f8051602061195a8339815191526020527f475b312747b0505dfd322c59063ca43b615bb2e6d10fdf52fb58877bbcde401280549082905590917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff8380a45f8051602061193a8339815191525f8181525f8051602061195a8339815191526020527fdc314207cff278e37db3e16a95938ebc928999220747a32f1ffdfcabea6a0b5c80549082905590917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff8380a46112c7565b6105c4575b50611363565b610572575b50611409565b610520575b506114af565b6104ce575b505f5b825181101561047057600581901b83016020015160019190610469906001600160a01b0316611682565b500161043f565b5061047757005b68ff0000000000000000195f8051602061197a83398151915254165f8051602061197a833981519152557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a1005b5f8051602061193a8339815191525f525f805160206118da833981519152602052610519907f9d6852fbad269663be81176de10339e40ee764d0c0f09648c27cadabeaa074086116e8565b508261043c565b5f805160206118fa8339815191525f525f805160206118da83398151915260205261056b907f35fb679ccde267a74e2fe0853f3a66562f6f9abdffd8c46dba2632a167443d266116e8565b5085610431565b5f8051602061191a8339815191525f525f805160206118da8339815191526020526105bd907f5b789a035ea1a5723ef3e3892eb7edd1d6eb03ae2175a5bd1558ffe34206e8666116e8565b5088610426565b5f80525f805160206118da833981519152602052610602907f615f0f9e84155bea8cc509fe18befeb1baf65611e38a6ba60964480fb29dfd446116e8565b508b61041b565b631afcd79f60e31b5f5260045ffd5b60405162461bcd60e51b815260206004820152601860248201527f496e76616c6964207061757365416c6c206164647265737300000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601860248201527f496e76616c696420756e706175736572206164647265737300000000000000006044820152606490fd5b60405162461bcd60e51b8152602060048201526016602482015275496e76616c696420706175736572206164647265737360501b6044820152606490fd5b60405162461bcd60e51b8152602060048201526015602482015274496e76616c69642061646d696e206164647265737360581b6044820152606490fd5b68ffffffffffffffffff191668010000000000000001175f8051602061197a8339815191525588610264565b63f92ee8a960e01b5f5260045ffd5b9050158a61023b565b303b159150610233565b899150610229565b82356001600160a01b0381168103610140578152602092830192016101f2565b634e487b7160e01b5f52604160045260245ffd5b34610140575f3660031901126101405760206040515f8051602061191a8339815191528152f35b34610140576020366003190112610140576107e76110b1565b335f9081527f475b312747b0505dfd322c59063ca43b615bb2e6d10fdf52fb58877bbcde4011602052604090205460ff16156108c7576001600160a01b03165f8181526002602052604090205461083f901515611149565b805f525f60205260ff60405f2054161561088c57805f525f60205260405f2060ff1981541690557f5b65b0c1363b3003db9bcc5e1fd8805a6d6bf5bf6dc9d3431ee4494cd7d117665f80a2005b60405162461bcd60e51b815260206004820152601360248201527210dbdb9d1c9858dd081b9bdd081c185d5cd959606a1b6044820152606490fd5b63e2517d3f60e01b5f52336004525f805160206118fa83398151915260245260445ffd5b346101405760403660031901126101405761092160043561090a61109b565b9061091c6109178261112b565b6111e4565b611270565b005b34610140575f3660031901126101405760405180602060015491828152019060015f527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6905f5b8181106109915761098d8561098181870382611109565b604051918291826110c7565b0390f35b825484526020909301926001928301920161096a565b34610140576020366003190112610140576004355f525f805160206118da833981519152602052602060405f2054604051908152f35b34610140575f366003190112610140576020600154604051908152f35b3461014057602036600319011261014057610a136110b1565b335f9081527f75442b0a96088b5456bc4ed01394c96a4feec0f883c9494257d76b96ab1c9b6b602052604090205460ff1615610aff576001600160a01b03165f81815260026020526040902054610a6b901515611149565b805f525f60205260ff60405f205416610aba57805f525f60205260405f20600160ff198254161790557f81990fd9a5c552b8e3677917d8a03c07678f0d2cb68f88b634aca2022e9bd19f5f80a2005b60405162461bcd60e51b815260206004820152601760248201527f436f6e747261637420616c7265616479207061757365640000000000000000006044820152606490fd5b63e2517d3f60e01b5f52336004525f8051602061191a83398151915260245260445ffd5b34610140576020366003190112610140576004355f525f805160206118da83398151915260205260405f206040519081602082549182815201915f5260205f20905f5b818110610b7d5761098d8561098181870382611109565b8254845260209093019260019283019201610b66565b34610140575f3660031901126101405760206040515f8152f35b34610140575f3660031901126101405760206040515f8051602061193a8339815191528152f35b3461014057604036600319011261014057610bed61109b565b6004355f525f8051602061195a83398151915260205260405f209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b34610140576040366003190112610140576004355f525f805160206118da8339815191526020526020610c6160243560405f206112b2565b905460405160039290921b1c6001600160a01b03168152f35b3461014057602036600319011261014057610c936110b1565b610c9b611195565b6001600160a01b03165f81815260026020526040902054610cbd901515611149565b610cc681611735565b507f54142b7cb3ceaa9e564243ce4cc2303723c842a1144192de6b3c594f68b16a9a5f80a2005b3461014057602036600319011261014057610d066110b1565b610d0e611195565b6001600160a01b03168015610dab57610d32815f52600260205260405f2054151590565b610d6657610d3f81611682565b507f8983a1f3c3cb45c24c8226b5b805e3b6eb49686530b808534b2a920129eff6515f80a2005b60405162461bcd60e51b815260206004820152601b60248201527f436f6e747261637420616c726561647920617574686f72697a656400000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601860248201527f496e76616c696420636f6e7472616374206164647265737300000000000000006044820152606490fd5b34610140576020366003190112610140576020610e286001600160a01b03610e166110b1565b165f52600260205260405f2054151590565b6040519015158152f35b34610140576020366003190112610140576001600160a01b03610e536110b1565b165f525f602052602060ff60405f2054166040519015158152f35b3461014057604036600319011261014057610e8761109b565b336001600160a01b03821603610ea35761092190600435611270565b63334bd91960e11b5f5260045ffd5b3461014057604036600319011261014057610921600435610ed161109b565b90610ede6109178261112b565b61122a565b34610140576020366003190112610140576020610f0160043561112b565b604051908152f35b34610140575f36600319011261014057335f9081527fdc314207cff278e37db3e16a95938ebc928999220747a32f1ffdfcabea6a0b5b602052604090205460ff161561100a576001545f5b818110610f5d57005b600154811015610ff6577fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf68101546001600160a01b03165f81815260208190526040902054600192919060ff1615610fb7575b5001610f54565b805f525f60205260405f208360ff198254161790557f81990fd9a5c552b8e3677917d8a03c07678f0d2cb68f88b634aca2022e9bd19f5f80a283610fb0565b634e487b7160e01b5f52603260045260245ffd5b63e2517d3f60e01b5f52336004525f8051602061193a83398151915260245260445ffd5b34610140576020366003190112610140576004359063ffffffff60e01b821680920361014057602091635a05180f60e01b8114908115611070575b5015158152f35b637965db0b60e01b81149150811561108a575b5083611069565b6301ffc9a760e01b14905083611083565b602435906001600160a01b038216820361014057565b600435906001600160a01b038216820361014057565b60206040818301928281528451809452019201905f5b8181106110ea5750505090565b82516001600160a01b03168452602093840193909201916001016110dd565b90601f8019910116810190811067ffffffffffffffff82111761079357604052565b5f525f8051602061195a833981519152602052600160405f20015490565b1561115057565b60405162461bcd60e51b815260206004820152601760248201527f436f6e7472616374206e6f7420617574686f72697a65640000000000000000006044820152606490fd5b335f9081527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d602052604090205460ff16156111cd57565b63e2517d3f60e01b5f52336004525f60245260445ffd5b5f8181525f8051602061195a8339815191526020908152604080832033845290915290205460ff16156112145750565b63e2517d3f60e01b5f523360045260245260445ffd5b6112348282611555565b918261123f57505090565b5f9182525f805160206118da833981519152602052604090912061126c916001600160a01b0316906116e8565b5090565b61127a82826115e6565b918261128557505090565b5f9182525f805160206118da833981519152602052604090912061126c916001600160a01b031690611808565b8054821015610ff6575f5260205f2001905f90565b6001600160a01b0381165f9081527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d602052604090205460ff1661135e576001600160a01b03165f8181527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d60205260408120805460ff191660011790553391905f805160206118ba8339815191528180a4600190565b505f90565b6001600160a01b0381165f9081527f75442b0a96088b5456bc4ed01394c96a4feec0f883c9494257d76b96ab1c9b6b602052604090205460ff1661135e576001600160a01b03165f8181527f75442b0a96088b5456bc4ed01394c96a4feec0f883c9494257d76b96ab1c9b6b60205260408120805460ff191660011790553391905f8051602061191a833981519152905f805160206118ba8339815191529080a4600190565b6001600160a01b0381165f9081527f475b312747b0505dfd322c59063ca43b615bb2e6d10fdf52fb58877bbcde4011602052604090205460ff1661135e576001600160a01b03165f8181527f475b312747b0505dfd322c59063ca43b615bb2e6d10fdf52fb58877bbcde401160205260408120805460ff191660011790553391905f805160206118fa833981519152905f805160206118ba8339815191529080a4600190565b6001600160a01b0381165f9081527fdc314207cff278e37db3e16a95938ebc928999220747a32f1ffdfcabea6a0b5b602052604090205460ff1661135e576001600160a01b03165f8181527fdc314207cff278e37db3e16a95938ebc928999220747a32f1ffdfcabea6a0b5b60205260408120805460ff191660011790553391905f8051602061193a833981519152905f805160206118ba8339815191529080a4600190565b5f8181525f8051602061195a833981519152602090815260408083206001600160a01b038616845290915290205460ff166115e0575f8181525f8051602061195a833981519152602090815260408083206001600160a01b0395909516808452949091528120805460ff19166001179055339291905f805160206118ba8339815191529080a4600190565b50505f90565b5f8181525f8051602061195a833981519152602090815260408083206001600160a01b038616845290915290205460ff16156115e0575f8181525f8051602061195a833981519152602090815260408083206001600160a01b0395909516808452949091528120805460ff19169055339291907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080a4600190565b805f52600260205260405f2054155f1461135e57600154600160401b811015610793576116d16116bb82600185940160015560016112b2565b819391549060031b91821b915f19901b19161790565b9055600154905f52600260205260405f2055600190565b5f8281526001820160205260409020546115e057805490600160401b82101561079357826117206116bb8460018096018555846112b2565b90558054925f520160205260405f2055600190565b5f8181526002602052604090205480156115e0575f1981018181116117f4576001545f198101919082116117f4578181036117bc575b50505060015480156117a8575f19016117858160016112b2565b8154905f199060031b1b191690556001555f5260026020525f6040812055600190565b634e487b7160e01b5f52603160045260245ffd5b6117de6117cd6116bb9360016112b2565b90549060031b1c92839260016112b2565b90555f52600260205260405f20555f808061176b565b634e487b7160e01b5f52601160045260245ffd5b906001820191815f528260205260405f20548015155f146118b1575f1981018181116117f45782545f198101919082116117f45781810361187c575b505050805480156117a8575f19019061185d82826112b2565b8154905f199060031b1b19169055555f526020525f6040812055600190565b61189c61188c6116bb93866112b2565b90549060031b1c928392866112b2565b90555f528360205260405f20555f8080611844565b505050505f9056fe2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0dc1f6fe24621ce81ec5827caf0253cadb74709b061630e6b55e82371705932000427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a56bdc3c9ec86cb7db110a7699b2ade72f0b8819727d9f7d906b012641505fa7702dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a2646970667358221220fc098bf9dd2275c7fbca54fb91db1d1deb1827e218f0d40bdd9124782343220f64736f6c634300081a0033
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in HYPE
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.