{"file_path":"apps/baseContracts/contracts/role/base/BaseOperators.sol","creation_status":"success","source_code":"// SPDX-License-Identifier: Unlicensed\n\n/**\n * @title BaseOperators\n * @author Team 3301 <team3301@sygnum.com>\n * @dev For managing operators, admins, and system accounts.\n */\n\npragma solidity ^0.8.0;\n\nimport \"../Roles.sol\";\nimport \"./Operatorable.sol\";\n\ncontract BaseOperators {\n    using Roles for Roles.Role;\n\n    address private _multisig;\n    Roles.Role private _operators;\n    Roles.Role private _admins;\n    Roles.Role private _systems;\n    Roles.Role private _relays;\n\n    /**\n     * @dev Error: \"BaseOperators: caller does not have the admin role\"\n     */\n    error BaseOperatorsCallerNotAdmin();\n\n    /**\n     * @dev Error: \"BaseOperators: caller does not have multisig role\"\n     */\n    error BaseOperatorsCallerNotMultisig();\n\n    /**\n     * @dev Error: \"BaseOperators: caller does not have the admin role nor relay\"\n     */\n    error BaseOperatorsCallerNotAdminOrRelay();\n\n    /**\n     * @dev Error: \"BaseOperators: address cannot be empty.\"\n     */\n    error BaseOperatorsZeroAddress();\n\n    /**\n     * @dev Error: \"BaseOperators: admin can not remove himself\"\n     */\n    error BaseOperatorsAdminRemoveSelf();\n\n    /**\n     * @dev Error: \"BaseOperators: cannot assign new multisig when multisig already assigned\"\n     */\n    error BaseOperatorsMultisigAlreadyAssigned();\n\n    /**\n     * @dev Error: \"BaseOperators: multisig has to be contract\"\n     */\n    error BaseOperatorsMultisigNotContract();\n\n    event OperatorAdded(address indexed caller, address indexed account);\n    event OperatorRemoved(address indexed caller, address indexed account);\n    event AdminAdded(address indexed caller, address indexed account);\n    event AdminRemoved(address indexed caller, address indexed account);\n    event SystemAdded(address indexed caller, address indexed account);\n    event SystemRemoved(address indexed caller, address indexed account);\n    event RelayAdded(address indexed caller, address indexed relay);\n    event RelayRemoved(address indexed caller, address indexed relay);\n    event MultisigChanged(address indexed caller, address indexed multisig);\n\n    /**\n     * @dev Reverts if caller does not have admin role associated.\n     */\n    modifier onlyAdmin() {\n        if (!isAdmin(msg.sender)) revert BaseOperatorsCallerNotAdmin();\n        _;\n    }\n\n    /**\n     * @dev Reverts if caller does not have multisig privileges;\n     */\n    modifier onlyMultisig() {\n        if (!isMultisig(msg.sender)) revert BaseOperatorsCallerNotMultisig();\n        _;\n    }\n\n    /**\n     * @dev Reverts if caller does not have admin or relay role associated.\n     */\n    modifier onlyAdminOrRelay() {\n        if (!isAdmin(msg.sender) && !isRelay(msg.sender)) revert BaseOperatorsCallerNotAdminOrRelay();\n        _;\n    }\n\n    constructor(address _admin) {\n        _addAdmin(_admin);\n    }\n\n    /**\n     * @dev Confirms operator contract address once active.\n     * @param _address Operatorable contract addres.\n     */\n    function confirmFor(address _address) public onlyAdmin {\n        if (_address == address(0)) revert BaseOperatorsZeroAddress();\n        Operatorable(_address).confirmOperatorsContract();\n    }\n\n    /**\n     * @return If '_account' has operator privileges.\n     */\n    function isOperator(address _account) public view returns (bool) {\n        return _operators.has(_account);\n    }\n\n    /**\n     * @dev Admin can give '_account' address operator privileges.\n     * @param _account address that should be given operator privileges.\n     */\n    function addOperator(address _account) public onlyAdminOrRelay {\n        _addOperator(_account);\n    }\n\n    /**\n     * @dev Admin can revoke '_account' address operator privileges.\n     * @param _account address that should be revoked operator privileges.\n     */\n    function removeOperator(address _account) public onlyAdminOrRelay {\n        _removeOperator(_account);\n    }\n\n    /**\n     * @return If '_account' has operator privileges.\n     */\n    function isAdmin(address _account) public view returns (bool) {\n        return _admins.has(_account);\n    }\n\n    /**\n     * @dev Admin can give '_account' address admin privileges.\n     * @param _account address that should be given admin privileges.\n     */\n    function addAdmin(address _account) public onlyAdminOrRelay {\n        _addAdmin(_account);\n    }\n\n    /**\n     * @dev Admin can revoke '_account' address admin privileges.\n     * @param _account address that should be revoked admin privileges.\n     */\n    function removeAdmin(address _account) public onlyAdminOrRelay {\n        if (_account == msg.sender) revert BaseOperatorsAdminRemoveSelf();\n        _removeAdmin(_account);\n    }\n\n    /**\n     * @return If '_account' has admin or operator privileges.\n     */\n    function isOperatorOrAdmin(address _account) public view returns (bool) {\n        return (isAdmin(_account) || isOperator(_account));\n    }\n\n    /**\n     * @return If '_account' has admin and operator privileges, also known as a Super Admin.\n     */\n    function isOperatorAndAdmin(address _account) public view returns (bool) {\n        return (isAdmin(_account) && isOperator(_account));\n    }\n\n    /**\n     * @return If '_account' has system privileges.\n     */\n    function isSystem(address _account) public view returns (bool) {\n        return _systems.has(_account);\n    }\n\n    /**\n     * @dev Admin account or relay contract can give '_account' address system privileges.\n     * @param _account address that should be given system privileges.\n     */\n    function addSystem(address _account) public onlyAdminOrRelay {\n        _addSystem(_account);\n    }\n\n    /**\n     * @dev Admin account or relay contract can revoke '_account' address system privileges.\n     * @param _account address that should be revoked system privileges.\n     */\n    function removeSystem(address _account) public onlyAdminOrRelay {\n        _removeSystem(_account);\n    }\n\n    /**\n     * @return If '_account' has relay privileges.\n     */\n    function isRelay(address _account) public view returns (bool) {\n        return _relays.has(_account);\n    }\n\n    /**\n     * @dev Operator can give '_account' address relay privileges.\n     * @param _account address that should be given relay privileges.\n     */\n    function addRelay(address _account) public onlyAdmin {\n        _addRelay(_account);\n    }\n\n    /**\n     * @dev Operator can revoke '_account' address relay privileges.\n     * @param _account address that should be revoked relay privileges.\n     */\n    function removeRelay(address _account) public onlyAdmin {\n        _removeRelay(_account);\n    }\n\n    /**\n     * @return If '_contract' has multisig privileges.\n     */\n    function isMultisig(address _contract) public view returns (bool) {\n        return _multisig == _contract;\n    }\n\n    /**\n     * @dev Admin can give '_contract' address multisig privileges.\n     * @param _contract address that should be given multisig privileges.\n     */\n    function addMultisig(address _contract) public onlyAdmin {\n        if (_multisig != address(0)) revert BaseOperatorsMultisigAlreadyAssigned();\n        _changeMultisig(_contract);\n    }\n\n    /**\n     * @dev Multisig can change multisig privileges to new multisig '_contract'.\n     * @param _contract address that should be the new multisig.\n     */\n    function changeMultisig(address _contract) public onlyMultisig {\n        _changeMultisig(_contract);\n    }\n\n    /**\n     * @dev Admin can give '_account' address operator and admin privileges making the '_account' a super admin, whereby they can call operator and admin functions.\n     * @param _account address that should be given operator and admin privileges.\n     */\n    function addOperatorAndAdmin(address _account) public onlyAdminOrRelay {\n        _addAdmin(_account);\n        _addOperator(_account);\n    }\n\n    /**\n     * @dev Admin can revoke '_account' address operator and admin privileges.\n     * @param _account address that should be revoked operator and admin privileges.\n     */\n    function removeOperatorAndAdmin(address _account) public onlyAdminOrRelay {\n        if (_account == msg.sender) revert BaseOperatorsAdminRemoveSelf();\n        _removeAdmin(_account);\n        _removeOperator(_account);\n    }\n\n    /**\n     * @dev Admin can change '_account' admin privileges to an operator privileges.\n     * @param _account address that should be given operator and admin privileges.\n     */\n    function changeToOperator(address _account) public onlyAdmin {\n        if (_account == msg.sender) revert BaseOperatorsAdminRemoveSelf();\n        _removeAdmin(_account);\n        _addOperator(_account);\n    }\n\n    /**\n     * @dev Admin can change '_account' operator privileges to admin privileges.\n     * @param _account address that should be given operator and admin privileges.\n     */\n    function changeToAdmin(address _account) public onlyAdmin {\n        _addAdmin(_account);\n        _removeOperator(_account);\n    }\n\n    /** INTERNAL FUNCTIONS */\n    function _addOperator(address _account) internal {\n        _operators.add(_account);\n        emit OperatorAdded(msg.sender, _account);\n    }\n\n    function _removeOperator(address _account) internal {\n        _operators.remove(_account);\n        emit OperatorRemoved(msg.sender, _account);\n    }\n\n    function _addAdmin(address _account) internal {\n        _admins.add(_account);\n        emit AdminAdded(msg.sender, _account);\n    }\n\n    function _removeAdmin(address _account) internal {\n        _admins.remove(_account);\n        emit AdminRemoved(msg.sender, _account);\n    }\n\n    function _addSystem(address _account) internal {\n        _systems.add(_account);\n        emit SystemAdded(msg.sender, _account);\n    }\n\n    function _removeSystem(address _account) internal {\n        _systems.remove(_account);\n        emit SystemRemoved(msg.sender, _account);\n    }\n\n    function _addRelay(address _account) internal {\n        _relays.add(_account);\n        emit RelayAdded(msg.sender, _account);\n    }\n\n    function _removeRelay(address _account) internal {\n        _relays.remove(_account);\n        emit RelayRemoved(msg.sender, _account);\n    }\n\n    function _changeMultisig(address _contract) internal {\n        if (_contract == address(0)) revert BaseOperatorsZeroAddress();\n        if (isMultisig(msg.sender)) {\n            uint32 size;\n            // solhint-disable-next-line\n            assembly {\n                size := extcodesize(_contract)\n            }\n            if (size == 0) revert BaseOperatorsMultisigNotContract();\n        }\n        _multisig = _contract;\n        emit MultisigChanged(msg.sender, _contract);\n    }\n}\n","deployed_bytecode":"0x608060405234801561001057600080fd5b50600436106101625760003560e01c806370480275116100c8578063ad29ad1e1161008c578063cd151e9a11610066578063cd151e9a146102f5578063da1deb7714610308578063f2d4915b1461031b57600080fd5b8063ad29ad1e146102bc578063adadf22f146102cf578063b5d8e0a0146102e257600080fd5b8063704802751461025d57806374be7592146102705780637a6cd424146102835780639870d7fe14610296578063ac8a584a146102a957600080fd5b8063284ba8691161012a57806363724c161161010457806363724c1614610215578063668f6ace146102285780636d70f7ae1461024a57600080fd5b8063284ba869146101dc57806334cdcf26146101ef5780634efca9111461020257600080fd5b80631785f53c146101675780631c130dfb1461017c5780632268a3581461018f57806324d7806c146101a257806326cb32b7146101c9575b600080fd5b61017a610175366004610be9565b61032e565b005b61017a61018a366004610be9565b61039e565b61017a61019d366004610be9565b6103f7565b6101b56101b0366004610be9565b610422565b604051901515815260200160405180910390f35b6101b56101d7366004610be9565b610435565b61017a6101ea366004610be9565b610442565b6101b56101fd366004610be9565b61047a565b61017a610210366004610be9565b610487565b6101b5610223366004610be9565b6104d3565b6101b5610236366004610be9565b6000546001600160a01b0390811691161490565b6101b5610258366004610be9565b6104e9565b61017a61026b366004610be9565b6104f6565b61017a61027e366004610be9565b610539565b61017a610291366004610be9565b61057c565b61017a6102a4366004610be9565b61061f565b61017a6102b7366004610be9565b610659565b61017a6102ca366004610be9565b610693565b61017a6102dd366004610be9565b610700565b61017a6102f0366004610be9565b61072f565b61017a610303366004610be9565b610772565b6101b5610316366004610be9565b6107a1565b61017a610329366004610be9565b6107bc565b61033733610422565b15801561034a575061034833610435565b155b156103685760405163af48085760e01b815260040160405180910390fd5b6001600160a01b0381163314156103925760405163051327d560e51b815260040160405180910390fd5b61039b81610872565b50565b6103a733610422565b6103c4576040516318854eb960e31b815260040160405180910390fd5b6000546001600160a01b0316156103ee5760405163ef1af6b760e01b815260040160405180910390fd5b61039b816108b6565b6000546001600160a01b031633146103ee57604051630fbd325560e41b815260040160405180910390fd5b600061042f600283610970565b92915050565b600061042f600483610970565b61044b33610422565b610468576040516318854eb960e31b815260040160405180910390fd5b610471816109b9565b61039b816109fd565b600061042f600383610970565b61049033610422565b1580156104a357506104a133610435565b155b156104c15760405163af48085760e01b815260040160405180910390fd5b6104ca816109b9565b61039b81610a41565b60006104de82610422565b8061042f575061042f825b600061042f600183610970565b6104ff33610422565b158015610512575061051033610435565b155b156105305760405163af48085760e01b815260040160405180910390fd5b61039b816109b9565b61054233610422565b158015610555575061055333610435565b155b156105735760405163af48085760e01b815260040160405180910390fd5b61039b81610a85565b61058533610422565b6105a2576040516318854eb960e31b815260040160405180910390fd5b6001600160a01b0381166105c95760405163051eaf0960e31b815260040160405180910390fd5b806001600160a01b0316638535a56b6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561060457600080fd5b505af1158015610618573d6000803e3d6000fd5b5050505050565b61062833610422565b15801561063b575061063933610435565b155b156104ca5760405163af48085760e01b815260040160405180910390fd5b61066233610422565b158015610675575061067333610435565b155b156104715760405163af48085760e01b815260040160405180910390fd5b61069c33610422565b1580156106af57506106ad33610435565b155b156106cd5760405163af48085760e01b815260040160405180910390fd5b6001600160a01b0381163314156106f75760405163051327d560e51b815260040160405180910390fd5b61047181610872565b61070933610422565b610726576040516318854eb960e31b815260040160405180910390fd5b61039b81610ac9565b61073833610422565b15801561074b575061074933610435565b155b156107695760405163af48085760e01b815260040160405180910390fd5b61039b81610b0d565b61077b33610422565b610798576040516318854eb960e31b815260040160405180910390fd5b61039b81610b51565b60006107ac82610422565b801561042f575061042f826104e9565b6107c533610422565b6107e2576040516318854eb960e31b815260040160405180910390fd5b6001600160a01b03811633141561080c5760405163051327d560e51b815260040160405180910390fd5b6104ca81610872565b61081f8282610970565b1561084d57604051631cdd30c560e11b81526001600160a01b03821660048201526024015b60405180910390fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b61087d600282610b95565b6040516001600160a01b0382169033907fdb9d5d31320daf5bc7181d565b6da4d12e30f0f4d5aa324a992426c14a1d19ce90600090a350565b6001600160a01b0381166108dd5760405163051eaf0960e31b815260040160405180910390fd5b6000546001600160a01b031633141561091857803b63ffffffff811661091657604051630fc368f160e21b815260040160405180910390fd5b505b6000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081178255604051909133917f3e5e3e2086b161be12b02cc4d84c9d311d30ddf57c469d9c049fde7103970bad9190a350565b60006001600160a01b0382166109995760405163715a169560e01b815260040160405180910390fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b6109c4600282610815565b6040516001600160a01b0382169033907fbf3f493c772c8c283fd124432c2d0f539ab343faa04258fe88e52912d36b102b90600090a350565b610a08600182610b95565b6040516001600160a01b0382169033907f17d7f044d47e4fae1701f86266d0a674db3f792671bd1b974ace77a09af1c82790600090a350565b610a4c600182610815565b6040516001600160a01b0382169033907f0780dc183feb0e4f9714cd802b3c0a21894b7ccb4172c992569d2acb5d45f91c90600090a350565b610a90600382610815565b6040516001600160a01b0382169033907f58697455980eb59b944b84384c012fa6b32a3364287414201b3dcbea7acdaf6390600090a350565b610ad4600482610815565b6040516001600160a01b0382169033907fcda5f74e34a4f80cde48470c969148cc5c4bc01796568c93dce2a89715b1aea290600090a350565b610b18600382610b95565b6040516001600160a01b0382169033907fac2f64866cb52b856ded6feb888af6f5f47f62b1aee3194fc51ff864b9dfdd1b90600090a350565b610b5c600482610b95565b6040516001600160a01b0382169033907fef6fcb7b7214a073f2036e34cac6986294193f0352f07bc6970b7b520e9e977590600090a350565b610b9f8282610970565b610bc75760405163c8474baf60e01b81526001600160a01b0382166004820152602401610844565b6001600160a01b0316600090815260209190915260409020805460ff19169055565b600060208284031215610bfb57600080fd5b81356001600160a01b0381168114610c1257600080fd5b939250505056fea2646970667358221220dece7dfbd9572eae74f2f7da6aadb84e56a623d975111e8b51cb17db489a9bb564736f6c63430008080033","optimization_enabled":true,"verified_twin_address_hash":null,"is_verified":true,"github_repository_metadata":null,"compiler_settings":{"evmVersion":"petersburg","libraries":{},"metadata":{"bytecodeHash":"ipfs","useLiteralContent":false},"optimizer":{"enabled":true,"runs":300},"outputSelection":{"*":{"":["*"],"*":["*"]}},"remappings":["@chainlink/contracts/=dependencies/@chainlink-contracts-1.3.0/","@gnosis.pm/safe-contracts/=dependencies/@gnosis-pm-safe-contracts-1.3.0/","@gnosis.pm/zodiac/=dependencies/gnosisguild-zodiac-4.0.5/","@openzeppelin-contracts/=dependencies/@openzeppelin-contracts-4.9.3/","@openzeppelin/contracts-upgradeable/=dependencies/@openzeppelin-contracts-upgradeable-4.9.3/","@openzeppelin/contracts-upgradeable/access/=dependencies/@openzeppelin-contracts-upgradeable-5.0.0/access/","@openzeppelin/contracts/=dependencies/@openzeppelin-contracts-4.9.3/","@rari-capital/solmate/=dependencies/solmate-6.8.0/","@safe-global/safe-contracts/=dependencies/safe-global-safe-smart-account-1.4.1-3/","@sygnum/solidity-base-contracts/=apps/baseContracts/","forge-std/=dependencies/forge-std-1.9.4/src/","openzeppelin-contracts-upgradeable/=dependencies/@openzeppelin-contracts-upgradeable-4.9.3/","operator-filter-registry/=dependencies/projectopensea-operator-filter-registry-1.4.2/","@chainlink-contracts-1.3.0/=dependencies/@chainlink-contracts-1.3.0/src/","@gnosis-pm-safe-contracts-1.3.0/=dependencies/@gnosis-pm-safe-contracts-1.3.0/contracts/","@openzeppelin-contracts-4.9.3/=dependencies/@openzeppelin-contracts-4.9.3/","@openzeppelin-contracts-upgradeable-4.9.3/=dependencies/@openzeppelin-contracts-upgradeable-4.9.3/","@openzeppelin-contracts-upgradeable-5.0.0/=dependencies/@openzeppelin-contracts-upgradeable-5.0.0/","forge-std-1.9.4/=dependencies/forge-std-1.9.4/src/","gnosisguild-zodiac-4.0.5/=dependencies/gnosisguild-zodiac-4.0.5/contracts/","projectopensea-operator-filter-registry-1.4.2/=dependencies/projectopensea-operator-filter-registry-1.4.2/src/","safe-global-safe-smart-account-1.4.1-3/=dependencies/safe-global-safe-smart-account-1.4.1-3/","solmate-6.8.0/=dependencies/solmate-6.8.0/src/"],"viaIR":false},"optimization_runs":300,"sourcify_repo_url":null,"decoded_constructor_args":[["0x61776319Fc4C120E9b1ec41306f2dB968bE1e95f",{"internalType":"address","name":"_admin","type":"address"}]],"compiler_version":"v0.8.8+commit.dddeac2f","is_verified_via_verifier_alliance":false,"verified_at":"2026-06-19T15:50:45.761092Z","implementations":[],"proxy_type":null,"external_libraries":[],"creation_bytecode":"0x608060405234801561001057600080fd5b50604051610df4380380610df483398101604081905261002f91610166565b6100388161003e565b50610196565b61005681600261008f60201b6108151790919060201c565b6040516001600160a01b0382169033907fbf3f493c772c8c283fd124432c2d0f539ab343faa04258fe88e52912d36b102b90600090a350565b6100998282610104565b156100df576040517f39ba618a0000000000000000000000000000000000000000000000000000000081526001600160a01b038216600482015260240160405180910390fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b60006001600160a01b038216610146576040517f715a169500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b60006020828403121561017857600080fd5b81516001600160a01b038116811461018f57600080fd5b9392505050565b610c4f806101a56000396000f3fe608060405234801561001057600080fd5b50600436106101625760003560e01c806370480275116100c8578063ad29ad1e1161008c578063cd151e9a11610066578063cd151e9a146102f5578063da1deb7714610308578063f2d4915b1461031b57600080fd5b8063ad29ad1e146102bc578063adadf22f146102cf578063b5d8e0a0146102e257600080fd5b8063704802751461025d57806374be7592146102705780637a6cd424146102835780639870d7fe14610296578063ac8a584a146102a957600080fd5b8063284ba8691161012a57806363724c161161010457806363724c1614610215578063668f6ace146102285780636d70f7ae1461024a57600080fd5b8063284ba869146101dc57806334cdcf26146101ef5780634efca9111461020257600080fd5b80631785f53c146101675780631c130dfb1461017c5780632268a3581461018f57806324d7806c146101a257806326cb32b7146101c9575b600080fd5b61017a610175366004610be9565b61032e565b005b61017a61018a366004610be9565b61039e565b61017a61019d366004610be9565b6103f7565b6101b56101b0366004610be9565b610422565b604051901515815260200160405180910390f35b6101b56101d7366004610be9565b610435565b61017a6101ea366004610be9565b610442565b6101b56101fd366004610be9565b61047a565b61017a610210366004610be9565b610487565b6101b5610223366004610be9565b6104d3565b6101b5610236366004610be9565b6000546001600160a01b0390811691161490565b6101b5610258366004610be9565b6104e9565b61017a61026b366004610be9565b6104f6565b61017a61027e366004610be9565b610539565b61017a610291366004610be9565b61057c565b61017a6102a4366004610be9565b61061f565b61017a6102b7366004610be9565b610659565b61017a6102ca366004610be9565b610693565b61017a6102dd366004610be9565b610700565b61017a6102f0366004610be9565b61072f565b61017a610303366004610be9565b610772565b6101b5610316366004610be9565b6107a1565b61017a610329366004610be9565b6107bc565b61033733610422565b15801561034a575061034833610435565b155b156103685760405163af48085760e01b815260040160405180910390fd5b6001600160a01b0381163314156103925760405163051327d560e51b815260040160405180910390fd5b61039b81610872565b50565b6103a733610422565b6103c4576040516318854eb960e31b815260040160405180910390fd5b6000546001600160a01b0316156103ee5760405163ef1af6b760e01b815260040160405180910390fd5b61039b816108b6565b6000546001600160a01b031633146103ee57604051630fbd325560e41b815260040160405180910390fd5b600061042f600283610970565b92915050565b600061042f600483610970565b61044b33610422565b610468576040516318854eb960e31b815260040160405180910390fd5b610471816109b9565b61039b816109fd565b600061042f600383610970565b61049033610422565b1580156104a357506104a133610435565b155b156104c15760405163af48085760e01b815260040160405180910390fd5b6104ca816109b9565b61039b81610a41565b60006104de82610422565b8061042f575061042f825b600061042f600183610970565b6104ff33610422565b158015610512575061051033610435565b155b156105305760405163af48085760e01b815260040160405180910390fd5b61039b816109b9565b61054233610422565b158015610555575061055333610435565b155b156105735760405163af48085760e01b815260040160405180910390fd5b61039b81610a85565b61058533610422565b6105a2576040516318854eb960e31b815260040160405180910390fd5b6001600160a01b0381166105c95760405163051eaf0960e31b815260040160405180910390fd5b806001600160a01b0316638535a56b6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561060457600080fd5b505af1158015610618573d6000803e3d6000fd5b5050505050565b61062833610422565b15801561063b575061063933610435565b155b156104ca5760405163af48085760e01b815260040160405180910390fd5b61066233610422565b158015610675575061067333610435565b155b156104715760405163af48085760e01b815260040160405180910390fd5b61069c33610422565b1580156106af57506106ad33610435565b155b156106cd5760405163af48085760e01b815260040160405180910390fd5b6001600160a01b0381163314156106f75760405163051327d560e51b815260040160405180910390fd5b61047181610872565b61070933610422565b610726576040516318854eb960e31b815260040160405180910390fd5b61039b81610ac9565b61073833610422565b15801561074b575061074933610435565b155b156107695760405163af48085760e01b815260040160405180910390fd5b61039b81610b0d565b61077b33610422565b610798576040516318854eb960e31b815260040160405180910390fd5b61039b81610b51565b60006107ac82610422565b801561042f575061042f826104e9565b6107c533610422565b6107e2576040516318854eb960e31b815260040160405180910390fd5b6001600160a01b03811633141561080c5760405163051327d560e51b815260040160405180910390fd5b6104ca81610872565b61081f8282610970565b1561084d57604051631cdd30c560e11b81526001600160a01b03821660048201526024015b60405180910390fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b61087d600282610b95565b6040516001600160a01b0382169033907fdb9d5d31320daf5bc7181d565b6da4d12e30f0f4d5aa324a992426c14a1d19ce90600090a350565b6001600160a01b0381166108dd5760405163051eaf0960e31b815260040160405180910390fd5b6000546001600160a01b031633141561091857803b63ffffffff811661091657604051630fc368f160e21b815260040160405180910390fd5b505b6000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081178255604051909133917f3e5e3e2086b161be12b02cc4d84c9d311d30ddf57c469d9c049fde7103970bad9190a350565b60006001600160a01b0382166109995760405163715a169560e01b815260040160405180910390fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b6109c4600282610815565b6040516001600160a01b0382169033907fbf3f493c772c8c283fd124432c2d0f539ab343faa04258fe88e52912d36b102b90600090a350565b610a08600182610b95565b6040516001600160a01b0382169033907f17d7f044d47e4fae1701f86266d0a674db3f792671bd1b974ace77a09af1c82790600090a350565b610a4c600182610815565b6040516001600160a01b0382169033907f0780dc183feb0e4f9714cd802b3c0a21894b7ccb4172c992569d2acb5d45f91c90600090a350565b610a90600382610815565b6040516001600160a01b0382169033907f58697455980eb59b944b84384c012fa6b32a3364287414201b3dcbea7acdaf6390600090a350565b610ad4600482610815565b6040516001600160a01b0382169033907fcda5f74e34a4f80cde48470c969148cc5c4bc01796568c93dce2a89715b1aea290600090a350565b610b18600382610b95565b6040516001600160a01b0382169033907fac2f64866cb52b856ded6feb888af6f5f47f62b1aee3194fc51ff864b9dfdd1b90600090a350565b610b5c600482610b95565b6040516001600160a01b0382169033907fef6fcb7b7214a073f2036e34cac6986294193f0352f07bc6970b7b520e9e977590600090a350565b610b9f8282610970565b610bc75760405163c8474baf60e01b81526001600160a01b0382166004820152602401610844565b6001600160a01b0316600090815260209190915260409020805460ff19169055565b600060208284031215610bfb57600080fd5b81356001600160a01b0381168114610c1257600080fd5b939250505056fea2646970667358221220dece7dfbd9572eae74f2f7da6aadb84e56a623d975111e8b51cb17db489a9bb564736f6c6343000808003300000000000000000000000061776319fc4c120e9b1ec41306f2db968be1e95f","name":"BaseOperators","is_blueprint":false,"license_type":"none","is_fully_verified":true,"is_verified_via_eth_bytecode_db":false,"language":"solidity","evm_version":"petersburg","can_be_visualized_via_sol2uml":true,"is_verified_via_sourcify":false,"additional_sources":[{"file_path":"apps/baseContracts/contracts/helpers/Initializable.sol","source_code":"// SPDX-License-Identifier: UNLICENSED\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\n * reused. This mechanism prevents re-execution of each \"step\" but allows the creation of new initialization steps in\n * case an upgrade adds a module that needs to be initialized.\n *\n * For example:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * contract MyToken is ERC20Upgradeable {\n *     function initialize() initializer public {\n *         __ERC20_init(\"MyToken\", \"MTK\");\n *     }\n * }\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\n *     function initializeV2() reinitializer(2) public {\n *         __ERC20Permit_init(\"MyToken\");\n *     }\n * }\n * ```\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n *\n * [CAUTION]\n * ====\n * Avoid leaving a contract uninitialized.\n *\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * /// @custom:oz-upgrades-unsafe-allow constructor\n * constructor() {\n *     _disableInitializers();\n * }\n * ```\n * ====\n */\n\npragma solidity ^0.8.0;\n\nabstract contract Initializable {\n    /**\n     * @dev Indicates that the contract has been initialized.\n     */\n    bool private initialized;\n\n    /**\n     * @dev Indicates that the contract is in the process of being initialized.\n     */\n    bool private initializing;\n\n    /**\n     * @dev Triggered when the contract has been initialized or reinitialized.\n     */\n    event Initialized();\n\n    /**\n     * @dev Error: \"Initializable: Contract instance has already been initialized\"\n     */\n    error InitializableContractAlreadyInitialized();\n\n    /**\n     * @dev Error: \"Initializable: Contract instance is initializing\"\n     */\n    error InitializableContractIsInitializing();\n\n    /**\n     * @dev Modifier to use in the initializer function of a contract.\n     */\n    modifier initializer() {\n        bool isTopLevelCall = !initializing;\n\n        if (isTopLevelCall && !isConstructor() && initialized) revert InitializableContractAlreadyInitialized();\n\n        if (isTopLevelCall) {\n            initializing = true;\n            initialized = true;\n        }\n\n        _;\n\n        if (isTopLevelCall) {\n            initializing = false;\n            emit Initialized();\n        }\n    }\n\n    /**\n     * @dev Returns true if and only if the function is running in the constructor\n     */\n    function isConstructor() private view returns (bool) {\n        // extcodesize checks the size of the code stored in an address, and\n        // address returns the current address. Since the code is still not\n        // deployed when running a constructor, any checks on its code size will\n        // yield zero, making it an effective way to detect if a contract is\n        // under construction or not.\n        address self = address(this);\n        uint256 cs;\n        // solhint-disable-next-line no-inline-assembly\n        assembly {\n            cs := extcodesize(self)\n        }\n        return cs == 0;\n    }\n\n    /**\n     * @dev Function that returns wheteher a contract is already initialized. Returns `initialized`\n     */\n    function isInitialized() public view virtual returns (bool) {\n        return initialized;\n    }\n\n    /**\n     * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\n     * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\n     * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\n     * through proxies.\n     *\n     * Emits an {Initialized} event the first time it is successfully executed.\n     */\n    function _disableInitializers() internal virtual {\n        if (initializing) revert InitializableContractIsInitializing();\n        if (!initialized) {\n            initialized = true;\n            emit Initialized();\n        }\n    }\n\n    // Reserved storage space to allow for layout changes in the future.\n    uint256[50] private ______gap;\n}\n"},{"file_path":"apps/baseContracts/contracts/role/Roles.sol","source_code":"// SPDX-License-Identifier: Unlicensed\n\npragma solidity ^0.8.8;\n\n/**\n * @title Roles\n * @dev Library for managing addresses assigned to a Role.\n */\nlibrary Roles {\n    struct Role {\n        mapping(address => bool) bearer;\n    }\n\n    /**\n     * @dev Error: \"Roles: account already has role\"\n     */\n    error RolesAccountAlreadyHasRole(address _account);\n\n    /**\n     * @dev Error: \"Roles: account does not have role\"\n     */\n    error RolesAccountDoesNotHaveRole(address _account);\n\n    /**\n     * @dev Error: \"Roles: account is the zero address\"\n     */\n    error RolesAccountIsZeroAddress();\n\n    /**\n     * @dev Give an account access to this role.\n     */\n    function add(Role storage role, address account) internal {\n        if (has(role, account)) revert RolesAccountAlreadyHasRole(account);\n        role.bearer[account] = true;\n    }\n\n    /**\n     * @dev Remove an account's access to this role.\n     */\n    function remove(Role storage role, address account) internal {\n        if (!has(role, account)) revert RolesAccountDoesNotHaveRole(account);\n        role.bearer[account] = false;\n    }\n\n    /**\n     * @dev Check if an account has this role.\n     * @return bool\n     */\n    function has(Role storage role, address account) internal view returns (bool) {\n        if (account == address(0)) revert RolesAccountIsZeroAddress();\n        return role.bearer[account];\n    }\n}\n"},{"file_path":"apps/baseContracts/contracts/role/base/Operatorable.sol","source_code":"// SPDX-License-Identifier: Unlicensed\n\n/**\n * @title Operatorable\n * @author Team 3301 <team3301@sygnum.com>\n * @dev Operatorable contract stores the BaseOperators contract address, and modifiers for\n *       contracts.\n */\n\npragma solidity ^0.8.0;\n\nimport \"../interface/IBaseOperators.sol\";\nimport \"../../helpers/Initializable.sol\";\n\ncontract Operatorable is Initializable {\n    IBaseOperators internal operatorsInst;\n    address private operatorsPending;\n\n    /**\n     * @dev Error: \"Operatorable: caller does not have the operator role\"\n     */\n    error OperatorableCallerNotOperator();\n\n    /**\n     * @dev Error: \"Operatorable: caller does not have the admin role\"\n     */\n    error OperatorableCallerNotAdmin();\n\n    /**\n     * @dev Error: \"Operatorable: caller does not have the system role\"\n     */\n    error OperatorableCallerNotSystem();\n\n    /**\n     * @dev Error: \"Operatorable: caller does not have the multisig role\"\n     */\n    error OperatorableCallerNotMultisig();\n\n    /**\n     * @dev Error: \"Operatorable: caller does not have the admin or system role\"\n     */\n    error OperatorableCallerNotAdminOrSystem();\n\n    /**\n     * @dev Error: \"Operatorable: caller does not have the operator role nor system\"\n     */\n    error OperatorableCallerNotOperatorOrSystem();\n\n    /**\n     * @dev Error: \"Operatorable: caller does not have the relay role\"\n     */\n    error OperatorableCallerNotRelay();\n\n    /**\n     * @dev Error: \"Operatorable: caller does not have the operator role nor relay\"\n     */\n    error OperatorableCallerNotOperatorOrRelay();\n\n    /**\n     * @dev Error: \"Operatorable: caller does not have the admin role nor relay\"\n     */\n    error OperatorableCallerNotAdminOrRelay();\n\n    /**\n     * @dev Error: \"Operatorable: caller does not have the operator role nor system nor relay\"\n     */\n    error OperatorableCallerNotOperatorOrSystemOrRelay();\n\n    /**\n     * @dev Error: \"OperatorableCallerNotOperator() nor admin nor relay\"\n     */\n    error OperatorableCallerNotOperatorOrAdminOrRelay();\n\n    /**\n     * @dev Error: \"Operatorable: address of new operators contract can not be zero\"\n     */\n    error OperatorableNewOperatorsZeroAddress();\n\n    /**\n     * @dev Error: \"Operatorable: should be called from new operators contract\"\n     */\n    error OperatorableCallerNotOperatorsContract(address _caller);\n\n    event OperatorsContractChanged(address indexed caller, address indexed operatorsAddress);\n    event OperatorsContractPending(address indexed caller, address indexed operatorsAddress);\n\n    /**\n     * @dev Reverts if sender does not have operator role associated.\n     */\n    modifier onlyOperator() {\n        if (!isOperator(msg.sender)) revert OperatorableCallerNotOperator();\n        _;\n    }\n\n    /**\n     * @dev Reverts if sender does not have admin role associated.\n     */\n    modifier onlyAdmin() {\n        if (!isAdmin(msg.sender)) revert OperatorableCallerNotAdmin();\n        _;\n    }\n\n    /**\n     * @dev Reverts if sender does not have system role associated.\n     */\n    modifier onlySystem() {\n        if (!isSystem(msg.sender)) revert OperatorableCallerNotSystem();\n        _;\n    }\n\n    /**\n     * @dev Reverts if sender does not have multisig privileges.\n     */\n    modifier onlyMultisig() {\n        if (!isMultisig(msg.sender)) revert OperatorableCallerNotMultisig();\n        _;\n    }\n\n    /**\n     * @dev Reverts if sender does not have admin or system role associated.\n     */\n    modifier onlyAdminOrSystem() {\n        if (!isAdminOrSystem(msg.sender)) revert OperatorableCallerNotAdminOrSystem();\n        _;\n    }\n\n    /**\n     * @dev Reverts if sender does not have operator or system role associated.\n     */\n    modifier onlyOperatorOrSystem() {\n        if (!isOperatorOrSystem(msg.sender)) revert OperatorableCallerNotOperatorOrSystem();\n        _;\n    }\n\n    /**\n     * @dev Reverts if sender does not have the relay role associated.\n     */\n    modifier onlyRelay() {\n        if (!isRelay(msg.sender)) revert OperatorableCallerNotRelay();\n        _;\n    }\n\n    /**\n     * @dev Reverts if sender does not have relay or operator role associated.\n     */\n    modifier onlyOperatorOrRelay() {\n        if (!isOperator(msg.sender) && !isRelay(msg.sender)) revert OperatorableCallerNotOperatorOrRelay();\n        _;\n    }\n\n    /**\n     * @dev Reverts if sender does not have relay or admin role associated.\n     */\n    modifier onlyAdminOrRelay() {\n        if (!isAdmin(msg.sender) && !isRelay(msg.sender)) revert OperatorableCallerNotAdminOrRelay();\n        _;\n    }\n\n    /**\n     * @dev Reverts if sender does not have the operator, or system, or relay role associated.\n     */\n    modifier onlyOperatorOrSystemOrRelay() {\n        if (!isOperator(msg.sender) && !isSystem(msg.sender) && !isRelay(msg.sender))\n            revert OperatorableCallerNotOperatorOrSystemOrRelay();\n        _;\n    }\n\n    /**\n     * @dev Reverts if sender does not have the operator, or admin, or relay role associated.\n     */\n    modifier onlyOperatorOrAdminOrRelay() {\n        if (!isOperator(msg.sender) && !isAdmin(msg.sender) && !isRelay(msg.sender))\n            revert OperatorableCallerNotOperatorOrAdminOrRelay();\n        _;\n    }\n\n    /**\n     * @dev Initialization instead of constructor, called once. The setOperatorsContract function can be called only by Admin role with\n     *       confirmation through the operators contract.\n     * @param _baseOperators BaseOperators contract address.\n     */\n    function initialize(address _baseOperators) public virtual initializer {\n        _setOperatorsContract(_baseOperators);\n    }\n\n    /**\n     * @dev Set the new the address of Operators contract, should be confirmed from operators contract by calling confirmFor(addr)\n     *       where addr is the address of current contract instance. This is done to prevent the case when the new contract address is\n     *       broken and control of the contract can be lost in such case\n     * @param _baseOperators BaseOperators contract address.\n     */\n    function setOperatorsContract(address _baseOperators) public onlyAdmin {\n        if (_baseOperators == address(0)) revert OperatorableNewOperatorsZeroAddress();\n\n        operatorsPending = _baseOperators;\n        emit OperatorsContractPending(msg.sender, _baseOperators);\n    }\n\n    /**\n     * @dev The function should be called from new operators contract by admin to ensure that operatorsPending address\n     *       is the real contract address.\n     */\n    function confirmOperatorsContract() public {\n        if (operatorsPending == address(0)) revert OperatorableNewOperatorsZeroAddress();\n\n        if (msg.sender != operatorsPending) revert OperatorableCallerNotOperatorsContract(msg.sender);\n\n        _setOperatorsContract(operatorsPending);\n    }\n\n    /**\n     * @return The address of the BaseOperators contract.\n     */\n    function getOperatorsContract() public view returns (address) {\n        return address(operatorsInst);\n    }\n\n    /**\n     * @return The pending address of the BaseOperators contract.\n     */\n    function getOperatorsPending() public view returns (address) {\n        return operatorsPending;\n    }\n\n    /**\n     * @return If '_account' has operator privileges.\n     */\n    function isOperator(address _account) public view returns (bool) {\n        return operatorsInst.isOperator(_account);\n    }\n\n    /**\n     * @return If '_account' has admin privileges.\n     */\n    function isAdmin(address _account) public view returns (bool) {\n        return operatorsInst.isAdmin(_account);\n    }\n\n    /**\n     * @return If '_account' has system privileges.\n     */\n    function isSystem(address _account) public view returns (bool) {\n        return operatorsInst.isSystem(_account);\n    }\n\n    /**\n     * @return If '_account' has relay privileges.\n     */\n    function isRelay(address _account) public view returns (bool) {\n        return operatorsInst.isRelay(_account);\n    }\n\n    /**\n     * @return If '_contract' has multisig privileges.\n     */\n    function isMultisig(address _contract) public view returns (bool) {\n        return operatorsInst.isMultisig(_contract);\n    }\n\n    /**\n     * @return If '_account' has admin or system privileges.\n     */\n    function isAdminOrSystem(address _account) public view returns (bool) {\n        return (operatorsInst.isAdmin(_account) || operatorsInst.isSystem(_account));\n    }\n\n    /**\n     * @return If '_account' has operator or system privileges.\n     */\n    function isOperatorOrSystem(address _account) public view returns (bool) {\n        return (operatorsInst.isOperator(_account) || operatorsInst.isSystem(_account));\n    }\n\n    /** INTERNAL FUNCTIONS */\n    function _setOperatorsContract(address _baseOperators) internal {\n        if (_baseOperators == address(0)) revert OperatorableNewOperatorsZeroAddress();\n\n        operatorsInst = IBaseOperators(_baseOperators);\n        emit OperatorsContractChanged(msg.sender, _baseOperators);\n    }\n}\n"},{"file_path":"apps/baseContracts/contracts/role/interface/IBaseOperators.sol","source_code":"// SPDX-License-Identifier: Unlicensed\n\n/**\n * @title IBaseOperators\n * @notice Interface for BaseOperators contract\n */\n\npragma solidity ^0.8.0;\n\ninterface IBaseOperators {\n    function isOperator(address _account) external view returns (bool);\n\n    function isAdmin(address _account) external view returns (bool);\n\n    function isSystem(address _account) external view returns (bool);\n\n    function isRelay(address _account) external view returns (bool);\n\n    function isMultisig(address _contract) external view returns (bool);\n\n    function confirmFor(address _address) external;\n\n    function addOperator(address _account) external;\n\n    function removeOperator(address _account) external;\n\n    function addAdmin(address _account) external;\n\n    function removeAdmin(address _account) external;\n\n    function addSystem(address _account) external;\n\n    function removeSystem(address _account) external;\n\n    function addRelay(address _account) external;\n\n    function removeRelay(address _account) external;\n\n    function addOperatorAndAdmin(address _account) external;\n\n    function removeOperatorAndAdmin(address _account) external;\n}\n"}],"certified":false,"conflicting_implementations":null,"abi":[{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"BaseOperatorsAdminRemoveSelf","type":"error"},{"inputs":[],"name":"BaseOperatorsCallerNotAdmin","type":"error"},{"inputs":[],"name":"BaseOperatorsCallerNotAdminOrRelay","type":"error"},{"inputs":[],"name":"BaseOperatorsCallerNotMultisig","type":"error"},{"inputs":[],"name":"BaseOperatorsMultisigAlreadyAssigned","type":"error"},{"inputs":[],"name":"BaseOperatorsMultisigNotContract","type":"error"},{"inputs":[],"name":"BaseOperatorsZeroAddress","type":"error"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"RolesAccountAlreadyHasRole","type":"error"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"RolesAccountDoesNotHaveRole","type":"error"},{"inputs":[],"name":"RolesAccountIsZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"AdminAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"AdminRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"multisig","type":"address"}],"name":"MultisigChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"OperatorAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"OperatorRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"relay","type":"address"}],"name":"RelayAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"relay","type":"address"}],"name":"RelayRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"SystemAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"SystemRemoved","type":"event"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"addAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"}],"name":"addMultisig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"addOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"addOperatorAndAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"addRelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"addSystem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"}],"name":"changeMultisig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"changeToAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"changeToOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"confirmFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"}],"name":"isMultisig","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isOperatorAndAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isOperatorOrAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isRelay","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isSystem","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"removeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"removeOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"removeOperatorAndAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"removeRelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"removeSystem","outputs":[],"stateMutability":"nonpayable","type":"function"}],"is_changed_bytecode":true,"is_partially_verified":false,"package_name":null,"constructor_args":"0x00000000000000000000000061776319fc4c120e9b1ec41306f2db968be1e95f"}