// SPDX-License-Identifier: UNLICENSED pragma solidity =0.8.18; import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20BurnableUpgradeable.sol"; import "../Lockdrop/extensions/TokenRecoveryUpgradeable.sol"; import "./extensions/NonTransferable.sol"; import "./extensions/ERC20Security.sol"; import "./INTT.sol"; /** * @notice Implementation of the {ISecurityToken} interface. */ contract NTT is INTT, NonTransferable, ERC20BurnableUpgradeable, ERC20Security, TokenRecoveryUpgradeable { /** * @inheritdoc INTT */ function initialize( string memory domain, string memory name, string memory symbol, address[] memory whitelistedAccounts, uint256 totalSupply, address receiver ) external virtual initializer { __ERC20Security_init(domain, name, symbol); __NonTransferable_init_unchained(whitelistedAccounts); __TokenRecovery__init_unchained(new address[](0)); __ERC20Burnable_init_unchained(); // revoke the privileges of the token so that we can allow minting _updateRequiredPrivileges(bytes32(0)); _mint(receiver, totalSupply); } /** * @dev See {PausableUpgradeable-paused}. */ function paused() public view virtual override(ERC20Security, SomaContractUpgradeable) returns (bool) { return super.paused(); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC20Security, NonTransferable, TokenRecoveryUpgradeable) returns (bool) { return interfaceId == type(INTT).interfaceId || super.supportsInterface(interfaceId); } function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override(ERC20Security, ERC20Upgradeable, NonTransferable) { return super._beforeTokenTransfer(from, to, amount); } function _mint(address to, uint256 amount) internal override(ERC20Security, ERC20Upgradeable) { super._mint(to, amount); } function _burn(address to, uint256 amount) internal override(ERC20Security, ERC20Upgradeable) { super._mint(to, amount); } function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual override(ERC20Security, ERC20Upgradeable) { super._afterTokenTransfer(from, to, amount); } }