// SPDX-License-Identifier: UNLICENSED pragma solidity =0.8.18; import "../../../SomaAccessControl/utils/AccessibleUpgradeable.sol"; import "./ITransferablePartition.sol"; import "./ERC20Partition.sol"; abstract contract TransferablePartition is ITransferablePartition, ERC20Partition, AccessibleUpgradeable { /** * @notice Initializer for extended contracts. */ function __TransferPartitions_init() internal { __ERC165_init_unchained(); __Context_init_unchained(); __SomaContract_init_unchained(); __Accessible_init_unchained(); __Multicall_init_unchained(); __Pausable_init_unchained(); __TransferPartitions_init_unchained(); } /** * @notice Unchained initializer. */ function __TransferPartitions_init_unchained() internal onlyInitializing { LOCAL_MANAGE_ROLE = keccak256(abi.encodePacked(address(this), GLOBAL_MANAGE_ROLE)); } /** * @notice Returns the GLOBAL_SEIZE_ROLE. */ bytes32 public constant GLOBAL_MANAGE_ROLE = keccak256("TransferPartitions.MANAGE_ROLE"); /** * @notice Returns the LOCAL_SEIZE_ROLE. */ bytes32 public LOCAL_MANAGE_ROLE; /** * @notice Modifier to restrict a function caller to an account with the GLOBAL_SEIZE_ROLE or LOCAL_SEIZE_ROLE. */ modifier onlyManageRole() { address sender = _msgSender(); require( hasRole(LOCAL_MANAGE_ROLE, sender) || hasRole(GLOBAL_MANAGE_ROLE, sender), "TransferPartitions: UNAUTHORIZED" ); _; } /** * @notice Checks if TransferPartitions inherits a given contract interface. * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(ITransferablePartition).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc ITransferablePartition */ function transferPartition(address account, bytes32 fromId, bytes32 toId, uint256 amount, bytes memory data) public override onlyManageRole returns (bool) { _transferPartition(account, account, fromId, toId, balanceOf(account), amount, data); emit MovedPartition(account, fromId, toId, amount, data); return true; } uint256[50] private __gap; }