Source Code
Overview
ETH Balance
0 ETH
More Info
ContractCreator
Multichain Info
N/A
Latest 25 from a total of 54 transactions
| Transaction Hash |
Method
|
Block
|
From
|
To
|
Amount
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Add Action | 36451149 | 70 days ago | IN | 0 ETH | 0.000000047694 | ||||
| Add Action | 36322361 | 73 days ago | IN | 0 ETH | 0.000000047694 | ||||
| Add Action | 35887024 | 83 days ago | IN | 0 ETH | 0.000000052463 | ||||
| Add Action | 35887017 | 83 days ago | IN | 0 ETH | 0.000000047694 | ||||
| Add Action | 35887008 | 83 days ago | IN | 0 ETH | 0.000000047694 | ||||
| Add Action | 35886999 | 83 days ago | IN | 0 ETH | 0.000000047694 | ||||
| Add Action | 34422096 | 117 days ago | IN | 0 ETH | 0.000000047694 | ||||
| Add Action | 34422059 | 117 days ago | IN | 0 ETH | 0.000000047682 | ||||
| Add Action | 34422024 | 117 days ago | IN | 0 ETH | 0.000000047694 | ||||
| Add Action | 34421982 | 117 days ago | IN | 0 ETH | 0.000000047694 | ||||
| Add Action | 34421960 | 117 days ago | IN | 0 ETH | 0.000000047694 | ||||
| Add Action | 33252994 | 144 days ago | IN | 0 ETH | 0.000000048069 | ||||
| Add Action | 33252990 | 144 days ago | IN | 0 ETH | 0.00000004806 | ||||
| Add Action | 33252985 | 144 days ago | IN | 0 ETH | 0.00000004806 | ||||
| Add Action | 33252980 | 144 days ago | IN | 0 ETH | 0.000000048079 | ||||
| Add Action | 33244042 | 145 days ago | IN | 0 ETH | 0.000000146592 | ||||
| Add Action | 33244031 | 145 days ago | IN | 0 ETH | 0.000000139124 | ||||
| Add Action | 33244026 | 145 days ago | IN | 0 ETH | 0.000000139124 | ||||
| Add Action | 33244015 | 145 days ago | IN | 0 ETH | 0.000000125836 | ||||
| Add Action | 33243486 | 145 days ago | IN | 0 ETH | 0.000000073724 | ||||
| Add Action | 33243482 | 145 days ago | IN | 0 ETH | 0.000000073724 | ||||
| Add Action | 33243474 | 145 days ago | IN | 0 ETH | 0.000000073051 | ||||
| Add Action | 33243470 | 145 days ago | IN | 0 ETH | 0.000000073051 | ||||
| Add Action | 33243011 | 145 days ago | IN | 0 ETH | 0.000000061583 | ||||
| Add Action | 33243006 | 145 days ago | IN | 0 ETH | 0.000000061583 |
Latest 1 internal transaction
| Parent Transaction Hash | Block | From | To | Amount | ||
|---|---|---|---|---|---|---|
| 31139687 | 193 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Name:
ActionManager
Compiler Version
v0.8.26+commit.8a97fa7a
Optimization Enabled:
Yes with 1000 runs
Other Settings:
cancun EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT OR Apache-2.0
pragma solidity ^0.8.26;
import {IActionManager} from "./interfaces/IActionManager.sol";
import {AccessControl} from "@openzeppelin-contracts/access/AccessControl.sol";
/// @title ActionManager
/// @author Otim Labs, Inc.
/// @notice an Otim-owned contract for managing Otim Actions
contract ActionManager is IActionManager, AccessControl {
/// @notice global lock status
bool private _globalLock;
/// @notice mapping of available Actions
mapping(address => bool) private _available;
/// @notice AccessControl role for globally locking Actions
bytes32 public constant KILL_SWITCH_ROLE = keccak256("KILL_SWITCH_ROLE");
/// @dev `owner` is passed-in in the constructor so we don't need to use our deployer key for admin tasks
/// @dev the KILL_SWITCH_ROLE is reserved for globally locking ActionManager in the event of an emergency.
/// `owner` is intended to be a multi-sig, while a `killSwitchOwner` (role granted after deployment) will be a less secure,
/// single-key wallet to allow Otim to take swift action in the event of an emergency. `owner` is also granted the
/// KILL_SWITCH_ROLE so that it can also globally lock ActionManager if necessary.
constructor(address owner) {
// add `owner` to the DEFAULT_ADMIN_ROLE
_grantRole(DEFAULT_ADMIN_ROLE, owner);
/// @dev allows accounts with DEFAULT_ADMIN_ROLE to call `grantRole` and `revokeRole` for KILL_SWITCH_ROLE, see AccessControl.sol
/// after deployment, `owner` will be able to grant the KILL_SWITCH_ROLE to a `killSwitchOwner` account
_setRoleAdmin(KILL_SWITCH_ROLE, DEFAULT_ADMIN_ROLE);
// grant `owner` the KILL_SWITCH_ROLE (so `owner` can also globally lock Actions)
_grantRole(KILL_SWITCH_ROLE, owner);
}
/// @notice makes an Action available for use in Instructions
/// @param action - the address of the Action
function addAction(address action) external onlyRole(DEFAULT_ADMIN_ROLE) {
if (_available[action]) revert AlreadyAdded();
_available[action] = true;
emit ActionAdded(action);
}
/// @notice removes an Action, making it unavailable for use in Instructions
/// @param action - the address of the Action
function removeAction(address action) external onlyRole(DEFAULT_ADMIN_ROLE) {
if (!_available[action]) revert AlreadyRemoved();
delete _available[action];
emit ActionRemoved(action);
}
/// @notice locks all Actions
function lockAllActions() external onlyRole(KILL_SWITCH_ROLE) {
if (_globalLock) revert AlreadyLocked();
_globalLock = true;
emit ActionsGloballyLocked();
}
/// @notice unlocks all Actions
/// @dev does NOT unlock Actions that have been individually locked
function unlockAllActions() external onlyRole(DEFAULT_ADMIN_ROLE) {
if (!_globalLock) revert AlreadyUnlocked();
_globalLock = false;
emit ActionsGloballyUnlocked();
}
/// @inheritdoc IActionManager
function isExecutable(address action) external view returns (bool) {
return _available[action] && !_globalLock;
}
/// @notice returns true if global lock is engaged
function isGloballyLocked() public view returns (bool) {
return _globalLock;
}
}// SPDX-License-Identifier: MIT OR Apache-2.0
pragma solidity ^0.8.26;
/// @title IActionManager
/// @author Otim Labs, Inc.
/// @notice interface for ActionManager contract
interface IActionManager {
/// @notice emitted when an Action is added
event ActionAdded(address indexed action);
/// @notice emitted when an Action is removed
event ActionRemoved(address indexed action);
/// @notice emitted when all Actions are globally locked
event ActionsGloballyLocked();
/// @notice emitted when all Actions are globally unlocked
event ActionsGloballyUnlocked();
error AlreadyAdded();
error AlreadyRemoved();
error AlreadyLocked();
error AlreadyUnlocked();
/// @notice returns Action metadata
/// @param action - the address of the Action
/// @return executable - true if the Action exists and is not locked
function isExecutable(address action) external view returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (access/AccessControl.sol)
pragma solidity ^0.8.20;
import {IAccessControl} from "./IAccessControl.sol";
import {Context} from "../utils/Context.sol";
import {IERC165, ERC165} from "../utils/introspection/ERC165.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 AccessControl is Context, IAccessControl, ERC165 {
struct RoleData {
mapping(address account => bool) hasRole;
bytes32 adminRole;
}
mapping(bytes32 role => RoleData) private _roles;
bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;
/**
* @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);
_;
}
/// @inheritdoc IERC165
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) {
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) {
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 {
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) {
if (!hasRole(role, account)) {
_roles[role].hasRole[account] = true;
emit RoleGranted(role, account, _msgSender());
return true;
} else {
return false;
}
}
/**
* @dev Attempts to revoke `role` from `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) {
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.4.0) (access/IAccessControl.sol)
pragma solidity >=0.8.4;
/**
* @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 to signal 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;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/ERC165.sol)
pragma solidity ^0.8.20;
import {IERC165} from "./IERC165.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 ERC165 is IERC165 {
/// @inheritdoc IERC165
function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)
pragma solidity >=0.4.16;
/**
* @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": [
"@chainlink-contracts/=dependencies/smartcontractkit-chainlink-2.25.0/contracts/",
"@openzeppelin-contracts/=dependencies/@openzeppelin-contracts-5.4.0/",
"@openzeppelin/contracts/=dependencies/@openzeppelin-contracts-5.4.0/",
"@uniswap-universal-router/=dependencies/@uniswap-universal-router-2.0.0/",
"@uniswap-v3-core/=dependencies/@uniswap-v3-core-1.0.2-solc-0.8-simulate/",
"@uniswap-v3-periphery/=dependencies/@uniswap-v3-periphery-1.4.4/",
"forge-std/=dependencies/forge-std-1.10.0/",
"@openzeppelin-contracts-5.4.0/=dependencies/@openzeppelin-contracts-5.4.0/",
"@uniswap-universal-router-2.0.0/=dependencies/@uniswap-universal-router-2.0.0/",
"@uniswap-v3-core-1.0.2-solc-0.8-simulate/=dependencies/@uniswap-v3-core-1.0.2-solc-0.8-simulate/contracts/",
"@uniswap-v3-periphery-1.4.4/=dependencies/@uniswap-v3-periphery-1.4.4/contracts/",
"@uniswap/=dependencies/@uniswap-v3-periphery-1.4.4/node_modules/@uniswap/",
"ds-test/=dependencies/@uniswap-universal-router-2.0.0/lib/forge-std/lib/ds-test/src/",
"erc4626-tests/=dependencies/@uniswap-universal-router-2.0.0/lib/v4-periphery/lib/v4-core/lib/openzeppelin-contracts/lib/erc4626-tests/",
"forge-gas-snapshot/=dependencies/@uniswap-universal-router-2.0.0/lib/permit2/lib/forge-gas-snapshot/src/",
"forge-std-1.10.0/=dependencies/forge-std-1.10.0/src/",
"openzeppelin-contracts/=dependencies/@uniswap-universal-router-2.0.0/lib/permit2/lib/openzeppelin-contracts/",
"permit2/=dependencies/@uniswap-universal-router-2.0.0/lib/permit2/",
"smartcontractkit-chainlink-2.25.0/=dependencies/smartcontractkit-chainlink-2.25.0/",
"solmate/=dependencies/@uniswap-universal-router-2.0.0/lib/solmate/src/",
"v3-periphery/=dependencies/@uniswap-universal-router-2.0.0/lib/v3-periphery/contracts/",
"v4-core/=dependencies/@uniswap-universal-router-2.0.0/lib/v4-periphery/lib/v4-core/src/",
"v4-periphery/=dependencies/@uniswap-universal-router-2.0.0/lib/v4-periphery/"
],
"optimizer": {
"enabled": true,
"runs": 1000
},
"metadata": {
"useLiteralContent": false,
"bytecodeHash": "none",
"appendCBOR": false
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"evmVersion": "cancun",
"viaIR": false
}Contract ABI
API[{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"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":"AlreadyAdded","type":"error"},{"inputs":[],"name":"AlreadyLocked","type":"error"},{"inputs":[],"name":"AlreadyRemoved","type":"error"},{"inputs":[],"name":"AlreadyUnlocked","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"action","type":"address"}],"name":"ActionAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"action","type":"address"}],"name":"ActionRemoved","type":"event"},{"anonymous":false,"inputs":[],"name":"ActionsGloballyLocked","type":"event"},{"anonymous":false,"inputs":[],"name":"ActionsGloballyUnlocked","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":"KILL_SWITCH_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"action","type":"address"}],"name":"addAction","outputs":[],"stateMutability":"nonpayable","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":"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":"action","type":"address"}],"name":"isExecutable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isGloballyLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockAllActions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"action","type":"address"}],"name":"removeAction","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":[],"name":"unlockAllActions","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405234801561000f575f80fd5b50604051610a1d380380610a1d83398101604081905261002e91610161565b6100385f8261006e565b506100505f805160206109fd8339815191525f610117565b6100675f805160206109fd8339815191528261006e565b505061018e565b5f828152602081815260408083206001600160a01b038516845290915281205460ff1661010e575f838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556100c63390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610111565b505f5b92915050565b5f82815260208190526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b5f60208284031215610171575f80fd5b81516001600160a01b0381168114610187575f80fd5b9392505050565b6108628061019b5f395ff3fe608060405234801561000f575f80fd5b50600436106100e5575f3560e01c8063779f594f11610088578063978a0e7e11610063578063978a0e7e146101e8578063a217fddf146101f3578063c448318b146101fa578063d547741f14610221575f80fd5b8063779f594f146101a25780638fff65d2146101aa57806391d14854146101b2575f80fd5b80632a895d20116100c35780632a895d20146101565780632f2ff15d1461016957806336568abe1461017c5780636ede7aba1461018f575f80fd5b806301ffc9a7146100e957806323b9da8214610111578063248a9ca314610126575b5f80fd5b6100fc6100f73660046107a7565b610234565b60405190151581526020015b60405180910390f35b61012461011f366004610808565b6102cc565b005b610148610134366004610821565b5f9081526020819052604090206001015490565b604051908152602001610108565b610124610164366004610808565b610374565b610124610177366004610838565b610418565b61012461018a366004610838565b610442565b6100fc61019d366004610808565b610493565b6101246104c2565b61012461053d565b6100fc6101c0366004610838565b5f918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60015460ff166100fc565b6101485f81565b6101487fd464fd6cf08e6aa82ebe91345be699e75616020b78a7aea0275c11a6e848627881565b61012461022f366004610838565b6105db565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806102c657507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b5f6102d6816105ff565b6001600160a01b0382165f9081526002602052604090205460ff1615610328576040517ff411c32700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0382165f81815260026020526040808220805460ff19166001179055517fd2f292a835dd86c92c7a061331b493087fc429f1d3f1a88a2980f764caad7fc19190a25050565b5f61037e816105ff565b6001600160a01b0382165f9081526002602052604090205460ff166103cf576040517fab5bea8e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0382165f81815260026020526040808220805460ff19169055517f7a758c91970762174b6a2c0063cddad708aaae66d419a1cf5aea62ec95af19319190a25050565b5f82815260208190526040902060010154610432816105ff565b61043c838361060c565b50505050565b6001600160a01b0381163314610484576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61048e82826106b3565b505050565b6001600160a01b0381165f9081526002602052604081205460ff1680156102c6575060015460ff161592915050565b5f6104cc816105ff565b60015460ff16610508576040517f5090d6c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805460ff191690556040517fd34261db910e61bfcbc3f85eef86045acdd949d69af861a65e3b27be0847cc62905f90a150565b7fd464fd6cf08e6aa82ebe91345be699e75616020b78a7aea0275c11a6e8486278610567816105ff565b60015460ff16156105a4576040517f5f0ccd7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805460ff1916811790556040517f6bf144d9c21f7b63737c618fcd507eb87e3eed0ccb74f04251ece1b278c74174905f90a150565b5f828152602081905260409020600101546105f5816105ff565b61043c83836106b3565b6106098133610734565b50565b5f828152602081815260408083206001600160a01b038516845290915281205460ff166106ac575f838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556106643390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016102c6565b505f6102c6565b5f828152602081815260408083206001600160a01b038516845290915281205460ff16156106ac575f838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45060016102c6565b5f828152602081815260408083206001600160a01b038516845290915290205460ff166107a3576040517fe2517d3f0000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024810183905260440160405180910390fd5b5050565b5f602082840312156107b7575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146107e6575f80fd5b9392505050565b80356001600160a01b0381168114610803575f80fd5b919050565b5f60208284031215610818575f80fd5b6107e6826107ed565b5f60208284031215610831575f80fd5b5035919050565b5f8060408385031215610849575f80fd5b82359150610859602084016107ed565b9050925092905056d464fd6cf08e6aa82ebe91345be699e75616020b78a7aea0275c11a6e84862780000000000000000000000006233f5cc17b870ed8921095b67e176dee886ae94
Deployed Bytecode
0x608060405234801561000f575f80fd5b50600436106100e5575f3560e01c8063779f594f11610088578063978a0e7e11610063578063978a0e7e146101e8578063a217fddf146101f3578063c448318b146101fa578063d547741f14610221575f80fd5b8063779f594f146101a25780638fff65d2146101aa57806391d14854146101b2575f80fd5b80632a895d20116100c35780632a895d20146101565780632f2ff15d1461016957806336568abe1461017c5780636ede7aba1461018f575f80fd5b806301ffc9a7146100e957806323b9da8214610111578063248a9ca314610126575b5f80fd5b6100fc6100f73660046107a7565b610234565b60405190151581526020015b60405180910390f35b61012461011f366004610808565b6102cc565b005b610148610134366004610821565b5f9081526020819052604090206001015490565b604051908152602001610108565b610124610164366004610808565b610374565b610124610177366004610838565b610418565b61012461018a366004610838565b610442565b6100fc61019d366004610808565b610493565b6101246104c2565b61012461053d565b6100fc6101c0366004610838565b5f918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60015460ff166100fc565b6101485f81565b6101487fd464fd6cf08e6aa82ebe91345be699e75616020b78a7aea0275c11a6e848627881565b61012461022f366004610838565b6105db565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806102c657507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b5f6102d6816105ff565b6001600160a01b0382165f9081526002602052604090205460ff1615610328576040517ff411c32700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0382165f81815260026020526040808220805460ff19166001179055517fd2f292a835dd86c92c7a061331b493087fc429f1d3f1a88a2980f764caad7fc19190a25050565b5f61037e816105ff565b6001600160a01b0382165f9081526002602052604090205460ff166103cf576040517fab5bea8e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0382165f81815260026020526040808220805460ff19169055517f7a758c91970762174b6a2c0063cddad708aaae66d419a1cf5aea62ec95af19319190a25050565b5f82815260208190526040902060010154610432816105ff565b61043c838361060c565b50505050565b6001600160a01b0381163314610484576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61048e82826106b3565b505050565b6001600160a01b0381165f9081526002602052604081205460ff1680156102c6575060015460ff161592915050565b5f6104cc816105ff565b60015460ff16610508576040517f5090d6c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805460ff191690556040517fd34261db910e61bfcbc3f85eef86045acdd949d69af861a65e3b27be0847cc62905f90a150565b7fd464fd6cf08e6aa82ebe91345be699e75616020b78a7aea0275c11a6e8486278610567816105ff565b60015460ff16156105a4576040517f5f0ccd7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805460ff1916811790556040517f6bf144d9c21f7b63737c618fcd507eb87e3eed0ccb74f04251ece1b278c74174905f90a150565b5f828152602081905260409020600101546105f5816105ff565b61043c83836106b3565b6106098133610734565b50565b5f828152602081815260408083206001600160a01b038516845290915281205460ff166106ac575f838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556106643390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016102c6565b505f6102c6565b5f828152602081815260408083206001600160a01b038516845290915281205460ff16156106ac575f838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45060016102c6565b5f828152602081815260408083206001600160a01b038516845290915290205460ff166107a3576040517fe2517d3f0000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024810183905260440160405180910390fd5b5050565b5f602082840312156107b7575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146107e6575f80fd5b9392505050565b80356001600160a01b0381168114610803575f80fd5b919050565b5f60208284031215610818575f80fd5b6107e6826107ed565b5f60208284031215610831575f80fd5b5035919050565b5f8060408385031215610849575f80fd5b82359150610859602084016107ed565b9050925092905056
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000006233f5cc17b870ed8921095b67e176dee886ae94
-----Decoded View---------------
Arg [0] : owner (address): 0x6233F5cc17B870ed8921095b67e176DEE886aE94
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000006233f5cc17b870ed8921095b67e176dee886ae94
Loading...
Loading
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
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.