{"file_path":"apps/equity/contracts/token/upgrade/prd/SygnumTokenLatest.sol","creation_status":"success","source_code":"/**\n * @title MetadataUpgrade\n * @author Team 3301 <team3301@sygnum.com>\n * @dev Latest version of SygnumToken.\n */\npragma solidity 0.8.8;\n\nimport \"./SygnumTokenV5.sol\";\n\ncontract SygnumTokenLatest is SygnumTokenV5 {}\n","deployed_bytecode":"0x608060405234801561001057600080fd5b50600436106105f95760003560e01c806370eca15a11610314578063aa5a61bd116101b2578063db060b73116100f9578063ea3f7bdb116100a2578063f017625a1161007c578063f017625a14610cc7578063f8fa842b14610cda578063f9f05cd114610ce257600080fd5b8063ea3f7bdb14610c88578063eaa5407e14610c99578063ef430aa614610ca157600080fd5b8063e5839836116100d3578063e583983614610c41578063e67c876e14610c6d578063e6c97fcb14610c7557600080fd5b8063db060b7314610bed578063dd62ed3e14610c00578063e54f088014610c3957600080fd5b8063b98aa3121161015b578063d051665011610135578063d051665014610b97578063d0ea5f4d14610bba578063d8b153af14610bcd57600080fd5b8063b98aa31214610b6b578063bff852fa14610b7c578063c4d66de814610b8457600080fd5b8063b316675e1161018c578063b316675e14610b3d578063b782e30314610b45578063b962e03414610b5857600080fd5b8063aa5a61bd14610b04578063b187bd2614610b18578063b1dab91514610b2a57600080fd5b80638973d42a11610276578063980c35d11161021f5780639ee0b77d116101f95780639ee0b77d14610ad5578063a457c2d714610ade578063a9059cbb14610af157600080fd5b8063980c35d114610a9b578063981b24d014610aaf57806398cd615314610ac257600080fd5b806395d89b411161025057806395d89b4114610a57578063960313bb14610a5f57806397130fc414610a7257600080fd5b80638973d42a14610a1e5780638feaade414610a3157806395296c7814610a4457600080fd5b80638456cb59116102d85780638535a56b116102b25780638535a56b146109f6578063869c0be4146109fe57806389025f5f14610a0b57600080fd5b80638456cb59146109c857806384a9d4d7146109d057806384da92a7146109e357600080fd5b806370eca15a1461096957806371130bb11461097c578063783124351461098f57806379cc6790146109a25780637acf4892146109b557600080fd5b806338e454b11161049c5780634ee2cd7e116103e35780635ff2adc71161038c5780636857310711610366578063685731071461091a5780636d70f7ae1461092d57806370a082311461094057600080fd5b80635ff2adc7146108dd578063604d996e146108f6578063668f6ace1461090757600080fd5b80635a023693116103bd5780635a023693146108b15780635cd8a76b146108c45780635ead86c6146108cc57600080fd5b80634ee2cd7e14610883578063537f53121461089657806354a08606146108a957600080fd5b80634039ad0d1161044557806342966c681161041f57806342966c681461084c578063485cc9551461085f57806348fe28071461087257600080fd5b80634039ad0d1461081e57806340c10f1914610831578063422f8c0a1461084457600080fd5b80633af32abf116104765780633af32abf146107fb5780633c130d901461080e5780633f4ba83a1461081657600080fd5b806338e454b1146107d5578063392e53cd146107dd57806339509351146107e857600080fd5b80631c6bbabc1161056057806326cb32b7116105095780633117a761116104e35780633117a76114610796578063313ce567146107a957806334cdcf26146107c257600080fd5b806326cb32b71461075f57806329518514146107725780632e4ea2451461078557600080fd5b8063208929d11161053a578063208929d11461072657806323b872dd1461073957806324d7806c1461074c57600080fd5b80631c6bbabc146106f15780631d143848146107025780631dd319cb1461071357600080fd5b806313646d58116105c257806318c20ecb1161059c57806318c20ecb146106a75780631bc051a9146106b95780631bd3fce5146106cc57600080fd5b806313646d581461067a5780631745145e1461068257806318160ddd1461069557600080fd5b8062f55d9d146105fe57806306fdde0314610613578063093abad014610631578063095ea7b31461064457806312f2614014610667575b600080fd5b61061161060c366004613dd8565b610cf5565b005b61061b610d5f565b6040516106289190613e4d565b60405180910390f35b61061161063f366004613e70565b610df1565b610657610652366004613e70565b610eeb565b6040519015158152602001610628565b610611610675366004613dd8565b610f00565b610611610f99565b610611610690366004613dd8565b61100b565b6005545b604051908152602001610628565b60495461065790610100900460ff1681565b6106116106c7366004613eb4565b6110a4565b6044546001600160a01b03165b6040516001600160a01b039091168152602001610628565b603c546001600160a01b03166106d9565b603e546001600160a01b03166106d9565b610611610721366004613e70565b61113f565b610611610734366004613dd8565b611186565b610657610747366004613ecf565b61121f565b61065761075a366004613dd8565b611236565b61065761076d366004613dd8565b6112b5565b610657610780366004613dd8565b6112e8565b6040546001600160a01b03166106d9565b6106116107a436600461404a565b61139f565b60025460ff165b60405160ff9091168152602001610628565b6106576107d0366004613dd8565b61146c565b61061161149f565b60085460ff16610657565b6106576107f6366004613e70565b6114dc565b610657610809366004613dd8565b6114e8565b61061b61151b565b6106116115a9565b61065761082c366004613dd8565b611656565b61061161083f366004613e70565b611689565b6107b0611723565b61061161085a3660046140d2565b6117cf565b61061161086d3660046140eb565b611844565b6042546001600160a01b03166106d9565b610699610891366004613e70565b61185d565b6106116108a436600461419d565b61187f565b6106116118ec565b6106116108bf366004613dd8565b61192c565b610611611976565b603b546001600160a01b03166106d9565b60495464010000000090046001600160a01b03166106d9565b6041546001600160a01b03166106d9565b610657610915366004613dd8565b6119b0565b6106116109283660046141da565b6119e3565b61065761093b366004613dd8565b611a86565b61069961094e366004613dd8565b6001600160a01b031660009081526003602052604090205490565b61061161097736600461419d565b611ab9565b61061161098a366004613dd8565b611b01565b61061161099d366004613dd8565b611b33565b6106116109b0366004613e70565b611bb5565b604054600160a01b900460ff1615610657565b610611611c06565b6106116109de36600461424c565b611cbb565b6106116109f136600461419d565b611d23565b610611611d91565b6049546106579060ff1681565b610657610a19366004613dd8565b611dfc565b610611610a2c366004613e70565b611e2f565b610611610a3f366004614293565b611f21565b610611610a523660046142db565b611fcf565b61061b6120a4565b610611610a6d366004613ecf565b6120b3565b610699610a80366004613dd8565b6001600160a01b031660009081526046602052604090205490565b60495461065790600160c01b900460ff1681565b610699610abd3660046140d2565b612136565b610611610ad036600461419d565b612143565b61069960455481565b610657610aec366004613e70565b6121ac565b610657610aff366004613e70565b6121b8565b604954610657906301000000900460ff1681565b604054600160a01b900460ff16610657565b610611610b38366004613dd8565b6121c4565b61061161225b565b6049546106579062010000900460ff1681565b610611610b663660046141da565b6122c4565b603f546001600160a01b03166106d9565b61061b612362565b610611610b92366004613dd8565b612371565b610657610ba5366004613dd8565b60476020526000908152604090205460ff1681565b610657610bc8366004613dd8565b612414565b610699610bdb366004613dd8565b60466020526000908152604090205481565b610611610bfb366004613ecf565b612447565b610699610c0e3660046140eb565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205490565b610699612478565b610657610c4f366004613dd8565b6001600160a01b031660009081526047602052604090205460ff1690565b61061161252c565b610611610c833660046143da565b612595565b6043546001600160a01b03166106d9565b604554610699565b603c54600160a01b900460e01b6040516001600160e01b03199091168152602001610628565b610611610cd536600461419d565b6125b0565b61061b61261e565b610611610cf0366004614502565b6126d6565b610cfe33611a86565b610d1b5760405163aa49d14f60e01b815260040160405180910390fd5b60405130906001600160a01b0383169033907fe76ea4db1aaa54cf4eabf7e9802fcf1c558685039d5ecb40bea5d29640a4b6a690600090a4806001600160a01b0316ff5b606060008054610d6e90614650565b80601f0160208091040260200160405190810160405280929190818152602001828054610d9a90614650565b8015610de75780601f10610dbc57610100808354040283529160200191610de7565b820191906000526020600020905b815481529060010190602001808311610dca57829003601f168201915b5050505050905090565b610dfa33611dfc565b158015610e0d5750610e0b33611a86565b155b15610e2b5760405163caf5634560e01b815260040160405180910390fd5b6001600160a01b038216600090815260036020526040902054610e4e9082612700565b6001600160a01b038316600090815260036020908152604080832093909355604690522054610e7d908261270c565b6001600160a01b038316600090815260466020526040902055604554610ea3908261270c565b6045556040518181526001600160a01b0383169033907ff4d61bf10cd7634ffb91cebcbd1828d9b0debaec1f35f00fac329be576fa795d906020015b60405180910390a35050565b6000610ef78383612718565b90505b92915050565b610f0933611236565b610f265760405163590f633960e01b815260040160405180910390fd5b6001600160a01b038116610f4d5760405163599969f960e11b815260040160405180910390fd5b604280546001600160a01b0319166001600160a01b03831690811790915560405133907f78ffa9fe91e0bddf459ef5a9ea969b71677013f719cdb542f2ed55a9e26e3e2690600090a350565b6042546001600160a01b0316610fc25760405163599969f960e11b815260040160405180910390fd5b6042546001600160a01b03163314610ff457604051631076480560e21b81523360048201526024015b60405180910390fd5b604254611009906001600160a01b031661279b565b565b61101433611236565b6110315760405163590f633960e01b815260040160405180910390fd5b6001600160a01b03811661105857604051638d9b385f60e01b815260040160405180910390fd5b603c80546001600160a01b0319166001600160a01b03831690811790915560405133907f01e6311290e7fb795a47761d6ca6a39b9c898bbf2e8b0e40211aa9f2f6c0202990600090a350565b6110ad33611a86565b6110ca5760405163aa49d14f60e01b815260040160405180910390fd5b603c805463ffffffff60a01b1916600160a01b60e084811c82029290921792839055604080513381526001600160e01b03199290940490921b16602083015230908201527feb9a07614128a8102a8d0f1200e4c49a878b681e4257b38e11dd627ba3807416906060015b60405180910390a150565b611149828261280e565b6040518181526001600160a01b0383169033907f27d99300c6c6789f01bf643b2832d5f98653c4c2166dfce0a8ed822b049f307390602001610edf565b61118f33611236565b6111ac5760405163590f633960e01b815260040160405180910390fd5b6001600160a01b0381166111d357604051631bc7763360e31b815260040160405180910390fd5b604480546001600160a01b0319166001600160a01b03831690811790915560405133907f0cac6307c5182808dbebb49424a803a786b8065475a3004af7848cce417cccac90600090a350565b600061122c848484612861565b90505b9392505050565b603b54604051630935e01b60e21b81526001600160a01b03838116600483015260009216906324d7806c906024015b60206040518083038186803b15801561127d57600080fd5b505afa158015611291573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610efa919061468b565b603b546040516326cb32b760e01b81526001600160a01b03838116600483015260009216906326cb32b790602401611265565b603b546040516336b87bd760e11b81526001600160a01b0383811660048301526000921690636d70f7ae906024015b60206040518083038186803b15801561132f57600080fd5b505afa158015611343573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611367919061468b565b80610efa5750603b54604051631a66e79360e11b81526001600160a01b038481166004830152909116906334cdcf2690602401611265565b805183511415806113b257508051825114155b156113d05760405163200e1d7760e11b815260040160405180910390fd5b825161010010156113f457604051637d8e673560e01b815260040160405180910390fd5b60005b835181101561146657611456848281518110611415576114156146a8565b602002602001015184838151811061142f5761142f6146a8565b6020026020010151848481518110611449576114496146a8565b60200260200101516120b3565b61145f816146d4565b90506113f7565b50505050565b603b54604051631a66e79360e11b81526001600160a01b03838116600483015260009216906334cdcf2690602401611265565b60495462010000900460ff16156114c9576040516304cc1bdb60e01b815260040160405180910390fd5b6049805462ff0000191662010000179055565b6000610ef78383612923565b604154604051633af32abf60e01b81526001600160a01b0383811660048301526000921690633af32abf90602401611265565b6048805461152890614650565b80601f016020809104026020016040519081016040528092919081815260200182805461155490614650565b80156115a15780601f10611576576101008083540402835291602001916115a1565b820191906000526020600020905b81548152906001019060200180831161158457829003601f168201915b505050505081565b6115b233611a86565b1580156115c557506115c333611656565b155b80156115d757506115d53361146c565b155b156115f557604051635dc4e41160e11b815260040160405180910390fd5b604054600160a01b900460ff1661161e5760405162c5619760e61b815260040160405180910390fd5b6040805460ff60a01b191681555133907f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa90600090a2565b603f54604051634039ad0d60e01b81526001600160a01b0383811660048301526000921690634039ad0d90602401611265565b6116923361146c565b156116dc576001600160a01b03821660009081526047602052604090205460ff16156116dc57604051637aae826960e11b81526001600160a01b0383166004820152602401610feb565b6116e6828261299d565b6040518181526001600160a01b0383169033907f9d228d69b5fdb8d273a2336f8fb8612d039631024ea9bf09c424a9503aa078f090602001610edf565b60495460009064010000000090046001600160a01b03166117445750600090565b604960049054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561179257600080fd5b505afa1580156117a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ca91906146ef565b905090565b3360009081526047602052604090205460ff16156118025760405163ad57726160e01b8152336004820152602401610feb565b61180c33826129f0565b60405181815233907f696de425f79f4a40bc6d2122ca50507f0efbeabbff86a84871b7196ab8ea8df79060200160405180910390a250565b604051633c144f1f60e21b815260040160405180910390fd5b6001600160a01b0382166000908152600660205260408120610ef79083612a39565b61188833611a86565b6118a55760405163aa49d14f60e01b815260040160405180910390fd5b80516118b8906001906020840190613d2a565b507fac570b70a8feb5042803796f5f7d69fb108f43e4dfdb31ad5bb4cae524b3cbaa3382306040516111349392919061470c565b6049546301000000900460ff16156119175760405163072e5a6360e51b815260040160405180910390fd5b6049805463ff00000019166301000000179055565b604954600160c01b900460ff16156119575760405163a229970560e01b815260040160405180910390fd5b61196081612ba2565b506049805460ff60c01b1916600160c01b179055565b604954610100900460ff161561199f57604051631bfe2c0b60e31b815260040160405180910390fd5b6049805461ff001916610100179055565b603b54604051633347b56760e11b81526001600160a01b038381166004830152600092169063668f6ace90602401611265565b8051825114611a055760405163200e1d7760e11b815260040160405180910390fd5b81516101001015611a2957604051637d8e673560e01b815260040160405180910390fd5b60005b8251811015611a8157611a71838281518110611a4a57611a4a6146a8565b6020026020010151838381518110611a6457611a646146a8565b6020026020010151611689565b611a7a816146d4565b9050611a2c565b505050565b603b546040516336b87bd760e11b81526001600160a01b0383811660048301526000921690636d70f7ae90602401611265565b60495460ff1615611add5760405163cc54c66160e01b815260040160405180910390fd5b8051611af0906048906020840190613d2a565b50506049805460ff19166001179055565b611b0a33611236565b611b275760405163590f633960e01b815260040160405180910390fd5b611b3081612ba2565b50565b611b3c33611a86565b611b595760405163aa49d14f60e01b815260040160405180910390fd5b603e80546001600160a01b0319166001600160a01b03831690811790915560408051338152602081019290925230908201527f7517f2ce2a7974ec02b566e359e3fb3b319c5b3cc755606f35cbf79f93601e9590606001611134565b611bbf8282612c07565b816001600160a01b03167f696de425f79f4a40bc6d2122ca50507f0efbeabbff86a84871b7196ab8ea8df782604051611bfa91815260200190565b60405180910390a25050565b611c0f33611a86565b158015611c225750611c2033611656565b155b8015611c345750611c323361146c565b155b15611c5257604051635dc4e41160e11b815260040160405180910390fd5b604054600160a01b900460ff1615611c7d5760405163928dfa7760e01b815260040160405180910390fd5b6040805460ff60a01b1916600160a01b1781555133907f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890600090a2565b61010082511115611ce457815160405163f33e36a960e01b8152600401610feb91815260200190565b60005b8251811015611a8157611d13838281518110611d0557611d056146a8565b602002602001015183611f21565b611d1c816146d4565b9050611ce7565b611d2c33611a86565b611d495760405163aa49d14f60e01b815260040160405180910390fd5b8051611d5c906000906020840190613d2a565b507fcf335673fa5d049c27e726ba4d58524070f407e87f0fc2f22c4fce415b2c84ac3360003060405161113493929190614742565b603c546001600160a01b0316611dba57604051638d9b385f60e01b815260040160405180910390fd5b603c546001600160a01b03163314611de7576040516385df92a760e01b8152336004820152602401610feb565b603c54611009906001600160a01b0316612c11565b6043546040516389025f5f60e01b81526001600160a01b03838116600483015260009216906389025f5f90602401611265565b611e3833611dfc565b158015611e4b5750611e4933611a86565b155b15611e695760405163caf5634560e01b815260040160405180910390fd5b6001600160a01b038216600090815260036020526040902054611e8c908261270c565b6001600160a01b038316600090815260036020908152604080832093909355604690522054611ebb9082612700565b6001600160a01b038316600090815260466020526040902055604554611ee19082612700565b6045556040518181526001600160a01b0383169033907f8100ea465dd47f3401ddd3d8429111ea02ccb1f745cfbf4479fc4d33f90fd37d90602001610edf565b816001600160a01b038116611f49576040516350a5d4c960e01b815260040160405180910390fd5b611f5233611a86565b611f6f5760405163aa49d14f60e01b815260040160405180910390fd5b6001600160a01b038316600081815260476020908152604091829020805460ff191686151590811790915591519182527f3c143a3c8cc9eafd41748a32abe319b06bd5b995c988fa06db8d1ef4e5841edf910160405180910390a2505050565b600854610100900460ff1615808015611fe85750303b15155b8015611ff6575060085460ff165b1561201457604051635428559160e01b815260040160405180910390fd5b801561202a576008805461ffff19166101011790555b61203385612371565b61203c8461279b565b61204583612c84565b61204e82612cf7565b61205c8b8b8b8b8b8b612d6a565b8015612097576008805461ff00191690556040517f5daa87a0e9463431830481fd4b6e3403442dfb9a12b9c07597e9f61d50b633c890600090a15b5050505050505050505050565b606060018054610d6e90614650565b6120bc336112e8565b6120d9576040516360e6021760e01b815260040160405180910390fd5b6120e4838383612df8565b816001600160a01b0316836001600160a01b03167fc3a0c22b0aeeb7a97bafeabf2b1c9611b092e8f739d791180a7f299fcd1f41fb8360405161212991815260200190565b60405180910390a3505050565b6000610efa600783612a39565b61214c33611a86565b6121695760405163aa49d14f60e01b815260040160405180910390fd5b805161217c906048906020840190613d2a565b507f89e5189514b6402e76dacf643a35960a8b0a3302552103511c83cb42b07b25ab816040516111349190613e4d565b6000610ef78383612e72565b6000610ef78383612eec565b6121cd33611236565b6121ea5760405163590f633960e01b815260040160405180910390fd5b6001600160a01b0381166122115760405163919ee6f760e01b815260040160405180910390fd5b604080546001600160a01b0319166001600160a01b0383169081178255905133907f3f3352e835b79539c317572a5adbfcc149494437e8975906a5a2274c3d06b52790600090a350565b6040546001600160a01b031661228457604051630105355160e01b815260040160405180910390fd5b6040546001600160a01b031633146122af57604051632eebd0d360e11b815260040160405180910390fd5b604054611009906001600160a01b0316612c84565b80518251146122e65760405163200e1d7760e11b815260040160405180910390fd5b8151610100101561230a57604051637d8e673560e01b815260040160405180910390fd5b60005b8251811015611a815761235283828151811061232b5761232b6146a8565b6020026020010151838381518110612345576123456146a8565b602002602001015161113f565b61235b816146d4565b905061230d565b6060603d8054610d6e90614650565b600854610100900460ff161580801561238a5750303b15155b8015612398575060085460ff165b156123b657604051635428559160e01b815260040160405180910390fd5b80156123cc576008805461ffff19166101011790555b6123d582612c11565b8015612410576008805461ff00191690556040517f5daa87a0e9463431830481fd4b6e3403442dfb9a12b9c07597e9f61d50b633c890600090a15b5050565b603b54604051630935e01b60e21b81526001600160a01b03838116600483015260009216906324d7806c90602401611317565b61245033611656565b61246d5760405163c6fa043960e01b815260040160405180910390fd5b611a81838383612f66565b60495460009064010000000090046001600160a01b03166124995750600090565b6000604960049054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b1580156124e957600080fd5b505afa1580156124fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125219190614825565b509195945050505050565b6044546001600160a01b031661255557604051638ec61c7360e01b815260040160405180910390fd5b6044546001600160a01b031633146125805760405163031cd30b60e51b815260040160405180910390fd5b604454611009906001600160a01b0316612cf7565b6125a88b8b8b8b8b8b8b8b8b8b8b613082565b6120976118ec565b6125b933611a86565b6125d65760405163aa49d14f60e01b815260040160405180910390fd5b80516125e990603d906020840190613d2a565b507f3e316a308ab2ebf046a9c4722c296ee905b8ee17f41f765246a2a7d374833ffa33603d3060405161113493929190614742565b60495460609064010000000090046001600160a01b031661264c575060408051602081019091526000815290565b604960049054906101000a90046001600160a01b03166001600160a01b0316637284e4166040518163ffffffff1660e01b815260040160006040518083038186803b15801561269a57600080fd5b505afa1580156126ae573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526117ca9190810190614875565b6126e98c8c8c8c8c8c8c8c8c8c8c612595565b6126f28161192c565b505050505050505050505050565b6000610ef782846148e3565b6000610ef782846148fa565b3360008181526047602052604081205490919060ff161561274c5760405163094ba74560e31b815260040160405180910390fd5b6001600160a01b038416600090815260476020526040902054849060ff16156127885760405163094ba74560e31b815260040160405180910390fd5b612792858561309d565b95945050505050565b6001600160a01b0381166127c25760405163599969f960e11b815260040160405180910390fd5b604180546001600160a01b0319166001600160a01b03831690811790915560405133907ff10a6c2d7d8ac14e2134743353b0c65c0e1ee214816c96176a1bb730a34729ad90600090a350565b61281733611a86565b80156128275750612827826114e8565b15612857576000811161284d57604051631d23624f60e31b815260040160405180910390fd5b61241082826130f7565b612410828261313d565b3360008181526047602052604081205490919060ff16156128955760405163094ba74560e31b815260040160405180910390fd5b6001600160a01b038516600090815260476020526040902054859060ff16156128d15760405163094ba74560e31b815260040160405180910390fd5b6001600160a01b038516600090815260476020526040902054859060ff161561290d5760405163094ba74560e31b815260040160405180910390fd5b612918878787613147565b979650505050505050565b3360008181526047602052604081205490919060ff16156129575760405163094ba74560e31b815260040160405180910390fd5b6001600160a01b038416600090815260476020526040902054849060ff16156129935760405163094ba74560e31b815260040160405180910390fd5b61279285856131c9565b6129a633611a86565b80156129b657506129b6826114e8565b156129e657600081116129dc5760405163512bc75960e01b815260040160405180910390fd5b6124108282613223565b612410828261322d565b6129f933611a86565b8015612a095750612a09826114e8565b15612a2f576000811161284d57604051631d23624f60e31b815260040160405180910390fd5b6124108282613237565b8154600090612a4a57506000610efa565b82548390612a59906001612700565b81548110612a6957612a696146a8565b9060005260206000209060020201600001548210612ab95782548390612a90906001612700565b81548110612aa057612aa06146a8565b9060005260206000209060020201600101549050610efa565b82600081548110612acc57612acc6146a8565b906000526020600020906002020160000154821015612aed57506000610efa565b82546000908190612aff906001612700565b90505b81811115612b74576000612b2c6002612b266001612b20868861270c565b9061270c565b90613241565b905084868281548110612b4157612b416146a8565b90600052602060002090600202016000015411612b6057809250612b6e565b612b6b816001612700565b91505b50612b02565b848281548110612b8657612b866146a8565b9060005260206000209060020201600101549250505092915050565b6049805477ffffffffffffffffffffffffffffffffffffffff0000000019166401000000006001600160a01b038416908102919091179091556040517f1fad3e0b1198eb0a3c486786301ac1f05c1403d85a593433dc1424fd0a2d5e2a90600090a250565b612410828261324d565b6001600160a01b038116612c3857604051638d9b385f60e01b815260040160405180910390fd5b603b80546001600160a01b0319166001600160a01b03831690811790915560405133907f581e9e5016a25985d2da9da423c68d9946de634ff0e3447eaaa9575d135e819e90600090a350565b6001600160a01b038116612cab5760405163919ee6f760e01b815260040160405180910390fd5b603f80546001600160a01b0319166001600160a01b03831690811790915560405133907f2062717208704e88e492fbeeade423dbb92afbc0429f402e121c31050b16ef2290600090a350565b6001600160a01b038116612d1e57604051631bc7763360e31b815260040160405180910390fd5b604380546001600160a01b0319166001600160a01b03831690811790915560405133907f7add599f7c2b8d78adb65f05bacace872bd5eb2312055ecae19f055c95d03de790600090a350565b8551612d7d906000906020890190613d2a565b508451612d91906001906020880190613d2a565b506002805460ff191660ff8616179055603c805463ffffffff60a01b1916600160a01b60e086901c021790558151612dd090603d906020850190613d2a565b50603e80546001600160a01b0319166001600160a01b03929092169190911790555050505050565b612e038383836132c4565b612e166007612e1160055490565b61344a565b6001600160a01b0383166000908152600660209081526040808320600390925290912054612e44919061344a565b6001600160a01b0382166000908152600660209081526040808320600390925290912054611a81919061344a565b3360008181526047602052604081205490919060ff1615612ea65760405163094ba74560e31b815260040160405180910390fd5b6001600160a01b038416600090815260476020526040902054849060ff1615612ee25760405163094ba74560e31b815260040160405180910390fd5b6127928585613502565b3360008181526047602052604081205490919060ff1615612f205760405163094ba74560e31b815260040160405180910390fd5b6001600160a01b038416600090815260476020526040902054849060ff1615612f5c5760405163094ba74560e31b815260040160405180910390fd5b612792858561355c565b6001600160a01b038316612fc85760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610feb565b6001600160a01b0382166130295760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610feb565b6001600160a01b0383811660008181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259101612129565b6130958b8b8b8b8b8b8b8b8b8b8b6135b6565b61209761149f565b6000336130a9816114e8565b6130c65760405163d11eb83160e01b815260040160405180910390fd5b836130d0816114e8565b6130ed5760405163d11eb83160e01b815260040160405180910390fd5b61279285856135d1565b6131018282613609565b61310f6007612e1160055490565b6001600160a01b0382166000908152600660209081526040808320600390925290912054612410919061344a565b612410828261370d565b600033613153816114e8565b6131705760405163d11eb83160e01b815260040160405180910390fd5b8461317a816114e8565b6131975760405163d11eb83160e01b815260040160405180910390fd5b846131a1816114e8565b6131be5760405163d11eb83160e01b815260040160405180910390fd5b612918878787613733565b6000826131d5816114e8565b6131f25760405163d11eb83160e01b815260040160405180910390fd5b336131fc816114e8565b6132195760405163d11eb83160e01b815260040160405180910390fd5b612792858561376c565b61310182826137a4565b612410828261387e565b61241082826138af565b6000610ef78284614912565b3360008181526047602052604090205460ff161561327e5760405163094ba74560e31b815260040160405180910390fd5b6001600160a01b038316600090815260476020526040902054839060ff16156132ba5760405163094ba74560e31b815260040160405180910390fd5b61146684846138e0565b6001600160a01b0383166133285760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610feb565b6001600160a01b03821661338a5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610feb565b6133c781604051806060016040528060268152602001614957602691396001600160a01b0386166000908152600360205260409020549190613938565b6001600160a01b0380851660009081526003602052604080822093909355908416815220546133f6908261270c565b6001600160a01b0380841660008181526003602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906121299085815260200190565b815415806134885750815443908390613464906001612700565b81548110613474576134746146a8565b906000526020600020906002020160000154105b156134c857604080518082019091524381526020808201928352835460018082018655600095865291909420915160029094029091019283559051910155565b8154819083906134d9906001612700565b815481106134e9576134e96146a8565b9060005260206000209060020201600101819055505050565b60008261350e816114e8565b61352b5760405163d11eb83160e01b815260040160405180910390fd5b33613535816114e8565b6135525760405163d11eb83160e01b815260040160405180910390fd5b6127928585613964565b600033613568816114e8565b6135855760405163d11eb83160e01b815260040160405180910390fd5b8361358f816114e8565b6135ac5760405163d11eb83160e01b815260040160405180910390fd5b612792858561399c565b6135c98b8b8b8b8b8b8b8b8b8b8b6139d4565b612097611976565b604054600090600160a01b900460ff16156135ff5760405163928dfa7760e01b815260040160405180910390fd5b610ef783836139ef565b6001600160a01b0382166136695760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610feb565b6136a681604051806060016040528060228152602001614935602291396001600160a01b0385166000908152600360205260409020549190613938565b6001600160a01b0383166000908152600360205260409020556005546136cc9082612700565b6005556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610edf565b61371633611a86565b6132375760405163aa49d14f60e01b815260040160405180910390fd5b604054600090600160a01b900460ff16156137615760405163928dfa7760e01b815260040160405180910390fd5b61122c848484613a05565b604054600090600160a01b900460ff161561379a5760405163928dfa7760e01b815260040160405180910390fd5b610ef78383613a7e565b6001600160a01b0382166137fa5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610feb565b600554613807908261270c565b6005556001600160a01b03821660009081526003602052604090205461382d908261270c565b6001600160a01b0383166000818152600360205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610edf9085815260200190565b81613888816114e8565b6138a55760405163d11eb83160e01b815260040160405180910390fd5b611a818383613ab9565b816138b9816114e8565b6138d65760405163d11eb83160e01b815260040160405180910390fd5b611a818383613b0a565b336138ea816114e8565b6139075760405163d11eb83160e01b815260040160405180910390fd5b82613911816114e8565b61392e5760405163d11eb83160e01b815260040160405180910390fd5b6114668484613b35565b6000818484111561395c5760405162461bcd60e51b8152600401610feb9190613e4d565b505050900390565b604054600090600160a01b900460ff16156139925760405163928dfa7760e01b815260040160405180910390fd5b610ef78383613b6a565b604054600090600160a01b900460ff16156139ca5760405163928dfa7760e01b815260040160405180910390fd5b610ef78383613bb9565b6139e68b8b8b8b8b8b8b8b8b8b611fcf565b61209781611ab9565b60006139fc338484612f66565b50600192915050565b6000613a12848484613c28565b9050613a226007612e1160055490565b6001600160a01b0384166000908152600660209081526040808320600390925290912054613a50919061344a565b6001600160a01b038316600090815260066020908152604080832060039092529091205461122f919061344a565b3360008181526004602090815260408083206001600160a01b038716845290915281205490916139fc918590613ab4908661270c565b612f66565b613ac2336112e8565b613adf576040516360e6021760e01b815260040160405180910390fd5b60008111613b005760405163512bc75960e01b815260040160405180910390fd5b6124108282613c9d565b604054600160a01b900460ff161561284d5760405163928dfa7760e01b815260040160405180910390fd5b604054600160a01b900460ff1615613b605760405163928dfa7760e01b815260040160405180910390fd5b6124108282613cc8565b60006139fc3384613ab4856040518060600160405280602581526020016149c9602591393360009081526004602090815260408083206001600160a01b038d1684529091529020549190613938565b6000613bc58383613cd2565b9050613bd56007612e1160055490565b336000908152600660209081526040808320600390925290912054613bfa919061344a565b6001600160a01b0383166000908152600660209081526040808320600390925290912054610efa919061344a565b6000613c358484846132c4565b613c938433613ab48560405180606001604052806028815260200161497d602891396001600160a01b038a16600090815260046020526040812090335b6001600160a01b031681526020810191909152604001600020549190613938565b5060019392505050565b604054600160a01b900460ff16156129dc5760405163928dfa7760e01b815260040160405180910390fd5b6131018282613cdf565b60006139fc3384846132c4565b613ce982826129f0565b6124108233613ab4846040518060600160405280602481526020016149a5602491396001600160a01b03881660009081526004602052604081209033613c72565b828054613d3690614650565b90600052602060002090601f016020900481019282613d585760008555613d9e565b82601f10613d7157805160ff1916838001178555613d9e565b82800160010185558215613d9e579182015b82811115613d9e578251825591602001919060010190613d83565b50613daa929150613dae565b5090565b5b80821115613daa5760008155600101613daf565b6001600160a01b0381168114611b3057600080fd5b600060208284031215613dea57600080fd5b813561122f81613dc3565b60005b83811015613e10578181015183820152602001613df8565b838111156114665750506000910152565b60008151808452613e39816020860160208601613df5565b601f01601f19169290920160200192915050565b602081526000610ef76020830184613e21565b8035613e6b81613dc3565b919050565b60008060408385031215613e8357600080fd5b8235613e8e81613dc3565b946020939093013593505050565b80356001600160e01b031981168114613e6b57600080fd5b600060208284031215613ec657600080fd5b610ef782613e9c565b600080600060608486031215613ee457600080fd5b8335613eef81613dc3565b92506020840135613eff81613dc3565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613f4f57613f4f613f10565b604052919050565b600067ffffffffffffffff821115613f7157613f71613f10565b5060051b60200190565b600082601f830112613f8c57600080fd5b81356020613fa1613f9c83613f57565b613f26565b82815260059290921b84018101918181019086841115613fc057600080fd5b8286015b84811015613fe4578035613fd781613dc3565b8352918301918301613fc4565b509695505050505050565b600082601f83011261400057600080fd5b81356020614010613f9c83613f57565b82815260059290921b8401810191818101908684111561402f57600080fd5b8286015b84811015613fe45780358352918301918301614033565b60008060006060848603121561405f57600080fd5b833567ffffffffffffffff8082111561407757600080fd5b61408387838801613f7b565b9450602086013591508082111561409957600080fd5b6140a587838801613f7b565b935060408601359150808211156140bb57600080fd5b506140c886828701613fef565b9150509250925092565b6000602082840312156140e457600080fd5b5035919050565b600080604083850312156140fe57600080fd5b823561410981613dc3565b9150602083013561411981613dc3565b809150509250929050565b600067ffffffffffffffff82111561413e5761413e613f10565b50601f01601f191660200190565b600082601f83011261415d57600080fd5b813561416b613f9c82614124565b81815284602083860101111561418057600080fd5b816020850160208301376000918101602001919091529392505050565b6000602082840312156141af57600080fd5b813567ffffffffffffffff8111156141c657600080fd5b6141d28482850161414c565b949350505050565b600080604083850312156141ed57600080fd5b823567ffffffffffffffff8082111561420557600080fd5b61421186838701613f7b565b9350602085013591508082111561422757600080fd5b5061423485828601613fef565b9150509250929050565b8015158114611b3057600080fd5b6000806040838503121561425f57600080fd5b823567ffffffffffffffff81111561427657600080fd5b61428285828601613f7b565b92505060208301356141198161423e565b600080604083850312156142a657600080fd5b82356142b181613dc3565b915060208301356141198161423e565b60ff81168114611b3057600080fd5b8035613e6b816142c1565b6000806000806000806000806000806101408b8d0312156142fb57600080fd5b8a3567ffffffffffffffff8082111561431357600080fd5b61431f8e838f0161414c565b9b5060208d013591508082111561433557600080fd5b6143418e838f0161414c565b9a5061434f60408e016142d0565b995061435d60608e01613e9c565b985060808d013591508082111561437357600080fd5b506143808d828e0161414c565b96505061438f60a08c01613e60565b945061439d60c08c01613e60565b93506143ab60e08c01613e60565b92506143ba6101008c01613e60565b91506143c96101208c01613e60565b90509295989b9194979a5092959850565b60008060008060008060008060008060006101608c8e0312156143fc57600080fd5b67ffffffffffffffff808d35111561441357600080fd5b6144208e8e358f0161414c565b9b508060208e0135111561443357600080fd5b6144438e60208f01358f0161414c565b9a5061445160408e016142d0565b995061445f60608e01613e9c565b98508060808e0135111561447257600080fd5b6144828e60808f01358f0161414c565b975061449060a08e01613e60565b965061449e60c08e01613e60565b95506144ac60e08e01613e60565b94506144bb6101008e01613e60565b93506144ca6101208e01613e60565b9250806101408e013511156144de57600080fd5b506144f08d6101408e01358e0161414c565b90509295989b509295989b9093969950565b6000806000806000806000806000806000806101808d8f03121561452557600080fd5b67ffffffffffffffff8d35111561453b57600080fd5b6145488e8e358f0161414c565b9b5067ffffffffffffffff60208e0135111561456357600080fd5b6145738e60208f01358f0161414c565b9a5061458160408e016142d0565b995061458f60608e01613e9c565b985067ffffffffffffffff60808e013511156145aa57600080fd5b6145ba8e60808f01358f0161414c565b97506145c860a08e01613e60565b96506145d660c08e01613e60565b95506145e460e08e01613e60565b94506145f36101008e01613e60565b93506146026101208e01613e60565b925067ffffffffffffffff6101408e0135111561461e57600080fd5b61462f8e6101408f01358f0161414c565b915061463e6101608e01613e60565b90509295989b509295989b509295989b565b600181811c9082168061466457607f821691505b6020821081141561468557634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561469d57600080fd5b815161122f8161423e565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156146e8576146e86146be565b5060010190565b60006020828403121561470157600080fd5b815161122f816142c1565b60006001600160a01b0380861683526060602084015261472f6060840186613e21565b9150808416604084015250949350505050565b6001600160a01b0384168152600060206060818401526000855481600182811c91508083168061477357607f831692505b85831081141561479157634e487b7160e01b85526022600452602485fd5b60608801839052608088018180156147b057600181146147c1576147ec565b60ff198616825287820196506147ec565b60008c81526020902060005b868110156147e6578154848201529085019089016147cd565b83019750505b5050506001600160a01b0388166040880152509193506141d292505050565b805169ffffffffffffffffffff81168114613e6b57600080fd5b600080600080600060a0868803121561483d57600080fd5b6148468661480b565b94506020860151935060408601519250606086015191506148696080870161480b565b90509295509295909350565b60006020828403121561488757600080fd5b815167ffffffffffffffff81111561489e57600080fd5b8201601f810184136148af57600080fd5b80516148bd613f9c82614124565b8181528560208385010111156148d257600080fd5b612792826020830160208601613df5565b6000828210156148f5576148f56146be565b500390565b6000821982111561490d5761490d6146be565b500190565b60008261492f57634e487b7160e01b600052601260045260246000fd5b50049056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220b91e8d91242c0e80bca76834d5efb0dfc6ad6520a058cd8d275b996ad84fd9b664736f6c63430008080033","optimization_enabled":true,"verified_twin_address_hash":null,"is_verified":true,"github_repository_metadata":null,"compiler_settings":{"evmVersion":"petersburg","libraries":{},"metadata":{"bytecodeHash":"ipfs","useLiteralContent":false},"optimizer":{"enabled":true,"runs":300},"outputSelection":{"*":{"":["*"],"*":["*"]}},"remappings":["@chainlink/contracts/=dependencies/@chainlink-contracts-1.3.0/","@gnosis.pm/safe-contracts/=dependencies/@gnosis-pm-safe-contracts-1.3.0/","@gnosis.pm/zodiac/=dependencies/gnosisguild-zodiac-4.0.5/","@openzeppelin-contracts/=dependencies/@openzeppelin-contracts-4.9.3/","@openzeppelin/contracts-upgradeable/=dependencies/@openzeppelin-contracts-upgradeable-4.9.3/","@openzeppelin/contracts-upgradeable/access/=dependencies/@openzeppelin-contracts-upgradeable-5.0.0/access/","@openzeppelin/contracts/=dependencies/@openzeppelin-contracts-4.9.3/","@rari-capital/solmate/=dependencies/solmate-6.8.0/","@safe-global/safe-contracts/=dependencies/safe-global-safe-smart-account-1.4.1-3/","@sygnum/solidity-base-contracts/=apps/baseContracts/","forge-std/=dependencies/forge-std-1.9.4/src/","openzeppelin-contracts-upgradeable/=dependencies/@openzeppelin-contracts-upgradeable-4.9.3/","operator-filter-registry/=dependencies/projectopensea-operator-filter-registry-1.4.2/","@chainlink-contracts-1.3.0/=dependencies/@chainlink-contracts-1.3.0/src/","@gnosis-pm-safe-contracts-1.3.0/=dependencies/@gnosis-pm-safe-contracts-1.3.0/contracts/","@openzeppelin-contracts-4.9.3/=dependencies/@openzeppelin-contracts-4.9.3/","@openzeppelin-contracts-upgradeable-4.9.3/=dependencies/@openzeppelin-contracts-upgradeable-4.9.3/","@openzeppelin-contracts-upgradeable-5.0.0/=dependencies/@openzeppelin-contracts-upgradeable-5.0.0/","forge-std-1.9.4/=dependencies/forge-std-1.9.4/src/","gnosisguild-zodiac-4.0.5/=dependencies/gnosisguild-zodiac-4.0.5/contracts/","projectopensea-operator-filter-registry-1.4.2/=dependencies/projectopensea-operator-filter-registry-1.4.2/src/","safe-global-safe-smart-account-1.4.1-3/=dependencies/safe-global-safe-smart-account-1.4.1-3/","solmate-6.8.0/=dependencies/solmate-6.8.0/src/"],"viaIR":false},"optimization_runs":300,"sourcify_repo_url":null,"decoded_constructor_args":null,"compiler_version":"v0.8.8+commit.dddeac2f","is_verified_via_verifier_alliance":false,"verified_at":"2026-04-10T15:08:02.580786Z","implementations":[],"proxy_type":null,"external_libraries":[],"creation_bytecode":"0x608060405234801561001057600080fd5b506040805460ff60a01b19169055614a238061002d6000396000f3fe608060405234801561001057600080fd5b50600436106105f95760003560e01c806370eca15a11610314578063aa5a61bd116101b2578063db060b73116100f9578063ea3f7bdb116100a2578063f017625a1161007c578063f017625a14610cc7578063f8fa842b14610cda578063f9f05cd114610ce257600080fd5b8063ea3f7bdb14610c88578063eaa5407e14610c99578063ef430aa614610ca157600080fd5b8063e5839836116100d3578063e583983614610c41578063e67c876e14610c6d578063e6c97fcb14610c7557600080fd5b8063db060b7314610bed578063dd62ed3e14610c00578063e54f088014610c3957600080fd5b8063b98aa3121161015b578063d051665011610135578063d051665014610b97578063d0ea5f4d14610bba578063d8b153af14610bcd57600080fd5b8063b98aa31214610b6b578063bff852fa14610b7c578063c4d66de814610b8457600080fd5b8063b316675e1161018c578063b316675e14610b3d578063b782e30314610b45578063b962e03414610b5857600080fd5b8063aa5a61bd14610b04578063b187bd2614610b18578063b1dab91514610b2a57600080fd5b80638973d42a11610276578063980c35d11161021f5780639ee0b77d116101f95780639ee0b77d14610ad5578063a457c2d714610ade578063a9059cbb14610af157600080fd5b8063980c35d114610a9b578063981b24d014610aaf57806398cd615314610ac257600080fd5b806395d89b411161025057806395d89b4114610a57578063960313bb14610a5f57806397130fc414610a7257600080fd5b80638973d42a14610a1e5780638feaade414610a3157806395296c7814610a4457600080fd5b80638456cb59116102d85780638535a56b116102b25780638535a56b146109f6578063869c0be4146109fe57806389025f5f14610a0b57600080fd5b80638456cb59146109c857806384a9d4d7146109d057806384da92a7146109e357600080fd5b806370eca15a1461096957806371130bb11461097c578063783124351461098f57806379cc6790146109a25780637acf4892146109b557600080fd5b806338e454b11161049c5780634ee2cd7e116103e35780635ff2adc71161038c5780636857310711610366578063685731071461091a5780636d70f7ae1461092d57806370a082311461094057600080fd5b80635ff2adc7146108dd578063604d996e146108f6578063668f6ace1461090757600080fd5b80635a023693116103bd5780635a023693146108b15780635cd8a76b146108c45780635ead86c6146108cc57600080fd5b80634ee2cd7e14610883578063537f53121461089657806354a08606146108a957600080fd5b80634039ad0d1161044557806342966c681161041f57806342966c681461084c578063485cc9551461085f57806348fe28071461087257600080fd5b80634039ad0d1461081e57806340c10f1914610831578063422f8c0a1461084457600080fd5b80633af32abf116104765780633af32abf146107fb5780633c130d901461080e5780633f4ba83a1461081657600080fd5b806338e454b1146107d5578063392e53cd146107dd57806339509351146107e857600080fd5b80631c6bbabc1161056057806326cb32b7116105095780633117a761116104e35780633117a76114610796578063313ce567146107a957806334cdcf26146107c257600080fd5b806326cb32b71461075f57806329518514146107725780632e4ea2451461078557600080fd5b8063208929d11161053a578063208929d11461072657806323b872dd1461073957806324d7806c1461074c57600080fd5b80631c6bbabc146106f15780631d143848146107025780631dd319cb1461071357600080fd5b806313646d58116105c257806318c20ecb1161059c57806318c20ecb146106a75780631bc051a9146106b95780631bd3fce5146106cc57600080fd5b806313646d581461067a5780631745145e1461068257806318160ddd1461069557600080fd5b8062f55d9d146105fe57806306fdde0314610613578063093abad014610631578063095ea7b31461064457806312f2614014610667575b600080fd5b61061161060c366004613dd8565b610cf5565b005b61061b610d5f565b6040516106289190613e4d565b60405180910390f35b61061161063f366004613e70565b610df1565b610657610652366004613e70565b610eeb565b6040519015158152602001610628565b610611610675366004613dd8565b610f00565b610611610f99565b610611610690366004613dd8565b61100b565b6005545b604051908152602001610628565b60495461065790610100900460ff1681565b6106116106c7366004613eb4565b6110a4565b6044546001600160a01b03165b6040516001600160a01b039091168152602001610628565b603c546001600160a01b03166106d9565b603e546001600160a01b03166106d9565b610611610721366004613e70565b61113f565b610611610734366004613dd8565b611186565b610657610747366004613ecf565b61121f565b61065761075a366004613dd8565b611236565b61065761076d366004613dd8565b6112b5565b610657610780366004613dd8565b6112e8565b6040546001600160a01b03166106d9565b6106116107a436600461404a565b61139f565b60025460ff165b60405160ff9091168152602001610628565b6106576107d0366004613dd8565b61146c565b61061161149f565b60085460ff16610657565b6106576107f6366004613e70565b6114dc565b610657610809366004613dd8565b6114e8565b61061b61151b565b6106116115a9565b61065761082c366004613dd8565b611656565b61061161083f366004613e70565b611689565b6107b0611723565b61061161085a3660046140d2565b6117cf565b61061161086d3660046140eb565b611844565b6042546001600160a01b03166106d9565b610699610891366004613e70565b61185d565b6106116108a436600461419d565b61187f565b6106116118ec565b6106116108bf366004613dd8565b61192c565b610611611976565b603b546001600160a01b03166106d9565b60495464010000000090046001600160a01b03166106d9565b6041546001600160a01b03166106d9565b610657610915366004613dd8565b6119b0565b6106116109283660046141da565b6119e3565b61065761093b366004613dd8565b611a86565b61069961094e366004613dd8565b6001600160a01b031660009081526003602052604090205490565b61061161097736600461419d565b611ab9565b61061161098a366004613dd8565b611b01565b61061161099d366004613dd8565b611b33565b6106116109b0366004613e70565b611bb5565b604054600160a01b900460ff1615610657565b610611611c06565b6106116109de36600461424c565b611cbb565b6106116109f136600461419d565b611d23565b610611611d91565b6049546106579060ff1681565b610657610a19366004613dd8565b611dfc565b610611610a2c366004613e70565b611e2f565b610611610a3f366004614293565b611f21565b610611610a523660046142db565b611fcf565b61061b6120a4565b610611610a6d366004613ecf565b6120b3565b610699610a80366004613dd8565b6001600160a01b031660009081526046602052604090205490565b60495461065790600160c01b900460ff1681565b610699610abd3660046140d2565b612136565b610611610ad036600461419d565b612143565b61069960455481565b610657610aec366004613e70565b6121ac565b610657610aff366004613e70565b6121b8565b604954610657906301000000900460ff1681565b604054600160a01b900460ff16610657565b610611610b38366004613dd8565b6121c4565b61061161225b565b6049546106579062010000900460ff1681565b610611610b663660046141da565b6122c4565b603f546001600160a01b03166106d9565b61061b612362565b610611610b92366004613dd8565b612371565b610657610ba5366004613dd8565b60476020526000908152604090205460ff1681565b610657610bc8366004613dd8565b612414565b610699610bdb366004613dd8565b60466020526000908152604090205481565b610611610bfb366004613ecf565b612447565b610699610c0e3660046140eb565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205490565b610699612478565b610657610c4f366004613dd8565b6001600160a01b031660009081526047602052604090205460ff1690565b61061161252c565b610611610c833660046143da565b612595565b6043546001600160a01b03166106d9565b604554610699565b603c54600160a01b900460e01b6040516001600160e01b03199091168152602001610628565b610611610cd536600461419d565b6125b0565b61061b61261e565b610611610cf0366004614502565b6126d6565b610cfe33611a86565b610d1b5760405163aa49d14f60e01b815260040160405180910390fd5b60405130906001600160a01b0383169033907fe76ea4db1aaa54cf4eabf7e9802fcf1c558685039d5ecb40bea5d29640a4b6a690600090a4806001600160a01b0316ff5b606060008054610d6e90614650565b80601f0160208091040260200160405190810160405280929190818152602001828054610d9a90614650565b8015610de75780601f10610dbc57610100808354040283529160200191610de7565b820191906000526020600020905b815481529060010190602001808311610dca57829003601f168201915b5050505050905090565b610dfa33611dfc565b158015610e0d5750610e0b33611a86565b155b15610e2b5760405163caf5634560e01b815260040160405180910390fd5b6001600160a01b038216600090815260036020526040902054610e4e9082612700565b6001600160a01b038316600090815260036020908152604080832093909355604690522054610e7d908261270c565b6001600160a01b038316600090815260466020526040902055604554610ea3908261270c565b6045556040518181526001600160a01b0383169033907ff4d61bf10cd7634ffb91cebcbd1828d9b0debaec1f35f00fac329be576fa795d906020015b60405180910390a35050565b6000610ef78383612718565b90505b92915050565b610f0933611236565b610f265760405163590f633960e01b815260040160405180910390fd5b6001600160a01b038116610f4d5760405163599969f960e11b815260040160405180910390fd5b604280546001600160a01b0319166001600160a01b03831690811790915560405133907f78ffa9fe91e0bddf459ef5a9ea969b71677013f719cdb542f2ed55a9e26e3e2690600090a350565b6042546001600160a01b0316610fc25760405163599969f960e11b815260040160405180910390fd5b6042546001600160a01b03163314610ff457604051631076480560e21b81523360048201526024015b60405180910390fd5b604254611009906001600160a01b031661279b565b565b61101433611236565b6110315760405163590f633960e01b815260040160405180910390fd5b6001600160a01b03811661105857604051638d9b385f60e01b815260040160405180910390fd5b603c80546001600160a01b0319166001600160a01b03831690811790915560405133907f01e6311290e7fb795a47761d6ca6a39b9c898bbf2e8b0e40211aa9f2f6c0202990600090a350565b6110ad33611a86565b6110ca5760405163aa49d14f60e01b815260040160405180910390fd5b603c805463ffffffff60a01b1916600160a01b60e084811c82029290921792839055604080513381526001600160e01b03199290940490921b16602083015230908201527feb9a07614128a8102a8d0f1200e4c49a878b681e4257b38e11dd627ba3807416906060015b60405180910390a150565b611149828261280e565b6040518181526001600160a01b0383169033907f27d99300c6c6789f01bf643b2832d5f98653c4c2166dfce0a8ed822b049f307390602001610edf565b61118f33611236565b6111ac5760405163590f633960e01b815260040160405180910390fd5b6001600160a01b0381166111d357604051631bc7763360e31b815260040160405180910390fd5b604480546001600160a01b0319166001600160a01b03831690811790915560405133907f0cac6307c5182808dbebb49424a803a786b8065475a3004af7848cce417cccac90600090a350565b600061122c848484612861565b90505b9392505050565b603b54604051630935e01b60e21b81526001600160a01b03838116600483015260009216906324d7806c906024015b60206040518083038186803b15801561127d57600080fd5b505afa158015611291573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610efa919061468b565b603b546040516326cb32b760e01b81526001600160a01b03838116600483015260009216906326cb32b790602401611265565b603b546040516336b87bd760e11b81526001600160a01b0383811660048301526000921690636d70f7ae906024015b60206040518083038186803b15801561132f57600080fd5b505afa158015611343573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611367919061468b565b80610efa5750603b54604051631a66e79360e11b81526001600160a01b038481166004830152909116906334cdcf2690602401611265565b805183511415806113b257508051825114155b156113d05760405163200e1d7760e11b815260040160405180910390fd5b825161010010156113f457604051637d8e673560e01b815260040160405180910390fd5b60005b835181101561146657611456848281518110611415576114156146a8565b602002602001015184838151811061142f5761142f6146a8565b6020026020010151848481518110611449576114496146a8565b60200260200101516120b3565b61145f816146d4565b90506113f7565b50505050565b603b54604051631a66e79360e11b81526001600160a01b03838116600483015260009216906334cdcf2690602401611265565b60495462010000900460ff16156114c9576040516304cc1bdb60e01b815260040160405180910390fd5b6049805462ff0000191662010000179055565b6000610ef78383612923565b604154604051633af32abf60e01b81526001600160a01b0383811660048301526000921690633af32abf90602401611265565b6048805461152890614650565b80601f016020809104026020016040519081016040528092919081815260200182805461155490614650565b80156115a15780601f10611576576101008083540402835291602001916115a1565b820191906000526020600020905b81548152906001019060200180831161158457829003601f168201915b505050505081565b6115b233611a86565b1580156115c557506115c333611656565b155b80156115d757506115d53361146c565b155b156115f557604051635dc4e41160e11b815260040160405180910390fd5b604054600160a01b900460ff1661161e5760405162c5619760e61b815260040160405180910390fd5b6040805460ff60a01b191681555133907f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa90600090a2565b603f54604051634039ad0d60e01b81526001600160a01b0383811660048301526000921690634039ad0d90602401611265565b6116923361146c565b156116dc576001600160a01b03821660009081526047602052604090205460ff16156116dc57604051637aae826960e11b81526001600160a01b0383166004820152602401610feb565b6116e6828261299d565b6040518181526001600160a01b0383169033907f9d228d69b5fdb8d273a2336f8fb8612d039631024ea9bf09c424a9503aa078f090602001610edf565b60495460009064010000000090046001600160a01b03166117445750600090565b604960049054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561179257600080fd5b505afa1580156117a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ca91906146ef565b905090565b3360009081526047602052604090205460ff16156118025760405163ad57726160e01b8152336004820152602401610feb565b61180c33826129f0565b60405181815233907f696de425f79f4a40bc6d2122ca50507f0efbeabbff86a84871b7196ab8ea8df79060200160405180910390a250565b604051633c144f1f60e21b815260040160405180910390fd5b6001600160a01b0382166000908152600660205260408120610ef79083612a39565b61188833611a86565b6118a55760405163aa49d14f60e01b815260040160405180910390fd5b80516118b8906001906020840190613d2a565b507fac570b70a8feb5042803796f5f7d69fb108f43e4dfdb31ad5bb4cae524b3cbaa3382306040516111349392919061470c565b6049546301000000900460ff16156119175760405163072e5a6360e51b815260040160405180910390fd5b6049805463ff00000019166301000000179055565b604954600160c01b900460ff16156119575760405163a229970560e01b815260040160405180910390fd5b61196081612ba2565b506049805460ff60c01b1916600160c01b179055565b604954610100900460ff161561199f57604051631bfe2c0b60e31b815260040160405180910390fd5b6049805461ff001916610100179055565b603b54604051633347b56760e11b81526001600160a01b038381166004830152600092169063668f6ace90602401611265565b8051825114611a055760405163200e1d7760e11b815260040160405180910390fd5b81516101001015611a2957604051637d8e673560e01b815260040160405180910390fd5b60005b8251811015611a8157611a71838281518110611a4a57611a4a6146a8565b6020026020010151838381518110611a6457611a646146a8565b6020026020010151611689565b611a7a816146d4565b9050611a2c565b505050565b603b546040516336b87bd760e11b81526001600160a01b0383811660048301526000921690636d70f7ae90602401611265565b60495460ff1615611add5760405163cc54c66160e01b815260040160405180910390fd5b8051611af0906048906020840190613d2a565b50506049805460ff19166001179055565b611b0a33611236565b611b275760405163590f633960e01b815260040160405180910390fd5b611b3081612ba2565b50565b611b3c33611a86565b611b595760405163aa49d14f60e01b815260040160405180910390fd5b603e80546001600160a01b0319166001600160a01b03831690811790915560408051338152602081019290925230908201527f7517f2ce2a7974ec02b566e359e3fb3b319c5b3cc755606f35cbf79f93601e9590606001611134565b611bbf8282612c07565b816001600160a01b03167f696de425f79f4a40bc6d2122ca50507f0efbeabbff86a84871b7196ab8ea8df782604051611bfa91815260200190565b60405180910390a25050565b611c0f33611a86565b158015611c225750611c2033611656565b155b8015611c345750611c323361146c565b155b15611c5257604051635dc4e41160e11b815260040160405180910390fd5b604054600160a01b900460ff1615611c7d5760405163928dfa7760e01b815260040160405180910390fd5b6040805460ff60a01b1916600160a01b1781555133907f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890600090a2565b61010082511115611ce457815160405163f33e36a960e01b8152600401610feb91815260200190565b60005b8251811015611a8157611d13838281518110611d0557611d056146a8565b602002602001015183611f21565b611d1c816146d4565b9050611ce7565b611d2c33611a86565b611d495760405163aa49d14f60e01b815260040160405180910390fd5b8051611d5c906000906020840190613d2a565b507fcf335673fa5d049c27e726ba4d58524070f407e87f0fc2f22c4fce415b2c84ac3360003060405161113493929190614742565b603c546001600160a01b0316611dba57604051638d9b385f60e01b815260040160405180910390fd5b603c546001600160a01b03163314611de7576040516385df92a760e01b8152336004820152602401610feb565b603c54611009906001600160a01b0316612c11565b6043546040516389025f5f60e01b81526001600160a01b03838116600483015260009216906389025f5f90602401611265565b611e3833611dfc565b158015611e4b5750611e4933611a86565b155b15611e695760405163caf5634560e01b815260040160405180910390fd5b6001600160a01b038216600090815260036020526040902054611e8c908261270c565b6001600160a01b038316600090815260036020908152604080832093909355604690522054611ebb9082612700565b6001600160a01b038316600090815260466020526040902055604554611ee19082612700565b6045556040518181526001600160a01b0383169033907f8100ea465dd47f3401ddd3d8429111ea02ccb1f745cfbf4479fc4d33f90fd37d90602001610edf565b816001600160a01b038116611f49576040516350a5d4c960e01b815260040160405180910390fd5b611f5233611a86565b611f6f5760405163aa49d14f60e01b815260040160405180910390fd5b6001600160a01b038316600081815260476020908152604091829020805460ff191686151590811790915591519182527f3c143a3c8cc9eafd41748a32abe319b06bd5b995c988fa06db8d1ef4e5841edf910160405180910390a2505050565b600854610100900460ff1615808015611fe85750303b15155b8015611ff6575060085460ff165b1561201457604051635428559160e01b815260040160405180910390fd5b801561202a576008805461ffff19166101011790555b61203385612371565b61203c8461279b565b61204583612c84565b61204e82612cf7565b61205c8b8b8b8b8b8b612d6a565b8015612097576008805461ff00191690556040517f5daa87a0e9463431830481fd4b6e3403442dfb9a12b9c07597e9f61d50b633c890600090a15b5050505050505050505050565b606060018054610d6e90614650565b6120bc336112e8565b6120d9576040516360e6021760e01b815260040160405180910390fd5b6120e4838383612df8565b816001600160a01b0316836001600160a01b03167fc3a0c22b0aeeb7a97bafeabf2b1c9611b092e8f739d791180a7f299fcd1f41fb8360405161212991815260200190565b60405180910390a3505050565b6000610efa600783612a39565b61214c33611a86565b6121695760405163aa49d14f60e01b815260040160405180910390fd5b805161217c906048906020840190613d2a565b507f89e5189514b6402e76dacf643a35960a8b0a3302552103511c83cb42b07b25ab816040516111349190613e4d565b6000610ef78383612e72565b6000610ef78383612eec565b6121cd33611236565b6121ea5760405163590f633960e01b815260040160405180910390fd5b6001600160a01b0381166122115760405163919ee6f760e01b815260040160405180910390fd5b604080546001600160a01b0319166001600160a01b0383169081178255905133907f3f3352e835b79539c317572a5adbfcc149494437e8975906a5a2274c3d06b52790600090a350565b6040546001600160a01b031661228457604051630105355160e01b815260040160405180910390fd5b6040546001600160a01b031633146122af57604051632eebd0d360e11b815260040160405180910390fd5b604054611009906001600160a01b0316612c84565b80518251146122e65760405163200e1d7760e11b815260040160405180910390fd5b8151610100101561230a57604051637d8e673560e01b815260040160405180910390fd5b60005b8251811015611a815761235283828151811061232b5761232b6146a8565b6020026020010151838381518110612345576123456146a8565b602002602001015161113f565b61235b816146d4565b905061230d565b6060603d8054610d6e90614650565b600854610100900460ff161580801561238a5750303b15155b8015612398575060085460ff165b156123b657604051635428559160e01b815260040160405180910390fd5b80156123cc576008805461ffff19166101011790555b6123d582612c11565b8015612410576008805461ff00191690556040517f5daa87a0e9463431830481fd4b6e3403442dfb9a12b9c07597e9f61d50b633c890600090a15b5050565b603b54604051630935e01b60e21b81526001600160a01b03838116600483015260009216906324d7806c90602401611317565b61245033611656565b61246d5760405163c6fa043960e01b815260040160405180910390fd5b611a81838383612f66565b60495460009064010000000090046001600160a01b03166124995750600090565b6000604960049054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b1580156124e957600080fd5b505afa1580156124fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125219190614825565b509195945050505050565b6044546001600160a01b031661255557604051638ec61c7360e01b815260040160405180910390fd5b6044546001600160a01b031633146125805760405163031cd30b60e51b815260040160405180910390fd5b604454611009906001600160a01b0316612cf7565b6125a88b8b8b8b8b8b8b8b8b8b8b613082565b6120976118ec565b6125b933611a86565b6125d65760405163aa49d14f60e01b815260040160405180910390fd5b80516125e990603d906020840190613d2a565b507f3e316a308ab2ebf046a9c4722c296ee905b8ee17f41f765246a2a7d374833ffa33603d3060405161113493929190614742565b60495460609064010000000090046001600160a01b031661264c575060408051602081019091526000815290565b604960049054906101000a90046001600160a01b03166001600160a01b0316637284e4166040518163ffffffff1660e01b815260040160006040518083038186803b15801561269a57600080fd5b505afa1580156126ae573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526117ca9190810190614875565b6126e98c8c8c8c8c8c8c8c8c8c8c612595565b6126f28161192c565b505050505050505050505050565b6000610ef782846148e3565b6000610ef782846148fa565b3360008181526047602052604081205490919060ff161561274c5760405163094ba74560e31b815260040160405180910390fd5b6001600160a01b038416600090815260476020526040902054849060ff16156127885760405163094ba74560e31b815260040160405180910390fd5b612792858561309d565b95945050505050565b6001600160a01b0381166127c25760405163599969f960e11b815260040160405180910390fd5b604180546001600160a01b0319166001600160a01b03831690811790915560405133907ff10a6c2d7d8ac14e2134743353b0c65c0e1ee214816c96176a1bb730a34729ad90600090a350565b61281733611a86565b80156128275750612827826114e8565b15612857576000811161284d57604051631d23624f60e31b815260040160405180910390fd5b61241082826130f7565b612410828261313d565b3360008181526047602052604081205490919060ff16156128955760405163094ba74560e31b815260040160405180910390fd5b6001600160a01b038516600090815260476020526040902054859060ff16156128d15760405163094ba74560e31b815260040160405180910390fd5b6001600160a01b038516600090815260476020526040902054859060ff161561290d5760405163094ba74560e31b815260040160405180910390fd5b612918878787613147565b979650505050505050565b3360008181526047602052604081205490919060ff16156129575760405163094ba74560e31b815260040160405180910390fd5b6001600160a01b038416600090815260476020526040902054849060ff16156129935760405163094ba74560e31b815260040160405180910390fd5b61279285856131c9565b6129a633611a86565b80156129b657506129b6826114e8565b156129e657600081116129dc5760405163512bc75960e01b815260040160405180910390fd5b6124108282613223565b612410828261322d565b6129f933611a86565b8015612a095750612a09826114e8565b15612a2f576000811161284d57604051631d23624f60e31b815260040160405180910390fd5b6124108282613237565b8154600090612a4a57506000610efa565b82548390612a59906001612700565b81548110612a6957612a696146a8565b9060005260206000209060020201600001548210612ab95782548390612a90906001612700565b81548110612aa057612aa06146a8565b9060005260206000209060020201600101549050610efa565b82600081548110612acc57612acc6146a8565b906000526020600020906002020160000154821015612aed57506000610efa565b82546000908190612aff906001612700565b90505b81811115612b74576000612b2c6002612b266001612b20868861270c565b9061270c565b90613241565b905084868281548110612b4157612b416146a8565b90600052602060002090600202016000015411612b6057809250612b6e565b612b6b816001612700565b91505b50612b02565b848281548110612b8657612b866146a8565b9060005260206000209060020201600101549250505092915050565b6049805477ffffffffffffffffffffffffffffffffffffffff0000000019166401000000006001600160a01b038416908102919091179091556040517f1fad3e0b1198eb0a3c486786301ac1f05c1403d85a593433dc1424fd0a2d5e2a90600090a250565b612410828261324d565b6001600160a01b038116612c3857604051638d9b385f60e01b815260040160405180910390fd5b603b80546001600160a01b0319166001600160a01b03831690811790915560405133907f581e9e5016a25985d2da9da423c68d9946de634ff0e3447eaaa9575d135e819e90600090a350565b6001600160a01b038116612cab5760405163919ee6f760e01b815260040160405180910390fd5b603f80546001600160a01b0319166001600160a01b03831690811790915560405133907f2062717208704e88e492fbeeade423dbb92afbc0429f402e121c31050b16ef2290600090a350565b6001600160a01b038116612d1e57604051631bc7763360e31b815260040160405180910390fd5b604380546001600160a01b0319166001600160a01b03831690811790915560405133907f7add599f7c2b8d78adb65f05bacace872bd5eb2312055ecae19f055c95d03de790600090a350565b8551612d7d906000906020890190613d2a565b508451612d91906001906020880190613d2a565b506002805460ff191660ff8616179055603c805463ffffffff60a01b1916600160a01b60e086901c021790558151612dd090603d906020850190613d2a565b50603e80546001600160a01b0319166001600160a01b03929092169190911790555050505050565b612e038383836132c4565b612e166007612e1160055490565b61344a565b6001600160a01b0383166000908152600660209081526040808320600390925290912054612e44919061344a565b6001600160a01b0382166000908152600660209081526040808320600390925290912054611a81919061344a565b3360008181526047602052604081205490919060ff1615612ea65760405163094ba74560e31b815260040160405180910390fd5b6001600160a01b038416600090815260476020526040902054849060ff1615612ee25760405163094ba74560e31b815260040160405180910390fd5b6127928585613502565b3360008181526047602052604081205490919060ff1615612f205760405163094ba74560e31b815260040160405180910390fd5b6001600160a01b038416600090815260476020526040902054849060ff1615612f5c5760405163094ba74560e31b815260040160405180910390fd5b612792858561355c565b6001600160a01b038316612fc85760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610feb565b6001600160a01b0382166130295760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610feb565b6001600160a01b0383811660008181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259101612129565b6130958b8b8b8b8b8b8b8b8b8b8b6135b6565b61209761149f565b6000336130a9816114e8565b6130c65760405163d11eb83160e01b815260040160405180910390fd5b836130d0816114e8565b6130ed5760405163d11eb83160e01b815260040160405180910390fd5b61279285856135d1565b6131018282613609565b61310f6007612e1160055490565b6001600160a01b0382166000908152600660209081526040808320600390925290912054612410919061344a565b612410828261370d565b600033613153816114e8565b6131705760405163d11eb83160e01b815260040160405180910390fd5b8461317a816114e8565b6131975760405163d11eb83160e01b815260040160405180910390fd5b846131a1816114e8565b6131be5760405163d11eb83160e01b815260040160405180910390fd5b612918878787613733565b6000826131d5816114e8565b6131f25760405163d11eb83160e01b815260040160405180910390fd5b336131fc816114e8565b6132195760405163d11eb83160e01b815260040160405180910390fd5b612792858561376c565b61310182826137a4565b612410828261387e565b61241082826138af565b6000610ef78284614912565b3360008181526047602052604090205460ff161561327e5760405163094ba74560e31b815260040160405180910390fd5b6001600160a01b038316600090815260476020526040902054839060ff16156132ba5760405163094ba74560e31b815260040160405180910390fd5b61146684846138e0565b6001600160a01b0383166133285760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610feb565b6001600160a01b03821661338a5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610feb565b6133c781604051806060016040528060268152602001614957602691396001600160a01b0386166000908152600360205260409020549190613938565b6001600160a01b0380851660009081526003602052604080822093909355908416815220546133f6908261270c565b6001600160a01b0380841660008181526003602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906121299085815260200190565b815415806134885750815443908390613464906001612700565b81548110613474576134746146a8565b906000526020600020906002020160000154105b156134c857604080518082019091524381526020808201928352835460018082018655600095865291909420915160029094029091019283559051910155565b8154819083906134d9906001612700565b815481106134e9576134e96146a8565b9060005260206000209060020201600101819055505050565b60008261350e816114e8565b61352b5760405163d11eb83160e01b815260040160405180910390fd5b33613535816114e8565b6135525760405163d11eb83160e01b815260040160405180910390fd5b6127928585613964565b600033613568816114e8565b6135855760405163d11eb83160e01b815260040160405180910390fd5b8361358f816114e8565b6135ac5760405163d11eb83160e01b815260040160405180910390fd5b612792858561399c565b6135c98b8b8b8b8b8b8b8b8b8b8b6139d4565b612097611976565b604054600090600160a01b900460ff16156135ff5760405163928dfa7760e01b815260040160405180910390fd5b610ef783836139ef565b6001600160a01b0382166136695760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610feb565b6136a681604051806060016040528060228152602001614935602291396001600160a01b0385166000908152600360205260409020549190613938565b6001600160a01b0383166000908152600360205260409020556005546136cc9082612700565b6005556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610edf565b61371633611a86565b6132375760405163aa49d14f60e01b815260040160405180910390fd5b604054600090600160a01b900460ff16156137615760405163928dfa7760e01b815260040160405180910390fd5b61122c848484613a05565b604054600090600160a01b900460ff161561379a5760405163928dfa7760e01b815260040160405180910390fd5b610ef78383613a7e565b6001600160a01b0382166137fa5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610feb565b600554613807908261270c565b6005556001600160a01b03821660009081526003602052604090205461382d908261270c565b6001600160a01b0383166000818152600360205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610edf9085815260200190565b81613888816114e8565b6138a55760405163d11eb83160e01b815260040160405180910390fd5b611a818383613ab9565b816138b9816114e8565b6138d65760405163d11eb83160e01b815260040160405180910390fd5b611a818383613b0a565b336138ea816114e8565b6139075760405163d11eb83160e01b815260040160405180910390fd5b82613911816114e8565b61392e5760405163d11eb83160e01b815260040160405180910390fd5b6114668484613b35565b6000818484111561395c5760405162461bcd60e51b8152600401610feb9190613e4d565b505050900390565b604054600090600160a01b900460ff16156139925760405163928dfa7760e01b815260040160405180910390fd5b610ef78383613b6a565b604054600090600160a01b900460ff16156139ca5760405163928dfa7760e01b815260040160405180910390fd5b610ef78383613bb9565b6139e68b8b8b8b8b8b8b8b8b8b611fcf565b61209781611ab9565b60006139fc338484612f66565b50600192915050565b6000613a12848484613c28565b9050613a226007612e1160055490565b6001600160a01b0384166000908152600660209081526040808320600390925290912054613a50919061344a565b6001600160a01b038316600090815260066020908152604080832060039092529091205461122f919061344a565b3360008181526004602090815260408083206001600160a01b038716845290915281205490916139fc918590613ab4908661270c565b612f66565b613ac2336112e8565b613adf576040516360e6021760e01b815260040160405180910390fd5b60008111613b005760405163512bc75960e01b815260040160405180910390fd5b6124108282613c9d565b604054600160a01b900460ff161561284d5760405163928dfa7760e01b815260040160405180910390fd5b604054600160a01b900460ff1615613b605760405163928dfa7760e01b815260040160405180910390fd5b6124108282613cc8565b60006139fc3384613ab4856040518060600160405280602581526020016149c9602591393360009081526004602090815260408083206001600160a01b038d1684529091529020549190613938565b6000613bc58383613cd2565b9050613bd56007612e1160055490565b336000908152600660209081526040808320600390925290912054613bfa919061344a565b6001600160a01b0383166000908152600660209081526040808320600390925290912054610efa919061344a565b6000613c358484846132c4565b613c938433613ab48560405180606001604052806028815260200161497d602891396001600160a01b038a16600090815260046020526040812090335b6001600160a01b031681526020810191909152604001600020549190613938565b5060019392505050565b604054600160a01b900460ff16156129dc5760405163928dfa7760e01b815260040160405180910390fd5b6131018282613cdf565b60006139fc3384846132c4565b613ce982826129f0565b6124108233613ab4846040518060600160405280602481526020016149a5602491396001600160a01b03881660009081526004602052604081209033613c72565b828054613d3690614650565b90600052602060002090601f016020900481019282613d585760008555613d9e565b82601f10613d7157805160ff1916838001178555613d9e565b82800160010185558215613d9e579182015b82811115613d9e578251825591602001919060010190613d83565b50613daa929150613dae565b5090565b5b80821115613daa5760008155600101613daf565b6001600160a01b0381168114611b3057600080fd5b600060208284031215613dea57600080fd5b813561122f81613dc3565b60005b83811015613e10578181015183820152602001613df8565b838111156114665750506000910152565b60008151808452613e39816020860160208601613df5565b601f01601f19169290920160200192915050565b602081526000610ef76020830184613e21565b8035613e6b81613dc3565b919050565b60008060408385031215613e8357600080fd5b8235613e8e81613dc3565b946020939093013593505050565b80356001600160e01b031981168114613e6b57600080fd5b600060208284031215613ec657600080fd5b610ef782613e9c565b600080600060608486031215613ee457600080fd5b8335613eef81613dc3565b92506020840135613eff81613dc3565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613f4f57613f4f613f10565b604052919050565b600067ffffffffffffffff821115613f7157613f71613f10565b5060051b60200190565b600082601f830112613f8c57600080fd5b81356020613fa1613f9c83613f57565b613f26565b82815260059290921b84018101918181019086841115613fc057600080fd5b8286015b84811015613fe4578035613fd781613dc3565b8352918301918301613fc4565b509695505050505050565b600082601f83011261400057600080fd5b81356020614010613f9c83613f57565b82815260059290921b8401810191818101908684111561402f57600080fd5b8286015b84811015613fe45780358352918301918301614033565b60008060006060848603121561405f57600080fd5b833567ffffffffffffffff8082111561407757600080fd5b61408387838801613f7b565b9450602086013591508082111561409957600080fd5b6140a587838801613f7b565b935060408601359150808211156140bb57600080fd5b506140c886828701613fef565b9150509250925092565b6000602082840312156140e457600080fd5b5035919050565b600080604083850312156140fe57600080fd5b823561410981613dc3565b9150602083013561411981613dc3565b809150509250929050565b600067ffffffffffffffff82111561413e5761413e613f10565b50601f01601f191660200190565b600082601f83011261415d57600080fd5b813561416b613f9c82614124565b81815284602083860101111561418057600080fd5b816020850160208301376000918101602001919091529392505050565b6000602082840312156141af57600080fd5b813567ffffffffffffffff8111156141c657600080fd5b6141d28482850161414c565b949350505050565b600080604083850312156141ed57600080fd5b823567ffffffffffffffff8082111561420557600080fd5b61421186838701613f7b565b9350602085013591508082111561422757600080fd5b5061423485828601613fef565b9150509250929050565b8015158114611b3057600080fd5b6000806040838503121561425f57600080fd5b823567ffffffffffffffff81111561427657600080fd5b61428285828601613f7b565b92505060208301356141198161423e565b600080604083850312156142a657600080fd5b82356142b181613dc3565b915060208301356141198161423e565b60ff81168114611b3057600080fd5b8035613e6b816142c1565b6000806000806000806000806000806101408b8d0312156142fb57600080fd5b8a3567ffffffffffffffff8082111561431357600080fd5b61431f8e838f0161414c565b9b5060208d013591508082111561433557600080fd5b6143418e838f0161414c565b9a5061434f60408e016142d0565b995061435d60608e01613e9c565b985060808d013591508082111561437357600080fd5b506143808d828e0161414c565b96505061438f60a08c01613e60565b945061439d60c08c01613e60565b93506143ab60e08c01613e60565b92506143ba6101008c01613e60565b91506143c96101208c01613e60565b90509295989b9194979a5092959850565b60008060008060008060008060008060006101608c8e0312156143fc57600080fd5b67ffffffffffffffff808d35111561441357600080fd5b6144208e8e358f0161414c565b9b508060208e0135111561443357600080fd5b6144438e60208f01358f0161414c565b9a5061445160408e016142d0565b995061445f60608e01613e9c565b98508060808e0135111561447257600080fd5b6144828e60808f01358f0161414c565b975061449060a08e01613e60565b965061449e60c08e01613e60565b95506144ac60e08e01613e60565b94506144bb6101008e01613e60565b93506144ca6101208e01613e60565b9250806101408e013511156144de57600080fd5b506144f08d6101408e01358e0161414c565b90509295989b509295989b9093969950565b6000806000806000806000806000806000806101808d8f03121561452557600080fd5b67ffffffffffffffff8d35111561453b57600080fd5b6145488e8e358f0161414c565b9b5067ffffffffffffffff60208e0135111561456357600080fd5b6145738e60208f01358f0161414c565b9a5061458160408e016142d0565b995061458f60608e01613e9c565b985067ffffffffffffffff60808e013511156145aa57600080fd5b6145ba8e60808f01358f0161414c565b97506145c860a08e01613e60565b96506145d660c08e01613e60565b95506145e460e08e01613e60565b94506145f36101008e01613e60565b93506146026101208e01613e60565b925067ffffffffffffffff6101408e0135111561461e57600080fd5b61462f8e6101408f01358f0161414c565b915061463e6101608e01613e60565b90509295989b509295989b509295989b565b600181811c9082168061466457607f821691505b6020821081141561468557634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561469d57600080fd5b815161122f8161423e565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156146e8576146e86146be565b5060010190565b60006020828403121561470157600080fd5b815161122f816142c1565b60006001600160a01b0380861683526060602084015261472f6060840186613e21565b9150808416604084015250949350505050565b6001600160a01b0384168152600060206060818401526000855481600182811c91508083168061477357607f831692505b85831081141561479157634e487b7160e01b85526022600452602485fd5b60608801839052608088018180156147b057600181146147c1576147ec565b60ff198616825287820196506147ec565b60008c81526020902060005b868110156147e6578154848201529085019089016147cd565b83019750505b5050506001600160a01b0388166040880152509193506141d292505050565b805169ffffffffffffffffffff81168114613e6b57600080fd5b600080600080600060a0868803121561483d57600080fd5b6148468661480b565b94506020860151935060408601519250606086015191506148696080870161480b565b90509295509295909350565b60006020828403121561488757600080fd5b815167ffffffffffffffff81111561489e57600080fd5b8201601f810184136148af57600080fd5b80516148bd613f9c82614124565b8181528560208385010111156148d257600080fd5b612792826020830160208601613df5565b6000828210156148f5576148f56146be565b500390565b6000821982111561490d5761490d6146be565b500190565b60008261492f57634e487b7160e01b600052601260045260246000fd5b50049056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220b91e8d91242c0e80bca76834d5efb0dfc6ad6520a058cd8d275b996ad84fd9b664736f6c63430008080033","name":"SygnumTokenLatest","is_blueprint":false,"license_type":"none","is_fully_verified":true,"is_verified_via_eth_bytecode_db":false,"language":"solidity","evm_version":"petersburg","can_be_visualized_via_sol2uml":true,"is_verified_via_sourcify":false,"additional_sources":[{"file_path":"dependencies/@openzeppelin-contracts-4.9.3/utils/Context.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n    function _msgSender() internal view virtual returns (address) {\n        return msg.sender;\n    }\n\n    function _msgData() internal view virtual returns (bytes calldata) {\n        return msg.data;\n    }\n}\n"},{"file_path":"dependencies/@chainlink-contracts-1.3.0/src/v0.8/shared/interfaces/AggregatorV3Interface.sol","source_code":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n// solhint-disable-next-line interface-starts-with-i\ninterface AggregatorV3Interface {\n  function decimals() external view returns (uint8);\n\n  function description() external view returns (string memory);\n\n  function version() external view returns (uint256);\n\n  function getRoundData(\n    uint80 _roundId\n  ) external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound);\n\n  function latestRoundData()\n    external\n    view\n    returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound);\n}\n"},{"file_path":"apps/baseContracts/contracts/helpers/ERC20/ERC20Destroyable.sol","source_code":"// SPDX-License-Identifier: UNLICENSED\n\n/**\n * @title ERC20Destroyable\n * @author Team 3301 <team3301@sygnum.com>\n * @notice Allows operator to destroy contract.\n */\n\npragma solidity ^0.8.0;\n\nimport \"../../role/base/Operatorable.sol\";\n\ncontract ERC20Destroyable is Operatorable {\n    event Destroyed(address indexed caller, address indexed account, address indexed contractAddress);\n\n    function destroy(address payable to) public onlyOperator {\n        emit Destroyed(msg.sender, to, address(this));\n        selfdestruct(to);\n    }\n}\n"},{"file_path":"apps/baseContracts/contracts/helpers/Initializable.sol","source_code":"// SPDX-License-Identifier: UNLICENSED\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\n * reused. This mechanism prevents re-execution of each \"step\" but allows the creation of new initialization steps in\n * case an upgrade adds a module that needs to be initialized.\n *\n * For example:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * contract MyToken is ERC20Upgradeable {\n *     function initialize() initializer public {\n *         __ERC20_init(\"MyToken\", \"MTK\");\n *     }\n * }\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\n *     function initializeV2() reinitializer(2) public {\n *         __ERC20Permit_init(\"MyToken\");\n *     }\n * }\n * ```\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n *\n * [CAUTION]\n * ====\n * Avoid leaving a contract uninitialized.\n *\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * /// @custom:oz-upgrades-unsafe-allow constructor\n * constructor() {\n *     _disableInitializers();\n * }\n * ```\n * ====\n */\n\npragma solidity ^0.8.0;\n\nabstract contract Initializable {\n    /**\n     * @dev Indicates that the contract has been initialized.\n     */\n    bool private initialized;\n\n    /**\n     * @dev Indicates that the contract is in the process of being initialized.\n     */\n    bool private initializing;\n\n    /**\n     * @dev Triggered when the contract has been initialized or reinitialized.\n     */\n    event Initialized();\n\n    /**\n     * @dev Error: \"Initializable: Contract instance has already been initialized\"\n     */\n    error InitializableContractAlreadyInitialized();\n\n    /**\n     * @dev Error: \"Initializable: Contract instance is initializing\"\n     */\n    error InitializableContractIsInitializing();\n\n    /**\n     * @dev Modifier to use in the initializer function of a contract.\n     */\n    modifier initializer() {\n        bool isTopLevelCall = !initializing;\n\n        if (isTopLevelCall && !isConstructor() && initialized) revert InitializableContractAlreadyInitialized();\n\n        if (isTopLevelCall) {\n            initializing = true;\n            initialized = true;\n        }\n\n        _;\n\n        if (isTopLevelCall) {\n            initializing = false;\n            emit Initialized();\n        }\n    }\n\n    /**\n     * @dev Returns true if and only if the function is running in the constructor\n     */\n    function isConstructor() private view returns (bool) {\n        // extcodesize checks the size of the code stored in an address, and\n        // address returns the current address. Since the code is still not\n        // deployed when running a constructor, any checks on its code size will\n        // yield zero, making it an effective way to detect if a contract is\n        // under construction or not.\n        address self = address(this);\n        uint256 cs;\n        // solhint-disable-next-line no-inline-assembly\n        assembly {\n            cs := extcodesize(self)\n        }\n        return cs == 0;\n    }\n\n    /**\n     * @dev Function that returns wheteher a contract is already initialized. Returns `initialized`\n     */\n    function isInitialized() public view virtual returns (bool) {\n        return initialized;\n    }\n\n    /**\n     * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\n     * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\n     * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\n     * through proxies.\n     *\n     * Emits an {Initialized} event the first time it is successfully executed.\n     */\n    function _disableInitializers() internal virtual {\n        if (initializing) revert InitializableContractIsInitializing();\n        if (!initialized) {\n            initialized = true;\n            emit Initialized();\n        }\n    }\n\n    // Reserved storage space to allow for layout changes in the future.\n    uint256[50] private ______gap;\n}\n"},{"file_path":"apps/baseContracts/contracts/helpers/instance/Whitelistable.sol","source_code":"// SPDX-License-Identifier: UNLICENSED\n\n/**\n * @title Whitelistable\n * @author Team 3301 <team3301@sygnum.com>\n * @dev Whitelistable contract stores the Whitelist contract address, and modifiers for\n *       contracts.\n */\n\npragma solidity ^0.8.0;\n\nimport \"../../role/base/Operatorable.sol\";\nimport \"../interface/IWhitelist.sol\";\nimport \"../Initializable.sol\";\n\ncontract Whitelistable is Initializable, Operatorable {\n    IWhitelist internal whitelistInst;\n    address private whitelistPending;\n\n    /**\n     * @dev Error: \"Whitelistable: account is not whitelisted\"\n     */\n    error WhitelistableAccountNotWhitelisted();\n\n    /**\n     * @dev Error: \"Whitelistable: address of new whitelist contract can not be zero\"\n     */\n    error WhitelistableWhitelistContractZeroAddress();\n\n    /**\n     * @dev Error:  \"Whitelistable: should be called from new whitelist contract\"\n     */\n    error WhitelistableCallerNotWhitelistContract(address _caller);\n\n    event WhitelistContractChanged(address indexed caller, address indexed whitelistAddress);\n    event WhitelistContractPending(address indexed caller, address indexed whitelistAddress);\n\n    /**\n     * @dev Reverts if _account is not whitelisted.\n     * @param _account address to determine if whitelisted.\n     */\n    modifier whenWhitelisted(address _account) {\n        if (!isWhitelisted(_account)) revert WhitelistableAccountNotWhitelisted();\n        _;\n    }\n\n    /**\n     * @dev Initialization instead of constructor, called once. The setWhitelistContract function can be called only by Admin role with\n     *       confirmation through the whitelist contract.\n     * @param _whitelist Whitelist contract address.\n     * @param _baseOperators BaseOperators contract address.\n     */\n    function initialize(address _baseOperators, address _whitelist) public virtual initializer {\n        _setOperatorsContract(_baseOperators);\n        _setWhitelistContract(_whitelist);\n    }\n\n    /**\n     * @dev Set the new the address of Whitelist contract, should be confirmed from whitelist contract by calling confirmFor(addr)\n     *       where addr is the address of current contract instance. This is done to prevent the case when the new contract address is\n     *       broken and control of the contract can be lost in such case\n     * @param _whitelist Whitelist contract address.\n     */\n    function setWhitelistContract(address _whitelist) public onlyAdmin {\n        if (_whitelist == address(0)) revert WhitelistableWhitelistContractZeroAddress();\n\n        whitelistPending = _whitelist;\n        emit WhitelistContractPending(msg.sender, _whitelist);\n    }\n\n    /**\n     * @dev The function should be called from new whitelist contract by admin to insure that whitelistPending address\n     *       is the real contract address.\n     */\n    function confirmWhitelistContract() public {\n        if (whitelistPending == address(0)) revert WhitelistableWhitelistContractZeroAddress();\n\n        if (msg.sender != whitelistPending) revert WhitelistableCallerNotWhitelistContract(msg.sender);\n\n        _setWhitelistContract(whitelistPending);\n    }\n\n    /**\n     * @return The address of the Whitelist contract.\n     */\n    function getWhitelistContract() public view returns (address) {\n        return address(whitelistInst);\n    }\n\n    /**\n     * @return The pending address of the Whitelist contract.\n     */\n    function getWhitelistPending() public view returns (address) {\n        return whitelistPending;\n    }\n\n    /**\n     * @return If '_account' is whitelisted.\n     */\n    function isWhitelisted(address _account) public view returns (bool) {\n        return whitelistInst.isWhitelisted(_account);\n    }\n\n    /** INTERNAL FUNCTIONS */\n    function _setWhitelistContract(address _whitelist) internal {\n        if (_whitelist == address(0)) revert WhitelistableWhitelistContractZeroAddress();\n\n        whitelistInst = IWhitelist(_whitelist);\n        emit WhitelistContractChanged(msg.sender, _whitelist);\n    }\n}\n"},{"file_path":"apps/baseContracts/contracts/role/interface/IBlockerOperators.sol","source_code":"// SPDX-License-Identifier: Unlicensed\n\n/**\n * @title IBlockerOperators\n * @notice Interface for BlockerOperators contract\n */\n\npragma solidity ^0.8.0;\n\nabstract contract IBlockerOperators {\n    function isBlocker(address _account) external view virtual returns (bool);\n\n    function addBlocker(address _account) external virtual;\n\n    function removeBlocker(address _account) external virtual;\n}\n"},{"file_path":"apps/baseContracts/contracts/helpers/interface/IWhitelist.sol","source_code":"// SPDX-License-Identifier: UNLICENSED\n\npragma solidity ^0.8.0;\n\n/**\n * @title IWhitelist\n * @notice Interface for Whitelist contract\n */\nabstract contract IWhitelist {\n    function isWhitelisted(address _account) external view virtual returns (bool);\n\n    function toggleWhitelist(address _account, bool _toggled) external virtual;\n}\n"},{"file_path":"dependencies/@openzeppelin-contracts-4.9.3/token/ERC20/IERC20.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n    /**\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\n     * another (`to`).\n     *\n     * Note that `value` may be zero.\n     */\n    event Transfer(address indexed from, address indexed to, uint256 value);\n\n    /**\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n     * a call to {approve}. `value` is the new allowance.\n     */\n    event Approval(address indexed owner, address indexed spender, uint256 value);\n\n    /**\n     * @dev Returns the amount of tokens in existence.\n     */\n    function totalSupply() external view returns (uint256);\n\n    /**\n     * @dev Returns the amount of tokens owned by `account`.\n     */\n    function balanceOf(address account) external view returns (uint256);\n\n    /**\n     * @dev Moves `amount` tokens from the caller's account to `to`.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transfer(address to, uint256 amount) external returns (bool);\n\n    /**\n     * @dev Returns the remaining number of tokens that `spender` will be\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\n     * zero by default.\n     *\n     * This value changes when {approve} or {transferFrom} are called.\n     */\n    function allowance(address owner, address spender) external view returns (uint256);\n\n    /**\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\n     * that someone may use both the old and the new allowance by unfortunate\n     * transaction ordering. One possible solution to mitigate this race\n     * condition is to first reduce the spender's allowance to 0 and set the\n     * desired value afterwards:\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n     *\n     * Emits an {Approval} event.\n     */\n    function approve(address spender, uint256 amount) external returns (bool);\n\n    /**\n     * @dev Moves `amount` tokens from `from` to `to` using the\n     * allowance mechanism. `amount` is then deducted from the caller's\n     * allowance.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transferFrom(address from, address to, uint256 amount) external returns (bool);\n}\n"},{"file_path":"apps/baseContracts/contracts/role/trader/TraderOperatorable.sol","source_code":"// SPDX-License-Identifier: Unlicensed\n\n/**\n * @title TraderOperatorable\n * @author Team 3301 <team3301@sygnum.com>\n * @dev TraderOperatorable contract stores TraderOperators contract address, and modifiers for\n *      contracts.\n */\n\npragma solidity ^0.8.0;\n\nimport \"../interface/ITraderOperators.sol\";\nimport \"../base/Operatorable.sol\";\nimport \"../../helpers/Initializable.sol\";\n\ncontract TraderOperatorable is Operatorable {\n    ITraderOperators internal traderOperatorsInst;\n    address private traderOperatorsPending;\n\n    /**\n     * @dev Error: \"TraderOperatorable: caller is not trader\"\n     */\n    error TraderOperatorableCallerNotTrader();\n\n    /**\n     * @dev Error: \"TraderOperatorable: caller is not trader or operator or system\"\n     */\n    error TraderOperatorableCallerNotTraderOrOperatorOrSystem();\n\n    /**\n     * @dev Error: \"TraderOperatorable: address of new traderOperators contract can not be zero\"\n     */\n    error TraderOperatorableNewTraderOperatorsAddressZero();\n\n    /**\n     * @dev Error: \"TraderOperatorable: address of pending traderOperators contract can not be zero\"\n     */\n    error TraderOperatorablePendingTraderOperatorsAddressZero();\n\n    /**\n     * @dev Error: \"TraderOperatorable: should be called from new traderOperators contract\"\n     */\n    error TraderOperatorableCallerNotNewTraderOperator();\n\n    event TraderOperatorsContractChanged(address indexed caller, address indexed traderOperatorsAddress);\n    event TraderOperatorsContractPending(address indexed caller, address indexed traderOperatorsAddress);\n\n    /**\n     * @dev Reverts if sender does not have the trader role associated.\n     */\n    modifier onlyTrader() {\n        if (!isTrader(msg.sender)) revert TraderOperatorableCallerNotTrader();\n        _;\n    }\n\n    /**\n     * @dev Reverts if sender does not have the operator or trader role associated.\n     */\n    modifier onlyOperatorOrTraderOrSystem() {\n        if (!isOperator(msg.sender) && !isTrader(msg.sender) && !isSystem(msg.sender))\n            revert TraderOperatorableCallerNotTraderOrOperatorOrSystem();\n        _;\n    }\n\n    /**\n     * @dev Initialization instead of constructor, called once. The setTradersOperatorsContract function can be called only by Admin role with\n     * confirmation through the operators contract.\n     * @param _baseOperators BaseOperators contract address.\n     * @param _traderOperators TraderOperators contract address.\n     */\n    function initialize(address _baseOperators, address _traderOperators) public virtual initializer {\n        super.initialize(_baseOperators);\n        _setTraderOperatorsContract(_traderOperators);\n    }\n\n    /**\n     * @dev Set the new the address of Operators contract, should be confirmed from operators contract by calling confirmFor(addr)\n     * where addr is the address of current contract instance. This is done to prevent the case when the new contract address is\n     * broken and control of the contract can be lost in such case\n     * @param _traderOperators TradeOperators contract address.\n     */\n    function setTraderOperatorsContract(address _traderOperators) public onlyAdmin {\n        if (_traderOperators == address(0)) revert TraderOperatorableNewTraderOperatorsAddressZero();\n\n        traderOperatorsPending = _traderOperators;\n        emit TraderOperatorsContractPending(msg.sender, _traderOperators);\n    }\n\n    /**\n     * @dev The function should be called from new operators contract by admin to insure that traderOperatorsPending address\n     *       is the real contract address.\n     */\n    function confirmTraderOperatorsContract() public {\n        if (traderOperatorsPending == address(0)) revert TraderOperatorablePendingTraderOperatorsAddressZero();\n        if (msg.sender != traderOperatorsPending) revert TraderOperatorableCallerNotNewTraderOperator();\n\n        _setTraderOperatorsContract(traderOperatorsPending);\n    }\n\n    /**\n     * @return The address of the TraderOperators contract.\n     */\n    function getTraderOperatorsContract() public view returns (address) {\n        return address(traderOperatorsInst);\n    }\n\n    /**\n     * @return The pending TraderOperators contract address\n     */\n    function getTraderOperatorsPending() public view returns (address) {\n        return traderOperatorsPending;\n    }\n\n    /**\n     * @return If '_account' has trader privileges.\n     */\n    function isTrader(address _account) public view returns (bool) {\n        return traderOperatorsInst.isTrader(_account);\n    }\n\n    /** INTERNAL FUNCTIONS */\n    function _setTraderOperatorsContract(address _traderOperators) internal {\n        if (_traderOperators == address(0)) revert TraderOperatorableNewTraderOperatorsAddressZero();\n\n        traderOperatorsInst = ITraderOperators(_traderOperators);\n        emit TraderOperatorsContractChanged(msg.sender, _traderOperators);\n    }\n}\n"},{"file_path":"apps/equity/contracts/token/upgrade/prd/SygnumTokenV4.sol","source_code":"/**\n * @title MetadataUpgrade\n * @author Team 3301 <team3301@sygnum.com>\n * @dev Upgraded SygnumToken. This upgrade allows operator accounts to mint and burn tokens while paused.\n */\npragma solidity 0.8.8;\n\nimport \"./SygnumTokenV3.sol\";\n\ncontract SygnumTokenV4 is SygnumTokenV3 {\n    bool public initializedV4;\n\n    error SygnumTokenV4AlreadyInitialized();\n    error SygnumTokenV4ZeroBurnAmount();\n\n    // changed back to public for tests\n    function initializeContractsAndConstructor(\n        string memory _name,\n        string memory _symbol,\n        uint8 _decimals,\n        bytes4 _category,\n        string memory _class,\n        address _issuer,\n        address _baseOperators,\n        address _whitelist,\n        address _traderOperators,\n        address _blockerOperators,\n        string memory _tokenURI\n    ) public virtual override {\n        SygnumTokenV3.initializeContractsAndConstructor(\n            _name,\n            _symbol,\n            _decimals,\n            _category,\n            _class,\n            _issuer,\n            _baseOperators,\n            _whitelist,\n            _traderOperators,\n            _blockerOperators,\n            _tokenURI\n        );\n        initializeV4();\n    }\n\n    function initializeV4() public virtual {\n        if (initializedV4) revert SygnumTokenV4AlreadyInitialized();\n        initializedV4 = true;\n    }\n\n    /**\n     * @dev Modified _burn function allowing operators to burn while contract is paused/frozen\n     * @param account address that funds will be minted to.\n     * @param amount amount of funds that will be minted.\n     */\n    function _burn(address account, uint256 amount) internal virtual override {\n        // Cannot use super. here as there is no way to selectively disable whenNotPaused,\n        // we need to redefine the modifiers explicitly\n        if (isOperator(msg.sender) && isWhitelisted(account)) {\n            if (amount <= 0) revert SygnumTokenV4ZeroBurnAmount();\n            ERC20Snapshot._burn(account, amount);\n        } else {\n            super._burn(account, amount);\n        }\n    }\n\n    /**\n     * @dev Modified _burnFor function allowing operators to burn while contract is paused/frozen\n     * @param account address that funds will be minted to.\n     * @param amount amount of funds that will be minted.\n     */\n    function _burnFor(address account, uint256 amount) internal virtual override {\n        // Cannot use super. here as there is no way to selectively disable whenNotPaused,\n        // we need to redefine the modifiers explicitly\n        if (isOperator(msg.sender) && isWhitelisted(account)) {\n            if (amount <= 0) revert SygnumTokenV4ZeroBurnAmount();\n            ERC20Snapshot._burn(account, amount);\n        } else {\n            super._burnFor(account, amount);\n        }\n    }\n}\n"},{"file_path":"apps/baseContracts/contracts/helpers/ERC20/ERC20Whitelist.sol","source_code":"// SPDX-License-Identifier: UNLICENSED\n\n/**\n * @title ERC20Whitelist\n * @author Team 3301 <team3301@sygnum.com>\n * @dev Overloading ERC20 functions to ensure that addresses attempting to particular\n * actions are whitelisted.\n */\n\npragma solidity ^0.8.0;\n\nimport \"./ERC20Overload/ERC20.sol\";\nimport \"../instance/Whitelistable.sol\";\n\ncontract ERC20Whitelist is ERC20, Whitelistable {\n    /**\n     * @dev Overload transfer function to validate sender and receiver are whitelisted.\n     * @param to address that recieves the funds.\n     * @param value amount of funds.\n     */\n    function transfer(\n        address to,\n        uint256 value\n    ) public virtual override whenWhitelisted(msg.sender) whenWhitelisted(to) returns (bool) {\n        return super.transfer(to, value);\n    }\n\n    /**\n     * @dev Overload approve function to validate sender and spender are whitelisted.\n     * @param spender address that can spend the funds.\n     * @param value amount of funds.\n     */\n    function approve(\n        address spender,\n        uint256 value\n    ) public virtual override whenWhitelisted(msg.sender) whenWhitelisted(spender) returns (bool) {\n        return super.approve(spender, value);\n    }\n\n    /**\n     * @dev Overload transferFrom function to validate sender, from and receiver are whitelisted.\n     * @param from address that funds will be transferred from.\n     * @param to address that funds will be transferred to.\n     * @param value amount of funds.\n     */\n    function transferFrom(\n        address from,\n        address to,\n        uint256 value\n    ) public virtual override whenWhitelisted(msg.sender) whenWhitelisted(from) whenWhitelisted(to) returns (bool) {\n        return super.transferFrom(from, to, value);\n    }\n\n    /**\n     * @dev Overload increaseAllowance validate sender and spender are whitelisted.\n     * @param spender address that will be allowed to transfer funds.\n     * @param addedValue amount of funds to added to current allowance.\n     */\n    function increaseAllowance(\n        address spender,\n        uint256 addedValue\n    ) public virtual override whenWhitelisted(spender) whenWhitelisted(msg.sender) returns (bool) {\n        return super.increaseAllowance(spender, addedValue);\n    }\n\n    /**\n     * @dev Overload decreaseAllowance validate sender and spender are whitelisted.\n     * @param spender address that will be allowed to transfer funds.\n     * @param subtractedValue amount of funds to be deducted to current allowance.\n     */\n    function decreaseAllowance(\n        address spender,\n        uint256 subtractedValue\n    ) public virtual override whenWhitelisted(spender) whenWhitelisted(msg.sender) returns (bool) {\n        return super.decreaseAllowance(spender, subtractedValue);\n    }\n\n    /**\n     * @dev Overload _burn function to ensure that account has been whitelisted.\n     * @param account address that funds will be burned from.\n     * @param value amount of funds that will be burned.\n     */\n    function _burn(address account, uint256 value) internal virtual override whenWhitelisted(account) {\n        super._burn(account, value);\n    }\n\n    /**\n     * @dev Overload _burnFrom function to ensure sender and account have been whitelisted.\n     * @param account address that funds will be burned from allowance.\n     * @param amount amount of funds that will be burned.\n     */\n    function _burnFrom(\n        address account,\n        uint256 amount\n    ) internal virtual override whenWhitelisted(msg.sender) whenWhitelisted(account) {\n        super._burnFrom(account, amount);\n    }\n\n    /**\n     * @dev Overload _mint function to ensure account has been whitelisted.\n     * @param account address that funds will be minted to.\n     * @param amount amount of funds that will be minted.\n     */\n    function _mint(address account, uint256 amount) internal virtual override whenWhitelisted(account) {\n        super._mint(account, amount);\n    }\n}\n"},{"file_path":"apps/baseContracts/contracts/helpers/ERC20/ERC20Pausable.sol","source_code":"// SPDX-License-Identifier: UNLICENSED\n\n/**\n * @title ERC20Pausable\n * @author Team 3301 <team3301@sygnum.com>\n * @dev Overloading ERC20 functions to ensure that the contract has not been paused.\n */\n\npragma solidity ^0.8.0;\n\nimport \"./ERC20Overload/ERC20.sol\";\nimport \"../Pausable.sol\";\n\ncontract ERC20Pausable is ERC20, Pausable {\n    /**\n     * @dev Overload transfer function to ensure contract has not been paused.\n     * @param to address that recieves the funds.\n     * @param value amount of funds.\n     */\n    function transfer(address to, uint256 value) public virtual override whenNotPaused returns (bool) {\n        return super.transfer(to, value);\n    }\n\n    /**\n     * @dev Overload approve function to ensure contract has not been paused.\n     * @param spender address that can spend the funds.\n     * @param value amount of funds.\n     */\n    function approve(address spender, uint256 value) public virtual override whenNotPaused returns (bool) {\n        return super.approve(spender, value);\n    }\n\n    /**\n     * @dev Overload transferFrom function to ensure contract has not been paused.\n     * @param from address that funds will be transferred from.\n     * @param to address that funds will be transferred to.\n     * @param value amount of funds.\n     */\n    function transferFrom(\n        address from,\n        address to,\n        uint256 value\n    ) public virtual override whenNotPaused returns (bool) {\n        return super.transferFrom(from, to, value);\n    }\n\n    /**\n     * @dev Overload increaseAllowance function to ensure contract has not been paused.\n     * @param spender address that will be allowed to transfer funds.\n     * @param addedValue amount of funds to added to current allowance.\n     */\n    function increaseAllowance(\n        address spender,\n        uint256 addedValue\n    ) public virtual override whenNotPaused returns (bool) {\n        return super.increaseAllowance(spender, addedValue);\n    }\n\n    /**\n     * @dev Overload decreaseAllowance function to ensure contract has not been paused.\n     * @param spender address that will be allowed to transfer funds.\n     * @param subtractedValue amount of funds to be deducted to current allowance.\n     */\n    function decreaseAllowance(\n        address spender,\n        uint256 subtractedValue\n    ) public virtual override whenNotPaused returns (bool) {\n        return super.decreaseAllowance(spender, subtractedValue);\n    }\n\n    /**\n     * @dev Overload _burn function to ensure contract has not been paused.\n     * @param account address that funds will be burned from.\n     * @param value amount of funds that will be burned.\n     */\n    function _burn(address account, uint256 value) internal virtual override whenNotPaused {\n        super._burn(account, value);\n    }\n\n    /**\n     * @dev Overload _burnFrom function to ensure contract has not been paused.\n     * @param account address that funds will be burned from allowance.\n     * @param amount amount of funds that will be burned.\n     */\n    function _burnFrom(address account, uint256 amount) internal virtual override whenNotPaused {\n        super._burnFrom(account, amount);\n    }\n\n    /**\n     * @dev Overload _mint function to ensure contract has not been paused.\n     * @param account address that funds will be minted to.\n     * @param amount amount of funds that will be minted.\n     */\n    function _mint(address account, uint256 amount) internal virtual override whenNotPaused {\n        super._mint(account, amount);\n    }\n}\n"},{"file_path":"apps/equity/contracts/token/upgrade/prd/SygnumTokenV3.sol","source_code":"/**\n * @title MetadataUpgrade\n * @author Team 3301 <team3301@sygnum.com>\n * @dev Upgraded SygnumToken. This upgrade allows system accounts to confiscate tokens.\n */\npragma solidity 0.8.8;\n\nimport \"./SygnumTokenV2.sol\";\n\ncontract SygnumTokenV3 is SygnumTokenV2 {\n    bool public initializedV3;\n\n    error SygnumTokenV3AlreadyInitialized();\n\n    // changed back to public for tests\n    function initializeContractsAndConstructor(\n        string memory _name,\n        string memory _symbol,\n        uint8 _decimals,\n        bytes4 _category,\n        string memory _class,\n        address _issuer,\n        address _baseOperators,\n        address _whitelist,\n        address _traderOperators,\n        address _blockerOperators,\n        string memory _tokenURI\n    ) public virtual override {\n        SygnumTokenV2.initializeContractsAndConstructor(\n            _name,\n            _symbol,\n            _decimals,\n            _category,\n            _class,\n            _issuer,\n            _baseOperators,\n            _whitelist,\n            _traderOperators,\n            _blockerOperators,\n            _tokenURI\n        );\n        initializeV3();\n    }\n\n    function initializeV3() public virtual {\n        if (initializedV3) revert SygnumTokenV3AlreadyInitialized();\n        initializedV3 = true;\n    }\n\n    /**\n     * @dev Modified _mint function allowing operators to mint while contract is paused\n     * @param account address that funds will be minted to.\n     * @param amount amount of funds that will be minted.\n     */\n    function _mint(address account, uint256 amount) internal virtual override {\n        // Cannot use super. here as there is no way to selectively disable whenNotPaused,\n        // we need to redefine the modifiers explicitly\n        if (isOperator(msg.sender) && isWhitelisted(account)) {\n            if (amount <= 0) revert ERC20MintableZeroMintAmount();\n            ERC20Snapshot._mint(account, amount);\n        } else {\n            super._mint(account, amount);\n        }\n    }\n}\n"},{"file_path":"apps/equity/contracts/token/upgrade/prd/SygnumTokenV1.sol","source_code":"/**\n * @title MetadataUpgrade\n * @author Team 3301 <team3301@sygnum.com>\n * @dev Upgraded SygnumToken. This upgrade adds the \"tokenURI\" field, which can hold a link to off chain token metadata.\n */\npragma solidity 0.8.8;\n\nimport \"../../SygnumToken.sol\";\n\ncontract SygnumTokenV1 is SygnumToken {\n    string public tokenURI;\n    bool public initializedV1;\n\n    error SygnumTokenV1AlreadyInitialized();\n\n    event TokenUriUpdated(string newToken);\n\n    // changed back to public for tests\n    function initializeContractsAndConstructor(\n        string memory _name,\n        string memory _symbol,\n        uint8 _decimals,\n        bytes4 _category,\n        string memory _class,\n        address _issuer,\n        address _baseOperators,\n        address _whitelist,\n        address _traderOperators,\n        address _blockerOperators,\n        string memory _tokenURI\n    ) public virtual {\n        SygnumToken.initializeContractsAndConstructor(\n            _name,\n            _symbol,\n            _decimals,\n            _category,\n            _class,\n            _issuer,\n            _baseOperators,\n            _whitelist,\n            _traderOperators,\n            _blockerOperators\n        );\n        initializeV1(_tokenURI);\n    }\n\n    function initializeV1(string memory _tokenURI) public virtual {\n        if (initializedV1) revert SygnumTokenV1AlreadyInitialized();\n\n        tokenURI = _tokenURI;\n        initializedV1 = true;\n    }\n\n    function updateTokenURI(string memory _newToken) public virtual onlyOperator {\n        tokenURI = _newToken;\n        emit TokenUriUpdated(_newToken);\n    }\n}\n"},{"file_path":"apps/equity/contracts/token/upgrade/prd/SygnumTokenV2.sol","source_code":"/**\n * @title MetadataUpgrade\n * @author Team 3301 <team3301@sygnum.com>\n * @dev Upgraded SygnumToken. This upgrade allows system accounts to confiscate tokens.\n */\npragma solidity 0.8.8;\n\nimport \"./SygnumTokenV1.sol\";\n\ncontract SygnumTokenV2 is SygnumTokenV1 {\n    bool public initializedV2;\n\n    error SygnumTokenV2AlreadyInitialized();\n\n    // changed back to public for tests\n    function initializeContractsAndConstructor(\n        string memory _name,\n        string memory _symbol,\n        uint8 _decimals,\n        bytes4 _category,\n        string memory _class,\n        address _issuer,\n        address _baseOperators,\n        address _whitelist,\n        address _traderOperators,\n        address _blockerOperators,\n        string memory _tokenURI\n    ) public virtual override {\n        SygnumTokenV1.initializeContractsAndConstructor(\n            _name,\n            _symbol,\n            _decimals,\n            _category,\n            _class,\n            _issuer,\n            _baseOperators,\n            _whitelist,\n            _traderOperators,\n            _blockerOperators,\n            _tokenURI\n        );\n        initializeV2();\n    }\n\n    function initializeV2() public virtual {\n        if (initializedV2) revert SygnumTokenV2AlreadyInitialized();\n        initializedV2 = true;\n    }\n\n    /**\n     * @dev Confiscate.\n     * @param _confiscatee Account to confiscate funds from.\n     * @param _receiver Account to transfer confiscated funds to.\n     * @param _amount Amount of tokens to confiscate.\n     */\n    function confiscate(\n        address _confiscatee,\n        address _receiver,\n        uint256 _amount\n    ) public virtual override onlyOperatorOrSystem {\n        super._confiscate(_confiscatee, _receiver, _amount);\n        emit Confiscated(_confiscatee, _amount, _receiver);\n    }\n}\n"},{"file_path":"apps/baseContracts/contracts/helpers/ERC20/ERC20Blockable.sol","source_code":"// SPDX-License-Identifier: UNLICENSED\n\n/**\n * @title ERC20Blockable\n * @author Team 3301 <team3301@sygnum.com>\n * @dev For blocking and unblocking particular user funds.\n */\n\npragma solidity ^0.8.0;\n\nimport \"./ERC20Overload/ERC20.sol\";\nimport \"../../role/blocker/BlockerOperatorable.sol\";\n\ncontract ERC20Blockable is ERC20, BlockerOperatorable {\n    using SafeMath for uint256;\n    uint256 public totalBlockedBalance;\n\n    mapping(address => uint256) public _blockedBalances;\n\n    event Blocked(address indexed blocker, address indexed account, uint256 value);\n    event UnBlocked(address indexed blocker, address indexed account, uint256 value);\n\n    /**\n     * @dev Block funds, and move funds from _balances into _blockedBalances.\n     * @param _account address to block funds.\n     * @param _amount of funds to block.\n     */\n    function block(address _account, uint256 _amount) public onlyBlockerOrOperator {\n        _balances[_account] = _balances[_account].sub(_amount);\n        _blockedBalances[_account] = _blockedBalances[_account].add(_amount);\n\n        totalBlockedBalance = totalBlockedBalance.add(_amount);\n        emit Blocked(msg.sender, _account, _amount);\n    }\n\n    /**\n     * @dev Unblock funds, and move funds from _blockedBalances into _balances.\n     * @param _account address to unblock funds.\n     * @param _amount of funds to unblock.\n     */\n    function unblock(address _account, uint256 _amount) public onlyBlockerOrOperator {\n        _balances[_account] = _balances[_account].add(_amount);\n        _blockedBalances[_account] = _blockedBalances[_account].sub(_amount);\n\n        totalBlockedBalance = totalBlockedBalance.sub(_amount);\n        emit UnBlocked(msg.sender, _account, _amount);\n    }\n\n    /**\n     * @dev Getter for the amount of blocked balance for a particular address.\n     * @param _account address to get blocked balance.\n     * @return amount of blocked balance.\n     */\n    function blockedBalanceOf(address _account) public view returns (uint256) {\n        return _blockedBalances[_account];\n    }\n\n    /**\n     * @dev Getter for the total amount of blocked funds for all users.\n     * @return amount of total blocked balance.\n     */\n    function getTotalBlockedBalance() public view returns (uint256) {\n        return totalBlockedBalance;\n    }\n}\n"},{"file_path":"apps/baseContracts/contracts/helpers/Pausable.sol","source_code":"// SPDX-License-Identifier: UNLICENSED\n\n/**\n * @title Pausable\n * @author Team 3301 <team3301@sygnum.com>\n * @dev Contract module which allows children to implement an emergency stop\n *      mechanism that can be triggered by an authorized account in the TraderOperatorable\n *      contract.\n */\npragma solidity ^0.8.0;\n\nimport \"../role/trader/TraderOperatorable.sol\";\n\nabstract contract Pausable is TraderOperatorable {\n    bool internal _paused;\n\n    /**\n     * @dev Error: \"Pausable: paused\"\n     */\n    error PausablePaused();\n\n    /**\n     * @dev Error: \"Pausable: not paused\"\n     */\n    error PausableNotPaused();\n\n    event Paused(address indexed account);\n    event Unpaused(address indexed account);\n\n    // solhint-disable-next-line func-visibility\n    constructor() {\n        _paused = false;\n    }\n\n    /**\n     * @dev Reverts if contract is paused.\n     */\n    modifier whenNotPaused() {\n        if (_paused) revert PausablePaused();\n        _;\n    }\n\n    /**\n     * @dev Reverts if contract is paused.\n     */\n    modifier whenPaused() {\n        if (!_paused) revert PausableNotPaused();\n        _;\n    }\n\n    /**\n     * @dev Called by operator to pause child contract. The contract\n     *      must not already be paused.\n     */\n    function pause() public virtual onlyOperatorOrTraderOrSystem whenNotPaused {\n        _paused = true;\n        emit Paused(msg.sender);\n    }\n\n    /** @dev Called by operator to pause child contract. The contract\n     *       must already be paused.\n     */\n    function unpause() public virtual onlyOperatorOrTraderOrSystem whenPaused {\n        _paused = false;\n        emit Unpaused(msg.sender);\n    }\n\n    /**\n     * @return If child contract is already paused or not.\n     */\n    function isPaused() public view virtual returns (bool) {\n        return _paused;\n    }\n\n    /**\n     * @return If child contract is not paused.\n     */\n    function isNotPaused() public view virtual returns (bool) {\n        return !_paused;\n    }\n}\n"},{"file_path":"dependencies/@chainlink-contracts-1.3.0/src/v0.8/shared/interfaces/AggregatorV2V3Interface.sol","source_code":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {AggregatorInterface} from \"./AggregatorInterface.sol\";\nimport {AggregatorV3Interface} from \"./AggregatorV3Interface.sol\";\n\n// solhint-disable-next-line interface-starts-with-i\ninterface AggregatorV2V3Interface is AggregatorInterface, AggregatorV3Interface {}\n"},{"file_path":"apps/baseContracts/contracts/helpers/ERC20/ERC20Overload/ERC20.sol","source_code":"// SPDX-License-Identifier: UNLICENSED\n\npragma solidity ^0.8.0;\n\nimport \"@openzeppelin/contracts/utils/Context.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport \"@openzeppelin/contracts/utils/math/SafeMath.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n * For a generic mechanism see {ERC20Mintable}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * We have followed general OpenZeppelin guidelines: functions revert instead\n * of returning `false` on failure. This behavior is nonetheless conventional\n * and does not conflict with the expectations of ERC20 applications.\n *\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\n * This allows applications to reconstruct the allowance for all accounts just\n * by listening to said events. Other implementations of the EIP may not emit\n * these events, as it isn't required by the specification.\n *\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\n * functions have been added to mitigate the well-known issues around setting\n * allowances. See {IERC20-approve}.\n */\ncontract ERC20 is Context, IERC20 {\n    using SafeMath for uint256;\n\n    mapping(address => uint256) internal _balances;\n\n    mapping(address => mapping(address => uint256)) private _allowances;\n\n    uint256 private _totalSupply;\n\n    /**\n     * @dev See {IERC20-totalSupply}.\n     */\n    function totalSupply() public view virtual override returns (uint256) {\n        return _totalSupply;\n    }\n\n    /**\n     * @dev See {IERC20-balanceOf}.\n     */\n    function balanceOf(address account) public view virtual override returns (uint256) {\n        return _balances[account];\n    }\n\n    /**\n     * @dev See {IERC20-transfer}.\n     *\n     * Requirements:\n     *\n     * - `recipient` cannot be the zero address.\n     * - the caller must have a balance of at least `amount`.\n     */\n    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\n        _transfer(_msgSender(), recipient, amount);\n        return true;\n    }\n\n    /**\n     * @dev See {IERC20-allowance}.\n     */\n    function allowance(address owner, address spender) public view virtual override returns (uint256) {\n        return _allowances[owner][spender];\n    }\n\n    /**\n     * @dev See {IERC20-approve}.\n     *\n     * Requirements:\n     *\n     * - `spender` cannot be the zero address.\n     */\n    function approve(address spender, uint256 amount) public virtual override returns (bool) {\n        _approve(_msgSender(), spender, amount);\n        return true;\n    }\n\n    /**\n     * @dev See {IERC20-transferFrom}.\n     *\n     * Emits an {Approval} event indicating the updated allowance. This is not\n     * required by the EIP. See the note at the beginning of {ERC20};\n     *\n     * Requirements:\n     * - `sender` and `recipient` cannot be the zero address.\n     * - `sender` must have a balance of at least `amount`.\n     * - the caller must have allowance for `sender`'s tokens of at least\n     * `amount`.\n     */\n    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {\n        _transfer(sender, recipient, amount);\n        _approve(\n            sender,\n            _msgSender(),\n            _allowances[sender][_msgSender()].sub(amount, \"ERC20: transfer amount exceeds allowance\")\n        );\n        return true;\n    }\n\n    /**\n     * @dev Atomically increases the allowance granted to `spender` by the caller.\n     *\n     * This is an alternative to {approve} that can be used as a mitigation for\n     * problems described in {IERC20-approve}.\n     *\n     * Emits an {Approval} event indicating the updated allowance.\n     *\n     * Requirements:\n     *\n     * - `spender` cannot be the zero address.\n     */\n    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));\n        return true;\n    }\n\n    /**\n     * @dev Atomically decreases the allowance granted to `spender` by the caller.\n     *\n     * This is an alternative to {approve} that can be used as a mitigation for\n     * problems described in {IERC20-approve}.\n     *\n     * Emits an {Approval} event indicating the updated allowance.\n     *\n     * Requirements:\n     *\n     * - `spender` cannot be the zero address.\n     * - `spender` must have allowance for the caller of at least\n     * `subtractedValue`.\n     */\n    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\n        _approve(\n            _msgSender(),\n            spender,\n            _allowances[_msgSender()][spender].sub(subtractedValue, \"ERC20: decreased allowance below zero\")\n        );\n        return true;\n    }\n\n    /**\n     * @dev Moves tokens `amount` from `sender` to `recipient`.\n     *\n     * This is internal function is equivalent to {transfer}, and can be used to\n     * e.g. implement automatic token fees, slashing mechanisms, etc.\n     *\n     * Emits a {Transfer} event.\n     *\n     * Requirements:\n     *\n     * - `sender` cannot be the zero address.\n     * - `recipient` cannot be the zero address.\n     * - `sender` must have a balance of at least `amount`.\n     */\n    function _transfer(address sender, address recipient, uint256 amount) internal {\n        require(sender != address(0), \"ERC20: transfer from the zero address\");\n        require(recipient != address(0), \"ERC20: transfer to the zero address\");\n\n        _balances[sender] = _balances[sender].sub(amount, \"ERC20: transfer amount exceeds balance\");\n        _balances[recipient] = _balances[recipient].add(amount);\n        emit Transfer(sender, recipient, amount);\n    }\n\n    /** @dev Creates `amount` tokens and assigns them to `account`, increasing\n     * the total supply.\n     *\n     * Emits a {Transfer} event with `from` set to the zero address.\n     *\n     * Requirements\n     *\n     * - `to` cannot be the zero address.\n     */\n    function _mint(address account, uint256 amount) internal virtual {\n        require(account != address(0), \"ERC20: mint to the zero address\");\n\n        _totalSupply = _totalSupply.add(amount);\n        _balances[account] = _balances[account].add(amount);\n        emit Transfer(address(0), account, amount);\n    }\n\n    /**\n     * @dev Destroys `amount` tokens from `account`, reducing the\n     * total supply.\n     *\n     * Emits a {Transfer} event with `to` set to the zero address.\n     *\n     * Requirements\n     *\n     * - `account` cannot be the zero address.\n     * - `account` must have at least `amount` tokens.\n     */\n    function _burn(address account, uint256 amount) internal virtual {\n        require(account != address(0), \"ERC20: burn from the zero address\");\n\n        _balances[account] = _balances[account].sub(amount, \"ERC20: burn amount exceeds balance\");\n        _totalSupply = _totalSupply.sub(amount);\n        emit Transfer(account, address(0), amount);\n    }\n\n    /**\n     * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens.\n     *\n     * This is internal function is equivalent to `approve`, and can be used to\n     * e.g. set automatic allowances for certain subsystems, etc.\n     *\n     * Emits an {Approval} event.\n     *\n     * Requirements:\n     *\n     * - `owner` cannot be the zero address.\n     * - `spender` cannot be the zero address.\n     */\n    function _approve(address owner, address spender, uint256 amount) internal {\n        require(owner != address(0), \"ERC20: approve from the zero address\");\n        require(spender != address(0), \"ERC20: approve to the zero address\");\n\n        _allowances[owner][spender] = amount;\n        emit Approval(owner, spender, amount);\n    }\n\n    /**\n     * @dev Destroys `amount` tokens from `account`.`amount` is then deducted\n     * from the caller's allowance.\n     *\n     * See {_burn} and {_approve}.\n     */\n    function _burnFrom(address account, uint256 amount) internal virtual {\n        _burn(account, amount);\n        _approve(\n            account,\n            _msgSender(),\n            _allowances[account][_msgSender()].sub(amount, \"ERC20: burn amount exceeds allowance\")\n        );\n    }\n}\n"},{"file_path":"apps/baseContracts/contracts/helpers/Freezable.sol","source_code":"// SPDX-License-Identifier: UNLICENSED\n\n/**\n * @title Freezable\n * @author Team 3301 <team3301@sygnum.com>\n * @dev Freezable contract to freeze functionality for particular addresses.  Freezing/unfreezing is controlled\n *       by operators in Operatorable contract which is initialized with the relevant BaseOperators address.\n */\n\npragma solidity ^0.8.0;\n\nimport \"../role/base/Operatorable.sol\";\n\ncontract Freezable is Operatorable {\n    mapping(address => bool) public frozen;\n\n    /**\n     * @dev Error: \"Freezable: Empty address\"\n     */\n    error FreezableZeroAddress();\n\n    /**\n     * @dev Error: \"Freezable: account is frozen\"\n     */\n    error FreezableAccountFrozen();\n\n    /**\n     * @dev Error: \"Freezable: account is not frozen\"\n     */\n    error FreezableAccountNotFrozen();\n\n    /**\n     * @dev Error: \"Freezable: batch count is greater than 256\"\n     */\n    error FreezableBatchCountTooLarge(uint256 _batchCount);\n\n    event FreezeToggled(address indexed account, bool frozen);\n\n    /**\n     * @dev Reverts if address is empty.\n     * @param _address address to validate.\n     */\n    modifier onlyValidAddress(address _address) {\n        if (_address == address(0)) revert FreezableZeroAddress();\n        _;\n    }\n\n    /**\n     * @dev Reverts if account address is frozen.\n     * @param _account address to validate is not frozen.\n     */\n    modifier whenNotFrozen(address _account) {\n        if (frozen[_account]) revert FreezableAccountFrozen();\n        _;\n    }\n\n    /**\n     * @dev Reverts if account address is not frozen.\n     * @param _account address to validate is frozen.\n     */\n    modifier whenFrozen(address _account) {\n        if (!frozen[_account]) revert FreezableAccountNotFrozen();\n        _;\n    }\n\n    /**\n     * @dev Getter to determine if address is frozen.\n     * @param _account address to determine if frozen or not.\n     * @return bool is frozen\n     */\n    function isFrozen(address _account) public view virtual returns (bool) {\n        return frozen[_account];\n    }\n\n    /**\n     * @dev Toggle freeze/unfreeze on _account address, with _toggled being true/false.\n     * @param _account address to toggle.\n     * @param _toggled freeze/unfreeze.\n     */\n    function toggleFreeze(address _account, bool _toggled) public virtual onlyValidAddress(_account) onlyOperator {\n        frozen[_account] = _toggled;\n        emit FreezeToggled(_account, _toggled);\n    }\n\n    /**\n     * @dev Batch freeze/unfreeze multiple addresses, with _toggled being true/false.\n     * @param _addresses address array.\n     * @param _toggled freeze/unfreeze.\n     */\n    function batchToggleFreeze(address[] memory _addresses, bool _toggled) public virtual {\n        if (_addresses.length > 256) revert FreezableBatchCountTooLarge(_addresses.length);\n\n        for (uint256 i = 0; i < _addresses.length; ++i) {\n            toggleFreeze(_addresses[i], _toggled);\n        }\n    }\n}\n"},{"file_path":"apps/equity/contracts/token/ERC20/ERC20SygnumDetailed.sol","source_code":"/**\n * @title ERC20SygnumDetailed\n * @author Team 3301 <team3301@sygnum.com>\n * @dev ERC20 Standard Token with additional details and role set.\n */\n\npragma solidity 0.8.8;\n\nimport \"./ERC20Detailed.sol\";\nimport \"@sygnum/solidity-base-contracts/contracts/role/base/Operatorable.sol\";\n\ncontract ERC20SygnumDetailed is ERC20Detailed, Operatorable {\n    bytes4 private _category;\n    string private _class;\n    address private _issuer;\n\n    event NameUpdated(address issuer, string name, address token);\n    event SymbolUpdated(address issuer, string symbol, address token);\n    event CategoryUpdated(address issuer, bytes4 category, address token);\n    event ClassUpdated(address issuer, string class, address token);\n    event IssuerUpdated(address issuer, address newIssuer, address token);\n\n    /**\n     * @dev Sets the values for `name`, `symbol`, `decimals`, `category`, `class` and `issuer`. All are\n     *  mutable apart from `issuer`, which is immutable.\n     * @param name string\n     * @param symbol string\n     * @param decimals uint8\n     * @param category bytes4\n     * @param class string\n     * @param issuer address\n     */\n    function _setDetails(\n        string memory name,\n        string memory symbol,\n        uint8 decimals,\n        bytes4 category,\n        string memory class,\n        address issuer\n    ) internal virtual {\n        _name = name;\n        _symbol = symbol;\n        _decimals = decimals;\n        _category = category;\n        _class = class;\n        _issuer = issuer;\n    }\n\n    /**\n     * @dev Returns the category of the token.\n     */\n    function category() public view virtual returns (bytes4) {\n        return _category;\n    }\n\n    /**\n     * @dev Returns the class of the token.\n     */\n    function class() public view virtual returns (string memory) {\n        return _class;\n    }\n\n    /**\n     * @dev Returns the issuer of the token.\n     */\n    function issuer() public view virtual returns (address) {\n        return _issuer;\n    }\n\n    /**\n     * @dev Updates the name of the token, only callable by Sygnum operator.\n     * @param name_ The new name.\n     */\n    function updateName(string memory name_) public virtual onlyOperator {\n        _name = name_;\n        emit NameUpdated(msg.sender, _name, address(this));\n    }\n\n    /**\n     * @dev Updates the symbol of the token, only callable by Sygnum operator.\n     * @param symbol_ The new symbol.\n     */\n    function updateSymbol(string memory symbol_) public virtual onlyOperator {\n        _symbol = symbol_;\n        emit SymbolUpdated(msg.sender, symbol_, address(this));\n    }\n\n    /**\n     * @dev Updates the category of the token, only callable by Sygnum operator.\n     * @param category_ The new cateogry.\n     */\n    function updateCategory(bytes4 category_) public virtual onlyOperator {\n        _category = category_;\n        emit CategoryUpdated(msg.sender, _category, address(this));\n    }\n\n    /**\n     * @dev Updates the class of the token, only callable by Sygnum operator.\n     * @param class_ The new class.\n     */\n    function updateClass(string memory class_) public virtual onlyOperator {\n        _class = class_;\n        emit ClassUpdated(msg.sender, _class, address(this));\n    }\n\n    /**\n     * @dev Updates issuer ownership, only callable by Sygnum operator.\n     * @param issuer_ The new issuer.\n     */\n    function updateIssuer(address issuer_) public virtual onlyOperator {\n        _issuer = issuer_;\n        emit IssuerUpdated(msg.sender, _issuer, address(this));\n    }\n}\n"},{"file_path":"apps/baseContracts/contracts/helpers/ERC20/ERC20Tradeable.sol","source_code":"// SPDX-License-Identifier: UNLICENSED\n\n/**\n * @title ERC20Tradeable\n * @author Team 3301 <team3301@sygnum.com>\n * @dev Trader accounts can approve particular addresses on behalf of a user.\n */\n\npragma solidity ^0.8.0;\n\nimport \"./ERC20Overload/ERC20.sol\";\nimport \"../../role/trader/TraderOperatorable.sol\";\n\ncontract ERC20Tradeable is ERC20, TraderOperatorable {\n    /**\n     * @dev Trader can approve users balance to a particular address for a particular amount.\n     * @param _owner address that approves the funds.\n     * @param _spender address that spends the funds.\n     * @param _value amount of funds.\n     */\n    function approveOnBehalf(address _owner, address _spender, uint256 _value) public onlyTrader {\n        super._approve(_owner, _spender, _value);\n    }\n}\n"},{"file_path":"apps/baseContracts/contracts/role/base/Operatorable.sol","source_code":"// SPDX-License-Identifier: Unlicensed\n\n/**\n * @title Operatorable\n * @author Team 3301 <team3301@sygnum.com>\n * @dev Operatorable contract stores the BaseOperators contract address, and modifiers for\n *       contracts.\n */\n\npragma solidity ^0.8.0;\n\nimport \"../interface/IBaseOperators.sol\";\nimport \"../../helpers/Initializable.sol\";\n\ncontract Operatorable is Initializable {\n    IBaseOperators internal operatorsInst;\n    address private operatorsPending;\n\n    /**\n     * @dev Error: \"Operatorable: caller does not have the operator role\"\n     */\n    error OperatorableCallerNotOperator();\n\n    /**\n     * @dev Error: \"Operatorable: caller does not have the admin role\"\n     */\n    error OperatorableCallerNotAdmin();\n\n    /**\n     * @dev Error: \"Operatorable: caller does not have the system role\"\n     */\n    error OperatorableCallerNotSystem();\n\n    /**\n     * @dev Error: \"Operatorable: caller does not have the multisig role\"\n     */\n    error OperatorableCallerNotMultisig();\n\n    /**\n     * @dev Error: \"Operatorable: caller does not have the admin or system role\"\n     */\n    error OperatorableCallerNotAdminOrSystem();\n\n    /**\n     * @dev Error: \"Operatorable: caller does not have the operator role nor system\"\n     */\n    error OperatorableCallerNotOperatorOrSystem();\n\n    /**\n     * @dev Error: \"Operatorable: caller does not have the relay role\"\n     */\n    error OperatorableCallerNotRelay();\n\n    /**\n     * @dev Error: \"Operatorable: caller does not have the operator role nor relay\"\n     */\n    error OperatorableCallerNotOperatorOrRelay();\n\n    /**\n     * @dev Error: \"Operatorable: caller does not have the admin role nor relay\"\n     */\n    error OperatorableCallerNotAdminOrRelay();\n\n    /**\n     * @dev Error: \"Operatorable: caller does not have the operator role nor system nor relay\"\n     */\n    error OperatorableCallerNotOperatorOrSystemOrRelay();\n\n    /**\n     * @dev Error: \"OperatorableCallerNotOperator() nor admin nor relay\"\n     */\n    error OperatorableCallerNotOperatorOrAdminOrRelay();\n\n    /**\n     * @dev Error: \"Operatorable: address of new operators contract can not be zero\"\n     */\n    error OperatorableNewOperatorsZeroAddress();\n\n    /**\n     * @dev Error: \"Operatorable: should be called from new operators contract\"\n     */\n    error OperatorableCallerNotOperatorsContract(address _caller);\n\n    event OperatorsContractChanged(address indexed caller, address indexed operatorsAddress);\n    event OperatorsContractPending(address indexed caller, address indexed operatorsAddress);\n\n    /**\n     * @dev Reverts if sender does not have operator role associated.\n     */\n    modifier onlyOperator() {\n        if (!isOperator(msg.sender)) revert OperatorableCallerNotOperator();\n        _;\n    }\n\n    /**\n     * @dev Reverts if sender does not have admin role associated.\n     */\n    modifier onlyAdmin() {\n        if (!isAdmin(msg.sender)) revert OperatorableCallerNotAdmin();\n        _;\n    }\n\n    /**\n     * @dev Reverts if sender does not have system role associated.\n     */\n    modifier onlySystem() {\n        if (!isSystem(msg.sender)) revert OperatorableCallerNotSystem();\n        _;\n    }\n\n    /**\n     * @dev Reverts if sender does not have multisig privileges.\n     */\n    modifier onlyMultisig() {\n        if (!isMultisig(msg.sender)) revert OperatorableCallerNotMultisig();\n        _;\n    }\n\n    /**\n     * @dev Reverts if sender does not have admin or system role associated.\n     */\n    modifier onlyAdminOrSystem() {\n        if (!isAdminOrSystem(msg.sender)) revert OperatorableCallerNotAdminOrSystem();\n        _;\n    }\n\n    /**\n     * @dev Reverts if sender does not have operator or system role associated.\n     */\n    modifier onlyOperatorOrSystem() {\n        if (!isOperatorOrSystem(msg.sender)) revert OperatorableCallerNotOperatorOrSystem();\n        _;\n    }\n\n    /**\n     * @dev Reverts if sender does not have the relay role associated.\n     */\n    modifier onlyRelay() {\n        if (!isRelay(msg.sender)) revert OperatorableCallerNotRelay();\n        _;\n    }\n\n    /**\n     * @dev Reverts if sender does not have relay or operator role associated.\n     */\n    modifier onlyOperatorOrRelay() {\n        if (!isOperator(msg.sender) && !isRelay(msg.sender)) revert OperatorableCallerNotOperatorOrRelay();\n        _;\n    }\n\n    /**\n     * @dev Reverts if sender does not have relay or admin role associated.\n     */\n    modifier onlyAdminOrRelay() {\n        if (!isAdmin(msg.sender) && !isRelay(msg.sender)) revert OperatorableCallerNotAdminOrRelay();\n        _;\n    }\n\n    /**\n     * @dev Reverts if sender does not have the operator, or system, or relay role associated.\n     */\n    modifier onlyOperatorOrSystemOrRelay() {\n        if (!isOperator(msg.sender) && !isSystem(msg.sender) && !isRelay(msg.sender))\n            revert OperatorableCallerNotOperatorOrSystemOrRelay();\n        _;\n    }\n\n    /**\n     * @dev Reverts if sender does not have the operator, or admin, or relay role associated.\n     */\n    modifier onlyOperatorOrAdminOrRelay() {\n        if (!isOperator(msg.sender) && !isAdmin(msg.sender) && !isRelay(msg.sender))\n            revert OperatorableCallerNotOperatorOrAdminOrRelay();\n        _;\n    }\n\n    /**\n     * @dev Initialization instead of constructor, called once. The setOperatorsContract function can be called only by Admin role with\n     *       confirmation through the operators contract.\n     * @param _baseOperators BaseOperators contract address.\n     */\n    function initialize(address _baseOperators) public virtual initializer {\n        _setOperatorsContract(_baseOperators);\n    }\n\n    /**\n     * @dev Set the new the address of Operators contract, should be confirmed from operators contract by calling confirmFor(addr)\n     *       where addr is the address of current contract instance. This is done to prevent the case when the new contract address is\n     *       broken and control of the contract can be lost in such case\n     * @param _baseOperators BaseOperators contract address.\n     */\n    function setOperatorsContract(address _baseOperators) public onlyAdmin {\n        if (_baseOperators == address(0)) revert OperatorableNewOperatorsZeroAddress();\n\n        operatorsPending = _baseOperators;\n        emit OperatorsContractPending(msg.sender, _baseOperators);\n    }\n\n    /**\n     * @dev The function should be called from new operators contract by admin to ensure that operatorsPending address\n     *       is the real contract address.\n     */\n    function confirmOperatorsContract() public {\n        if (operatorsPending == address(0)) revert OperatorableNewOperatorsZeroAddress();\n\n        if (msg.sender != operatorsPending) revert OperatorableCallerNotOperatorsContract(msg.sender);\n\n        _setOperatorsContract(operatorsPending);\n    }\n\n    /**\n     * @return The address of the BaseOperators contract.\n     */\n    function getOperatorsContract() public view returns (address) {\n        return address(operatorsInst);\n    }\n\n    /**\n     * @return The pending address of the BaseOperators contract.\n     */\n    function getOperatorsPending() public view returns (address) {\n        return operatorsPending;\n    }\n\n    /**\n     * @return If '_account' has operator privileges.\n     */\n    function isOperator(address _account) public view returns (bool) {\n        return operatorsInst.isOperator(_account);\n    }\n\n    /**\n     * @return If '_account' has admin privileges.\n     */\n    function isAdmin(address _account) public view returns (bool) {\n        return operatorsInst.isAdmin(_account);\n    }\n\n    /**\n     * @return If '_account' has system privileges.\n     */\n    function isSystem(address _account) public view returns (bool) {\n        return operatorsInst.isSystem(_account);\n    }\n\n    /**\n     * @return If '_account' has relay privileges.\n     */\n    function isRelay(address _account) public view returns (bool) {\n        return operatorsInst.isRelay(_account);\n    }\n\n    /**\n     * @return If '_contract' has multisig privileges.\n     */\n    function isMultisig(address _contract) public view returns (bool) {\n        return operatorsInst.isMultisig(_contract);\n    }\n\n    /**\n     * @return If '_account' has admin or system privileges.\n     */\n    function isAdminOrSystem(address _account) public view returns (bool) {\n        return (operatorsInst.isAdmin(_account) || operatorsInst.isSystem(_account));\n    }\n\n    /**\n     * @return If '_account' has operator or system privileges.\n     */\n    function isOperatorOrSystem(address _account) public view returns (bool) {\n        return (operatorsInst.isOperator(_account) || operatorsInst.isSystem(_account));\n    }\n\n    /** INTERNAL FUNCTIONS */\n    function _setOperatorsContract(address _baseOperators) internal {\n        if (_baseOperators == address(0)) revert OperatorableNewOperatorsZeroAddress();\n\n        operatorsInst = IBaseOperators(_baseOperators);\n        emit OperatorsContractChanged(msg.sender, _baseOperators);\n    }\n}\n"},{"file_path":"apps/equity/contracts/token/upgrade/prd/SygnumTokenV5.sol","source_code":"/**\n * @title MetadataUpgrade\n * @author Team 3301 <team3301@sygnum.com>\n * @dev Upgraded SygnumToken. This upgrade allows operator accounts to mint and burn tokens while paused.\n */\npragma solidity 0.8.8;\n\nimport \"@sygnum/solidity-base-contracts/contracts/helpers/CLPriceFeedConnector.sol\";\nimport \"./SygnumTokenV4.sol\";\n\ncontract SygnumTokenV5 is SygnumTokenV4, CLPriceFeedConnector {\n    bool public initializedV5;\n\n    error SygnumTokenV5AlreadyInitialized();\n\n    // changed back to public for tests\n    function initializeContractsAndConstructor(\n        string memory _name,\n        string memory _symbol,\n        uint8 _decimals,\n        bytes4 _category,\n        string memory _class,\n        address _issuer,\n        address _baseOperators,\n        address _whitelist,\n        address _traderOperators,\n        address _blockerOperators,\n        string memory _tokenURI,\n        address _priceFeed\n    ) public virtual {\n        SygnumTokenV4.initializeContractsAndConstructor(\n            _name,\n            _symbol,\n            _decimals,\n            _category,\n            _class,\n            _issuer,\n            _baseOperators,\n            _whitelist,\n            _traderOperators,\n            _blockerOperators,\n            _tokenURI\n        );\n        initializeV5(_priceFeed);\n    }\n\n    function initializeV5(address _priceFeed) public virtual {\n        if (initializedV5) revert SygnumTokenV5AlreadyInitialized();\n        _setPriceFeedOracle(_priceFeed);\n        initializedV5 = true;\n    }\n\n    /**\n     * @dev sets the price feed oracle with the provided addresss\n     * @param _newPriceFeedOracle the new price feed oracle address\n     */\n    function setPriceFeedOracle(address _newPriceFeedOracle) public virtual onlyAdmin {\n        _setPriceFeedOracle(_newPriceFeedOracle);\n    }\n}\n"},{"file_path":"apps/baseContracts/contracts/helpers/CLPriceFeedConnector.sol","source_code":"// SPDX-License-Identifier: UNLICENSED\n\n/**\n * @title CLPriceFeedConnector\n * @author Team 3301 <team3301@sygnum.com>\n * @dev\n */\n\npragma solidity ^0.8.8;\n\nimport \"./interface/ICLPriceFeedConnector.sol\";\n\nimport {AggregatorV2V3Interface} from \"@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV2V3Interface.sol\";\n\ncontract CLPriceFeedConnector is ICLPriceFeedConnector {\n    AggregatorV2V3Interface internal priceFeed;\n    /**\n     * @dev Event: \"Upon changing the address of CLPriceFeedConnector\"\n     */\n    event OracleContractChanged(address indexed newOracle);\n\n    /**\n     * @dev Returns the asset price in the base currency as per the description\n     * @return (int256) latest price of the asset from the price feed\n     */\n    function getAssetPrice() external view virtual override returns (int256) {\n        if (address(priceFeed) == address(0)) return 0;\n        (, int256 assetPrice, , , ) = AggregatorV2V3Interface(priceFeed).latestRoundData();\n        return assetPrice;\n    }\n\n    /**\n     * @dev Returns the decimals of data feed or price feed oracle.  asset and in which the base currency the asset price is calculated.\n     * @return (uint8) decimals of price/data feed of the asset\n     */\n    function getPriceFeedDecimals() external view returns (uint8) {\n        if (address(priceFeed) == address(0)) return 0;\n        return AggregatorV2V3Interface(priceFeed).decimals();\n    }\n\n    /**\n     * @dev Returns the description of data feed or price feed oracle. Mostly the description of which asset and in which the base currency the asset price is calculated.\n     * @return (string) description of price/data feed of the asset\n     */\n    function getPriceFeedDescription() external view returns (string memory) {\n        if (address(priceFeed) == address(0)) return \"\";\n        return AggregatorV2V3Interface(priceFeed).description();\n    }\n\n    /**\n     * @dev Returns the address or the proxy address of the price feed or data feed oracle configured\n     * @return (address) address of the oracle\n     */\n    function getPriceFeedOracle() external view returns (address) {\n        return address(priceFeed);\n    }\n\n    /** INTERNAL FUNCTIONS */\n    function _setPriceFeedOracle(address _newPriceFeedOracle) internal {\n        priceFeed = AggregatorV2V3Interface(_newPriceFeedOracle);\n        emit OracleContractChanged(_newPriceFeedOracle);\n    }\n}\n"},{"file_path":"apps/baseContracts/contracts/helpers/interface/ICLPriceFeedConnector.sol","source_code":"// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.8;\n\n/**\n * @title IPriceOracle\n * @author Team 3301 <team3301@sygnum.com>\n * @dev Defines the basic interface for a Price oracle.\n */\ninterface ICLPriceFeedConnector {\n    /**\n     * @dev Returns the asset price in the base currency as per the description\n     * @return (int256) latest price of the asset from the price feed\n     */\n    function getAssetPrice() external view returns (int256);\n\n    /**\n     * @dev Returns the address or the proxy address of the price feed or data feed oracle configured\n     * @return (address) address of the oracle\n     */\n    function getPriceFeedOracle() external view returns (address);\n\n    /**\n     * @dev Returns the description of data feed or price feed oracle. Mostly the asset and in which the base currency the asset price is calculated.\n     * @return (string) description of price/data feed of the asset\n     */\n    function getPriceFeedDescription() external view returns (string memory);\n\n    /**\n     * @dev Returns the decimals of data feed or price feed oracle.  asset and in which the base currency the asset price is calculated.\n     * @return (uint8) decimals of price/data feed of the asset\n     */\n    function getPriceFeedDecimals() external view returns (uint8);\n}\n"},{"file_path":"apps/baseContracts/contracts/role/blocker/BlockerOperatorable.sol","source_code":"// SPDX-License-Identifier: Unlicensed\n\n/**\n * @title BlockerOperatorable\n * @author Team 3301 <team3301@sygnum.com>\n * @dev BlockerOperatorable contract stores BlockerOperators contract address, and modifiers for\n *      contracts.\n */\n\npragma solidity ^0.8.0;\n\nimport \"../interface/IBlockerOperators.sol\";\nimport \"../base/Operatorable.sol\";\nimport \"../../helpers/Initializable.sol\";\n\ncontract BlockerOperatorable is Operatorable {\n    IBlockerOperators internal blockerOperatorsInst;\n    address private blockerOperatorsPending;\n\n    /**\n     * @dev Error: \"BlockerOperatorable: caller is not blocker role\"\n     */\n    error BlockerOperatorableCallerNotBlocker();\n\n    /**\n     * @dev Error: \"BlockerOperatorable: caller is not blocker or operator role\"\n     */\n    error BlockerOperatorableCallerNotBlockerOrOperator();\n\n    /**\n     * @dev Error: \"BlockerOperatorable: address of new blockerOperators contract can not be zero.\"\n     */\n    error BlockerOperatorableNewBlockerOperatorsAddressZero();\n\n    /**\n     * @dev Error: \"BlockerOperatorable: address of pending blockerOperators contract can not be zero\"\n     */\n    error BlockerOperatorablePendingBlockerOperatorsAddressZero();\n\n    /**\n     * @dev Error: \"BlockerOperatorable: should be called from new blockerOperators contract\"\n     */\n    error BlockerOperatorableCallerNotNewBlockerOperator();\n\n    event BlockerOperatorsContractChanged(address indexed caller, address indexed blockerOperatorAddress);\n    event BlockerOperatorsContractPending(address indexed caller, address indexed blockerOperatorAddress);\n\n    /**\n     * @dev Reverts if sender does not have the blocker role associated.\n     */\n    modifier onlyBlocker() {\n        if (!isBlocker(msg.sender)) revert BlockerOperatorableCallerNotBlocker();\n        _;\n    }\n\n    /**\n     * @dev Reverts if sender does not have the blocker or operator role associated.\n     */\n    modifier onlyBlockerOrOperator() {\n        if (!isBlocker(msg.sender) && !isOperator(msg.sender)) revert BlockerOperatorableCallerNotBlockerOrOperator();\n        _;\n    }\n\n    /**\n     * @dev Initialization instead of constructor, called once. The setBlockerOperatorsContract function can be called only by Admin role with\n     * confirmation through the operators contract.\n     * @param _baseOperators BaseOperators contract address.\n     * @param _blockerOperators BlockerOperators contract address.\n     */\n    function initialize(address _baseOperators, address _blockerOperators) public virtual initializer {\n        super.initialize(_baseOperators);\n        _setBlockerOperatorsContract(_blockerOperators);\n    }\n\n    /**\n     * @dev Set the new the address of BlockerOperators contract, should be confirmed from BlockerOperators contract by calling confirmFor(addr)\n     * where addr is the address of current contract instance. This is done to prevent the case when the new contract address is\n     * broken and control of the contract can be lost in such case.\n     * @param _blockerOperators BlockerOperators contract address.\n     */\n    function setBlockerOperatorsContract(address _blockerOperators) public onlyAdmin {\n        if (_blockerOperators == address(0)) revert BlockerOperatorableNewBlockerOperatorsAddressZero();\n\n        blockerOperatorsPending = _blockerOperators;\n        emit BlockerOperatorsContractPending(msg.sender, _blockerOperators);\n    }\n\n    /**\n     * @dev The function should be called from new BlockerOperators contract by admin to insure that blockerOperatorsPending address\n     *       is the real contract address.\n     */\n    function confirmBlockerOperatorsContract() public {\n        if (blockerOperatorsPending == address(0)) revert BlockerOperatorablePendingBlockerOperatorsAddressZero();\n        if (msg.sender != blockerOperatorsPending) revert BlockerOperatorableCallerNotNewBlockerOperator();\n\n        _setBlockerOperatorsContract(blockerOperatorsPending);\n    }\n\n    /**\n     * @return The address of the BlockerOperators contract.\n     */\n    function getBlockerOperatorsContract() public view returns (address) {\n        return address(blockerOperatorsInst);\n    }\n\n    /**\n     * @return The pending BlockerOperators contract address\n     */\n    function getBlockerOperatorsPending() public view returns (address) {\n        return blockerOperatorsPending;\n    }\n\n    /**\n     * @return If '_account' has blocker privileges.\n     */\n    function isBlocker(address _account) public view returns (bool) {\n        return blockerOperatorsInst.isBlocker(_account);\n    }\n\n    /** INTERNAL FUNCTIONS */\n    function _setBlockerOperatorsContract(address _blockerOperators) internal {\n        if (_blockerOperators == address(0)) revert BlockerOperatorableNewBlockerOperatorsAddressZero();\n\n        blockerOperatorsInst = IBlockerOperators(_blockerOperators);\n        emit BlockerOperatorsContractChanged(msg.sender, _blockerOperators);\n    }\n}\n"},{"file_path":"dependencies/@openzeppelin-contracts-4.9.3/utils/math/SafeMath.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/SafeMath.sol)\n\npragma solidity ^0.8.0;\n\n// CAUTION\n// This version of SafeMath should only be used with Solidity 0.8 or later,\n// because it relies on the compiler's built in overflow checks.\n\n/**\n * @dev Wrappers over Solidity's arithmetic operations.\n *\n * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler\n * now has built in overflow checking.\n */\nlibrary SafeMath {\n    /**\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\n     *\n     * _Available since v3.4._\n     */\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n        unchecked {\n            uint256 c = a + b;\n            if (c < a) return (false, 0);\n            return (true, c);\n        }\n    }\n\n    /**\n     * @dev Returns the subtraction of two unsigned integers, with an overflow flag.\n     *\n     * _Available since v3.4._\n     */\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n        unchecked {\n            if (b > a) return (false, 0);\n            return (true, a - b);\n        }\n    }\n\n    /**\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\n     *\n     * _Available since v3.4._\n     */\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n        unchecked {\n            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\n            // benefit is lost if 'b' is also tested.\n            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\n            if (a == 0) return (true, 0);\n            uint256 c = a * b;\n            if (c / a != b) return (false, 0);\n            return (true, c);\n        }\n    }\n\n    /**\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\n     *\n     * _Available since v3.4._\n     */\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n        unchecked {\n            if (b == 0) return (false, 0);\n            return (true, a / b);\n        }\n    }\n\n    /**\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\n     *\n     * _Available since v3.4._\n     */\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n        unchecked {\n            if (b == 0) return (false, 0);\n            return (true, a % b);\n        }\n    }\n\n    /**\n     * @dev Returns the addition of two unsigned integers, reverting on\n     * overflow.\n     *\n     * Counterpart to Solidity's `+` operator.\n     *\n     * Requirements:\n     *\n     * - Addition cannot overflow.\n     */\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\n        return a + b;\n    }\n\n    /**\n     * @dev Returns the subtraction of two unsigned integers, reverting on\n     * overflow (when the result is negative).\n     *\n     * Counterpart to Solidity's `-` operator.\n     *\n     * Requirements:\n     *\n     * - Subtraction cannot overflow.\n     */\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\n        return a - b;\n    }\n\n    /**\n     * @dev Returns the multiplication of two unsigned integers, reverting on\n     * overflow.\n     *\n     * Counterpart to Solidity's `*` operator.\n     *\n     * Requirements:\n     *\n     * - Multiplication cannot overflow.\n     */\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\n        return a * b;\n    }\n\n    /**\n     * @dev Returns the integer division of two unsigned integers, reverting on\n     * division by zero. The result is rounded towards zero.\n     *\n     * Counterpart to Solidity's `/` operator.\n     *\n     * Requirements:\n     *\n     * - The divisor cannot be zero.\n     */\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\n        return a / b;\n    }\n\n    /**\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n     * reverting when dividing by zero.\n     *\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\n     * invalid opcode to revert (consuming all remaining gas).\n     *\n     * Requirements:\n     *\n     * - The divisor cannot be zero.\n     */\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\n        return a % b;\n    }\n\n    /**\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\n     * overflow (when the result is negative).\n     *\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\n     * message unnecessarily. For custom revert reasons use {trySub}.\n     *\n     * Counterpart to Solidity's `-` operator.\n     *\n     * Requirements:\n     *\n     * - Subtraction cannot overflow.\n     */\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\n        unchecked {\n            require(b <= a, errorMessage);\n            return a - b;\n        }\n    }\n\n    /**\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\n     * division by zero. The result is rounded towards zero.\n     *\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\n     * uses an invalid opcode to revert (consuming all remaining gas).\n     *\n     * Requirements:\n     *\n     * - The divisor cannot be zero.\n     */\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\n        unchecked {\n            require(b > 0, errorMessage);\n            return a / b;\n        }\n    }\n\n    /**\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n     * reverting with custom message when dividing by zero.\n     *\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\n     * message unnecessarily. For custom revert reasons use {tryMod}.\n     *\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\n     * invalid opcode to revert (consuming all remaining gas).\n     *\n     * Requirements:\n     *\n     * - The divisor cannot be zero.\n     */\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\n        unchecked {\n            require(b > 0, errorMessage);\n            return a % b;\n        }\n    }\n}\n"},{"file_path":"apps/baseContracts/contracts/helpers/ERC20/ERC20Burnable.sol","source_code":"// SPDX-License-Identifier: UNLICENSED\n\n/**\n * @title ERC20Burnable\n * @author Team 3301 <team3301@sygnum.com>\n * @dev For burning funds from particular user addresses.\n */\n\npragma solidity ^0.8.0;\n\nimport \"./ERC20Snapshot.sol\";\nimport \"../../role/base/Operatorable.sol\";\n\ncontract ERC20Burnable is ERC20Snapshot, Operatorable {\n    /**\n     * @dev Overload ERC20 _burnFor, burning funds from a particular users address.\n     * @param account address to burn funds from.\n     * @param amount of funds to burn.\n     */\n\n    function _burnFor(address account, uint256 amount) internal virtual override onlyOperator {\n        super._burn(account, amount);\n    }\n}\n"},{"file_path":"apps/baseContracts/contracts/helpers/ERC20/ERC20Snapshot.sol","source_code":"// SPDX-License-Identifier: UNLICENSED\n\n/**\n * @title ERC20Snapshot\n * @author Team 3301 <team3301@sygnum.com>\n * @notice Records historical balances.\n */\npragma solidity ^0.8.0;\n\nimport \"@openzeppelin/contracts/utils/math/SafeMath.sol\";\nimport \"./ERC20Overload/ERC20.sol\";\n\ncontract ERC20Snapshot is ERC20 {\n    using SafeMath for uint256;\n\n    /**\n     * @dev `Snapshot` is the structure that attaches a block number to a\n     * given value. The block number attached is the one that last changed the value\n     */\n    struct Snapshot {\n        uint256 fromBlock; // `fromBlock` is the block number at which the value was generated from\n        uint256 value; // `value` is the amount of tokens at a specific block number\n    }\n\n    /**\n     * @dev `_snapshotBalances` is the map that tracks the balance of each address, in this\n     * contract when the balance changes the block number that the change\n     * occurred is also included in the map\n     */\n    mapping(address => Snapshot[]) private _snapshotBalances;\n\n    // Tracks the history of the `totalSupply` of the token\n    Snapshot[] private _snapshotTotalSupply;\n\n    /**\n     * @dev Queries the balance of `_owner` at a specific `_blockNumber`\n     * @param _owner The address from which the balance will be retrieved\n     * @param _blockNumber The block number when the balance is queried\n     * @return The balance at `_blockNumber`\n     */\n    function balanceOfAt(address _owner, uint256 _blockNumber) public view returns (uint256) {\n        return getValueAt(_snapshotBalances[_owner], _blockNumber);\n    }\n\n    /**\n     * @dev Total amount of tokens at a specific `_blockNumber`.\n     * @param _blockNumber The block number when the totalSupply is queried\n     * @return The total amount of tokens at `_blockNumber`\n     */\n    function totalSupplyAt(uint256 _blockNumber) public view returns (uint256) {\n        return getValueAt(_snapshotTotalSupply, _blockNumber);\n    }\n\n    /**\n     * @dev `getValueAt` retrieves the number of tokens at a given block number\n     * @param checkpoints The history of values being queried\n     * @param _block The block number to retrieve the value at\n     * @return The number of tokens being queried\n     */\n    function getValueAt(Snapshot[] storage checkpoints, uint256 _block) internal view returns (uint256) {\n        if (checkpoints.length == 0) return 0;\n\n        // Shortcut for the actual value\n        if (_block >= checkpoints[checkpoints.length.sub(1)].fromBlock) {\n            return checkpoints[checkpoints.length.sub(1)].value;\n        }\n\n        if (_block < checkpoints[0].fromBlock) {\n            return 0;\n        }\n\n        // Binary search of the value in the array\n        uint256 min;\n        uint256 max = checkpoints.length.sub(1);\n\n        while (max > min) {\n            uint256 mid = (max.add(min).add(1)).div(2);\n            if (checkpoints[mid].fromBlock <= _block) {\n                min = mid;\n            } else {\n                max = mid.sub(1);\n            }\n        }\n\n        return checkpoints[min].value;\n    }\n\n    /**\n     * @dev `updateValueAtNow` used to update the `_snapshotBalances` map and the `_snapshotTotalSupply`\n     * @param checkpoints The history of data being updated\n     * @param _value The new number of tokens\n     */\n    function updateValueAtNow(Snapshot[] storage checkpoints, uint256 _value) internal {\n        if ((checkpoints.length == 0) || (checkpoints[checkpoints.length.sub(1)].fromBlock < block.number)) {\n            checkpoints.push(Snapshot(block.number, _value));\n        } else {\n            checkpoints[checkpoints.length.sub(1)].value = _value;\n        }\n    }\n\n    /**\n     * @dev Internal function that transfers an amount of the token and assigns it to\n     * an account. This encapsulates the modification of balances such that the\n     * proper events are emitted.\n     * @param to The account that will receive the created tokens.\n     * @param value The amount that will be created.\n     */\n    function transfer(address to, uint256 value) public virtual override returns (bool result) {\n        result = super.transfer(to, value);\n        updateValueAtNow(_snapshotTotalSupply, totalSupply());\n        updateValueAtNow(_snapshotBalances[msg.sender], balanceOf(msg.sender));\n        updateValueAtNow(_snapshotBalances[to], balanceOf(to));\n    }\n\n    /**\n     * @dev Internal function that transfers an amount of the token and assigns it to\n     * an account. This encapsulates the modification of balances such that the\n     * proper events are emitted.\n     * @param from The account that funds will be taken from.\n     * @param to The account that funds will be given too.\n     * @param value The amount of funds to be transferred..\n     */\n    function transferFrom(address from, address to, uint256 value) public virtual override returns (bool result) {\n        result = super.transferFrom(from, to, value);\n        updateValueAtNow(_snapshotTotalSupply, totalSupply());\n        updateValueAtNow(_snapshotBalances[from], balanceOf(from));\n        updateValueAtNow(_snapshotBalances[to], balanceOf(to));\n    }\n\n    /**\n     * @dev Internal function that confiscates an amount of the token and assigns it to\n     * an account. This encapsulates the modification of balances such that the\n     * proper events are emitted.\n     * @param confiscatee The account that funds will be taken from.\n     * @param receiver The account that funds will be given too.\n     * @param amount The amount of funds to be transferred..\n     */\n    function _confiscate(address confiscatee, address receiver, uint256 amount) internal virtual {\n        super._transfer(confiscatee, receiver, amount);\n        updateValueAtNow(_snapshotTotalSupply, totalSupply());\n        updateValueAtNow(_snapshotBalances[confiscatee], balanceOf(confiscatee));\n        updateValueAtNow(_snapshotBalances[receiver], balanceOf(receiver));\n    }\n\n    /**\n     * @dev Internal function that mints an amount of the token and assigns it to\n     * an account. This encapsulates the modification of balances such that the\n     * proper events are emitted.\n     * @param account The account that will receive the created tokens.\n     * @param amount The amount that will be created.\n     */\n    function _mint(address account, uint256 amount) internal virtual override {\n        super._mint(account, amount);\n        updateValueAtNow(_snapshotTotalSupply, totalSupply());\n        updateValueAtNow(_snapshotBalances[account], balanceOf(account));\n    }\n\n    /**\n     * @dev Internal function that burns an amount of the token of a given\n     * account.\n     * @param account The account whose tokens will be burnt.\n     * @param amount The amount that will be burnt.\n     */\n    function _burn(address account, uint256 amount) internal virtual override {\n        super._burn(account, amount);\n        updateValueAtNow(_snapshotTotalSupply, totalSupply());\n        updateValueAtNow(_snapshotBalances[account], balanceOf(account));\n    }\n\n    /**\n     * @dev Internal function that burns an amount of the token of a given\n     * account.\n     * @param account The account whose tokens will be burnt.\n     * @param amount The amount that will be burnt.\n     */\n    function _burnFor(address account, uint256 amount) internal virtual {\n        super._burn(account, amount);\n        updateValueAtNow(_snapshotTotalSupply, totalSupply());\n        updateValueAtNow(_snapshotBalances[account], balanceOf(account));\n    }\n\n    /**\n     * @dev Internal function that burns an amount of the token of a given\n     * account, deducting from the sender's allowance for said account. Uses the\n     * internal burn function.\n     * @param account The account whose tokens will be burnt.\n     * @param amount The amount that will be burnt.\n     */\n    function _burnFrom(address account, uint256 amount) internal virtual override {\n        super._burnFrom(account, amount);\n        updateValueAtNow(_snapshotTotalSupply, totalSupply());\n        updateValueAtNow(_snapshotBalances[account], balanceOf(account));\n    }\n}\n"},{"file_path":"apps/baseContracts/contracts/helpers/ERC20/ERC20Mintable.sol","source_code":"// SPDX-License-Identifier: UNLICENSED\n\n/**\n * @title ERC20Mintable\n * @author Team 3301 <team3301@sygnum.com>\n * @dev For blocking and unblocking particular user funds.\n */\n\npragma solidity ^0.8.0;\n\nimport \"./ERC20Overload/ERC20.sol\";\nimport \"../../role/base/Operatorable.sol\";\n\ncontract ERC20Mintable is ERC20, Operatorable {\n    /**\n     * @dev Error: \"ERC20Mintable: amount has to be greater than 0\"\n     */\n    error ERC20MintableZeroMintAmount();\n\n    /**\n     * @dev Overload _mint to ensure only operator or system can mint funds.\n     * @param account address that will recieve new funds.\n     * @param amount of funds to be minted.\n     */\n    function _mint(address account, uint256 amount) internal virtual override onlyOperatorOrSystem {\n        if (amount <= 0) revert ERC20MintableZeroMintAmount();\n\n        super._mint(account, amount);\n    }\n}\n"},{"file_path":"apps/equity/contracts/token/ERC20/ERC20Detailed.sol","source_code":"/**\n * @title ERC20Detailed\n * @author OpenZeppelin-Solidity = \"openzeppelin-solidity/contracts/token/ERC20/ERC20Detailed.sol\", and rmeoval\n *  of IERC20 due to \" contract binary not set. Can't deploy new instance.\n * This contract may be abstract, not implement an abstract parent's methods completely\n * or not invoke an inherited contract's constructor correctly\"\n */\n\npragma solidity 0.8.8;\n\n/**\n * @dev Optional functions from the ERC20 standard.\n */\ncontract ERC20Detailed {\n    string internal _name;\n    string internal _symbol;\n    uint8 internal _decimals;\n\n    /**\n     * @dev Returns the name of the token.\n     */\n    function name() public view virtual returns (string memory) {\n        return _name;\n    }\n\n    /**\n     * @dev Returns the symbol of the token, usually a shorter version of the\n     * name.\n     */\n    function symbol() public view virtual returns (string memory) {\n        return _symbol;\n    }\n\n    /**\n     * @dev Returns the number of decimals used to get its user representation.\n     * For example, if `decimals` equals `2`, a balance of `505` tokens should\n     * be displayed to a user as `5,05` (`505 / 10 ** 2`).\n     *\n     * Tokens usually opt for a value of 18, imitating the relationship between\n     * Ether and Wei.\n     *\n     * > Note that this information is only used for _display_ purposes: it in\n     * no way affects any of the arithmetic of the contract, including\n     * `IERC20.balanceOf` and `IERC20.transfer`.\n     */\n    function decimals() public view virtual returns (uint8) {\n        return _decimals;\n    }\n}\n"},{"file_path":"dependencies/@chainlink-contracts-1.3.0/src/v0.8/shared/interfaces/AggregatorInterface.sol","source_code":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n// solhint-disable-next-line interface-starts-with-i\ninterface AggregatorInterface {\n  function latestAnswer() external view returns (int256);\n\n  function latestTimestamp() external view returns (uint256);\n\n  function latestRound() external view returns (uint256);\n\n  function getAnswer(uint256 roundId) external view returns (int256);\n\n  function getTimestamp(uint256 roundId) external view returns (uint256);\n\n  event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 updatedAt);\n\n  event NewRound(uint256 indexed roundId, address indexed startedBy, uint256 startedAt);\n}\n"},{"file_path":"apps/baseContracts/contracts/helpers/ERC20/ERC20Freezable.sol","source_code":"// SPDX-License-Identifier: UNLICENSED\n\n/**\n * @title ERC20Freezable\n * @author Team 3301 <team3301@sygnum.com>\n * @dev Overloading ERC20 functions to ensure client addresses are not frozen for particular actions.\n */\n\npragma solidity ^0.8.0;\n\nimport \"./ERC20Overload/ERC20.sol\";\nimport \"../Freezable.sol\";\n\ncontract ERC20Freezable is ERC20, Freezable {\n    /**\n     * @dev Overload transfer function to ensure sender and receiver have not been frozen.\n     * @param to address that recieves the funds.\n     * @param value amount of funds.\n     */\n    function transfer(\n        address to,\n        uint256 value\n    ) public virtual override whenNotFrozen(msg.sender) whenNotFrozen(to) returns (bool) {\n        return super.transfer(to, value);\n    }\n\n    /**\n     * @dev Overload approve function to ensure sender and receiver have not been frozen.\n     * @param spender address that can spend the funds.\n     * @param value amount of funds.\n     */\n    function approve(\n        address spender,\n        uint256 value\n    ) public virtual override whenNotFrozen(msg.sender) whenNotFrozen(spender) returns (bool) {\n        return super.approve(spender, value);\n    }\n\n    /**\n     * @dev Overload transferFrom function to ensure sender, approver and receiver have not been frozen.\n     * @param from address that funds will be transferred from.\n     * @param to address that funds will be transferred to.\n     * @param value amount of funds.\n     */\n    function transferFrom(\n        address from,\n        address to,\n        uint256 value\n    ) public virtual override whenNotFrozen(msg.sender) whenNotFrozen(from) whenNotFrozen(to) returns (bool) {\n        return super.transferFrom(from, to, value);\n    }\n\n    /**\n     * @dev Overload increaseAllowance function to ensure sender and spender have not been frozen.\n     * @param spender address that will be allowed to transfer funds.\n     * @param addedValue amount of funds to added to current allowance.\n     */\n    function increaseAllowance(\n        address spender,\n        uint256 addedValue\n    ) public virtual override whenNotFrozen(msg.sender) whenNotFrozen(spender) returns (bool) {\n        return super.increaseAllowance(spender, addedValue);\n    }\n\n    /**\n     * @dev Overload decreaseAllowance function to ensure sender and spender have not been frozen.\n     * @param spender address that will be allowed to transfer funds.\n     * @param subtractedValue amount of funds to be deducted to current allowance.\n     */\n    function decreaseAllowance(\n        address spender,\n        uint256 subtractedValue\n    ) public virtual override whenNotFrozen(msg.sender) whenNotFrozen(spender) returns (bool) {\n        return super.decreaseAllowance(spender, subtractedValue);\n    }\n\n    /**\n     * @dev Overload _burnfrom function to ensure sender and user to be burned from have not been frozen.\n     * @param account account that funds will be burned from.\n     * @param amount amount of funds to be burned.\n     */\n    function _burnFrom(\n        address account,\n        uint256 amount\n    ) internal virtual override whenNotFrozen(msg.sender) whenNotFrozen(account) {\n        super._burnFrom(account, amount);\n    }\n}\n"},{"file_path":"apps/equity/contracts/token/SygnumToken.sol","source_code":"/**\n * @title SygnumToken\n * @author Team 3301 <team3301@sygnum.com>\n * @notice ERC20 token with additional features.\n */\n\npragma solidity 0.8.8;\n\nimport \"./ERC20/ERC20SygnumDetailed.sol\";\nimport \"@sygnum/solidity-base-contracts/contracts/helpers/ERC20/ERC20Whitelist.sol\";\nimport \"@sygnum/solidity-base-contracts/contracts/helpers/ERC20/ERC20Pausable.sol\";\nimport \"@sygnum/solidity-base-contracts/contracts/helpers/ERC20/ERC20Mintable.sol\";\nimport \"@sygnum/solidity-base-contracts/contracts/helpers/ERC20/ERC20Burnable.sol\";\nimport \"@sygnum/solidity-base-contracts/contracts/helpers/ERC20/ERC20Freezable.sol\";\nimport \"@sygnum/solidity-base-contracts/contracts/helpers/ERC20/ERC20Destroyable.sol\";\nimport \"@sygnum/solidity-base-contracts/contracts/helpers/ERC20/ERC20Snapshot.sol\";\nimport \"@sygnum/solidity-base-contracts/contracts/helpers/ERC20/ERC20Tradeable.sol\";\nimport \"@sygnum/solidity-base-contracts/contracts/helpers/ERC20/ERC20Blockable.sol\";\n\ncontract SygnumToken is\n    ERC20Snapshot,\n    ERC20SygnumDetailed,\n    ERC20Pausable,\n    ERC20Mintable,\n    ERC20Whitelist,\n    ERC20Tradeable,\n    ERC20Blockable,\n    ERC20Burnable,\n    ERC20Freezable,\n    ERC20Destroyable\n{\n    /**\n     * @dev Error: \"SygnumToken: Account must not be frozen.\"\n     */\n    error SygnumTokenAccountFrozen(address _account);\n\n    /**\n     * @dev Error: \"SygnumToken: Account must not be frozen if system calling.\"\n     */\n    error SygnumTokenSystemCallAccountFrozen(address _account);\n\n    /**\n     * @dev Error: \"SygnumToken: values and recipients are not equal.\"\n     */\n    error SygnumTokenUnequalArrayLengths();\n\n    /**\n     * @dev Error: \"SygnumToken: batch count is greater than BATCH_LIMIT.\"\n     */\n    error SygnumTokenBatchCountExceedsLimit();\n\n    /**\n     * @dev Error: \"SygnumToken: initialize() disabled\"\n     */\n    error SygnumTokenDisabledInitialize();\n\n    event Minted(address indexed minter, address indexed account, uint256 value);\n    event Burned(address indexed burner, uint256 value);\n    event BurnedFor(address indexed burner, address indexed account, uint256 value);\n    event Confiscated(address indexed account, uint256 amount, address indexed receiver);\n\n    uint16 internal constant BATCH_LIMIT = 256;\n\n    /**\n     * @dev Initializer obligatorily overriding the initializer() functions\n     *     of the base contracts. For the moment, just used to disable\n     *     inherited functions.\n     */\n    function initialize(\n        address,\n        address\n    ) public virtual override(BlockerOperatorable, TraderOperatorable, Whitelistable) {\n        revert SygnumTokenDisabledInitialize();\n    }\n\n    /**\n     * @dev Initialize contracts.\n     * @param _baseOperators Base operators contract address.\n     * @param _whitelist Whitelist contract address.\n     * @param _traderOperators Trader operators contract address.\n     * @param _blockerOperators Blocker operators contract address.\n     */\n    function initializeContractsAndConstructor(\n        string memory _name,\n        string memory _symbol,\n        uint8 _decimals,\n        bytes4 _category,\n        string memory _class,\n        address _issuer,\n        address _baseOperators,\n        address _whitelist,\n        address _traderOperators,\n        address _blockerOperators\n    ) public virtual initializer {\n        super.initialize(_baseOperators);\n        _setWhitelistContract(_whitelist);\n        _setTraderOperatorsContract(_traderOperators);\n        _setBlockerOperatorsContract(_blockerOperators);\n        _setDetails(_name, _symbol, _decimals, _category, _class, _issuer);\n    }\n\n    /**\n     * @dev Burn.\n     * @param _amount Amount of tokens to burn.\n     */\n    function burn(uint256 _amount) public virtual {\n        if (isFrozen(msg.sender)) revert SygnumTokenAccountFrozen(msg.sender);\n        _burn(msg.sender, _amount);\n        emit Burned(msg.sender, _amount);\n    }\n\n    /**\n     * @dev BurnFor.\n     * @param _account Address to burn tokens for.\n     * @param _amount Amount of tokens to burn.\n     */\n    function burnFor(address _account, uint256 _amount) public virtual {\n        _burnFor(_account, _amount);\n        emit BurnedFor(msg.sender, _account, _amount);\n    }\n\n    /**\n     * @dev BurnFrom.\n     * @param _account Address to burn tokens from.\n     * @param _amount Amount of tokens to burn.\n     */\n    function burnFrom(address _account, uint256 _amount) public virtual {\n        _burnFrom(_account, _amount);\n        emit Burned(_account, _amount);\n    }\n\n    /**\n     * @dev Mint.\n     * @param _account Address to mint tokens to.\n     * @param _amount Amount to mint.\n     */\n    function mint(address _account, uint256 _amount) public virtual {\n        if (isSystem(msg.sender)) {\n            if (isFrozen(_account)) revert SygnumTokenSystemCallAccountFrozen(_account);\n        }\n        _mint(_account, _amount);\n        emit Minted(msg.sender, _account, _amount);\n    }\n\n    /**\n     * @dev Confiscate.\n     * @param _confiscatee Account to confiscate funds from.\n     * @param _receiver Account to transfer confiscated funds to.\n     * @param _amount Amount of tokens to confiscate.\n     */\n    function confiscate(\n        address _confiscatee,\n        address _receiver,\n        uint256 _amount\n    ) public virtual onlyOperator whenNotPaused whenWhitelisted(_receiver) whenWhitelisted(_confiscatee) {\n        _confiscate(_confiscatee, _receiver, _amount);\n        emit Confiscated(_confiscatee, _amount, _receiver);\n    }\n\n    /**\n     * @dev Batch burn for.\n     * @param _amounts Array of all values to burn.\n     * @param _accounts Array of all addresses to burn from.\n     */\n    function batchBurnFor(address[] memory _accounts, uint256[] memory _amounts) public virtual {\n        if (_accounts.length != _amounts.length) revert SygnumTokenUnequalArrayLengths();\n        if (_accounts.length > BATCH_LIMIT) revert SygnumTokenBatchCountExceedsLimit();\n\n        for (uint256 i = 0; i < _accounts.length; ++i) {\n            burnFor(_accounts[i], _amounts[i]);\n        }\n    }\n\n    /**\n     * @dev Batch mint.\n     * @param _accounts Array of all addresses to mint to.\n     * @param _amounts Array of all values to mint.\n     */\n    function batchMint(address[] memory _accounts, uint256[] memory _amounts) public virtual {\n        if (_accounts.length != _amounts.length) revert SygnumTokenUnequalArrayLengths();\n        if (_accounts.length > BATCH_LIMIT) revert SygnumTokenBatchCountExceedsLimit();\n\n        for (uint256 i = 0; i < _accounts.length; ++i) {\n            mint(_accounts[i], _amounts[i]);\n        }\n    }\n\n    /**\n     * @dev Batch confiscate to a maximum of 256 addresses.\n     * @param _confiscatees array of addresses whose funds are being confiscated\n     * @param _receivers array of addresses who's receiving the funds\n     * @param _values array of values of funds being confiscated\n     */\n    function batchConfiscate(\n        address[] memory _confiscatees,\n        address[] memory _receivers,\n        uint256[] memory _values\n    ) public virtual {\n        if (_confiscatees.length != _values.length || _receivers.length != _values.length)\n            revert SygnumTokenUnequalArrayLengths();\n        if (_confiscatees.length > BATCH_LIMIT) revert SygnumTokenBatchCountExceedsLimit();\n\n        for (uint256 i = 0; i < _confiscatees.length; ++i) {\n            confiscate(_confiscatees[i], _receivers[i], _values[i]);\n        }\n    }\n\n    // FORCE OVERRIDE FUNCTIONS\n\n    function transferFrom(\n        address from,\n        address to,\n        uint256 value\n    ) public virtual override(ERC20, ERC20Freezable, ERC20Pausable, ERC20Snapshot, ERC20Whitelist) returns (bool) {\n        return super.transferFrom(from, to, value);\n    }\n\n    function transfer(\n        address to,\n        uint256 value\n    ) public virtual override(ERC20, ERC20Freezable, ERC20Pausable, ERC20Snapshot, ERC20Whitelist) returns (bool) {\n        return super.transfer(to, value);\n    }\n\n    function increaseAllowance(\n        address spender,\n        uint256 addedValue\n    ) public virtual override(ERC20, ERC20Freezable, ERC20Pausable, ERC20Whitelist) returns (bool) {\n        return super.increaseAllowance(spender, addedValue);\n    }\n\n    function decreaseAllowance(\n        address spender,\n        uint256 subtractedValue\n    ) public virtual override(ERC20, ERC20Freezable, ERC20Pausable, ERC20Whitelist) returns (bool) {\n        return super.decreaseAllowance(spender, subtractedValue);\n    }\n\n    function approve(\n        address spender,\n        uint256 value\n    ) public virtual override(ERC20, ERC20Freezable, ERC20Pausable, ERC20Whitelist) returns (bool) {\n        return super.approve(spender, value);\n    }\n\n    function _burn(\n        address account,\n        uint256 value\n    ) internal virtual override(ERC20, ERC20Snapshot, ERC20Pausable, ERC20Whitelist) {\n        super._burn(account, value);\n    }\n\n    /**\n     * @dev Overload _burnFrom function to ensure contract has not been paused.\n     * @param account address that funds will be burned from allowance.\n     * @param amount amount of funds that will be burned.\n     */\n    function _burnFrom(\n        address account,\n        uint256 amount\n    ) internal virtual override(ERC20, ERC20Snapshot, ERC20Pausable, ERC20Whitelist, ERC20Freezable) {\n        super._burnFrom(account, amount);\n    }\n\n    /**\n     * @dev Overload _mint function to ensure contract has not been paused.\n     * @param account address that funds will be minted to.\n     * @param amount amount of funds that will be minted.\n     */\n    function _mint(\n        address account,\n        uint256 amount\n    ) internal virtual override(ERC20, ERC20Snapshot, ERC20Pausable, ERC20Whitelist, ERC20Mintable) {\n        super._mint(account, amount);\n    }\n\n    function _burnFor(address account, uint256 amount) internal virtual override(ERC20Snapshot, ERC20Burnable) {\n        super._burnFor(account, amount);\n    }\n}\n"},{"file_path":"apps/baseContracts/contracts/role/interface/IBaseOperators.sol","source_code":"// SPDX-License-Identifier: Unlicensed\n\n/**\n * @title IBaseOperators\n * @notice Interface for BaseOperators contract\n */\n\npragma solidity ^0.8.0;\n\ninterface IBaseOperators {\n    function isOperator(address _account) external view returns (bool);\n\n    function isAdmin(address _account) external view returns (bool);\n\n    function isSystem(address _account) external view returns (bool);\n\n    function isRelay(address _account) external view returns (bool);\n\n    function isMultisig(address _contract) external view returns (bool);\n\n    function confirmFor(address _address) external;\n\n    function addOperator(address _account) external;\n\n    function removeOperator(address _account) external;\n\n    function addAdmin(address _account) external;\n\n    function removeAdmin(address _account) external;\n\n    function addSystem(address _account) external;\n\n    function removeSystem(address _account) external;\n\n    function addRelay(address _account) external;\n\n    function removeRelay(address _account) external;\n\n    function addOperatorAndAdmin(address _account) external;\n\n    function removeOperatorAndAdmin(address _account) external;\n}\n"},{"file_path":"apps/baseContracts/contracts/role/interface/ITraderOperators.sol","source_code":"// SPDX-License-Identifier: Unlicensed\n\n/**\n * @title ITraderOperators\n * @notice Interface for TraderOperators contract\n */\n\npragma solidity ^0.8.0;\n\nabstract contract ITraderOperators {\n    function isTrader(address _account) external view virtual returns (bool);\n\n    function addTrader(address _account) external virtual;\n\n    function removeTrader(address _account) external virtual;\n}\n"}],"certified":false,"conflicting_implementations":null,"abi":[{"inputs":[],"name":"BlockerOperatorableCallerNotBlocker","type":"error"},{"inputs":[],"name":"BlockerOperatorableCallerNotBlockerOrOperator","type":"error"},{"inputs":[],"name":"BlockerOperatorableCallerNotNewBlockerOperator","type":"error"},{"inputs":[],"name":"BlockerOperatorableNewBlockerOperatorsAddressZero","type":"error"},{"inputs":[],"name":"BlockerOperatorablePendingBlockerOperatorsAddressZero","type":"error"},{"inputs":[],"name":"ERC20MintableZeroMintAmount","type":"error"},{"inputs":[],"name":"FreezableAccountFrozen","type":"error"},{"inputs":[],"name":"FreezableAccountNotFrozen","type":"error"},{"inputs":[{"internalType":"uint256","name":"_batchCount","type":"uint256"}],"name":"FreezableBatchCountTooLarge","type":"error"},{"inputs":[],"name":"FreezableZeroAddress","type":"error"},{"inputs":[],"name":"InitializableContractAlreadyInitialized","type":"error"},{"inputs":[],"name":"InitializableContractIsInitializing","type":"error"},{"inputs":[],"name":"OperatorableCallerNotAdmin","type":"error"},{"inputs":[],"name":"OperatorableCallerNotAdminOrRelay","type":"error"},{"inputs":[],"name":"OperatorableCallerNotAdminOrSystem","type":"error"},{"inputs":[],"name":"OperatorableCallerNotMultisig","type":"error"},{"inputs":[],"name":"OperatorableCallerNotOperator","type":"error"},{"inputs":[],"name":"OperatorableCallerNotOperatorOrAdminOrRelay","type":"error"},{"inputs":[],"name":"OperatorableCallerNotOperatorOrRelay","type":"error"},{"inputs":[],"name":"OperatorableCallerNotOperatorOrSystem","type":"error"},{"inputs":[],"name":"OperatorableCallerNotOperatorOrSystemOrRelay","type":"error"},{"inputs":[{"internalType":"address","name":"_caller","type":"address"}],"name":"OperatorableCallerNotOperatorsContract","type":"error"},{"inputs":[],"name":"OperatorableCallerNotRelay","type":"error"},{"inputs":[],"name":"OperatorableCallerNotSystem","type":"error"},{"inputs":[],"name":"OperatorableNewOperatorsZeroAddress","type":"error"},{"inputs":[],"name":"PausableNotPaused","type":"error"},{"inputs":[],"name":"PausablePaused","type":"error"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"SygnumTokenAccountFrozen","type":"error"},{"inputs":[],"name":"SygnumTokenBatchCountExceedsLimit","type":"error"},{"inputs":[],"name":"SygnumTokenDisabledInitialize","type":"error"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"SygnumTokenSystemCallAccountFrozen","type":"error"},{"inputs":[],"name":"SygnumTokenUnequalArrayLengths","type":"error"},{"inputs":[],"name":"SygnumTokenV1AlreadyInitialized","type":"error"},{"inputs":[],"name":"SygnumTokenV2AlreadyInitialized","type":"error"},{"inputs":[],"name":"SygnumTokenV3AlreadyInitialized","type":"error"},{"inputs":[],"name":"SygnumTokenV4AlreadyInitialized","type":"error"},{"inputs":[],"name":"SygnumTokenV4ZeroBurnAmount","type":"error"},{"inputs":[],"name":"SygnumTokenV5AlreadyInitialized","type":"error"},{"inputs":[],"name":"TraderOperatorableCallerNotNewTraderOperator","type":"error"},{"inputs":[],"name":"TraderOperatorableCallerNotTrader","type":"error"},{"inputs":[],"name":"TraderOperatorableCallerNotTraderOrOperatorOrSystem","type":"error"},{"inputs":[],"name":"TraderOperatorableNewTraderOperatorsAddressZero","type":"error"},{"inputs":[],"name":"TraderOperatorablePendingTraderOperatorsAddressZero","type":"error"},{"inputs":[],"name":"WhitelistableAccountNotWhitelisted","type":"error"},{"inputs":[{"internalType":"address","name":"_caller","type":"address"}],"name":"WhitelistableCallerNotWhitelistContract","type":"error"},{"inputs":[],"name":"WhitelistableWhitelistContractZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"blocker","type":"address"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Blocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"blockerOperatorAddress","type":"address"}],"name":"BlockerOperatorsContractChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"blockerOperatorAddress","type":"address"}],"name":"BlockerOperatorsContractPending","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Burned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"burner","type":"address"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"BurnedFor","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"issuer","type":"address"},{"indexed":false,"internalType":"bytes4","name":"category","type":"bytes4"},{"indexed":false,"internalType":"address","name":"token","type":"address"}],"name":"CategoryUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"issuer","type":"address"},{"indexed":false,"internalType":"string","name":"class","type":"string"},{"indexed":false,"internalType":"address","name":"token","type":"address"}],"name":"ClassUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"}],"name":"Confiscated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"}],"name":"Destroyed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"frozen","type":"bool"}],"name":"FreezeToggled","type":"event"},{"anonymous":false,"inputs":[],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"issuer","type":"address"},{"indexed":false,"internalType":"address","name":"newIssuer","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"}],"name":"IssuerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"minter","type":"address"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"issuer","type":"address"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"address","name":"token","type":"address"}],"name":"NameUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"operatorsAddress","type":"address"}],"name":"OperatorsContractChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"operatorsAddress","type":"address"}],"name":"OperatorsContractPending","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newOracle","type":"address"}],"name":"OracleContractChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"issuer","type":"address"},{"indexed":false,"internalType":"string","name":"symbol","type":"string"},{"indexed":false,"internalType":"address","name":"token","type":"address"}],"name":"SymbolUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"newToken","type":"string"}],"name":"TokenUriUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"traderOperatorsAddress","type":"address"}],"name":"TraderOperatorsContractChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"traderOperatorsAddress","type":"address"}],"name":"TraderOperatorsContractPending","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"blocker","type":"address"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"UnBlocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"whitelistAddress","type":"address"}],"name":"WhitelistContractChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"whitelistAddress","type":"address"}],"name":"WhitelistContractPending","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_blockedBalances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approveOnBehalf","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_blockNumber","type":"uint256"}],"name":"balanceOfAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_accounts","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"batchBurnFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_confiscatees","type":"address[]"},{"internalType":"address[]","name":"_receivers","type":"address[]"},{"internalType":"uint256[]","name":"_values","type":"uint256[]"}],"name":"batchConfiscate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_accounts","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"bool","name":"_toggled","type":"bool"}],"name":"batchToggleFreeze","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"block","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"blockedBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burnFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"category","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"class","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"confirmBlockerOperatorsContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"confirmOperatorsContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"confirmTraderOperatorsContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"confirmWhitelistContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_confiscatee","type":"address"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"confiscate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"to","type":"address"}],"name":"destroy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"frozen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAssetPrice","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBlockerOperatorsContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBlockerOperatorsPending","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOperatorsContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOperatorsPending","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPriceFeedDecimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPriceFeedDescription","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPriceFeedOracle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalBlockedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTraderOperatorsContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTraderOperatorsPending","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWhitelistContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWhitelistPending","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_baseOperators","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"bytes4","name":"_category","type":"bytes4"},{"internalType":"string","name":"_class","type":"string"},{"internalType":"address","name":"_issuer","type":"address"},{"internalType":"address","name":"_baseOperators","type":"address"},{"internalType":"address","name":"_whitelist","type":"address"},{"internalType":"address","name":"_traderOperators","type":"address"},{"internalType":"address","name":"_blockerOperators","type":"address"}],"name":"initializeContractsAndConstructor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"bytes4","name":"_category","type":"bytes4"},{"internalType":"string","name":"_class","type":"string"},{"internalType":"address","name":"_issuer","type":"address"},{"internalType":"address","name":"_baseOperators","type":"address"},{"internalType":"address","name":"_whitelist","type":"address"},{"internalType":"address","name":"_traderOperators","type":"address"},{"internalType":"address","name":"_blockerOperators","type":"address"},{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"initializeContractsAndConstructor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"bytes4","name":"_category","type":"bytes4"},{"internalType":"string","name":"_class","type":"string"},{"internalType":"address","name":"_issuer","type":"address"},{"internalType":"address","name":"_baseOperators","type":"address"},{"internalType":"address","name":"_whitelist","type":"address"},{"internalType":"address","name":"_traderOperators","type":"address"},{"internalType":"address","name":"_blockerOperators","type":"address"},{"internalType":"string","name":"_tokenURI","type":"string"},{"internalType":"address","name":"_priceFeed","type":"address"}],"name":"initializeContractsAndConstructor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"initializeV1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initializeV2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initializeV3","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initializeV4","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_priceFeed","type":"address"}],"name":"initializeV5","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initializedV1","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initializedV2","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initializedV3","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initializedV4","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initializedV5","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isAdminOrSystem","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isBlocker","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isFrozen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isInitialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"}],"name":"isMultisig","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isNotPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isOperatorOrSystem","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isRelay","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isSystem","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isTrader","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"issuer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_blockerOperators","type":"address"}],"name":"setBlockerOperatorsContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_baseOperators","type":"address"}],"name":"setOperatorsContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newPriceFeedOracle","type":"address"}],"name":"setPriceFeedOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_traderOperators","type":"address"}],"name":"setTraderOperatorsContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_whitelist","type":"address"}],"name":"setWhitelistContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"bool","name":"_toggled","type":"bool"}],"name":"toggleFreeze","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBlockedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_blockNumber","type":"uint256"}],"name":"totalSupplyAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"unblock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"category_","type":"bytes4"}],"name":"updateCategory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"class_","type":"string"}],"name":"updateClass","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"issuer_","type":"address"}],"name":"updateIssuer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name_","type":"string"}],"name":"updateName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"symbol_","type":"string"}],"name":"updateSymbol","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newToken","type":"string"}],"name":"updateTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"}],"is_changed_bytecode":true,"is_partially_verified":false,"package_name":null,"constructor_args":null}