{"file_path":"contracts/Management.sol","creation_status":"success","source_code":"// SPDX-License-Identifier: GPL-3.0\r\n\r\npragma solidity 0.8.16;\r\nimport \"./interfaces/IManagement.sol\";\r\nimport \"./interfaces/IPairFactory.sol\";\r\nimport {LManagement} from \"./libraries/LManagement.sol\";\r\n\r\ncontract Management is IManagement {\r\n    enum SigTypeEnum {AddWhitelist,RemoveWhitelist,AddRestrictlist,RemoveRestrictlist,\r\n        AddManager,RemoveManager,SetContractManager,SetFeeAddress,AddWhiteContract,\r\n        RemoveWhiteContract,AddAdmin,RemoveAdmin,SetAmmFactory, SetOTCFactory, \r\n        SetP2PFactory,SetSecurityTokenFactory,SetManagement,AddBlocklist,RemoveBlocklist\r\n    }\r\n\r\n    using LManagement for mapping(address => bool);\r\n\r\n    string public constant name = \"Management\";\r\n\r\n    uint private constant requiredCount = 2; //最小个数\r\n    mapping(address => bool) public whiteList;\r\n    mapping(address => bool) public restrictList;\r\n    mapping(address => bool) public blockList;\r\n    mapping(address => bool) public contractList;\r\n    mapping(address => bool) public administers;\r\n    mapping(address => bool) public managers; //管理员地址\r\n    address public contractManager; //合约管理地址\r\n    address public override platformFeeAddress; //手续费地址\r\n\r\n    address public ammFactory;\r\n    address public otcFactory; \r\n    address public p2pFactory;\r\n    address public securityTokenFactory;\r\n\r\n    bytes32 public DOMAIN_SEPARATOR;\r\n    // keccak256(\"AddWhitelist(address investor,uint256 nonce)\");\r\n    bytes32 public constant AddWhitelist_TYPEHASH =0xbae36f97ece7ff6d06ff73064049b6deade63e84a39445ca59a9f59d7b0e9d37;\r\n    // keccak256(\"RemoveWhitelist(address investor,uint256 nonce)\");\r\n    bytes32 public constant RemoveWhitelist_TYPEHASH =0x64c10c1478cf7c3721d359e2f78dfa299c48914c2b6eee9faf35f8508efaeb66;\r\n    // keccak256(\"AddRestrictlist(address investor,uint256 nonce)\");\r\n    bytes32 public constant AddRestrictlist_TYPEHASH =0x998c128fd52190b99cc267054dba040f747bb1889483c451e6e62ecec6f6d836;\r\n    // keccak256(\"RemoveRestrictlist(address investor,uint256 nonce)\");\r\n    bytes32 public constant RemoveRestrictlist_TYPEHASH =0x67e02dd9101cb5ec4ba888b64cf2c887af2342ac87015f0d3964de766f752ba3;\r\n    // keccak256(\"AddManager(address investor,uint256 nonce)\");\r\n    bytes32 public constant AddManager_TYPEHASH =0x163ef0b23224e585a532cb21be056017dc5e24df899e899050f87fb0d9d0e6af;\r\n    // keccak256(\"RemoveManager(address investor,uint256 nonce)\");\r\n    bytes32 public constant RemoveManager_TYPEHASH =0x5ec50e1700093b09774f85c99fe10b2181ff7ebf6137116fee769be0f81fa805;\r\n    // keccak256(\"SetContractManager(address investor,uint256 nonce)\");\r\n    bytes32 public constant SetContractManager_TYPEHASH =0xb5f4b13180b35446f001da8d7a0d31d20f8ec9923e348cc5febdad1de8b247a6;\r\n    // keccak256(\"SetFeeAddress(address investor,uint256 nonce)\");\r\n    bytes32 public constant SetFeeAddress_TYPEHASH =0x3dcf3f15c74bb4d23ab46e4d6ad7cb01451ac366ec11b9471bc09f7db736ad9a;\r\n    // keccak256(\"AddWhiteContract(address investor,uint256 nonce)\");\r\n    bytes32 public constant AddWhiteContract_TYPEHASH =0x1c12de27ba3f67de1dcc525f385b6a129320bf3a5498f39609f3162fdff12174;\r\n    // keccak256(\"RemoveWhiteContract(address investor,uint256 nonce)\");\r\n    bytes32 public constant RemoveWhiteContract_TYPEHASH =0x1be7eca310a863b2bb7cd7bec55909338bc6875ad0756ac9ddfa750c868aa176;\r\n    // keccak256(\"AddBlocklist(address investor,uint256 nonce)\");\r\n    bytes32 public constant AddBlocklist_TYPEHASH =0x3d89d6d5d11eb76b63c2c6f18dfb34b3af7acc2d703db73c28069a378ff7aec2;\r\n    // keccak256(\"RemoveBlocklist(address investor,uint256 nonce)\");\r\n    bytes32 public constant RemoveBlocklist_TYPEHASH =0x9cc9d087aba7064e2e525ccec3dcf261b9e6580c2ceefdf3a7ac50a56474f344;\r\n    // keccak256(\"AddAdmin(address investor,uint256 nonce)\");\r\n    bytes32 public constant AddAdmin_TYPEHASH =0xcf8112dd5614e0034cc93ebdb4f9f2022169d42d53deb26955289b3166922bd6;\r\n    // keccak256(\"RemoveAdmin(address investor,uint256 nonce)\");\r\n    bytes32 public constant RemoveAdmin_TYPEHASH =0x7720a4a484039e81f3c0e5fb52777da87964d87481af2590bb33051987c3978d;\r\n    // keccak256(\"SetAmmFactory(address investor,uint256 nonce)\");\r\n    bytes32 public constant SetAmmFactory_TYPEHASH =0x82a5ca036b13d3a4d2434003f390437bc3cca474cb0105d5d00dc876270e886c;\r\n    // keccak256(\"SetOTCFactory(address investor,uint256 nonce)\");\r\n    bytes32 public constant SetOTCFactory_TYPEHASH =0x359c99fc0cb49cd48a2b30e841fa0eb69dd24d1a27568d10de6bbf66a2b682ca;\r\n    // keccak256(\"SetP2PFactory(address investor,uint256 nonce)\");\r\n    bytes32 public constant SetP2PFactory_TYPEHASH =0xbf8bfccdd4104913963fd44789a30b476f07bb27996c4e09368cd28b0ad312f0;\r\n    // keccak256(\"SetSecurityTokenFactory(address investor,uint256 nonce)\");\r\n    bytes32 public constant SetSecurityTokenFactory_TYPEHASH =0x907bf65e4c55c6e6b92c6b773f9d37c37ecac28d90231a91f35473e6400203d0;\r\n    // keccak256(\"SetManagement(address[] memory pairs,address newManagement,uint256 nonce)\");\r\n    bytes32 public constant SetManagement_TYPEHASH =0xd33bb19e110fdd3dde0f5adcf90869ca157d2bda52f50a3f08594dcbeedb5260;\r\n\r\n    mapping(SigTypeEnum => bytes32) private typehashMap;\r\n    mapping(SigTypeEnum => uint) public nonces;\r\n\r\n    event AddWhitelistEvent(address indexed from, address indexed addr);\r\n    event RemoveWhitelistEvent(address indexed from, address indexed addr);\r\n    event AddRestrictlistEvent(address indexed from, address indexed addr);\r\n    event RemoveRestrictlistEvent(address indexed from, address indexed addr);\r\n    event AddBlocklistEvent(address indexed from, address indexed addr);\r\n    event RemoveBlocklistEvent(address indexed from, address indexed addr);\r\n    event AddManagerEvent(address indexed from, address indexed addr);\r\n    event RemoveManagerEvent(address indexed from, address indexed addr);\r\n    event SetContractManagerEvent(address indexed from, address indexed addr);\r\n    event SetFeeAddressEvent(address indexed from, address indexed addr);\r\n    event AddWhiteContractEvent(address indexed from, address indexed addr);\r\n    event RemoveWhiteContractEvent(address indexed from, address indexed addr);\r\n    event AddAdminEvent(address indexed from, address indexed addr);\r\n    event RemoveAdminEvent(address indexed from, address indexed addr);\r\n    event SetAmmFactoryEvent(address indexed from, address _ammFactory);\r\n    event SetOTCFactoryEvent(address indexed from, address _otcFactory);\r\n    event SetP2PFactoryEvent(address indexed from, address _p2pFactory);\r\n    event SetSTFactoryEvent(address indexed from,address _securityTokenFactory);\r\n\r\n    event CreateSTEvent(address indexed from,address indexed addr,string name,address issuer);\r\n    event CreateAMMEvent(address indexed from,address indexed addr,address tokenA,address tokenB,string _name);\r\n    event CreateOTCEvent(address indexed from,address indexed addr,address tokenA,address tokenB);\r\n    event CreateP2PEvent(address indexed from,address indexed addr,address tokenA,address tokenB);\r\n    event SetManagementEvent(address indexed from,address[] pairs,address newManagement);\r\n\r\n    modifier onlyContractManager() {\r\n        require(\r\n            msg.sender == contractManager,\"Caller is not contract manager\");\r\n        _;\r\n    }\r\n\r\n    constructor(address[] memory _admins, address[] memory _factories) {\r\n        \r\n        DOMAIN_SEPARATOR = keccak256(\r\n            abi.encode(\r\n                keccak256(\r\n                    \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"\r\n                ),\r\n                keccak256(bytes(name)),\r\n                keccak256(bytes(\"1\")),\r\n                block.chainid,\r\n                address(this)\r\n            )\r\n        );\r\n        typehashMap[SigTypeEnum.AddWhitelist] = AddWhitelist_TYPEHASH;\r\n        typehashMap[SigTypeEnum.RemoveWhitelist] = RemoveWhitelist_TYPEHASH;\r\n        typehashMap[SigTypeEnum.AddRestrictlist] = AddRestrictlist_TYPEHASH;\r\n        typehashMap[SigTypeEnum.RemoveRestrictlist] = RemoveRestrictlist_TYPEHASH;\r\n        typehashMap[SigTypeEnum.AddManager] = AddManager_TYPEHASH;\r\n        typehashMap[SigTypeEnum.RemoveManager] = RemoveManager_TYPEHASH;\r\n        typehashMap[SigTypeEnum.SetContractManager ] = SetContractManager_TYPEHASH;\r\n        typehashMap[SigTypeEnum.SetFeeAddress] = SetFeeAddress_TYPEHASH;\r\n        typehashMap[SigTypeEnum.AddWhiteContract] = AddWhiteContract_TYPEHASH;\r\n        typehashMap[SigTypeEnum.RemoveWhiteContract] = RemoveWhiteContract_TYPEHASH;\r\n        typehashMap[SigTypeEnum.AddAdmin] = AddAdmin_TYPEHASH;\r\n        typehashMap[SigTypeEnum.RemoveAdmin] = RemoveAdmin_TYPEHASH;\r\n        typehashMap[SigTypeEnum.SetAmmFactory] = SetAmmFactory_TYPEHASH;\r\n        typehashMap[SigTypeEnum.SetOTCFactory] = SetOTCFactory_TYPEHASH;\r\n        typehashMap[SigTypeEnum.SetP2PFactory] = SetP2PFactory_TYPEHASH;\r\n        typehashMap[SigTypeEnum.SetSecurityTokenFactory ] = SetSecurityTokenFactory_TYPEHASH;\r\n        typehashMap[SigTypeEnum.SetManagement] = SetManagement_TYPEHASH;\r\n        typehashMap[SigTypeEnum.AddBlocklist] = AddBlocklist_TYPEHASH;\r\n        typehashMap[SigTypeEnum.RemoveBlocklist] = RemoveBlocklist_TYPEHASH;\r\n        for (uint256 i = 0; i < _admins.length; i++) {\r\n            administers[_admins[i]] = true;\r\n        }\r\n        ammFactory = _factories[0];\r\n        otcFactory = _factories[1];\r\n        p2pFactory = _factories[2];\r\n        securityTokenFactory = _factories[3];\r\n    }\r\n\r\n    function validSignature(\r\n        SigTypeEnum sigType,\r\n        mapping(address => bool) storage _managers,address investor,\r\n        uint8[] memory vs,\r\n        bytes32[] memory rs,\r\n        bytes32[] memory ss\r\n    ) private view returns (bool) {\r\n        require(vs.length == rs.length);\r\n        require(rs.length == ss.length);\r\n        require(vs.length >= requiredCount);\r\n        address[] memory addrs = new address[](vs.length);\r\n        bytes32 typehash = typehashMap[sigType];\r\n        uint nonce = nonces[sigType];\r\n        for (uint i = 0; i < vs.length; i++) {\r\n            addrs[i] = LManagement.getSigAddress(\r\n                DOMAIN_SEPARATOR,typehash,nonce,investor,vs[i],rs[i],ss[i]\r\n            );\r\n        }\r\n        require(_managers.distinctOwners(addrs), \"managers invalid\");\r\n        return true;\r\n    }\r\n\r\n    function validManagementSignature(\r\n        SigTypeEnum sigType,\r\n        mapping(address => bool) storage _managers,\r\n        address[] memory pairs,\r\n        address newManagement,\r\n        uint8[] memory vs,\r\n        bytes32[] memory rs,\r\n        bytes32[] memory ss\r\n    ) private view returns (bool) {\r\n        require(vs.length == rs.length);\r\n        require(rs.length == ss.length);\r\n        require(vs.length >= requiredCount);\r\n        address[] memory addrs = new address[](vs.length);\r\n        bytes32 typehash = typehashMap[sigType];\r\n        uint nonce = nonces[sigType];\r\n        for (uint i = 0; i < vs.length; i++) {\r\n            addrs[i] = LManagement.getSigManagementAddress(\r\n                DOMAIN_SEPARATOR,typehash,nonce,pairs,newManagement,vs[i],rs[i],ss[i]\r\n            );\r\n        }\r\n        require(_managers.distinctOwners(addrs), \"managers invalid\");\r\n        return true;\r\n    }\r\n\r\n    function addWhitelist(\r\n        address investor,\r\n        uint8[] memory vs,\r\n        bytes32[] memory rs,\r\n        bytes32[] memory ss\r\n    ) external {\r\n        require(validSignature(SigTypeEnum.AddWhitelist,managers,investor,vs,rs,ss),\"invalid signatures\");\r\n        if (restrictList[investor]) {\r\n            restrictList[investor] = false;\r\n        }\r\n        whiteList[investor] = true;\r\n        nonces[SigTypeEnum.AddWhitelist]++;\r\n        emit AddWhitelistEvent(address(this), investor);\r\n    }\r\n\r\n    function removeWhitelist(\r\n        address investor,\r\n        uint8[] memory vs,\r\n        bytes32[] memory rs,\r\n        bytes32[] memory ss\r\n    ) external {\r\n        require(validSignature(SigTypeEnum.RemoveWhitelist,managers,investor,vs,rs,ss),\"invalid signatures\");\r\n        whiteList[investor] = false;\r\n        nonces[SigTypeEnum.RemoveWhitelist]++;\r\n        emit RemoveWhitelistEvent(address(this), investor);\r\n    }\r\n\r\n    function addRestrictlist(\r\n        address investor,\r\n        uint8[] memory vs,\r\n        bytes32[] memory rs,\r\n        bytes32[] memory ss\r\n    ) external {\r\n        require(validSignature(SigTypeEnum.AddRestrictlist,managers,investor,vs,rs,ss),\"invalid signatures\");\r\n        if (whiteList[investor]) {\r\n            whiteList[investor] = false;\r\n        }\r\n        restrictList[investor] = true;\r\n        nonces[SigTypeEnum.AddRestrictlist]++;\r\n        emit AddRestrictlistEvent(address(this), investor);\r\n    }\r\n\r\n    function removeRestrictlist(\r\n        address investor,\r\n        uint8[] memory vs,\r\n        bytes32[] memory rs,\r\n        bytes32[] memory ss\r\n    ) external {\r\n        require(validSignature(SigTypeEnum.RemoveRestrictlist,managers,investor,vs,rs,ss),\"invalid signatures\");\r\n        restrictList[investor] = false;\r\n        nonces[SigTypeEnum.RemoveRestrictlist]++;\r\n        emit RemoveRestrictlistEvent(address(this), investor);\r\n    }\r\n    function addBlocklist(\r\n        address investor,\r\n        uint8[] memory vs,\r\n        bytes32[] memory rs,\r\n        bytes32[] memory ss\r\n    ) external {\r\n        require(validSignature(SigTypeEnum.AddBlocklist,managers,investor,vs,rs,ss),\"invalid signatures\");\r\n        blockList[investor] = true;\r\n        nonces[SigTypeEnum.AddBlocklist]++;\r\n        emit AddBlocklistEvent(address(this), investor);\r\n    }\r\n\r\n    function removeBlocklist(\r\n        address investor,\r\n        uint8[] memory vs,\r\n        bytes32[] memory rs,\r\n        bytes32[] memory ss\r\n    ) external {\r\n        require(validSignature(SigTypeEnum.RemoveBlocklist,managers,investor,vs,rs,ss),\"invalid signatures\");\r\n        blockList[investor] = false;\r\n        nonces[SigTypeEnum.RemoveBlocklist]++;\r\n        emit RemoveBlocklistEvent(address(this), investor);\r\n    }\r\n    function addManager(\r\n        address manager,\r\n        uint8[] memory vs,\r\n        bytes32[] memory rs,\r\n        bytes32[] memory ss\r\n    ) external {\r\n        require(validSignature(SigTypeEnum.AddManager,administers,manager,vs,rs,ss),\"invalid signatures\");\r\n        managers[manager] = true;\r\n        nonces[SigTypeEnum.AddManager]++;\r\n        emit AddManagerEvent(address(this), manager);\r\n    }\r\n\r\n    function removeManager(\r\n        address manager,\r\n        uint8[] memory vs,\r\n        bytes32[] memory rs,\r\n        bytes32[] memory ss\r\n    ) external {\r\n        require(validSignature(SigTypeEnum.RemoveManager,administers,manager,vs,rs,ss),\"invalid signatures\");\r\n        managers[manager] = false;\r\n        nonces[SigTypeEnum.RemoveManager]++;\r\n        emit RemoveManagerEvent(address(this), manager);\r\n    }\r\n\r\n    function addAdmin(\r\n        address manager,\r\n        uint8[] memory vs,\r\n        bytes32[] memory rs,\r\n        bytes32[] memory ss\r\n    ) external {\r\n        require(validSignature(SigTypeEnum.AddAdmin,administers,manager,vs,rs,ss),\"invalid signatures\");\r\n        administers[manager] = true;\r\n        nonces[SigTypeEnum.AddAdmin]++;\r\n        emit AddAdminEvent(address(this), manager);\r\n    }\r\n\r\n    function removeAdmin(\r\n        address manager,\r\n        uint8[] memory vs,\r\n        bytes32[] memory rs,\r\n        bytes32[] memory ss\r\n    ) external {\r\n        require(validSignature(SigTypeEnum.RemoveAdmin,administers,manager,vs,rs,ss),\"invalid signatures\");\r\n        administers[manager] = false;\r\n        nonces[SigTypeEnum.RemoveAdmin]++;\r\n        emit RemoveAdminEvent(address(this), manager);\r\n    }\r\n\r\n    function setContractManager(\r\n        address manager,\r\n        uint8[] memory vs,\r\n        bytes32[] memory rs,\r\n        bytes32[] memory ss\r\n    ) external {\r\n        require(validSignature(SigTypeEnum.SetContractManager,administers,manager,vs,rs,ss),\"invalid signatures\");\r\n        contractManager = manager;\r\n        nonces[SigTypeEnum.SetContractManager]++;\r\n        emit SetContractManagerEvent(address(this), manager);\r\n    }\r\n\r\n    function setFeeAddress(\r\n        address _platformFeeAddress,\r\n        uint8[] memory vs,\r\n        bytes32[] memory rs,\r\n        bytes32[] memory ss\r\n    ) external {\r\n        require(validSignature(SigTypeEnum.SetFeeAddress,administers,_platformFeeAddress,vs,rs,ss),\"invalid signatures\");\r\n        if(platformFeeAddress != address(0)){\r\n            whiteList[platformFeeAddress] = false;\r\n        }\r\n        platformFeeAddress = _platformFeeAddress;\r\n        nonces[SigTypeEnum.SetFeeAddress]++;\r\n        whiteList[_platformFeeAddress] = true;\r\n        emit SetFeeAddressEvent(address(this), _platformFeeAddress);\r\n    }\r\n\r\n    function addWhiteContract(\r\n        address contractAddress,\r\n        uint8[] memory vs,\r\n        bytes32[] memory rs,\r\n        bytes32[] memory ss\r\n    ) external {\r\n        require(validSignature(SigTypeEnum.AddWhiteContract,administers,contractAddress,vs,rs,ss),\"invalid signatures\");\r\n        contractList[contractAddress] = true;\r\n        nonces[SigTypeEnum.AddWhiteContract]++;\r\n        emit AddWhiteContractEvent(address(this), contractAddress);\r\n    }\r\n\r\n    function removeWhiteContract(\r\n        address contractAddress,\r\n        uint8[] memory vs,\r\n        bytes32[] memory rs,\r\n        bytes32[] memory ss\r\n    ) external {\r\n        require(validSignature(SigTypeEnum.RemoveWhiteContract,administers,contractAddress,vs,rs,ss),\"invalid signatures\");\r\n        contractList[contractAddress] = false;\r\n        nonces[SigTypeEnum.RemoveWhiteContract]++;\r\n        emit RemoveWhiteContractEvent(address(this), contractAddress);\r\n    }\r\n\r\n    function setAmmFactory(\r\n        address _ammFactoryAddress,\r\n        uint8[] memory vs,\r\n        bytes32[] memory rs,\r\n        bytes32[] memory ss\r\n    ) external {\r\n        require(validSignature(SigTypeEnum.SetAmmFactory,administers,_ammFactoryAddress,vs,rs,ss),\"invalid signatures\");\r\n        ammFactory = _ammFactoryAddress;\r\n        nonces[SigTypeEnum.SetAmmFactory]++;\r\n        emit SetAmmFactoryEvent(address(this), _ammFactoryAddress);\r\n    }\r\n\r\n    function setOTCFactory(\r\n        address _otcFactoryAddress,\r\n        uint8[] memory vs,\r\n        bytes32[] memory rs,\r\n        bytes32[] memory ss\r\n    ) external {\r\n        require(validSignature(SigTypeEnum.SetOTCFactory,administers,_otcFactoryAddress,vs,rs,ss),\"invalid signatures\");\r\n        otcFactory = _otcFactoryAddress;\r\n        nonces[SigTypeEnum.SetOTCFactory]++;\r\n        emit SetOTCFactoryEvent(address(this), _otcFactoryAddress);\r\n    }\r\n\r\n    function setP2PFactory(\r\n        address _p2pFactoryAddress,\r\n        uint8[] memory vs,\r\n        bytes32[] memory rs,\r\n        bytes32[] memory ss\r\n    ) external {\r\n        require(validSignature(SigTypeEnum.SetP2PFactory,administers,_p2pFactoryAddress,vs,rs,ss),\"invalid signatures\");\r\n        p2pFactory = _p2pFactoryAddress;\r\n        nonces[SigTypeEnum.SetP2PFactory]++;\r\n        emit SetP2PFactoryEvent(address(this), _p2pFactoryAddress);\r\n    }\r\n\r\n    function setSecurityTokenFactory(\r\n        address _securityTokenFactoryAddress,\r\n        uint8[] memory vs,\r\n        bytes32[] memory rs,\r\n        bytes32[] memory ss\r\n    ) external {\r\n        require(validSignature(SigTypeEnum.SetSecurityTokenFactory,administers,_securityTokenFactoryAddress,vs,rs,ss),\"invalid signatures\");\r\n        securityTokenFactory = _securityTokenFactoryAddress;\r\n        nonces[SigTypeEnum.SetSecurityTokenFactory]++;\r\n        emit SetSTFactoryEvent(address(this),_securityTokenFactoryAddress);\r\n    }\r\n\r\n    function createSecurityToken(\r\n        string memory stName,\r\n        address issuer,\r\n        uint amount\r\n    ) external onlyContractManager {\r\n        address contractAddress = IPairFactory(securityTokenFactory)\r\n            .createSecurityToken(stName, issuer, amount, address(this));\r\n        contractList[contractAddress] = true;\r\n        emit CreateSTEvent(address(this), contractAddress, stName, issuer);\r\n    }\r\n\r\n    function createAMMPair(\r\n        string memory _name,\r\n        address issuer,\r\n        address tokenA,\r\n        address tokenB,\r\n        uint[] memory params\r\n    ) external onlyContractManager {\r\n        address contractAddress = IPairFactory(ammFactory).createAMMPair(\r\n            _name,issuer,tokenA,tokenB,address(this),params);\r\n        contractList[contractAddress] = true;\r\n        emit CreateAMMEvent(address(this),contractAddress,tokenA,tokenB,_name);\r\n    }\r\n\r\n    function createOTCPair(\r\n        address tokenA,\r\n        address tokenB,\r\n        uint maxOrderAmount,\r\n        uint platformFeeRate\r\n    ) external onlyContractManager {\r\n        address contractAddress = IPairFactory(otcFactory).createOTCPair(\r\n            tokenA,tokenB,address(this),maxOrderAmount,platformFeeRate);\r\n        contractList[contractAddress] = true;\r\n        emit CreateOTCEvent(address(this), contractAddress, tokenA, tokenB);\r\n    }\r\n\r\n    function createP2PPair(\r\n        address tokenA,\r\n        address tokenB,\r\n        uint maxOrderAmount,\r\n        uint platformFeeRate\r\n    ) external onlyContractManager {\r\n        address contractAddress = IPairFactory(p2pFactory).createP2PPair(\r\n            tokenA,tokenB,address(this),maxOrderAmount,platformFeeRate);\r\n        contractList[contractAddress] = true;\r\n        emit CreateP2PEvent(address(this), contractAddress, tokenA, tokenB);\r\n    }\r\n\r\n    function setManagement(\r\n        address[] memory pairs,\r\n        address newManagement,\r\n        uint8[] memory vs,\r\n        bytes32[] memory rs,\r\n        bytes32[] memory ss\r\n    ) external {\r\n        require(\r\n            validManagementSignature(SigTypeEnum.SetManagement,administers,pairs,newManagement,vs,rs,ss),\"invalid signatures\");\r\n        for (uint i = 0; i < pairs.length; i++) {\r\n            address pair = pairs[i];\r\n            IPairFactory(pair).setManagement(newManagement);\r\n        }\r\n        nonces[SigTypeEnum.SetManagement]++;\r\n        emit SetManagementEvent(address(this), pairs, newManagement);\r\n    }\r\n\r\n    function isWhiteInvestor(address investor)external view override returns (bool){\r\n        return whiteList[investor];\r\n    }\r\n\r\n    function isRestrictInvestor(address investor)external view override returns (bool){\r\n        return restrictList[investor];\r\n    }\r\n    function isBlockInvestor(address investor)external view override returns (bool){\r\n        return blockList[investor];\r\n    }\r\n\r\n    function isContractManager(address manager)external view override returns (bool){\r\n        if (manager == contractManager) {\r\n            return true;\r\n        } else {\r\n            return false;\r\n        }\r\n    }\r\n\r\n    function isWhiteContract(address contractAddress) external view override returns (bool){ \r\n        return contractList[contractAddress];\r\n    }\r\n}\r\n","deployed_bytecode":"0x608060405234801561001057600080fd5b50600436106103ba5760003560e01c806373daf71f116101f4578063caa4068d1161011a578063e1edc870116100ad578063f006380a1161007c578063f006380a14610a90578063f8ae2fb114610aa3578063fdff9b4d14610ab6578063ffa4cc4714610ad957600080fd5b8063e1edc87014610a30578063e2bbcb2514610a43578063e98bd25e14610a56578063ed14834f14610a7d57600080fd5b8063d4739a2c116100e9578063d4739a2c146109cb578063dacda92f146109de578063dc7e571b146109f1578063e184f6cb14610a0457600080fd5b8063caa4068d1461097f578063cc27f64b14610992578063d1bf9f8e146109a5578063d43ed3d1146109b857600080fd5b8063a3ad630211610192578063b539928311610161578063b5399283146108f6578063c034a9db14610919578063c55fb4901461092c578063ca14d1bb1461095357600080fd5b8063a3ad630214610869578063af4dcc6414610890578063b09c4d3d146108b7578063b39e12cf146108e357600080fd5b80638dd27f65116101ce5780638dd27f651461080957806395e97650146108305780639e06490914610843578063a12cf8261461085657600080fd5b806373daf71f146107945780638940d35c146107bb5780638d0f120f146107e257600080fd5b8063372c12b1116102e45780635520d02c116102775780635bdedefe116102465780635bdedefe146107205780635cea0fc2146107475780636964584a1461076e578063698480891461078157600080fd5b80635520d02c146106c057806356ef3098146106d357806359cc389d146106fa5780635b3113ef1461070d57600080fd5b80634b4c7617116102b35780634b4c76171461062f5780634cf05e97146106525780635035bda21461067957806353cb405d1461069957600080fd5b8063372c12b1146105bf5780633c964777146105e25780633f9fdb22146105f5578063423463571461060857600080fd5b8063126013ed1161035c5780632e4f4d671161032b5780632e4f4d67146105555780632e5ae0d11461057c578063306abccf146105a35780633644e515146105b657600080fd5b8063126013ed146104bb57806316f2c85a146104f05780631d42e9af1461051b578063240f46fb1461054257600080fd5b806306fdde031161039857806306fdde03146103fa5780630be5967b146104395780630cce67581461046c578063106328d41461049857600080fd5b8063033954c3146103bf57806304b3c21c146103d4578063050c8e2b146103e7575b600080fd5b6103d26103cd3660046126af565b610b00565b005b6103d26103e23660046126af565b610bd0565b6103d26103f53660046127ba565b610c9b565b6104236040518060400160405280600a81526020016913585b9859d95b595b9d60b21b81525081565b604051610430919061285a565b60405180910390f35b61045c610447366004612874565b60036020526000908152604090205460ff1681565b6040519015158152602001610430565b61045c61047a366004612874565b6001600160a01b031660009081526020819052604090205460ff1690565b61045c6104a6366004612874565b60046020526000908152604090205460ff1681565b6104e27fcf8112dd5614e0034cc93ebdb4f9f2022169d42d53deb26955289b3166922bd681565b604051908152602001610430565b600b54610503906001600160a01b031681565b6040516001600160a01b039091168152602001610430565b6104e27fbf8bfccdd4104913963fd44789a30b476f07bb27996c4e09368cd28b0ad312f081565b6103d26105503660046126af565b610da8565b6104e27fb5f4b13180b35446f001da8d7a0d31d20f8ec9923e348cc5febdad1de8b247a681565b6104e27f359c99fc0cb49cd48a2b30e841fa0eb69dd24d1a27568d10de6bbf66a2b682ca81565b61045c6105b1366004612874565b610eae565b6104e2600c5481565b61045c6105cd366004612874565b60006020819052908152604090205460ff1681565b600954610503906001600160a01b031681565b6103d26106033660046126af565b610edc565b6104e27f64c10c1478cf7c3721d359e2f78dfa299c48914c2b6eee9faf35f8508efaeb6681565b61045c61063d366004612874565b60016020526000908152604090205460ff1681565b6104e27f9cc9d087aba7064e2e525ccec3dcf261b9e6580c2ceefdf3a7ac50a56474f34481565b6104e2610687366004612891565b600e6020526000908152604090205481565b6104e27f907bf65e4c55c6e6b92c6b773f9d37c37ecac28d90231a91f35473e6400203d081565b6103d26106ce3660046126af565b610fa0565b6104e27fd33bb19e110fdd3dde0f5adcf90869ca157d2bda52f50a3f08594dcbeedb526081565b6103d26107083660046126af565b611060565b6103d261071b3660046126af565b611120565b6104e27f7720a4a484039e81f3c0e5fb52777da87964d87481af2590bb33051987c3978d81565b6104e27f1c12de27ba3f67de1dcc525f385b6a129320bf3a5498f39609f3162fdff1217481565b6103d261077c3660046126af565b6111df565b6103d261078f3660046126af565b6112a3565b6104e27f1be7eca310a863b2bb7cd7bec55909338bc6875ad0756ac9ddfa750c868aa17681565b6104e27f5ec50e1700093b09774f85c99fe10b2181ff7ebf6137116fee769be0f81fa80581565b6104e27f3d89d6d5d11eb76b63c2c6f18dfb34b3af7acc2d703db73c28069a378ff7aec281565b6104e27f163ef0b23224e585a532cb21be056017dc5e24df899e899050f87fb0d9d0e6af81565b6103d261083e3660046126af565b611367565b6103d26108513660046126af565b611471565b6103d26108643660046126af565b611535565b6104e27f67e02dd9101cb5ec4ba888b64cf2c887af2342ac87015f0d3964de766f752ba381565b6104e27f3dcf3f15c74bb4d23ab46e4d6ad7cb01451ac366ec11b9471bc09f7db736ad9a81565b61045c6108c5366004612874565b6001600160a01b031660009081526001602052604090205460ff1690565b600654610503906001600160a01b031681565b61045c610904366004612874565b60026020526000908152604090205460ff1681565b6103d26109273660046126af565b6115f8565b6104e27f998c128fd52190b99cc267054dba040f747bb1889483c451e6e62ecec6f6d83681565b61045c610961366004612874565b6001600160a01b031660009081526003602052604090205460ff1690565b6103d261098d3660046128b2565b6116bf565b6103d26109a03660046129a5565b6117d3565b6103d26109b33660046126af565b6118f9565b6103d26109c63660046126af565b6119bb565b6103d26109d93660046126af565b611a7b565b600854610503906001600160a01b031681565b600a54610503906001600160a01b031681565b61045c610a12366004612874565b6001600160a01b031660009081526002602052604090205460ff1690565b6103d2610a3e3660046126af565b611b42565b6103d2610a513660046129a5565b611c49565b6104e27fbae36f97ece7ff6d06ff73064049b6deade63e84a39445ca59a9f59d7b0e9d3781565b600754610503906001600160a01b031681565b6103d2610a9e3660046129eb565b611d64565b6103d2610ab13660046126af565b611eb8565b61045c610ac4366004612874565b60056020526000908152604090205460ff1681565b6104e27f82a5ca036b13d3a4d2434003f390437bc3cca474cb0105d5d00dc876270e886c81565b610b106008600486868686611f7e565b610b355760405162461bcd60e51b8152600401610b2c90612b0a565b60405180910390fd5b6001600160a01b03841660009081526003602090815260408220805460ff1916600117905560088252600e90527feab6bc3746954d8a0719de62c86ea908d362be2a58c781ada1046727253f9df2805491610b8f83612b4c565b90915550506040516001600160a01b0385169030907fb8d544f22db6826f41ccad080d88c0903ddbc51bbade47af333ac7a347135fe790600090a350505050565b610be0600e600486868686611f7e565b610bfc5760405162461bcd60e51b8152600401610b2c90612b0a565b600a80546001600160a01b0319166001600160a01b038616179055600e60008181526020919091527fa6897c210c76a29b3d6bf757063b10a3faa77fe0657de0ee282493e99a18ed50805491610c5183612b4c565b90915550506040516001600160a01b038516815230907f8b06a4b08bf6a0ee94541ad92cf0a0cf311a35d22559a6069e9931685dcee877906020015b60405180910390a250505050565b6006546001600160a01b03163314610cc55760405162461bcd60e51b8152600401610b2c90612b73565b600b54604051632721925360e01b81526000916001600160a01b031690632721925390610cfc908790879087903090600401612baa565b6020604051808303816000875af1158015610d1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d3f9190612be6565b6001600160a01b03811660008181526003602052604090819020805460ff19166001179055519192509030907f7724ec8a5918b5c722fc260a04944c5b91218f0b7ede8d6ea6d032a3e0bf259590610d9a9088908890612c03565b60405180910390a350505050565b610db86000600586868686611f7e565b610dd45760405162461bcd60e51b8152600401610b2c90612b0a565b6001600160a01b03841660009081526001602052604090205460ff1615610e16576001600160a01b0384166000908152600160205260409020805460ff191690555b6001600160a01b0384166000908152602081815260408220805460ff19166001179055818052600e90527fe710864318d4a32f37d6ce54cb3fadbef648dd12d8dbdf53973564d56b7f881c805491610e6d83612b4c565b90915550506040516001600160a01b0385169030907f36365224c888719109af22166d40ff256374b38e9b78a8ee1b039e323b40853390600090a350505050565b6006546000906001600160a01b0390811690831603610ecf57506001919050565b506000919050565b919050565b610eec6012600586868686611f7e565b610f085760405162461bcd60e51b8152600401610b2c90612b0a565b6001600160a01b03841660009081526002602090815260408220805460ff1916905560128252600e90527f3757bb026b72bf4f9cbbbf8f2bafe0ea3d356ae6d8f07ef005aafb99b4cbde40805491610f5f83612b4c565b90915550506040516001600160a01b0385169030907f51c355c400f08b9cae030e4af5347d5f6686e5791e8dbfeb869fc3979c93707690600090a350505050565b610fb0600d600486868686611f7e565b610fcc5760405162461bcd60e51b8152600401610b2c90612b0a565b600980546001600160a01b0319166001600160a01b038616179055600d6000908152600e6020527f9d0231707eb2041153c28e130d22114ee38b252cf17233585036af02278e418180549161102083612b4c565b90915550506040516001600160a01b038516815230907f1c6e5a1e337b8c0056b48ad17b791287c5d9bdf1feb0f75a9f9899acb41acc1490602001610c8d565b611070600f600486868686611f7e565b61108c5760405162461bcd60e51b8152600401610b2c90612b0a565b600b80546001600160a01b0319166001600160a01b038616179055600f6000908152600e6020527f60dd7f0393e3d3987afafbb50883ff45658a7a0c2d4460aa7a872d45c2ea23528054916110e083612b4c565b90915550506040516001600160a01b038516815230907f8ae5d58e62e6170190a58e22b659d9b8119ee908fd43d7caaab82b3e9798960090602001610c8d565b6111306006600486868686611f7e565b61114c5760405162461bcd60e51b8152600401610b2c90612b0a565b600680546001600160a01b0319166001600160a01b0386161781556000908152600e6020527f92b4482321f41ce3aa65f798bda23d0d12a60fc5f212868a548ddb00aa49de7280549161119e83612b4c565b90915550506040516001600160a01b0385169030907f51789e28956e8f4cc5dc421a2fb6ecd7f8156b0ed4d589fdb79d63a6a84b16ae90600090a350505050565b6111ef6003600586868686611f7e565b61120b5760405162461bcd60e51b8152600401610b2c90612b0a565b6001600160a01b03841660009081526001602090815260408220805460ff1916905560038252600e90527fe0283e559c29e31ee7f56467acc9dd307779c843a883aeeb3bf5c6128c90814480549161126283612b4c565b90915550506040516001600160a01b0385169030907f72ec32f01f8006acef23c8f74ca78c02652911dd15004c19e6215554218e157b90600090a350505050565b6112b3600b600486868686611f7e565b6112cf5760405162461bcd60e51b8152600401610b2c90612b0a565b6001600160a01b03841660009081526004602090815260408220805460ff19169055600b8252600e90527f7528327bfca11f705552fba9c3966003c5a3e73459dc289e7c8420997d319bee80549161132683612b4c565b90915550506040516001600160a01b0385169030907f63ffd1dcf28079a04044401d17bee4f2d68170c9203a2e06cfa2fba45ea17f9790600090a350505050565b6113776002600586868686611f7e565b6113935760405162461bcd60e51b8152600401610b2c90612b0a565b6001600160a01b03841660009081526020819052604090205460ff16156113d5576001600160a01b0384166000908152602081905260409020805460ff191690555b6001600160a01b03841660009081526001602081815260408320805460ff191690921790915560028252600e90527f9adb202b1492743bc00c81d33cdc6423fa8c79109027eb6a845391e8fc1f048180549161143083612b4c565b90915550506040516001600160a01b0385169030907f27ab3985e12c964143a42679213b782b531b9b79c0f81daf480b00e0e7499b1d90600090a350505050565b6114816009600486868686611f7e565b61149d5760405162461bcd60e51b8152600401610b2c90612b0a565b6001600160a01b03841660009081526003602090815260408220805460ff1916905560098252600e90527f0d5ccdc17421fca5ca768ae29a27b8b2aa886c9e56e3482f9ba55d79d3a806648054916114f483612b4c565b90915550506040516001600160a01b0385169030907fd7c4423629063c6074c6a5d149c6a591cd8a007c519a7af660ef58f3fe7d0f5390600090a350505050565b6115456005600486868686611f7e565b6115615760405162461bcd60e51b8152600401610b2c90612b0a565b6001600160a01b03841660009081526005602081815260408320805460ff19169055908252600e90527fb9bec7e2561f624fe753ff070f1599b306cbf59fafd4e8d5a8184a1ea1841bce8054916115b783612b4c565b90915550506040516001600160a01b0385169030907f3ef83d92340abc2f29fceb213d593e6348f0bafc7161b6b53c65ebff3e207fbf90600090a350505050565b611608600a600486868686611f7e565b6116245760405162461bcd60e51b8152600401610b2c90612b0a565b6001600160a01b03841660009081526004602090815260408220805460ff19166001179055600a8252600e90527f0978afefdfd541f3bdffe34b0f19bc4ce1d7b3554d278a75e04686adf3223b3980549161167e83612b4c565b90915550506040516001600160a01b0385169030907f224c2f3a0794342c616e2e1c9fdfac78b745825dd090fb47bd157a9287b24efc90600090a350505050565b6006546001600160a01b031633146116e95760405162461bcd60e51b8152600401610b2c90612b73565b6008546040516224c24160ea1b81526000916001600160a01b03169063930904009061172390899089908990899030908a90600401612c2d565b6020604051808303816000875af1158015611742573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117669190612be6565b6001600160a01b03811660008181526003602052604090819020805460ff19166001179055519192509030907f1b3869418862c46f7d5b4ba916b9e2a24a1b83d01db2feb799912428152facf2906117c390889088908c90612cb0565b60405180910390a3505050505050565b6006546001600160a01b031633146117fd5760405162461bcd60e51b8152600401610b2c90612b73565b60095460405163104334d160e01b81526001600160a01b03868116600483015285811660248301523060448301526064820185905260848201849052600092169063104334d19060a4016020604051808303816000875af1158015611866573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061188a9190612be6565b6001600160a01b03818116600081815260036020908152604091829020805460ff1916600117905581518a85168152938916908401529293509130917f0aeb859c0349af9b3a68b63bb2824ff4289cee5e3ac698c2bd156f94e6bff9c491015b60405180910390a35050505050565b6119096001600586868686611f7e565b6119255760405162461bcd60e51b8152600401610b2c90612b0a565b6001600160a01b0384166000908152602081815260408220805460ff1916905560018252600e90527fa7c5ba7114a813b50159add3a36832908dc83db71d0b9a24c2ad0f83be95820780549161197a83612b4c565b90915550506040516001600160a01b0385169030907fda9880e47f4bc6a0582bc0e57898ebe7724b5d2bb7041c2729cf405f8de1bc4c90600090a350505050565b6119cb600c600486868686611f7e565b6119e75760405162461bcd60e51b8152600401610b2c90612b0a565b600880546001600160a01b0319166001600160a01b038616179055600c6000908152600e6020527f47a2bf86628ea95bf13ae7e8527a13a64f52541d600ba060a013f0b8e72a5e2d805491611a3b83612b4c565b90915550506040516001600160a01b038516815230907fd3a2ddc21d0068be97af44043f929ae8466bfcb5c50963a4fbded974d3aa853290602001610c8d565b611a8b6011600586868686611f7e565b611aa75760405162461bcd60e51b8152600401610b2c90612b0a565b6001600160a01b03841660009081526002602090815260408220805460ff1916600117905560118252600e90527fc0fe3ac15929d25201e62b8c796afb6745bcdd80b8be9470092f43535ba0b48d805491611b0183612b4c565b90915550506040516001600160a01b0385169030907ffec66d4c601d68ac856ebd19aabb9c83e890d509a0dc54ae4210396ad58e60f290600090a350505050565b611b526007600486868686611f7e565b611b6e5760405162461bcd60e51b8152600401610b2c90612b0a565b6007546001600160a01b031615611ba2576007546001600160a01b03166000908152602081905260409020805460ff191690555b600780546001600160a01b0319166001600160a01b0386161781556000908152600e6020527f376529bb8a2d41b4a589a133407fc64f3212472dbd74744348be1098bf7ba08d805491611bf483612b4c565b90915550506001600160a01b038416600081815260208190526040808220805460ff191660011790555130917f27eb5418afdb9bfda78cc5ce86a86a0c30ca6cade46a87d3c0a122957930fc1291a350505050565b6006546001600160a01b03163314611c735760405162461bcd60e51b8152600401610b2c90612b73565b600a54604051631d0c447160e31b81526001600160a01b03868116600483015285811660248301523060448301526064820185905260848201849052600092169063e86223889060a4016020604051808303816000875af1158015611cdc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d009190612be6565b6001600160a01b03818116600081815260036020908152604091829020805460ff1916600117905581518a85168152938916908401529293509130917f4d87bc74f29f4e573cc92cb7618b7895cee1ebafdc9276eb57ac451ab74a112991016118ea565b611d7560106004878787878761227c565b611d915760405162461bcd60e51b8152600401610b2c90612b0a565b60005b8551811015611e2f576000868281518110611db157611db1612ce5565b6020908102919091010151604051636a5115ef60e11b81526001600160a01b0388811660048301529192509082169063d4a22bde90602401600060405180830381600087803b158015611e0357600080fd5b505af1158015611e17573d6000803e3d6000fd5b50505050508080611e2790612b4c565b915050611d94565b5060106000908152600e6020527f33820a7b4c4724aafa212ecdbe06d3782aeae3dbe20fcf670d9acc29d388ea90805491611e6983612b4c565b9190505550306001600160a01b03167f58d58dc2efb2729f8af0e7de4ea2c458977b98f68d84d982aebe02908bf38a288686604051611ea9929190612cfb565b60405180910390a25050505050565b611ec760048086868686611f7e565b611ee35760405162461bcd60e51b8152600401610b2c90612b0a565b6001600160a01b03841660009081526005602090815260408220805460ff1916600117905560048252600e90527fa1d6913cd9e08c872be3e7525cca82e4fc0fc298a783f19022be725b19be685a805491611f3d83612b4c565b90915550506040516001600160a01b0385169030907ffc0a297df75d7d844b951dd3864b6ffa3ce61da20cec71f9c43e94153620190890600090a350505050565b60008251845114611f8e57600080fd5b8151835114611f9c57600080fd5b600284511015611fab57600080fd5b6000845167ffffffffffffffff811115611fc757611fc761256e565b604051908082528060200260200182016040528015611ff0578160200160208202803683370190505b5090506000600d60008a601281111561200b5761200b612b36565b601281111561201c5761201c612b36565b81526020019081526020016000205490506000600e60008b601281111561204557612045612b36565b601281111561205657612056612b36565b815260200190815260200160002054905060005b87518110156121b25773dadca26bc22c8205a15f8c70c7f1d02498d2bd9563bc36f920600c5485858d8d87815181106120a5576120a5612ce5565b60200260200101518d88815181106120bf576120bf612ce5565b60200260200101518d89815181106120d9576120d9612ce5565b60209081029190910101516040516001600160e01b031960e08a901b1681526004810197909752602487019590955260448601939093526001600160a01b03909116606485015260ff16608484015260a483015260c482015260e401602060405180830381865af4158015612152573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121769190612be6565b84828151811061218857612188612ce5565b6001600160a01b0390921660209283029190910190910152806121aa81612b4c565b91505061206a565b506040516364f0651160e11b815273dadca26bc22c8205a15f8c70c7f1d02498d2bd959063c9e0ca22906121ec908c908790600401612d9c565b602060405180830381865af4158015612209573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061222d9190612dbd565b61226c5760405162461bcd60e51b815260206004820152601060248201526f1b585b9859d95c9cc81a5b9d985b1a5960821b6044820152606401610b2c565b5060019998505050505050505050565b6000825184511461228c57600080fd5b815183511461229a57600080fd5b6002845110156122a957600080fd5b6000845167ffffffffffffffff8111156122c5576122c561256e565b6040519080825280602002602001820160405280156122ee578160200160208202803683370190505b5090506000600d60008b601281111561230957612309612b36565b601281111561231a5761231a612b36565b81526020019081526020016000205490506000600e60008c601281111561234357612343612b36565b601281111561235457612354612b36565b815260200190815260200160002054905060005b87518110156124805773dadca26bc22c8205a15f8c70c7f1d02498d2bd95633ecfc6ea600c5485858e8e8e88815181106123a4576123a4612ce5565b60200260200101518e89815181106123be576123be612ce5565b60200260200101518e8a815181106123d8576123d8612ce5565b60200260200101516040518963ffffffff1660e01b8152600401612403989796959493929190612ddf565b602060405180830381865af4158015612420573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124449190612be6565b84828151811061245657612456612ce5565b6001600160a01b03909216602092830291909101909101528061247881612b4c565b915050612368565b506040516364f0651160e11b815273dadca26bc22c8205a15f8c70c7f1d02498d2bd959063c9e0ca22906124ba908d908790600401612d9c565b602060405180830381865af41580156124d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124fb9190612dbd565b61253a5760405162461bcd60e51b815260206004820152601060248201526f1b585b9859d95c9cc81a5b9d985b1a5960821b6044820152606401610b2c565b5060019a9950505050505050505050565b6001600160a01b038116811461256057600080fd5b50565b8035610ed78161254b565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156125ad576125ad61256e565b604052919050565b600067ffffffffffffffff8211156125cf576125cf61256e565b5060051b60200190565b600082601f8301126125ea57600080fd5b813560206125ff6125fa836125b5565b612584565b82815260059290921b8401810191818101908684111561261e57600080fd5b8286015b8481101561264957803560ff8116811461263c5760008081fd5b8352918301918301612622565b509695505050505050565b600082601f83011261266557600080fd5b813560206126756125fa836125b5565b82815260059290921b8401810191818101908684111561269457600080fd5b8286015b848110156126495780358352918301918301612698565b600080600080608085870312156126c557600080fd5b84356126d08161254b565b9350602085013567ffffffffffffffff808211156126ed57600080fd5b6126f9888389016125d9565b9450604087013591508082111561270f57600080fd5b61271b88838901612654565b9350606087013591508082111561273157600080fd5b5061273e87828801612654565b91505092959194509250565b600082601f83011261275b57600080fd5b813567ffffffffffffffff8111156127755761277561256e565b612788601f8201601f1916602001612584565b81815284602083860101111561279d57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000606084860312156127cf57600080fd5b833567ffffffffffffffff8111156127e657600080fd5b6127f28682870161274a565b93505060208401356128038161254b565b929592945050506040919091013590565b6000815180845260005b8181101561283a5760208185018101518683018201520161281e565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061286d6020830184612814565b9392505050565b60006020828403121561288657600080fd5b813561286d8161254b565b6000602082840312156128a357600080fd5b81356013811061286d57600080fd5b600080600080600060a086880312156128ca57600080fd5b853567ffffffffffffffff808211156128e257600080fd5b6128ee89838a0161274a565b965060209150818801356129018161254b565b955060408801356129118161254b565b945060608801356129218161254b565b935060808801358181111561293557600080fd5b88019050601f8101891361294857600080fd5b80356129566125fa826125b5565b81815260059190911b8201830190838101908b83111561297557600080fd5b928401925b828410156129935783358252928401929084019061297a565b80955050505050509295509295909350565b600080600080608085870312156129bb57600080fd5b84356129c68161254b565b935060208501356129d68161254b565b93969395505050506040820135916060013590565b600080600080600060a08688031215612a0357600080fd5b853567ffffffffffffffff80821115612a1b57600080fd5b818801915088601f830112612a2f57600080fd5b81356020612a3f6125fa836125b5565b82815260059290921b8401810191818101908c841115612a5e57600080fd5b948201945b83861015612a85578535612a768161254b565b82529482019490820190612a63565b9950612a9490508a8201612563565b975050506040880135915080821115612aac57600080fd5b612ab889838a016125d9565b94506060880135915080821115612ace57600080fd5b612ada89838a01612654565b93506080880135915080821115612af057600080fd5b50612afd88828901612654565b9150509295509295909350565b602080825260129082015271696e76616c6964207369676e61747572657360701b604082015260600190565b634e487b7160e01b600052602160045260246000fd5b600060018201612b6c57634e487b7160e01b600052601160045260246000fd5b5060010190565b6020808252601e908201527f43616c6c6572206973206e6f7420636f6e7472616374206d616e616765720000604082015260600190565b608081526000612bbd6080830187612814565b6001600160a01b0395861660208401526040830194909452509216606090920191909152919050565b600060208284031215612bf857600080fd5b815161286d8161254b565b604081526000612c166040830185612814565b905060018060a01b03831660208301529392505050565b60c081526000612c4060c0830189612814565b6001600160a01b0388811660208581019190915288821660408601528782166060860152908616608085015283820360a085015284518083528582019282019060005b81811015612c9f57845183529383019391830191600101612c83565b50909b9a5050505050505050505050565b6001600160a01b03848116825283166020820152606060408201819052600090612cdc90830184612814565b95945050505050565b634e487b7160e01b600052603260045260246000fd5b604080825283519082018190526000906020906060840190828701845b82811015612d3d5781516001600160a01b031684529284019290840190600101612d18565b5050506001600160a01b039490941692019190915250919050565b600081518084526020808501945080840160005b83811015612d915781516001600160a01b031687529582019590820190600101612d6c565b509495945050505050565b828152604060208201526000612db56040830184612d58565b949350505050565b600060208284031215612dcf57600080fd5b8151801515811461286d57600080fd5b60006101008a8352896020840152886040840152806060840152612e0581840189612d58565b6001600160a01b03979097166080840152505060ff9390931660a084015260c083019190915260e09091015294935050505056fea2646970667358221220ec6e7ec5c5a4d6b57125310ddfaf3c3055e56479b846bf19f8223631f4cfc58d64736f6c63430008100033","optimization_enabled":true,"verified_twin_address_hash":null,"is_verified":true,"compiler_settings":{"evmVersion":"london","libraries":{"contracts/libraries/LManagement.sol:LManagement":"0xdadca26bc22c8205a15f8c70c7f1d02498d2bd95"},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[]},"optimization_runs":200,"sourcify_repo_url":"https://repo.sourcify.dev/contracts/partial_match/1/0x96ABd1C04882BCe372203d43649be525F8AE87ba/","decoded_constructor_args":[[["0x505CBF743E97ABC4E6d41397a8b7c3c0De749051","0x5b8db39DBaa4cCfaDA8B66e136A2d780717C5bdf","0x1Cb22E0599d6689A29e33Ba1a7C95f216Dd955fF","0x4579E8ad5330EDE662202725Fc2c7D5b4c80e7DB"],{"internalType":"address[]","name":"_admins","type":"address[]"}],[["0x8A1Ce05249FB67cDdeC08E10B8173Fe07080CC4B","0x0E407979a4870e8B266ed8D63b5cab9f71b8Ce17","0x22703D216C7942455987b23C349cf9A2c402e5d1","0x97B7d09D5Af7aF8232079CD04d2519E44192b3DA"],{"internalType":"address[]","name":"_factories","type":"address[]"}]],"compiler_version":"0.8.16+commit.07a7930e","is_verified_via_verifier_alliance":false,"verified_at":"2024-07-11T09:10:23.067413Z","implementations":[],"proxy_type":null,"external_libraries":[{"name":"contracts/libraries/LManagement.sol:LManagement","address_hash":"0xdaDcA26bc22c8205a15f8c70C7F1d02498d2bd95"}],"creation_bytecode":"0x60806040523480156200001157600080fd5b506040516200379a3803806200379a833981016040819052620000349162000873565b604080518082018252600a81526913585b9859d95b595b9d60b21b6020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527f0a0e28cff0ad91cc255a2c6f970ad7d0cc9855e3f9229ce313219b7b46839458818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a0808301919091528351808303909101815260c0909101909252815191810191909120600c55600d90527fbae36f97ece7ff6d06ff73064049b6deade63e84a39445ca59a9f59d7b0e9d377f81955a0a11e65eac625c29e8882660bae4e165a75d72780094acae8ece9a29ee557f64c10c1478cf7c3721d359e2f78dfa299c48914c2b6eee9faf35f8508efaeb667ffd54ff1ed53f34a900b24c5ba64f85761163b5d82d98a47b9bd80e45466993c5557f998c128fd52190b99cc267054dba040f747bb1889483c451e6e62ecec6f6d8367f10a81eed9d63d16face5e76357905348e6253d3394086026bb2bf2145d7cc249557f67e02dd9101cb5ec4ba888b64cf2c887af2342ac87015f0d3964de766f752ba37f26b4a10d0f0b04925c23bd4480ee147c916e5e87a7d68206a533dad160ac81e2557f163ef0b23224e585a532cb21be056017dc5e24df899e899050f87fb0d9d0e6af7fafafe8948a4ed9d478b1e9a5780b119b5edd00ea7d07bc35bef7c814824eb94b557f5ec50e1700093b09774f85c99fe10b2181ff7ebf6137116fee769be0f81fa8057fa5049387d9cb649c59f4bda666105ba636c2a103d8e2b232ba4d125737cd2149557fb5f4b13180b35446f001da8d7a0d31d20f8ec9923e348cc5febdad1de8b247a67fa48544818c2c710afa9849c61ec9c60e8acdb3eaa2885f33b37e118cc8fd04ac557f3dcf3f15c74bb4d23ab46e4d6ad7cb01451ac366ec11b9471bc09f7db736ad9a7fb91432bedff11256dbe14161d3606a2657bc9dacf8742f6b817d871dd53fb976557f1c12de27ba3f67de1dcc525f385b6a129320bf3a5498f39609f3162fdff121747f0b705463cf5f7356780ee6e96132d37412c1b5816a4d207b8dcd42c349767457557f1be7eca310a863b2bb7cd7bec55909338bc6875ad0756ac9ddfa750c868aa1767f7b6f1ece0cbe5122a575776770f0494c2d57ed2a50e36c2ba0d811d70ee03b64557fcf8112dd5614e0034cc93ebdb4f9f2022169d42d53deb26955289b3166922bd67fba9d637f252776d5e1b3534bbd7554a1265a4ef0539d9ca50abe118598a6973c557f7720a4a484039e81f3c0e5fb52777da87964d87481af2590bb33051987c3978d7f52c2086a203f40e709b1346663401f6c737b2fce5878601fcf875b047fed5fb6557f82a5ca036b13d3a4d2434003f390437bc3cca474cb0105d5d00dc876270e886c7fe399baa2fabbab2a0309615b124a802277bab50ec0ca3452a00889e216c4b902557f359c99fc0cb49cd48a2b30e841fa0eb69dd24d1a27568d10de6bbf66a2b682ca7fe0af3347aa7e5af384208c9d29458f902f0ceddbc90963608afa77235658b360557fbf8bfccdd4104913963fd44789a30b476f07bb27996c4e09368cd28b0ad312f07f154ef5b709dcdc8b49a2af6408b8a1af209c39b5fa796f03680257c97692546e557f907bf65e4c55c6e6b92c6b773f9d37c37ecac28d90231a91f35473e6400203d07f52fb6a28cb3c239105f8f829bc7376f939b6bfb040c470bdc2bda0af2e784b94557fd33bb19e110fdd3dde0f5adcf90869ca157d2bda52f50a3f08594dcbeedb52607f01a49be1e7ea084651fd665847100d28826db0b17160863a99534933cbbd2dce557f3d89d6d5d11eb76b63c2c6f18dfb34b3af7acc2d703db73c28069a378ff7aec27f6fbf3b49b523bc27464b7dbfa6311951351b1d3efd07aa2ee4d1ce319801a0ce55601260009081527f9cc9d087aba7064e2e525ccec3dcf261b9e6580c2ceefdf3a7ac50a56474f3447f0a206051e911305809ddd48cf2baa7ead2c7fb038e505e1d02f9e6c2ce72930c555b82518110156200067a57600160046000858481518110620006335762000633620008dd565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806200067181620008f3565b9150506200060e565b5080600081518110620006915762000691620008dd565b6020026020010151600860006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080600181518110620006d557620006d5620008dd565b6020026020010151600960006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080600281518110620007195762000719620008dd565b6020026020010151600a60006101000a8154816001600160a01b0302191690836001600160a01b03160217905550806003815181106200075d576200075d620008dd565b6020026020010151600b60006101000a8154816001600160a01b0302191690836001600160a01b0316021790555050506200091b565b634e487b7160e01b600052604160045260246000fd5b80516001600160a01b0381168114620007c157600080fd5b919050565b600082601f830112620007d857600080fd5b815160206001600160401b0380831115620007f757620007f762000793565b8260051b604051601f19603f830116810181811084821117156200081f576200081f62000793565b6040529384528581018301938381019250878511156200083e57600080fd5b83870191505b8482101562000868576200085882620007a9565b8352918301919083019062000844565b979650505050505050565b600080604083850312156200088757600080fd5b82516001600160401b03808211156200089f57600080fd5b620008ad86838701620007c6565b93506020850151915080821115620008c457600080fd5b50620008d385828601620007c6565b9150509250929050565b634e487b7160e01b600052603260045260246000fd5b6000600182016200091457634e487b7160e01b600052601160045260246000fd5b5060010190565b612e6f806200092b6000396000f3fe608060405234801561001057600080fd5b50600436106103ba5760003560e01c806373daf71f116101f4578063caa4068d1161011a578063e1edc870116100ad578063f006380a1161007c578063f006380a14610a90578063f8ae2fb114610aa3578063fdff9b4d14610ab6578063ffa4cc4714610ad957600080fd5b8063e1edc87014610a30578063e2bbcb2514610a43578063e98bd25e14610a56578063ed14834f14610a7d57600080fd5b8063d4739a2c116100e9578063d4739a2c146109cb578063dacda92f146109de578063dc7e571b146109f1578063e184f6cb14610a0457600080fd5b8063caa4068d1461097f578063cc27f64b14610992578063d1bf9f8e146109a5578063d43ed3d1146109b857600080fd5b8063a3ad630211610192578063b539928311610161578063b5399283146108f6578063c034a9db14610919578063c55fb4901461092c578063ca14d1bb1461095357600080fd5b8063a3ad630214610869578063af4dcc6414610890578063b09c4d3d146108b7578063b39e12cf146108e357600080fd5b80638dd27f65116101ce5780638dd27f651461080957806395e97650146108305780639e06490914610843578063a12cf8261461085657600080fd5b806373daf71f146107945780638940d35c146107bb5780638d0f120f146107e257600080fd5b8063372c12b1116102e45780635520d02c116102775780635bdedefe116102465780635bdedefe146107205780635cea0fc2146107475780636964584a1461076e578063698480891461078157600080fd5b80635520d02c146106c057806356ef3098146106d357806359cc389d146106fa5780635b3113ef1461070d57600080fd5b80634b4c7617116102b35780634b4c76171461062f5780634cf05e97146106525780635035bda21461067957806353cb405d1461069957600080fd5b8063372c12b1146105bf5780633c964777146105e25780633f9fdb22146105f5578063423463571461060857600080fd5b8063126013ed1161035c5780632e4f4d671161032b5780632e4f4d67146105555780632e5ae0d11461057c578063306abccf146105a35780633644e515146105b657600080fd5b8063126013ed146104bb57806316f2c85a146104f05780631d42e9af1461051b578063240f46fb1461054257600080fd5b806306fdde031161039857806306fdde03146103fa5780630be5967b146104395780630cce67581461046c578063106328d41461049857600080fd5b8063033954c3146103bf57806304b3c21c146103d4578063050c8e2b146103e7575b600080fd5b6103d26103cd3660046126af565b610b00565b005b6103d26103e23660046126af565b610bd0565b6103d26103f53660046127ba565b610c9b565b6104236040518060400160405280600a81526020016913585b9859d95b595b9d60b21b81525081565b604051610430919061285a565b60405180910390f35b61045c610447366004612874565b60036020526000908152604090205460ff1681565b6040519015158152602001610430565b61045c61047a366004612874565b6001600160a01b031660009081526020819052604090205460ff1690565b61045c6104a6366004612874565b60046020526000908152604090205460ff1681565b6104e27fcf8112dd5614e0034cc93ebdb4f9f2022169d42d53deb26955289b3166922bd681565b604051908152602001610430565b600b54610503906001600160a01b031681565b6040516001600160a01b039091168152602001610430565b6104e27fbf8bfccdd4104913963fd44789a30b476f07bb27996c4e09368cd28b0ad312f081565b6103d26105503660046126af565b610da8565b6104e27fb5f4b13180b35446f001da8d7a0d31d20f8ec9923e348cc5febdad1de8b247a681565b6104e27f359c99fc0cb49cd48a2b30e841fa0eb69dd24d1a27568d10de6bbf66a2b682ca81565b61045c6105b1366004612874565b610eae565b6104e2600c5481565b61045c6105cd366004612874565b60006020819052908152604090205460ff1681565b600954610503906001600160a01b031681565b6103d26106033660046126af565b610edc565b6104e27f64c10c1478cf7c3721d359e2f78dfa299c48914c2b6eee9faf35f8508efaeb6681565b61045c61063d366004612874565b60016020526000908152604090205460ff1681565b6104e27f9cc9d087aba7064e2e525ccec3dcf261b9e6580c2ceefdf3a7ac50a56474f34481565b6104e2610687366004612891565b600e6020526000908152604090205481565b6104e27f907bf65e4c55c6e6b92c6b773f9d37c37ecac28d90231a91f35473e6400203d081565b6103d26106ce3660046126af565b610fa0565b6104e27fd33bb19e110fdd3dde0f5adcf90869ca157d2bda52f50a3f08594dcbeedb526081565b6103d26107083660046126af565b611060565b6103d261071b3660046126af565b611120565b6104e27f7720a4a484039e81f3c0e5fb52777da87964d87481af2590bb33051987c3978d81565b6104e27f1c12de27ba3f67de1dcc525f385b6a129320bf3a5498f39609f3162fdff1217481565b6103d261077c3660046126af565b6111df565b6103d261078f3660046126af565b6112a3565b6104e27f1be7eca310a863b2bb7cd7bec55909338bc6875ad0756ac9ddfa750c868aa17681565b6104e27f5ec50e1700093b09774f85c99fe10b2181ff7ebf6137116fee769be0f81fa80581565b6104e27f3d89d6d5d11eb76b63c2c6f18dfb34b3af7acc2d703db73c28069a378ff7aec281565b6104e27f163ef0b23224e585a532cb21be056017dc5e24df899e899050f87fb0d9d0e6af81565b6103d261083e3660046126af565b611367565b6103d26108513660046126af565b611471565b6103d26108643660046126af565b611535565b6104e27f67e02dd9101cb5ec4ba888b64cf2c887af2342ac87015f0d3964de766f752ba381565b6104e27f3dcf3f15c74bb4d23ab46e4d6ad7cb01451ac366ec11b9471bc09f7db736ad9a81565b61045c6108c5366004612874565b6001600160a01b031660009081526001602052604090205460ff1690565b600654610503906001600160a01b031681565b61045c610904366004612874565b60026020526000908152604090205460ff1681565b6103d26109273660046126af565b6115f8565b6104e27f998c128fd52190b99cc267054dba040f747bb1889483c451e6e62ecec6f6d83681565b61045c610961366004612874565b6001600160a01b031660009081526003602052604090205460ff1690565b6103d261098d3660046128b2565b6116bf565b6103d26109a03660046129a5565b6117d3565b6103d26109b33660046126af565b6118f9565b6103d26109c63660046126af565b6119bb565b6103d26109d93660046126af565b611a7b565b600854610503906001600160a01b031681565b600a54610503906001600160a01b031681565b61045c610a12366004612874565b6001600160a01b031660009081526002602052604090205460ff1690565b6103d2610a3e3660046126af565b611b42565b6103d2610a513660046129a5565b611c49565b6104e27fbae36f97ece7ff6d06ff73064049b6deade63e84a39445ca59a9f59d7b0e9d3781565b600754610503906001600160a01b031681565b6103d2610a9e3660046129eb565b611d64565b6103d2610ab13660046126af565b611eb8565b61045c610ac4366004612874565b60056020526000908152604090205460ff1681565b6104e27f82a5ca036b13d3a4d2434003f390437bc3cca474cb0105d5d00dc876270e886c81565b610b106008600486868686611f7e565b610b355760405162461bcd60e51b8152600401610b2c90612b0a565b60405180910390fd5b6001600160a01b03841660009081526003602090815260408220805460ff1916600117905560088252600e90527feab6bc3746954d8a0719de62c86ea908d362be2a58c781ada1046727253f9df2805491610b8f83612b4c565b90915550506040516001600160a01b0385169030907fb8d544f22db6826f41ccad080d88c0903ddbc51bbade47af333ac7a347135fe790600090a350505050565b610be0600e600486868686611f7e565b610bfc5760405162461bcd60e51b8152600401610b2c90612b0a565b600a80546001600160a01b0319166001600160a01b038616179055600e60008181526020919091527fa6897c210c76a29b3d6bf757063b10a3faa77fe0657de0ee282493e99a18ed50805491610c5183612b4c565b90915550506040516001600160a01b038516815230907f8b06a4b08bf6a0ee94541ad92cf0a0cf311a35d22559a6069e9931685dcee877906020015b60405180910390a250505050565b6006546001600160a01b03163314610cc55760405162461bcd60e51b8152600401610b2c90612b73565b600b54604051632721925360e01b81526000916001600160a01b031690632721925390610cfc908790879087903090600401612baa565b6020604051808303816000875af1158015610d1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d3f9190612be6565b6001600160a01b03811660008181526003602052604090819020805460ff19166001179055519192509030907f7724ec8a5918b5c722fc260a04944c5b91218f0b7ede8d6ea6d032a3e0bf259590610d9a9088908890612c03565b60405180910390a350505050565b610db86000600586868686611f7e565b610dd45760405162461bcd60e51b8152600401610b2c90612b0a565b6001600160a01b03841660009081526001602052604090205460ff1615610e16576001600160a01b0384166000908152600160205260409020805460ff191690555b6001600160a01b0384166000908152602081815260408220805460ff19166001179055818052600e90527fe710864318d4a32f37d6ce54cb3fadbef648dd12d8dbdf53973564d56b7f881c805491610e6d83612b4c565b90915550506040516001600160a01b0385169030907f36365224c888719109af22166d40ff256374b38e9b78a8ee1b039e323b40853390600090a350505050565b6006546000906001600160a01b0390811690831603610ecf57506001919050565b506000919050565b919050565b610eec6012600586868686611f7e565b610f085760405162461bcd60e51b8152600401610b2c90612b0a565b6001600160a01b03841660009081526002602090815260408220805460ff1916905560128252600e90527f3757bb026b72bf4f9cbbbf8f2bafe0ea3d356ae6d8f07ef005aafb99b4cbde40805491610f5f83612b4c565b90915550506040516001600160a01b0385169030907f51c355c400f08b9cae030e4af5347d5f6686e5791e8dbfeb869fc3979c93707690600090a350505050565b610fb0600d600486868686611f7e565b610fcc5760405162461bcd60e51b8152600401610b2c90612b0a565b600980546001600160a01b0319166001600160a01b038616179055600d6000908152600e6020527f9d0231707eb2041153c28e130d22114ee38b252cf17233585036af02278e418180549161102083612b4c565b90915550506040516001600160a01b038516815230907f1c6e5a1e337b8c0056b48ad17b791287c5d9bdf1feb0f75a9f9899acb41acc1490602001610c8d565b611070600f600486868686611f7e565b61108c5760405162461bcd60e51b8152600401610b2c90612b0a565b600b80546001600160a01b0319166001600160a01b038616179055600f6000908152600e6020527f60dd7f0393e3d3987afafbb50883ff45658a7a0c2d4460aa7a872d45c2ea23528054916110e083612b4c565b90915550506040516001600160a01b038516815230907f8ae5d58e62e6170190a58e22b659d9b8119ee908fd43d7caaab82b3e9798960090602001610c8d565b6111306006600486868686611f7e565b61114c5760405162461bcd60e51b8152600401610b2c90612b0a565b600680546001600160a01b0319166001600160a01b0386161781556000908152600e6020527f92b4482321f41ce3aa65f798bda23d0d12a60fc5f212868a548ddb00aa49de7280549161119e83612b4c565b90915550506040516001600160a01b0385169030907f51789e28956e8f4cc5dc421a2fb6ecd7f8156b0ed4d589fdb79d63a6a84b16ae90600090a350505050565b6111ef6003600586868686611f7e565b61120b5760405162461bcd60e51b8152600401610b2c90612b0a565b6001600160a01b03841660009081526001602090815260408220805460ff1916905560038252600e90527fe0283e559c29e31ee7f56467acc9dd307779c843a883aeeb3bf5c6128c90814480549161126283612b4c565b90915550506040516001600160a01b0385169030907f72ec32f01f8006acef23c8f74ca78c02652911dd15004c19e6215554218e157b90600090a350505050565b6112b3600b600486868686611f7e565b6112cf5760405162461bcd60e51b8152600401610b2c90612b0a565b6001600160a01b03841660009081526004602090815260408220805460ff19169055600b8252600e90527f7528327bfca11f705552fba9c3966003c5a3e73459dc289e7c8420997d319bee80549161132683612b4c565b90915550506040516001600160a01b0385169030907f63ffd1dcf28079a04044401d17bee4f2d68170c9203a2e06cfa2fba45ea17f9790600090a350505050565b6113776002600586868686611f7e565b6113935760405162461bcd60e51b8152600401610b2c90612b0a565b6001600160a01b03841660009081526020819052604090205460ff16156113d5576001600160a01b0384166000908152602081905260409020805460ff191690555b6001600160a01b03841660009081526001602081815260408320805460ff191690921790915560028252600e90527f9adb202b1492743bc00c81d33cdc6423fa8c79109027eb6a845391e8fc1f048180549161143083612b4c565b90915550506040516001600160a01b0385169030907f27ab3985e12c964143a42679213b782b531b9b79c0f81daf480b00e0e7499b1d90600090a350505050565b6114816009600486868686611f7e565b61149d5760405162461bcd60e51b8152600401610b2c90612b0a565b6001600160a01b03841660009081526003602090815260408220805460ff1916905560098252600e90527f0d5ccdc17421fca5ca768ae29a27b8b2aa886c9e56e3482f9ba55d79d3a806648054916114f483612b4c565b90915550506040516001600160a01b0385169030907fd7c4423629063c6074c6a5d149c6a591cd8a007c519a7af660ef58f3fe7d0f5390600090a350505050565b6115456005600486868686611f7e565b6115615760405162461bcd60e51b8152600401610b2c90612b0a565b6001600160a01b03841660009081526005602081815260408320805460ff19169055908252600e90527fb9bec7e2561f624fe753ff070f1599b306cbf59fafd4e8d5a8184a1ea1841bce8054916115b783612b4c565b90915550506040516001600160a01b0385169030907f3ef83d92340abc2f29fceb213d593e6348f0bafc7161b6b53c65ebff3e207fbf90600090a350505050565b611608600a600486868686611f7e565b6116245760405162461bcd60e51b8152600401610b2c90612b0a565b6001600160a01b03841660009081526004602090815260408220805460ff19166001179055600a8252600e90527f0978afefdfd541f3bdffe34b0f19bc4ce1d7b3554d278a75e04686adf3223b3980549161167e83612b4c565b90915550506040516001600160a01b0385169030907f224c2f3a0794342c616e2e1c9fdfac78b745825dd090fb47bd157a9287b24efc90600090a350505050565b6006546001600160a01b031633146116e95760405162461bcd60e51b8152600401610b2c90612b73565b6008546040516224c24160ea1b81526000916001600160a01b03169063930904009061172390899089908990899030908a90600401612c2d565b6020604051808303816000875af1158015611742573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117669190612be6565b6001600160a01b03811660008181526003602052604090819020805460ff19166001179055519192509030907f1b3869418862c46f7d5b4ba916b9e2a24a1b83d01db2feb799912428152facf2906117c390889088908c90612cb0565b60405180910390a3505050505050565b6006546001600160a01b031633146117fd5760405162461bcd60e51b8152600401610b2c90612b73565b60095460405163104334d160e01b81526001600160a01b03868116600483015285811660248301523060448301526064820185905260848201849052600092169063104334d19060a4016020604051808303816000875af1158015611866573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061188a9190612be6565b6001600160a01b03818116600081815260036020908152604091829020805460ff1916600117905581518a85168152938916908401529293509130917f0aeb859c0349af9b3a68b63bb2824ff4289cee5e3ac698c2bd156f94e6bff9c491015b60405180910390a35050505050565b6119096001600586868686611f7e565b6119255760405162461bcd60e51b8152600401610b2c90612b0a565b6001600160a01b0384166000908152602081815260408220805460ff1916905560018252600e90527fa7c5ba7114a813b50159add3a36832908dc83db71d0b9a24c2ad0f83be95820780549161197a83612b4c565b90915550506040516001600160a01b0385169030907fda9880e47f4bc6a0582bc0e57898ebe7724b5d2bb7041c2729cf405f8de1bc4c90600090a350505050565b6119cb600c600486868686611f7e565b6119e75760405162461bcd60e51b8152600401610b2c90612b0a565b600880546001600160a01b0319166001600160a01b038616179055600c6000908152600e6020527f47a2bf86628ea95bf13ae7e8527a13a64f52541d600ba060a013f0b8e72a5e2d805491611a3b83612b4c565b90915550506040516001600160a01b038516815230907fd3a2ddc21d0068be97af44043f929ae8466bfcb5c50963a4fbded974d3aa853290602001610c8d565b611a8b6011600586868686611f7e565b611aa75760405162461bcd60e51b8152600401610b2c90612b0a565b6001600160a01b03841660009081526002602090815260408220805460ff1916600117905560118252600e90527fc0fe3ac15929d25201e62b8c796afb6745bcdd80b8be9470092f43535ba0b48d805491611b0183612b4c565b90915550506040516001600160a01b0385169030907ffec66d4c601d68ac856ebd19aabb9c83e890d509a0dc54ae4210396ad58e60f290600090a350505050565b611b526007600486868686611f7e565b611b6e5760405162461bcd60e51b8152600401610b2c90612b0a565b6007546001600160a01b031615611ba2576007546001600160a01b03166000908152602081905260409020805460ff191690555b600780546001600160a01b0319166001600160a01b0386161781556000908152600e6020527f376529bb8a2d41b4a589a133407fc64f3212472dbd74744348be1098bf7ba08d805491611bf483612b4c565b90915550506001600160a01b038416600081815260208190526040808220805460ff191660011790555130917f27eb5418afdb9bfda78cc5ce86a86a0c30ca6cade46a87d3c0a122957930fc1291a350505050565b6006546001600160a01b03163314611c735760405162461bcd60e51b8152600401610b2c90612b73565b600a54604051631d0c447160e31b81526001600160a01b03868116600483015285811660248301523060448301526064820185905260848201849052600092169063e86223889060a4016020604051808303816000875af1158015611cdc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d009190612be6565b6001600160a01b03818116600081815260036020908152604091829020805460ff1916600117905581518a85168152938916908401529293509130917f4d87bc74f29f4e573cc92cb7618b7895cee1ebafdc9276eb57ac451ab74a112991016118ea565b611d7560106004878787878761227c565b611d915760405162461bcd60e51b8152600401610b2c90612b0a565b60005b8551811015611e2f576000868281518110611db157611db1612ce5565b6020908102919091010151604051636a5115ef60e11b81526001600160a01b0388811660048301529192509082169063d4a22bde90602401600060405180830381600087803b158015611e0357600080fd5b505af1158015611e17573d6000803e3d6000fd5b50505050508080611e2790612b4c565b915050611d94565b5060106000908152600e6020527f33820a7b4c4724aafa212ecdbe06d3782aeae3dbe20fcf670d9acc29d388ea90805491611e6983612b4c565b9190505550306001600160a01b03167f58d58dc2efb2729f8af0e7de4ea2c458977b98f68d84d982aebe02908bf38a288686604051611ea9929190612cfb565b60405180910390a25050505050565b611ec760048086868686611f7e565b611ee35760405162461bcd60e51b8152600401610b2c90612b0a565b6001600160a01b03841660009081526005602090815260408220805460ff1916600117905560048252600e90527fa1d6913cd9e08c872be3e7525cca82e4fc0fc298a783f19022be725b19be685a805491611f3d83612b4c565b90915550506040516001600160a01b0385169030907ffc0a297df75d7d844b951dd3864b6ffa3ce61da20cec71f9c43e94153620190890600090a350505050565b60008251845114611f8e57600080fd5b8151835114611f9c57600080fd5b600284511015611fab57600080fd5b6000845167ffffffffffffffff811115611fc757611fc761256e565b604051908082528060200260200182016040528015611ff0578160200160208202803683370190505b5090506000600d60008a601281111561200b5761200b612b36565b601281111561201c5761201c612b36565b81526020019081526020016000205490506000600e60008b601281111561204557612045612b36565b601281111561205657612056612b36565b815260200190815260200160002054905060005b87518110156121b25773dadca26bc22c8205a15f8c70c7f1d02498d2bd9563bc36f920600c5485858d8d87815181106120a5576120a5612ce5565b60200260200101518d88815181106120bf576120bf612ce5565b60200260200101518d89815181106120d9576120d9612ce5565b60209081029190910101516040516001600160e01b031960e08a901b1681526004810197909752602487019590955260448601939093526001600160a01b03909116606485015260ff16608484015260a483015260c482015260e401602060405180830381865af4158015612152573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121769190612be6565b84828151811061218857612188612ce5565b6001600160a01b0390921660209283029190910190910152806121aa81612b4c565b91505061206a565b506040516364f0651160e11b815273dadca26bc22c8205a15f8c70c7f1d02498d2bd959063c9e0ca22906121ec908c908790600401612d9c565b602060405180830381865af4158015612209573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061222d9190612dbd565b61226c5760405162461bcd60e51b815260206004820152601060248201526f1b585b9859d95c9cc81a5b9d985b1a5960821b6044820152606401610b2c565b5060019998505050505050505050565b6000825184511461228c57600080fd5b815183511461229a57600080fd5b6002845110156122a957600080fd5b6000845167ffffffffffffffff8111156122c5576122c561256e565b6040519080825280602002602001820160405280156122ee578160200160208202803683370190505b5090506000600d60008b601281111561230957612309612b36565b601281111561231a5761231a612b36565b81526020019081526020016000205490506000600e60008c601281111561234357612343612b36565b601281111561235457612354612b36565b815260200190815260200160002054905060005b87518110156124805773dadca26bc22c8205a15f8c70c7f1d02498d2bd95633ecfc6ea600c5485858e8e8e88815181106123a4576123a4612ce5565b60200260200101518e89815181106123be576123be612ce5565b60200260200101518e8a815181106123d8576123d8612ce5565b60200260200101516040518963ffffffff1660e01b8152600401612403989796959493929190612ddf565b602060405180830381865af4158015612420573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124449190612be6565b84828151811061245657612456612ce5565b6001600160a01b03909216602092830291909101909101528061247881612b4c565b915050612368565b506040516364f0651160e11b815273dadca26bc22c8205a15f8c70c7f1d02498d2bd959063c9e0ca22906124ba908d908790600401612d9c565b602060405180830381865af41580156124d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124fb9190612dbd565b61253a5760405162461bcd60e51b815260206004820152601060248201526f1b585b9859d95c9cc81a5b9d985b1a5960821b6044820152606401610b2c565b5060019a9950505050505050505050565b6001600160a01b038116811461256057600080fd5b50565b8035610ed78161254b565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156125ad576125ad61256e565b604052919050565b600067ffffffffffffffff8211156125cf576125cf61256e565b5060051b60200190565b600082601f8301126125ea57600080fd5b813560206125ff6125fa836125b5565b612584565b82815260059290921b8401810191818101908684111561261e57600080fd5b8286015b8481101561264957803560ff8116811461263c5760008081fd5b8352918301918301612622565b509695505050505050565b600082601f83011261266557600080fd5b813560206126756125fa836125b5565b82815260059290921b8401810191818101908684111561269457600080fd5b8286015b848110156126495780358352918301918301612698565b600080600080608085870312156126c557600080fd5b84356126d08161254b565b9350602085013567ffffffffffffffff808211156126ed57600080fd5b6126f9888389016125d9565b9450604087013591508082111561270f57600080fd5b61271b88838901612654565b9350606087013591508082111561273157600080fd5b5061273e87828801612654565b91505092959194509250565b600082601f83011261275b57600080fd5b813567ffffffffffffffff8111156127755761277561256e565b612788601f8201601f1916602001612584565b81815284602083860101111561279d57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000606084860312156127cf57600080fd5b833567ffffffffffffffff8111156127e657600080fd5b6127f28682870161274a565b93505060208401356128038161254b565b929592945050506040919091013590565b6000815180845260005b8181101561283a5760208185018101518683018201520161281e565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061286d6020830184612814565b9392505050565b60006020828403121561288657600080fd5b813561286d8161254b565b6000602082840312156128a357600080fd5b81356013811061286d57600080fd5b600080600080600060a086880312156128ca57600080fd5b853567ffffffffffffffff808211156128e257600080fd5b6128ee89838a0161274a565b965060209150818801356129018161254b565b955060408801356129118161254b565b945060608801356129218161254b565b935060808801358181111561293557600080fd5b88019050601f8101891361294857600080fd5b80356129566125fa826125b5565b81815260059190911b8201830190838101908b83111561297557600080fd5b928401925b828410156129935783358252928401929084019061297a565b80955050505050509295509295909350565b600080600080608085870312156129bb57600080fd5b84356129c68161254b565b935060208501356129d68161254b565b93969395505050506040820135916060013590565b600080600080600060a08688031215612a0357600080fd5b853567ffffffffffffffff80821115612a1b57600080fd5b818801915088601f830112612a2f57600080fd5b81356020612a3f6125fa836125b5565b82815260059290921b8401810191818101908c841115612a5e57600080fd5b948201945b83861015612a85578535612a768161254b565b82529482019490820190612a63565b9950612a9490508a8201612563565b975050506040880135915080821115612aac57600080fd5b612ab889838a016125d9565b94506060880135915080821115612ace57600080fd5b612ada89838a01612654565b93506080880135915080821115612af057600080fd5b50612afd88828901612654565b9150509295509295909350565b602080825260129082015271696e76616c6964207369676e61747572657360701b604082015260600190565b634e487b7160e01b600052602160045260246000fd5b600060018201612b6c57634e487b7160e01b600052601160045260246000fd5b5060010190565b6020808252601e908201527f43616c6c6572206973206e6f7420636f6e7472616374206d616e616765720000604082015260600190565b608081526000612bbd6080830187612814565b6001600160a01b0395861660208401526040830194909452509216606090920191909152919050565b600060208284031215612bf857600080fd5b815161286d8161254b565b604081526000612c166040830185612814565b905060018060a01b03831660208301529392505050565b60c081526000612c4060c0830189612814565b6001600160a01b0388811660208581019190915288821660408601528782166060860152908616608085015283820360a085015284518083528582019282019060005b81811015612c9f57845183529383019391830191600101612c83565b50909b9a5050505050505050505050565b6001600160a01b03848116825283166020820152606060408201819052600090612cdc90830184612814565b95945050505050565b634e487b7160e01b600052603260045260246000fd5b604080825283519082018190526000906020906060840190828701845b82811015612d3d5781516001600160a01b031684529284019290840190600101612d18565b5050506001600160a01b039490941692019190915250919050565b600081518084526020808501945080840160005b83811015612d915781516001600160a01b031687529582019590820190600101612d6c565b509495945050505050565b828152604060208201526000612db56040830184612d58565b949350505050565b600060208284031215612dcf57600080fd5b8151801515811461286d57600080fd5b60006101008a8352896020840152886040840152806060840152612e0581840189612d58565b6001600160a01b03979097166080840152505060ff9390931660a084015260c083019190915260e09091015294935050505056fea2646970667358221220ec6e7ec5c5a4d6b57125310ddfaf3c3055e56479b846bf19f8223631f4cfc58d64736f6c63430008100033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000004000000000000000000000000505cbf743e97abc4e6d41397a8b7c3c0de7490510000000000000000000000005b8db39dbaa4ccfada8b66e136a2d780717c5bdf0000000000000000000000001cb22e0599d6689a29e33ba1a7c95f216dd955ff0000000000000000000000004579e8ad5330ede662202725fc2c7d5b4c80e7db00000000000000000000000000000000000000000000000000000000000000040000000000000000000000008a1ce05249fb67cddec08e10b8173fe07080cc4b0000000000000000000000000e407979a4870e8b266ed8d63b5cab9f71b8ce1700000000000000000000000022703d216c7942455987b23c349cf9a2c402e5d100000000000000000000000097b7d09d5af7af8232079cd04d2519e44192b3da","name":"Management","is_blueprint":false,"license_type":"none","is_fully_verified":false,"is_verified_via_eth_bytecode_db":true,"language":"solidity","evm_version":"london","can_be_visualized_via_sol2uml":true,"is_verified_via_sourcify":true,"additional_sources":[{"file_path":"contracts/interfaces/IManagement.sol","source_code":"// SPDX-License-Identifier: GPL-3.0\r\npragma solidity 0.8.16;\r\n\r\ninterface IManagement {\r\n    \r\n    function platformFeeAddress() external view returns (address);\r\n\r\n    function isContractManager(address manager) external view returns (bool);\r\n\r\n    function isWhiteInvestor(address investor) external view returns (bool);\r\n\r\n    function isRestrictInvestor(address investor) external view returns (bool);\r\n\r\n    function isWhiteContract(address contractAddress) external view returns (bool);\r\n    \r\n    function isBlockInvestor(address investor) external view returns (bool);\r\n\r\n    \r\n}\r\n"},{"file_path":"contracts/interfaces/IPairFactory.sol","source_code":"// SPDX-License-Identifier: GPL-3.0\r\npragma solidity 0.8.16;\r\n\r\ninterface IPairFactory {\r\n\r\n    function createAMMPair(\r\n        string memory name,\r\n        address issuer,\r\n        address tokenA,\r\n        address tokenB,\r\n        address management,\r\n        uint[] memory params\r\n    ) external returns(address);\r\n\r\n    function createOTCPair(\r\n        address tokenA,\r\n        address tokenB,\r\n        address management,\r\n        uint maxOrderAmount,\r\n        uint platformFeeRate\r\n    ) external returns(address);\r\n\r\n    function createP2PPair(\r\n        address tokenA,\r\n        address tokenB,\r\n        address management,\r\n        uint maxOrderAmount,\r\n        uint platformFeeRate\r\n    ) external returns(address);\r\n\r\n    function createSecurityToken(\r\n        string memory _name, \r\n        address issuer,\r\n        uint amount,\r\n        address management\r\n    ) external returns(address);\r\n\r\n    function setManagement(address _management) external;\r\n\r\n}\r\n"},{"file_path":"contracts/libraries/LManagement.sol","source_code":"// SPDX-License-Identifier: GPL-3.0\r\n\r\npragma solidity 0.8.16;\r\n\r\nlibrary LManagement {\r\n    \r\n    function distinctOwners(\r\n        mapping(address => bool) storage self,\r\n        address[] memory addrs\r\n    ) external view returns (bool) {\r\n        for (uint i = 0; i < addrs.length; i++) {\r\n            if (!self[addrs[i]]) {\r\n                return false;\r\n            }\r\n            for (uint j = 0; j < i; j++) {\r\n                if (addrs[i] == addrs[j]) {\r\n                    return false;\r\n                }\r\n            }\r\n        }\r\n        return true;\r\n    }\r\n\r\n    function getSigAddress (\r\n        bytes32  DOMAIN_SEPARATOR,\r\n        bytes32  TYPEHASH,\r\n        uint nonce,\r\n        address investor,\r\n        uint8 v, \r\n        bytes32  r, \r\n        bytes32  s\r\n    ) external pure  returns(address){\r\n        bytes32 digest = keccak256(\r\n            abi.encodePacked(\r\n                '\\x19\\x01',\r\n                DOMAIN_SEPARATOR,\r\n                keccak256(abi.encode(TYPEHASH, investor, nonce))\r\n            )\r\n        );\r\n\r\n        address recoveredAddress = ecrecover(digest, v, r, s);\r\n        return recoveredAddress;\r\n    }\r\n\r\n    function getSigManagementAddress (\r\n        bytes32  DOMAIN_SEPARATOR,\r\n        bytes32  TYPEHASH,\r\n        uint nonce,\r\n        address[] memory pairs,\r\n        address newManagement,\r\n        uint8 v, \r\n        bytes32  r, \r\n        bytes32  s\r\n    ) external pure  returns(address){\r\n        bytes32 digest = keccak256(\r\n            abi.encodePacked(\r\n                '\\x19\\x01',\r\n                DOMAIN_SEPARATOR,\r\n                keccak256(abi.encode(TYPEHASH, pairs,newManagement, nonce))\r\n            )\r\n        );\r\n\r\n        address recoveredAddress = ecrecover(digest, v, r, s);\r\n        return recoveredAddress;\r\n    }\r\n\r\n}\r\n"}],"certified":false,"conflicting_implementations":null,"abi":[{"inputs":[{"internalType":"address[]","name":"_admins","type":"address[]"},{"internalType":"address[]","name":"_factories","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"addr","type":"address"}],"name":"AddAdminEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"addr","type":"address"}],"name":"AddBlocklistEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"addr","type":"address"}],"name":"AddManagerEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"addr","type":"address"}],"name":"AddRestrictlistEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"addr","type":"address"}],"name":"AddWhiteContractEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"addr","type":"address"}],"name":"AddWhitelistEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"address","name":"tokenA","type":"address"},{"indexed":false,"internalType":"address","name":"tokenB","type":"address"},{"indexed":false,"internalType":"string","name":"_name","type":"string"}],"name":"CreateAMMEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"address","name":"tokenA","type":"address"},{"indexed":false,"internalType":"address","name":"tokenB","type":"address"}],"name":"CreateOTCEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"address","name":"tokenA","type":"address"},{"indexed":false,"internalType":"address","name":"tokenB","type":"address"}],"name":"CreateP2PEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"address","name":"issuer","type":"address"}],"name":"CreateSTEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"addr","type":"address"}],"name":"RemoveAdminEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"addr","type":"address"}],"name":"RemoveBlocklistEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"addr","type":"address"}],"name":"RemoveManagerEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"addr","type":"address"}],"name":"RemoveRestrictlistEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"addr","type":"address"}],"name":"RemoveWhiteContractEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"addr","type":"address"}],"name":"RemoveWhitelistEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"_ammFactory","type":"address"}],"name":"SetAmmFactoryEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"addr","type":"address"}],"name":"SetContractManagerEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"addr","type":"address"}],"name":"SetFeeAddressEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address[]","name":"pairs","type":"address[]"},{"indexed":false,"internalType":"address","name":"newManagement","type":"address"}],"name":"SetManagementEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"_otcFactory","type":"address"}],"name":"SetOTCFactoryEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"_p2pFactory","type":"address"}],"name":"SetP2PFactoryEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"_securityTokenFactory","type":"address"}],"name":"SetSTFactoryEvent","type":"event"},{"inputs":[],"name":"AddAdmin_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"AddBlocklist_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"AddManager_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"AddRestrictlist_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"AddWhiteContract_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"AddWhitelist_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RemoveAdmin_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RemoveBlocklist_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RemoveManager_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RemoveRestrictlist_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RemoveWhiteContract_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RemoveWhitelist_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SetAmmFactory_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SetContractManager_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SetFeeAddress_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SetManagement_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SetOTCFactory_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SetP2PFactory_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SetSecurityTokenFactory_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"},{"internalType":"uint8[]","name":"vs","type":"uint8[]"},{"internalType":"bytes32[]","name":"rs","type":"bytes32[]"},{"internalType":"bytes32[]","name":"ss","type":"bytes32[]"}],"name":"addAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"investor","type":"address"},{"internalType":"uint8[]","name":"vs","type":"uint8[]"},{"internalType":"bytes32[]","name":"rs","type":"bytes32[]"},{"internalType":"bytes32[]","name":"ss","type":"bytes32[]"}],"name":"addBlocklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"},{"internalType":"uint8[]","name":"vs","type":"uint8[]"},{"internalType":"bytes32[]","name":"rs","type":"bytes32[]"},{"internalType":"bytes32[]","name":"ss","type":"bytes32[]"}],"name":"addManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"investor","type":"address"},{"internalType":"uint8[]","name":"vs","type":"uint8[]"},{"internalType":"bytes32[]","name":"rs","type":"bytes32[]"},{"internalType":"bytes32[]","name":"ss","type":"bytes32[]"}],"name":"addRestrictlist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint8[]","name":"vs","type":"uint8[]"},{"internalType":"bytes32[]","name":"rs","type":"bytes32[]"},{"internalType":"bytes32[]","name":"ss","type":"bytes32[]"}],"name":"addWhiteContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"investor","type":"address"},{"internalType":"uint8[]","name":"vs","type":"uint8[]"},{"internalType":"bytes32[]","name":"rs","type":"bytes32[]"},{"internalType":"bytes32[]","name":"ss","type":"bytes32[]"}],"name":"addWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"administers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ammFactory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"blockList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"contractList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"address","name":"issuer","type":"address"},{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256[]","name":"params","type":"uint256[]"}],"name":"createAMMPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"maxOrderAmount","type":"uint256"},{"internalType":"uint256","name":"platformFeeRate","type":"uint256"}],"name":"createOTCPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"maxOrderAmount","type":"uint256"},{"internalType":"uint256","name":"platformFeeRate","type":"uint256"}],"name":"createP2PPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"stName","type":"string"},{"internalType":"address","name":"issuer","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"createSecurityToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"investor","type":"address"}],"name":"isBlockInvestor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"}],"name":"isContractManager","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"investor","type":"address"}],"name":"isRestrictInvestor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"isWhiteContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"investor","type":"address"}],"name":"isWhiteInvestor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"managers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum Management.SigTypeEnum","name":"","type":"uint8"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"otcFactory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"p2pFactory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"platformFeeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"},{"internalType":"uint8[]","name":"vs","type":"uint8[]"},{"internalType":"bytes32[]","name":"rs","type":"bytes32[]"},{"internalType":"bytes32[]","name":"ss","type":"bytes32[]"}],"name":"removeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"investor","type":"address"},{"internalType":"uint8[]","name":"vs","type":"uint8[]"},{"internalType":"bytes32[]","name":"rs","type":"bytes32[]"},{"internalType":"bytes32[]","name":"ss","type":"bytes32[]"}],"name":"removeBlocklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"},{"internalType":"uint8[]","name":"vs","type":"uint8[]"},{"internalType":"bytes32[]","name":"rs","type":"bytes32[]"},{"internalType":"bytes32[]","name":"ss","type":"bytes32[]"}],"name":"removeManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"investor","type":"address"},{"internalType":"uint8[]","name":"vs","type":"uint8[]"},{"internalType":"bytes32[]","name":"rs","type":"bytes32[]"},{"internalType":"bytes32[]","name":"ss","type":"bytes32[]"}],"name":"removeRestrictlist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint8[]","name":"vs","type":"uint8[]"},{"internalType":"bytes32[]","name":"rs","type":"bytes32[]"},{"internalType":"bytes32[]","name":"ss","type":"bytes32[]"}],"name":"removeWhiteContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"investor","type":"address"},{"internalType":"uint8[]","name":"vs","type":"uint8[]"},{"internalType":"bytes32[]","name":"rs","type":"bytes32[]"},{"internalType":"bytes32[]","name":"ss","type":"bytes32[]"}],"name":"removeWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"restrictList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"securityTokenFactory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_ammFactoryAddress","type":"address"},{"internalType":"uint8[]","name":"vs","type":"uint8[]"},{"internalType":"bytes32[]","name":"rs","type":"bytes32[]"},{"internalType":"bytes32[]","name":"ss","type":"bytes32[]"}],"name":"setAmmFactory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"},{"internalType":"uint8[]","name":"vs","type":"uint8[]"},{"internalType":"bytes32[]","name":"rs","type":"bytes32[]"},{"internalType":"bytes32[]","name":"ss","type":"bytes32[]"}],"name":"setContractManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_platformFeeAddress","type":"address"},{"internalType":"uint8[]","name":"vs","type":"uint8[]"},{"internalType":"bytes32[]","name":"rs","type":"bytes32[]"},{"internalType":"bytes32[]","name":"ss","type":"bytes32[]"}],"name":"setFeeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"pairs","type":"address[]"},{"internalType":"address","name":"newManagement","type":"address"},{"internalType":"uint8[]","name":"vs","type":"uint8[]"},{"internalType":"bytes32[]","name":"rs","type":"bytes32[]"},{"internalType":"bytes32[]","name":"ss","type":"bytes32[]"}],"name":"setManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_otcFactoryAddress","type":"address"},{"internalType":"uint8[]","name":"vs","type":"uint8[]"},{"internalType":"bytes32[]","name":"rs","type":"bytes32[]"},{"internalType":"bytes32[]","name":"ss","type":"bytes32[]"}],"name":"setOTCFactory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_p2pFactoryAddress","type":"address"},{"internalType":"uint8[]","name":"vs","type":"uint8[]"},{"internalType":"bytes32[]","name":"rs","type":"bytes32[]"},{"internalType":"bytes32[]","name":"ss","type":"bytes32[]"}],"name":"setP2PFactory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_securityTokenFactoryAddress","type":"address"},{"internalType":"uint8[]","name":"vs","type":"uint8[]"},{"internalType":"bytes32[]","name":"rs","type":"bytes32[]"},{"internalType":"bytes32[]","name":"ss","type":"bytes32[]"}],"name":"setSecurityTokenFactory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whiteList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"is_changed_bytecode":false,"is_partially_verified":true,"constructor_args":"000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000004000000000000000000000000505cbf743e97abc4e6d41397a8b7c3c0de7490510000000000000000000000005b8db39dbaa4ccfada8b66e136a2d780717c5bdf0000000000000000000000001cb22e0599d6689a29e33ba1a7c95f216dd955ff0000000000000000000000004579e8ad5330ede662202725fc2c7d5b4c80e7db00000000000000000000000000000000000000000000000000000000000000040000000000000000000000008a1ce05249fb67cddec08e10b8173fe07080cc4b0000000000000000000000000e407979a4870e8b266ed8d63b5cab9f71b8ce1700000000000000000000000022703d216c7942455987b23c349cf9a2c402e5d100000000000000000000000097b7d09d5af7af8232079cd04d2519e44192b3da"}