From d77ef6d67b00b3ce422b092b48534c3bf07ffcee Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 17 Sep 2024 19:37:19 +0000 Subject: [PATCH 1/4] Bump send and express Bumps [send](https://github.com/pillarjs/send) and [express](https://github.com/expressjs/express). These dependencies needed to be updated together. Updates `send` from 0.18.0 to 0.19.0 - [Release notes](https://github.com/pillarjs/send/releases) - [Changelog](https://github.com/pillarjs/send/blob/master/HISTORY.md) - [Commits](https://github.com/pillarjs/send/compare/0.18.0...0.19.0) Updates `express` from 4.20.0 to 4.21.0 - [Release notes](https://github.com/expressjs/express/releases) - [Changelog](https://github.com/expressjs/express/blob/4.21.0/History.md) - [Commits](https://github.com/expressjs/express/compare/4.20.0...4.21.0) --- updated-dependencies: - dependency-name: send dependency-type: indirect - dependency-name: express dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 185 ++++++++++------------------------------------ 1 file changed, 38 insertions(+), 147 deletions(-) diff --git a/package-lock.json b/package-lock.json index 88a11bb0..206b2906 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10324,9 +10324,9 @@ } }, "node_modules/express": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/express/-/express-4.20.0.tgz", - "integrity": "sha512-pLdae7I6QqShF5PnNTCVn4hI91Dx0Grkn2+IAsMTgMIKuQVte2dN9PeGSSAME2FR8anOhVA62QDIUaWVfEXVLw==", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", + "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==", "dev": true, "dependencies": { "accepts": "~1.3.8", @@ -10341,7 +10341,7 @@ "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.2.0", + "finalhandler": "1.3.1", "fresh": "0.5.2", "http-errors": "2.0.0", "merge-descriptors": "1.0.3", @@ -10350,11 +10350,11 @@ "parseurl": "~1.3.3", "path-to-regexp": "0.1.10", "proxy-addr": "~2.0.7", - "qs": "6.11.0", + "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "0.19.0", - "serve-static": "1.16.0", + "serve-static": "1.16.2", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", @@ -10390,12 +10390,12 @@ "dev": true }, "node_modules/express/node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dev": true, "dependencies": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" }, "engines": { "node": ">=0.6" @@ -10671,13 +10671,13 @@ } }, "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "dev": true, "dependencies": { "debug": "2.6.9", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", @@ -10697,15 +10697,6 @@ "ms": "2.0.0" } }, - "node_modules/finalhandler/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -19580,63 +19571,15 @@ } }, "node_modules/serve-static": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.0.tgz", - "integrity": "sha512-pDLK8zwl2eKaYrs8mrPZBJua4hMplRWJ1tIFksVC3FtBEBnl8dxgeHtsaMS8DhS9i4fLObaon6ABoc4/hQGdPA==", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "dev": true, "dependencies": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-static/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/serve-static/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/serve-static/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/serve-static/node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" + "send": "0.19.0" }, "engines": { "node": ">= 0.8.0" @@ -31891,9 +31834,9 @@ } }, "express": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/express/-/express-4.20.0.tgz", - "integrity": "sha512-pLdae7I6QqShF5PnNTCVn4hI91Dx0Grkn2+IAsMTgMIKuQVte2dN9PeGSSAME2FR8anOhVA62QDIUaWVfEXVLw==", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", + "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==", "dev": true, "requires": { "accepts": "~1.3.8", @@ -31908,7 +31851,7 @@ "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.2.0", + "finalhandler": "1.3.1", "fresh": "0.5.2", "http-errors": "2.0.0", "merge-descriptors": "1.0.3", @@ -31917,11 +31860,11 @@ "parseurl": "~1.3.3", "path-to-regexp": "0.1.10", "proxy-addr": "~2.0.7", - "qs": "6.11.0", + "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "0.19.0", - "serve-static": "1.16.0", + "serve-static": "1.16.2", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", @@ -31951,12 +31894,12 @@ "dev": true }, "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dev": true, "requires": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" } } } @@ -32177,13 +32120,13 @@ } }, "finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "dev": true, "requires": { "debug": "2.6.9", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", @@ -32200,12 +32143,6 @@ "ms": "2.0.0" } }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -38724,61 +38661,15 @@ } }, "serve-static": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.0.tgz", - "integrity": "sha512-pDLK8zwl2eKaYrs8mrPZBJua4hMplRWJ1tIFksVC3FtBEBnl8dxgeHtsaMS8DhS9i4fLObaon6ABoc4/hQGdPA==", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "dev": true, "requires": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true - }, - "send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - } - } + "send": "0.19.0" } }, "servify": { From e42b061f44427c2a04bda7186d95157ca42582ed Mon Sep 17 00:00:00 2001 From: Ryan Sauge <71391932+rya-sge@users.noreply.github.com> Date: Thu, 3 Oct 2024 12:48:51 +0200 Subject: [PATCH 2/4] Update beacon factory, add mythril report --- CHANGELOG.md | 21 + README.md | 20 +- contracts/deployment/CMTAT_BEACON_FACTORY.sol | 4 +- contracts/deployment/CMTAT_TP_FACTORY.sol | 5 + contracts/deployment/CMTAT_UUPS_FACTORY.sol | 3 +- contracts/modules/wrapper/core/BaseModule.sol | 2 +- doc/TOOLCHAIN.md | 19 + doc/USAGE.md | 7 + doc/audits/tools/mythril/myth_proxy_report.md | 2 + .../tools/mythril/myth_standalone_report.md | 2 + doc/audits/tools/slither/slither-report.md | 759 ++++++++++++++++++ .../{ => slither}/v2.3.0-slither-report.md | 0 .../{ => slither}/v2.3.1-slither-report.md | 0 .../v2.4.0-slither-report.md} | 0 .../v2.5.0-slither-report.md} | 0 .../coverage/contracts/CMTAT_PROXY.sol.html | 7 +- .../contracts/CMTAT_PROXY_UUPS.sol.html | 7 +- .../contracts/CMTAT_STANDALONE.sol.html | 7 +- .../deployment/CMTAT_BEACON_FACTORY.sol.html | 38 +- .../deployment/CMTAT_TP_FACTORY.sol.html | 27 +- .../deployment/CMTAT_UUPS_FACTORY.sol.html | 17 +- .../coverage/contracts/deployment/index.html | 2 +- .../libraries/CMTATFactoryBase.sol.html | 2 +- .../libraries/CMTATFactoryInvariant.sol.html | 2 +- .../libraries/CMTATFactoryRoot.sol.html | 20 +- .../contracts/deployment/libraries/index.html | 2 +- .../test/coverage/contracts/index.html | 2 +- .../contracts/interfaces/ICCIPToken.sol.html | 2 +- .../interfaces/ICMTATConstructor.sol.html | 9 +- .../interfaces/ICMTATSnapshot.sol.html | 2 +- .../draft-IERC1404/draft-IERC1404.sol.html | 2 +- .../draft-IERC1404EnumCode.sol.html | 2 +- .../draft-IERC1404Wrapper.sol.html | 2 +- .../interfaces/draft-IERC1404/index.html | 2 +- .../engine/IAuthorizationEngine.sol.html | 2 +- .../interfaces/engine/IDebtEngine.sol.html | 2 +- .../interfaces/engine/IDebtGlobal.sol.html | 2 +- .../interfaces/engine/IRuleEngine.sol.html | 2 +- .../interfaces/engine/draft-IERC1643.sol.html | 2 +- .../contracts/interfaces/engine/index.html | 2 +- .../coverage/contracts/interfaces/index.html | 2 +- .../contracts/libraries/Errors.sol.html | 2 +- .../libraries/FactoryErrors.sol.html | 2 +- .../coverage/contracts/libraries/index.html | 2 +- .../contracts/modules/CMTAT_BASE.sol.html | 56 +- .../coverage/contracts/modules/index.html | 2 +- .../ERC20SnapshotModuleInternal.sol.html | 18 +- .../EnforcementModuleInternal.sol.html | 8 +- .../ValidationModuleInternal.sol.html | 6 +- .../internal/base/SnapshotModuleBase.sol.html | 28 +- .../modules/internal/base/index.html | 2 +- .../contracts/modules/internal/index.html | 2 +- .../security/AuthorizationModule.sol.html | 14 +- .../contracts/modules/security/index.html | 2 +- .../controllers/ValidationModule.sol.html | 14 +- .../modules/wrapper/controllers/index.html | 2 +- .../modules/wrapper/core/BaseModule.sol.html | 12 +- .../wrapper/core/ERC20BaseModule.sol.html | 8 +- .../wrapper/core/ERC20BurnModule.sol.html | 2 +- .../wrapper/core/ERC20MintModule.sol.html | 6 +- .../wrapper/core/EnforcementModule.sol.html | 2 +- .../modules/wrapper/core/PauseModule.sol.html | 2 +- .../contracts/modules/wrapper/core/index.html | 2 +- .../wrapper/extensions/DebtModule.sol.html | 4 +- .../extensions/DocumentModule.sol.html | 4 +- .../extensions/ERC20SnapshotModule.sol.html | 2 +- .../wrapper/extensions/MetaTxModule.sol.html | 2 +- .../modules/wrapper/extensions/index.html | 2 +- .../test/proxy/CMTAT_PROXY_TEST.sol.html | 7 +- .../test/proxy/CMTAT_PROXY_TEST_UUPS.sol.html | 7 +- .../coverage/contracts/test/proxy/index.html | 2 +- doc/general/test/coverage/coverage-final.json | 82 +- doc/general/test/coverage/index.html | 2 +- .../contracts/CMTAT_PROXY.sol.html | 7 +- .../contracts/CMTAT_PROXY_UUPS.sol.html | 7 +- .../contracts/CMTAT_STANDALONE.sol.html | 7 +- .../deployment/CMTAT_BEACON_FACTORY.sol.html | 38 +- .../deployment/CMTAT_TP_FACTORY.sol.html | 27 +- .../deployment/CMTAT_UUPS_FACTORY.sol.html | 17 +- .../contracts/deployment/index.html | 2 +- .../libraries/CMTATFactoryBase.sol.html | 2 +- .../libraries/CMTATFactoryInvariant.sol.html | 2 +- .../libraries/CMTATFactoryRoot.sol.html | 20 +- .../contracts/deployment/libraries/index.html | 2 +- .../coverage/lcov-report/contracts/index.html | 2 +- .../contracts/interfaces/ICCIPToken.sol.html | 2 +- .../interfaces/ICMTATConstructor.sol.html | 9 +- .../interfaces/ICMTATSnapshot.sol.html | 2 +- .../draft-IERC1404/draft-IERC1404.sol.html | 2 +- .../draft-IERC1404EnumCode.sol.html | 2 +- .../draft-IERC1404Wrapper.sol.html | 2 +- .../interfaces/draft-IERC1404/index.html | 2 +- .../engine/IAuthorizationEngine.sol.html | 2 +- .../interfaces/engine/IDebtEngine.sol.html | 2 +- .../interfaces/engine/IDebtGlobal.sol.html | 2 +- .../interfaces/engine/IRuleEngine.sol.html | 2 +- .../interfaces/engine/draft-IERC1643.sol.html | 2 +- .../contracts/interfaces/engine/index.html | 2 +- .../contracts/interfaces/index.html | 2 +- .../contracts/libraries/Errors.sol.html | 2 +- .../libraries/FactoryErrors.sol.html | 2 +- .../contracts/libraries/index.html | 2 +- .../contracts/modules/CMTAT_BASE.sol.html | 56 +- .../lcov-report/contracts/modules/index.html | 2 +- .../ERC20SnapshotModuleInternal.sol.html | 18 +- .../EnforcementModuleInternal.sol.html | 8 +- .../ValidationModuleInternal.sol.html | 6 +- .../internal/base/SnapshotModuleBase.sol.html | 28 +- .../modules/internal/base/index.html | 2 +- .../contracts/modules/internal/index.html | 2 +- .../security/AuthorizationModule.sol.html | 14 +- .../contracts/modules/security/index.html | 2 +- .../controllers/ValidationModule.sol.html | 14 +- .../modules/wrapper/controllers/index.html | 2 +- .../modules/wrapper/core/BaseModule.sol.html | 12 +- .../wrapper/core/ERC20BaseModule.sol.html | 8 +- .../wrapper/core/ERC20BurnModule.sol.html | 2 +- .../wrapper/core/ERC20MintModule.sol.html | 6 +- .../wrapper/core/EnforcementModule.sol.html | 2 +- .../modules/wrapper/core/PauseModule.sol.html | 2 +- .../contracts/modules/wrapper/core/index.html | 2 +- .../wrapper/extensions/DebtModule.sol.html | 4 +- .../extensions/DocumentModule.sol.html | 4 +- .../extensions/ERC20SnapshotModule.sol.html | 2 +- .../wrapper/extensions/MetaTxModule.sol.html | 2 +- .../modules/wrapper/extensions/index.html | 2 +- .../test/proxy/CMTAT_PROXY_TEST.sol.html | 7 +- .../test/proxy/CMTAT_PROXY_TEST_UUPS.sol.html | 7 +- .../contracts/test/proxy/index.html | 2 +- .../test/coverage/lcov-report/index.html | 2 +- doc/general/test/coverage/lcov.info | 576 ++++++------- .../surya_graph_CMTAT_BEACON_FACTORY.sol.png | Bin 196066 -> 181967 bytes solc_setting.json | 9 + .../AuthorizationModuleCommon.js | 88 +- ...ationModuleSetAuthorizationEngineCommon.js | 135 ++-- test/common/BaseModuleCommon.js | 61 +- test/common/DebtModule/DebtModuleCommon.js | 112 +-- .../DebtModuleSetDebtEngineCommon.js | 44 +- .../DocumentModule/DocumentModuleCommon.js | 163 ++-- .../DocumentModuleSetDocumentEngineCommon.js | 52 +- test/common/ERC20BaseModuleCommon.js | 455 ++++++----- test/common/ERC20BurnModuleCommon.js | 380 +++++---- test/common/ERC20MintModuleCommon.js | 237 +++--- ...RC20SnapshotModuleCommonGetNextSnapshot.js | 4 +- .../ERC20SnapshotModuleCommonRescheduling.js | 187 +++-- .../ERC20SnapshotModuleCommonScheduling.js | 135 +++- .../ERC20SnapshotModuleCommonUnschedule.js | 112 ++- .../ERC20SnapshotModuleUtils.js | 30 +- .../ERC20SnapshotModuleMultiplePlannedTest.js | 103 ++- ...C20SnapshotModuleOnePlannedSnapshotTest.js | 49 +- .../ERC20SnapshotModuleZeroPlannedSnapshot.js | 16 +- test/common/EnforcementModuleCommon.js | 160 ++-- test/common/MetaTxModuleCommon.js | 55 +- test/common/PauseModuleCommon.js | 267 +++--- .../ValidationModuleCommon.js | 60 +- .../ValidationModuleSetRuleEngineCommon.js | 37 +- test/deployment/deployment.test.js | 71 +- test/deploymentUtils.js | 63 +- test/proxy/general/Proxy.test.js | 84 +- test/proxy/general/UpgradeProxy.test.js | 68 +- test/proxy/general/UpgradeProxyCommon.js | 144 ++-- test/proxy/general/UpgradeProxyUUPS.test.js | 96 ++- test/proxy/general/factory/Beacon.test.js | 181 ++--- .../factory/BeaconFactoryDeploy.test.js | 82 +- .../proxy/general/factory/Transparent.test.js | 136 ++-- .../factory/TransparentFactoyDeploy.test.js | 67 +- .../general/factory/TransparentSalt.test.js | 185 ++--- test/proxy/general/factory/UUPS.test.js | 134 ++-- .../general/factory/UUPSFactoyDeploy.test.js | 66 +- .../AuthorizationModule.test.js | 33 +- .../AuthorizationModuleConstructor.test.js | 58 +- test/proxy/modules/BaseModule.test.js | 30 +- .../DocumentModule/DocumentModule.test.js | 31 +- .../DocumentModuleConstructor.test.js | 50 +- test/proxy/modules/ERC20BaseModule.test.js | 27 +- test/proxy/modules/ERC20BurnModule.test.js | 27 +- test/proxy/modules/ERC20MintModule.test.js | 27 +- .../proxy/modules/ERC20SnapshotModule.test.js | 43 +- test/proxy/modules/EnforcementModule.test.js | 27 +- test/proxy/modules/MetaTxModule.test.js | 53 +- test/proxy/modules/PauseModule.test.js | 31 +- .../ValidationModule/ValidationModule.test.js | 47 +- .../ValidationModuleConstructor.test.js | 69 +- .../ValidationModuleSetRuleEngine.test.js | 29 +- .../AuthorizationModule.test.js | 33 +- .../AuthorizationModuleConstructor.test.js | 56 +- test/standard/modules/BaseModule.test.js | 26 +- .../modules/DebtModule/DebtModule.test.js | 31 +- .../DebtModule/DebtModuleConstructor.test.js | 50 +- .../DocumentModule/DocumentModule.test.js | 31 +- .../DocumentModuleConstructor.test.js | 50 +- test/standard/modules/ERC20BaseModule.test.js | 27 +- test/standard/modules/ERC20BurnModule.test.js | 27 +- test/standard/modules/ERC20MintModule.test.js | 27 +- .../modules/ERC20SnapshotModule.test.js | 43 +- .../modules/EnforcementModule.test.js | 27 +- test/standard/modules/MetaTxModule.test.js | 51 +- test/standard/modules/PauseModule.test.js | 31 +- .../ValidationModule/ValidationModule.test.js | 47 +- .../ValidationModuleConstructor.test.js | 68 +- .../ValidationModuleSetRuleEngine.test.js | 30 +- test/utils.js | 2 +- 202 files changed, 4810 insertions(+), 3047 deletions(-) create mode 100644 doc/audits/tools/mythril/myth_proxy_report.md create mode 100644 doc/audits/tools/mythril/myth_standalone_report.md create mode 100644 doc/audits/tools/slither/slither-report.md rename doc/audits/tools/{ => slither}/v2.3.0-slither-report.md (100%) rename doc/audits/tools/{ => slither}/v2.3.1-slither-report.md (100%) rename doc/audits/tools/{slither-report-v2.4.0.md => slither/v2.4.0-slither-report.md} (100%) rename doc/audits/tools/{slither-report.md => slither/v2.5.0-slither-report.md} (100%) create mode 100644 solc_setting.json diff --git a/CHANGELOG.md b/CHANGELOG.md index 952710ba..c2e312d7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,27 @@ Please follow conventions. +## Checklist + +> Before a new release, perform the following tasks + +- Code: Update the version name in the base core module, variable VERSION +- Run linter + +> npm run-script lint:all:prettier + +- Documentation + - Perform a code coverage and update the files in the corresponding directory [./doc/general/test/coverage](./doc/general/test/coverage) + - Perform an audit with several audit tools (Mythril and Slither), update the report in the corresponding directory [./doc/audits/tools](./doc/audits/tools) + - Update surya doc by running the 3 scripts in [./doc/script](./doc/script) + + - Update changelog + +## 2.5.1 - 20241003 + +- Beacon Factory: deploy an implementation inside the constructor if no implementation is provided +- Run [myhtril](https://github.com/Consensys/mythril) + ## 2.5.0 - 20240910 - Change Solidity version to 0.8.27 (latest) diff --git a/README.md b/README.md index 59b22598..a232bd77 100644 --- a/README.md +++ b/README.md @@ -143,7 +143,7 @@ Here is the list of the different version available for each CMTAT version. | Name | RuleEngine | | ----------------------- | ------------------------------------------------------------ | -| CMTAT 2.5.0 (unaudited) | RuleEngine >= [v2.0.3](https://github.com/CMTA/RuleEngine/releases/tag/v2.0.3) | +| CMTAT 2.5.0 (unaudited) | RuleEngine >= [v2.0.3](https://github.com/CMTA/RuleEngine/releases/tag/v2.0.3) (unaudited) | | CMTAT 2.4.0 (unaudited) | RuleEngine >=v2.0.0
Last version: [v2.0.2](https://github.com/CMTA/RuleEngine/releases/tag/v2.0.2)(unaudited) | | CMTAT 2.3.0 | [RuleEngine v1.0.2](https://github.com/CMTA/RuleEngine/releases/tag/v1.0.2) | | CMTAT 2.0 (unaudited) | [RuleEngine 1.0](https://github.com/CMTA/RuleEngine/releases/tag/1.0) (unaudited) | @@ -254,6 +254,8 @@ Please see the OpenZeppelin [upgradeable contracts documentation](https://docs.o Please see the OpenZeppelin [Upgrades plugins](https://docs.openzeppelin.com/upgrades-plugins/1.x/) for more information about plugin upgrades in general. +CMTAT also implements the [ERC-7201](https://eips.ethereum.org/EIPS/eip-7201) to manage the storage location. + Note that deployment via a proxy is not mandatory, but is recommended by CMTA. ### Factory @@ -324,15 +326,23 @@ The report is available in [ABDK_CMTA_CMTATRuleEngine_v_1_0.pdf](doc/audits/ABDK ### Tools +#### Slither + You will find the report produced by [Slither](https://github.com/crytic/slither) in | Version | File | | ------------ | ------------------------------------------------------------ | -| Last version | [slither-report.md](doc/audits/tools/slither-report.md) | -| v2.3.0 | [v2.3.0-slither-report.md](doc/audits/tools/v2.3.0-slither-report.md) | -| v2.3.1 | [v2.3.1-slither-report.md](doc/audits/tools/v2.3.1-slither-report.md) | -| v2.4.0 | [v2.4.0-slither-report.md](doc/audits/tools/v2.4.0-slither-report.md) | +| Last version | [slither-report.md](doc/audits/tools/slither//slither-report.md) | +| v2.3.0 | [v2.3.0-slither-report.md](doc/audits/tools/slither/v2.3.0-slither-report.md) | +| v2.3.1 | [v2.3.1-slither-report.md](doc/audits/tools/slither/v2.3.1-slither-report.md) | +| v2.4.0 | [v2.4.0-slither-report.md](doc/audits/tools/slither/v2.4.0-slither-report.md) | +| v2.5.0 | [v2.5.0-slither-report.md](doc/audits/tools/slither/v2.5.0-slither-report.md) | + +#### [Mythril](https://github.com/Consensys/mythril) +| Version | File | +| ------------ | ------------------------------------------------------------ | +| Last version | [mythril-report-standalone.md](doc/audits/tools/mythril/myth_standalone_report.md)
[mythril-report-proxy.md](doc/audits/tools/mythril/myth_proxy_report.md)
| ### Test diff --git a/contracts/deployment/CMTAT_BEACON_FACTORY.sol b/contracts/deployment/CMTAT_BEACON_FACTORY.sol index 947c45b9..a9309a91 100644 --- a/contracts/deployment/CMTAT_BEACON_FACTORY.sol +++ b/contracts/deployment/CMTAT_BEACON_FACTORY.sol @@ -13,7 +13,6 @@ import "./libraries/CMTATFactoryRoot.sol"; * */ contract CMTAT_BEACON_FACTORY is AccessControl, CMTATFactoryRoot { - // public UpgradeableBeacon public immutable beacon; /** * @param implementation_ contract implementation @@ -25,7 +24,8 @@ contract CMTAT_BEACON_FACTORY is AccessControl, CMTATFactoryRoot { revert FactoryErrors.CMTAT_Factory_AddressZeroNotAllowedForBeaconOwner(); } if(implementation_ == address(0)){ - revert FactoryErrors.CMTAT_Factory_AddressZeroNotAllowedForLogicContract(); + // Forwarder is the zero address if no implementation provided + implementation_ = address(new CMTAT_PROXY(address(0))); } beacon = new UpgradeableBeacon(implementation_, beaconOwner); } diff --git a/contracts/deployment/CMTAT_TP_FACTORY.sol b/contracts/deployment/CMTAT_TP_FACTORY.sol index 5a0c9129..8c48df96 100644 --- a/contracts/deployment/CMTAT_TP_FACTORY.sol +++ b/contracts/deployment/CMTAT_TP_FACTORY.sol @@ -14,6 +14,11 @@ import "./libraries/CMTATFactoryBase.sol"; */ contract CMTAT_TP_FACTORY is CMTATFactoryBase { + /** + * @param logic_ contract implementation, cannot be zero + * @param factoryAdmin admin + * @param useCustomSalt_ custom salt with create2 or not + */ constructor(address logic_, address factoryAdmin, bool useCustomSalt_) CMTATFactoryBase(logic_, factoryAdmin,useCustomSalt_){} /*////////////////////////////////////////////////////////////// diff --git a/contracts/deployment/CMTAT_UUPS_FACTORY.sol b/contracts/deployment/CMTAT_UUPS_FACTORY.sol index 10642f5f..808cc949 100644 --- a/contracts/deployment/CMTAT_UUPS_FACTORY.sol +++ b/contracts/deployment/CMTAT_UUPS_FACTORY.sol @@ -14,8 +14,9 @@ import "./libraries/CMTATFactoryBase.sol"; */ contract CMTAT_UUPS_FACTORY is CMTATFactoryBase { /** - * @param logic_ contract implementation + * @param logic_ contract implementation, cannot be zero * @param factoryAdmin admin + * @param useCustomSalt_ custom salt with create2 or not */ constructor(address logic_, address factoryAdmin, bool useCustomSalt_) CMTATFactoryBase(logic_, factoryAdmin,useCustomSalt_){} diff --git a/contracts/modules/wrapper/core/BaseModule.sol b/contracts/modules/wrapper/core/BaseModule.sol index b5bf3275..e24ec686 100644 --- a/contracts/modules/wrapper/core/BaseModule.sol +++ b/contracts/modules/wrapper/core/BaseModule.sol @@ -10,7 +10,7 @@ abstract contract BaseModule is AuthorizationModule { * @notice * Get the current version of the smart contract */ - string public constant VERSION = "2.5.0"; + string public constant VERSION = "2.5.1"; /* ============ Events ============ */ event Term(string indexed newTermIndexed, string newTerm); diff --git a/doc/TOOLCHAIN.md b/doc/TOOLCHAIN.md index 03b64792..8f3a2d56 100644 --- a/doc/TOOLCHAIN.md +++ b/doc/TOOLCHAIN.md @@ -206,3 +206,22 @@ Slither is a Solidity static analysis framework written in Python3 slither . --checklist --filter-paths "openzeppelin-contracts-upgradeable|openzeppelin-contracts|@openzeppelin|test" > slither-report.md ``` + + + + +### [Mythril](https://github.com/Consensys/mythril) + +- Standalone + +```bash +myth analyze contracts/CMTAT_STANDALONE.sol --solc-json solc_setting.json > myth_standalone_report.md +``` + +- With proxy + +```bash +myth analyze contracts/CMTAT_PROXY.sol --solc-json solc_setting.json > myth_proxy_report.md +``` + +File path for `solc` is configured in `solc_setting.json` diff --git a/doc/USAGE.md b/doc/USAGE.md index 13999bdf..8aaa98c0 100644 --- a/doc/USAGE.md +++ b/doc/USAGE.md @@ -101,3 +101,10 @@ For Solidity: npm run-script lint:sol npm run-script lint:sol:fix ``` + +## Compilation with solc + +```bash +solc --base-path . --include-path ./node_modules/ contracts/CMTAT_STANDALONE.sol +``` + diff --git a/doc/audits/tools/mythril/myth_proxy_report.md b/doc/audits/tools/mythril/myth_proxy_report.md new file mode 100644 index 00000000..086b5039 --- /dev/null +++ b/doc/audits/tools/mythril/myth_proxy_report.md @@ -0,0 +1,2 @@ +The analysis was completed successfully. No issues were detected. + diff --git a/doc/audits/tools/mythril/myth_standalone_report.md b/doc/audits/tools/mythril/myth_standalone_report.md new file mode 100644 index 00000000..086b5039 --- /dev/null +++ b/doc/audits/tools/mythril/myth_standalone_report.md @@ -0,0 +1,2 @@ +The analysis was completed successfully. No issues were detected. + diff --git a/doc/audits/tools/slither/slither-report.md b/doc/audits/tools/slither/slither-report.md new file mode 100644 index 00000000..0804fd62 --- /dev/null +++ b/doc/audits/tools/slither/slither-report.md @@ -0,0 +1,759 @@ +**THIS CHECKLIST IS NOT COMPLETE**. Use `--show-ignored-findings` to show all the results. +Summary + - [incorrect-equality](#incorrect-equality) (2 results) (Medium) + - [uninitialized-local](#uninitialized-local) (1 results) (Medium) + - [unused-return](#unused-return) (1 results) (Medium) + - [shadowing-local](#shadowing-local) (1 results) (Low) + - [missing-zero-check](#missing-zero-check) (1 results) (Low) + - [calls-loop](#calls-loop) (4 results) (Low) + - [timestamp](#timestamp) (5 results) (Low) + - [assembly](#assembly) (9 results) (Informational) + - [costly-loop](#costly-loop) (1 results) (Informational) + - [dead-code](#dead-code) (1 results) (Informational) + - [solc-version](#solc-version) (1 results) (Informational) + - [naming-convention](#naming-convention) (56 results) (Informational) + - [similar-names](#similar-names) (3 results) (Informational) + - [too-many-digits](#too-many-digits) (2 results) (Informational) +## incorrect-equality + +> Mock: not intended to be used in production + +Impact: Medium +Confidence: High + + - [ ] ID-0 + [DocumentEngineMock.removeDocument(bytes32)](contracts/mocks/DocumentEngineMock.sol#L72-L89) uses a dangerous strict equality: + - [bytes(documents[name_].uri).length == 0](contracts/mocks/DocumentEngineMock.sol#L73) + +contracts/mocks/DocumentEngineMock.sol#L72-L89 + + + - [ ] ID-1 + [DocumentEngineMock.getDocument(bytes32)](contracts/mocks/DocumentEngineMock.sol#L37-L49) uses a dangerous strict equality: + - [bytes(documents[name_].uri).length == 0](contracts/mocks/DocumentEngineMock.sol#L43) + +contracts/mocks/DocumentEngineMock.sol#L37-L49 + +## uninitialized-local + +> The concerned variable local `mostRecent` is initialized in the loop + +Impact: Medium +Confidence: Medium + + - [ ] ID-2 +[SnapshotModuleBase._findScheduledMostRecentPastSnapshot().mostRecent](contracts/modules/internal/base/SnapshotModuleBase.sol#L385) is a local variable never initialized + +contracts/modules/internal/base/SnapshotModuleBase.sol#L385 + +## unused-return + +> Not the case + +Impact: Medium +Confidence: Medium + + - [ ] ID-3 +[DocumentModule.getDocument(bytes32)](contracts/modules/wrapper/extensions/DocumentModule.sol#L74-L81) ignores return value by [$._documentEngine.getDocument(_name)](contracts/modules/wrapper/extensions/DocumentModule.sol#L77) + +contracts/modules/wrapper/extensions/DocumentModule.sol#L74-L81 + +## shadowing-local + +> Mock: not intended to be used in production + +Impact: Low +Confidence: High + + - [ ] ID-4 + [IDebtEngineMock.setCreditEvents(IDebtGlobal.CreditEvents).creditEvents](contracts/mocks/DebtEngineMock.sol#L7) shadows: + - [IDebtEngine.creditEvents()](contracts/interfaces/engine/IDebtEngine.sol#L17) (function) + +contracts/mocks/DebtEngineMock.sol#L7 + +## missing-zero-check + +> Mock: not intended to be used in production + +Impact: Low +Confidence: Medium + + - [ ] ID-5 + [AuthorizationEngineMock.authorizeAdminChange(address).newAdmin](contracts/mocks/AuthorizationEngineMock.sol#L22) lacks a zero-check on : + - [nextAdmin = newAdmin](contracts/mocks/AuthorizationEngineMock.sol#L23) + +contracts/mocks/AuthorizationEngineMock.sol#L22 + +## calls-loop + +> ValidationModuleInternal: Acknowledge +> +> Mock: not intended to be used in production +> ValidationModuleInternal: the loop happens only for batch function. A relevant alternative could be the creation of a batch function for the RuleEngine, but for the moment we don't have an implemented solution. + + + +Impact: Low +Confidence: Medium + - [ ] ID-6 +[RuleEngineMock.messageForTransferRestriction(uint8)](contracts/mocks/RuleEngine/RuleEngineMock.sol#L83-L97) has external calls inside a loop: [_rules[i].canReturnTransferRestrictionCode(_restrictionCode)](contracts/mocks/RuleEngine/RuleEngineMock.sol#L88) + +contracts/mocks/RuleEngine/RuleEngineMock.sol#L83-L97 + + + - [ ] ID-7 +[RuleEngineMock.messageForTransferRestriction(uint8)](contracts/mocks/RuleEngine/RuleEngineMock.sol#L83-L97) has external calls inside a loop: [_rules[i].messageForTransferRestriction(_restrictionCode)](contracts/mocks/RuleEngine/RuleEngineMock.sol#L89-L90) + +contracts/mocks/RuleEngine/RuleEngineMock.sol#L83-L97 + + + - [ ] ID-8 +[ValidationModuleInternal._operateOnTransfer(address,address,uint256)](contracts/modules/internal/ValidationModuleInternal.sol#L89-L92) has external calls inside a loop: [$._ruleEngine.operateOnTransfer(from,to,amount)](contracts/modules/internal/ValidationModuleInternal.sol#L91) + +contracts/modules/internal/ValidationModuleInternal.sol#L89-L92 + + + - [ ] ID-9 +[RuleEngineMock.detectTransferRestriction(address,address,uint256)](contracts/mocks/RuleEngine/RuleEngineMock.sol#L39-L59) has external calls inside a loop: [restriction = _rules[i].detectTransferRestriction(_from,_to,_amount)](contracts/mocks/RuleEngine/RuleEngineMock.sol#L46-L50) + +contracts/mocks/RuleEngine/RuleEngineMock.sol#L39-L59 + +## timestamp + +> With the Proof of Work, it was possible for a miner to modify the timestamp in a range of about 15 seconds +> +> With the Proof Of Stake, a new block is created every 12 seconds +> +> In all cases, we are not looking for such precision + +Impact: Low +Confidence: Medium + + - [ ] ID-10 + [SnapshotModuleBase._findScheduledMostRecentPastSnapshot()](contracts/modules/internal/base/SnapshotModuleBase.sol#L370-L398) uses timestamp for comparisons + Dangerous comparisons: + - [$._scheduledSnapshots[i] <= block.timestamp](contracts/modules/internal/base/SnapshotModuleBase.sol#L389) + +contracts/modules/internal/base/SnapshotModuleBase.sol#L370-L398 + + + - [ ] ID-11 + [DocumentEngineMock.getDocument(bytes32)](contracts/mocks/DocumentEngineMock.sol#L37-L49) uses timestamp for comparisons + Dangerous comparisons: + - [bytes(documents[name_].uri).length == 0](contracts/mocks/DocumentEngineMock.sol#L43) + +contracts/mocks/DocumentEngineMock.sol#L37-L49 + + + - [ ] ID-12 + [SnapshotModuleBase._checkTimeSnapshotAlreadyDone(uint256)](contracts/modules/internal/base/SnapshotModuleBase.sol#L420-L424) uses timestamp for comparisons + Dangerous comparisons: + - [time <= block.timestamp](contracts/modules/internal/base/SnapshotModuleBase.sol#L421) + +contracts/modules/internal/base/SnapshotModuleBase.sol#L420-L424 + + + - [ ] ID-13 + [SnapshotModuleBase._checkTimeInThePast(uint256)](contracts/modules/internal/base/SnapshotModuleBase.sol#L412-L419) uses timestamp for comparisons + Dangerous comparisons: + - [time <= block.timestamp](contracts/modules/internal/base/SnapshotModuleBase.sol#L413) + +contracts/modules/internal/base/SnapshotModuleBase.sol#L412-L419 + + + - [ ] ID-14 + [DocumentEngineMock.removeDocument(bytes32)](contracts/mocks/DocumentEngineMock.sol#L72-L89) uses timestamp for comparisons + Dangerous comparisons: + - [bytes(documents[name_].uri).length == 0](contracts/mocks/DocumentEngineMock.sol#L73) + +contracts/mocks/DocumentEngineMock.sol#L72-L89 + +## assembly + +> use to implement ERC-7201 + +Impact: Informational +Confidence: High + + - [ ] ID-15 + [AuthorizationModule._getAuthorizationModuleStorage()](contracts/modules/security/AuthorizationModule.sol#L114-L118) uses assembly + - [INLINE ASM](contracts/modules/security/AuthorizationModule.sol#L115-L117) + +contracts/modules/security/AuthorizationModule.sol#L114-L118 + + + - [ ] ID-16 + [EnforcementModuleInternal._getEnforcementModuleInternalStorage()](contracts/modules/internal/EnforcementModuleInternal.sol#L112-L116) uses assembly + - [INLINE ASM](contracts/modules/internal/EnforcementModuleInternal.sol#L113-L115) + +contracts/modules/internal/EnforcementModuleInternal.sol#L112-L116 + + + - [ ] ID-17 + [ValidationModuleInternal._getValidationModuleInternalStorage()](contracts/modules/internal/ValidationModuleInternal.sol#L96-L100) uses assembly + - [INLINE ASM](contracts/modules/internal/ValidationModuleInternal.sol#L97-L99) + +contracts/modules/internal/ValidationModuleInternal.sol#L96-L100 + + + - [ ] ID-18 + [SnapshotModuleBase._getSnapshotModuleBaseStorage()](contracts/modules/internal/base/SnapshotModuleBase.sol#L427-L431) uses assembly + - [INLINE ASM](contracts/modules/internal/base/SnapshotModuleBase.sol#L428-L430) + +contracts/modules/internal/base/SnapshotModuleBase.sol#L427-L431 + + + - [ ] ID-19 + [DocumentModule._getDocumentModuleStorage()](contracts/modules/wrapper/extensions/DocumentModule.sol#L96-L100) uses assembly + - [INLINE ASM](contracts/modules/wrapper/extensions/DocumentModule.sol#L97-L99) + +contracts/modules/wrapper/extensions/DocumentModule.sol#L96-L100 + + + - [ ] ID-20 + [PauseModule._getPauseModuleStorage()](contracts/modules/wrapper/core/PauseModule.sol#L104-L108) uses assembly + - [INLINE ASM](contracts/modules/wrapper/core/PauseModule.sol#L105-L107) + +contracts/modules/wrapper/core/PauseModule.sol#L104-L108 + + + - [ ] ID-21 + [DebtModule._getDebtModuleStorage()](contracts/modules/wrapper/extensions/DebtModule.sol#L94-L98) uses assembly + - [INLINE ASM](contracts/modules/wrapper/extensions/DebtModule.sol#L95-L97) + +contracts/modules/wrapper/extensions/DebtModule.sol#L94-L98 + + + - [ ] ID-22 + [BaseModule._getBaseModuleStorage()](contracts/modules/wrapper/core/BaseModule.sol#L108-L112) uses assembly + - [INLINE ASM](contracts/modules/wrapper/core/BaseModule.sol#L109-L111) + +contracts/modules/wrapper/core/BaseModule.sol#L108-L112 + + + - [ ] ID-23 + [ERC20BaseModule._getERC20BaseModuleStorage()](contracts/modules/wrapper/core/ERC20BaseModule.sol#L134-L138) uses assembly + - [INLINE ASM](contracts/modules/wrapper/core/ERC20BaseModule.sol#L135-L137) + +contracts/modules/wrapper/core/ERC20BaseModule.sol#L134-L138 + +## costly-loop + +> Acknowledge +> +> Mocks are not destined to be used in production + + + +Impact: Informational +Confidence: Medium + + - [ ] ID-24 + [DocumentEngineMock.removeDocument(bytes32)](contracts/mocks/DocumentEngineMock.sol#L72-L89) has costly operations inside a loop: + - [documentNames.pop()](contracts/mocks/DocumentEngineMock.sol#L83) + +contracts/mocks/DocumentEngineMock.sol#L72-L89 + +## dead-code + +> - Implemented to be gasless compatible (see MetaTxModule) +> +> - If we remove this function, we will have the following error: +> +> "Derived contract must override function "_msgData". Two or more base classes define function with same name and parameter types." + +Impact: Informational +Confidence: Medium + + - [ ] ID-25 +[CMTAT_BASE._msgData()](contracts/modules/CMTAT_BASE.sol#L232-L239) is never used and should be removed + +contracts/modules/CMTAT_BASE.sol#L232-L239 + +## solc-version + +> The version set in the config file is 0.8.27 + +Impact: Informational +Confidence: High + - [ ] ID-26 + Version constraint ^0.8.20 contains known severe issues (https://solidity.readthedocs.io/en/latest/bugs.html) + - VerbatimInvalidDeduplication + - FullInlinerNonExpressionSplitArgumentEvaluationOrder + - MissingSideEffectsOnSelectorAccess. + It is used by: + - node_modules/@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol#4 + - node_modules/@openzeppelin/contracts-upgradeable/metatx/ERC2771ContextUpgradeable.sol#4 + - node_modules/@openzeppelin/contracts-upgradeable/metatx/ERC2771ForwarderUpgradeable.sol#4 + - node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol#4 + - node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol#4 + - node_modules/@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol#4 + - node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol#4 + - node_modules/@openzeppelin/contracts-upgradeable/utils/NoncesUpgradeable.sol#3 + - node_modules/@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol#4 + - node_modules/@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol#4 + - node_modules/@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol#4 + - node_modules/@openzeppelin/contracts/access/AccessControl.sol#4 + - node_modules/@openzeppelin/contracts/access/IAccessControl.sol#4 + - node_modules/@openzeppelin/contracts/access/Ownable.sol#4 + - node_modules/@openzeppelin/contracts/interfaces/IERC1967.sol#4 + - node_modules/@openzeppelin/contracts/interfaces/IERC5267.sol#4 + - node_modules/@openzeppelin/contracts/interfaces/draft-IERC1822.sol#4 + - node_modules/@openzeppelin/contracts/interfaces/draft-IERC6093.sol#3 + - node_modules/@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol#4 + - node_modules/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol#4 + - node_modules/@openzeppelin/contracts/proxy/Proxy.sol#4 + - node_modules/@openzeppelin/contracts/proxy/beacon/BeaconProxy.sol#4 + - node_modules/@openzeppelin/contracts/proxy/beacon/IBeacon.sol#4 + - node_modules/@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol#4 + - node_modules/@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol#4 + - node_modules/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol#4 + - node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol#4 + - node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol#4 + - node_modules/@openzeppelin/contracts/utils/Address.sol#4 + - node_modules/@openzeppelin/contracts/utils/Arrays.sol#4 + - node_modules/@openzeppelin/contracts/utils/Context.sol#4 + - node_modules/@openzeppelin/contracts/utils/Create2.sol#4 + - node_modules/@openzeppelin/contracts/utils/StorageSlot.sol#5 + - node_modules/@openzeppelin/contracts/utils/Strings.sol#4 + - node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol#4 + - node_modules/@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol#4 + - node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol#4 + - node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol#4 + - node_modules/@openzeppelin/contracts/utils/math/Math.sol#4 + - node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol#4 + - contracts/CMTAT_PROXY.sol#3 + - contracts/CMTAT_PROXY_UUPS.sol#3 + - contracts/CMTAT_STANDALONE.sol#3 + - contracts/deployment/CMTAT_BEACON_FACTORY.sol#2 + - contracts/deployment/CMTAT_TP_FACTORY.sol#2 + - contracts/deployment/CMTAT_UUPS_FACTORY.sol#2 + - contracts/deployment/libraries/CMTATFactoryBase.sol#2 + - contracts/deployment/libraries/CMTATFactoryInvariant.sol#2 + - contracts/deployment/libraries/CMTATFactoryRoot.sol#2 + - contracts/interfaces/ICCIPToken.sol#3 + - contracts/interfaces/ICMTATConstructor.sol#2 + - contracts/interfaces/ICMTATSnapshot.sol#3 + - contracts/interfaces/draft-IERC1404/draft-IERC1404.sol#3 + - contracts/interfaces/draft-IERC1404/draft-IERC1404EnumCode.sol#3 + - contracts/interfaces/draft-IERC1404/draft-IERC1404Wrapper.sol#3 + - contracts/interfaces/engine/IAuthorizationEngine.sol#3 + - contracts/interfaces/engine/IDebtEngine.sol#3 + - contracts/interfaces/engine/IDebtGlobal.sol#3 + - contracts/interfaces/engine/IRuleEngine.sol#3 + - contracts/interfaces/engine/draft-IERC1643.sol#3 + - contracts/libraries/Errors.sol#3 + - contracts/libraries/FactoryErrors.sol#3 + - contracts/mocks/AuthorizationEngineMock.sol#3 + - contracts/mocks/DebtEngineMock.sol#3 + - contracts/mocks/DocumentEngineMock.sol#3 + - contracts/mocks/MinimalForwarderMock.sol#3 + - contracts/mocks/RuleEngine/CodeList.sol#3 + - contracts/mocks/RuleEngine/RuleEngineMock.sol#3 + - contracts/mocks/RuleEngine/RuleMock.sol#3 + - contracts/mocks/RuleEngine/interfaces/IRule.sol#3 + - contracts/mocks/RuleEngine/interfaces/IRuleEngineMock.sol#3 + - contracts/modules/CMTAT_BASE.sol#3 + - contracts/modules/internal/ERC20SnapshotModuleInternal.sol#3 + - contracts/modules/internal/EnforcementModuleInternal.sol#3 + - contracts/modules/internal/ValidationModuleInternal.sol#3 + - contracts/modules/internal/base/SnapshotModuleBase.sol#3 + - contracts/modules/security/AuthorizationModule.sol#3 + - contracts/modules/wrapper/controllers/ValidationModule.sol#3 + - contracts/modules/wrapper/core/BaseModule.sol#3 + - contracts/modules/wrapper/core/ERC20BaseModule.sol#3 + - contracts/modules/wrapper/core/ERC20BurnModule.sol#3 + - contracts/modules/wrapper/core/ERC20MintModule.sol#3 + - contracts/modules/wrapper/core/EnforcementModule.sol#3 + - contracts/modules/wrapper/core/PauseModule.sol#3 + - contracts/modules/wrapper/extensions/DebtModule.sol#3 + - contracts/modules/wrapper/extensions/DocumentModule.sol#3 + - contracts/modules/wrapper/extensions/ERC20SnapshotModule.sol#3 + - contracts/modules/wrapper/extensions/MetaTxModule.sol#3 + - contracts/test/proxy/CMTAT_PROXY_TEST.sol#3 + - contracts/test/proxy/CMTAT_PROXY_TEST_UUPS.sol#3 + +## naming-convention + +> It is not really necessary to rename all the variables. It will generate a lot of work for a minor improvement. + +Impact: Informational +Confidence: High + - [ ] ID-27 +Contract [CMTAT_PROXY_UUPS](contracts/CMTAT_PROXY_UUPS.sol#L11-L54) is not in CapWords + +contracts/CMTAT_PROXY_UUPS.sol#L11-L54 + + + - [ ] ID-28 +Enum [IERC1404EnumCode.REJECTED_CODE_BASE](contracts/interfaces/draft-IERC1404/draft-IERC1404EnumCode.sol#L9-L14) is not in CapWords + +contracts/interfaces/draft-IERC1404/draft-IERC1404EnumCode.sol#L9-L14 + + + - [ ] ID-29 +Constant [EnforcementModuleInternal.EnforcementModuleInternalStorageLocation](contracts/modules/internal/EnforcementModuleInternal.sol#L41) is not in UPPER_CASE_WITH_UNDERSCORES + +contracts/modules/internal/EnforcementModuleInternal.sol#L41 + + + - [ ] ID-30 +Function [CMTATFactoryRoot.CMTATProxyAddress(uint256)](contracts/deployment/libraries/CMTATFactoryRoot.sol#L45-L47) is not in mixedCase + +contracts/deployment/libraries/CMTATFactoryRoot.sol#L45-L47 + + + - [ ] ID-31 +Parameter [RuleEngineMock.detectTransferRestriction(address,address,uint256)._amount](contracts/mocks/RuleEngine/RuleEngineMock.sol#L42) is not in mixedCase + +contracts/mocks/RuleEngine/RuleEngineMock.sol#L42 + + + - [ ] ID-32 +Constant [PauseModule.PauseModuleStorageLocation](contracts/modules/wrapper/core/PauseModule.sol#L28) is not in UPPER_CASE_WITH_UNDERSCORES + +contracts/modules/wrapper/core/PauseModule.sol#L28 + + + - [ ] ID-33 +Contract [CMTAT_UUPS_FACTORY](contracts/deployment/CMTAT_UUPS_FACTORY.sol#L15-L93) is not in CapWords + +contracts/deployment/CMTAT_UUPS_FACTORY.sol#L15-L93 + + + - [ ] ID-34 +Contract [CMTAT_PROXY](contracts/CMTAT_PROXY.sol#L11-L23) is not in CapWords + +contracts/CMTAT_PROXY.sol#L11-L23 + + + - [ ] ID-35 +Function [PauseModule.__PauseModule_init_unchained()](contracts/modules/wrapper/core/PauseModule.sol#L34-L36) is not in mixedCase + +contracts/modules/wrapper/core/PauseModule.sol#L34-L36 + + + - [ ] ID-36 +Function [BaseModule.__Base_init_unchained(string,string,string)](contracts/modules/wrapper/core/BaseModule.sol#L40-L49) is not in mixedCase + +contracts/modules/wrapper/core/BaseModule.sol#L40-L49 + + + - [ ] ID-37 +Function [EnforcementModuleInternal.__Enforcement_init_unchained()](contracts/modules/internal/EnforcementModuleInternal.sol#L53-L55) is not in mixedCase + +contracts/modules/internal/EnforcementModuleInternal.sol#L53-L55 + + + - [ ] ID-38 +Struct [CMTATFactoryInvariant.CMTAT_ARGUMENT](contracts/deployment/libraries/CMTATFactoryInvariant.sol#L13-L18) is not in CapWords + +contracts/deployment/libraries/CMTATFactoryInvariant.sol#L13-L18 + + + - [ ] ID-39 +Function [ERC20BurnModule.__ERC20BurnModule_init_unchained()](contracts/modules/wrapper/core/ERC20BurnModule.sol#L32-L34) is not in mixedCase + +contracts/modules/wrapper/core/ERC20BurnModule.sol#L32-L34 + + + - [ ] ID-40 +Function [ValidationModuleInternal.__Validation_init_unchained(IRuleEngine)](contracts/modules/internal/ValidationModuleInternal.sol#L30-L38) is not in mixedCase + +contracts/modules/internal/ValidationModuleInternal.sol#L30-L38 + + + - [ ] ID-41 +Constant [ValidationModuleInternal.ValidationModuleInternalStorageLocation](contracts/modules/internal/ValidationModuleInternal.sol#L24) is not in UPPER_CASE_WITH_UNDERSCORES + +contracts/modules/internal/ValidationModuleInternal.sol#L24 + + + - [ ] ID-42 +Contract [CMTAT_STANDALONE](contracts/CMTAT_STANDALONE.sol#L11-L37) is not in CapWords + +contracts/CMTAT_STANDALONE.sol#L11-L37 + + + - [ ] ID-43 +Parameter [RuleEngineMock.operateOnTransfer(address,address,uint256)._to](contracts/mocks/RuleEngine/RuleEngineMock.sol#L74) is not in mixedCase + +contracts/mocks/RuleEngine/RuleEngineMock.sol#L74 + + + - [ ] ID-44 +Parameter [RuleEngineMock.validateTransfer(address,address,uint256)._amount](contracts/mocks/RuleEngine/RuleEngineMock.sol#L64) is not in mixedCase + +contracts/mocks/RuleEngine/RuleEngineMock.sol#L64 + + + - [ ] ID-45 +Parameter [RuleEngineMock.operateOnTransfer(address,address,uint256)._from](contracts/mocks/RuleEngine/RuleEngineMock.sol#L73) is not in mixedCase + +contracts/mocks/RuleEngine/RuleEngineMock.sol#L73 + + + - [ ] ID-46 +Parameter [RuleMock.validateTransfer(address,address,uint256)._to](contracts/mocks/RuleEngine/RuleMock.sol#L15) is not in mixedCase + +contracts/mocks/RuleEngine/RuleMock.sol#L15 + + + - [ ] ID-47 +Parameter [RuleEngineMock.operateOnTransfer(address,address,uint256)._amount](contracts/mocks/RuleEngine/RuleEngineMock.sol#L75) is not in mixedCase + +contracts/mocks/RuleEngine/RuleEngineMock.sol#L75 + + + - [ ] ID-48 +Parameter [RuleMock.canReturnTransferRestrictionCode(uint8)._restrictionCode](contracts/mocks/RuleEngine/RuleMock.sol#L36) is not in mixedCase + +contracts/mocks/RuleEngine/RuleMock.sol#L36 + + + - [ ] ID-49 +Function [DebtModule.__DebtModule_init_unchained(IDebtEngine)](contracts/modules/wrapper/extensions/DebtModule.sol#L41-L50) is not in mixedCase + +contracts/modules/wrapper/extensions/DebtModule.sol#L41-L50 + + + - [ ] ID-50 +Parameter [RuleEngineMock.validateTransfer(address,address,uint256)._to](contracts/mocks/RuleEngine/RuleEngineMock.sol#L63) is not in mixedCase + +contracts/mocks/RuleEngine/RuleEngineMock.sol#L63 + + + - [ ] ID-51 +Function [DocumentModule.__DocumentModule_init_unchained(IERC1643)](contracts/modules/wrapper/extensions/DocumentModule.sol#L41-L48) is not in mixedCase + +contracts/modules/wrapper/extensions/DocumentModule.sol#L41-L48 + + + - [ ] ID-52 +Parameter [DocumentModule.getDocument(bytes32)._name](contracts/modules/wrapper/extensions/DocumentModule.sol#L74) is not in mixedCase + +contracts/modules/wrapper/extensions/DocumentModule.sol#L74 + + + - [ ] ID-53 +Constant [SnapshotModuleBase.SnapshotModuleBaseStorageLocation](contracts/modules/internal/base/SnapshotModuleBase.sol#L45) is not in UPPER_CASE_WITH_UNDERSCORES + +contracts/modules/internal/base/SnapshotModuleBase.sol#L45 + + + - [ ] ID-54 +Function [AuthorizationModule.__AuthorizationModule_init_unchained(address,IAuthorizationEngine)](contracts/modules/security/AuthorizationModule.sol#L30-L41) is not in mixedCase + +contracts/modules/security/AuthorizationModule.sol#L30-L41 + + + - [ ] ID-55 +Function [CMTAT_BASE.__CMTAT_init(address,ICMTATConstructor.ERC20Attributes,ICMTATConstructor.BaseModuleAttributes,ICMTATConstructor.Engine)](contracts/modules/CMTAT_BASE.sol#L77-L129) is not in mixedCase + +contracts/modules/CMTAT_BASE.sol#L77-L129 + + + - [ ] ID-56 +Constant [ERC20BaseModule.ERC20BaseModuleStorageLocation](contracts/modules/wrapper/core/ERC20BaseModule.sol#L26) is not in UPPER_CASE_WITH_UNDERSCORES + +contracts/modules/wrapper/core/ERC20BaseModule.sol#L26 + + + - [ ] ID-57 +Parameter [RuleEngineMock.validateTransfer(address,address,uint256)._from](contracts/mocks/RuleEngine/RuleEngineMock.sol#L62) is not in mixedCase + +contracts/mocks/RuleEngine/RuleEngineMock.sol#L62 + + + - [ ] ID-58 +Parameter [RuleMock.validateTransfer(address,address,uint256)._amount](contracts/mocks/RuleEngine/RuleMock.sol#L16) is not in mixedCase + +contracts/mocks/RuleEngine/RuleMock.sol#L16 + + + - [ ] ID-59 +Parameter [CMTAT_PROXY_UUPS.initialize(address,ICMTATConstructor.ERC20Attributes,ICMTATConstructor.BaseModuleAttributes,ICMTATConstructor.Engine).ERC20Attributes_](contracts/CMTAT_PROXY_UUPS.sol#L39) is not in mixedCase + +contracts/CMTAT_PROXY_UUPS.sol#L39 + + + - [ ] ID-60 +Parameter [CMTAT_BASE.initialize(address,ICMTATConstructor.ERC20Attributes,ICMTATConstructor.BaseModuleAttributes,ICMTATConstructor.Engine).ERC20Attributes_](contracts/modules/CMTAT_BASE.sol#L61) is not in mixedCase + +contracts/modules/CMTAT_BASE.sol#L61 + + + - [ ] ID-61 +Function [CMTAT_BASE.__CMTAT_init_unchained()](contracts/modules/CMTAT_BASE.sol#L131-L133) is not in mixedCase + +contracts/modules/CMTAT_BASE.sol#L131-L133 + + + - [ ] ID-62 +Constant [DocumentModule.DocumentModuleStorageLocation](contracts/modules/wrapper/extensions/DocumentModule.sol#L27) is not in UPPER_CASE_WITH_UNDERSCORES + +contracts/modules/wrapper/extensions/DocumentModule.sol#L27 + + + - [ ] ID-63 +Parameter [RuleMock.detectTransferRestriction(address,address,uint256)._amount](contracts/mocks/RuleEngine/RuleMock.sol#L27) is not in mixedCase + +contracts/mocks/RuleEngine/RuleMock.sol#L27 + + + - [ ] ID-64 +Function [ERC20BaseModule.__ERC20BaseModule_init_unchained(uint8)](contracts/modules/wrapper/core/ERC20BaseModule.sol#L39-L44) is not in mixedCase + +contracts/modules/wrapper/core/ERC20BaseModule.sol#L39-L44 + + + - [ ] ID-65 +Parameter [RuleMock.messageForTransferRestriction(uint8)._restrictionCode](contracts/mocks/RuleEngine/RuleMock.sol#L42) is not in mixedCase + +contracts/mocks/RuleEngine/RuleMock.sol#L42 + + + - [ ] ID-66 +Constant [AuthorizationModule.AuthorizationModuleStorageLocation](contracts/modules/security/AuthorizationModule.sol#L17) is not in UPPER_CASE_WITH_UNDERSCORES + +contracts/modules/security/AuthorizationModule.sol#L17 + + + - [ ] ID-67 +Function [ERC20MintModule.__ERC20MintModule_init_unchained()](contracts/modules/wrapper/core/ERC20MintModule.sol#L27-L29) is not in mixedCase + +contracts/modules/wrapper/core/ERC20MintModule.sol#L27-L29 + + + - [ ] ID-68 +Parameter [RuleEngineMock.detectTransferRestriction(address,address,uint256)._to](contracts/mocks/RuleEngine/RuleEngineMock.sol#L41) is not in mixedCase + +contracts/mocks/RuleEngine/RuleEngineMock.sol#L41 + + + - [ ] ID-69 +Constant [BaseModule.BaseModuleStorageLocation](contracts/modules/wrapper/core/BaseModule.sol#L25) is not in UPPER_CASE_WITH_UNDERSCORES + +contracts/modules/wrapper/core/BaseModule.sol#L25 + + + - [ ] ID-70 +Function [SnapshotModuleBase.__SnapshotModuleBase_init_unchained()](contracts/modules/internal/base/SnapshotModuleBase.sol#L70-L73) is not in mixedCase + +contracts/modules/internal/base/SnapshotModuleBase.sol#L70-L73 + + + - [ ] ID-71 +Contract [CMTAT_BEACON_FACTORY](contracts/deployment/CMTAT_BEACON_FACTORY.sol#L15-L110) is not in CapWords + +contracts/deployment/CMTAT_BEACON_FACTORY.sol#L15-L110 + + + - [ ] ID-72 +Parameter [CMTAT_BASE.__CMTAT_init(address,ICMTATConstructor.ERC20Attributes,ICMTATConstructor.BaseModuleAttributes,ICMTATConstructor.Engine).ERC20Attributes_](contracts/modules/CMTAT_BASE.sol#L79) is not in mixedCase + +contracts/modules/CMTAT_BASE.sol#L79 + + + - [ ] ID-73 +Contract [CMTAT_BASE](contracts/modules/CMTAT_BASE.sol#L29-L240) is not in CapWords + +contracts/modules/CMTAT_BASE.sol#L29-L240 + + + - [ ] ID-74 +Parameter [RuleEngineMock.messageForTransferRestriction(uint8)._restrictionCode](contracts/mocks/RuleEngine/RuleEngineMock.sol#L84) is not in mixedCase + +contracts/mocks/RuleEngine/RuleEngineMock.sol#L84 + + + - [ ] ID-75 +Function [ValidationModule.__ValidationModule_init_unchained()](contracts/modules/wrapper/controllers/ValidationModule.sol#L28-L30) is not in mixedCase + +contracts/modules/wrapper/controllers/ValidationModule.sol#L28-L30 + + + - [ ] ID-76 +Parameter [RuleEngineMock.detectTransferRestriction(address,address,uint256)._from](contracts/mocks/RuleEngine/RuleEngineMock.sol#L40) is not in mixedCase + +contracts/mocks/RuleEngine/RuleEngineMock.sol#L40 + + + - [ ] ID-77 +Constant [DebtModule.DebtModuleStorageLocation](contracts/modules/wrapper/extensions/DebtModule.sol#L20) is not in UPPER_CASE_WITH_UNDERSCORES + +contracts/modules/wrapper/extensions/DebtModule.sol#L20 + + + - [ ] ID-78 +Function [ERC20SnapshotModule.__ERC20SnasphotModule_init_unchained()](contracts/modules/wrapper/extensions/ERC20SnapshotModule.sol#L22-L24) is not in mixedCase + +contracts/modules/wrapper/extensions/ERC20SnapshotModule.sol#L22-L24 + + + - [ ] ID-79 +Function [EnforcementModule.__EnforcementModule_init_unchained()](contracts/modules/wrapper/core/EnforcementModule.sol#L27-L29) is not in mixedCase + +contracts/modules/wrapper/core/EnforcementModule.sol#L27-L29 + + + - [ ] ID-80 +Function [ERC20SnapshotModuleInternal.__ERC20Snapshot_init_unchained()](contracts/modules/internal/ERC20SnapshotModuleInternal.sol#L21-L24) is not in mixedCase + +contracts/modules/internal/ERC20SnapshotModuleInternal.sol#L21-L24 + + + - [ ] ID-81 +Contract [CMTAT_TP_FACTORY](contracts/deployment/CMTAT_TP_FACTORY.sol#L15-L98) is not in CapWords + +contracts/deployment/CMTAT_TP_FACTORY.sol#L15-L98 + + + - [ ] ID-82 +Parameter [RuleMock.validateTransfer(address,address,uint256)._from](contracts/mocks/RuleEngine/RuleMock.sol#L14) is not in mixedCase + +contracts/mocks/RuleEngine/RuleMock.sol#L14 + +## similar-names + +> Acknowledge + +Impact: Informational +Confidence: Medium + + - [ ] ID-83 +Variable [IERC1643Whole.setDocument(bytes32,string,bytes32)._documentHash](contracts/mocks/DocumentEngineMock.sol#L8) is too similar to [DocumentEngineMock.setDocument(bytes32,string,bytes32).documentHash_](contracts/mocks/DocumentEngineMock.sol#L55) + +contracts/mocks/DocumentEngineMock.sol#L8 + + + - [ ] ID-84 +Variable [CMTAT_BEACON_FACTORY._getBytecode(CMTATFactoryInvariant.CMTAT_ARGUMENT)._implementation](contracts/deployment/CMTAT_BEACON_FACTORY.sol#L100-L106) is too similar to [CMTAT_BEACON_FACTORY.constructor(address,address,address,bool).implementation_](contracts/deployment/CMTAT_BEACON_FACTORY.sol#L22) + +contracts/deployment/CMTAT_BEACON_FACTORY.sol#L100-L106 + + + - [ ] ID-85 +Variable [DebtEngineMock._creditEvents](contracts/mocks/DebtEngineMock.sol#L15) is too similar to [DebtEngineMock.setCreditEvents(IDebtGlobal.CreditEvents).creditEvents_](contracts/mocks/DebtEngineMock.sol#L29) + +contracts/mocks/DebtEngineMock.sol#L15 + +## too-many-digits + +> Don't understand + +Impact: Informational +Confidence: Medium + - [ ] ID-86 + [CMTAT_TP_FACTORY._getBytecode(address,CMTATFactoryInvariant.CMTAT_ARGUMENT)](contracts/deployment/CMTAT_TP_FACTORY.sol#L85-L96) uses literals with too many digits: + - [bytecode = abi.encodePacked(type()(TransparentUpgradeableProxy).creationCode,abi.encode(logic,proxyAdminOwner,implementation))](contracts/deployment/CMTAT_TP_FACTORY.sol#L95) + +contracts/deployment/CMTAT_TP_FACTORY.sol#L85-L96 + + + - [ ] ID-87 + [CMTAT_BEACON_FACTORY._getBytecode(CMTATFactoryInvariant.CMTAT_ARGUMENT)](contracts/deployment/CMTAT_BEACON_FACTORY.sol#L97-L108) uses literals with too many digits: + - [bytecode = abi.encodePacked(type()(BeaconProxy).creationCode,abi.encode(address(beacon),_implementation))](contracts/deployment/CMTAT_BEACON_FACTORY.sol#L107) + +contracts/deployment/CMTAT_BEACON_FACTORY.sol#L97-L108 + diff --git a/doc/audits/tools/v2.3.0-slither-report.md b/doc/audits/tools/slither/v2.3.0-slither-report.md similarity index 100% rename from doc/audits/tools/v2.3.0-slither-report.md rename to doc/audits/tools/slither/v2.3.0-slither-report.md diff --git a/doc/audits/tools/v2.3.1-slither-report.md b/doc/audits/tools/slither/v2.3.1-slither-report.md similarity index 100% rename from doc/audits/tools/v2.3.1-slither-report.md rename to doc/audits/tools/slither/v2.3.1-slither-report.md diff --git a/doc/audits/tools/slither-report-v2.4.0.md b/doc/audits/tools/slither/v2.4.0-slither-report.md similarity index 100% rename from doc/audits/tools/slither-report-v2.4.0.md rename to doc/audits/tools/slither/v2.4.0-slither-report.md diff --git a/doc/audits/tools/slither-report.md b/doc/audits/tools/slither/v2.5.0-slither-report.md similarity index 100% rename from doc/audits/tools/slither-report.md rename to doc/audits/tools/slither/v2.5.0-slither-report.md diff --git a/doc/general/test/coverage/contracts/CMTAT_PROXY.sol.html b/doc/general/test/coverage/contracts/CMTAT_PROXY.sol.html index c1f44cd5..9ed16b05 100644 --- a/doc/general/test/coverage/contracts/CMTAT_PROXY.sol.html +++ b/doc/general/test/coverage/contracts/CMTAT_PROXY.sol.html @@ -65,7 +65,9 @@

20 21 22 -23  +23 +24  +        @@ -93,6 +95,7 @@

  import "./modules/CMTAT_BASE.sol";   +  /** * @title CMTAT version for a proxy deployment (Transparent or Beacon proxy) */ @@ -115,7 +118,7 @@

diff --git a/doc/general/test/coverage/contracts/CMTAT_PROXY_UUPS.sol.html b/doc/general/test/coverage/contracts/CMTAT_PROXY_UUPS.sol.html index 215b7b65..fdef59e1 100644 --- a/doc/general/test/coverage/contracts/CMTAT_PROXY_UUPS.sol.html +++ b/doc/general/test/coverage/contracts/CMTAT_PROXY_UUPS.sol.html @@ -96,7 +96,9 @@

51 52 53 -54  +54 +55  +        @@ -155,6 +157,7 @@

import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; import "./modules/CMTAT_BASE.sol";   +  /** * @title CMTAT version for a proxy deployment with UUPS proxy */ @@ -208,7 +211,7 @@

diff --git a/doc/general/test/coverage/contracts/CMTAT_STANDALONE.sol.html b/doc/general/test/coverage/contracts/CMTAT_STANDALONE.sol.html index 8ba53413..a2fdbad4 100644 --- a/doc/general/test/coverage/contracts/CMTAT_STANDALONE.sol.html +++ b/doc/general/test/coverage/contracts/CMTAT_STANDALONE.sol.html @@ -79,7 +79,9 @@

34 35 36 -37  +37 +38  +        @@ -121,6 +123,7 @@

  import "./modules/CMTAT_BASE.sol";   +  /** * @title CMTAT version for a standalone deployment (without proxy) */ @@ -157,7 +160,7 @@

diff --git a/doc/general/test/coverage/contracts/deployment/CMTAT_BEACON_FACTORY.sol.html b/doc/general/test/coverage/contracts/deployment/CMTAT_BEACON_FACTORY.sol.html index 8258d70f..c1c3d8e0 100644 --- a/doc/general/test/coverage/contracts/deployment/CMTAT_BEACON_FACTORY.sol.html +++ b/doc/general/test/coverage/contracts/deployment/CMTAT_BEACON_FACTORY.sol.html @@ -173,11 +173,11 @@

      -  -8× +7× 1×   -7× +6× +  1×   6× @@ -195,12 +195,12 @@

      -2× -2× +3× +3×     -2× -2× +3× +3×       @@ -234,13 +234,13 @@

      -2× -2× -2× -2× -2× -2× -2× +3× +3× +3× +3× +3× +3× +3×       @@ -250,14 +250,14 @@

      -4× +5×             -4× +5×    
//SPDX-License-Identifier: MPL-2.0
 pragma solidity ^0.8.20;
@@ -274,7 +274,6 @@ 

* */ contract CMTAT_BEACON_FACTORY is AccessControl, CMTATFactoryRoot { - // public UpgradeableBeacon public immutable beacon; /** * @param implementation_ contract implementation @@ -286,7 +285,8 @@

revert FactoryErrors.CMTAT_Factory_AddressZeroNotAllowedForBeaconOwner(); } if(implementation_ == address(0)){ - revert FactoryErrors.CMTAT_Factory_AddressZeroNotAllowedForLogicContract(); + // Forwarder is the zero address if no implementation provided + implementation_ = address(new CMTAT_PROXY(address(0))); } beacon = new UpgradeableBeacon(implementation_, beaconOwner); } @@ -373,7 +373,7 @@

diff --git a/doc/general/test/coverage/contracts/deployment/CMTAT_TP_FACTORY.sol.html b/doc/general/test/coverage/contracts/deployment/CMTAT_TP_FACTORY.sol.html index f5293bd9..e50cd33c 100644 --- a/doc/general/test/coverage/contracts/deployment/CMTAT_TP_FACTORY.sol.html +++ b/doc/general/test/coverage/contracts/deployment/CMTAT_TP_FACTORY.sol.html @@ -132,7 +132,21 @@

87 88 89 -90  +90 +91 +92 +93 +94 +95 +96 +97  +  +  +  +  +  +  +        @@ -226,15 +240,22 @@

  import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; import "../CMTAT_PROXY.sol"; -import '@openzeppelin/contracts/utils/Create2.sol'; +import "@openzeppelin/contracts/utils/Create2.sol"; import "./libraries/CMTATFactoryInvariant.sol"; import "./libraries/CMTATFactoryBase.sol"; +  +  /** * @notice Factory to deploy CMTAT with a transparent proxy * */ contract CMTAT_TP_FACTORY is CMTATFactoryBase {   + /** + * @param logic_ contract implementation, cannot be zero + * @param factoryAdmin admin + * @param useCustomSalt_ custom salt with create2 or not + */ constructor(address logic_, address factoryAdmin, bool useCustomSalt_) CMTATFactoryBase(logic_, factoryAdmin,useCustomSalt_){}   /*////////////////////////////////////////////////////////////// @@ -316,7 +337,7 @@

diff --git a/doc/general/test/coverage/contracts/deployment/CMTAT_UUPS_FACTORY.sol.html b/doc/general/test/coverage/contracts/deployment/CMTAT_UUPS_FACTORY.sol.html index 68ec547c..d265e30a 100644 --- a/doc/general/test/coverage/contracts/deployment/CMTAT_UUPS_FACTORY.sol.html +++ b/doc/general/test/coverage/contracts/deployment/CMTAT_UUPS_FACTORY.sol.html @@ -131,7 +131,13 @@

86 87 88 -89  +89 +90 +91 +92  +  +  +        @@ -224,17 +230,20 @@

  import "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; import "../CMTAT_PROXY_UUPS.sol"; -import '@openzeppelin/contracts/utils/Create2.sol'; +import "@openzeppelin/contracts/utils/Create2.sol"; import "./libraries/CMTATFactoryInvariant.sol"; import "./libraries/CMTATFactoryBase.sol"; +  +  /** * @notice Factory to deploy CMTAT with a UUPS proxy * */ contract CMTAT_UUPS_FACTORY is CMTATFactoryBase { /** - * @param logic_ contract implementation + * @param logic_ contract implementation, cannot be zero * @param factoryAdmin admin + * @param useCustomSalt_ custom salt with create2 or not */ constructor(address logic_, address factoryAdmin, bool useCustomSalt_) CMTATFactoryBase(logic_, factoryAdmin,useCustomSalt_){} @@ -313,7 +322,7 @@

diff --git a/doc/general/test/coverage/contracts/deployment/index.html b/doc/general/test/coverage/contracts/deployment/index.html index fe5266d0..ec2b356f 100644 --- a/doc/general/test/coverage/contracts/deployment/index.html +++ b/doc/general/test/coverage/contracts/deployment/index.html @@ -103,7 +103,7 @@

diff --git a/doc/general/test/coverage/contracts/deployment/libraries/CMTATFactoryBase.sol.html b/doc/general/test/coverage/contracts/deployment/libraries/CMTATFactoryBase.sol.html index af7247ce..47dd6ba7 100644 --- a/doc/general/test/coverage/contracts/deployment/libraries/CMTATFactoryBase.sol.html +++ b/doc/general/test/coverage/contracts/deployment/libraries/CMTATFactoryBase.sol.html @@ -118,7 +118,7 @@

diff --git a/doc/general/test/coverage/contracts/deployment/libraries/CMTATFactoryInvariant.sol.html b/doc/general/test/coverage/contracts/deployment/libraries/CMTATFactoryInvariant.sol.html index 87c19507..9bf8bb27 100644 --- a/doc/general/test/coverage/contracts/deployment/libraries/CMTATFactoryInvariant.sol.html +++ b/doc/general/test/coverage/contracts/deployment/libraries/CMTATFactoryInvariant.sol.html @@ -118,7 +118,7 @@

diff --git a/doc/general/test/coverage/contracts/deployment/libraries/CMTATFactoryRoot.sol.html b/doc/general/test/coverage/contracts/deployment/libraries/CMTATFactoryRoot.sol.html index 9b9b198c..c0528424 100644 --- a/doc/general/test/coverage/contracts/deployment/libraries/CMTATFactoryRoot.sol.html +++ b/doc/general/test/coverage/contracts/deployment/libraries/CMTATFactoryRoot.sol.html @@ -137,14 +137,14 @@

      -27× -3× +25× +2×   -24× -15× +23× +13×   -24× -24× +23× +23×       @@ -157,7 +157,7 @@

      -13× +14×       @@ -170,7 +170,7 @@

      -11× +12× 5× 2×   @@ -178,7 +178,7 @@

3×     -6× +7×      
//SPDX-License-Identifier: MPL-2.0
@@ -256,7 +256,7 @@ 

diff --git a/doc/general/test/coverage/contracts/deployment/libraries/index.html b/doc/general/test/coverage/contracts/deployment/libraries/index.html index 8490a669..f46787fe 100644 --- a/doc/general/test/coverage/contracts/deployment/libraries/index.html +++ b/doc/general/test/coverage/contracts/deployment/libraries/index.html @@ -103,7 +103,7 @@

diff --git a/doc/general/test/coverage/contracts/index.html b/doc/general/test/coverage/contracts/index.html index 9ce29ff8..6585f11a 100644 --- a/doc/general/test/coverage/contracts/index.html +++ b/doc/general/test/coverage/contracts/index.html @@ -103,7 +103,7 @@

diff --git a/doc/general/test/coverage/contracts/interfaces/ICCIPToken.sol.html b/doc/general/test/coverage/contracts/interfaces/ICCIPToken.sol.html index b526f339..46226201 100644 --- a/doc/general/test/coverage/contracts/interfaces/ICCIPToken.sol.html +++ b/doc/general/test/coverage/contracts/interfaces/ICCIPToken.sol.html @@ -121,7 +121,7 @@

diff --git a/doc/general/test/coverage/contracts/interfaces/ICMTATConstructor.sol.html b/doc/general/test/coverage/contracts/interfaces/ICMTATConstructor.sol.html index aae2f6ee..6643f881 100644 --- a/doc/general/test/coverage/contracts/interfaces/ICMTATConstructor.sol.html +++ b/doc/general/test/coverage/contracts/interfaces/ICMTATConstructor.sol.html @@ -78,7 +78,9 @@

33 34 35 -36  +36 +37  +        @@ -114,12 +116,13 @@

     
//SPDX-License-Identifier: MPL-2.0
+pragma solidity ^0.8.20;
 import "./engine/IDebtEngine.sol";
 import "./engine/IRuleEngine.sol";
 import "./engine/IAuthorizationEngine.sol";
 import "./engine/draft-IERC1643.sol";
  
-pragma solidity ^0.8.20;
+ 
  
 /**
 * @notice interface to represent arguments used for CMTAT constructor / initialize
@@ -154,7 +157,7 @@ 

diff --git a/doc/general/test/coverage/contracts/interfaces/ICMTATSnapshot.sol.html b/doc/general/test/coverage/contracts/interfaces/ICMTATSnapshot.sol.html index 904f4196..1395b22e 100644 --- a/doc/general/test/coverage/contracts/interfaces/ICMTATSnapshot.sol.html +++ b/doc/general/test/coverage/contracts/interfaces/ICMTATSnapshot.sol.html @@ -163,7 +163,7 @@

diff --git a/doc/general/test/coverage/contracts/interfaces/draft-IERC1404/draft-IERC1404.sol.html b/doc/general/test/coverage/contracts/interfaces/draft-IERC1404/draft-IERC1404.sol.html index 082e383c..f02bbeca 100644 --- a/doc/general/test/coverage/contracts/interfaces/draft-IERC1404/draft-IERC1404.sol.html +++ b/doc/general/test/coverage/contracts/interfaces/draft-IERC1404/draft-IERC1404.sol.html @@ -127,7 +127,7 @@

diff --git a/doc/general/test/coverage/contracts/interfaces/draft-IERC1404/draft-IERC1404EnumCode.sol.html b/doc/general/test/coverage/contracts/interfaces/draft-IERC1404/draft-IERC1404EnumCode.sol.html index e8b5ea44..89805afc 100644 --- a/doc/general/test/coverage/contracts/interfaces/draft-IERC1404/draft-IERC1404EnumCode.sol.html +++ b/doc/general/test/coverage/contracts/interfaces/draft-IERC1404/draft-IERC1404EnumCode.sol.html @@ -94,7 +94,7 @@

diff --git a/doc/general/test/coverage/contracts/interfaces/draft-IERC1404/draft-IERC1404Wrapper.sol.html b/doc/general/test/coverage/contracts/interfaces/draft-IERC1404/draft-IERC1404Wrapper.sol.html index 66534533..109ee153 100644 --- a/doc/general/test/coverage/contracts/interfaces/draft-IERC1404/draft-IERC1404Wrapper.sol.html +++ b/doc/general/test/coverage/contracts/interfaces/draft-IERC1404/draft-IERC1404Wrapper.sol.html @@ -103,7 +103,7 @@

diff --git a/doc/general/test/coverage/contracts/interfaces/draft-IERC1404/index.html b/doc/general/test/coverage/contracts/interfaces/draft-IERC1404/index.html index c3b92b57..a5b41084 100644 --- a/doc/general/test/coverage/contracts/interfaces/draft-IERC1404/index.html +++ b/doc/general/test/coverage/contracts/interfaces/draft-IERC1404/index.html @@ -103,7 +103,7 @@

diff --git a/doc/general/test/coverage/contracts/interfaces/engine/IAuthorizationEngine.sol.html b/doc/general/test/coverage/contracts/interfaces/engine/IAuthorizationEngine.sol.html index 3c637833..14799def 100644 --- a/doc/general/test/coverage/contracts/interfaces/engine/IAuthorizationEngine.sol.html +++ b/doc/general/test/coverage/contracts/interfaces/engine/IAuthorizationEngine.sol.html @@ -118,7 +118,7 @@

diff --git a/doc/general/test/coverage/contracts/interfaces/engine/IDebtEngine.sol.html b/doc/general/test/coverage/contracts/interfaces/engine/IDebtEngine.sol.html index 81a7c34a..e9679c05 100644 --- a/doc/general/test/coverage/contracts/interfaces/engine/IDebtEngine.sol.html +++ b/doc/general/test/coverage/contracts/interfaces/engine/IDebtEngine.sol.html @@ -106,7 +106,7 @@

diff --git a/doc/general/test/coverage/contracts/interfaces/engine/IDebtGlobal.sol.html b/doc/general/test/coverage/contracts/interfaces/engine/IDebtGlobal.sol.html index 9b5e6243..ef54cf40 100644 --- a/doc/general/test/coverage/contracts/interfaces/engine/IDebtGlobal.sol.html +++ b/doc/general/test/coverage/contracts/interfaces/engine/IDebtGlobal.sol.html @@ -136,7 +136,7 @@

diff --git a/doc/general/test/coverage/contracts/interfaces/engine/IRuleEngine.sol.html b/doc/general/test/coverage/contracts/interfaces/engine/IRuleEngine.sol.html index 5c20a1d7..6193844d 100644 --- a/doc/general/test/coverage/contracts/interfaces/engine/IRuleEngine.sol.html +++ b/doc/general/test/coverage/contracts/interfaces/engine/IRuleEngine.sol.html @@ -109,7 +109,7 @@

diff --git a/doc/general/test/coverage/contracts/interfaces/engine/draft-IERC1643.sol.html b/doc/general/test/coverage/contracts/interfaces/engine/draft-IERC1643.sol.html index de24c346..0c21387c 100644 --- a/doc/general/test/coverage/contracts/interfaces/engine/draft-IERC1643.sol.html +++ b/doc/general/test/coverage/contracts/interfaces/engine/draft-IERC1643.sol.html @@ -79,7 +79,7 @@

diff --git a/doc/general/test/coverage/contracts/interfaces/engine/index.html b/doc/general/test/coverage/contracts/interfaces/engine/index.html index 68e5bddc..9192c698 100644 --- a/doc/general/test/coverage/contracts/interfaces/engine/index.html +++ b/doc/general/test/coverage/contracts/interfaces/engine/index.html @@ -129,7 +129,7 @@

diff --git a/doc/general/test/coverage/contracts/interfaces/index.html b/doc/general/test/coverage/contracts/interfaces/index.html index 632bd98d..36e947e6 100644 --- a/doc/general/test/coverage/contracts/interfaces/index.html +++ b/doc/general/test/coverage/contracts/interfaces/index.html @@ -103,7 +103,7 @@

diff --git a/doc/general/test/coverage/contracts/libraries/Errors.sol.html b/doc/general/test/coverage/contracts/libraries/Errors.sol.html index f24beaf0..8ce419b5 100644 --- a/doc/general/test/coverage/contracts/libraries/Errors.sol.html +++ b/doc/general/test/coverage/contracts/libraries/Errors.sol.html @@ -256,7 +256,7 @@

diff --git a/doc/general/test/coverage/contracts/libraries/FactoryErrors.sol.html b/doc/general/test/coverage/contracts/libraries/FactoryErrors.sol.html index c608b4a9..23707973 100644 --- a/doc/general/test/coverage/contracts/libraries/FactoryErrors.sol.html +++ b/doc/general/test/coverage/contracts/libraries/FactoryErrors.sol.html @@ -88,7 +88,7 @@

diff --git a/doc/general/test/coverage/contracts/libraries/index.html b/doc/general/test/coverage/contracts/libraries/index.html index e3e50a9e..d8d79f13 100644 --- a/doc/general/test/coverage/contracts/libraries/index.html +++ b/doc/general/test/coverage/contracts/libraries/index.html @@ -90,7 +90,7 @@

diff --git a/doc/general/test/coverage/contracts/modules/CMTAT_BASE.sol.html b/doc/general/test/coverage/contracts/modules/CMTAT_BASE.sol.html index c18f34a8..04d9627e 100644 --- a/doc/general/test/coverage/contracts/modules/CMTAT_BASE.sol.html +++ b/doc/general/test/coverage/contracts/modules/CMTAT_BASE.sol.html @@ -347,7 +347,7 @@

      -384× +385×       @@ -367,50 +367,50 @@

      -384× -384× +385× +385×   -384× +385×   -384× -384× +385× +385×     -384× +385×         -384× -384× +385× +385×   -384× +385×       -384× -382× -382× +385× +383× +383×   -382× -382× +383× +383×   -382× -382× +383× +383×           -382× -382× -382× +383× +383× +383×     -382× +383×     -382× +383×       @@ -476,7 +476,7 @@

      -438× +439× 17×     @@ -484,8 +484,8 @@

      -421× -421× +422× +422×       @@ -499,7 +499,7 @@

      -1389× +1391×       @@ -508,7 +508,7 @@

      -1389× +1391×       @@ -769,7 +769,7 @@

diff --git a/doc/general/test/coverage/contracts/modules/index.html b/doc/general/test/coverage/contracts/modules/index.html index f16eff78..bd35beff 100644 --- a/doc/general/test/coverage/contracts/modules/index.html +++ b/doc/general/test/coverage/contracts/modules/index.html @@ -77,7 +77,7 @@

diff --git a/doc/general/test/coverage/contracts/modules/internal/ERC20SnapshotModuleInternal.sol.html b/doc/general/test/coverage/contracts/modules/internal/ERC20SnapshotModuleInternal.sol.html index 7fd178e9..3b52a76d 100644 --- a/doc/general/test/coverage/contracts/modules/internal/ERC20SnapshotModuleInternal.sol.html +++ b/doc/general/test/coverage/contracts/modules/internal/ERC20SnapshotModuleInternal.sol.html @@ -287,8 +287,8 @@

      -421× -421× +422× +422×   77× 77× @@ -300,8 +300,8 @@

      -344× -344× +345× +345×       @@ -309,16 +309,16 @@

      -464× -464× +465× +465×             -378× -378× +379× +379×      
//SPDX-License-Identifier: MPL-2.0
@@ -466,7 +466,7 @@ 

diff --git a/doc/general/test/coverage/contracts/modules/internal/EnforcementModuleInternal.sol.html b/doc/general/test/coverage/contracts/modules/internal/EnforcementModuleInternal.sol.html index a04d6a48..77e63443 100644 --- a/doc/general/test/coverage/contracts/modules/internal/EnforcementModuleInternal.sol.html +++ b/doc/general/test/coverage/contracts/modules/internal/EnforcementModuleInternal.sol.html @@ -224,8 +224,8 @@

      -944× -944× +946× +946×       @@ -272,7 +272,7 @@

      -974× +976×       @@ -400,7 +400,7 @@

diff --git a/doc/general/test/coverage/contracts/modules/internal/ValidationModuleInternal.sol.html b/doc/general/test/coverage/contracts/modules/internal/ValidationModuleInternal.sol.html index 8a9dd3c7..71d93b5c 100644 --- a/doc/general/test/coverage/contracts/modules/internal/ValidationModuleInternal.sol.html +++ b/doc/general/test/coverage/contracts/modules/internal/ValidationModuleInternal.sol.html @@ -176,7 +176,7 @@

      -384× +385× 18× 18× 18× @@ -240,7 +240,7 @@

      -628× +629×       @@ -352,7 +352,7 @@

diff --git a/doc/general/test/coverage/contracts/modules/internal/base/SnapshotModuleBase.sol.html b/doc/general/test/coverage/contracts/modules/internal/base/SnapshotModuleBase.sol.html index f2cf0053..e7f0ea38 100644 --- a/doc/general/test/coverage/contracts/modules/internal/base/SnapshotModuleBase.sol.html +++ b/doc/general/test/coverage/contracts/modules/internal/base/SnapshotModuleBase.sol.html @@ -775,9 +775,9 @@

      -842× -842× -842× +844× +844× +844× 36× 36×   @@ -789,12 +789,12 @@

      -421× -421× +422× +422×       -421× +422× 18× 18×   @@ -806,8 +806,8 @@

      -842× -834× +844× +836×   8×   @@ -849,14 +849,14 @@

      -489× -489× +490× +490×   -489× +490×       -403× +404×     86× @@ -902,7 +902,7 @@

      -4856× +4862×       @@ -1345,7 +1345,7 @@

diff --git a/doc/general/test/coverage/contracts/modules/internal/base/index.html b/doc/general/test/coverage/contracts/modules/internal/base/index.html index 6d5f9ab3..6b2ce4d7 100644 --- a/doc/general/test/coverage/contracts/modules/internal/base/index.html +++ b/doc/general/test/coverage/contracts/modules/internal/base/index.html @@ -77,7 +77,7 @@

diff --git a/doc/general/test/coverage/contracts/modules/internal/index.html b/doc/general/test/coverage/contracts/modules/internal/index.html index 25d642d7..53c42414 100644 --- a/doc/general/test/coverage/contracts/modules/internal/index.html +++ b/doc/general/test/coverage/contracts/modules/internal/index.html @@ -103,7 +103,7 @@

diff --git a/doc/general/test/coverage/contracts/modules/security/AuthorizationModule.sol.html b/doc/general/test/coverage/contracts/modules/security/AuthorizationModule.sol.html index ad289c2e..bc716af6 100644 --- a/doc/general/test/coverage/contracts/modules/security/AuthorizationModule.sol.html +++ b/doc/general/test/coverage/contracts/modules/security/AuthorizationModule.sol.html @@ -193,11 +193,11 @@

      -384× +385× 2×   -382× -382× +383× +383× 16× 16× 16× @@ -262,10 +262,10 @@

      -1283× -759× +1285× +760×   -524× +525×       @@ -406,7 +406,7 @@

diff --git a/doc/general/test/coverage/contracts/modules/security/index.html b/doc/general/test/coverage/contracts/modules/security/index.html index f42cc844..b0be96c4 100644 --- a/doc/general/test/coverage/contracts/modules/security/index.html +++ b/doc/general/test/coverage/contracts/modules/security/index.html @@ -77,7 +77,7 @@

diff --git a/doc/general/test/coverage/contracts/modules/wrapper/controllers/ValidationModule.sol.html b/doc/general/test/coverage/contracts/modules/wrapper/controllers/ValidationModule.sol.html index 380bcb96..ef51ee6d 100644 --- a/doc/general/test/coverage/contracts/modules/wrapper/controllers/ValidationModule.sol.html +++ b/doc/general/test/coverage/contracts/modules/wrapper/controllers/ValidationModule.sol.html @@ -328,21 +328,21 @@

      -457× +458× 18×   -439× +440×       -438× +439× 14×   -424× -424× +425× +425× 60×   -364× +365×      
//SPDX-License-Identifier: MPL-2.0
@@ -502,7 +502,7 @@ 

diff --git a/doc/general/test/coverage/contracts/modules/wrapper/controllers/index.html b/doc/general/test/coverage/contracts/modules/wrapper/controllers/index.html index 6b3304d3..ca23daa8 100644 --- a/doc/general/test/coverage/contracts/modules/wrapper/controllers/index.html +++ b/doc/general/test/coverage/contracts/modules/wrapper/controllers/index.html @@ -77,7 +77,7 @@

diff --git a/doc/general/test/coverage/contracts/modules/wrapper/core/BaseModule.sol.html b/doc/general/test/coverage/contracts/modules/wrapper/core/BaseModule.sol.html index b07d3d33..964e3579 100644 --- a/doc/general/test/coverage/contracts/modules/wrapper/core/BaseModule.sol.html +++ b/doc/general/test/coverage/contracts/modules/wrapper/core/BaseModule.sol.html @@ -201,10 +201,10 @@

      -382× -382× -382× -382× +383× +383× +383× +383×       @@ -265,7 +265,7 @@

      -416× +417×       @@ -391,7 +391,7 @@

diff --git a/doc/general/test/coverage/contracts/modules/wrapper/core/ERC20BaseModule.sol.html b/doc/general/test/coverage/contracts/modules/wrapper/core/ERC20BaseModule.sol.html index ec809312..ee11870a 100644 --- a/doc/general/test/coverage/contracts/modules/wrapper/core/ERC20BaseModule.sol.html +++ b/doc/general/test/coverage/contracts/modules/wrapper/core/ERC20BaseModule.sol.html @@ -223,8 +223,8 @@

      -382× -382× +383× +383×       @@ -316,7 +316,7 @@

      -384× +385×       @@ -466,7 +466,7 @@

diff --git a/doc/general/test/coverage/contracts/modules/wrapper/core/ERC20BurnModule.sol.html b/doc/general/test/coverage/contracts/modules/wrapper/core/ERC20BurnModule.sol.html index 4d20e959..5af9fc26 100644 --- a/doc/general/test/coverage/contracts/modules/wrapper/core/ERC20BurnModule.sol.html +++ b/doc/general/test/coverage/contracts/modules/wrapper/core/ERC20BurnModule.sol.html @@ -436,7 +436,7 @@

diff --git a/doc/general/test/coverage/contracts/modules/wrapper/core/ERC20MintModule.sol.html b/doc/general/test/coverage/contracts/modules/wrapper/core/ERC20MintModule.sol.html index eae1319c..ec866ec8 100644 --- a/doc/general/test/coverage/contracts/modules/wrapper/core/ERC20MintModule.sol.html +++ b/doc/general/test/coverage/contracts/modules/wrapper/core/ERC20MintModule.sol.html @@ -175,8 +175,8 @@

      -290× -290× +291× +291×       @@ -304,7 +304,7 @@

diff --git a/doc/general/test/coverage/contracts/modules/wrapper/core/EnforcementModule.sol.html b/doc/general/test/coverage/contracts/modules/wrapper/core/EnforcementModule.sol.html index bdd8dc50..94408cc1 100644 --- a/doc/general/test/coverage/contracts/modules/wrapper/core/EnforcementModule.sol.html +++ b/doc/general/test/coverage/contracts/modules/wrapper/core/EnforcementModule.sol.html @@ -226,7 +226,7 @@

diff --git a/doc/general/test/coverage/contracts/modules/wrapper/core/PauseModule.sol.html b/doc/general/test/coverage/contracts/modules/wrapper/core/PauseModule.sol.html index 09614f07..6d02c4f3 100644 --- a/doc/general/test/coverage/contracts/modules/wrapper/core/PauseModule.sol.html +++ b/doc/general/test/coverage/contracts/modules/wrapper/core/PauseModule.sol.html @@ -376,7 +376,7 @@

diff --git a/doc/general/test/coverage/contracts/modules/wrapper/core/index.html b/doc/general/test/coverage/contracts/modules/wrapper/core/index.html index c78c57db..b00ff654 100644 --- a/doc/general/test/coverage/contracts/modules/wrapper/core/index.html +++ b/doc/general/test/coverage/contracts/modules/wrapper/core/index.html @@ -142,7 +142,7 @@

diff --git a/doc/general/test/coverage/contracts/modules/wrapper/extensions/DebtModule.sol.html b/doc/general/test/coverage/contracts/modules/wrapper/extensions/DebtModule.sol.html index 25046249..4156c3c8 100644 --- a/doc/general/test/coverage/contracts/modules/wrapper/extensions/DebtModule.sol.html +++ b/doc/general/test/coverage/contracts/modules/wrapper/extensions/DebtModule.sol.html @@ -185,7 +185,7 @@

      -382× +383× 3× 3× 3× @@ -349,7 +349,7 @@

diff --git a/doc/general/test/coverage/contracts/modules/wrapper/extensions/DocumentModule.sol.html b/doc/general/test/coverage/contracts/modules/wrapper/extensions/DocumentModule.sol.html index 01963048..d91a9797 100644 --- a/doc/general/test/coverage/contracts/modules/wrapper/extensions/DocumentModule.sol.html +++ b/doc/general/test/coverage/contracts/modules/wrapper/extensions/DocumentModule.sol.html @@ -186,7 +186,7 @@

      -382× +383× 12× 12× 12× @@ -352,7 +352,7 @@

diff --git a/doc/general/test/coverage/contracts/modules/wrapper/extensions/ERC20SnapshotModule.sol.html b/doc/general/test/coverage/contracts/modules/wrapper/extensions/ERC20SnapshotModule.sol.html index f0c7c091..405ba87a 100644 --- a/doc/general/test/coverage/contracts/modules/wrapper/extensions/ERC20SnapshotModule.sol.html +++ b/doc/general/test/coverage/contracts/modules/wrapper/extensions/ERC20SnapshotModule.sol.html @@ -289,7 +289,7 @@

diff --git a/doc/general/test/coverage/contracts/modules/wrapper/extensions/MetaTxModule.sol.html b/doc/general/test/coverage/contracts/modules/wrapper/extensions/MetaTxModule.sol.html index 8a138cb0..a204efaa 100644 --- a/doc/general/test/coverage/contracts/modules/wrapper/extensions/MetaTxModule.sol.html +++ b/doc/general/test/coverage/contracts/modules/wrapper/extensions/MetaTxModule.sol.html @@ -115,7 +115,7 @@

diff --git a/doc/general/test/coverage/contracts/modules/wrapper/extensions/index.html b/doc/general/test/coverage/contracts/modules/wrapper/extensions/index.html index decf28ce..4d80eba3 100644 --- a/doc/general/test/coverage/contracts/modules/wrapper/extensions/index.html +++ b/doc/general/test/coverage/contracts/modules/wrapper/extensions/index.html @@ -116,7 +116,7 @@

diff --git a/doc/general/test/coverage/contracts/test/proxy/CMTAT_PROXY_TEST.sol.html b/doc/general/test/coverage/contracts/test/proxy/CMTAT_PROXY_TEST.sol.html index 5bc6f0c8..f951aa06 100644 --- a/doc/general/test/coverage/contracts/test/proxy/CMTAT_PROXY_TEST.sol.html +++ b/doc/general/test/coverage/contracts/test/proxy/CMTAT_PROXY_TEST.sol.html @@ -64,7 +64,9 @@

19 20 21 -22  +22 +23  +        @@ -91,6 +93,7 @@

  import "../../CMTAT_PROXY.sol";   +  /** * @title a contrat used to test the proxy upgrade functionality */ @@ -112,7 +115,7 @@

diff --git a/doc/general/test/coverage/contracts/test/proxy/CMTAT_PROXY_TEST_UUPS.sol.html b/doc/general/test/coverage/contracts/test/proxy/CMTAT_PROXY_TEST_UUPS.sol.html index 6a50bb09..aa1985b7 100644 --- a/doc/general/test/coverage/contracts/test/proxy/CMTAT_PROXY_TEST_UUPS.sol.html +++ b/doc/general/test/coverage/contracts/test/proxy/CMTAT_PROXY_TEST_UUPS.sol.html @@ -64,7 +64,9 @@

19 20 21 -22  +22 +23  +        @@ -91,6 +93,7 @@

  import "../../CMTAT_PROXY_UUPS.sol";   +  /** * @title a contrat used to test the proxy upgrade functionality */ @@ -112,7 +115,7 @@

diff --git a/doc/general/test/coverage/contracts/test/proxy/index.html b/doc/general/test/coverage/contracts/test/proxy/index.html index 45758912..0e09264a 100644 --- a/doc/general/test/coverage/contracts/test/proxy/index.html +++ b/doc/general/test/coverage/contracts/test/proxy/index.html @@ -90,7 +90,7 @@

diff --git a/doc/general/test/coverage/coverage-final.json b/doc/general/test/coverage/coverage-final.json index 129ad0e8..650ed9c2 100644 --- a/doc/general/test/coverage/coverage-final.json +++ b/doc/general/test/coverage/coverage-final.json @@ -1,42 +1,42 @@ { -"contracts/CMTAT_PROXY_UUPS.sol":{"l":{"21":9,"41":5,"45":5},"path":"/home/ryan/Downloads/CM/CMTAT_old2/contracts/CMTAT_PROXY_UUPS.sol","s":{"1":9,"2":5,"3":5},"b":{"1":[5,0],"2":[2,1]},"f":{"1":9,"2":5,"3":2},"fnMap":{"1":{"name":"constructor","line":19,"loc":{"start":{"line":17,"column":4},"end":{"line":22,"column":4}}},"2":{"name":"initialize","line":40,"loc":{"start":{"line":37,"column":4},"end":{"line":46,"column":4}}},"3":{"name":"_authorizeUpgrade","line":52,"loc":{"start":{"line":52,"column":4},"end":{"line":52,"column":88}}}},"statementMap":{"1":{"start":{"line":21,"column":8},"end":{"line":21,"column":29}},"2":{"start":{"line":41,"column":8},"end":{"line":41,"column":1705}},"3":{"start":{"line":45,"column":8},"end":{"line":45,"column":41}}},"branchMap":{"1":{"line":40,"type":"if","locations":[{"start":{"line":40,"column":67},"end":{"line":40,"column":67}},{"start":{"line":40,"column":67},"end":{"line":40,"column":67}}]},"2":{"line":52,"type":"if","locations":[{"start":{"line":52,"column":58},"end":{"line":52,"column":58}},{"start":{"line":52,"column":58},"end":{"line":52,"column":58}}]}}}, -"contracts/CMTAT_PROXY.sol":{"l":{"20":198},"path":"/home/ryan/Downloads/CM/CMTAT_old2/contracts/CMTAT_PROXY.sol","s":{"1":198},"b":{},"f":{"1":198},"fnMap":{"1":{"name":"constructor","line":18,"loc":{"start":{"line":16,"column":4},"end":{"line":21,"column":4}}}},"statementMap":{"1":{"start":{"line":20,"column":8},"end":{"line":20,"column":29}}},"branchMap":{}}, -"contracts/CMTAT_STANDALONE.sol":{"l":{"29":191},"path":"/home/ryan/Downloads/CM/CMTAT_old2/contracts/CMTAT_STANDALONE.sol","s":{"1":191},"b":{},"f":{"1":191},"fnMap":{"1":{"name":"constructor","line":26,"loc":{"start":{"line":20,"column":4},"end":{"line":35,"column":4}}}},"statementMap":{"1":{"start":{"line":29,"column":8},"end":{"line":29,"column":1112}}},"branchMap":{}}, -"contracts/deployment/CMTAT_BEACON_FACTORY.sol":{"l":{"24":8,"25":1,"27":7,"28":1,"30":6,"45":2,"46":2,"49":2,"50":2,"62":2,"65":2,"73":1,"84":2,"85":2,"86":2,"87":2,"88":2,"89":2,"90":2,"100":4,"107":4},"path":"/home/ryan/Downloads/CM/CMTAT_old2/contracts/deployment/CMTAT_BEACON_FACTORY.sol","s":{"1":8,"2":7,"3":2,"4":2,"5":2,"6":2,"7":2,"8":1,"9":2,"10":2,"11":2,"12":2,"13":4},"b":{"1":[1,7],"2":[1,6],"3":[2,1]},"f":{"1":8,"2":2,"3":2,"4":1,"5":2,"6":4},"fnMap":{"1":{"name":"constructor","line":23,"loc":{"start":{"line":23,"column":4},"end":{"line":31,"column":4}}},"2":{"name":"deployCMTAT","line":44,"loc":{"start":{"line":40,"column":4},"end":{"line":51,"column":4}}},"3":{"name":"computedProxyAddress","line":58,"loc":{"start":{"line":58,"column":4},"end":{"line":66,"column":4}}},"4":{"name":"implementation","line":72,"loc":{"start":{"line":72,"column":4},"end":{"line":74,"column":4}}},"5":{"name":"_deployBytecode","line":83,"loc":{"start":{"line":83,"column":4},"end":{"line":91,"column":5}}},"6":{"name":"_getBytecode","line":97,"loc":{"start":{"line":97,"column":5},"end":{"line":108,"column":5}}}},"statementMap":{"1":{"start":{"line":24,"column":8},"end":{"line":24,"column":799}},"2":{"start":{"line":27,"column":8},"end":{"line":27,"column":935}},"3":{"start":{"line":45,"column":8},"end":{"line":45,"column":86}},"4":{"start":{"line":46,"column":8},"end":{"line":46,"column":1738}},"5":{"start":{"line":50,"column":8},"end":{"line":50,"column":20}},"6":{"start":{"line":62,"column":8},"end":{"line":62,"column":2316}},"7":{"start":{"line":65,"column":8},"end":{"line":65,"column":91}},"8":{"start":{"line":73,"column":8},"end":{"line":73,"column":38}},"9":{"start":{"line":84,"column":20},"end":{"line":84,"column":86}},"10":{"start":{"line":87,"column":20},"end":{"line":87,"column":62}},"11":{"start":{"line":89,"column":20},"end":{"line":89,"column":50}},"12":{"start":{"line":90,"column":20},"end":{"line":90,"column":32}},"13":{"start":{"line":100,"column":8},"end":{"line":100,"column":3755}}},"branchMap":{"1":{"line":24,"type":"if","locations":[{"start":{"line":24,"column":8},"end":{"line":24,"column":8}},{"start":{"line":24,"column":8},"end":{"line":24,"column":8}}]},"2":{"line":27,"type":"if","locations":[{"start":{"line":27,"column":8},"end":{"line":27,"column":8}},{"start":{"line":27,"column":8},"end":{"line":27,"column":8}}]},"3":{"line":44,"type":"if","locations":[{"start":{"line":44,"column":13},"end":{"line":44,"column":13}},{"start":{"line":44,"column":13},"end":{"line":44,"column":13}}]}}}, -"contracts/deployment/CMTAT_TP_FACTORY.sol":{"l":{"29":7,"30":5,"33":5,"35":5,"49":2,"52":2,"65":5,"66":5,"67":5,"68":5,"69":5,"70":5,"71":5,"81":7,"88":7},"path":"/home/ryan/Downloads/CM/CMTAT_old2/contracts/deployment/CMTAT_TP_FACTORY.sol","s":{"1":7,"2":5,"3":5,"4":2,"5":2,"6":5,"7":5,"8":5,"9":5,"10":7},"b":{"1":[7,2]},"f":{"1":9,"2":7,"3":2,"4":5,"5":7},"fnMap":{"1":{"name":"constructor","line":15,"loc":{"start":{"line":15,"column":4},"end":{"line":15,"column":129}}},"2":{"name":"deployCMTAT","line":28,"loc":{"start":{"line":23,"column":4},"end":{"line":36,"column":4}}},"3":{"name":"computedProxyAddress","line":44,"loc":{"start":{"line":44,"column":4},"end":{"line":53,"column":4}}},"4":{"name":"_deployBytecode","line":64,"loc":{"start":{"line":64,"column":4},"end":{"line":72,"column":5}}},"5":{"name":"_getBytecode","line":78,"loc":{"start":{"line":78,"column":5},"end":{"line":89,"column":5}}}},"statementMap":{"1":{"start":{"line":29,"column":8},"end":{"line":29,"column":86}},"2":{"start":{"line":30,"column":8},"end":{"line":30,"column":1235}},"3":{"start":{"line":35,"column":8},"end":{"line":35,"column":20}},"4":{"start":{"line":49,"column":8},"end":{"line":49,"column":1919}},"5":{"start":{"line":52,"column":8},"end":{"line":52,"column":91}},"6":{"start":{"line":65,"column":20},"end":{"line":65,"column":86}},"7":{"start":{"line":68,"column":20},"end":{"line":68,"column":62}},"8":{"start":{"line":70,"column":20},"end":{"line":70,"column":50}},"9":{"start":{"line":71,"column":20},"end":{"line":71,"column":32}},"10":{"start":{"line":81,"column":8},"end":{"line":81,"column":3210}}},"branchMap":{"1":{"line":28,"type":"if","locations":[{"start":{"line":28,"column":13},"end":{"line":28,"column":13}},{"start":{"line":28,"column":13},"end":{"line":28,"column":13}}]}}}, -"contracts/deployment/CMTAT_UUPS_FACTORY.sol":{"l":{"32":2,"33":2,"36":2,"38":2,"50":2,"53":2,"64":2,"65":2,"66":2,"67":2,"68":2,"69":2,"70":2,"80":4,"87":4},"path":"/home/ryan/Downloads/CM/CMTAT_old2/contracts/deployment/CMTAT_UUPS_FACTORY.sol","s":{"1":2,"2":2,"3":2,"4":2,"5":2,"6":2,"7":2,"8":2,"9":2,"10":4},"b":{"1":[2,1]},"f":{"1":5,"2":2,"3":2,"4":2,"5":4},"fnMap":{"1":{"name":"constructor","line":18,"loc":{"start":{"line":18,"column":4},"end":{"line":18,"column":129}}},"2":{"name":"deployCMTAT","line":31,"loc":{"start":{"line":27,"column":4},"end":{"line":39,"column":4}}},"3":{"name":"computedProxyAddress","line":46,"loc":{"start":{"line":46,"column":4},"end":{"line":54,"column":4}}},"4":{"name":"_deployBytecode","line":63,"loc":{"start":{"line":63,"column":4},"end":{"line":71,"column":5}}},"5":{"name":"_getBytecode","line":77,"loc":{"start":{"line":77,"column":5},"end":{"line":88,"column":5}}}},"statementMap":{"1":{"start":{"line":32,"column":8},"end":{"line":32,"column":86}},"2":{"start":{"line":33,"column":8},"end":{"line":33,"column":1266}},"3":{"start":{"line":38,"column":8},"end":{"line":38,"column":20}},"4":{"start":{"line":50,"column":8},"end":{"line":50,"column":1853}},"5":{"start":{"line":53,"column":8},"end":{"line":53,"column":91}},"6":{"start":{"line":64,"column":20},"end":{"line":64,"column":86}},"7":{"start":{"line":67,"column":20},"end":{"line":67,"column":62}},"8":{"start":{"line":69,"column":20},"end":{"line":69,"column":50}},"9":{"start":{"line":70,"column":20},"end":{"line":70,"column":32}},"10":{"start":{"line":80,"column":8},"end":{"line":80,"column":3072}}},"branchMap":{"1":{"line":31,"type":"if","locations":[{"start":{"line":31,"column":13},"end":{"line":31,"column":13}},{"start":{"line":31,"column":13},"end":{"line":31,"column":13}}]}}}, -"contracts/deployment/libraries/CMTATFactoryBase.sol":{"l":{"19":16,"20":2,"22":14},"path":"/home/ryan/Downloads/CM/CMTAT_old2/contracts/deployment/libraries/CMTATFactoryBase.sol","s":{"1":16},"b":{"1":[2,14]},"f":{"1":16},"fnMap":{"1":{"name":"constructor","line":18,"loc":{"start":{"line":18,"column":4},"end":{"line":23,"column":4}}}},"statementMap":{"1":{"start":{"line":19,"column":8},"end":{"line":19,"column":575}}},"branchMap":{"1":{"line":19,"type":"if","locations":[{"start":{"line":19,"column":8},"end":{"line":19,"column":8}},{"start":{"line":19,"column":8},"end":{"line":19,"column":8}}]}}}, -"contracts/deployment/libraries/CMTATFactoryInvariant.sol":{"l":{},"path":"/home/ryan/Downloads/CM/CMTAT_old2/contracts/deployment/libraries/CMTATFactoryInvariant.sol","s":{},"b":{},"f":{},"fnMap":{},"statementMap":{},"branchMap":{}}, -"contracts/deployment/libraries/CMTATFactoryRoot.sol":{"l":{"26":27,"27":3,"29":24,"30":15,"32":24,"33":24,"46":13,"59":11,"60":5,"61":2,"63":3,"64":3,"67":6},"path":"/home/ryan/Downloads/CM/CMTAT_old2/contracts/deployment/libraries/CMTATFactoryRoot.sol","s":{"1":27,"2":24,"3":24,"4":24,"5":13,"6":11,"7":5},"b":{"1":[3,24],"2":[15,9],"3":[5,6],"4":[2,3]},"f":{"1":27,"2":13,"3":11},"fnMap":{"1":{"name":"constructor","line":25,"loc":{"start":{"line":25,"column":4},"end":{"line":34,"column":4}}},"2":{"name":"CMTATProxyAddress","line":45,"loc":{"start":{"line":45,"column":4},"end":{"line":47,"column":4}}},"3":{"name":"_checkAndDetermineDeploymentSalt","line":58,"loc":{"start":{"line":58,"column":4},"end":{"line":69,"column":4}}}},"statementMap":{"1":{"start":{"line":26,"column":8},"end":{"line":26,"column":814}},"2":{"start":{"line":29,"column":8},"end":{"line":29,"column":952}},"3":{"start":{"line":32,"column":8},"end":{"line":32,"column":51}},"4":{"start":{"line":33,"column":8},"end":{"line":33,"column":52}},"5":{"start":{"line":46,"column":8},"end":{"line":46,"column":38}},"6":{"start":{"line":59,"column":7},"end":{"line":59,"column":2000}},"7":{"start":{"line":60,"column":12},"end":{"line":60,"column":2035}}},"branchMap":{"1":{"line":26,"type":"if","locations":[{"start":{"line":26,"column":8},"end":{"line":26,"column":8}},{"start":{"line":26,"column":8},"end":{"line":26,"column":8}}]},"2":{"line":29,"type":"if","locations":[{"start":{"line":29,"column":8},"end":{"line":29,"column":8}},{"start":{"line":29,"column":8},"end":{"line":29,"column":8}}]},"3":{"line":59,"type":"if","locations":[{"start":{"line":59,"column":7},"end":{"line":59,"column":7}},{"start":{"line":59,"column":7},"end":{"line":59,"column":7}}]},"4":{"line":60,"type":"if","locations":[{"start":{"line":60,"column":12},"end":{"line":60,"column":12}},{"start":{"line":60,"column":12},"end":{"line":60,"column":12}}]}}}, -"contracts/interfaces/draft-IERC1404/draft-IERC1404.sol":{"l":{},"path":"/home/ryan/Downloads/CM/CMTAT_old2/contracts/interfaces/draft-IERC1404/draft-IERC1404.sol","s":{},"b":{},"f":{},"fnMap":{},"statementMap":{},"branchMap":{}}, -"contracts/interfaces/draft-IERC1404/draft-IERC1404EnumCode.sol":{"l":{},"path":"/home/ryan/Downloads/CM/CMTAT_old2/contracts/interfaces/draft-IERC1404/draft-IERC1404EnumCode.sol","s":{},"b":{},"f":{},"fnMap":{},"statementMap":{},"branchMap":{}}, -"contracts/interfaces/draft-IERC1404/draft-IERC1404Wrapper.sol":{"l":{},"path":"/home/ryan/Downloads/CM/CMTAT_old2/contracts/interfaces/draft-IERC1404/draft-IERC1404Wrapper.sol","s":{},"b":{},"f":{},"fnMap":{},"statementMap":{},"branchMap":{}}, -"contracts/interfaces/engine/draft-IERC1643.sol":{"l":{},"path":"/home/ryan/Downloads/CM/CMTAT_old2/contracts/interfaces/engine/draft-IERC1643.sol","s":{},"b":{},"f":{},"fnMap":{},"statementMap":{},"branchMap":{}}, -"contracts/interfaces/engine/IAuthorizationEngine.sol":{"l":{},"path":"/home/ryan/Downloads/CM/CMTAT_old2/contracts/interfaces/engine/IAuthorizationEngine.sol","s":{},"b":{},"f":{},"fnMap":{},"statementMap":{},"branchMap":{}}, -"contracts/interfaces/engine/IDebtEngine.sol":{"l":{},"path":"/home/ryan/Downloads/CM/CMTAT_old2/contracts/interfaces/engine/IDebtEngine.sol","s":{},"b":{},"f":{},"fnMap":{},"statementMap":{},"branchMap":{}}, -"contracts/interfaces/engine/IDebtGlobal.sol":{"l":{},"path":"/home/ryan/Downloads/CM/CMTAT_old2/contracts/interfaces/engine/IDebtGlobal.sol","s":{},"b":{},"f":{},"fnMap":{},"statementMap":{},"branchMap":{}}, -"contracts/interfaces/engine/IRuleEngine.sol":{"l":{},"path":"/home/ryan/Downloads/CM/CMTAT_old2/contracts/interfaces/engine/IRuleEngine.sol","s":{},"b":{},"f":{},"fnMap":{},"statementMap":{},"branchMap":{}}, -"contracts/interfaces/ICCIPToken.sol":{"l":{},"path":"/home/ryan/Downloads/CM/CMTAT_old2/contracts/interfaces/ICCIPToken.sol","s":{},"b":{},"f":{},"fnMap":{},"statementMap":{},"branchMap":{}}, -"contracts/interfaces/ICMTATConstructor.sol":{"l":{},"path":"/home/ryan/Downloads/CM/CMTAT_old2/contracts/interfaces/ICMTATConstructor.sol","s":{},"b":{},"f":{},"fnMap":{},"statementMap":{},"branchMap":{}}, -"contracts/interfaces/ICMTATSnapshot.sol":{"l":{},"path":"/home/ryan/Downloads/CM/CMTAT_old2/contracts/interfaces/ICMTATSnapshot.sol","s":{},"b":{},"f":{},"fnMap":{},"statementMap":{},"branchMap":{}}, -"contracts/libraries/Errors.sol":{"l":{},"path":"/home/ryan/Downloads/CM/CMTAT_old2/contracts/libraries/Errors.sol","s":{},"b":{},"f":{},"fnMap":{},"statementMap":{},"branchMap":{}}, -"contracts/libraries/FactoryErrors.sol":{"l":{},"path":"/home/ryan/Downloads/CM/CMTAT_old2/contracts/libraries/FactoryErrors.sol","s":{},"b":{},"f":{},"fnMap":{},"statementMap":{},"branchMap":{}}, -"contracts/modules/CMTAT_BASE.sol":{"l":{"65":384,"85":384,"86":384,"88":384,"90":384,"91":384,"94":384,"99":384,"100":384,"102":384,"106":384,"107":382,"108":382,"110":382,"111":382,"113":382,"114":382,"120":382,"121":382,"122":382,"125":382,"128":382,"150":2,"163":10,"178":6,"179":4,"194":438,"195":17,"202":421,"203":421,"217":1389,"226":1389,"238":0},"path":"/home/ryan/Downloads/CM/CMTAT_old2/contracts/modules/CMTAT_BASE.sol","s":{"1":384,"2":384,"3":384,"4":384,"5":384,"6":384,"7":384,"8":384,"9":384,"10":384,"11":384,"12":382,"13":382,"14":382,"15":382,"16":382,"17":382,"18":382,"19":382,"20":382,"21":382,"22":382,"23":2,"24":10,"25":6,"26":4,"27":438,"28":421,"29":421,"30":1389,"31":1389,"32":0},"b":{"1":[384,1],"2":[384,0],"3":[382,0],"4":[17,421]},"f":{"1":384,"2":384,"3":382,"4":2,"5":10,"6":6,"7":438,"8":1389,"9":1389,"10":0},"fnMap":{"1":{"name":"initialize","line":64,"loc":{"start":{"line":59,"column":4},"end":{"line":71,"column":4}}},"2":{"name":"__CMTAT_init","line":82,"loc":{"start":{"line":77,"column":4},"end":{"line":129,"column":4}}},"3":{"name":"__CMTAT_init_unchained","line":131,"loc":{"start":{"line":131,"column":4},"end":{"line":133,"column":4}}},"4":{"name":"decimals","line":143,"loc":{"start":{"line":143,"column":4},"end":{"line":151,"column":4}}},"5":{"name":"transferFrom","line":153,"loc":{"start":{"line":153,"column":4},"end":{"line":164,"column":4}}},"6":{"name":"burnAndMint","line":177,"loc":{"start":{"line":177,"column":4},"end":{"line":180,"column":4}}},"7":{"name":"_update","line":189,"loc":{"start":{"line":189,"column":4},"end":{"line":204,"column":4}}},"8":{"name":"_msgSender","line":211,"loc":{"start":{"line":211,"column":4},"end":{"line":218,"column":4}}},"9":{"name":"_contextSuffixLength","line":223,"loc":{"start":{"line":223,"column":4},"end":{"line":227,"column":4}}},"10":{"name":"_msgData","line":232,"loc":{"start":{"line":232,"column":4},"end":{"line":239,"column":4}}}},"statementMap":{"1":{"start":{"line":65,"column":8},"end":{"line":65,"column":2165}},"2":{"start":{"line":85,"column":8},"end":{"line":85,"column":33}},"3":{"start":{"line":86,"column":8},"end":{"line":86,"column":99}},"4":{"start":{"line":88,"column":8},"end":{"line":88,"column":32}},"5":{"start":{"line":90,"column":8},"end":{"line":90,"column":39}},"6":{"start":{"line":91,"column":8},"end":{"line":91,"column":34}},"7":{"start":{"line":94,"column":8},"end":{"line":94,"column":37}},"8":{"start":{"line":99,"column":8},"end":{"line":99,"column":44}},"9":{"start":{"line":100,"column":8},"end":{"line":100,"column":39}},"10":{"start":{"line":102,"column":8},"end":{"line":102,"column":56}},"11":{"start":{"line":106,"column":8},"end":{"line":106,"column":81}},"12":{"start":{"line":107,"column":8},"end":{"line":107,"column":41}},"13":{"start":{"line":108,"column":8},"end":{"line":108,"column":41}},"14":{"start":{"line":110,"column":8},"end":{"line":110,"column":43}},"15":{"start":{"line":111,"column":8},"end":{"line":111,"column":77}},"16":{"start":{"line":113,"column":8},"end":{"line":113,"column":37}},"17":{"start":{"line":114,"column":8},"end":{"line":114,"column":42}},"18":{"start":{"line":120,"column":8},"end":{"line":120,"column":45}},"19":{"start":{"line":121,"column":8},"end":{"line":121,"column":64}},"20":{"start":{"line":122,"column":8},"end":{"line":122,"column":56}},"21":{"start":{"line":125,"column":8},"end":{"line":125,"column":123}},"22":{"start":{"line":128,"column":8},"end":{"line":128,"column":31}},"23":{"start":{"line":150,"column":8},"end":{"line":150,"column":41}},"24":{"start":{"line":163,"column":8},"end":{"line":163,"column":70}},"25":{"start":{"line":178,"column":8},"end":{"line":178,"column":39}},"26":{"start":{"line":179,"column":8},"end":{"line":179,"column":29}},"27":{"start":{"line":194,"column":8},"end":{"line":194,"column":6702}},"28":{"start":{"line":202,"column":8},"end":{"line":202,"column":60}},"29":{"start":{"line":203,"column":8},"end":{"line":203,"column":49}},"30":{"start":{"line":217,"column":8},"end":{"line":217,"column":53}},"31":{"start":{"line":226,"column":9},"end":{"line":226,"column":64}},"32":{"start":{"line":238,"column":8},"end":{"line":238,"column":51}}},"branchMap":{"1":{"line":64,"type":"if","locations":[{"start":{"line":64,"column":21},"end":{"line":64,"column":21}},{"start":{"line":64,"column":21},"end":{"line":64,"column":21}}]},"2":{"line":82,"type":"if","locations":[{"start":{"line":82,"column":15},"end":{"line":82,"column":15}},{"start":{"line":82,"column":15},"end":{"line":82,"column":15}}]},"3":{"line":131,"type":"if","locations":[{"start":{"line":131,"column":47},"end":{"line":131,"column":47}},{"start":{"line":131,"column":47},"end":{"line":131,"column":47}}]},"4":{"line":194,"type":"if","locations":[{"start":{"line":194,"column":8},"end":{"line":194,"column":8}},{"start":{"line":194,"column":8},"end":{"line":194,"column":8}}]}}}, -"contracts/modules/internal/base/SnapshotModuleBase.sol":{"l":{"83":2,"84":2,"92":76,"93":76,"95":76,"96":68,"101":68,"102":48,"105":20,"107":8,"110":8,"112":8,"113":8,"120":28,"132":170,"134":170,"136":168,"138":94,"141":94,"142":2,"148":2,"151":164,"152":164,"159":12,"160":12,"161":10,"163":10,"164":2,"167":8,"168":2,"170":6,"173":6,"174":10,"175":10,"176":10,"179":6,"181":8,"188":22,"190":22,"191":20,"192":18,"193":2,"195":16,"196":12,"197":8,"198":8,"199":2,"205":2,"208":8,"209":4,"210":2,"216":6,"218":6,"225":14,"227":14,"228":10,"229":2,"232":8,"233":2,"235":6,"236":6,"246":10,"247":10,"249":10,"251":8,"252":6,"254":8,"282":1920,"284":1920,"285":1484,"287":436,"301":842,"302":842,"303":842,"304":36,"305":36,"315":421,"316":421,"320":421,"321":18,"322":18,"332":842,"333":834,"335":8,"346":36,"347":36,"348":36,"350":36,"354":22,"358":8,"362":6,"375":489,"376":489,"378":489,"382":403,"385":86,"386":86,"388":86,"389":116,"390":52,"391":52,"394":64,"397":86,"406":26,"407":26,"408":6,"410":20,"413":202,"414":6,"421":46,"422":6,"428":4856},"path":"/home/ryan/Downloads/CM/CMTAT_old2/contracts/modules/internal/base/SnapshotModuleBase.sol","s":{"1":2,"2":2,"3":76,"4":76,"5":76,"6":68,"7":68,"8":48,"9":20,"10":8,"11":8,"12":28,"13":170,"14":170,"15":168,"16":94,"17":94,"18":92,"19":164,"20":164,"21":12,"22":12,"23":10,"24":10,"25":8,"26":2,"27":6,"28":6,"29":8,"30":22,"31":22,"32":20,"33":18,"34":16,"35":12,"36":8,"37":8,"38":6,"39":8,"40":4,"41":6,"42":14,"43":14,"44":10,"45":8,"46":6,"47":6,"48":10,"49":10,"50":10,"51":8,"52":8,"53":1920,"54":1920,"55":1484,"56":436,"57":842,"58":842,"59":842,"60":36,"61":36,"62":421,"63":421,"64":421,"65":842,"66":834,"67":8,"68":36,"69":36,"70":36,"71":36,"72":22,"73":14,"74":8,"75":6,"76":489,"77":489,"78":489,"79":403,"80":86,"81":86,"82":116,"83":86,"84":26,"85":26,"86":20,"87":202,"88":46},"b":{"1":[384,0],"2":[68,8],"3":[48,20],"4":[8,12],"5":[94,74],"6":[2,92],"7":[2,90],"8":[2,8],"9":[2,6],"10":[2,16],"11":[8,4],"12":[2,6],"13":[2,4],"14":[4,4],"15":[2,2],"16":[2,8],"17":[2,6],"18":[1484,436],"19":[36,806],"20":[18,403],"21":[834,8],"22":[22,14],"23":[8,6],"24":[403,86],"25":[403,0],"26":[52,64],"27":[6,20],"28":[6,196],"29":[6,40]},"f":{"1":384,"2":2,"3":76,"4":170,"5":12,"6":22,"7":14,"8":10,"9":1920,"10":842,"11":421,"12":842,"13":36,"14":489,"15":26,"16":202,"17":46,"18":4856},"fnMap":{"1":{"name":"__SnapshotModuleBase_init_unchained","line":70,"loc":{"start":{"line":70,"column":4},"end":{"line":73,"column":4}}},"2":{"name":"getAllSnapshots","line":82,"loc":{"start":{"line":82,"column":4},"end":{"line":85,"column":4}}},"3":{"name":"getNextSnapshots","line":91,"loc":{"start":{"line":91,"column":4},"end":{"line":121,"column":4}}},"4":{"name":"_scheduleSnapshot","line":131,"loc":{"start":{"line":131,"column":4},"end":{"line":153,"column":4}}},"5":{"name":"_scheduleSnapshotNotOptimized","line":158,"loc":{"start":{"line":158,"column":4},"end":{"line":182,"column":4}}},"6":{"name":"_rescheduleSnapshot","line":187,"loc":{"start":{"line":187,"column":4},"end":{"line":219,"column":4}}},"7":{"name":"_unscheduleLastSnapshot","line":224,"loc":{"start":{"line":224,"column":4},"end":{"line":237,"column":4}}},"8":{"name":"_unscheduleSnapshotNotOptimized","line":245,"loc":{"start":{"line":245,"column":4},"end":{"line":255,"column":4}}},"9":{"name":"_valueAt","line":264,"loc":{"start":{"line":264,"column":4},"end":{"line":289,"column":4}}},"10":{"name":"_updateSnapshot","line":297,"loc":{"start":{"line":297,"column":4},"end":{"line":307,"column":4}}},"11":{"name":"_setCurrentSnapshot","line":314,"loc":{"start":{"line":314,"column":4},"end":{"line":324,"column":4}}},"12":{"name":"_lastSnapshot","line":329,"loc":{"start":{"line":329,"column":4},"end":{"line":337,"column":4}}},"13":{"name":"_findScheduledSnapshotIndex","line":343,"loc":{"start":{"line":343,"column":4},"end":{"line":364,"column":4}}},"14":{"name":"_findScheduledMostRecentPastSnapshot","line":370,"loc":{"start":{"line":370,"column":4},"end":{"line":398,"column":4}}},"15":{"name":"_findAndRevertScheduledSnapshotIndex","line":403,"loc":{"start":{"line":403,"column":4},"end":{"line":411,"column":4}}},"16":{"name":"_checkTimeInThePast","line":412,"loc":{"start":{"line":412,"column":4},"end":{"line":419,"column":4}}},"17":{"name":"_checkTimeSnapshotAlreadyDone","line":420,"loc":{"start":{"line":420,"column":4},"end":{"line":424,"column":4}}},"18":{"name":"_getSnapshotModuleBaseStorage","line":427,"loc":{"start":{"line":427,"column":4},"end":{"line":431,"column":4}}}},"statementMap":{"1":{"start":{"line":83,"column":8},"end":{"line":83,"column":77}},"2":{"start":{"line":84,"column":8},"end":{"line":84,"column":36}},"3":{"start":{"line":92,"column":8},"end":{"line":92,"column":77}},"4":{"start":{"line":93,"column":8},"end":{"line":93,"column":65}},"5":{"start":{"line":95,"column":8},"end":{"line":95,"column":3657}},"6":{"start":{"line":96,"column":12},"end":{"line":96,"column":3755}},"7":{"start":{"line":101,"column":12},"end":{"line":101,"column":3918}},"8":{"start":{"line":102,"column":16},"end":{"line":102,"column":44}},"9":{"start":{"line":105,"column":16},"end":{"line":105,"column":4128}},"10":{"start":{"line":107,"column":20},"end":{"line":107,"column":4318}},"11":{"start":{"line":112,"column":20},"end":{"line":112,"column":4596}},"12":{"start":{"line":120,"column":8},"end":{"line":120,"column":36}},"13":{"start":{"line":132,"column":8},"end":{"line":132,"column":77}},"14":{"start":{"line":134,"column":7},"end":{"line":134,"column":31}},"15":{"start":{"line":136,"column":8},"end":{"line":136,"column":5453}},"16":{"start":{"line":138,"column":12},"end":{"line":138,"column":5564}},"17":{"start":{"line":141,"column":12},"end":{"line":141,"column":5689}},"18":{"start":{"line":147,"column":19},"end":{"line":147,"column":5942}},"19":{"start":{"line":151,"column":8},"end":{"line":151,"column":39}},"20":{"start":{"line":152,"column":8},"end":{"line":152,"column":38}},"21":{"start":{"line":159,"column":8},"end":{"line":159,"column":77}},"22":{"start":{"line":160,"column":8},"end":{"line":160,"column":32}},"23":{"start":{"line":161,"column":8},"end":{"line":161,"column":73}},"24":{"start":{"line":163,"column":8},"end":{"line":163,"column":6518}},"25":{"start":{"line":167,"column":8},"end":{"line":167,"column":6709}},"26":{"start":{"line":168,"column":12},"end":{"line":168,"column":43}},"27":{"start":{"line":170,"column":12},"end":{"line":170,"column":6833}},"28":{"start":{"line":173,"column":12},"end":{"line":173,"column":6960}},"29":{"start":{"line":181,"column":8},"end":{"line":181,"column":38}},"30":{"start":{"line":188,"column":8},"end":{"line":188,"column":77}},"31":{"start":{"line":190,"column":8},"end":{"line":190,"column":45}},"32":{"start":{"line":191,"column":8},"end":{"line":191,"column":35}},"33":{"start":{"line":192,"column":8},"end":{"line":192,"column":7691}},"34":{"start":{"line":195,"column":8},"end":{"line":195,"column":69}},"35":{"start":{"line":196,"column":8},"end":{"line":196,"column":7891}},"36":{"start":{"line":197,"column":12},"end":{"line":197,"column":71}},"37":{"start":{"line":198,"column":12},"end":{"line":198,"column":8028}},"38":{"start":{"line":204,"column":19},"end":{"line":204,"column":8286}},"39":{"start":{"line":208,"column":8},"end":{"line":208,"column":8425}},"40":{"start":{"line":209,"column":12},"end":{"line":209,"column":8467}},"41":{"start":{"line":218,"column":8},"end":{"line":218,"column":47}},"42":{"start":{"line":225,"column":8},"end":{"line":225,"column":77}},"43":{"start":{"line":227,"column":8},"end":{"line":227,"column":42}},"44":{"start":{"line":228,"column":8},"end":{"line":228,"column":9173}},"45":{"start":{"line":232,"column":8},"end":{"line":232,"column":9373}},"46":{"start":{"line":235,"column":8},"end":{"line":235,"column":34}},"47":{"start":{"line":236,"column":8},"end":{"line":236,"column":37}},"48":{"start":{"line":246,"column":8},"end":{"line":246,"column":77}},"49":{"start":{"line":247,"column":8},"end":{"line":247,"column":42}},"50":{"start":{"line":249,"column":8},"end":{"line":249,"column":66}},"51":{"start":{"line":251,"column":8},"end":{"line":251,"column":10194}},"52":{"start":{"line":254,"column":8},"end":{"line":254,"column":34}},"53":{"start":{"line":282,"column":8},"end":{"line":282,"column":58}},"54":{"start":{"line":284,"column":8},"end":{"line":284,"column":12023}},"55":{"start":{"line":285,"column":12},"end":{"line":285,"column":29}},"56":{"start":{"line":287,"column":12},"end":{"line":287,"column":50}},"57":{"start":{"line":301,"column":8},"end":{"line":301,"column":77}},"58":{"start":{"line":302,"column":8},"end":{"line":302,"column":48}},"59":{"start":{"line":303,"column":8},"end":{"line":303,"column":12661}},"60":{"start":{"line":304,"column":12},"end":{"line":304,"column":38}},"61":{"start":{"line":305,"column":12},"end":{"line":305,"column":46}},"62":{"start":{"line":315,"column":8},"end":{"line":315,"column":77}},"63":{"start":{"line":316,"column":8},"end":{"line":316,"column":13151}},"64":{"start":{"line":320,"column":8},"end":{"line":320,"column":13255}},"65":{"start":{"line":332,"column":8},"end":{"line":332,"column":13609}},"66":{"start":{"line":333,"column":12},"end":{"line":333,"column":20}},"67":{"start":{"line":335,"column":12},"end":{"line":335,"column":38}},"68":{"start":{"line":346,"column":8},"end":{"line":346,"column":77}},"69":{"start":{"line":347,"column":8},"end":{"line":347,"column":71}},"70":{"start":{"line":348,"column":8},"end":{"line":348,"column":72}},"71":{"start":{"line":350,"column":8},"end":{"line":350,"column":14239}},"72":{"start":{"line":354,"column":12},"end":{"line":354,"column":37}},"73":{"start":{"line":357,"column":13},"end":{"line":357,"column":14456}},"74":{"start":{"line":358,"column":12},"end":{"line":358,"column":38}},"75":{"start":{"line":362,"column":12},"end":{"line":362,"column":53}},"76":{"start":{"line":375,"column":8},"end":{"line":375,"column":77}},"77":{"start":{"line":376,"column":8},"end":{"line":376,"column":63}},"78":{"start":{"line":378,"column":8},"end":{"line":378,"column":15173}},"79":{"start":{"line":382,"column":12},"end":{"line":382,"column":40}},"80":{"start":{"line":385,"column":8},"end":{"line":385,"column":26}},"81":{"start":{"line":388,"column":8},"end":{"line":388,"column":15538}},"82":{"start":{"line":389,"column":12},"end":{"line":389,"column":15626}},"83":{"start":{"line":397,"column":8},"end":{"line":397,"column":34}},"84":{"start":{"line":406,"column":8},"end":{"line":406,"column":73}},"85":{"start":{"line":407,"column":8},"end":{"line":407,"column":16172}},"86":{"start":{"line":410,"column":8},"end":{"line":410,"column":20}},"87":{"start":{"line":413,"column":8},"end":{"line":413,"column":16371}},"88":{"start":{"line":421,"column":8},"end":{"line":421,"column":16674}}},"branchMap":{"1":{"line":70,"type":"if","locations":[{"start":{"line":70,"column":60},"end":{"line":70,"column":60}},{"start":{"line":70,"column":60},"end":{"line":70,"column":60}}]},"2":{"line":95,"type":"if","locations":[{"start":{"line":95,"column":8},"end":{"line":95,"column":8}},{"start":{"line":95,"column":8},"end":{"line":95,"column":8}}]},"3":{"line":101,"type":"if","locations":[{"start":{"line":101,"column":12},"end":{"line":101,"column":12}},{"start":{"line":101,"column":12},"end":{"line":101,"column":12}}]},"4":{"line":105,"type":"if","locations":[{"start":{"line":105,"column":16},"end":{"line":105,"column":16}},{"start":{"line":105,"column":16},"end":{"line":105,"column":16}}]},"5":{"line":136,"type":"if","locations":[{"start":{"line":136,"column":8},"end":{"line":136,"column":8}},{"start":{"line":136,"column":8},"end":{"line":136,"column":8}}]},"6":{"line":141,"type":"if","locations":[{"start":{"line":141,"column":12},"end":{"line":141,"column":12}},{"start":{"line":141,"column":12},"end":{"line":141,"column":12}}]},"7":{"line":147,"type":"if","locations":[{"start":{"line":147,"column":19},"end":{"line":147,"column":19}},{"start":{"line":147,"column":19},"end":{"line":147,"column":19}}]},"8":{"line":163,"type":"if","locations":[{"start":{"line":163,"column":8},"end":{"line":163,"column":8}},{"start":{"line":163,"column":8},"end":{"line":163,"column":8}}]},"9":{"line":167,"type":"if","locations":[{"start":{"line":167,"column":8},"end":{"line":167,"column":8}},{"start":{"line":167,"column":8},"end":{"line":167,"column":8}}]},"10":{"line":192,"type":"if","locations":[{"start":{"line":192,"column":8},"end":{"line":192,"column":8}},{"start":{"line":192,"column":8},"end":{"line":192,"column":8}}]},"11":{"line":196,"type":"if","locations":[{"start":{"line":196,"column":8},"end":{"line":196,"column":8}},{"start":{"line":196,"column":8},"end":{"line":196,"column":8}}]},"12":{"line":198,"type":"if","locations":[{"start":{"line":198,"column":12},"end":{"line":198,"column":12}},{"start":{"line":198,"column":12},"end":{"line":198,"column":12}}]},"13":{"line":204,"type":"if","locations":[{"start":{"line":204,"column":19},"end":{"line":204,"column":19}},{"start":{"line":204,"column":19},"end":{"line":204,"column":19}}]},"14":{"line":208,"type":"if","locations":[{"start":{"line":208,"column":8},"end":{"line":208,"column":8}},{"start":{"line":208,"column":8},"end":{"line":208,"column":8}}]},"15":{"line":209,"type":"if","locations":[{"start":{"line":209,"column":12},"end":{"line":209,"column":12}},{"start":{"line":209,"column":12},"end":{"line":209,"column":12}}]},"16":{"line":228,"type":"if","locations":[{"start":{"line":228,"column":8},"end":{"line":228,"column":8}},{"start":{"line":228,"column":8},"end":{"line":228,"column":8}}]},"17":{"line":232,"type":"if","locations":[{"start":{"line":232,"column":8},"end":{"line":232,"column":8}},{"start":{"line":232,"column":8},"end":{"line":232,"column":8}}]},"18":{"line":284,"type":"if","locations":[{"start":{"line":284,"column":8},"end":{"line":284,"column":8}},{"start":{"line":284,"column":8},"end":{"line":284,"column":8}}]},"19":{"line":303,"type":"if","locations":[{"start":{"line":303,"column":8},"end":{"line":303,"column":8}},{"start":{"line":303,"column":8},"end":{"line":303,"column":8}}]},"20":{"line":320,"type":"if","locations":[{"start":{"line":320,"column":8},"end":{"line":320,"column":8}},{"start":{"line":320,"column":8},"end":{"line":320,"column":8}}]},"21":{"line":332,"type":"if","locations":[{"start":{"line":332,"column":8},"end":{"line":332,"column":8}},{"start":{"line":332,"column":8},"end":{"line":332,"column":8}}]},"22":{"line":350,"type":"if","locations":[{"start":{"line":350,"column":8},"end":{"line":350,"column":8}},{"start":{"line":350,"column":8},"end":{"line":350,"column":8}}]},"23":{"line":357,"type":"if","locations":[{"start":{"line":357,"column":13},"end":{"line":357,"column":13}},{"start":{"line":357,"column":13},"end":{"line":357,"column":13}}]},"24":{"line":378,"type":"if","locations":[{"start":{"line":378,"column":8},"end":{"line":378,"column":8}},{"start":{"line":378,"column":8},"end":{"line":378,"column":8}}]},"25":{"line":379,"type":"cond-expr","locations":[{"start":{"line":379,"column":12},"end":{"line":379,"column":32}},{"start":{"line":380,"column":12},"end":{"line":380,"column":77}}]},"26":{"line":389,"type":"if","locations":[{"start":{"line":389,"column":12},"end":{"line":389,"column":12}},{"start":{"line":389,"column":12},"end":{"line":389,"column":12}}]},"27":{"line":407,"type":"if","locations":[{"start":{"line":407,"column":8},"end":{"line":407,"column":8}},{"start":{"line":407,"column":8},"end":{"line":407,"column":8}}]},"28":{"line":413,"type":"if","locations":[{"start":{"line":413,"column":8},"end":{"line":413,"column":8}},{"start":{"line":413,"column":8},"end":{"line":413,"column":8}}]},"29":{"line":421,"type":"if","locations":[{"start":{"line":421,"column":8},"end":{"line":421,"column":8}},{"start":{"line":421,"column":8},"end":{"line":421,"column":8}}]}}}, -"contracts/modules/internal/EnforcementModuleInternal.sol":{"l":{"65":944,"66":944,"83":22,"84":22,"85":2,"87":20,"88":20,"89":20,"101":8,"102":8,"103":2,"105":6,"106":6,"108":6,"113":974},"path":"/home/ryan/Downloads/CM/CMTAT_old2/contracts/modules/internal/EnforcementModuleInternal.sol","s":{"1":944,"2":944,"3":22,"4":22,"5":2,"6":20,"7":20,"8":8,"9":8,"10":2,"11":6,"12":6},"b":{"1":[384,0],"2":[2,20],"3":[2,6]},"f":{"1":384,"2":944,"3":22,"4":8,"5":974},"fnMap":{"1":{"name":"__Enforcement_init_unchained","line":53,"loc":{"start":{"line":53,"column":4},"end":{"line":55,"column":4}}},"2":{"name":"frozen","line":64,"loc":{"start":{"line":64,"column":4},"end":{"line":67,"column":4}}},"3":{"name":"_freeze","line":79,"loc":{"start":{"line":79,"column":4},"end":{"line":90,"column":4}}},"4":{"name":"_unfreeze","line":97,"loc":{"start":{"line":97,"column":4},"end":{"line":109,"column":4}}},"5":{"name":"_getEnforcementModuleInternalStorage","line":112,"loc":{"start":{"line":112,"column":4},"end":{"line":116,"column":4}}}},"statementMap":{"1":{"start":{"line":65,"column":8},"end":{"line":65,"column":91}},"2":{"start":{"line":66,"column":8},"end":{"line":66,"column":33}},"3":{"start":{"line":83,"column":8},"end":{"line":83,"column":91}},"4":{"start":{"line":84,"column":8},"end":{"line":84,"column":2789}},"5":{"start":{"line":85,"column":12},"end":{"line":85,"column":24}},"6":{"start":{"line":88,"column":8},"end":{"line":88,"column":58}},"7":{"start":{"line":89,"column":8},"end":{"line":89,"column":19}},"8":{"start":{"line":101,"column":8},"end":{"line":101,"column":91}},"9":{"start":{"line":102,"column":8},"end":{"line":102,"column":3351}},"10":{"start":{"line":103,"column":12},"end":{"line":103,"column":24}},"11":{"start":{"line":106,"column":8},"end":{"line":106,"column":60}},"12":{"start":{"line":108,"column":8},"end":{"line":108,"column":19}}},"branchMap":{"1":{"line":53,"type":"if","locations":[{"start":{"line":53,"column":53},"end":{"line":53,"column":53}},{"start":{"line":53,"column":53},"end":{"line":53,"column":53}}]},"2":{"line":84,"type":"if","locations":[{"start":{"line":84,"column":8},"end":{"line":84,"column":8}},{"start":{"line":84,"column":8},"end":{"line":84,"column":8}}]},"3":{"line":102,"type":"if","locations":[{"start":{"line":102,"column":8},"end":{"line":102,"column":8}},{"start":{"line":102,"column":8},"end":{"line":102,"column":8}}]}}}, -"contracts/modules/internal/ERC20SnapshotModuleInternal.sol":{"l":{"35":480,"36":480,"44":160,"45":160,"46":480,"48":160,"56":80,"57":80,"58":80,"59":80,"71":1200,"72":1200,"77":1200,"86":720,"87":720,"91":720,"106":421,"107":421,"109":77,"110":77,"112":43,"115":34,"119":344,"120":344,"128":464,"129":464,"136":378,"137":378},"path":"/home/ryan/Downloads/CM/CMTAT_old2/contracts/modules/internal/ERC20SnapshotModuleInternal.sol","s":{"1":160,"2":80,"3":1200,"4":1200,"5":1200,"6":720,"7":720,"8":720,"9":421,"10":421,"11":77,"12":77,"13":43,"14":34,"15":344,"16":344,"17":464,"18":464,"19":378,"20":378},"b":{"1":[384,0],"2":[400,800],"3":[36,684],"4":[77,344],"5":[43,34]},"f":{"1":384,"2":480,"3":160,"4":80,"5":1200,"6":720,"7":421,"8":464,"9":378},"fnMap":{"1":{"name":"__ERC20Snapshot_init_unchained","line":21,"loc":{"start":{"line":21,"column":4},"end":{"line":24,"column":4}}},"2":{"name":"snapshotInfo","line":34,"loc":{"start":{"line":34,"column":4},"end":{"line":37,"column":4}}},"3":{"name":"snapshotInfoBatch","line":43,"loc":{"start":{"line":43,"column":4},"end":{"line":49,"column":4}}},"4":{"name":"snapshotInfoBatch","line":55,"loc":{"start":{"line":55,"column":4},"end":{"line":61,"column":4}}},"5":{"name":"snapshotBalanceOf","line":67,"loc":{"start":{"line":67,"column":4},"end":{"line":78,"column":4}}},"6":{"name":"snapshotTotalSupply","line":85,"loc":{"start":{"line":85,"column":4},"end":{"line":92,"column":4}}},"7":{"name":"_snapshotUpdate","line":102,"loc":{"start":{"line":102,"column":4},"end":{"line":122,"column":4}}},"8":{"name":"_updateAccountSnapshot","line":127,"loc":{"start":{"line":127,"column":4},"end":{"line":130,"column":4}}},"9":{"name":"_updateTotalSupplySnapshot","line":135,"loc":{"start":{"line":135,"column":4},"end":{"line":138,"column":4}}}},"statementMap":{"1":{"start":{"line":45,"column":8},"end":{"line":45,"column":2070}},"2":{"start":{"line":58,"column":8},"end":{"line":58,"column":2733}},"3":{"start":{"line":71,"column":8},"end":{"line":71,"column":77}},"4":{"start":{"line":72,"column":8},"end":{"line":72,"column":3316}},"5":{"start":{"line":77,"column":8},"end":{"line":77,"column":53}},"6":{"start":{"line":86,"column":8},"end":{"line":86,"column":77}},"7":{"start":{"line":87,"column":8},"end":{"line":87,"column":3868}},"8":{"start":{"line":91,"column":8},"end":{"line":91,"column":50}},"9":{"start":{"line":106,"column":8},"end":{"line":106,"column":28}},"10":{"start":{"line":107,"column":8},"end":{"line":107,"column":4593}},"11":{"start":{"line":109,"column":12},"end":{"line":109,"column":39}},"12":{"start":{"line":110,"column":12},"end":{"line":110,"column":4719}},"13":{"start":{"line":112,"column":16},"end":{"line":112,"column":41}},"14":{"start":{"line":115,"column":16},"end":{"line":115,"column":43}},"15":{"start":{"line":119,"column":12},"end":{"line":119,"column":37}},"16":{"start":{"line":120,"column":12},"end":{"line":120,"column":39}},"17":{"start":{"line":128,"column":8},"end":{"line":128,"column":77}},"18":{"start":{"line":129,"column":8},"end":{"line":129,"column":79}},"19":{"start":{"line":136,"column":8},"end":{"line":136,"column":77}},"20":{"start":{"line":137,"column":8},"end":{"line":137,"column":62}}},"branchMap":{"1":{"line":21,"type":"if","locations":[{"start":{"line":21,"column":55},"end":{"line":21,"column":55}},{"start":{"line":21,"column":55},"end":{"line":21,"column":55}}]},"2":{"line":77,"type":"if","locations":[{"start":{"line":77,"column":29},"end":{"line":77,"column":33}},{"start":{"line":77,"column":37},"end":{"line":77,"column":52}}]},"3":{"line":91,"type":"if","locations":[{"start":{"line":91,"column":29},"end":{"line":91,"column":33}},{"start":{"line":91,"column":37},"end":{"line":91,"column":49}}]},"4":{"line":107,"type":"if","locations":[{"start":{"line":107,"column":8},"end":{"line":107,"column":8}},{"start":{"line":107,"column":8},"end":{"line":107,"column":8}}]},"5":{"line":110,"type":"if","locations":[{"start":{"line":110,"column":12},"end":{"line":110,"column":12}},{"start":{"line":110,"column":12},"end":{"line":110,"column":12}}]}}}, -"contracts/modules/internal/ValidationModuleInternal.sol":{"l":{"33":384,"34":18,"35":18,"36":18,"46":32,"47":32,"63":12,"64":12,"73":6,"74":6,"85":6,"86":6,"90":60,"91":60,"97":628},"path":"/home/ryan/Downloads/CM/CMTAT_old2/contracts/modules/internal/ValidationModuleInternal.sol","s":{"1":384,"2":18,"3":18,"4":32,"5":32,"6":12,"7":12,"8":6,"9":6,"10":6,"11":6,"12":60,"13":60},"b":{"1":[384,0],"2":[18,366]},"f":{"1":384,"2":32,"3":12,"4":6,"5":6,"6":60,"7":628},"fnMap":{"1":{"name":"__Validation_init_unchained","line":32,"loc":{"start":{"line":30,"column":4},"end":{"line":38,"column":4}}},"2":{"name":"ruleEngine","line":45,"loc":{"start":{"line":45,"column":4},"end":{"line":48,"column":4}}},"3":{"name":"_validateTransfer","line":58,"loc":{"start":{"line":58,"column":4},"end":{"line":65,"column":4}}},"4":{"name":"_messageForTransferRestriction","line":70,"loc":{"start":{"line":70,"column":4},"end":{"line":75,"column":4}}},"5":{"name":"_detectTransferRestriction","line":80,"loc":{"start":{"line":80,"column":4},"end":{"line":87,"column":4}}},"6":{"name":"_operateOnTransfer","line":89,"loc":{"start":{"line":89,"column":4},"end":{"line":92,"column":4}}},"7":{"name":"_getValidationModuleInternalStorage","line":96,"loc":{"start":{"line":96,"column":4},"end":{"line":100,"column":4}}}},"statementMap":{"1":{"start":{"line":33,"column":8},"end":{"line":33,"column":1219}},"2":{"start":{"line":34,"column":12},"end":{"line":34,"column":93}},"3":{"start":{"line":36,"column":12},"end":{"line":36,"column":40}},"4":{"start":{"line":46,"column":8},"end":{"line":46,"column":89}},"5":{"start":{"line":47,"column":8},"end":{"line":47,"column":28}},"6":{"start":{"line":63,"column":8},"end":{"line":63,"column":89}},"7":{"start":{"line":64,"column":8},"end":{"line":64,"column":63}},"8":{"start":{"line":73,"column":8},"end":{"line":73,"column":89}},"9":{"start":{"line":74,"column":8},"end":{"line":74,"column":75}},"10":{"start":{"line":85,"column":8},"end":{"line":85,"column":89}},"11":{"start":{"line":86,"column":8},"end":{"line":86,"column":72}},"12":{"start":{"line":90,"column":8},"end":{"line":90,"column":89}},"13":{"start":{"line":91,"column":8},"end":{"line":91,"column":64}}},"branchMap":{"1":{"line":32,"type":"if","locations":[{"start":{"line":32,"column":15},"end":{"line":32,"column":15}},{"start":{"line":32,"column":15},"end":{"line":32,"column":15}}]},"2":{"line":33,"type":"if","locations":[{"start":{"line":33,"column":8},"end":{"line":33,"column":8}},{"start":{"line":33,"column":8},"end":{"line":33,"column":8}}]}}}, -"contracts/modules/security/AuthorizationModule.sol":{"l":{"32":384,"33":2,"35":382,"36":382,"37":16,"38":16,"39":16,"49":2,"50":2,"61":16,"62":16,"63":4,"65":12,"66":12,"70":40,"71":40,"72":8,"73":8,"75":4,"78":36,"82":10,"83":10,"84":8,"85":8,"87":4,"90":6,"101":1283,"102":759,"104":524,"115":84},"path":"/home/ryan/Downloads/CM/CMTAT_old2/contracts/modules/security/AuthorizationModule.sol","s":{"1":384,"2":382,"3":382,"4":16,"5":16,"6":2,"7":2,"8":16,"9":16,"10":12,"11":40,"12":40,"13":8,"14":8,"15":36,"16":10,"17":10,"18":8,"19":8,"20":6,"21":1283,"22":759,"23":524},"b":{"1":[384,0],"2":[2,382],"3":[16,366],"4":[16,4],"5":[4,12],"6":[40,2],"7":[8,32],"8":[4,4],"9":[10,2],"10":[8,2],"11":[4,4],"12":[759,524]},"f":{"1":384,"2":2,"3":16,"4":40,"5":10,"6":1283,"7":84},"fnMap":{"1":{"name":"__AuthorizationModule_init_unchained","line":31,"loc":{"start":{"line":30,"column":4},"end":{"line":41,"column":4}}},"2":{"name":"authorizationEngine","line":48,"loc":{"start":{"line":48,"column":4},"end":{"line":51,"column":4}}},"3":{"name":"setAuthorizationEngine","line":60,"loc":{"start":{"line":58,"column":4},"end":{"line":67,"column":4}}},"4":{"name":"grantRole","line":69,"loc":{"start":{"line":69,"column":4},"end":{"line":79,"column":4}}},"5":{"name":"revokeRole","line":81,"loc":{"start":{"line":81,"column":4},"end":{"line":91,"column":4}}},"6":{"name":"hasRole","line":96,"loc":{"start":{"line":96,"column":4},"end":{"line":105,"column":4}}},"7":{"name":"_getAuthorizationModuleStorage","line":114,"loc":{"start":{"line":114,"column":4},"end":{"line":118,"column":4}}}},"statementMap":{"1":{"start":{"line":32,"column":8},"end":{"line":32,"column":1354}},"2":{"start":{"line":35,"column":8},"end":{"line":35,"column":44}},"3":{"start":{"line":36,"column":8},"end":{"line":36,"column":1521}},"4":{"start":{"line":37,"column":12},"end":{"line":37,"column":83}},"5":{"start":{"line":39,"column":12},"end":{"line":39,"column":58}},"6":{"start":{"line":49,"column":8},"end":{"line":49,"column":79}},"7":{"start":{"line":50,"column":8},"end":{"line":50,"column":37}},"8":{"start":{"line":61,"column":8},"end":{"line":61,"column":79}},"9":{"start":{"line":62,"column":8},"end":{"line":62,"column":2578}},"10":{"start":{"line":66,"column":8},"end":{"line":66,"column":54}},"11":{"start":{"line":70,"column":8},"end":{"line":70,"column":79}},"12":{"start":{"line":71,"column":8},"end":{"line":71,"column":3034}},"13":{"start":{"line":72,"column":12},"end":{"line":72,"column":82}},"14":{"start":{"line":73,"column":12},"end":{"line":73,"column":3188}},"15":{"start":{"line":78,"column":8},"end":{"line":78,"column":64}},"16":{"start":{"line":82,"column":8},"end":{"line":82,"column":79}},"17":{"start":{"line":83,"column":8},"end":{"line":83,"column":3630}},"18":{"start":{"line":84,"column":12},"end":{"line":84,"column":83}},"19":{"start":{"line":85,"column":12},"end":{"line":85,"column":3785}},"20":{"start":{"line":90,"column":8},"end":{"line":90,"column":65}},"21":{"start":{"line":101,"column":8},"end":{"line":101,"column":4316}},"22":{"start":{"line":102,"column":12},"end":{"line":102,"column":23}},"23":{"start":{"line":104,"column":8},"end":{"line":104,"column":62}}},"branchMap":{"1":{"line":31,"type":"if","locations":[{"start":{"line":31,"column":13},"end":{"line":31,"column":13}},{"start":{"line":31,"column":13},"end":{"line":31,"column":13}}]},"2":{"line":32,"type":"if","locations":[{"start":{"line":32,"column":8},"end":{"line":32,"column":8}},{"start":{"line":32,"column":8},"end":{"line":32,"column":8}}]},"3":{"line":36,"type":"if","locations":[{"start":{"line":36,"column":8},"end":{"line":36,"column":8}},{"start":{"line":36,"column":8},"end":{"line":36,"column":8}}]},"4":{"line":60,"type":"if","locations":[{"start":{"line":60,"column":15},"end":{"line":60,"column":15}},{"start":{"line":60,"column":15},"end":{"line":60,"column":15}}]},"5":{"line":62,"type":"if","locations":[{"start":{"line":62,"column":8},"end":{"line":62,"column":8}},{"start":{"line":62,"column":8},"end":{"line":62,"column":8}}]},"6":{"line":69,"type":"if","locations":[{"start":{"line":69,"column":70},"end":{"line":69,"column":70}},{"start":{"line":69,"column":70},"end":{"line":69,"column":70}}]},"7":{"line":71,"type":"if","locations":[{"start":{"line":71,"column":8},"end":{"line":71,"column":8}},{"start":{"line":71,"column":8},"end":{"line":71,"column":8}}]},"8":{"line":73,"type":"if","locations":[{"start":{"line":73,"column":12},"end":{"line":73,"column":12}},{"start":{"line":73,"column":12},"end":{"line":73,"column":12}}]},"9":{"line":81,"type":"if","locations":[{"start":{"line":81,"column":71},"end":{"line":81,"column":71}},{"start":{"line":81,"column":71},"end":{"line":81,"column":71}}]},"10":{"line":83,"type":"if","locations":[{"start":{"line":83,"column":8},"end":{"line":83,"column":8}},{"start":{"line":83,"column":8},"end":{"line":83,"column":8}}]},"11":{"line":85,"type":"if","locations":[{"start":{"line":85,"column":12},"end":{"line":85,"column":12}},{"start":{"line":85,"column":12},"end":{"line":85,"column":12}}]},"12":{"line":101,"type":"if","locations":[{"start":{"line":101,"column":8},"end":{"line":101,"column":8}},{"start":{"line":101,"column":8},"end":{"line":101,"column":8}}]}}}, -"contracts/modules/wrapper/controllers/ValidationModule.sol":{"l":{"44":18,"45":18,"46":3,"48":15,"49":15,"60":20,"61":20,"62":3,"67":4,"72":2,"77":2,"79":6,"81":3,"97":17,"98":17,"99":4,"101":2,"103":2,"105":6,"107":3,"116":19,"117":4,"119":15,"120":15,"121":12,"123":3,"135":457,"136":18,"138":439,"142":438,"143":14,"145":424,"146":424,"147":60,"149":364},"path":"/home/ryan/Downloads/CM/CMTAT_old2/contracts/modules/wrapper/controllers/ValidationModule.sol","s":{"1":18,"2":18,"3":15,"4":20,"5":20,"6":3,"7":17,"8":4,"9":13,"10":2,"11":11,"12":2,"13":9,"14":6,"15":3,"16":17,"17":17,"18":4,"19":13,"20":2,"21":11,"22":2,"23":9,"24":6,"25":3,"26":19,"27":4,"28":15,"29":15,"30":12,"31":3,"32":457,"33":18,"34":439,"35":438,"36":14,"37":424,"38":424,"39":60,"40":364},"b":{"1":[382,0],"2":[18,3],"3":[3,15],"4":[3,17],"5":[4,13],"6":[2,11],"7":[2,9],"8":[6,3],"9":[4,13],"10":[2,11],"11":[2,9],"12":[6,3],"13":[4,15],"14":[12,3],"15":[18,439],"16":[12,4],"17":[4,2],"18":[14,424],"19":[60,364]},"f":{"1":382,"2":18,"3":20,"4":17,"5":19,"6":457,"7":438},"fnMap":{"1":{"name":"__ValidationModule_init_unchained","line":28,"loc":{"start":{"line":28,"column":4},"end":{"line":30,"column":4}}},"2":{"name":"setRuleEngine","line":43,"loc":{"start":{"line":41,"column":4},"end":{"line":50,"column":4}}},"3":{"name":"messageForTransferRestriction","line":57,"loc":{"start":{"line":57,"column":4},"end":{"line":83,"column":4}}},"4":{"name":"detectTransferRestriction","line":92,"loc":{"start":{"line":92,"column":4},"end":{"line":109,"column":4}}},"5":{"name":"validateTransfer","line":111,"loc":{"start":{"line":111,"column":4},"end":{"line":124,"column":4}}},"6":{"name":"_validateTransferByModule","line":130,"loc":{"start":{"line":130,"column":4},"end":{"line":139,"column":4}}},"7":{"name":"_operateOnTransfer","line":141,"loc":{"start":{"line":141,"column":4},"end":{"line":150,"column":4}}}},"statementMap":{"1":{"start":{"line":44,"column":8},"end":{"line":44,"column":89}},"2":{"start":{"line":45,"column":8},"end":{"line":45,"column":1409}},"3":{"start":{"line":49,"column":8},"end":{"line":49,"column":36}},"4":{"start":{"line":60,"column":10},"end":{"line":60,"column":91}},"5":{"start":{"line":61,"column":8},"end":{"line":61,"column":2191}},"6":{"start":{"line":62,"column":12},"end":{"line":62,"column":35}},"7":{"start":{"line":63,"column":15},"end":{"line":63,"column":2307}},"8":{"start":{"line":67,"column":12},"end":{"line":67,"column":48}},"9":{"start":{"line":68,"column":15},"end":{"line":68,"column":2483}},"10":{"start":{"line":72,"column":12},"end":{"line":72,"column":53}},"11":{"start":{"line":73,"column":15},"end":{"line":73,"column":2669}},"12":{"start":{"line":77,"column":12},"end":{"line":77,"column":51}},"13":{"start":{"line":78,"column":15},"end":{"line":78,"column":2851}},"14":{"start":{"line":79,"column":12},"end":{"line":79,"column":66}},"15":{"start":{"line":81,"column":12},"end":{"line":81,"column":36}},"16":{"start":{"line":97,"column":8},"end":{"line":97,"column":89}},"17":{"start":{"line":98,"column":8},"end":{"line":98,"column":3641}},"18":{"start":{"line":99,"column":12},"end":{"line":99,"column":69}},"19":{"start":{"line":100,"column":15},"end":{"line":100,"column":3743}},"20":{"start":{"line":101,"column":12},"end":{"line":101,"column":74}},"21":{"start":{"line":102,"column":15},"end":{"line":102,"column":3854}},"22":{"start":{"line":103,"column":12},"end":{"line":103,"column":72}},"23":{"start":{"line":104,"column":15},"end":{"line":104,"column":3961}},"24":{"start":{"line":105,"column":12},"end":{"line":105,"column":63}},"25":{"start":{"line":107,"column":12},"end":{"line":107,"column":56}},"26":{"start":{"line":116,"column":8},"end":{"line":116,"column":4310}},"27":{"start":{"line":117,"column":12},"end":{"line":117,"column":24}},"28":{"start":{"line":119,"column":8},"end":{"line":119,"column":89}},"29":{"start":{"line":120,"column":8},"end":{"line":120,"column":4497}},"30":{"start":{"line":121,"column":12},"end":{"line":121,"column":54}},"31":{"start":{"line":123,"column":8},"end":{"line":123,"column":19}},"32":{"start":{"line":135,"column":8},"end":{"line":135,"column":4983}},"33":{"start":{"line":136,"column":12},"end":{"line":136,"column":24}},"34":{"start":{"line":138,"column":8},"end":{"line":138,"column":19}},"35":{"start":{"line":142,"column":8},"end":{"line":142,"column":5209}},"36":{"start":{"line":143,"column":12},"end":{"line":143,"column":24}},"37":{"start":{"line":145,"column":8},"end":{"line":145,"column":89}},"38":{"start":{"line":146,"column":8},"end":{"line":146,"column":5395}},"39":{"start":{"line":147,"column":12},"end":{"line":147,"column":80}},"40":{"start":{"line":149,"column":8},"end":{"line":149,"column":19}}},"branchMap":{"1":{"line":28,"type":"if","locations":[{"start":{"line":28,"column":58},"end":{"line":28,"column":58}},{"start":{"line":28,"column":58},"end":{"line":28,"column":58}}]},"2":{"line":43,"type":"if","locations":[{"start":{"line":43,"column":15},"end":{"line":43,"column":15}},{"start":{"line":43,"column":15},"end":{"line":43,"column":15}}]},"3":{"line":45,"type":"if","locations":[{"start":{"line":45,"column":8},"end":{"line":45,"column":8}},{"start":{"line":45,"column":8},"end":{"line":45,"column":8}}]},"4":{"line":61,"type":"if","locations":[{"start":{"line":61,"column":8},"end":{"line":61,"column":8}},{"start":{"line":61,"column":8},"end":{"line":61,"column":8}}]},"5":{"line":63,"type":"if","locations":[{"start":{"line":63,"column":15},"end":{"line":63,"column":15}},{"start":{"line":63,"column":15},"end":{"line":63,"column":15}}]},"6":{"line":68,"type":"if","locations":[{"start":{"line":68,"column":15},"end":{"line":68,"column":15}},{"start":{"line":68,"column":15},"end":{"line":68,"column":15}}]},"7":{"line":73,"type":"if","locations":[{"start":{"line":73,"column":15},"end":{"line":73,"column":15}},{"start":{"line":73,"column":15},"end":{"line":73,"column":15}}]},"8":{"line":78,"type":"if","locations":[{"start":{"line":78,"column":15},"end":{"line":78,"column":15}},{"start":{"line":78,"column":15},"end":{"line":78,"column":15}}]},"9":{"line":98,"type":"if","locations":[{"start":{"line":98,"column":8},"end":{"line":98,"column":8}},{"start":{"line":98,"column":8},"end":{"line":98,"column":8}}]},"10":{"line":100,"type":"if","locations":[{"start":{"line":100,"column":15},"end":{"line":100,"column":15}},{"start":{"line":100,"column":15},"end":{"line":100,"column":15}}]},"11":{"line":102,"type":"if","locations":[{"start":{"line":102,"column":15},"end":{"line":102,"column":15}},{"start":{"line":102,"column":15},"end":{"line":102,"column":15}}]},"12":{"line":104,"type":"if","locations":[{"start":{"line":104,"column":15},"end":{"line":104,"column":15}},{"start":{"line":104,"column":15},"end":{"line":104,"column":15}}]},"13":{"line":116,"type":"if","locations":[{"start":{"line":116,"column":8},"end":{"line":116,"column":8}},{"start":{"line":116,"column":8},"end":{"line":116,"column":8}}]},"14":{"line":120,"type":"if","locations":[{"start":{"line":120,"column":8},"end":{"line":120,"column":8}},{"start":{"line":120,"column":8},"end":{"line":120,"column":8}}]},"15":{"line":135,"type":"if","locations":[{"start":{"line":135,"column":8},"end":{"line":135,"column":8}},{"start":{"line":135,"column":8},"end":{"line":135,"column":8}}]},"16":{"line":135,"type":"cond-expr","locations":[{"start":{"line":135,"column":12},"end":{"line":135,"column":19}},{"start":{"line":135,"column":24},"end":{"line":135,"column":35}}]},"17":{"line":135,"type":"cond-expr","locations":[{"start":{"line":135,"column":12},"end":{"line":135,"column":35}},{"start":{"line":135,"column":40},"end":{"line":135,"column":49}}]},"18":{"line":142,"type":"if","locations":[{"start":{"line":142,"column":8},"end":{"line":142,"column":8}},{"start":{"line":142,"column":8},"end":{"line":142,"column":8}}]},"19":{"line":146,"type":"if","locations":[{"start":{"line":146,"column":8},"end":{"line":146,"column":8}},{"start":{"line":146,"column":8},"end":{"line":146,"column":8}}]}}}, -"contracts/modules/wrapper/core/BaseModule.sol":{"l":{"45":382,"46":382,"47":382,"48":382,"56":10,"57":10,"61":10,"62":10,"65":8,"66":8,"75":2,"76":2,"77":2,"86":2,"87":2,"88":2,"97":2,"98":2,"99":2,"109":416},"path":"/home/ryan/Downloads/CM/CMTAT_old2/contracts/modules/wrapper/core/BaseModule.sol","s":{"1":382,"2":10,"3":10,"4":10,"5":10,"6":8,"7":8,"8":2,"9":2,"10":2,"11":2,"12":2,"13":2},"b":{"1":[382,0],"2":[2,2],"3":[2,2],"4":[2,2]},"f":{"1":382,"2":10,"3":10,"4":8,"5":2,"6":2,"7":2,"8":416},"fnMap":{"1":{"name":"__Base_init_unchained","line":44,"loc":{"start":{"line":40,"column":4},"end":{"line":49,"column":4}}},"2":{"name":"tokenId","line":55,"loc":{"start":{"line":55,"column":4},"end":{"line":58,"column":4}}},"3":{"name":"terms","line":60,"loc":{"start":{"line":60,"column":4},"end":{"line":63,"column":4}}},"4":{"name":"information","line":64,"loc":{"start":{"line":64,"column":4},"end":{"line":67,"column":4}}},"5":{"name":"setTokenId","line":74,"loc":{"start":{"line":72,"column":4},"end":{"line":78,"column":4}}},"6":{"name":"setTerms","line":85,"loc":{"start":{"line":83,"column":4},"end":{"line":89,"column":4}}},"7":{"name":"setInformation","line":96,"loc":{"start":{"line":94,"column":4},"end":{"line":100,"column":4}}},"8":{"name":"_getBaseModuleStorage","line":108,"loc":{"start":{"line":108,"column":4},"end":{"line":112,"column":4}}}},"statementMap":{"1":{"start":{"line":45,"column":8},"end":{"line":45,"column":61}},"2":{"start":{"line":56,"column":8},"end":{"line":56,"column":61}},"3":{"start":{"line":57,"column":8},"end":{"line":57,"column":25}},"4":{"start":{"line":61,"column":8},"end":{"line":61,"column":61}},"5":{"start":{"line":62,"column":8},"end":{"line":62,"column":23}},"6":{"start":{"line":65,"column":8},"end":{"line":65,"column":61}},"7":{"start":{"line":66,"column":8},"end":{"line":66,"column":29}},"8":{"start":{"line":75,"column":8},"end":{"line":75,"column":61}},"9":{"start":{"line":77,"column":8},"end":{"line":77,"column":40}},"10":{"start":{"line":86,"column":8},"end":{"line":86,"column":61}},"11":{"start":{"line":88,"column":8},"end":{"line":88,"column":33}},"12":{"start":{"line":97,"column":8},"end":{"line":97,"column":61}},"13":{"start":{"line":99,"column":8},"end":{"line":99,"column":52}}},"branchMap":{"1":{"line":44,"type":"if","locations":[{"start":{"line":44,"column":15},"end":{"line":44,"column":15}},{"start":{"line":44,"column":15},"end":{"line":44,"column":15}}]},"2":{"line":74,"type":"if","locations":[{"start":{"line":74,"column":13},"end":{"line":74,"column":13}},{"start":{"line":74,"column":13},"end":{"line":74,"column":13}}]},"3":{"line":85,"type":"if","locations":[{"start":{"line":85,"column":13},"end":{"line":85,"column":13}},{"start":{"line":85,"column":13},"end":{"line":85,"column":13}}]},"4":{"line":96,"type":"if","locations":[{"start":{"line":96,"column":13},"end":{"line":96,"column":13}},{"start":{"line":96,"column":13},"end":{"line":96,"column":13}}]}}}, -"contracts/modules/wrapper/core/EnforcementModule.sol":{"l":{"43":22,"57":8},"path":"/home/ryan/Downloads/CM/CMTAT_old2/contracts/modules/wrapper/core/EnforcementModule.sol","s":{"1":22,"2":8},"b":{"1":[382,0],"2":[22,2],"3":[8,2]},"f":{"1":382,"2":22,"3":8},"fnMap":{"1":{"name":"__EnforcementModule_init_unchained","line":27,"loc":{"start":{"line":27,"column":4},"end":{"line":29,"column":4}}},"2":{"name":"freeze","line":42,"loc":{"start":{"line":39,"column":4},"end":{"line":44,"column":4}}},"3":{"name":"unfreeze","line":56,"loc":{"start":{"line":53,"column":4},"end":{"line":58,"column":4}}}},"statementMap":{"1":{"start":{"line":43,"column":8},"end":{"line":43,"column":39}},"2":{"start":{"line":57,"column":8},"end":{"line":57,"column":41}}},"branchMap":{"1":{"line":27,"type":"if","locations":[{"start":{"line":27,"column":59},"end":{"line":27,"column":59}},{"start":{"line":27,"column":59},"end":{"line":27,"column":59}}]},"2":{"line":42,"type":"if","locations":[{"start":{"line":42,"column":13},"end":{"line":42,"column":13}},{"start":{"line":42,"column":13},"end":{"line":42,"column":13}}]},"3":{"line":56,"type":"if","locations":[{"start":{"line":56,"column":13},"end":{"line":56,"column":13}},{"start":{"line":56,"column":13},"end":{"line":56,"column":13}}]}}}, -"contracts/modules/wrapper/core/ERC20BaseModule.sol":{"l":{"42":382,"43":382,"54":2,"55":2,"74":10,"75":2,"79":8,"80":4,"83":4,"86":10,"90":2,"105":10,"107":2,"108":2,"111":2,"120":4,"121":4,"122":2,"124":4,"135":384},"path":"/home/ryan/Downloads/CM/CMTAT_old2/contracts/modules/wrapper/core/ERC20BaseModule.sol","s":{"1":382,"2":2,"3":2,"4":10,"5":8,"6":4,"7":10,"8":2,"9":10,"10":2,"11":2,"12":2,"13":4},"b":{"1":[382,0],"2":[2,8],"3":[4,4],"4":[2,0]},"f":{"1":382,"2":2,"3":10,"4":10,"5":4,"6":384},"fnMap":{"1":{"name":"__ERC20BaseModule_init_unchained","line":41,"loc":{"start":{"line":39,"column":4},"end":{"line":44,"column":4}}},"2":{"name":"decimals","line":53,"loc":{"start":{"line":53,"column":4},"end":{"line":56,"column":4}}},"3":{"name":"transferBatch","line":70,"loc":{"start":{"line":70,"column":4},"end":{"line":91,"column":4}}},"4":{"name":"transferFrom","line":100,"loc":{"start":{"line":100,"column":4},"end":{"line":112,"column":4}}},"5":{"name":"balanceInfo","line":119,"loc":{"start":{"line":119,"column":4},"end":{"line":125,"column":4}}},"6":{"name":"_getERC20BaseModuleStorage","line":134,"loc":{"start":{"line":134,"column":4},"end":{"line":138,"column":4}}}},"statementMap":{"1":{"start":{"line":42,"column":8},"end":{"line":42,"column":71}},"2":{"start":{"line":54,"column":8},"end":{"line":54,"column":71}},"3":{"start":{"line":55,"column":8},"end":{"line":55,"column":26}},"4":{"start":{"line":74,"column":8},"end":{"line":74,"column":2789}},"5":{"start":{"line":79,"column":8},"end":{"line":79,"column":3006}},"6":{"start":{"line":83,"column":8},"end":{"line":83,"column":3201}},"7":{"start":{"line":86,"column":12},"end":{"line":86,"column":70}},"8":{"start":{"line":90,"column":8},"end":{"line":90,"column":19}},"9":{"start":{"line":105,"column":8},"end":{"line":105,"column":68}},"10":{"start":{"line":107,"column":8},"end":{"line":107,"column":4151}},"11":{"start":{"line":108,"column":12},"end":{"line":108,"column":49}},"12":{"start":{"line":111,"column":8},"end":{"line":111,"column":21}},"13":{"start":{"line":121,"column":8},"end":{"line":121,"column":4644}}},"branchMap":{"1":{"line":41,"type":"if","locations":[{"start":{"line":41,"column":15},"end":{"line":41,"column":15}},{"start":{"line":41,"column":15},"end":{"line":41,"column":15}}]},"2":{"line":74,"type":"if","locations":[{"start":{"line":74,"column":8},"end":{"line":74,"column":8}},{"start":{"line":74,"column":8},"end":{"line":74,"column":8}}]},"3":{"line":79,"type":"if","locations":[{"start":{"line":79,"column":8},"end":{"line":79,"column":8}},{"start":{"line":79,"column":8},"end":{"line":79,"column":8}}]},"4":{"line":107,"type":"if","locations":[{"start":{"line":107,"column":8},"end":{"line":107,"column":8}},{"start":{"line":107,"column":8},"end":{"line":107,"column":8}}]}}}, -"contracts/modules/wrapper/core/ERC20BurnModule.sol":{"l":{"54":14,"55":12,"78":12,"79":2,"83":10,"84":4,"87":6,"88":18,"89":16,"112":4,"113":4,"114":4,"116":2,"119":2,"120":2,"123":2,"125":2,"127":2},"path":"/home/ryan/Downloads/CM/CMTAT_old2/contracts/modules/wrapper/core/ERC20BurnModule.sol","s":{"1":14,"2":12,"3":12,"4":10,"5":6,"6":18,"7":16,"8":4,"9":4,"10":4,"11":2,"12":2,"13":2,"14":2},"b":{"1":[382,0],"2":[14,4],"3":[12,2],"4":[2,10],"5":[4,6],"6":[4,2],"7":[2,2]},"f":{"1":382,"2":14,"3":12,"4":4},"fnMap":{"1":{"name":"__ERC20BurnModule_init_unchained","line":32,"loc":{"start":{"line":32,"column":4},"end":{"line":34,"column":4}}},"2":{"name":"burn","line":53,"loc":{"start":{"line":49,"column":4},"end":{"line":56,"column":4}}},"3":{"name":"burnBatch","line":77,"loc":{"start":{"line":73,"column":4},"end":{"line":91,"column":4}}},"4":{"name":"burnFrom","line":109,"loc":{"start":{"line":107,"column":4},"end":{"line":128,"column":4}}}},"statementMap":{"1":{"start":{"line":54,"column":8},"end":{"line":54,"column":28}},"2":{"start":{"line":55,"column":8},"end":{"line":55,"column":41}},"3":{"start":{"line":78,"column":8},"end":{"line":78,"column":2750}},"4":{"start":{"line":83,"column":8},"end":{"line":83,"column":2972}},"5":{"start":{"line":87,"column":8},"end":{"line":87,"column":3172}},"6":{"start":{"line":88,"column":12},"end":{"line":88,"column":40}},"7":{"start":{"line":89,"column":12},"end":{"line":89,"column":53}},"8":{"start":{"line":112,"column":8},"end":{"line":112,"column":38}},"9":{"start":{"line":113,"column":8},"end":{"line":113,"column":61}},"10":{"start":{"line":114,"column":8},"end":{"line":114,"column":4061}},"11":{"start":{"line":120,"column":12},"end":{"line":120,"column":62}},"12":{"start":{"line":123,"column":8},"end":{"line":123,"column":28}},"13":{"start":{"line":125,"column":8},"end":{"line":125,"column":45}},"14":{"start":{"line":127,"column":8},"end":{"line":127,"column":45}}},"branchMap":{"1":{"line":32,"type":"if","locations":[{"start":{"line":32,"column":57},"end":{"line":32,"column":57}},{"start":{"line":32,"column":57},"end":{"line":32,"column":57}}]},"2":{"line":53,"type":"if","locations":[{"start":{"line":53,"column":13},"end":{"line":53,"column":13}},{"start":{"line":53,"column":13},"end":{"line":53,"column":13}}]},"3":{"line":77,"type":"if","locations":[{"start":{"line":77,"column":13},"end":{"line":77,"column":13}},{"start":{"line":77,"column":13},"end":{"line":77,"column":13}}]},"4":{"line":78,"type":"if","locations":[{"start":{"line":78,"column":8},"end":{"line":78,"column":8}},{"start":{"line":78,"column":8},"end":{"line":78,"column":8}}]},"5":{"line":83,"type":"if","locations":[{"start":{"line":83,"column":8},"end":{"line":83,"column":8}},{"start":{"line":83,"column":8},"end":{"line":83,"column":8}}]},"6":{"line":109,"type":"if","locations":[{"start":{"line":109,"column":8},"end":{"line":109,"column":8}},{"start":{"line":109,"column":8},"end":{"line":109,"column":8}}]},"7":{"line":114,"type":"if","locations":[{"start":{"line":114,"column":8},"end":{"line":114,"column":8}},{"start":{"line":114,"column":8},"end":{"line":114,"column":8}}]}}}, -"contracts/modules/wrapper/core/ERC20MintModule.sol":{"l":{"48":290,"49":290,"71":24,"72":2,"76":22,"77":4,"80":18,"81":54,"82":54},"path":"/home/ryan/Downloads/CM/CMTAT_old2/contracts/modules/wrapper/core/ERC20MintModule.sol","s":{"1":290,"2":290,"3":24,"4":22,"5":18,"6":54,"7":54},"b":{"1":[382,0],"2":[290,4],"3":[24,2],"4":[2,22],"5":[4,18]},"f":{"1":382,"2":290,"3":24},"fnMap":{"1":{"name":"__ERC20MintModule_init_unchained","line":27,"loc":{"start":{"line":27,"column":4},"end":{"line":29,"column":4}}},"2":{"name":"mint","line":47,"loc":{"start":{"line":47,"column":4},"end":{"line":50,"column":4}}},"3":{"name":"mintBatch","line":70,"loc":{"start":{"line":67,"column":4},"end":{"line":84,"column":4}}}},"statementMap":{"1":{"start":{"line":48,"column":8},"end":{"line":48,"column":28}},"2":{"start":{"line":49,"column":8},"end":{"line":49,"column":33}},"3":{"start":{"line":71,"column":8},"end":{"line":71,"column":2514}},"4":{"start":{"line":76,"column":8},"end":{"line":76,"column":2736}},"5":{"start":{"line":80,"column":8},"end":{"line":80,"column":2936}},"6":{"start":{"line":81,"column":12},"end":{"line":81,"column":40}},"7":{"start":{"line":82,"column":12},"end":{"line":82,"column":45}}},"branchMap":{"1":{"line":27,"type":"if","locations":[{"start":{"line":27,"column":57},"end":{"line":27,"column":57}},{"start":{"line":27,"column":57},"end":{"line":27,"column":57}}]},"2":{"line":47,"type":"if","locations":[{"start":{"line":47,"column":57},"end":{"line":47,"column":57}},{"start":{"line":47,"column":57},"end":{"line":47,"column":57}}]},"3":{"line":70,"type":"if","locations":[{"start":{"line":70,"column":13},"end":{"line":70,"column":13}},{"start":{"line":70,"column":13},"end":{"line":70,"column":13}}]},"4":{"line":71,"type":"if","locations":[{"start":{"line":71,"column":8},"end":{"line":71,"column":8}},{"start":{"line":71,"column":8},"end":{"line":71,"column":8}}]},"5":{"line":76,"type":"if","locations":[{"start":{"line":76,"column":8},"end":{"line":76,"column":8}},{"start":{"line":76,"column":8},"end":{"line":76,"column":8}}]}}}, -"contracts/modules/wrapper/core/PauseModule.sol":{"l":{"51":14,"63":6,"64":6,"65":2,"67":4,"83":2,"84":2,"85":2,"86":2,"93":4,"94":4,"105":12},"path":"/home/ryan/Downloads/CM/CMTAT_old2/contracts/modules/wrapper/core/PauseModule.sol","s":{"1":14,"2":6,"3":6,"4":4,"5":2,"6":2,"7":2,"8":4,"9":4},"b":{"1":[382,0],"2":[14,3],"3":[6,2],"4":[2,4],"5":[2,2]},"f":{"1":382,"2":14,"3":6,"4":2,"5":4,"6":12},"fnMap":{"1":{"name":"__PauseModule_init_unchained","line":34,"loc":{"start":{"line":34,"column":4},"end":{"line":36,"column":4}}},"2":{"name":"pause","line":50,"loc":{"start":{"line":50,"column":4},"end":{"line":52,"column":4}}},"3":{"name":"unpause","line":62,"loc":{"start":{"line":62,"column":4},"end":{"line":68,"column":4}}},"4":{"name":"deactivateContract","line":81,"loc":{"start":{"line":79,"column":4},"end":{"line":87,"column":4}}},"5":{"name":"deactivated","line":92,"loc":{"start":{"line":92,"column":4},"end":{"line":95,"column":4}}},"6":{"name":"_getPauseModuleStorage","line":104,"loc":{"start":{"line":104,"column":4},"end":{"line":108,"column":4}}}},"statementMap":{"1":{"start":{"line":51,"column":8},"end":{"line":51,"column":15}},"2":{"start":{"line":63,"column":8},"end":{"line":63,"column":63}},"3":{"start":{"line":64,"column":8},"end":{"line":64,"column":2386}},"4":{"start":{"line":67,"column":8},"end":{"line":67,"column":17}},"5":{"start":{"line":83,"column":8},"end":{"line":83,"column":63}},"6":{"start":{"line":85,"column":7},"end":{"line":85,"column":14}},"7":{"start":{"line":86,"column":7},"end":{"line":86,"column":37}},"8":{"start":{"line":93,"column":8},"end":{"line":93,"column":63}},"9":{"start":{"line":94,"column":8},"end":{"line":94,"column":31}}},"branchMap":{"1":{"line":34,"type":"if","locations":[{"start":{"line":34,"column":53},"end":{"line":34,"column":53}},{"start":{"line":34,"column":53},"end":{"line":34,"column":53}}]},"2":{"line":50,"type":"if","locations":[{"start":{"line":50,"column":28},"end":{"line":50,"column":28}},{"start":{"line":50,"column":28},"end":{"line":50,"column":28}}]},"3":{"line":62,"type":"if","locations":[{"start":{"line":62,"column":30},"end":{"line":62,"column":30}},{"start":{"line":62,"column":30},"end":{"line":62,"column":30}}]},"4":{"line":64,"type":"if","locations":[{"start":{"line":64,"column":8},"end":{"line":64,"column":8}},{"start":{"line":64,"column":8},"end":{"line":64,"column":8}}]},"5":{"line":81,"type":"if","locations":[{"start":{"line":81,"column":8},"end":{"line":81,"column":8}},{"start":{"line":81,"column":8},"end":{"line":81,"column":8}}]}}}, -"contracts/modules/wrapper/extensions/DebtModule.sol":{"l":{"43":382,"44":3,"45":3,"46":3,"55":8,"56":8,"66":5,"67":5,"68":1,"70":4,"71":4,"75":3,"76":3,"77":2,"82":3,"83":3,"84":2,"95":22},"path":"/home/ryan/Downloads/CM/CMTAT_old2/contracts/modules/wrapper/extensions/DebtModule.sol","s":{"1":382,"2":3,"3":3,"4":8,"5":8,"6":5,"7":5,"8":4,"9":3,"10":3,"11":3,"12":3},"b":{"1":[382,0],"2":[3,379],"3":[5,1],"4":[1,4],"5":[2,1],"6":[2,1]},"f":{"1":382,"2":8,"3":5,"4":3,"5":3,"6":22},"fnMap":{"1":{"name":"__DebtModule_init_unchained","line":42,"loc":{"start":{"line":41,"column":4},"end":{"line":50,"column":4}}},"2":{"name":"debtEngine","line":54,"loc":{"start":{"line":54,"column":4},"end":{"line":57,"column":4}}},"3":{"name":"setDebtEngine","line":65,"loc":{"start":{"line":63,"column":4},"end":{"line":72,"column":4}}},"4":{"name":"debt","line":74,"loc":{"start":{"line":74,"column":4},"end":{"line":79,"column":4}}},"5":{"name":"creditEvents","line":81,"loc":{"start":{"line":81,"column":4},"end":{"line":86,"column":4}}},"6":{"name":"_getDebtModuleStorage","line":94,"loc":{"start":{"line":94,"column":4},"end":{"line":98,"column":4}}}},"statementMap":{"1":{"start":{"line":43,"column":8},"end":{"line":43,"column":1427}},"2":{"start":{"line":44,"column":12},"end":{"line":44,"column":65}},"3":{"start":{"line":46,"column":12},"end":{"line":46,"column":40}},"4":{"start":{"line":55,"column":8},"end":{"line":55,"column":61}},"5":{"start":{"line":56,"column":8},"end":{"line":56,"column":28}},"6":{"start":{"line":66,"column":8},"end":{"line":66,"column":61}},"7":{"start":{"line":67,"column":8},"end":{"line":67,"column":2257}},"8":{"start":{"line":71,"column":8},"end":{"line":71,"column":36}},"9":{"start":{"line":75,"column":8},"end":{"line":75,"column":61}},"10":{"start":{"line":76,"column":8},"end":{"line":76,"column":2584}},"11":{"start":{"line":82,"column":8},"end":{"line":82,"column":61}},"12":{"start":{"line":83,"column":8},"end":{"line":83,"column":2855}}},"branchMap":{"1":{"line":42,"type":"if","locations":[{"start":{"line":42,"column":13},"end":{"line":42,"column":13}},{"start":{"line":42,"column":13},"end":{"line":42,"column":13}}]},"2":{"line":43,"type":"if","locations":[{"start":{"line":43,"column":8},"end":{"line":43,"column":8}},{"start":{"line":43,"column":8},"end":{"line":43,"column":8}}]},"3":{"line":65,"type":"if","locations":[{"start":{"line":65,"column":15},"end":{"line":65,"column":15}},{"start":{"line":65,"column":15},"end":{"line":65,"column":15}}]},"4":{"line":67,"type":"if","locations":[{"start":{"line":67,"column":8},"end":{"line":67,"column":8}},{"start":{"line":67,"column":8},"end":{"line":67,"column":8}}]},"5":{"line":76,"type":"if","locations":[{"start":{"line":76,"column":8},"end":{"line":76,"column":8}},{"start":{"line":76,"column":8},"end":{"line":76,"column":8}}]},"6":{"line":83,"type":"if","locations":[{"start":{"line":83,"column":8},"end":{"line":83,"column":8}},{"start":{"line":83,"column":8},"end":{"line":83,"column":8}}]}}}, -"contracts/modules/wrapper/extensions/DocumentModule.sol":{"l":{"43":382,"44":12,"45":12,"46":12,"54":28,"55":28,"65":16,"66":16,"67":2,"69":14,"70":14,"75":18,"76":18,"77":16,"79":2,"84":6,"85":6,"86":4,"97":80},"path":"/home/ryan/Downloads/CM/CMTAT_old2/contracts/modules/wrapper/extensions/DocumentModule.sol","s":{"1":382,"2":12,"3":12,"4":28,"5":28,"6":16,"7":16,"8":14,"9":18,"10":18,"11":16,"12":2,"13":6,"14":6},"b":{"1":[382,0],"2":[12,370],"3":[16,2],"4":[2,14],"5":[16,2],"6":[4,2]},"f":{"1":382,"2":28,"3":16,"4":18,"5":6,"6":80},"fnMap":{"1":{"name":"__DocumentModule_init_unchained","line":42,"loc":{"start":{"line":41,"column":4},"end":{"line":48,"column":4}}},"2":{"name":"documentEngine","line":53,"loc":{"start":{"line":53,"column":4},"end":{"line":56,"column":4}}},"3":{"name":"setDocumentEngine","line":64,"loc":{"start":{"line":62,"column":4},"end":{"line":71,"column":4}}},"4":{"name":"getDocument","line":74,"loc":{"start":{"line":74,"column":4},"end":{"line":81,"column":4}}},"5":{"name":"getAllDocuments","line":83,"loc":{"start":{"line":83,"column":4},"end":{"line":88,"column":4}}},"6":{"name":"_getDocumentModuleStorage","line":96,"loc":{"start":{"line":96,"column":4},"end":{"line":100,"column":4}}}},"statementMap":{"1":{"start":{"line":43,"column":8},"end":{"line":43,"column":1401}},"2":{"start":{"line":44,"column":12},"end":{"line":44,"column":73}},"3":{"start":{"line":46,"column":12},"end":{"line":46,"column":48}},"4":{"start":{"line":54,"column":8},"end":{"line":54,"column":69}},"5":{"start":{"line":55,"column":8},"end":{"line":55,"column":32}},"6":{"start":{"line":65,"column":8},"end":{"line":65,"column":69}},"7":{"start":{"line":66,"column":8},"end":{"line":66,"column":2280}},"8":{"start":{"line":70,"column":8},"end":{"line":70,"column":44}},"9":{"start":{"line":75,"column":8},"end":{"line":75,"column":69}},"10":{"start":{"line":76,"column":8},"end":{"line":76,"column":2667}},"11":{"start":{"line":77,"column":12},"end":{"line":77,"column":56}},"12":{"start":{"line":79,"column":12},"end":{"line":79,"column":30}},"13":{"start":{"line":84,"column":8},"end":{"line":84,"column":69}},"14":{"start":{"line":85,"column":8},"end":{"line":85,"column":2996}}},"branchMap":{"1":{"line":42,"type":"if","locations":[{"start":{"line":42,"column":13},"end":{"line":42,"column":13}},{"start":{"line":42,"column":13},"end":{"line":42,"column":13}}]},"2":{"line":43,"type":"if","locations":[{"start":{"line":43,"column":8},"end":{"line":43,"column":8}},{"start":{"line":43,"column":8},"end":{"line":43,"column":8}}]},"3":{"line":64,"type":"if","locations":[{"start":{"line":64,"column":15},"end":{"line":64,"column":15}},{"start":{"line":64,"column":15},"end":{"line":64,"column":15}}]},"4":{"line":66,"type":"if","locations":[{"start":{"line":66,"column":8},"end":{"line":66,"column":8}},{"start":{"line":66,"column":8},"end":{"line":66,"column":8}}]},"5":{"line":76,"type":"if","locations":[{"start":{"line":76,"column":8},"end":{"line":76,"column":8}},{"start":{"line":76,"column":8},"end":{"line":76,"column":8}}]},"6":{"line":85,"type":"if","locations":[{"start":{"line":85,"column":8},"end":{"line":85,"column":8}},{"start":{"line":85,"column":8},"end":{"line":85,"column":8}}]}}}, -"contracts/modules/wrapper/extensions/ERC20SnapshotModule.sol":{"l":{"34":170,"45":12,"57":22,"68":14,"78":10},"path":"/home/ryan/Downloads/CM/CMTAT_old2/contracts/modules/wrapper/extensions/ERC20SnapshotModule.sol","s":{"1":170,"2":12,"3":22,"4":14,"5":10},"b":{"1":[382,0],"2":[170,2],"3":[12,2],"4":[22,2],"5":[14,2],"6":[10,2]},"f":{"1":382,"2":170,"3":12,"4":22,"5":14,"6":10},"fnMap":{"1":{"name":"__ERC20SnasphotModule_init_unchained","line":22,"loc":{"start":{"line":22,"column":4},"end":{"line":24,"column":4}}},"2":{"name":"scheduleSnapshot","line":33,"loc":{"start":{"line":33,"column":4},"end":{"line":35,"column":4}}},"3":{"name":"scheduleSnapshotNotOptimized","line":44,"loc":{"start":{"line":42,"column":4},"end":{"line":46,"column":4}}},"4":{"name":"rescheduleSnapshot","line":56,"loc":{"start":{"line":53,"column":4},"end":{"line":58,"column":4}}},"5":{"name":"unscheduleLastSnapshot","line":67,"loc":{"start":{"line":65,"column":4},"end":{"line":69,"column":4}}},"6":{"name":"unscheduleSnapshotNotOptimized","line":77,"loc":{"start":{"line":75,"column":4},"end":{"line":79,"column":4}}}},"statementMap":{"1":{"start":{"line":34,"column":8},"end":{"line":34,"column":30}},"2":{"start":{"line":45,"column":8},"end":{"line":45,"column":42}},"3":{"start":{"line":57,"column":8},"end":{"line":57,"column":44}},"4":{"start":{"line":68,"column":8},"end":{"line":68,"column":36}},"5":{"start":{"line":78,"column":8},"end":{"line":78,"column":44}}},"branchMap":{"1":{"line":22,"type":"if","locations":[{"start":{"line":22,"column":61},"end":{"line":22,"column":61}},{"start":{"line":22,"column":61},"end":{"line":22,"column":61}}]},"2":{"line":33,"type":"if","locations":[{"start":{"line":33,"column":51},"end":{"line":33,"column":51}},{"start":{"line":33,"column":51},"end":{"line":33,"column":51}}]},"3":{"line":44,"type":"if","locations":[{"start":{"line":44,"column":13},"end":{"line":44,"column":13}},{"start":{"line":44,"column":13},"end":{"line":44,"column":13}}]},"4":{"line":56,"type":"if","locations":[{"start":{"line":56,"column":13},"end":{"line":56,"column":13}},{"start":{"line":56,"column":13},"end":{"line":56,"column":13}}]},"5":{"line":67,"type":"if","locations":[{"start":{"line":67,"column":13},"end":{"line":67,"column":13}},{"start":{"line":67,"column":13},"end":{"line":67,"column":13}}]},"6":{"line":77,"type":"if","locations":[{"start":{"line":77,"column":13},"end":{"line":77,"column":13}},{"start":{"line":77,"column":13},"end":{"line":77,"column":13}}]}}}, -"contracts/modules/wrapper/extensions/MetaTxModule.sol":{"l":{},"path":"/home/ryan/Downloads/CM/CMTAT_old2/contracts/modules/wrapper/extensions/MetaTxModule.sol","s":{},"b":{},"f":{"1":398},"fnMap":{"1":{"name":"constructor","line":19,"loc":{"start":{"line":17,"column":4},"end":{"line":21,"column":4}}}},"statementMap":{},"branchMap":{}}, -"contracts/test/proxy/CMTAT_PROXY_TEST_UUPS.sol":{"l":{},"path":"/home/ryan/Downloads/CM/CMTAT_old2/contracts/test/proxy/CMTAT_PROXY_TEST_UUPS.sol","s":{},"b":{},"f":{"1":3},"fnMap":{"1":{"name":"constructor","line":18,"loc":{"start":{"line":16,"column":4},"end":{"line":20,"column":4}}}},"statementMap":{},"branchMap":{}}, -"contracts/test/proxy/CMTAT_PROXY_TEST.sol":{"l":{},"path":"/home/ryan/Downloads/CM/CMTAT_old2/contracts/test/proxy/CMTAT_PROXY_TEST.sol","s":{},"b":{},"f":{"1":1},"fnMap":{"1":{"name":"constructor","line":18,"loc":{"start":{"line":16,"column":4},"end":{"line":20,"column":4}}}},"statementMap":{},"branchMap":{}}} +"contracts/CMTAT_PROXY_UUPS.sol":{"l":{"22":9,"42":5,"46":5},"path":"/home/ryan/Downloads/CM/CMTAT/contracts/CMTAT_PROXY_UUPS.sol","s":{"1":9,"2":5,"3":5},"b":{"1":[5,0],"2":[2,1]},"f":{"1":9,"2":5,"3":2},"fnMap":{"1":{"name":"constructor","line":20,"loc":{"start":{"line":18,"column":4},"end":{"line":23,"column":4}}},"2":{"name":"initialize","line":41,"loc":{"start":{"line":38,"column":4},"end":{"line":47,"column":4}}},"3":{"name":"_authorizeUpgrade","line":53,"loc":{"start":{"line":53,"column":4},"end":{"line":53,"column":88}}}},"statementMap":{"1":{"start":{"line":22,"column":8},"end":{"line":22,"column":29}},"2":{"start":{"line":42,"column":8},"end":{"line":42,"column":1706}},"3":{"start":{"line":46,"column":8},"end":{"line":46,"column":41}}},"branchMap":{"1":{"line":41,"type":"if","locations":[{"start":{"line":41,"column":67},"end":{"line":41,"column":67}},{"start":{"line":41,"column":67},"end":{"line":41,"column":67}}]},"2":{"line":53,"type":"if","locations":[{"start":{"line":53,"column":58},"end":{"line":53,"column":58}},{"start":{"line":53,"column":58},"end":{"line":53,"column":58}}]}}}, +"contracts/CMTAT_PROXY.sol":{"l":{"21":198},"path":"/home/ryan/Downloads/CM/CMTAT/contracts/CMTAT_PROXY.sol","s":{"1":198},"b":{},"f":{"1":198},"fnMap":{"1":{"name":"constructor","line":19,"loc":{"start":{"line":17,"column":4},"end":{"line":22,"column":4}}}},"statementMap":{"1":{"start":{"line":21,"column":8},"end":{"line":21,"column":29}}},"branchMap":{}}, +"contracts/CMTAT_STANDALONE.sol":{"l":{"30":191},"path":"/home/ryan/Downloads/CM/CMTAT/contracts/CMTAT_STANDALONE.sol","s":{"1":191},"b":{},"f":{"1":191},"fnMap":{"1":{"name":"constructor","line":27,"loc":{"start":{"line":21,"column":4},"end":{"line":36,"column":4}}}},"statementMap":{"1":{"start":{"line":30,"column":8},"end":{"line":30,"column":1113}}},"branchMap":{}}, +"contracts/deployment/CMTAT_BEACON_FACTORY.sol":{"l":{"23":7,"24":1,"26":6,"28":1,"30":6,"45":3,"46":3,"49":3,"50":3,"62":2,"65":2,"73":1,"84":3,"85":3,"86":3,"87":3,"88":3,"89":3,"90":3,"100":5,"107":5},"path":"/home/ryan/Downloads/CM/CMTAT/contracts/deployment/CMTAT_BEACON_FACTORY.sol","s":{"1":7,"2":6,"3":3,"4":3,"5":3,"6":2,"7":2,"8":1,"9":3,"10":3,"11":3,"12":3,"13":5},"b":{"1":[1,6],"2":[1,5],"3":[3,1]},"f":{"1":7,"2":3,"3":2,"4":1,"5":3,"6":5},"fnMap":{"1":{"name":"constructor","line":22,"loc":{"start":{"line":22,"column":4},"end":{"line":31,"column":4}}},"2":{"name":"deployCMTAT","line":44,"loc":{"start":{"line":40,"column":4},"end":{"line":51,"column":4}}},"3":{"name":"computedProxyAddress","line":58,"loc":{"start":{"line":58,"column":4},"end":{"line":66,"column":4}}},"4":{"name":"implementation","line":72,"loc":{"start":{"line":72,"column":4},"end":{"line":74,"column":4}}},"5":{"name":"_deployBytecode","line":83,"loc":{"start":{"line":83,"column":4},"end":{"line":91,"column":5}}},"6":{"name":"_getBytecode","line":97,"loc":{"start":{"line":97,"column":5},"end":{"line":108,"column":5}}}},"statementMap":{"1":{"start":{"line":23,"column":8},"end":{"line":23,"column":785}},"2":{"start":{"line":26,"column":8},"end":{"line":26,"column":921}},"3":{"start":{"line":45,"column":8},"end":{"line":45,"column":86}},"4":{"start":{"line":46,"column":8},"end":{"line":46,"column":1776}},"5":{"start":{"line":50,"column":8},"end":{"line":50,"column":20}},"6":{"start":{"line":62,"column":8},"end":{"line":62,"column":2354}},"7":{"start":{"line":65,"column":8},"end":{"line":65,"column":91}},"8":{"start":{"line":73,"column":8},"end":{"line":73,"column":38}},"9":{"start":{"line":84,"column":20},"end":{"line":84,"column":86}},"10":{"start":{"line":87,"column":20},"end":{"line":87,"column":62}},"11":{"start":{"line":89,"column":20},"end":{"line":89,"column":50}},"12":{"start":{"line":90,"column":20},"end":{"line":90,"column":32}},"13":{"start":{"line":100,"column":8},"end":{"line":100,"column":3793}}},"branchMap":{"1":{"line":23,"type":"if","locations":[{"start":{"line":23,"column":8},"end":{"line":23,"column":8}},{"start":{"line":23,"column":8},"end":{"line":23,"column":8}}]},"2":{"line":26,"type":"if","locations":[{"start":{"line":26,"column":8},"end":{"line":26,"column":8}},{"start":{"line":26,"column":8},"end":{"line":26,"column":8}}]},"3":{"line":44,"type":"if","locations":[{"start":{"line":44,"column":13},"end":{"line":44,"column":13}},{"start":{"line":44,"column":13},"end":{"line":44,"column":13}}]}}}, +"contracts/deployment/CMTAT_TP_FACTORY.sol":{"l":{"36":7,"37":5,"40":5,"42":5,"56":2,"59":2,"72":5,"73":5,"74":5,"75":5,"76":5,"77":5,"78":5,"88":7,"95":7},"path":"/home/ryan/Downloads/CM/CMTAT/contracts/deployment/CMTAT_TP_FACTORY.sol","s":{"1":7,"2":5,"3":5,"4":2,"5":2,"6":5,"7":5,"8":5,"9":5,"10":7},"b":{"1":[7,2]},"f":{"1":9,"2":7,"3":2,"4":5,"5":7},"fnMap":{"1":{"name":"constructor","line":22,"loc":{"start":{"line":22,"column":4},"end":{"line":22,"column":129}}},"2":{"name":"deployCMTAT","line":35,"loc":{"start":{"line":30,"column":4},"end":{"line":43,"column":4}}},"3":{"name":"computedProxyAddress","line":51,"loc":{"start":{"line":51,"column":4},"end":{"line":60,"column":4}}},"4":{"name":"_deployBytecode","line":71,"loc":{"start":{"line":71,"column":4},"end":{"line":79,"column":5}}},"5":{"name":"_getBytecode","line":85,"loc":{"start":{"line":85,"column":5},"end":{"line":96,"column":5}}}},"statementMap":{"1":{"start":{"line":36,"column":8},"end":{"line":36,"column":86}},"2":{"start":{"line":37,"column":8},"end":{"line":37,"column":1404}},"3":{"start":{"line":42,"column":8},"end":{"line":42,"column":20}},"4":{"start":{"line":56,"column":8},"end":{"line":56,"column":2088}},"5":{"start":{"line":59,"column":8},"end":{"line":59,"column":91}},"6":{"start":{"line":72,"column":20},"end":{"line":72,"column":86}},"7":{"start":{"line":75,"column":20},"end":{"line":75,"column":62}},"8":{"start":{"line":77,"column":20},"end":{"line":77,"column":50}},"9":{"start":{"line":78,"column":20},"end":{"line":78,"column":32}},"10":{"start":{"line":88,"column":8},"end":{"line":88,"column":3379}}},"branchMap":{"1":{"line":35,"type":"if","locations":[{"start":{"line":35,"column":13},"end":{"line":35,"column":13}},{"start":{"line":35,"column":13},"end":{"line":35,"column":13}}]}}}, +"contracts/deployment/CMTAT_UUPS_FACTORY.sol":{"l":{"35":2,"36":2,"39":2,"41":2,"53":2,"56":2,"67":2,"68":2,"69":2,"70":2,"71":2,"72":2,"73":2,"83":4,"90":4},"path":"/home/ryan/Downloads/CM/CMTAT/contracts/deployment/CMTAT_UUPS_FACTORY.sol","s":{"1":2,"2":2,"3":2,"4":2,"5":2,"6":2,"7":2,"8":2,"9":2,"10":4},"b":{"1":[2,1]},"f":{"1":5,"2":2,"3":2,"4":2,"5":4},"fnMap":{"1":{"name":"constructor","line":21,"loc":{"start":{"line":21,"column":4},"end":{"line":21,"column":129}}},"2":{"name":"deployCMTAT","line":34,"loc":{"start":{"line":30,"column":4},"end":{"line":42,"column":4}}},"3":{"name":"computedProxyAddress","line":49,"loc":{"start":{"line":49,"column":4},"end":{"line":57,"column":4}}},"4":{"name":"_deployBytecode","line":66,"loc":{"start":{"line":66,"column":4},"end":{"line":74,"column":5}}},"5":{"name":"_getBytecode","line":80,"loc":{"start":{"line":80,"column":5},"end":{"line":91,"column":5}}}},"statementMap":{"1":{"start":{"line":35,"column":8},"end":{"line":35,"column":86}},"2":{"start":{"line":36,"column":8},"end":{"line":36,"column":1344}},"3":{"start":{"line":41,"column":8},"end":{"line":41,"column":20}},"4":{"start":{"line":53,"column":8},"end":{"line":53,"column":1931}},"5":{"start":{"line":56,"column":8},"end":{"line":56,"column":91}},"6":{"start":{"line":67,"column":20},"end":{"line":67,"column":86}},"7":{"start":{"line":70,"column":20},"end":{"line":70,"column":62}},"8":{"start":{"line":72,"column":20},"end":{"line":72,"column":50}},"9":{"start":{"line":73,"column":20},"end":{"line":73,"column":32}},"10":{"start":{"line":83,"column":8},"end":{"line":83,"column":3150}}},"branchMap":{"1":{"line":34,"type":"if","locations":[{"start":{"line":34,"column":13},"end":{"line":34,"column":13}},{"start":{"line":34,"column":13},"end":{"line":34,"column":13}}]}}}, +"contracts/deployment/libraries/CMTATFactoryBase.sol":{"l":{"19":16,"20":2,"22":14},"path":"/home/ryan/Downloads/CM/CMTAT/contracts/deployment/libraries/CMTATFactoryBase.sol","s":{"1":16},"b":{"1":[2,14]},"f":{"1":16},"fnMap":{"1":{"name":"constructor","line":18,"loc":{"start":{"line":18,"column":4},"end":{"line":23,"column":4}}}},"statementMap":{"1":{"start":{"line":19,"column":8},"end":{"line":19,"column":575}}},"branchMap":{"1":{"line":19,"type":"if","locations":[{"start":{"line":19,"column":8},"end":{"line":19,"column":8}},{"start":{"line":19,"column":8},"end":{"line":19,"column":8}}]}}}, +"contracts/deployment/libraries/CMTATFactoryInvariant.sol":{"l":{},"path":"/home/ryan/Downloads/CM/CMTAT/contracts/deployment/libraries/CMTATFactoryInvariant.sol","s":{},"b":{},"f":{},"fnMap":{},"statementMap":{},"branchMap":{}}, +"contracts/deployment/libraries/CMTATFactoryRoot.sol":{"l":{"26":25,"27":2,"29":23,"30":13,"32":23,"33":23,"46":14,"59":12,"60":5,"61":2,"63":3,"64":3,"67":7},"path":"/home/ryan/Downloads/CM/CMTAT/contracts/deployment/libraries/CMTATFactoryRoot.sol","s":{"1":25,"2":23,"3":23,"4":23,"5":14,"6":12,"7":5},"b":{"1":[2,23],"2":[13,10],"3":[5,7],"4":[2,3]},"f":{"1":25,"2":14,"3":12},"fnMap":{"1":{"name":"constructor","line":25,"loc":{"start":{"line":25,"column":4},"end":{"line":34,"column":4}}},"2":{"name":"CMTATProxyAddress","line":45,"loc":{"start":{"line":45,"column":4},"end":{"line":47,"column":4}}},"3":{"name":"_checkAndDetermineDeploymentSalt","line":58,"loc":{"start":{"line":58,"column":4},"end":{"line":69,"column":4}}}},"statementMap":{"1":{"start":{"line":26,"column":8},"end":{"line":26,"column":814}},"2":{"start":{"line":29,"column":8},"end":{"line":29,"column":952}},"3":{"start":{"line":32,"column":8},"end":{"line":32,"column":51}},"4":{"start":{"line":33,"column":8},"end":{"line":33,"column":52}},"5":{"start":{"line":46,"column":8},"end":{"line":46,"column":38}},"6":{"start":{"line":59,"column":7},"end":{"line":59,"column":2000}},"7":{"start":{"line":60,"column":12},"end":{"line":60,"column":2035}}},"branchMap":{"1":{"line":26,"type":"if","locations":[{"start":{"line":26,"column":8},"end":{"line":26,"column":8}},{"start":{"line":26,"column":8},"end":{"line":26,"column":8}}]},"2":{"line":29,"type":"if","locations":[{"start":{"line":29,"column":8},"end":{"line":29,"column":8}},{"start":{"line":29,"column":8},"end":{"line":29,"column":8}}]},"3":{"line":59,"type":"if","locations":[{"start":{"line":59,"column":7},"end":{"line":59,"column":7}},{"start":{"line":59,"column":7},"end":{"line":59,"column":7}}]},"4":{"line":60,"type":"if","locations":[{"start":{"line":60,"column":12},"end":{"line":60,"column":12}},{"start":{"line":60,"column":12},"end":{"line":60,"column":12}}]}}}, +"contracts/interfaces/draft-IERC1404/draft-IERC1404.sol":{"l":{},"path":"/home/ryan/Downloads/CM/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404.sol","s":{},"b":{},"f":{},"fnMap":{},"statementMap":{},"branchMap":{}}, +"contracts/interfaces/draft-IERC1404/draft-IERC1404EnumCode.sol":{"l":{},"path":"/home/ryan/Downloads/CM/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404EnumCode.sol","s":{},"b":{},"f":{},"fnMap":{},"statementMap":{},"branchMap":{}}, +"contracts/interfaces/draft-IERC1404/draft-IERC1404Wrapper.sol":{"l":{},"path":"/home/ryan/Downloads/CM/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404Wrapper.sol","s":{},"b":{},"f":{},"fnMap":{},"statementMap":{},"branchMap":{}}, +"contracts/interfaces/engine/draft-IERC1643.sol":{"l":{},"path":"/home/ryan/Downloads/CM/CMTAT/contracts/interfaces/engine/draft-IERC1643.sol","s":{},"b":{},"f":{},"fnMap":{},"statementMap":{},"branchMap":{}}, +"contracts/interfaces/engine/IAuthorizationEngine.sol":{"l":{},"path":"/home/ryan/Downloads/CM/CMTAT/contracts/interfaces/engine/IAuthorizationEngine.sol","s":{},"b":{},"f":{},"fnMap":{},"statementMap":{},"branchMap":{}}, +"contracts/interfaces/engine/IDebtEngine.sol":{"l":{},"path":"/home/ryan/Downloads/CM/CMTAT/contracts/interfaces/engine/IDebtEngine.sol","s":{},"b":{},"f":{},"fnMap":{},"statementMap":{},"branchMap":{}}, +"contracts/interfaces/engine/IDebtGlobal.sol":{"l":{},"path":"/home/ryan/Downloads/CM/CMTAT/contracts/interfaces/engine/IDebtGlobal.sol","s":{},"b":{},"f":{},"fnMap":{},"statementMap":{},"branchMap":{}}, +"contracts/interfaces/engine/IRuleEngine.sol":{"l":{},"path":"/home/ryan/Downloads/CM/CMTAT/contracts/interfaces/engine/IRuleEngine.sol","s":{},"b":{},"f":{},"fnMap":{},"statementMap":{},"branchMap":{}}, +"contracts/interfaces/ICCIPToken.sol":{"l":{},"path":"/home/ryan/Downloads/CM/CMTAT/contracts/interfaces/ICCIPToken.sol","s":{},"b":{},"f":{},"fnMap":{},"statementMap":{},"branchMap":{}}, +"contracts/interfaces/ICMTATConstructor.sol":{"l":{},"path":"/home/ryan/Downloads/CM/CMTAT/contracts/interfaces/ICMTATConstructor.sol","s":{},"b":{},"f":{},"fnMap":{},"statementMap":{},"branchMap":{}}, +"contracts/interfaces/ICMTATSnapshot.sol":{"l":{},"path":"/home/ryan/Downloads/CM/CMTAT/contracts/interfaces/ICMTATSnapshot.sol","s":{},"b":{},"f":{},"fnMap":{},"statementMap":{},"branchMap":{}}, +"contracts/libraries/Errors.sol":{"l":{},"path":"/home/ryan/Downloads/CM/CMTAT/contracts/libraries/Errors.sol","s":{},"b":{},"f":{},"fnMap":{},"statementMap":{},"branchMap":{}}, +"contracts/libraries/FactoryErrors.sol":{"l":{},"path":"/home/ryan/Downloads/CM/CMTAT/contracts/libraries/FactoryErrors.sol","s":{},"b":{},"f":{},"fnMap":{},"statementMap":{},"branchMap":{}}, +"contracts/modules/CMTAT_BASE.sol":{"l":{"65":385,"85":385,"86":385,"88":385,"90":385,"91":385,"94":385,"99":385,"100":385,"102":385,"106":385,"107":383,"108":383,"110":383,"111":383,"113":383,"114":383,"120":383,"121":383,"122":383,"125":383,"128":383,"150":2,"163":10,"178":6,"179":4,"194":439,"195":17,"202":422,"203":422,"217":1391,"226":1391,"238":0},"path":"/home/ryan/Downloads/CM/CMTAT/contracts/modules/CMTAT_BASE.sol","s":{"1":385,"2":385,"3":385,"4":385,"5":385,"6":385,"7":385,"8":385,"9":385,"10":385,"11":385,"12":383,"13":383,"14":383,"15":383,"16":383,"17":383,"18":383,"19":383,"20":383,"21":383,"22":383,"23":2,"24":10,"25":6,"26":4,"27":439,"28":422,"29":422,"30":1391,"31":1391,"32":0},"b":{"1":[385,1],"2":[385,0],"3":[383,0],"4":[17,422]},"f":{"1":385,"2":385,"3":383,"4":2,"5":10,"6":6,"7":439,"8":1391,"9":1391,"10":0},"fnMap":{"1":{"name":"initialize","line":64,"loc":{"start":{"line":59,"column":4},"end":{"line":71,"column":4}}},"2":{"name":"__CMTAT_init","line":82,"loc":{"start":{"line":77,"column":4},"end":{"line":129,"column":4}}},"3":{"name":"__CMTAT_init_unchained","line":131,"loc":{"start":{"line":131,"column":4},"end":{"line":133,"column":4}}},"4":{"name":"decimals","line":143,"loc":{"start":{"line":143,"column":4},"end":{"line":151,"column":4}}},"5":{"name":"transferFrom","line":153,"loc":{"start":{"line":153,"column":4},"end":{"line":164,"column":4}}},"6":{"name":"burnAndMint","line":177,"loc":{"start":{"line":177,"column":4},"end":{"line":180,"column":4}}},"7":{"name":"_update","line":189,"loc":{"start":{"line":189,"column":4},"end":{"line":204,"column":4}}},"8":{"name":"_msgSender","line":211,"loc":{"start":{"line":211,"column":4},"end":{"line":218,"column":4}}},"9":{"name":"_contextSuffixLength","line":223,"loc":{"start":{"line":223,"column":4},"end":{"line":227,"column":4}}},"10":{"name":"_msgData","line":232,"loc":{"start":{"line":232,"column":4},"end":{"line":239,"column":4}}}},"statementMap":{"1":{"start":{"line":65,"column":8},"end":{"line":65,"column":2165}},"2":{"start":{"line":85,"column":8},"end":{"line":85,"column":33}},"3":{"start":{"line":86,"column":8},"end":{"line":86,"column":99}},"4":{"start":{"line":88,"column":8},"end":{"line":88,"column":32}},"5":{"start":{"line":90,"column":8},"end":{"line":90,"column":39}},"6":{"start":{"line":91,"column":8},"end":{"line":91,"column":34}},"7":{"start":{"line":94,"column":8},"end":{"line":94,"column":37}},"8":{"start":{"line":99,"column":8},"end":{"line":99,"column":44}},"9":{"start":{"line":100,"column":8},"end":{"line":100,"column":39}},"10":{"start":{"line":102,"column":8},"end":{"line":102,"column":56}},"11":{"start":{"line":106,"column":8},"end":{"line":106,"column":81}},"12":{"start":{"line":107,"column":8},"end":{"line":107,"column":41}},"13":{"start":{"line":108,"column":8},"end":{"line":108,"column":41}},"14":{"start":{"line":110,"column":8},"end":{"line":110,"column":43}},"15":{"start":{"line":111,"column":8},"end":{"line":111,"column":77}},"16":{"start":{"line":113,"column":8},"end":{"line":113,"column":37}},"17":{"start":{"line":114,"column":8},"end":{"line":114,"column":42}},"18":{"start":{"line":120,"column":8},"end":{"line":120,"column":45}},"19":{"start":{"line":121,"column":8},"end":{"line":121,"column":64}},"20":{"start":{"line":122,"column":8},"end":{"line":122,"column":56}},"21":{"start":{"line":125,"column":8},"end":{"line":125,"column":123}},"22":{"start":{"line":128,"column":8},"end":{"line":128,"column":31}},"23":{"start":{"line":150,"column":8},"end":{"line":150,"column":41}},"24":{"start":{"line":163,"column":8},"end":{"line":163,"column":70}},"25":{"start":{"line":178,"column":8},"end":{"line":178,"column":39}},"26":{"start":{"line":179,"column":8},"end":{"line":179,"column":29}},"27":{"start":{"line":194,"column":8},"end":{"line":194,"column":6702}},"28":{"start":{"line":202,"column":8},"end":{"line":202,"column":60}},"29":{"start":{"line":203,"column":8},"end":{"line":203,"column":49}},"30":{"start":{"line":217,"column":8},"end":{"line":217,"column":53}},"31":{"start":{"line":226,"column":9},"end":{"line":226,"column":64}},"32":{"start":{"line":238,"column":8},"end":{"line":238,"column":51}}},"branchMap":{"1":{"line":64,"type":"if","locations":[{"start":{"line":64,"column":21},"end":{"line":64,"column":21}},{"start":{"line":64,"column":21},"end":{"line":64,"column":21}}]},"2":{"line":82,"type":"if","locations":[{"start":{"line":82,"column":15},"end":{"line":82,"column":15}},{"start":{"line":82,"column":15},"end":{"line":82,"column":15}}]},"3":{"line":131,"type":"if","locations":[{"start":{"line":131,"column":47},"end":{"line":131,"column":47}},{"start":{"line":131,"column":47},"end":{"line":131,"column":47}}]},"4":{"line":194,"type":"if","locations":[{"start":{"line":194,"column":8},"end":{"line":194,"column":8}},{"start":{"line":194,"column":8},"end":{"line":194,"column":8}}]}}}, +"contracts/modules/internal/base/SnapshotModuleBase.sol":{"l":{"83":2,"84":2,"92":76,"93":76,"95":76,"96":68,"101":68,"102":48,"105":20,"107":8,"110":8,"112":8,"113":8,"120":28,"132":170,"134":170,"136":168,"138":94,"141":94,"142":2,"148":2,"151":164,"152":164,"159":12,"160":12,"161":10,"163":10,"164":2,"167":8,"168":2,"170":6,"173":6,"174":10,"175":10,"176":10,"179":6,"181":8,"188":22,"190":22,"191":20,"192":18,"193":2,"195":16,"196":12,"197":8,"198":8,"199":2,"205":2,"208":8,"209":4,"210":2,"216":6,"218":6,"225":14,"227":14,"228":10,"229":2,"232":8,"233":2,"235":6,"236":6,"246":10,"247":10,"249":10,"251":8,"252":6,"254":8,"282":1920,"284":1920,"285":1484,"287":436,"301":844,"302":844,"303":844,"304":36,"305":36,"315":422,"316":422,"320":422,"321":18,"322":18,"332":844,"333":836,"335":8,"346":36,"347":36,"348":36,"350":36,"354":22,"358":8,"362":6,"375":490,"376":490,"378":490,"382":404,"385":86,"386":86,"388":86,"389":116,"390":52,"391":52,"394":64,"397":86,"406":26,"407":26,"408":6,"410":20,"413":202,"414":6,"421":46,"422":6,"428":4862},"path":"/home/ryan/Downloads/CM/CMTAT/contracts/modules/internal/base/SnapshotModuleBase.sol","s":{"1":2,"2":2,"3":76,"4":76,"5":76,"6":68,"7":68,"8":48,"9":20,"10":8,"11":8,"12":28,"13":170,"14":170,"15":168,"16":94,"17":94,"18":92,"19":164,"20":164,"21":12,"22":12,"23":10,"24":10,"25":8,"26":2,"27":6,"28":6,"29":8,"30":22,"31":22,"32":20,"33":18,"34":16,"35":12,"36":8,"37":8,"38":6,"39":8,"40":4,"41":6,"42":14,"43":14,"44":10,"45":8,"46":6,"47":6,"48":10,"49":10,"50":10,"51":8,"52":8,"53":1920,"54":1920,"55":1484,"56":436,"57":844,"58":844,"59":844,"60":36,"61":36,"62":422,"63":422,"64":422,"65":844,"66":836,"67":8,"68":36,"69":36,"70":36,"71":36,"72":22,"73":14,"74":8,"75":6,"76":490,"77":490,"78":490,"79":404,"80":86,"81":86,"82":116,"83":86,"84":26,"85":26,"86":20,"87":202,"88":46},"b":{"1":[385,0],"2":[68,8],"3":[48,20],"4":[8,12],"5":[94,74],"6":[2,92],"7":[2,90],"8":[2,8],"9":[2,6],"10":[2,16],"11":[8,4],"12":[2,6],"13":[2,4],"14":[4,4],"15":[2,2],"16":[2,8],"17":[2,6],"18":[1484,436],"19":[36,808],"20":[18,404],"21":[836,8],"22":[22,14],"23":[8,6],"24":[404,86],"25":[404,0],"26":[52,64],"27":[6,20],"28":[6,196],"29":[6,40]},"f":{"1":385,"2":2,"3":76,"4":170,"5":12,"6":22,"7":14,"8":10,"9":1920,"10":844,"11":422,"12":844,"13":36,"14":490,"15":26,"16":202,"17":46,"18":4862},"fnMap":{"1":{"name":"__SnapshotModuleBase_init_unchained","line":70,"loc":{"start":{"line":70,"column":4},"end":{"line":73,"column":4}}},"2":{"name":"getAllSnapshots","line":82,"loc":{"start":{"line":82,"column":4},"end":{"line":85,"column":4}}},"3":{"name":"getNextSnapshots","line":91,"loc":{"start":{"line":91,"column":4},"end":{"line":121,"column":4}}},"4":{"name":"_scheduleSnapshot","line":131,"loc":{"start":{"line":131,"column":4},"end":{"line":153,"column":4}}},"5":{"name":"_scheduleSnapshotNotOptimized","line":158,"loc":{"start":{"line":158,"column":4},"end":{"line":182,"column":4}}},"6":{"name":"_rescheduleSnapshot","line":187,"loc":{"start":{"line":187,"column":4},"end":{"line":219,"column":4}}},"7":{"name":"_unscheduleLastSnapshot","line":224,"loc":{"start":{"line":224,"column":4},"end":{"line":237,"column":4}}},"8":{"name":"_unscheduleSnapshotNotOptimized","line":245,"loc":{"start":{"line":245,"column":4},"end":{"line":255,"column":4}}},"9":{"name":"_valueAt","line":264,"loc":{"start":{"line":264,"column":4},"end":{"line":289,"column":4}}},"10":{"name":"_updateSnapshot","line":297,"loc":{"start":{"line":297,"column":4},"end":{"line":307,"column":4}}},"11":{"name":"_setCurrentSnapshot","line":314,"loc":{"start":{"line":314,"column":4},"end":{"line":324,"column":4}}},"12":{"name":"_lastSnapshot","line":329,"loc":{"start":{"line":329,"column":4},"end":{"line":337,"column":4}}},"13":{"name":"_findScheduledSnapshotIndex","line":343,"loc":{"start":{"line":343,"column":4},"end":{"line":364,"column":4}}},"14":{"name":"_findScheduledMostRecentPastSnapshot","line":370,"loc":{"start":{"line":370,"column":4},"end":{"line":398,"column":4}}},"15":{"name":"_findAndRevertScheduledSnapshotIndex","line":403,"loc":{"start":{"line":403,"column":4},"end":{"line":411,"column":4}}},"16":{"name":"_checkTimeInThePast","line":412,"loc":{"start":{"line":412,"column":4},"end":{"line":419,"column":4}}},"17":{"name":"_checkTimeSnapshotAlreadyDone","line":420,"loc":{"start":{"line":420,"column":4},"end":{"line":424,"column":4}}},"18":{"name":"_getSnapshotModuleBaseStorage","line":427,"loc":{"start":{"line":427,"column":4},"end":{"line":431,"column":4}}}},"statementMap":{"1":{"start":{"line":83,"column":8},"end":{"line":83,"column":77}},"2":{"start":{"line":84,"column":8},"end":{"line":84,"column":36}},"3":{"start":{"line":92,"column":8},"end":{"line":92,"column":77}},"4":{"start":{"line":93,"column":8},"end":{"line":93,"column":65}},"5":{"start":{"line":95,"column":8},"end":{"line":95,"column":3657}},"6":{"start":{"line":96,"column":12},"end":{"line":96,"column":3755}},"7":{"start":{"line":101,"column":12},"end":{"line":101,"column":3918}},"8":{"start":{"line":102,"column":16},"end":{"line":102,"column":44}},"9":{"start":{"line":105,"column":16},"end":{"line":105,"column":4128}},"10":{"start":{"line":107,"column":20},"end":{"line":107,"column":4318}},"11":{"start":{"line":112,"column":20},"end":{"line":112,"column":4596}},"12":{"start":{"line":120,"column":8},"end":{"line":120,"column":36}},"13":{"start":{"line":132,"column":8},"end":{"line":132,"column":77}},"14":{"start":{"line":134,"column":7},"end":{"line":134,"column":31}},"15":{"start":{"line":136,"column":8},"end":{"line":136,"column":5453}},"16":{"start":{"line":138,"column":12},"end":{"line":138,"column":5564}},"17":{"start":{"line":141,"column":12},"end":{"line":141,"column":5689}},"18":{"start":{"line":147,"column":19},"end":{"line":147,"column":5942}},"19":{"start":{"line":151,"column":8},"end":{"line":151,"column":39}},"20":{"start":{"line":152,"column":8},"end":{"line":152,"column":38}},"21":{"start":{"line":159,"column":8},"end":{"line":159,"column":77}},"22":{"start":{"line":160,"column":8},"end":{"line":160,"column":32}},"23":{"start":{"line":161,"column":8},"end":{"line":161,"column":73}},"24":{"start":{"line":163,"column":8},"end":{"line":163,"column":6518}},"25":{"start":{"line":167,"column":8},"end":{"line":167,"column":6709}},"26":{"start":{"line":168,"column":12},"end":{"line":168,"column":43}},"27":{"start":{"line":170,"column":12},"end":{"line":170,"column":6833}},"28":{"start":{"line":173,"column":12},"end":{"line":173,"column":6960}},"29":{"start":{"line":181,"column":8},"end":{"line":181,"column":38}},"30":{"start":{"line":188,"column":8},"end":{"line":188,"column":77}},"31":{"start":{"line":190,"column":8},"end":{"line":190,"column":45}},"32":{"start":{"line":191,"column":8},"end":{"line":191,"column":35}},"33":{"start":{"line":192,"column":8},"end":{"line":192,"column":7691}},"34":{"start":{"line":195,"column":8},"end":{"line":195,"column":69}},"35":{"start":{"line":196,"column":8},"end":{"line":196,"column":7891}},"36":{"start":{"line":197,"column":12},"end":{"line":197,"column":71}},"37":{"start":{"line":198,"column":12},"end":{"line":198,"column":8028}},"38":{"start":{"line":204,"column":19},"end":{"line":204,"column":8286}},"39":{"start":{"line":208,"column":8},"end":{"line":208,"column":8425}},"40":{"start":{"line":209,"column":12},"end":{"line":209,"column":8467}},"41":{"start":{"line":218,"column":8},"end":{"line":218,"column":47}},"42":{"start":{"line":225,"column":8},"end":{"line":225,"column":77}},"43":{"start":{"line":227,"column":8},"end":{"line":227,"column":42}},"44":{"start":{"line":228,"column":8},"end":{"line":228,"column":9173}},"45":{"start":{"line":232,"column":8},"end":{"line":232,"column":9373}},"46":{"start":{"line":235,"column":8},"end":{"line":235,"column":34}},"47":{"start":{"line":236,"column":8},"end":{"line":236,"column":37}},"48":{"start":{"line":246,"column":8},"end":{"line":246,"column":77}},"49":{"start":{"line":247,"column":8},"end":{"line":247,"column":42}},"50":{"start":{"line":249,"column":8},"end":{"line":249,"column":66}},"51":{"start":{"line":251,"column":8},"end":{"line":251,"column":10194}},"52":{"start":{"line":254,"column":8},"end":{"line":254,"column":34}},"53":{"start":{"line":282,"column":8},"end":{"line":282,"column":58}},"54":{"start":{"line":284,"column":8},"end":{"line":284,"column":12023}},"55":{"start":{"line":285,"column":12},"end":{"line":285,"column":29}},"56":{"start":{"line":287,"column":12},"end":{"line":287,"column":50}},"57":{"start":{"line":301,"column":8},"end":{"line":301,"column":77}},"58":{"start":{"line":302,"column":8},"end":{"line":302,"column":48}},"59":{"start":{"line":303,"column":8},"end":{"line":303,"column":12661}},"60":{"start":{"line":304,"column":12},"end":{"line":304,"column":38}},"61":{"start":{"line":305,"column":12},"end":{"line":305,"column":46}},"62":{"start":{"line":315,"column":8},"end":{"line":315,"column":77}},"63":{"start":{"line":316,"column":8},"end":{"line":316,"column":13151}},"64":{"start":{"line":320,"column":8},"end":{"line":320,"column":13255}},"65":{"start":{"line":332,"column":8},"end":{"line":332,"column":13609}},"66":{"start":{"line":333,"column":12},"end":{"line":333,"column":20}},"67":{"start":{"line":335,"column":12},"end":{"line":335,"column":38}},"68":{"start":{"line":346,"column":8},"end":{"line":346,"column":77}},"69":{"start":{"line":347,"column":8},"end":{"line":347,"column":71}},"70":{"start":{"line":348,"column":8},"end":{"line":348,"column":72}},"71":{"start":{"line":350,"column":8},"end":{"line":350,"column":14239}},"72":{"start":{"line":354,"column":12},"end":{"line":354,"column":37}},"73":{"start":{"line":357,"column":13},"end":{"line":357,"column":14456}},"74":{"start":{"line":358,"column":12},"end":{"line":358,"column":38}},"75":{"start":{"line":362,"column":12},"end":{"line":362,"column":53}},"76":{"start":{"line":375,"column":8},"end":{"line":375,"column":77}},"77":{"start":{"line":376,"column":8},"end":{"line":376,"column":63}},"78":{"start":{"line":378,"column":8},"end":{"line":378,"column":15173}},"79":{"start":{"line":382,"column":12},"end":{"line":382,"column":40}},"80":{"start":{"line":385,"column":8},"end":{"line":385,"column":26}},"81":{"start":{"line":388,"column":8},"end":{"line":388,"column":15538}},"82":{"start":{"line":389,"column":12},"end":{"line":389,"column":15626}},"83":{"start":{"line":397,"column":8},"end":{"line":397,"column":34}},"84":{"start":{"line":406,"column":8},"end":{"line":406,"column":73}},"85":{"start":{"line":407,"column":8},"end":{"line":407,"column":16172}},"86":{"start":{"line":410,"column":8},"end":{"line":410,"column":20}},"87":{"start":{"line":413,"column":8},"end":{"line":413,"column":16371}},"88":{"start":{"line":421,"column":8},"end":{"line":421,"column":16674}}},"branchMap":{"1":{"line":70,"type":"if","locations":[{"start":{"line":70,"column":60},"end":{"line":70,"column":60}},{"start":{"line":70,"column":60},"end":{"line":70,"column":60}}]},"2":{"line":95,"type":"if","locations":[{"start":{"line":95,"column":8},"end":{"line":95,"column":8}},{"start":{"line":95,"column":8},"end":{"line":95,"column":8}}]},"3":{"line":101,"type":"if","locations":[{"start":{"line":101,"column":12},"end":{"line":101,"column":12}},{"start":{"line":101,"column":12},"end":{"line":101,"column":12}}]},"4":{"line":105,"type":"if","locations":[{"start":{"line":105,"column":16},"end":{"line":105,"column":16}},{"start":{"line":105,"column":16},"end":{"line":105,"column":16}}]},"5":{"line":136,"type":"if","locations":[{"start":{"line":136,"column":8},"end":{"line":136,"column":8}},{"start":{"line":136,"column":8},"end":{"line":136,"column":8}}]},"6":{"line":141,"type":"if","locations":[{"start":{"line":141,"column":12},"end":{"line":141,"column":12}},{"start":{"line":141,"column":12},"end":{"line":141,"column":12}}]},"7":{"line":147,"type":"if","locations":[{"start":{"line":147,"column":19},"end":{"line":147,"column":19}},{"start":{"line":147,"column":19},"end":{"line":147,"column":19}}]},"8":{"line":163,"type":"if","locations":[{"start":{"line":163,"column":8},"end":{"line":163,"column":8}},{"start":{"line":163,"column":8},"end":{"line":163,"column":8}}]},"9":{"line":167,"type":"if","locations":[{"start":{"line":167,"column":8},"end":{"line":167,"column":8}},{"start":{"line":167,"column":8},"end":{"line":167,"column":8}}]},"10":{"line":192,"type":"if","locations":[{"start":{"line":192,"column":8},"end":{"line":192,"column":8}},{"start":{"line":192,"column":8},"end":{"line":192,"column":8}}]},"11":{"line":196,"type":"if","locations":[{"start":{"line":196,"column":8},"end":{"line":196,"column":8}},{"start":{"line":196,"column":8},"end":{"line":196,"column":8}}]},"12":{"line":198,"type":"if","locations":[{"start":{"line":198,"column":12},"end":{"line":198,"column":12}},{"start":{"line":198,"column":12},"end":{"line":198,"column":12}}]},"13":{"line":204,"type":"if","locations":[{"start":{"line":204,"column":19},"end":{"line":204,"column":19}},{"start":{"line":204,"column":19},"end":{"line":204,"column":19}}]},"14":{"line":208,"type":"if","locations":[{"start":{"line":208,"column":8},"end":{"line":208,"column":8}},{"start":{"line":208,"column":8},"end":{"line":208,"column":8}}]},"15":{"line":209,"type":"if","locations":[{"start":{"line":209,"column":12},"end":{"line":209,"column":12}},{"start":{"line":209,"column":12},"end":{"line":209,"column":12}}]},"16":{"line":228,"type":"if","locations":[{"start":{"line":228,"column":8},"end":{"line":228,"column":8}},{"start":{"line":228,"column":8},"end":{"line":228,"column":8}}]},"17":{"line":232,"type":"if","locations":[{"start":{"line":232,"column":8},"end":{"line":232,"column":8}},{"start":{"line":232,"column":8},"end":{"line":232,"column":8}}]},"18":{"line":284,"type":"if","locations":[{"start":{"line":284,"column":8},"end":{"line":284,"column":8}},{"start":{"line":284,"column":8},"end":{"line":284,"column":8}}]},"19":{"line":303,"type":"if","locations":[{"start":{"line":303,"column":8},"end":{"line":303,"column":8}},{"start":{"line":303,"column":8},"end":{"line":303,"column":8}}]},"20":{"line":320,"type":"if","locations":[{"start":{"line":320,"column":8},"end":{"line":320,"column":8}},{"start":{"line":320,"column":8},"end":{"line":320,"column":8}}]},"21":{"line":332,"type":"if","locations":[{"start":{"line":332,"column":8},"end":{"line":332,"column":8}},{"start":{"line":332,"column":8},"end":{"line":332,"column":8}}]},"22":{"line":350,"type":"if","locations":[{"start":{"line":350,"column":8},"end":{"line":350,"column":8}},{"start":{"line":350,"column":8},"end":{"line":350,"column":8}}]},"23":{"line":357,"type":"if","locations":[{"start":{"line":357,"column":13},"end":{"line":357,"column":13}},{"start":{"line":357,"column":13},"end":{"line":357,"column":13}}]},"24":{"line":378,"type":"if","locations":[{"start":{"line":378,"column":8},"end":{"line":378,"column":8}},{"start":{"line":378,"column":8},"end":{"line":378,"column":8}}]},"25":{"line":379,"type":"cond-expr","locations":[{"start":{"line":379,"column":12},"end":{"line":379,"column":32}},{"start":{"line":380,"column":12},"end":{"line":380,"column":77}}]},"26":{"line":389,"type":"if","locations":[{"start":{"line":389,"column":12},"end":{"line":389,"column":12}},{"start":{"line":389,"column":12},"end":{"line":389,"column":12}}]},"27":{"line":407,"type":"if","locations":[{"start":{"line":407,"column":8},"end":{"line":407,"column":8}},{"start":{"line":407,"column":8},"end":{"line":407,"column":8}}]},"28":{"line":413,"type":"if","locations":[{"start":{"line":413,"column":8},"end":{"line":413,"column":8}},{"start":{"line":413,"column":8},"end":{"line":413,"column":8}}]},"29":{"line":421,"type":"if","locations":[{"start":{"line":421,"column":8},"end":{"line":421,"column":8}},{"start":{"line":421,"column":8},"end":{"line":421,"column":8}}]}}}, +"contracts/modules/internal/EnforcementModuleInternal.sol":{"l":{"65":946,"66":946,"83":22,"84":22,"85":2,"87":20,"88":20,"89":20,"101":8,"102":8,"103":2,"105":6,"106":6,"108":6,"113":976},"path":"/home/ryan/Downloads/CM/CMTAT/contracts/modules/internal/EnforcementModuleInternal.sol","s":{"1":946,"2":946,"3":22,"4":22,"5":2,"6":20,"7":20,"8":8,"9":8,"10":2,"11":6,"12":6},"b":{"1":[385,0],"2":[2,20],"3":[2,6]},"f":{"1":385,"2":946,"3":22,"4":8,"5":976},"fnMap":{"1":{"name":"__Enforcement_init_unchained","line":53,"loc":{"start":{"line":53,"column":4},"end":{"line":55,"column":4}}},"2":{"name":"frozen","line":64,"loc":{"start":{"line":64,"column":4},"end":{"line":67,"column":4}}},"3":{"name":"_freeze","line":79,"loc":{"start":{"line":79,"column":4},"end":{"line":90,"column":4}}},"4":{"name":"_unfreeze","line":97,"loc":{"start":{"line":97,"column":4},"end":{"line":109,"column":4}}},"5":{"name":"_getEnforcementModuleInternalStorage","line":112,"loc":{"start":{"line":112,"column":4},"end":{"line":116,"column":4}}}},"statementMap":{"1":{"start":{"line":65,"column":8},"end":{"line":65,"column":91}},"2":{"start":{"line":66,"column":8},"end":{"line":66,"column":33}},"3":{"start":{"line":83,"column":8},"end":{"line":83,"column":91}},"4":{"start":{"line":84,"column":8},"end":{"line":84,"column":2789}},"5":{"start":{"line":85,"column":12},"end":{"line":85,"column":24}},"6":{"start":{"line":88,"column":8},"end":{"line":88,"column":58}},"7":{"start":{"line":89,"column":8},"end":{"line":89,"column":19}},"8":{"start":{"line":101,"column":8},"end":{"line":101,"column":91}},"9":{"start":{"line":102,"column":8},"end":{"line":102,"column":3351}},"10":{"start":{"line":103,"column":12},"end":{"line":103,"column":24}},"11":{"start":{"line":106,"column":8},"end":{"line":106,"column":60}},"12":{"start":{"line":108,"column":8},"end":{"line":108,"column":19}}},"branchMap":{"1":{"line":53,"type":"if","locations":[{"start":{"line":53,"column":53},"end":{"line":53,"column":53}},{"start":{"line":53,"column":53},"end":{"line":53,"column":53}}]},"2":{"line":84,"type":"if","locations":[{"start":{"line":84,"column":8},"end":{"line":84,"column":8}},{"start":{"line":84,"column":8},"end":{"line":84,"column":8}}]},"3":{"line":102,"type":"if","locations":[{"start":{"line":102,"column":8},"end":{"line":102,"column":8}},{"start":{"line":102,"column":8},"end":{"line":102,"column":8}}]}}}, +"contracts/modules/internal/ERC20SnapshotModuleInternal.sol":{"l":{"35":480,"36":480,"44":160,"45":160,"46":480,"48":160,"56":80,"57":80,"58":80,"59":80,"71":1200,"72":1200,"77":1200,"86":720,"87":720,"91":720,"106":422,"107":422,"109":77,"110":77,"112":43,"115":34,"119":345,"120":345,"128":465,"129":465,"136":379,"137":379},"path":"/home/ryan/Downloads/CM/CMTAT/contracts/modules/internal/ERC20SnapshotModuleInternal.sol","s":{"1":160,"2":80,"3":1200,"4":1200,"5":1200,"6":720,"7":720,"8":720,"9":422,"10":422,"11":77,"12":77,"13":43,"14":34,"15":345,"16":345,"17":465,"18":465,"19":379,"20":379},"b":{"1":[385,0],"2":[400,800],"3":[36,684],"4":[77,345],"5":[43,34]},"f":{"1":385,"2":480,"3":160,"4":80,"5":1200,"6":720,"7":422,"8":465,"9":379},"fnMap":{"1":{"name":"__ERC20Snapshot_init_unchained","line":21,"loc":{"start":{"line":21,"column":4},"end":{"line":24,"column":4}}},"2":{"name":"snapshotInfo","line":34,"loc":{"start":{"line":34,"column":4},"end":{"line":37,"column":4}}},"3":{"name":"snapshotInfoBatch","line":43,"loc":{"start":{"line":43,"column":4},"end":{"line":49,"column":4}}},"4":{"name":"snapshotInfoBatch","line":55,"loc":{"start":{"line":55,"column":4},"end":{"line":61,"column":4}}},"5":{"name":"snapshotBalanceOf","line":67,"loc":{"start":{"line":67,"column":4},"end":{"line":78,"column":4}}},"6":{"name":"snapshotTotalSupply","line":85,"loc":{"start":{"line":85,"column":4},"end":{"line":92,"column":4}}},"7":{"name":"_snapshotUpdate","line":102,"loc":{"start":{"line":102,"column":4},"end":{"line":122,"column":4}}},"8":{"name":"_updateAccountSnapshot","line":127,"loc":{"start":{"line":127,"column":4},"end":{"line":130,"column":4}}},"9":{"name":"_updateTotalSupplySnapshot","line":135,"loc":{"start":{"line":135,"column":4},"end":{"line":138,"column":4}}}},"statementMap":{"1":{"start":{"line":45,"column":8},"end":{"line":45,"column":2070}},"2":{"start":{"line":58,"column":8},"end":{"line":58,"column":2733}},"3":{"start":{"line":71,"column":8},"end":{"line":71,"column":77}},"4":{"start":{"line":72,"column":8},"end":{"line":72,"column":3316}},"5":{"start":{"line":77,"column":8},"end":{"line":77,"column":53}},"6":{"start":{"line":86,"column":8},"end":{"line":86,"column":77}},"7":{"start":{"line":87,"column":8},"end":{"line":87,"column":3868}},"8":{"start":{"line":91,"column":8},"end":{"line":91,"column":50}},"9":{"start":{"line":106,"column":8},"end":{"line":106,"column":28}},"10":{"start":{"line":107,"column":8},"end":{"line":107,"column":4593}},"11":{"start":{"line":109,"column":12},"end":{"line":109,"column":39}},"12":{"start":{"line":110,"column":12},"end":{"line":110,"column":4719}},"13":{"start":{"line":112,"column":16},"end":{"line":112,"column":41}},"14":{"start":{"line":115,"column":16},"end":{"line":115,"column":43}},"15":{"start":{"line":119,"column":12},"end":{"line":119,"column":37}},"16":{"start":{"line":120,"column":12},"end":{"line":120,"column":39}},"17":{"start":{"line":128,"column":8},"end":{"line":128,"column":77}},"18":{"start":{"line":129,"column":8},"end":{"line":129,"column":79}},"19":{"start":{"line":136,"column":8},"end":{"line":136,"column":77}},"20":{"start":{"line":137,"column":8},"end":{"line":137,"column":62}}},"branchMap":{"1":{"line":21,"type":"if","locations":[{"start":{"line":21,"column":55},"end":{"line":21,"column":55}},{"start":{"line":21,"column":55},"end":{"line":21,"column":55}}]},"2":{"line":77,"type":"if","locations":[{"start":{"line":77,"column":29},"end":{"line":77,"column":33}},{"start":{"line":77,"column":37},"end":{"line":77,"column":52}}]},"3":{"line":91,"type":"if","locations":[{"start":{"line":91,"column":29},"end":{"line":91,"column":33}},{"start":{"line":91,"column":37},"end":{"line":91,"column":49}}]},"4":{"line":107,"type":"if","locations":[{"start":{"line":107,"column":8},"end":{"line":107,"column":8}},{"start":{"line":107,"column":8},"end":{"line":107,"column":8}}]},"5":{"line":110,"type":"if","locations":[{"start":{"line":110,"column":12},"end":{"line":110,"column":12}},{"start":{"line":110,"column":12},"end":{"line":110,"column":12}}]}}}, +"contracts/modules/internal/ValidationModuleInternal.sol":{"l":{"33":385,"34":18,"35":18,"36":18,"46":32,"47":32,"63":12,"64":12,"73":6,"74":6,"85":6,"86":6,"90":60,"91":60,"97":629},"path":"/home/ryan/Downloads/CM/CMTAT/contracts/modules/internal/ValidationModuleInternal.sol","s":{"1":385,"2":18,"3":18,"4":32,"5":32,"6":12,"7":12,"8":6,"9":6,"10":6,"11":6,"12":60,"13":60},"b":{"1":[385,0],"2":[18,367]},"f":{"1":385,"2":32,"3":12,"4":6,"5":6,"6":60,"7":629},"fnMap":{"1":{"name":"__Validation_init_unchained","line":32,"loc":{"start":{"line":30,"column":4},"end":{"line":38,"column":4}}},"2":{"name":"ruleEngine","line":45,"loc":{"start":{"line":45,"column":4},"end":{"line":48,"column":4}}},"3":{"name":"_validateTransfer","line":58,"loc":{"start":{"line":58,"column":4},"end":{"line":65,"column":4}}},"4":{"name":"_messageForTransferRestriction","line":70,"loc":{"start":{"line":70,"column":4},"end":{"line":75,"column":4}}},"5":{"name":"_detectTransferRestriction","line":80,"loc":{"start":{"line":80,"column":4},"end":{"line":87,"column":4}}},"6":{"name":"_operateOnTransfer","line":89,"loc":{"start":{"line":89,"column":4},"end":{"line":92,"column":4}}},"7":{"name":"_getValidationModuleInternalStorage","line":96,"loc":{"start":{"line":96,"column":4},"end":{"line":100,"column":4}}}},"statementMap":{"1":{"start":{"line":33,"column":8},"end":{"line":33,"column":1219}},"2":{"start":{"line":34,"column":12},"end":{"line":34,"column":93}},"3":{"start":{"line":36,"column":12},"end":{"line":36,"column":40}},"4":{"start":{"line":46,"column":8},"end":{"line":46,"column":89}},"5":{"start":{"line":47,"column":8},"end":{"line":47,"column":28}},"6":{"start":{"line":63,"column":8},"end":{"line":63,"column":89}},"7":{"start":{"line":64,"column":8},"end":{"line":64,"column":63}},"8":{"start":{"line":73,"column":8},"end":{"line":73,"column":89}},"9":{"start":{"line":74,"column":8},"end":{"line":74,"column":75}},"10":{"start":{"line":85,"column":8},"end":{"line":85,"column":89}},"11":{"start":{"line":86,"column":8},"end":{"line":86,"column":72}},"12":{"start":{"line":90,"column":8},"end":{"line":90,"column":89}},"13":{"start":{"line":91,"column":8},"end":{"line":91,"column":64}}},"branchMap":{"1":{"line":32,"type":"if","locations":[{"start":{"line":32,"column":15},"end":{"line":32,"column":15}},{"start":{"line":32,"column":15},"end":{"line":32,"column":15}}]},"2":{"line":33,"type":"if","locations":[{"start":{"line":33,"column":8},"end":{"line":33,"column":8}},{"start":{"line":33,"column":8},"end":{"line":33,"column":8}}]}}}, +"contracts/modules/security/AuthorizationModule.sol":{"l":{"32":385,"33":2,"35":383,"36":383,"37":16,"38":16,"39":16,"49":2,"50":2,"61":16,"62":16,"63":4,"65":12,"66":12,"70":40,"71":40,"72":8,"73":8,"75":4,"78":36,"82":10,"83":10,"84":8,"85":8,"87":4,"90":6,"101":1285,"102":760,"104":525,"115":84},"path":"/home/ryan/Downloads/CM/CMTAT/contracts/modules/security/AuthorizationModule.sol","s":{"1":385,"2":383,"3":383,"4":16,"5":16,"6":2,"7":2,"8":16,"9":16,"10":12,"11":40,"12":40,"13":8,"14":8,"15":36,"16":10,"17":10,"18":8,"19":8,"20":6,"21":1285,"22":760,"23":525},"b":{"1":[385,0],"2":[2,383],"3":[16,367],"4":[16,4],"5":[4,12],"6":[40,2],"7":[8,32],"8":[4,4],"9":[10,2],"10":[8,2],"11":[4,4],"12":[760,525]},"f":{"1":385,"2":2,"3":16,"4":40,"5":10,"6":1285,"7":84},"fnMap":{"1":{"name":"__AuthorizationModule_init_unchained","line":31,"loc":{"start":{"line":30,"column":4},"end":{"line":41,"column":4}}},"2":{"name":"authorizationEngine","line":48,"loc":{"start":{"line":48,"column":4},"end":{"line":51,"column":4}}},"3":{"name":"setAuthorizationEngine","line":60,"loc":{"start":{"line":58,"column":4},"end":{"line":67,"column":4}}},"4":{"name":"grantRole","line":69,"loc":{"start":{"line":69,"column":4},"end":{"line":79,"column":4}}},"5":{"name":"revokeRole","line":81,"loc":{"start":{"line":81,"column":4},"end":{"line":91,"column":4}}},"6":{"name":"hasRole","line":96,"loc":{"start":{"line":96,"column":4},"end":{"line":105,"column":4}}},"7":{"name":"_getAuthorizationModuleStorage","line":114,"loc":{"start":{"line":114,"column":4},"end":{"line":118,"column":4}}}},"statementMap":{"1":{"start":{"line":32,"column":8},"end":{"line":32,"column":1354}},"2":{"start":{"line":35,"column":8},"end":{"line":35,"column":44}},"3":{"start":{"line":36,"column":8},"end":{"line":36,"column":1521}},"4":{"start":{"line":37,"column":12},"end":{"line":37,"column":83}},"5":{"start":{"line":39,"column":12},"end":{"line":39,"column":58}},"6":{"start":{"line":49,"column":8},"end":{"line":49,"column":79}},"7":{"start":{"line":50,"column":8},"end":{"line":50,"column":37}},"8":{"start":{"line":61,"column":8},"end":{"line":61,"column":79}},"9":{"start":{"line":62,"column":8},"end":{"line":62,"column":2578}},"10":{"start":{"line":66,"column":8},"end":{"line":66,"column":54}},"11":{"start":{"line":70,"column":8},"end":{"line":70,"column":79}},"12":{"start":{"line":71,"column":8},"end":{"line":71,"column":3034}},"13":{"start":{"line":72,"column":12},"end":{"line":72,"column":82}},"14":{"start":{"line":73,"column":12},"end":{"line":73,"column":3188}},"15":{"start":{"line":78,"column":8},"end":{"line":78,"column":64}},"16":{"start":{"line":82,"column":8},"end":{"line":82,"column":79}},"17":{"start":{"line":83,"column":8},"end":{"line":83,"column":3630}},"18":{"start":{"line":84,"column":12},"end":{"line":84,"column":83}},"19":{"start":{"line":85,"column":12},"end":{"line":85,"column":3785}},"20":{"start":{"line":90,"column":8},"end":{"line":90,"column":65}},"21":{"start":{"line":101,"column":8},"end":{"line":101,"column":4316}},"22":{"start":{"line":102,"column":12},"end":{"line":102,"column":23}},"23":{"start":{"line":104,"column":8},"end":{"line":104,"column":62}}},"branchMap":{"1":{"line":31,"type":"if","locations":[{"start":{"line":31,"column":13},"end":{"line":31,"column":13}},{"start":{"line":31,"column":13},"end":{"line":31,"column":13}}]},"2":{"line":32,"type":"if","locations":[{"start":{"line":32,"column":8},"end":{"line":32,"column":8}},{"start":{"line":32,"column":8},"end":{"line":32,"column":8}}]},"3":{"line":36,"type":"if","locations":[{"start":{"line":36,"column":8},"end":{"line":36,"column":8}},{"start":{"line":36,"column":8},"end":{"line":36,"column":8}}]},"4":{"line":60,"type":"if","locations":[{"start":{"line":60,"column":15},"end":{"line":60,"column":15}},{"start":{"line":60,"column":15},"end":{"line":60,"column":15}}]},"5":{"line":62,"type":"if","locations":[{"start":{"line":62,"column":8},"end":{"line":62,"column":8}},{"start":{"line":62,"column":8},"end":{"line":62,"column":8}}]},"6":{"line":69,"type":"if","locations":[{"start":{"line":69,"column":70},"end":{"line":69,"column":70}},{"start":{"line":69,"column":70},"end":{"line":69,"column":70}}]},"7":{"line":71,"type":"if","locations":[{"start":{"line":71,"column":8},"end":{"line":71,"column":8}},{"start":{"line":71,"column":8},"end":{"line":71,"column":8}}]},"8":{"line":73,"type":"if","locations":[{"start":{"line":73,"column":12},"end":{"line":73,"column":12}},{"start":{"line":73,"column":12},"end":{"line":73,"column":12}}]},"9":{"line":81,"type":"if","locations":[{"start":{"line":81,"column":71},"end":{"line":81,"column":71}},{"start":{"line":81,"column":71},"end":{"line":81,"column":71}}]},"10":{"line":83,"type":"if","locations":[{"start":{"line":83,"column":8},"end":{"line":83,"column":8}},{"start":{"line":83,"column":8},"end":{"line":83,"column":8}}]},"11":{"line":85,"type":"if","locations":[{"start":{"line":85,"column":12},"end":{"line":85,"column":12}},{"start":{"line":85,"column":12},"end":{"line":85,"column":12}}]},"12":{"line":101,"type":"if","locations":[{"start":{"line":101,"column":8},"end":{"line":101,"column":8}},{"start":{"line":101,"column":8},"end":{"line":101,"column":8}}]}}}, +"contracts/modules/wrapper/controllers/ValidationModule.sol":{"l":{"44":18,"45":18,"46":3,"48":15,"49":15,"60":20,"61":20,"62":3,"67":4,"72":2,"77":2,"79":6,"81":3,"97":17,"98":17,"99":4,"101":2,"103":2,"105":6,"107":3,"116":19,"117":4,"119":15,"120":15,"121":12,"123":3,"135":458,"136":18,"138":440,"142":439,"143":14,"145":425,"146":425,"147":60,"149":365},"path":"/home/ryan/Downloads/CM/CMTAT/contracts/modules/wrapper/controllers/ValidationModule.sol","s":{"1":18,"2":18,"3":15,"4":20,"5":20,"6":3,"7":17,"8":4,"9":13,"10":2,"11":11,"12":2,"13":9,"14":6,"15":3,"16":17,"17":17,"18":4,"19":13,"20":2,"21":11,"22":2,"23":9,"24":6,"25":3,"26":19,"27":4,"28":15,"29":15,"30":12,"31":3,"32":458,"33":18,"34":440,"35":439,"36":14,"37":425,"38":425,"39":60,"40":365},"b":{"1":[383,0],"2":[18,3],"3":[3,15],"4":[3,17],"5":[4,13],"6":[2,11],"7":[2,9],"8":[6,3],"9":[4,13],"10":[2,11],"11":[2,9],"12":[6,3],"13":[4,15],"14":[12,3],"15":[18,440],"16":[12,4],"17":[4,2],"18":[14,425],"19":[60,365]},"f":{"1":383,"2":18,"3":20,"4":17,"5":19,"6":458,"7":439},"fnMap":{"1":{"name":"__ValidationModule_init_unchained","line":28,"loc":{"start":{"line":28,"column":4},"end":{"line":30,"column":4}}},"2":{"name":"setRuleEngine","line":43,"loc":{"start":{"line":41,"column":4},"end":{"line":50,"column":4}}},"3":{"name":"messageForTransferRestriction","line":57,"loc":{"start":{"line":57,"column":4},"end":{"line":83,"column":4}}},"4":{"name":"detectTransferRestriction","line":92,"loc":{"start":{"line":92,"column":4},"end":{"line":109,"column":4}}},"5":{"name":"validateTransfer","line":111,"loc":{"start":{"line":111,"column":4},"end":{"line":124,"column":4}}},"6":{"name":"_validateTransferByModule","line":130,"loc":{"start":{"line":130,"column":4},"end":{"line":139,"column":4}}},"7":{"name":"_operateOnTransfer","line":141,"loc":{"start":{"line":141,"column":4},"end":{"line":150,"column":4}}}},"statementMap":{"1":{"start":{"line":44,"column":8},"end":{"line":44,"column":89}},"2":{"start":{"line":45,"column":8},"end":{"line":45,"column":1409}},"3":{"start":{"line":49,"column":8},"end":{"line":49,"column":36}},"4":{"start":{"line":60,"column":10},"end":{"line":60,"column":91}},"5":{"start":{"line":61,"column":8},"end":{"line":61,"column":2191}},"6":{"start":{"line":62,"column":12},"end":{"line":62,"column":35}},"7":{"start":{"line":63,"column":15},"end":{"line":63,"column":2307}},"8":{"start":{"line":67,"column":12},"end":{"line":67,"column":48}},"9":{"start":{"line":68,"column":15},"end":{"line":68,"column":2483}},"10":{"start":{"line":72,"column":12},"end":{"line":72,"column":53}},"11":{"start":{"line":73,"column":15},"end":{"line":73,"column":2669}},"12":{"start":{"line":77,"column":12},"end":{"line":77,"column":51}},"13":{"start":{"line":78,"column":15},"end":{"line":78,"column":2851}},"14":{"start":{"line":79,"column":12},"end":{"line":79,"column":66}},"15":{"start":{"line":81,"column":12},"end":{"line":81,"column":36}},"16":{"start":{"line":97,"column":8},"end":{"line":97,"column":89}},"17":{"start":{"line":98,"column":8},"end":{"line":98,"column":3641}},"18":{"start":{"line":99,"column":12},"end":{"line":99,"column":69}},"19":{"start":{"line":100,"column":15},"end":{"line":100,"column":3743}},"20":{"start":{"line":101,"column":12},"end":{"line":101,"column":74}},"21":{"start":{"line":102,"column":15},"end":{"line":102,"column":3854}},"22":{"start":{"line":103,"column":12},"end":{"line":103,"column":72}},"23":{"start":{"line":104,"column":15},"end":{"line":104,"column":3961}},"24":{"start":{"line":105,"column":12},"end":{"line":105,"column":63}},"25":{"start":{"line":107,"column":12},"end":{"line":107,"column":56}},"26":{"start":{"line":116,"column":8},"end":{"line":116,"column":4310}},"27":{"start":{"line":117,"column":12},"end":{"line":117,"column":24}},"28":{"start":{"line":119,"column":8},"end":{"line":119,"column":89}},"29":{"start":{"line":120,"column":8},"end":{"line":120,"column":4497}},"30":{"start":{"line":121,"column":12},"end":{"line":121,"column":54}},"31":{"start":{"line":123,"column":8},"end":{"line":123,"column":19}},"32":{"start":{"line":135,"column":8},"end":{"line":135,"column":4983}},"33":{"start":{"line":136,"column":12},"end":{"line":136,"column":24}},"34":{"start":{"line":138,"column":8},"end":{"line":138,"column":19}},"35":{"start":{"line":142,"column":8},"end":{"line":142,"column":5209}},"36":{"start":{"line":143,"column":12},"end":{"line":143,"column":24}},"37":{"start":{"line":145,"column":8},"end":{"line":145,"column":89}},"38":{"start":{"line":146,"column":8},"end":{"line":146,"column":5395}},"39":{"start":{"line":147,"column":12},"end":{"line":147,"column":80}},"40":{"start":{"line":149,"column":8},"end":{"line":149,"column":19}}},"branchMap":{"1":{"line":28,"type":"if","locations":[{"start":{"line":28,"column":58},"end":{"line":28,"column":58}},{"start":{"line":28,"column":58},"end":{"line":28,"column":58}}]},"2":{"line":43,"type":"if","locations":[{"start":{"line":43,"column":15},"end":{"line":43,"column":15}},{"start":{"line":43,"column":15},"end":{"line":43,"column":15}}]},"3":{"line":45,"type":"if","locations":[{"start":{"line":45,"column":8},"end":{"line":45,"column":8}},{"start":{"line":45,"column":8},"end":{"line":45,"column":8}}]},"4":{"line":61,"type":"if","locations":[{"start":{"line":61,"column":8},"end":{"line":61,"column":8}},{"start":{"line":61,"column":8},"end":{"line":61,"column":8}}]},"5":{"line":63,"type":"if","locations":[{"start":{"line":63,"column":15},"end":{"line":63,"column":15}},{"start":{"line":63,"column":15},"end":{"line":63,"column":15}}]},"6":{"line":68,"type":"if","locations":[{"start":{"line":68,"column":15},"end":{"line":68,"column":15}},{"start":{"line":68,"column":15},"end":{"line":68,"column":15}}]},"7":{"line":73,"type":"if","locations":[{"start":{"line":73,"column":15},"end":{"line":73,"column":15}},{"start":{"line":73,"column":15},"end":{"line":73,"column":15}}]},"8":{"line":78,"type":"if","locations":[{"start":{"line":78,"column":15},"end":{"line":78,"column":15}},{"start":{"line":78,"column":15},"end":{"line":78,"column":15}}]},"9":{"line":98,"type":"if","locations":[{"start":{"line":98,"column":8},"end":{"line":98,"column":8}},{"start":{"line":98,"column":8},"end":{"line":98,"column":8}}]},"10":{"line":100,"type":"if","locations":[{"start":{"line":100,"column":15},"end":{"line":100,"column":15}},{"start":{"line":100,"column":15},"end":{"line":100,"column":15}}]},"11":{"line":102,"type":"if","locations":[{"start":{"line":102,"column":15},"end":{"line":102,"column":15}},{"start":{"line":102,"column":15},"end":{"line":102,"column":15}}]},"12":{"line":104,"type":"if","locations":[{"start":{"line":104,"column":15},"end":{"line":104,"column":15}},{"start":{"line":104,"column":15},"end":{"line":104,"column":15}}]},"13":{"line":116,"type":"if","locations":[{"start":{"line":116,"column":8},"end":{"line":116,"column":8}},{"start":{"line":116,"column":8},"end":{"line":116,"column":8}}]},"14":{"line":120,"type":"if","locations":[{"start":{"line":120,"column":8},"end":{"line":120,"column":8}},{"start":{"line":120,"column":8},"end":{"line":120,"column":8}}]},"15":{"line":135,"type":"if","locations":[{"start":{"line":135,"column":8},"end":{"line":135,"column":8}},{"start":{"line":135,"column":8},"end":{"line":135,"column":8}}]},"16":{"line":135,"type":"cond-expr","locations":[{"start":{"line":135,"column":12},"end":{"line":135,"column":19}},{"start":{"line":135,"column":24},"end":{"line":135,"column":35}}]},"17":{"line":135,"type":"cond-expr","locations":[{"start":{"line":135,"column":12},"end":{"line":135,"column":35}},{"start":{"line":135,"column":40},"end":{"line":135,"column":49}}]},"18":{"line":142,"type":"if","locations":[{"start":{"line":142,"column":8},"end":{"line":142,"column":8}},{"start":{"line":142,"column":8},"end":{"line":142,"column":8}}]},"19":{"line":146,"type":"if","locations":[{"start":{"line":146,"column":8},"end":{"line":146,"column":8}},{"start":{"line":146,"column":8},"end":{"line":146,"column":8}}]}}}, +"contracts/modules/wrapper/core/BaseModule.sol":{"l":{"45":383,"46":383,"47":383,"48":383,"56":10,"57":10,"61":10,"62":10,"65":8,"66":8,"75":2,"76":2,"77":2,"86":2,"87":2,"88":2,"97":2,"98":2,"99":2,"109":417},"path":"/home/ryan/Downloads/CM/CMTAT/contracts/modules/wrapper/core/BaseModule.sol","s":{"1":383,"2":10,"3":10,"4":10,"5":10,"6":8,"7":8,"8":2,"9":2,"10":2,"11":2,"12":2,"13":2},"b":{"1":[383,0],"2":[2,2],"3":[2,2],"4":[2,2]},"f":{"1":383,"2":10,"3":10,"4":8,"5":2,"6":2,"7":2,"8":417},"fnMap":{"1":{"name":"__Base_init_unchained","line":44,"loc":{"start":{"line":40,"column":4},"end":{"line":49,"column":4}}},"2":{"name":"tokenId","line":55,"loc":{"start":{"line":55,"column":4},"end":{"line":58,"column":4}}},"3":{"name":"terms","line":60,"loc":{"start":{"line":60,"column":4},"end":{"line":63,"column":4}}},"4":{"name":"information","line":64,"loc":{"start":{"line":64,"column":4},"end":{"line":67,"column":4}}},"5":{"name":"setTokenId","line":74,"loc":{"start":{"line":72,"column":4},"end":{"line":78,"column":4}}},"6":{"name":"setTerms","line":85,"loc":{"start":{"line":83,"column":4},"end":{"line":89,"column":4}}},"7":{"name":"setInformation","line":96,"loc":{"start":{"line":94,"column":4},"end":{"line":100,"column":4}}},"8":{"name":"_getBaseModuleStorage","line":108,"loc":{"start":{"line":108,"column":4},"end":{"line":112,"column":4}}}},"statementMap":{"1":{"start":{"line":45,"column":8},"end":{"line":45,"column":61}},"2":{"start":{"line":56,"column":8},"end":{"line":56,"column":61}},"3":{"start":{"line":57,"column":8},"end":{"line":57,"column":25}},"4":{"start":{"line":61,"column":8},"end":{"line":61,"column":61}},"5":{"start":{"line":62,"column":8},"end":{"line":62,"column":23}},"6":{"start":{"line":65,"column":8},"end":{"line":65,"column":61}},"7":{"start":{"line":66,"column":8},"end":{"line":66,"column":29}},"8":{"start":{"line":75,"column":8},"end":{"line":75,"column":61}},"9":{"start":{"line":77,"column":8},"end":{"line":77,"column":40}},"10":{"start":{"line":86,"column":8},"end":{"line":86,"column":61}},"11":{"start":{"line":88,"column":8},"end":{"line":88,"column":33}},"12":{"start":{"line":97,"column":8},"end":{"line":97,"column":61}},"13":{"start":{"line":99,"column":8},"end":{"line":99,"column":52}}},"branchMap":{"1":{"line":44,"type":"if","locations":[{"start":{"line":44,"column":15},"end":{"line":44,"column":15}},{"start":{"line":44,"column":15},"end":{"line":44,"column":15}}]},"2":{"line":74,"type":"if","locations":[{"start":{"line":74,"column":13},"end":{"line":74,"column":13}},{"start":{"line":74,"column":13},"end":{"line":74,"column":13}}]},"3":{"line":85,"type":"if","locations":[{"start":{"line":85,"column":13},"end":{"line":85,"column":13}},{"start":{"line":85,"column":13},"end":{"line":85,"column":13}}]},"4":{"line":96,"type":"if","locations":[{"start":{"line":96,"column":13},"end":{"line":96,"column":13}},{"start":{"line":96,"column":13},"end":{"line":96,"column":13}}]}}}, +"contracts/modules/wrapper/core/EnforcementModule.sol":{"l":{"43":22,"57":8},"path":"/home/ryan/Downloads/CM/CMTAT/contracts/modules/wrapper/core/EnforcementModule.sol","s":{"1":22,"2":8},"b":{"1":[383,0],"2":[22,2],"3":[8,2]},"f":{"1":383,"2":22,"3":8},"fnMap":{"1":{"name":"__EnforcementModule_init_unchained","line":27,"loc":{"start":{"line":27,"column":4},"end":{"line":29,"column":4}}},"2":{"name":"freeze","line":42,"loc":{"start":{"line":39,"column":4},"end":{"line":44,"column":4}}},"3":{"name":"unfreeze","line":56,"loc":{"start":{"line":53,"column":4},"end":{"line":58,"column":4}}}},"statementMap":{"1":{"start":{"line":43,"column":8},"end":{"line":43,"column":39}},"2":{"start":{"line":57,"column":8},"end":{"line":57,"column":41}}},"branchMap":{"1":{"line":27,"type":"if","locations":[{"start":{"line":27,"column":59},"end":{"line":27,"column":59}},{"start":{"line":27,"column":59},"end":{"line":27,"column":59}}]},"2":{"line":42,"type":"if","locations":[{"start":{"line":42,"column":13},"end":{"line":42,"column":13}},{"start":{"line":42,"column":13},"end":{"line":42,"column":13}}]},"3":{"line":56,"type":"if","locations":[{"start":{"line":56,"column":13},"end":{"line":56,"column":13}},{"start":{"line":56,"column":13},"end":{"line":56,"column":13}}]}}}, +"contracts/modules/wrapper/core/ERC20BaseModule.sol":{"l":{"42":383,"43":383,"54":2,"55":2,"74":10,"75":2,"79":8,"80":4,"83":4,"86":10,"90":2,"105":10,"107":2,"108":2,"111":2,"120":4,"121":4,"122":2,"124":4,"135":385},"path":"/home/ryan/Downloads/CM/CMTAT/contracts/modules/wrapper/core/ERC20BaseModule.sol","s":{"1":383,"2":2,"3":2,"4":10,"5":8,"6":4,"7":10,"8":2,"9":10,"10":2,"11":2,"12":2,"13":4},"b":{"1":[383,0],"2":[2,8],"3":[4,4],"4":[2,0]},"f":{"1":383,"2":2,"3":10,"4":10,"5":4,"6":385},"fnMap":{"1":{"name":"__ERC20BaseModule_init_unchained","line":41,"loc":{"start":{"line":39,"column":4},"end":{"line":44,"column":4}}},"2":{"name":"decimals","line":53,"loc":{"start":{"line":53,"column":4},"end":{"line":56,"column":4}}},"3":{"name":"transferBatch","line":70,"loc":{"start":{"line":70,"column":4},"end":{"line":91,"column":4}}},"4":{"name":"transferFrom","line":100,"loc":{"start":{"line":100,"column":4},"end":{"line":112,"column":4}}},"5":{"name":"balanceInfo","line":119,"loc":{"start":{"line":119,"column":4},"end":{"line":125,"column":4}}},"6":{"name":"_getERC20BaseModuleStorage","line":134,"loc":{"start":{"line":134,"column":4},"end":{"line":138,"column":4}}}},"statementMap":{"1":{"start":{"line":42,"column":8},"end":{"line":42,"column":71}},"2":{"start":{"line":54,"column":8},"end":{"line":54,"column":71}},"3":{"start":{"line":55,"column":8},"end":{"line":55,"column":26}},"4":{"start":{"line":74,"column":8},"end":{"line":74,"column":2789}},"5":{"start":{"line":79,"column":8},"end":{"line":79,"column":3006}},"6":{"start":{"line":83,"column":8},"end":{"line":83,"column":3201}},"7":{"start":{"line":86,"column":12},"end":{"line":86,"column":70}},"8":{"start":{"line":90,"column":8},"end":{"line":90,"column":19}},"9":{"start":{"line":105,"column":8},"end":{"line":105,"column":68}},"10":{"start":{"line":107,"column":8},"end":{"line":107,"column":4151}},"11":{"start":{"line":108,"column":12},"end":{"line":108,"column":49}},"12":{"start":{"line":111,"column":8},"end":{"line":111,"column":21}},"13":{"start":{"line":121,"column":8},"end":{"line":121,"column":4644}}},"branchMap":{"1":{"line":41,"type":"if","locations":[{"start":{"line":41,"column":15},"end":{"line":41,"column":15}},{"start":{"line":41,"column":15},"end":{"line":41,"column":15}}]},"2":{"line":74,"type":"if","locations":[{"start":{"line":74,"column":8},"end":{"line":74,"column":8}},{"start":{"line":74,"column":8},"end":{"line":74,"column":8}}]},"3":{"line":79,"type":"if","locations":[{"start":{"line":79,"column":8},"end":{"line":79,"column":8}},{"start":{"line":79,"column":8},"end":{"line":79,"column":8}}]},"4":{"line":107,"type":"if","locations":[{"start":{"line":107,"column":8},"end":{"line":107,"column":8}},{"start":{"line":107,"column":8},"end":{"line":107,"column":8}}]}}}, +"contracts/modules/wrapper/core/ERC20BurnModule.sol":{"l":{"54":14,"55":12,"78":12,"79":2,"83":10,"84":4,"87":6,"88":18,"89":16,"112":4,"113":4,"114":4,"116":2,"119":2,"120":2,"123":2,"125":2,"127":2},"path":"/home/ryan/Downloads/CM/CMTAT/contracts/modules/wrapper/core/ERC20BurnModule.sol","s":{"1":14,"2":12,"3":12,"4":10,"5":6,"6":18,"7":16,"8":4,"9":4,"10":4,"11":2,"12":2,"13":2,"14":2},"b":{"1":[383,0],"2":[14,4],"3":[12,2],"4":[2,10],"5":[4,6],"6":[4,2],"7":[2,2]},"f":{"1":383,"2":14,"3":12,"4":4},"fnMap":{"1":{"name":"__ERC20BurnModule_init_unchained","line":32,"loc":{"start":{"line":32,"column":4},"end":{"line":34,"column":4}}},"2":{"name":"burn","line":53,"loc":{"start":{"line":49,"column":4},"end":{"line":56,"column":4}}},"3":{"name":"burnBatch","line":77,"loc":{"start":{"line":73,"column":4},"end":{"line":91,"column":4}}},"4":{"name":"burnFrom","line":109,"loc":{"start":{"line":107,"column":4},"end":{"line":128,"column":4}}}},"statementMap":{"1":{"start":{"line":54,"column":8},"end":{"line":54,"column":28}},"2":{"start":{"line":55,"column":8},"end":{"line":55,"column":41}},"3":{"start":{"line":78,"column":8},"end":{"line":78,"column":2750}},"4":{"start":{"line":83,"column":8},"end":{"line":83,"column":2972}},"5":{"start":{"line":87,"column":8},"end":{"line":87,"column":3172}},"6":{"start":{"line":88,"column":12},"end":{"line":88,"column":40}},"7":{"start":{"line":89,"column":12},"end":{"line":89,"column":53}},"8":{"start":{"line":112,"column":8},"end":{"line":112,"column":38}},"9":{"start":{"line":113,"column":8},"end":{"line":113,"column":61}},"10":{"start":{"line":114,"column":8},"end":{"line":114,"column":4061}},"11":{"start":{"line":120,"column":12},"end":{"line":120,"column":62}},"12":{"start":{"line":123,"column":8},"end":{"line":123,"column":28}},"13":{"start":{"line":125,"column":8},"end":{"line":125,"column":45}},"14":{"start":{"line":127,"column":8},"end":{"line":127,"column":45}}},"branchMap":{"1":{"line":32,"type":"if","locations":[{"start":{"line":32,"column":57},"end":{"line":32,"column":57}},{"start":{"line":32,"column":57},"end":{"line":32,"column":57}}]},"2":{"line":53,"type":"if","locations":[{"start":{"line":53,"column":13},"end":{"line":53,"column":13}},{"start":{"line":53,"column":13},"end":{"line":53,"column":13}}]},"3":{"line":77,"type":"if","locations":[{"start":{"line":77,"column":13},"end":{"line":77,"column":13}},{"start":{"line":77,"column":13},"end":{"line":77,"column":13}}]},"4":{"line":78,"type":"if","locations":[{"start":{"line":78,"column":8},"end":{"line":78,"column":8}},{"start":{"line":78,"column":8},"end":{"line":78,"column":8}}]},"5":{"line":83,"type":"if","locations":[{"start":{"line":83,"column":8},"end":{"line":83,"column":8}},{"start":{"line":83,"column":8},"end":{"line":83,"column":8}}]},"6":{"line":109,"type":"if","locations":[{"start":{"line":109,"column":8},"end":{"line":109,"column":8}},{"start":{"line":109,"column":8},"end":{"line":109,"column":8}}]},"7":{"line":114,"type":"if","locations":[{"start":{"line":114,"column":8},"end":{"line":114,"column":8}},{"start":{"line":114,"column":8},"end":{"line":114,"column":8}}]}}}, +"contracts/modules/wrapper/core/ERC20MintModule.sol":{"l":{"48":291,"49":291,"71":24,"72":2,"76":22,"77":4,"80":18,"81":54,"82":54},"path":"/home/ryan/Downloads/CM/CMTAT/contracts/modules/wrapper/core/ERC20MintModule.sol","s":{"1":291,"2":291,"3":24,"4":22,"5":18,"6":54,"7":54},"b":{"1":[383,0],"2":[291,4],"3":[24,2],"4":[2,22],"5":[4,18]},"f":{"1":383,"2":291,"3":24},"fnMap":{"1":{"name":"__ERC20MintModule_init_unchained","line":27,"loc":{"start":{"line":27,"column":4},"end":{"line":29,"column":4}}},"2":{"name":"mint","line":47,"loc":{"start":{"line":47,"column":4},"end":{"line":50,"column":4}}},"3":{"name":"mintBatch","line":70,"loc":{"start":{"line":67,"column":4},"end":{"line":84,"column":4}}}},"statementMap":{"1":{"start":{"line":48,"column":8},"end":{"line":48,"column":28}},"2":{"start":{"line":49,"column":8},"end":{"line":49,"column":33}},"3":{"start":{"line":71,"column":8},"end":{"line":71,"column":2514}},"4":{"start":{"line":76,"column":8},"end":{"line":76,"column":2736}},"5":{"start":{"line":80,"column":8},"end":{"line":80,"column":2936}},"6":{"start":{"line":81,"column":12},"end":{"line":81,"column":40}},"7":{"start":{"line":82,"column":12},"end":{"line":82,"column":45}}},"branchMap":{"1":{"line":27,"type":"if","locations":[{"start":{"line":27,"column":57},"end":{"line":27,"column":57}},{"start":{"line":27,"column":57},"end":{"line":27,"column":57}}]},"2":{"line":47,"type":"if","locations":[{"start":{"line":47,"column":57},"end":{"line":47,"column":57}},{"start":{"line":47,"column":57},"end":{"line":47,"column":57}}]},"3":{"line":70,"type":"if","locations":[{"start":{"line":70,"column":13},"end":{"line":70,"column":13}},{"start":{"line":70,"column":13},"end":{"line":70,"column":13}}]},"4":{"line":71,"type":"if","locations":[{"start":{"line":71,"column":8},"end":{"line":71,"column":8}},{"start":{"line":71,"column":8},"end":{"line":71,"column":8}}]},"5":{"line":76,"type":"if","locations":[{"start":{"line":76,"column":8},"end":{"line":76,"column":8}},{"start":{"line":76,"column":8},"end":{"line":76,"column":8}}]}}}, +"contracts/modules/wrapper/core/PauseModule.sol":{"l":{"51":14,"63":6,"64":6,"65":2,"67":4,"83":2,"84":2,"85":2,"86":2,"93":4,"94":4,"105":12},"path":"/home/ryan/Downloads/CM/CMTAT/contracts/modules/wrapper/core/PauseModule.sol","s":{"1":14,"2":6,"3":6,"4":4,"5":2,"6":2,"7":2,"8":4,"9":4},"b":{"1":[383,0],"2":[14,3],"3":[6,2],"4":[2,4],"5":[2,2]},"f":{"1":383,"2":14,"3":6,"4":2,"5":4,"6":12},"fnMap":{"1":{"name":"__PauseModule_init_unchained","line":34,"loc":{"start":{"line":34,"column":4},"end":{"line":36,"column":4}}},"2":{"name":"pause","line":50,"loc":{"start":{"line":50,"column":4},"end":{"line":52,"column":4}}},"3":{"name":"unpause","line":62,"loc":{"start":{"line":62,"column":4},"end":{"line":68,"column":4}}},"4":{"name":"deactivateContract","line":81,"loc":{"start":{"line":79,"column":4},"end":{"line":87,"column":4}}},"5":{"name":"deactivated","line":92,"loc":{"start":{"line":92,"column":4},"end":{"line":95,"column":4}}},"6":{"name":"_getPauseModuleStorage","line":104,"loc":{"start":{"line":104,"column":4},"end":{"line":108,"column":4}}}},"statementMap":{"1":{"start":{"line":51,"column":8},"end":{"line":51,"column":15}},"2":{"start":{"line":63,"column":8},"end":{"line":63,"column":63}},"3":{"start":{"line":64,"column":8},"end":{"line":64,"column":2386}},"4":{"start":{"line":67,"column":8},"end":{"line":67,"column":17}},"5":{"start":{"line":83,"column":8},"end":{"line":83,"column":63}},"6":{"start":{"line":85,"column":7},"end":{"line":85,"column":14}},"7":{"start":{"line":86,"column":7},"end":{"line":86,"column":37}},"8":{"start":{"line":93,"column":8},"end":{"line":93,"column":63}},"9":{"start":{"line":94,"column":8},"end":{"line":94,"column":31}}},"branchMap":{"1":{"line":34,"type":"if","locations":[{"start":{"line":34,"column":53},"end":{"line":34,"column":53}},{"start":{"line":34,"column":53},"end":{"line":34,"column":53}}]},"2":{"line":50,"type":"if","locations":[{"start":{"line":50,"column":28},"end":{"line":50,"column":28}},{"start":{"line":50,"column":28},"end":{"line":50,"column":28}}]},"3":{"line":62,"type":"if","locations":[{"start":{"line":62,"column":30},"end":{"line":62,"column":30}},{"start":{"line":62,"column":30},"end":{"line":62,"column":30}}]},"4":{"line":64,"type":"if","locations":[{"start":{"line":64,"column":8},"end":{"line":64,"column":8}},{"start":{"line":64,"column":8},"end":{"line":64,"column":8}}]},"5":{"line":81,"type":"if","locations":[{"start":{"line":81,"column":8},"end":{"line":81,"column":8}},{"start":{"line":81,"column":8},"end":{"line":81,"column":8}}]}}}, +"contracts/modules/wrapper/extensions/DebtModule.sol":{"l":{"43":383,"44":3,"45":3,"46":3,"55":8,"56":8,"66":5,"67":5,"68":1,"70":4,"71":4,"75":3,"76":3,"77":2,"82":3,"83":3,"84":2,"95":22},"path":"/home/ryan/Downloads/CM/CMTAT/contracts/modules/wrapper/extensions/DebtModule.sol","s":{"1":383,"2":3,"3":3,"4":8,"5":8,"6":5,"7":5,"8":4,"9":3,"10":3,"11":3,"12":3},"b":{"1":[383,0],"2":[3,380],"3":[5,1],"4":[1,4],"5":[2,1],"6":[2,1]},"f":{"1":383,"2":8,"3":5,"4":3,"5":3,"6":22},"fnMap":{"1":{"name":"__DebtModule_init_unchained","line":42,"loc":{"start":{"line":41,"column":4},"end":{"line":50,"column":4}}},"2":{"name":"debtEngine","line":54,"loc":{"start":{"line":54,"column":4},"end":{"line":57,"column":4}}},"3":{"name":"setDebtEngine","line":65,"loc":{"start":{"line":63,"column":4},"end":{"line":72,"column":4}}},"4":{"name":"debt","line":74,"loc":{"start":{"line":74,"column":4},"end":{"line":79,"column":4}}},"5":{"name":"creditEvents","line":81,"loc":{"start":{"line":81,"column":4},"end":{"line":86,"column":4}}},"6":{"name":"_getDebtModuleStorage","line":94,"loc":{"start":{"line":94,"column":4},"end":{"line":98,"column":4}}}},"statementMap":{"1":{"start":{"line":43,"column":8},"end":{"line":43,"column":1427}},"2":{"start":{"line":44,"column":12},"end":{"line":44,"column":65}},"3":{"start":{"line":46,"column":12},"end":{"line":46,"column":40}},"4":{"start":{"line":55,"column":8},"end":{"line":55,"column":61}},"5":{"start":{"line":56,"column":8},"end":{"line":56,"column":28}},"6":{"start":{"line":66,"column":8},"end":{"line":66,"column":61}},"7":{"start":{"line":67,"column":8},"end":{"line":67,"column":2257}},"8":{"start":{"line":71,"column":8},"end":{"line":71,"column":36}},"9":{"start":{"line":75,"column":8},"end":{"line":75,"column":61}},"10":{"start":{"line":76,"column":8},"end":{"line":76,"column":2584}},"11":{"start":{"line":82,"column":8},"end":{"line":82,"column":61}},"12":{"start":{"line":83,"column":8},"end":{"line":83,"column":2855}}},"branchMap":{"1":{"line":42,"type":"if","locations":[{"start":{"line":42,"column":13},"end":{"line":42,"column":13}},{"start":{"line":42,"column":13},"end":{"line":42,"column":13}}]},"2":{"line":43,"type":"if","locations":[{"start":{"line":43,"column":8},"end":{"line":43,"column":8}},{"start":{"line":43,"column":8},"end":{"line":43,"column":8}}]},"3":{"line":65,"type":"if","locations":[{"start":{"line":65,"column":15},"end":{"line":65,"column":15}},{"start":{"line":65,"column":15},"end":{"line":65,"column":15}}]},"4":{"line":67,"type":"if","locations":[{"start":{"line":67,"column":8},"end":{"line":67,"column":8}},{"start":{"line":67,"column":8},"end":{"line":67,"column":8}}]},"5":{"line":76,"type":"if","locations":[{"start":{"line":76,"column":8},"end":{"line":76,"column":8}},{"start":{"line":76,"column":8},"end":{"line":76,"column":8}}]},"6":{"line":83,"type":"if","locations":[{"start":{"line":83,"column":8},"end":{"line":83,"column":8}},{"start":{"line":83,"column":8},"end":{"line":83,"column":8}}]}}}, +"contracts/modules/wrapper/extensions/DocumentModule.sol":{"l":{"43":383,"44":12,"45":12,"46":12,"54":28,"55":28,"65":16,"66":16,"67":2,"69":14,"70":14,"75":18,"76":18,"77":16,"79":2,"84":6,"85":6,"86":4,"97":80},"path":"/home/ryan/Downloads/CM/CMTAT/contracts/modules/wrapper/extensions/DocumentModule.sol","s":{"1":383,"2":12,"3":12,"4":28,"5":28,"6":16,"7":16,"8":14,"9":18,"10":18,"11":16,"12":2,"13":6,"14":6},"b":{"1":[383,0],"2":[12,371],"3":[16,2],"4":[2,14],"5":[16,2],"6":[4,2]},"f":{"1":383,"2":28,"3":16,"4":18,"5":6,"6":80},"fnMap":{"1":{"name":"__DocumentModule_init_unchained","line":42,"loc":{"start":{"line":41,"column":4},"end":{"line":48,"column":4}}},"2":{"name":"documentEngine","line":53,"loc":{"start":{"line":53,"column":4},"end":{"line":56,"column":4}}},"3":{"name":"setDocumentEngine","line":64,"loc":{"start":{"line":62,"column":4},"end":{"line":71,"column":4}}},"4":{"name":"getDocument","line":74,"loc":{"start":{"line":74,"column":4},"end":{"line":81,"column":4}}},"5":{"name":"getAllDocuments","line":83,"loc":{"start":{"line":83,"column":4},"end":{"line":88,"column":4}}},"6":{"name":"_getDocumentModuleStorage","line":96,"loc":{"start":{"line":96,"column":4},"end":{"line":100,"column":4}}}},"statementMap":{"1":{"start":{"line":43,"column":8},"end":{"line":43,"column":1401}},"2":{"start":{"line":44,"column":12},"end":{"line":44,"column":73}},"3":{"start":{"line":46,"column":12},"end":{"line":46,"column":48}},"4":{"start":{"line":54,"column":8},"end":{"line":54,"column":69}},"5":{"start":{"line":55,"column":8},"end":{"line":55,"column":32}},"6":{"start":{"line":65,"column":8},"end":{"line":65,"column":69}},"7":{"start":{"line":66,"column":8},"end":{"line":66,"column":2280}},"8":{"start":{"line":70,"column":8},"end":{"line":70,"column":44}},"9":{"start":{"line":75,"column":8},"end":{"line":75,"column":69}},"10":{"start":{"line":76,"column":8},"end":{"line":76,"column":2667}},"11":{"start":{"line":77,"column":12},"end":{"line":77,"column":56}},"12":{"start":{"line":79,"column":12},"end":{"line":79,"column":30}},"13":{"start":{"line":84,"column":8},"end":{"line":84,"column":69}},"14":{"start":{"line":85,"column":8},"end":{"line":85,"column":2996}}},"branchMap":{"1":{"line":42,"type":"if","locations":[{"start":{"line":42,"column":13},"end":{"line":42,"column":13}},{"start":{"line":42,"column":13},"end":{"line":42,"column":13}}]},"2":{"line":43,"type":"if","locations":[{"start":{"line":43,"column":8},"end":{"line":43,"column":8}},{"start":{"line":43,"column":8},"end":{"line":43,"column":8}}]},"3":{"line":64,"type":"if","locations":[{"start":{"line":64,"column":15},"end":{"line":64,"column":15}},{"start":{"line":64,"column":15},"end":{"line":64,"column":15}}]},"4":{"line":66,"type":"if","locations":[{"start":{"line":66,"column":8},"end":{"line":66,"column":8}},{"start":{"line":66,"column":8},"end":{"line":66,"column":8}}]},"5":{"line":76,"type":"if","locations":[{"start":{"line":76,"column":8},"end":{"line":76,"column":8}},{"start":{"line":76,"column":8},"end":{"line":76,"column":8}}]},"6":{"line":85,"type":"if","locations":[{"start":{"line":85,"column":8},"end":{"line":85,"column":8}},{"start":{"line":85,"column":8},"end":{"line":85,"column":8}}]}}}, +"contracts/modules/wrapper/extensions/ERC20SnapshotModule.sol":{"l":{"34":170,"45":12,"57":22,"68":14,"78":10},"path":"/home/ryan/Downloads/CM/CMTAT/contracts/modules/wrapper/extensions/ERC20SnapshotModule.sol","s":{"1":170,"2":12,"3":22,"4":14,"5":10},"b":{"1":[383,0],"2":[170,2],"3":[12,2],"4":[22,2],"5":[14,2],"6":[10,2]},"f":{"1":383,"2":170,"3":12,"4":22,"5":14,"6":10},"fnMap":{"1":{"name":"__ERC20SnasphotModule_init_unchained","line":22,"loc":{"start":{"line":22,"column":4},"end":{"line":24,"column":4}}},"2":{"name":"scheduleSnapshot","line":33,"loc":{"start":{"line":33,"column":4},"end":{"line":35,"column":4}}},"3":{"name":"scheduleSnapshotNotOptimized","line":44,"loc":{"start":{"line":42,"column":4},"end":{"line":46,"column":4}}},"4":{"name":"rescheduleSnapshot","line":56,"loc":{"start":{"line":53,"column":4},"end":{"line":58,"column":4}}},"5":{"name":"unscheduleLastSnapshot","line":67,"loc":{"start":{"line":65,"column":4},"end":{"line":69,"column":4}}},"6":{"name":"unscheduleSnapshotNotOptimized","line":77,"loc":{"start":{"line":75,"column":4},"end":{"line":79,"column":4}}}},"statementMap":{"1":{"start":{"line":34,"column":8},"end":{"line":34,"column":30}},"2":{"start":{"line":45,"column":8},"end":{"line":45,"column":42}},"3":{"start":{"line":57,"column":8},"end":{"line":57,"column":44}},"4":{"start":{"line":68,"column":8},"end":{"line":68,"column":36}},"5":{"start":{"line":78,"column":8},"end":{"line":78,"column":44}}},"branchMap":{"1":{"line":22,"type":"if","locations":[{"start":{"line":22,"column":61},"end":{"line":22,"column":61}},{"start":{"line":22,"column":61},"end":{"line":22,"column":61}}]},"2":{"line":33,"type":"if","locations":[{"start":{"line":33,"column":51},"end":{"line":33,"column":51}},{"start":{"line":33,"column":51},"end":{"line":33,"column":51}}]},"3":{"line":44,"type":"if","locations":[{"start":{"line":44,"column":13},"end":{"line":44,"column":13}},{"start":{"line":44,"column":13},"end":{"line":44,"column":13}}]},"4":{"line":56,"type":"if","locations":[{"start":{"line":56,"column":13},"end":{"line":56,"column":13}},{"start":{"line":56,"column":13},"end":{"line":56,"column":13}}]},"5":{"line":67,"type":"if","locations":[{"start":{"line":67,"column":13},"end":{"line":67,"column":13}},{"start":{"line":67,"column":13},"end":{"line":67,"column":13}}]},"6":{"line":77,"type":"if","locations":[{"start":{"line":77,"column":13},"end":{"line":77,"column":13}},{"start":{"line":77,"column":13},"end":{"line":77,"column":13}}]}}}, +"contracts/modules/wrapper/extensions/MetaTxModule.sol":{"l":{},"path":"/home/ryan/Downloads/CM/CMTAT/contracts/modules/wrapper/extensions/MetaTxModule.sol","s":{},"b":{},"f":{"1":398},"fnMap":{"1":{"name":"constructor","line":19,"loc":{"start":{"line":17,"column":4},"end":{"line":21,"column":4}}}},"statementMap":{},"branchMap":{}}, +"contracts/test/proxy/CMTAT_PROXY_TEST_UUPS.sol":{"l":{},"path":"/home/ryan/Downloads/CM/CMTAT/contracts/test/proxy/CMTAT_PROXY_TEST_UUPS.sol","s":{},"b":{},"f":{"1":3},"fnMap":{"1":{"name":"constructor","line":19,"loc":{"start":{"line":17,"column":4},"end":{"line":21,"column":4}}}},"statementMap":{},"branchMap":{}}, +"contracts/test/proxy/CMTAT_PROXY_TEST.sol":{"l":{},"path":"/home/ryan/Downloads/CM/CMTAT/contracts/test/proxy/CMTAT_PROXY_TEST.sol","s":{},"b":{},"f":{"1":1},"fnMap":{"1":{"name":"constructor","line":19,"loc":{"start":{"line":17,"column":4},"end":{"line":21,"column":4}}}},"statementMap":{},"branchMap":{}}} diff --git a/doc/general/test/coverage/index.html b/doc/general/test/coverage/index.html index 1f7b85a2..f002f99b 100644 --- a/doc/general/test/coverage/index.html +++ b/doc/general/test/coverage/index.html @@ -259,7 +259,7 @@

diff --git a/doc/general/test/coverage/lcov-report/contracts/CMTAT_PROXY.sol.html b/doc/general/test/coverage/lcov-report/contracts/CMTAT_PROXY.sol.html index c1f44cd5..9ed16b05 100644 --- a/doc/general/test/coverage/lcov-report/contracts/CMTAT_PROXY.sol.html +++ b/doc/general/test/coverage/lcov-report/contracts/CMTAT_PROXY.sol.html @@ -65,7 +65,9 @@

20 21 22 -23  +23 +24  +        @@ -93,6 +95,7 @@

  import "./modules/CMTAT_BASE.sol";   +  /** * @title CMTAT version for a proxy deployment (Transparent or Beacon proxy) */ @@ -115,7 +118,7 @@

diff --git a/doc/general/test/coverage/lcov-report/contracts/CMTAT_PROXY_UUPS.sol.html b/doc/general/test/coverage/lcov-report/contracts/CMTAT_PROXY_UUPS.sol.html index 215b7b65..fdef59e1 100644 --- a/doc/general/test/coverage/lcov-report/contracts/CMTAT_PROXY_UUPS.sol.html +++ b/doc/general/test/coverage/lcov-report/contracts/CMTAT_PROXY_UUPS.sol.html @@ -96,7 +96,9 @@

51 52 53 -54  +54 +55  +        @@ -155,6 +157,7 @@

import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; import "./modules/CMTAT_BASE.sol";   +  /** * @title CMTAT version for a proxy deployment with UUPS proxy */ @@ -208,7 +211,7 @@

diff --git a/doc/general/test/coverage/lcov-report/contracts/CMTAT_STANDALONE.sol.html b/doc/general/test/coverage/lcov-report/contracts/CMTAT_STANDALONE.sol.html index 8ba53413..a2fdbad4 100644 --- a/doc/general/test/coverage/lcov-report/contracts/CMTAT_STANDALONE.sol.html +++ b/doc/general/test/coverage/lcov-report/contracts/CMTAT_STANDALONE.sol.html @@ -79,7 +79,9 @@

34 35 36 -37  +37 +38  +        @@ -121,6 +123,7 @@

  import "./modules/CMTAT_BASE.sol";   +  /** * @title CMTAT version for a standalone deployment (without proxy) */ @@ -157,7 +160,7 @@

diff --git a/doc/general/test/coverage/lcov-report/contracts/deployment/CMTAT_BEACON_FACTORY.sol.html b/doc/general/test/coverage/lcov-report/contracts/deployment/CMTAT_BEACON_FACTORY.sol.html index 8258d70f..c1c3d8e0 100644 --- a/doc/general/test/coverage/lcov-report/contracts/deployment/CMTAT_BEACON_FACTORY.sol.html +++ b/doc/general/test/coverage/lcov-report/contracts/deployment/CMTAT_BEACON_FACTORY.sol.html @@ -173,11 +173,11 @@

      -  -8× +7× 1×   -7× +6× +  1×   6× @@ -195,12 +195,12 @@

      -2× -2× +3× +3×     -2× -2× +3× +3×       @@ -234,13 +234,13 @@

      -2× -2× -2× -2× -2× -2× -2× +3× +3× +3× +3× +3× +3× +3×       @@ -250,14 +250,14 @@

      -4× +5×             -4× +5×    
//SPDX-License-Identifier: MPL-2.0
 pragma solidity ^0.8.20;
@@ -274,7 +274,6 @@ 

* */ contract CMTAT_BEACON_FACTORY is AccessControl, CMTATFactoryRoot { - // public UpgradeableBeacon public immutable beacon; /** * @param implementation_ contract implementation @@ -286,7 +285,8 @@

revert FactoryErrors.CMTAT_Factory_AddressZeroNotAllowedForBeaconOwner(); } if(implementation_ == address(0)){ - revert FactoryErrors.CMTAT_Factory_AddressZeroNotAllowedForLogicContract(); + // Forwarder is the zero address if no implementation provided + implementation_ = address(new CMTAT_PROXY(address(0))); } beacon = new UpgradeableBeacon(implementation_, beaconOwner); } @@ -373,7 +373,7 @@

diff --git a/doc/general/test/coverage/lcov-report/contracts/deployment/CMTAT_TP_FACTORY.sol.html b/doc/general/test/coverage/lcov-report/contracts/deployment/CMTAT_TP_FACTORY.sol.html index f5293bd9..e50cd33c 100644 --- a/doc/general/test/coverage/lcov-report/contracts/deployment/CMTAT_TP_FACTORY.sol.html +++ b/doc/general/test/coverage/lcov-report/contracts/deployment/CMTAT_TP_FACTORY.sol.html @@ -132,7 +132,21 @@

87 88 89 -90  +90 +91 +92 +93 +94 +95 +96 +97  +  +  +  +  +  +  +        @@ -226,15 +240,22 @@

  import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; import "../CMTAT_PROXY.sol"; -import '@openzeppelin/contracts/utils/Create2.sol'; +import "@openzeppelin/contracts/utils/Create2.sol"; import "./libraries/CMTATFactoryInvariant.sol"; import "./libraries/CMTATFactoryBase.sol"; +  +  /** * @notice Factory to deploy CMTAT with a transparent proxy * */ contract CMTAT_TP_FACTORY is CMTATFactoryBase {   + /** + * @param logic_ contract implementation, cannot be zero + * @param factoryAdmin admin + * @param useCustomSalt_ custom salt with create2 or not + */ constructor(address logic_, address factoryAdmin, bool useCustomSalt_) CMTATFactoryBase(logic_, factoryAdmin,useCustomSalt_){}   /*////////////////////////////////////////////////////////////// @@ -316,7 +337,7 @@

diff --git a/doc/general/test/coverage/lcov-report/contracts/deployment/CMTAT_UUPS_FACTORY.sol.html b/doc/general/test/coverage/lcov-report/contracts/deployment/CMTAT_UUPS_FACTORY.sol.html index 68ec547c..d265e30a 100644 --- a/doc/general/test/coverage/lcov-report/contracts/deployment/CMTAT_UUPS_FACTORY.sol.html +++ b/doc/general/test/coverage/lcov-report/contracts/deployment/CMTAT_UUPS_FACTORY.sol.html @@ -131,7 +131,13 @@

86 87 88 -89  +89 +90 +91 +92  +  +  +        @@ -224,17 +230,20 @@

  import "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; import "../CMTAT_PROXY_UUPS.sol"; -import '@openzeppelin/contracts/utils/Create2.sol'; +import "@openzeppelin/contracts/utils/Create2.sol"; import "./libraries/CMTATFactoryInvariant.sol"; import "./libraries/CMTATFactoryBase.sol"; +  +  /** * @notice Factory to deploy CMTAT with a UUPS proxy * */ contract CMTAT_UUPS_FACTORY is CMTATFactoryBase { /** - * @param logic_ contract implementation + * @param logic_ contract implementation, cannot be zero * @param factoryAdmin admin + * @param useCustomSalt_ custom salt with create2 or not */ constructor(address logic_, address factoryAdmin, bool useCustomSalt_) CMTATFactoryBase(logic_, factoryAdmin,useCustomSalt_){} @@ -313,7 +322,7 @@

diff --git a/doc/general/test/coverage/lcov-report/contracts/deployment/index.html b/doc/general/test/coverage/lcov-report/contracts/deployment/index.html index fe5266d0..ec2b356f 100644 --- a/doc/general/test/coverage/lcov-report/contracts/deployment/index.html +++ b/doc/general/test/coverage/lcov-report/contracts/deployment/index.html @@ -103,7 +103,7 @@

diff --git a/doc/general/test/coverage/lcov-report/contracts/deployment/libraries/CMTATFactoryBase.sol.html b/doc/general/test/coverage/lcov-report/contracts/deployment/libraries/CMTATFactoryBase.sol.html index af7247ce..47dd6ba7 100644 --- a/doc/general/test/coverage/lcov-report/contracts/deployment/libraries/CMTATFactoryBase.sol.html +++ b/doc/general/test/coverage/lcov-report/contracts/deployment/libraries/CMTATFactoryBase.sol.html @@ -118,7 +118,7 @@

diff --git a/doc/general/test/coverage/lcov-report/contracts/deployment/libraries/CMTATFactoryInvariant.sol.html b/doc/general/test/coverage/lcov-report/contracts/deployment/libraries/CMTATFactoryInvariant.sol.html index 87c19507..9bf8bb27 100644 --- a/doc/general/test/coverage/lcov-report/contracts/deployment/libraries/CMTATFactoryInvariant.sol.html +++ b/doc/general/test/coverage/lcov-report/contracts/deployment/libraries/CMTATFactoryInvariant.sol.html @@ -118,7 +118,7 @@

diff --git a/doc/general/test/coverage/lcov-report/contracts/deployment/libraries/CMTATFactoryRoot.sol.html b/doc/general/test/coverage/lcov-report/contracts/deployment/libraries/CMTATFactoryRoot.sol.html index 9b9b198c..c0528424 100644 --- a/doc/general/test/coverage/lcov-report/contracts/deployment/libraries/CMTATFactoryRoot.sol.html +++ b/doc/general/test/coverage/lcov-report/contracts/deployment/libraries/CMTATFactoryRoot.sol.html @@ -137,14 +137,14 @@

      -27× -3× +25× +2×   -24× -15× +23× +13×   -24× -24× +23× +23×       @@ -157,7 +157,7 @@

      -13× +14×       @@ -170,7 +170,7 @@

      -11× +12× 5× 2×   @@ -178,7 +178,7 @@

3×     -6× +7×      
//SPDX-License-Identifier: MPL-2.0
@@ -256,7 +256,7 @@ 

diff --git a/doc/general/test/coverage/lcov-report/contracts/deployment/libraries/index.html b/doc/general/test/coverage/lcov-report/contracts/deployment/libraries/index.html index 8490a669..f46787fe 100644 --- a/doc/general/test/coverage/lcov-report/contracts/deployment/libraries/index.html +++ b/doc/general/test/coverage/lcov-report/contracts/deployment/libraries/index.html @@ -103,7 +103,7 @@

diff --git a/doc/general/test/coverage/lcov-report/contracts/index.html b/doc/general/test/coverage/lcov-report/contracts/index.html index 9ce29ff8..6585f11a 100644 --- a/doc/general/test/coverage/lcov-report/contracts/index.html +++ b/doc/general/test/coverage/lcov-report/contracts/index.html @@ -103,7 +103,7 @@

diff --git a/doc/general/test/coverage/lcov-report/contracts/interfaces/ICCIPToken.sol.html b/doc/general/test/coverage/lcov-report/contracts/interfaces/ICCIPToken.sol.html index b526f339..46226201 100644 --- a/doc/general/test/coverage/lcov-report/contracts/interfaces/ICCIPToken.sol.html +++ b/doc/general/test/coverage/lcov-report/contracts/interfaces/ICCIPToken.sol.html @@ -121,7 +121,7 @@

diff --git a/doc/general/test/coverage/lcov-report/contracts/interfaces/ICMTATConstructor.sol.html b/doc/general/test/coverage/lcov-report/contracts/interfaces/ICMTATConstructor.sol.html index aae2f6ee..6643f881 100644 --- a/doc/general/test/coverage/lcov-report/contracts/interfaces/ICMTATConstructor.sol.html +++ b/doc/general/test/coverage/lcov-report/contracts/interfaces/ICMTATConstructor.sol.html @@ -78,7 +78,9 @@

33 34 35 -36  +36 +37  +        @@ -114,12 +116,13 @@

     
//SPDX-License-Identifier: MPL-2.0
+pragma solidity ^0.8.20;
 import "./engine/IDebtEngine.sol";
 import "./engine/IRuleEngine.sol";
 import "./engine/IAuthorizationEngine.sol";
 import "./engine/draft-IERC1643.sol";
  
-pragma solidity ^0.8.20;
+ 
  
 /**
 * @notice interface to represent arguments used for CMTAT constructor / initialize
@@ -154,7 +157,7 @@ 

diff --git a/doc/general/test/coverage/lcov-report/contracts/interfaces/ICMTATSnapshot.sol.html b/doc/general/test/coverage/lcov-report/contracts/interfaces/ICMTATSnapshot.sol.html index 904f4196..1395b22e 100644 --- a/doc/general/test/coverage/lcov-report/contracts/interfaces/ICMTATSnapshot.sol.html +++ b/doc/general/test/coverage/lcov-report/contracts/interfaces/ICMTATSnapshot.sol.html @@ -163,7 +163,7 @@

diff --git a/doc/general/test/coverage/lcov-report/contracts/interfaces/draft-IERC1404/draft-IERC1404.sol.html b/doc/general/test/coverage/lcov-report/contracts/interfaces/draft-IERC1404/draft-IERC1404.sol.html index 082e383c..f02bbeca 100644 --- a/doc/general/test/coverage/lcov-report/contracts/interfaces/draft-IERC1404/draft-IERC1404.sol.html +++ b/doc/general/test/coverage/lcov-report/contracts/interfaces/draft-IERC1404/draft-IERC1404.sol.html @@ -127,7 +127,7 @@

diff --git a/doc/general/test/coverage/lcov-report/contracts/interfaces/draft-IERC1404/draft-IERC1404EnumCode.sol.html b/doc/general/test/coverage/lcov-report/contracts/interfaces/draft-IERC1404/draft-IERC1404EnumCode.sol.html index e8b5ea44..89805afc 100644 --- a/doc/general/test/coverage/lcov-report/contracts/interfaces/draft-IERC1404/draft-IERC1404EnumCode.sol.html +++ b/doc/general/test/coverage/lcov-report/contracts/interfaces/draft-IERC1404/draft-IERC1404EnumCode.sol.html @@ -94,7 +94,7 @@

diff --git a/doc/general/test/coverage/lcov-report/contracts/interfaces/draft-IERC1404/draft-IERC1404Wrapper.sol.html b/doc/general/test/coverage/lcov-report/contracts/interfaces/draft-IERC1404/draft-IERC1404Wrapper.sol.html index 66534533..109ee153 100644 --- a/doc/general/test/coverage/lcov-report/contracts/interfaces/draft-IERC1404/draft-IERC1404Wrapper.sol.html +++ b/doc/general/test/coverage/lcov-report/contracts/interfaces/draft-IERC1404/draft-IERC1404Wrapper.sol.html @@ -103,7 +103,7 @@

diff --git a/doc/general/test/coverage/lcov-report/contracts/interfaces/draft-IERC1404/index.html b/doc/general/test/coverage/lcov-report/contracts/interfaces/draft-IERC1404/index.html index c3b92b57..a5b41084 100644 --- a/doc/general/test/coverage/lcov-report/contracts/interfaces/draft-IERC1404/index.html +++ b/doc/general/test/coverage/lcov-report/contracts/interfaces/draft-IERC1404/index.html @@ -103,7 +103,7 @@

diff --git a/doc/general/test/coverage/lcov-report/contracts/interfaces/engine/IAuthorizationEngine.sol.html b/doc/general/test/coverage/lcov-report/contracts/interfaces/engine/IAuthorizationEngine.sol.html index 3c637833..14799def 100644 --- a/doc/general/test/coverage/lcov-report/contracts/interfaces/engine/IAuthorizationEngine.sol.html +++ b/doc/general/test/coverage/lcov-report/contracts/interfaces/engine/IAuthorizationEngine.sol.html @@ -118,7 +118,7 @@

diff --git a/doc/general/test/coverage/lcov-report/contracts/interfaces/engine/IDebtEngine.sol.html b/doc/general/test/coverage/lcov-report/contracts/interfaces/engine/IDebtEngine.sol.html index 81a7c34a..e9679c05 100644 --- a/doc/general/test/coverage/lcov-report/contracts/interfaces/engine/IDebtEngine.sol.html +++ b/doc/general/test/coverage/lcov-report/contracts/interfaces/engine/IDebtEngine.sol.html @@ -106,7 +106,7 @@

diff --git a/doc/general/test/coverage/lcov-report/contracts/interfaces/engine/IDebtGlobal.sol.html b/doc/general/test/coverage/lcov-report/contracts/interfaces/engine/IDebtGlobal.sol.html index 9b5e6243..ef54cf40 100644 --- a/doc/general/test/coverage/lcov-report/contracts/interfaces/engine/IDebtGlobal.sol.html +++ b/doc/general/test/coverage/lcov-report/contracts/interfaces/engine/IDebtGlobal.sol.html @@ -136,7 +136,7 @@

diff --git a/doc/general/test/coverage/lcov-report/contracts/interfaces/engine/IRuleEngine.sol.html b/doc/general/test/coverage/lcov-report/contracts/interfaces/engine/IRuleEngine.sol.html index 5c20a1d7..6193844d 100644 --- a/doc/general/test/coverage/lcov-report/contracts/interfaces/engine/IRuleEngine.sol.html +++ b/doc/general/test/coverage/lcov-report/contracts/interfaces/engine/IRuleEngine.sol.html @@ -109,7 +109,7 @@

diff --git a/doc/general/test/coverage/lcov-report/contracts/interfaces/engine/draft-IERC1643.sol.html b/doc/general/test/coverage/lcov-report/contracts/interfaces/engine/draft-IERC1643.sol.html index de24c346..0c21387c 100644 --- a/doc/general/test/coverage/lcov-report/contracts/interfaces/engine/draft-IERC1643.sol.html +++ b/doc/general/test/coverage/lcov-report/contracts/interfaces/engine/draft-IERC1643.sol.html @@ -79,7 +79,7 @@

diff --git a/doc/general/test/coverage/lcov-report/contracts/interfaces/engine/index.html b/doc/general/test/coverage/lcov-report/contracts/interfaces/engine/index.html index 68e5bddc..9192c698 100644 --- a/doc/general/test/coverage/lcov-report/contracts/interfaces/engine/index.html +++ b/doc/general/test/coverage/lcov-report/contracts/interfaces/engine/index.html @@ -129,7 +129,7 @@

diff --git a/doc/general/test/coverage/lcov-report/contracts/interfaces/index.html b/doc/general/test/coverage/lcov-report/contracts/interfaces/index.html index 632bd98d..36e947e6 100644 --- a/doc/general/test/coverage/lcov-report/contracts/interfaces/index.html +++ b/doc/general/test/coverage/lcov-report/contracts/interfaces/index.html @@ -103,7 +103,7 @@

diff --git a/doc/general/test/coverage/lcov-report/contracts/libraries/Errors.sol.html b/doc/general/test/coverage/lcov-report/contracts/libraries/Errors.sol.html index f24beaf0..8ce419b5 100644 --- a/doc/general/test/coverage/lcov-report/contracts/libraries/Errors.sol.html +++ b/doc/general/test/coverage/lcov-report/contracts/libraries/Errors.sol.html @@ -256,7 +256,7 @@

diff --git a/doc/general/test/coverage/lcov-report/contracts/libraries/FactoryErrors.sol.html b/doc/general/test/coverage/lcov-report/contracts/libraries/FactoryErrors.sol.html index c608b4a9..23707973 100644 --- a/doc/general/test/coverage/lcov-report/contracts/libraries/FactoryErrors.sol.html +++ b/doc/general/test/coverage/lcov-report/contracts/libraries/FactoryErrors.sol.html @@ -88,7 +88,7 @@

diff --git a/doc/general/test/coverage/lcov-report/contracts/libraries/index.html b/doc/general/test/coverage/lcov-report/contracts/libraries/index.html index e3e50a9e..d8d79f13 100644 --- a/doc/general/test/coverage/lcov-report/contracts/libraries/index.html +++ b/doc/general/test/coverage/lcov-report/contracts/libraries/index.html @@ -90,7 +90,7 @@

diff --git a/doc/general/test/coverage/lcov-report/contracts/modules/CMTAT_BASE.sol.html b/doc/general/test/coverage/lcov-report/contracts/modules/CMTAT_BASE.sol.html index c18f34a8..04d9627e 100644 --- a/doc/general/test/coverage/lcov-report/contracts/modules/CMTAT_BASE.sol.html +++ b/doc/general/test/coverage/lcov-report/contracts/modules/CMTAT_BASE.sol.html @@ -347,7 +347,7 @@

      -384× +385×       @@ -367,50 +367,50 @@

      -384× -384× +385× +385×   -384× +385×   -384× -384× +385× +385×     -384× +385×         -384× -384× +385× +385×   -384× +385×       -384× -382× -382× +385× +383× +383×   -382× -382× +383× +383×   -382× -382× +383× +383×           -382× -382× -382× +383× +383× +383×     -382× +383×     -382× +383×       @@ -476,7 +476,7 @@

      -438× +439× 17×     @@ -484,8 +484,8 @@

      -421× -421× +422× +422×       @@ -499,7 +499,7 @@

      -1389× +1391×       @@ -508,7 +508,7 @@

      -1389× +1391×       @@ -769,7 +769,7 @@

diff --git a/doc/general/test/coverage/lcov-report/contracts/modules/index.html b/doc/general/test/coverage/lcov-report/contracts/modules/index.html index f16eff78..bd35beff 100644 --- a/doc/general/test/coverage/lcov-report/contracts/modules/index.html +++ b/doc/general/test/coverage/lcov-report/contracts/modules/index.html @@ -77,7 +77,7 @@

diff --git a/doc/general/test/coverage/lcov-report/contracts/modules/internal/ERC20SnapshotModuleInternal.sol.html b/doc/general/test/coverage/lcov-report/contracts/modules/internal/ERC20SnapshotModuleInternal.sol.html index 7fd178e9..3b52a76d 100644 --- a/doc/general/test/coverage/lcov-report/contracts/modules/internal/ERC20SnapshotModuleInternal.sol.html +++ b/doc/general/test/coverage/lcov-report/contracts/modules/internal/ERC20SnapshotModuleInternal.sol.html @@ -287,8 +287,8 @@

      -421× -421× +422× +422×   77× 77× @@ -300,8 +300,8 @@

      -344× -344× +345× +345×       @@ -309,16 +309,16 @@

      -464× -464× +465× +465×             -378× -378× +379× +379×      
//SPDX-License-Identifier: MPL-2.0
@@ -466,7 +466,7 @@ 

diff --git a/doc/general/test/coverage/lcov-report/contracts/modules/internal/EnforcementModuleInternal.sol.html b/doc/general/test/coverage/lcov-report/contracts/modules/internal/EnforcementModuleInternal.sol.html index a04d6a48..77e63443 100644 --- a/doc/general/test/coverage/lcov-report/contracts/modules/internal/EnforcementModuleInternal.sol.html +++ b/doc/general/test/coverage/lcov-report/contracts/modules/internal/EnforcementModuleInternal.sol.html @@ -224,8 +224,8 @@

      -944× -944× +946× +946×       @@ -272,7 +272,7 @@

      -974× +976×       @@ -400,7 +400,7 @@

diff --git a/doc/general/test/coverage/lcov-report/contracts/modules/internal/ValidationModuleInternal.sol.html b/doc/general/test/coverage/lcov-report/contracts/modules/internal/ValidationModuleInternal.sol.html index 8a9dd3c7..71d93b5c 100644 --- a/doc/general/test/coverage/lcov-report/contracts/modules/internal/ValidationModuleInternal.sol.html +++ b/doc/general/test/coverage/lcov-report/contracts/modules/internal/ValidationModuleInternal.sol.html @@ -176,7 +176,7 @@

      -384× +385× 18× 18× 18× @@ -240,7 +240,7 @@

      -628× +629×       @@ -352,7 +352,7 @@

diff --git a/doc/general/test/coverage/lcov-report/contracts/modules/internal/base/SnapshotModuleBase.sol.html b/doc/general/test/coverage/lcov-report/contracts/modules/internal/base/SnapshotModuleBase.sol.html index f2cf0053..e7f0ea38 100644 --- a/doc/general/test/coverage/lcov-report/contracts/modules/internal/base/SnapshotModuleBase.sol.html +++ b/doc/general/test/coverage/lcov-report/contracts/modules/internal/base/SnapshotModuleBase.sol.html @@ -775,9 +775,9 @@

      -842× -842× -842× +844× +844× +844× 36× 36×   @@ -789,12 +789,12 @@

      -421× -421× +422× +422×       -421× +422× 18× 18×   @@ -806,8 +806,8 @@

      -842× -834× +844× +836×   8×   @@ -849,14 +849,14 @@

      -489× -489× +490× +490×   -489× +490×       -403× +404×     86× @@ -902,7 +902,7 @@

      -4856× +4862×       @@ -1345,7 +1345,7 @@

diff --git a/doc/general/test/coverage/lcov-report/contracts/modules/internal/base/index.html b/doc/general/test/coverage/lcov-report/contracts/modules/internal/base/index.html index 6d5f9ab3..6b2ce4d7 100644 --- a/doc/general/test/coverage/lcov-report/contracts/modules/internal/base/index.html +++ b/doc/general/test/coverage/lcov-report/contracts/modules/internal/base/index.html @@ -77,7 +77,7 @@

diff --git a/doc/general/test/coverage/lcov-report/contracts/modules/internal/index.html b/doc/general/test/coverage/lcov-report/contracts/modules/internal/index.html index 25d642d7..53c42414 100644 --- a/doc/general/test/coverage/lcov-report/contracts/modules/internal/index.html +++ b/doc/general/test/coverage/lcov-report/contracts/modules/internal/index.html @@ -103,7 +103,7 @@

diff --git a/doc/general/test/coverage/lcov-report/contracts/modules/security/AuthorizationModule.sol.html b/doc/general/test/coverage/lcov-report/contracts/modules/security/AuthorizationModule.sol.html index ad289c2e..bc716af6 100644 --- a/doc/general/test/coverage/lcov-report/contracts/modules/security/AuthorizationModule.sol.html +++ b/doc/general/test/coverage/lcov-report/contracts/modules/security/AuthorizationModule.sol.html @@ -193,11 +193,11 @@

      -384× +385× 2×   -382× -382× +383× +383× 16× 16× 16× @@ -262,10 +262,10 @@

      -1283× -759× +1285× +760×   -524× +525×       @@ -406,7 +406,7 @@

diff --git a/doc/general/test/coverage/lcov-report/contracts/modules/security/index.html b/doc/general/test/coverage/lcov-report/contracts/modules/security/index.html index f42cc844..b0be96c4 100644 --- a/doc/general/test/coverage/lcov-report/contracts/modules/security/index.html +++ b/doc/general/test/coverage/lcov-report/contracts/modules/security/index.html @@ -77,7 +77,7 @@

diff --git a/doc/general/test/coverage/lcov-report/contracts/modules/wrapper/controllers/ValidationModule.sol.html b/doc/general/test/coverage/lcov-report/contracts/modules/wrapper/controllers/ValidationModule.sol.html index 380bcb96..ef51ee6d 100644 --- a/doc/general/test/coverage/lcov-report/contracts/modules/wrapper/controllers/ValidationModule.sol.html +++ b/doc/general/test/coverage/lcov-report/contracts/modules/wrapper/controllers/ValidationModule.sol.html @@ -328,21 +328,21 @@

      -457× +458× 18×   -439× +440×       -438× +439× 14×   -424× -424× +425× +425× 60×   -364× +365×      
//SPDX-License-Identifier: MPL-2.0
@@ -502,7 +502,7 @@ 

diff --git a/doc/general/test/coverage/lcov-report/contracts/modules/wrapper/controllers/index.html b/doc/general/test/coverage/lcov-report/contracts/modules/wrapper/controllers/index.html index 6b3304d3..ca23daa8 100644 --- a/doc/general/test/coverage/lcov-report/contracts/modules/wrapper/controllers/index.html +++ b/doc/general/test/coverage/lcov-report/contracts/modules/wrapper/controllers/index.html @@ -77,7 +77,7 @@

diff --git a/doc/general/test/coverage/lcov-report/contracts/modules/wrapper/core/BaseModule.sol.html b/doc/general/test/coverage/lcov-report/contracts/modules/wrapper/core/BaseModule.sol.html index b07d3d33..964e3579 100644 --- a/doc/general/test/coverage/lcov-report/contracts/modules/wrapper/core/BaseModule.sol.html +++ b/doc/general/test/coverage/lcov-report/contracts/modules/wrapper/core/BaseModule.sol.html @@ -201,10 +201,10 @@

      -382× -382× -382× -382× +383× +383× +383× +383×       @@ -265,7 +265,7 @@

      -416× +417×       @@ -391,7 +391,7 @@

diff --git a/doc/general/test/coverage/lcov-report/contracts/modules/wrapper/core/ERC20BaseModule.sol.html b/doc/general/test/coverage/lcov-report/contracts/modules/wrapper/core/ERC20BaseModule.sol.html index ec809312..ee11870a 100644 --- a/doc/general/test/coverage/lcov-report/contracts/modules/wrapper/core/ERC20BaseModule.sol.html +++ b/doc/general/test/coverage/lcov-report/contracts/modules/wrapper/core/ERC20BaseModule.sol.html @@ -223,8 +223,8 @@

      -382× -382× +383× +383×       @@ -316,7 +316,7 @@

      -384× +385×       @@ -466,7 +466,7 @@

diff --git a/doc/general/test/coverage/lcov-report/contracts/modules/wrapper/core/ERC20BurnModule.sol.html b/doc/general/test/coverage/lcov-report/contracts/modules/wrapper/core/ERC20BurnModule.sol.html index 4d20e959..5af9fc26 100644 --- a/doc/general/test/coverage/lcov-report/contracts/modules/wrapper/core/ERC20BurnModule.sol.html +++ b/doc/general/test/coverage/lcov-report/contracts/modules/wrapper/core/ERC20BurnModule.sol.html @@ -436,7 +436,7 @@

diff --git a/doc/general/test/coverage/lcov-report/contracts/modules/wrapper/core/ERC20MintModule.sol.html b/doc/general/test/coverage/lcov-report/contracts/modules/wrapper/core/ERC20MintModule.sol.html index eae1319c..ec866ec8 100644 --- a/doc/general/test/coverage/lcov-report/contracts/modules/wrapper/core/ERC20MintModule.sol.html +++ b/doc/general/test/coverage/lcov-report/contracts/modules/wrapper/core/ERC20MintModule.sol.html @@ -175,8 +175,8 @@

      -290× -290× +291× +291×       @@ -304,7 +304,7 @@

diff --git a/doc/general/test/coverage/lcov-report/contracts/modules/wrapper/core/EnforcementModule.sol.html b/doc/general/test/coverage/lcov-report/contracts/modules/wrapper/core/EnforcementModule.sol.html index bdd8dc50..94408cc1 100644 --- a/doc/general/test/coverage/lcov-report/contracts/modules/wrapper/core/EnforcementModule.sol.html +++ b/doc/general/test/coverage/lcov-report/contracts/modules/wrapper/core/EnforcementModule.sol.html @@ -226,7 +226,7 @@

diff --git a/doc/general/test/coverage/lcov-report/contracts/modules/wrapper/core/PauseModule.sol.html b/doc/general/test/coverage/lcov-report/contracts/modules/wrapper/core/PauseModule.sol.html index 09614f07..6d02c4f3 100644 --- a/doc/general/test/coverage/lcov-report/contracts/modules/wrapper/core/PauseModule.sol.html +++ b/doc/general/test/coverage/lcov-report/contracts/modules/wrapper/core/PauseModule.sol.html @@ -376,7 +376,7 @@

diff --git a/doc/general/test/coverage/lcov-report/contracts/modules/wrapper/core/index.html b/doc/general/test/coverage/lcov-report/contracts/modules/wrapper/core/index.html index c78c57db..b00ff654 100644 --- a/doc/general/test/coverage/lcov-report/contracts/modules/wrapper/core/index.html +++ b/doc/general/test/coverage/lcov-report/contracts/modules/wrapper/core/index.html @@ -142,7 +142,7 @@

diff --git a/doc/general/test/coverage/lcov-report/contracts/modules/wrapper/extensions/DebtModule.sol.html b/doc/general/test/coverage/lcov-report/contracts/modules/wrapper/extensions/DebtModule.sol.html index 25046249..4156c3c8 100644 --- a/doc/general/test/coverage/lcov-report/contracts/modules/wrapper/extensions/DebtModule.sol.html +++ b/doc/general/test/coverage/lcov-report/contracts/modules/wrapper/extensions/DebtModule.sol.html @@ -185,7 +185,7 @@

      -382× +383× 3× 3× 3× @@ -349,7 +349,7 @@

diff --git a/doc/general/test/coverage/lcov-report/contracts/modules/wrapper/extensions/DocumentModule.sol.html b/doc/general/test/coverage/lcov-report/contracts/modules/wrapper/extensions/DocumentModule.sol.html index 01963048..d91a9797 100644 --- a/doc/general/test/coverage/lcov-report/contracts/modules/wrapper/extensions/DocumentModule.sol.html +++ b/doc/general/test/coverage/lcov-report/contracts/modules/wrapper/extensions/DocumentModule.sol.html @@ -186,7 +186,7 @@

      -382× +383× 12× 12× 12× @@ -352,7 +352,7 @@

diff --git a/doc/general/test/coverage/lcov-report/contracts/modules/wrapper/extensions/ERC20SnapshotModule.sol.html b/doc/general/test/coverage/lcov-report/contracts/modules/wrapper/extensions/ERC20SnapshotModule.sol.html index f0c7c091..405ba87a 100644 --- a/doc/general/test/coverage/lcov-report/contracts/modules/wrapper/extensions/ERC20SnapshotModule.sol.html +++ b/doc/general/test/coverage/lcov-report/contracts/modules/wrapper/extensions/ERC20SnapshotModule.sol.html @@ -289,7 +289,7 @@

diff --git a/doc/general/test/coverage/lcov-report/contracts/modules/wrapper/extensions/MetaTxModule.sol.html b/doc/general/test/coverage/lcov-report/contracts/modules/wrapper/extensions/MetaTxModule.sol.html index 8a138cb0..a204efaa 100644 --- a/doc/general/test/coverage/lcov-report/contracts/modules/wrapper/extensions/MetaTxModule.sol.html +++ b/doc/general/test/coverage/lcov-report/contracts/modules/wrapper/extensions/MetaTxModule.sol.html @@ -115,7 +115,7 @@

diff --git a/doc/general/test/coverage/lcov-report/contracts/modules/wrapper/extensions/index.html b/doc/general/test/coverage/lcov-report/contracts/modules/wrapper/extensions/index.html index decf28ce..4d80eba3 100644 --- a/doc/general/test/coverage/lcov-report/contracts/modules/wrapper/extensions/index.html +++ b/doc/general/test/coverage/lcov-report/contracts/modules/wrapper/extensions/index.html @@ -116,7 +116,7 @@

diff --git a/doc/general/test/coverage/lcov-report/contracts/test/proxy/CMTAT_PROXY_TEST.sol.html b/doc/general/test/coverage/lcov-report/contracts/test/proxy/CMTAT_PROXY_TEST.sol.html index 5bc6f0c8..f951aa06 100644 --- a/doc/general/test/coverage/lcov-report/contracts/test/proxy/CMTAT_PROXY_TEST.sol.html +++ b/doc/general/test/coverage/lcov-report/contracts/test/proxy/CMTAT_PROXY_TEST.sol.html @@ -64,7 +64,9 @@

19 20 21 -22  +22 +23  +        @@ -91,6 +93,7 @@

  import "../../CMTAT_PROXY.sol";   +  /** * @title a contrat used to test the proxy upgrade functionality */ @@ -112,7 +115,7 @@

diff --git a/doc/general/test/coverage/lcov-report/contracts/test/proxy/CMTAT_PROXY_TEST_UUPS.sol.html b/doc/general/test/coverage/lcov-report/contracts/test/proxy/CMTAT_PROXY_TEST_UUPS.sol.html index 6a50bb09..aa1985b7 100644 --- a/doc/general/test/coverage/lcov-report/contracts/test/proxy/CMTAT_PROXY_TEST_UUPS.sol.html +++ b/doc/general/test/coverage/lcov-report/contracts/test/proxy/CMTAT_PROXY_TEST_UUPS.sol.html @@ -64,7 +64,9 @@

19 20 21 -22  +22 +23  +        @@ -91,6 +93,7 @@

  import "../../CMTAT_PROXY_UUPS.sol";   +  /** * @title a contrat used to test the proxy upgrade functionality */ @@ -112,7 +115,7 @@

diff --git a/doc/general/test/coverage/lcov-report/contracts/test/proxy/index.html b/doc/general/test/coverage/lcov-report/contracts/test/proxy/index.html index 45758912..0e09264a 100644 --- a/doc/general/test/coverage/lcov-report/contracts/test/proxy/index.html +++ b/doc/general/test/coverage/lcov-report/contracts/test/proxy/index.html @@ -90,7 +90,7 @@

diff --git a/doc/general/test/coverage/lcov-report/index.html b/doc/general/test/coverage/lcov-report/index.html index 1f7b85a2..f002f99b 100644 --- a/doc/general/test/coverage/lcov-report/index.html +++ b/doc/general/test/coverage/lcov-report/index.html @@ -259,7 +259,7 @@

diff --git a/doc/general/test/coverage/lcov.info b/doc/general/test/coverage/lcov.info index 139c48ec..3e6109f2 100644 --- a/doc/general/test/coverage/lcov.info +++ b/doc/general/test/coverage/lcov.info @@ -1,52 +1,52 @@ TN: -SF:/home/ryan/Downloads/CM/CMTAT_old2/contracts/CMTAT_PROXY_UUPS.sol -FN:19,constructor -FN:40,initialize -FN:52,_authorizeUpgrade +SF:/home/ryan/Downloads/CM/CMTAT/contracts/CMTAT_PROXY_UUPS.sol +FN:20,constructor +FN:41,initialize +FN:53,_authorizeUpgrade FNF:3 FNH:3 FNDA:9,constructor FNDA:5,initialize FNDA:2,_authorizeUpgrade -DA:21,9 -DA:41,5 -DA:45,5 +DA:22,9 +DA:42,5 +DA:46,5 LF:3 LH:3 -BRDA:40,1,0,5 -BRDA:40,1,1,0 -BRDA:52,2,0,2 -BRDA:52,2,1,1 +BRDA:41,1,0,5 +BRDA:41,1,1,0 +BRDA:53,2,0,2 +BRDA:53,2,1,1 BRF:4 BRH:3 end_of_record TN: -SF:/home/ryan/Downloads/CM/CMTAT_old2/contracts/CMTAT_PROXY.sol -FN:18,constructor +SF:/home/ryan/Downloads/CM/CMTAT/contracts/CMTAT_PROXY.sol +FN:19,constructor FNF:1 FNH:1 FNDA:198,constructor -DA:20,198 +DA:21,198 LF:1 LH:1 BRF:0 BRH:0 end_of_record TN: -SF:/home/ryan/Downloads/CM/CMTAT_old2/contracts/CMTAT_STANDALONE.sol -FN:26,constructor +SF:/home/ryan/Downloads/CM/CMTAT/contracts/CMTAT_STANDALONE.sol +FN:27,constructor FNF:1 FNH:1 FNDA:191,constructor -DA:29,191 +DA:30,191 LF:1 LH:1 BRF:0 BRH:0 end_of_record TN: -SF:/home/ryan/Downloads/CM/CMTAT_old2/contracts/deployment/CMTAT_BEACON_FACTORY.sol -FN:23,constructor +SF:/home/ryan/Downloads/CM/CMTAT/contracts/deployment/CMTAT_BEACON_FACTORY.sol +FN:22,constructor FN:44,deployCMTAT FN:58,computedProxyAddress FN:72,implementation @@ -54,51 +54,51 @@ FN:83,_deployBytecode FN:97,_getBytecode FNF:6 FNH:6 -FNDA:8,constructor -FNDA:2,deployCMTAT +FNDA:7,constructor +FNDA:3,deployCMTAT FNDA:2,computedProxyAddress FNDA:1,implementation -FNDA:2,_deployBytecode -FNDA:4,_getBytecode -DA:24,8 -DA:25,1 -DA:27,7 +FNDA:3,_deployBytecode +FNDA:5,_getBytecode +DA:23,7 +DA:24,1 +DA:26,6 DA:28,1 DA:30,6 -DA:45,2 -DA:46,2 -DA:49,2 -DA:50,2 +DA:45,3 +DA:46,3 +DA:49,3 +DA:50,3 DA:62,2 DA:65,2 DA:73,1 -DA:84,2 -DA:85,2 -DA:86,2 -DA:87,2 -DA:88,2 -DA:89,2 -DA:90,2 -DA:100,4 -DA:107,4 +DA:84,3 +DA:85,3 +DA:86,3 +DA:87,3 +DA:88,3 +DA:89,3 +DA:90,3 +DA:100,5 +DA:107,5 LF:21 LH:21 -BRDA:24,1,0,1 -BRDA:24,1,1,7 -BRDA:27,2,0,1 -BRDA:27,2,1,6 -BRDA:44,3,0,2 +BRDA:23,1,0,1 +BRDA:23,1,1,6 +BRDA:26,2,0,1 +BRDA:26,2,1,5 +BRDA:44,3,0,3 BRDA:44,3,1,1 BRF:6 BRH:6 end_of_record TN: -SF:/home/ryan/Downloads/CM/CMTAT_old2/contracts/deployment/CMTAT_TP_FACTORY.sol -FN:15,constructor -FN:28,deployCMTAT -FN:44,computedProxyAddress -FN:64,_deployBytecode -FN:78,_getBytecode +SF:/home/ryan/Downloads/CM/CMTAT/contracts/deployment/CMTAT_TP_FACTORY.sol +FN:22,constructor +FN:35,deployCMTAT +FN:51,computedProxyAddress +FN:71,_deployBytecode +FN:85,_getBytecode FNF:5 FNH:5 FNDA:9,constructor @@ -106,35 +106,35 @@ FNDA:7,deployCMTAT FNDA:2,computedProxyAddress FNDA:5,_deployBytecode FNDA:7,_getBytecode -DA:29,7 -DA:30,5 -DA:33,5 -DA:35,5 -DA:49,2 -DA:52,2 -DA:65,5 -DA:66,5 -DA:67,5 -DA:68,5 -DA:69,5 -DA:70,5 -DA:71,5 -DA:81,7 +DA:36,7 +DA:37,5 +DA:40,5 +DA:42,5 +DA:56,2 +DA:59,2 +DA:72,5 +DA:73,5 +DA:74,5 +DA:75,5 +DA:76,5 +DA:77,5 +DA:78,5 DA:88,7 +DA:95,7 LF:15 LH:15 -BRDA:28,1,0,7 -BRDA:28,1,1,2 +BRDA:35,1,0,7 +BRDA:35,1,1,2 BRF:2 BRH:2 end_of_record TN: -SF:/home/ryan/Downloads/CM/CMTAT_old2/contracts/deployment/CMTAT_UUPS_FACTORY.sol -FN:18,constructor -FN:31,deployCMTAT -FN:46,computedProxyAddress -FN:63,_deployBytecode -FN:77,_getBytecode +SF:/home/ryan/Downloads/CM/CMTAT/contracts/deployment/CMTAT_UUPS_FACTORY.sol +FN:21,constructor +FN:34,deployCMTAT +FN:49,computedProxyAddress +FN:66,_deployBytecode +FN:80,_getBytecode FNF:5 FNH:5 FNDA:5,constructor @@ -142,30 +142,30 @@ FNDA:2,deployCMTAT FNDA:2,computedProxyAddress FNDA:2,_deployBytecode FNDA:4,_getBytecode -DA:32,2 -DA:33,2 +DA:35,2 DA:36,2 -DA:38,2 -DA:50,2 +DA:39,2 +DA:41,2 DA:53,2 -DA:64,2 -DA:65,2 -DA:66,2 +DA:56,2 DA:67,2 DA:68,2 DA:69,2 DA:70,2 -DA:80,4 -DA:87,4 +DA:71,2 +DA:72,2 +DA:73,2 +DA:83,4 +DA:90,4 LF:15 LH:15 -BRDA:31,1,0,2 -BRDA:31,1,1,1 +BRDA:34,1,0,2 +BRDA:34,1,1,1 BRF:2 BRH:2 end_of_record TN: -SF:/home/ryan/Downloads/CM/CMTAT_old2/contracts/deployment/libraries/CMTATFactoryBase.sol +SF:/home/ryan/Downloads/CM/CMTAT/contracts/deployment/libraries/CMTATFactoryBase.sol FN:18,constructor FNF:1 FNH:1 @@ -181,7 +181,7 @@ BRF:2 BRH:2 end_of_record TN: -SF:/home/ryan/Downloads/CM/CMTAT_old2/contracts/deployment/libraries/CMTATFactoryInvariant.sol +SF:/home/ryan/Downloads/CM/CMTAT/contracts/deployment/libraries/CMTATFactoryInvariant.sol FNF:0 FNH:0 LF:0 @@ -190,43 +190,43 @@ BRF:0 BRH:0 end_of_record TN: -SF:/home/ryan/Downloads/CM/CMTAT_old2/contracts/deployment/libraries/CMTATFactoryRoot.sol +SF:/home/ryan/Downloads/CM/CMTAT/contracts/deployment/libraries/CMTATFactoryRoot.sol FN:25,constructor FN:45,CMTATProxyAddress FN:58,_checkAndDetermineDeploymentSalt FNF:3 FNH:3 -FNDA:27,constructor -FNDA:13,CMTATProxyAddress -FNDA:11,_checkAndDetermineDeploymentSalt -DA:26,27 -DA:27,3 -DA:29,24 -DA:30,15 -DA:32,24 -DA:33,24 -DA:46,13 -DA:59,11 +FNDA:25,constructor +FNDA:14,CMTATProxyAddress +FNDA:12,_checkAndDetermineDeploymentSalt +DA:26,25 +DA:27,2 +DA:29,23 +DA:30,13 +DA:32,23 +DA:33,23 +DA:46,14 +DA:59,12 DA:60,5 DA:61,2 DA:63,3 DA:64,3 -DA:67,6 +DA:67,7 LF:13 LH:13 -BRDA:26,1,0,3 -BRDA:26,1,1,24 -BRDA:29,2,0,15 -BRDA:29,2,1,9 +BRDA:26,1,0,2 +BRDA:26,1,1,23 +BRDA:29,2,0,13 +BRDA:29,2,1,10 BRDA:59,3,0,5 -BRDA:59,3,1,6 +BRDA:59,3,1,7 BRDA:60,4,0,2 BRDA:60,4,1,3 BRF:8 BRH:8 end_of_record TN: -SF:/home/ryan/Downloads/CM/CMTAT_old2/contracts/interfaces/draft-IERC1404/draft-IERC1404.sol +SF:/home/ryan/Downloads/CM/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404.sol FNF:0 FNH:0 LF:0 @@ -235,7 +235,7 @@ BRF:0 BRH:0 end_of_record TN: -SF:/home/ryan/Downloads/CM/CMTAT_old2/contracts/interfaces/draft-IERC1404/draft-IERC1404EnumCode.sol +SF:/home/ryan/Downloads/CM/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404EnumCode.sol FNF:0 FNH:0 LF:0 @@ -244,7 +244,7 @@ BRF:0 BRH:0 end_of_record TN: -SF:/home/ryan/Downloads/CM/CMTAT_old2/contracts/interfaces/draft-IERC1404/draft-IERC1404Wrapper.sol +SF:/home/ryan/Downloads/CM/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404Wrapper.sol FNF:0 FNH:0 LF:0 @@ -253,7 +253,7 @@ BRF:0 BRH:0 end_of_record TN: -SF:/home/ryan/Downloads/CM/CMTAT_old2/contracts/interfaces/engine/draft-IERC1643.sol +SF:/home/ryan/Downloads/CM/CMTAT/contracts/interfaces/engine/draft-IERC1643.sol FNF:0 FNH:0 LF:0 @@ -262,7 +262,7 @@ BRF:0 BRH:0 end_of_record TN: -SF:/home/ryan/Downloads/CM/CMTAT_old2/contracts/interfaces/engine/IAuthorizationEngine.sol +SF:/home/ryan/Downloads/CM/CMTAT/contracts/interfaces/engine/IAuthorizationEngine.sol FNF:0 FNH:0 LF:0 @@ -271,7 +271,7 @@ BRF:0 BRH:0 end_of_record TN: -SF:/home/ryan/Downloads/CM/CMTAT_old2/contracts/interfaces/engine/IDebtEngine.sol +SF:/home/ryan/Downloads/CM/CMTAT/contracts/interfaces/engine/IDebtEngine.sol FNF:0 FNH:0 LF:0 @@ -280,7 +280,7 @@ BRF:0 BRH:0 end_of_record TN: -SF:/home/ryan/Downloads/CM/CMTAT_old2/contracts/interfaces/engine/IDebtGlobal.sol +SF:/home/ryan/Downloads/CM/CMTAT/contracts/interfaces/engine/IDebtGlobal.sol FNF:0 FNH:0 LF:0 @@ -289,7 +289,7 @@ BRF:0 BRH:0 end_of_record TN: -SF:/home/ryan/Downloads/CM/CMTAT_old2/contracts/interfaces/engine/IRuleEngine.sol +SF:/home/ryan/Downloads/CM/CMTAT/contracts/interfaces/engine/IRuleEngine.sol FNF:0 FNH:0 LF:0 @@ -298,7 +298,7 @@ BRF:0 BRH:0 end_of_record TN: -SF:/home/ryan/Downloads/CM/CMTAT_old2/contracts/interfaces/ICCIPToken.sol +SF:/home/ryan/Downloads/CM/CMTAT/contracts/interfaces/ICCIPToken.sol FNF:0 FNH:0 LF:0 @@ -307,7 +307,7 @@ BRF:0 BRH:0 end_of_record TN: -SF:/home/ryan/Downloads/CM/CMTAT_old2/contracts/interfaces/ICMTATConstructor.sol +SF:/home/ryan/Downloads/CM/CMTAT/contracts/interfaces/ICMTATConstructor.sol FNF:0 FNH:0 LF:0 @@ -316,7 +316,7 @@ BRF:0 BRH:0 end_of_record TN: -SF:/home/ryan/Downloads/CM/CMTAT_old2/contracts/interfaces/ICMTATSnapshot.sol +SF:/home/ryan/Downloads/CM/CMTAT/contracts/interfaces/ICMTATSnapshot.sol FNF:0 FNH:0 LF:0 @@ -325,7 +325,7 @@ BRF:0 BRH:0 end_of_record TN: -SF:/home/ryan/Downloads/CM/CMTAT_old2/contracts/libraries/Errors.sol +SF:/home/ryan/Downloads/CM/CMTAT/contracts/libraries/Errors.sol FNF:0 FNH:0 LF:0 @@ -334,7 +334,7 @@ BRF:0 BRH:0 end_of_record TN: -SF:/home/ryan/Downloads/CM/CMTAT_old2/contracts/libraries/FactoryErrors.sol +SF:/home/ryan/Downloads/CM/CMTAT/contracts/libraries/FactoryErrors.sol FNF:0 FNH:0 LF:0 @@ -343,7 +343,7 @@ BRF:0 BRH:0 end_of_record TN: -SF:/home/ryan/Downloads/CM/CMTAT_old2/contracts/modules/CMTAT_BASE.sol +SF:/home/ryan/Downloads/CM/CMTAT/contracts/modules/CMTAT_BASE.sol FN:64,initialize FN:82,__CMTAT_init FN:131,__CMTAT_init_unchained @@ -356,64 +356,64 @@ FN:223,_contextSuffixLength FN:232,_msgData FNF:10 FNH:9 -FNDA:384,initialize -FNDA:384,__CMTAT_init -FNDA:382,__CMTAT_init_unchained +FNDA:385,initialize +FNDA:385,__CMTAT_init +FNDA:383,__CMTAT_init_unchained FNDA:2,decimals FNDA:10,transferFrom FNDA:6,burnAndMint -FNDA:438,_update -FNDA:1389,_msgSender -FNDA:1389,_contextSuffixLength +FNDA:439,_update +FNDA:1391,_msgSender +FNDA:1391,_contextSuffixLength FNDA:0,_msgData -DA:65,384 -DA:85,384 -DA:86,384 -DA:88,384 -DA:90,384 -DA:91,384 -DA:94,384 -DA:99,384 -DA:100,384 -DA:102,384 -DA:106,384 -DA:107,382 -DA:108,382 -DA:110,382 -DA:111,382 -DA:113,382 -DA:114,382 -DA:120,382 -DA:121,382 -DA:122,382 -DA:125,382 -DA:128,382 +DA:65,385 +DA:85,385 +DA:86,385 +DA:88,385 +DA:90,385 +DA:91,385 +DA:94,385 +DA:99,385 +DA:100,385 +DA:102,385 +DA:106,385 +DA:107,383 +DA:108,383 +DA:110,383 +DA:111,383 +DA:113,383 +DA:114,383 +DA:120,383 +DA:121,383 +DA:122,383 +DA:125,383 +DA:128,383 DA:150,2 DA:163,10 DA:178,6 DA:179,4 -DA:194,438 +DA:194,439 DA:195,17 -DA:202,421 -DA:203,421 -DA:217,1389 -DA:226,1389 +DA:202,422 +DA:203,422 +DA:217,1391 +DA:226,1391 DA:238,0 LF:33 LH:32 -BRDA:64,1,0,384 +BRDA:64,1,0,385 BRDA:64,1,1,1 -BRDA:82,2,0,384 +BRDA:82,2,0,385 BRDA:82,2,1,0 -BRDA:131,3,0,382 +BRDA:131,3,0,383 BRDA:131,3,1,0 BRDA:194,4,0,17 -BRDA:194,4,1,421 +BRDA:194,4,1,422 BRF:8 BRH:6 end_of_record TN: -SF:/home/ryan/Downloads/CM/CMTAT_old2/contracts/modules/internal/base/SnapshotModuleBase.sol +SF:/home/ryan/Downloads/CM/CMTAT/contracts/modules/internal/base/SnapshotModuleBase.sol FN:70,__SnapshotModuleBase_init_unchained FN:82,getAllSnapshots FN:91,getNextSnapshots @@ -434,7 +434,7 @@ FN:420,_checkTimeSnapshotAlreadyDone FN:427,_getSnapshotModuleBaseStorage FNF:18 FNH:18 -FNDA:384,__SnapshotModuleBase_init_unchained +FNDA:385,__SnapshotModuleBase_init_unchained FNDA:2,getAllSnapshots FNDA:76,getNextSnapshots FNDA:170,_scheduleSnapshot @@ -443,15 +443,15 @@ FNDA:22,_rescheduleSnapshot FNDA:14,_unscheduleLastSnapshot FNDA:10,_unscheduleSnapshotNotOptimized FNDA:1920,_valueAt -FNDA:842,_updateSnapshot -FNDA:421,_setCurrentSnapshot -FNDA:842,_lastSnapshot +FNDA:844,_updateSnapshot +FNDA:422,_setCurrentSnapshot +FNDA:844,_lastSnapshot FNDA:36,_findScheduledSnapshotIndex -FNDA:489,_findScheduledMostRecentPastSnapshot +FNDA:490,_findScheduledMostRecentPastSnapshot FNDA:26,_findAndRevertScheduledSnapshotIndex FNDA:202,_checkTimeInThePast FNDA:46,_checkTimeSnapshotAlreadyDone -FNDA:4856,_getSnapshotModuleBaseStorage +FNDA:4862,_getSnapshotModuleBaseStorage DA:83,2 DA:84,2 DA:92,76 @@ -523,18 +523,18 @@ DA:282,1920 DA:284,1920 DA:285,1484 DA:287,436 -DA:301,842 -DA:302,842 -DA:303,842 +DA:301,844 +DA:302,844 +DA:303,844 DA:304,36 DA:305,36 -DA:315,421 -DA:316,421 -DA:320,421 +DA:315,422 +DA:316,422 +DA:320,422 DA:321,18 DA:322,18 -DA:332,842 -DA:333,834 +DA:332,844 +DA:333,836 DA:335,8 DA:346,36 DA:347,36 @@ -543,10 +543,10 @@ DA:350,36 DA:354,22 DA:358,8 DA:362,6 -DA:375,489 -DA:376,489 -DA:378,489 -DA:382,403 +DA:375,490 +DA:376,490 +DA:378,490 +DA:382,404 DA:385,86 DA:386,86 DA:388,86 @@ -563,10 +563,10 @@ DA:413,202 DA:414,6 DA:421,46 DA:422,6 -DA:428,4856 +DA:428,4862 LF:112 LH:112 -BRDA:70,1,0,384 +BRDA:70,1,0,385 BRDA:70,1,1,0 BRDA:95,2,0,68 BRDA:95,2,1,8 @@ -603,18 +603,18 @@ BRDA:232,17,1,6 BRDA:284,18,0,1484 BRDA:284,18,1,436 BRDA:303,19,0,36 -BRDA:303,19,1,806 +BRDA:303,19,1,808 BRDA:320,20,0,18 -BRDA:320,20,1,403 -BRDA:332,21,0,834 +BRDA:320,20,1,404 +BRDA:332,21,0,836 BRDA:332,21,1,8 BRDA:350,22,0,22 BRDA:350,22,1,14 BRDA:357,23,0,8 BRDA:357,23,1,6 -BRDA:378,24,0,403 +BRDA:378,24,0,404 BRDA:378,24,1,86 -BRDA:379,25,0,403 +BRDA:379,25,0,404 BRDA:379,25,1,0 BRDA:389,26,0,52 BRDA:389,26,1,64 @@ -628,7 +628,7 @@ BRF:58 BRH:56 end_of_record TN: -SF:/home/ryan/Downloads/CM/CMTAT_old2/contracts/modules/internal/EnforcementModuleInternal.sol +SF:/home/ryan/Downloads/CM/CMTAT/contracts/modules/internal/EnforcementModuleInternal.sol FN:53,__Enforcement_init_unchained FN:64,frozen FN:79,_freeze @@ -636,13 +636,13 @@ FN:97,_unfreeze FN:112,_getEnforcementModuleInternalStorage FNF:5 FNH:5 -FNDA:384,__Enforcement_init_unchained -FNDA:944,frozen +FNDA:385,__Enforcement_init_unchained +FNDA:946,frozen FNDA:22,_freeze FNDA:8,_unfreeze -FNDA:974,_getEnforcementModuleInternalStorage -DA:65,944 -DA:66,944 +FNDA:976,_getEnforcementModuleInternalStorage +DA:65,946 +DA:66,946 DA:83,22 DA:84,22 DA:85,2 @@ -655,10 +655,10 @@ DA:103,2 DA:105,6 DA:106,6 DA:108,6 -DA:113,974 +DA:113,976 LF:15 LH:15 -BRDA:53,1,0,384 +BRDA:53,1,0,385 BRDA:53,1,1,0 BRDA:84,2,0,2 BRDA:84,2,1,20 @@ -668,7 +668,7 @@ BRF:6 BRH:5 end_of_record TN: -SF:/home/ryan/Downloads/CM/CMTAT_old2/contracts/modules/internal/ERC20SnapshotModuleInternal.sol +SF:/home/ryan/Downloads/CM/CMTAT/contracts/modules/internal/ERC20SnapshotModuleInternal.sol FN:21,__ERC20Snapshot_init_unchained FN:34,snapshotInfo FN:43,snapshotInfoBatch @@ -680,15 +680,15 @@ FN:127,_updateAccountSnapshot FN:135,_updateTotalSupplySnapshot FNF:9 FNH:9 -FNDA:384,__ERC20Snapshot_init_unchained +FNDA:385,__ERC20Snapshot_init_unchained FNDA:480,snapshotInfo FNDA:160,snapshotInfoBatch FNDA:80,snapshotInfoBatch FNDA:1200,snapshotBalanceOf FNDA:720,snapshotTotalSupply -FNDA:421,_snapshotUpdate -FNDA:464,_updateAccountSnapshot -FNDA:378,_updateTotalSupplySnapshot +FNDA:422,_snapshotUpdate +FNDA:465,_updateAccountSnapshot +FNDA:379,_updateTotalSupplySnapshot DA:35,480 DA:36,480 DA:44,160 @@ -705,35 +705,35 @@ DA:77,1200 DA:86,720 DA:87,720 DA:91,720 -DA:106,421 -DA:107,421 +DA:106,422 +DA:107,422 DA:109,77 DA:110,77 DA:112,43 DA:115,34 -DA:119,344 -DA:120,344 -DA:128,464 -DA:129,464 -DA:136,378 -DA:137,378 +DA:119,345 +DA:120,345 +DA:128,465 +DA:129,465 +DA:136,379 +DA:137,379 LF:28 LH:28 -BRDA:21,1,0,384 +BRDA:21,1,0,385 BRDA:21,1,1,0 BRDA:77,2,0,400 BRDA:77,2,1,800 BRDA:91,3,0,36 BRDA:91,3,1,684 BRDA:107,4,0,77 -BRDA:107,4,1,344 +BRDA:107,4,1,345 BRDA:110,5,0,43 BRDA:110,5,1,34 BRF:10 BRH:9 end_of_record TN: -SF:/home/ryan/Downloads/CM/CMTAT_old2/contracts/modules/internal/ValidationModuleInternal.sol +SF:/home/ryan/Downloads/CM/CMTAT/contracts/modules/internal/ValidationModuleInternal.sol FN:32,__Validation_init_unchained FN:45,ruleEngine FN:58,_validateTransfer @@ -743,14 +743,14 @@ FN:89,_operateOnTransfer FN:96,_getValidationModuleInternalStorage FNF:7 FNH:7 -FNDA:384,__Validation_init_unchained +FNDA:385,__Validation_init_unchained FNDA:32,ruleEngine FNDA:12,_validateTransfer FNDA:6,_messageForTransferRestriction FNDA:6,_detectTransferRestriction FNDA:60,_operateOnTransfer -FNDA:628,_getValidationModuleInternalStorage -DA:33,384 +FNDA:629,_getValidationModuleInternalStorage +DA:33,385 DA:34,18 DA:35,18 DA:36,18 @@ -764,18 +764,18 @@ DA:85,6 DA:86,6 DA:90,60 DA:91,60 -DA:97,628 +DA:97,629 LF:15 LH:15 -BRDA:32,1,0,384 +BRDA:32,1,0,385 BRDA:32,1,1,0 BRDA:33,2,0,18 -BRDA:33,2,1,366 +BRDA:33,2,1,367 BRF:4 BRH:3 end_of_record TN: -SF:/home/ryan/Downloads/CM/CMTAT_old2/contracts/modules/security/AuthorizationModule.sol +SF:/home/ryan/Downloads/CM/CMTAT/contracts/modules/security/AuthorizationModule.sol FN:31,__AuthorizationModule_init_unchained FN:48,authorizationEngine FN:60,setAuthorizationEngine @@ -785,17 +785,17 @@ FN:96,hasRole FN:114,_getAuthorizationModuleStorage FNF:7 FNH:7 -FNDA:384,__AuthorizationModule_init_unchained +FNDA:385,__AuthorizationModule_init_unchained FNDA:2,authorizationEngine FNDA:16,setAuthorizationEngine FNDA:40,grantRole FNDA:10,revokeRole -FNDA:1283,hasRole +FNDA:1285,hasRole FNDA:84,_getAuthorizationModuleStorage -DA:32,384 +DA:32,385 DA:33,2 -DA:35,382 -DA:36,382 +DA:35,383 +DA:36,383 DA:37,16 DA:38,16 DA:39,16 @@ -818,18 +818,18 @@ DA:84,8 DA:85,8 DA:87,4 DA:90,6 -DA:101,1283 -DA:102,759 -DA:104,524 +DA:101,1285 +DA:102,760 +DA:104,525 DA:115,84 LF:30 LH:30 -BRDA:31,1,0,384 +BRDA:31,1,0,385 BRDA:31,1,1,0 BRDA:32,2,0,2 -BRDA:32,2,1,382 +BRDA:32,2,1,383 BRDA:36,3,0,16 -BRDA:36,3,1,366 +BRDA:36,3,1,367 BRDA:60,4,0,16 BRDA:60,4,1,4 BRDA:62,5,0,4 @@ -846,13 +846,13 @@ BRDA:83,10,0,8 BRDA:83,10,1,2 BRDA:85,11,0,4 BRDA:85,11,1,4 -BRDA:101,12,0,759 -BRDA:101,12,1,524 +BRDA:101,12,0,760 +BRDA:101,12,1,525 BRF:24 BRH:23 end_of_record TN: -SF:/home/ryan/Downloads/CM/CMTAT_old2/contracts/modules/wrapper/controllers/ValidationModule.sol +SF:/home/ryan/Downloads/CM/CMTAT/contracts/modules/wrapper/controllers/ValidationModule.sol FN:28,__ValidationModule_init_unchained FN:43,setRuleEngine FN:57,messageForTransferRestriction @@ -862,13 +862,13 @@ FN:130,_validateTransferByModule FN:141,_operateOnTransfer FNF:7 FNH:7 -FNDA:382,__ValidationModule_init_unchained +FNDA:383,__ValidationModule_init_unchained FNDA:18,setRuleEngine FNDA:20,messageForTransferRestriction FNDA:17,detectTransferRestriction FNDA:19,validateTransfer -FNDA:457,_validateTransferByModule -FNDA:438,_operateOnTransfer +FNDA:458,_validateTransferByModule +FNDA:439,_operateOnTransfer DA:44,18 DA:45,18 DA:46,3 @@ -895,18 +895,18 @@ DA:119,15 DA:120,15 DA:121,12 DA:123,3 -DA:135,457 +DA:135,458 DA:136,18 -DA:138,439 -DA:142,438 +DA:138,440 +DA:142,439 DA:143,14 -DA:145,424 -DA:146,424 +DA:145,425 +DA:146,425 DA:147,60 -DA:149,364 +DA:149,365 LF:35 LH:35 -BRDA:28,1,0,382 +BRDA:28,1,0,383 BRDA:28,1,1,0 BRDA:43,2,0,18 BRDA:43,2,1,3 @@ -935,20 +935,20 @@ BRDA:116,13,1,15 BRDA:120,14,0,12 BRDA:120,14,1,3 BRDA:135,15,0,18 -BRDA:135,15,1,439 +BRDA:135,15,1,440 BRDA:135,16,0,12 BRDA:135,16,1,4 BRDA:135,17,0,4 BRDA:135,17,1,2 BRDA:142,18,0,14 -BRDA:142,18,1,424 +BRDA:142,18,1,425 BRDA:146,19,0,60 -BRDA:146,19,1,364 +BRDA:146,19,1,365 BRF:38 BRH:37 end_of_record TN: -SF:/home/ryan/Downloads/CM/CMTAT_old2/contracts/modules/wrapper/core/BaseModule.sol +SF:/home/ryan/Downloads/CM/CMTAT/contracts/modules/wrapper/core/BaseModule.sol FN:44,__Base_init_unchained FN:55,tokenId FN:60,terms @@ -959,18 +959,18 @@ FN:96,setInformation FN:108,_getBaseModuleStorage FNF:8 FNH:8 -FNDA:382,__Base_init_unchained +FNDA:383,__Base_init_unchained FNDA:10,tokenId FNDA:10,terms FNDA:8,information FNDA:2,setTokenId FNDA:2,setTerms FNDA:2,setInformation -FNDA:416,_getBaseModuleStorage -DA:45,382 -DA:46,382 -DA:47,382 -DA:48,382 +FNDA:417,_getBaseModuleStorage +DA:45,383 +DA:46,383 +DA:47,383 +DA:48,383 DA:56,10 DA:57,10 DA:61,10 @@ -986,10 +986,10 @@ DA:88,2 DA:97,2 DA:98,2 DA:99,2 -DA:109,416 +DA:109,417 LF:20 LH:20 -BRDA:44,1,0,382 +BRDA:44,1,0,383 BRDA:44,1,1,0 BRDA:74,2,0,2 BRDA:74,2,1,2 @@ -1001,20 +1001,20 @@ BRF:8 BRH:7 end_of_record TN: -SF:/home/ryan/Downloads/CM/CMTAT_old2/contracts/modules/wrapper/core/EnforcementModule.sol +SF:/home/ryan/Downloads/CM/CMTAT/contracts/modules/wrapper/core/EnforcementModule.sol FN:27,__EnforcementModule_init_unchained FN:42,freeze FN:56,unfreeze FNF:3 FNH:3 -FNDA:382,__EnforcementModule_init_unchained +FNDA:383,__EnforcementModule_init_unchained FNDA:22,freeze FNDA:8,unfreeze DA:43,22 DA:57,8 LF:2 LH:2 -BRDA:27,1,0,382 +BRDA:27,1,0,383 BRDA:27,1,1,0 BRDA:42,2,0,22 BRDA:42,2,1,2 @@ -1024,7 +1024,7 @@ BRF:6 BRH:5 end_of_record TN: -SF:/home/ryan/Downloads/CM/CMTAT_old2/contracts/modules/wrapper/core/ERC20BaseModule.sol +SF:/home/ryan/Downloads/CM/CMTAT/contracts/modules/wrapper/core/ERC20BaseModule.sol FN:41,__ERC20BaseModule_init_unchained FN:53,decimals FN:70,transferBatch @@ -1033,14 +1033,14 @@ FN:119,balanceInfo FN:134,_getERC20BaseModuleStorage FNF:6 FNH:6 -FNDA:382,__ERC20BaseModule_init_unchained +FNDA:383,__ERC20BaseModule_init_unchained FNDA:2,decimals FNDA:10,transferBatch FNDA:10,transferFrom FNDA:4,balanceInfo -FNDA:384,_getERC20BaseModuleStorage -DA:42,382 -DA:43,382 +FNDA:385,_getERC20BaseModuleStorage +DA:42,383 +DA:43,383 DA:54,2 DA:55,2 DA:74,10 @@ -1058,10 +1058,10 @@ DA:120,4 DA:121,4 DA:122,2 DA:124,4 -DA:135,384 +DA:135,385 LF:20 LH:20 -BRDA:41,1,0,382 +BRDA:41,1,0,383 BRDA:41,1,1,0 BRDA:74,2,0,2 BRDA:74,2,1,8 @@ -1073,14 +1073,14 @@ BRF:8 BRH:6 end_of_record TN: -SF:/home/ryan/Downloads/CM/CMTAT_old2/contracts/modules/wrapper/core/ERC20BurnModule.sol +SF:/home/ryan/Downloads/CM/CMTAT/contracts/modules/wrapper/core/ERC20BurnModule.sol FN:32,__ERC20BurnModule_init_unchained FN:53,burn FN:77,burnBatch FN:109,burnFrom FNF:4 FNH:4 -FNDA:382,__ERC20BurnModule_init_unchained +FNDA:383,__ERC20BurnModule_init_unchained FNDA:14,burn FNDA:12,burnBatch FNDA:4,burnFrom @@ -1104,7 +1104,7 @@ DA:125,2 DA:127,2 LF:18 LH:18 -BRDA:32,1,0,382 +BRDA:32,1,0,383 BRDA:32,1,1,0 BRDA:53,2,0,14 BRDA:53,2,1,4 @@ -1122,17 +1122,17 @@ BRF:14 BRH:13 end_of_record TN: -SF:/home/ryan/Downloads/CM/CMTAT_old2/contracts/modules/wrapper/core/ERC20MintModule.sol +SF:/home/ryan/Downloads/CM/CMTAT/contracts/modules/wrapper/core/ERC20MintModule.sol FN:27,__ERC20MintModule_init_unchained FN:47,mint FN:70,mintBatch FNF:3 FNH:3 -FNDA:382,__ERC20MintModule_init_unchained -FNDA:290,mint +FNDA:383,__ERC20MintModule_init_unchained +FNDA:291,mint FNDA:24,mintBatch -DA:48,290 -DA:49,290 +DA:48,291 +DA:49,291 DA:71,24 DA:72,2 DA:76,22 @@ -1142,9 +1142,9 @@ DA:81,54 DA:82,54 LF:9 LH:9 -BRDA:27,1,0,382 +BRDA:27,1,0,383 BRDA:27,1,1,0 -BRDA:47,2,0,290 +BRDA:47,2,0,291 BRDA:47,2,1,4 BRDA:70,3,0,24 BRDA:70,3,1,2 @@ -1156,7 +1156,7 @@ BRF:10 BRH:9 end_of_record TN: -SF:/home/ryan/Downloads/CM/CMTAT_old2/contracts/modules/wrapper/core/PauseModule.sol +SF:/home/ryan/Downloads/CM/CMTAT/contracts/modules/wrapper/core/PauseModule.sol FN:34,__PauseModule_init_unchained FN:50,pause FN:62,unpause @@ -1165,7 +1165,7 @@ FN:92,deactivated FN:104,_getPauseModuleStorage FNF:6 FNH:6 -FNDA:382,__PauseModule_init_unchained +FNDA:383,__PauseModule_init_unchained FNDA:14,pause FNDA:6,unpause FNDA:2,deactivateContract @@ -1185,7 +1185,7 @@ DA:94,4 DA:105,12 LF:12 LH:12 -BRDA:34,1,0,382 +BRDA:34,1,0,383 BRDA:34,1,1,0 BRDA:50,2,0,14 BRDA:50,2,1,3 @@ -1199,7 +1199,7 @@ BRF:10 BRH:9 end_of_record TN: -SF:/home/ryan/Downloads/CM/CMTAT_old2/contracts/modules/wrapper/extensions/DebtModule.sol +SF:/home/ryan/Downloads/CM/CMTAT/contracts/modules/wrapper/extensions/DebtModule.sol FN:42,__DebtModule_init_unchained FN:54,debtEngine FN:65,setDebtEngine @@ -1208,13 +1208,13 @@ FN:81,creditEvents FN:94,_getDebtModuleStorage FNF:6 FNH:6 -FNDA:382,__DebtModule_init_unchained +FNDA:383,__DebtModule_init_unchained FNDA:8,debtEngine FNDA:5,setDebtEngine FNDA:3,debt FNDA:3,creditEvents FNDA:22,_getDebtModuleStorage -DA:43,382 +DA:43,383 DA:44,3 DA:45,3 DA:46,3 @@ -1234,10 +1234,10 @@ DA:84,2 DA:95,22 LF:18 LH:18 -BRDA:42,1,0,382 +BRDA:42,1,0,383 BRDA:42,1,1,0 BRDA:43,2,0,3 -BRDA:43,2,1,379 +BRDA:43,2,1,380 BRDA:65,3,0,5 BRDA:65,3,1,1 BRDA:67,4,0,1 @@ -1250,7 +1250,7 @@ BRF:12 BRH:11 end_of_record TN: -SF:/home/ryan/Downloads/CM/CMTAT_old2/contracts/modules/wrapper/extensions/DocumentModule.sol +SF:/home/ryan/Downloads/CM/CMTAT/contracts/modules/wrapper/extensions/DocumentModule.sol FN:42,__DocumentModule_init_unchained FN:53,documentEngine FN:64,setDocumentEngine @@ -1259,13 +1259,13 @@ FN:83,getAllDocuments FN:96,_getDocumentModuleStorage FNF:6 FNH:6 -FNDA:382,__DocumentModule_init_unchained +FNDA:383,__DocumentModule_init_unchained FNDA:28,documentEngine FNDA:16,setDocumentEngine FNDA:18,getDocument FNDA:6,getAllDocuments FNDA:80,_getDocumentModuleStorage -DA:43,382 +DA:43,383 DA:44,12 DA:45,12 DA:46,12 @@ -1286,10 +1286,10 @@ DA:86,4 DA:97,80 LF:19 LH:19 -BRDA:42,1,0,382 +BRDA:42,1,0,383 BRDA:42,1,1,0 BRDA:43,2,0,12 -BRDA:43,2,1,370 +BRDA:43,2,1,371 BRDA:64,3,0,16 BRDA:64,3,1,2 BRDA:66,4,0,2 @@ -1302,7 +1302,7 @@ BRF:12 BRH:11 end_of_record TN: -SF:/home/ryan/Downloads/CM/CMTAT_old2/contracts/modules/wrapper/extensions/ERC20SnapshotModule.sol +SF:/home/ryan/Downloads/CM/CMTAT/contracts/modules/wrapper/extensions/ERC20SnapshotModule.sol FN:22,__ERC20SnasphotModule_init_unchained FN:33,scheduleSnapshot FN:44,scheduleSnapshotNotOptimized @@ -1311,7 +1311,7 @@ FN:67,unscheduleLastSnapshot FN:77,unscheduleSnapshotNotOptimized FNF:6 FNH:6 -FNDA:382,__ERC20SnasphotModule_init_unchained +FNDA:383,__ERC20SnasphotModule_init_unchained FNDA:170,scheduleSnapshot FNDA:12,scheduleSnapshotNotOptimized FNDA:22,rescheduleSnapshot @@ -1324,7 +1324,7 @@ DA:68,14 DA:78,10 LF:5 LH:5 -BRDA:22,1,0,382 +BRDA:22,1,0,383 BRDA:22,1,1,0 BRDA:33,2,0,170 BRDA:33,2,1,2 @@ -1340,7 +1340,7 @@ BRF:12 BRH:11 end_of_record TN: -SF:/home/ryan/Downloads/CM/CMTAT_old2/contracts/modules/wrapper/extensions/MetaTxModule.sol +SF:/home/ryan/Downloads/CM/CMTAT/contracts/modules/wrapper/extensions/MetaTxModule.sol FN:19,constructor FNF:1 FNH:1 @@ -1351,8 +1351,8 @@ BRF:0 BRH:0 end_of_record TN: -SF:/home/ryan/Downloads/CM/CMTAT_old2/contracts/test/proxy/CMTAT_PROXY_TEST_UUPS.sol -FN:18,constructor +SF:/home/ryan/Downloads/CM/CMTAT/contracts/test/proxy/CMTAT_PROXY_TEST_UUPS.sol +FN:19,constructor FNF:1 FNH:1 FNDA:3,constructor @@ -1362,8 +1362,8 @@ BRF:0 BRH:0 end_of_record TN: -SF:/home/ryan/Downloads/CM/CMTAT_old2/contracts/test/proxy/CMTAT_PROXY_TEST.sol -FN:18,constructor +SF:/home/ryan/Downloads/CM/CMTAT/contracts/test/proxy/CMTAT_PROXY_TEST.sol +FN:19,constructor FNF:1 FNH:1 FNDA:1,constructor diff --git a/doc/schema/surya_graph/surya_graph_CMTAT_BEACON_FACTORY.sol.png b/doc/schema/surya_graph/surya_graph_CMTAT_BEACON_FACTORY.sol.png index c965fcfeea2655b55827b98aa5f921630d6cf6c2..a813914abd8c91ff04d7da280805ff96aef7100e 100644 GIT binary patch literal 181967 zcmd432UJzrwk?WUYN?pB5)1?d0TBVoW}@UARV3#u855`|2nZ-y$siy(2Ste@k|m4e zoFu2$7gBXk-QUjr_rG@EYk$|NIw*UuHP@VDj?qW&eeNgXqWs&p9@$DlLb6>@;Ho4E z$wn&@k`0A_Zo=Qpwq9Vv|82T0%zu?+h4?2VH`0rQWt&CTC zg>js?beSqeM)8)&mFB*bKUyUeC3S^o-|XO$jJ!>M;!RepgYC}eA@`S?&T1Tr5tK@) zdoz52`q03;m_wJkj!AgGcvy04X}M%tn$Crms@i2{Fv~QxQgJ3LzdhA6%f`MX)3@|2 z=@krS^`+;jC)G^;*PmkCj1R8;{BBnV6)Dgr`6)k;RW)J#lFfjqWpY0baqX6G)< zUFz-Gv5s@EMbhn;7AGrHTNS;ZQSzxuNJt2Yi6son5+fuj*x+n@@M4^N;_XM()z!68 z5+`4a(2!p+zWC_TBU3A@gyH&_JDo+({n!i?SI3W!P+Y`f=-%+6xltP?xVN#nIo5t* zIw>_ZZrEo;AoTik-R$4bGe&|nxygE4UA=p7kbd*#%{=3u_C9rYXR>f;&9bnW?~jy8 zH&mIMo71Tb;yF-h^7GS{8-biM&yTXp+Sp`ietC7=%F4>x+WIsjV|*=Hw&k#7q-bE* z(9pZ-;b!{Nr=xoekE}jI2pPun?&CyvdFtKq+n)= z4|iCa?|;tT_U+NOgXc}V1eW^696d|#c*e!WNlHo42b?^AUV5^(QchDdqUX!&P~zRc z`fGF>lftjNkwt&}cv-MIh{tx{u3aI#_VcG07;e-=iZyJev=jGtCpH=h33mwMa&ct; zfdh0WPF!YYW+pz{(%QP8oILL5&)XG&Tymbj8uFKAo*!YA6cBiffcP~(m@xQSD@Yl69~s%ZH&#{4(!x_y7PygMb&5`nbb>0+jo0U{$t9@PwdLBTsu%Cb{Z%b| zpz@Zw)HvmnVs}bkD(kySbr==qLN<2VP}n@RWdJpIwt)x{OGVRbwqS-VEoM_D-EdTE^#6(yi% zKjoceF-RjPCwIf2?S_Ykhmf$al%-{w<*HzSgSiL97%zBJl(aXmt zV%tH+K3t9yv&+$y>#&sNFyBu*HQKH=GBRRnZeIK4HH&v}aKhM_v9+yjc}2yIb?ep* zv}UJM=~Vc!Hs#r84-F07IrsXDnmhNzF(|2B{eYL)pck4Q8p1B9i9DOt5Wsk4BGQlJkJ~dxELN5)|Xt#TZ8>TC5ZiA zjUBs>oScE3ot;4?OZq6AzIc0{{nW>8Os7~_q!RL%vo`IdP#&%%N)!o6$Qhc@oOYKy z_h*NgFP}brx+%xn%piSzi1VkSqJc7R`mNiyvr?9qmrLR4oOe>j=i1K5&VM{lGUNL@ zaSBC8N2j)~UaR(@vh2wE_cpYm0pDIRs~a{?)+2@;XA3E@Ekxe`E&?N5VdNz5+Dg4> zr^=b~wTHeZa^4*aiC4~i+tQ*;&TA*XGNrZ>PV6B|*WW8#hic?hXWQ*9mtxX+9a&YD zDSt7Eo1439a4?otuU@-4Oi&m98vL~_hQIr)E3ki~RT(tUn5^|znl!F_Z~FhUs`h`Z zT>ejA*rXll-cL4O`Lv^>V=lHvs$zPY&F>Ufu;gNVP~++2$1h6n&`s4PX_V7dBqH%^ zXlT@lyZ9*OJLI<6P2QlUp(#5{>Kb2KRwgMe{gTtXFJ#m9BPG~|*z9$Fta|3Z`XrE* zXWRzb1er*TW6QJNX(&dNXDK(wt;T`w;SR>K^IBiY!o$N$i;MX^U%q$|;zcW_XlHL| z7=Pf5ytve`OliTr4HkXhj=L6*w&f~`@y>tXR9ANZ+h^A#jAq#a3RNK@c#5gIGT~EHr#UzjK79BvF*f$X)zuYw zQ=ZO=^|i=>Ry7neMzy?mB_$=2A4cMkR3js9__vv;2-~i6D%%$=;7qF0U|}CoiTPp` z->|)EmwhyoOxW8d!`;OA#UK1>B|-h>%^N>H$GmeaEUZ|xslf)ZNU>m9WKLF;d!j7U z&|FW}s`Q~!$+J^%z7-`J$f=lTmwA9m_1*03-SCKr7*vgc_Wb-EWEVnSyx3LY&n|ZO z@L>R!2CmVZlLrqTMBYuQw(+b@P~$_e^&=Z2s$O_{d9k9x(6u&)3;U+rD%`}u$r*!O z(Cxn_9QgX+S(=y`ZF<>AqO`DOn>{iM>ma%TiB--gS=<4?x0t&)~2)^_DGL z{LX1SMNNu)|NiXc)_S7u<1dN2pPoKr(69zBn$wNg^ItJ=aw;O%erw4z^M3Uz3T5Wn z_3JTLTy{)MPD+`YCQ&I!CuC&E1DknAMn-b;@azY8A+oX1j3uBJt~KDnPvP<4!GmiJ z()_JSq%~(%YErX~p5-f6F+q(!X+AvC2loUFVgvPROPK6CTwXgVkUi zS@%&zS^))sO3=;Ctw;Uq*RP&o_wV07m%w4#^%(0=hicsXm7L2`q&mU2DowX8rfh0@ zw4F(?DOtsMPjk#qKh$a{|pP|8aVm++}Qd-j<3 zd^!B+;lq;p`g-mjO@sc1;iC>*Ge)a8^1Q?1T@`G`FU$nm0`MKph!4*txu~J9LGLAE z`ZDzXzOaN}-VRkvis3Rg*Ahx()4au2*X+IG!|YQH2vqasMQg$84-YoW0C+Ag+ELT^ z&~6NNKpg^MO*>#(X+G5DW&OqP=!ZE z`rEz_Q$>S7B^WE0APWfg^XJbLvtH5e?(Y6#O2=BDjueYQSwU*1hX6(lGeH|RY?%76 znX+$oywheNIx^+<=dHw!1Ts9xsQhi9E_VO!-EY=y*i=$pKIk@}*tCsA`je=ojUbcG z^ZGtdM*KI**XFg{*zdq}#6wD5z4{RF+hU?iP*Ae>YhYcB4E;7YM?gS3&3t41qCBo9tNc}5wtJ^HIeRA zIt}qE>ACNR(~F)R4#hr=7WQSdnQ67EdwXr0wT%tksZ#=YN6p)7u4r=3sHwHnHMFMa zNO{|=b80vBaP`rRKIa{cWnFe(b`R)QZZ=r0hr0JlGp4LcMx{<(ev+_DmKHJ-sk`*nw|v9vnHZeGI76Vz@~L zFukfOl%LgVq=hTSmKK}g^yfLrD0led*<;J|2L!K=J*}OWQ3CGVg8JjC));;NG5Vn;v90A&592pdY8n&xdH0Q;a(< z54U7W<>lp-efg3Tnk6&5k;Kq!>21nasiyfPbIVj|?YZEJ)#+YvRWV?9YTvwb=T26` z7I|MLHAagT^cDn}&}Ki=O7|#Rz1U4gQc}_)-MSc2%W%XB+ka}HP8blpcBb8t3F%^z z11N$)A?YeFFE23c5Auf8l!GLvyTPLM^}M4h+J2(H^`@5-@*HSLVDc)xv%^{aKX>fDRDs;q zk{ul#L|cYLy?(=ny7#xP#3`lqFK_~s-mi@iWZ7x=2bwzyB|Mp zqUS65{P`NHz?uC8ej+rkBdll6h+qn2@7%c)eRD<@pO&hLxUrVP9zDBVdN%B>-D!=$ zlunuclYOvxr>uy`GtJ5%2Ei=5xg^p;@jy?v*t&ibcEA9s;4qI;ma41iq|ash{c-znn<8d;pb!=l8+uy zcU;SNSbFL09UjW>PQ;6lsAxTqTC913FQZDe^Y)`%eSJ}Am3+9q-Z`gJ|4yM!_8`fK zqRBm~D|BDHzkU{KwiOP}6t?9TJh)f*>*|&s;nFX6lEjkHD=RdGT-uO3(`JjY5}-B3 ze!<0YZp6@#M)9WNEoOcfx>E zj`8vFQPa{2dq#-7errA1bNbAgFFCiT>*UmAz&PNcyM~7eqGD>eSq|I)vCgsn_)_FD+0D+D;EuA!}mQ)O2&G zlaiCE1w}ZQMQ5yKd|z%km7<6H~8n%4MU{>FvX9UO8ne!$_9Mhf~K| zu08TQuk)5!y{N^q1zjYI<`;4BM+CBZ|Ni|}xkc5SyAqx+Jv~nt8I7JRerc8a{6=@S zOISn%9hf6L5a=4Oz`(%z1U0pOi*((#oXkvqq^qW*>6`;Tr!Opw^pY4mmI-^*v&Y&6 zJhv~UQ!Os4KDi;xwLi@tT^$ zTsW91sSdKgfXY($e-EhWs!!%SYAuN8dS0Aq&+}g9QL(W({$Z76ZE^Y2>Q-WUn~gAv z6d-*Ss27580q{75$1=)aO3Paq;hOyJAFH}Ow2PW|xGB{uHZ~UMJffsT0G-ikE-oeT zOW$6emZI_=Qll?j^i1(LG~6p8Eq#aAa`5}Zhkpcem|e%-0z=5^o~fWTZ?WLq{&h*o ztoN%o)pHP%a`7*789vs<%B9-PO>o8Q=`fMp+Rw`+NM@)%stC|2Jn?`1I{GNP;VB-TR=XTvT{K*N7fjwFJHPbzj|EZJ_xYgO`TQ1r zOdNU^0^FzRH@-!b*I}6?OM_C-9@HR_oHy$c>F({N=jK*!Yiq;gOCk1cW=7(`5g0Tk zUGo&GtNi!W49I{dR65AkWnaI_qFF-27oC&Cy#y+Spl{L)Tj>Oa1O&tl4Gl9ZkDom& zPH8uG&yA8VJ~GHgh+g)cxUO!@)~#F3J3elVQ_WS}y?ghOvp1b`a&ktZR$*PZK80t_ zdg_(Run^(uNk^|7wbL9shJ;EdCErR8nq(^UI-sodetvrL z^vM$m*8>b7-Kda1K&lD`a#_h@a@dU8&Ik@vg}PX?uA-pg%{$1VkXA~8oJ~wjJi{bH zub*aSmOy=|!=A5;mZAmwcp4Lo1frOx{~C>DZKN2bV0FAowxR8F)yv*b%wW`(%)jY(lK*Yt zU`RI`iQ9OztEVRh*`jFh`}glrhOJqws+)!Rcvhqxi9WC1Zi>SEE)iK>%Qz5E;acoGT(AfDHH11~NCbupkKSrWBn} zN{87uLS_ko78sySf4DCumB=;w4<0N(OM30<)!J|5-rqA!LXm?stG>5pTMd@d21}#R z)7acAo9sWx^@iXGl0o~BvhS6Wzj z1@yXZO~muLyLcd=B)Qy`rk+5am_ zyO}!82BL$Snp$QsAm2st_sui-5=|R~2rBm8y?dOt)9-la`%X@dfB!B&H$PwY;lm{{ z?(v5|J3FZb+wErpMQFT;->YPqm*%tA#$J+c`AQPKZ-|7X0H!=S&s(7qC{6>KkydQ6l=fRpk# zf?n=7TZ>S`YZ-cihdDd z!SOqJXG1>PW|{YUvgv<6#?Q|`HPo2gVnX93h@Ij|Wxp_-ZUZuS-+==W&z_N9C-Et6EAjEp`^AMj3aQc@Cu zcE~x+1xiaxk8oMO%ghHL*ZuT(H+EPxSmw9j^ZNN#Cizk=hnvpnA!|m)v^)Hc8SWo{ zTE)quL#GzR3(1>+eE?9kz@nMi+4P`;Kr`&myQ>fUkUre(54sY#O^8n6T63PgZDv;1 z00H)7Wqpu`&cv|m)}A67Cqx6Wk0G`=?;uy~;30@hXnzya(>@O#TnVo%I7^y4UUZa5 z41oPIk)q^;#32*t`jvL_j`qR8qxsg-+YqZq|Y`&E}`lN z#@_$6v!lbLInm#?larIv&mAEy?1@537iTp)c8lQlksX*=jld<-4N(KAc%qI;cVzg3 zgi1hRDs5;;uO0U|$uC4_{luSoMv4N0qo8E0Y@A^%Fpd0hV={k2?zA88(l4n=ZrhoW zI&e`_2vh&!bc1GD0^dL0eez5e)9(?7oXZifc)En&dkWnzc0I@>0*V&Sxy z^^}y9)czw!VnE7bVM@P#6&-9y@TCHuEHpoLcx@lC-t*3u)t{T__6!3}@=A>xT$Zhv zuAFRTTbruq%YXpoaO;0?Sh>~Xv&tXd|K$Z>f6(1o?A~q(5>M2fXIkESKrxhB%f7gak)-z}*Qx#M1Z#xad z1gxlh+U(13tZ15Q)UJwm)PPPyPEqF#_Vj#9FBh*};I!^QtNSlBF8<9bFIlhCHG0iL zjN7_piwET1x!H=r#l^+0pFiJ%ufIB)GwFs6VLmk=W6+XOwYVoENq22dWiFv^S%4@b zGla$|rTgiv!paoe z8AHesH!vGQA|fxT3|g~fKuv@8YECm?aknxyj(Q&imhHMbMI0CcoxX2xI31UBJUu;A z3|lz`C1*xjr=a|KTaTiS%>Q_>(|mE(glDQ&N)e4cD!UBiT+~8s6kP}=-<;NM==$*^ zBr56@_-mc9A0G&T6os82q$qf700B$hE-?Sa_yvy;j34;3$z(w>G4`3>?rv&9#ax?I zbXcgykwAiUOiW^Y%d??SU|X)u)Oqc1$Dm*eRvV;ZD5F0k*K7_u zPpp9wp2e|30y2Xi1R^{Qx(sB2HiiW%>>F|>)|You_zRWJzXPK6d@FNetOiZepxeEv zmYVaI{BfaZL=#b$JX7=<7&LBoeIGu(udgF z+p}5>NXMz=tAeWVL_bMrDOfU%a-V46E41?s3#0i704>qbFNh+PYS7GvGFi09lb0$h zGb6aRD@BSnjM;Yl#R*1j0L+AVWZo=%O7A`{YiDPtn-|4! zvsv{bkhE|S3B@3NHA_a({0rWOIfk&4pq!PJm&Z<95C6u+!;`B_k0C#NJOvwK0Hjf& zV$ngW`6j3jNEMFT;q=7JL*C zmcDoVQils=ZL*eFU7V5}VKM<)fGWZY_P|eP+OhRU<>~-QNN``J8-PS~UZv6l^e0Zd ztv$rfo-Wy|_2rcbe`=9CWdf!QB)43D79h&p!h+t%hg*nk39=``oo`tlsu8+Pt6JCa zm?ksS+qZAu*1oy2nN|DSMYMneO{uZiB%$DobVph;>)JZkxX$6pdP|1iV`vHf(<-)f zZnAf(g1ue96Ztm$Hvtt{`wB$BHJ|_~Fjqv!xHRLqGDBY1^cxY&b`Q$NDTcp&dx9`u z5QQD=59m0JLq!Ic%q?PtDzmLd>%GKyqhGx`1eH+`+POGz&;dr}DC}oK%>zSP*QB;4 zamJY~Q>>-KAIqPEvg+LW0j3g%c~V{MT0zt;UAPWjcihz1 ze`jZJPiz|6pu3kr^Ld7i<}HW<&QaR`@?ccSy3=;xClE0v)f=GiwyKPhcTicZoOh5T zxU|2R$xNoX!~fTj@#k`v-|KJ8|7`O`n1rg}emIg~25fo76YRFTX>kCDSy5kItnaNu z&Q(D5g^-6{+!1+o_QM6^A5I?L-WszD3r7)U*DqbVhxd$EIxg23o132p+J6pgeKavK z(b>z(>v-t}ED7<3@nXuOsPaXa;%C4tM*xhO_4W0ip}P6&xgTQwsQvx@o4HA(TJwBY?ex#Cn@>vxS|4C3g z7a%EDK?vy-bDa0ej6~5Uc=#uYa2TCrVye8``JA0pu!uI;PEwPBBx*ZUUp6p62qfZh z;5$mF=NK(QZ@Zm|DWS=5l^)O)+CgunC$VO=ioWw%_rL43^6Le0`d=aMd1RTG7BA{4 zy1~pd#O}Iv>kWh?#G`osBn#;kqnvSPB2g3+Tm-!5CqM+avlNs%m}hE#YAq`Lp8(V0 z$R{49cVZ?o{1?9c11y{WD^%tORQ|H!@E_)}9)^Py)?ILTVYcap!r$fIqaTb;vhn$) z>@zf^F9_{h>QSd5p_8HHcDtv_b_QPv4YdAsv{=pcTlU&)J#nvdprp3zn z4y|Nogs7PmVoSz5i>bZIKen0wT{=|?(ob$|ld@OhsSI4Gb$DyyiZI<7cur{K=0efk6Jn}8=WxXf_sZxHIF zw0lH08EnY_?1(T|+Cvh9&S#TLr0uqIjjf-{Hih%J}{&Of~&kXb8;z5sNw80(_#T?+daYm z!T3_){~lO z2nQhkHYKXNp!u{wiXo%|m<7}K?A=Q(sFZH#ed`c`77;&Gf`s~v=IOrx%c&6U{+)g; zOxGxM46vSqgQF?SA~v%fq^N+W1ihUe^c3WRBP^QFY<~3-+??x3 z@mbQ}gtS8zK}f@^R#8cV%-0f($N6{6GR&K84hse#9Tbu^OKWPR0P<@>E3)473V`J^K9t9w9Y6beJUv{ zI|o%2oWwJ@I}U;KamLb*w_3FycD{88z=M%Bk}4ETZV|`hr()i-7fG ze?4PDRp(w=oOE_^aY+O?mQ;sb?-}ONe-M`9x+uAXpsF+jrB2ierj0&pO()5J!vX)BZx-hwwh;_By8fd;UUh7%YI=z2D%tFW9rrRg zSS`-1skynlu`yGzcU9_o=?+J{(`Ip~u6nPmS3%%7>@E5vhd3q|X+>PBA4%t5y zUE4=RnZTKJ5VSY*8kBHOfbc*YG^fdcYvi;Tpc1s{4Yc|-*BdOSXp6K5Ti~flW$T$~ zB_F$l%MmC&^bkVi6Q(4I~69C%sOE3;3 z#2^dG*YaWYjF}Q)_;pe=1)^G7$Y04uHD)2a+JrG3B4Etp$A6;N5hpwZ1lNnyLr7)N zMP(!;JbV~c6gzToZoo6Fn8H?s&{RQjqRz9T&gcR@5hN&lhQ|d7ueKWnPYmJHuMy*` zE8NNV4kgOlZxpF={--Mw+*41Rbz3WPG@iJ*)q|Ib#X}K#)O<1D@|z8tcWA@=>0khaq#F6@)72Y6+zMDa#bnLrI1FMGn-8Ud za91LZ>Io~=c1vm%f4)l-SHf&s0BefYOoycL1#g$=nmEEEaqG#-#JWEmi_(x=Qxo2Q)}&Eu(5*o&|CFx$41;z z6qK%FcqOspqP7zWp!PlhAi-J!$|+`B#;H2YX%OWYrbgmpZ8n1pkeyD!c7#@UVtiZz z!3t}mo;}zXR9ObIHaw%5b{!7G5Fhh22TUOjApF)#vW7X29z9A38R*~g82)_z{5h!Z z2L!qS1oh^$VxROWCaO2o6|j>>Sanwe8`j&cfByLm4BQ z_O&ql6S6em)tO{1tiq2OC!!`Po;7OYhO6-!o{o;i&MOR}57G38yXC@!vOm5J`d757 zs#?Llxt~N^}Ym~nVJ&3Donf3n027e)SVj*j8RIDM<5gaMtJ;$iXE|B zx}a5GH*b@+G-8*TvYqPXTTx&)Z21NeO+(#mVMUiO5N%j)+32;qBFS>`= zU&|x4@bUaYE)XWfKZ}-XtrIfCnbK3eU4}s&Mm)>2oxt7_4i0%ZU2vPXEnbCdJ0-6& zI?x6jB-7>%!Vq!#NEfi>VHTcyw)G@Ve*K^*FDt8tbqCDsF-ON0(_)Z>z{c^liP*8x zKub;UZxtHE(#;GtotiE!Q8i-dd11b`;+LBtc0YY#_M`1&NSz=l1} zw@&f#wJ%np1s5a)8-y4uLg3t$d?knnbiBNIEtB4@{?b#Ub)cGvlO=>mw9|3+N@i!U z?FffpHKIX?oD!@la_q~%z&I>NKVimf>kQ0*K|gQyr|Y>&g$a?c7(U;a#Q^0D zASpdPp*j_e4ZIBm?~Yv{6u3YzPRgmak%lc9Z_u2?%EZcg3aL(eLp13Lde3?s0uMnO z5LP`NkPTaR?2siIe88^(>O1Mv3rK!di-ZV;4ET~GJ$y#CZWQNw(r}_G##k9qC-gkO z4xzCB(4i<|vrKfA9*7f<7r~LRxlHrEv6aT`(OJ6kg_X_(Gt=vqe>Ohw`0)7LJ_#SE zr<<-7Y-}26SZDDwBF;iQ_43A8*={B5=4!=H>-PO2aq-g$@8fERFZmp&I&SM3nC$4- zRqRpn!lR3-W66$tqU7*Q=18Tz=&>2=Ue4gbx9ZN>krOt-rIll1I!}7P4O`+Y%twAo z`%gv=lSg5BeuYCQ63wqGG+}LfUZvd?9U1f!$Tl(}!WnIPT7k!7;+4YtDEq{T69(_n z(hg`3Y_Z`4M&wU7Y?V*CvjuGyi5+y!R~4G*AscR6Fe)THguXO7m6CFP(+;u{&?Sk@ z!whM`om;kTQ^(5bx90^Wd0@D~K(*tLV8u%Xt@u`XryE5h7{84bPm~7#W z`>?rMZ1C1QH)!@2Fl$jBCEWxvy%aGF%gF`^<{aVnl;s}VVjzG#67-@WPpyc~Y15i# zu{$R^!*Pa*sW)fxtNNE$%-mq^m9gE=sATCwKpFvp_fX_W2|I)#2Nqdv_T*E*ypR+-|y2tJr|SSYBFs zAA75LjYN8ISz_RTULDwE62N%TL!v(3-s@g~VE?j!=f*_Q!HaZ8{=E~#1yof;;wd)byS`apFGk5Ht8NlDxT|qri%y8I`c=P&i>ZgQKFNY8X_m z;uThLx&;Pk9d$6}RMgZGQc{IT7@~U5^x`v}VH&_0hA;3fi>j-iJg97Z$+a#6pb|T* zN}opm`t?ol#(vOeo5ZoV(9c(Ly>2DS=j6(=oIB@Wx&Xa;*PcDqLupbRX;SuazaLuZ{(Hb~ocVYR%qN z{K;|t$a5Sp4Z=w@UkK$CwnK>rbc~K822WJCogyA!{GQtKgf9uvskOOhtjMdVkPG{q z;pnl~On!|6dNw0>?t@z#V) zc1J_Q1bkx>bZ;RcA!E)!boJvPHpT{G6HGx`tbY+4EOzVGap+!c%!U~qoAB_UYY#$* zAt~q_f3H==CKMn_3u3CazFtyJjvs3aG5k-Uwqw-PkB%B^7?`UdHfV=hrkdly5$2Bthc)7}M>vh- z7pjGs#<2?v7c#JQmX}5yDJ@8Wz8vNA>^PWEOvNae$QClmSatUi=X7S~U+1*B1P)A^ z((%#KE|7@^^9F)d!YJW7xC^0jUDUgGT|P>N<0I)1K+hKSu1@ zOQ*hL*Wv;vSMv|?BVPSZqV^g)@PmhxIgVEYCe3;^tC)P=zlev^fAEx(k;j+V^e0ST z*^EGTUVRC;N>-|Pu)PT)YSP+^+~cFl>J^Fqcu!)R$pNoB#B+P z_Nrd@&(ZAr`zDVcn_t{&wHi>XpW{6C`+`S%_^+`nBDjqR50+o{id8VeO+MF^{QeHxfkWy3>($P6B8o8Gwv`PSXN5u&X3wsd|AYy8I4hOF=uK6Dd zdv@zs|2@%NVU7B1giRQ}*HZLzr6ncDn3#4tfdzm*fD7Eh*AP(A(Aa3zT)%$(_W3kJ zD}nUp8z{SgA+QsIvn7f;$Xt!_pPy^%>ehWjzWK^CqYNos41G9CQsM2y6kUT8C*qJN z7HLyzUikY9TUb~K*PmRQis8r2!+=9P`YjnA*gSrytGALH|J=DV(s5<^*I{Uj#0B9yca)I$9r{fozlChZ?Eu4NPJ<9eBf2u~~PrB(rLizAFEDe(Mw8h~Q zfhvK2$B#}?hw*!z8X9nkpMBLF1hJnG!ldM!FX2sNzB_gkNW@M>(-p@}q1-d*e}8|E zNMs5Mg0L564keWfh>7*Sb!GerS8;=eN3|X&daH5G7 zyUF14U%RxV@e~u2JJJI#(-8>%=^UEe9dL$(+$aSHsRR$ z^Dhso*?9o2tNC{AB|dvKkoUnV*h1nieW#S}rndO=AQdfbGHfXuvkkP-`=3!vc?`IS z6CfYa+1aUhJ~qFNkN!@woE|WPPr_tuhVvzp;9~YtP>c+Ee&xhrs~k|RLUJnsd5nTrIgc+f zG5y}M)mz9e7(0RMdIk_WhUV_}*+X_J)e4o`=O^Ht_X-O78tTp~1S3L%@E#A*>)T?U z{4NjX#-fp4;P&?(Ia1cXJk9<^GdV%n^W=AZHpA>;HquQS@YM!w3e2I3_(aMRPOk*| zT||_j#IPja{IDLT2!))xCb65cSy@?$8G*><>F@8_JRD)vo+lE-{Tlp7qQjC6D7!L9 z8|#3{)EkpD%m?d-Gt}Xx^#So%V!MQlcani2uF-%t2}c=4B6`M)%qn?`vDU~}Tpf9$ z7A-Xzsfw?8Y}ttL0nqKhq#AjcT)WD-68!Y{q+jJsY-&;@&Z`^dFIhqms?uF(%(Lfe zP;=ygajPq>*-#y(KCoIoXrTi@UzrweX9vXl5Sx%!hMw?Ya4;o85=NK7hn>qHDmNbE z;CPL1)nGPgI)CKIkwbhA+@NS7q>v*fb~vHC#usCJfMIJ6(GNX{i-2QA^ys^w3TXm# z^A8V-6!A!5_b(1<@vWk1&E(X+??iH~Ci-LAq8npoD!*#Gh@u>*tR! zcT~#Asa(5z_X2h=Buf`iMo)>M!x?%Dja73x6RJp9csOA^@B+E_#RR;T81yER$F8m? zxw*-la4-%O_!c;y+#9*RYo9m$%F%0#HI;mY1Q@2?6 z21?7wj1z|7&&3BklD+;8&K>&L^v}pRJYT$cA=_Mx?|=}ouwaD`mG;7g*;mbri@kib zG&B*72EdgKTeL>=kRMu*GWc8J>=M=1?h~uG_`F~48$98oQ&=lqJ-yeQ7IZXTPe7Qa zUn?>=jmRQBeD0wb-%`qdzIR#Y_!#UA=diH2H!2GV6DAaWjAtUF`7r4win~AVX{M_< z%ypy6zQ^&}P|YgCrj#eJseA+J7Fxuq>a?hisjRRebp(q>_?u91aj_oDg4mBvTPNiQ$GS2-+G%BH4}vl$X{SHEHHy@N^zNX&T+Q=)ryAwn2ql9RN59^I=Zc) zRegcGn~y+F!gnscMNtNU8Bl+yLD_6OAlez#oL59Yf#7A#_;LS0tO-tC;ww(>KYR8} zQ|&)G@XnO`{q^F~(ht#AfY2PbIDMje%ijy8LwmpFlK#$?ugxAtW@?oShaA2d(@gu7 z3}rOh9hg2$9nnMCJu^9Z65SqgHcMu3zMIK$O99w|QG=Q>bs!?>uwAcazzreE-)}YS zO)RF+t5V2DiXcc2IHf{IT;1F>;iyC_OGu>$ntNZ*LjCB+H`64P@A44+yTA)@dHfK7 zmp1al7N^ZSH^19F8#Tz!T|dlR^ozVODn(*3shMd`?o_LhrR zul@n!=xs=;H;Q{#yJZr%`l9~PE_1ZhllUo;q3_y;BT3*)+~&Rmb*($ASAPa6d%!+O z^t_>-$ptdB&qWK|PaX%He$Y$G>kG)(OtUh#Rzw1}FYlV!+%`JTyW>IU!{#~bMfgq) zjQ94DhIJ%wDsp+&+wtAyiOHuFMSJwyiy%MlKwd)l?B2EOBA_s_>>zZ=uZMb|96W~2 z!iLfer&Z2@ksu*-d2IO);HXFlSOiwOV%h{pIf$e@I)#m4g1c!pbB`5lXhG57=UK)Q z($e&}bOy504+eWYD%y@N-+}cEXckG*n<3ZA7QaiR`mh~IfD`iS@kRwW97`ul| z7y$TD-O!yvT*Kh)*RH{>e^sSy-F#gk5$cz(%S)2GByQ8asg)Lr&cwl~)0sZXx=VgG zjYrNdcHO0M-xB#jaK(AKMaJ~t(vE5Mj~}<>=-l;!OCWu^qeSN}C=ufeWG#*>OL>f_ zd%JO?->=A09b-vNy3i8kt4}f?-j-s%)^kFrB7C2}>*;f>D!isNhOg+Ko#NkT;&$P7 z0CPaIF=L{e{97`Km;Pn1JuY-+EU;LMWRNmC*X`(R^Rzwu?QBTDo4{S1GMF1SaukMU z2P#Kdk1{LZJ}CDIc(NwYeD5Z3tm)OTy{n`SF%VNy%Ljp199-P|4E(i9C%1#8bxdmr#9j|zDd9-o2?t0XBmY&- z!+%YPX?@~hgO`3n?u~RE#&?wr=|EU$ZA1@A_Oa=8kLp(+sojJhn_smlY?kLg zLsR)Wx5CYmP3_L$*xd$M)pDNjnO%dAc{)1be-i}*h3do(31*M4vT5nzx|3R($Vc4J zHIyytWGW6k*}Gfkw4(TpHR$Jka-o@G+2NbrH?HRCknUrw4yrS zU$uXdk00VGVvBa{n=8Qe%;5nmpv1j8uOmq> zOJ6*RlYGR?n*je!4yvsj2~9L`aA?}b5Jgi>lM>>$hUiEsxZ9S~KKDelrMWCLA9(G0 zifzA?F5_pz_qLRK2ewi-?Y{Buq>r}N`QGyZow;O#kBPsDqOWz~w@A4+wc)TV*R#_7 zURz8z2d?tID8=W2TE7HvctK~J#EFc(WOj>|yQ)o54?hw74Vt!6)U+??H0)PluwUjH z!7zL|TrHeE1#uv$&lvGtS>#@((`_?m>K;$cZC=+nPd>4{y0`P$@%pxX--|BXer)pT zZlRK6dj3xLzF+A33cj6CH$b-s)U!3Y@e2V6UmU-pct@Ed4LtiKzEcb+_Z5rQ4)C=1 z5`-rXSAcujYw;Hd533^|F|o}^A9h!w?ou?1X05kL=WC%mUKJ$pmS;RlcFVZi-Sw^a zc)8!Yg(f9=5-9<^(S0!Y4pXseyAK}h9Zcf%#=-Xq;EW^~wTLW>Z_>Mj!*%FUPXD7v z2{@enLG(#xSB9%sx57l!^g>5&r^kok4&L-uveuj>gY4$)y+e}Q?)jtv41*E90!j-w zlb-muql31+T+U5aR<0x(+fz~Fx0mq))6n@|99yw?mc@U>Q^kcp|+AP zWB3yG}jceo>9bH*N zxWy^J0-^yV@H)OIVkBo$)G(``2In}4cJj@?Hh~=eG7B=4b=XF@AzgTZvQzVqO$A-d zyGOS2-O@g4SZRWpl5<$AF^YQVoyZNz+4)K#Bll~+#xyliG)>?#@`^0!E7>*=#iL&qHF993( z2H7&oDVuC0{>2wHPFh$S&~b73gL+Ix??)g*pnJ#ytdPu3P*Z8LN# z*WYBm?=P49ex`)jN!@bYt!$t6U&j6K^5?J@@Q^i84q%F~eTdcO12c2XmS!4SmNtdDEXvU(IUF-u-jyct@3h zR*z}s_au#NI807_+vQMG>NY1FAOD7Lh9Ed7e8Yo)sA!S)&>;pc3>Q2b?a7l5pmD&D zaY<8?h6MeuI^->aK0+bSFC>$){RhRNqr>*#xujV%dj*YUn%PH|qbfaifQyAC!l!pw-$& z;U1Yq?-eHNTYe2<2hOk#wdV&z-h2T<5aR-~_s1W9yzue44i@e3dF@>XRm^we8@PC* zQ(4f1-~(b%?~SyTG#NWX=0Y$^R$mn7!YegO46(%n+YNSZPOms{I=NW=YVw9~ zb<<4cq2_dVoEMl_nrZj)_WleAf9mw2XDvFQ?~q7J^3Ze|L|auQ&JKJkw|DS?^C0q9>dRs zb0v^hA|Pl*Zsy#ANB;+}+IE(Mmp3RZj0z}H@s675#J^tD)KaI^XUh|}tBbA6yu7IV zrQN31TCMeUb*%nxn!kN>D(oQfyL{PkCBjk5MeEn5jT?7^y+xv(|CuI5?1!s?J~sPS zc?Z#M5k(r(*rO3XTTU2!s;qQJGC_N5uk!SCq3;~=+VT3cwvDAfhfGLg$*%{Tbi2S$Ha>k9b@`914fb|d2{;pp)Vo?z zQ|QAZB#n&yjg~uX^QeO_n;qX#xUv$JR(v^t$L%gZH((WGRDMX~6w(2Wd)ov)B+whq zLQV{Kw~mxcGYwg6yFnVOzl}N%361*`W4VlUgOA-ZzP1akh}I`opVWUvY23%h0&>@a zNWc{-aC$nsBDsro(Arfn%MG>G&-7U8f!vBc}MwS3qunEPIBZP&In~X}o!MR)9zdoJ?!+qIKN= z!}aLQU#~h0d{|wttDpRqqOFi}vgzoL9kEAya$9QZy)IgXxVsY{>Ka;GpfE4as-b3X z;UKH*y;Hf*)3F&`eTXrn@UJBt&L~Qkbn1vbFa;%>%qY#Mvow*sw|NHu=f<%h8@G3L z42)}I7?#hB4giGgk~h7e%~Nuz{E{g{W|yLA^mOc|fDA0|s*`^^zrY5xU}bBysc!qvrZT;L z&C&W=&JVlYOGBk>vA7<|&%cta=EtUjjssg?*NaRm&DbiP?vgjlSvTV0>Kmx!$heoD z)>Bt_YE#B_cbj%X!YSFgw#q3l_DF3}SXSU?P_-{Wa#`g~TfubkI>Y-s@DET@uCAW>rnRYa`*AL#guT~G zy`saZns6&r(u8S`7vw z84!b1h(?=&pd}OD!BJ0U^a_x^P{(-vu8wCRE^(W2mCW}emyKRESJXehY4u)g@E{TG zYrR0APwP$E2G8bqJ4YN=mh47Xcv6cLLv(g08%`UBosTe9n9?veGe4Qh{JJfz?T_qz zKZrXDEUX0wXUfTiADW6RjYh4b!w>w8N{b(C=5wdSHbW5N<1bXbMPnFbTwkpQzROzR zb3R1cJs0=-&YYI@!E?={`N8_aY>W@K&E7hmyiaLs;efOCL1tkckq-lj^Rs^v(|T1A z^`98E4tvZ}Om4EFd%zQagNleY`JERZ(?7&mshaj4R)JQT79G|k*?(*B(hIJV$SGH1 zo>HiP$6j?rz$RLtl%#hGca)MjZgO12E>PBEbXnZ7?uNZ_c5_xuO`F%P)WTVX&y{^T zgMwnVVjlxLc;nQF5rpObc3Z52>Z7ZxOGsOIH4={T+ zd}9pUDeKp-|8wis6I4_Wf%;%V@>AKdef#J3_Wb=p%;S&f^68S|8u=e(VDsaVHj#ef zyxp%eSem)L_gtPXH;+C~->uP00X(Ai#%MmbU@U;JC=dG%8~}HC5psx(jEuCLoRo~r zH5r-zMb>wK^|<%{N2o{x(N0lON<&iviAsy2q(P;nsl5>uX()-(5)Eld+9jn)DYOTr zy?2`b*X=ydd4AXRf3E9sj)QZ)-~0ZI_xrWpbfQs#VCdq8b*oIWH@P(MlHfDp!U8IH z5C3%tZ^(D-07Cg3agmV9-3MIB#kDO=@sXdugV%DbDjrRAa$4FeTwoyT@jnPS;y?j5 zHC;e~3H@L~QBmj0z+e@sR&ua$fbiqu;u1DDLq2HpVPtYL_(%J9@42MS9S44V{|*W- zvdc+aK*l2 zZDa1xs(?pKn%9l>FaH_WobklMNCbV|_vIf=SIs_LvwWS?p3z>Y=aV&@H~P?Vsc>z& zJflr}-P-#IYrvvg9B&ATGs*3k6Q^|9w-iLBljV_;JF={KIPbv$_jWZqC_j$jR+|x5 zC9T{8zI%c{jD`k=&fGK-@?=~|4!q;9z}@R0*;eW;3-E-f72sZk9`rB|&&)b|n?=qp zHa0aBk@$S4<>iTr22}z;&TiQmRvFVxW@ctnF~VSSu4cE1BVki)4?jR6JV`LClM{?jCawCna$DZbg;+_><4vTo~?>Wn;e#G^MC5LF-7Qo%oBG}=j*xV={Sx@II# z3SQ7>-81JaE*aUNH(Rx>YOYEY3v`{ndl#SralI0OzM1wWpn~|WESlIRo zEkgoS8{_GmcfJk(25pZxyiB6lA8RecqZFX0Bpxj28awD#5jXDJm@KRCehW_Ue<;}M z;VBm>W+|5txau-NWfN>L5;@@ECz*PGl7Oi3ZwC(R1I;S9j}s0K?_{W2AE14K_a6l4 zqp+~@2wH;+u5qDnS+4I{GoTHcNep&8bM`DjlY?be0f+`1j~f4e%NCoVk-&LiZ->Rg zHU4QgOC(C$oD1VqBHrSQchjo9<$LzHGLc5~)00zg)6Dl;1#u20U(Rc5w!|O&Fm3va zt1YbEp)%9of9VOBdUSjq@Wj8-FOI}n309b1;^sjRnu6$gxnNXkxgPTb!X!c!M?5xk zoAN-AaqqoMN+S44VUX8rS!-SX8sH##CjU=?X-TQOX)2Sd}fFOYQ3UJ_Y9zJ{@ zg+5s0j;@Dv=59WbI1R8K(aSAvn?>h@O$?15(B~Im0iU~1Q585FCUut=$Lc zgv{!c9FZRaMaVGDDKwXTAZyq~M1G*ze}Kk&2K@V5#GS&kprD{|6=_QZ=?<3GAfn~h z|Gu6VSWd!8m4$6PsfAr}DK#AA@8ppNqEAiLIy(80t;tS;nF_~j8&Xe@R&pKR9-VB! z^0FIl<Du=~cULad8XTD@DFqE<_|X0 zo(nlnPR(kuW^q`E?$PxxA5GrT{-lbtF*2w(7q40gH#}E%%j5{abrl4nRzUJsMd%=4 zG~Ugne6=&rE?V@fG*;e1CcfH}qXw!tHX+RV1+~&O=qy0%m!pdKPXn6QWerr}3xJR> zaK^U2w_<`U4IXXpsu<6)W8$dR)XtpP zcAV5Xls4pKqR8&tG8G)HUOU%@dcMYb&9Bk73WQwMvQ1@6MfFq+R&_c_cI`f(E@9v@ z*7^N=Aqli^&JDdO8BJhBP*G>Yl?=$Bfs|V6!_+Udcshki|3#-BWox*)N)T);+zW(I z1xp{MOa>VbaiAO5@mvlbJh)V#Y;KC;0m?sKz!ATJ8Ye>f2QdwQ!4L;z`}N7^6F`+7 zPw*6{3^H0M??TC`r_NW)Ag^Skl)YapM=)H$)c71T*UrjqPAiipS|9i)wVsIV@Toe{ zQ(5xdz+1*=giNr=M7+%UUNHv;OB*cP=5;yTnUH`%d)opzMYY4po$O(cr2k{RrstmrO5wbGC^qMzPN^kaS<$UFhW1}gu$r$XMSIMKoX zmE;U}qO84~Ww;g5GR6?|z+f-zHfM&sJqDavmr{SUa4K>CLba1;cL2ZTH>A*UU8d+#I&kCcP4oFz6%zH9d$X|)gP^w|@ZDX|p8#s77qNJpac(4p z5Skzz0Gd=O%vsTO?GG>EPtikn^Up3*7$m}Gh~o$_-|dd^0ig01<9MwGs^grYto?5C z-SC0HqpRoQN)0x`Cj2@cp%-mqE_$}}B-4`Q?;D^&Uy8i6yZq(4?gdW@Po|aSg45_F z^?}qPN!Az|g-&QZ2)=5|w)bmECndvB@awzw(-FyK08Kv=+I4VN8Fd!>{zX}uT(R}> zabSkr0kabsq}H7fpb{ka&#UuW>3Ym8Esci<&s`Ssrhp&lpomB~82&+B_wk(Qg)gxk zKTWQD5WRFSt#|fo!(q{VyC?lkUB1|!X?bXJdYt?-E1&8ij;1Hz7+t}fqxLk!pbH>| zO)Z>`Jh9&E5`=tn7zivO*M{+`guiC+e;;kyRf?4mLt+1^T3hpjupvGgh>F&hSND%) zBX$DHZc+lvEpQsI1*uaG-El{X7RTbxYo;Gmn|;%-TMg-;xx1VHG4JKTu1Yq>2Kk(Q zjt`#IfvUTV%c^wg(@_Z22Jz<(5a2JTqY|nkVv|A2vcA4p8av;R{V&=p`IkUwzmY-c z*3t_`c%a~M`Y8Vf*Gy>Wu5~Dd-eL#>ZqmGebj;83q<4d?D^O4{-z zxxQyEW*jx|jSV8WIhuwE;Z=aa>K)uSga`%qgooaRq)V4C*Wj*E0T>LLSrqC4JR8&h zJsUyvCjux72;DF^PG}g&6jW5^9WQevAto}Ga1=p}`Vd)dQ(!zGT^t{M+pdhpobDR0 zcJp-x^qvhpPDLTKfpywSGIZTbAbs^M9fRcp~=>z!u_h@MQV?)D(hDsAdDZxfLb`;*&IF4y*Jhr2=)C|G*Ej9rGS_&Pke3s}aZpGl{KIc9 z=;+j{h;>yUJ&E8mQJG<55sG{eHx{;BI6`Yn*XNH;6ff#;qon_U9PxI~%&3TnDjceW z)(<6_*&{(KQ6@I;RYBvsW;&Hz!kUGDV!9}K_PLkO{8(R-tv_2SFoQ4UjT6(1T1ZVA7$@%rkY)rH*B>u|f2 z@DIKuwD~xwY5mF@4UN(-XZsS4GDvH3mR{HqN;q_w(j!g*pH4xsGt`p7M$j}ki)8w< z_8rmwfcSRL_R$Ox{op5tIXbR*mc#fx2s7OBzS2$KWuhgI@6m@g;f|`2tWY2#ZWkqS z%n>AfKq0@0*Kdz>Ne8;z$33TTQI+s(oPMcy!_4d_rZ)XFm0e)~u07`{!B;!(G+TWj z7^yYr8e8phZ+w}36((X_O_L5^-#~qI9i5i$?N5f&iYy#W`Q`(_LmkKw0K*TnN-3B( zRX+-+P2DbiJHa8bd}-XR9Q@qRzadu9 zVLEpBLe}HB0=}o?Tj_0A3dSzc4*K^s_MW|*ZMsu!Q1(muEj?w`=+7#L#is2dg6$aU zW7@tzb5)b``=)pB%Ac2Y+~1i-)rPZ>V;KkPs&JwpHT?A~OG0Bc(jHJg|EBo+C^YOg z))qA&5W}+Y0Kn{U;V-p0-VG@_?gTBDp?JT%nOa^?z52tW?K%DXd=V;TGc8CR5E#e_ za3eC3ak5t*8Zlfgz9^`KOg_`Yb?1m`=Sdi=JrWzxJmg%eNqR}VWl=o$MCGWmSEb&* zJ?k@~^@>3sjE{c&{pLgaQ~3~k;k{?sx8?362`;-^&g@ejdaEnc|4S2Tq4zG)4dbyV zr=^zuEcw?z{A6^kH~zk|__5nx%A%gJ3C8wttv_io(jQEmiF&FjabI04Iiqe5t@(L= zp8!YpQSE(isRF7#zWNbyb3Q&bKX1YCGwUn`TcKr}5X9)MuLpOOI0=x=Jf>~&x7eA|99xQ zrxNyDP#KaC&k_ZJdnv?Io3!C$TznrJc@ZMvJD&{8`fvVnDpa%hOxUWxpppuBEZGvQ zlc(nzMXX;r(f^`Ij;lVY)X4_HFZ!cRcVls|TCsj=URC)+1*Wpy_tmDZS4UK>Zjr;?2H1yt?5ul%>Vnj(%*+tN_VbWYd-&z?)A7t;aOYWmDZdscAkqAga(K7YM}YU8h} z&%6bWE5c$?hbwAa`o2vA(J~`gq=s;UK(LuVnqKIFO%P?3jVNox<4F^B2o|m!bUUTX zKQdY&O@{eeme@%zUfdxRg@~kygjI_q>01qPm1Erp6;7g9g+PZ|0J>!?o{g!B-D;Uw zW5k679UcDkRU~ba5Wb=Awj)TMHHPMiu-gz8mF{UNR%+3xFDstt!d6GLN?&AUJwjJW zmeA;O0i&wk2O>;;%Pm5x4jvIequP=bi3eulNg+Uz`2D@58*4`i*Ad425dWOp@$XA- zhqjgI^HDBU2~IjkCL~icD_o4Qdwixx@no;CF?Z>w?vm8jA2z#J+&vZab9*%Co&=HY zj{jj0`gArb@#|vYwS%VX)YE^mhjg++Zuw3MxIDM=xSMpeF{V1&Xg)xN z+0rZWe9X0$Q0}67KmwBq)aJljg`m#56(++b(Mazn0*y8f%UN95f)M`US;9Jel#{b+ zL;7bx&k8}on;ma~tQfd} zFlKd3u0iRhrSE!=kVZ^&6+**Yzgta;sCThKexWx1iQB63s(=8LSO_Ws7Bhg;9gsC! zZcAEK-!DR-L%d2LC-7qkp@N^t>!TuoGEnvk=xNWPbNyA?%v;lJHTig}St`CarM&6P4fT7#W_Z0- zsdC+5)xHFE5Hys_gJ#ojG1XrYHMz;de)VQA2;xuG#JGt#ZoB%Bid8SB)Dq zsJsifg@i(p4Jm-WiHcQ<{P}8r`Ta`qBm4K?BJ5Bgcp(!d1TFBjSFN#3r1q>ptQP*a*>Z0|*QA77)7r4ZWaZ2vCP0?|QD184>8ZdlXHz`Cmze2EI2;fPvH48G^y5mYw!v$_jezPB zVq+H@H5HZXz!gY5&Z#$4FS-LgBAgHO%)>y!k;GR)ck@Dr#7>pifJI1V}e?lf7+w`z&CD-(tEzbwH{gvZO7MGACzoa82W`F@jsOBldHCxmuvz5tvrl zAt^({%sT63u-+Z~@Zn2@ZC_ku=P>0a$epJ2tz={xSFVhX3aKiA3%Bjv3hgQn396Yu z=d8DE!t|6?Mbe-x{L1YZ~Y=cm?2Jrh0 z59oN8FmB@JXGs8LBoM7$!z?gD@yujX^a$xdM4fLtp3@T3^ptx=ih07**`@HCME4Un ztm=Yz#)wbyz*N%f(?QPMcdTss(H2f_x`nph|4GL)28-US7nwbVEe@u0MdXbzpJ8cl zXt+sz_2%&uO8?(iwU6E`cefKb628rTMcI9P+i`h!Guu`LBYnqGH2w3WWs)c zc~Z&{G(d__mDaBSiy*YCSqK38Yekw!3HqbaAcr;k^tG))yWSX;=e_H zLH?a#TKAr9iYkB`F z_pQbpmh8TB55`Bu6W7?1PsvDC?y`K+*1FrI@8QvnQn5hF0JnYDzO}lDj$hVSc7LQY z9hH|qZZgn5Q0ZoNiag7}(RXqpo4RLPLCv~x{n+uat)4rc4m_`{8#Nf1-Wg0i+PdHv z15zm;LM@4br$#Pt`>Ln@SjBv~qk$H!~`1kjwK zfLD9u zQYs-T_ug1BAVTo2>t(bARP~)-*M-hROKYF~Al2OqUZt|Vb_m0PntB>qM|{BW#hl#S zK3j3^Jlks(+WduMLd(m`d2kgFK3M7{dY`g5p?t0L=NmWK2FD(g%}_ylS2Lx^3F%PWeAlW@1ckc(9`~E7OME+j>bj)^g)+ z#}ymXNP9*SFlKXebD3x!uQ64X)N9~KGPAZGKsx-o*UGwAOMZEorI9ldWD*k+d?3o( zU;Rm?S9a9a^J$*~A0L>kMI6iap^NpRI zpNYZ`?;%{@;TOewd_wp%hvwY~lo#*=(YFI~4+^5fTb5Ck96pHSkxh_@QhkO}46Xnn zGtu!UPxiXGxlOICfmFs47@C|MgjeO4FO&6EMDE}W$~3MCCG9qWk6z#_(-M%Mgp3TE z*dD*UJaGckITcTXc*}$EXaBmpTlFX5{y~3E=1?T}XOVUXcyl5Y0f7jQ;e9x1phkXB z;EP1yY+=J-PrTaj}n=ELg_Wazr?u?YkC0dbJ8*$vjmc7fRiOCa6T$f^$^uJ{Y zbhN~A*yi;Fl|SjL`?VNYI`}FwV(N8~uDaW%#evQMIcdrE5_0w+{nr~S4KzZwXL=Z< zx~If%}??Qeb_)t-(uHKo0@V12K=p6x=e>FIcDa#N5d?qPZ>>E4?3|8 z8I%s-PRv^u*zbzFrJQmvjO`@>?6D*2i|FG%TCALf5je1jH*yW0AX>g{XCki(RHIa_ zh2wGBMe1{uSTL|OqGNz*JDv z%Blil$$q@@!APvnHoCyx7FUTI055C!@7x;iFH*KHM#|r~I{F3xCgg=|GXqoUQ%6 z&|hLfg5IZ+l$bW$eGVKD(oZW-UMyktUyDv6Ibu-qoT$}d6Cto0^Z})RzSu04QG0zr z!^5XxY}#}72q zPncdJU-r!qMvBjvRIokDZC-HkD`n~ z2S1H=4=EnUUgWyI%hE|BEcFp}pCIYX&^)>`hlV|JPDSZ!;iq@^Yr3u6RM-59=bHqZGIA`gqxBXzWJwbcyG(Uz2)l67%pN z6^yh$k$}4!;|Vy9A3xq)exHZJ`JVp+FY~(nxZO0dRteM-{jzNhX9Vn~Y!z+_mh!80pm7Ke!d~z7L2vRcn^$2RWO;ve-!|*nFN*`&aWxL%yID_%pcrYdC@cYMZxuhbDn#$-|tkseQ?66 zB!Vu7cj&8=t^TlU(c|S^Cw(V-Vrfn>A2RytqENwVfz-1im5yLUNws=h47A7oAh$<({jy_z{ zOouz9+6e{rDwv0)!on!%@WZm}C3&0W+LI*ZqIb=u2OFrxCI(B{uqKJC{@Sy0`14Tg zZFZNRe9R6qyo$v(VNLTwk_N|}>JB>?>)sZ&t`%VYS*hph+!$x`Gx2>?UgpXv zO~DD;BX?>1EWo9$A}xa;qWWPK-KfqP_>{3^Q>-VUd>+MiNk#5-{-O!(jAO%Jt?OKhcAd?^y7K7|7kf z+?Yz1R(4dq9%IEiYdKpzKfwCcsh4F`anyw>z>|;Fh$4D8qA|*0FZ)G@4HX+vtAT~p zj$y4udxKfe=N7UeuUGb+@{gZEpymu*I+5p&7C%OJXV*I6B-y@o^Cs9-H(?rg4Wd!1 zKi=Dch4?hoR?9y*E~CQ>d#UFtJE?3oN^}2=tu=rh z>IdB32O~Q-FYk@g4mv~e`MEj5MNcH>G@<%}d58!+fa4-y{;O}`+3{;>u6%4<9@R-t z)UwPil^xWKy?Q+AM~(+DPp-R9pp9eYTX7g7tP%t=9Ffzy6_LU&Zr|4$5?^ zctpHnIrk@jelS^X*8>!dv5<546;75!!R8!8&^!Lo6-O@NB+17cguQzQ;J^JS(gNl~ z3{^i8n+!kTNU2NAQ&~-3I$IliG5PD=V_P&gow}fdFsEY9$#@F0Lt>BZ7h1EQg-ZocZVXwJ*^007$TIbc zO`ZHm=J9liy*N@oQ8MYK$>g)=jn3O@ZvXZyF&MmYpm^G%o{b>y6h_65tBs}2{$nd)SORDKrFe-qPI06M3198{t zZvL|If7jrrS5AW2mR#%$8>8p;HPMo9C4cQhl5ENIpqsCEq&fAO{R}gO+ozBnWCcWV zwSi*+rb^{!LR{%~p@bh+UbTMRhIXH!4ROg}2NRC%C9s&VF*2iJBr?5_|3GQ6!|+?HS(Dg#tK`H= zb-BPSUq-o|e9L?9Y-#j;XZ+{wq3Or!z5MYN8mCf{9t*|@KE0Dj&(c3-o1*9Od`d8N zw^nv@(UZKZ%xH@3^c!3sItOpmFEVufc$q7E(y(Vm{Ijt6mweLTtb;s86U|QcD!)YD zjp(?(_(j20z;)(&=_zu-??jzS#2}HR=MOLvaVgI-ev(;6r_j(}nk}M84 z0BT!*B*8ufQ+80uB==Zb>B(Cb4yWj+Q@ogA!Af_ly!GD`7KlMJuV`F{{=h^o?F)V{EmBIo(^d`rss@8XI@ z7rs9tkVQUrQPS=#e9GB%PJ!~^#Ju$M+6H^!pG}l8Zj#@;mCshvZTV5ocI)^LRqG>p zkG|MNxxQGZz{a6kk-0}>D2_Uq$h5{2P=vM%7fc^8pT`s}C2|7v#&8%(Av_Vy^>jJg zdI+xjNDLs?rnWl$f6lV%?{91pYqdW)^)1{!`_1W?sU5JpVX!^ou;*r;>MaubMP#Qfo41RGW@(xp;E#9N$&*!3#=V?th%=w}*aT z5p7E=<$l@p?TMpwaZP}q=R=wB;HX)f0omz|Um5e>;oJ356gM|DeZ-kq|N3HTbwdM@ zO4EzLv`2eMH>#|2i5!qwR3G1(n=A7NW9r~TI~=w!;fF^2^u52`xFK)ccJ-u;geJ|D z&KD(Z@1C(*Q46T2XbZ6>;iTatrW&x$bku^8mNF>d)Tv0Etgt+buX!Yu~L~3tfo_>zv(7 zHA|^;bF%UVeRoWret5*__6(yab0%I3E%o1r8JpKA*eh%an)=>8{i|4F$(lSw93LLm zIj9QX`0d>dSYrVF%x?riAVVe-Dh;o>1hz-exR1sMZvS6(#QB#?GlW2)&#bUSVD z%y$zBYkGQmBmks{s2m_#4S9BbPsQyxFx&bjZ{H!B?f1;Atga&rq4olF?}&bnSNDem zz1HM$8^=QWd$KUR=`N^Xk^`jEOc~^~hgrjA=896C8X&%QndZyqT|J`eE^qo?> zbY%u^E`Rqd(p=d^vFX`k1#-b<$QB8TnV{(qS#pSnr}s^EeJ@eKL#&;}+MW42E$uo& ziV1ce0SllO^1=Kd#U<;Vfw;o|o*+FGJK;(iubO1vHEAlQ#Xq58KeB1ZtC%J{((ih& z=PIOWxSvG(%Z;C4YI?EL{IZE&WpII)gL;R!Cba)BFc8UgZ{EPS;EN-zclOU$iyS;h zBA^QDQ|#v2S-@D=*rNP@V?BaEP*G7iCL(ek%mP3Qxb4KFN%?j{8FrYLSEJo#&%S*~ z?!2QkZ?&KPph97KG*(&RT%p-_u_iM!W*7V=V}k4iTT|HJn&=eY%pSo?Vc%V96o=Oz zKlPw?YRQ;L>Q>Lt{L{=dlJc#k5u*Lnnav>sYDTzdB-(c#$U!`>_>b%Zt8kKii_86>>z zFyhI9PeB~MDfC;&f8lGEW6n9)Nyov1A5M|mxlkph5x1YAvmj?oX!!)GTiesRWdDqx zMKQB^>1zc~wV065L1YQ0rY4k>#6YKtw~w@^sy>FNl)Mn^c6RDwUAycUdg+5H#eWbjLr+!({K|VI)t%S{;&~(DkeOI@7_5m zytXZPr>8Vk=)QC%DWg2zjwFO$;h|Zudhg+D4^4mHO~lgCF|s=S$tJAizKN$W`>CN* zl0u%(eB4%ooP)V#=+~4I^;M1@eN|Ecz!X=)l2^mx<@Wr?lm@NeVa${dp;XE!`dPx%)5N8-E(P6WiV(pX3k{PHWu zAF!gI^@!C+s1B4}t=P$M7FdGvL>L(42NJ_C!^F|vA3l0C;&_(tt^XasRJwU-A18j~ ztyrWAl!@Gad7>%vVgLBc+{2C$LS@p|wBO5We$3tQ^XaxFZ^JXfTwoR!mf8XY*Z_CI zfI>_-Ado2x$;HBjt&|<%B7m--lm;R#DE0bR|Fp}{=x9QAb{J*@0#Olr1T?-4&VmnQiA=Xq+~yrp!CuA4;?<*d4ksVlCW{dD>Y?zd%B*ajD#*EL9bok={p zo8;nGIg^!G#ZiwzA;znX_kvcY)C~!o#B8Cb9Re`^M8xt>9MTHXsZc^^l*VQpO=H6=;aT=L({7!!(S@`?m zuy~QtNc6~Nrx<67h+5RN$X%+hvyXm|^=!~l?q)f%ZLb%uIHviW>Vb(Ux?S~ZoQiyj zn76vEbfxe%4O_FL>MokB-AY~orHLEi{8sz+Ip}?$i`EJmV@viA9?jVA-C}iDlaX;p zM4ylfbJJS+hl9>qd-W9k-ur0X(3fX=U>$;1E9-k#*B4^#qm#i&G}f6PHZWjvr))po z9u{PO`YRj(#Dc}FUu_s{ZmPm0^0;TbF!sjXhQq*!iB+1L8&OgsgSQYKFvQ2l=iuOQ zXr&&byFU&P0z2%qd?TLi{~l8Q33_kZdHj7)jy;ac1r)C?USN8{BDW)4K!o{SV5`lnB%><^FY3ms|~O^M_}2Lbe9Ne!va)8o!MGQh znoGA&qtm7(1pt0f9%l=jFb z>(Fm|Z8pDLz1=EWHEBzxd+Oe9PeUQQq2(WI$LJY3bY5sOq@u_1SzmjSUn^eeNLdiV z-&`K_Q|piUx16088d=}+cKf--eX5N4QSwWax=*T4fQ+grIN{uQ?_`SiVE(&7_4wYI zpt}6LQNuZQmSL8LM{Nsd-NNc$a4uTkvFHn79n=_Bo3>oee$$;LIk5HtRsTzS$!I0I z^oGHNQtzvwO&Jx5d(S5i)9WLzV)(*pvH(vR*>+*h_$xmx7D>QChYSdBYwd*-)H4GQ<% zr|&b%^L%dcoJc$xcGFZsBU`aTP zhcjkQERf=D=y(kPq7&y)%;P<+sgMW8H9=9G?xlRouJeyp^w#X^bgwgyNCtfAOSIMZ3-5;TRFv{|mT(3NTiPgC0)9cglJRdCE09{b+`euk&CR;{>1=0)16ywXIjm+{qC_R#)TwN=~C zPY>!~2m6`ZH0%~Tb1WZrRJYg}WD9y7*txuIj$OJ+GWa?kipgBVPwm011L-!Cx8Isu zD&^Rqc>@rjvdlF?>6rJOpG1=Yjg*IDs}q=>GxuC-@K$;fFJvHeP*yGWoO@7`aLjdF0jMFFM0uFb?IvTmoq==|LSH_z6w92veW^!Y5; zU0kb2{w=gmzmqsdXf6MFdvaPA_asDV7~u*S&PY zC;qmZr*v1lH3^nsTZ!fNqOE&ec2qA8P)jZD2^suSPV=B>%1NV4rS+I-Oo}_#UO(ak zRy_Q-C=z`BMu#`2vfckdr;Z#S`>ERBvZ!@AtNErM$DN`hUTnpFyd#+`kB@*C|Jba0 zQzUQ3Hu|}xisJM829wwJBgyF_^T|?D(bLBo5~b_Xj@##Ll&Ux+uH9W2VCbX+zvYD)46KEQMcr_*C=L#q(e8>vLZSh1(1tIQ+`|NFHUBXeJ(p* za%TW=J`nWpv$4zE{F=mZS&~O3{5!oxvS4%OVe8$1AMvP-ii|jTZYGH*g)l1w&1d3l zZ3O@^2-w`?=@k1Fl`D#1oU3H~zOAU5J~3*JyR`Ly-U+&&DRW6vt+BtK&1dqC-W(fl zVQYHt!NZo@-*pDC*tr7!`136ae*v;DGCn;X1~RVQQc7K~ZVIXsoZP{GpUhYQ@DF_h zw)2k)zvS)AZ4VTE`ReNx`ty&j4DgrJAFFh0Jw;9{j4Mw@c`1Z?x2&;7C)dN12a;OV zu9aBH;4kdNre$Z%#9`7pR2by9(NVtq@lyqNx3@yapZ&i`t!ql}HKfXLvxmeLP5ix) z4qq%O%yq*v_<7#-)+CizIpiYbg1i2Agk59J@f)ukw-m9yc&8H^d(%Y{`>&r}T3l*7 zuM@{EE(l$LD9f$4*ZBW$umiu~>(#h+uuqhyb*-p0!&n`6b16p(&TZ&?rdoo%mrULEb6NRuy)fo- z;rbUoVeVk(cN7lsSn`!n>6$iN|o z^*1o?Ssrk+uUYI58;f{y5|@~7@PAjH|AC%v9bQWjt52yjyVxF@K6lqWedC^?+H`Wv zv>r~4f=hb5lU&7hqcs`d;%wq7G(O%b+4{W0onNB+xiIq!s5hv5doYkkIM!$qBcH`U{BV;Xq(KP?Yb9Z!!kLGew zUq*H5sn!MkYv3DElds0Dka?62u8?(Yz9w$I7X5fk`{UU*MlajY0Pd04t2nQ`dQ5*@ zekSI{+R!XrH@#MM_S#Fo%7mG(@uRJy2WG|{Ne+UwTK81LzF*S7MHHvXjtcxxBkX%J;muTS{?zOVir0QbSKyhs++g?VPI+ zG#&W2$M$b+*9y6@J@V<#7#fD(ZUN{04p!qgBzyriLwkF8SDk;0Ox?4)&0#=*i15`Ok?1!fk%^Jo9k%uk-GYEqbPm0!rjl zR(CG0Y*m;|lGj`waIvqR?++cXLz585ZtVZ-5$IlVnt$)#7p68RCq(;1@k$Fqfw+(-HA~-ps>P-ImJjQ;>yh_bTs4Su;|6XWhK%36oxdE2NWB34@#X%FBkr$D{SV(cL&V#L%^)&*k9RQ{_4=qjE8 z2AJCrf}MNX;ol>Op7rF#5FO8Pyf!O^bMd(XFE|$ITLfoL68eix_GZjQp)=bXUP=3D zjQ@UEBAi$2Mz^*5PIAzJ++o%u@6|4g%rEMSFDRwI)&E4tqBZ8&g~Ru`ft!rYgh$ve zHAT%T*MlHB9n8r5N?8i10AtZwu~D-7G|jMgF0f0rU5OD3X0{1>=dkOP|23}v-YmUS zTQ8m@syGp=>#26U;fYGGA6|6%&PsXGr%C5psQWHdOWWLjE6EeoEc?$3g#;G?x;{>> zqwGbuyslMoq@{tA=0e8wqL6i!p94i_gQ8|teI%j*;RYaOp|fI1+F+c8`{ciqc$-sb&LCKZLbN04VccRo$L{&Y4}^Iy`JmPxSMF&RaM8O`>uaeCy{hqya8BegImW!PHzKe!mdc7Oqq(S{MX{%z*_mr_E~Y%Znb*%#mm?Ib|H`*C<%PZJ z>pQj90WI3Sj;>w))lBW4x*o3BgZpITzuhsZr~1k<&z^k9QqbOs|4{X?U~|eLI-|4w zWr+++E7TjV&L~cUC1*rD6@mrL9=f1B2biFJXYbre>BPAEOIM|QLvH7tU`~vq(5OCb zxc^bb2@Z<&E&Z-8kFG5H`CT-<9$>!Xit?3Ki}qSH1Dw??qpWrK&O{ebBXa+OT8d`A ze?nxJHTRzFzih<;$pG@$O}+)vyd@8rzlg{_h%!6ID+gzP-OPvZ4!=$cggdjNbexyL zORaUH)VaK)&3>b>!#>)RVw;aRa}cRaHxgWqMUt+F*$B`J&~H<_Wt^q0o}&5T0~w|s zgg$Tw=Z{>+gz23(`jVab zaBw6|``c3qO8w_OONajX+h9S?@}}T+*f-D&KzRDIG+OSnv74!%($M&NT2~+l zeC2WotNn+E?8YBxj$NhDQBOF-)U<2g!+_SxZhiX{y(P_(>K09YkCEFgfcTfb%joj# zTZ{ApQnEJUh0}^Z=N!dzJ&Tq&!K$r&3iC;!6X&?U#VX?PR5tjX@HxH6hAPL0rIJNS z-dbLFE9xE+9LtXvBQz$CXz3iGzcW+3Cn30H6hobUI!Izb6&}f7o6XMLj=+xbOC=N2 zE*vq7i;KK$s!)?bR(N7R4Q(Z>|CHY&+adaO^<7Tlx05a%&$}>nb+d9<&0W>pjezT3 zrEE#x@_Xh#E;yCYP;SHFPUXGdK{9%2ZT)121dT~HLyk_G2R)`6A&^L!D{SVM06)K~ zD=QmYaHCm;vCuWqsPM(RJvLd|3ydZKL%5_?56rVkg)LC(ywh!VW!UGeFJ(EniK2K? zBXe}`>#CBEY&&H7+vZF!7aNJBtbg~PCyo-R9e7idpkIrSNO@of)h|z)&|yl(r(f~Ya!_3Efrg&yvDb8heeKC#=hITcX1pI8FS^Q zUH4=o-|~1ir%TQV<2Jm#OLqyacsz=g!(c4%Yy_`?lt3q^_cKzwya5>fKyiyY>_3%A zf*uOlGja!13b^_YW?$}61|}|Q#dPw=hniQCFS+tD1s(vS*lwt`+5WuHOE{y4iC`wtWl*-w(7bq=0P0hGSxk$zM zZ#Pf+mZC{IuFq+e-S)V)e{%amv?{lCE>qGs2HF|#ebK6ZZI(d%;JJ9rxvH}?KQ)WM z^Zo{?^pPF%-Gai4N(P;_e za)#;!ld!%z_Kt`&sRp73_`+2l%kF&oe)9HhKF35wn-HV(&&-zpM0;SoZ}>d&b|8L5 zFi*%o!H@WfQb-hrwje2Tdip@BeNO7>9Ug1WSlBkE-X>%L^%(*i6io`e$Md zgRluD_%`6;wUa}n|A8VV%%Is%7S+@+dUGx58aFc0oEV*&(#E%Kdu^QU+2*skPS=1R z%K&8lS*zWrd;sUjIY00lW z>RXe)waCv^rwLu6)!dr3<%sf4l?yyKgY8)CHScwDI6*@L)gR<>hq+q|drEQ#M?F0~ z@zb3a$4N+Y`zKi+k25?SXLxz}$lg~v2bqT^F0*h{+`cK!tn?$d%UbJofpckc=E^-^ z>C(OW3zddhA)%qC3=KK3X?$4AbD#J|fb>kEU#GGv5M`}%dFai#5x@|{u=;vl3nieR z1DnZ;&V!Nk7bau8Z>qaKlD1K2x>Z>K1gw>eQi;mX`)zn>QdEe$v$y_`~8A=!}23pKbH!eQxjP zWxjN;Jhgc1LtVKA5E3fz!a|E=)44x3@yj$Cr1Nn(rcJUrJnSy z1Sfsg+Z)!wo2GN)wEq>@HS~N9D&6fu*$I7?L%E3*f^V1Byf~+J`j!5Ay=?o#6J`eNf7;!BxWdDpJxfs* z-#w9$w=zrm%-`lE(ZH2n-l*$Pw6TA^ra56&>;q)>nw19KjBxsh`y3~qv1xb1)8p6p zp{FSejp3}7Y}uplBVjfWU+G7+NOQN9H@H^LFI|qp>$qbyZCGi}hz?nfH#u3Ud(>OA1TE0C zTQM=>5l{O*;e45ynK@9BdGbG7z|1za>y2y(5X0~ zc))9y6zvr#G@$*!^p9=Q?{ji!DXEkvUNo9vkd~Io4k|y1Lbd?DMcy-D^C8JXFuvMMY5?$`O8^S%Dp|GLh(&Jfd=U+%bM2wz^HhmFV!;`VZy59bFX{5`Lzl?wX(btD z6j>cQsEFK}uq$)D);HH;;45++V(&L51L0{e_YG8-x>Vb1&$b^WaYyWt+x894jn88E znwpxh$>A_(S=kb4wydn8!mnj=_jk%){-_NO=|rI>pAGWAxhr`(%Lk2(!mm;v%WaCI zn+PqI(HReMQC`+q+g<-hFxR2+w|m!ORW9qn)#3ERtvc=9e|lEWsBG;^`axUyu|~}C zmb3@!2p`jveZ@N$HrEdCaliIny(}66<%@7`hwa-d%!I=|Ne83zqvKQq{kzZdKKjv9 zg~k3vD3w9*ijV@p%s;PQwC#Cf{k2FK{w;?n#X*wG8P9nyu2faCmpblX5`#?$Zkq_q zBi7FO`y66DTWECZw0d~iD6!AAR@|JVgk&RSiDqYixJk04JlJRGrN3R34bG()IzibM zef@jggDiq1^gpHRFJHdg0e42U=Bl$miJCMxG!Vx+qA8A@i8(o$@-uGFPDM0{fRliT zT;GynwrrT!`}FCzJY;GZPZF1qAiM?P*VotA_sSu^U#sU6rLE0p&?uWb`FM(!zF+UT zy^*HeYTMg=Hx_d|p2bp6o2Bk};aPpIxg4umh( zkD3k%5+nPBSyCV8RvkU5I9|$|90VQF36ouv87uf z9gwm+8Btx0S&9=&7ssu7r^sB}+HW~Dq%16ijj?Y8|78{AboM481!~niE%2Out(mqV zlyv5d_mRpmi@WmjRZ#Fad#w-M|1IFIfaKwIUqps968Nfww6woPY;r<^NPz~31v~e< zl@7hmgG?)|?V#f6@s(jyGDXbw*dK6G{+*hw-#hu)`kU;^%ilrk zbvn!JwF|oFS<(Xc&1H>{+{|kc9oBn4sJrR6Gk528r*eps`(YN0aIJf-kfNCV@W@HE z$7gWDt`|~YW+Pm!;Dai=vL?9pJ&Vv30lDef@6QLl{w>u!M^cv4mz8@4?;9#g#3sJ5 zv}+mqK9IG$--5Mrz{;>lF)BZtD`-%s$egczEzweOLKh9L5GP&HGawd$z4{dnvzd@W zJ-UAv=m9z)#vD0Au-(9`%Am>x8e1?hF!1a{9#(I!qdX%iDg+GKi767~Ocj;B4?en4 zwv;ww12@qK8W^|d>2R7BF6OJuPtN*47hSz?B+*P_gT+DZH_zUuPZ{4UFPc`xKAO8x zajb&v(HW5-fwj$_1KZwQ?-Gtk^L4T=%Pc*kb4N+Yt@rA8p1mr|gG$+r7b2cY{LsoY zWV@%BJ}kGE?660W?tP{y+4RSCqka*Z9zepWiyW_ zQ+jb=WF&eBKVJU}RN8;I=C+KEP_&q{hjD^2#h^1k@iH0y$kM(z=4k}XeIw)#mtdYl zGg%8+$fJv6-=nj1153``huj%LG%?HxGH)h?J^wlhp*n=O5$*>OL$^VvQP zm|4arChpErk}@~XSYTg7jzZn$or{WiX{@h?=)GiXGYI8v{CzSZRr}D{o0uoJv-O&bF101`I6YTN92!&?(n_*U9olUr@#}N zm^~&J=%3DDoa5Tpy<5QILGuS~skCghx@*0kT*D3HLEge?dc$`atEGvEE&Sk5%jn6}GBUEFG%k zq{zsOi5ox*aAUaQlaK5c5c+ty&qip7SPD#{lEI|~evC~R_WX?b$mRaSqDRXHTQDQ~ z4~M>GVg%k;6JU}1{QmGq;@?DPdu!YeP1|t`qPAyfX6PHRa~# z44Dn@YbbwYNzHrlqXDhdN@2_o5S%o4I|X9A^)vhf)YA2!MIhd7hDmlX(X<8R0P<_? za1{m%HF%#s@?4Pav9kyfA+Vdjy_CJpGwPlA|C^5}+WeevRb$INl4x0B&ilVsnE05X zo*!QjLgZ-AAHzfX{MVkj=H+d9+;ZhGWzRuf$A2!+>wBLp?RRGXOU^NQIzM?bx#Xwx zZ|BXh?GG;gEPRFTO%=s6qg3$Ps)@PiLhG4)OhObu`v%$x6|0ViHFrXWv-^;z(5}9%_&KF_b4&rt9Z; z`@JXapIDS4{|p;o-~fvQ5RR~7!82>Xc80Kaa}|E@( z2uF%XlP(U z!sOnuHlX**F=?Aa^ie`*7+zG4Z^o3Y`I#o$QFCvIwQ*2RMc+|S{v#8>kn)6v?dH`T z!F09958t?ZoPp+`4hh@w8-Fj~e8IBK~k2FWx> z+*5nYRj|arbiQC>04^-e!A!)sjh>z!CfY<1bC~RYyD@&lG!7vO^pN8eG3O8`Qq={6 zh`=HjjT2`Jl#g%Ub*0GoLB^66?>oK^G!|QL^U_Or((ymdKFT6d5}H|MysskAW8UO@ z(S7n8hAs8iQaUWYcVEUuP!qgsF&ts#vEW|m}8)+&?n0nNV z8ork6>5sL0V`kc`yv>ab1vjxD;DLgyL;W*U&m}zNp4|FL;-aYYOzrEw*wD$9?g{PE zg$?hFz1oUYrG00;`fF=%L10oCc`WqNFNW$Gc8%D4E6uKV+foJjM#86=EhBLu-pL5IY+zzJh<{v7SB-_rh4H1WQY5aX~Q+ za-3}imU>7!nBMw4d$tD}V1!>eItQdOB8qaA8wG3<5)yH^5(qh&kb`3ZUUqXsa=||y z=;?`K0g34%+z&$cp)s14mPUvHn)DZDmHOA zSNFpwn#-?)AFjl$Qh(`|bNy)j^lS#x%dnCX0d?nfWG_n(db0KZBHV=>6g#|Q-;t(G zlFMbQ4o=pq!SX{X57SLdGq?%gA}ATv)iLywerw}?^qq{DF+;A9ZKP=KY6BIfMU*d= z%X69#U-DE-PlUP&G&5h>{hl^o{iP4<%1S7{ZhcXwL#V=o0)3*OaiqqdAZE4?0{MCk z!RwU-(g_Uf?p)=H!W1V2p)Z=9ZgABNwk{xzH8oJ5emHZfwE6La&d9n<`-T^1(^_6B zgG~#OAEH`;Fv1+_R6?H@=`k~9cok%vEar!ATJfs72hV@ii!mQ>B!>rV1Hb9rvPIGP zZyUC&zosZ4Sxc^>$A`dL5?|ChgZCDGJQ%TMt=miT1|HWm1wa1!i07S+8I z22a~fVQ1+cGLLbdOE7q3Yq{4q`}gihU6Hd|rp{hbKMLU_xi@l*ua+zebrAez3#vCRAulCP5%f+U6tHBy$yF3 zdvLx}*_7B!eiS^Pz({|mUM7g>Jhm{_5U*r%w>LG@L6kb!)pdJ?=OM!Qosd9y@!~Kx zVGaJs^O9N<;|~v3O2)o4rqzuq1>LP9nN4HvkKIo4gOZnSZPc(}-%?N!W0?1`gY@;5 z!H61hWHW0up+{*Gezw2gufWk_)I3)?wB$dSzFyaQS~Sd2`-c<>+v-y*pUHHD~^#))=wZ zR3ZFnii)aggJakszH3(caAmj*^|$w_sld&HUbZ(u^kY3W~vd z5)9w@7IB}n6?e1TNvf=?^Md>&BmhpmZEK?@Ig#6+++%|#c3Yh2AxI3IBt}Vz z88U=`=l#yzlg9T?lg>}KDtDrG+uhG?B+UXEJPBVTBOx0Tr2z|bX(L;q;1QjQij4RVa& z`;YG2Iebpk?=8lm;G%X3N`>upR(U4<4?Ew7O$7v62r=a9wNSNZLrOXf$2(3Y>6M_P zUBJ4?0ZQKEtgPt{?HD*wHk#?jlZRk`pLjKZ<))ydlu*gT?KmM(3H7Nj2AmLitj4_n zb>Iw@5W|bt13m6Y%lcbW%`~b#k~i!4$rvNQ=JP~kYw`HfDLz%3HzCRU9MdmnoTj8~ zLaIT=WkNyX{;BcEy@N>69$*Z;!y5S<|&(lW=lU+3A1K|Yq49mz7fLn@Fj#FN6ytU-T1FUCntQl z23}iEG~W;vT||ry&XREr+bF*15fMODUG2bk*L9+53DG^x|ceox~OnHxn z>NiIaLkKN-D8tKEkV;sZnSJc(IfaI@+U8(Y((v?b+n1A7l?G~Qww7D2 zUBCXE|4JcD6}`-%j>@RsZ~A?>c6kYMsN#;%MhB^=sERjMXYkbVDn*Zu?}%MER@cAT z8aMHzeX9rUA%^U;S3Dt4dMe5E|Ng1cz}KwsRQ3zL|y3eXj!JqpS9NYftN`2GlC_J6)J zm@QcS?Bj`yib}eduJ%+n_|dnmr%y*Xq%zyULlFjxW{)0?BdyoLM|>x@*)P8Gp@H)x zgN&NAUDP0@Grg=5=k2#mbx*cN-SDIm*z8$vD4t%N?0$Fdn4z>z`l1?#jPFzl1R$@) z%Ve03h+sQBEPux`gMfxR#1m$?p-2vbnxps@p{ZyIV*-cSHA2#_HEuU1VdJn>kSA(g z>Z8_po43~wp#)1b`5{U`2tj5+zRaL2tqJ0^=(UWab8&bOgS9yaa`h81Yc%1Jzs6!e~RN7#0()o*a*F=#r1;=k8Je}5~ z#xhsfld)Yb+3sp0YhOJRJF1Y6ka9g$A!7Q9 zB?KrR<|wsqcBQLNK)?59TaCkx5C5q?F$jTZa zM!}(xxnuWk!uy9`Kp;%WS&%KvXMJrcVq8jEnjW7J{#8e)sQhjxR|Fy&`4T6<(;WrDih$qMg|!*qZGuY*WeAX@=7|5zltL;?pdqHj(q?ceL5EXAF0*MVUd>Jv0H30wk7I!Q^^0RbpN5xMeH9{-yGCBWf=w$|zn9hY7Y0mrRN# zL3bBPpnUR(Yo^uHU+;*tC@+s|bAze*$j%`#E#0XtjL&sabhhwY^0UZnfWm-Df03s; z!UG{LT&4pkrwTs1T^mRVl1buF-$|r{FU9Fl!n%i09zA;P@ndde!S!5@$ajdrdK6M@ zP;-Y2L^Wi(KjM~b#E(N*et_Hf*N@(l`Of<|=04}WUz+ZCj(Wv|xMF~!?nCGMqFV7Y zm5Yh`?FnO@gTuf$ui>*xI&&F(c?KtJ!pD}~VR?>?K7pl5po=n0xH_VAjO*iFd4=#3 zE7iy5ne|VsMJ;6w+6uW<^hXv=%G?E)5vb5ZkkRAl8k|%ZOMLi)3zP zoS|v{DUa>r$H()ZFzvb4aXzqUQ#++7#;x{+?ziX}lRpa;pMK_jyO6foIXb$wcM><^ z(3IliqlNEouap!Qdw;j7={|tz>N0QCFB z7HVqhEg&L*-(Nin<}S z*!yjO!Dlh6;;^~%zMQ@i(L;Ne^mC-8PMUk4W3R;*x@UgqJEsej`Tq4iXliq{=UbiR z_iYKCN2(n^S6tBF)cszQ%At$A)NJjKF=49wTG*AOSgmu=RxFi4Jj?kai+0`?YaHVa z!F6GOnM3^IDFL6xS@dlWWjVPs%v{OR5!iF6EJ`BF#J^{urmD&vf|i8G4~EPukzv%J zx9pjo&WgheKbL3-dAfl;DB^p{JvdnYsZ&;r90Dp*{^F7n2?x{Pk<-L;81i?0X3e2C zDX6~T=O#Ipl`WOu+~%=U`RAwg&La9?dd1O_XDfFX8_W;v5PrA+`}gl8CFkl?XpeeL zT`SJYVn@pP7D1#Kh7NxLdu5vrQXM*U==JjIyZqHRZ%3-zItz4@7AYtwNcz^p?rGNS z(oI@3HZmfL2BM{aiqbuLCdA4?<2DE@@@WyY!iT--u>nRRemu`94`<4~2S-ceKMTGr zkD-?C?cfiz!K`es9I(jAmC{eEt^~5FnDxNDbdWng?DErq(BNQFPJ=I(*8AVxJqJ9o z0x7=!*GxKiSSD=fgTOcc`}Y`PE^?|?gqpM3%;LzE6pJ3QK-=*R9_1lNxPxm6e=>@- z_EJZCRPRxyb`B2w@Ddxvol9Kw4^9{SxvP>`A$6eP^zDFp0}W1GXN>oyAR`#A=rGD$DXHaCh?Mjl79s1=jh*euCV2l+@+ z)Dfszvo>`S^<3`p7knjis=1@Dm-I?nqf#Eo6N!Sl`&locquH!)$GGlTm^KP&9!z zKpyk5UNZ$@C;@P8p-J{`&2HV`fB<1!1#sVdz^Z(BM+5pUr0ySDdq3aq_fx%C#4O{4 zj441oo&v@ggBRjOAWcdnBk?kIz?i-Q5}Ti&$EM!cSTiL|4%_Xsva(tYauUiaK7Arw z2$6|>bk55l+cfR|a0b8zlI0777rO9~@LhI)zK5}f1e_BEKd>5!`o8S&h|Ai$wt&3B zVckCW+Q-Ld+d9`NIB(+^fvbE4@P}GKZcoRQ6-0wtzr@I?fx<=@C4Ttup(Y`??P91Z zN3#L*(V|0Q-p9j)J&rT5uq$Vx4U(81H6Af%IvLQpy+GJcj&Th1r6Fwp#&FIVFG}lN zTwUEgJr|nsjTURuMgfP@-+9s7(fnSB0x*>_NcuBXy(9awqGGtM&t*aG?q~Dt^?d!y z18+J@@@*x0OyX0s>g^+*>dusV_BY2X<^|^R9RJ(=aa~!16>@DFYp04%m|Iv34_7@W z04{9(v#dG-`Taz4-a7N!0YQ;K(ZMLn|H2Y`eAmvAqt)|4Gt!my+EVT8-=lBFw%@rI zPbW?#KUu6QuZrh+h19T;@@A{+77~}aW&Pe<7HFwNa+`l@i+zP;7q{5p!?(B|={iN} zI!*%53C?Y1k&3z(V(s?V+ERa{wy{wME;)_S0ucbOE&)s_-B>kjjuudU9XafGsBvtv zHSSh?o2S7;x;>vpBxr3G$%47PY1U}`_$avSzv5jHk*crMF@iANfaw$<9jU#~h+Zs_ zBj6l@9jgclL_ofAfC~tuEa8|!zO&13R6uaS6oH!&F0FXHt^`5n<`|(v9|65U6y{S; zPdHKKp*KZ{xFKMmih>kb4DevWV9p`q(d6f+XhRH5PuCNYp0hbbF$liUkrOAX!4UX_ zs{5J0KRp*0!3#b}!Tk{u(~`lu_=WHWOX$_w0z1NIfW;Bs;}Ad+tP7pidCfLYglA`G zZ|l92-eoybeW2Zb!EaZZOcIeN1HQ7iU%NJ8-1T!q!wz;KM7T|;FUucOsweGb`a8XB zSX%nmtu26D=hllkxp7&C9r`0(MYDEe(-c``Ln!p9g~|3z!$@5&-xDEb^y?J&1TU+?0hO?eq| zpcJoP(`>n@lK-Trh>xfP;GKcW_f6Lf^|VcNaIo$vsbzdG+5TPl-U72B7yWQgPf@S6 z38F81`m_WRSzrZ7pU zZLH|EwY7OiLHn^G+rP!0PxJO|KmEda_O>ajzo?QES^!gNULupEXF?~1hL7)bzEC08 zM^x;t3Mq65bd^68+Vl>})n3`&(BbNz86}~V*JfntT7Ksn-!Y6~lxt`ZsK(b!cQAL` zpSVJksHUdI6E#D)Nriyfw=GZ*ftOR$uhV-GCs8%;%vIJLY=!#Uwz85MdANEIMk`oD z0zrTBHHMQwic)M6=aLcRh z2+Gl+p(l}ujzeIQ>6eT7O*9*?bmZlk4vM5I1O)_?gPRt1#rV{{G?ntf!5G-fgxseN zmQzQCc+y_-UN~=FwsrJ;pJcqu7+*|d$~*12w#tCOK!OMRuq!PpDSj5R&H=Y*p)Ti& z?LW3g@tjZkiYEXtBA6pxzccxGuM3Tw>d}gG969+mvug3Ttb!B2az0p0T#(N7Fo{>X z&6yRF+BKtCU_pmU|3*qjTdFeG-}UtstUo!o84WO2G%pBBOS}9RoRiC7fXeF4Blv6M zf|iUCj0$GD2bI6cw)lO79^~!Yw<84|!(p=Vsve?P9CR0mE(Kw~16_O*6BB^yo(2!JprE_qk4kqdROe--1*(Wr4TTe7yT~w4Lior)k(&z% zxn%nZ=KEK%Sb)$;?^U~&4MB1yC@QK6SX6M~^^xedps_fDeo%rwlBUY8u2Ag0hy*0IUf6hS5HxDfh7HZPZ{J?b zva=c#0j|!jy$|r%WZJNRKQD}Krd;%EGe|*+;+5euF|HhXE;VSg}|8XCJ zgA$hO@#Dt?&Wfed;N7Z%u#Nu6$KKuu;<m`iuCG-5nYec-*W@8*uAGMn){QFTlpI);Q6KLb)fy zGd;u8&w&Zk1dBiCPhe+E`{z!3Rs1{Y?p>5cUgu_W`JDc8|NQwAK3&yTt*5`CBNdO2 zolqvhE1h-=t>qycY;8C>CCr;KH{q%Q*rUw5U-;cL+YO7Qt>kU{2j=XzZ{Jl~w5A#@ ze2MB%b&%3XN1ZntfIaZ`*xPI4Tx{RP8=UV9yA{dr#}cbdRWzGOSEXDP$`iXrQ=--a z7)ueUA}R!w+M&>T_rB4);{|oDbLguK8 z2a4u|f9>8cNxtWa&9AdEnKqYGwdqTrEx+krG41Koahu)K^B`OIZspnc`?d1%sY!^a zf$aN!iJf)n^S)0bEiyH`(X7;fV-XUf=g5u2bG{Eh8%?8mb<<-qWN7OjJNweTn;sPU z2hTZ(9!}nqV|7axcLvk16V$HdAJNS~K6ivZ`@xBG{+d3sWM@;)DLUHZ-1;8U8h8HD z(8jwG){&@-I5=mn{G8b5CuN_xZzGl{!(UJ2Q#n`z@7n+yq!^A>)zoVi)bufdpz-Y(Xo3e ze_DlnTIi)?^BOayOcL@_oN9a~6$lNg?B?RJ`ALD=IRR<30~jbPCi1=5`BhY%BWGB);M#6&`*#bJ9gkBzDkcIul{dn&6tzRTAJD=Izxp2T& zqyoXT`TN(by?gcm{uR7>HsHg<*0TpGc`K1iHCVeXo|IJ|by?pzJhrrUt{D&g<#i1U z`?j3-qlIs7KG@eepxUsrXrE-VK$6_z9+x`>V(~IW7)rbyMPvvttjo2!_33)%ulaK1 z4n&KK=#Ii*;tGzce`;m7Q%sqe?_)Ihd1KSah`1@@xWU>oz_=_mrJpS2)j1+8?<{4Nq=#@ zW{&O%4|?cuF&{(I50dv0gh?CzSUcRV(feh3ZQ zr06K!;1d$B)XdpyD48ZezB_6=cE?bVD$lCy@f|}$0Bi|oR~#^i2y+o+aWv4{H23Oi zB#msx8-X)m6~G_3n~Y4797;lJq}VQ~X)uB2f}$Pg_$}5V+oYfH zT$1o)zZ z+N+<-|3fQs-jDgW1=`}ps%yqtsalF;1uqUxA0$1VL9=Jv>f6Vy*a}3V2VgY&Ve6;1 zGkb%(LEqWCfB%hmnR#$NKcgcF78PwkA1R)%uD`AR<%7%tZ2_VD&8s=z4J7?yByHqv z-g?w`9F=}tOn%9%e&{$;iGqc!dC-}<>#xX!j?hQRZt$+l|HlQWW8W7X2nZLOEn&xX zbWja)PTAPlDCL4A!@*Y*ahqdWj%fp8%sT3Dz>4g)oj z@RVo%ZyhqdbNwEKb+H}fqfD@SWbHwJU?Toy=!cG8C0>r9%OU6LhMp{Lbu!z0dgtba zs5ZX&+u!+?4R6jgCyS(aVF2qBY(kMdZ^K6^8#D|>ME z=y;?2dh<+=QBWA!^%dK~8ifM*Eb*uM=~~|_vX5F6#9!YSu4mVz-wW01r>(j_$u###* zpqtEy>?QxRP#N_%KwaanAEP>Vd4cQ?@2sw8??D+IhF{_{RnIDqd};rZW%ba7{HBP= zxP%;VFHqStGBe+x%YirOM$}!iv;HwL>hWdQSh3xyFq#I;f)1BBu>@E#Fogjdpaus; zqr%~2C0bpoQ>#~63^n?nX4gHeu)jR38FR$Vbn=2h>5jz_@xj@jt{@}K1+<8&WR+Cs zyO{${OL$ntv`794I>>11fqzVus?dNIpe@+Q^9u`^|9nDG(JbTMD;O5=kVzuw?)xdY z=Q0fbp81zSx%LiEWn|e~eLFO&vSGxQcTs;e{?CYe_DQoZJW9O$u}5)4EWXTNuvh(K zQNFPa{7N-(Td%GlwHo%C_O_wD!B5IH2ov#_-%B3-IE4}b4xpr4;6#dKdmlf)K-H4y zVYeD-44~j^SLn=V`wA+s*#Y)$y_zI9JUc6m>{8N8#o2jNJgSzZF|?y}w0Pb2(ZGP0 zWT;5ow}bmnHkNPXLAbfgNut&Yj#*F2lyoPH4h! zE;(_99FM?ri}t95C%xPjq#fXV5_5I*($SUu{ZT;m79qzk7^0f*Mcn=F zw|<74EV*&KYre>+rX4Pk@miC5=V3{^h-55VF8K z$Zkm}_o^M<5lah3A!^LSM~(>V=+GWHa-^@w#vh#NYpg05-a<20_3z)m$&wN|BYrhu z3WleE?o%$wj+`4>QK# zs1el)HUU9B12#!ONB{t2;zSN$XNDLqc7QMO-`Uw;-x=?*l!iLcU?)N-IJ&tpPbB#f-f7(MpOkB#GJIL&B(%S4SXTD*P_eTHi zspg)Tu|u9h+}H=SDYX0+0*}v+koV|jkMR7qlxs;dnY!d|@xmy$5%7mfW>KZ$m}1&j zwd=9>KA(>}uytyy)m`gymU}*rnO=p8$Dd_mYx|Y&xR%SXH8MKd#4ZMmARx;hD=M}l zSQ~V{_rk>nMCt5S<~`fc9YN_23a*!r400j3mAy+xvt9*njf*oP6oi z0woRVhF{{I4gK9I^yag)n)!fCqIyZ>r*2i&O8)M+Sof0JVE}7 z|3#9yta%$xaPPuS;Sc;cH)9Q?anWI6V1XW z`0&jy(2SV>^QXF@ zVV|_LG#X}eb8{a%I!JM4M@HUQxO$k19@q(1GcYKKSWWO1u+AV$5deokOLOy;rjhY+ z51=1vYHH{(A7Eu=#g9xdq#IpMEgzk;3O0Ujhl9e(rXjhU6zTY!Su z#=RjYSd_la%rLD^ak68C4t|Nip+=EK;~REi=mtmU;b5si6t6YWQm7r1&wDQT@1a$d zXcNy-$t{T?E5_Ps^lD_wuspKkJEhC{MqfcTT!%9j|1i+$y6W=IhlNgr>iP%cOPf6# z4Q08TM~zPVC?$xPylB6Wa)gClsf{srU%N9P4* z=Yc^3Ysa|<5Jcz}czJoP94&x-BS(xJBj>upqFQZTMCI>=1-thmQ)xyab}VBrD;OU2 z54dYjn||?rRW~a=8)qL^>R>&~RG3m2Y9FT9#$0N%89mEi8kd%Ek-Ey^#-e1ayeo~I zuFdSg81$$A0%S$8698doPyimobr?otdXMql z-9aD+Rrob(Qna6}?6zA!M+t}|G=El{)ZGPq$|{OejbgveHZJqenl`kz%UYFb z?b;o6kgcfNsM#~J=FH4NYtw_H3a$b^>3NYiY|lnq=el?Qs|~4*;(g;Y6E7zwqk1C3 zGT6=Qtdl-0pi@WTlPU@fzY*Z{UJ{bCumeTN#&(q4u6V_y?-k}bo(n&g5KC3CTpX9e zXWp}S?->q`m&kV0_!`Jp#p93SU)l$4H*Kt}8o8vBTOM+1cWD0e=3!bx>Ba z<~hYWCD8l2#EhiPDs3#tErf3xI@m1n^}OqqyT7t)KZTj#$D^}!C}WBEQC{a-HUEZ& zpO`=p#byQ5h)V$BYwJ4%r5wYq1oStSS69QM?d|Q)1q&+rdZX10h@U7$Q7#{aV>IZ9 z1d0hvV+#RsfkX^G*{uqX1NuGL3~2M6@GD+8{O{{dMFlcLLxR`=G7>j8_v-jN%9@O45)u}6t!%ipn`)(Rvm;9~xHvgc8N|gCK9mZTYlcc${{4X+`h5}v0 z%u$C$@@2Y5B>nRJH&1G~%_aUeDoUv&L5(yg^a z1#qQwe-%*cZ%^tlkUgnmTN88X(ajU&fRjey>Q(F7241Zv|Pde$WaIRyN>GV%}-QSyQi6Kd?w>Wep zvhIq>kKVGZ4SW!Ars?Xr))(g`&NVUq*x0nCO3IY`6}V}#6msfq{zTzO)QGQgTEvud z3siK?L~-vzJ;rE8EkJ z*Kcyw(KJ2fTm35!hGN$Jnv&V4aJ{@*wQ-u`MCdNpxYQIA7N&0}ZDNv^vozmo@_ZzQdgpA_=5 z<5~?IZ}WWIV&0csP^Yn3&g`RfYxc{)11~xSss<(hobMK2Z)!_vKd5Yett%pt^^ye* z!ZVPkN2ZOA;&nMWxzZgEA=h5IFASmEYUx=@O3KtvNSd8Qv+F}nP8GH^mP1xm-_+D! z@;rM-j!3n3d@-c$>mo`oQJp56aTvKAF~7{h&K~qXV*^Qla9rC}wQT*RjEszM`U@Fs zRl)Jc?8-aY#Dge4%3CjQ7Np(bJzK!E=K%^p>Ez>zBw`D+M^lfA1;+<6N^sJN%PS;1 zc**+SuoRk7x}}x-rtW}+>`}$od!rJ(r-MFMzs(M6-n*n?)22HmnaUZ=+r#@lKkpi? z`A*>rC#!WHU{(b!H>lUkE_{A$q4}2&Qd=lKI8GhFMgH;z$A+m9gMmr{Dnum0W)!G;K1dVK9u-AN;=T>RtDS9UY;iGwAEV#7 z4&?K6rJCBGmAcLrR#R-*=D2O8V(5@l!EcGD&&NrpaGPTI&!TOJ*0{simi3PS!bw=F zgD@gJ!f<7Ebs+9g@o>RcH>6+y!Oq@pwYB68`HZ!)vNBeGfi4V=GEyz7Dk>oCS0Y!W zr%xpDpAn<|w`OK~86}=@RyojDB>9YLxSy~VO{fZ+?n=<1>J$04b-yi)4y-8qf1NhQ z&424fpDF44yy|KVSD8eI$@1Z!ii6rRKg4vzvhI_Y26}{h9Lk{(2EKpZbhzsk?G?83 zFP=vvav!>wP8)ALwx+?>S^G+o#mLq@r~8OovPRO9%!b@XU2`vA(vkTynSC6e9Pe#i zntd>>o+s3j6r=6*#UZQak&zUFO-^__Lc;J8iuv@ZJTq_}&B_iT6 zm3DfhpHswLwa;lTzvA(H=VN|iwSh(_`HO+QmQ_IJA@ulZ(}G4 ziobqzhw$MYLwoaTbPp}2v`jeE+9p>y_+DStH|bid`?WgjS4J>7Li&_HEhbMiQN>UR z06@s>(dOK{uw&QT{Th;=$O1-5@k8n*|EZ|hqTdf)bf@1vhg@Xa$UX;R2b z{bxE4D?}feUVRc#_$9wL1(WnBkNJw)Z1Qydx6yJ3xsh{#MqUXBf+0F3Xu^23bCV{(1LQW{_A8eQZdGiJQ$oUw2!0`-N$~ ze*Uc75plo1eV1rjq-vL_3|%?ZJ)NaIm|Yoi5?(o8?JZt7Z>uNTGHzN_Hl>~}Wa&7r z^i~&OC-EdNVlWFT?L(DJWt3m^)bL6d*$|ftnXS+Ny&E}o*_hM0T(ubsJ1%_Y-2Ox_ zjh?CEo<;vS?`)StjEY!VK}BOty++mRm%5Qc2wVB|wSNk~NlyiYp^QBNa8Af(fQ2rAC(hA|V_NZD&aS_tB5w0)2e;>&%ap z)qyU;kG0)EYUFf_Df557>{)eqHQ6OIELeep$^EhOC)YL-*FL(V>w_+33;g$DVn)#sB>}(yLc&aM2v%vxF#_ zQfe+m#gQG01Y`YyV$=PR0*`%vPEH06>~t5_occiQdf|7UT#Q`{;_@p#@7eu!mANg_ zK7`v}CjG6AfhpMT%!_IsBFV8}48IM2U*Z9-99{%@AitX)d(2qcZ`DrQ_u7dww*z(S zmLIIW`NG6PnSd8|r(B1P9OYif!Rv>U3nS~TX)o+K(RQX}yO7)Z)%>%Ou^ZR-<{ixY zcQ46l8hW@Xaci*gX%fH63Q4+r`sBGG|DP@b6D=++?nkRGCj$?ncP~JcbibY z#(3q$N(z zHPYXat2`Vs2U@Qv>Wcq7b>J5HN59XMwfouB=AGR+qYW9Y^L7h<6)Zlsc2G2pT2t){ zKZ-S31L>iaT`gIlt)g0!@VxNPL7clE2>wV#MYF@~fPh?bCbbXAHQf+~CLIM|#lKT? z^pEb2zh$&S*ibh7h!P}*A<4gTi@$=|}dzwdi)^;{unl4m?NPS(Gjfp{5Ceb@u65Te>97Ua`$MdSHu;rfHM{Jy}Oy- zGgBtxC(j+e5kt)6^Sl{Lqd7kEx?Onu%d6{#)`q1%%QE{n(Eq@q7ZhmOxT`L7b=!(x zGh1vRqspk^5U|TFFxD>UvPhngqrb%VVqCGQfkA2UjzkB=Bi=@IICgy9t(lk=r)Lq5%3yf@tCR$WGU;DY# z-IN`aH{YOh8XI`*-x`S2t?gN+pO(dsy0>+0_o+&WGxcB4kpFll!o88dEck_peQSeb zgY{Q>iraJgzoqM5K43fJw5=l0^9(0{^az8fvZ!V4)M3xagXR_EyI^~<bxaw zi`8fnrirxSi~CYoM&B`oC6`s_ee%V? zQ#1_uBj(>vmf|7Gef}$=b`EK(W*60FE48DH9iEv>pKqT3ze~>J)OxQUYlMA9RaXee z3@>PsJ};oyo8j-uK(VLBqlT3cU&{VTs+PtxMa#R9vF<5EvGENH(PfmbnVL5q)~NR| zwABwYq)tjg|LcIp{|ASXe2RPa!A}Fb>7A~Df?N7)F@^OAPILk8E;J zPJeQtArn5l^W3x6!+hanaT%h{tr}la^rwBj5>!eUr=_$CGE}s+wDueLR35$QbKvxz zJucbtMyBn(3}r$dmakZtt5}%%XS-(1dMumy+4=Ndtwgpgt|X@x|8S0oe;Qvr;~e_z zXzUFpO>t(XKU61qZuh-|N}!9N$g`qtWMW^a7#^Y-1r*YD6Qzwz1po|1hcs)bY3L{ndbp~Z27!q#r!iNMCL zu3bM_%0lrgDUJzvP+$4`B3!2l|Nm;7*r|q+2I6P0l`a8ccR#Q1Bj!6a+1)DXe_PMa zh4oeDb}DLD3jTq`|fB??{=NH`}gv+CP_)ZnHkuV@q%)IB1qfbh^w1hYJ!UW zbH9hZe^`WIg{KyyJ%6*|rO_H>mb!l8S=6P{6OjY=}*@KRUu7 z`SAhPE#67r*d4ai)-GE+r?*I%X~<;#wBjYXt!+8BGm__zn!YY*}++NDxo^jLg(+Tgz5wm zz4WUeLg9~>Wzx?}aBk3dB{W3f(;39_r9M+qU!MU&U&oIh?;bXCauTHS-<{62<{Viu z1WUOs;LO$PWDX_`&vSd-_;kXZMKeDmBLJ3Y`_HXK)sD>HQB`e%A`1$*SQyuVi1#9t z%Z#h#;Q#kc1nQB*426=GjWP|T&poFs`>310t4IQ`;<=aD4X+n3j?s?MUjBbfeFan& z=+?E3C?O~%B_JTu-60A{3rKf^bT=p<-5?<;C?(z9(jnd5(hXAodA;Ai?wuvftThYf zohQz7&ffd%!zuheBqAzuTvRL~dhq%8J9wP0)dCEKWXNCnpjeTI_!vCQz##YZ7ga)@ zTxDbMd)a@vt((WN$~MgroRb+t{pc?$e-YJWTV|%CorRH$EA{`^0%RQ6V&S=9p7Eq- z#B;<^V{RiSZ@+#uuFLJa-k|H~JY|SHb@^+?Z&;gC!s28G1%=f5`=tHGWth043}IE^ zUb>z=x29qtPkPJm{*%9)o2ZzWH+i-4SF3*5{92hh`P#NS_PLZN9mzLb-9C=){F*sq zy+zmHx~_7Ec;iw#u^BVXW_B_9ap{JO$_-uqYp(DbPL^oexucrVO7j-Gsp2D|I?Sui zk0-wx=01DkIHnxl{7N91Fm6Sm$fEg5|L+`*6D_HjH+n7c{->SW3a1JMBemF)126ib zCUthA#-6nPX!SoS61ahoog)0(KuV10w1zhNTLR$j$jZu!aEb+OA7aX?zCQW#@^WVO z#JT86qy)w5|5!L9d`v;II6-RT;=&#A94rER!bONWK=p~xo{$L#t;N*c|97t*{kvCR z9WHmQn|JYX6QA~6s_taGrGC0ehkWO?&-aAqG`{{XFjB>${4hx<+WcN%ELbOaM?Ir! z^M6_WW}<*#n`Z8%45qASRKlO5LYln}%sd*aVQVQB(l6u*DxU8f?mr`&)QKZkQa(^? zq#kvOqfSL#vNUP@O+I>NHXU^1tti#`W#Y!b$n)R|0;IL2M?21sNuT>}E~|awQq&9S zvSJb47zvF^ASKr)<{lL?pS~Ew$ua4{_LSLOS0)*&s>|7Et>Vj#M`9W`VJy$J%T*ao zw4)VE*DF8TaMxQRQXlo|h(*PDbRhZT+rqsY=J_>=I1e?JvVx@^x9#RD2|#dWu3Ei5VIDBsnUP zk^(ou1;uP9uG<;#CXRLp8dCI{1=um-x{gCo_L@YWF<2#q-ov~#aHow$FBL=Dhr)EvNGMN}bFZ7d zTf7^$BLoZ5? z%jYRlkals2;7ljaH)ot%;+ylN`||MinXj^6!2c6nbLptL{3n3|3#DFN@u0GnRkcs! z*3zoCil(DctT<;nwoLu|6ja6Em3f}_0WOmAYRv1^D8sK0g_mJ~QHK5Y8)P*mJFY3$++ zCC;$`*_)YdTwGI23$02A&YwI#PlwK_;uGQ-o_p!!j$u2ahZ6UGZ+RX*O}*xjYW>7_ zy};td2~t(w!FKh|e$zwx0+4rM`riSUpSdp0D<;HpLPL*ZeWlfTpec924U}okZyK0C0+|XTF8SHy>F%XY>l2P3hhd_#iO9L*hkainw8R98W(XF z&b|FbeFt9oPQ0ofka~;SpI0)NUWWMo&3^2BGKy_t_?XB>IWax*BT+;Cc?a{pJ?(~5 z;;2pZZRd|XWPR9ncW-^tvM5Ywjcy(fXk2@Kr%MK=!T61qIN@Qui-+@-l|E=I2F4(qbPtITIOk_8i>plS{#| zwA%P(fBun3fD!A$ho5_*!FE!|)&rY*=y@>C1C6=)2w!7M7RwK9S!x5$$hwib=gWIO zPpvq64Y&K07L|3SU~xYLU&4ACX3r!*^GiU7vjTeCO!dU6q@!c;D7VOMlaN z`|jbyTx12wI#CSA5cY+e_<{*$(g{k+FTqq_^kwY+ra zD8y3D#)gz85v_rD>GzfPbWN?zbQEl{V@lMTg4Tkr+~a%+w#2wicubU5mD>=jysFWL zy^4*}(O`Ir8$-}`y5!hO-X@cnZ6IOY9cFp9BHVn4Rmmvq>1HTniNXK#FJ2KS%a|@;u7qh)L$opkFgZb-W$4_ zT|scWW*Sq+mqi?E+(-Z7$sL7nrIquQ7uId`CrUl)&&G&Vh7~4;*q#ywmt^O%WTGOz zbAC0FSKZn&rZOX5WKw@(7(g{F21nyX=M(+ADzzVP<)*}knP916!j#xovy84A=wT9x zxnw)*Wjne%ZEC!KK7@o2_Nc4wkWx`@RRqHOLHonMvp?rW&Kpx4YbCTvA+j{FsHlXA zQkoxc+ts5Ts^VP86xWXM_*g`XMa-Ahor0u83|)12G?=L$xY(kb4+i(`>g&>@#MExG z6w$5RroFD9Z^z=dVg9LW9aKSJ7;l5W!Lu>;XR4EJmCc^RJ}j#EY?!ZE#5g@lFgNU0 z?MK1dN6Fj856hRa9ZHJxek58^axU?i(^Za7U{~fHt5sop@Pw_YaIlo`lG*lF?o5mX zC>6H5p|4=49X{0{;NYrUt`;t^wH|Qb+!5G+*YTQ1?Qg*)p){+!t>|h+yOr9oEmq{? z$dkWnh~@?GVIv0T3_akF)NK2O5-gjLeNA~j zRx{Ijl?`z?JvVn}Wpkr+a$_STkjYg#@|=2$UTl&-x_`&3uVAY@MQ}w}0PoLlR77kr+H0G){J6Y#@5@kN=@;50ZHehRM`(X~j zw%a$8=VEFBX&u$p=grn*bo*naW~23T<{A!pDTH!5Mn?9MA8UiP)@fZPb)7A7(e@8( zHqXa)7YE(!)j#s^<_}g$pB$a4P%b~WIGfcm*P|<{spc@T^dCLlm}WoY@C;2a&49J#YJAmwqOMQM*qpu;jkc$O+4* z2Xso1e*v?K0r@DyPQ=X{7CYbat%rd#_x~n!Zk5kVSm=u%?Kn&tzm5IYr3l}AtANJ@#SEmSJ&0rm91P!3`0&wd9*O9Bqq&zDCBlPmlY(T zVVI?&L}66>+vo4f;!;d`n#zE;g46 zO~Tr(NguVhQNe3hV7aGd;iaBRY>O@D(j{hY$x_f!>JJ%RpF3{IW49NV7lkQW#_ zVnLY%

e2%So28X!}POo8R?U(FPl-&+?(TLe!=dB9DLa{&aAWe39-+xBfmOyRzoY zS_(N)r}~Rr)|2}4=^aPVNF$`_v)5NAag489at>P&KHbo$rCe@Kh@Nr(Rxn=5$<4_=`DKaQ zzkI#3_dtSNKaR;I^BZEDeE6{J9OnG<4F<>f4=3{a``cN`^1r<@n^Twg1sBD~vVsr=$NNcDh^RP)-up*HMLb{Dqa0n@ zZXZ0bj5km48Pu@HqjRl7M?%w+Yt`lo3x{b;;r;!L&u`!MDv1(~WN|S^{)NmLzSY-T zw-He{$){w6N!0A6d9q_a9gtH%5Ia(}%(neA)d7#HnQgT!XKo`$zuJb|E`;lRr2y;T z8Hr5l7h6m>YUb+bpG@+kbelIwbG-dKWfsInSc&CRy`vtHkiUUk=q+;pn$hsc_Mc-3Dl(@()BM8(9| zfD4~Z3x)`aeK{J(e>2{Dw;xBgi4iT<6`gZbZ<(6s)t{ww#d8lKQ)?qu9?n-!Z_dYR z`1@Ax)>=e}_Zy)q&;Ip(H~@H1zhn-*K-?W;!5S=pM_&6E{r!BJwo_ENvd&u;++}6{ zvnKf0-N4F{W!XIA8iV}$*Gj1}c?|f`%`H)}wB4;yxEP#*@5h&4lpHHJ4Q>}Xsrz&h zNo|i_o}%(oQ3-jaeKHVX&dy?DPB8XGf_2fHGhXL8=jW}@gXa^=bUyR;045mp$AkW0r2PZ zebvck?m(+ON+3wkPpOOr}-tn#&k4N*6yH;m;~KW(B< z_pj$za&vvbvKILv%*e&-EZ|Y_;0|P44L@?`-EW1nkH0&R$luCo_bk9%`Q?do_PU?= zMMspS^_reqde@AhBnEkrqE6Zt-LMTox^PPI!TXbN!%ge7zo_-JTqPoGGJP}DuS#x%4|Xv`waSYYHiznma!x5a9MJi?D)ohE(fVsgnmklKpWy5;KJ zIAUb+EHQoXY7**`BZoq7E%6s+Wy-0A-f!N7JW^;Lm+%lF>U!_QCh+>B#ktviM<&esj|@J4 z`E?;=iASfF{&Q5ne7@|LlgW6%?pS2C3)C<;@|q>mZV_ScB<@NM6rr8UJC*QFcUJ1J z?x$7qH+}NkJ|)HVX}pcj)9@Odw}o>xp_#UP$}{zT+P(jYLTnpT8>d%(J83DF9$S|| zlK$_mZeu-;%+1R!^D{xN0_4QB6V7~GY(o2K%V`ciJMY&3+q+D@26iyK?b#z+%2Yj} z>M(*Lp)q6CWL?uq6?5L>9P?XdN;9QXk?n@4#b_U138#xh1nNK z0#b1^}u-qKpZ#%L~F$xkt zH%vs8nNp-b{ZlgC*-`RlGU)-)uP*~1;OxyV zUrXv&MNB$OL6!SE({eVoY*+S5oQK#osc$No@g-|O{^z<@HT`YdHjmj&r|1N=53)o6Ap** zP8X?8(E-`71(; zSpF)y{RtYftaSiIslP#K9J~WPABx?0mo#v;#E!YvR6h1%Y9yvV_FWes*-$B&s(^}8 zMeO9yGkbhSe%+u6R@B9e6;O{*HPodHcb!C&Ekb zXI@o+I9(-TUIvQ2!#%A3S?=Kf0c$M*c=jDaFaG9Dx9+-f)s1Z(a~=%~xX4;VfX5$^ zRhT6aD6K2&8u7>)fmrxq$fuSu3}=@NEEsh>kd1y@Z8MIUC2O5MxK~64i+-!GXBE{$)PUW4|y#fN7iFq1y^_NP-Nb%G;1@H2$TfN0staBOa0X^7&$SN)&4a|B3wbQel^!=^u+C( zf>HiXm%~T_=Jqh5sXm%&B$kX0?a33F1t#@7hYfib+S3+oco4H7UsXIwO_^ilttM#n z!IvBe3v+&w+-z;w<|f=57KWKP@#f2md%QSLryeVGzp(%kfV!5t<1OCv@3q$as$*M| zbFn>bmbzELP>s&!*F88+f{NP*x_1+2ua3(J9Hy+irW0Si{x9_+utYX1qQ-yW+*!i3 z{j*jYMRJo&We9s_ufBPpL3ZY#UPK9bk^Mp4o> z99}_bF={9eRK6gJa`@qip)#p1W2))(Q>bJGYYQS7u!fwmjlGDYFSwpy0h<=J}o^}yxRNZp$7lY8{b^)1|24q;)jSaH8B-E4x62|3D{t7xck{h`KGg^@m za*5VIbJb>~oQA98RKAQz2@TPxrJIyvTQm`H-K_XIzq=U=`|dn|5B#(!%H^|;Ul z!>d-1f$uq@^)`jO2>#D1>qEIeOMK=AYlLmC+AdR=2CT#D5buP!+p|arrp)1Dr{GuV z-Ozb$Af$>@i(@eoU)g1=v}gie(fABQp$X6=?=J-~yPH~jQrU=>o#Sa0=Ml{-a_PRb z=W;sqF&};a=CQTBFL4HKl|!>pY`kyX&vp2SuTS`RcV-`6^)~H)UW@2G!LRQdH#0;Z zCr!p6Z;EKZ)adZ|Tz+Yhmcl^J_IW&fJb{1@dI#6F911mmKMxib(WUHXQ*1Z0Wtq5J z{a)?|kDQc#dIa3*FL9mb3tOM)CeZHO6E+mF#8I@&IP3NFsobib;kjiQ8=@Xg-I{lb z)g@|b))#EpF-;d=s~MB~f!YQwzPN3bg5=xRmu+uCwKa^0D1D_@8eNF=z(NKL3~}o{ zEE9L2<&+ibRwC#W1gEh|k$HQI2^1`t?Z~+tC0B7cAYKW+DM;1aUjG8~%~y!E{v-kP zQ=~Tkd~Sp4l&r(UgGq>dF=&nun~PX1sDQIFfE?%RcSb(Wq`3aL?x1cxG1muDgPdd2 zPax&?!d4%EMA7&izLDKhHz8_CCM`>La0!=+vEl?b;VOViA3g)fai>%(v@7~Hd*)rF z_3uZrhja@R}d?-dyMW?KNCLHw3D z;;aKi55Tb0{p1GZ@W;6E1l(ilQ4g9MSndfI( z9N8hI7HDkk_PqPBVl6fB@82I|^zJ9svwID<(GOovZ6gjZBAdIuoW0(IX19fdvt!qW zS3Zab?BFh=Q)juHHlSP3|;5;CdnTPasF` zB8$0Eg?9VZwGtr72Ip}JEF^jAwiO`Jk6O6rj*Bgt1S)`_WIYX~ItemSLn%NI%Wp5D{GXlm0VHO8y{O z{#rD#IOKZfc=mP@lH;@R2sxS)y4BzY{F;dC2R$E{n+KX>3FCTb!&PI6;@#WPIS~if zjfAcZfO1<*ypE%5{ssBz%9|A}t%A<# zfYICe2RjY*h~fy!h>!r{UpZ?u20{jm6s+l*=Yu(H#p9)MDvGpl6jZyX=clwq0-u=t z3K9#}(Q|&zoW_jzh3HrN&|9Aj-@tyM%ODElmSql#^h6YBR-wIsiM{%J_*Z;5)AOa?&l3yQ1d;>C)k>2g z0fg<+T|AH6KjPz?PvzSj3Ina^Fl~oJ?7Dl?|BYue8h22Rp6CKD%(W#f&kN(y=kg8@-6buiBu@0SRi&{5QMh(&|kn7eJ{ ztEzHYrOm6^cLNvq8%GS4JjVEumi8j7BSZp;m-{0`0MoLR9Ar&+!nK~#m11GdvR8I( zHgjCx<8pO!pNgcDdAU2FSI5AXVlZtG`Oi7d9!8|@P}PU=xrqkhQDL?!_I;>4;HcfW zs7l6I$3PKB*Hv=HZDwxHl2Tx%<3y`xtfl{reLt&d+q~Elaos;%h-2jJBeb zB;@Vwc&fWB41Vp(jBMF&7#U1&vXU9Tee18$7ZV}({riyn$+U^%R=5pOvo6l89lp70 zSb0FsD>gy0QO0eS#0pf044c0wni=?D26B_^cUJJApBMO_J=I>tsub1+9^8H|T1 zAKkay$Sp_Es#h1Q{LEl?0>~>5UG*jt829Bel^FhiEkF<0ja0xdaDo|eFuo3PP!8J3 zLU+OE_y9iF$yp`3?Hd{|p!fcrmKRn^`wUk#dwmyLr|75lN9C1nZCeQhTuuem!xpx= z5vZ1?hf40U*N@?zqKwafhxF`s3{b78A@}|e911BwQ>;{JuW~{ib<&OEMI4*=Ku%s8Nd^R|^ z><>R4rPWjQL^0L7@xcqLtF;@q$_$BO8wB37{sQ7}qE8`8aZos;$SuglV#L2vPR|+S zgyOu|ggLpI&#=~o7k>)>bn1xHu9xe^g-KxRA@;r!7{o9k4W! zB2V0QPF`+{y^W29$0ox*p>v%u!^W{~UZUQe%XiknvHqxw0R_QQ1q24dhONZvhRnnK zf|8S2`$;o|9h5kI?URp)A)ttw%L;3k%FPKgW z^FA3+ZYyI~j@|l{vV(yjfLrc=cttd^|L7!UrZ2eJV##&q>>_0z38_1#k3Qf_;)&Q5 z^#%2g=J)SUG{s!~H}LaTheG5|Cbh|ca(Vp)#91>k$ylb4N^@IN81h1GNSjcBqR5uU zEZ11j&5+)fG3k_u75AW%NuRX*@x1{n+t0IuZi0AhEV{9Z2aj(+$ z_+!Ij3sxVakm%|CA0ONGm7Xm7%~|_72JtE1-0N9ing?`EQ4$baqCWg+PnYl=Xaow3 zMf5eRJmQIp%$~>Jn$;RMW(U zW=7>3N)z&31X<;4d`7Wl+{ z9;zN;mB-(~JPHyIUNro|uM4-v!K`}Yql5ouNJ-R6PeXi7)HSB~ZE-065X@!h zhDW#m{Ns+%1ElIe#O2RdDnuTM!jCVQuADZH0ia9<8Ssb|;T0wt-tG|5ObNw_Jm$tn zf)U~0KjApgwx+jQpOjTA&r~J2bnPt1>(+IMev7Oq+fxz#E`p*`|2MKCsz?3ksYXDl z&i;|>#IQYt708f{B7FQs1<>C`W@`hHJeWEd8x{LTRtmuX?@LciculsJL4QL+{J}M5&_S#R+;+ftuka2l2bNA|*JJJy~4{qVs^KZNhc|&?RlAoSVVP1Qr z0P4L;C=g`izrgE^`Vsn_Z`R_7KpJ*K79ERna$@3!<5ubD3)(GCinYAz?FC={3zATt z{rd=Gh_)Xw8l8|Shv`?2y17X{$9xs>+_mm?g=MC|vo*zkSid%cp8BK5IvQLNVi9si zabjK@)BO07{VWU$wh&CB^COxw$dEW~2udqiUk+_{vl(+bEmM^j~fc zNlFN;xN$_Hl0`m`n<-%Cdh8Rrfc1rIyHe#_)6H5v!AoTd}4^u02G@PU&i48@?ZINH-ox=zY*<>?5Aa zwY1Rv`s?$0kPKS(3*j79<>wolntm@R_-)Vn5U74lGK5^ikC}w?6Tig;Gl*_qgB5w~ z_0(Q6DBD)F98AhtIG!r06~qcP3PD;AS-8!sjk^iMR@h(GI~%u?1Q_)EIvD>WH7Ln4 zvwcAbJQ4_)v{|Q&r=MoWtIoSTE7(V$PR9?OC(-Pp)a=U;pf6Z;QX#tQj8J%3rN=Vm zcK1pU1V9CEYHjgnrEYp*LQpN_w(`w#7P-!XLk18=TANQ++V}tHl+YjfLe5dbz#4`Y zl)sFLN$D$P00+JAUh?t@dHt$IW4)Dg+q&9}t5Y(!Q?BUiM9c>OeK2^<8EV zby_{9GgsOe^CN(&pr5>Uw5{}wJoSf$&fp___nNAhR0#}_ff(RHUV#aG#d8tNPlp*I|DMnwnUzJb^^5T_7^u%N7kUa{d_ByxYBX{o)iUav_p~ z(Ur8AtQel`!9^>WBb%dA8c^KJ^|SB%5T3ST-8M9L2${!g_Ph&zWMTSBNKhojT7uAj2&w=z%i*Uf?T{}<*NyT4?Xj^ z-nq7#|BS-~21axhbGP`;mLAJy4Vj-DA%PKidR0}GW-l!~Y5yd}DbF&IoHCC|wyA4F zReh$LphQIwavwY7gI>yLpx5+1yh~ruT_4258yYD{X{8E4U$8Xc<~H&jB!aKsq3-Ug z;!d0d9Cu*JC{@PnJ7m^gX^q$qNT^$vHqNG71|i!8kQN>jjX}7>`o2p~HEMitGUiJj zb{)RwpeQd05>oWFFz-*OAfP1w0Yq`m8tD%+Z3?c<; z;r)<6qP8=$Rc4+q>hvRj>oCi;jL71iuG}QuR>@57WS^*Oyf{9i>DBDMj=rGp3w8;i z7pd$1(xb=(`26>%=Q-X$PYzgDjUE+XQjq^J-5XJvmAm@6>}?mP%x=0})V7%%gvdHNMFZ6l(!9w<1+FCID#*pn#c@#D zcCSgCU$?`2jol$RX)Dmaoj6Siz~gxXVbdl;V0CAw<^ZiLhMp3f4Z++WI_@~YLhTHu z+jdK`Pq)~Os>2DgH*Nl+sL|n2caX?ihInd~Yn@qdz%cG7IEL5gc9m*sZb!pYPOFJD zFk27?9^FcL@c{7z+(73&d;|l1UAIg$$({!5d_~N{o?Wb~do##_n1ZNIg|7+qqjn<_Gl_A|7$57+JFX&S5kBY*y-jPvo}Q2R2P<;dC0gR){HxBgDfy zg>4C(vRgFgqqzN8-1)iHewD`t!T8#0bF|=v-o`J4hFf72o4nOGMr-XJGhK;Pow=X3r|$L zs+$8)@2`E@l>Cv%9ftC{GI?WBiLL~f6*ud=ia$Z3mxkqyCgf;KUYx*O4lLZFw*2P9+j8Q zO9WH{S>j^EB5wTC_{*uz_sDH^TA?{dIm=UwtK0TK?0@<+Xv+loLS=YmkP@qB*Q$Ci zSPHho^s~P;(%?V01Y*{7n3)RP1BlBjw#p_?TiNRxQQ4<%G+4MF;3qk);K^n^fm!pU zV0g0JS#9arVDeQ9*jC)Uf6prc(!eRO&a)>*`~Z>Lp$uf{nORx$2t^H; z0Yd`;__Ms>AXovE;Bj`gHMj^`FMm;tkjikV&d+e2rEfyaVM0g_06xyj&i*rKgMJs< z3l_l=VAK5m9VBi>1TBI@0@P}SeM>3m4x4fx#wEn^XoXJaupPMWI$__%DFoUZ)ISXM zW_$-t2artM-0&5!duVohvLR$aIMCiG1w7dMtR+Sf$ucNR6xNqrlz&P0<&#}P8K zhIdZ&#tzpo_XZ>59xhSq_f`fv&JZZiAPI#I5S{#d-S;6y!=+z9XqB^qvP~Kr107VerBArATXtp0&>Y%`LxS@6e1@$QZ4WZ)8`4LVyNnm5CO3{pBsF&o=#xAgPp1_<+Pn|F zul^*ZAfYtR!8B5Xi_?GPD}p@v2Q~kvZ$<0J>-9O2W)B4AS5dibuu|T)Q{KkJ;5d8D z=Ye|lW%NL!&8#90=W84LWL*dN`25|n0u~YDHPhJAR1{%)wT;TZc9c^)ezE~F+{mZR z;I!SEUbLMnn0xZF-;*~ooC$IgZe&W3WEv?Hf7TN#!Ax&SXCUXh`|JJK{8XdCr~z9A z`@7Z5+eM5|pkDeA!CLmyT*5lYa{j?_972Bnqv{vtCSB^Br(G9kO>ScGO7!G;m2k?E z&M!>cV5&9a>6c6TxvS>XLk~~5n>t#SWacRHKAKDzuS{JT82na^y~CpH!ou$H!GrI=3`9)qH~;z z?;c~rDbJ=@>F?6wG|YKz}8XiQFZ(E zXaQFF7*l8M&%4(#Ajfc24EluG@t{DxWgJrF9B;E%Y>ExR9fd@FxnHwsD}cW~MXe{) z4x?^e!E>s9GfuQpodz;vs~>DdmCo1R@wY#-l?JbR_U*Mb@ekyc*$AHAq5DwlNB^t- zjvm=NzFoI4EZfVjvAKzl&9)4jd~xf0>k|Hw^WuB-C~tf)AWJXMhKpTpH7BjHUm$QousAJFq4Y~8LC=F`>wuuB zM!jqIqOSCA(fP;<_sOG+xeMYj2?{6B^6sAhVjW2aXOZ143y*l{TqAN?3g@FYV2}Er zy?Z~lIniB8mIp#cr3yO|k>?>}8H=D?irLp(=t!j;hsH06RdhzRALRry2*T({Kc(a& zP+<^c?E>Be>1vDNDFVAL1jAy$0zr6!7NFhaO9~_gG`#{TPG@mHI8#28*!l;DHBvgcv=dLAc+C$s+_||(Qs2B469rQI zPlDah&m%-DfZXKTJ1#)htKVwNibcSK*f^Be-kzBrFljldV+p+gGU=p2jy!-c3eS7mh#CotG-jREkjeU5!g>!3lb1xQBDIP-Cuh3HTMtH@9P;>F3>;S<) z2!!7CY}AMN=z)Hf2+voBvYCOSGlxyHO&oqwSGYgfXXcYq$2l!DFX*0Rcwe(Ha2?T`?765<3nsr z%M&Ymp|Fi8t*FSlpqgdvzr7Iz zA7W#96!vjXzD&0Pt#2cDDLMU8!tgr^{c3%;oRDJGrsLekRc$(UoFGEit0zp!6R*?OYw~!N3%u#$P@gD%m zJ?*ELy+wxok6IB$WsBai8H(~ayHUbTlu7%?0Yu;IhpwR$>=+*C)9y<=i#sz~(4`AN zpw&~U^p=bs&tSA<-+Gp!B&O zQhz`XzdiR8w*ty4DvFfM@b_=~4XrI{9v`H~kL8$TB(WY3+F#&DfS)tn`n1j?HJ`2! z)dId`V80+$0xBBr5{MP#<6b@}xmDv+uKCxavqElcWopFC#b2Sx4s{fPr?}MItkmzq z&a2rMdm=Osvw!s=-@6LqTV7n?`2$Q-0pYM`AI?vxp=xV z5s*M^k%y8W9z*;_$WVt3$~em*GfD(o^aD`!79B|V*Q#ZIkxif~TLsZJmEE=R2mco6 zWDP9-Y|puo+0!$!%`&U}h>?V{DzQtys(sX#b70F>bmg0b}F(Cn%*Lys~_ z0+IYdYY!Qj{tZOqQO^-OGb>xE9QWg5#qjdl+C+TwicjE%ZPi6vZV7gb$0qgY1`>ly z`5u?l4l_=aP`0mzaBn}O-z*c(74#l@SB|1mKA$c?pCUm2OtUNF9sPF!`t|^P-Zune zGDxWn^7TwQ8>q4AEoI>jsP>BXU69TrgcKkYq2{4}CliMq-)eUQ#%_(YKd)U zJ}n5ZL4MsAB^N>U4OA9%Cgf52oxmMEC>1=nDctb8Ax^Mu#v~)1`ICcC^{J&lR38QU+r@FegEEfO zhJyccT{;z}6?6N(q@d`!=yI$%wE_Y< z*t-SjjI-fmP5&ke&)1%zuEbV`XNici6EeIQcFo@Y!Zf66RZo)Ej3jBN?@Jhngc2hQ z;{xh2OTi^?jnH-4{RZoXEy==yq?TYcMK$Tv)^Crj7@pu2E}!ET`EHSI<8J1S;o|1( z<{^5Z5u%X~iKWn*ry1fJH$FcO%=e$c%yaFyCT zGJrH2IZIAY>fJ*o8s;E~?JrcH%(!k!l2VhZIbZxxW4mTjqqFj=W{1vFX`a11_1Bj> zi0QEW*JpikETTb&e~|xMN4*Y?N?17aTy-j16NMfHOQ7)TrvI8jNolFM?$-UVZ*hdM z{8&{XR)Ap);Oi-MclK+VQ_5n};#2pCa`WA5 zZ`aGjGY~SX${wl7Grv5ZUS`mqKgTbcH#CZtc-pm1Fk}b1x7EBpC(1>_nWI{9-ydGz z_P!C|@Pvqd61~m#*1FP$(?YMVQ5Dak-*{cm)RrdWIH?o))8iKs*xUPCJN~w!8N(A| zwYf>cs%dx=Y?EJ&i`e>&w^$q=jicamen7)hxo6&EhQ=$7hP|Iw=63fy(PFmD5_9F;P@XH!C7vkm#Jy<7EI~*_+$(w&$wA@Rol++9n>_Js`>ZDX?B34b z8FCumar!FaHl&c%iUzB!#24p&6$BaL>pF>Ugd2n#S;fQs24>==;sv$?X@{}2kDt6| zY*rym{2n#+C*}3nUyK{}({-=S(3whtwvH9B@AV0v3#Y%A9G`C!e~XJ7w1X!-zxBE1 zGNzo0hGq%6N|(Bs`&zbU%8_3B3X&jZd?Ln2h=?GqCfJ~Xo{&>nS=p<$WIE}-!(D9w zKTE|&$M!vC21%Vx0Wn1yg0JR-l9*%rIlV5HMqENll_z86*#b*LN~cC_@iR`P@#e4| z3SI|x%DAiUt6puK)AMhiGQwBksn`24eHPKh%FR{Bl---HzHK(r&AfWX3+MvclP^Ee zKmS7{BHoXByNFkEAa*CIFCNcgKWT?oP|WW#_1sE!?zz-%vVc>ntH4MhGYBT)Z15}$ zYkF#eoJv$Ds6?YIC3bP8_LEy~hTpdD(l*Wh{`GdFptT>QNHo64UE0NouauDEhYMek zzs(r%pIxAQfdnEoOj(_u`Lrb3tT`NZltk07eZIa5`TF{k%11?U`9Wv99eetRE*Vnd zlo=r$c0XS)m$m9By^xNQ!}}>wy0iDXXO%VQYyAWA9Lv+SX3p)DMGn@3_c=axIQi}; zGIDaw;1TNtKxWu;f95`($UwR(Kd^aj)R-W8?OpB3@a#deyHgVxVWkj4lGvjkF{^4tX8JYg8*JD+krGxjK(K2$^zN(j@-u5ETBfnrj zsIOUe2{adH*G<#q{N?e0@>Dv7qjJ?7Yu&v84&yTKtP9J;(+ZnaLAQ#G7ZAlZ%#?K(U>GvBz|2a4LI zSLC8-Qdwj=f496l4%`-Ts!`kg{sd~iKc;p$wt0Gp!%eWEw611c_I})Gwqh{fn33kK z=5-yPV^KX#eu+KPpfduvov~S94X!IgFZO}bV zU-J+#s@WR)!+E{ujX1g%%(KkNZ8pS)b%uOox@2)PoQaW_lpYx~L5P565$MsCIrd^Z zx85N?mVstd6+TrrE}It*Ybeqm;;~#8)_Y#B5SK&MqE-l$a#eY9V7LLoCdhLaK**x~ z_i+7oSrWYHA>cZIn(v_XvihF0%k3W!Wd0UyoOPaIg_^krflohTci7*TuGn5EXAC5H z2-Vly=hjA-GtaCXb&nbsu*TBjxX)cTYA|P-2J52koXsq{?VRV>=Ls`D5f&0*q~i+t zW5fz!^cA@g+KV7@s|D+tzTZtf78^3oWs|L1CT0)I?Bkm)Q&KTy1y8Z~6QiZRn)R?K z;jb0g$L6!s@C9k_X`_Uq8!EZtF7H`)K3>+j`lKZ$CdxL!UNlpebaZ?)#Pva0SM#-3 z?oIUpt2H#AHeY5^HqUG&EV2bM$Jui}dcAr9Suyw3t@GcV5ohMgnEib4O=Bhd*P->G3}VF#C!y+$PB0@HD(DRcHV0vi;V%ERSLaDW88$li65)X7is=O^*!$cm#7rX zrJ8_)-F3dJvONp#_oa0|@q8LVmEZ_dmN>Uc204z$-uKPwcST!4ZK7R1c{bkX-U7#e^(06&u`eQ5sRPgnRUuZrK7c7iS z>6wgYz0#?|k6CHTIJ4X^KUf-2JGCV?@0nh;4_#?Yb1EDE`>kt0C^*dr{u4RH`MO?i zx8Vk@$vEHGT}yh8&~@Ic#M*lx7D0ZS>ATbzGZ-Mi;+35eu&UtqKS%xb?uBGD6YOlK zlK#u~;NTP*<+5L^YxQ{7%RWW;-C~wwL#ii}FN8mYO)L|}*a)3tx$&LsIVQlghp14# zzkV<}H1_z|et&9aZd+9={PvB16@eq zcG&;#%YICI%(SdgNx?YK!eTk^#{ zdR%5sDyl9&q&rAl&wML1+aV7eq3c>H>RXi=4SX$O>u`or1s2qD?+q8U~5%Fl>E(g!;&&@_EDr2)=5 z2=N)50CsTTLHw%45N`9|l**tUz(K1IlVFYXFg^7>C3<-%Q@fAL^?)vedi7%G;;9u? zFG5>QyTQt5dVIW_o;>8+3~avgT1F{yWf73 zIVHFqL$K4JFVgGH|6}W`qpDn=@38?9loBK*1nH125hX+rknTphyA%)F#c% zq@=sy(B1u;b3gU{Y#ydmIDQ zafYVsC5Nhtyh_o2OKSuhkol5IiCqGZK6Ls@e+*LcR&QoZg|fg$Lo+Iw_Acbrm2#O>u#EsZ>f!=!7)Ud3d2N5x!Q?UGJ@eT0mj^p69JD6m4br8R{~bA%uG5kIu@J} zTe^Aunu)0?(#RP$A0b)AE(azQp{P+&QN&jD*S>;BR}+>{ELi zghy~P!u}8uT5c;(=?#pp@z6QpDwS$gNYbbh5g>0-EL{Hj&_v3Lq8(`{hBQhAgpURB zs~+06=Sw=}Zwf!TMRV`ZBa9{_>#!Oe(UAl0aB1Ezw%t5_nVGc;wn)Y@cv#MVyhA#3 zJRdxbFcsMUE23^csDOerapOOp@pc1upz=wJAfZdA+zP~_YE5P^9$!EXKVhhjT$X|y z%0Mc)tDK`~QN1H7&AUQ{vbwtZ53N>8>K+87-blUk5Bqw?r_Qpove>7W5T-5*p<)Dl4h*nb2bqqMyIbJPmgd_i7S2Ox ztf;qteY~`j&_nYsgVZ-uKS{OlZ+1ocYy8Ud3l|@B*W8O*-mei!Ys>AIz0yLCDYn#k zhP8h@*{(#MV_JzH--jw%NA5j#*y9J`x;MX}pz-KvULp=GOP`LMyPVpT^#wjL9#?N2 z8pAX5xQIF8!MMW-A8>KsK6rEG$bSfU9*M4x6RL!k?jAiH;5I=?|EgePb*%lwhsH`~ zfxK{F0OfZGaZ-zH)1%f$Cb1mZ4%vn|?u^zvLCyIx5AwA2%@$JM*(DRi)1qX=G2Sb^ zy}EG_(>R`YV}jF^h?f`Tq}}ZgP6j8j2(}0TKAGsNY~8Hy<$RPsZz|8JHkK?7hlOC% z`T}QG-z4hhw+|H;T`5^EJ)1l+M5-3Y((YOI8b;tJiWHdw)K%oLp$ahzyYEnr-2?$k z1_pa-dHD}7uj^o*)ZW%cPD$zA+4*MOp{nB7xM9((759e$S;2Pw%;uN0xD@ySvqxtu z8yg%wK(c#pVv>}S@(DP3UJc|Zq`|EiQLw7TsB*1o3j zwFKgA^P~O!?Jdu%7%(V+qxgf@o=yk|+E%<}=ad;`Ws!P8Jhuay8;ug&OGW%pF5xHj z5S>vFfC9vB+YLy6^7B=tx}>BeFQifqHY?==ciT>5$?GoD%vbjApTG}KxL7yJ)~Jer z%YopPERt>#1)kjC+@{;?kJlN?6YhC+HobsA?81541D(K+@5RU!4IL4TBE$B%b(bzJ z!DKyf3Xptp=jB8{~{vxWC*x0nW`xXTbAW zEKhCV#;KWEicKv+!&g?BiWKvG!8t1pHa0is$a3}rGczdJ?&L%t<(_M?oD~H>{ra@c zCA-JHQeUhDk)(Q8T=lMm>RzoN^Yao!crkuxG2&zTFkb(JT zqG5^Yi`PGnXclf>B-RG2%k3UwP8PHt`rf0xhF^id^XcsF z<a8 zlCs*(yOzBn=m2z&_tB!();pNDs(f{5bnjN3Ik8pGG-zhI-iTmOjxHD8nRq!*KfS?yZ$G?Y_~_j1+6%4NTSh? zkLHyIA3Lm~uH{1X4#ZvHKiO#S!>gc=qgR0}N^wL{$)JIv|DF(HJu?|HDpd+qWillp zw)CU~^wS?z$-O4sKRhumRvCX^Q2JNjJZW?&w$jWrX-e^JRtesX8))s>^(0{gjXH@< zohB2zFL^L0d-K*zN;!&J3Va8H2D5Flb)!rPCnGG@edC~?dV~IEF1n3loov)I>-$3M z&EQ$drAWjPIq1k|(Iy6+hMA1@s3owesj0tx`)0Psy5mG#Hyu2^1*EticxA906T^c9 z)9<7zYPIX+3;a#)pNS}(&&L0iH_-F;srJj=|%erABL&Hp(MeqhYo3JRcAha^8on)>%4~vf{1*Ofq z@gINwyao4iT&buKWMM(26D~qm6rs%ak(GUSjb0+@^)rPXx>w?VU>BGf9 zoW6+JjYHM@&rSTR#rA$|pjKBt%!<$Suw7v?^9}5Kxsn=jqmtRaF0^twQ*CEeb3)<+ znXTTM`S~*&AHw?7JCCl}Df2q0ak~cRn$B4ee=zNvlb%oqId_ z61pO{l8j{@2%@QE8_Sou4edI$0l=ixr9AbS1|F+ko=$}+54}45kENJaJ?G%49ug7~ zDf?_*g+U?`p5?j(G(H-p=C1nE(XlrHIn5ZBYT1m%Dr23iYE?REEVAO(g+B^k68hc2 zG7{JQOgJ-ka5-HN@huG5nFZPg5+ZUPvY({i3=N@`{3c71WhlCYf%%!Z-lO-z;eA?@ zY{M_7pEK8RMTCWCQxP%TRZHt0T36lq;~NW0OW_I3mt^1(am<9Q1F913($C&s{wh{g zdzWa@`nLV;reNK+xVZX={o}y`6AzU`$y7z@#i>(Q!iO8vIu>5}MKFui{+rofSX6|( zjbY$p1T8YMrKYgRL}N>3)X#v*gG=oRh_Pfpe}^^Eo&Rn%~-RCdFP z#x^jRuZKo}2h6CPA*J3fSz`>#}p>?a7~R|BlOY9fo48pCBbvj9I1eTSC~)XEpH?}zLC zPT^*KYN%M8+BBF>%rTA$(D3bS9qO;XqHqP5yj>Vd_Ex%et1JTj^<*VcfKEe7mDQ>= zyW1pxYzZOfo=28NbJ|({N~t`Sa+luJR-XpqL(-O{tSd@e?`tcnyQdRrujzV>gnGPh zVd)NUsE>M3KeW^QFnJ$z)_oSnMj5V812h7kL{sVyDraqlgsrUJue|0ukEKN%}Vy53g=Bw5xP5B~6r;GOnU7CU`O0qWkt#Q(~ zxtFYLRh!ejdB+*n$)~(|*4a9Nw)dcTke6uA9nbg*RAx?poC_K`lB_9RvESY4{tBU4 zh_EaKTa^x{$ehUO$s}^O{0%8&sY%q^i<|>os&5-bXG^^~e2e&VNdHvo8|GnOsWEhz zwkAtfdMkl%@_ux84n;xu&1y4Cj`%I6^E_Y0I&V1l6bqwzA|2ZXXv@m#>fB0 zipSa685wRkZ}~%YntWN!Mp!t_M(UvoYyfPidUE(pnes^Wy%*8Vx{1YhtTe|n6xVdJ0`E<|;ndeJr0D2UQV|@BQ+#2QnZ!?0d)+WUTJWt>&*o>#+gXZD zCcasilRCaxDysOLlfL~{(RjIvP5$p}q4<@w)oBPrH;jBonzNkB}eFvLs$+Md83 zAsM02NXIpD8X7;O9u-P777#o@&*DA4ff&&XHh>}v*{)9j)%|?>>LP*Xv5W1j)emrC zw}xCK2Sr(oWoi87zxN%PziKgji#KQK`}EzHdPJ#T#p0k|8UaPEUd z?LoE?aF?n417M2RV(4_a5-OrSYEuscNdT;5WU~U$QLO7` z1vfD!z+k`se5bFN^QSKz(X_Wez^v)X$yosfNUKHJ9@M1oGzG1io;VJ;^|&$ke!6p) z^raXLg&0a_rh@oA=j)yR!&`JDsn;`J%QvAr(fZ@DvEA3RvkdF4k;tqfI%#O3E!6qD zX_wE*9vt0i#%YM#H^=lMd{LgZ>iY+K(*~1D6V6F?#gSUO@+`@W8O87Nq@A82$nQ9P zMwVaoh_)Gx6$4dnFc31?N#n(>fXM)rMP*n4550rV)$-+e^~TcIz#s!?vp*dE2FYlP zSj*8#RQR{BjB9E^_Q;FwmpdhJ0n!?VKG0>fwc%3x|I=qzd-c71YVd{aPnZENjsMYT zd~IejcwQwnkG+5aql2mIs=o0S&P=MK*|iaSzE38PE85l3!#@$@@%hi`Thnz);mU?F ztQ^&rjYB>8Y~)dT(Xgyh7W*Btq0!a%Wu-SVNHhU=@}=?x5MZW!#`;@p2LP@2lud(S z8Zv!J4&DSh!AQV};N^;*@3&+9i%t`evd>789X3Ha0u2AqyR^Kar#*5>75J zo7K$J8}zPurbA{2&>gbjE)42$$a>8s5yriq--P_tIsQZ{`gcy*)E^DU$!4hdkK5mR zH0t<~h=OfeO-&7ha{h-D$w)TSAqF!}BG^+!g8T*33QE{)Kp#eB{qNOyR=_h16Q@!x z)JH=>^6X*Du5kY|!K-uIz0#-eQnx`y`F(xe?8)2sH?+8oEEq*LBTJGBEIA;;2E^dW zn;-SC>+st0@-jJ>V}Jd3yBP0CO_wjoJy_Kzh!{h0HyDXnfr`(j8BfXT>f-1h9T;fA zuFvc^A#FO#Dr(1N1$)8f{Uzl6rY*w8q8D+k@bjw9k&-b*dO;L#fx{?(8wC zq~OrlL5Eh>a8Z$0W|F^pa_oYS3TG}VUp08)FezNgxBIby z9i7uF0i)x;3|4iz=7=$RZH{o{+T^@QAO)#l>;QNz>8ManFBc=U&S$I^A!K346TO>#i=5;E(Jtxx`kkGDrCA9&2aSK!+}^NSz$KJIZXO)T_~{ z!sYizc~P5rNsVA+p2+%D#4IM`ZxYoH9HT+GEoS3ZI zK#^4%Efo>{Dk5Ugh-EtWe&oEJO679C-Cy&S)c!sRh+r6`ZbUd#GEUm5RT>wWshF$% z#1Dz-OrceI86PbsT=>C_BLQl+Pwg*k1}CoF6&88@nMv}YMntasvDr%U5(l;BeF}}sHh*kIZ=LSt*^7W0ze-QC+nD%5$ zPCsCRjEt#-va48#NtoPwMCQs=V z@O#6ElZR-|a(%ZHqj6}Q@z@L6f8LxpyQdlTMg3zEWxEIF5lofen0T{E3{9h+j10ND{N9f)SaeS%+UDZgpsMR3z@-28Kg?iz@-ylz_`m^fOLI~X4dI(i}pKqmuxPwfwRV=KdNP~NeTIVOMd@(Ifm zwp1-Yu?2OO+dkt2Q-$BQ$U`=hAm}rZMa={Acx-UuOW+OC5 zrWWdz0r0)Uetyf%Y+td*$oswzVA|lwkF$6>l!mQ0F-? z4DT6mZ6_{?SeRFQXLs!;UZ+Mo`+-$WW@Wq5CEuFqoWA)uw$c`SR3vFlu%>2coNkcK zp?UZx`F-Z2+cApu5!%C@JJj*6`90Z(Q}NcybM|7Q=%sF<{irsxQRMq#j@^$(Hw5=R z+H{X}!2km;lyEO3X9r`xY5vuZs&HMKP7Ld+?-nkMHHLVr2!)K5ao6utg6?LI@thFU zdr02HUpDyiVk>c~ELu&JWo0@a>q|VX=+ZujNibJ|J%sv>_Sgjhq`*{M8Lz%lPM4!;r(O;6xC(R$b&u_KA#q4~ktuvh}$s3Fi z_@lLV^#{wvv)(e=lk#*1tt$3o1CI0C?KCf;4ci31b{XqW4`*Syov1cxg#I1YCGm4Y zn)x37Pd+(j`H|&nPIO044Ig$RO2@*>oqOFB126USBL|pW7zErlFJrGNu3E*Wf}u(a zPcgKHSq|o1vX{m)z9Ovyw^n zp42Km57Ww)4(mT)FwLAMT{m#2iB2wPDQL;=*4R)F)EEEyHSk%MZPu^Bw)M%uaF|wU z9pcDb=d)iev`g$S%N(*8*)bN}4Rc<|a6W#fmGBO384I@IYDhYp2U=Rf_YdFvcjCFs zEX(u9mZxV&c~ejM9(|;vdbjiB(#G!7X4j;AVnp{GACh*!v|0TlYdjYpkE-#*`+N@M z-Rib_@vZ%`z0)L)ny$^q1Mqi#3e&I|V9K>yy8ghp8qX%#+0|w?_p?{4Jo$U} z7-$>XP`y3iX$<*&9}|nTdp5C&2cnRa=O!baSl8ddyyLR+>XPxk$a|-k64Z~QW=(w~ zdY8^)BH2scunk}o7Bj#)V^3j|t~LO`w>ryXfu{MUJFXIqf^$HdIZs^1f_s=J?TnadwfZwZhh=^w^?KsD zf5MV&{L)HnS^)vRVQIJi>n&XC-z^T}qSv)%ZWLB({>D-LVA7RBV~Z{@Dny~fOt!wb z!M5T*xu%x81eYTUtyxqcU-b|B?>(5itEHAT?gGelE$|mII5NU1=XqvFi_8+ZS#glGq6a^b}Cos#^MAP-}C6+sUt@{<3}8&@Qqj$GYF~yk(_v#l&xFtk77pF0W1g4d5^>jU$nAOD#|@W&ekX%wA%lbt1q2qF%rf}cKMMdt$kF1G`0x~(B#cR z%P`UFbmt_KTV9iZ0HEM3l{{pwc&19kLuZF;bP(H|JVUi3R+E2=B<>{sq&oJ14N1Rz z*R?R08xS=nU?0qn;qFM0IFIJ`#^ETy$(t-ZAHV;*>ooxtqeObw!`^?;e}Pv=R_1FZ z>SNBv31_d@EME>$4q#pE%`jN7S0?XOoY^8y5Idl|jnJIvg1ri99cxtTJ z;!*V4VQ+0ZJ7n_zOvrnNG7UE>-Kz$RF`GV0m8H1!np7k;e+N6?`3@;x#mvPWH@& zkAJ!+idw|UfGl73KL89 z%DaA>$C_GL$fke$fAl}GeYzU{*eez!c}=0(A9<2PwjX=fWY@?kW3pFSaoQFxv7|Vn z*O^>?N0s)uHf&+O1cbb(7>-C6H34WNfh}Skc14Bxm6+BgW0Mm4N4J@a55U_q%rJeb z*i<?d`yV)rBG2*QMAFt3AC6ky-J#qg~^F$VcC{goh@Y?8$gJ z;z*P(=YNdp!(_jd3!bYU@`lBYNL!DileznK*I0VEf~UWq2QhF2xIWs_k+&PrW|kPa zLrB12&5SH{tJmBk4b|9hwOLW9oz z#0mpg&qnHY#E>ZDgCJ+z{7w$L`dhCYquVns_6%=~2zKPpc|$3ne}MD21tzlFh!zn;^z#)GI?rn4c7tTUj1Ww@KH1!2Ck6>Gs7B6ze+iYo$TT4xC7 zWNLj*%B49MmQ~l89arJwqTeMxT&hyyndUN|+oCg`8?_T)= z|IKtG5s;WB-q~Tn*gn<%?L2fBFAe^nm=={{iO)hvxu{t zdLkb&6}J@J&eAb3(`UeG!r^)5Myp4uSMX@4K{GYq8$503Ta_608T3E8UISzqRv7?v zX5}{H6m*xkb);=XgL8pZfS>L$btk%%f?U@O7x|s%UO#XtAJhC5CsD-8_(d!~ASkT& zT;f6+KU|M0`FF%e1lRSBF7vF@y_mcLKJG-kO-=MW_DyQd_?x79Mk)~o0pxrnAr^a; zn|gcdhcUx7l@HrPPSqnr&u$h0tIf+xp=|D%9G?q?jSqBEX~TUT(5SYyjfnHBt{&Zq z+#E}abX4e4IcAqmu9^9>b$IIpA7&a;-A*yX>{@^})&sPSWP2m4*pT1xgNPU4!8}s* z-`aRK20$VfIOGs+x^h<7T%{AVzA5)8NaE6L6A(Qoo~d-2%_M=2Ec}9QP$8hgJW+W@ zrT+TSb$l26J~Q){3_e15Q7|-w@hIC9Hs60L2|BkNr4@rurnl&0Gy3I*<)BFcy0FL# zKO_?h^B&o2i6kh6E5)G0+Q4iY!zUcY;H%@i0VT%nIBCNJ4Jq<@?y@@sNC4S<<6?&>7h^y#=X}FdSGm%!TeJHN?-aQ;kAO9 zRh=k=Ok?f;NaV&I%{`PS!P{RQ$YXW!w* z%6K3AcwO<4**yj;W^I^Z(Z|w{yr2FYBn=R|b+7f;FJE=^&8UDMxEp@rT{BUmS(Xw5 z>RK%II8UI`cPf^wPtgi5liKLH z(gT_66Ixbvqs*6FU3Cq)g}i?~?)ri>fPQNzgz>i>63$%AF4ki~&G4_!{_?BP*k*I9ph=ufJ&%X{N!L(g30Ja`!1Hg2J1|!Ag=-k|<{g8DtsZH4W9Vn|IdwG~|EN6FeYl*dDPG{S7RpEGnfg zk_AU{3@Vl2P-vu_H#|kcYl`tMW2ds8=HJa!d|3W)8}Ly4AJihAn z1DCFFhJZT8Q}2H_Gmeh;($BXuQSl#YYG$4Z zX#Y0mE+8zG%KKGO%4|G8w%m)Xy4CLO0}sjiYZ7g6-ZXSZut!(R`1# z?tAO_2q?ysbYal1nIFWwc%vqgu(bl>7eGA$r@Un%yjmD7mKrUQdUznwMJ3WPvJzrU z{%VmHfOhC%06Ei4i6l+&V={f16QKy09Fo{mRva@ueQlz$>g{sPNd~Pf6(--qH$(b- zw{kowijM3la&Nq6swkO0-C?q0Uf8K_J?Y#d6uT8XH&$v20xXZT;X*3DbWMBWH9sMV z-vXCvWYdP`^Is-toT%6E)Fk=Q1P1z3TU^z4O!yEsXEDdvA>ud zT)=B*V`FRU>Z0c3i-92xP~h7B{Gp(y@2HNAj1&_UZIO1bIimjebw2qq;-8V}O0iv^ z-b&(s0OO<7j@MiyLzs=b5klNG(PeK(j=RYFaw>LK1pldK>r<+>-)kuqJ?i!#&@MCr z`BIY2H$dEe-h`{0LeA$iw#2Pjn~?{6=}_${t<+;+cuXuT@EJHT%|M&2E4B-t#ZadXUy%_>h>z>hYQQXh1{duXRcu4;nn`W;@TgDD>zS6&7Z81BBK zk>oQUDjn#-Nx7rZcgEjiqTD_pC!8nZnCyX1Ae~)_mw;&cr`!UsDm1iq@r~v2SdB70 zE>3r{akn(pF@#77q&J^fa=KR_vI7Y1bL?q6(f6cd#*D2T>!(vo9Qyju_QU6dG0j3| z#lI#sNU_jQe3=jia<#6_9_E~UEGyBvr1TYw*xtNlSoCsu-oZ*WUM93d1o*1JmMeeg z(M`CzxVha}gp9Ay{Cu%4G}nq+x#UU=(Mu>b$1IK~bXH~{(4xWx`~XqDTg9}{8PC3B zT)S1`4xOb3$QodlrmCi9Y-;)osJIak_^>Sv>2Y0A5#{98-(&DfwynFH)4OATabiLp z=m%%=WvTR9{R#!H6jJ@2tMitMlxZScz_)_kdYv7UlatG*snb<30e^c;hWEF9>v0&45Vs&M%}?S?zs+Mdg(7%K9Ghe=zJPVqFp%Lxt^9 zh_GLXkQ{^XL<@B5=ES8NmV0z7Fl`WsARS}efKn3ZdNGkz3>whrxW~t&7|N!nVx}>@ z#+CiSkW8-f9EJ!m#c(zu^-sj;;~RGcGG_3iK+C*yFjCz!&3O^As(gUFD{sq#>DRCQ zWIEkCOxgay0%ZFxO)?68&o>uPta+r>{bRltOyf_y0Hz>9x^e#jS%^ufUcdQ2nmKRi zRvp+@N!KeUF=G0c2u*yQHSRl*c&~3(;FflZmMr|0-z92{7jamQG9ThZ7rb zASU9DAS7WYct|qLOm8cy$WndiHY8v7s!y@H`C_F41q+}5vqqV%#4xq`UuWTjI3~Cw zGc)@J23~?4FHr82VZK&b$-BC?hNSv>i>LKVSX;A#<+%HcHu&Dz+q$~(`Q+*XbqEaG z#;2xgU%j6i8WIIkYk@L`cu6=d1A{&=MG(fze-pvA?46vPSJHZoCzk)e=T;8+GDQeV|ebUlaYd!D8ePDF;SfhPQc|rAe#pIHW z{rF&#UmQo52+-Ve0?6H3CO&m(b12Fay2@}N=#LX4DSU7 z1{zL}0l$#_IRi7Z5qu-y^(w2Z{JDoF^Wu)2r6qGtPR_Gu&whM#J%zF0tq;J_0n+ya zN>LWw-|#*%kygje&CTL{@zWNs|1ImOVuUvhq~vUSFbdQhrm2@AOHIf_yu+WyZNZ}n zc=`r68ZQc8Z|&m!C-)ep6uRn|oG#$D8JBV%jq3b0G#8;MaTIvl#V(`=lU2ALcRT1KVt7dil>YPn3us@aiJ#cQ5kwCv2`-Y3V0e%VBY;ebd;xsUD&* zs&fJmQM1z}6gpCzMw}l*0)g{4TJ<=xtMnNKulWD08SV_0rx0k7#ihKa!$JtP0S;~@ zzfEglQ4uxwJ3^rb{@_VF4WkXPHU*34@AOJ?@7{@+n=``Ypc3(vkP2~7+!BD|atad!9c6b^>_CelAQf48)EYodMw5pc?9X`s`pOz=A?X3;PH@zG3 zi0)fFy4Hg%?U(!~veFvx)AlRKf-`vaaKj=Xz-DqERj!H_cQsFVYh5|Q&VMGs7q{&r0 zQ9mkRw6)6tjjAiq4zz*U&!AS?iD5?>iVDuyu;o4Pt%4D3{FhGSZnU(-#q>iuF(Q>c z0|WVnU5^y=G|fHmVb@<%x%E6!ivnD3N*WrY{K#sJe{RYG%THC%#6)&8gKqM>^OS}8 z9U#_rX0~N2e|L^g{L&uTxJjAplU_0`x0Y^@BT&Mg^sg#i{NR`bhotGpGJ&X=82b}m zUt;^C%a3(g;N+RW7qCUe)LK!wVd62cN6Bg>1^5tI*`ES`r6SEmsp-0v0-vaX6~w^b zw_sPa`2ka;YvowThVQC9T6U|jt>&|7M=rHm2jb)D9Rh4JHtjX|-)9c?_w%i0Um$uC zdO(Tu{{8#s5e6`dM?TZpR-F*?7aks-t9nW5-#X5`IZZGRrB}?>Zt}ec)^H(LJyUV5 zuN1a|$vnGS@|h`6Kc_SJqn0O?Cxs!rqE#L8A~K>7E;WjViU>KT>D;K%r0*#yj7;hs z1L_hJ&*g2dsmr{){~*MGK>N1g$wfnO1;yv`{PcvSd23QO+wRysL8FkUo-;SWt+)ND zH}Bl(&v-|}YrpDK<9-p{`kcz~R-z(*Mf)VS1ey_Jw@vph@e;%9NZcY^6m>~;DKwU8 z3a#prDeg$_Ve8*s+cSlWqv~>+b6(B2`nv*54TnGUO&=A$w0y3E^6}Njw;FkS*Nv}f zaeFrO1PRTj9L#MHS>njwmmk(agG60I`!=Fgv#Q3-X5^*UtLwScxfpFE^~*6D%PuQ8 zo&N8{P0vXy4!unnpDe{_=|q;rF!M<-#y#1(pN(l~yxND3^AO!@`?%kvE-Rc@;C9uwQJXu)dH@r8fzApmTXV=jiuxHCG6~; zSzBA96q}8P&CF=SPokltzer4vDts|W9aiNfLmwZzkgJ)rJp5AjnTs*<3OrcZUk|p6Dr2 zQfe(Zzwon1_aNV_j~4lT{){?c!m+uziG15Bk`Lh_o2iT%DItTmfgFg@lXSnqAS*pR3{|bny_DOgw9(~)-^NOusO1`FutG@gdCTd5w{8C2v zzVIz!3TsN#vUVALtBF-^Rz+6gGG6IS6}s2I!s;8Jd!c(RhfaGBy~;^A_BHrskK3Uh z5t{wRQ2$Uobu!ksM0h_8a2Y4;_sNeg3r_+x9ICi=ZEsSFR%TT73grp8%e!Y1*XV{n z{CIZY{H-lc!lKk4yC^!YjX|B&|AeuJjsD_Zi(z0+uO6D03?DqU>*2c2)>I8Kp94mm zv{-8p3EI7T)bKz?My$H>>CRjh6WUjo7wh9?!6PHeot>S_Lpd=|d$Z(+q?brTVRWy$ z<3#Ov5BmlU<6CSUqK0cRH`KYRq(wADcrzr!E8@_3XJyxAO?OZm=Qn-le4q9b>5+&; zQ`|F(W3Q2~S7|iO2(R zl%Xuw`CyIm-1vy*LFt3{)T+D>?F^q!p}bH?99hkpX7A3Xx)+>m+-A?CZdw}lqND!N zmlHo

49rU={484)S@#BOYHkNHmWhf6P%UD};T~#j1=NRSt_$M)8SCd71~gn3>yl z?cLpo`j0o(r|S~Z(`gwP843BFSU{0m-{u$!(bMY4{ zrHFvCp%@6jeZ_;8y0)t?TL!eKC5vzlE(%PyJ zth#z9m~MBcO2vqai`Vz}ha-y(r)_OwV&YX^e&KX-disEAkF&t-ZL3_3Dp751a!Rov z{l7nj+ZKasFDU;x*{hZ|T!ReXuXxWR%@4=h&v zpgL!@77n-8UHp+Q8S31R8%4TGyW7b#v9tDK_;^SjF87^Ghi3 z&}g!Eo7+Vzvg|a}+-E{(91q((9HRWJ1WzmnPYmn4kz&{iP(*D_Cjc?Ozt;V%5>x7a zX7l@J*f=;%@B^b&j?B{1($$A!rWho=`=Qc}PyY3=N;XQ&y+u6^WNO5vRuiY(_w4Tx zMzepLUTo0dApiga^M$UO|R zBzj>IPEC;Pm^bRmY#`t;UAcqLJncf5a95<=mf*SX-dZq=uJC;mf9W(m&{Meq3vyv` zap!!mhu!1cNmfkBDSNWq+S{`3A_9c>b*WTa+p|rfugNZbQ^hyYU*x2d{c~rH6PNC2 zG;N8$OYVI)89qDOw34y;bX5!eg@A7T^RM<8Y9ytF(+)z1F0L*5fjW?Z7%(`5vYgB- z1=>y1%H}_+JPc*MxTzDa98E0o_k55kvp@gWesUb5-ps1in zElJu0gITkq?Tn7J3Hb^A_uVor27$jMti%1r;5~3Ki^Mlz-SgCjXjCT3j&iZ3>sjRY z`{q~Iq?VxHUUWP;>&VGDA|Ax=2S>WvZjE{juQY4zFU)e{2`UQJgVe~Dm}Ba=-`n2* z{^pZw0bj$a_KRJS<x;p8O2wS}@t;SY8}VAUFOsFB(z7q^Eew z0Qr|gVEWYTPA-?q^IUi3doLMK8-M*AG(pBI@{uktFOkGo*!DbZuk0nG7Zx6V0_zvK z-A|vvdS{)nVq+}zOyPenn*j|Qu6Ob6Ni6}#9SG)A#DT$3m&!9Hi}Rm}s2t=R9N*zg zmzs~a_}(M3vbD`x3o+5K&u!@Uh=U{NHofiYVRlTJtzG{-CW&+Z z&(^EYbjg}Sj$HJ$(na)ny5FM12hNG?{4>RD30QYO?LBncIOkyRH)0bstu~GuNN?UU z6AO!Rm##Gzm-1smZM*@pF@30Msh&Jx1MjPrAd)k2-^{x&+>KZWP_eLFqtwOMs;( zaB+ivE#LLX0+y@4e);lch55JF)ImW(#g^0YNb`=jJ*RO4YUNhQ%@x;kR7*044jnbU z|6rF5jv|ah-p99{1x_!8olpywUtaUJy)$et&VfiCl<+Xw#<^pLrEQR}E8cxyv(5P< zLbW$QfV|t_5h0WNHfYxm4@W-Kbh<`HMutfy_{PjEJ0s^w zc>74LJD*hag!@agmoIOE6&Z^_Jijv=JTcvox`M8rUTDW6UVL75jr~#qseWBq46B}K z$yiE}VV5q{3X7%TuTzxO)cUhk*hPbg+d(l$FCc1Y_yokQGcyg|$*HLnksUj`yA%uz zUzZX*rv}0gU=2DsKYw-On&-*lL)9`1sW)#h=39gF@-L;CYxc1rQ1*1WDTaa zf+`sSN|)Lt57H7?z0Ynw_6$~!sf+@ff#$=PmW-=!dkHf)*#W1@@Q8 zM{@G=zkxfuEpv9f+rb>gqT{u)14_V_&B-cOF0NLf8p9W6z5MqvlEZs>aYhJ|LNqiq zEFzb{3i~yDVA%4l4drAVnr>F##;WY&4^kFUme)yl4F&%y_$? z(cqTomr%kL_T%|EvUBI1w}_OkdBQ>V;8(g2e=5(4h7I#lol-<=#Q6^V%*dAtE&jYh z+CQpO=dCcTs35+6y>0&lW!a#VgR}_BAsS}pU{Km>TUz$O;a+`K;0i@L?1Jcq)t&^P zvjzX=I}aW_03Em=RBobQ350=CpWt!&G=|Gk^htQ)@ES1NEi)&!hP6EJeMn2A0TJ(; zD7H^YNfeEZji0}MU4Z}frKsrjzePrGyW<5qR{GOU4u-XMwzq$#r>8dxZVgSjj9g4* zRBrTvPnl1R>yfUxdEl>Kltw-Aiy%0111@y>pb1iQ+;3k#nJD5%z-vbf?^qW^!^8qE z-zKXZ_xdE63t$U?XfUZ1NP$tHOcAU*-@V(=(10RNg$<7)3NPduDmwZcM9_1(?`$sn z?;WpM^Jy^F4NDzCG%jYPDSMhB)?1qkuy=ni^*tmALSqAZFf7XvIEIRu1@0l@F zKozYP78WC8V-(@-`K6^Tjg4OU`79vF5(np{EX5p`Wxb(q;P}I8GC&I-3y!2}iI(FM zhtps4_}gs1zIvuz#bD)n)VzJF)s73U=8oX`v@FSvT4Ci`-F~Ldv`H9iP|cY?TMwiJB`{C zc6!!5`-;nrHT=%&U*mSGADrKQWlbj)HvQads+g&n;gb@-*5fIPczcPp<*4bRKKHi$ zlwZ^Pg?ET_s8L^ZIfInp>C>k=2djf4V?&eoeyk1WvBO>rsPm8E01~ihqhMlU{)ma` zhi`St{YV33K_V6wOyE(VrKJV;t?^(c9`e)-=V|5H)%jtOaZ=-JXlPhl(UN@p+56rJ zB;{6CR?jIy<(=Z>>6&|bf+5=CAimJo{uMrosg)aY4| zn`anAe}y6`^xw_{zkESDoiV5ue+G+>83e*tE+g6V>JqGD&@<%!fTpr{#cr{C3*s&n z1WjPdhiz%O^*T?@9A5r4Ezb)MP};e{Dpq@ZKXOz@CDZmvyH~sckC=4_a%A89iIrFL zb0>$#HXKNowObzvg=7;ENW>MP<~jEp4el>V8JYVvE(f}xcVAeFJggO$kkDED^BolQ ze(+WA!A6$9WtLhl`^ycG!ZGS0NLR+onB({y4M7o~dhvvcDjzogoE~mS!s&RICQVIC z`x!E7JZR=o{-#P1UB7-E6&01G#$tP>A$1A;?p+m-Gaz3G3iLG`0$9kq4tey?4mZ&5 z-pyipvj|TL!e>_GhlP6~aSUy)zW(`7yAe?v8#cgIenKAvP?|S*9`)6@I>Nbk?OB5+ zkh{O)=FOY;p=^eAcE&E}uodFLqerS1F|o14D6sm6tKU|w%!2V@f@+Rvjv}%OU9jPS zg)T?QdiJ@(3gZ)N=UFaTP{<(Hw=MUj+(lwI?oP>GZ60%6CCYxmqD+a-NtK3RE1*rtd%pYC(w zPRS7pWz~iQd!H*6fzJH*z+=3V$%6xfb`9@|+z1N%n~A)zt>g3O&ojS*1vB?BiQz^P zOOay*Nm6!B4*et|;p&_w@DT^y(S&JUjiSNUBokeKdGoAfEAg3djea{e zuif%<4-dh;r5+mChk~@KffU6CSUdWe$#^LvTxrzM(!yDYiC4-RL>f!NZjvEmxg&?} z?(WV6p#%~>2P-(am6&4pefS1cZ5*L>8d+P9iV`d;#XNcLurbzL?Y!p%<~KYx3#gAD zKW5OV{00GZ4G9!M*VqCWBe&BwInoMeyv&lz{e#DTuUIx%(!s_Gq%$eJNHi=g8gg=^ zSgR1yaWtp-AF!@QzHDW{Em>JvQIHDK1kcMTnDB9$kNt+f@EC3rIDW_#XUWM_P@bqK z=5D}U_J&MXM)k-D(b>1=_Wy|b3a~D>Pj^;fV4gL85y;WL)O>J0Hf zf!drzPEKy#<4{JC*8jQjz*Cre2|-^5l9`gGV~q^gQF_4Uc*-Hd-mlLO+r|I_%C8(i9mfIZ-<~hjgeoL<|JT z{43n9=c-_QOw8bU*RaA!6x)FLCU=a+>Sz0(W8YNIE{69k8p|V{{CCuLDw77|GNjG9 zLsO4m&_>O>*Csx>CFmJV`kf~J+s^V#z|?L9AZFCU_Z5=9$#8xviT7Sz;JA`0IoDR( zqL&lpp$%fVkk~&Z5L#r4V{=L5NN$v{R<`z%{?u zy)giqN_nu`>gE0{#} z9dQ=lbvxP=dHE8hb3kJXVN{rdGI&1wte6wGb-2*5J=)2G-EA3oIf z*cZV>y$+3vEccULI0c`Z3_d|A)^5T8d3&*6w04OxV%(F?PjdI}UBFzBQ}HPQrUx9pFHQIVe*E|Z;(kDA=p7_n z{Khhvy0o*i8#Jqe0_7LDP(6thN5F7MYp=srzxm|J6BK}Hk9X&!)&^4dTrak_w@*)6 zuKGU;_;R}arlFQi`2lvv`e4ZQdu!ru-RrQ5is!-jjDl3rppo@X(C_{Jof-fixP`ce zK8@F}r3D4AF=|%d(1kM$x~%2!)-l$UQ_XEkEO(tQ1q1|?o6$6i;%aL-i8!o6;QWNE zfZ?KqAA22-V)1CNx-Zf0vEN&#sCRGqfsUs}(A`++Dx4CoYrCl*Lf~4n-{5!p{#W(i z8R2PRzN!gPY`;JKK5vDM$QH2{A*YdQiMzOUbjQeQxsHN9dLw=!d@rh*oSU@XgJt5E zA+`OUVQZ^sIFHBsq&~5`t*5naM|5sY z#Ky+PkihJ2Rl)0l4Ef{8#wi$h^c87VyphRiaw7S9QCUM=RWP07%tC-^XlPjKdiVxe zd+;E8V+qA&Wl?L_vh|9Ki&v{#Qk$B1bv*WOO6K6iN{S@2D}R5MEl-2!OcnBDAO(qs zlrs_rE`#5zdx>HRZbn9iu!zW*Bf+~Tvl%L1zs8D70#>$^b5s!eg|`%p@FJt5ebX1N z-VeIEyW5}s(nA3QQ}{@vf3>Q80wL#cOjYL|Az@E2bF&GNq}^XFF<7ZSb`o9XM>P`@ z0KW^+#m3DPLoxs*8191ys(LL(yGL)m_m@P#n}S|u91QR67Ta$!y{?tlYbq(R&iP9Z zCbgikC4+qk^X%MSy=gz&kVjM6a&N{;8>z) zwB}uM@-km(X=SAYF(3frf}T&WvcShB#xxm%p{h0!vm^y205pxpcXO!|hd&wW&c8(c zd51zQ?u%8!+;;gwXJzh4>B!6wa|wy3vL`y-Ex|W2V~(|e8TvyrC8dn>i+W#0N;RiU ziqRvpe4^XFH{bfd4e2Hn0HFQS|1yDakGbbpc2ITDPuzGpPHV5U2lk=|>C2{^t5@Qg z-?4umxSv!*Rru3iKl&oiP>6vTNCc`9x@ z^8>n1m0YFk8d*aX)TdB=pv+y`*pPtj2N<3~e^P-MOEq*>dZMW-%*N>O8Ps07xVXg5 zOi(&IJC~Q2L&$LE^#;^Wr-;J&zUWOARQhtGsVduAG^Z^UQ<-nDdY2g<4rdO%V`@<+QElv^(1aK`Ig4&R#h0e*V>F`jh}U*r9lc{dxvr z<*CQ14NCFrx@$_FcM2-*D0y9;xZOoTyiA|EA6p>p@jpjfgdA3nz^qS*E>@+kxVbkj zKCL2Eb`+Ok`J?j>lBp}?>xoR{SJ}U*2*{sIWYI2bEhg@DE2BUj+8fG+Yw>`gUJOh9 zrbwjRuNhlNDd!Ps6yZ^gQH9pI#F}u!J16NTuKO)y{O7^KEGM#EMPU`=ri@}m;lt!D zXqwE{otn!sY39VTn~}A7-ze+O;$MzA;^frx{M*R*l`#`wNW)^HIQgEhfX{CwVDR-! zpZlzGaBDE2yfxp12ATdoj8JRCY zKQW7svvqJ-L3#-ARr+j0fU^hkNanKUY=@VBSZ2@w(DU~i`d%tbYrMq&Y_@1 zGhck`K6VWpC>Hk1zd>6ra$99zRi7* zH1A**8K(gj=|x8`L(VeoSXXLVWV1^!k($}#qm zH`V~!O6b$Ce5%{{FoSW*m6GzGBV=$IH-PSk*X)bDvhdm@I-d>osYSQbwG zArn@I^})r+ude(%MfFs%l2F`{b8#g?4e%Vc8{frmMa9hFxw%x8B8|w1h*qfP*1>)) z=Wk$G80x2AFJJ{Bx_6|K$yZ{rp67wRj`+g}O%!WwiG=?Oxc~UEmJu(s7&b+VD4lf% z+!E3IsY@Ztf+%dhReI97ut0MA_HC#f`~w2eu1>r7pK@@lt@K29baf%c-|N?}C#%dK zSU2v!&mV2?Pv&@4I0kJPl2e_;n@!r*)6P?aVKV_PF&7^0>ZmkD>e*vvGD0>GKiUDk zT%T*;_|>BK1e|Vj37|!X0{VM34UHr|o<5vT$W%I}r;`8!&K%jeb^G?0;o&H7e89eU zuPx!3L4;%uvf03kuBtt?77p~kf1c98jIxrqa1d4%>*(o`LK$Uzd49%fHu?cfoRCNh z(VKo0pBQp1I2V7yLAeB{Iem?6$wY} zp9a_=0gg>WGJXKakRL!CEkOML4OTt@uN!NgT)JrC*u0~br(^E{-ivMLQVK^2t$+hH z8+zO298Ko^;iCBN$W@!}pV;o($4^`KJ?7Uur}3&XbhP0Zs4P`u((tF zcL6!)MyrJ4zHGuQw91eoM zc=mlr0#3k-&zLGG1kW<#W4t(8@@soa?sysbE~9=6dE=nsoGa%=;`Z|d=`|u`AV@vu zDvr%$+`%gWnMEJ`fcYmJE}tFr%YlFfDQ_S6XsYU^3TEg+zJ%oYQx(SW3Jb)D7A~r5 zHiKcI+wDxVA;(pwNU#fJ*fIk&!VJ(4G7I{4I7(ws6?n z|NMs7kLNm7L`UQ9HJuP!Hyz0yS21u(WdpSD=zc zJjZf1gaPA%WR1oCr!?>tU{QB1EG#I=RZB!uq4)&^JO?fr>`o)egC_X)Z%J&oHD`vu z3VL|(092PJ7EX*ny)ei6$^f}ewX$m{iPB$z!Dj2^^al7>U~0#VjDG;e18lR&7H@tO z#HO*`4;^;#!e}%-BV*C9pY^L(ksCyYZ{7@->IwOnX|(_tH1D>>=ytqqy1DTJfJ7uy zdT8C)MxE{kl$l*0LzkX^vXsC?+wMO;+>Ri84UBx&%Ho@uZ4D-hg>Tv#st zg5gi?+ot=3mp64~#Sk#6I@@JbIQ>{Jk|QHu6&r@v)w$OB<-?YOt#VPkK*$WMp!sF;@jH=N16>;2;pq6t*;-3Qj&ryo_CDM>%Kp${dwqBYcKq`MCd0K>wpsUZ0${ zsJ1#^*Nt(h+6N2nG2{KB&r5q=_?S<#DDYhF70>iwo~`38y-9sCTGsB_>2gW3K&@?yxo_k?uW38UYaH|F*AQ>4XO%h z)BOSNJGquhbg}uN=y&Jm!O2H?x2C>VTl4sEj++c=Wy8t>-Y@*p`uy2W*xG@P=%eNU8n=-G$?70`JYB(wxcl+)389YUwUJO*%Hj()2%#4;F8 zEBlHodTbo&gF2mnt&@M5{#LIhFxGWyJpC?@1m2(}+cO z?i%c?9>n7fp4J)kLKE1`@c~iea%)PPZ*ot5bLcm$T@Qh55gKx=ro(=K0^&S;*w^NZ z=6ZRywz1H{5AXzHO#`bO2|%rHbI_~dJpDE2ya3Igw@?^D#ACgm%mLs8`~>8nH;YuH zOiXCBwYAT|CKE9n=XE~@6j*UrBev7C0e~&|JVF!zH3(P?ZvpW6rmA=WJj4JlMR`I- z_70#jNE&a93_kFIzs#Kt_zAeYk1*LHbQjopIe>!#aEh5*qxAxxVmW~>z;tj7G`^li zg3ab=zOuG&`Fypq<>81Ne`HLI!^C0Bj5{>S0c->ab|3y<()d1P9m4l#*VdjEZ*6|T z&YS7f_{!2}fDZ|zNA&MIaj1RuSQ~*Ek!GA0o(T{F0xJWBDHRu0mP9Aciyc&*^D62q zXx{E8Ko$v|XS>UDSGcHN$akSGr=q0nRHADe7{KD-;DD^g#@3cL{@h~p(>>U*cX>7> zwdk0br~pp+{o7%9WCT2`pI&$z{*)OW9+qb7TeahYK%NW78mr}W44mB~nIgA6JUpbc z1k!|!*zA@Wm+C$@elt4kOR46ODQ0+(_)4^5=?x&zi$zCY6_+I-N=X_*OiW@$ou&h1fyJX5!!C7Z%apA95uWYo|T#m?am-S}l8SxE@#v)^4y| zyz*ndC6@}kLXlyzplp$qz607A{3PN+Lplt~obYfUGSrUk|K;}~)_7#mh8llIjbO8S zR34C11a1Pc79<<6MBhStP$&S)2wc|1bB679XlP{U;zBLXcN_LhU|Rv`@v^fTC#G66 zPdZWGjmPFkD~6*(9stJx8PLs%InHP{IPDbJwT#)W)d{Zd3`3u$%z1C#?mIXP_m2kB zgZCUPrQ{{k@y~<+Fry*Fg`=$r`<3o{R`ZR4iHU@a8kJ9=n+#@$iJ~L(uBk{>1awj9 zaQCB4qokRbZ1U=jgazntP5Slf+%HVem^sn~i<=eA}iDM#l*S3*8d&X=yB(>LW2&qPTh_VC12xp9iNh(kybKV1mivH zXlj0yuaxq_ISkHd`~ToFt&kK9Z5=_XHrVKDuP8TGPLUfB(4~06AzP%9?8cmzoekkZ zSW*&0wfMC_kqUXNr0H-rI&4)|gc}k&;G?yWZ)C%pd+E=aomen>=@5n0T@{+$i}lH;$AqrCyz0$T#A^n(@CG$8*0o z9abng>b4K*V`YlR4?Os-xWdT#Ot*y|i(wO^p<;eA+BBm!yq)6@>t{%u4NoFiUTO@l zTT(}phE|xd;jf=D4h3*LOP@mSS=uVG)*;asO+fL!p&9jM5FWYcBL^(xvkt8XJWl@v zggoMkf+og?Nb+{Y{OoK$q=dF#lU4bwCLk`}?b)RLA7YD_UClT40L%0AzN^KL&bq*x z0ixesqOZ6{kiCPAI!OwrZDz4h{t3Xk0JV@)Q6YmeCLB5Cs!X;__?*rX3g4(EMn3b6 zuh15?3s-OV7o%5=>$BZjepJEzRWJEVHvKRp2-w+JnNk7|APMcL6UMwMx}Be&pTg}J zbb9InMG=?xB@e3aKh)IJjg5`J4i4JCf4|Gm&kty?NdMH|n8-*0$f)2Yk-}tW_=%{f zDCvn>=$urVPhi3KUAul=hSzd4Nj8&QBC&&Vl@gj;E5IMY>Bp5&j5(ey8`m5W9C@db zqyq0s1P=4YO6~3tvbtY1uU}~|a{OI5?O)`uTj8ptwfGV-ON!b1_;%P`7wJ|^g10chWEIM0jkp@NorbDQ8B2^CWmO$lg(lKa&8m_h=Z%IU6#ybrs6U$?+Ubx8 z1NGeVk3&#UP-%I&KEPwS+#P~D+?K9MSGDH>EsR%GA8CBh32}doo$BY+JeScX9pxhz zg{R9p79Ly`BEmehthpiu)KUkAb@9LL$CK+M3+RtGD=I5l!-#o%A=q$1k`29G$l##- zGle!9j10_yoD1^1QO8em3{@KaP|tAzLmMCP z(+4VGae@x%tHjfmVT|5BlN=30Q9__+1M#spR^`{ITTt3bxY~Oj-#MoSgv-Gh%sCr8 zN0{^?CWA}JmeIB-(x6_){b6uBCyuB0m+mW^LmbRXzL7X{8GZpHRc|Un9AX`feEcF| z_lXv+VewnL1bE%BV2p~>#nR&(#6cR8c>xjPd!%xD8H>sAi&1e$tt4;Bc zM0iR#3Ht6oyCcadC@J-st^ zXKSCq{>*_y)M0P_BEuZtxTm7l!Yh%!cUage)0HefCcZm<_4*Hur67o%B%ya1D;a-{ zyDaA)u^wUL5;u9M!(^M2vM*L>km{)sF}R8zVM2j1SoYB%G@Rwxi1wGYc5DS+{AlB= z7Iaag`qvtrCr^3~H8DQFm@vTa z;VD2nGQ!2wUiCY8JAN#cY+J>f!KXVib%h(rc+?gr~T8X;JyPjx(Ixm@dJjg&tdn> z@As((SFBTT!yZ6aK^rM9eGG(nw(;m438)EAp?ZLd{w`q56x7scfO{hv19bEZs4>D< zSKi14m#gPzWo9BQeCTrlo_FujBk2~e3l{)n3Q|5Y3PtK|db+E-PL0y5Qqo_@8kW>> zP+Do4X)G1(=lWOQ9Cv%RsAoAS&IZk>a(IUUmRRHhg5l@H5L$)dUsc*!lgrZ&yMwLm zI^BIYxGI+LG*U>QRY1jxzvRBV{IQ-AqaZq>KYrC|O%CG2A*RT-0gy=yqx7a&*O_mkHbECfx z08z35UQV+a8PxJdU}X*m@wFTU332gTddz;LTa3#=o%a>3XX$(CbJJ??INXu! zqcP##A9h*HKkCrjlDV$s%gvXS7p_vUnlSe4cyedaXXhWtP2rFeYH9R>H=&eAj{6xy zcKG~2jmiB=Ix>eJ1z*J0Me7gR1JA4MNokK7&(Y0t;kGXnhC4^cW1Av$v*{2q>hzp^ zFI_K4rf!ubBoH+J*`$Y2wE&;$1K;KM_LO3bIW{ppcWM~4j)Re~ce3C;Qf02H?S0`0 z$j3={80mk=-^O+)PI(M+_ja)dfZGQtk7>Rs(nJ5Va+0AOxxN7u*lD9xBQgu}52c|$ zK6k2ryYmy;1y31_3EDP)xQ+Z3qEu9-zxO#RzdOb_3IblGt&_3BWPS%aP^Dv=-ap(V z8c*Jm$HmC;2fFkn^OX6$0F}&6QEMUHS5Kg8bp!tk=ga8DX@WhnGJ2#Kf%Q}5=V{F8puz+WbJ2r&4eLf$ZO)C9P43yeB#qpk zANvK4CwCV=9NmLf+l~7-hUCV=fma{K-Bph@)bV%t(BzwD)bt8D%IC2z6DK1w^rG<0 z_`pAFj#`;N1aQljsLE^(RwSCC+YT$%WU`bL`s2v7CH*C~3~ebWka&1f5bXdI=m?Do z5NmWyOplc=oc{?WG@&xKZQs0sW`TvR_fVjo?C}JSs@v*GW<~w;#~9qYB{e0nYBv@o zGUE!kOdX?;$Zz5vVOU}K$T19|6vKmmH`Z3g=U0_GTjbD@8u&w6BzMC$j3IA$DmGTs zs0yd8=7hL&)QV9w&rB3twN7~NMb*~_XIVc(#h4`#BPUi z;H>N2%6@~o8i^#{>{%^0C5FXscDajNco}biDvLu*JOCF_3;a`r_XSAk@6EB>FJ3g% zW65E6_w+0x4W!93Unp@AqQOZ2hotS#PySu0#OW)$J0S!TrQ$z)`v1Y2dbHGd<{IG> z{xtx46WsS5GKB;Jy4WMhZn5RR)M%wGRD=oz+u*)XqbrYS;63Kh2fSmv8z8~a)%$@v z_x#8!(5?OcYR>_uxocbnzA=}9?R)#UweHx}%%^lFIi@08?c=9r9{Xdb5KN29^m6Hm zidqMByVf3djMOphqaA|aT6FXx~IPu0f#M8>HYBG-}I;Jd7XP6 zoc7d=QtrfQrF?BbzC@`Uto&%Hr+FTHZmKm(Bv(YOkR`5$E_at)G%B{IL%qXxVCj)D z!*^_B;s62tR;eu!=tDmqdyGzp*)E{U@BV^!Ag$W1z2{9&N)?05@mKf(DBGYkUlHX> z(~$FEYp!H4GnM?qXCWv`src-hI|1PBM4Ln`M?aO)`aE~v8t*efFCVA@KY)hU1{f*g z*$)FVvHUYHDJT5v_23MJcAk2Z8(U9L57IP(Qd`fOSrm&`^5*b0M3e^@2o!=Wc!ZFR zVMmb&GAlEK=8U-S9%X+Nm0pB~P0>akr;%5{mm-a}8>FNU?d zD_sxI`JFs3WbS|olmT=D)U6QFthR-Pbm)5{Co(9A?9O~WjqmyO;yrkPs0RTWM7U+p zl~Yq!9|A_PppekUP!<|KK7JKZ^uJ|-3rkdkvqFzjN+q{Mh%zP!Dx-AMd{hcLhjk?i zGgWd8OS~ibWrC7Nq5uD@8>%-hW7~mBc<32%`L77>BicbI3b1ZIzD0Kn2lsN+;6zi7 zQ!z47C9|kBy*H};gpP8bW()lx1!`1(6qmJEvqKrp1&3zZ9UsjykhEkm zvj-Q<$N2`6J)qNAkF`~1)X@z~=200}JE+zm9O*|8m}reArJeBtL_H{}=)I=?$tv)g zWe@F25^grfdVuHyv1Zn2p1z-}IOTNeV+)0aGvw9W=<2UBUt*hus}!!T4`m^}VaQ}7 zO=_@ZuhhxbFF z6s2OKmvdiSIZ-o4*0pf`yKpqEUNX7kt3GnI1?^)AyLVOlC8aq08sne+iNE`|G>r~2 zOG_jE3kjfNJ?aKcrme$g{^+OZN68vRKOqNM21Xqv+zoU;mVP`D6;Kj;Pv#59Mqqi+ z(x?7cK)YuhWc!$0|8Q<>ZX;?TM|5+I&m!>M49S9Z;I$X2ly?rk>nr_PR*MPG5)B@I zqg#bjo+BXcewx}2hc=8ggaukYb=suzI zUs=r?!p8%kCPEON*tUYOtOvvosrgCUBV|@Ik90p2-pkDHugk{AF^nI9lth zZdl$pF0-ZS@B{#hK$|E`RaJHMBJLzU-}>3I9zRjiUJvClC?jN5RPYg^9JKVkg;kYZ zrc=1=-veUvabioo$}HBTLy1f=O(MiGB!Au=$+wnt|8$g1^XXI*VlVz0@DIFWR6EKi9bZ?w1SgmM0hF%Hud2JvMg5|Edd(sZg5uh#u1KI?V(x%-b z#(&SmwE30YIar(0=j0#rb}Fb^?cGm?1yH$ay7X-s z^rKJ4819D*icj2{z?m3ECwIhx(vc3gT-kLH=VmOWp?RV3Tj=aS-VCy{kHU++jwfeq zUeW^C#QcbVJ+FHlfcroLCIq%uPanNycs)#7#Az~;0!EGqSALfgczuAx?sdIGAS~lV zoO(h+LKHwl2J0Qo;UP<-Ye7!J9ajHG7$Hmf!@7=_%q1IR7^}>tQIO`>;b^duRGZwi zv>oPJR9f-_Rh*1u(qL&e=>WGe6nlVl+~@U9Co^i{0K^1}NBAjV#v#uR6qKwYN%;>V z0gyV;cODte&PJabevV%2if=qdoBih+D}M7Q3%5w?i2$;JqSh{Jluup2Mb5h7ao!x>Ec#L4M@Ohj%?vp7H zP@e;;Jvlk~)Zi;785tR!g~6LQ@1em5=qjQyygO=scDy_q3*=7h`}dKtb`8#Z#fKD4 zptpp6Es~SNoBTX~f?D!fb=&tCR(WDPi(S?uAfWveJq#!&bayYg>I#+7z9Cc6pWWR^ zd2>8f!r3#cSP19F;?R|Z>0d)jj#+GuR zKiYrF8DYDVS0I(oPROwlvi(vCY�ANZBN^PzKjH+PBotdrdx>e~2DH7fU6_;zmnx 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 x18)A4chiW18md(bFzmSgm5f?N?)w>l_(-e@ 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

!~PymeCD}?ZbgU65{+f#g$3`Jk5hQpv)NC) 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�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 { - return a + b; - }); + return a + b + }) beforeEach(async function () { - await this.cmtat.connect(this.admin).mint(this.address1, TOKEN_AMOUNTS[0]); await this.cmtat .connect(this.admin) - .mint(this.address2, TOKEN_AMOUNTS[1]); - await this.cmtat.connect(this.admin).mint(this.address3, TOKEN_AMOUNTS[2]); - }); - it("testHasTheCorrectBalanceInfo", async function () { + .mint(this.address1, TOKEN_AMOUNTS[0]) + await this.cmtat + .connect(this.admin) + .mint(this.address2, TOKEN_AMOUNTS[1]) + await this.cmtat + .connect(this.admin) + .mint(this.address3, TOKEN_AMOUNTS[2]) + }) + it('testHasTheCorrectBalanceInfo', async function () { // Act + Assert // Assert - const ADDRESSES = [this.address1, this.address2, this.address3]; - let result = await this.cmtat.balanceInfo(ADDRESSES); - expect(result[0][0]).to.equal(TOKEN_AMOUNTS[0]); - expect(result[0][1]).to.equal(TOKEN_AMOUNTS[1]); - expect(result[1]).to.equal(TOKEN_INITIAL_SUPPLY); + const ADDRESSES = [this.address1, this.address2, this.address3] + let result = await this.cmtat.balanceInfo(ADDRESSES) + expect(result[0][0]).to.equal(TOKEN_AMOUNTS[0]) + expect(result[0][1]).to.equal(TOKEN_AMOUNTS[1]) + expect(result[1]).to.equal(TOKEN_INITIAL_SUPPLY) - const ADDRESSES2 = []; - result = await this.cmtat.balanceInfo(ADDRESSES2); - expect(result[0].length).to.equal(0n); - expect(result[1]).to.equal(TOKEN_INITIAL_SUPPLY); - }); - }); + const ADDRESSES2 = [] + result = await this.cmtat.balanceInfo(ADDRESSES2) + expect(result[0].length).to.equal(0n) + expect(result[1]).to.equal(TOKEN_INITIAL_SUPPLY) + }) + }) - context("Allowance", function () { + context('Allowance', function () { // address1 -> address3 - it("testApproveAllowance", async function () { - const AMOUNT_TO_APPROVE = 20n; + it('testApproveAllowance', async function () { + const AMOUNT_TO_APPROVE = 20n // Arrange - Assert expect(await this.cmtat.allowance(this.address1, this.address3)).to.equal( - "0" - ); + '0' + ) // Act this.logs = await this.cmtat .connect(this.address1) - .approve(this.address3, AMOUNT_TO_APPROVE); + .approve(this.address3, AMOUNT_TO_APPROVE) // Assert expect(await this.cmtat.allowance(this.address1, this.address3)).to.equal( AMOUNT_TO_APPROVE - ); + ) // emits an Approval event - await expect(this.logs).to.emit(this.cmtat, 'Approval').withArgs( - this.address1, - this.address3, - AMOUNT_TO_APPROVE); - }); + await expect(this.logs) + .to.emit(this.cmtat, 'Approval') + .withArgs(this.address1, this.address3, AMOUNT_TO_APPROVE) + }) // ADDRESS1 -> ADDRESS3 - it("testRedefinedAllowanceWithApprove", async function () { - const AMOUNT_TO_APPROVE = 50n; - const FIRST_AMOUNT_TO_APPROVE = 20n; + it('testRedefinedAllowanceWithApprove', async function () { + const AMOUNT_TO_APPROVE = 50n + const FIRST_AMOUNT_TO_APPROVE = 20n // Arrange - expect(await this.cmtat.allowance(this.address1, this.address3)).to.equal("0"); + expect(await this.cmtat.allowance(this.address1, this.address3)).to.equal( + '0' + ) await this.cmtat .connect(this.address1) - .approve(this.address3, FIRST_AMOUNT_TO_APPROVE); + .approve(this.address3, FIRST_AMOUNT_TO_APPROVE) // Arrange - Assert expect(await this.cmtat.allowance(this.address1, this.address3)).to.equal( FIRST_AMOUNT_TO_APPROVE - ); + ) // Act this.logs = await this.cmtat .connect(this.address1) - .approve(this.address3, AMOUNT_TO_APPROVE); + .approve(this.address3, AMOUNT_TO_APPROVE) // Assert expect(await this.cmtat.allowance(this.address1, this.address3)).to.equal( AMOUNT_TO_APPROVE - ); + ) // emits an Approval event - await expect(this.logs).to.emit(this.cmtat, 'Approval').withArgs( - this.address1, - this.address3, - AMOUNT_TO_APPROVE); - }); - }); + await expect(this.logs) + .to.emit(this.cmtat, 'Approval') + .withArgs(this.address1, this.address3, AMOUNT_TO_APPROVE) + }) + }) - context("Transfer", function () { - const TOKEN_AMOUNTS = [31n, 32n, 33n]; + context('Transfer', function () { + const TOKEN_AMOUNTS = [31n, 32n, 33n] const TOKEN_INITIAL_SUPPLY = TOKEN_AMOUNTS.reduce((a, b) => { - return a + b; - }); + return a + b + }) beforeEach(async function () { await this.cmtat .connect(this.admin) - .mint(this.address1, TOKEN_AMOUNTS[0]); + .mint(this.address1, TOKEN_AMOUNTS[0]) await this.cmtat .connect(this.admin) - .mint(this.address2, TOKEN_AMOUNTS[1]); - await this.cmtat.connect(this.admin).mint(this.address3, TOKEN_AMOUNTS[2]); - }); + .mint(this.address2, TOKEN_AMOUNTS[1]) + await this.cmtat + .connect(this.admin) + .mint(this.address3, TOKEN_AMOUNTS[2]) + }) - it("testTransferFromOneAccountToAnother", async function () { - const AMOUNT_TO_TRANSFER = 11n; + it('testTransferFromOneAccountToAnother', async function () { + const AMOUNT_TO_TRANSFER = 11n // Act this.logs = await this.cmtat .connect(this.address1) - .transfer(this.address2, AMOUNT_TO_TRANSFER); + .transfer(this.address2, AMOUNT_TO_TRANSFER) // Assert expect(await this.cmtat.balanceOf(this.address1)).to.equal( TOKEN_AMOUNTS[0] - AMOUNT_TO_TRANSFER - ); + ) expect(await this.cmtat.balanceOf(this.address2)).to.equal( TOKEN_AMOUNTS[1] + AMOUNT_TO_TRANSFER - ); - expect(await this.cmtat.balanceOf(this.address3)).to.equal(TOKEN_AMOUNTS[2]); - expect(await this.cmtat.totalSupply()).to.equal(TOKEN_INITIAL_SUPPLY); + ) + expect(await this.cmtat.balanceOf(this.address3)).to.equal( + TOKEN_AMOUNTS[2] + ) + expect(await this.cmtat.totalSupply()).to.equal(TOKEN_INITIAL_SUPPLY) // emits a Transfer event - await expect(this.logs).to.emit(this.cmtat, 'Transfer').withArgs( - this.address1, - this.address2, - AMOUNT_TO_TRANSFER); - }); + await expect(this.logs) + .to.emit(this.cmtat, 'Transfer') + .withArgs(this.address1, this.address2, AMOUNT_TO_TRANSFER) + }) // ADDRESS1 -> ADDRESS2 - it("testCannotTransferMoreTokensThanOwn", async function () { - const ADDRESS1_BALANCE = await this.cmtat.balanceOf(this.address1); - const AMOUNT_TO_TRANSFER = 50n; + it('testCannotTransferMoreTokensThanOwn', async function () { + const ADDRESS1_BALANCE = await this.cmtat.balanceOf(this.address1) + const AMOUNT_TO_TRANSFER = 50n // Act - await expect( this.cmtat - .connect(this.address1) - .transfer(this.address2, AMOUNT_TO_TRANSFER)) - .to.be.revertedWithCustomError(this.cmtat, 'ERC20InsufficientBalance') - .withArgs(this.address1.address, ADDRESS1_BALANCE, AMOUNT_TO_TRANSFER) - }); + await expect( + this.cmtat + .connect(this.address1) + .transfer(this.address2, AMOUNT_TO_TRANSFER) + ) + .to.be.revertedWithCustomError(this.cmtat, 'ERC20InsufficientBalance') + .withArgs(this.address1.address, ADDRESS1_BALANCE, AMOUNT_TO_TRANSFER) + }) // allows address3 to transfer tokens from address1 to address2 with the right allowance // ADDRESS3 : ADDRESS1 -> ADDRESS2 - it("testTransferByAnotherAccountWithTheRightAllowance", async function () { - const AMOUNT_TO_TRANSFER = 11n; - const AMOUNT_TO_APPROVE = 20; + it('testTransferByAnotherAccountWithTheRightAllowance', async function () { + const AMOUNT_TO_TRANSFER = 11n + const AMOUNT_TO_APPROVE = 20 // Arrange await this.cmtat .connect(this.address1) - .approve(this.address3, AMOUNT_TO_APPROVE); + .approve(this.address3, AMOUNT_TO_APPROVE) // Act // Transfer this.logs = await this.cmtat .connect(this.address3) - .transferFrom(this.address1, this.address2, 11); + .transferFrom(this.address1, this.address2, 11) // Assert expect(await this.cmtat.balanceOf(this.address1)).to.equal( TOKEN_AMOUNTS[0] - AMOUNT_TO_TRANSFER - ); + ) expect(await this.cmtat.balanceOf(this.address2)).to.equal( TOKEN_AMOUNTS[1] + AMOUNT_TO_TRANSFER - ); - expect(await this.cmtat.balanceOf(this.address3)).to.equal(TOKEN_AMOUNTS[2]); - expect(await this.cmtat.totalSupply()).to.equal(TOKEN_INITIAL_SUPPLY); + ) + expect(await this.cmtat.balanceOf(this.address3)).to.equal( + TOKEN_AMOUNTS[2] + ) + expect(await this.cmtat.totalSupply()).to.equal(TOKEN_INITIAL_SUPPLY) // emits a Transfer event - await expect(this.logs).to.emit(this.cmtat, 'Transfer').withArgs( - this.address1, - this.address2, - AMOUNT_TO_TRANSFER); + await expect(this.logs) + .to.emit(this.cmtat, 'Transfer') + .withArgs(this.address1, this.address2, AMOUNT_TO_TRANSFER) // emits a Spend event - await expect(this.logs).to.emit(this.cmtat, 'Spend').withArgs( - this.address1, - this.address3, - AMOUNT_TO_TRANSFER); - }); + await expect(this.logs) + .to.emit(this.cmtat, 'Spend') + .withArgs(this.address1, this.address3, AMOUNT_TO_TRANSFER) + }) // reverts if address3 transfers more tokens than the allowance from address1 to address2 - it("testCannotTransferByAnotherAccountWithInsufficientAllowance", async function () { - const AMOUNT_TO_TRANSFER = 31n; - const ALLOWANCE_FOR_ADDRESS3 = 20n; + it('testCannotTransferByAnotherAccountWithInsufficientAllowance', async function () { + const AMOUNT_TO_TRANSFER = 31n + const ALLOWANCE_FOR_ADDRESS3 = 20n // Arrange // Define allowance - expect(await this.cmtat.allowance(this.address1, this.address3)).to.equal("0"); + expect(await this.cmtat.allowance(this.address1, this.address3)).to.equal( + '0' + ) await this.cmtat .connect(this.address1) - .approve(this.address3, ALLOWANCE_FOR_ADDRESS3); + .approve(this.address3, ALLOWANCE_FOR_ADDRESS3) // Arrange - Assert expect(await this.cmtat.allowance(this.address1, this.address3)).to.equal( ALLOWANCE_FOR_ADDRESS3 - ); + ) // Act // Transfer - await expect( this.cmtat - .connect(this.address3) - .transferFrom(this.address1, this.address2, 31)) - .to.be.revertedWithCustomError(this.cmtat, 'ERC20InsufficientAllowance') - .withArgs(this.address3.address, ALLOWANCE_FOR_ADDRESS3, AMOUNT_TO_TRANSFER) - }); + await expect( + this.cmtat + .connect(this.address3) + .transferFrom(this.address1, this.address2, 31) + ) + .to.be.revertedWithCustomError(this.cmtat, 'ERC20InsufficientAllowance') + .withArgs( + this.address3.address, + ALLOWANCE_FOR_ADDRESS3, + AMOUNT_TO_TRANSFER + ) + }) // reverts if address3 transfers more tokens than address1 owns from address1 to address2 - it("testCannotTransferByAnotherAccountWithInsufficientBalance", async function () { + it('testCannotTransferByAnotherAccountWithInsufficientBalance', async function () { // Arrange - const AMOUNT_TO_TRANSFER = 50n; - const ADDRESS1_BALANCE = await this.cmtat.balanceOf(this.address1); - await this.cmtat.connect(this.address1).approve(this.address3, 1000); + const AMOUNT_TO_TRANSFER = 50n + const ADDRESS1_BALANCE = await this.cmtat.balanceOf(this.address1) + await this.cmtat.connect(this.address1).approve(this.address3, 1000) // Act - await expect( this.cmtat - .connect(this.address3) - .transferFrom(this.address1, this.address2, AMOUNT_TO_TRANSFER)) - .to.be.revertedWithCustomError(this.cmtat, 'ERC20InsufficientBalance') - .withArgs(this.address1.address, ADDRESS1_BALANCE, AMOUNT_TO_TRANSFER) - }); - }); + await expect( + this.cmtat + .connect(this.address3) + .transferFrom(this.address1, this.address2, AMOUNT_TO_TRANSFER) + ) + .to.be.revertedWithCustomError(this.cmtat, 'ERC20InsufficientBalance') + .withArgs(this.address1.address, ADDRESS1_BALANCE, AMOUNT_TO_TRANSFER) + }) + }) - context("transferFrom", function () { - const TOKEN_AMOUNTS = [31n, 32n, 33n]; + context('transferFrom', function () { + const TOKEN_AMOUNTS = [31n, 32n, 33n] const TOKEN_INITIAL_SUPPLY = TOKEN_AMOUNTS.reduce((a, b) => { - return a + b; - }); + return a + b + }) beforeEach(async function () { - await this.cmtat.connect(this.admin).mint(this.address1, TOKEN_AMOUNTS[0]); await this.cmtat .connect(this.admin) - .mint(this.address2, TOKEN_AMOUNTS[1]); - await this.cmtat.connect(this.admin).mint(this.address3, TOKEN_AMOUNTS[2]); - }); + .mint(this.address1, TOKEN_AMOUNTS[0]) + await this.cmtat + .connect(this.admin) + .mint(this.address2, TOKEN_AMOUNTS[1]) + await this.cmtat + .connect(this.admin) + .mint(this.address3, TOKEN_AMOUNTS[2]) + }) - it("testTransferFromOneAccountToAnother", async function () { - const AMOUNT_TO_TRANSFER = 11n; + it('testTransferFromOneAccountToAnother', async function () { + const AMOUNT_TO_TRANSFER = 11n // Act this.logs = await this.cmtat .connect(this.address1) - .transfer(this.address2, AMOUNT_TO_TRANSFER); + .transfer(this.address2, AMOUNT_TO_TRANSFER) // Assert expect(await this.cmtat.balanceOf(this.address1)).to.equal( TOKEN_AMOUNTS[0] - AMOUNT_TO_TRANSFER - ); + ) expect(await this.cmtat.balanceOf(this.address2)).to.equal( TOKEN_AMOUNTS[1] + AMOUNT_TO_TRANSFER - ); - expect(await this.cmtat.balanceOf(this.address3)).to.equal(TOKEN_AMOUNTS[2]); - expect(await this.cmtat.totalSupply()).to.equal(TOKEN_INITIAL_SUPPLY); + ) + expect(await this.cmtat.balanceOf(this.address3)).to.equal( + TOKEN_AMOUNTS[2] + ) + expect(await this.cmtat.totalSupply()).to.equal(TOKEN_INITIAL_SUPPLY) // emits a Transfer event - await expect(this.logs).to.emit(this.cmtat, 'Transfer').withArgs( - this.address1, - this.address2, - AMOUNT_TO_TRANSFER); - }); + await expect(this.logs) + .to.emit(this.cmtat, 'Transfer') + .withArgs(this.address1, this.address2, AMOUNT_TO_TRANSFER) + }) // ADDRESS1 -> ADDRESS2 - it("testCannotTransferMoreTokensThanOwn", async function () { - const ADDRESS1_BALANCE = await this.cmtat.balanceOf(this.address1); - const AMOUNT_TO_TRANSFER = 50n; + it('testCannotTransferMoreTokensThanOwn', async function () { + const ADDRESS1_BALANCE = await this.cmtat.balanceOf(this.address1) + const AMOUNT_TO_TRANSFER = 50n // Act - await expect( this.cmtat - .connect(this.address1) - .transfer(this.address2, AMOUNT_TO_TRANSFER)) - .to.be.revertedWithCustomError(this.cmtat, 'ERC20InsufficientBalance') - .withArgs(this.address1.address, ADDRESS1_BALANCE, AMOUNT_TO_TRANSFER) - }); - }); + await expect( + this.cmtat + .connect(this.address1) + .transfer(this.address2, AMOUNT_TO_TRANSFER) + ) + .to.be.revertedWithCustomError(this.cmtat, 'ERC20InsufficientBalance') + .withArgs(this.address1.address, ADDRESS1_BALANCE, AMOUNT_TO_TRANSFER) + }) + }) - context("transferBatch", function () { - const TOKEN_AMOUNTS = [10n, 100n, 1000n]; + context('transferBatch', function () { + const TOKEN_AMOUNTS = [10n, 100n, 1000n] beforeEach(async function () { // Only the admin has tokens await this.cmtat.connect(this.admin).mint( this.admin, TOKEN_AMOUNTS.reduce((a, b) => { - return a + b; + return a + b }) - ); - }); + ) + }) - it("testTransferBatch", async function () { - const TOKEN_ADDRESS_TOS = [this.address1, this.address2, this.address3]; + it('testTransferBatch', async function () { + const TOKEN_ADDRESS_TOS = [this.address1, this.address2, this.address3] // Act this.logs = await this.cmtat .connect(this.admin) - .transferBatch(TOKEN_ADDRESS_TOS, TOKEN_AMOUNTS); + .transferBatch(TOKEN_ADDRESS_TOS, TOKEN_AMOUNTS) // Assert for (let i = 0; i < TOKEN_ADDRESS_TOS.length; ++i) { expect(await this.cmtat.balanceOf(TOKEN_ADDRESS_TOS[i])).to.equal( TOKEN_AMOUNTS[i] - ); + ) } // emits a Transfer event for (let i = 0; i < TOKEN_ADDRESS_TOS.length; ++i) { - await expect(this.logs).to.emit(this.cmtat, 'Transfer').withArgs( - this.admin, - TOKEN_ADDRESS_TOS[i], - TOKEN_AMOUNTS[i]); + await expect(this.logs) + .to.emit(this.cmtat, 'Transfer') + .withArgs(this.admin, TOKEN_ADDRESS_TOS[i], TOKEN_AMOUNTS[i]) } - }); + }) // ADDRESS1 -> ADDRESS2 - it("testCannotTransferBatchMoreTokensThanOwn", async function () { - const TOKEN_ADDRESS_TOS = [this.address1, this.address2, this.address3]; + it('testCannotTransferBatchMoreTokensThanOwn', async function () { + const TOKEN_ADDRESS_TOS = [this.address1, this.address2, this.address3] const BALANCE_AFTER_FIRST_TRANSFER = - (await this.cmtat.balanceOf(this.admin)) - TOKEN_AMOUNTS[0]; - const AMOUNT_TO_TRANSFER_SECOND = BALANCE_AFTER_FIRST_TRANSFER + 1n; + (await this.cmtat.balanceOf(this.admin)) - TOKEN_AMOUNTS[0] + const AMOUNT_TO_TRANSFER_SECOND = BALANCE_AFTER_FIRST_TRANSFER + 1n // Second amount is invalid const TOKEN_AMOUNTS_INVALID = [ TOKEN_AMOUNTS[0], AMOUNT_TO_TRANSFER_SECOND, - TOKEN_AMOUNTS[2], - ]; + TOKEN_AMOUNTS[2] + ] // Act - await expect( this.cmtat - .connect(this.admin) - .transferBatch(TOKEN_ADDRESS_TOS, TOKEN_AMOUNTS_INVALID)) - .to.be.revertedWithCustomError(this.cmtat, 'ERC20InsufficientBalance') - .withArgs(this.admin.address, BALANCE_AFTER_FIRST_TRANSFER, AMOUNT_TO_TRANSFER_SECOND) - }); + await expect( + this.cmtat + .connect(this.admin) + .transferBatch(TOKEN_ADDRESS_TOS, TOKEN_AMOUNTS_INVALID) + ) + .to.be.revertedWithCustomError(this.cmtat, 'ERC20InsufficientBalance') + .withArgs( + this.admin.address, + BALANCE_AFTER_FIRST_TRANSFER, + AMOUNT_TO_TRANSFER_SECOND + ) + }) - it("testCannotTransferBatchIfLengthMismatchMissingAddresses", async function () { + it('testCannotTransferBatchIfLengthMismatchMissingAddresses', async function () { // Number of addresses is insufficient - const TOKEN_ADDRESS_TOS_INVALID = [this.address1, this.address2]; - await expect(this.cmtat.connect(this.admin).transferBatch(TOKEN_ADDRESS_TOS_INVALID, TOKEN_AMOUNTS)) - .to.be.revertedWithCustomError(this.cmtat, 'CMTAT_ERC20BaseModule_TosValueslengthMismatch') - }); + const TOKEN_ADDRESS_TOS_INVALID = [this.address1, this.address2] + await expect( + this.cmtat + .connect(this.admin) + .transferBatch(TOKEN_ADDRESS_TOS_INVALID, TOKEN_AMOUNTS) + ).to.be.revertedWithCustomError( + this.cmtat, + 'CMTAT_ERC20BaseModule_TosValueslengthMismatch' + ) + }) - it("testCannotTransferBatchIfLengthMismatchTooManyAddresses", async function () { + it('testCannotTransferBatchIfLengthMismatchTooManyAddresses', async function () { // There are too many addresses const TOKEN_ADDRESS_TOS_INVALID = [ this.address1, this.address2, this.address1, - this.address1, - ]; - await expect(this.cmtat.connect(this.admin).transferBatch(TOKEN_ADDRESS_TOS_INVALID, TOKEN_AMOUNTS)) - .to.be.revertedWithCustomError(this.cmtat, 'CMTAT_ERC20BaseModule_TosValueslengthMismatch') - }); + this.address1 + ] + await expect( + this.cmtat + .connect(this.admin) + .transferBatch(TOKEN_ADDRESS_TOS_INVALID, TOKEN_AMOUNTS) + ).to.be.revertedWithCustomError( + this.cmtat, + 'CMTAT_ERC20BaseModule_TosValueslengthMismatch' + ) + }) - it("testCannotTransferBatchIfTOSIsEmpty", async function () { - const TOKEN_ADDRESS_TOS_INVALID = []; - await expect(this.cmtat.connect(this.admin).transferBatch(TOKEN_ADDRESS_TOS_INVALID, TOKEN_AMOUNTS)) - .to.be.revertedWithCustomError(this.cmtat, 'CMTAT_ERC20BaseModule_EmptyTos') - }); - }); + it('testCannotTransferBatchIfTOSIsEmpty', async function () { + const TOKEN_ADDRESS_TOS_INVALID = [] + await expect( + this.cmtat + .connect(this.admin) + .transferBatch(TOKEN_ADDRESS_TOS_INVALID, TOKEN_AMOUNTS) + ).to.be.revertedWithCustomError( + this.cmtat, + 'CMTAT_ERC20BaseModule_EmptyTos' + ) + }) + }) } -module.exports = ERC20BaseModuleCommon; +module.exports = ERC20BaseModuleCommon diff --git a/test/common/ERC20BurnModuleCommon.js b/test/common/ERC20BurnModuleCommon.js index e3dd16a3..dbd675cf 100644 --- a/test/common/ERC20BurnModuleCommon.js +++ b/test/common/ERC20BurnModuleCommon.js @@ -4,7 +4,7 @@ const { MINTER_ROLE, ZERO_ADDRESS } = require('../utils') -const { expect } = require('chai'); +const { expect } = require('chai') function ERC20BurnModuleCommon () { context('burn', function () { @@ -14,59 +14,70 @@ function ERC20BurnModuleCommon () { const DIFFERENCE = INITIAL_SUPPLY - VALUE1 beforeEach(async function () { - await this.cmtat.connect(this.admin).mint(this.address1, INITIAL_SUPPLY); - expect(await this.cmtat.totalSupply()).to.equal( - INITIAL_SUPPLY - ) + await this.cmtat.connect(this.admin).mint(this.address1, INITIAL_SUPPLY) + expect(await this.cmtat.totalSupply()).to.equal(INITIAL_SUPPLY) }) it('testCanBeBurntByAdmin', async function () { // Act // Burn 20 - this.logs = await this.cmtat.connect(this.admin).burn(this.address1, VALUE1, REASON) + this.logs = await this.cmtat + .connect(this.admin) + .burn(this.address1, VALUE1, REASON) // Assert // emits a Transfer event - await expect(this.logs).to.emit(this.cmtat, 'Transfer').withArgs( this.address1, ZERO_ADDRESS, VALUE1); + await expect(this.logs) + .to.emit(this.cmtat, 'Transfer') + .withArgs(this.address1, ZERO_ADDRESS, VALUE1) // Emits a Burn event - await expect(this.logs).to.emit(this.cmtat, 'Burn').withArgs( this.address1, VALUE1, REASON); + await expect(this.logs) + .to.emit(this.cmtat, 'Burn') + .withArgs(this.address1, VALUE1, REASON) // Check balances and total supply - expect(await this.cmtat.balanceOf(this.address1)).to.equal( - DIFFERENCE - ); + expect(await this.cmtat.balanceOf(this.address1)).to.equal(DIFFERENCE) expect(await this.cmtat.totalSupply()).to.equal(DIFFERENCE) // Burn 30 // Act - this.logs = await this.cmtat.connect(this.admin).burn(this.address1, DIFFERENCE, REASON) + this.logs = await this.cmtat + .connect(this.admin) + .burn(this.address1, DIFFERENCE, REASON) // Assert // Emits a Transfer event - await expect(this.logs).to.emit(this.cmtat, 'Transfer').withArgs( this.address1, ZERO_ADDRESS, DIFFERENCE); + await expect(this.logs) + .to.emit(this.cmtat, 'Transfer') + .withArgs(this.address1, ZERO_ADDRESS, DIFFERENCE) // Emits a Burn event - await expect(this.logs).to.emit(this.cmtat, 'Burn').withArgs( - this.address1, - DIFFERENCE, - REASON); + await expect(this.logs) + .to.emit(this.cmtat, 'Burn') + .withArgs(this.address1, DIFFERENCE, REASON) // Check balances and total supply - expect(await this.cmtat.balanceOf(this.address1)).to.equal(0n); + expect(await this.cmtat.balanceOf(this.address1)).to.equal(0n) expect(await this.cmtat.totalSupply()).to.equal(0n) }) it('testCanBeBurntByBurnerRole', async function () { // Arrange - await this.cmtat.connect(this.admin).grantRole(BURNER_ROLE, this.address2) + await this.cmtat + .connect(this.admin) + .grantRole(BURNER_ROLE, this.address2) // Act - this.logs = await this.cmtat.connect(this.address2).burn(this.address1, VALUE1, REASON); + this.logs = await this.cmtat + .connect(this.address2) + .burn(this.address1, VALUE1, REASON) // Assert - expect(await this.cmtat.balanceOf(this.address1)).to.equal( - DIFFERENCE - ); + expect(await this.cmtat.balanceOf(this.address1)).to.equal(DIFFERENCE) expect(await this.cmtat.totalSupply()).to.equal(DIFFERENCE) // Emits a Transfer event - await expect(this.logs).to.emit(this.cmtat, 'Transfer').withArgs( this.address1, ZERO_ADDRESS, VALUE1); + await expect(this.logs) + .to.emit(this.cmtat, 'Transfer') + .withArgs(this.address1, ZERO_ADDRESS, VALUE1) // Emits a Burn event - await expect(this.logs).to.emit(this.cmtat, 'Burn').withArgs( this.address1, VALUE1, REASON); + await expect(this.logs) + .to.emit(this.cmtat, 'Burn') + .withArgs(this.address1, VALUE1, REASON) }) it('testCannotBeBurntIfBalanceExceeds', async function () { @@ -74,15 +85,22 @@ function ERC20BurnModuleCommon () { const AMOUNT_TO_BURN = 200n const ADDRESS1_BALANCE = await this.cmtat.balanceOf(this.address1) // Act - await expect( this.cmtat.connect(this.admin).burn(this.address1, AMOUNT_TO_BURN, '')) - .to.be.revertedWithCustomError(this.cmtat, 'ERC20InsufficientBalance') - .withArgs(this.address1.address, ADDRESS1_BALANCE, AMOUNT_TO_BURN); + await expect( + this.cmtat.connect(this.admin).burn(this.address1, AMOUNT_TO_BURN, '') + ) + .to.be.revertedWithCustomError(this.cmtat, 'ERC20InsufficientBalance') + .withArgs(this.address1.address, ADDRESS1_BALANCE, AMOUNT_TO_BURN) }) it('testCannotBeBurntWithoutBurnerRole', async function () { - await expect( this.cmtat.connect(this.address2).burn(this.address1, 20n, '')) - .to.be.revertedWithCustomError(this.cmtat, 'AccessControlUnauthorizedAccount') - .withArgs(this.address2.address, BURNER_ROLE); + await expect( + this.cmtat.connect(this.address2).burn(this.address1, 20n, '') + ) + .to.be.revertedWithCustomError( + this.cmtat, + 'AccessControlUnauthorizedAccount' + ) + .withArgs(this.address2.address, BURNER_ROLE) }) }) @@ -91,41 +109,50 @@ function ERC20BurnModuleCommon () { const VALUE1 = 20n beforeEach(async function () { - await this.cmtat.connect(this.admin).mint(this.address1, INITIAL_SUPPLY); - expect(await this.cmtat.totalSupply()).to.equal( - INITIAL_SUPPLY - ) + await this.cmtat.connect(this.admin).mint(this.address1, INITIAL_SUPPLY) + expect(await this.cmtat.totalSupply()).to.equal(INITIAL_SUPPLY) }) it('canBeBurnFrom', async function () { // Arrange const AMOUNT_TO_BURN = 20n - await this.cmtat.connect(this.admin).grantRole(BURNER_FROM_ROLE, this.address2) + await this.cmtat + .connect(this.admin) + .grantRole(BURNER_FROM_ROLE, this.address2) await this.cmtat.connect(this.address1).approve(this.address2, 50n) // Act - this.logs = await this.cmtat.connect(this.address2).burnFrom(this.address1, AMOUNT_TO_BURN) + this.logs = await this.cmtat + .connect(this.address2) + .burnFrom(this.address1, AMOUNT_TO_BURN) // Assert await expect(this.logs) - .to.emit(this.cmtat, "Transfer") - .withArgs(this.address1, ZERO_ADDRESS, AMOUNT_TO_BURN); + .to.emit(this.cmtat, 'Transfer') + .withArgs(this.address1, ZERO_ADDRESS, AMOUNT_TO_BURN) await expect(this.logs) - .to.emit(this.cmtat, "BurnFrom") - .withArgs(this.address1, this.address2, AMOUNT_TO_BURN); - expect(await this.cmtat.balanceOf(this.address1)).to.equal(30n); + .to.emit(this.cmtat, 'BurnFrom') + .withArgs(this.address1, this.address2, AMOUNT_TO_BURN) + expect(await this.cmtat.balanceOf(this.address1)).to.equal(30n) expect(await this.cmtat.totalSupply()).to.equal(30n) }) it('TestCannotBeBurnWithoutAllowance', async function () { const AMOUNT_TO_BURN = 20n - await expect( this.cmtat.connect(this.admin).burnFrom(this.address1, AMOUNT_TO_BURN)) - .to.be.revertedWithCustomError(this.cmtat, 'ERC20InsufficientAllowance') - .withArgs(this.admin.address, 0, AMOUNT_TO_BURN); + await expect( + this.cmtat.connect(this.admin).burnFrom(this.address1, AMOUNT_TO_BURN) + ) + .to.be.revertedWithCustomError(this.cmtat, 'ERC20InsufficientAllowance') + .withArgs(this.admin.address, 0, AMOUNT_TO_BURN) }) it('testCannotBeBurntWithoutBurnerFromRole', async function () { - await expect( this.cmtat.connect(this.address2).burnFrom(this.address1, 20n)) - .to.be.revertedWithCustomError(this.cmtat, 'AccessControlUnauthorizedAccount') - .withArgs(this.address2.address, BURNER_FROM_ROLE); + await expect( + this.cmtat.connect(this.address2).burnFrom(this.address1, 20n) + ) + .to.be.revertedWithCustomError( + this.cmtat, + 'AccessControlUnauthorizedAccount' + ) + .withArgs(this.address2.address, BURNER_FROM_ROLE) }) }) @@ -134,49 +161,53 @@ function ERC20BurnModuleCommon () { const VALUE1 = 20n beforeEach(async function () { - await this.cmtat.connect(this.admin).mint(this.address1, INITIAL_SUPPLY); - expect(await this.cmtat.totalSupply()).to.equal( - INITIAL_SUPPLY - ) + await this.cmtat.connect(this.admin).mint(this.address1, INITIAL_SUPPLY) + expect(await this.cmtat.totalSupply()).to.equal(INITIAL_SUPPLY) }) it('canBeBurnAndMit', async function () { // Arrange const AMOUNT_TO_BURN = 20n const AMOUNT_TO_MINT = 15n - await this.cmtat.connect(this.admin).grantRole(BURNER_ROLE, this.address2) - await this.cmtat.connect(this.admin).grantRole(MINTER_ROLE, this.address2) + await this.cmtat + .connect(this.admin) + .grantRole(BURNER_ROLE, this.address2) + await this.cmtat + .connect(this.admin) + .grantRole(MINTER_ROLE, this.address2) // Act - this.logs = await this.cmtat.connect(this.address2).burnAndMint( - this.address1, - this.address3, - AMOUNT_TO_BURN, - AMOUNT_TO_MINT, - 'recovery' - ) + this.logs = await this.cmtat + .connect(this.address2) + .burnAndMint( + this.address1, + this.address3, + AMOUNT_TO_BURN, + AMOUNT_TO_MINT, + 'recovery' + ) // Assert await expect(this.logs) - .to.emit(this.cmtat, "Transfer") - .withArgs(this.address1, ZERO_ADDRESS, AMOUNT_TO_BURN); + .to.emit(this.cmtat, 'Transfer') + .withArgs(this.address1, ZERO_ADDRESS, AMOUNT_TO_BURN) await expect(this.logs) - .to.emit(this.cmtat, "Transfer") - .withArgs(ZERO_ADDRESS,this.address3,AMOUNT_TO_MINT); + .to.emit(this.cmtat, 'Transfer') + .withArgs(ZERO_ADDRESS, this.address3, AMOUNT_TO_MINT) await expect(this.logs) - .to.emit(this.cmtat, "Burn") - .withArgs(this.address1, AMOUNT_TO_BURN, 'recovery'); + .to.emit(this.cmtat, 'Burn') + .withArgs(this.address1, AMOUNT_TO_BURN, 'recovery') await expect(this.logs) - .to.emit(this.cmtat, "Mint") - .withArgs(this.address3, AMOUNT_TO_MINT); + .to.emit(this.cmtat, 'Mint') + .withArgs(this.address3, AMOUNT_TO_MINT) expect(await this.cmtat.balanceOf(this.address1)).to.equal( INITIAL_SUPPLY - AMOUNT_TO_BURN - ); + ) expect(await this.cmtat.balanceOf(this.address3)).to.equal( AMOUNT_TO_MINT - ); + ) expect(await this.cmtat.totalSupply()).to.equal( INITIAL_SUPPLY - AMOUNT_TO_BURN + AMOUNT_TO_MINT ) @@ -186,34 +217,52 @@ function ERC20BurnModuleCommon () { // Arrange const AMOUNT_TO_BURN = 20n const AMOUNT_TO_MINT = 15n - await this.cmtat.connect(this.admin).grantRole(BURNER_ROLE, this.address2) + await this.cmtat + .connect(this.admin) + .grantRole(BURNER_ROLE, this.address2) // Act - await expect( this.cmtat.connect(this.address2).burnAndMint( - this.address1, - this.address3, - AMOUNT_TO_BURN, - AMOUNT_TO_MINT, - 'recovery' - )) - .to.be.revertedWithCustomError(this.cmtat, 'AccessControlUnauthorizedAccount') - .withArgs(this.address2.address, MINTER_ROLE); + await expect( + this.cmtat + .connect(this.address2) + .burnAndMint( + this.address1, + this.address3, + AMOUNT_TO_BURN, + AMOUNT_TO_MINT, + 'recovery' + ) + ) + .to.be.revertedWithCustomError( + this.cmtat, + 'AccessControlUnauthorizedAccount' + ) + .withArgs(this.address2.address, MINTER_ROLE) }) it('canBeBurnAndMintWithoutBurnerRole', async function () { // Arrange const AMOUNT_TO_BURN = 20n const AMOUNT_TO_MINT = 15n - await this.cmtat.connect(this.admin).grantRole(MINTER_ROLE, this.address2) + await this.cmtat + .connect(this.admin) + .grantRole(MINTER_ROLE, this.address2) // Assert - await expect( this.cmtat.connect(this.address2).burnAndMint( - this.address1, - this.address3, - AMOUNT_TO_BURN, - AMOUNT_TO_MINT, - 'recovery' - )) - .to.be.revertedWithCustomError(this.cmtat, 'AccessControlUnauthorizedAccount') - .withArgs(this.address2.address, BURNER_ROLE); + await expect( + this.cmtat + .connect(this.address2) + .burnAndMint( + this.address1, + this.address3, + AMOUNT_TO_BURN, + AMOUNT_TO_MINT, + 'recovery' + ) + ) + .to.be.revertedWithCustomError( + this.cmtat, + 'AccessControlUnauthorizedAccount' + ) + .withArgs(this.address2.address, BURNER_ROLE) }) }) @@ -225,36 +274,31 @@ function ERC20BurnModuleCommon () { }) const TOKEN_BY_HOLDERS_TO_BURN = [5, 50, 500] const TOKEN_BALANCE_BY_HOLDERS_AFTER_BURN = [ - TOKEN_SUPPLY_BY_HOLDERS[0] - (TOKEN_BY_HOLDERS_TO_BURN[0]), - TOKEN_SUPPLY_BY_HOLDERS[1] - (TOKEN_BY_HOLDERS_TO_BURN[1]), - TOKEN_SUPPLY_BY_HOLDERS[2] - (TOKEN_BY_HOLDERS_TO_BURN[2]) + TOKEN_SUPPLY_BY_HOLDERS[0] - TOKEN_BY_HOLDERS_TO_BURN[0], + TOKEN_SUPPLY_BY_HOLDERS[1] - TOKEN_BY_HOLDERS_TO_BURN[1], + TOKEN_SUPPLY_BY_HOLDERS[2] - TOKEN_BY_HOLDERS_TO_BURN[2] ] - const TOTAL_SUPPLY_AFTER_BURN = INITIAL_SUPPLY - ( + const TOTAL_SUPPLY_AFTER_BURN = + INITIAL_SUPPLY - TOKEN_BY_HOLDERS_TO_BURN.reduce((a, b) => { return a + b }) - ) beforeEach(async function () { const TOKEN_HOLDER = [this.admin, this.address1, this.address2]; - ({ logs: this.logs1 } = await this.cmtat.connect(this.admin).mintBatch( - TOKEN_HOLDER, - TOKEN_SUPPLY_BY_HOLDERS - )); - expect(await this.cmtat.totalSupply()).to.equal( - INITIAL_SUPPLY - ) + ({ logs: this.logs1 } = await this.cmtat + .connect(this.admin) + .mintBatch(TOKEN_HOLDER, TOKEN_SUPPLY_BY_HOLDERS)) + expect(await this.cmtat.totalSupply()).to.equal(INITIAL_SUPPLY) }) it('testCanBeBurntBatchByAdmin', async function () { const TOKEN_HOLDER = [this.admin, this.address1, this.address2] // Act // Burn - this.logs = await this.cmtat.connect(this.admin).burnBatch( - TOKEN_HOLDER, - TOKEN_BY_HOLDERS_TO_BURN, - REASON, - ) + this.logs = await this.cmtat + .connect(this.admin) + .burnBatch(TOKEN_HOLDER, TOKEN_BY_HOLDERS_TO_BURN, REASON) // Assert // emits a Transfer event // Assert event @@ -262,15 +306,15 @@ function ERC20BurnModuleCommon () { for (let i = 0; i < TOKEN_HOLDER.length; ++i) { // emits a Transfer event await expect(this.logs) - .to.emit(this.cmtat, "Transfer") - .withArgs(TOKEN_HOLDER[i], ZERO_ADDRESS, TOKEN_BY_HOLDERS_TO_BURN[i]); + .to.emit(this.cmtat, 'Transfer') + .withArgs(TOKEN_HOLDER[i], ZERO_ADDRESS, TOKEN_BY_HOLDERS_TO_BURN[i]) } for (let i = 0; i < TOKEN_HOLDER.length; ++i) { // emits a Burn event await expect(this.logs) - .to.emit(this.cmtat, "Burn") - .withArgs(TOKEN_HOLDER[i], TOKEN_BY_HOLDERS_TO_BURN[i], REASON); + .to.emit(this.cmtat, 'Burn') + .withArgs(TOKEN_HOLDER[i], TOKEN_BY_HOLDERS_TO_BURN[i], REASON) } // Check balances and total supply // Assert @@ -280,39 +324,37 @@ function ERC20BurnModuleCommon () { ) } - expect(await this.cmtat.totalSupply()).to.equal( - TOTAL_SUPPLY_AFTER_BURN - ) + expect(await this.cmtat.totalSupply()).to.equal(TOTAL_SUPPLY_AFTER_BURN) }) it('testCanBeBurntBatchByBurnerRole', async function () { const TOKEN_HOLDER = [this.admin, this.address1, this.address2] // Arrange - await this.cmtat.connect(this.admin).grantRole(BURNER_ROLE, this.address2) + await this.cmtat + .connect(this.admin) + .grantRole(BURNER_ROLE, this.address2) // Act // Burn - this.logs = await this.cmtat.connect(this.address2).burnBatch( - TOKEN_HOLDER, - TOKEN_BY_HOLDERS_TO_BURN, - REASON - ) + this.logs = await this.cmtat + .connect(this.address2) + .burnBatch(TOKEN_HOLDER, TOKEN_BY_HOLDERS_TO_BURN, REASON) // Assert // emits a Transfer event for (let i = 0; i < TOKEN_HOLDER.length; ++i) { // emits a transfer event await expect(this.logs) - .to.emit(this.cmtat, "Transfer") - .withArgs(TOKEN_HOLDER[i], ZERO_ADDRESS, TOKEN_BY_HOLDERS_TO_BURN[i]); - }; + .to.emit(this.cmtat, 'Transfer') + .withArgs(TOKEN_HOLDER[i], ZERO_ADDRESS, TOKEN_BY_HOLDERS_TO_BURN[i]) + } for (let i = 0; i < TOKEN_HOLDER.length; ++i) { - // emits a burn + // emits a burn await expect(this.logs) - .to.emit(this.cmtat, "Burn") - .withArgs(TOKEN_HOLDER[i], TOKEN_BY_HOLDERS_TO_BURN[i], REASON); + .to.emit(this.cmtat, 'Burn') + .withArgs(TOKEN_HOLDER[i], TOKEN_BY_HOLDERS_TO_BURN[i], REASON) } // Check balances and total supply // Assert @@ -322,9 +364,7 @@ function ERC20BurnModuleCommon () { ) } - expect(await this.cmtat.totalSupply()).to.equal( - TOTAL_SUPPLY_AFTER_BURN - ) + expect(await this.cmtat.totalSupply()).to.equal(TOTAL_SUPPLY_AFTER_BURN) }) it('testCannotBeBurntBatchIfOneBalanceExceeds', async function () { @@ -332,48 +372,78 @@ function ERC20BurnModuleCommon () { const TOKEN_BY_HOLDERS_TO_BURN_FAIL = [5n, 50n, 5000000n] const ADDRESS2_BALANCE = await this.cmtat.balanceOf(this.address2) // Act - await expect( this.cmtat.connect(this.admin).burnBatch(TOKEN_HOLDER, TOKEN_BY_HOLDERS_TO_BURN_FAIL, '')) - .to.be.revertedWithCustomError(this.cmtat, 'ERC20InsufficientBalance') - .withArgs(this.address2.address, ADDRESS2_BALANCE, TOKEN_BY_HOLDERS_TO_BURN_FAIL[2]); + await expect( + this.cmtat + .connect(this.admin) + .burnBatch(TOKEN_HOLDER, TOKEN_BY_HOLDERS_TO_BURN_FAIL, '') + ) + .to.be.revertedWithCustomError(this.cmtat, 'ERC20InsufficientBalance') + .withArgs( + this.address2.address, + ADDRESS2_BALANCE, + TOKEN_BY_HOLDERS_TO_BURN_FAIL[2] + ) }) it('testCannotBeBurntBatchWithoutBurnerRole', async function () { const TOKEN_HOLDER = [this.admin, this.address1, this.address2] - await expect( this.cmtat.connect(this.address2).burnBatch(TOKEN_HOLDER, TOKEN_BY_HOLDERS_TO_BURN, '')) - .to.be.revertedWithCustomError(this.cmtat, 'AccessControlUnauthorizedAccount') - .withArgs(this.address2.address, BURNER_ROLE); + await expect( + this.cmtat + .connect(this.address2) + .burnBatch(TOKEN_HOLDER, TOKEN_BY_HOLDERS_TO_BURN, '') + ) + .to.be.revertedWithCustomError( + this.cmtat, + 'AccessControlUnauthorizedAccount' + ) + .withArgs(this.address2.address, BURNER_ROLE) }) it('testCannotburnBatchIfLengthMismatchMissingAddresses', async function () { // Number of addresses is insufficient const TOKEN_HOLDER_INVALID = [this.admin, this.address1] - await expect(this.cmtat.connect(this.admin).burnBatch( - TOKEN_HOLDER_INVALID, - TOKEN_BY_HOLDERS_TO_BURN, - REASON - )) - .to.be.revertedWithCustomError(this.cmtat, 'CMTAT_BurnModule_AccountsValueslengthMismatch') + await expect( + this.cmtat + .connect(this.admin) + .burnBatch(TOKEN_HOLDER_INVALID, TOKEN_BY_HOLDERS_TO_BURN, REASON) + ).to.be.revertedWithCustomError( + this.cmtat, + 'CMTAT_BurnModule_AccountsValueslengthMismatch' + ) }) it('testCannotburnBatchIfLengthMismatchTooManyAddresses', async function () { // There are too many addresses - const TOKEN_HOLDER_INVALID = [this.admin, this.address1, this.address1, this.address1] - await expect(this.cmtat.connect(this.admin).burnBatch( - TOKEN_HOLDER_INVALID, - TOKEN_BY_HOLDERS_TO_BURN, - REASON - )) - .to.be.revertedWithCustomError(this.cmtat, 'CMTAT_BurnModule_AccountsValueslengthMismatch') + const TOKEN_HOLDER_INVALID = [ + this.admin, + this.address1, + this.address1, + this.address1 + ] + await expect( + this.cmtat + .connect(this.admin) + .burnBatch(TOKEN_HOLDER_INVALID, TOKEN_BY_HOLDERS_TO_BURN, REASON) + ).to.be.revertedWithCustomError( + this.cmtat, + 'CMTAT_BurnModule_AccountsValueslengthMismatch' + ) }) it('testCannotburnBatchIfAccountsIsEmpty', async function () { const TOKEN_ADDRESS_TOS_INVALID = [] - await expect(this.cmtat.connect(this.admin).burnBatch( - TOKEN_ADDRESS_TOS_INVALID, - TOKEN_BY_HOLDERS_TO_BURN, - REASON - )) - .to.be.revertedWithCustomError(this.cmtat, 'CMTAT_BurnModule_EmptyAccounts') + await expect( + this.cmtat + .connect(this.admin) + .burnBatch( + TOKEN_ADDRESS_TOS_INVALID, + TOKEN_BY_HOLDERS_TO_BURN, + REASON + ) + ).to.be.revertedWithCustomError( + this.cmtat, + 'CMTAT_BurnModule_EmptyAccounts' + ) }) }) } diff --git a/test/common/ERC20MintModuleCommon.js b/test/common/ERC20MintModuleCommon.js index a51b6a6b..e222a9ab 100644 --- a/test/common/ERC20MintModuleCommon.js +++ b/test/common/ERC20MintModuleCommon.js @@ -1,235 +1,258 @@ -const { expect } = require('chai'); -const { ZERO_ADDRESS, MINTER_ROLE } = require("../utils.js"); +const { expect } = require('chai') +const { ZERO_ADDRESS, MINTER_ROLE } = require('../utils.js') -function ERC20MintModuleCommon() { - context("Minting", function () { - const VALUE1 = 20n; - const VALUE2 = 50n; +function ERC20MintModuleCommon () { + context('Minting', function () { + const VALUE1 = 20n + const VALUE2 = 50n /** The admin is assigned the MINTER role when the contract is deployed */ - it("testCanBeMintedByAdmin", async function () { + it('testCanBeMintedByAdmin', async function () { // Arrange // Arrange - Assert // Check first balance - expect(await this.cmtat.balanceOf(this.admin)).to.equal(0n); + expect(await this.cmtat.balanceOf(this.admin)).to.equal(0n) // Act // Issue 20 and check balances and total supply this.logs = await this.cmtat .connect(this.admin) - .mint(this.address1, VALUE1); + .mint(this.address1, VALUE1) // Assert - expect(await this.cmtat.balanceOf(this.address1)).to.equal(VALUE1); - expect(await this.cmtat.totalSupply()).to.equal(VALUE1); + expect(await this.cmtat.balanceOf(this.address1)).to.equal(VALUE1) + expect(await this.cmtat.totalSupply()).to.equal(VALUE1) // Assert event // emits a Transfer event await expect(this.logs) - .to.emit(this.cmtat, "Transfer") - .withArgs(ZERO_ADDRESS, this.address1, VALUE1); + .to.emit(this.cmtat, 'Transfer') + .withArgs(ZERO_ADDRESS, this.address1, VALUE1) // emits a Mint event await expect(this.logs) - .to.emit(this.cmtat, "Mint") - .withArgs(this.address1, VALUE1); + .to.emit(this.cmtat, 'Mint') + .withArgs(this.address1, VALUE1) // Act // Issue 50 and check intermediate balances and total supply this.logs = await this.cmtat .connect(this.admin) - .mint(this.address2, VALUE2); + .mint(this.address2, VALUE2) // Assert - expect(await this.cmtat.balanceOf(this.address2)).to.equal(VALUE2); - expect(await this.cmtat.totalSupply()).to.equal(VALUE1 + VALUE2); + expect(await this.cmtat.balanceOf(this.address2)).to.equal(VALUE2) + expect(await this.cmtat.totalSupply()).to.equal(VALUE1 + VALUE2) // Assert event // emits a Transfer event await expect(this.logs) - .to.emit(this.cmtat, "Transfer") - .withArgs(ZERO_ADDRESS, this.address2, VALUE2); + .to.emit(this.cmtat, 'Transfer') + .withArgs(ZERO_ADDRESS, this.address2, VALUE2) // emits a Mint event await expect(this.logs) - .to.emit(this.cmtat, "Mint") - .withArgs(this.address2, VALUE2); - }); + .to.emit(this.cmtat, 'Mint') + .withArgs(this.address2, VALUE2) + }) - it("testCanMintByANewMinter", async function () { + it('testCanMintByANewMinter', async function () { // Arrange await this.cmtat .connect(this.admin) - .grantRole(MINTER_ROLE, this.address1); + .grantRole(MINTER_ROLE, this.address1) // Arrange - Assert // Check first balance - expect(await this.cmtat.balanceOf(this.admin)).to.equal(0n); + expect(await this.cmtat.balanceOf(this.admin)).to.equal(0n) // Act // Issue 20 this.logs = await this.cmtat .connect(this.address1) - .mint(this.address1, VALUE1); + .mint(this.address1, VALUE1) // Assert // Check balances and total supply - expect(await this.cmtat.balanceOf(this.address1)).to.equal(VALUE1); - expect(await this.cmtat.totalSupply()).to.equal(VALUE1); + expect(await this.cmtat.balanceOf(this.address1)).to.equal(VALUE1) + expect(await this.cmtat.totalSupply()).to.equal(VALUE1) // Assert event // emits a Transfer event await expect(this.logs) - .to.emit(this.cmtat, "Transfer") - .withArgs(ZERO_ADDRESS, this.address1, VALUE1); + .to.emit(this.cmtat, 'Transfer') + .withArgs(ZERO_ADDRESS, this.address1, VALUE1) // emits a Mint event await expect(this.logs) - .to.emit(this.cmtat, "Mint") - .withArgs(this.address1, VALUE1); - }); + .to.emit(this.cmtat, 'Mint') + .withArgs(this.address1, VALUE1) + }) // reverts when issuing by a non minter - it("testCannotMintByNonMinter", async function () { - await expect( this.cmtat.connect(this.address1).mint(this.address1, VALUE1)) - .to.be.revertedWithCustomError(this.cmtat, 'AccessControlUnauthorizedAccount') - .withArgs(this.address1.address, MINTER_ROLE); - }); - }); + it('testCannotMintByNonMinter', async function () { + await expect( + this.cmtat.connect(this.address1).mint(this.address1, VALUE1) + ) + .to.be.revertedWithCustomError( + this.cmtat, + 'AccessControlUnauthorizedAccount' + ) + .withArgs(this.address1.address, MINTER_ROLE) + }) + }) - context("Batch Minting", function () { - const TOKEN_SUPPLY_BY_HOLDERS = [10n, 100n, 1000n]; + context('Batch Minting', function () { + const TOKEN_SUPPLY_BY_HOLDERS = [10n, 100n, 1000n] /** - * The admin is assigned the MINTER role when the contract is deployed - */ - it("testCanBeMintedBatchByAdmin", async function () { - const TOKEN_HOLDER = [this.admin, this.address1, this.address2]; + * The admin is assigned the MINTER role when the contract is deployed + */ + it('testCanBeMintedBatchByAdmin', async function () { + const TOKEN_HOLDER = [this.admin, this.address1, this.address2] // Arrange - Assert // Check first balance for (let i = 0; i < TOKEN_HOLDER.length; ++i) { - expect(await this.cmtat.balanceOf(TOKEN_HOLDER[i])).to.equal(0n); + expect(await this.cmtat.balanceOf(TOKEN_HOLDER[i])).to.equal(0n) } // Act // Issue 20 and check balances and total supply - this.logs = await this.cmtat.connect(this.admin).mintBatch(TOKEN_HOLDER, TOKEN_SUPPLY_BY_HOLDERS); + this.logs = await this.cmtat + .connect(this.admin) + .mintBatch(TOKEN_HOLDER, TOKEN_SUPPLY_BY_HOLDERS) // Assert for (let i = 0; i < TOKEN_HOLDER.length; ++i) { expect(await this.cmtat.balanceOf(TOKEN_HOLDER[i])).to.equal( TOKEN_SUPPLY_BY_HOLDERS[i] - ); + ) } expect(await this.cmtat.totalSupply()).to.equal( TOKEN_SUPPLY_BY_HOLDERS.reduce((a, b) => { - return a + b; + return a + b }) - ); + ) // Assert event // emits a Transfer event for (let i = 0; i < TOKEN_HOLDER.length; ++i) { await expect(this.logs) - .to.emit(this.cmtat, "Transfer") - .withArgs(ZERO_ADDRESS, TOKEN_HOLDER[i], TOKEN_SUPPLY_BY_HOLDERS[i]); + .to.emit(this.cmtat, 'Transfer') + .withArgs(ZERO_ADDRESS, TOKEN_HOLDER[i], TOKEN_SUPPLY_BY_HOLDERS[i]) } for (let i = 0; i < TOKEN_HOLDER.length; ++i) { // emits a Mint event await expect(this.logs) - .to.emit(this.cmtat, "Mint") - .withArgs(TOKEN_HOLDER[i], TOKEN_SUPPLY_BY_HOLDERS[i]); + .to.emit(this.cmtat, 'Mint') + .withArgs(TOKEN_HOLDER[i], TOKEN_SUPPLY_BY_HOLDERS[i]) } - }); + }) - it("testCanBeMinteBatchdByANewMinter", async function () { + it('testCanBeMinteBatchdByANewMinter', async function () { // Arrange await this.cmtat .connect(this.admin) - .grantRole(MINTER_ROLE, this.address1); - const TOKEN_HOLDER = [this.admin, this.address1, this.address2]; - const TOKEN_SUPPLY_BY_HOLDERS = [10n, 100n, 1000n]; + .grantRole(MINTER_ROLE, this.address1) + const TOKEN_HOLDER = [this.admin, this.address1, this.address2] + const TOKEN_SUPPLY_BY_HOLDERS = [10n, 100n, 1000n] // Arrange - Assert // Check first balance for (let i = 0; i < TOKEN_HOLDER.length; ++i) { - expect(await this.cmtat.balanceOf(TOKEN_HOLDER[i])).to.equal(0n); + expect(await this.cmtat.balanceOf(TOKEN_HOLDER[i])).to.equal(0n) } // Act // Issue 20 and check balances and total supply this.logs = await this.cmtat .connect(this.address1) - .mintBatch(TOKEN_HOLDER, TOKEN_SUPPLY_BY_HOLDERS); + .mintBatch(TOKEN_HOLDER, TOKEN_SUPPLY_BY_HOLDERS) // Assert for (let i = 0; i < TOKEN_HOLDER.length; ++i) { expect(await this.cmtat.balanceOf(TOKEN_HOLDER[i])).to.equal( TOKEN_SUPPLY_BY_HOLDERS[i] - ); + ) } expect(await this.cmtat.totalSupply()).to.equal( TOKEN_SUPPLY_BY_HOLDERS.reduce((a, b) => { - return a+b; + return a + b }) - ); + ) // Assert event // emits a Transfer event for (let i = 0; i < TOKEN_HOLDER.length; ++i) { await expect(this.logs) - .to.emit(this.cmtat, "Transfer") - .withArgs(ZERO_ADDRESS, TOKEN_HOLDER[i], TOKEN_SUPPLY_BY_HOLDERS[i]); + .to.emit(this.cmtat, 'Transfer') + .withArgs(ZERO_ADDRESS, TOKEN_HOLDER[i], TOKEN_SUPPLY_BY_HOLDERS[i]) } // emits a Mint event for (let i = 0; i < TOKEN_HOLDER.length; ++i) { await expect(this.logs) - .to.emit(this.cmtat, "Mint") - .withArgs(TOKEN_HOLDER[i], TOKEN_SUPPLY_BY_HOLDERS[i]); + .to.emit(this.cmtat, 'Mint') + .withArgs(TOKEN_HOLDER[i], TOKEN_SUPPLY_BY_HOLDERS[i]) } - }); + }) - it("testCannotMintBatchByNonMinter", async function () { - const TOKEN_HOLDER = [this.admin, this.address1, this.address2]; - const TOKEN_SUPPLY_BY_HOLDERS = [10n, 100n, 1000n]; - await expect( this.cmtat - .connect(this.address1) - .mintBatch(TOKEN_HOLDER, TOKEN_SUPPLY_BY_HOLDERS)) - .to.be.revertedWithCustomError(this.cmtat, 'AccessControlUnauthorizedAccount') - .withArgs(this.address1.address, MINTER_ROLE); - }); + it('testCannotMintBatchByNonMinter', async function () { + const TOKEN_HOLDER = [this.admin, this.address1, this.address2] + const TOKEN_SUPPLY_BY_HOLDERS = [10n, 100n, 1000n] + await expect( + this.cmtat + .connect(this.address1) + .mintBatch(TOKEN_HOLDER, TOKEN_SUPPLY_BY_HOLDERS) + ) + .to.be.revertedWithCustomError( + this.cmtat, + 'AccessControlUnauthorizedAccount' + ) + .withArgs(this.address1.address, MINTER_ROLE) + }) - it("testCannotMintBatchIfLengthMismatchMissingAddresses", async function () { + it('testCannotMintBatchIfLengthMismatchMissingAddresses', async function () { // Number of addresses is insufficient - const TOKEN_HOLDER_INVALID = [this.admin, this.address1]; - const TOKEN_SUPPLY_BY_HOLDERS = [10n, 100n, 1000n]; - await expect( this.cmtat - .connect(this.admin) - .mintBatch(TOKEN_HOLDER_INVALID, TOKEN_SUPPLY_BY_HOLDERS)) - .to.be.revertedWithCustomError(this.cmtat, 'CMTAT_MintModule_AccountsValueslengthMismatch') - }); + const TOKEN_HOLDER_INVALID = [this.admin, this.address1] + const TOKEN_SUPPLY_BY_HOLDERS = [10n, 100n, 1000n] + await expect( + this.cmtat + .connect(this.admin) + .mintBatch(TOKEN_HOLDER_INVALID, TOKEN_SUPPLY_BY_HOLDERS) + ).to.be.revertedWithCustomError( + this.cmtat, + 'CMTAT_MintModule_AccountsValueslengthMismatch' + ) + }) - it("testCannotMintBatchIfLengthMismatchTooManyAddresses", async function () { + it('testCannotMintBatchIfLengthMismatchTooManyAddresses', async function () { // There are too many addresses const TOKEN_HOLDER_INVALID = [ this.admin, this.address1, this.address1, - this.address1, - ]; - const TOKEN_SUPPLY_BY_HOLDERS = [10n, 100n, 1000n]; - await expect( this.cmtat - .connect(this.admin) - .mintBatch(TOKEN_HOLDER_INVALID, TOKEN_SUPPLY_BY_HOLDERS)) - .to.be.revertedWithCustomError(this.cmtat, 'CMTAT_MintModule_AccountsValueslengthMismatch') - }); - - it("testCannotMintBatchIfTOSIsEmpty", async function () { - const TOKEN_HOLDER_INVALID = []; - const TOKEN_SUPPLY_BY_HOLDERS = []; - await expect( this.cmtat - .connect(this.admin) - .mintBatch(TOKEN_HOLDER_INVALID, TOKEN_SUPPLY_BY_HOLDERS)) - .to.be.revertedWithCustomError(this.cmtat, 'CMTAT_MintModule_EmptyAccounts') + this.address1 + ] + const TOKEN_SUPPLY_BY_HOLDERS = [10n, 100n, 1000n] + await expect( + this.cmtat + .connect(this.admin) + .mintBatch(TOKEN_HOLDER_INVALID, TOKEN_SUPPLY_BY_HOLDERS) + ).to.be.revertedWithCustomError( + this.cmtat, + 'CMTAT_MintModule_AccountsValueslengthMismatch' + ) + }) - }); - }); + it('testCannotMintBatchIfTOSIsEmpty', async function () { + const TOKEN_HOLDER_INVALID = [] + const TOKEN_SUPPLY_BY_HOLDERS = [] + await expect( + this.cmtat + .connect(this.admin) + .mintBatch(TOKEN_HOLDER_INVALID, TOKEN_SUPPLY_BY_HOLDERS) + ).to.be.revertedWithCustomError( + this.cmtat, + 'CMTAT_MintModule_EmptyAccounts' + ) + }) + }) } -module.exports = ERC20MintModuleCommon; +module.exports = ERC20MintModuleCommon diff --git a/test/common/ERC20SnapshotModuleCommon/ERC20SnapshotModuleCommonGetNextSnapshot.js b/test/common/ERC20SnapshotModuleCommon/ERC20SnapshotModuleCommonGetNextSnapshot.js index c0c811d1..09d063de 100644 --- a/test/common/ERC20SnapshotModuleCommon/ERC20SnapshotModuleCommonGetNextSnapshot.js +++ b/test/common/ERC20SnapshotModuleCommon/ERC20SnapshotModuleCommonGetNextSnapshot.js @@ -1,5 +1,5 @@ -const { time } = require ("@nomicfoundation/hardhat-network-helpers"); -const { expect } = require('chai'); +const { time } = require('@nomicfoundation/hardhat-network-helpers') +const { expect } = require('chai') const { checkArraySnapshot } = require('./ERC20SnapshotModuleUtils/ERC20SnapshotModuleUtils') diff --git a/test/common/ERC20SnapshotModuleCommon/ERC20SnapshotModuleCommonRescheduling.js b/test/common/ERC20SnapshotModuleCommon/ERC20SnapshotModuleCommonRescheduling.js index ef51825c..87b13c09 100644 --- a/test/common/ERC20SnapshotModuleCommon/ERC20SnapshotModuleCommonRescheduling.js +++ b/test/common/ERC20SnapshotModuleCommon/ERC20SnapshotModuleCommonRescheduling.js @@ -1,5 +1,5 @@ -const { time } = require ("@nomicfoundation/hardhat-network-helpers"); -const { expect } = require('chai'); +const { time } = require('@nomicfoundation/hardhat-network-helpers') +const { expect } = require('chai') const { SNAPSHOOTER_ROLE } = require('../../utils') const { checkArraySnapshot @@ -15,35 +15,35 @@ function ERC20SnapshotModuleCommonRescheduling () { }) it('can reschedule a snapshot with the snapshoter role and emits a SnapshotSchedule event', async function () { - this.logs = await this.cmtat.connect(this.admin).rescheduleSnapshot( - this.snapshotTime, - this.newSnapshotTime - ) + this.logs = await this.cmtat + .connect(this.admin) + .rescheduleSnapshot(this.snapshotTime, this.newSnapshotTime) await expect(this.logs) - .to.emit(this.cmtat, "SnapshotSchedule") - .withArgs(this.snapshotTime, this.newSnapshotTime); + .to.emit(this.cmtat, 'SnapshotSchedule') + .withArgs(this.snapshotTime, this.newSnapshotTime) const snapshots = await this.cmtat.getNextSnapshots() expect(snapshots.length).to.equal(1) expect(snapshots[0]).to.equal(this.newSnapshotTime) }) it('can reschedule a snapshot between a range of snapshot', async function () { - const SNAPSHOT_MIDDLE_OLD_TIME = this.snapshotTime + - time.duration.seconds(30) - const SNAPSHOT_MIDDLE_NEW_TIME = this.snapshotTime + - time.duration.seconds(40) + const SNAPSHOT_MIDDLE_OLD_TIME = + this.snapshotTime + time.duration.seconds(30) + const SNAPSHOT_MIDDLE_NEW_TIME = + this.snapshotTime + time.duration.seconds(40) const FIRST_SNAPSHOT = this.snapshotTime + time.duration.seconds(60) const SECOND_SNAPSHOT = this.snapshotTime + time.duration.seconds(90) - await this.cmtat.connect(this.admin).scheduleSnapshot(SNAPSHOT_MIDDLE_OLD_TIME) + await this.cmtat + .connect(this.admin) + .scheduleSnapshot(SNAPSHOT_MIDDLE_OLD_TIME) await this.cmtat.connect(this.admin).scheduleSnapshot(FIRST_SNAPSHOT) await this.cmtat.connect(this.admin).scheduleSnapshot(SECOND_SNAPSHOT) - this.logs = await this.cmtat.connect(this.admin).rescheduleSnapshot( - SNAPSHOT_MIDDLE_OLD_TIME, - SNAPSHOT_MIDDLE_NEW_TIME - ) + this.logs = await this.cmtat + .connect(this.admin) + .rescheduleSnapshot(SNAPSHOT_MIDDLE_OLD_TIME, SNAPSHOT_MIDDLE_NEW_TIME) await expect(this.logs) - .to.emit(this.cmtat, "SnapshotSchedule") - .withArgs(SNAPSHOT_MIDDLE_OLD_TIME, SNAPSHOT_MIDDLE_NEW_TIME); + .to.emit(this.cmtat, 'SnapshotSchedule') + .withArgs(SNAPSHOT_MIDDLE_OLD_TIME, SNAPSHOT_MIDDLE_NEW_TIME) const snapshots = await this.cmtat.getNextSnapshots() expect(snapshots.length).to.equal(4) checkArraySnapshot(snapshots, [ @@ -55,23 +55,31 @@ function ERC20SnapshotModuleCommonRescheduling () { }) it('testCannotRescheduleASnapshotAfterTheNextSnapshot', async function () { - const SNAPSHOT_MIDDLE_OLD_TIME = this.snapshotTime + - time.duration.seconds(30) - const SNAPSHOT_MIDDLE_NEW_TIME = this.snapshotTime + - time.duration.seconds(61) + const SNAPSHOT_MIDDLE_OLD_TIME = + this.snapshotTime + time.duration.seconds(30) + const SNAPSHOT_MIDDLE_NEW_TIME = + this.snapshotTime + time.duration.seconds(61) const FIRST_SNAPSHOT = this.snapshotTime + time.duration.seconds(60) const SECOND_SNAPSHOT = this.snapshotTime + time.duration.seconds(90) - await this.cmtat.connect(this.admin).scheduleSnapshot(SNAPSHOT_MIDDLE_OLD_TIME) + await this.cmtat + .connect(this.admin) + .scheduleSnapshot(SNAPSHOT_MIDDLE_OLD_TIME) await this.cmtat.connect(this.admin).scheduleSnapshot(FIRST_SNAPSHOT) await this.cmtat.connect(this.admin).scheduleSnapshot(SECOND_SNAPSHOT) // Act - await expect( this.cmtat.connect(this.admin).rescheduleSnapshot( - SNAPSHOT_MIDDLE_OLD_TIME, - SNAPSHOT_MIDDLE_NEW_TIME - )) - .to.be.revertedWithCustomError(this.cmtat, 'CMTAT_SnapshotModule_SnapshotTimestampAfterNextSnapshot').withArgs( - SNAPSHOT_MIDDLE_NEW_TIME, FIRST_SNAPSHOT + await expect( + this.cmtat + .connect(this.admin) + .rescheduleSnapshot( + SNAPSHOT_MIDDLE_OLD_TIME, + SNAPSHOT_MIDDLE_NEW_TIME + ) ) + .to.be.revertedWithCustomError( + this.cmtat, + 'CMTAT_SnapshotModule_SnapshotTimestampAfterNextSnapshot' + ) + .withArgs(SNAPSHOT_MIDDLE_NEW_TIME, FIRST_SNAPSHOT) // Assert const snapshots = await this.cmtat.getNextSnapshots() expect(snapshots.length).to.equal(4) @@ -84,23 +92,33 @@ function ERC20SnapshotModuleCommonRescheduling () { }) it('testCannotRescheduleASnapshotBeforeThePreviousSnapshot', async function () { - const SNAPSHOT_MIDDLE_OLD_TIME = this.snapshotTime + - time.duration.seconds(30) - const SNAPSHOT_MIDDLE_NEW_TIME = this.snapshotTime - time.duration.seconds(1) + const SNAPSHOT_MIDDLE_OLD_TIME = + this.snapshotTime + time.duration.seconds(30) + const SNAPSHOT_MIDDLE_NEW_TIME = + this.snapshotTime - time.duration.seconds(1) const FIRST_SNAPSHOT = this.snapshotTime + time.duration.seconds(60) const SECOND_SNAPSHOT = this.snapshotTime + time.duration.seconds(90) - await this.cmtat.connect(this.admin).scheduleSnapshot(SNAPSHOT_MIDDLE_OLD_TIME) + await this.cmtat + .connect(this.admin) + .scheduleSnapshot(SNAPSHOT_MIDDLE_OLD_TIME) await this.cmtat.connect(this.admin).scheduleSnapshot(FIRST_SNAPSHOT) await this.cmtat.connect(this.admin).scheduleSnapshot(SECOND_SNAPSHOT) // Act - await expect( this.cmtat.connect(this.admin).rescheduleSnapshot( - SNAPSHOT_MIDDLE_OLD_TIME, - SNAPSHOT_MIDDLE_NEW_TIME - )) - .to.be.revertedWithCustomError(this.cmtat, 'CMTAT_SnapshotModule_SnapshotTimestampBeforePreviousSnapshot').withArgs( - SNAPSHOT_MIDDLE_NEW_TIME, this.snapshotTime) - + await expect( + this.cmtat + .connect(this.admin) + .rescheduleSnapshot( + SNAPSHOT_MIDDLE_OLD_TIME, + SNAPSHOT_MIDDLE_NEW_TIME + ) + ) + .to.be.revertedWithCustomError( + this.cmtat, + 'CMTAT_SnapshotModule_SnapshotTimestampBeforePreviousSnapshot' + ) + .withArgs(SNAPSHOT_MIDDLE_NEW_TIME, this.snapshotTime) + // Assert const snapshots = await this.cmtat.getNextSnapshots() expect(snapshots.length).to.equal(4) @@ -114,40 +132,65 @@ function ERC20SnapshotModuleCommonRescheduling () { it('reverts when calling from non-owner', async function () { // Act - await expect( this.cmtat.connect(this.address1).rescheduleSnapshot(this.snapshotTime, this.newSnapshotTime)) - .to.be.revertedWithCustomError(this.cmtat, 'AccessControlUnauthorizedAccount') - .withArgs(this.address1.address, SNAPSHOOTER_ROLE); + await expect( + this.cmtat + .connect(this.address1) + .rescheduleSnapshot(this.snapshotTime, this.newSnapshotTime) + ) + .to.be.revertedWithCustomError( + this.cmtat, + 'AccessControlUnauthorizedAccount' + ) + .withArgs(this.address1.address, SNAPSHOOTER_ROLE) }) it('reverts when trying to reschedule a snapshot in the past', async function () { const NEW_TIME = this.snapshotTime - time.duration.seconds(60) - await expect( this.cmtat.connect(this.admin).rescheduleSnapshot(this.snapshotTime, NEW_TIME)) - .to.be.revertedWithCustomError(this.cmtat, 'CMTAT_SnapshotModule_SnapshotScheduledInThePast') - .withArgs(NEW_TIME, (await time.latest()) + time.duration.seconds(1)); + await expect( + this.cmtat + .connect(this.admin) + .rescheduleSnapshot(this.snapshotTime, NEW_TIME) + ) + .to.be.revertedWithCustomError( + this.cmtat, + 'CMTAT_SnapshotModule_SnapshotScheduledInThePast' + ) + .withArgs(NEW_TIME, (await time.latest()) + time.duration.seconds(1)) }) it('reverts when trying to reschedule a snapshot to a snapshot time already existing', async function () { const NEW_TIME = this.snapshotTime + time.duration.seconds(60) await this.cmtat.connect(this.admin).scheduleSnapshot(NEW_TIME) - await expect(this.cmtat.connect(this.admin).rescheduleSnapshot(this.snapshotTime, NEW_TIME)) - .to.be.revertedWithCustomError(this.cmtat, 'CMTAT_SnapshotModule_SnapshotAlreadyExists') + await expect( + this.cmtat + .connect(this.admin) + .rescheduleSnapshot(this.snapshotTime, NEW_TIME) + ).to.be.revertedWithCustomError( + this.cmtat, + 'CMTAT_SnapshotModule_SnapshotAlreadyExists' + ) }) it('reverts when trying to schedule a snapshot with the same time twice', async function () { /* Arrange: we schedule the snapshot at a new time */ - await this.cmtat.connect(this.admin).rescheduleSnapshot( - this.snapshotTime, - this.newSnapshotTime - ) + await this.cmtat + .connect(this.admin) + .rescheduleSnapshot(this.snapshotTime, this.newSnapshotTime) /* // Act We try to reschedule the previous snapshot */ - await expect(this.cmtat.connect(this.admin).rescheduleSnapshot(this.snapshotTime, this.newSnapshotTime)) - .to.be.revertedWithCustomError(this.cmtat, 'CMTAT_SnapshotModule_SnapshotNotFound') + await expect( + this.cmtat + .connect(this.admin) + .rescheduleSnapshot(this.snapshotTime, this.newSnapshotTime) + ).to.be.revertedWithCustomError( + this.cmtat, + 'CMTAT_SnapshotModule_SnapshotNotFound' + ) // Assert const snapshots = await this.cmtat.getNextSnapshots() expect(snapshots.length).to.equal(1) @@ -156,20 +199,40 @@ function ERC20SnapshotModuleCommonRescheduling () { it('reverts when snapshot is not found', async function () { const SNAPSHOT_TIME = this.currentTime + time.duration.seconds(90) - await expect(this.cmtat.connect(this.admin).rescheduleSnapshot(SNAPSHOT_TIME, this.newSnapshotTime)) - .to.be.revertedWithCustomError(this.cmtat, 'CMTAT_SnapshotModule_SnapshotNotFound') + await expect( + this.cmtat + .connect(this.admin) + .rescheduleSnapshot(SNAPSHOT_TIME, this.newSnapshotTime) + ).to.be.revertedWithCustomError( + this.cmtat, + 'CMTAT_SnapshotModule_SnapshotNotFound' + ) }) it('reverts if no snapshot exits', async function () { - this.logs = await this.cmtat.connect(this.admin).unscheduleLastSnapshot(this.snapshotTime) - await expect(this.cmtat.connect(this.admin).rescheduleSnapshot(this.snapshotTime, this.newSnapshotTime)) - .to.be.revertedWithCustomError(this.cmtat, 'CMTAT_SnapshotModule_NoSnapshotScheduled') + this.logs = await this.cmtat + .connect(this.admin) + .unscheduleLastSnapshot(this.snapshotTime) + await expect( + this.cmtat + .connect(this.admin) + .rescheduleSnapshot(this.snapshotTime, this.newSnapshotTime) + ).to.be.revertedWithCustomError( + this.cmtat, + 'CMTAT_SnapshotModule_NoSnapshotScheduled' + ) }) it('reverts when snapshot has been processed', async function () { const SNAPSHOT_TIME = this.currentTime - time.duration.seconds(60) - await expect(this.cmtat.connect(this.admin).rescheduleSnapshot(SNAPSHOT_TIME, this.newSnapshotTime)) - .to.be.revertedWithCustomError(this.cmtat, 'CMTAT_SnapshotModule_SnapshotAlreadyDone') + await expect( + this.cmtat + .connect(this.admin) + .rescheduleSnapshot(SNAPSHOT_TIME, this.newSnapshotTime) + ).to.be.revertedWithCustomError( + this.cmtat, + 'CMTAT_SnapshotModule_SnapshotAlreadyDone' + ) }) }) } diff --git a/test/common/ERC20SnapshotModuleCommon/ERC20SnapshotModuleCommonScheduling.js b/test/common/ERC20SnapshotModuleCommon/ERC20SnapshotModuleCommonScheduling.js index 54e5c304..50ffd7b3 100644 --- a/test/common/ERC20SnapshotModuleCommon/ERC20SnapshotModuleCommonScheduling.js +++ b/test/common/ERC20SnapshotModuleCommon/ERC20SnapshotModuleCommonScheduling.js @@ -1,5 +1,5 @@ -const { time } = require ("@nomicfoundation/hardhat-network-helpers"); -const { expect } = require('chai'); +const { time } = require('@nomicfoundation/hardhat-network-helpers') +const { expect } = require('chai') const { SNAPSHOOTER_ROLE } = require('../../utils') const { checkArraySnapshot @@ -13,7 +13,9 @@ function ERC20SnapshotModuleCommonScheduling () { it('can schedule a snapshot with the snapshoter role', async function () { const SNAPSHOT_TIME = this.currentTime + time.duration.seconds(60) // Act - this.logs = await this.cmtat.connect(this.admin).scheduleSnapshot(SNAPSHOT_TIME) + this.logs = await this.cmtat + .connect(this.admin) + .scheduleSnapshot(SNAPSHOT_TIME) // Assert const snapshots = await this.cmtat.getNextSnapshots() expect(snapshots.length).to.equal(1) @@ -21,33 +23,53 @@ function ERC20SnapshotModuleCommonScheduling () { // emits a SnapshotSchedule event await expect(this.logs) - .to.emit(this.cmtat, "SnapshotSchedule") - .withArgs('0', SNAPSHOT_TIME); + .to.emit(this.cmtat, 'SnapshotSchedule') + .withArgs('0', SNAPSHOT_TIME) }) it('reverts when calling from non-admin', async function () { const SNAPSHOT_TIME = this.currentTime + time.duration.seconds(60) - await expect( this.cmtat.connect(this.address1).scheduleSnapshot(SNAPSHOT_TIME)) - .to.be.revertedWithCustomError(this.cmtat, 'AccessControlUnauthorizedAccount') - .withArgs(this.address1.address, SNAPSHOOTER_ROLE); + await expect( + this.cmtat.connect(this.address1).scheduleSnapshot(SNAPSHOT_TIME) + ) + .to.be.revertedWithCustomError( + this.cmtat, + 'AccessControlUnauthorizedAccount' + ) + .withArgs(this.address1.address, SNAPSHOOTER_ROLE) }) it('reverts when trying to schedule a snapshot before the last snapshot', async function () { const SNAPSHOT_TIME = this.currentTime + time.duration.seconds(120) // Act - this.logs = await this.cmtat.connect(this.admin).scheduleSnapshot(SNAPSHOT_TIME) + this.logs = await this.cmtat + .connect(this.admin) + .scheduleSnapshot(SNAPSHOT_TIME) const SNAPSHOT_TIME_INVALID = SNAPSHOT_TIME - time.duration.seconds(60) - - await expect( this.cmtat.connect(this.admin).scheduleSnapshot(SNAPSHOT_TIME_INVALID)) - .to.be.revertedWithCustomError(this.cmtat, 'CMTAT_SnapshotModule_SnapshotTimestampBeforeLastSnapshot') - .withArgs(SNAPSHOT_TIME_INVALID, SNAPSHOT_TIME) + + await expect( + this.cmtat.connect(this.admin).scheduleSnapshot(SNAPSHOT_TIME_INVALID) + ) + .to.be.revertedWithCustomError( + this.cmtat, + 'CMTAT_SnapshotModule_SnapshotTimestampBeforeLastSnapshot' + ) + .withArgs(SNAPSHOT_TIME_INVALID, SNAPSHOT_TIME) }) it('reverts when trying to schedule a snapshot in the past', async function () { const SNAPSHOT_TIME = this.currentTime - time.duration.seconds(60) - await expect( this.cmtat.connect(this.admin).scheduleSnapshot(SNAPSHOT_TIME)) - .to.be.revertedWithCustomError(this.cmtat, 'CMTAT_SnapshotModule_SnapshotScheduledInThePast') - .withArgs(SNAPSHOT_TIME, (await time.latest()) + time.duration.seconds(1)) + await expect( + this.cmtat.connect(this.admin).scheduleSnapshot(SNAPSHOT_TIME) + ) + .to.be.revertedWithCustomError( + this.cmtat, + 'CMTAT_SnapshotModule_SnapshotScheduledInThePast' + ) + .withArgs( + SNAPSHOT_TIME, + (await time.latest()) + time.duration.seconds(1) + ) }) it('reverts when trying to schedule a snapshot with the same time twice', async function () { @@ -55,8 +77,12 @@ function ERC20SnapshotModuleCommonScheduling () { // Arrange await this.cmtat.connect(this.admin).scheduleSnapshot(SNAPSHOT_TIME) // Act - await expect(this.cmtat.connect(this.admin).scheduleSnapshot(SNAPSHOT_TIME)) - .to.be.revertedWithCustomError(this.cmtat, 'CMTAT_SnapshotModule_SnapshotAlreadyExists') + await expect( + this.cmtat.connect(this.admin).scheduleSnapshot(SNAPSHOT_TIME) + ).to.be.revertedWithCustomError( + this.cmtat, + 'CMTAT_SnapshotModule_SnapshotAlreadyExists' + ) // Assert const snapshots = await this.cmtat.getNextSnapshots() expect(snapshots.length).to.equal(1) @@ -73,14 +99,18 @@ function ERC20SnapshotModuleCommonScheduling () { const SECOND_SNAPSHOT = this.currentTime + time.duration.seconds(200) const THIRD_SNAPSHOT = this.currentTime + time.duration.seconds(15) // Arrange - this.logs = await this.cmtat.connect(this.admin).scheduleSnapshot(FIRST_SNAPSHOT) - this.logs = await this.cmtat.connect(this.admin).scheduleSnapshot(SECOND_SNAPSHOT) + this.logs = await this.cmtat + .connect(this.admin) + .scheduleSnapshot(FIRST_SNAPSHOT) + this.logs = await this.cmtat + .connect(this.admin) + .scheduleSnapshot(SECOND_SNAPSHOT) // Act // We schedule the snapshot at the first place this.snapshotTime = this.currentTime + time.duration.seconds(10) - this.logs = await this.cmtat.connect(this.admin).scheduleSnapshotNotOptimized( - THIRD_SNAPSHOT - ) + this.logs = await this.cmtat + .connect(this.admin) + .scheduleSnapshotNotOptimized(THIRD_SNAPSHOT) // Assert const snapshots = await this.cmtat.getNextSnapshots() expect(snapshots.length).to.equal(3) @@ -102,7 +132,9 @@ function ERC20SnapshotModuleCommonScheduling () { await this.cmtat.connect(this.admin).scheduleSnapshot(FOUR_SNAPSHOT) await this.cmtat.connect(this.admin).scheduleSnapshot(FIVE_SNAPSHOT) // Act - await this.cmtat.connect(this.admin).scheduleSnapshotNotOptimized(RANDOM_SNAPSHOT) + await this.cmtat + .connect(this.admin) + .scheduleSnapshotNotOptimized(RANDOM_SNAPSHOT) // Assert let snapshots = await this.cmtat.getNextSnapshots() expect(snapshots.length).to.equal(6) @@ -119,39 +151,68 @@ function ERC20SnapshotModuleCommonScheduling () { it('schedule a snapshot, which will be in the last position', async function () { const SNAPSHOT_TIME = this.currentTime + time.duration.seconds(60) - this.logs = await this.cmtat.connect(this.admin).scheduleSnapshotNotOptimized(SNAPSHOT_TIME) + this.logs = await this.cmtat + .connect(this.admin) + .scheduleSnapshotNotOptimized(SNAPSHOT_TIME) const snapshots = await this.cmtat.getNextSnapshots() expect(snapshots.length).to.equal(1) // emits a SnapshotSchedule event await expect(this.logs) - .to.emit(this.cmtat, "SnapshotSchedule") - .withArgs('0', SNAPSHOT_TIME); + .to.emit(this.cmtat, 'SnapshotSchedule') + .withArgs('0', SNAPSHOT_TIME) }) it('reverts when calling from non-admin', async function () { const SNAPSHOT_TIME = this.currentTime + time.duration.seconds(60) - await expect( this.cmtat.connect(this.address1).scheduleSnapshotNotOptimized(SNAPSHOT_TIME)) - .to.be.revertedWithCustomError(this.cmtat, 'AccessControlUnauthorizedAccount') - .withArgs(this.address1.address, SNAPSHOOTER_ROLE); + await expect( + this.cmtat + .connect(this.address1) + .scheduleSnapshotNotOptimized(SNAPSHOT_TIME) + ) + .to.be.revertedWithCustomError( + this.cmtat, + 'AccessControlUnauthorizedAccount' + ) + .withArgs(this.address1.address, SNAPSHOOTER_ROLE) }) it('reverts when trying to schedule a snapshot in the past', async function () { const SNAPSHOT_TIME = this.currentTime - time.duration.seconds(60) - await expect( this.cmtat.connect(this.admin).scheduleSnapshotNotOptimized(SNAPSHOT_TIME)) - .to.be.revertedWithCustomError(this.cmtat, 'CMTAT_SnapshotModule_SnapshotScheduledInThePast') - .withArgs(SNAPSHOT_TIME, (await time.latest()) + time.duration.seconds(1)) + await expect( + this.cmtat + .connect(this.admin) + .scheduleSnapshotNotOptimized(SNAPSHOT_TIME) + ) + .to.be.revertedWithCustomError( + this.cmtat, + 'CMTAT_SnapshotModule_SnapshotScheduledInThePast' + ) + .withArgs( + SNAPSHOT_TIME, + (await time.latest()) + time.duration.seconds(1) + ) }) it('reverts when trying to schedule a snapshot with the same time twice', async function () { const FIRST_SNAPSHOT = this.currentTime + time.duration.seconds(10) const SECOND_SNAPSHOT = this.currentTime + time.duration.seconds(100) // Arrange - this.logs = await this.cmtat.connect(this.admin).scheduleSnapshot(FIRST_SNAPSHOT) - this.logs = await this.cmtat.connect(this.admin).scheduleSnapshot(SECOND_SNAPSHOT) + this.logs = await this.cmtat + .connect(this.admin) + .scheduleSnapshot(FIRST_SNAPSHOT) + this.logs = await this.cmtat + .connect(this.admin) + .scheduleSnapshot(SECOND_SNAPSHOT) // Act - await expect( this.cmtat.connect(this.admin).scheduleSnapshotNotOptimized(FIRST_SNAPSHOT)) - .to.be.revertedWithCustomError(this.cmtat, 'CMTAT_SnapshotModule_SnapshotAlreadyExists') + await expect( + this.cmtat + .connect(this.admin) + .scheduleSnapshotNotOptimized(FIRST_SNAPSHOT) + ).to.be.revertedWithCustomError( + this.cmtat, + 'CMTAT_SnapshotModule_SnapshotAlreadyExists' + ) // Assert const snapshots = await this.cmtat.getNextSnapshots() expect(snapshots.length).to.equal(2) diff --git a/test/common/ERC20SnapshotModuleCommon/ERC20SnapshotModuleCommonUnschedule.js b/test/common/ERC20SnapshotModuleCommon/ERC20SnapshotModuleCommonUnschedule.js index c3400c4d..4f47f2f9 100644 --- a/test/common/ERC20SnapshotModuleCommon/ERC20SnapshotModuleCommonUnschedule.js +++ b/test/common/ERC20SnapshotModuleCommon/ERC20SnapshotModuleCommonUnschedule.js @@ -1,5 +1,5 @@ -const { time } = require ("@nomicfoundation/hardhat-network-helpers"); -const { expect } = require('chai'); +const { time } = require('@nomicfoundation/hardhat-network-helpers') +const { expect } = require('chai') const { SNAPSHOOTER_ROLE } = require('../../utils') const { checkArraySnapshot @@ -19,11 +19,15 @@ function ERC20SnapshotModuleCommonUnschedule () { it('can remove a snapshot as admin', async function () { const SNAPSHOT_TIME = this.currentTime + time.duration.seconds(60) - this.logs = await this.cmtat.connect(this.admin).scheduleSnapshot(SNAPSHOT_TIME) + this.logs = await this.cmtat + .connect(this.admin) + .scheduleSnapshot(SNAPSHOT_TIME) let snapshots = await this.cmtat.getNextSnapshots() expect(snapshots.length).to.equal(1) expect(snapshots[0]).to.equal(SNAPSHOT_TIME) - await this.cmtat.connect(this.admin).unscheduleSnapshotNotOptimized(SNAPSHOT_TIME) + await this.cmtat + .connect(this.admin) + .unscheduleSnapshotNotOptimized(SNAPSHOT_TIME) snapshots = await this.cmtat.getNextSnapshots() expect(snapshots.length).to.equal(0) }) @@ -35,7 +39,9 @@ function ERC20SnapshotModuleCommonUnschedule () { await this.cmtat.connect(this.admin).scheduleSnapshot(this.snapshotTime5) let snapshots = await this.cmtat.getNextSnapshots() expect(snapshots.length).to.equal(5) - await this.cmtat.connect(this.admin).unscheduleSnapshotNotOptimized(this.snapshotTime3) + await this.cmtat + .connect(this.admin) + .unscheduleSnapshotNotOptimized(this.snapshotTime3) snapshots = await this.cmtat.getNextSnapshots() checkArraySnapshot(snapshots, [ this.snapshotTime1, @@ -49,16 +55,26 @@ function ERC20SnapshotModuleCommonUnschedule () { const SNAPSHOT_TIME = this.currentTime + time.duration.seconds(60) let snapshots = await this.cmtat.getNextSnapshots() expect(snapshots.length).to.equal(0) - await expect(this.cmtat.connect(this.admin).unscheduleSnapshotNotOptimized(SNAPSHOT_TIME)) - .to.be.revertedWithCustomError(this.cmtat, 'CMTAT_SnapshotModule_SnapshotNotFound') + await expect( + this.cmtat + .connect(this.admin) + .unscheduleSnapshotNotOptimized(SNAPSHOT_TIME) + ).to.be.revertedWithCustomError( + this.cmtat, + 'CMTAT_SnapshotModule_SnapshotNotFound' + ) snapshots = await this.cmtat.getNextSnapshots() expect(snapshots.length).to.equal(0) }) it('testCannotUnscheduleASnapshotInThePast', async function () { const SNAPSHOT_TIME = this.currentTime - time.duration.seconds(60) - await expect(this.cmtat.connect(this.admin).unscheduleLastSnapshot(SNAPSHOT_TIME)) - .to.be.revertedWithCustomError(this.cmtat, 'CMTAT_SnapshotModule_SnapshotAlreadyDone') + await expect( + this.cmtat.connect(this.admin).unscheduleLastSnapshot(SNAPSHOT_TIME) + ).to.be.revertedWithCustomError( + this.cmtat, + 'CMTAT_SnapshotModule_SnapshotAlreadyDone' + ) }) it('can unschedule a snaphot in a random place', async function () { @@ -68,7 +84,9 @@ function ERC20SnapshotModuleCommonUnschedule () { await this.cmtat.connect(this.admin).scheduleSnapshot(this.snapshotTime3) await this.cmtat.connect(this.admin).scheduleSnapshot(this.snapshotTime4) await this.cmtat.connect(this.admin).scheduleSnapshot(this.snapshotTime5) - await this.cmtat.connect(this.admin).scheduleSnapshotNotOptimized(RANDOM_SNAPSHOT) + await this.cmtat + .connect(this.admin) + .scheduleSnapshotNotOptimized(RANDOM_SNAPSHOT) let snapshots = await this.cmtat.getNextSnapshots() checkArraySnapshot(snapshots, [ this.snapshotTime1, @@ -79,7 +97,9 @@ function ERC20SnapshotModuleCommonUnschedule () { this.snapshotTime5 ]) expect(snapshots.length).to.equal(6) - await this.cmtat.connect(this.admin).unscheduleSnapshotNotOptimized(RANDOM_SNAPSHOT) + await this.cmtat + .connect(this.admin) + .unscheduleSnapshotNotOptimized(RANDOM_SNAPSHOT) snapshots = await this.cmtat.getNextSnapshots() expect(snapshots.length).to.equal(5) snapshots = await this.cmtat.getNextSnapshots() @@ -100,7 +120,9 @@ function ERC20SnapshotModuleCommonUnschedule () { await this.cmtat.connect(this.admin).scheduleSnapshot(this.snapshotTime5) let snapshots = await this.cmtat.getNextSnapshots() expect(snapshots.length).to.equal(5) - await this.cmtat.connect(this.admin).unscheduleSnapshotNotOptimized(this.snapshotTime2) + await this.cmtat + .connect(this.admin) + .unscheduleSnapshotNotOptimized(this.snapshotTime2) snapshots = await this.cmtat.getNextSnapshots() expect(snapshots.length).to.equal(4) await this.cmtat.connect(this.admin).scheduleSnapshot(this.snapshotTime6) @@ -118,14 +140,23 @@ function ERC20SnapshotModuleCommonUnschedule () { it('reverts when calling from non-admin', async function () { // Arrange const SNAPSHOT_TIME = this.currentTime + time.duration.seconds(60) - this.logs = await this.cmtat.connect(this.admin).scheduleSnapshot(SNAPSHOT_TIME) + this.logs = await this.cmtat + .connect(this.admin) + .scheduleSnapshot(SNAPSHOT_TIME) let snapshots = await this.cmtat.getNextSnapshots() expect(snapshots.length).to.equal(1) expect(snapshots[0]).to.equal(SNAPSHOT_TIME) // Act - await expect( this.cmtat.connect(this.address1).unscheduleSnapshotNotOptimized(SNAPSHOT_TIME)) - .to.be.revertedWithCustomError(this.cmtat, 'AccessControlUnauthorizedAccount') - .withArgs(this.address1.address, SNAPSHOOTER_ROLE) + await expect( + this.cmtat + .connect(this.address1) + .unscheduleSnapshotNotOptimized(SNAPSHOT_TIME) + ) + .to.be.revertedWithCustomError( + this.cmtat, + 'AccessControlUnauthorizedAccount' + ) + .withArgs(this.address1.address, SNAPSHOOTER_ROLE) // Assert snapshots = await this.cmtat.getNextSnapshots() expect(snapshots.length).to.equal(1) @@ -140,41 +171,64 @@ function ERC20SnapshotModuleCommonUnschedule () { }) it('can unschedule a snapshot with the snapshoter role and emits a SnapshotUnschedule event', async function () { - this.logs = await this.cmtat.connect(this.admin).unscheduleLastSnapshot(this.snapshotTime) + this.logs = await this.cmtat + .connect(this.admin) + .unscheduleLastSnapshot(this.snapshotTime) await expect(this.logs) - .to.emit(this.cmtat, "SnapshotUnschedule") - .withArgs(this.snapshotTime); + .to.emit(this.cmtat, 'SnapshotUnschedule') + .withArgs(this.snapshotTime) const snapshots = await this.cmtat.getNextSnapshots() expect(snapshots.length).to.equal(0) }) it('reverts when calling from non-admin', async function () { - await expect( this.cmtat.connect(this.address1).unscheduleLastSnapshot(this.snapshotTime)) - .to.be.revertedWithCustomError(this.cmtat, 'AccessControlUnauthorizedAccount') - .withArgs(this.address1.address, SNAPSHOOTER_ROLE) + await expect( + this.cmtat + .connect(this.address1) + .unscheduleLastSnapshot(this.snapshotTime) + ) + .to.be.revertedWithCustomError( + this.cmtat, + 'AccessControlUnauthorizedAccount' + ) + .withArgs(this.address1.address, SNAPSHOOTER_ROLE) }) it('reverts if no snapshot is scheduled', async function () { const SNAPSHOT_TIME = this.currentTime + time.duration.seconds(90) // Arrange // Delete the only snapshot - this.logs = await this.cmtat.connect(this.admin).unscheduleLastSnapshot(this.snapshotTime) + this.logs = await this.cmtat + .connect(this.admin) + .unscheduleLastSnapshot(this.snapshotTime) // Act - await expect(this.cmtat.connect(this.admin).unscheduleLastSnapshot(SNAPSHOT_TIME)) - .to.be.revertedWithCustomError(this.cmtat, 'CMTAT_SnapshotModule_NoSnapshotScheduled') + await expect( + this.cmtat.connect(this.admin).unscheduleLastSnapshot(SNAPSHOT_TIME) + ).to.be.revertedWithCustomError( + this.cmtat, + 'CMTAT_SnapshotModule_NoSnapshotScheduled' + ) }) it('reverts when snapshot is not found', async function () { const SNAPSHOT_TIME = this.currentTime + time.duration.seconds(90) // Act - await expect(this.cmtat.connect(this.admin).unscheduleLastSnapshot(SNAPSHOT_TIME)) - .to.be.revertedWithCustomError(this.cmtat, 'CMTAT_SnapshotModule_SnapshotNotFound') + await expect( + this.cmtat.connect(this.admin).unscheduleLastSnapshot(SNAPSHOT_TIME) + ).to.be.revertedWithCustomError( + this.cmtat, + 'CMTAT_SnapshotModule_SnapshotNotFound' + ) }) it('reverts when snapshot has been processed', async function () { const SNAPSHOT_TIME = this.currentTime - time.duration.seconds(60) - await expect(this.cmtat.connect(this.admin).unscheduleLastSnapshot(SNAPSHOT_TIME)) - .to.be.revertedWithCustomError(this.cmtat, 'CMTAT_SnapshotModule_SnapshotAlreadyDone') + await expect( + this.cmtat.connect(this.admin).unscheduleLastSnapshot(SNAPSHOT_TIME) + ).to.be.revertedWithCustomError( + this.cmtat, + 'CMTAT_SnapshotModule_SnapshotAlreadyDone' + ) }) }) } diff --git a/test/common/ERC20SnapshotModuleCommon/ERC20SnapshotModuleUtils/ERC20SnapshotModuleUtils.js b/test/common/ERC20SnapshotModuleCommon/ERC20SnapshotModuleUtils/ERC20SnapshotModuleUtils.js index 273b60e3..54ad7e42 100644 --- a/test/common/ERC20SnapshotModuleCommon/ERC20SnapshotModuleUtils/ERC20SnapshotModuleUtils.js +++ b/test/common/ERC20SnapshotModuleCommon/ERC20SnapshotModuleUtils/ERC20SnapshotModuleUtils.js @@ -1,4 +1,4 @@ -const { expect } = require('chai'); +const { expect } = require('chai') const getUnixTimestamp = () => { return Math.round(new Date().getTime() / 1000) } @@ -8,24 +8,24 @@ const timeout = function (ms) { } async function checkSnapshot (time, totalSupply, addressese, balances) { -const addresses = [this.address1, this.address2, this.address3] + const addresses = [this.address1, this.address2, this.address3] // Values before the snapshot - expect(await this.cmtat.snapshotTotalSupply(time)).to.equal( - totalSupply + expect(await this.cmtat.snapshotTotalSupply(time)).to.equal(totalSupply) + // const result = await this.cmtat.snapshotInfoBatch(time, addresses) + const result = await this.cmtat['snapshotInfoBatch(uint256,address[])']( + time, + addresses ) - //const result = await this.cmtat.snapshotInfoBatch(time, addresses) - const result = await this.cmtat[ - 'snapshotInfoBatch(uint256,address[])' - ](time, addresses) - /*methods*/ + /* methods */ const times = [time] - const result2 = await this.cmtat[ - 'snapshotInfoBatch(uint256[],address[])' - ](times, addresses) + const result2 = await this.cmtat['snapshotInfoBatch(uint256[],address[])']( + times, + addresses + ) for (let i = 0; i < balances.length; ++i) { - expect( - await this.cmtat.snapshotBalanceOf(time, addresses[i]) - ).to.equal(balances[i]) + expect(await this.cmtat.snapshotBalanceOf(time, addresses[i])).to.equal( + balances[i] + ) await this.cmtat.snapshotInfo(time, addresses[i]) const { 0: ownerBalance, 1: totalSupplyGet } = await this.cmtat.snapshotInfo(time, addresses[i]) diff --git a/test/common/ERC20SnapshotModuleCommon/global/ERC20SnapshotModuleMultiplePlannedTest.js b/test/common/ERC20SnapshotModuleCommon/global/ERC20SnapshotModuleMultiplePlannedTest.js index c59fbbad..2989346f 100644 --- a/test/common/ERC20SnapshotModuleCommon/global/ERC20SnapshotModuleMultiplePlannedTest.js +++ b/test/common/ERC20SnapshotModuleCommon/global/ERC20SnapshotModuleMultiplePlannedTest.js @@ -1,11 +1,10 @@ -const { time } = require ("@nomicfoundation/hardhat-network-helpers"); -const { expect } = require('chai'); +const { time } = require('@nomicfoundation/hardhat-network-helpers') +const { expect } = require('chai') const { checkSnapshot } = require('../ERC20SnapshotModuleUtils/ERC20SnapshotModuleUtils') -function ERC20SnapshotModuleMultiplePlannedTest ( -) { +function ERC20SnapshotModuleMultiplePlannedTest () { // With multiple planned snapshot context('SnapshotMultiplePlannedTest', function () { const ADDRESSES = [this.address1, this.address2, this.address3] @@ -20,16 +19,22 @@ function ERC20SnapshotModuleMultiplePlannedTest ( const TRANSFER_AMOUNT_2 = 10n const TRANSFER_AMOUNT_3 = 5n beforeEach(async function () { - await this.cmtat.connect(this.admin).mint(this.address1, ADDRESS1_INITIAL_MINT) - await this.cmtat.connect(this.admin).mint(this.address2, ADDRESS2_INITIAL_MINT) - await this.cmtat.connect(this.admin).mint(this.address3, ADDRESS3_INITIAL_MINT) + await this.cmtat + .connect(this.admin) + .mint(this.address1, ADDRESS1_INITIAL_MINT) + await this.cmtat + .connect(this.admin) + .mint(this.address2, ADDRESS2_INITIAL_MINT) + await this.cmtat + .connect(this.admin) + .mint(this.address3, ADDRESS3_INITIAL_MINT) this.currentTime = await time.latest() - this.snapshotTime1 = this.currentTime + - time.duration.seconds(FIRST_SNAPSHOT_INTERVAL) - this.snapshotTime2 = this.currentTime + - time.duration.seconds(SECOND_SNAPSHOT_INTERVAL) - this.snapshotTime3 = this.currentTime + - time.duration.seconds(THIRD_SNAPSHOT_INTERVAL) + this.snapshotTime1 = + this.currentTime + time.duration.seconds(FIRST_SNAPSHOT_INTERVAL) + this.snapshotTime2 = + this.currentTime + time.duration.seconds(SECOND_SNAPSHOT_INTERVAL) + this.snapshotTime3 = + this.currentTime + time.duration.seconds(THIRD_SNAPSHOT_INTERVAL) this.beforeSnapshotTime = this.currentTime - time.duration.seconds(60) await this.cmtat.connect(this.admin).scheduleSnapshot(this.snapshotTime1) await this.cmtat.connect(this.admin).scheduleSnapshot(this.snapshotTime2) @@ -51,10 +56,12 @@ function ERC20SnapshotModuleMultiplePlannedTest ( // Act // Gas and gasPrice are fixed arbitrarily - await this.cmtat.connect(this.address1).transfer(this.address2, TRANSFER_AMOUNT_1, { - gas: 5000000, - gasPrice: 500000000 - }) + await this.cmtat + .connect(this.address1) + .transfer(this.address2, TRANSFER_AMOUNT_1, { + gas: 5000000, + gasPrice: 500000000 + }) // Values before the snapshot await checkSnapshot.call( this, @@ -91,8 +98,7 @@ function ERC20SnapshotModuleMultiplePlannedTest ( it('testCanTransferAfterSecondSnapshot', async function () { // We jump into the future - await time.increase( - SECOND_SNAPSHOT_INTERVAL - FIRST_SNAPSHOT_INTERVAL) + await time.increase(SECOND_SNAPSHOT_INTERVAL - FIRST_SNAPSHOT_INTERVAL) // Arrange - Assert // No transfer performed since the minting await checkSnapshot.call( @@ -105,10 +111,12 @@ function ERC20SnapshotModuleMultiplePlannedTest ( // Act // Gas and gasPrice are fixed arbitrarily - await this.cmtat.connect(this.address1).transfer(this.address2, TRANSFER_AMOUNT_1, { - gas: 5000000, - gasPrice: 500000000 - }) + await this.cmtat + .connect(this.address1) + .transfer(this.address2, TRANSFER_AMOUNT_1, { + gas: 5000000, + gasPrice: 500000000 + }) // Values before the snapshot await checkSnapshot.call( this, @@ -166,10 +174,12 @@ function ERC20SnapshotModuleMultiplePlannedTest ( ) // Act // Gas and gasPrice are fixed arbitrarily - await this.cmtat.connect(this.address1).transfer(this.address2, TRANSFER_AMOUNT_1, { - gas: 5000000, - gasPrice: 500000000 - }) + await this.cmtat + .connect(this.address1) + .transfer(this.address2, TRANSFER_AMOUNT_1, { + gas: 5000000, + gasPrice: 500000000 + }) // Values before the snapshot await checkSnapshot.call( this, @@ -234,10 +244,12 @@ function ERC20SnapshotModuleMultiplePlannedTest ( // **********Act**************** */ // Gas and gasPrice are fixed arbitrarily - await this.cmtat.connect(this.address1).transfer(this.address2, TRANSFER_AMOUNT_1, { - gas: 5000000, - gasPrice: 500000000 - }) + await this.cmtat + .connect(this.address1) + .transfer(this.address2, TRANSFER_AMOUNT_1, { + gas: 5000000, + gasPrice: 500000000 + }) // Values before the snapshot await checkSnapshot.call( this, @@ -293,18 +305,19 @@ function ERC20SnapshotModuleMultiplePlannedTest ( ADDRESS2_BALANCE_AFTER_TONE_TRANSFER, ADDRESS3_INITIAL_MINT ] - ); + ) expect((await this.cmtat.getNextSnapshots()).length).to.equal(2) // We jump into the future - await time.increase( - SECOND_SNAPSHOT_INTERVAL - FIRST_SNAPSHOT_INTERVAL) + await time.increase(SECOND_SNAPSHOT_INTERVAL - FIRST_SNAPSHOT_INTERVAL) // **********Act**************** */ // Gas and gasPrice are fixed arbitrarily - await this.cmtat.connect(this.address2).transfer(this.address1, TRANSFER_AMOUNT_2, { - gas: 5000000, - gasPrice: 500000000 - }) + await this.cmtat + .connect(this.address2) + .transfer(this.address1, TRANSFER_AMOUNT_2, { + gas: 5000000, + gasPrice: 500000000 + }) // Values before the snapshot await checkSnapshot.call( this, @@ -348,7 +361,7 @@ function ERC20SnapshotModuleMultiplePlannedTest ( ADDRESS2_BALANCE_AFTER_TWO_TRANSFER, ADDRESS3_INITIAL_MINT ] - ); + ) expect((await this.cmtat.getNextSnapshots()).length).to.equal(1) // We jump into the future await time.increase(THIRD_SNAPSHOT_INTERVAL - FIRST_SNAPSHOT_INTERVAL) @@ -356,10 +369,12 @@ function ERC20SnapshotModuleMultiplePlannedTest ( // **********Act**************** */ // Act // Gas and gasPrice are fixed arbitrarily - await this.cmtat.connect(this.address1).transfer(this.address2, TRANSFER_AMOUNT_3, { - gas: 5000000, - gasPrice: 500000000 - }) + await this.cmtat + .connect(this.address1) + .transfer(this.address2, TRANSFER_AMOUNT_3, { + gas: 5000000, + gasPrice: 500000000 + }) // Values before the snapshot await checkSnapshot.call( this, @@ -415,7 +430,7 @@ function ERC20SnapshotModuleMultiplePlannedTest ( ADDRESS2_BALANCE_AFTER_THREE_TRANSFER, ADDRESS3_INITIAL_MINT ] - ); + ) expect((await this.cmtat.getNextSnapshots()).length).to.equal(0) }) }) diff --git a/test/common/ERC20SnapshotModuleCommon/global/ERC20SnapshotModuleOnePlannedSnapshotTest.js b/test/common/ERC20SnapshotModuleCommon/global/ERC20SnapshotModuleOnePlannedSnapshotTest.js index 87412ab1..a450f066 100644 --- a/test/common/ERC20SnapshotModuleCommon/global/ERC20SnapshotModuleOnePlannedSnapshotTest.js +++ b/test/common/ERC20SnapshotModuleCommon/global/ERC20SnapshotModuleOnePlannedSnapshotTest.js @@ -1,12 +1,11 @@ -const { time } = require ("@nomicfoundation/hardhat-network-helpers"); -const { expect } = require('chai'); +const { time } = require('@nomicfoundation/hardhat-network-helpers') +const { expect } = require('chai') const { checkSnapshot } = require('../ERC20SnapshotModuleUtils/ERC20SnapshotModuleUtils') const reason = 'BURN_TEST' -function ERC20SnapshotModuleOnePlannedSnapshotTest ( -) { +function ERC20SnapshotModuleOnePlannedSnapshotTest () { const ADDRESSES = [this.address1, this.address2, this.address3] const ADDRESS1_INITIAL_MINT = '31' const ADDRESS2_INITIAL_MINT = '32' @@ -14,9 +13,15 @@ function ERC20SnapshotModuleOnePlannedSnapshotTest ( const TOTAL_SUPPLY_INITIAL_MINT = '96' context('OnePlannedSnapshotTest', function () { beforeEach(async function () { - await this.cmtat.connect(this.admin).mint(this.address1, ADDRESS1_INITIAL_MINT) - await this.cmtat.connect(this.admin).mint(this.address2, ADDRESS2_INITIAL_MINT) - await this.cmtat.connect(this.admin).mint(this.address3, ADDRESS3_INITIAL_MINT) + await this.cmtat + .connect(this.admin) + .mint(this.address1, ADDRESS1_INITIAL_MINT) + await this.cmtat + .connect(this.admin) + .mint(this.address2, ADDRESS2_INITIAL_MINT) + await this.cmtat + .connect(this.admin) + .mint(this.address3, ADDRESS3_INITIAL_MINT) this.currentTime = await time.latest() this.snapshotTime = this.currentTime + time.duration.seconds(3) this.beforeSnapshotTime = this.currentTime - time.duration.seconds(60) @@ -37,10 +42,12 @@ function ERC20SnapshotModuleOnePlannedSnapshotTest ( ); // Act // Gas and gasPrice are fixed arbitrarily - ({ logs: this.logs } = await this.cmtat.connect(this.admin).mint(this.address1, MINT_AMOUNT, { - gas: 5000000, - gasPrice: 500000000 - })) + ({ logs: this.logs } = await this.cmtat + .connect(this.admin) + .mint(this.address1, MINT_AMOUNT, { + gas: 5000000, + gasPrice: 500000000 + })) // Assert // Values before the snapshot @@ -83,10 +90,12 @@ function ERC20SnapshotModuleOnePlannedSnapshotTest ( ) // Act - await this.cmtat.connect(this.admin).burn(this.address1, BURN_AMOUNT, reason, { - gas: 5000000, - gasPrice: 500000000 - }) + await this.cmtat + .connect(this.admin) + .burn(this.address1, BURN_AMOUNT, reason, { + gas: 5000000, + gasPrice: 500000000 + }) // Assert // Values before the snapshot @@ -130,10 +139,12 @@ function ERC20SnapshotModuleOnePlannedSnapshotTest ( // Act // Gas and gasPrice are fixed arbitrarily - await this.cmtat.connect(this.address1).transfer(this.address2, TRANSFER_AMOUNT, { - gas: 5000000, - gasPrice: 500000000 - }) + await this.cmtat + .connect(this.address1) + .transfer(this.address2, TRANSFER_AMOUNT, { + gas: 5000000, + gasPrice: 500000000 + }) // Assert // Values before the snapshot diff --git a/test/common/ERC20SnapshotModuleCommon/global/ERC20SnapshotModuleZeroPlannedSnapshot.js b/test/common/ERC20SnapshotModuleCommon/global/ERC20SnapshotModuleZeroPlannedSnapshot.js index 3fb175bc..7db3afbc 100644 --- a/test/common/ERC20SnapshotModuleCommon/global/ERC20SnapshotModuleZeroPlannedSnapshot.js +++ b/test/common/ERC20SnapshotModuleCommon/global/ERC20SnapshotModuleZeroPlannedSnapshot.js @@ -1,5 +1,5 @@ -const { time } = require ("@nomicfoundation/hardhat-network-helpers"); -const { expect } = require('chai'); +const { time } = require('@nomicfoundation/hardhat-network-helpers') +const { expect } = require('chai') const { checkSnapshot } = require('../ERC20SnapshotModuleUtils/ERC20SnapshotModuleUtils') @@ -12,9 +12,15 @@ function ERC20SnapshotModuleCommonGlobal () { const ADDRESS3_INITIAL_MINT = '33' const TOTAL_SUPPLY_INITIAL_MINT = '96' beforeEach(async function () { - await this.cmtat.connect(this.admin).mint(this.address1, ADDRESS1_INITIAL_MINT) - await this.cmtat.connect(this.admin).mint(this.address2, ADDRESS2_INITIAL_MINT) - await this.cmtat.connect(this.admin).mint(this.address3, ADDRESS3_INITIAL_MINT) + await this.cmtat + .connect(this.admin) + .mint(this.address1, ADDRESS1_INITIAL_MINT) + await this.cmtat + .connect(this.admin) + .mint(this.address2, ADDRESS2_INITIAL_MINT) + await this.cmtat + .connect(this.admin) + .mint(this.address3, ADDRESS3_INITIAL_MINT) }) context('Before any snapshot', function () { diff --git a/test/common/EnforcementModuleCommon.js b/test/common/EnforcementModuleCommon.js index 8ba58094..5dd22081 100644 --- a/test/common/EnforcementModuleCommon.js +++ b/test/common/EnforcementModuleCommon.js @@ -1,5 +1,5 @@ const { ENFORCER_ROLE } = require('../utils') -const { expect } = require('chai'); +const { expect } = require('chai') const reasonFreeze = 'testFreeze' const reasonUnfreeze = 'testUnfreeze' @@ -13,94 +13,103 @@ function EnforcementModuleCommon () { // Arrange - Assert expect(await this.cmtat.frozen(this.address1)).to.equal(false) // Act - this.logs = await this.cmtat.connect(this.admin).freeze(this.address1, reasonFreeze); + this.logs = await this.cmtat + .connect(this.admin) + .freeze(this.address1, reasonFreeze) // Assert expect(await this.cmtat.frozen(this.address1)).to.equal(true) // emits a Freeze event - await expect(this.logs).to.emit(this.cmtat, 'Freeze').withArgs( - this.admin, - this.address1, - reasonFreeze, - reasonFreeze); + await expect(this.logs) + .to.emit(this.cmtat, 'Freeze') + .withArgs(this.admin, this.address1, reasonFreeze, reasonFreeze) }) it('testReasonParameterCanBeEmptyString', async function () { // Arrange - Assert expect(await this.cmtat.frozen(this.address1)).to.equal(false) // Act - this.logs = await this.cmtat.connect(this.admin).freeze(this.address1, ''); + this.logs = await this.cmtat + .connect(this.admin) + .freeze(this.address1, '') // Assert expect(await this.cmtat.frozen(this.address1)).to.equal(true) // emits a Freeze event - await expect(this.logs).to.emit(this.cmtat, 'Freeze').withArgs( - this.admin, - this.address1, - '', - ''); + await expect(this.logs) + .to.emit(this.cmtat, 'Freeze') + .withArgs(this.admin, this.address1, '', '') }) it('testEnforcerRoleCanFreezeAddress', async function () { // Arrange - await this.cmtat.connect(this.admin).grantRole(ENFORCER_ROLE, this.address2); + await this.cmtat + .connect(this.admin) + .grantRole(ENFORCER_ROLE, this.address2) // Arrange - Assert expect(await this.cmtat.frozen(this.address1)).to.equal(false) // Act - this.logs = await this.cmtat.connect(this.address2).freeze(this.address1, reasonFreeze); + this.logs = await this.cmtat + .connect(this.address2) + .freeze(this.address1, reasonFreeze) // Act + Assert // Act + Assert expect( await this.cmtat.validateTransfer(this.address1, this.address2, 10) - ).to.equal(false); + ).to.equal(false) // Assert expect(await this.cmtat.frozen(this.address1)).to.equal(true) // emits a Freeze event - await expect(this.logs).to.emit(this.cmtat, 'Freeze').withArgs( - this.address2, - this.address1, - reasonFreeze, - reasonFreeze); + await expect(this.logs) + .to.emit(this.cmtat, 'Freeze') + .withArgs(this.address2, this.address1, reasonFreeze, reasonFreeze) }) it('testAdminCanUnfreezeAddress', async function () { // Arrange - await this.cmtat.connect(this.admin).freeze(this.address1, reasonFreeze); + await this.cmtat.connect(this.admin).freeze(this.address1, reasonFreeze) // Arrange - Assert expect(await this.cmtat.frozen(this.address1)).to.equal(true) // Act - this.logs = await this.cmtat.connect(this.admin).unfreeze(this.address1, reasonUnfreeze); + this.logs = await this.cmtat + .connect(this.admin) + .unfreeze(this.address1, reasonUnfreeze) // Assert expect(await this.cmtat.frozen(this.address1)).to.equal(false) - await expect(this.logs).to.emit(this.cmtat, 'Unfreeze').withArgs( - this.admin, - this.address1, - reasonUnfreeze, - reasonUnfreeze); + await expect(this.logs) + .to.emit(this.cmtat, 'Unfreeze') + .withArgs(this.admin, this.address1, reasonUnfreeze, reasonUnfreeze) }) it('testEnforcerRoleCanUnfreezeAddress', async function () { // Arrange await this.cmtat.connect(this.admin).freeze(this.address1, reasonFreeze) - await this.cmtat.connect(this.admin).grantRole(ENFORCER_ROLE, this.address2); + await this.cmtat + .connect(this.admin) + .grantRole(ENFORCER_ROLE, this.address2) // Arrange - Assert expect(await this.cmtat.frozen(this.address1)).to.equal(true) // Act - this.logs = await this.cmtat.connect(this.address2).unfreeze(this.address1, reasonUnfreeze); + this.logs = await this.cmtat + .connect(this.address2) + .unfreeze(this.address1, reasonUnfreeze) // Assert expect(await this.cmtat.frozen(this.address1)).to.equal(false) // emits an Unfreeze event - await expect(this.logs).to.emit(this.cmtat, 'Unfreeze').withArgs( - this.address2, - this.address1, - reasonUnfreeze, - reasonUnfreeze); + await expect(this.logs) + .to.emit(this.cmtat, 'Unfreeze') + .withArgs(this.address2, this.address1, reasonUnfreeze, reasonUnfreeze) }) it('testCannotNonEnforcerFreezeAddress', async function () { // Act - await expect( this.cmtat.connect(this.address2).freeze(this.address1, reasonFreeze)) - .to.be.revertedWithCustomError(this.cmtat, 'AccessControlUnauthorizedAccount') - .withArgs(this.address2.address, ENFORCER_ROLE); + await expect( + this.cmtat.connect(this.address2).freeze(this.address1, reasonFreeze) + ) + .to.be.revertedWithCustomError( + this.cmtat, + 'AccessControlUnauthorizedAccount' + ) + .withArgs(this.address2.address, ENFORCER_ROLE) // Assert expect(await this.cmtat.frozen(this.address1)).to.equal(false) }) @@ -109,9 +118,14 @@ function EnforcementModuleCommon () { // Arrange await this.cmtat.connect(this.admin).freeze(this.address1, reasonFreeze) // Act - await expect( this.cmtat.connect(this.address2).unfreeze(this.address1, reasonFreeze)) - .to.be.revertedWithCustomError(this.cmtat, 'AccessControlUnauthorizedAccount') - .withArgs(this.address2.address, ENFORCER_ROLE); + await expect( + this.cmtat.connect(this.address2).unfreeze(this.address1, reasonFreeze) + ) + .to.be.revertedWithCustomError( + this.cmtat, + 'AccessControlUnauthorizedAccount' + ) + .withArgs(this.address2.address, ENFORCER_ROLE) // Assert expect(await this.cmtat.frozen(this.address1)).to.equal(true) }) @@ -119,18 +133,30 @@ function EnforcementModuleCommon () { // reverts if address1 transfers tokens to address2 when paused it('testCannotTransferWhenFromIsFrozenWithTransfer', async function () { // Act - await this.cmtat.connect(this.admin).freeze(this.address1, reasonFreeze); + await this.cmtat.connect(this.admin).freeze(this.address1, reasonFreeze) // Assert expect( - await this.cmtat.detectTransferRestriction(this.address1, this.address2, 10) - ).to.equal('2'); + await this.cmtat.detectTransferRestriction( + this.address1, + this.address2, + 10 + ) + ).to.equal('2') expect(await this.cmtat.messageForTransferRestriction(2)).to.equal( 'Address FROM is frozen' ) const AMOUNT_TO_TRANSFER = 10 - await expect( this.cmtat.connect(this.address1).transfer(this.address2, AMOUNT_TO_TRANSFER)) - .to.be.revertedWithCustomError(this.cmtat, 'CMTAT_InvalidTransfer') - .withArgs(this.address1.address, this.address2.address, AMOUNT_TO_TRANSFER); + await expect( + this.cmtat + .connect(this.address1) + .transfer(this.address2, AMOUNT_TO_TRANSFER) + ) + .to.be.revertedWithCustomError(this.cmtat, 'CMTAT_InvalidTransfer') + .withArgs( + this.address1.address, + this.address2.address, + AMOUNT_TO_TRANSFER + ) }) // reverts if address3 transfers tokens from address1 to this.address2 when paused @@ -139,19 +165,31 @@ function EnforcementModuleCommon () { // Define allowance await this.cmtat.connect(this.address3).approve(this.address1, 20) // Act - await this.cmtat.connect(this.admin).freeze(this.address2, reasonFreeze); + await this.cmtat.connect(this.admin).freeze(this.address2, reasonFreeze) // Assert expect( - await this.cmtat.detectTransferRestriction(this.address1, this.address2, 10) - ).to.equal('3'); + await this.cmtat.detectTransferRestriction( + this.address1, + this.address2, + 10 + ) + ).to.equal('3') expect(await this.cmtat.messageForTransferRestriction(3)).to.equal( 'Address TO is frozen' ) const AMOUNT_TO_TRANSFER = 10 - await expect( this.cmtat.connect(this.address1).transferFrom(this.address3, this.address2, AMOUNT_TO_TRANSFER)) - .to.be.revertedWithCustomError(this.cmtat, 'CMTAT_InvalidTransfer') - .withArgs(this.address3.address, this.address2.address, AMOUNT_TO_TRANSFER) + await expect( + this.cmtat + .connect(this.address1) + .transferFrom(this.address3, this.address2, AMOUNT_TO_TRANSFER) + ) + .to.be.revertedWithCustomError(this.cmtat, 'CMTAT_InvalidTransfer') + .withArgs( + this.address3.address, + this.address2.address, + AMOUNT_TO_TRANSFER + ) }) // Improvement: check the return value but it is not possible to get the return value of a state modifying function @@ -159,11 +197,13 @@ function EnforcementModuleCommon () { // Arrange - Assert expect(await this.cmtat.frozen(this.address1)).to.equal(false) // Arrange - await this.cmtat.connect(this.admin).freeze(this.address1, reasonFreeze); + await this.cmtat.connect(this.admin).freeze(this.address1, reasonFreeze) // Arrange - Assert expect(await this.cmtat.frozen(this.address1)).to.equal(true) // Act - this.logs = await this.cmtat.connect(this.admin).freeze(this.address1, reasonFreeze) + this.logs = await this.cmtat + .connect(this.admin) + .freeze(this.address1, reasonFreeze) // Assert await expect(this.logs).to.not.emit(this.cmtat, 'Freeze') expect(await this.cmtat.frozen(this.address1)).to.equal(true) @@ -172,13 +212,17 @@ function EnforcementModuleCommon () { // Improvement: check the return value but it is not possible to get the return value of a state modifying function it('testUnfreezeDoesNotEmitEventIfAddressAlreadyUnfrozen', async function () { // Arrange - await this.cmtat.connect(this.admin).freeze(this.address1, reasonFreeze); + await this.cmtat.connect(this.admin).freeze(this.address1, reasonFreeze) // Arrange - Assert expect(await this.cmtat.frozen(this.address1)).to.equal(true) - await this.cmtat.connect(this.admin).unfreeze(this.address1, reasonFreeze) + await this.cmtat + .connect(this.admin) + .unfreeze(this.address1, reasonFreeze) // Act - this.logs = await this.cmtat.connect(this.admin).unfreeze(this.address1, reasonUnfreeze) + this.logs = await this.cmtat + .connect(this.admin) + .unfreeze(this.address1, reasonUnfreeze) // Assert await expect(this.logs).to.not.emit(this.cmtat, 'Unfreeze') expect(await this.cmtat.frozen(this.address1)).to.equal(false) diff --git a/test/common/MetaTxModuleCommon.js b/test/common/MetaTxModuleCommon.js index 5ab814b6..4a5e8638 100644 --- a/test/common/MetaTxModuleCommon.js +++ b/test/common/MetaTxModuleCommon.js @@ -1,10 +1,10 @@ -const helpers = require('@nomicfoundation/hardhat-network-helpers'); +const helpers = require('@nomicfoundation/hardhat-network-helpers') const { getDomain, - ForwardRequest, + ForwardRequest } = require('../../openzeppelin-contracts-upgradeable/test/helpers/eip712') const { expect } = require('chai') -const { waffle} = require("hardhat"); +const { waffle } = require('hardhat') function MetaTxModuleCommon () { context('Transferring without paying gas', function () { const AMOUNT_TO_TRANSFER = 11n @@ -25,50 +25,57 @@ function MetaTxModuleCommon () { { name: 'data', type: 'bytes' } ] } - await this.cmtat.connect(this.admin).mint(this.address1, ADDRESS1_INITIAL_BALANCE) - await this.cmtat.connect(this.admin).mint(this.address2, ADDRESS2_INITIAL_BALANCE); + await this.cmtat + .connect(this.admin) + .mint(this.address1, ADDRESS1_INITIAL_BALANCE) + await this.cmtat + .connect(this.admin) + .mint(this.address2, ADDRESS2_INITIAL_BALANCE) expect(await this.cmtat.balanceOf(this.address1)).to.equal( ADDRESS1_INITIAL_BALANCE ) - this.data = this.cmtat.interface.encodeFunctionData('transfer',[this.address2.address, AMOUNT_TO_TRANSFER]) + this.data = this.cmtat.interface.encodeFunctionData('transfer', [ + this.address2.address, + AMOUNT_TO_TRANSFER + ]) this.forgeRequest = async (override = {}, signer = this.address1) => { const req = { from: await signer.getAddress(), to: this.cmtat.target, value: 0n, - data: this.data, + data: this.data, gas: 100000n, deadline: (await helpers.time.latest()) + 60, nonce: await this.forwarder.nonces(this.address1), - ...override, - }; - req.signature = await signer.signTypedData(this.domain, this.types, req); - return req; - }; + ...override + } + req.signature = await signer.signTypedData( + this.domain, + this.types, + req + ) + return req + } }) it('returns true without altering the nonce', async function () { - const request = await this.forgeRequest(); - expect( - await this.forwarder.nonces(request.from) - ).to.equal(request.nonce) + const request = await this.forgeRequest() + expect(await this.forwarder.nonces(request.from)).to.equal(request.nonce) expect(await this.forwarder.verify(request)).to.be.equal(true) - expect( - await this.forwarder.nonces(request.from) - ).to.equal(request.nonce) + expect(await this.forwarder.nonces(request.from)).to.equal(request.nonce) }) it('can send a transfer transaction without paying gas', async function () { - const provider = await ethers.getDefaultProvider();; - const balanceEtherBefore = await provider.getBalance(this.address1); + const provider = await ethers.getDefaultProvider() + const balanceEtherBefore = await provider.getBalance(this.address1) expect(await this.cmtat.balanceOf(this.address1)).to.equal( ADDRESS1_INITIAL_BALANCE ) - const request = await this.forgeRequest(); - await this.forwarder.connect(this.address3).execute(request); + const request = await this.forgeRequest() + await this.forwarder.connect(this.address3).execute(request) expect(await this.cmtat.balanceOf(this.address1)).to.equal( ADDRESS1_INITIAL_BALANCE - AMOUNT_TO_TRANSFER - ); + ) expect(await this.cmtat.balanceOf(this.address2)).to.equal( ADDRESS2_INITIAL_BALANCE + AMOUNT_TO_TRANSFER ) diff --git a/test/common/PauseModuleCommon.js b/test/common/PauseModuleCommon.js index a3794557..337e5901 100644 --- a/test/common/PauseModuleCommon.js +++ b/test/common/PauseModuleCommon.js @@ -1,104 +1,128 @@ -const { PAUSER_ROLE, DEFAULT_ADMIN_ROLE } = require("../utils"); -const { expect } = require('chai'); -function PauseModuleCommon() { - context("Pause", function () { +const { PAUSER_ROLE, DEFAULT_ADMIN_ROLE } = require('../utils') +const { expect } = require('chai') +function PauseModuleCommon () { + context('Pause', function () { /** The admin is assigned the PAUSER role when the contract is deployed */ - it("testCanBePausedByAdmin", async function () { - const AMOUNT_TO_TRANSFER = 10n; + it('testCanBePausedByAdmin', async function () { + const AMOUNT_TO_TRANSFER = 10n // Act - this.logs = await this.cmtat.connect(this.admin).pause(); + this.logs = await this.cmtat.connect(this.admin).pause() // Assert - expect(await this.cmtat.paused()).to.equal(true); + expect(await this.cmtat.paused()).to.equal(true) // emits a Paused event await expect(this.logs) - .to.emit(this.cmtat, "Paused") - .withArgs(this.admin); + .to.emit(this.cmtat, 'Paused') + .withArgs(this.admin) // Transfer is reverted - await expect( this.cmtat - .connect(this.address1) - .transfer(this.address2, AMOUNT_TO_TRANSFER)) - .to.be.revertedWithCustomError(this.cmtat, 'CMTAT_InvalidTransfer') - .withArgs(this.address1.address, this.address2.address, AMOUNT_TO_TRANSFER); - }); - - it("testCanBePausedByPauserRole", async function () { - const AMOUNT_TO_TRANSFER = 10n; + await expect( + this.cmtat + .connect(this.address1) + .transfer(this.address2, AMOUNT_TO_TRANSFER) + ) + .to.be.revertedWithCustomError(this.cmtat, 'CMTAT_InvalidTransfer') + .withArgs( + this.address1.address, + this.address2.address, + AMOUNT_TO_TRANSFER + ) + }) + + it('testCanBePausedByPauserRole', async function () { + const AMOUNT_TO_TRANSFER = 10n // Arrange await this.cmtat .connect(this.admin) - .grantRole(PAUSER_ROLE, this.address1); + .grantRole(PAUSER_ROLE, this.address1) // Act - this.logs = await this.cmtat.connect(this.address1).pause(); + this.logs = await this.cmtat.connect(this.address1).pause() // Assert - expect(await this.cmtat.paused()).to.equal(true); + expect(await this.cmtat.paused()).to.equal(true) // emits a Paused event await expect(this.logs) - .to.emit(this.cmtat, "Paused") - .withArgs(this.address1); + .to.emit(this.cmtat, 'Paused') + .withArgs(this.address1) // Transfer is reverted - await expect( this.cmtat.connect(this.address1).transfer(this.address2, AMOUNT_TO_TRANSFER)) - .to.be.revertedWithCustomError(this.cmtat, 'CMTAT_InvalidTransfer') - .withArgs(this.address1.address, this.address2.address, AMOUNT_TO_TRANSFER); - }); - - it("testCannotBePausedByNonPauser", async function () { - await expect( this.cmtat.connect(this.address1).pause()) - .to.be.revertedWithCustomError(this.cmtat, 'AccessControlUnauthorizedAccount') - .withArgs(this.address1.address, PAUSER_ROLE); - }); - - it("testCanBeUnpausedByAdmin", async function () { + await expect( + this.cmtat + .connect(this.address1) + .transfer(this.address2, AMOUNT_TO_TRANSFER) + ) + .to.be.revertedWithCustomError(this.cmtat, 'CMTAT_InvalidTransfer') + .withArgs( + this.address1.address, + this.address2.address, + AMOUNT_TO_TRANSFER + ) + }) + + it('testCannotBePausedByNonPauser', async function () { + await expect(this.cmtat.connect(this.address1).pause()) + .to.be.revertedWithCustomError( + this.cmtat, + 'AccessControlUnauthorizedAccount' + ) + .withArgs(this.address1.address, PAUSER_ROLE) + }) + + it('testCanBeUnpausedByAdmin', async function () { // Arrange - await this.cmtat.connect(this.admin).pause(); + await this.cmtat.connect(this.admin).pause() // Act - this.logs = await this.cmtat.connect(this.admin).unpause(); + this.logs = await this.cmtat.connect(this.admin).unpause() // Assert - expect(await this.cmtat.paused()).to.equal(false); + expect(await this.cmtat.paused()).to.equal(false) // emits a Unpaused event await expect(this.logs) - .to.emit(this.cmtat, "Unpaused") - .withArgs(this.admin); + .to.emit(this.cmtat, 'Unpaused') + .withArgs(this.admin) // Transfer works - this.cmtat.connect(this.address1).transfer(this.address2, 10n); - }); + this.cmtat.connect(this.address1).transfer(this.address2, 10n) + }) - it("testCanBeUnpausedByANewPauser", async function () { + it('testCanBeUnpausedByANewPauser', async function () { // Arrange - await this.cmtat.connect(this.admin).pause(); - await this.cmtat.connect(this.admin).grantRole(PAUSER_ROLE, this.address1); + await this.cmtat.connect(this.admin).pause() + await this.cmtat + .connect(this.admin) + .grantRole(PAUSER_ROLE, this.address1) // Act - this.logs = await this.cmtat.connect(this.address1).unpause(); + this.logs = await this.cmtat.connect(this.address1).unpause() // Assert - expect(await this.cmtat.paused()).to.equal(false); + expect(await this.cmtat.paused()).to.equal(false) // emits a Unpaused event - await expect(this.logs).to.emit(this.cmtat, "Unpaused").withArgs( this.address1); + await expect(this.logs) + .to.emit(this.cmtat, 'Unpaused') + .withArgs(this.address1) // Transfer works - this.cmtat.connect(this.address1).transfer(this.address2, 10n); - }); + this.cmtat.connect(this.address1).transfer(this.address2, 10n) + }) - it("testCannotBeUnpausedByNonPauser", async function () { + it('testCannotBeUnpausedByNonPauser', async function () { // Arrange - await this.cmtat.connect(this.admin).pause(); + await this.cmtat.connect(this.admin).pause() // Act - await expect( this.cmtat.connect(this.address1).unpause()) - .to.be.revertedWithCustomError(this.cmtat, 'AccessControlUnauthorizedAccount') - .withArgs(this.address1.address, PAUSER_ROLE); - }); + await expect(this.cmtat.connect(this.address1).unpause()) + .to.be.revertedWithCustomError( + this.cmtat, + 'AccessControlUnauthorizedAccount' + ) + .withArgs(this.address1.address, PAUSER_ROLE) + }) // reverts if address1 transfers tokens to address2 when paused - it("testCannotTransferTokenWhenPausedWithTransfer", async function () { - const AMOUNT_TO_TRANSFER = 10n; + it('testCannotTransferTokenWhenPausedWithTransfer', async function () { + const AMOUNT_TO_TRANSFER = 10n // Act - await this.cmtat.connect(this.admin).pause(); + await this.cmtat.connect(this.admin).pause() // Act + Assert expect( await this.cmtat.validateTransfer( @@ -106,7 +130,7 @@ function PauseModuleCommon() { this.address2, AMOUNT_TO_TRANSFER ) - ).to.equal(false); + ).to.equal(false) // Assert expect( await this.cmtat.detectTransferRestriction( @@ -114,26 +138,32 @@ function PauseModuleCommon() { this.address2, AMOUNT_TO_TRANSFER ) - ).to.equal("1"); + ).to.equal('1') expect(await this.cmtat.messageForTransferRestriction(1)).to.equal( - "All transfers paused" - ); - await expect( this.cmtat - .connect(this.address1) - .transfer(this.address2, AMOUNT_TO_TRANSFER)) - .to.be.revertedWithCustomError(this.cmtat, 'CMTAT_InvalidTransfer') - .withArgs(this.address1.address, this.address2.address, AMOUNT_TO_TRANSFER); - }); + 'All transfers paused' + ) + await expect( + this.cmtat + .connect(this.address1) + .transfer(this.address2, AMOUNT_TO_TRANSFER) + ) + .to.be.revertedWithCustomError(this.cmtat, 'CMTAT_InvalidTransfer') + .withArgs( + this.address1.address, + this.address2.address, + AMOUNT_TO_TRANSFER + ) + }) // reverts if address3 transfers tokens from address1 to address2 when paused - it("testCannotTransferTokenWhenPausedWithTransferFrom", async function () { - const AMOUNT_TO_TRANSFER = 10n; + it('testCannotTransferTokenWhenPausedWithTransferFrom', async function () { + const AMOUNT_TO_TRANSFER = 10n // Arrange // Define allowance - await this.cmtat.connect(this.address1).approve(this.address3, 20); + await this.cmtat.connect(this.address1).approve(this.address3, 20) // Act - await this.cmtat.connect(this.admin).pause(); + await this.cmtat.connect(this.admin).pause() // Assert expect( @@ -142,51 +172,74 @@ function PauseModuleCommon() { this.address2, AMOUNT_TO_TRANSFER ) - ).to.equal("1"); + ).to.equal('1') expect(await this.cmtat.messageForTransferRestriction(1)).to.equal( - "All transfers paused" - ); - await expect( this.cmtat - .connect(this.address3) - .transferFrom(this.address1, this.address2, AMOUNT_TO_TRANSFER)) - .to.be.revertedWithCustomError(this.cmtat, 'CMTAT_InvalidTransfer') - .withArgs(this.address1.address, this.address2.address, AMOUNT_TO_TRANSFER); - }); - }); - - context("DeactivateContract", function () { + 'All transfers paused' + ) + await expect( + this.cmtat + .connect(this.address3) + .transferFrom(this.address1, this.address2, AMOUNT_TO_TRANSFER) + ) + .to.be.revertedWithCustomError(this.cmtat, 'CMTAT_InvalidTransfer') + .withArgs( + this.address1.address, + this.address2.address, + AMOUNT_TO_TRANSFER + ) + }) + }) + + context('DeactivateContract', function () { /** The admin is assigned the PAUSER role when the contract is deployed */ - it("testCanDeactivatedByAdmin", async function () { - const AMOUNT_TO_TRANSFER = 10n; + it('testCanDeactivatedByAdmin', async function () { + const AMOUNT_TO_TRANSFER = 10n // Act - this.logs = await this.cmtat.connect(this.admin).deactivateContract(); + this.logs = await this.cmtat.connect(this.admin).deactivateContract() // Assert - expect(await this.cmtat.deactivated()).to.equal(true); + expect(await this.cmtat.deactivated()).to.equal(true) // Contract is in pause state - expect(await this.cmtat.paused()).to.equal(true); + expect(await this.cmtat.paused()).to.equal(true) // emits a Deactivated event - await expect(this.logs).to.emit(this.cmtat, 'Deactivated').withArgs(this.admin); + await expect(this.logs) + .to.emit(this.cmtat, 'Deactivated') + .withArgs(this.admin) // Transfer is reverted because contract is in paused state - await expect(this.cmtat.connect(this.address1).transfer(this.address2, AMOUNT_TO_TRANSFER)) - .to.be.revertedWithCustomError(this.cmtat, 'CMTAT_InvalidTransfer') - .withArgs(this.address1.address, this.address2.address, AMOUNT_TO_TRANSFER); + await expect( + this.cmtat + .connect(this.address1) + .transfer(this.address2, AMOUNT_TO_TRANSFER) + ) + .to.be.revertedWithCustomError(this.cmtat, 'CMTAT_InvalidTransfer') + .withArgs( + this.address1.address, + this.address2.address, + AMOUNT_TO_TRANSFER + ) // Unpause is reverted - await expect( this.cmtat.connect(this.admin).unpause()) - .to.be.revertedWithCustomError(this.cmtat, 'CMTAT_PauseModule_ContractIsDeactivated') - }); - - it("testCannotBeDeactivatedByNonAdmin", async function () { + await expect( + this.cmtat.connect(this.admin).unpause() + ).to.be.revertedWithCustomError( + this.cmtat, + 'CMTAT_PauseModule_ContractIsDeactivated' + ) + }) + + it('testCannotBeDeactivatedByNonAdmin', async function () { // Act - await expect( this.cmtat.connect(this.address1).deactivateContract()) - .to.be.revertedWithCustomError(this.cmtat, 'AccessControlUnauthorizedAccount') - .withArgs(this.address1.address, DEFAULT_ADMIN_ROLE); + await expect(this.cmtat.connect(this.address1).deactivateContract()) + .to.be.revertedWithCustomError( + this.cmtat, + 'AccessControlUnauthorizedAccount' + ) + .withArgs(this.address1.address, DEFAULT_ADMIN_ROLE) // Assert - expect(await this.cmtat.deactivated()).to.equal(false); - }); - }); + expect(await this.cmtat.deactivated()).to.equal(false) + }) + }) } -module.exports = PauseModuleCommon; +module.exports = PauseModuleCommon diff --git a/test/common/ValidationModule/ValidationModuleCommon.js b/test/common/ValidationModule/ValidationModuleCommon.js index 26493f0e..8ec9f09e 100644 --- a/test/common/ValidationModule/ValidationModuleCommon.js +++ b/test/common/ValidationModule/ValidationModuleCommon.js @@ -1,4 +1,4 @@ -const { expect } = require('chai'); +const { expect } = require('chai') const { RULE_MOCK_AMOUNT_MAX, ZERO_ADDRESS } = require('../../utils') function ValidationModuleCommon () { @@ -6,20 +6,24 @@ function ValidationModuleCommon () { context('RuleEngineTransferTest', function () { beforeEach(async function () { if ((await this.cmtat.ruleEngine()) === ZERO_ADDRESS) { - this.ruleEngineMock = await ethers.deployContract("RuleEngineMock") - await this.cmtat.connect(this.admin).setRuleEngine(this.ruleEngineMock.target) + this.ruleEngineMock = await ethers.deployContract('RuleEngineMock') + await this.cmtat + .connect(this.admin) + .setRuleEngine(this.ruleEngineMock.target) } }) - it("testCanReturnTheRightAddressIfSet", async function (){ - if(this.definedAtDeployment){ - expect(this.ruleEngineMock.target).to.equal(await this.cmtat.ruleEngine()); + it('testCanReturnTheRightAddressIfSet', async function () { + if (this.definedAtDeployment) { + expect(this.ruleEngineMock.target).to.equal( + await this.cmtat.ruleEngine() + ) } - }); + }) it('testCanValidateTransferWithoutRuleEngine', async function () { - // Arrange - await this.cmtat.connect(this.admin).setRuleEngine(ZERO_ADDRESS); + // Arrange + await this.cmtat.connect(this.admin).setRuleEngine(ZERO_ADDRESS) // Act + Assert - expect( + expect( await this.cmtat.validateTransfer(this.address1, this.address2, 10) ).to.equal(true) }) @@ -27,8 +31,12 @@ function ValidationModuleCommon () { it('testCanDetectTransferRestrictionValidTransfer', async function () { // Act + Assert expect( - await this.cmtat.detectTransferRestriction(this.address1, this.address2, 11) - ).to.equal(0); + await this.cmtat.detectTransferRestriction( + this.address1, + this.address2, + 11 + ) + ).to.equal(0) expect( await this.cmtat.validateTransfer(this.address1, this.address2, 11) ).to.equal(true) @@ -49,7 +57,7 @@ function ValidationModuleCommon () { this.address2, RULE_MOCK_AMOUNT_MAX + 1 ) - ).to.equal(10n); + ).to.equal(10n) expect( await this.cmtat.validateTransfer( @@ -76,7 +84,7 @@ function ValidationModuleCommon () { // this.address1 may transfer tokens to this.address2 it('testCanTransferAllowedByRule', async function () { - const AMOUNT_TO_TRANSFER = 11n; + const AMOUNT_TO_TRANSFER = 11n // Act expect( await this.cmtat.validateTransfer( @@ -86,14 +94,16 @@ function ValidationModuleCommon () { ) ).to.equal(true) // Act - await this.cmtat.connect(this.address1).transfer(this.address2, AMOUNT_TO_TRANSFER); + await this.cmtat + .connect(this.address1) + .transfer(this.address2, AMOUNT_TO_TRANSFER) // Assert expect(await this.cmtat.balanceOf(this.address1)).to.equal( this.ADDRESS1_INITIAL_BALANCE - AMOUNT_TO_TRANSFER - ); + ) expect(await this.cmtat.balanceOf(this.address2)).to.equal( this.ADDRESS2_INITIAL_BALANCE + AMOUNT_TO_TRANSFER - ); + ) expect(await this.cmtat.balanceOf(this.address3)).to.equal( this.ADDRESS3_INITIAL_BALANCE ) @@ -101,7 +111,7 @@ function ValidationModuleCommon () { // reverts if this.address1 transfers more tokens than rule allows it('testCannotTransferIfNotAllowedByRule', async function () { - const AMOUNT_TO_TRANSFER = RULE_MOCK_AMOUNT_MAX + 1; + const AMOUNT_TO_TRANSFER = RULE_MOCK_AMOUNT_MAX + 1 // Act expect( await this.cmtat.validateTransfer( @@ -111,9 +121,17 @@ function ValidationModuleCommon () { ) ).to.equal(false) // Act - await expect(this.cmtat.connect(this.address1).transfer(this.address2, AMOUNT_TO_TRANSFER)) - .to.be.revertedWithCustomError(this.cmtat, 'CMTAT_InvalidTransfer') - .withArgs(this.address1.address, this.address2.address, AMOUNT_TO_TRANSFER) + await expect( + this.cmtat + .connect(this.address1) + .transfer(this.address2, AMOUNT_TO_TRANSFER) + ) + .to.be.revertedWithCustomError(this.cmtat, 'CMTAT_InvalidTransfer') + .withArgs( + this.address1.address, + this.address2.address, + AMOUNT_TO_TRANSFER + ) }) }) } diff --git a/test/common/ValidationModule/ValidationModuleSetRuleEngineCommon.js b/test/common/ValidationModule/ValidationModuleSetRuleEngineCommon.js index 33209258..6d9b15ad 100644 --- a/test/common/ValidationModule/ValidationModuleSetRuleEngineCommon.js +++ b/test/common/ValidationModule/ValidationModuleSetRuleEngineCommon.js @@ -1,29 +1,42 @@ -const { expect } = require('chai'); +const { expect } = require('chai') const { DEFAULT_ADMIN_ROLE } = require('../../utils') function ValidationModuleSetRuleEngineCommon () { context('RuleEngineSetTest', function () { it('testCanBeSetByAdmin', async function () { // Act - this.logs = await this.cmtat.connect(this.admin).setRuleEngine(this.ruleEngine) + this.logs = await this.cmtat + .connect(this.admin) + .setRuleEngine(this.ruleEngine) // Assert // emits a RuleEngineSet event await expect(this.logs) - .to.emit(this.cmtat, "RuleEngine") - .withArgs(this.ruleEngine); + .to.emit(this.cmtat, 'RuleEngine') + .withArgs(this.ruleEngine) }) it('testCanNotBeSetByAdminWithTheSameValue', async function () { // Act - await expect(this.cmtat.connect(this.admin).setRuleEngine(await this.cmtat.ruleEngine())) - .to.be.revertedWithCustomError(this.cmtat, 'CMTAT_ValidationModule_SameValue') + await expect( + this.cmtat + .connect(this.admin) + .setRuleEngine(await this.cmtat.ruleEngine()) + ).to.be.revertedWithCustomError( + this.cmtat, + 'CMTAT_ValidationModule_SameValue' + ) }) it('testCannotBeSetByNonAdmin', async function () { // Act - await expect( this.cmtat.connect(this.address1).setRuleEngine(this.ruleEngine)) - .to.be.revertedWithCustomError(this.cmtat, 'AccessControlUnauthorizedAccount') - .withArgs(this.address1.address, DEFAULT_ADMIN_ROLE); + await expect( + this.cmtat.connect(this.address1).setRuleEngine(this.ruleEngine) + ) + .to.be.revertedWithCustomError( + this.cmtat, + 'AccessControlUnauthorizedAccount' + ) + .withArgs(this.address1.address, DEFAULT_ADMIN_ROLE) }) it('testCanReturnMessageWithNoRuleEngine&UnknownRestrictionCode', async function () { @@ -36,7 +49,11 @@ function ValidationModuleSetRuleEngineCommon () { it('testCanDetectTransferRestrictionValidTransferWithoutRuleEngine', async function () { // Act + Assert expect( - await this.cmtat.detectTransferRestriction(this.address1, this.admin, 11) + await this.cmtat.detectTransferRestriction( + this.address1, + this.admin, + 11 + ) ).to.equal('0') }) }) diff --git a/test/deployment/deployment.test.js b/test/deployment/deployment.test.js index 4ef95764..9c387620 100644 --- a/test/deployment/deployment.test.js +++ b/test/deployment/deployment.test.js @@ -1,47 +1,62 @@ const { ZERO_ADDRESS } = require('../utils') -const { expect } = require('chai'); +const { expect } = require('chai') const { deployCMTATProxyWithParameter, deployCMTATStandaloneWithParameter, deployCMTATProxy, - fixture, loadFixture + fixture, + loadFixture } = require('../deploymentUtils') describe('CMTAT - Deployment', function () { beforeEach(async function () { - Object.assign(this, await loadFixture(fixture)); - this.cmtatCustomError = await deployCMTATProxy(this._.address, this.admin.address, this.deployerAddress.address) + Object.assign(this, await loadFixture(fixture)) + this.cmtatCustomError = await deployCMTATProxy( + this._.address, + this.admin.address, + this.deployerAddress.address + ) }) it('testCannotDeployProxyWithAdminSetToAddressZero', async function () { const DECIMAL = 0 // Act + Assert - await expect( deployCMTATProxyWithParameter( - this.deployerAddress.address, - this._.address, - ZERO_ADDRESS, - 'CMTA Token', - 'CMTAT', - DECIMAL, - 'CMTAT_ISIN', - 'https://cmta.ch', - 'CMTAT_info', - [ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS])) - .to.be.revertedWithCustomError( this.cmtatCustomError, 'CMTAT_AuthorizationModule_AddressZeroNotAllowed') + await expect( + deployCMTATProxyWithParameter( + this.deployerAddress.address, + this._.address, + ZERO_ADDRESS, + 'CMTA Token', + 'CMTAT', + DECIMAL, + 'CMTAT_ISIN', + 'https://cmta.ch', + 'CMTAT_info', + [ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS] + ) + ).to.be.revertedWithCustomError( + this.cmtatCustomError, + 'CMTAT_AuthorizationModule_AddressZeroNotAllowed' + ) }) it('testCannotDeployStandaloneWithAdminSetToAddressZero', async function () { const DECIMAL = 0 // Act + Assert - await expect( deployCMTATStandaloneWithParameter( - this.deployerAddress.address, - this._.address, - ZERO_ADDRESS, - 'CMTA Token', - 'CMTAT', - DECIMAL, - 'CMTAT_ISIN', - 'https://cmta.ch', - 'CMTAT_info', - [ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS])) - .to.be.revertedWithCustomError( this.cmtatCustomError, 'CMTAT_AuthorizationModule_AddressZeroNotAllowed') + await expect( + deployCMTATStandaloneWithParameter( + this.deployerAddress.address, + this._.address, + ZERO_ADDRESS, + 'CMTA Token', + 'CMTAT', + DECIMAL, + 'CMTAT_ISIN', + 'https://cmta.ch', + 'CMTAT_info', + [ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS] + ) + ).to.be.revertedWithCustomError( + this.cmtatCustomError, + 'CMTAT_AuthorizationModule_AddressZeroNotAllowed' + ) }) }) diff --git a/test/deploymentUtils.js b/test/deploymentUtils.js index a5e31992..0bfc3c15 100644 --- a/test/deploymentUtils.js +++ b/test/deploymentUtils.js @@ -1,18 +1,39 @@ -const { loadFixture } = require('@nomicfoundation/hardhat-network-helpers'); +const { loadFixture } = require('@nomicfoundation/hardhat-network-helpers') const { ZERO_ADDRESS } = require('./utils') const { ethers, upgrades } = require('hardhat') const DEPLOYMENT_DECIMAL = 0n -async function fixture() { - const [_, admin, address1, address2, address3, deployerAddress, fakeRuleEngine, ruleEngine, attacker] = await ethers.getSigners() - return {_, admin, address1, address2, address3, deployerAddress, fakeRuleEngine, ruleEngine, attacker }; +async function fixture () { + const [ + _, + admin, + address1, + address2, + address3, + deployerAddress, + fakeRuleEngine, + ruleEngine, + attacker + ] = await ethers.getSigners() + return { + _, + admin, + address1, + address2, + address3, + deployerAddress, + fakeRuleEngine, + ruleEngine, + attacker + } } async function deployCMTATStandalone (_, admin, deployerAddress) { - - const cmtat = await ethers.deployContract("CMTAT_STANDALONE", [ _, + const cmtat = await ethers.deployContract('CMTAT_STANDALONE', [ + _, admin, - ['CMTA Token', 'CMTAT', DEPLOYMENT_DECIMAL], - ['CMTAT_ISIN', 'https://cmta.ch', 'CMTAT_info'], - [ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS]]); + ['CMTA Token', 'CMTAT', DEPLOYMENT_DECIMAL], + ['CMTAT_ISIN', 'https://cmta.ch', 'CMTAT_info'], + [ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS] + ]) return cmtat } @@ -20,7 +41,9 @@ async function deployCMTATProxyImplementation ( deployerAddress, forwarderIrrevocable ) { - const cmtat = await ethers.deployContract('CMTAT_PROXY',[forwarderIrrevocable]) + const cmtat = await ethers.deployContract('CMTAT_PROXY', [ + forwarderIrrevocable + ]) return cmtat } @@ -28,7 +51,9 @@ async function deployCMTATProxyUUPSImplementation ( deployerAddress, forwarderIrrevocable ) { - const cmtat = await ethers.deployContract('CMTAT_PROXY_UUPS',[forwarderIrrevocable]) + const cmtat = await ethers.deployContract('CMTAT_PROXY_UUPS', [ + forwarderIrrevocable + ]) return cmtat } @@ -44,11 +69,11 @@ async function deployCMTATStandaloneWithParameter ( information_, engines ) { - const cmtat = await ethers.deployContract('CMTAT_STANDALONE',[ + const cmtat = await ethers.deployContract('CMTAT_STANDALONE', [ forwarderIrrevocable, admin, - [ nameIrrevocable, symbolIrrevocable, decimalsIrrevocable], - [tokenId_, terms_, information_], + [nameIrrevocable, symbolIrrevocable, decimalsIrrevocable], + [tokenId_, terms_, information_], engines ]) return cmtat @@ -63,8 +88,8 @@ async function deployCMTATProxy (_, admin, deployerAddress) { ETHERS_CMTAT_PROXY_FACTORY, [ admin, - ['CMTA Token', 'CMTAT', DEPLOYMENT_DECIMAL], - ['CMTAT_ISIN', 'https://cmta.ch', 'CMTAT_info'], + ['CMTA Token', 'CMTAT', DEPLOYMENT_DECIMAL], + ['CMTAT_ISIN', 'https://cmta.ch', 'CMTAT_info'], [ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS] ], { @@ -96,8 +121,8 @@ async function deployCMTATProxyWithParameter ( ETHERS_CMTAT_PROXY_FACTORY, [ admin, - [ nameIrrevocable, symbolIrrevocable, decimalsIrrevocable], - [tokenId_, terms_, information_], + [nameIrrevocable, symbolIrrevocable, decimalsIrrevocable], + [tokenId_, terms_, information_], engines ], { @@ -106,7 +131,7 @@ async function deployCMTATProxyWithParameter ( from: deployerAddress } ) - //return ETHERS_CMTAT_PROXY.getAddress() + // return ETHERS_CMTAT_PROXY.getAddress() return ETHERS_CMTAT_PROXY } diff --git a/test/proxy/general/Proxy.test.js b/test/proxy/general/Proxy.test.js index 7d956442..7dd4241d 100644 --- a/test/proxy/general/Proxy.test.js +++ b/test/proxy/general/Proxy.test.js @@ -1,48 +1,54 @@ -const { expect } = require('chai'); +const { expect } = require('chai') const { DEFAULT_ADMIN_ROLE, PAUSER_ROLE } = require('../../utils') const { ZERO_ADDRESS } = require('../../utils') -const { deployCMTATProxy, +const { + deployCMTATProxy, fixture, loadFixture, - DEPLOYMENT_DECIMAL } = require('../../deploymentUtils') + DEPLOYMENT_DECIMAL +} = require('../../deploymentUtils') const { upgrades } = require('hardhat') -describe( - 'Proxy - Security Test', - function () { - beforeEach(async function () { - Object.assign(this, await loadFixture(fixture)); - // Contract to deploy: CMTAT - this.CMTAT_PROXY = await deployCMTATProxy(this._.address, this.admin.address, this.deployerAddress.address) - const implementationContractAddress = - await upgrades.erc1967.getImplementationAddress( - this.CMTAT_PROXY.target - ) +describe('Proxy - Security Test', function () { + beforeEach(async function () { + Object.assign(this, await loadFixture(fixture)) + // Contract to deploy: CMTAT + this.CMTAT_PROXY = await deployCMTATProxy( + this._.address, + this.admin.address, + this.deployerAddress.address + ) + const implementationContractAddress = + await upgrades.erc1967.getImplementationAddress(this.CMTAT_PROXY.target) - const MyContract = await ethers.getContractFactory("CMTAT_PROXY"); - this.implementationContract = MyContract.attach( - implementationContractAddress - ) - }) + const MyContract = await ethers.getContractFactory('CMTAT_PROXY') + this.implementationContract = MyContract.attach( + implementationContractAddress + ) + }) - context('Attacker', function () { - it('testCannotBeTakenControlByAttacker', async function () { - // Act - await expect( this.implementationContract.connect(this.attacker).initialize( - this.attacker, - ['CMTA Token', - 'CMTAT', - DEPLOYMENT_DECIMAL], - ['CMTAT_ISIN', - 'https://cmta.ch', - 'CMTAT_info'], - [ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS] - )) - .to.be.revertedWithCustomError(this.implementationContract, 'InvalidInitialization') - // act + assert - await expect( this.implementationContract.connect(this.attacker).pause()) - .to.be.revertedWithCustomError(this.implementationContract, 'AccessControlUnauthorizedAccount') + context('Attacker', function () { + it('testCannotBeTakenControlByAttacker', async function () { + // Act + await expect( + this.implementationContract + .connect(this.attacker) + .initialize( + this.attacker, + ['CMTA Token', 'CMTAT', DEPLOYMENT_DECIMAL], + ['CMTAT_ISIN', 'https://cmta.ch', 'CMTAT_info'], + [ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS] + ) + ).to.be.revertedWithCustomError( + this.implementationContract, + 'InvalidInitialization' + ) + // act + assert + await expect(this.implementationContract.connect(this.attacker).pause()) + .to.be.revertedWithCustomError( + this.implementationContract, + 'AccessControlUnauthorizedAccount' + ) .withArgs(this.attacker.address, PAUSER_ROLE) - }) }) - } -) + }) +}) diff --git a/test/proxy/general/UpgradeProxy.test.js b/test/proxy/general/UpgradeProxy.test.js index 85968e47..7eac4889 100644 --- a/test/proxy/general/UpgradeProxy.test.js +++ b/test/proxy/general/UpgradeProxy.test.js @@ -1,44 +1,36 @@ -const { expect } = require('chai'); +const { expect } = require('chai') const { ZERO_ADDRESS } = require('../../utils') const UpgradeProxyCommon = require('./UpgradeProxyCommon') const { DEPLOYMENT_DECIMAL, - fixture, loadFixture + fixture, + loadFixture } = require('../../deploymentUtils') const { ethers, upgrades } = require('hardhat') -let CMTAT_PROXY_FACTORY,CMTAT_PROXY_TEST_FACTORY, CMTAT_PROXY -describe( - 'UpgradeableCMTAT - Proxy', - function () { - beforeEach(async function () { - Object.assign(this, await loadFixture(fixture)); - /* Factory & Artefact */ - CMTAT_PROXY_FACTORY = await ethers.getContractFactory( - 'CMTAT_PROXY' - ) - this.CMTAT_PROXY_TestFactory = await ethers.getContractFactory( - 'CMTAT_PROXY_TEST' - ) - // Deployment - this.CMTAT = await upgrades.deployProxy( - CMTAT_PROXY_FACTORY, - [ - this.admin.address, - ['CMTA Token', - 'CMTAT', - DEPLOYMENT_DECIMAL], - ['CMTAT_ISIN', - 'https://cmta.ch', - 'CMTAT_info'], - [ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS] - ], - { - initializer: 'initialize', - constructorArgs: [this._.address], - from: this.deployerAddress.address - } - ) - }) - UpgradeProxyCommon() - } -) +let CMTAT_PROXY_FACTORY, CMTAT_PROXY_TEST_FACTORY, CMTAT_PROXY +describe('UpgradeableCMTAT - Proxy', function () { + beforeEach(async function () { + Object.assign(this, await loadFixture(fixture)) + /* Factory & Artefact */ + CMTAT_PROXY_FACTORY = await ethers.getContractFactory('CMTAT_PROXY') + this.CMTAT_PROXY_TestFactory = await ethers.getContractFactory( + 'CMTAT_PROXY_TEST' + ) + // Deployment + this.CMTAT = await upgrades.deployProxy( + CMTAT_PROXY_FACTORY, + [ + this.admin.address, + ['CMTA Token', 'CMTAT', DEPLOYMENT_DECIMAL], + ['CMTAT_ISIN', 'https://cmta.ch', 'CMTAT_info'], + [ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS] + ], + { + initializer: 'initialize', + constructorArgs: [this._.address], + from: this.deployerAddress.address + } + ) + }) + UpgradeProxyCommon() +}) diff --git a/test/proxy/general/UpgradeProxyCommon.js b/test/proxy/general/UpgradeProxyCommon.js index 68b3beb2..363c0cba 100644 --- a/test/proxy/general/UpgradeProxyCommon.js +++ b/test/proxy/general/UpgradeProxyCommon.js @@ -1,93 +1,77 @@ -const { expect } = require('chai'); +const { expect } = require('chai') const { ethers, upgrades } = require('hardhat') -function UpgradeProxyCommon () { - +function UpgradeProxyCommon () { /* - * Functions used: balanceOf, totalSupply, mint - */ - it('testKeepStorageForTokens', async function () { - // Get Proxy Address - const CMTAT_PROXY_ADDRESS = await this.CMTAT.getAddress() - const IMPLEMENTATION_CONTRACT_ADDRESS_V1 = - await upgrades.erc1967.getImplementationAddress(CMTAT_PROXY_ADDRESS); + * Functions used: balanceOf, totalSupply, mint + */ + it('testKeepStorageForTokens', async function () { + // Get Proxy Address + const CMTAT_PROXY_ADDRESS = await this.CMTAT.getAddress() + const IMPLEMENTATION_CONTRACT_ADDRESS_V1 = + await upgrades.erc1967.getImplementationAddress(CMTAT_PROXY_ADDRESS) - // With the first version of CMTAT - expect( - await this.CMTAT.balanceOf(this.admin) - ).to.equal('0'); + // With the first version of CMTAT + expect(await this.CMTAT.balanceOf(this.admin)).to.equal('0'); - // Issue 20 and check balances and total supply - ({ logs: this.logs1 } = await this.CMTAT.connect(this.admin).mint( - this.address1, - 20 - )); + // Issue 20 and check balances and total supply + ({ logs: this.logs1 } = await this.CMTAT.connect(this.admin).mint( + this.address1, + 20 + )) - expect( - await this.CMTAT.balanceOf(this.address1) - ).to.equal('20'); - expect( - await this.CMTAT.totalSupply() - ).to.equal('20') + expect(await this.CMTAT.balanceOf(this.address1)).to.equal('20') + expect(await this.CMTAT.totalSupply()).to.equal('20') - // Upgrade the proxy with a new implementation contract - let CMTAT_PROXY_V2 - if(this.IsUUPSProxy){ - CMTAT_PROXY_V2 = await upgrades.upgradeProxy( - CMTAT_PROXY_ADDRESS, - this.CMTAT_PROXY_TestFactory.connect(this.admin), - { - constructorArgs: [this._.address], - kind: 'uups' - } - ) - }else{ - CMTAT_PROXY_V2 = await upgrades.upgradeProxy( - CMTAT_PROXY_ADDRESS, - this.CMTAT_PROXY_TestFactory, - { - constructorArgs: [this._.address] - } - ) - } - - const PROXY_ADDRESS_V2_INSTANCE = - await CMTAT_PROXY_V2.getAddress() + // Upgrade the proxy with a new implementation contract + let CMTAT_PROXY_V2 + if (this.IsUUPSProxy) { + CMTAT_PROXY_V2 = await upgrades.upgradeProxy( + CMTAT_PROXY_ADDRESS, + this.CMTAT_PROXY_TestFactory.connect(this.admin), + { + constructorArgs: [this._.address], + kind: 'uups' + } + ) + } else { + CMTAT_PROXY_V2 = await upgrades.upgradeProxy( + CMTAT_PROXY_ADDRESS, + this.CMTAT_PROXY_TestFactory, + { + constructorArgs: [this._.address] + } + ) + } - // Get the new implementation contract address - const IMPLEMENTATION_CONTRACT_ADDRESS_V2 = - await upgrades.erc1967.getImplementationAddress( - PROXY_ADDRESS_V2_INSTANCE - ) + const PROXY_ADDRESS_V2_INSTANCE = await CMTAT_PROXY_V2.getAddress() - // Just to be sure that the proxy address remains unchanged - expect(CMTAT_PROXY_ADDRESS).to.equal(PROXY_ADDRESS_V2_INSTANCE); + // Get the new implementation contract address + const IMPLEMENTATION_CONTRACT_ADDRESS_V2 = + await upgrades.erc1967.getImplementationAddress( + PROXY_ADDRESS_V2_INSTANCE + ) - // The address of the implementation contract has changed - expect(IMPLEMENTATION_CONTRACT_ADDRESS_V1).to.not.equal( - IMPLEMENTATION_CONTRACT_ADDRESS_V2 - ); + // Just to be sure that the proxy address remains unchanged + expect(CMTAT_PROXY_ADDRESS).to.equal(PROXY_ADDRESS_V2_INSTANCE) - ({ logs: this.logs1 } = await CMTAT_PROXY_V2.balanceOf( - this.address1 - )) + // The address of the implementation contract has changed + expect(IMPLEMENTATION_CONTRACT_ADDRESS_V1).to.not.equal( + IMPLEMENTATION_CONTRACT_ADDRESS_V2 + ); - expect( - await CMTAT_PROXY_V2.balanceOf(this.address1) - ).to.equal(20); + ({ logs: this.logs1 } = await CMTAT_PROXY_V2.balanceOf(this.address1)) - // keep the storage + expect(await CMTAT_PROXY_V2.balanceOf(this.address1)).to.equal(20); - // Issue 20 and check balances and total supply - ({ logs: this.logs1 } = await CMTAT_PROXY_V2.connect(this.admin).mint( - this.address1, - 20 - )); - expect( - await CMTAT_PROXY_V2.balanceOf(this.address1) - ).to.equal('40'); - expect( - await CMTAT_PROXY_V2.totalSupply() - ).to.equal('40') - }) - } - module.exports = UpgradeProxyCommon; + // keep the storage + + // Issue 20 and check balances and total supply + ({ logs: this.logs1 } = await CMTAT_PROXY_V2.connect(this.admin).mint( + this.address1, + 20 + )) + expect(await CMTAT_PROXY_V2.balanceOf(this.address1)).to.equal('40') + expect(await CMTAT_PROXY_V2.totalSupply()).to.equal('40') + }) +} +module.exports = UpgradeProxyCommon diff --git a/test/proxy/general/UpgradeProxyUUPS.test.js b/test/proxy/general/UpgradeProxyUUPS.test.js index 9291921a..eb62139c 100644 --- a/test/proxy/general/UpgradeProxyUUPS.test.js +++ b/test/proxy/general/UpgradeProxyUUPS.test.js @@ -1,53 +1,67 @@ -const { expect } = require("chai"); -const { ethers, upgrades } = require("hardhat"); +const { expect } = require('chai') +const { ethers, upgrades } = require('hardhat') const { ZERO_ADDRESS, PROXY_UPGRADE_ROLE } = require('../../utils') const UpgradeProxyCommon = require('./UpgradeProxyCommon') - + const { - DEPLOYMENT_DECIMAL, - fixture, loadFixture - } = require('../../deploymentUtils') -describe("CMTAT with UUPS Proxy", function () { + DEPLOYMENT_DECIMAL, + fixture, + loadFixture +} = require('../../deploymentUtils') +describe('CMTAT with UUPS Proxy', function () { beforeEach(async function () { - Object.assign(this, await loadFixture(fixture)); + Object.assign(this, await loadFixture(fixture)) // Deploy the implementation contract - CMTAT_PROXY_FACTORY = await ethers.getContractFactory( - 'CMTAT_PROXY_UUPS' - ) - this.CMTAT_PROXY_TestFactory = await ethers.getContractFactory( - 'CMTAT_PROXY_TEST_UUPS' - ) + CMTAT_PROXY_FACTORY = await ethers.getContractFactory('CMTAT_PROXY_UUPS') + this.CMTAT_PROXY_TestFactory = await ethers.getContractFactory( + 'CMTAT_PROXY_TEST_UUPS' + ) this.IsUUPSProxy = true - this.CMTAT = await upgrades.deployProxy(CMTAT_PROXY_FACTORY, [this.admin.address, - ['CMTA Token', - 'CMTAT', - DEPLOYMENT_DECIMAL], - ['CMTAT_ISIN', - 'https://cmta.ch', - 'CMTAT_info'], - [ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS]], - { initializer: 'initialize', kind: 'uups',constructorArgs: [this._.address] }); + this.CMTAT = await upgrades.deployProxy( + CMTAT_PROXY_FACTORY, + [ + this.admin.address, + ['CMTA Token', 'CMTAT', DEPLOYMENT_DECIMAL], + ['CMTAT_ISIN', 'https://cmta.ch', 'CMTAT_info'], + [ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS] + ], + { + initializer: 'initialize', + kind: 'uups', + constructorArgs: [this._.address] + } + ) }) - + UpgradeProxyCommon() + it('testAdminCanUpgradeProxy', async function () { + await upgrades.upgradeProxy( + this.CMTAT.target, + this.CMTAT_PROXY_TestFactory.connect(this.admin), + { + constructorArgs: [this._.address], + kind: 'uups' + } + ) + }) - it("testAdminCanUpgradeProxy", async function () { - await upgrades.upgradeProxy(this.CMTAT.target, this.CMTAT_PROXY_TestFactory.connect(this.admin), + it('testNonAdminCanNotUpgradeProxy', async function () { + await expect( + upgrades.upgradeProxy( + this.CMTAT.target, + this.CMTAT_PROXY_TestFactory.connect(this.address1), { - constructorArgs: [this._.address], - kind: 'uups' - }); - }); - - it("testNonAdminCanNotUpgradeProxy", async function () { - await expect( upgrades.upgradeProxy(this.CMTAT.target, this.CMTAT_PROXY_TestFactory.connect(this.address1), - { - constructorArgs: [this._.address], - kind: 'uups' - })) - .to.be.revertedWithCustomError(this.CMTAT, 'AccessControlUnauthorizedAccount') - .withArgs(this.address1.address, PROXY_UPGRADE_ROLE) - }); -}); \ No newline at end of file + constructorArgs: [this._.address], + kind: 'uups' + } + ) + ) + .to.be.revertedWithCustomError( + this.CMTAT, + 'AccessControlUnauthorizedAccount' + ) + .withArgs(this.address1.address, PROXY_UPGRADE_ROLE) + }) +}) diff --git a/test/proxy/general/factory/Beacon.test.js b/test/proxy/general/factory/Beacon.test.js index de1f251c..fe702cc8 100644 --- a/test/proxy/general/factory/Beacon.test.js +++ b/test/proxy/general/factory/Beacon.test.js @@ -1,106 +1,107 @@ -const { expect } = require('chai'); +const { expect } = require('chai') const { CMTAT_DEPLOYER_ROLE } = require('../../../utils.js') const { ZERO_ADDRESS } = require('../../../utils.js') const { deployCMTATProxyImplementation, - fixture, loadFixture + fixture, + loadFixture } = require('../../../deploymentUtils.js') const DEPLOYMENT_DECIMAL = 0 -describe( - 'Deploy Beacon with Factory', - function () { - beforeEach(async function () { - Object.assign(this, await loadFixture(fixture)); - this.CMTAT_PROXY_IMPL = await deployCMTATProxyImplementation( - this.deployerAddress.address, - this._.address, - ) - this.FACTORY = await ethers.deployContract("CMTAT_BEACON_FACTORY",[ - this.CMTAT_PROXY_IMPL.target, - this.admin, - this.admin, - false - ]) - this.CMTATArg = [ - this.admin, - ['CMTA Token', - 'CMTAT', - DEPLOYMENT_DECIMAL], - ['CMTAT_ISIN', - 'https://cmta.ch', - 'CMTAT_info'], - [ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS] - ]; - }) +describe('Deploy Beacon with Factory', function () { + beforeEach(async function () { + Object.assign(this, await loadFixture(fixture)) + this.CMTAT_PROXY_IMPL = await deployCMTATProxyImplementation( + this.deployerAddress.address, + this._.address + ) + this.FACTORY = await ethers.deployContract('CMTAT_BEACON_FACTORY', [ + this.CMTAT_PROXY_IMPL.target, + this.admin, + this.admin, + false + ]) + this.CMTATArg = [ + this.admin, + ['CMTA Token', 'CMTAT', DEPLOYMENT_DECIMAL], + ['CMTAT_ISIN', 'https://cmta.ch', 'CMTAT_info'], + [ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS] + ] + }) - context('FactoryDeployment', function () { - it('testCanReturnTheRightImplementation', async function () { - // Act + Assert - expect(await this.FACTORY.implementation()).to.equal( - this.CMTAT_PROXY_IMPL.target - ) - }) + context('FactoryDeployment', function () { + it('testCanReturnTheRightImplementation', async function () { + // Act + Assert + expect(await this.FACTORY.implementation()).to.equal( + this.CMTAT_PROXY_IMPL.target + ) }) + }) - context('Deploy CMTAT with Factory', function () { - it('testCannotBeDeployedByAttacker', async function () { - // Act - await expect( this.FACTORY.connect(this.attacker).deployCMTAT( - ethers.encodeBytes32String("test"), - this.CMTATArg - )) - .to.be.revertedWithCustomError(this.FACTORY, 'AccessControlUnauthorizedAccount') - .withArgs(this.attacker.address, CMTAT_DEPLOYER_ROLE); - }) - it('testCanDeployCMTATWithFactory', async function () { - let computedCMTATAddress = await this.FACTORY.computedProxyAddress( - // 0x0 => id counter 0 - ethers.keccak256(ethers.solidityPacked(["uint256"], [0x0])), - this.CMTATArg - ); - // Act - this.logs = await this.FACTORY.connect(this.admin).deployCMTAT( - ethers.encodeBytes32String("test"), + context('Deploy CMTAT with Factory', function () { + it('testCannotBeDeployedByAttacker', async function () { + // Act + await expect( + this.FACTORY.connect(this.attacker).deployCMTAT( + ethers.encodeBytes32String('test'), this.CMTATArg ) - - // https://github.com/ethers-io/ethers.js/discussions/4484#discussioncomment-9890653 - const receipt = await this.logs.wait(); - const filter = this.FACTORY.filters.CMTAT; - let events = await this.FACTORY.queryFilter(filter, -1); - let args = events[0].args; - // Check Id increment - expect(args[1]).to.equal(0) - // Assert - let CMTAT_ADDRESS = args[0]; - // Check address with ID - expect(await this.FACTORY.CMTATProxyAddress(0)).to.equal(CMTAT_ADDRESS) - expect(await this.FACTORY.CMTATProxyAddress(0)).to.equal(computedCMTATAddress); - const MyContract = await ethers.getContractFactory("CMTAT_PROXY"); - const CMTAT_PROXY = MyContract.attach( - CMTAT_ADDRESS - ) - // Act + Assert - await CMTAT_PROXY.connect(this.admin).mint(this.admin, 100) - // Deploy second contract - this.logs = await this.FACTORY.connect(this.admin).deployCMTAT( - ethers.encodeBytes32String("test"), - this.CMTATArg + ) + .to.be.revertedWithCustomError( + this.FACTORY, + 'AccessControlUnauthorizedAccount' ) - // Check Id increment - events = await this.FACTORY.queryFilter(filter, -1); - args = events[0].args; - expect(args[1]).to.equal(1) + .withArgs(this.attacker.address, CMTAT_DEPLOYER_ROLE) + }) + it('testCanDeployCMTATWithFactory', async function () { + let computedCMTATAddress = await this.FACTORY.computedProxyAddress( + // 0x0 => id counter 0 + ethers.keccak256(ethers.solidityPacked(['uint256'], [0x0])), + this.CMTATArg + ) + // Act + this.logs = await this.FACTORY.connect(this.admin).deployCMTAT( + ethers.encodeBytes32String('test'), + this.CMTATArg + ) + + // https://github.com/ethers-io/ethers.js/discussions/4484#discussioncomment-9890653 + const receipt = await this.logs.wait() + const filter = this.FACTORY.filters.CMTAT + let events = await this.FACTORY.queryFilter(filter, -1) + let args = events[0].args + // Check Id increment + expect(args[1]).to.equal(0) + // Assert + let CMTAT_ADDRESS = args[0] + // Check address with ID + expect(await this.FACTORY.CMTATProxyAddress(0)).to.equal(CMTAT_ADDRESS) + expect(await this.FACTORY.CMTATProxyAddress(0)).to.equal( + computedCMTATAddress + ) + const MyContract = await ethers.getContractFactory('CMTAT_PROXY') + const CMTAT_PROXY = MyContract.attach(CMTAT_ADDRESS) + // Act + Assert + await CMTAT_PROXY.connect(this.admin).mint(this.admin, 100) + // Deploy second contract + this.logs = await this.FACTORY.connect(this.admin).deployCMTAT( + ethers.encodeBytes32String('test'), + this.CMTATArg + ) + // Check Id increment + events = await this.FACTORY.queryFilter(filter, -1) + args = events[0].args + expect(args[1]).to.equal(1) - // Check address + // Check address computedCMTATAddress = await this.FACTORY.computedProxyAddress( - ethers.keccak256(ethers.solidityPacked(["uint256"], [0x1])), + ethers.keccak256(ethers.solidityPacked(['uint256'], [0x1])), this.CMTATArg - ); - CMTAT_ADDRESS = args[0]; - expect(await this.FACTORY.CMTATProxyAddress(1)).to.equal(CMTAT_ADDRESS); - expect(await this.FACTORY.CMTATProxyAddress(1)).to.equal(computedCMTATAddress); - }) + ) + CMTAT_ADDRESS = args[0] + expect(await this.FACTORY.CMTATProxyAddress(1)).to.equal(CMTAT_ADDRESS) + expect(await this.FACTORY.CMTATProxyAddress(1)).to.equal( + computedCMTATAddress + ) }) - } -) + }) +}) diff --git a/test/proxy/general/factory/BeaconFactoryDeploy.test.js b/test/proxy/general/factory/BeaconFactoryDeploy.test.js index 790769ec..255b3bae 100644 --- a/test/proxy/general/factory/BeaconFactoryDeploy.test.js +++ b/test/proxy/general/factory/BeaconFactoryDeploy.test.js @@ -1,44 +1,58 @@ const { ZERO_ADDRESS } = require('../../../utils.js') -const { expect } = require('chai'); +const { expect } = require('chai') +const DEPLOYMENT_DECIMAL = 0 const { deployCMTATProxyImplementation, - fixture, loadFixture + fixture, + loadFixture } = require('../../../deploymentUtils.js') -describe( - 'Deploy Beacon with Factory', - function () { - beforeEach(async function () { - Object.assign(this, await loadFixture(fixture)); - this.CMTAT_PROXY_IMPL = await deployCMTATProxyImplementation( - this._.address, - this.deployerAddress.address - ) - this.FACTORYCustomError = await ethers.deployContract("CMTAT_BEACON_FACTORY",[ - this.CMTAT_PROXY_IMPL.target, +describe('Deploy Beacon with Factory', function () { + beforeEach(async function () { + Object.assign(this, await loadFixture(fixture)) + this.CMTAT_PROXY_IMPL = await deployCMTATProxyImplementation( + this._.address, + this.deployerAddress.address + ) + this.FACTORYCustomError = await ethers.deployContract( + 'CMTAT_BEACON_FACTORY', + [this.CMTAT_PROXY_IMPL.target, this.admin, this.admin, true] + ) + this.CMTATArg = [ + this.admin, + ['CMTA Token', 'CMTAT', DEPLOYMENT_DECIMAL], + ['CMTAT_ISIN', 'https://cmta.ch', 'CMTAT_info'], + [ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS] + ] + }) + context('BeaconDeployment', function () { + it('testCanDeployFactoryWithNoImplementation', async function () { + this.FACTORY = await ethers.deployContract('CMTAT_BEACON_FACTORY', [ + ZERO_ADDRESS, this.admin, this.admin, - true + false ]) + await this.FACTORY.connect(this.admin).deployCMTAT( + ethers.encodeBytes32String('test'), + this.CMTATArg + ) + const CMTAT_ADDRESS = await this.FACTORY.CMTATProxyAddress(0) + const MyContract = await ethers.getContractFactory('CMTAT_PROXY') + const CMTAT_PROXY = MyContract.attach(CMTAT_ADDRESS) + // Act + Assert + await CMTAT_PROXY.connect(this.admin).mint(this.admin, 100) }) - context('BeaconDeployment', function () { - it('testCannotDeployIfImplementationIsZero', async function () { - await expect(ethers.deployContract("CMTAT_BEACON_FACTORY",[ZERO_ADDRESS, this.admin.address, this.admin.address])) - .to.be.revertedWithCustomError(this.FACTORYCustomError, 'CMTAT_Factory_AddressZeroNotAllowedForLogicContract') - }) - it('testCannotDeployIfFactoryAdminIsZero', async function () { - await expect( ethers.deployContract("CMTAT_BEACON_FACTORY",[ this.CMTAT_PROXY_IMPL.target, - ZERO_ADDRESS, - this.admin.address] - )) - .to.be.revertedWithCustomError(this.FACTORYCustomError, 'CMTAT_Factory_AddressZeroNotAllowedForFactoryAdmin') - }) - it('testCannotDeployIfBeaconOwnerIsZero', async function () { - await expect(ethers.deployContract("CMTAT_BEACON_FACTORY",[ this.CMTAT_PROXY_IMPL.target, + it('testCannotDeployIfBeaconOwnerIsZero', async function () { + await expect( + ethers.deployContract('CMTAT_BEACON_FACTORY', [ + this.CMTAT_PROXY_IMPL.target, this.admin.address, - ZERO_ADDRESS] - )) - .to.be.revertedWithCustomError(this.FACTORYCustomError, 'CMTAT_Factory_AddressZeroNotAllowedForBeaconOwner') - }) + ZERO_ADDRESS + ]) + ).to.be.revertedWithCustomError( + this.FACTORYCustomError, + 'CMTAT_Factory_AddressZeroNotAllowedForBeaconOwner' + ) }) - } -) + }) +}) diff --git a/test/proxy/general/factory/Transparent.test.js b/test/proxy/general/factory/Transparent.test.js index 9dc5bfd7..60570594 100644 --- a/test/proxy/general/factory/Transparent.test.js +++ b/test/proxy/general/factory/Transparent.test.js @@ -1,106 +1,108 @@ -const { expect } = require('chai'); -const { ZERO_ADDRESS, CMTAT_DEPLOYER_ROLE } = require("../../../utils.js"); +const { expect } = require('chai') +const { ZERO_ADDRESS, CMTAT_DEPLOYER_ROLE } = require('../../../utils.js') const { DEPLOYMENT_FLAG, deployCMTATProxyImplementation, fixture, - loadFixture, -} = require("../../../deploymentUtils.js"); -const { ethers } = require("hardhat"); -const DEPLOYMENT_DECIMAL = 0; -describe("Deploy TP with Factory", function () { + loadFixture +} = require('../../../deploymentUtils.js') +const { ethers } = require('hardhat') +const DEPLOYMENT_DECIMAL = 0 +describe('Deploy TP with Factory', function () { beforeEach(async function () { - Object.assign(this, await loadFixture(fixture)); + Object.assign(this, await loadFixture(fixture)) this.CMTAT_PROXY_IMPL = await deployCMTATProxyImplementation( this._.address, this.deployerAddress.address - ); - this.FACTORY = await ethers.deployContract("CMTAT_TP_FACTORY",[ - this.CMTAT_PROXY_IMPL.target, this.admin, false - ]); + ) + this.FACTORY = await ethers.deployContract('CMTAT_TP_FACTORY', [ + this.CMTAT_PROXY_IMPL.target, + this.admin, + false + ]) this.CMTATArg = [ this.admin, - ['CMTA Token', - 'CMTAT', - DEPLOYMENT_DECIMAL], - ['CMTAT_ISIN', - 'https://cmta.ch', - 'CMTAT_info'], + ['CMTA Token', 'CMTAT', DEPLOYMENT_DECIMAL], + ['CMTAT_ISIN', 'https://cmta.ch', 'CMTAT_info'], [ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS] - ]; - }); + ] + }) - context("FactoryDeployment", function () { - it("testCanReturnTheRightImplementation", async function () { + context('FactoryDeployment', function () { + it('testCanReturnTheRightImplementation', async function () { // Act + Assert - expect(await this.FACTORY.logic()).to.equal( - this.CMTAT_PROXY_IMPL.target - ); - }); - }); + expect(await this.FACTORY.logic()).to.equal(this.CMTAT_PROXY_IMPL.target) + }) + }) - context("Deploy CMTAT with Factory", function () { - it("testCannotBeDeployedByAttacker", async function () { + context('Deploy CMTAT with Factory', function () { + it('testCannotBeDeployedByAttacker', async function () { // Act - await expect( this.FACTORY.connect(this.attacker).deployCMTAT( - ethers.encodeBytes32String("test"), - this.admin.address, - this.CMTATArg - )) - .to.be.revertedWithCustomError(this.FACTORY, 'AccessControlUnauthorizedAccount').withArgs( - this.attacker.address, CMTAT_DEPLOYER_ROLE + await expect( + this.FACTORY.connect(this.attacker).deployCMTAT( + ethers.encodeBytes32String('test'), + this.admin.address, + this.CMTATArg + ) ) - }); - it("testCanDeployCMTATWithFactory", async function () { + .to.be.revertedWithCustomError( + this.FACTORY, + 'AccessControlUnauthorizedAccount' + ) + .withArgs(this.attacker.address, CMTAT_DEPLOYER_ROLE) + }) + it('testCanDeployCMTATWithFactory', async function () { let computedCMTATAddress = await this.FACTORY.computedProxyAddress( // 0x0 => id counter 0 - ethers.keccak256(ethers.solidityPacked(["uint256"], [0x0])), + ethers.keccak256(ethers.solidityPacked(['uint256'], [0x0])), this.admin, this.CMTATArg - ); + ) // Act this.logs = await this.FACTORY.connect(this.admin).deployCMTAT( - ethers.encodeBytes32String("test"), + ethers.encodeBytes32String('test'), this.admin, this.CMTATArg - ); - const receipt = await this.logs.wait(); - const filter = this.FACTORY.filters.CMTAT; - let events = await this.FACTORY.queryFilter(filter, -1); - let args = events[0].args; + ) + const receipt = await this.logs.wait() + const filter = this.FACTORY.filters.CMTAT + let events = await this.FACTORY.queryFilter(filter, -1) + let args = events[0].args // Assert // Check Id - expect(args[1]).to.equal(0); - let CMTAT_ADDRESS = args[0]; + expect(args[1]).to.equal(0) + let CMTAT_ADDRESS = args[0] // Check address with ID - expect(await this.FACTORY.CMTATProxyAddress(0)).to.equal(CMTAT_ADDRESS); - expect(await this.FACTORY.CMTATProxyAddress(0)).to.equal(computedCMTATAddress); - const MyContract = await ethers.getContractFactory("CMTAT_PROXY"); - const CMTAT_PROXY = MyContract.attach( - CMTAT_ADDRESS + expect(await this.FACTORY.CMTATProxyAddress(0)).to.equal(CMTAT_ADDRESS) + expect(await this.FACTORY.CMTATProxyAddress(0)).to.equal( + computedCMTATAddress ) - await CMTAT_PROXY.connect(this.admin).mint(this.admin, 100); + const MyContract = await ethers.getContractFactory('CMTAT_PROXY') + const CMTAT_PROXY = MyContract.attach(CMTAT_ADDRESS) + await CMTAT_PROXY.connect(this.admin).mint(this.admin, 100) // Second deployment this.logs = await this.FACTORY.connect(this.admin).deployCMTAT( - ethers.encodeBytes32String("test"), + ethers.encodeBytes32String('test'), this.admin, this.CMTATArg - ); + ) // Check Id increment - events = await this.FACTORY.queryFilter(filter, -1); - args = events[0].args; - expect(args[1]).to.equal(1); + events = await this.FACTORY.queryFilter(filter, -1) + args = events[0].args + expect(args[1]).to.equal(1) // Check address computedCMTATAddress = await this.FACTORY.computedProxyAddress( - ethers.keccak256(ethers.solidityPacked(["uint256"], [0x1])), + ethers.keccak256(ethers.solidityPacked(['uint256'], [0x1])), this.admin, this.CMTATArg - ); - CMTAT_ADDRESS = args[0]; - expect(await this.FACTORY.CMTATProxyAddress(1)).to.equal(CMTAT_ADDRESS); - expect(await this.FACTORY.CMTATProxyAddress(1)).to.equal(computedCMTATAddress); - }); - }); -}); + ) + CMTAT_ADDRESS = args[0] + expect(await this.FACTORY.CMTATProxyAddress(1)).to.equal(CMTAT_ADDRESS) + expect(await this.FACTORY.CMTATProxyAddress(1)).to.equal( + computedCMTATAddress + ) + }) + }) +}) diff --git a/test/proxy/general/factory/TransparentFactoyDeploy.test.js b/test/proxy/general/factory/TransparentFactoyDeploy.test.js index d7bc5a83..99d03227 100644 --- a/test/proxy/general/factory/TransparentFactoyDeploy.test.js +++ b/test/proxy/general/factory/TransparentFactoyDeploy.test.js @@ -1,39 +1,44 @@ -const { expect } = require('chai'); +const { expect } = require('chai') const { ZERO_ADDRESS } = require('../../../utils.js') const { deployCMTATProxyImplementation, - fixture, loadFixture + fixture, + loadFixture } = require('../../../deploymentUtils.js') -describe( - 'Deploy TP Factory', - function () { - beforeEach(async function () { - Object.assign(this, await loadFixture(fixture)); - this.CMTAT_PROXY_IMPL = await deployCMTATProxyImplementation( - this._.address, - this.deployerAddress.address +describe('Deploy TP Factory', function () { + beforeEach(async function () { + Object.assign(this, await loadFixture(fixture)) + this.CMTAT_PROXY_IMPL = await deployCMTATProxyImplementation( + this._.address, + this.deployerAddress.address + ) + this.FACTORYCustomError = await ethers.deployContract('CMTAT_TP_FACTORY', [ + this.CMTAT_PROXY_IMPL.target, + this.admin, + true + ]) + }) + + context('FactoryDeployment', function () { + it('testCannotDeployIfImplementationIsZero', async function () { + await expect( + ethers.deployContract('CMTAT_TP_FACTORY', [ZERO_ADDRESS, this.admin]) + ).to.be.revertedWithCustomError( + this.FACTORYCustomError, + 'CMTAT_Factory_AddressZeroNotAllowedForLogicContract' ) - this.FACTORYCustomError = await ethers.deployContract('CMTAT_TP_FACTORY',[ - this.CMTAT_PROXY_IMPL.target, - this.admin, - true - ]) }) - context('FactoryDeployment', function () { - it('testCannotDeployIfImplementationIsZero', async function () { - await expect( ethers.deployContract('CMTAT_TP_FACTORY',[ - ZERO_ADDRESS, this.admin - ])) - .to.be.revertedWithCustomError(this.FACTORYCustomError, 'CMTAT_Factory_AddressZeroNotAllowedForLogicContract') - }) - - it('testCannotDeployIfFactoryAdminIsZero', async function () { - await expect( ethers.deployContract('CMTAT_TP_FACTORY', [ - this.CMTAT_PROXY_IMPL.target, ZERO_ADDRESS - ])) - .to.be.revertedWithCustomError(this.FACTORYCustomError, 'CMTAT_Factory_AddressZeroNotAllowedForFactoryAdmin') - }) + it('testCannotDeployIfFactoryAdminIsZero', async function () { + await expect( + ethers.deployContract('CMTAT_TP_FACTORY', [ + this.CMTAT_PROXY_IMPL.target, + ZERO_ADDRESS + ]) + ).to.be.revertedWithCustomError( + this.FACTORYCustomError, + 'CMTAT_Factory_AddressZeroNotAllowedForFactoryAdmin' + ) }) - } -) + }) +}) diff --git a/test/proxy/general/factory/TransparentSalt.test.js b/test/proxy/general/factory/TransparentSalt.test.js index bbfcdf53..76348e40 100644 --- a/test/proxy/general/factory/TransparentSalt.test.js +++ b/test/proxy/general/factory/TransparentSalt.test.js @@ -1,114 +1,117 @@ -const { expect } = require('chai'); +const { expect } = require('chai') const { ZERO_ADDRESS, CMTAT_DEPLOYER_ROLE } = require('../../../utils.js') const { DEPLOYMENT_FLAG, deployCMTATProxyImplementation, - fixture, loadFixture + fixture, + loadFixture } = require('../../../deploymentUtils.js') const { ethers } = require('hardhat') const DEPLOYMENT_DECIMAL = 0 -describe( - 'Deploy TP with Factory - Salt', - function () { - beforeEach(async function () { - Object.assign(this, await loadFixture(fixture)); - this.CMTAT_PROXY_IMPL = await deployCMTATProxyImplementation( - this._.address, - this.deployerAddress.address - ) - this.FACTORY = await ethers.deployContract('CMTAT_TP_FACTORY',[ - this.CMTAT_PROXY_IMPL.target, - this.admin, - true - ]) - this.CMTATArg = [ - this.admin, - ['CMTA Token', - 'CMTAT', - DEPLOYMENT_DECIMAL], - ['CMTAT_ISIN', - 'https://cmta.ch', - 'CMTAT_info'], - [ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS] - ] - }) +describe('Deploy TP with Factory - Salt', function () { + beforeEach(async function () { + Object.assign(this, await loadFixture(fixture)) + this.CMTAT_PROXY_IMPL = await deployCMTATProxyImplementation( + this._.address, + this.deployerAddress.address + ) + this.FACTORY = await ethers.deployContract('CMTAT_TP_FACTORY', [ + this.CMTAT_PROXY_IMPL.target, + this.admin, + true + ]) + this.CMTATArg = [ + this.admin, + ['CMTA Token', 'CMTAT', DEPLOYMENT_DECIMAL], + ['CMTAT_ISIN', 'https://cmta.ch', 'CMTAT_info'], + [ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS] + ] + }) - context('FactoryDeployment', function () { - it('testCanReturnTheRightImplementation', async function () { - // Act + Assert - expect(await this.FACTORY.logic()).to.equal( - this.CMTAT_PROXY_IMPL.target - ) - }) + context('FactoryDeployment', function () { + it('testCanReturnTheRightImplementation', async function () { + // Act + Assert + expect(await this.FACTORY.logic()).to.equal(this.CMTAT_PROXY_IMPL.target) }) + }) - context('Deploy CMTAT with Factory', function () { - it('testCannotBeDeployedByAttacker', async function () { - // Act - await expect( this.FACTORY.connect(this.attacker).deployCMTAT( + context('Deploy CMTAT with Factory', function () { + it('testCannotBeDeployedByAttacker', async function () { + // Act + await expect( + this.FACTORY.connect(this.attacker).deployCMTAT( ethers.encodeBytes32String('test'), this.admin, this.CMTATArg - )) - .to.be.revertedWithCustomError(this.FACTORY, 'AccessControlUnauthorizedAccount') - .withArgs(this.attacker.address, CMTAT_DEPLOYER_ROLE); - }) - it('testCanDeployCMTATWithFactory', async function () { - // Act - this.logs = await this.FACTORY.connect(this.admin).deployCMTAT( - ethers.encodeBytes32String('test'), - this.admin, - this.CMTATArg, - ) - // Assert - // Check Id - const receipt = await this.logs.wait(); - const filter = this.FACTORY.filters.CMTAT; - let events = await this.FACTORY.queryFilter(filter, -1); - let args = events[0].args; - expect(args[1]).to.equal(0) - const CMTAT_ADDRESS = args[0]; - const MyContract = await ethers.getContractFactory("CMTAT_PROXY"); - const CMTAT_PROXY = MyContract.attach( - CMTAT_ADDRESS ) - // Check address with ID - expect((await this.FACTORY.CMTATProxyAddress(0))).to.equal(CMTAT_ADDRESS) - await CMTAT_PROXY.connect(this.admin).mint(this.admin, 100) - // Second deployment - this.logs = await this.FACTORY.connect(this.admin).deployCMTAT( - ethers.encodeBytes32String('test2'), - this.admin, - this.CMTATArg, + ) + .to.be.revertedWithCustomError( + this.FACTORY, + 'AccessControlUnauthorizedAccount' ) - // Check Id increment - events = await this.FACTORY.queryFilter(filter, -1); - args = events[0].args; - expect(args[1]).to.equal(1) - // Revert - await expect(this.FACTORY.connect(this.admin).deployCMTAT( - ethers.encodeBytes32String('test'), - this.admin, - this.CMTATArg, - )) - .to.be.revertedWithCustomError(this.FACTORY, 'CMTAT_Factory_SaltAlreadyUsed') - }) - it('testCannotDeployCMTATWithFactoryWithSaltAlreadyUsed', async function () { - // Arrange - await this.FACTORY.connect(this.admin).deployCMTAT( + .withArgs(this.attacker.address, CMTAT_DEPLOYER_ROLE) + }) + it('testCanDeployCMTATWithFactory', async function () { + // Act + this.logs = await this.FACTORY.connect(this.admin).deployCMTAT( + ethers.encodeBytes32String('test'), + this.admin, + this.CMTATArg + ) + // Assert + // Check Id + const receipt = await this.logs.wait() + const filter = this.FACTORY.filters.CMTAT + let events = await this.FACTORY.queryFilter(filter, -1) + let args = events[0].args + expect(args[1]).to.equal(0) + const CMTAT_ADDRESS = args[0] + const MyContract = await ethers.getContractFactory('CMTAT_PROXY') + const CMTAT_PROXY = MyContract.attach(CMTAT_ADDRESS) + // Check address with ID + expect(await this.FACTORY.CMTATProxyAddress(0)).to.equal(CMTAT_ADDRESS) + await CMTAT_PROXY.connect(this.admin).mint(this.admin, 100) + // Second deployment + this.logs = await this.FACTORY.connect(this.admin).deployCMTAT( + ethers.encodeBytes32String('test2'), + this.admin, + this.CMTATArg + ) + // Check Id increment + events = await this.FACTORY.queryFilter(filter, -1) + args = events[0].args + expect(args[1]).to.equal(1) + // Revert + await expect( + this.FACTORY.connect(this.admin).deployCMTAT( ethers.encodeBytes32String('test'), this.admin, this.CMTATArg ) - - // Act with Revert - await expect( this.FACTORY.connect(this.admin).deployCMTAT( + ).to.be.revertedWithCustomError( + this.FACTORY, + 'CMTAT_Factory_SaltAlreadyUsed' + ) + }) + it('testCannotDeployCMTATWithFactoryWithSaltAlreadyUsed', async function () { + // Arrange + await this.FACTORY.connect(this.admin).deployCMTAT( + ethers.encodeBytes32String('test'), + this.admin, + this.CMTATArg + ) + + // Act with Revert + await expect( + this.FACTORY.connect(this.admin).deployCMTAT( ethers.encodeBytes32String('test'), this.admin, this.CMTATArg - )) - .to.be.revertedWithCustomError(this.FACTORY, 'CMTAT_Factory_SaltAlreadyUsed') - }) + ) + ).to.be.revertedWithCustomError( + this.FACTORY, + 'CMTAT_Factory_SaltAlreadyUsed' + ) }) - } -) + }) +}) diff --git a/test/proxy/general/factory/UUPS.test.js b/test/proxy/general/factory/UUPS.test.js index b7bfc32e..e5b370c2 100644 --- a/test/proxy/general/factory/UUPS.test.js +++ b/test/proxy/general/factory/UUPS.test.js @@ -1,101 +1,103 @@ -const { expect } = require('chai'); -const { ZERO_ADDRESS, CMTAT_DEPLOYER_ROLE } = require("../../../utils.js"); +const { expect } = require('chai') +const { ZERO_ADDRESS, CMTAT_DEPLOYER_ROLE } = require('../../../utils.js') const { DEPLOYMENT_FLAG, deployCMTATProxyUUPSImplementation, fixture, - loadFixture, -} = require("../../../deploymentUtils.js"); -const { ethers } = require("hardhat"); -const DEPLOYMENT_DECIMAL = 0; -describe("Deploy UUPPSwith Factory", function () { + loadFixture +} = require('../../../deploymentUtils.js') +const { ethers } = require('hardhat') +const DEPLOYMENT_DECIMAL = 0 +describe('Deploy UUPPSwith Factory', function () { beforeEach(async function () { - Object.assign(this, await loadFixture(fixture)); + Object.assign(this, await loadFixture(fixture)) this.CMTAT_PROXY_IMPL = await deployCMTATProxyUUPSImplementation( this._.address, this.deployerAddress.address - ); - this.FACTORY = await ethers.deployContract("CMTAT_UUPS_FACTORY",[ - this.CMTAT_PROXY_IMPL.target, this.admin, false - ]); + ) + this.FACTORY = await ethers.deployContract('CMTAT_UUPS_FACTORY', [ + this.CMTAT_PROXY_IMPL.target, + this.admin, + false + ]) this.CMTATArg = [ this.admin, - ['CMTA Token', - 'CMTAT', - DEPLOYMENT_DECIMAL], - ['CMTAT_ISIN', - 'https://cmta.ch', - 'CMTAT_info'], + ['CMTA Token', 'CMTAT', DEPLOYMENT_DECIMAL], + ['CMTAT_ISIN', 'https://cmta.ch', 'CMTAT_info'], [ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS] - ]; - }); + ] + }) - context("FactoryDeployment", function () { - it("testCanReturnTheRightImplementation", async function () { + context('FactoryDeployment', function () { + it('testCanReturnTheRightImplementation', async function () { // Act + Assert - expect(await this.FACTORY.logic()).to.equal( - this.CMTAT_PROXY_IMPL.target - ); - }); - }); + expect(await this.FACTORY.logic()).to.equal(this.CMTAT_PROXY_IMPL.target) + }) + }) - context("Deploy CMTAT with Factory", function () { - it("testCannotBeDeployedByAttacker", async function () { + context('Deploy CMTAT with Factory', function () { + it('testCannotBeDeployedByAttacker', async function () { // Act - await expect( this.FACTORY.connect(this.attacker).deployCMTAT( - ethers.encodeBytes32String("test"), - this.CMTATArg - )) - .to.be.revertedWithCustomError(this.FACTORY, 'AccessControlUnauthorizedAccount').withArgs( - this.attacker.address, CMTAT_DEPLOYER_ROLE + await expect( + this.FACTORY.connect(this.attacker).deployCMTAT( + ethers.encodeBytes32String('test'), + this.CMTATArg + ) ) - }); - it("testCanDeployCMTATWithFactory", async function () { + .to.be.revertedWithCustomError( + this.FACTORY, + 'AccessControlUnauthorizedAccount' + ) + .withArgs(this.attacker.address, CMTAT_DEPLOYER_ROLE) + }) + it('testCanDeployCMTATWithFactory', async function () { let computedCMTATAddress = await this.FACTORY.computedProxyAddress( // 0x0 => id counter 0 - ethers.keccak256(ethers.solidityPacked(["uint256"], [0x0])), + ethers.keccak256(ethers.solidityPacked(['uint256'], [0x0])), this.CMTATArg - ); + ) // Act this.logs = await this.FACTORY.connect(this.admin).deployCMTAT( - ethers.encodeBytes32String("test"), + ethers.encodeBytes32String('test'), this.CMTATArg - ); - const receipt = await this.logs.wait(); - const filter = this.FACTORY.filters.CMTAT; - let events = await this.FACTORY.queryFilter(filter, -1); - let args = events[0].args; + ) + const receipt = await this.logs.wait() + const filter = this.FACTORY.filters.CMTAT + let events = await this.FACTORY.queryFilter(filter, -1) + let args = events[0].args // Assert // Check Id - expect(args[1]).to.equal(0); - let CMTAT_ADDRESS = args[0]; + expect(args[1]).to.equal(0) + let CMTAT_ADDRESS = args[0] // Check address with ID - expect(await this.FACTORY.CMTATProxyAddress(0)).to.equal(CMTAT_ADDRESS); - expect(await this.FACTORY.CMTATProxyAddress(0)).to.equal(computedCMTATAddress); - const MyContract = await ethers.getContractFactory("CMTAT_PROXY_UUPS"); - const CMTAT_PROXY = MyContract.attach( - CMTAT_ADDRESS + expect(await this.FACTORY.CMTATProxyAddress(0)).to.equal(CMTAT_ADDRESS) + expect(await this.FACTORY.CMTATProxyAddress(0)).to.equal( + computedCMTATAddress ) - await CMTAT_PROXY.connect(this.admin).mint(this.admin, 100); + const MyContract = await ethers.getContractFactory('CMTAT_PROXY_UUPS') + const CMTAT_PROXY = MyContract.attach(CMTAT_ADDRESS) + await CMTAT_PROXY.connect(this.admin).mint(this.admin, 100) // Second deployment this.logs = await this.FACTORY.connect(this.admin).deployCMTAT( - ethers.encodeBytes32String("test"), + ethers.encodeBytes32String('test'), this.CMTATArg - ); + ) // Check Id increment - events = await this.FACTORY.queryFilter(filter, -1); - args = events[0].args; - expect(args[1]).to.equal(1); + events = await this.FACTORY.queryFilter(filter, -1) + args = events[0].args + expect(args[1]).to.equal(1) // Check address computedCMTATAddress = await this.FACTORY.computedProxyAddress( - ethers.keccak256(ethers.solidityPacked(["uint256"], [0x1])), + ethers.keccak256(ethers.solidityPacked(['uint256'], [0x1])), this.CMTATArg - ); - CMTAT_ADDRESS = args[0]; - expect(await this.FACTORY.CMTATProxyAddress(1)).to.equal(CMTAT_ADDRESS); - expect(await this.FACTORY.CMTATProxyAddress(1)).to.equal(computedCMTATAddress); - }); - }); -}); + ) + CMTAT_ADDRESS = args[0] + expect(await this.FACTORY.CMTATProxyAddress(1)).to.equal(CMTAT_ADDRESS) + expect(await this.FACTORY.CMTATProxyAddress(1)).to.equal( + computedCMTATAddress + ) + }) + }) +}) diff --git a/test/proxy/general/factory/UUPSFactoyDeploy.test.js b/test/proxy/general/factory/UUPSFactoyDeploy.test.js index f2658603..97b68c6b 100644 --- a/test/proxy/general/factory/UUPSFactoyDeploy.test.js +++ b/test/proxy/general/factory/UUPSFactoyDeploy.test.js @@ -1,39 +1,43 @@ const { ZERO_ADDRESS } = require('../../../utils.js') -const { expect } = require('chai'); +const { expect } = require('chai') const { deployCMTATProxyImplementation, - fixture, loadFixture + fixture, + loadFixture } = require('../../../deploymentUtils.js') -describe( - 'Deploy UUPS Factory', - function () { - beforeEach(async function () { - Object.assign(this, await loadFixture(fixture)); - this.CMTAT_PROXY_IMPL = await deployCMTATProxyImplementation( - this._.address, - this.deployerAddress.address +describe('Deploy UUPS Factory', function () { + beforeEach(async function () { + Object.assign(this, await loadFixture(fixture)) + this.CMTAT_PROXY_IMPL = await deployCMTATProxyImplementation( + this._.address, + this.deployerAddress.address + ) + this.FACTORYCustomError = await ethers.deployContract( + 'CMTAT_UUPS_FACTORY', + [this.CMTAT_PROXY_IMPL.target, this.admin, true] + ) + }) + + context('FactoryDeployment', function () { + it('testCannotDeployIfImplementationIsZero', async function () { + await expect( + ethers.deployContract('CMTAT_UUPS_FACTORY', [ZERO_ADDRESS, this.admin]) + ).to.be.revertedWithCustomError( + this.FACTORYCustomError, + 'CMTAT_Factory_AddressZeroNotAllowedForLogicContract' ) - this.FACTORYCustomError = await ethers.deployContract('CMTAT_UUPS_FACTORY',[ - this.CMTAT_PROXY_IMPL.target, - this.admin, - true - ]) }) - context('FactoryDeployment', function () { - it('testCannotDeployIfImplementationIsZero', async function () { - await expect(ethers.deployContract('CMTAT_UUPS_FACTORY',[ - ZERO_ADDRESS, this.admin - ])) - .to.be.revertedWithCustomError(this.FACTORYCustomError, 'CMTAT_Factory_AddressZeroNotAllowedForLogicContract') - }) - - it('testCannotDeployIfFactoryAdminIsZero', async function () { - await expect(ethers.deployContract('CMTAT_UUPS_FACTORY', [ - this.CMTAT_PROXY_IMPL.target, ZERO_ADDRESS - ])) - .to.be.revertedWithCustomError(this.FACTORYCustomError, 'CMTAT_Factory_AddressZeroNotAllowedForFactoryAdmin') - }) + it('testCannotDeployIfFactoryAdminIsZero', async function () { + await expect( + ethers.deployContract('CMTAT_UUPS_FACTORY', [ + this.CMTAT_PROXY_IMPL.target, + ZERO_ADDRESS + ]) + ).to.be.revertedWithCustomError( + this.FACTORYCustomError, + 'CMTAT_Factory_AddressZeroNotAllowedForFactoryAdmin' + ) }) - } -) + }) +}) diff --git a/test/proxy/modules/AuthorizationModule/AuthorizationModule.test.js b/test/proxy/modules/AuthorizationModule/AuthorizationModule.test.js index 700458f7..541da049 100644 --- a/test/proxy/modules/AuthorizationModule/AuthorizationModule.test.js +++ b/test/proxy/modules/AuthorizationModule/AuthorizationModule.test.js @@ -1,17 +1,24 @@ const AuthorizationModuleCommon = require('../../../common/AuthorizationModule/AuthorizationModuleCommon') const AuthorizationModuleSetAuthorizationEngineCommon = require('../../../common/AuthorizationModule/AuthorizationModuleSetAuthorizationEngineCommon') -const { deployCMTATProxy, fixture, loadFixture } = require('../../../deploymentUtils') +const { + deployCMTATProxy, + fixture, + loadFixture +} = require('../../../deploymentUtils') -describe( - 'Proxy - AuthorizationModule', - function () { - beforeEach(async function () { - Object.assign(this, await loadFixture(fixture)); - this.cmtat = await deployCMTATProxy(this._.address, this.admin.address, this.deployerAddress.address) - this.authorizationEngineMock = await ethers.deployContract("AuthorizationEngineMock") - }) +describe('Proxy - AuthorizationModule', function () { + beforeEach(async function () { + Object.assign(this, await loadFixture(fixture)) + this.cmtat = await deployCMTATProxy( + this._.address, + this.admin.address, + this.deployerAddress.address + ) + this.authorizationEngineMock = await ethers.deployContract( + 'AuthorizationEngineMock' + ) + }) - AuthorizationModuleCommon() - AuthorizationModuleSetAuthorizationEngineCommon() - } -) + AuthorizationModuleCommon() + AuthorizationModuleSetAuthorizationEngineCommon() +}) diff --git a/test/proxy/modules/AuthorizationModule/AuthorizationModuleConstructor.test.js b/test/proxy/modules/AuthorizationModule/AuthorizationModuleConstructor.test.js index 2c50ce29..31bb03c0 100644 --- a/test/proxy/modules/AuthorizationModule/AuthorizationModuleConstructor.test.js +++ b/test/proxy/modules/AuthorizationModule/AuthorizationModuleConstructor.test.js @@ -1,28 +1,36 @@ const AuthorizationModuleSetAuthorizationEngineCommon = require('../../../common/AuthorizationModule/AuthorizationModuleSetAuthorizationEngineCommon') -const { deployCMTATProxyWithParameter, fixture, loadFixture } = require('../../../deploymentUtils') +const { + deployCMTATProxyWithParameter, + fixture, + loadFixture +} = require('../../../deploymentUtils') const { ZERO_ADDRESS } = require('../../../utils') -describe( - 'Proxy - AuthorizationModule', - function () { - beforeEach(async function () { - const DECIMAL = 0 - Object.assign(this, await loadFixture(fixture)); - this.authorizationEngineMock = await ethers.deployContract("AuthorizationEngineMock") - this.definedAtDeployment = true - this.cmtat = await deployCMTATProxyWithParameter( - this.deployerAddress.address, - this._.address, - this.admin.address, - 'CMTA Token', - 'CMTAT', - DECIMAL, - 'CMTAT_ISIN', - 'https://cmta.ch', - 'CMTAT_info', - [ZERO_ADDRESS, ZERO_ADDRESS, this.authorizationEngineMock.target, ZERO_ADDRESS] - ) - }) +describe('Proxy - AuthorizationModule', function () { + beforeEach(async function () { + const DECIMAL = 0 + Object.assign(this, await loadFixture(fixture)) + this.authorizationEngineMock = await ethers.deployContract( + 'AuthorizationEngineMock' + ) + this.definedAtDeployment = true + this.cmtat = await deployCMTATProxyWithParameter( + this.deployerAddress.address, + this._.address, + this.admin.address, + 'CMTA Token', + 'CMTAT', + DECIMAL, + 'CMTAT_ISIN', + 'https://cmta.ch', + 'CMTAT_info', + [ + ZERO_ADDRESS, + ZERO_ADDRESS, + this.authorizationEngineMock.target, + ZERO_ADDRESS + ] + ) + }) - AuthorizationModuleSetAuthorizationEngineCommon() - } -) + AuthorizationModuleSetAuthorizationEngineCommon() +}) diff --git a/test/proxy/modules/BaseModule.test.js b/test/proxy/modules/BaseModule.test.js index 87ef7bcf..ad20a027 100644 --- a/test/proxy/modules/BaseModule.test.js +++ b/test/proxy/modules/BaseModule.test.js @@ -1,15 +1,21 @@ const BaseModuleCommon = require('../../common/BaseModuleCommon') -const { deployCMTATProxy, DEPLOYMENT_FLAG, fixture, loadFixture } = require('../../deploymentUtils') +const { + deployCMTATProxy, + DEPLOYMENT_FLAG, + fixture, + loadFixture +} = require('../../deploymentUtils') -describe( - 'Proxy - BaseModule', - function () { - beforeEach(async function () { - Object.assign(this, await loadFixture(fixture)); - this.flag = DEPLOYMENT_FLAG // value used in tests - this.cmtat = await deployCMTATProxy(this._.address, this.admin.address, this.deployerAddress.address) - }) +describe('Proxy - BaseModule', function () { + beforeEach(async function () { + Object.assign(this, await loadFixture(fixture)) + this.flag = DEPLOYMENT_FLAG // value used in tests + this.cmtat = await deployCMTATProxy( + this._.address, + this.admin.address, + this.deployerAddress.address + ) + }) - BaseModuleCommon() - } -) + BaseModuleCommon() +}) diff --git a/test/proxy/modules/DocumentModule/DocumentModule.test.js b/test/proxy/modules/DocumentModule/DocumentModule.test.js index 51b38409..57e3184e 100644 --- a/test/proxy/modules/DocumentModule/DocumentModule.test.js +++ b/test/proxy/modules/DocumentModule/DocumentModule.test.js @@ -1,15 +1,20 @@ const DocumentModuleSetDocumentEngineCommon = require('../../../common/DocumentModule/DocumentModuleSetDocumentEngineCommon') const DocumentModuleCommon = require('../../../common/DocumentModule/DocumentModuleCommon') -const { deployCMTATProxy, fixture, loadFixture } = require('../../../deploymentUtils') -describe( - 'Standard - DocumentModule', - function () { - beforeEach(async function () { - Object.assign(this, await loadFixture(fixture)); - this.cmtat = await deployCMTATProxy(this._.address, this.admin.address, this.deployerAddress.address) - this.documentEngineMock = await ethers.deployContract("DocumentEngineMock") - }) - DocumentModuleCommon() - DocumentModuleSetDocumentEngineCommon() - } -) +const { + deployCMTATProxy, + fixture, + loadFixture +} = require('../../../deploymentUtils') +describe('Standard - DocumentModule', function () { + beforeEach(async function () { + Object.assign(this, await loadFixture(fixture)) + this.cmtat = await deployCMTATProxy( + this._.address, + this.admin.address, + this.deployerAddress.address + ) + this.documentEngineMock = await ethers.deployContract('DocumentEngineMock') + }) + DocumentModuleCommon() + DocumentModuleSetDocumentEngineCommon() +}) diff --git a/test/proxy/modules/DocumentModule/DocumentModuleConstructor.test.js b/test/proxy/modules/DocumentModule/DocumentModuleConstructor.test.js index a9563311..01bacefe 100644 --- a/test/proxy/modules/DocumentModule/DocumentModuleConstructor.test.js +++ b/test/proxy/modules/DocumentModule/DocumentModuleConstructor.test.js @@ -1,32 +1,30 @@ const DocumentModuleCommon = require('../../../common/DocumentModule/DocumentModuleCommon') const { - deployCMTATProxyWithParameter, fixture, loadFixture + deployCMTATProxyWithParameter, + fixture, + loadFixture } = require('../../../deploymentUtils') const { ZERO_ADDRESS } = require('../../../utils') -describe( - 'Standard - DocumentModule - Constructor', - function () { - beforeEach(async function () { - Object.assign(this, await loadFixture(fixture)); - const DECIMAL = 0 - this.documentEngineMock = await ethers.deployContract('DocumentEngineMock') - this.definedAtDeployment = true - this.cmtat = await deployCMTATProxyWithParameter( - this.deployerAddress.address, - this._.address, - this.admin.address, - 'CMTA Token', - 'CMTAT', - DECIMAL, - 'CMTAT_ISIN', - 'https://cmta.ch', - 'CMTAT_info', - [ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS, this.documentEngineMock.target] - - ) - }) - DocumentModuleCommon() - } -) +describe('Standard - DocumentModule - Constructor', function () { + beforeEach(async function () { + Object.assign(this, await loadFixture(fixture)) + const DECIMAL = 0 + this.documentEngineMock = await ethers.deployContract('DocumentEngineMock') + this.definedAtDeployment = true + this.cmtat = await deployCMTATProxyWithParameter( + this.deployerAddress.address, + this._.address, + this.admin.address, + 'CMTA Token', + 'CMTAT', + DECIMAL, + 'CMTAT_ISIN', + 'https://cmta.ch', + 'CMTAT_info', + [ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS, this.documentEngineMock.target] + ) + }) + DocumentModuleCommon() +}) diff --git a/test/proxy/modules/ERC20BaseModule.test.js b/test/proxy/modules/ERC20BaseModule.test.js index 2da80166..abe1bbff 100644 --- a/test/proxy/modules/ERC20BaseModule.test.js +++ b/test/proxy/modules/ERC20BaseModule.test.js @@ -1,14 +1,19 @@ const ERC20BaseModuleCommon = require('../../common/ERC20BaseModuleCommon') -const { deployCMTATProxy, fixture, loadFixture } = require('../../deploymentUtils') +const { + deployCMTATProxy, + fixture, + loadFixture +} = require('../../deploymentUtils') -describe( - 'Proxy - ERC20BaseModule', - function () { - beforeEach(async function () { - Object.assign(this, await loadFixture(fixture)); - this.cmtat = await deployCMTATProxy(this._.address, this.admin.address, this.deployerAddress.address) - }) +describe('Proxy - ERC20BaseModule', function () { + beforeEach(async function () { + Object.assign(this, await loadFixture(fixture)) + this.cmtat = await deployCMTATProxy( + this._.address, + this.admin.address, + this.deployerAddress.address + ) + }) - ERC20BaseModuleCommon() - } -) + ERC20BaseModuleCommon() +}) diff --git a/test/proxy/modules/ERC20BurnModule.test.js b/test/proxy/modules/ERC20BurnModule.test.js index 3a7c5c3f..8c393ad2 100644 --- a/test/proxy/modules/ERC20BurnModule.test.js +++ b/test/proxy/modules/ERC20BurnModule.test.js @@ -1,14 +1,19 @@ const BurnModuleCommon = require('../../common/ERC20BurnModuleCommon') -const { deployCMTATProxy, fixture, loadFixture } = require('../../deploymentUtils') +const { + deployCMTATProxy, + fixture, + loadFixture +} = require('../../deploymentUtils') -describe( - 'Proxy - ERC20BurnModule', - function () { - beforeEach(async function () { - Object.assign(this, await loadFixture(fixture)); - this.cmtat = await deployCMTATProxy(this._.address, this.admin.address, this.deployerAddress.address) - }) +describe('Proxy - ERC20BurnModule', function () { + beforeEach(async function () { + Object.assign(this, await loadFixture(fixture)) + this.cmtat = await deployCMTATProxy( + this._.address, + this.admin.address, + this.deployerAddress.address + ) + }) - BurnModuleCommon() - } -) + BurnModuleCommon() +}) diff --git a/test/proxy/modules/ERC20MintModule.test.js b/test/proxy/modules/ERC20MintModule.test.js index 9c280211..c8da96c6 100644 --- a/test/proxy/modules/ERC20MintModule.test.js +++ b/test/proxy/modules/ERC20MintModule.test.js @@ -1,14 +1,19 @@ const ERC20MintModuleCommon = require('../../common/ERC20MintModuleCommon') -const { deployCMTATProxy, fixture, loadFixture } = require('../../deploymentUtils') +const { + deployCMTATProxy, + fixture, + loadFixture +} = require('../../deploymentUtils') -describe( - 'Proxy - ERC20MintModule', - function () { - beforeEach(async function () { - Object.assign(this, await loadFixture(fixture)); - this.cmtat = await deployCMTATProxy(this._.address, this.admin.address, this.deployerAddress.address) - }) +describe('Proxy - ERC20MintModule', function () { + beforeEach(async function () { + Object.assign(this, await loadFixture(fixture)) + this.cmtat = await deployCMTATProxy( + this._.address, + this.admin.address, + this.deployerAddress.address + ) + }) - ERC20MintModuleCommon() - } -) + ERC20MintModuleCommon() +}) diff --git a/test/proxy/modules/ERC20SnapshotModule.test.js b/test/proxy/modules/ERC20SnapshotModule.test.js index e079aec0..a1c0399f 100644 --- a/test/proxy/modules/ERC20SnapshotModule.test.js +++ b/test/proxy/modules/ERC20SnapshotModule.test.js @@ -1,4 +1,8 @@ -const { deployCMTATProxy, fixture, loadFixture } = require('../../deploymentUtils') +const { + deployCMTATProxy, + fixture, + loadFixture +} = require('../../deploymentUtils') const ERC20SnapshotModuleCommonRescheduling = require('../../common/ERC20SnapshotModuleCommon/ERC20SnapshotModuleCommonRescheduling') const ERC20SnapshotModuleCommonScheduling = require('../../common/ERC20SnapshotModuleCommon/ERC20SnapshotModuleCommonScheduling') const ERC20SnapshotModuleCommonUnschedule = require('../../common/ERC20SnapshotModuleCommon/ERC20SnapshotModuleCommonUnschedule') @@ -7,23 +11,20 @@ const ERC20SnapshotModuleMultiplePlannedTest = require('../../common/ERC20Snapsh const ERC20SnapshotModuleOnePlannedSnapshotTest = require('../../common/ERC20SnapshotModuleCommon/global/ERC20SnapshotModuleOnePlannedSnapshotTest') const ERC20SnapshotModuleZeroPlannedSnapshotTest = require('../../common/ERC20SnapshotModuleCommon/global/ERC20SnapshotModuleZeroPlannedSnapshot') -describe( - 'Proxy - ERC20SnapshotModule', - function () { - beforeEach(async function () { - Object.assign(this, await loadFixture(fixture)); - this.cmtat = await deployCMTATProxy( - this._.address, - this.admin.address, - this.deployerAddress.address - ) - }) - ERC20SnapshotModuleMultiplePlannedTest() - ERC20SnapshotModuleOnePlannedSnapshotTest() - ERC20SnapshotModuleZeroPlannedSnapshotTest() - ERC20SnapshotModuleCommonRescheduling() - ERC20SnapshotModuleCommonScheduling() - ERC20SnapshotModuleCommonUnschedule() - ERC20SnapshotModuleCommonGetNextSnapshot() - } -) +describe('Proxy - ERC20SnapshotModule', function () { + beforeEach(async function () { + Object.assign(this, await loadFixture(fixture)) + this.cmtat = await deployCMTATProxy( + this._.address, + this.admin.address, + this.deployerAddress.address + ) + }) + ERC20SnapshotModuleMultiplePlannedTest() + ERC20SnapshotModuleOnePlannedSnapshotTest() + ERC20SnapshotModuleZeroPlannedSnapshotTest() + ERC20SnapshotModuleCommonRescheduling() + ERC20SnapshotModuleCommonScheduling() + ERC20SnapshotModuleCommonUnschedule() + ERC20SnapshotModuleCommonGetNextSnapshot() +}) diff --git a/test/proxy/modules/EnforcementModule.test.js b/test/proxy/modules/EnforcementModule.test.js index b29aaab7..7bb45718 100644 --- a/test/proxy/modules/EnforcementModule.test.js +++ b/test/proxy/modules/EnforcementModule.test.js @@ -1,14 +1,19 @@ const EnforcementModuleCommon = require('../../common/EnforcementModuleCommon') -const { deployCMTATProxy, fixture, loadFixture } = require('../../deploymentUtils') +const { + deployCMTATProxy, + fixture, + loadFixture +} = require('../../deploymentUtils') -describe( - 'Proxy - EnforcementModule', - function () { - beforeEach(async function () { - Object.assign(this, await loadFixture(fixture)); - this.cmtat = await deployCMTATProxy(this._.address, this.admin.address, this.deployerAddress.address) - }) +describe('Proxy - EnforcementModule', function () { + beforeEach(async function () { + Object.assign(this, await loadFixture(fixture)) + this.cmtat = await deployCMTATProxy( + this._.address, + this.admin.address, + this.deployerAddress.address + ) + }) - EnforcementModuleCommon() - } -) + EnforcementModuleCommon() +}) diff --git a/test/proxy/modules/MetaTxModule.test.js b/test/proxy/modules/MetaTxModule.test.js index c7d7adc8..6472e79a 100644 --- a/test/proxy/modules/MetaTxModule.test.js +++ b/test/proxy/modules/MetaTxModule.test.js @@ -1,30 +1,31 @@ const MetaTxModuleCommon = require('../../common/MetaTxModuleCommon') -const { deployCMTATProxyWithParameter, fixture, loadFixture } = require('../../deploymentUtils.js') +const { + deployCMTATProxyWithParameter, + fixture, + loadFixture +} = require('../../deploymentUtils.js') const { ZERO_ADDRESS, ERC2771ForwarderDomain } = require('../../utils.js') -describe( - 'Proxy - MetaTxModule', - function () { - beforeEach(async function () { - Object.assign(this, await loadFixture(fixture)); - this.flag = 5 - const DECIMAL = 0 - this.forwarder = await ethers.deployContract("MinimalForwarderMock") - await this.forwarder.initialize(ERC2771ForwarderDomain) - this.cmtat = await deployCMTATProxyWithParameter( - this.deployerAddress.address, - this.forwarder.target, - this.admin.address, - 'CMTA Token', - 'CMTAT', - DECIMAL, - 'CMTAT_ISIN', - 'https://cmta.ch', - 'CMTAT_info', - [ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS] - ) - }) +describe('Proxy - MetaTxModule', function () { + beforeEach(async function () { + Object.assign(this, await loadFixture(fixture)) + this.flag = 5 + const DECIMAL = 0 + this.forwarder = await ethers.deployContract('MinimalForwarderMock') + await this.forwarder.initialize(ERC2771ForwarderDomain) + this.cmtat = await deployCMTATProxyWithParameter( + this.deployerAddress.address, + this.forwarder.target, + this.admin.address, + 'CMTA Token', + 'CMTAT', + DECIMAL, + 'CMTAT_ISIN', + 'https://cmta.ch', + 'CMTAT_info', + [ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS] + ) + }) - MetaTxModuleCommon() - } -) + MetaTxModuleCommon() +}) diff --git a/test/proxy/modules/PauseModule.test.js b/test/proxy/modules/PauseModule.test.js index ee84ab0d..72a4962a 100644 --- a/test/proxy/modules/PauseModule.test.js +++ b/test/proxy/modules/PauseModule.test.js @@ -1,15 +1,20 @@ const PauseModuleCommon = require('../../common/PauseModuleCommon') -const { deployCMTATProxy, fixture, loadFixture } = require('../../deploymentUtils') +const { + deployCMTATProxy, + fixture, + loadFixture +} = require('../../deploymentUtils') -describe( - 'Proxy - PauseModule', - function () { - beforeEach(async function () { - Object.assign(this, await loadFixture(fixture)); - this.cmtat = await deployCMTATProxy(this._.address, this.admin.address, this.deployerAddress.address) - // Mint tokens to test the transfer - await this.cmtat.connect(this.admin).mint(this.address1, 20) - }) - PauseModuleCommon() - } -) +describe('Proxy - PauseModule', function () { + beforeEach(async function () { + Object.assign(this, await loadFixture(fixture)) + this.cmtat = await deployCMTATProxy( + this._.address, + this.admin.address, + this.deployerAddress.address + ) + // Mint tokens to test the transfer + await this.cmtat.connect(this.admin).mint(this.address1, 20) + }) + PauseModuleCommon() +}) diff --git a/test/proxy/modules/ValidationModule/ValidationModule.test.js b/test/proxy/modules/ValidationModule/ValidationModule.test.js index e4331a1e..062077cd 100644 --- a/test/proxy/modules/ValidationModule/ValidationModule.test.js +++ b/test/proxy/modules/ValidationModule/ValidationModule.test.js @@ -1,20 +1,31 @@ const ValidationModuleCommon = require('../../../common/ValidationModule/ValidationModuleSetRuleEngineCommon') -const { deployCMTATProxy,fixture, loadFixture } = require('../../../deploymentUtils') +const { + deployCMTATProxy, + fixture, + loadFixture +} = require('../../../deploymentUtils') -describe( - 'Proxy - ValidationModule', - function () { - beforeEach(async function () { - this.ADDRESS1_INITIAL_BALANCE = 17n - this.ADDRESS2_INITIAL_BALANCE = 18n - this.ADDRESS3_INITIAL_BALANCE = 19n - Object.assign(this, await loadFixture(fixture)); - this.ruleEngineMock = await ethers.deployContract('RuleEngineMock') - this.cmtat = await deployCMTATProxy(this._.address, this.admin.address, this.deployerAddress.address) - await this.cmtat.connect(this.admin).mint(this.address1, this.ADDRESS1_INITIAL_BALANCE) - await this.cmtat.connect(this.admin).mint(this.address2, this.ADDRESS2_INITIAL_BALANCE) - await this.cmtat.connect(this.admin).mint(this.address3, this.ADDRESS3_INITIAL_BALANCE) - }) - ValidationModuleCommon() - } -) +describe('Proxy - ValidationModule', function () { + beforeEach(async function () { + this.ADDRESS1_INITIAL_BALANCE = 17n + this.ADDRESS2_INITIAL_BALANCE = 18n + this.ADDRESS3_INITIAL_BALANCE = 19n + Object.assign(this, await loadFixture(fixture)) + this.ruleEngineMock = await ethers.deployContract('RuleEngineMock') + this.cmtat = await deployCMTATProxy( + this._.address, + this.admin.address, + this.deployerAddress.address + ) + await this.cmtat + .connect(this.admin) + .mint(this.address1, this.ADDRESS1_INITIAL_BALANCE) + await this.cmtat + .connect(this.admin) + .mint(this.address2, this.ADDRESS2_INITIAL_BALANCE) + await this.cmtat + .connect(this.admin) + .mint(this.address3, this.ADDRESS3_INITIAL_BALANCE) + }) + ValidationModuleCommon() +}) diff --git a/test/proxy/modules/ValidationModule/ValidationModuleConstructor.test.js b/test/proxy/modules/ValidationModule/ValidationModuleConstructor.test.js index 6e83f7de..7d74e6ea 100644 --- a/test/proxy/modules/ValidationModule/ValidationModuleConstructor.test.js +++ b/test/proxy/modules/ValidationModule/ValidationModuleConstructor.test.js @@ -1,34 +1,41 @@ const ValidationModuleCommon = require('../../../common/ValidationModule/ValidationModuleCommon') -const { deployCMTATProxyWithParameter, fixture, loadFixture } = require('../../../deploymentUtils') +const { + deployCMTATProxyWithParameter, + fixture, + loadFixture +} = require('../../../deploymentUtils') const { ZERO_ADDRESS } = require('../../../utils') -describe( - 'Proxy - ValidationModule - Constructor', - function () { - beforeEach(async function () { - this.ADDRESS1_INITIAL_BALANCE = 17n - this.ADDRESS2_INITIAL_BALANCE = 18n - this.ADDRESS3_INITIAL_BALANCE = 19n - Object.assign(this, await loadFixture(fixture)); - const DECIMAL = 0 - this.ruleEngineMock = await ethers.deployContract('RuleEngineMock') - this.definedAtDeployment = true - this.cmtat = await deployCMTATProxyWithParameter( - this.deployerAddress.address, - this._.address, - this.admin.address, - 'CMTA Token', - 'CMTAT', - DECIMAL, - 'CMTAT_ISIN', - 'https://cmta.ch', - 'CMTAT_info', - [this.ruleEngineMock.target, ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS] - ) - await this.cmtat.connect(this.admin).mint(this.address1, this.ADDRESS1_INITIAL_BALANCE) - await this.cmtat.connect(this.admin).mint(this.address2, this.ADDRESS2_INITIAL_BALANCE) - await this.cmtat.connect(this.admin).mint(this.address3, this.ADDRESS3_INITIAL_BALANCE) - }) - ValidationModuleCommon() - } -) +describe('Proxy - ValidationModule - Constructor', function () { + beforeEach(async function () { + this.ADDRESS1_INITIAL_BALANCE = 17n + this.ADDRESS2_INITIAL_BALANCE = 18n + this.ADDRESS3_INITIAL_BALANCE = 19n + Object.assign(this, await loadFixture(fixture)) + const DECIMAL = 0 + this.ruleEngineMock = await ethers.deployContract('RuleEngineMock') + this.definedAtDeployment = true + this.cmtat = await deployCMTATProxyWithParameter( + this.deployerAddress.address, + this._.address, + this.admin.address, + 'CMTA Token', + 'CMTAT', + DECIMAL, + 'CMTAT_ISIN', + 'https://cmta.ch', + 'CMTAT_info', + [this.ruleEngineMock.target, ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS] + ) + await this.cmtat + .connect(this.admin) + .mint(this.address1, this.ADDRESS1_INITIAL_BALANCE) + await this.cmtat + .connect(this.admin) + .mint(this.address2, this.ADDRESS2_INITIAL_BALANCE) + await this.cmtat + .connect(this.admin) + .mint(this.address3, this.ADDRESS3_INITIAL_BALANCE) + }) + ValidationModuleCommon() +}) diff --git a/test/proxy/modules/ValidationModule/ValidationModuleSetRuleEngine.test.js b/test/proxy/modules/ValidationModule/ValidationModuleSetRuleEngine.test.js index 52f61808..2405f82d 100644 --- a/test/proxy/modules/ValidationModule/ValidationModuleSetRuleEngine.test.js +++ b/test/proxy/modules/ValidationModule/ValidationModuleSetRuleEngine.test.js @@ -1,14 +1,19 @@ const ValidationModuleSetRuleEngineCommon = require('../../../common/ValidationModule/ValidationModuleSetRuleEngineCommon') -const { deployCMTATProxy, fixture, loadFixture } = require('../../../deploymentUtils') +const { + deployCMTATProxy, + fixture, + loadFixture +} = require('../../../deploymentUtils') -describe( - 'Proxy - ValidationModule - setRuleEngine', - function () { - beforeEach(async function () { - Object.assign(this, await loadFixture(fixture)); - this.cmtat = await deployCMTATProxy(this._.address, this.admin.address, this.deployerAddress.address) - this.ruleEngine = await ethers.deployContract("RuleEngineMock") - }) - ValidationModuleSetRuleEngineCommon() - } -) +describe('Proxy - ValidationModule - setRuleEngine', function () { + beforeEach(async function () { + Object.assign(this, await loadFixture(fixture)) + this.cmtat = await deployCMTATProxy( + this._.address, + this.admin.address, + this.deployerAddress.address + ) + this.ruleEngine = await ethers.deployContract('RuleEngineMock') + }) + ValidationModuleSetRuleEngineCommon() +}) diff --git a/test/standard/modules/AuthorizationModule/AuthorizationModule.test.js b/test/standard/modules/AuthorizationModule/AuthorizationModule.test.js index e438506b..7f5a07e0 100644 --- a/test/standard/modules/AuthorizationModule/AuthorizationModule.test.js +++ b/test/standard/modules/AuthorizationModule/AuthorizationModule.test.js @@ -1,15 +1,22 @@ const AuthorizationModuleCommon = require('../../../common/AuthorizationModule/AuthorizationModuleCommon') const AuthorizationModuleSetAuthorizationEngineCommon = require('../../../common/AuthorizationModule/AuthorizationModuleSetAuthorizationEngineCommon') -const { deployCMTATStandalone, fixture, loadFixture } = require('../../../deploymentUtils') -describe( - 'Standard - AuthorizationModule', - function () { - beforeEach(async function () { - Object.assign(this, await loadFixture(fixture)); - this.cmtat = await deployCMTATStandalone(this._.address, this.admin.address, this.deployerAddress.address) - this.authorizationEngineMock = await ethers.deployContract("AuthorizationEngineMock") - }) - AuthorizationModuleCommon() - AuthorizationModuleSetAuthorizationEngineCommon() - } -) +const { + deployCMTATStandalone, + fixture, + loadFixture +} = require('../../../deploymentUtils') +describe('Standard - AuthorizationModule', function () { + beforeEach(async function () { + Object.assign(this, await loadFixture(fixture)) + this.cmtat = await deployCMTATStandalone( + this._.address, + this.admin.address, + this.deployerAddress.address + ) + this.authorizationEngineMock = await ethers.deployContract( + 'AuthorizationEngineMock' + ) + }) + AuthorizationModuleCommon() + AuthorizationModuleSetAuthorizationEngineCommon() +}) diff --git a/test/standard/modules/AuthorizationModule/AuthorizationModuleConstructor.test.js b/test/standard/modules/AuthorizationModule/AuthorizationModuleConstructor.test.js index b9aff553..40e826c3 100644 --- a/test/standard/modules/AuthorizationModule/AuthorizationModuleConstructor.test.js +++ b/test/standard/modules/AuthorizationModule/AuthorizationModuleConstructor.test.js @@ -1,31 +1,37 @@ const AuthorizationModuleSetAuthorizationEngineCommon = require('../../../common/AuthorizationModule/AuthorizationModuleSetAuthorizationEngineCommon') const { - deployCMTATStandaloneWithParameter, fixture, loadFixture + deployCMTATStandaloneWithParameter, + fixture, + loadFixture } = require('../../../deploymentUtils') const { ZERO_ADDRESS } = require('../../../utils') -describe( - 'Proxy - AuthorizationModule - Constructor', - function () { - beforeEach(async function () { - Object.assign(this, await loadFixture(fixture)); - this.authorizationEngineMock = await ethers.deployContract("AuthorizationEngineMock") - const DECIMAL = 0 - this.definedAtDeployment = true - this.cmtat = await deployCMTATStandaloneWithParameter( - this.deployerAddress.address, - this._.address, - this.admin.address, - 'CMTA Token', - 'CMTAT', - DECIMAL, - 'CMTAT_ISIN', - 'https://cmta.ch', - 'CMTAT_info', - [ZERO_ADDRESS, ZERO_ADDRESS, this.authorizationEngineMock.target, ZERO_ADDRESS] - ) - }) - AuthorizationModuleSetAuthorizationEngineCommon() - } -) +describe('Proxy - AuthorizationModule - Constructor', function () { + beforeEach(async function () { + Object.assign(this, await loadFixture(fixture)) + this.authorizationEngineMock = await ethers.deployContract( + 'AuthorizationEngineMock' + ) + const DECIMAL = 0 + this.definedAtDeployment = true + this.cmtat = await deployCMTATStandaloneWithParameter( + this.deployerAddress.address, + this._.address, + this.admin.address, + 'CMTA Token', + 'CMTAT', + DECIMAL, + 'CMTAT_ISIN', + 'https://cmta.ch', + 'CMTAT_info', + [ + ZERO_ADDRESS, + ZERO_ADDRESS, + this.authorizationEngineMock.target, + ZERO_ADDRESS + ] + ) + }) + AuthorizationModuleSetAuthorizationEngineCommon() +}) diff --git a/test/standard/modules/BaseModule.test.js b/test/standard/modules/BaseModule.test.js index 15c4ff15..29a34073 100644 --- a/test/standard/modules/BaseModule.test.js +++ b/test/standard/modules/BaseModule.test.js @@ -2,17 +2,19 @@ const BaseModuleCommon = require('../../common/BaseModuleCommon') const { deployCMTATStandalone, DEPLOYMENT_FLAG, - fixture, loadFixture + fixture, + loadFixture } = require('../../deploymentUtils') -describe( - 'Standard - BaseModule', - function () { - beforeEach(async function () { - Object.assign(this, await loadFixture(fixture)); - this.flag = DEPLOYMENT_FLAG // value used in tests - this.cmtat = await deployCMTATStandalone(this._.address, this.admin.address, this.deployerAddress.address) - }) +describe('Standard - BaseModule', function () { + beforeEach(async function () { + Object.assign(this, await loadFixture(fixture)) + this.flag = DEPLOYMENT_FLAG // value used in tests + this.cmtat = await deployCMTATStandalone( + this._.address, + this.admin.address, + this.deployerAddress.address + ) + }) - BaseModuleCommon() - } -) + BaseModuleCommon() +}) diff --git a/test/standard/modules/DebtModule/DebtModule.test.js b/test/standard/modules/DebtModule/DebtModule.test.js index 30c9b876..6c3afd6c 100644 --- a/test/standard/modules/DebtModule/DebtModule.test.js +++ b/test/standard/modules/DebtModule/DebtModule.test.js @@ -1,15 +1,20 @@ const DebtModuleSetDebtEngineCommon = require('../../../common/DebtModule/DebtModuleSetDebtEngineCommon') const DebtModuleCommon = require('../../../common/DebtModule/DebtModuleCommon') -const { deployCMTATStandalone, fixture, loadFixture } = require('../../../deploymentUtils') -describe( - 'Standard - DebtModule', - function () { - beforeEach(async function () { - Object.assign(this, await loadFixture(fixture)); - this.cmtat = await deployCMTATStandalone(this._.address, this.admin.address, this.deployerAddress.address) - this.debtEngineMock = await ethers.deployContract("DebtEngineMock") - }) - DebtModuleCommon() - DebtModuleSetDebtEngineCommon() - } -) +const { + deployCMTATStandalone, + fixture, + loadFixture +} = require('../../../deploymentUtils') +describe('Standard - DebtModule', function () { + beforeEach(async function () { + Object.assign(this, await loadFixture(fixture)) + this.cmtat = await deployCMTATStandalone( + this._.address, + this.admin.address, + this.deployerAddress.address + ) + this.debtEngineMock = await ethers.deployContract('DebtEngineMock') + }) + DebtModuleCommon() + DebtModuleSetDebtEngineCommon() +}) diff --git a/test/standard/modules/DebtModule/DebtModuleConstructor.test.js b/test/standard/modules/DebtModule/DebtModuleConstructor.test.js index de380621..ffb23791 100644 --- a/test/standard/modules/DebtModule/DebtModuleConstructor.test.js +++ b/test/standard/modules/DebtModule/DebtModuleConstructor.test.js @@ -1,32 +1,30 @@ const DebtModuleCommon = require('../../../common/DebtModule/DebtModuleCommon') const { - deployCMTATStandaloneWithParameter, fixture, loadFixture + deployCMTATStandaloneWithParameter, + fixture, + loadFixture } = require('../../../deploymentUtils') const { ZERO_ADDRESS } = require('../../../utils') -describe( - 'Standard - DebtModule - Constructor', - function () { - beforeEach(async function () { - Object.assign(this, await loadFixture(fixture)); - const DECIMAL = 0 - this.debtEngineMock = await ethers.deployContract('DebtEngineMock') - this.definedAtDeployment = true - this.cmtat = await deployCMTATStandaloneWithParameter( - this.deployerAddress.address, - this._.address, - this.admin.address, - 'CMTA Token', - 'CMTAT', - DECIMAL, - 'CMTAT_ISIN', - 'https://cmta.ch', - 'CMTAT_info', - [ZERO_ADDRESS, this.debtEngineMock.target, ZERO_ADDRESS, ZERO_ADDRESS] - - ) - }) - DebtModuleCommon() - } -) +describe('Standard - DebtModule - Constructor', function () { + beforeEach(async function () { + Object.assign(this, await loadFixture(fixture)) + const DECIMAL = 0 + this.debtEngineMock = await ethers.deployContract('DebtEngineMock') + this.definedAtDeployment = true + this.cmtat = await deployCMTATStandaloneWithParameter( + this.deployerAddress.address, + this._.address, + this.admin.address, + 'CMTA Token', + 'CMTAT', + DECIMAL, + 'CMTAT_ISIN', + 'https://cmta.ch', + 'CMTAT_info', + [ZERO_ADDRESS, this.debtEngineMock.target, ZERO_ADDRESS, ZERO_ADDRESS] + ) + }) + DebtModuleCommon() +}) diff --git a/test/standard/modules/DocumentModule/DocumentModule.test.js b/test/standard/modules/DocumentModule/DocumentModule.test.js index 93676fb9..9410cf6d 100644 --- a/test/standard/modules/DocumentModule/DocumentModule.test.js +++ b/test/standard/modules/DocumentModule/DocumentModule.test.js @@ -1,15 +1,20 @@ const DocumentModuleSetDocumentEngineCommon = require('../../../common/DocumentModule/DocumentModuleSetDocumentEngineCommon') const DocumentModuleCommon = require('../../../common/DocumentModule/DocumentModuleCommon') -const { deployCMTATStandalone, fixture, loadFixture } = require('../../../deploymentUtils') -describe( - 'Standard - DocumentModule', - function () { - beforeEach(async function () { - Object.assign(this, await loadFixture(fixture)); - this.cmtat = await deployCMTATStandalone(this._.address, this.admin.address, this.deployerAddress.address) - this.documentEngineMock = await ethers.deployContract("DocumentEngineMock") - }) - DocumentModuleCommon() - DocumentModuleSetDocumentEngineCommon() - } -) +const { + deployCMTATStandalone, + fixture, + loadFixture +} = require('../../../deploymentUtils') +describe('Standard - DocumentModule', function () { + beforeEach(async function () { + Object.assign(this, await loadFixture(fixture)) + this.cmtat = await deployCMTATStandalone( + this._.address, + this.admin.address, + this.deployerAddress.address + ) + this.documentEngineMock = await ethers.deployContract('DocumentEngineMock') + }) + DocumentModuleCommon() + DocumentModuleSetDocumentEngineCommon() +}) diff --git a/test/standard/modules/DocumentModule/DocumentModuleConstructor.test.js b/test/standard/modules/DocumentModule/DocumentModuleConstructor.test.js index a0f6519b..f1b7ef38 100644 --- a/test/standard/modules/DocumentModule/DocumentModuleConstructor.test.js +++ b/test/standard/modules/DocumentModule/DocumentModuleConstructor.test.js @@ -1,32 +1,30 @@ const DocumentModuleCommon = require('../../../common/DocumentModule/DocumentModuleCommon') const { - deployCMTATStandaloneWithParameter, fixture, loadFixture + deployCMTATStandaloneWithParameter, + fixture, + loadFixture } = require('../../../deploymentUtils') const { ZERO_ADDRESS } = require('../../../utils') -describe( - 'Standard - DocumentModule - Constructor', - function () { - beforeEach(async function () { - Object.assign(this, await loadFixture(fixture)); - const DECIMAL = 0 - this.documentEngineMock = await ethers.deployContract('DocumentEngineMock') - this.definedAtDeployment = true - this.cmtat = await deployCMTATStandaloneWithParameter( - this.deployerAddress.address, - this._.address, - this.admin.address, - 'CMTA Token', - 'CMTAT', - DECIMAL, - 'CMTAT_ISIN', - 'https://cmta.ch', - 'CMTAT_info', - [ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS, this.documentEngineMock.target] - - ) - }) - DocumentModuleCommon() - } -) +describe('Standard - DocumentModule - Constructor', function () { + beforeEach(async function () { + Object.assign(this, await loadFixture(fixture)) + const DECIMAL = 0 + this.documentEngineMock = await ethers.deployContract('DocumentEngineMock') + this.definedAtDeployment = true + this.cmtat = await deployCMTATStandaloneWithParameter( + this.deployerAddress.address, + this._.address, + this.admin.address, + 'CMTA Token', + 'CMTAT', + DECIMAL, + 'CMTAT_ISIN', + 'https://cmta.ch', + 'CMTAT_info', + [ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS, this.documentEngineMock.target] + ) + }) + DocumentModuleCommon() +}) diff --git a/test/standard/modules/ERC20BaseModule.test.js b/test/standard/modules/ERC20BaseModule.test.js index c9693c94..5cfa9eb6 100644 --- a/test/standard/modules/ERC20BaseModule.test.js +++ b/test/standard/modules/ERC20BaseModule.test.js @@ -1,13 +1,18 @@ const ERC20BaseModuleCommon = require('../../common/ERC20BaseModuleCommon') -const { deployCMTATStandalone, fixture, loadFixture } = require('../../deploymentUtils') -describe( - 'Standard - ERC20BaseModule', - function () { - beforeEach(async function () { - Object.assign(this, await loadFixture(fixture)); - this.cmtat = await deployCMTATStandalone(this._.address, this.admin.address, this.deployerAddress.address) - }) +const { + deployCMTATStandalone, + fixture, + loadFixture +} = require('../../deploymentUtils') +describe('Standard - ERC20BaseModule', function () { + beforeEach(async function () { + Object.assign(this, await loadFixture(fixture)) + this.cmtat = await deployCMTATStandalone( + this._.address, + this.admin.address, + this.deployerAddress.address + ) + }) - ERC20BaseModuleCommon() - } -) + ERC20BaseModuleCommon() +}) diff --git a/test/standard/modules/ERC20BurnModule.test.js b/test/standard/modules/ERC20BurnModule.test.js index 72cd8c7c..18f67c72 100644 --- a/test/standard/modules/ERC20BurnModule.test.js +++ b/test/standard/modules/ERC20BurnModule.test.js @@ -1,13 +1,18 @@ const ERC20BurnModuleCommon = require('../../common/ERC20BurnModuleCommon') -const { deployCMTATStandalone, fixture, loadFixture } = require('../../deploymentUtils') -describe( - 'Standard - ERC20BurnModule', - function () { - beforeEach(async function () { - Object.assign(this, await loadFixture(fixture)); - this.cmtat = await deployCMTATStandalone(this._.address, this.admin.address, this.deployerAddress.address) - }) +const { + deployCMTATStandalone, + fixture, + loadFixture +} = require('../../deploymentUtils') +describe('Standard - ERC20BurnModule', function () { + beforeEach(async function () { + Object.assign(this, await loadFixture(fixture)) + this.cmtat = await deployCMTATStandalone( + this._.address, + this.admin.address, + this.deployerAddress.address + ) + }) - ERC20BurnModuleCommon() - } -) + ERC20BurnModuleCommon() +}) diff --git a/test/standard/modules/ERC20MintModule.test.js b/test/standard/modules/ERC20MintModule.test.js index 2171a207..d1781f38 100644 --- a/test/standard/modules/ERC20MintModule.test.js +++ b/test/standard/modules/ERC20MintModule.test.js @@ -1,13 +1,18 @@ const ERC20MintModuleCommon = require('../../common/ERC20MintModuleCommon') -const { deployCMTATStandalone, fixture, loadFixture } = require('../../deploymentUtils') -describe( - 'Standard - ERC20MintModule', - function () { - beforeEach(async function () { - Object.assign(this, await loadFixture(fixture)); - this.cmtat = await deployCMTATStandalone(this._.address, this.admin.address, this.deployerAddress.address) - }) +const { + deployCMTATStandalone, + fixture, + loadFixture +} = require('../../deploymentUtils') +describe('Standard - ERC20MintModule', function () { + beforeEach(async function () { + Object.assign(this, await loadFixture(fixture)) + this.cmtat = await deployCMTATStandalone( + this._.address, + this.admin.address, + this.deployerAddress.address + ) + }) - ERC20MintModuleCommon() - } -) + ERC20MintModuleCommon() +}) diff --git a/test/standard/modules/ERC20SnapshotModule.test.js b/test/standard/modules/ERC20SnapshotModule.test.js index 93ffef95..111c8f01 100644 --- a/test/standard/modules/ERC20SnapshotModule.test.js +++ b/test/standard/modules/ERC20SnapshotModule.test.js @@ -5,25 +5,26 @@ const ERC20SnapshotModuleCommonGetNextSnapshot = require('../../common/ERC20Snap const ERC20SnapshotModuleMultiplePlannedTest = require('../../common/ERC20SnapshotModuleCommon/global/ERC20SnapshotModuleMultiplePlannedTest') const ERC20SnapshotModuleOnePlannedSnapshotTest = require('../../common/ERC20SnapshotModuleCommon/global/ERC20SnapshotModuleOnePlannedSnapshotTest') const ERC20SnapshotModuleZeroPlannedSnapshotTest = require('../../common/ERC20SnapshotModuleCommon/global/ERC20SnapshotModuleZeroPlannedSnapshot') -const { deployCMTATStandalone, fixture, loadFixture } = require('../../deploymentUtils') +const { + deployCMTATStandalone, + fixture, + loadFixture +} = require('../../deploymentUtils') -describe( - 'Standard - ERC20SnapshotModule', - function () { - beforeEach(async function () { - Object.assign(this, await loadFixture(fixture)); - this.cmtat = await deployCMTATStandalone( - this._.address, - this.admin.address, - this.deployerAddress.address - ) - }) - ERC20SnapshotModuleMultiplePlannedTest() - ERC20SnapshotModuleOnePlannedSnapshotTest() - ERC20SnapshotModuleZeroPlannedSnapshotTest() - ERC20SnapshotModuleCommonRescheduling() - ERC20SnapshotModuleCommonScheduling() - ERC20SnapshotModuleCommonUnschedule() - ERC20SnapshotModuleCommonGetNextSnapshot() - } -) +describe('Standard - ERC20SnapshotModule', function () { + beforeEach(async function () { + Object.assign(this, await loadFixture(fixture)) + this.cmtat = await deployCMTATStandalone( + this._.address, + this.admin.address, + this.deployerAddress.address + ) + }) + ERC20SnapshotModuleMultiplePlannedTest() + ERC20SnapshotModuleOnePlannedSnapshotTest() + ERC20SnapshotModuleZeroPlannedSnapshotTest() + ERC20SnapshotModuleCommonRescheduling() + ERC20SnapshotModuleCommonScheduling() + ERC20SnapshotModuleCommonUnschedule() + ERC20SnapshotModuleCommonGetNextSnapshot() +}) diff --git a/test/standard/modules/EnforcementModule.test.js b/test/standard/modules/EnforcementModule.test.js index 8b2f2c36..507b9395 100644 --- a/test/standard/modules/EnforcementModule.test.js +++ b/test/standard/modules/EnforcementModule.test.js @@ -1,13 +1,18 @@ const EnforcementModuleCommon = require('../../common/EnforcementModuleCommon') -const { deployCMTATStandalone, fixture, loadFixture } = require('../../deploymentUtils') -describe( - 'Standard - EnforcementModule', - function () { - beforeEach(async function () { - Object.assign(this, await loadFixture(fixture)); - this.cmtat = await deployCMTATStandalone(this._.address, this.admin.address, this.deployerAddress.address) - }) +const { + deployCMTATStandalone, + fixture, + loadFixture +} = require('../../deploymentUtils') +describe('Standard - EnforcementModule', function () { + beforeEach(async function () { + Object.assign(this, await loadFixture(fixture)) + this.cmtat = await deployCMTATStandalone( + this._.address, + this.admin.address, + this.deployerAddress.address + ) + }) - EnforcementModuleCommon() - } -) + EnforcementModuleCommon() +}) diff --git a/test/standard/modules/MetaTxModule.test.js b/test/standard/modules/MetaTxModule.test.js index 8b49a745..d40cd3aa 100644 --- a/test/standard/modules/MetaTxModule.test.js +++ b/test/standard/modules/MetaTxModule.test.js @@ -1,29 +1,30 @@ const MetaTxModuleCommon = require('../../common/MetaTxModuleCommon') -const { deployCMTATStandaloneWithParameter, fixture, loadFixture } = require('../../deploymentUtils.js') +const { + deployCMTATStandaloneWithParameter, + fixture, + loadFixture +} = require('../../deploymentUtils.js') const { ZERO_ADDRESS, ERC2771ForwarderDomain } = require('../../utils.js') -describe( - 'Standard - MetaTxModule', - function () { - beforeEach(async function () { - Object.assign(this, await loadFixture(fixture)); - const DECIMAL = 0n +describe('Standard - MetaTxModule', function () { + beforeEach(async function () { + Object.assign(this, await loadFixture(fixture)) + const DECIMAL = 0n - this.forwarder = await ethers.deployContract("MinimalForwarderMock") - await this.forwarder.initialize(ERC2771ForwarderDomain) - this.cmtat = await deployCMTATStandaloneWithParameter( - this.deployerAddress.address, - this.forwarder.target, - this.admin.address, - 'CMTA Token', - 'CMTAT', - DECIMAL, - 'CMTAT_ISIN', - 'https://cmta.ch', - 'CMTAT_info', - [ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS] - ) - }) + this.forwarder = await ethers.deployContract('MinimalForwarderMock') + await this.forwarder.initialize(ERC2771ForwarderDomain) + this.cmtat = await deployCMTATStandaloneWithParameter( + this.deployerAddress.address, + this.forwarder.target, + this.admin.address, + 'CMTA Token', + 'CMTAT', + DECIMAL, + 'CMTAT_ISIN', + 'https://cmta.ch', + 'CMTAT_info', + [ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS] + ) + }) - MetaTxModuleCommon() - } -) + MetaTxModuleCommon() +}) diff --git a/test/standard/modules/PauseModule.test.js b/test/standard/modules/PauseModule.test.js index 2c4b6dda..f5f64831 100644 --- a/test/standard/modules/PauseModule.test.js +++ b/test/standard/modules/PauseModule.test.js @@ -1,14 +1,19 @@ const PauseModuleCommon = require('../../common/PauseModuleCommon') -const { deployCMTATStandalone, fixture, loadFixture } = require('../../deploymentUtils') -describe( - 'Standard - PauseModule', - function () { - beforeEach(async function () { - Object.assign(this, await loadFixture(fixture)); - this.cmtat = await deployCMTATStandalone(this._.address, this.admin.address, this.deployerAddress.address) - // Mint tokens to test the transfer - await this.cmtat.connect(this.admin).mint(this.address1, 20) - }) - PauseModuleCommon() - } -) +const { + deployCMTATStandalone, + fixture, + loadFixture +} = require('../../deploymentUtils') +describe('Standard - PauseModule', function () { + beforeEach(async function () { + Object.assign(this, await loadFixture(fixture)) + this.cmtat = await deployCMTATStandalone( + this._.address, + this.admin.address, + this.deployerAddress.address + ) + // Mint tokens to test the transfer + await this.cmtat.connect(this.admin).mint(this.address1, 20) + }) + PauseModuleCommon() +}) diff --git a/test/standard/modules/ValidationModule/ValidationModule.test.js b/test/standard/modules/ValidationModule/ValidationModule.test.js index 3ac79ecd..1b99b881 100644 --- a/test/standard/modules/ValidationModule/ValidationModule.test.js +++ b/test/standard/modules/ValidationModule/ValidationModule.test.js @@ -1,19 +1,30 @@ const ValidationModuleCommon = require('../../../common/ValidationModule/ValidationModuleCommon') -const { deployCMTATStandalone, fixture, loadFixture } = require('../../../deploymentUtils') -describe( - 'Standard - ValidationModule', - function () { - beforeEach(async function () { - this.ADDRESS1_INITIAL_BALANCE = 31n - this.ADDRESS2_INITIAL_BALANCE = 32n - this.ADDRESS3_INITIAL_BALANCE = 33n - Object.assign(this, await loadFixture(fixture)); - this.ruleEngineMock = await ethers.deployContract('RuleEngineMock') - this.cmtat = await deployCMTATStandalone(this._.address, this.admin.address, this.deployerAddress.address) - await this.cmtat.connect(this.admin).mint(this.address1, this.ADDRESS1_INITIAL_BALANCE) - await this.cmtat.connect(this.admin).mint(this.address2, this.ADDRESS2_INITIAL_BALANCE) - await this.cmtat.connect(this.admin).mint(this.address3, this.ADDRESS3_INITIAL_BALANCE) - }) - ValidationModuleCommon() - } -) +const { + deployCMTATStandalone, + fixture, + loadFixture +} = require('../../../deploymentUtils') +describe('Standard - ValidationModule', function () { + beforeEach(async function () { + this.ADDRESS1_INITIAL_BALANCE = 31n + this.ADDRESS2_INITIAL_BALANCE = 32n + this.ADDRESS3_INITIAL_BALANCE = 33n + Object.assign(this, await loadFixture(fixture)) + this.ruleEngineMock = await ethers.deployContract('RuleEngineMock') + this.cmtat = await deployCMTATStandalone( + this._.address, + this.admin.address, + this.deployerAddress.address + ) + await this.cmtat + .connect(this.admin) + .mint(this.address1, this.ADDRESS1_INITIAL_BALANCE) + await this.cmtat + .connect(this.admin) + .mint(this.address2, this.ADDRESS2_INITIAL_BALANCE) + await this.cmtat + .connect(this.admin) + .mint(this.address3, this.ADDRESS3_INITIAL_BALANCE) + }) + ValidationModuleCommon() +}) diff --git a/test/standard/modules/ValidationModule/ValidationModuleConstructor.test.js b/test/standard/modules/ValidationModule/ValidationModuleConstructor.test.js index 43b218e7..0372b67d 100644 --- a/test/standard/modules/ValidationModule/ValidationModuleConstructor.test.js +++ b/test/standard/modules/ValidationModule/ValidationModuleConstructor.test.js @@ -1,38 +1,42 @@ const ValidationModuleCommon = require('../../../common/ValidationModule/ValidationModuleCommon') const { - deployCMTATStandaloneWithParameter, fixture, loadFixture + deployCMTATStandaloneWithParameter, + fixture, + loadFixture } = require('../../../deploymentUtils') const { ZERO_ADDRESS } = require('../../../utils') -describe( - 'Standard - ValidationModule - Constructor', - function () { - beforeEach(async function () { - this.ADDRESS1_INITIAL_BALANCE = 17n - this.ADDRESS2_INITIAL_BALANCE = 18n - this.ADDRESS3_INITIAL_BALANCE = 19n - Object.assign(this, await loadFixture(fixture)); - const DECIMAL = 0 - this.ruleEngineMock = await ethers.deployContract('RuleEngineMock') - this.definedAtDeployment = true - this.cmtat = await deployCMTATStandaloneWithParameter( - this.deployerAddress.address, - this._.address, - this.admin.address, - 'CMTA Token', - 'CMTAT', - DECIMAL, - 'CMTAT_ISIN', - 'https://cmta.ch', - 'CMTAT_info', - [this.ruleEngineMock.target, ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS] - - ) - await this.cmtat.connect(this.admin).mint(this.address1, this.ADDRESS1_INITIAL_BALANCE) - await this.cmtat.connect(this.admin).mint(this.address2, this.ADDRESS2_INITIAL_BALANCE) - await this.cmtat.connect(this.admin).mint(this.address3, this.ADDRESS3_INITIAL_BALANCE) - }) - ValidationModuleCommon() - } -) +describe('Standard - ValidationModule - Constructor', function () { + beforeEach(async function () { + this.ADDRESS1_INITIAL_BALANCE = 17n + this.ADDRESS2_INITIAL_BALANCE = 18n + this.ADDRESS3_INITIAL_BALANCE = 19n + Object.assign(this, await loadFixture(fixture)) + const DECIMAL = 0 + this.ruleEngineMock = await ethers.deployContract('RuleEngineMock') + this.definedAtDeployment = true + this.cmtat = await deployCMTATStandaloneWithParameter( + this.deployerAddress.address, + this._.address, + this.admin.address, + 'CMTA Token', + 'CMTAT', + DECIMAL, + 'CMTAT_ISIN', + 'https://cmta.ch', + 'CMTAT_info', + [this.ruleEngineMock.target, ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS] + ) + await this.cmtat + .connect(this.admin) + .mint(this.address1, this.ADDRESS1_INITIAL_BALANCE) + await this.cmtat + .connect(this.admin) + .mint(this.address2, this.ADDRESS2_INITIAL_BALANCE) + await this.cmtat + .connect(this.admin) + .mint(this.address3, this.ADDRESS3_INITIAL_BALANCE) + }) + ValidationModuleCommon() +}) diff --git a/test/standard/modules/ValidationModule/ValidationModuleSetRuleEngine.test.js b/test/standard/modules/ValidationModule/ValidationModuleSetRuleEngine.test.js index fb98c425..d47972aa 100644 --- a/test/standard/modules/ValidationModule/ValidationModuleSetRuleEngine.test.js +++ b/test/standard/modules/ValidationModule/ValidationModuleSetRuleEngine.test.js @@ -1,14 +1,18 @@ const ValidationModuleSetRuleEngineCommon = require('../../../common/ValidationModule/ValidationModuleSetRuleEngineCommon') -const { deployCMTATStandalone, fixture, loadFixture } = require('../../../deploymentUtils') -describe( - 'Standard - ValidationModule - setRuleEngine', - function () { - beforeEach(async function () { - Object.assign(this, await loadFixture(fixture)); - this.cmtat = await deployCMTATStandalone(this._.address, this.admin.address, this.deployerAddress.address) - this.ruleEngine = await ethers.deployContract("RuleEngineMock") - - }) - ValidationModuleSetRuleEngineCommon() - } -) +const { + deployCMTATStandalone, + fixture, + loadFixture +} = require('../../../deploymentUtils') +describe('Standard - ValidationModule - setRuleEngine', function () { + beforeEach(async function () { + Object.assign(this, await loadFixture(fixture)) + this.cmtat = await deployCMTATStandalone( + this._.address, + this.admin.address, + this.deployerAddress.address + ) + this.ruleEngine = await ethers.deployContract('RuleEngineMock') + }) + ValidationModuleSetRuleEngineCommon() +}) diff --git a/test/utils.js b/test/utils.js index 55b73cc7..b984047f 100644 --- a/test/utils.js +++ b/test/utils.js @@ -21,7 +21,7 @@ module.exports = { '0x13293a342e85bb7a675992804d0c6194d27d85f90a7401d0666e206fe3b06a03', DOCUMENT_ROLE: '0xdd7c9aafbb91d54fb2041db1d5b172ea665309b32f5fffdbddf452802a1e3b20', - PROXY_UPGRADE_ROLE: `0x233d5d22cfc2df30a1764cac21e2207537a3711647f2c29fe3702201f65c1444`, + PROXY_UPGRADE_ROLE: '0x233d5d22cfc2df30a1764cac21e2207537a3711647f2c29fe3702201f65c1444', ZERO_ADDRESS: ethers.ZeroAddress, RULE_MOCK_AMOUNT_MAX: '20', CMTAT_TRANSFER_REJECT: 'CMTAT: transfer rejected by validation module', From e919953dee68ae150df833417e78fda1ab1b2439 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Oct 2024 18:23:27 +0000 Subject: [PATCH 3/4] Bump secp256k1 from 4.0.3 to 4.0.4 Bumps [secp256k1](https://github.com/cryptocoinjs/secp256k1-node) from 4.0.3 to 4.0.4. - [Release notes](https://github.com/cryptocoinjs/secp256k1-node/releases) - [Commits](https://github.com/cryptocoinjs/secp256k1-node/compare/v4.0.3...v4.0.4) --- updated-dependencies: - dependency-name: secp256k1 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 66 +++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 55 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index 88a11bb0..f8ac19e7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19489,20 +19489,41 @@ "dev": true }, "node_modules/secp256k1": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", - "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.4.tgz", + "integrity": "sha512-6JfvwvjUOn8F/jUoBY2Q1v5WY5XS+rj8qSe0v8Y4ezH4InLgTEeOOPQsRll9OV429Pvo6BCHGavIyJfr3TAhsw==", "dev": true, "hasInstallScript": true, "dependencies": { - "elliptic": "^6.5.4", - "node-addon-api": "^2.0.0", + "elliptic": "^6.5.7", + "node-addon-api": "^5.0.0", "node-gyp-build": "^4.2.0" }, "engines": { - "node": ">=10.0.0" + "node": ">=18.0.0" + } + }, + "node_modules/secp256k1/node_modules/elliptic": { + "version": "6.5.7", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.7.tgz", + "integrity": "sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q==", + "dev": true, + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" } }, + "node_modules/secp256k1/node_modules/node-addon-api": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", + "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==", + "dev": true + }, "node_modules/semver": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", @@ -38642,14 +38663,37 @@ "dev": true }, "secp256k1": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", - "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.4.tgz", + "integrity": "sha512-6JfvwvjUOn8F/jUoBY2Q1v5WY5XS+rj8qSe0v8Y4ezH4InLgTEeOOPQsRll9OV429Pvo6BCHGavIyJfr3TAhsw==", "dev": true, "requires": { - "elliptic": "^6.5.4", - "node-addon-api": "^2.0.0", + "elliptic": "^6.5.7", + "node-addon-api": "^5.0.0", "node-gyp-build": "^4.2.0" + }, + "dependencies": { + "elliptic": { + "version": "6.5.7", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.7.tgz", + "integrity": "sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q==", + "dev": true, + "requires": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node-addon-api": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", + "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==", + "dev": true + } } }, "semver": { From 75dd08377b85563d097f9cb0999d12426f99feab Mon Sep 17 00:00:00 2001 From: Ryan Sauge <71391932+rya-sge@users.noreply.github.com> Date: Tue, 12 Nov 2024 17:35:26 +0100 Subject: [PATCH 4/4] Separate ERC20 calls inside snapshotModule --- .../internal/ERC20SnapshotModuleInternal.sol | 41 +++------------- .../internal/base/SnapshotModuleBase.sol | 48 +++++++++++++++++++ 2 files changed, 55 insertions(+), 34 deletions(-) diff --git a/contracts/modules/internal/ERC20SnapshotModuleInternal.sol b/contracts/modules/internal/ERC20SnapshotModuleInternal.sol index 654b7186..e7db352e 100644 --- a/contracts/modules/internal/ERC20SnapshotModuleInternal.sol +++ b/contracts/modules/internal/ERC20SnapshotModuleInternal.sol @@ -68,13 +68,7 @@ abstract contract ERC20SnapshotModuleInternal is ICMTATSnapshot, SnapshotModuleB uint256 time, address owner ) public view returns (uint256) { - SnapshotModuleBaseStorage storage $ = _getSnapshotModuleBaseStorage(); - (bool snapshotted, uint256 value) = _valueAt( - time, - $._accountBalanceSnapshots[owner] - ); - - return snapshotted ? value : balanceOf(owner); + return _snapshotBalanceOf(time, owner, balanceOf(owner)); } /** @@ -83,12 +77,7 @@ abstract contract ERC20SnapshotModuleInternal is ICMTATSnapshot, SnapshotModuleB * @return value stored in the snapshot, or the actual totalSupply if no snapshot */ function snapshotTotalSupply(uint256 time) public view returns (uint256) { - SnapshotModuleBaseStorage storage $ = _getSnapshotModuleBaseStorage(); - (bool snapshotted, uint256 value) = _valueAt( - time, - $._totalSupplySnapshots - ); - return snapshotted ? value : totalSupply(); + return _snapshotTotalSupply(time, totalSupply()); } /*////////////////////////////////////////////////////////////// @@ -106,34 +95,18 @@ abstract contract ERC20SnapshotModuleInternal is ICMTATSnapshot, SnapshotModuleB _setCurrentSnapshot(); if (from != address(0)) { // for both burn and transfer - _updateAccountSnapshot(from); + _updateAccountSnapshot(from, balanceOf(from)); if (to != address(0)) { // transfer - _updateAccountSnapshot(to); + _updateAccountSnapshot(to, balanceOf(to)); } else { // burn - _updateTotalSupplySnapshot(); + _updateTotalSupplySnapshot(totalSupply()); } } else { // mint - _updateAccountSnapshot(to); - _updateTotalSupplySnapshot(); + _updateAccountSnapshot(to, balanceOf(to)); + _updateTotalSupplySnapshot(totalSupply()); } } - - /** - * @dev See {OpenZeppelin - ERC20Snapshot} - */ - function _updateAccountSnapshot(address account) private { - SnapshotModuleBaseStorage storage $ = _getSnapshotModuleBaseStorage(); - _updateSnapshot($._accountBalanceSnapshots[account], balanceOf(account)); - } - - /** - * @dev See {OpenZeppelin - ERC20Snapshot} - */ - function _updateTotalSupplySnapshot() private { - SnapshotModuleBaseStorage storage $ = _getSnapshotModuleBaseStorage(); - _updateSnapshot($._totalSupplySnapshots, totalSupply()); - } } diff --git a/contracts/modules/internal/base/SnapshotModuleBase.sol b/contracts/modules/internal/base/SnapshotModuleBase.sol index d099e467..09b6b70e 100644 --- a/contracts/modules/internal/base/SnapshotModuleBase.sol +++ b/contracts/modules/internal/base/SnapshotModuleBase.sol @@ -397,6 +397,54 @@ abstract contract SnapshotModuleBase is Initializable { return (mostRecent, index); } + /* ============ Require balance and total supply ============ */ + /** + * @dev See {OpenZeppelin - ERC20Snapshot} + */ + function _updateAccountSnapshot(address account, uint256 accountBalance) internal { + SnapshotModuleBaseStorage storage $ = _getSnapshotModuleBaseStorage(); + _updateSnapshot($._accountBalanceSnapshots[account], accountBalance); + } + + /** + * @dev See {OpenZeppelin - ERC20Snapshot} + */ + function _updateTotalSupplySnapshot(uint256 totalSupply) internal { + SnapshotModuleBaseStorage storage $ = _getSnapshotModuleBaseStorage(); + _updateSnapshot($._totalSupplySnapshots, totalSupply); + } + + /** + * @notice Return the number of tokens owned by the given owner at the time when the snapshot with the given time was created. + * @return value stored in the snapshot, or the actual balance if no snapshot + */ + function _snapshotBalanceOf( + uint256 time, + address owner, + uint256 ownerBalance + ) internal view returns (uint256) { + SnapshotModuleBaseStorage storage $ = _getSnapshotModuleBaseStorage(); + (bool snapshotted, uint256 value) = _valueAt( + time, + $._accountBalanceSnapshots[owner] + ); + return snapshotted ? value : ownerBalance; + } + + /** + * @dev See {OpenZeppelin - ERC20Snapshot} + * Retrieves the total supply at the specified time. + * @return value stored in the snapshot, or the actual totalSupply if no snapshot + */ + function _snapshotTotalSupply(uint256 time, uint256 totalSupply) internal view returns (uint256) { + SnapshotModuleBaseStorage storage $ = _getSnapshotModuleBaseStorage(); + (bool snapshotted, uint256 value) = _valueAt( + time, + $._totalSupplySnapshots + ); + return snapshotted ? value : totalSupply; + } + /* ============ Utility functions ============ */