Cryo Explorer Ethereum Mainnet

Address Contract Partially Verified

Address 0x96ABd1C04882BCe372203d43649be525F8AE87ba
Balance 0 ETH
Nonce 1
Code Size 11887 bytes
Indexed Transactions 0
External Etherscan · Sourcify

Contract Bytecode

11887 bytes
0x608060405234801561001057600080fd5b50600436106103ba5760003560e01c806373daf71f116101f4578063caa4068d1161011a578063e1edc870116100ad578063f006380a1161007c578063f006380a14610a90578063f8ae2fb114610aa3578063fdff9b4d14610ab6578063ffa4cc4714610ad957600080fd5b8063e1edc87014610a30578063e2bbcb2514610a43578063e98bd25e14610a56578063ed14834f14610a7d57600080fd5b8063d4739a2c116100e9578063d4739a2c146109cb578063dacda92f146109de578063dc7e571b146109f1578063e184f6cb14610a0457600080fd5b8063caa4068d1461097f578063cc27f64b14610992578063d1bf9f8e146109a5578063d43ed3d1146109b857600080fd5b8063a3ad630211610192578063b539928311610161578063b5399283146108f6578063c034a9db14610919578063c55fb4901461092c578063ca14d1bb1461095357600080fd5b8063a3ad630214610869578063af4dcc6414610890578063b09c4d3d146108b7578063b39e12cf146108e357600080fd5b80638dd27f65116101ce5780638dd27f651461080957806395e97650146108305780639e06490914610843578063a12cf8261461085657600080fd5b806373daf71f146107945780638940d35c146107bb5780638d0f120f146107e257600080fd5b8063372c12b1116102e45780635520d02c116102775780635bdedefe116102465780635bdedefe146107205780635cea0fc2146107475780636964584a1461076e578063698480891461078157600080fd5b80635520d02c146106c057806356ef3098146106d357806359cc389d146106fa5780635b3113ef1461070d57600080fd5b80634b4c7617116102b35780634b4c76171461062f5780634cf05e97146106525780635035bda21461067957806353cb405d1461069957600080fd5b8063372c12b1146105bf5780633c964777146105e25780633f9fdb22146105f5578063423463571461060857600080fd5b8063126013ed1161035c5780632e4f4d671161032b5780632e4f4d67146105555780632e5ae0d11461057c578063306abccf146105a35780633644e515146105b657600080fd5b8063126013ed146104bb57806316f2c85a146104f05780631d42e9af1461051b578063240f46fb1461054257600080fd5b806306fdde031161039857806306fdde03146103fa5780630be5967b146104395780630cce67581461046c578063106328d41461049857600080fd5b8063033954c3146103bf57806304b3c21c146103d4578063050c8e2b146103e7575b600080fd5b6103d26103cd3660046126af565b610b00565b005b6103d26103e23660046126af565b610bd0565b6103d26103f53660046127ba565b610c9b565b6104236040518060400160405280600a81526020016913585b9859d95b595b9d60b21b81525081565b604051610430919061285a565b60405180910390f35b61045c610447366004612874565b60036020526000908152604090205460ff1681565b6040519015158152602001610430565b61045c61047a366004612874565b6001600160a01b031660009081526020819052604090205460ff1690565b61045c6104a6366004612874565b60046020526000908152604090205460ff1681565b6104e27fcf8112dd5614e0034cc93ebdb4f9f2022169d42d53deb26955289b3166922bd681565b604051908152602001610430565b600b54610503906001600160a01b031681565b6040516001600160a01b039091168152602001610430565b6104e27fbf8bfccdd4104913963fd44789a30b476f07bb27996c4e09368cd28b0ad312f081565b6103d26105503660046126af565b610da8565b6104e27fb5f4b13180b35446f001da8d7a0d31d20f8ec9923e348cc5febdad1de8b247a681565b6104e27f359c99fc0cb49cd48a2b30e841fa0eb69dd24d1a27568d10de6bbf66a2b682ca81565b61045c6105b1366004612874565b610eae565b6104e2600c5481565b61045c6105cd366004612874565b60006020819052908152604090205460ff1681565b600954610503906001600160a01b031681565b6103d26106033660046126af565b610edc565b6104e27f64c10c1478cf7c3721d359e2f78dfa299c48914c2b6eee9faf35f8508efaeb6681565b61045c61063d366004612874565b60016020526000908152604090205460ff1681565b6104e27f9cc9d087aba7064e2e525ccec3dcf261b9e6580c2ceefdf3a7ac50a56474f34481565b6104e2610687366004612891565b600e6020526000908152604090205481565b6104e27f907bf65e4c55c6e6b92c6b773f9d37c37ecac28d90231a91f35473e6400203d081565b6103d26106ce3660046126af565b610fa0565b6104e27fd33bb19e110fdd3dde0f5adcf90869ca157d2bda52f50a3f08594dcbeedb526081565b6103d26107083660046126af565b611060565b6103d261071b3660046126af565b611120565b6104e27f7720a4a484039e81f3c0e5fb52777da87964d87481af2590bb33051987c3978d81565b6104e27f1c12de27ba3f67de1dcc525f385b6a129320bf3a5498f39609f3162fdff1217481565b6103d261077c3660046126af565b6111df565b6103d261078f3660046126af565b6112a3565b6104e27f1be7eca310a863b2bb7cd7bec55909338bc6875ad0756ac9ddfa750c868aa17681565b6104e27f5ec50e1700093b09774f85c99fe10b2181ff7ebf6137116fee769be0f81fa80581565b6104e27f3d89d6d5d11eb76b63c2c6f18dfb34b3af7acc2d703db73c28069a378ff7aec281565b6104e27f163ef0b23224e585a532cb21be056017dc5e24df899e899050f87fb0d9d0e6af81565b6103d261083e3660046126af565b611367565b6103d26108513660046126af565b611471565b6103d26108643660046126af565b611535565b6104e27f67e02dd9101cb5ec4ba888b64cf2c887af2342ac87015f0d3964de766f752ba381565b6104e27f3dcf3f15c74bb4d23ab46e4d6ad7cb01451ac366ec11b9471bc09f7db736ad9a81565b61045c6108c5366004612874565b6001600160a01b031660009081526001602052604090205460ff1690565b600654610503906001600160a01b031681565b61045c610904366004612874565b60026020526000908152604090205460ff1681565b6103d26109273660046126af565b6115f8565b6104e27f998c128fd52190b99cc267054dba040f747bb1889483c451e6e62ecec6f6d83681565b61045c610961366004612874565b6001600160a01b031660009081526003602052604090205460ff1690565b6103d261098d3660046128b2565b6116bf565b6103d26109a03660046129a5565b6117d3565b6103d26109b33660046126af565b6118f9565b6103d26109c63660046126af565b6119bb565b6103d26109d93660046126af565b611a7b565b600854610503906001600160a01b031681565b600a54610503906001600160a01b031681565b61045c610a12366004612874565b6001600160a01b031660009081526002602052604090205460ff1690565b6103d2610a3e3660046126af565b611b42565b6103d2610a513660046129a5565b611c49565b6104e27fbae36f97ece7ff6d06ff73064049b6deade63e84a39445ca59a9f59d7b0e9d3781565b600754610503906001600160a01b031681565b6103d2610a9e3660046129eb565b611d64565b6103d2610ab13660046126af565b611eb8565b61045c610ac4366004612874565b60056020526000908152604090205460ff1681565b6104e27f82a5ca036b13d3a4d2434003f390437bc3cca474cb0105d5d00dc876270e886c81565b610b106008600486868686611f7e565b610b355760405162461bcd60e51b8152600401610b2c90612b0a565b60405180910390fd5b6001600160a01b03841660009081526003602090815260408220805460ff1916600117905560088252600e90527feab6bc3746954d8a0719de62c86ea908d362be2a58c781ada1046727253f9df2805491610b8f83612b4c565b90915550506040516001600160a01b0385169030907fb8d544f22db6826f41ccad080d88c0903ddbc51bbade47af333ac7a347135fe790600090a350505050565b610be0600e600486868686611f7e565b610bfc5760405162461bcd60e51b8152600401610b2c90612b0a565b600a80546001600160a01b0319166001600160a01b038616179055600e60008181526020919091527fa6897c210c76a29b3d6bf757063b10a3faa77fe0657de0ee282493e99a18ed50805491610c5183612b4c565b90915550506040516001600160a01b038516815230907f8b06a4b08bf6a0ee94541ad92cf0a0cf311a35d22559a6069e9931685dcee877906020015b60405180910390a250505050565b6006546001600160a01b03163314610cc55760405162461bcd60e51b8152600401610b2c90612b73565b600b54604051632721925360e01b81526000916001600160a01b031690632721925390610cfc908790879087903090600401612baa565b6020604051808303816000875af1158015610d1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d3f9190612be6565b6001600160a01b03811660008181526003602052604090819020805460ff19166001179055519192509030907f7724ec8a5918b5c722fc260a04944c5b91218f0b7ede8d6ea6d032a3e0bf259590610d9a9088908890612c03565b60405180910390a350505050565b610db86000600586868686611f7e565b610dd45760405162461bcd60e51b8152600401610b2c90612b0a565b6001600160a01b03841660009081526001602052604090205460ff1615610e16576001600160a01b0384166000908152600160205260409020805460ff191690555b6001600160a01b0384166000908152602081815260408220805460ff19166001179055818052600e90527fe710864318d4a32f37d6ce54cb3fadbef648dd12d8dbdf53973564d56b7f881c805491610e6d83612b4c565b90915550506040516001600160a01b0385169030907f36365224c888719109af22166d40ff256374b38e9b78a8ee1b039e323b40853390600090a350505050565b6006546000906001600160a01b0390811690831603610ecf57506001919050565b506000919050565b919050565b610eec6012600586868686611f7e565b610f085760405162461bcd60e51b8152600401610b2c90612b0a565b6001600160a01b03841660009081526002602090815260408220805460ff1916905560128252600e90527f3757bb026b72bf4f9cbbbf8f2bafe0ea3d356ae6d8f07ef005aafb99b4cbde40805491610f5f83612b4c565b90915550506040516001600160a01b0385169030907f51c355c400f08b9cae030e4af5347d5f6686e5791e8dbfeb869fc3979c93707690600090a350505050565b610fb0600d600486868686611f7e565b610fcc5760405162461bcd60e51b8152600401610b2c90612b0a565b600980546001600160a01b0319166001600160a01b038616179055600d6000908152600e6020527f9d0231707eb2041153c28e130d22114ee38b252cf17233585036af02278e418180549161102083612b4c565b90915550506040516001600160a01b038516815230907f1c6e5a1e337b8c0056b48ad17b791287c5d9bdf1feb0f75a9f9899acb41acc1490602001610c8d565b611070600f600486868686611f7e565b61108c5760405162461bcd60e51b8152600401610b2c90612b0a565b600b80546001600160a01b0319166001600160a01b038616179055600f6000908152600e6020527f60dd7f0393e3d3987afafbb50883ff45658a7a0c2d4460aa7a872d45c2ea23528054916110e083612b4c565b90915550506040516001600160a01b038516815230907f8ae5d58e62e6170190a58e22b659d9b8119ee908fd43d7caaab82b3e9798960090602001610c8d565b6111306006600486868686611f7e565b61114c5760405162461bcd60e51b8152600401610b2c90612b0a565b600680546001600160a01b0319166001600160a01b0386161781556000908152600e6020527f92b4482321f41ce3aa65f798bda23d0d12a60fc5f212868a548ddb00aa49de7280549161119e83612b4c565b90915550506040516001600160a01b0385169030907f51789e28956e8f4cc5dc421a2fb6ecd7f8156b0ed4d589fdb79d63a6a84b16ae90600090a350505050565b6111ef6003600586868686611f7e565b61120b5760405162461bcd60e51b8152600401610b2c90612b0a565b6001600160a01b03841660009081526001602090815260408220805460ff1916905560038252600e90527fe0283e559c29e31ee7f56467acc9dd307779c843a883aeeb3bf5c6128c90814480549161126283612b4c565b90915550506040516001600160a01b0385169030907f72ec32f01f8006acef23c8f74ca78c02652911dd15004c19e6215554218e157b90600090a350505050565b6112b3600b600486868686611f7e565b6112cf5760405162461bcd60e51b8152600401610b2c90612b0a565b6001600160a01b03841660009081526004602090815260408220805460ff19169055600b8252600e90527f7528327bfca11f705552fba9c3966003c5a3e73459dc289e7c8420997d319bee80549161132683612b4c565b90915550506040516001600160a01b0385169030907f63ffd1dcf28079a04044401d17bee4f2d68170c9203a2e06cfa2fba45ea17f9790600090a350505050565b6113776002600586868686611f7e565b6113935760405162461bcd60e51b8152600401610b2c90612b0a565b6001600160a01b03841660009081526020819052604090205460ff16156113d5576001600160a01b0384166000908152602081905260409020805460ff191690555b6001600160a01b03841660009081526001602081815260408320805460ff191690921790915560028252600e90527f9adb202b1492743bc00c81d33cdc6423fa8c79109027eb6a845391e8fc1f048180549161143083612b4c565b90915550506040516001600160a01b0385169030907f27ab3985e12c964143a42679213b782b531b9b79c0f81daf480b00e0e7499b1d90600090a350505050565b6114816009600486868686611f7e565b61149d5760405162461bcd60e51b8152600401610b2c90612b0a565b6001600160a01b03841660009081526003602090815260408220805460ff1916905560098252600e90527f0d5ccdc17421fca5ca768ae29a27b8b2aa886c9e56e3482f9ba55d79d3a806648054916114f483612b4c565b90915550506040516001600160a01b0385169030907fd7c4423629063c6074c6a5d149c6a591cd8a007c519a7af660ef58f3fe7d0f5390600090a350505050565b6115456005600486868686611f7e565b6115615760405162461bcd60e51b8152600401610b2c90612b0a565b6001600160a01b03841660009081526005602081815260408320805460ff19169055908252600e90527fb9bec7e2561f624fe753ff070f1599b306cbf59fafd4e8d5a8184a1ea1841bce8054916115b783612b4c565b90915550506040516001600160a01b0385169030907f3ef83d92340abc2f29fceb213d593e6348f0bafc7161b6b53c65ebff3e207fbf90600090a350505050565b611608600a600486868686611f7e565b6116245760405162461bcd60e51b8152600401610b2c90612b0a565b6001600160a01b03841660009081526004602090815260408220805460ff19166001179055600a8252600e90527f0978afefdfd541f3bdffe34b0f19bc4ce1d7b3554d278a75e04686adf3223b3980549161167e83612b4c565b90915550506040516001600160a01b0385169030907f224c2f3a0794342c616e2e1c9fdfac78b745825dd090fb47bd157a9287b24efc90600090a350505050565b6006546001600160a01b031633146116e95760405162461bcd60e51b8152600401610b2c90612b73565b6008546040516224c24160ea1b81526000916001600160a01b03169063930904009061172390899089908990899030908a90600401612c2d565b6020604051808303816000875af1158015611742573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117669190612be6565b6001600160a01b03811660008181526003602052604090819020805460ff19166001179055519192509030907f1b3869418862c46f7d5b4ba916b9e2a24a1b83d01db2feb799912428152facf2906117c390889088908c90612cb0565b60405180910390a3505050505050565b6006546001600160a01b031633146117fd5760405162461bcd60e51b8152600401610b2c90612b73565b60095460405163104334d160e01b81526001600160a01b03868116600483015285811660248301523060448301526064820185905260848201849052600092169063104334d19060a4016020604051808303816000875af1158015611866573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061188a9190612be6565b6001600160a01b03818116600081815260036020908152604091829020805460ff1916600117905581518a85168152938916908401529293509130917f0aeb859c0349af9b3a68b63bb2824ff4289cee5e3ac698c2bd156f94e6bff9c491015b60405180910390a35050505050565b6119096001600586868686611f7e565b6119255760405162461bcd60e51b8152600401610b2c90612b0a565b6001600160a01b0384166000908152602081815260408220805460ff1916905560018252600e90527fa7c5ba7114a813b50159add3a36832908dc83db71d0b9a24c2ad0f83be95820780549161197a83612b4c565b90915550506040516001600160a01b0385169030907fda9880e47f4bc6a0582bc0e57898ebe7724b5d2bb7041c2729cf405f8de1bc4c90600090a350505050565b6119cb600c600486868686611f7e565b6119e75760405162461bcd60e51b8152600401610b2c90612b0a565b600880546001600160a01b0319166001600160a01b038616179055600c6000908152600e6020527f47a2bf86628ea95bf13ae7e8527a13a64f52541d600ba060a013f0b8e72a5e2d805491611a3b83612b4c565b90915550506040516001600160a01b038516815230907fd3a2ddc21d0068be97af44043f929ae8466bfcb5c50963a4fbded974d3aa853290602001610c8d565b611a8b6011600586868686611f7e565b611aa75760405162461bcd60e51b8152600401610b2c90612b0a565b6001600160a01b03841660009081526002602090815260408220805460ff1916600117905560118252600e90527fc0fe3ac15929d25201e62b8c796afb6745bcdd80b8be9470092f43535ba0b48d805491611b0183612b4c565b90915550506040516001600160a01b0385169030907ffec66d4c601d68ac856ebd19aabb9c83e890d509a0dc54ae4210396ad58e60f290600090a350505050565b611b526007600486868686611f7e565b611b6e5760405162461bcd60e51b8152600401610b2c90612b0a565b6007546001600160a01b031615611ba2576007546001600160a01b03166000908152602081905260409020805460ff191690555b600780546001600160a01b0319166001600160a01b0386161781556000908152600e6020527f376529bb8a2d41b4a589a133407fc64f3212472dbd74744348be1098bf7ba08d805491611bf483612b4c565b90915550506001600160a01b038416600081815260208190526040808220805460ff191660011790555130917f27eb5418afdb9bfda78cc5ce86a86a0c30ca6cade46a87d3c0a122957930fc1291a350505050565b6006546001600160a01b03163314611c735760405162461bcd60e51b8152600401610b2c90612b73565b600a54604051631d0c447160e31b81526001600160a01b03868116600483015285811660248301523060448301526064820185905260848201849052600092169063e86223889060a4016020604051808303816000875af1158015611cdc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d009190612be6565b6001600160a01b03818116600081815260036020908152604091829020805460ff1916600117905581518a85168152938916908401529293509130917f4d87bc74f29f4e573cc92cb7618b7895cee1ebafdc9276eb57ac451ab74a112991016118ea565b611d7560106004878787878761227c565b611d915760405162461bcd60e51b8152600401610b2c90612b0a565b60005b8551811015611e2f576000868281518110611db157611db1612ce5565b6020908102919091010151604051636a5115ef60e11b81526001600160a01b0388811660048301529192509082169063d4a22bde90602401600060405180830381600087803b158015611e0357600080fd5b505af1158015611e17573d6000803e3d6000fd5b50505050508080611e2790612b4c565b915050611d94565b5060106000908152600e6020527f33820a7b4c4724aafa212ecdbe06d3782aeae3dbe20fcf670d9acc29d388ea90805491611e6983612b4c565b9190505550306001600160a01b03167f58d58dc2efb2729f8af0e7de4ea2c458977b98f68d84d982aebe02908bf38a288686604051611ea9929190612cfb565b60405180910390a25050505050565b611ec760048086868686611f7e565b611ee35760405162461bcd60e51b8152600401610b2c90612b0a565b6001600160a01b03841660009081526005602090815260408220805460ff1916600117905560048252600e90527fa1d6913cd9e08c872be3e7525cca82e4fc0fc298a783f19022be725b19be685a805491611f3d83612b4c565b90915550506040516001600160a01b0385169030907ffc0a297df75d7d844b951dd3864b6ffa3ce61da20cec71f9c43e94153620190890600090a350505050565b60008251845114611f8e57600080fd5b8151835114611f9c57600080fd5b600284511015611fab57600080fd5b6000845167ffffffffffffffff811115611fc757611fc761256e565b604051908082528060200260200182016040528015611ff0578160200160208202803683370190505b5090506000600d60008a601281111561200b5761200b612b36565b601281111561201c5761201c612b36565b81526020019081526020016000205490506000600e60008b601281111561204557612045612b36565b601281111561205657612056612b36565b815260200190815260200160002054905060005b87518110156121b25773dadca26bc22c8205a15f8c70c7f1d02498d2bd9563bc36f920600c5485858d8d87815181106120a5576120a5612ce5565b60200260200101518d88815181106120bf576120bf612ce5565b60200260200101518d89815181106120d9576120d9612ce5565b60209081029190910101516040516001600160e01b031960e08a901b1681526004810197909752602487019590955260448601939093526001600160a01b03909116606485015260ff16608484015260a483015260c482015260e401602060405180830381865af4158015612152573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121769190612be6565b84828151811061218857612188612ce5565b6001600160a01b0390921660209283029190910190910152806121aa81612b4c565b91505061206a565b506040516364f0651160e11b815273dadca26bc22c8205a15f8c70c7f1d02498d2bd959063c9e0ca22906121ec908c908790600401612d9c565b602060405180830381865af4158015612209573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061222d9190612dbd565b61226c5760405162461bcd60e51b815260206004820152601060248201526f1b585b9859d95c9cc81a5b9d985b1a5960821b6044820152606401610b2c565b5060019998505050505050505050565b6000825184511461228c57600080fd5b815183511461229a57600080fd5b6002845110156122a957600080fd5b6000845167ffffffffffffffff8111156122c5576122c561256e565b6040519080825280602002602001820160405280156122ee578160200160208202803683370190505b5090506000600d60008b601281111561230957612309612b36565b601281111561231a5761231a612b36565b81526020019081526020016000205490506000600e60008c601281111561234357612343612b36565b601281111561235457612354612b36565b815260200190815260200160002054905060005b87518110156124805773dadca26bc22c8205a15f8c70c7f1d02498d2bd95633ecfc6ea600c5485858e8e8e88815181106123a4576123a4612ce5565b60200260200101518e89815181106123be576123be612ce5565b60200260200101518e8a815181106123d8576123d8612ce5565b60200260200101516040518963ffffffff1660e01b8152600401612403989796959493929190612ddf565b602060405180830381865af4158015612420573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124449190612be6565b84828151811061245657612456612ce5565b6001600160a01b03909216602092830291909101909101528061247881612b4c565b915050612368565b506040516364f0651160e11b815273dadca26bc22c8205a15f8c70c7f1d02498d2bd959063c9e0ca22906124ba908d908790600401612d9c565b602060405180830381865af41580156124d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124fb9190612dbd565b61253a5760405162461bcd60e51b815260206004820152601060248201526f1b585b9859d95c9cc81a5b9d985b1a5960821b6044820152606401610b2c565b5060019a9950505050505050505050565b6001600160a01b038116811461256057600080fd5b50565b8035610ed78161254b565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156125ad576125ad61256e565b604052919050565b600067ffffffffffffffff8211156125cf576125cf61256e565b5060051b60200190565b600082601f8301126125ea57600080fd5b813560206125ff6125fa836125b5565b612584565b82815260059290921b8401810191818101908684111561261e57600080fd5b8286015b8481101561264957803560ff8116811461263c5760008081fd5b8352918301918301612622565b509695505050505050565b600082601f83011261266557600080fd5b813560206126756125fa836125b5565b82815260059290921b8401810191818101908684111561269457600080fd5b8286015b848110156126495780358352918301918301612698565b600080600080608085870312156126c557600080fd5b84356126d08161254b565b9350602085013567ffffffffffffffff808211156126ed57600080fd5b6126f9888389016125d9565b9450604087013591508082111561270f57600080fd5b61271b88838901612654565b9350606087013591508082111561273157600080fd5b5061273e87828801612654565b91505092959194509250565b600082601f83011261275b57600080fd5b813567ffffffffffffffff8111156127755761277561256e565b612788601f8201601f1916602001612584565b81815284602083860101111561279d57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000606084860312156127cf57600080fd5b833567ffffffffffffffff8111156127e657600080fd5b6127f28682870161274a565b93505060208401356128038161254b565b929592945050506040919091013590565b6000815180845260005b8181101561283a5760208185018101518683018201520161281e565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061286d6020830184612814565b9392505050565b60006020828403121561288657600080fd5b813561286d8161254b565b6000602082840312156128a357600080fd5b81356013811061286d57600080fd5b600080600080600060a086880312156128ca57600080fd5b853567ffffffffffffffff808211156128e257600080fd5b6128ee89838a0161274a565b965060209150818801356129018161254b565b955060408801356129118161254b565b945060608801356129218161254b565b935060808801358181111561293557600080fd5b88019050601f8101891361294857600080fd5b80356129566125fa826125b5565b81815260059190911b8201830190838101908b83111561297557600080fd5b928401925b828410156129935783358252928401929084019061297a565b80955050505050509295509295909350565b600080600080608085870312156129bb57600080fd5b84356129c68161254b565b935060208501356129d68161254b565b93969395505050506040820135916060013590565b600080600080600060a08688031215612a0357600080fd5b853567ffffffffffffffff80821115612a1b57600080fd5b818801915088601f830112612a2f57600080fd5b81356020612a3f6125fa836125b5565b82815260059290921b8401810191818101908c841115612a5e57600080fd5b948201945b83861015612a85578535612a768161254b565b82529482019490820190612a63565b9950612a9490508a8201612563565b975050506040880135915080821115612aac57600080fd5b612ab889838a016125d9565b94506060880135915080821115612ace57600080fd5b612ada89838a01612654565b93506080880135915080821115612af057600080fd5b50612afd88828901612654565b9150509295509295909350565b602080825260129082015271696e76616c6964207369676e61747572657360701b604082015260600190565b634e487b7160e01b600052602160045260246000fd5b600060018201612b6c57634e487b7160e01b600052601160045260246000fd5b5060010190565b6020808252601e908201527f43616c6c6572206973206e6f7420636f6e7472616374206d616e616765720000604082015260600190565b608081526000612bbd6080830187612814565b6001600160a01b0395861660208401526040830194909452509216606090920191909152919050565b600060208284031215612bf857600080fd5b815161286d8161254b565b604081526000612c166040830185612814565b905060018060a01b03831660208301529392505050565b60c081526000612c4060c0830189612814565b6001600160a01b0388811660208581019190915288821660408601528782166060860152908616608085015283820360a085015284518083528582019282019060005b81811015612c9f57845183529383019391830191600101612c83565b50909b9a5050505050505050505050565b6001600160a01b03848116825283166020820152606060408201819052600090612cdc90830184612814565b95945050505050565b634e487b7160e01b600052603260045260246000fd5b604080825283519082018190526000906020906060840190828701845b82811015612d3d5781516001600160a01b031684529284019290840190600101612d18565b5050506001600160a01b039490941692019190915250919050565b600081518084526020808501945080840160005b83811015612d915781516001600160a01b031687529582019590820190600101612d6c565b509495945050505050565b828152604060208201526000612db56040830184612d58565b949350505050565b600060208284031215612dcf57600080fd5b8151801515811461286d57600080fd5b60006101008a8352896020840152886040840152806060840152612e0581840189612d58565b6001600160a01b03979097166080840152505060ff9390931660a084015260c083019190915260e09091015294935050505056fea2646970667358221220ec6e7ec5c5a4d6b57125310ddfaf3c3055e56479b846bf19f8223631f4cfc58d64736f6c63430008100033

Verified Source Code Partial Match

Compiler: v0.8.16+commit.07a7930e EVM: london Optimization: Yes (200 runs)
Management.sol 506 lines
// SPDX-License-Identifier: GPL-3.0

pragma solidity 0.8.16;
import "./interfaces/IManagement.sol";
import "./interfaces/IPairFactory.sol";
import {LManagement} from "./libraries/LManagement.sol";

contract Management is IManagement {
    enum SigTypeEnum {AddWhitelist,RemoveWhitelist,AddRestrictlist,RemoveRestrictlist,
        AddManager,RemoveManager,SetContractManager,SetFeeAddress,AddWhiteContract,
        RemoveWhiteContract,AddAdmin,RemoveAdmin,SetAmmFactory, SetOTCFactory, 
        SetP2PFactory,SetSecurityTokenFactory,SetManagement,AddBlocklist,RemoveBlocklist
    }

    using LManagement for mapping(address => bool);

    string public constant name = "Management";

    uint private constant requiredCount = 2; //最小个数
    mapping(address => bool) public whiteList;
    mapping(address => bool) public restrictList;
    mapping(address => bool) public blockList;
    mapping(address => bool) public contractList;
    mapping(address => bool) public administers;
    mapping(address => bool) public managers; //管理员地址
    address public contractManager; //合约管理地址
    address public override platformFeeAddress; //手续费地址

    address public ammFactory;
    address public otcFactory; 
    address public p2pFactory;
    address public securityTokenFactory;

    bytes32 public DOMAIN_SEPARATOR;
    // keccak256("AddWhitelist(address investor,uint256 nonce)");
    bytes32 public constant AddWhitelist_TYPEHASH =0xbae36f97ece7ff6d06ff73064049b6deade63e84a39445ca59a9f59d7b0e9d37;
    // keccak256("RemoveWhitelist(address investor,uint256 nonce)");
    bytes32 public constant RemoveWhitelist_TYPEHASH =0x64c10c1478cf7c3721d359e2f78dfa299c48914c2b6eee9faf35f8508efaeb66;
    // keccak256("AddRestrictlist(address investor,uint256 nonce)");
    bytes32 public constant AddRestrictlist_TYPEHASH =0x998c128fd52190b99cc267054dba040f747bb1889483c451e6e62ecec6f6d836;
    // keccak256("RemoveRestrictlist(address investor,uint256 nonce)");
    bytes32 public constant RemoveRestrictlist_TYPEHASH =0x67e02dd9101cb5ec4ba888b64cf2c887af2342ac87015f0d3964de766f752ba3;
    // keccak256("AddManager(address investor,uint256 nonce)");
    bytes32 public constant AddManager_TYPEHASH =0x163ef0b23224e585a532cb21be056017dc5e24df899e899050f87fb0d9d0e6af;
    // keccak256("RemoveManager(address investor,uint256 nonce)");
    bytes32 public constant RemoveManager_TYPEHASH =0x5ec50e1700093b09774f85c99fe10b2181ff7ebf6137116fee769be0f81fa805;
    // keccak256("SetContractManager(address investor,uint256 nonce)");
    bytes32 public constant SetContractManager_TYPEHASH =0xb5f4b13180b35446f001da8d7a0d31d20f8ec9923e348cc5febdad1de8b247a6;
    // keccak256("SetFeeAddress(address investor,uint256 nonce)");
    bytes32 public constant SetFeeAddress_TYPEHASH =0x3dcf3f15c74bb4d23ab46e4d6ad7cb01451ac366ec11b9471bc09f7db736ad9a;
    // keccak256("AddWhiteContract(address investor,uint256 nonce)");
    bytes32 public constant AddWhiteContract_TYPEHASH =0x1c12de27ba3f67de1dcc525f385b6a129320bf3a5498f39609f3162fdff12174;
    // keccak256("RemoveWhiteContract(address investor,uint256 nonce)");
    bytes32 public constant RemoveWhiteContract_TYPEHASH =0x1be7eca310a863b2bb7cd7bec55909338bc6875ad0756ac9ddfa750c868aa176;
    // keccak256("AddBlocklist(address investor,uint256 nonce)");
    bytes32 public constant AddBlocklist_TYPEHASH =0x3d89d6d5d11eb76b63c2c6f18dfb34b3af7acc2d703db73c28069a378ff7aec2;
    // keccak256("RemoveBlocklist(address investor,uint256 nonce)");
    bytes32 public constant RemoveBlocklist_TYPEHASH =0x9cc9d087aba7064e2e525ccec3dcf261b9e6580c2ceefdf3a7ac50a56474f344;
    // keccak256("AddAdmin(address investor,uint256 nonce)");
    bytes32 public constant AddAdmin_TYPEHASH =0xcf8112dd5614e0034cc93ebdb4f9f2022169d42d53deb26955289b3166922bd6;
    // keccak256("RemoveAdmin(address investor,uint256 nonce)");
    bytes32 public constant RemoveAdmin_TYPEHASH =0x7720a4a484039e81f3c0e5fb52777da87964d87481af2590bb33051987c3978d;
    // keccak256("SetAmmFactory(address investor,uint256 nonce)");
    bytes32 public constant SetAmmFactory_TYPEHASH =0x82a5ca036b13d3a4d2434003f390437bc3cca474cb0105d5d00dc876270e886c;
    // keccak256("SetOTCFactory(address investor,uint256 nonce)");
    bytes32 public constant SetOTCFactory_TYPEHASH =0x359c99fc0cb49cd48a2b30e841fa0eb69dd24d1a27568d10de6bbf66a2b682ca;
    // keccak256("SetP2PFactory(address investor,uint256 nonce)");
    bytes32 public constant SetP2PFactory_TYPEHASH =0xbf8bfccdd4104913963fd44789a30b476f07bb27996c4e09368cd28b0ad312f0;
    // keccak256("SetSecurityTokenFactory(address investor,uint256 nonce)");
    bytes32 public constant SetSecurityTokenFactory_TYPEHASH =0x907bf65e4c55c6e6b92c6b773f9d37c37ecac28d90231a91f35473e6400203d0;
    // keccak256("SetManagement(address[] memory pairs,address newManagement,uint256 nonce)");
    bytes32 public constant SetManagement_TYPEHASH =0xd33bb19e110fdd3dde0f5adcf90869ca157d2bda52f50a3f08594dcbeedb5260;

    mapping(SigTypeEnum => bytes32) private typehashMap;
    mapping(SigTypeEnum => uint) public nonces;

    event AddWhitelistEvent(address indexed from, address indexed addr);
    event RemoveWhitelistEvent(address indexed from, address indexed addr);
    event AddRestrictlistEvent(address indexed from, address indexed addr);
    event RemoveRestrictlistEvent(address indexed from, address indexed addr);
    event AddBlocklistEvent(address indexed from, address indexed addr);
    event RemoveBlocklistEvent(address indexed from, address indexed addr);
    event AddManagerEvent(address indexed from, address indexed addr);
    event RemoveManagerEvent(address indexed from, address indexed addr);
    event SetContractManagerEvent(address indexed from, address indexed addr);
    event SetFeeAddressEvent(address indexed from, address indexed addr);
    event AddWhiteContractEvent(address indexed from, address indexed addr);
    event RemoveWhiteContractEvent(address indexed from, address indexed addr);
    event AddAdminEvent(address indexed from, address indexed addr);
    event RemoveAdminEvent(address indexed from, address indexed addr);
    event SetAmmFactoryEvent(address indexed from, address _ammFactory);
    event SetOTCFactoryEvent(address indexed from, address _otcFactory);
    event SetP2PFactoryEvent(address indexed from, address _p2pFactory);
    event SetSTFactoryEvent(address indexed from,address _securityTokenFactory);

    event CreateSTEvent(address indexed from,address indexed addr,string name,address issuer);
    event CreateAMMEvent(address indexed from,address indexed addr,address tokenA,address tokenB,string _name);
    event CreateOTCEvent(address indexed from,address indexed addr,address tokenA,address tokenB);
    event CreateP2PEvent(address indexed from,address indexed addr,address tokenA,address tokenB);
    event SetManagementEvent(address indexed from,address[] pairs,address newManagement);

    modifier onlyContractManager() {
        require(
            msg.sender == contractManager,"Caller is not contract manager");
        _;
    }

    constructor(address[] memory _admins, address[] memory _factories) {
        
        DOMAIN_SEPARATOR = keccak256(
            abi.encode(
                keccak256(
                    "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
                ),
                keccak256(bytes(name)),
                keccak256(bytes("1")),
                block.chainid,
                address(this)
            )
        );
        typehashMap[SigTypeEnum.AddWhitelist] = AddWhitelist_TYPEHASH;
        typehashMap[SigTypeEnum.RemoveWhitelist] = RemoveWhitelist_TYPEHASH;
        typehashMap[SigTypeEnum.AddRestrictlist] = AddRestrictlist_TYPEHASH;
        typehashMap[SigTypeEnum.RemoveRestrictlist] = RemoveRestrictlist_TYPEHASH;
        typehashMap[SigTypeEnum.AddManager] = AddManager_TYPEHASH;
        typehashMap[SigTypeEnum.RemoveManager] = RemoveManager_TYPEHASH;
        typehashMap[SigTypeEnum.SetContractManager ] = SetContractManager_TYPEHASH;
        typehashMap[SigTypeEnum.SetFeeAddress] = SetFeeAddress_TYPEHASH;
        typehashMap[SigTypeEnum.AddWhiteContract] = AddWhiteContract_TYPEHASH;
        typehashMap[SigTypeEnum.RemoveWhiteContract] = RemoveWhiteContract_TYPEHASH;
        typehashMap[SigTypeEnum.AddAdmin] = AddAdmin_TYPEHASH;
        typehashMap[SigTypeEnum.RemoveAdmin] = RemoveAdmin_TYPEHASH;
        typehashMap[SigTypeEnum.SetAmmFactory] = SetAmmFactory_TYPEHASH;
        typehashMap[SigTypeEnum.SetOTCFactory] = SetOTCFactory_TYPEHASH;
        typehashMap[SigTypeEnum.SetP2PFactory] = SetP2PFactory_TYPEHASH;
        typehashMap[SigTypeEnum.SetSecurityTokenFactory ] = SetSecurityTokenFactory_TYPEHASH;
        typehashMap[SigTypeEnum.SetManagement] = SetManagement_TYPEHASH;
        typehashMap[SigTypeEnum.AddBlocklist] = AddBlocklist_TYPEHASH;
        typehashMap[SigTypeEnum.RemoveBlocklist] = RemoveBlocklist_TYPEHASH;
        for (uint256 i = 0; i < _admins.length; i++) {
            administers[_admins[i]] = true;
        }
        ammFactory = _factories[0];
        otcFactory = _factories[1];
        p2pFactory = _factories[2];
        securityTokenFactory = _factories[3];
    }

    function validSignature(
        SigTypeEnum sigType,
        mapping(address => bool) storage _managers,address investor,
        uint8[] memory vs,
        bytes32[] memory rs,
        bytes32[] memory ss
    ) private view returns (bool) {
        require(vs.length == rs.length);
        require(rs.length == ss.length);
        require(vs.length >= requiredCount);
        address[] memory addrs = new address[](vs.length);
        bytes32 typehash = typehashMap[sigType];
        uint nonce = nonces[sigType];
        for (uint i = 0; i < vs.length; i++) {
            addrs[i] = LManagement.getSigAddress(
                DOMAIN_SEPARATOR,typehash,nonce,investor,vs[i],rs[i],ss[i]
            );
        }
        require(_managers.distinctOwners(addrs), "managers invalid");
        return true;
    }

    function validManagementSignature(
        SigTypeEnum sigType,
        mapping(address => bool) storage _managers,
        address[] memory pairs,
        address newManagement,
        uint8[] memory vs,
        bytes32[] memory rs,
        bytes32[] memory ss
    ) private view returns (bool) {
        require(vs.length == rs.length);
        require(rs.length == ss.length);
        require(vs.length >= requiredCount);
        address[] memory addrs = new address[](vs.length);
        bytes32 typehash = typehashMap[sigType];
        uint nonce = nonces[sigType];
        for (uint i = 0; i < vs.length; i++) {
            addrs[i] = LManagement.getSigManagementAddress(
                DOMAIN_SEPARATOR,typehash,nonce,pairs,newManagement,vs[i],rs[i],ss[i]
            );
        }
        require(_managers.distinctOwners(addrs), "managers invalid");
        return true;
    }

    function addWhitelist(
        address investor,
        uint8[] memory vs,
        bytes32[] memory rs,
        bytes32[] memory ss
    ) external {
        require(validSignature(SigTypeEnum.AddWhitelist,managers,investor,vs,rs,ss),"invalid signatures");
        if (restrictList[investor]) {
            restrictList[investor] = false;
        }
        whiteList[investor] = true;
        nonces[SigTypeEnum.AddWhitelist]++;
        emit AddWhitelistEvent(address(this), investor);
    }

    function removeWhitelist(
        address investor,
        uint8[] memory vs,
        bytes32[] memory rs,
        bytes32[] memory ss
    ) external {
        require(validSignature(SigTypeEnum.RemoveWhitelist,managers,investor,vs,rs,ss),"invalid signatures");
        whiteList[investor] = false;
        nonces[SigTypeEnum.RemoveWhitelist]++;
        emit RemoveWhitelistEvent(address(this), investor);
    }

    function addRestrictlist(
        address investor,
        uint8[] memory vs,
        bytes32[] memory rs,
        bytes32[] memory ss
    ) external {
        require(validSignature(SigTypeEnum.AddRestrictlist,managers,investor,vs,rs,ss),"invalid signatures");
        if (whiteList[investor]) {
            whiteList[investor] = false;
        }
        restrictList[investor] = true;
        nonces[SigTypeEnum.AddRestrictlist]++;
        emit AddRestrictlistEvent(address(this), investor);
    }

    function removeRestrictlist(
        address investor,
        uint8[] memory vs,
        bytes32[] memory rs,
        bytes32[] memory ss
    ) external {
        require(validSignature(SigTypeEnum.RemoveRestrictlist,managers,investor,vs,rs,ss),"invalid signatures");
        restrictList[investor] = false;
        nonces[SigTypeEnum.RemoveRestrictlist]++;
        emit RemoveRestrictlistEvent(address(this), investor);
    }
    function addBlocklist(
        address investor,
        uint8[] memory vs,
        bytes32[] memory rs,
        bytes32[] memory ss
    ) external {
        require(validSignature(SigTypeEnum.AddBlocklist,managers,investor,vs,rs,ss),"invalid signatures");
        blockList[investor] = true;
        nonces[SigTypeEnum.AddBlocklist]++;
        emit AddBlocklistEvent(address(this), investor);
    }

    function removeBlocklist(
        address investor,
        uint8[] memory vs,
        bytes32[] memory rs,
        bytes32[] memory ss
    ) external {
        require(validSignature(SigTypeEnum.RemoveBlocklist,managers,investor,vs,rs,ss),"invalid signatures");
        blockList[investor] = false;
        nonces[SigTypeEnum.RemoveBlocklist]++;
        emit RemoveBlocklistEvent(address(this), investor);
    }
    function addManager(
        address manager,
        uint8[] memory vs,
        bytes32[] memory rs,
        bytes32[] memory ss
    ) external {
        require(validSignature(SigTypeEnum.AddManager,administers,manager,vs,rs,ss),"invalid signatures");
        managers[manager] = true;
        nonces[SigTypeEnum.AddManager]++;
        emit AddManagerEvent(address(this), manager);
    }

    function removeManager(
        address manager,
        uint8[] memory vs,
        bytes32[] memory rs,
        bytes32[] memory ss
    ) external {
        require(validSignature(SigTypeEnum.RemoveManager,administers,manager,vs,rs,ss),"invalid signatures");
        managers[manager] = false;
        nonces[SigTypeEnum.RemoveManager]++;
        emit RemoveManagerEvent(address(this), manager);
    }

    function addAdmin(
        address manager,
        uint8[] memory vs,
        bytes32[] memory rs,
        bytes32[] memory ss
    ) external {
        require(validSignature(SigTypeEnum.AddAdmin,administers,manager,vs,rs,ss),"invalid signatures");
        administers[manager] = true;
        nonces[SigTypeEnum.AddAdmin]++;
        emit AddAdminEvent(address(this), manager);
    }

    function removeAdmin(
        address manager,
        uint8[] memory vs,
        bytes32[] memory rs,
        bytes32[] memory ss
    ) external {
        require(validSignature(SigTypeEnum.RemoveAdmin,administers,manager,vs,rs,ss),"invalid signatures");
        administers[manager] = false;
        nonces[SigTypeEnum.RemoveAdmin]++;
        emit RemoveAdminEvent(address(this), manager);
    }

    function setContractManager(
        address manager,
        uint8[] memory vs,
        bytes32[] memory rs,
        bytes32[] memory ss
    ) external {
        require(validSignature(SigTypeEnum.SetContractManager,administers,manager,vs,rs,ss),"invalid signatures");
        contractManager = manager;
        nonces[SigTypeEnum.SetContractManager]++;
        emit SetContractManagerEvent(address(this), manager);
    }

    function setFeeAddress(
        address _platformFeeAddress,
        uint8[] memory vs,
        bytes32[] memory rs,
        bytes32[] memory ss
    ) external {
        require(validSignature(SigTypeEnum.SetFeeAddress,administers,_platformFeeAddress,vs,rs,ss),"invalid signatures");
        if(platformFeeAddress != address(0)){
            whiteList[platformFeeAddress] = false;
        }
        platformFeeAddress = _platformFeeAddress;
        nonces[SigTypeEnum.SetFeeAddress]++;
        whiteList[_platformFeeAddress] = true;
        emit SetFeeAddressEvent(address(this), _platformFeeAddress);
    }

    function addWhiteContract(
        address contractAddress,
        uint8[] memory vs,
        bytes32[] memory rs,
        bytes32[] memory ss
    ) external {
        require(validSignature(SigTypeEnum.AddWhiteContract,administers,contractAddress,vs,rs,ss),"invalid signatures");
        contractList[contractAddress] = true;
        nonces[SigTypeEnum.AddWhiteContract]++;
        emit AddWhiteContractEvent(address(this), contractAddress);
    }

    function removeWhiteContract(
        address contractAddress,
        uint8[] memory vs,
        bytes32[] memory rs,
        bytes32[] memory ss
    ) external {
        require(validSignature(SigTypeEnum.RemoveWhiteContract,administers,contractAddress,vs,rs,ss),"invalid signatures");
        contractList[contractAddress] = false;
        nonces[SigTypeEnum.RemoveWhiteContract]++;
        emit RemoveWhiteContractEvent(address(this), contractAddress);
    }

    function setAmmFactory(
        address _ammFactoryAddress,
        uint8[] memory vs,
        bytes32[] memory rs,
        bytes32[] memory ss
    ) external {
        require(validSignature(SigTypeEnum.SetAmmFactory,administers,_ammFactoryAddress,vs,rs,ss),"invalid signatures");
        ammFactory = _ammFactoryAddress;
        nonces[SigTypeEnum.SetAmmFactory]++;
        emit SetAmmFactoryEvent(address(this), _ammFactoryAddress);
    }

    function setOTCFactory(
        address _otcFactoryAddress,
        uint8[] memory vs,
        bytes32[] memory rs,
        bytes32[] memory ss
    ) external {
        require(validSignature(SigTypeEnum.SetOTCFactory,administers,_otcFactoryAddress,vs,rs,ss),"invalid signatures");
        otcFactory = _otcFactoryAddress;
        nonces[SigTypeEnum.SetOTCFactory]++;
        emit SetOTCFactoryEvent(address(this), _otcFactoryAddress);
    }

    function setP2PFactory(
        address _p2pFactoryAddress,
        uint8[] memory vs,
        bytes32[] memory rs,
        bytes32[] memory ss
    ) external {
        require(validSignature(SigTypeEnum.SetP2PFactory,administers,_p2pFactoryAddress,vs,rs,ss),"invalid signatures");
        p2pFactory = _p2pFactoryAddress;
        nonces[SigTypeEnum.SetP2PFactory]++;
        emit SetP2PFactoryEvent(address(this), _p2pFactoryAddress);
    }

    function setSecurityTokenFactory(
        address _securityTokenFactoryAddress,
        uint8[] memory vs,
        bytes32[] memory rs,
        bytes32[] memory ss
    ) external {
        require(validSignature(SigTypeEnum.SetSecurityTokenFactory,administers,_securityTokenFactoryAddress,vs,rs,ss),"invalid signatures");
        securityTokenFactory = _securityTokenFactoryAddress;
        nonces[SigTypeEnum.SetSecurityTokenFactory]++;
        emit SetSTFactoryEvent(address(this),_securityTokenFactoryAddress);
    }

    function createSecurityToken(
        string memory stName,
        address issuer,
        uint amount
    ) external onlyContractManager {
        address contractAddress = IPairFactory(securityTokenFactory)
            .createSecurityToken(stName, issuer, amount, address(this));
        contractList[contractAddress] = true;
        emit CreateSTEvent(address(this), contractAddress, stName, issuer);
    }

    function createAMMPair(
        string memory _name,
        address issuer,
        address tokenA,
        address tokenB,
        uint[] memory params
    ) external onlyContractManager {
        address contractAddress = IPairFactory(ammFactory).createAMMPair(
            _name,issuer,tokenA,tokenB,address(this),params);
        contractList[contractAddress] = true;
        emit CreateAMMEvent(address(this),contractAddress,tokenA,tokenB,_name);
    }

    function createOTCPair(
        address tokenA,
        address tokenB,
        uint maxOrderAmount,
        uint platformFeeRate
    ) external onlyContractManager {
        address contractAddress = IPairFactory(otcFactory).createOTCPair(
            tokenA,tokenB,address(this),maxOrderAmount,platformFeeRate);
        contractList[contractAddress] = true;
        emit CreateOTCEvent(address(this), contractAddress, tokenA, tokenB);
    }

    function createP2PPair(
        address tokenA,
        address tokenB,
        uint maxOrderAmount,
        uint platformFeeRate
    ) external onlyContractManager {
        address contractAddress = IPairFactory(p2pFactory).createP2PPair(
            tokenA,tokenB,address(this),maxOrderAmount,platformFeeRate);
        contractList[contractAddress] = true;
        emit CreateP2PEvent(address(this), contractAddress, tokenA, tokenB);
    }

    function setManagement(
        address[] memory pairs,
        address newManagement,
        uint8[] memory vs,
        bytes32[] memory rs,
        bytes32[] memory ss
    ) external {
        require(
            validManagementSignature(SigTypeEnum.SetManagement,administers,pairs,newManagement,vs,rs,ss),"invalid signatures");
        for (uint i = 0; i < pairs.length; i++) {
            address pair = pairs[i];
            IPairFactory(pair).setManagement(newManagement);
        }
        nonces[SigTypeEnum.SetManagement]++;
        emit SetManagementEvent(address(this), pairs, newManagement);
    }

    function isWhiteInvestor(address investor)external view override returns (bool){
        return whiteList[investor];
    }

    function isRestrictInvestor(address investor)external view override returns (bool){
        return restrictList[investor];
    }
    function isBlockInvestor(address investor)external view override returns (bool){
        return blockList[investor];
    }

    function isContractManager(address manager)external view override returns (bool){
        if (manager == contractManager) {
            return true;
        } else {
            return false;
        }
    }

    function isWhiteContract(address contractAddress) external view override returns (bool){ 
        return contractList[contractAddress];
    }
}
LManagement.sol 67 lines
// SPDX-License-Identifier: GPL-3.0

pragma solidity 0.8.16;

library LManagement {
    
    function distinctOwners(
        mapping(address => bool) storage self,
        address[] memory addrs
    ) external view returns (bool) {
        for (uint i = 0; i < addrs.length; i++) {
            if (!self[addrs[i]]) {
                return false;
            }
            for (uint j = 0; j < i; j++) {
                if (addrs[i] == addrs[j]) {
                    return false;
                }
            }
        }
        return true;
    }

    function getSigAddress (
        bytes32  DOMAIN_SEPARATOR,
        bytes32  TYPEHASH,
        uint nonce,
        address investor,
        uint8 v, 
        bytes32  r, 
        bytes32  s
    ) external pure  returns(address){
        bytes32 digest = keccak256(
            abi.encodePacked(
                '\x19\x01',
                DOMAIN_SEPARATOR,
                keccak256(abi.encode(TYPEHASH, investor, nonce))
            )
        );

        address recoveredAddress = ecrecover(digest, v, r, s);
        return recoveredAddress;
    }

    function getSigManagementAddress (
        bytes32  DOMAIN_SEPARATOR,
        bytes32  TYPEHASH,
        uint nonce,
        address[] memory pairs,
        address newManagement,
        uint8 v, 
        bytes32  r, 
        bytes32  s
    ) external pure  returns(address){
        bytes32 digest = keccak256(
            abi.encodePacked(
                '\x19\x01',
                DOMAIN_SEPARATOR,
                keccak256(abi.encode(TYPEHASH, pairs,newManagement, nonce))
            )
        );

        address recoveredAddress = ecrecover(digest, v, r, s);
        return recoveredAddress;
    }

}
IManagement.sol 19 lines
// SPDX-License-Identifier: GPL-3.0
pragma solidity 0.8.16;

interface IManagement {
    
    function platformFeeAddress() external view returns (address);

    function isContractManager(address manager) external view returns (bool);

    function isWhiteInvestor(address investor) external view returns (bool);

    function isRestrictInvestor(address investor) external view returns (bool);

    function isWhiteContract(address contractAddress) external view returns (bool);
    
    function isBlockInvestor(address investor) external view returns (bool);

    
}
IPairFactory.sol 40 lines
// SPDX-License-Identifier: GPL-3.0
pragma solidity 0.8.16;

interface IPairFactory {

    function createAMMPair(
        string memory name,
        address issuer,
        address tokenA,
        address tokenB,
        address management,
        uint[] memory params
    ) external returns(address);

    function createOTCPair(
        address tokenA,
        address tokenB,
        address management,
        uint maxOrderAmount,
        uint platformFeeRate
    ) external returns(address);

    function createP2PPair(
        address tokenA,
        address tokenB,
        address management,
        uint maxOrderAmount,
        uint platformFeeRate
    ) external returns(address);

    function createSecurityToken(
        string memory _name, 
        address issuer,
        uint amount,
        address management
    ) external returns(address);

    function setManagement(address _management) external;

}

Read Contract

AddAdmin_TYPEHASH 0x126013ed → bytes32
AddBlocklist_TYPEHASH 0x8d0f120f → bytes32
AddManager_TYPEHASH 0x8dd27f65 → bytes32
AddRestrictlist_TYPEHASH 0xc55fb490 → bytes32
AddWhiteContract_TYPEHASH 0x5cea0fc2 → bytes32
AddWhitelist_TYPEHASH 0xe98bd25e → bytes32
DOMAIN_SEPARATOR 0x3644e515 → bytes32
RemoveAdmin_TYPEHASH 0x5bdedefe → bytes32
RemoveBlocklist_TYPEHASH 0x4cf05e97 → bytes32
RemoveManager_TYPEHASH 0x8940d35c → bytes32
RemoveRestrictlist_TYPEHASH 0xa3ad6302 → bytes32
RemoveWhiteContract_TYPEHASH 0x73daf71f → bytes32
RemoveWhitelist_TYPEHASH 0x42346357 → bytes32
SetAmmFactory_TYPEHASH 0xffa4cc47 → bytes32
SetContractManager_TYPEHASH 0x2e4f4d67 → bytes32
SetFeeAddress_TYPEHASH 0xaf4dcc64 → bytes32
SetManagement_TYPEHASH 0x56ef3098 → bytes32
SetOTCFactory_TYPEHASH 0x2e5ae0d1 → bytes32
SetP2PFactory_TYPEHASH 0x1d42e9af → bytes32
SetSecurityTokenFactory_TYPEHASH 0x53cb405d → bytes32
administers 0x106328d4 → bool
ammFactory 0xdacda92f → address
blockList 0xb5399283 → bool
contractList 0x0be5967b → bool
contractManager 0xb39e12cf → address
isBlockInvestor 0xe184f6cb → bool
isContractManager 0x306abccf → bool
isRestrictInvestor 0xb09c4d3d → bool
isWhiteContract 0xca14d1bb → bool
isWhiteInvestor 0x0cce6758 → bool
managers 0xfdff9b4d → bool
name 0x06fdde03 → string
nonces 0x5035bda2 → uint256
otcFactory 0x3c964777 → address
p2pFactory 0xdc7e571b → address
platformFeeAddress 0xed14834f → address
restrictList 0x4b4c7617 → bool
securityTokenFactory 0x16f2c85a → address
whiteList 0x372c12b1 → bool

Write Contract 23 functions

These functions modify contract state and require a wallet transaction to execute.

addAdmin 0xc034a9db
address manager
uint8[] vs
bytes32[] rs
bytes32[] ss
addBlocklist 0xd4739a2c
address investor
uint8[] vs
bytes32[] rs
bytes32[] ss
addManager 0xf8ae2fb1
address manager
uint8[] vs
bytes32[] rs
bytes32[] ss
addRestrictlist 0x95e97650
address investor
uint8[] vs
bytes32[] rs
bytes32[] ss
addWhiteContract 0x033954c3
address contractAddress
uint8[] vs
bytes32[] rs
bytes32[] ss
addWhitelist 0x240f46fb
address investor
uint8[] vs
bytes32[] rs
bytes32[] ss
createAMMPair 0xcaa4068d
string _name
address issuer
address tokenA
address tokenB
uint256[] params
createOTCPair 0xcc27f64b
address tokenA
address tokenB
uint256 maxOrderAmount
uint256 platformFeeRate
createP2PPair 0xe2bbcb25
address tokenA
address tokenB
uint256 maxOrderAmount
uint256 platformFeeRate
createSecurityToken 0x050c8e2b
string stName
address issuer
uint256 amount
removeAdmin 0x69848089
address manager
uint8[] vs
bytes32[] rs
bytes32[] ss
removeBlocklist 0x3f9fdb22
address investor
uint8[] vs
bytes32[] rs
bytes32[] ss
removeManager 0xa12cf826
address manager
uint8[] vs
bytes32[] rs
bytes32[] ss
removeRestrictlist 0x6964584a
address investor
uint8[] vs
bytes32[] rs
bytes32[] ss
removeWhiteContract 0x9e064909
address contractAddress
uint8[] vs
bytes32[] rs
bytes32[] ss
removeWhitelist 0xd1bf9f8e
address investor
uint8[] vs
bytes32[] rs
bytes32[] ss
setAmmFactory 0xd43ed3d1
address _ammFactoryAddress
uint8[] vs
bytes32[] rs
bytes32[] ss
setContractManager 0x5b3113ef
address manager
uint8[] vs
bytes32[] rs
bytes32[] ss
setFeeAddress 0xe1edc870
address _platformFeeAddress
uint8[] vs
bytes32[] rs
bytes32[] ss
setManagement 0xf006380a
address[] pairs
address newManagement
uint8[] vs
bytes32[] rs
bytes32[] ss
setOTCFactory 0x5520d02c
address _otcFactoryAddress
uint8[] vs
bytes32[] rs
bytes32[] ss
setP2PFactory 0x04b3c21c
address _p2pFactoryAddress
uint8[] vs
bytes32[] rs
bytes32[] ss
setSecurityTokenFactory 0x59cc389d
address _securityTokenFactoryAddress
uint8[] vs
bytes32[] rs
bytes32[] ss

Recent Transactions

No transactions found for this address