From f702831416a74c270f4308522601aa5f96ae1be5 Mon Sep 17 00:00:00 2001 From: Ryan Sauge <71391932+rya-sge@users.noreply.github.com> Date: Mon, 21 Jul 2025 17:45:09 +0200 Subject: [PATCH 01/17] Remove rule files, update test for CMTAT v3.0.0 --- README.md | 6 +- doc/coverage/coverage/index-sort-b.html | 140 +- doc/coverage/coverage/index-sort-f.html | 138 +- doc/coverage/coverage/index-sort-l.html | 140 +- doc/coverage/coverage/index.html | 140 +- ...ithRuleEngineScript.s.sol.func-sort-c.html | 85 -- .../CMTATWithRuleEngineScript.s.sol.func.html | 85 -- .../CMTATWithRuleEngineScript.s.sol.gcov.html | 128 -- .../RuleEngineScript.s.sol.func-sort-c.html | 85 -- .../script/RuleEngineScript.s.sol.func.html | 85 -- .../script/RuleEngineScript.s.sol.gcov.html | 121 -- .../coverage/script/index-sort-b.html | 119 -- .../coverage/script/index-sort-f.html | 119 -- .../coverage/script/index-sort-l.html | 119 -- doc/coverage/coverage/script/index.html | 119 -- .../src/RuleEngine.sol.func-sort-c.html | 62 +- .../coverage/src/RuleEngine.sol.func.html | 64 +- .../coverage/src/RuleEngine.sol.gcov.html | 444 +++--- doc/coverage/coverage/src/index-sort-b.html | 34 +- doc/coverage/coverage/src/index-sort-f.html | 34 +- doc/coverage/coverage/src/index-sort-l.html | 34 +- doc/coverage/coverage/src/index.html | 34 +- .../RuleEngineOperation.sol.func-sort-c.html | 26 +- .../modules/RuleEngineOperation.sol.func.html | 22 +- .../modules/RuleEngineOperation.sol.gcov.html | 74 +- .../RuleEngineValidation.sol.func-sort-c.html | 28 +- .../RuleEngineValidation.sol.func.html | 30 +- .../RuleEngineValidation.sol.gcov.html | 140 +- ...ngineValidationCommon.sol.func-sort-c.html | 20 +- .../RuleEngineValidationCommon.sol.func.html | 16 +- .../RuleEngineValidationCommon.sol.gcov.html | 54 +- .../modules/RuleInternal.sol.func-sort-c.html | 12 +- .../src/modules/RuleInternal.sol.func.html | 12 +- .../src/modules/RuleInternal.sol.gcov.html | 42 +- .../coverage/src/modules/index-sort-b.html | 38 +- .../coverage/src/modules/index-sort-f.html | 30 +- .../coverage/src/modules/index-sort-l.html | 40 +- doc/coverage/coverage/src/modules/index.html | 30 +- ...leConditionalTransfer.sol.func-sort-c.html | 153 --- .../RuleConditionalTransfer.sol.func.html | 153 --- .../RuleConditionalTransfer.sol.gcov.html | 486 ------- ...ionalTransferOperator.sol.func-sort-c.html | 161 --- ...eConditionalTransferOperator.sol.func.html | 161 --- ...eConditionalTransferOperator.sol.gcov.html | 558 -------- .../operation/abstract/index-sort-b.html | 107 -- .../operation/abstract/index-sort-f.html | 107 -- .../operation/abstract/index-sort-l.html | 107 -- .../src/rules/operation/abstract/index.html | 107 -- .../src/rules/operation/index-sort-b.html | 107 -- .../src/rules/operation/index-sort-f.html | 107 -- .../src/rules/operation/index-sort-l.html | 107 -- .../coverage/src/rules/operation/index.html | 107 -- .../RuleBlacklist.sol.func-sort-c.html | 97 -- .../validation/RuleBlacklist.sol.func.html | 97 -- .../validation/RuleBlacklist.sol.gcov.html | 161 --- .../RuleSanctionList.sol.func-sort-c.html | 121 -- .../validation/RuleSanctionList.sol.func.html | 121 -- .../validation/RuleSanctionList.sol.gcov.html | 250 ---- .../RuleWhitelist.sol.func-sort-c.html | 89 -- .../validation/RuleWhitelist.sol.func.html | 89 -- .../validation/RuleWhitelist.sol.gcov.html | 125 -- .../RuleWhitelistWrapper.sol.func-sort-c.html | 105 -- .../RuleWhitelistWrapper.sol.func.html | 105 -- .../RuleWhitelistWrapper.sol.gcov.html | 215 --- .../RuleAddressList.sol.func-sort-c.html | 129 -- .../RuleAddressList.sol.func.html | 129 -- .../RuleAddressList.sol.gcov.html | 261 ---- ...leAddressListInternal.sol.func-sort-c.html | 105 -- .../RuleAddressListInternal.sol.func.html | 105 -- .../RuleAddressListInternal.sol.gcov.html | 186 --- .../RuleAddressList/index-sort-b.html | 119 -- .../RuleAddressList/index-sort-f.html | 119 -- .../RuleAddressList/index-sort-l.html | 119 -- .../abstract/RuleAddressList/index.html | 119 -- .../RuleValidateTransfer.sol.func-sort-c.html | 85 -- .../RuleValidateTransfer.sol.func.html | 85 -- .../RuleValidateTransfer.sol.gcov.html | 110 -- .../RuleWhitelistCommon.sol.func-sort-c.html | 89 -- .../RuleWhitelistCommon.sol.func.html | 89 -- .../RuleWhitelistCommon.sol.gcov.html | 126 -- .../validation/abstract/index-sort-b.html | 119 -- .../validation/abstract/index-sort-f.html | 119 -- .../validation/abstract/index-sort-l.html | 119 -- .../src/rules/validation/abstract/index.html | 119 -- .../src/rules/validation/index-sort-b.html | 143 -- .../src/rules/validation/index-sort-f.html | 143 -- .../src/rules/validation/index-sort-l.html | 143 -- .../coverage/src/rules/validation/index.html | 143 -- .../RuleCTDeployment.sol.func-sort-c.html | 85 -- .../utils/RuleCTDeployment.sol.func.html | 85 -- .../utils/RuleCTDeployment.sol.gcov.html | 142 -- .../utils/index-sort-b.html | 107 -- .../utils/index-sort-f.html | 107 -- .../utils/index-sort-l.html | 107 -- .../RuleConditionalTransfer/utils/index.html | 107 -- .../CMTATDeployment.sol.func-sort-c.html | 10 +- .../test/utils/CMTATDeployment.sol.func.html | 10 +- .../test/utils/CMTATDeployment.sol.gcov.html | 90 +- .../SanctionListOracle.sol.func-sort-c.html | 26 +- .../utils/SanctionListOracle.sol.func.html | 20 +- .../utils/SanctionListOracle.sol.gcov.html | 22 +- .../coverage/test/utils/index-sort-b.html | 36 +- .../coverage/test/utils/index-sort-f.html | 24 +- .../coverage/test/utils/index-sort-l.html | 24 +- doc/coverage/coverage/test/utils/index.html | 24 +- doc/coverage/lcov.info | 1198 +++-------------- foundry.toml | 4 +- hardhat.config.js | 4 +- script/CMTATWithRuleEngineScript.s.sol | 6 +- script/RuleEngineScript.s.sol | 4 +- src/RuleEngine.sol | 30 +- src/interfaces/IRuleEngineValidation.sol | 18 +- src/interfaces/IRuleOperation.sol | 10 +- src/interfaces/IRuleValidation.sol | 8 +- .../RuleConditionalTransferLight.sol | 125 ++ .../rules/operation/RuleOperationRevert.sol | 81 ++ ...nditionalTransferLightInvariantStorage.sol | 30 + .../rules/validation/RuleWhitelist.sol | 24 +- .../RuleAddressList/RuleAddressList.sol | 2 +- .../RuleAddressListInternal.sol | 0 .../RuleAddressListInvariantStorage.sol | 0 .../RuleBlacklistInvariantStorage.sol | 0 .../RuleWhitelistInvariantStorage.sol | 0 .../abstract/RuleCommonInvariantStorage.sol | 0 .../RuleSanctionListInvariantStorage.sol | 0 .../abstract/RuleValidateTransfer.sol | 2 +- .../abstract/RuleWhitelistCommon.sol | 20 +- src/modules/RuleEngineOperation.sol | 28 +- src/modules/RuleEngineValidation.sol | 50 +- .../operation/RuleConditionalTransfer.sol | 416 ------ ...uleConditionalTransferInvariantStorage.sol | 142 -- .../RuleConditionalTransferOperator.sol | 473 ------- src/rules/validation/RuleBlacklist.sol | 94 -- src/rules/validation/RuleSanctionList.sol | 185 --- src/rules/validation/RuleWhitelistWrapper.sol | 175 --- test/HelperContract.sol | 29 +- test/RuleBlacklist/CMTATIntegration.t.sol | 262 ---- test/RuleBlacklist/RuleBlacklist.t.sol | 30 - .../CMTATIntegration.t.sol | 161 --- .../CMTATIntegrationConditionalTransfer.t.sol | 322 ----- .../CMTATIntegrationTest2.t.sol | 182 --- .../RuleConditionalTransfer.t.sol | 980 -------------- ...RuleConditionalTransferAccessControl.t.sol | 247 ---- .../RuleConditionalTransferDeployment.t.sol | 81 -- .../RuleConditionalTransferReset.t.sol | 441 ------ .../RuleConditionalTransferRestriction.t.sol | 118 -- .../utils/CMTATIntegrationShare.sol | 483 ------- .../utils/RuleCTDeployment.sol | 57 - .../AccessControl/RuleEngineAccessControl.sol | 1 + .../RuleEngineAccessControlOZ.t.sol | 2 +- .../RuleEngineOperation.t.sol | 331 ++--- .../RuleEngineOperationRevert.t.sol | 45 + .../RuleEngineRestriction.t.sol | 113 +- .../RuleEngineRestriction.t.sol | 79 +- .../RuleEngineValidation.t.sol | 18 + .../RuleSanctionListAddTest.t.sol | 62 - .../RuleSanctionListDeploymentTest.t.sol | 74 - .../RuleSanctionListTest.t.sol | 128 -- test/RuleWhitelist/CMTATIntegration.t.sol | 26 + .../CMTATIntegrationWhitelistWrapper.t.sol | 322 ----- test/RuleWhitelist/RuleWhitelist.t.sol | 12 +- 161 files changed, 1902 insertions(+), 16934 deletions(-) delete mode 100644 doc/coverage/coverage/script/CMTATWithRuleEngineScript.s.sol.func-sort-c.html delete mode 100644 doc/coverage/coverage/script/CMTATWithRuleEngineScript.s.sol.func.html delete mode 100644 doc/coverage/coverage/script/CMTATWithRuleEngineScript.s.sol.gcov.html delete mode 100644 doc/coverage/coverage/script/RuleEngineScript.s.sol.func-sort-c.html delete mode 100644 doc/coverage/coverage/script/RuleEngineScript.s.sol.func.html delete mode 100644 doc/coverage/coverage/script/RuleEngineScript.s.sol.gcov.html delete mode 100644 doc/coverage/coverage/script/index-sort-b.html delete mode 100644 doc/coverage/coverage/script/index-sort-f.html delete mode 100644 doc/coverage/coverage/script/index-sort-l.html delete mode 100644 doc/coverage/coverage/script/index.html delete mode 100644 doc/coverage/coverage/src/rules/operation/RuleConditionalTransfer.sol.func-sort-c.html delete mode 100644 doc/coverage/coverage/src/rules/operation/RuleConditionalTransfer.sol.func.html delete mode 100644 doc/coverage/coverage/src/rules/operation/RuleConditionalTransfer.sol.gcov.html delete mode 100644 doc/coverage/coverage/src/rules/operation/abstract/RuleConditionalTransferOperator.sol.func-sort-c.html delete mode 100644 doc/coverage/coverage/src/rules/operation/abstract/RuleConditionalTransferOperator.sol.func.html delete mode 100644 doc/coverage/coverage/src/rules/operation/abstract/RuleConditionalTransferOperator.sol.gcov.html delete mode 100644 doc/coverage/coverage/src/rules/operation/abstract/index-sort-b.html delete mode 100644 doc/coverage/coverage/src/rules/operation/abstract/index-sort-f.html delete mode 100644 doc/coverage/coverage/src/rules/operation/abstract/index-sort-l.html delete mode 100644 doc/coverage/coverage/src/rules/operation/abstract/index.html delete mode 100644 doc/coverage/coverage/src/rules/operation/index-sort-b.html delete mode 100644 doc/coverage/coverage/src/rules/operation/index-sort-f.html delete mode 100644 doc/coverage/coverage/src/rules/operation/index-sort-l.html delete mode 100644 doc/coverage/coverage/src/rules/operation/index.html delete mode 100644 doc/coverage/coverage/src/rules/validation/RuleBlacklist.sol.func-sort-c.html delete mode 100644 doc/coverage/coverage/src/rules/validation/RuleBlacklist.sol.func.html delete mode 100644 doc/coverage/coverage/src/rules/validation/RuleBlacklist.sol.gcov.html delete mode 100644 doc/coverage/coverage/src/rules/validation/RuleSanctionList.sol.func-sort-c.html delete mode 100644 doc/coverage/coverage/src/rules/validation/RuleSanctionList.sol.func.html delete mode 100644 doc/coverage/coverage/src/rules/validation/RuleSanctionList.sol.gcov.html delete mode 100644 doc/coverage/coverage/src/rules/validation/RuleWhitelist.sol.func-sort-c.html delete mode 100644 doc/coverage/coverage/src/rules/validation/RuleWhitelist.sol.func.html delete mode 100644 doc/coverage/coverage/src/rules/validation/RuleWhitelist.sol.gcov.html delete mode 100644 doc/coverage/coverage/src/rules/validation/RuleWhitelistWrapper.sol.func-sort-c.html delete mode 100644 doc/coverage/coverage/src/rules/validation/RuleWhitelistWrapper.sol.func.html delete mode 100644 doc/coverage/coverage/src/rules/validation/RuleWhitelistWrapper.sol.gcov.html delete mode 100644 doc/coverage/coverage/src/rules/validation/abstract/RuleAddressList/RuleAddressList.sol.func-sort-c.html delete mode 100644 doc/coverage/coverage/src/rules/validation/abstract/RuleAddressList/RuleAddressList.sol.func.html delete mode 100644 doc/coverage/coverage/src/rules/validation/abstract/RuleAddressList/RuleAddressList.sol.gcov.html delete mode 100644 doc/coverage/coverage/src/rules/validation/abstract/RuleAddressList/RuleAddressListInternal.sol.func-sort-c.html delete mode 100644 doc/coverage/coverage/src/rules/validation/abstract/RuleAddressList/RuleAddressListInternal.sol.func.html delete mode 100644 doc/coverage/coverage/src/rules/validation/abstract/RuleAddressList/RuleAddressListInternal.sol.gcov.html delete mode 100644 doc/coverage/coverage/src/rules/validation/abstract/RuleAddressList/index-sort-b.html delete mode 100644 doc/coverage/coverage/src/rules/validation/abstract/RuleAddressList/index-sort-f.html delete mode 100644 doc/coverage/coverage/src/rules/validation/abstract/RuleAddressList/index-sort-l.html delete mode 100644 doc/coverage/coverage/src/rules/validation/abstract/RuleAddressList/index.html delete mode 100644 doc/coverage/coverage/src/rules/validation/abstract/RuleValidateTransfer.sol.func-sort-c.html delete mode 100644 doc/coverage/coverage/src/rules/validation/abstract/RuleValidateTransfer.sol.func.html delete mode 100644 doc/coverage/coverage/src/rules/validation/abstract/RuleValidateTransfer.sol.gcov.html delete mode 100644 doc/coverage/coverage/src/rules/validation/abstract/RuleWhitelistCommon.sol.func-sort-c.html delete mode 100644 doc/coverage/coverage/src/rules/validation/abstract/RuleWhitelistCommon.sol.func.html delete mode 100644 doc/coverage/coverage/src/rules/validation/abstract/RuleWhitelistCommon.sol.gcov.html delete mode 100644 doc/coverage/coverage/src/rules/validation/abstract/index-sort-b.html delete mode 100644 doc/coverage/coverage/src/rules/validation/abstract/index-sort-f.html delete mode 100644 doc/coverage/coverage/src/rules/validation/abstract/index-sort-l.html delete mode 100644 doc/coverage/coverage/src/rules/validation/abstract/index.html delete mode 100644 doc/coverage/coverage/src/rules/validation/index-sort-b.html delete mode 100644 doc/coverage/coverage/src/rules/validation/index-sort-f.html delete mode 100644 doc/coverage/coverage/src/rules/validation/index-sort-l.html delete mode 100644 doc/coverage/coverage/src/rules/validation/index.html delete mode 100644 doc/coverage/coverage/test/RuleConditionalTransfer/utils/RuleCTDeployment.sol.func-sort-c.html delete mode 100644 doc/coverage/coverage/test/RuleConditionalTransfer/utils/RuleCTDeployment.sol.func.html delete mode 100644 doc/coverage/coverage/test/RuleConditionalTransfer/utils/RuleCTDeployment.sol.gcov.html delete mode 100644 doc/coverage/coverage/test/RuleConditionalTransfer/utils/index-sort-b.html delete mode 100644 doc/coverage/coverage/test/RuleConditionalTransfer/utils/index-sort-f.html delete mode 100644 doc/coverage/coverage/test/RuleConditionalTransfer/utils/index-sort-l.html delete mode 100644 doc/coverage/coverage/test/RuleConditionalTransfer/utils/index.html create mode 100644 src/mocks/rules/operation/RuleConditionalTransferLight.sol create mode 100644 src/mocks/rules/operation/RuleOperationRevert.sol create mode 100644 src/mocks/rules/operation/abstract/RuleConditionalTransferLightInvariantStorage.sol rename src/{ => mocks}/rules/validation/RuleWhitelist.sol (74%) rename src/{ => mocks}/rules/validation/abstract/RuleAddressList/RuleAddressList.sol (98%) rename src/{ => mocks}/rules/validation/abstract/RuleAddressList/RuleAddressListInternal.sol (100%) rename src/{ => mocks}/rules/validation/abstract/RuleAddressList/invariantStorage/RuleAddressListInvariantStorage.sol (100%) rename src/{ => mocks}/rules/validation/abstract/RuleAddressList/invariantStorage/RuleBlacklistInvariantStorage.sol (100%) rename src/{ => mocks}/rules/validation/abstract/RuleAddressList/invariantStorage/RuleWhitelistInvariantStorage.sol (100%) rename src/{ => mocks}/rules/validation/abstract/RuleCommonInvariantStorage.sol (100%) rename src/{ => mocks}/rules/validation/abstract/RuleSanctionListInvariantStorage.sol (100%) rename src/{ => mocks}/rules/validation/abstract/RuleValidateTransfer.sol (93%) rename src/{ => mocks}/rules/validation/abstract/RuleWhitelistCommon.sol (62%) delete mode 100644 src/rules/operation/RuleConditionalTransfer.sol delete mode 100644 src/rules/operation/abstract/RuleConditionalTransferInvariantStorage.sol delete mode 100644 src/rules/operation/abstract/RuleConditionalTransferOperator.sol delete mode 100644 src/rules/validation/RuleBlacklist.sol delete mode 100644 src/rules/validation/RuleSanctionList.sol delete mode 100644 src/rules/validation/RuleWhitelistWrapper.sol delete mode 100644 test/RuleBlacklist/CMTATIntegration.t.sol delete mode 100644 test/RuleBlacklist/RuleBlacklist.t.sol delete mode 100644 test/RuleConditionalTransfer/CMTATIntegration.t.sol delete mode 100644 test/RuleConditionalTransfer/CMTATIntegrationConditionalTransfer.t.sol delete mode 100644 test/RuleConditionalTransfer/CMTATIntegrationTest2.t.sol delete mode 100644 test/RuleConditionalTransfer/RuleConditionalTransfer.t.sol delete mode 100644 test/RuleConditionalTransfer/RuleConditionalTransferAccessControl.t.sol delete mode 100644 test/RuleConditionalTransfer/RuleConditionalTransferDeployment.t.sol delete mode 100644 test/RuleConditionalTransfer/RuleConditionalTransferReset.t.sol delete mode 100644 test/RuleConditionalTransfer/RuleConditionalTransferRestriction.t.sol delete mode 100644 test/RuleConditionalTransfer/utils/CMTATIntegrationShare.sol delete mode 100644 test/RuleConditionalTransfer/utils/RuleCTDeployment.sol create mode 100644 test/RuleEngine/ruleEngineOperation/RuleEngineOperationRevert.t.sol delete mode 100644 test/RuleSanctionList/RuleSanctionListAddTest.t.sol delete mode 100644 test/RuleSanctionList/RuleSanctionListDeploymentTest.t.sol delete mode 100644 test/RuleSanctionList/RuleSanctionListTest.t.sol delete mode 100644 test/RuleWhitelist/CMTATIntegrationWhitelistWrapper.t.sol diff --git a/README.md b/README.md index 0cb8dc0..d42a3ef 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ While it has been designed for the CMTAT, the ruleEngine can be used with others For that, the only thing to do is to import in your contract the interface `IRuleEngine` which declares the function `operateOnTransfer` -This interface can be found in [CMTAT/contracts/interfaces/engine/IRuleEngine.sol](https://github.com/CMTA/CMTAT/blob/23a1e59f913d079d0c09d32fafbd95ab2d426093/contracts/interfaces/engine/IRuleEngine.sol) +This interface can be found in [CMTAT/[...]/IRuleEngine.sol](https://github.com/CMTA/CMTAT/blob/23a1e59f913d079d0c09d32fafbd95ab2d426093/contracts/interfaces/engine/IRuleEngine.sol) Before each transfer, your contract must call the function `operateOnTransfer` which is the entrypoint for the RuleEngine. @@ -55,6 +55,8 @@ Before each transfer, your contract must call the function `operateOnTransfer` w ## Available Rules +Rules have their own dedicated repository: + The following rules are available: | Rule | Type | Description | Doc | @@ -211,7 +213,7 @@ forge coverage --report lcov - Generate `index.html` ```bash -forge coverage --report lcov && genhtml lcov.info --branch-coverage --output-dir coverage +forge coverage --no-match-coverage "(script|mocks|test)" --report lcov && genhtml lcov.info --branch-coverage --output-dir coverage ``` See [Solidity Coverage in VS Code with Foundry](https://mirror.xyz/devanon.eth/RrDvKPnlD-pmpuW7hQeR5wWdVjklrpOgPCOA-PJkWFU) & [Foundry forge coverage](https://www.rareskills.io/post/foundry-forge-coverage) diff --git a/doc/coverage/coverage/index-sort-b.html b/doc/coverage/coverage/index-sort-b.html index 79c22e9..1b0fac1 100644 --- a/doc/coverage/coverage/index-sort-b.html +++ b/doc/coverage/coverage/index-sort-b.html @@ -31,27 +31,27 @@
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| Function Name |
- Hit count |
-
| CMTATWithRuleEngineScript.run | -0 | -
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| Function Name |
- Hit count |
-
| CMTATWithRuleEngineScript.run | -0 | -
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| Function Name |
- Hit count |
-
| RuleEngineScript.run | -0 | -
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| Function Name |
- Hit count |
-
| RuleEngineScript.run | -0 | -
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| - | - | - | - | - | - | - | ||
| Filename |
- Line Coverage |
- Functions |
- Branches |
- |||||
| RuleEngineScript.s.sol | -
- |
- 0.0 % | -0 / 12 | -0.0 % | -0 / 1 | -0.0 % | -0 / 2 | -|
| CMTATWithRuleEngineScript.s.sol | -
- |
- 0.0 % | -0 / 14 | -0.0 % | -0 / 1 | -- | -0 / 0 | -|
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| - | - | - | - | - | - | - | ||
| Filename |
- Line Coverage |
- Functions |
- Branches |
- |||||
| CMTATWithRuleEngineScript.s.sol | -
- |
- 0.0 % | -0 / 14 | -0.0 % | -0 / 1 | -- | -0 / 0 | -|
| RuleEngineScript.s.sol | -
- |
- 0.0 % | -0 / 12 | -0.0 % | -0 / 1 | -0.0 % | -0 / 2 | -|
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| - | - | - | - | - | - | - | ||
| Filename |
- Line Coverage |
- Functions |
- Branches |
- |||||
| RuleEngineScript.s.sol | -
- |
- 0.0 % | -0 / 12 | -0.0 % | -0 / 1 | -0.0 % | -0 / 2 | -|
| CMTATWithRuleEngineScript.s.sol | -
- |
- 0.0 % | -0 / 14 | -0.0 % | -0 / 1 | -- | -0 / 0 | -|
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| - | - | - | - | - | - | - | ||
| Filename |
- Line Coverage |
- Functions |
- Branches |
- |||||
| CMTATWithRuleEngineScript.s.sol | -
- |
- 0.0 % | -0 / 14 | -0.0 % | -0 / 1 | -- | -0 / 0 | -|
| RuleEngineScript.s.sol | -
- |
- 0.0 % | -0 / 12 | -0.0 % | -0 / 1 | -0.0 % | -0 / 2 | -|
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| - | - | - | - | - | - | - | ||
| Filename |
- Line Coverage |
- Functions |
- Branches |
- |||||
| RuleConditionalTransferOperator.sol | -
- |
- 100.0 % | -113 / 113 | -100.0 % | -20 / 20 | -100.0 % | -31 / 31 | -|
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| - | - | - | - | - | - | - | ||
| Filename |
- Line Coverage |
- Functions |
- Branches |
- |||||
| RuleConditionalTransferOperator.sol | -
- |
- 100.0 % | -113 / 113 | -100.0 % | -20 / 20 | -100.0 % | -31 / 31 | -|
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| - | - | - | - | - | - | - | ||
| Filename |
- Line Coverage |
- Functions |
- Branches |
- |||||
| RuleConditionalTransferOperator.sol | -
- |
- 100.0 % | -113 / 113 | -100.0 % | -20 / 20 | -100.0 % | -31 / 31 | -|
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| - | - | - | - | - | - | - | ||
| Filename |
- Line Coverage |
- Functions |
- Branches |
- |||||
| RuleConditionalTransferOperator.sol | -
- |
- 100.0 % | -113 / 113 | -100.0 % | -20 / 20 | -100.0 % | -31 / 31 | -|
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| - | - | - | - | - | - | - | ||
| Filename |
- Line Coverage |
- Functions |
- Branches |
- |||||
| RuleConditionalTransfer.sol | -
- |
- 99.1 % | -105 / 106 | -94.4 % | -17 / 18 | -100.0 % | -33 / 33 | -|
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| - | - | - | - | - | - | - | ||
| Filename |
- Line Coverage |
- Functions |
- Branches |
- |||||
| RuleConditionalTransfer.sol | -
- |
- 99.1 % | -105 / 106 | -94.4 % | -17 / 18 | -100.0 % | -33 / 33 | -|
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| - | - | - | - | - | - | - | ||
| Filename |
- Line Coverage |
- Functions |
- Branches |
- |||||
| RuleConditionalTransfer.sol | -
- |
- 99.1 % | -105 / 106 | -94.4 % | -17 / 18 | -100.0 % | -33 / 33 | -|
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| - | - | - | - | - | - | - | ||
| Filename |
- Line Coverage |
- Functions |
- Branches |
- |||||
| RuleConditionalTransfer.sol | -
- |
- 99.1 % | -105 / 106 | -94.4 % | -17 / 18 | -100.0 % | -33 / 33 | -|
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| Function Name |
- Hit count |
-
| RuleBlacklist.canReturnTransferRestrictionCode | -4 | -
| RuleBlacklist.messageForTransferRestriction | -4 | -
| RuleBlacklist.detectTransferRestriction | -10 | -
| RuleBlacklist. | -12 | -
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| Function Name |
- Hit count |
-
| RuleBlacklist. | -12 | -
| RuleBlacklist.canReturnTransferRestrictionCode | -4 | -
| RuleBlacklist.detectTransferRestriction | -10 | -
| RuleBlacklist.messageForTransferRestriction | -4 | -
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| Function Name |
- Hit count |
-
| RuleSanctionList._msgData | -0 | -
| RuleSanctionList.canReturnTransferRestrictionCode | -3 | -
| RuleSanctionList.messageForTransferRestriction | -3 | -
| RuleSanctionList.detectTransferRestriction | -7 | -
| RuleSanctionList._setSanctionListOracle | -11 | -
| RuleSanctionList.setSanctionListOracle | -11 | -
| RuleSanctionList. | -13 | -
| RuleSanctionList.hasRole | -13 | -
| RuleSanctionList._contextSuffixLength | -23 | -
| RuleSanctionList._msgSender | -23 | -
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| Function Name |
- Hit count |
-
| RuleSanctionList. | -13 | -
| RuleSanctionList._contextSuffixLength | -23 | -
| RuleSanctionList._msgData | -0 | -
| RuleSanctionList._msgSender | -23 | -
| RuleSanctionList._setSanctionListOracle | -11 | -
| RuleSanctionList.canReturnTransferRestrictionCode | -3 | -
| RuleSanctionList.detectTransferRestriction | -7 | -
| RuleSanctionList.hasRole | -13 | -
| RuleSanctionList.messageForTransferRestriction | -3 | -
| RuleSanctionList.setSanctionListOracle | -11 | -
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| Function Name |
- Hit count |
-
| RuleWhitelist.detectTransferRestriction | -28 | -
| RuleWhitelist. | -173 | -
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| Function Name |
- Hit count |
-
| RuleWhitelist. | -173 | -
| RuleWhitelist.detectTransferRestriction | -28 | -
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| Function Name |
- Hit count |
-
| RuleWhitelistWrapper._msgData | -0 | -
| RuleWhitelistWrapper.detectTransferRestriction | -11 | -
| RuleWhitelistWrapper.hasRole | -13 | -
| RuleWhitelistWrapper. | -14 | -
| RuleWhitelistWrapper._contextSuffixLength | -52 | -
| RuleWhitelistWrapper._msgSender | -52 | -
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| Function Name |
- Hit count |
-
| RuleWhitelistWrapper. | -14 | -
| RuleWhitelistWrapper._contextSuffixLength | -52 | -
| RuleWhitelistWrapper._msgData | -0 | -
| RuleWhitelistWrapper._msgSender | -52 | -
| RuleWhitelistWrapper.detectTransferRestriction | -11 | -
| RuleWhitelistWrapper.hasRole | -13 | -
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| Function Name |
- Hit count |
-
| RuleAddressList._msgData | -0 | -
| RuleAddressList.removeAddressFromTheList | -3 | -
| RuleAddressList.removeAddressesFromTheList | -4 | -
| RuleAddressList.addAddressesToTheList | -17 | -
| RuleAddressList.numberListedAddress | -24 | -
| RuleAddressList.addressIsListedBatch | -28 | -
| RuleAddressList.addAddressToTheList | -52 | -
| RuleAddressList.addressIsListed | -101 | -
| RuleAddressList. | -185 | -
| RuleAddressList.hasRole | -194 | -
| RuleAddressList._contextSuffixLength | -270 | -
| RuleAddressList._msgSender | -270 | -
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| Function Name |
- Hit count |
-
| RuleAddressList. | -185 | -
| RuleAddressList._contextSuffixLength | -270 | -
| RuleAddressList._msgData | -0 | -
| RuleAddressList._msgSender | -270 | -
| RuleAddressList.addAddressToTheList | -52 | -
| RuleAddressList.addAddressesToTheList | -17 | -
| RuleAddressList.addressIsListed | -101 | -
| RuleAddressList.addressIsListedBatch | -28 | -
| RuleAddressList.hasRole | -194 | -
| RuleAddressList.numberListedAddress | -24 | -
| RuleAddressList.removeAddressFromTheList | -3 | -
| RuleAddressList.removeAddressesFromTheList | -4 | -
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| Function Name |
- Hit count |
-
| RuleAddressListInternal._removeAddressFromThelist | -2 | -
| RuleAddressListInternal._removeAddressesFromThelist | -3 | -
| RuleAddressListInternal._addAddressesToThelist | -16 | -
| RuleAddressListInternal._numberListedAddress | -24 | -
| RuleAddressListInternal._addAddressToThelist | -51 | -
| RuleAddressListInternal._addressIsListed | -214 | -
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| Function Name |
- Hit count |
-
| RuleAddressListInternal._addAddressToThelist | -51 | -
| RuleAddressListInternal._addAddressesToThelist | -16 | -
| RuleAddressListInternal._addressIsListed | -214 | -
| RuleAddressListInternal._numberListedAddress | -24 | -
| RuleAddressListInternal._removeAddressFromThelist | -2 | -
| RuleAddressListInternal._removeAddressesFromThelist | -3 | -
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| - | - | - | - | - | - | - | ||
| Filename |
- Line Coverage |
- Functions |
- Branches |
- |||||
| RuleAddressList.sol | -
- |
- 95.7 % | -22 / 23 | -91.7 % | -11 / 12 | -100.0 % | -2 / 2 | -|
| RuleAddressListInternal.sol | -
- |
- 100.0 % | -22 / 22 | -100.0 % | -6 / 6 | -100.0 % | -4 / 4 | -|
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| - | - | - | - | - | - | - | ||
| Filename |
- Line Coverage |
- Functions |
- Branches |
- |||||
| RuleAddressList.sol | -
- |
- 95.7 % | -22 / 23 | -91.7 % | -11 / 12 | -100.0 % | -2 / 2 | -|
| RuleAddressListInternal.sol | -
- |
- 100.0 % | -22 / 22 | -100.0 % | -6 / 6 | -100.0 % | -4 / 4 | -|
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| - | - | - | - | - | - | - | ||
| Filename |
- Line Coverage |
- Functions |
- Branches |
- |||||
| RuleAddressList.sol | -
- |
- 95.7 % | -22 / 23 | -91.7 % | -11 / 12 | -100.0 % | -2 / 2 | -|
| RuleAddressListInternal.sol | -
- |
- 100.0 % | -22 / 22 | -100.0 % | -6 / 6 | -100.0 % | -4 / 4 | -|
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| - | - | - | - | - | - | - | ||
| Filename |
- Line Coverage |
- Functions |
- Branches |
- |||||
| RuleAddressList.sol | -
- |
- 95.7 % | -22 / 23 | -91.7 % | -11 / 12 | -100.0 % | -2 / 2 | -|
| RuleAddressListInternal.sol | -
- |
- 100.0 % | -22 / 22 | -100.0 % | -6 / 6 | -100.0 % | -4 / 4 | -|
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| Function Name |
- Hit count |
-
| RuleValidateTransfer.validateTransfer | -40 | -
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| Function Name |
- Hit count |
-
| RuleValidateTransfer.validateTransfer | -40 | -
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| Function Name |
- Hit count |
-
| RuleWhitelistCommon.messageForTransferRestriction | -10 | -
| RuleWhitelistCommon.canReturnTransferRestrictionCode | -12 | -
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| Function Name |
- Hit count |
-
| RuleWhitelistCommon.canReturnTransferRestrictionCode | -12 | -
| RuleWhitelistCommon.messageForTransferRestriction | -10 | -
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| - | - | - | - | - | - | - | ||
| Filename |
- Line Coverage |
- Functions |
- Branches |
- |||||
| RuleValidateTransfer.sol | -
- |
- 100.0 % | -2 / 2 | -100.0 % | -1 / 1 | -- | -0 / 0 | -|
| RuleWhitelistCommon.sol | -
- |
- 100.0 % | -8 / 8 | -100.0 % | -2 / 2 | -100.0 % | -4 / 4 | -|
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| - | - | - | - | - | - | - | ||
| Filename |
- Line Coverage |
- Functions |
- Branches |
- |||||
| RuleValidateTransfer.sol | -
- |
- 100.0 % | -2 / 2 | -100.0 % | -1 / 1 | -- | -0 / 0 | -|
| RuleWhitelistCommon.sol | -
- |
- 100.0 % | -8 / 8 | -100.0 % | -2 / 2 | -100.0 % | -4 / 4 | -|
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| - | - | - | - | - | - | - | ||
| Filename |
- Line Coverage |
- Functions |
- Branches |
- |||||
| RuleValidateTransfer.sol | -
- |
- 100.0 % | -2 / 2 | -100.0 % | -1 / 1 | -- | -0 / 0 | -|
| RuleWhitelistCommon.sol | -
- |
- 100.0 % | -8 / 8 | -100.0 % | -2 / 2 | -100.0 % | -4 / 4 | -|
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| - | - | - | - | - | - | - | ||
| Filename |
- Line Coverage |
- Functions |
- Branches |
- |||||
| RuleValidateTransfer.sol | -
- |
- 100.0 % | -2 / 2 | -100.0 % | -1 / 1 | -- | -0 / 0 | -|
| RuleWhitelistCommon.sol | -
- |
- 100.0 % | -8 / 8 | -100.0 % | -2 / 2 | -100.0 % | -4 / 4 | -|
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| - | - | - | - | - | - | - | ||
| Filename |
- Line Coverage |
- Functions |
- Branches |
- |||||
| RuleWhitelist.sol | -
- |
- 100.0 % | -5 / 5 | -100.0 % | -2 / 2 | -100.0 % | -4 / 4 | -|
| RuleBlacklist.sol | -
- |
- 100.0 % | -13 / 13 | -100.0 % | -4 / 4 | -100.0 % | -8 / 8 | -|
| RuleWhitelistWrapper.sol | -
- |
- 96.4 % | -27 / 28 | -83.3 % | -5 / 6 | -100.0 % | -9 / 9 | -|
| RuleSanctionList.sol | -
- |
- 96.4 % | -27 / 28 | -90.0 % | -9 / 10 | -100.0 % | -11 / 11 | -|
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| - | - | - | - | - | - | - | ||
| Filename |
- Line Coverage |
- Functions |
- Branches |
- |||||
| RuleWhitelistWrapper.sol | -
- |
- 96.4 % | -27 / 28 | -83.3 % | -5 / 6 | -100.0 % | -9 / 9 | -|
| RuleSanctionList.sol | -
- |
- 96.4 % | -27 / 28 | -90.0 % | -9 / 10 | -100.0 % | -11 / 11 | -|
| RuleWhitelist.sol | -
- |
- 100.0 % | -5 / 5 | -100.0 % | -2 / 2 | -100.0 % | -4 / 4 | -|
| RuleBlacklist.sol | -
- |
- 100.0 % | -13 / 13 | -100.0 % | -4 / 4 | -100.0 % | -8 / 8 | -|
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| - | - | - | - | - | - | - | ||
| Filename |
- Line Coverage |
- Functions |
- Branches |
- |||||
| RuleSanctionList.sol | -
- |
- 96.4 % | -27 / 28 | -90.0 % | -9 / 10 | -100.0 % | -11 / 11 | -|
| RuleWhitelistWrapper.sol | -
- |
- 96.4 % | -27 / 28 | -83.3 % | -5 / 6 | -100.0 % | -9 / 9 | -|
| RuleWhitelist.sol | -
- |
- 100.0 % | -5 / 5 | -100.0 % | -2 / 2 | -100.0 % | -4 / 4 | -|
| RuleBlacklist.sol | -
- |
- 100.0 % | -13 / 13 | -100.0 % | -4 / 4 | -100.0 % | -8 / 8 | -|
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| - | - | - | - | - | - | - | ||
| Filename |
- Line Coverage |
- Functions |
- Branches |
- |||||
| RuleBlacklist.sol | -
- |
- 100.0 % | -13 / 13 | -100.0 % | -4 / 4 | -100.0 % | -8 / 8 | -|
| RuleSanctionList.sol | -
- |
- 96.4 % | -27 / 28 | -90.0 % | -9 / 10 | -100.0 % | -11 / 11 | -|
| RuleWhitelist.sol | -
- |
- 100.0 % | -5 / 5 | -100.0 % | -2 / 2 | -100.0 % | -4 / 4 | -|
| RuleWhitelistWrapper.sol | -
- |
- 96.4 % | -27 / 28 | -83.3 % | -5 / 6 | -100.0 % | -9 / 9 | -|
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| Function Name |
- Hit count |
-
| RuleCTDeployment. | -13 | -
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| Function Name |
- Hit count |
-
| RuleCTDeployment. | -13 | -
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| - | - | - | - | - | - | - | ||
| Filename |
- Line Coverage |
- Functions |
- Branches |
- |||||
| RuleCTDeployment.sol | -
- |
- 100.0 % | -10 / 10 | -100.0 % | -1 / 1 | -- | -0 / 0 | -|
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| - | - | - | - | - | - | - | ||
| Filename |
- Line Coverage |
- Functions |
- Branches |
- |||||
| RuleCTDeployment.sol | -
- |
- 100.0 % | -10 / 10 | -100.0 % | -1 / 1 | -- | -0 / 0 | -|
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| - | - | - | - | - | - | - | ||
| Filename |
- Line Coverage |
- Functions |
- Branches |
- |||||
| RuleCTDeployment.sol | -
- |
- 100.0 % | -10 / 10 | -100.0 % | -1 / 1 | -- | -0 / 0 | -|
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| - | - | - | - | - | - | - | ||
| Filename |
- Line Coverage |
- Functions |
- Branches |
- |||||
| RuleCTDeployment.sol | -
- |
- 100.0 % | -10 / 10 | -100.0 % | -1 / 1 | -- | -0 / 0 | -|
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| Function Name |
- Hit count |
-
| CMTATDeployment.constructor | -9 | -
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| Function Name |
- Hit count |
-
| CMTATDeployment.constructor | -9 | -
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| Function Name |
- Hit count |
-
| SanctionListOracle.addToSanctionsList | -0 | -
| SanctionListOracle.isSanctioned | -0 | -
| SanctionListOracle.removeFromSanctionsList | -0 | -
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| Function Name |
- Hit count |
-
| SanctionListOracle.addToSanctionsList | -0 | -
| SanctionListOracle.isSanctioned | -0 | -
| SanctionListOracle.removeFromSanctionsList | -0 | -
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| - | - | - | - | - | - | - | ||
| Filename |
- Line Coverage |
- Functions |
- Branches |
- |||||
| SanctionListOracle.sol | -
- |
- 0.0 % | -0 / 6 | -0.0 % | -0 / 3 | -- | -0 / 0 | -|
| CMTATDeployment.sol | -
- |
- 100.0 % | -5 / 5 | -100.0 % | -1 / 1 | -- | -0 / 0 | -|
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| - | - | - | - | - | - | - | ||
| Filename |
- Line Coverage |
- Functions |
- Branches |
- |||||
| SanctionListOracle.sol | -
- |
- 0.0 % | -0 / 6 | -0.0 % | -0 / 3 | -- | -0 / 0 | -|
| CMTATDeployment.sol | -
- |
- 100.0 % | -5 / 5 | -100.0 % | -1 / 1 | -- | -0 / 0 | -|
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| - | - | - | - | - | - | - | ||
| Filename |
- Line Coverage |
- Functions |
- Branches |
- |||||
| SanctionListOracle.sol | -
- |
- 0.0 % | -0 / 6 | -0.0 % | -0 / 3 | -- | -0 / 0 | -|
| CMTATDeployment.sol | -
- |
- 100.0 % | -5 / 5 | -100.0 % | -1 / 1 | -- | -0 / 0 | -|
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
-
|
- |||||||||||||||||||||||||||||
| - | - | - | - | - | - | - | ||
| Filename |
- Line Coverage |
- Functions |
- Branches |
- |||||
| CMTATDeployment.sol | -
- |
- 100.0 % | -5 / 5 | -100.0 % | -1 / 1 | -- | -0 / 0 | -|
| SanctionListOracle.sol | -
- |
- 0.0 % | -0 / 6 | -0.0 % | -0 / 3 | -- | -0 / 0 | -|
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
+
|
+ |||||||||||||||||||||||||||||
| + | + | + | + | + | + | + | ||
| Directory |
+ Line Coverage |
+ Functions |
+ Branches |
+ |||||
| src/modules | +
+ |
+ 98.4 % | +121 / 123 | +94.3 % | +33 / 35 | +87.0 % | +20 / 23 | +|
| src | +
+ |
+ 97.1 % | +66 / 68 | +92.9 % | +13 / 14 | +100.0 % | +14 / 14 | +|
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
+
|
+ |||||||||||||||||||||||||||||
| + | + | + | + | + | + | + | ||
| Directory |
+ Line Coverage |
+ Functions |
+ Branches |
+ |||||
| src | +
+ |
+ 97.1 % | +66 / 68 | +92.9 % | +13 / 14 | +100.0 % | +14 / 14 | +|
| src/modules | +
+ |
+ 98.4 % | +121 / 123 | +94.3 % | +33 / 35 | +87.0 % | +20 / 23 | +|
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
+
|
+ |||||||||||||||||||||||||||||
| + | + | + | + | + | + | + | ||
| Directory |
+ Line Coverage |
+ Functions |
+ Branches |
+ |||||
| src | +
+ |
+ 97.1 % | +66 / 68 | +92.9 % | +13 / 14 | +100.0 % | +14 / 14 | +|
| src/modules | +
+ |
+ 98.4 % | +121 / 123 | +94.3 % | +33 / 35 | +87.0 % | +20 / 23 | +|
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
+
|
+ |||||||||||||||||||||||||||||
| + | + | + | + | + | + | + | ||
| Directory |
+ Line Coverage |
+ Functions |
+ Branches |
+ |||||
| src | +
+ |
+ 97.1 % | +66 / 68 | +92.9 % | +13 / 14 | +100.0 % | +14 / 14 | +|
| src/modules | +
+ |
+ 98.4 % | +121 / 123 | +94.3 % | +33 / 35 | +87.0 % | +20 / 23 | +|
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
+
|
+ |||||||||||||||||||||||||||||
| Function Name |
+ Hit count |
+
| RuleEngine._msgData | +0 | +
| RuleEngine.created | +2 | +
| RuleEngine.destroyed | +2 | +
| RuleEngine.detectTransferRestrictionFrom | +9 | +
| RuleEngine._transferred | +10 | +
| RuleEngine.transferred | +12 | +
| RuleEngine.canTransferFrom | +13 | +
| RuleEngine.detectTransferRestriction | +13 | +
| RuleEngine.messageForTransferRestriction | +13 | +
| RuleEngine.canTransfer | +17 | +
| RuleEngine.constructor | +85 | +
| RuleEngine.hasRole | +93 | +
| RuleEngine._contextSuffixLength | +285 | +
| RuleEngine._msgSender | +285 | +
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
+
|
+ |||||||||||||||||||||||||||||
| Function Name |
+ Hit count |
+
| RuleEngine._contextSuffixLength | +285 | +
| RuleEngine._msgData | +0 | +
| RuleEngine._msgSender | +285 | +
| RuleEngine._transferred | +10 | +
| RuleEngine.canTransfer | +17 | +
| RuleEngine.canTransferFrom | +13 | +
| RuleEngine.constructor | +85 | +
| RuleEngine.created | +2 | +
| RuleEngine.destroyed | +2 | +
| RuleEngine.detectTransferRestriction | +13 | +
| RuleEngine.detectTransferRestrictionFrom | +9 | +
| RuleEngine.hasRole | +93 | +
| RuleEngine.messageForTransferRestriction | +13 | +
| RuleEngine.transferred | +12 | +
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
+
|
+ |||||||||||||||||||||||||||||
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
+
|
+ |||||||||||||||||||||||||||||
| + | + | + | + | + | + | + | ||
| Filename |
+ Line Coverage |
+ Functions |
+ Branches |
+ |||||
| RuleEngine.sol | +
+ |
+ 97.1 % | +66 / 68 | +92.9 % | +13 / 14 | +100.0 % | +14 / 14 | +|
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
+
|
+ |||||||||||||||||||||||||||||
| + | + | + | + | + | + | + | ||
| Filename |
+ Line Coverage |
+ Functions |
+ Branches |
+ |||||
| RuleEngine.sol | +
+ |
+ 97.1 % | +66 / 68 | +92.9 % | +13 / 14 | +100.0 % | +14 / 14 | +|
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
+
|
+ |||||||||||||||||||||||||||||
| + | + | + | + | + | + | + | ||
| Filename |
+ Line Coverage |
+ Functions |
+ Branches |
+ |||||
| RuleEngine.sol | +
+ |
+ 97.1 % | +66 / 68 | +92.9 % | +13 / 14 | +100.0 % | +14 / 14 | +|
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
+
|
+ |||||||||||||||||||||||||||||
| + | + | + | + | + | + | + | ||
| Filename |
+ Line Coverage |
+ Functions |
+ Branches |
+ |||||
| RuleEngine.sol | +
+ |
+ 97.1 % | +66 / 68 | +92.9 % | +13 / 14 | +100.0 % | +14 / 14 | +|
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
+
|
+ |||||||||||||||||||||||||||||
| Function Name |
+ Hit count |
+
| ERC3643Compliance.getTokenBound | +2 | +
| ERC3643Compliance.getTokenBounds | +2 | +
| ERC3643Compliance._unbindToken | +3 | +
| ERC3643Compliance.onlyBoundToken | +3 | +
| ERC3643Compliance.unbindToken | +3 | +
| ERC3643Compliance.isTokenBound | +6 | +
| ERC3643Compliance.bindToken | +8 | +
| ERC3643Compliance._bindToken | +23 | +
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
+
|
+ |||||||||||||||||||||||||||||
| Function Name |
+ Hit count |
+
| ERC3643Compliance._bindToken | +23 | +
| ERC3643Compliance._unbindToken | +3 | +
| ERC3643Compliance.bindToken | +8 | +
| ERC3643Compliance.getTokenBound | +2 | +
| ERC3643Compliance.getTokenBounds | +2 | +
| ERC3643Compliance.isTokenBound | +6 | +
| ERC3643Compliance.onlyBoundToken | +3 | +
| ERC3643Compliance.unbindToken | +3 | +
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
+
|
+ |||||||||||||||||||||||||||||
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
+
|
+ |||||||||||||||||||||||||||||
| Function Name |
+ Hit count |
+
| RuleEngineOperation.rulesOperationIsPresent | +0 | +
| RuleEngineOperation.ruleOperation | +1 | +
| RuleEngineOperation._removeRuleOperation | +4 | +
| RuleEngineOperation.clearRulesOperation | +4 | +
| RuleEngineOperation.removeRuleOperation | +5 | +
| RuleEngineOperation.rulesOperation | +5 | +
| RuleEngineOperation._transferred | +8 | +
| RuleEngineOperation.setRulesOperation | +11 | +
| RuleEngineOperation._clearRulesOperation | +13 | +
| RuleEngineOperation.addRuleOperation | +36 | +
| RuleEngineOperation.rulesCountOperation | +45 | +
| RuleEngineOperation._checkRule | +55 | +
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
+
|
+ |||||||||||||||||||||||||||||
| Function Name |
+ Hit count |
+
| RuleEngineOperation._checkRule | +55 | +
| RuleEngineOperation._clearRulesOperation | +13 | +
| RuleEngineOperation._removeRuleOperation | +4 | +
| RuleEngineOperation._transferred | +8 | +
| RuleEngineOperation.addRuleOperation | +36 | +
| RuleEngineOperation.clearRulesOperation | +4 | +
| RuleEngineOperation.removeRuleOperation | +5 | +
| RuleEngineOperation.ruleOperation | +1 | +
| RuleEngineOperation.rulesCountOperation | +45 | +
| RuleEngineOperation.rulesOperation | +5 | +
| RuleEngineOperation.rulesOperationIsPresent | +0 | +
| RuleEngineOperation.setRulesOperation | +11 | +
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
+
|
+ |||||||||||||||||||||||||||||
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
+
|
+ |||||||||||||||||||||||||||||
| Function Name |
+ Hit count |
+
| RuleEngineValidation.rulesValidationIsPresent | +0 | +
| RuleEngineValidation.ruleValidation | +1 | +
| RuleEngineValidation._removeRuleValidation | +4 | +
| RuleEngineValidation.rulesValidation | +5 | +
| RuleEngineValidation.clearRulesValidation | +6 | +
| RuleEngineValidation.removeRuleValidation | +6 | +
| RuleEngineValidation.setRulesValidation | +23 | +
| RuleEngineValidation._clearRulesValidation | +25 | +
| RuleEngineValidation.addRuleValidation | +59 | +
| RuleEngineValidation.rulesCountValidation | +70 | +
| RuleEngineValidation._checkRuleValidation | +88 | +
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
+
|
+ |||||||||||||||||||||||||||||
| Function Name |
+ Hit count |
+
| RuleEngineValidation._checkRuleValidation | +88 | +
| RuleEngineValidation._clearRulesValidation | +25 | +
| RuleEngineValidation._removeRuleValidation | +4 | +
| RuleEngineValidation.addRuleValidation | +59 | +
| RuleEngineValidation.clearRulesValidation | +6 | +
| RuleEngineValidation.removeRuleValidation | +6 | +
| RuleEngineValidation.ruleValidation | +1 | +
| RuleEngineValidation.rulesCountValidation | +70 | +
| RuleEngineValidation.rulesValidation | +5 | +
| RuleEngineValidation.rulesValidationIsPresent | +0 | +
| RuleEngineValidation.setRulesValidation | +23 | +
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
+
|
+ |||||||||||||||||||||||||||||
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
+
|
+ |||||||||||||||||||||||||||||
| Function Name |
+ Hit count |
+
| RuleEngineValidationRead.canTransferValidationFrom | +1 | +
| RuleEngineValidationRead.detectTransferRestrictionValidationFrom | +1 | +
| RuleEngineValidationRead.canTransferValidation | +2 | +
| RuleEngineValidationRead.detectTransferRestrictionValidation | +5 | +
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
+
|
+ |||||||||||||||||||||||||||||
| Function Name |
+ Hit count |
+
| RuleEngineValidationRead.canTransferValidation | +2 | +
| RuleEngineValidationRead.canTransferValidationFrom | +1 | +
| RuleEngineValidationRead.detectTransferRestrictionValidation | +5 | +
| RuleEngineValidationRead.detectTransferRestrictionValidationFrom | +1 | +
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
+
|
+ |||||||||||||||||||||||||||||
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
+
|
+ |||||||||||||||||||||||||||||
| + | + | + | + | + | + | + | ||
| Filename |
+ Line Coverage |
+ Functions |
+ Branches |
+ |||||
| ERC3643Compliance.sol | +
+ |
+ 100.0 % | +24 / 24 | +100.0 % | +8 / 8 | +66.7 % | +6 / 9 | +|
| RuleEngineValidationRead.sol | +
+ |
+ 100.0 % | +20 / 20 | +100.0 % | +4 / 4 | +100.0 % | +2 / 2 | +|
| RuleEngineOperation.sol | +
+ |
+ 97.6 % | +40 / 41 | +91.7 % | +11 / 12 | +100.0 % | +6 / 6 | +|
| RuleEngineValidation.sol | +
+ |
+ 97.4 % | +37 / 38 | +90.9 % | +10 / 11 | +100.0 % | +6 / 6 | +|
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
+
|
+ |||||||||||||||||||||||||||||
| + | + | + | + | + | + | + | ||
| Filename |
+ Line Coverage |
+ Functions |
+ Branches |
+ |||||
| RuleEngineValidation.sol | +
+ |
+ 97.4 % | +37 / 38 | +90.9 % | +10 / 11 | +100.0 % | +6 / 6 | +|
| RuleEngineOperation.sol | +
+ |
+ 97.6 % | +40 / 41 | +91.7 % | +11 / 12 | +100.0 % | +6 / 6 | +|
| RuleEngineValidationRead.sol | +
+ |
+ 100.0 % | +20 / 20 | +100.0 % | +4 / 4 | +100.0 % | +2 / 2 | +|
| ERC3643Compliance.sol | +
+ |
+ 100.0 % | +24 / 24 | +100.0 % | +8 / 8 | +66.7 % | +6 / 9 | +|
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
+
|
+ |||||||||||||||||||||||||||||
| + | + | + | + | + | + | + | ||
| Filename |
+ Line Coverage |
+ Functions |
+ Branches |
+ |||||
| RuleEngineValidation.sol | +
+ |
+ 97.4 % | +37 / 38 | +90.9 % | +10 / 11 | +100.0 % | +6 / 6 | +|
| RuleEngineOperation.sol | +
+ |
+ 97.6 % | +40 / 41 | +91.7 % | +11 / 12 | +100.0 % | +6 / 6 | +|
| RuleEngineValidationRead.sol | +
+ |
+ 100.0 % | +20 / 20 | +100.0 % | +4 / 4 | +100.0 % | +2 / 2 | +|
| ERC3643Compliance.sol | +
+ |
+ 100.0 % | +24 / 24 | +100.0 % | +8 / 8 | +66.7 % | +6 / 9 | +|
| Generated by: LCOV version 1.16 |
| LCOV - code coverage report | |||||||||||||||||||||||||||||
+
|
+ |||||||||||||||||||||||||||||
| + | + | + | + | + | + | + | ||
| Filename |
+ Line Coverage |
+ Functions |
+ Branches |
+ |||||
| ERC3643Compliance.sol | +
+ |
+ 100.0 % | +24 / 24 | +100.0 % | +8 / 8 | +66.7 % | +6 / 9 | +|
| RuleEngineOperation.sol | +
+ |
+ 97.6 % | +40 / 41 | +91.7 % | +11 / 12 | +100.0 % | +6 / 6 | +|
| RuleEngineValidation.sol | +
+ |
+ 97.4 % | +37 / 38 | +90.9 % | +10 / 11 | +100.0 % | +6 / 6 | +|
| RuleEngineValidationRead.sol | +
+ |
+ 100.0 % | +20 / 20 | +100.0 % | +4 / 4 | +100.0 % | +2 / 2 | +|
| Generated by: LCOV version 1.16 |
-_7Tp(?rTF3BmWspVu<@7>$U<3>$Q?H3Sm)Y 3p$p-g2VYMgQKts2>@s3_
zbXW0;T-25(t}KlDRRpja-aS|h=)^)S_x>)b1-}C@CXcL(kI(o}+GuT!HUb{hdnaPP
z9r;8r=L4of?VQ`X!!0A3#AQow0^mJ$*%jS&%g_{*YcU_>0;IYbLO-4tiaC5DQ@p&T
z3lhW!WxDES!J@2r0h$(uFzc&kc|KJ>UY&y5qr+9ah---Z?NGjuKkwzvTxT 7@>>NhPN8Rpy%eDZyh
zgdL>!oc5O~*&U?M1~0msme!& wlZu6yr1F`EjC>lFKs+!IWe5n$u{w>z>8b^AqN+8+%S;qP{QdN}^p=
z_u>;*pK3xY%1JCwHcq9_E|Pgbj8i@~pxrHotN38)X{8>LU}r)qboQA^pc{f5+-*Ui
zPCo+@{S8gd#79o9!meY@ebM0EJ!}FgS+LWkqKD}Qr_4Oq&M#CTPG`UGgq&&FBs$hn
zCkm@A{jS0;m9`w_{zaP+4`f@=@FTxEpcxh=>wW5!uDwuiyQ;V8%8f(b5e}pk6|w$$
zjNEj_$Z~E26ND;fxFRY@qoQfY1Oh6m&jx}>yw^C31?8Ls1f7q#RuwiJD`RC-*cK)Z
ziheSK1>)2GH=F3PT~ixkBG%#{GDy~rKy_$Hv=N|a69o=m=|ac?3L(W*FK>nh^(T(E
zQHnGcmwP_2i$i&)&Ot0Ugq|;9A<%=>pFiC(MO}%~keeb+i>QSCcV&d&WZ=p5P$O6s
z$UWPrChoBeT9Y=9E&cIN8Rr4`0O8rpUtLq_ixWqwH<{UVImu^|0QblzPN58c1sBQW
z^67yjYy$>VLYYQZSoO4IOU@GuB28`G&9W0sZHyJlIv+JLrm=@II}Cn5wo^W3$EVk$0lKSq3$7ndzptE
zE=(&RAV3})L3_BnyE~VigD^24vS6+I9-L5ARJ;H})1G5ae>WhYe_+59Wbh(59(ckn
z?e}H3GiX7tlhtD?Krycj*K+|e${QJRUd(2`ef#zeU}z!RPSJ>{C~IkLLd#bDV~&aW
z`P)K6LnUua>;x(SR$YsLqv1Hr%(O@StrsTH3)s(1_E?I2kMwA0r6;YR
z8U&rAR#sNw;{jC{Nd*V?8-JU^+!U){VAl`oE`Q^OBoHwvq^+q~mJk~9I6hnXbo%N9
z$`oyFZ4=0k+H~epUmN-~_U#>WQz>fRjzd@1LhY4wUzD`6wr+Xf<3q#pbZj$=Ne|5)
z=?wjWaw=W(fRGU1kdRa1<0C(Qa0v*|Ll=laktt4o`I2$ZsaQo^8K;
j687=)b9L{ee9Jv7`1#L07+TB%zPjZ45vcv@hwY
zx5|U@vqI$aVNctx{38dp2^_l?v9)?+`YFB=rvtCcs74FmLbfjQkOsW}=(R&y%t&Dg
ze;C
AccessControl | 0x0000000000000000000000000000000000000000000000000000000000000000 |
+| **Modules** | | |
+| COMPLIANCE_MANAGER_ROLE | ERC3643Compliance | |
+| RULE_ENGINE_OPERATOR_ROLE | RuleEngineInvariantStorageCommon | |
+
+
+
+#### Role by modules
+
+Here a summary tab for each restricted functions defined in a module
+For function signatures, struct arguments are represented with their corresponding native type.
+
+| | Function signature | Visibility [public/external] | Input variables (Function arguments) | Output variables
(return value) | Role Required |
+| -------------------- | ------------------ | ---------------------------- | ------------------------------------ | ------------------------------------ | ------------- |
+| **Modules** | | | | | |
+| RuleEngineOperation | | | | | |
+| | `` | public | `` | - | |
+| | `` | public | `` | - | |
+| RuleEngineValidation | | | | | |
## Dependencies
@@ -157,18 +243,23 @@ If we need a new on, we just issue a new one, and set inside the CMTAT token (or
### Urgency mechanism
-- Pause
+### Pause
+
+There are no functionalities to put in pause the contracts.
-There are no functionalities to put in pause the contracts.
+The RuleEngine can be removed from the main token contract by calling the dedicated function
-* Kill / Deactivate the contracts
+- CMTAT v3.0.0: `setRuleEngine(address ruleEngine)`
+- ERC-3643 token: `setCompliance(address _compliance)`
+
+### Kill / Deactivate the contracts
There are no functionalities to kill/deactivate the contracts.
+Similar to the pause functionality, the RuleEngine can be directly removed from the main token contract
-### Gasless support (ERC-2771)
-> The gasless integration was not part of the audit performed by ABDK on the version [1.0.1](https://github.com/CMTA/RuleEngine/releases/tag/1.0.1)
+### Gasless support (ERC-2771)
The RuleEngine contracts and the other rules support client-side gasless transactions using the [Gas Station Network](https://docs.opengsn.org/#the-problem) (GSN) pattern, the main open standard for transfering fee payment to another account than that of the transaction issuer. The contract uses the OpenZeppelin contract `ERC2771Context`, which allows a contract to get the original client with `_msgSender()` instead of the fee payer given by `msg.sender` .
diff --git a/package-lock.json b/package-lock.json
index 755c254..05686eb 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,5 +1,5 @@
{
- "name": "RuleEngine",
+ "name": "RuleEngineNew",
"lockfileVersion": 2,
"requires": true,
"packages": {
diff --git a/src/interfaces/IRuleEngineOperation.sol b/src/interfaces/IRuleEngineOperation.sol
index 5de9950..8ce9bbb 100644
--- a/src/interfaces/IRuleEngineOperation.sol
+++ b/src/interfaces/IRuleEngineOperation.sol
@@ -59,12 +59,16 @@ interface IRuleEngineOperation {
* @notice Remove a rule from the array of rules
* Revert if the rule found at the specified index does not match the rule in argument
* @param rule_ address of the target rule
- * @dev To reduce the array size, the last rule is moved to the location occupied
- * by the rule to remove
*
*
*/
function removeRuleOperation(
IRuleOperation rule_
) external;
+
+ /**
+ * @notice Check if a rule is present
+ *
+ */
+ function ruleOperationIsPresent(IRuleOperation rule_) external returns (bool);
}
diff --git a/src/interfaces/IRuleEngineValidation.sol b/src/interfaces/IRuleEngineValidation.sol
index 2de3c33..8f5384a 100644
--- a/src/interfaces/IRuleEngineValidation.sol
+++ b/src/interfaces/IRuleEngineValidation.sol
@@ -34,8 +34,11 @@ interface IRuleEngineValidationRead {
}
interface IRuleEngineValidation {
- /**
- * @dev define the rules, the precedent rules will be overwritten
+ /**
+ * @notice Set all the rules, will overwrite all the previous rules. \n
+ * Revert if one rule is a zero address or if the rule is already present
+ * @dev take address[] instead of IRuleEngineValidation[] since it is not possible to cast IRuleEngineValidation[] -> address[]
+ *
*/
function setRulesValidation(IRuleValidation[] calldata rules_) external;
@@ -89,5 +92,5 @@ interface IRuleEngineValidation {
* @notice Check if a rule is present
*
*/
- function rulesValidationIsPresent(IRuleValidation rule_) external returns (bool);
+ function ruleValidationIsPresent(IRuleValidation rule_) external returns (bool);
}
diff --git a/src/interfaces/IRuleOperation.sol b/src/interfaces/IRuleOperation.sol
index c5fdf58..c5cf861 100644
--- a/src/interfaces/IRuleOperation.sol
+++ b/src/interfaces/IRuleOperation.sol
@@ -4,6 +4,7 @@ pragma solidity ^0.8.20;
/* ==== CMTAT === */
import {IERC3643IComplianceContract} from "CMTAT/interfaces/tokenization/IERC3643Partial.sol";
-
-interface IRuleOperation is IERC3643IComplianceContract {
+/* ==== Interfaces === */
+import {IRuleValidation} from "./IRuleValidation.sol";
+interface IRuleOperation is IERC3643IComplianceContract, IRuleValidation {
}
diff --git a/src/modules/ERC3643Compliance.sol b/src/modules/ERC3643Compliance.sol
index 5c7a5e6..09d6529 100644
--- a/src/modules/ERC3643Compliance.sol
+++ b/src/modules/ERC3643Compliance.sol
@@ -8,19 +8,22 @@ import {EnumerableSet} from "OZ/utils/structs/EnumerableSet.sol";
/* ==== Interface and other library === */
import {IERC3643Compliance} from "../interfaces/IERC3643Compliance.sol";
abstract contract ERC3643Compliance is IERC3643Compliance, AccessControl {
- bytes32 public constant COMPLIANCE_MANAGER_ROLE = keccak256("COMPLIANCE_MANAGER_ROLE");
- // Add the library methods
+ /* ==== Type declaration === */
using EnumerableSet for EnumerableSet.AddressSet;
- // Errors
+ /* ==== State Variables === */
+ // Token binding tracking
+ EnumerableSet.AddressSet private _boundTokens;
+ // Access Control
+ bytes32 public constant COMPLIANCE_MANAGER_ROLE = keccak256("COMPLIANCE_MANAGER_ROLE");
+
+ /* ==== Errors === */
error RuleEngine_ERC3643Compliance_NotComplianceManager();
error RuleEngine_ERC3643Compliance_InvalidTokenAddress();
error RuleEngine_ERC3643Compliance_TokenAlreadyBound();
error RuleEngine_ERC3643Compliance_TokenNotBound();
error RuleEngine_ERC3643Compliance_UnauthorizedCaller();
- // Token binding tracking
- EnumerableSet.AddressSet private _boundTokens;
-
+ /* ==== Modifier === */
modifier onlyBoundToken() {
if (!_boundTokens.contains(_msgSender())) {
revert RuleEngine_ERC3643Compliance_UnauthorizedCaller();
diff --git a/src/modules/RuleEngineOperation.sol b/src/modules/RuleEngineOperation.sol
index 7de2152..133407b 100644
--- a/src/modules/RuleEngineOperation.sol
+++ b/src/modules/RuleEngineOperation.sol
@@ -17,9 +17,14 @@ abstract contract RuleEngineOperation is
RuleEngineInvariantStorageCommon,
IRuleEngineOperation
{
- // Add the library methods
+ /* ==== Type declaration === */
using EnumerableSet for EnumerableSet.AddressSet;
+ /* ==== State Variables === */
+ /// @dev Array of rules
+ EnumerableSet.AddressSet internal _rulesOperation;
+
+ /* ============ Events ============ */
/// @notice Generate when a rule is added
event AddRuleOperation(IRuleOperation indexed rule);
/// @notice Generate when a rule is removed
@@ -28,23 +33,19 @@ abstract contract RuleEngineOperation is
event ClearRulesOperation();
- // Declare a set state variable
- /// @dev Array of rules
- EnumerableSet.AddressSet internal _rulesOperation;
/*//////////////////////////////////////////////////////////////
PUBLIC/EXTERNAL FUNCTIONS
//////////////////////////////////////////////////////////////*/
/* ============ State functions ============ */
+
/**
- * @notice Set all the rules, will overwrite all the previous rules. \n
- * Revert if one rule is a zero address or if the rule is already present
- *
- */
+ * @inheritdoc IRuleEngineOperation
+ */
function setRulesOperation(
IRuleOperation[] calldata rules_
- ) public virtual onlyRole(RULE_ENGINE_OPERATOR_ROLE) {
+ ) public virtual override(IRuleEngineOperation) onlyRole(RULE_ENGINE_OPERATOR_ROLE) {
if (rules_.length == 0) {
revert RuleEngine_ArrayIsEmpty();
}
@@ -60,76 +61,67 @@ abstract contract RuleEngineOperation is
}
/**
- * @notice Clear all the rules of the array of rules
- *
- */
- function clearRulesOperation() public virtual onlyRole(RULE_ENGINE_OPERATOR_ROLE) {
+ * @inheritdoc IRuleEngineOperation
+ */
+ function clearRulesOperation() public virtual override(IRuleEngineOperation) onlyRole(RULE_ENGINE_OPERATOR_ROLE) {
_clearRulesOperation();
}
-
/**
- * @notice Add a rule to the array of rules
- * Revert if one rule is a zero address or if the rule is already present
- *
- */
+ * @inheritdoc IRuleEngineOperation
+ */
function addRuleOperation(
IRuleOperation rule_
- ) public virtual onlyRole(RULE_ENGINE_OPERATOR_ROLE) {
+ ) public virtual override(IRuleEngineOperation) onlyRole(RULE_ENGINE_OPERATOR_ROLE) {
_checkRule(address(rule_));
_rulesOperation.add(address(rule_));
emit AddRuleOperation(rule_);
}
- /**
- * @notice Remove a rule from the array of rules
- * Revert if the rule found at the specified index does not match the rule in argument
- * @param rule_ address of the target rule
- * @dev To reduce the array size, the last rule is moved to the location occupied
- * by the rule to remove
- *
- *
- */
+ /**
+ * @inheritdoc IRuleEngineOperation
+ */
function removeRuleOperation(
IRuleOperation rule_
- ) public virtual onlyRole(RULE_ENGINE_OPERATOR_ROLE) {
- require(rulesOperationIsPresent(rule_), RuleEngine_RuleDoNotMatch());
+ ) public virtual override(IRuleEngineOperation) onlyRole(RULE_ENGINE_OPERATOR_ROLE) {
+ require(_rulesOperation.contains(address(rule_)), RuleEngine_RuleDoNotMatch());
_removeRuleOperation(rule_);
}
/* ============ View functions ============ */
- /**
- * @return The number of rules inside the array
- */
- function rulesCountOperation() public view virtual override returns (uint256) {
+
+ /**
+ * @inheritdoc IRuleEngineOperation
+ */
+ function rulesCountOperation() public view virtual override(IRuleEngineOperation) returns (uint256) {
return _rulesOperation.length();
}
- function rulesOperationIsPresent(IRuleOperation rule_) public view virtual returns (bool){
+ /**
+ * @inheritdoc IRuleEngineOperation
+ */
+ function ruleOperationIsPresent(IRuleOperation rule_) public view virtual override(IRuleEngineOperation) returns (bool){
return _rulesOperation.contains(address(rule_));
}
/**
- * @notice Get the rule at the position specified by ruleId
- * @param ruleId index of the rule
- * @return a rule address
- */
+ * @inheritdoc IRuleEngineOperation
+ */
function ruleOperation(
uint256 ruleId
- ) public view virtual override returns (address) {
+ ) public view virtual override(IRuleEngineOperation) returns (address) {
return _rulesOperation.at(ruleId);
}
/**
- * @notice Get all the rules
- * @return An array of rules
- */
+ * @inheritdoc IRuleEngineOperation
+ */
function rulesOperation()
public
view
virtual
- override
+ override(IRuleEngineOperation)
returns (address[] memory)
{
return _rulesOperation.values();
diff --git a/src/modules/RuleEngineValidation.sol b/src/modules/RuleEngineValidation.sol
index 9f9f1ed..7956a16 100644
--- a/src/modules/RuleEngineValidation.sol
+++ b/src/modules/RuleEngineValidation.sol
@@ -15,12 +15,13 @@ abstract contract RuleEngineValidation is
IRuleEngineValidation,
RuleEngineInvariantStorageCommon
{
- // Add the library methods
+ /* ==== Type declaration === */
using EnumerableSet for EnumerableSet.AddressSet;
- // Declare a set state variable
+ /* ==== State Variables === */
EnumerableSet.AddressSet internal _rulesValidation;
+ /* ============ Events ============ */
/// @notice Generate when a rule is added
event AddRuleValidation(IRuleValidation indexed rule);
/// @notice Generate when a rule is removed
@@ -32,12 +33,10 @@ abstract contract RuleEngineValidation is
PUBLIC/EXTERNAL FUNCTIONS
//////////////////////////////////////////////////////////////*/
/* ============ State functions ============ */
+
/**
- * @notice Set all the rules, will overwrite all the previous rules. \n
- * Revert if one rule is a zero address or if the rule is already present
- * @dev take address[] instead of IRuleEngineValidation[] since it is not possible to cast IRuleEngineValidation[] -> address[]
- *
- */
+ * @inheritdoc IRuleEngineValidation
+ */
function setRulesValidation(
IRuleValidation[] calldata rules_
) public virtual override(IRuleEngineValidation) onlyRole(RULE_ENGINE_OPERATOR_ROLE) {
@@ -56,12 +55,17 @@ abstract contract RuleEngineValidation is
}
-
+ /**
+ * @inheritdoc IRuleEngineValidation
+ */
function clearRulesValidation() public virtual override(IRuleEngineValidation) onlyRole(RULE_ENGINE_OPERATOR_ROLE) {
_clearRulesValidation();
}
+ /**
+ * @inheritdoc IRuleEngineValidation
+ */
function addRuleValidation(
IRuleValidation rule_
) public virtual override(IRuleEngineValidation) onlyRole(RULE_ENGINE_OPERATOR_ROLE) {
@@ -71,27 +75,37 @@ abstract contract RuleEngineValidation is
}
+ /**
+ * @inheritdoc IRuleEngineValidation
+ */
function removeRuleValidation(
IRuleValidation rule_
) public virtual override(IRuleEngineValidation) onlyRole(RULE_ENGINE_OPERATOR_ROLE) {
- require(rulesValidationIsPresent(rule_), RuleEngine_RuleDoNotMatch());
+ require(_rulesValidation.contains(address(rule_)), RuleEngine_RuleDoNotMatch());
_removeRuleValidation(rule_);
}
/* ============ View functions ============ */
- function rulesValidationIsPresent(IRuleValidation rule_) public view virtual override(IRuleEngineValidation) returns (bool){
+ /**
+ * @inheritdoc IRuleEngineValidation
+ */
+ function ruleValidationIsPresent(IRuleValidation rule_) public view virtual override(IRuleEngineValidation) returns (bool){
return _rulesValidation.contains(address(rule_));
}
-
-
+ /**
+ * @inheritdoc IRuleEngineValidation
+ */
function rulesCountValidation() public view virtual override(IRuleEngineValidation) returns (uint256) {
return _rulesValidation.length();
}
-
+
+ /**
+ * @inheritdoc IRuleEngineValidation
+ */
function ruleValidation(
uint256 ruleId
) public view virtual override(IRuleEngineValidation) returns (address) {
@@ -99,7 +113,9 @@ abstract contract RuleEngineValidation is
}
-
+ /**
+ * @inheritdoc IRuleEngineValidation
+ */
function rulesValidation()
public
view
diff --git a/src/modules/library/RuleEngineInvariantStorage.sol b/src/modules/library/RuleEngineInvariantStorage.sol
index eeaa449..ca55295 100644
--- a/src/modules/library/RuleEngineInvariantStorage.sol
+++ b/src/modules/library/RuleEngineInvariantStorage.sol
@@ -3,6 +3,7 @@
pragma solidity ^0.8.20;
abstract contract RuleEngineInvariantStorage {
+ /* ==== Errors === */
error RuleEngine_AdminWithAddressZeroNotAllowed();
error RuleEngine_InvalidTransfer(address from, address to, uint256 value);
}
diff --git a/src/modules/library/RuleEngineInvariantStorageCommon.sol b/src/modules/library/RuleEngineInvariantStorageCommon.sol
index 175f721..545d501 100644
--- a/src/modules/library/RuleEngineInvariantStorageCommon.sol
+++ b/src/modules/library/RuleEngineInvariantStorageCommon.sol
@@ -3,11 +3,13 @@
pragma solidity ^0.8.20;
abstract contract RuleEngineInvariantStorageCommon {
+ /* ==== Errors === */
error RuleEngine_RuleAddressZeroNotAllowed();
error RuleEngine_RuleAlreadyExists();
error RuleEngine_RuleDoNotMatch();
error RuleEngine_ArrayIsEmpty();
+ /* ==== Constant === */
/// @notice Role to manage the ruleEngine
bytes32 public constant RULE_ENGINE_OPERATOR_ROLE =
keccak256("RULE_ENGINE_OPERATOR_ROLE");
From 41f7ececa9511a777a9c375a5083d5f5ceab1d9d Mon Sep 17 00:00:00 2001
From: Ryan Sauge <71391932+rya-sge@users.noreply.github.com>
Date: Fri, 15 Aug 2025 10:09:11 +0200
Subject: [PATCH 10/17] Update role value, improve doc, update library
---
README.md | 811 ++-
RuleEngine.sol | 4973 +++++++++++++++++
classDiagram.svg | 1458 +++++
coverage/amber.png | Bin 141 -> 0 bytes
coverage/emerald.png | Bin 141 -> 0 bytes
coverage/gcov.css | 519 --
coverage/glass.png | Bin 167 -> 0 bytes
coverage/index-sort-b.html | 119 -
coverage/index-sort-f.html | 119 -
coverage/index-sort-l.html | 119 -
coverage/index.html | 119 -
coverage/ruby.png | Bin 141 -> 0 bytes
coverage/snow.png | Bin 141 -> 0 bytes
coverage/src/RuleEngine.sol.func-sort-c.html | 137 -
coverage/src/RuleEngine.sol.func.html | 137 -
coverage/src/RuleEngine.sol.gcov.html | 384 --
coverage/src/index-sort-b.html | 107 -
coverage/src/index-sort-f.html | 107 -
coverage/src/index-sort-l.html | 107 -
coverage/src/index.html | 107 -
.../ERC3643Compliance.sol.func-sort-c.html | 113 -
.../modules/ERC3643Compliance.sol.func.html | 113 -
.../modules/ERC3643Compliance.sol.gcov.html | 167 -
.../RuleEngineOperation.sol.func-sort-c.html | 129 -
.../modules/RuleEngineOperation.sol.func.html | 129 -
.../modules/RuleEngineOperation.sol.gcov.html | 275 -
.../RuleEngineValidation.sol.func-sort-c.html | 125 -
.../RuleEngineValidation.sol.func.html | 125 -
.../RuleEngineValidation.sol.gcov.html | 254 -
...eEngineValidationRead.sol.func-sort-c.html | 97 -
.../RuleEngineValidationRead.sol.func.html | 97 -
.../RuleEngineValidationRead.sol.gcov.html | 185 -
coverage/src/modules/index-sort-b.html | 143 -
coverage/src/modules/index-sort-f.html | 143 -
coverage/src/modules/index-sort-l.html | 143 -
coverage/src/modules/index.html | 143 -
coverage/updown.png | Bin 117 -> 0 bytes
doc/TOOLCHAIN.md | 9 -
doc/codelist.md | 20 -
doc/functionalities.odt | Bin 36011 -> 0 bytes
doc/functionalities.pdf | Bin 31278 -> 0 bytes
doc/other/CMTAT/checkTransferred.png | Bin 0 -> 50568 bytes
doc/other/CMTAT/transferred.png | Bin 0 -> 79290 bytes
doc/schema/Engine-RuleEngine.drawio.png | Bin 208724 -> 0 bytes
doc/schema/RuleEngine | 1 -
doc/schema/RuleEngine.drawio | 1 +
doc/schema/RuleEngine.drawio.png | Bin 0 -> 47811 bytes
doc/schema/RuleEngine.png | Bin 97335 -> 0 bytes
doc/schema/RuleEngine.svg | 596 --
doc/schema/classDiagram.svg | 2232 +++++---
...tat_surya_inheritance_IRuleEngine.sol.png} | Bin
.../rule/IncomeVault-claimDividend.drawio.png | Bin 100066 -> 0 bytes
.../conditionalTransfer-Storage.drawio.png | Bin 89794 -> 0 bytes
...ionalTransfer-automaticTransfer.drawio.png | Bin 83764 -> 0 bytes
...nditionalTransfer-state machine.drawio.png | Bin 53914 -> 0 bytes
doc/schema/rule/conditionalTransfer.drawio | 1 -
.../rule/conditionalTransferCMTAT.drawio.png | Bin 84882 -> 0 bytes
doc/schema/rule/conditionalTransferTime.png | Bin 29921 -> 0 bytes
doc/schema/rule/ruleWhitelistWrapper.drawio | 1 -
.../rule/ruleWhitelistWrapper.drawio.png | Bin 53602 -> 0 bytes
.../rule/ruleWhitelistWrapperV2.drawio.png | Bin 111165 -> 0 bytes
...urya_graph_ERC3643ComplianceModule.sol.png | Bin 0 -> 199776 bytes
.../surya_graph_IERC3643Compliance.sol.png | Bin 0 -> 51370 bytes
.../surya_graph/surya_graph_IRule.sol.png | Bin 0 -> 19645 bytes
...surya_graph_IRulesManagementModule.sol.png | Bin 0 -> 50444 bytes
...surya_graph_MetaTxModuleStandalone.sol.png | Bin
.../surya_graph_RuleAddressList.sol.png | Bin
...urya_graph_RuleAddressListInternal.sol.png | Bin
...ph_RuleAddressListInvariantStorage.sol.png | Bin
...raph_RuleBlacklistInvariantStorage.sol.png | Bin
...a_graph_RuleCommonInvariantStorage.sol.png | Bin
...graph_RuleConditionalTransferLight.sol.png | Bin 0 -> 107865 bytes
...onalTransferLightInvariantStorage.sol.png} | Bin
.../surya_graph_RuleEngine.sol.png | Bin 0 -> 91902 bytes
.../surya_graph_RuleEngineBase.sol.png | Bin 0 -> 122782 bytes
...a_graph_RuleEngineInvariantStorage.sol.png | Bin
.../surya_graph_RuleOperationRevert.sol.png | Bin 0 -> 68741 bytes
.../surya_graph_RuleWhitelist.sol.png | Bin 0 -> 70966 bytes
.../surya_graph_RuleWhitelistCommon.sol.png | Bin
...raph_RuleWhitelistInvariantStorage.sol.png | Bin
.../surya_graph_RulesManagementModule.sol.png | Bin 0 -> 286307 bytes
...sManagementModuleInvariantStorage.sol.png} | Bin
.../surya_graph_VersionModule.sol.png | Bin 0 -> 12663 bytes
...nheritance_ERC3643ComplianceModule.sol.png | Bin 0 -> 20713 bytes
...rya_inheritance_IERC3643Compliance.sol.png | Bin 0 -> 21438 bytes
.../surya_inheritance_IRule.sol.png | Bin 0 -> 7961 bytes
...inheritance_IRulesManagementModule.sol.png | Bin 0 -> 6843 bytes
...inheritance_MetaTxModuleStandalone.sol.png | Bin
.../surya_inheritance_RuleAddressList.sol.png | Bin
...nheritance_RuleAddressListInternal.sol.png | Bin
...ce_RuleAddressListInvariantStorage.sol.png | Bin
...ance_RuleBlacklistInvariantStorage.sol.png | Bin
...ritance_RuleCommonInvariantStorage.sol.png | Bin
...tance_RuleConditionalTransferLight.sol.png | Bin 0 -> 26255 bytes
...ionalTransferLightInvariantStorage.sol.png | Bin 0 -> 16885 bytes
.../surya_inheritance_RuleEngine.sol.png | Bin 0 -> 18472 bytes
.../surya_inheritance_RuleEngineBase.sol.png | Bin 0 -> 36333 bytes
...ritance_RuleEngineInvariantStorage.sol.png | Bin
...ya_inheritance_RuleOperationRevert.sol.png | Bin 0 -> 22557 bytes
.../surya_inheritance_RuleWhitelist.sol.png | Bin
...ya_inheritance_RuleWhitelistCommon.sol.png | Bin 0 -> 18570 bytes
...ance_RuleWhitelistInvariantStorage.sol.png | Bin
..._inheritance_RulesManagementModule.sol.png | Bin 0 -> 26273 bytes
...esManagementModuleInvariantStorage.sol.png | Bin 0 -> 8186 bytes
.../surya_inheritance_VersionModule.sol.png | Bin 0 -> 10895 bytes
...rya_report_ERC3643ComplianceModule.sol.md} | 15 +-
.../surya_report_IERC3643Compliance.sol.md | 33 +
.../surya_report/surya_report_IRule.sol.md} | 4 +-
...surya_report_IRulesManagementModule.sol.md | 34 +
...surya_report_MetaTxModuleStandalone.sol.md | 2 +-
.../surya_report_RuleAddressList.sol.md | 2 +-
...urya_report_RuleAddressListInternal.sol.md | 2 +-
...ort_RuleAddressListInvariantStorage.sol.md | 2 +-
...eport_RuleBlacklistInvariantStorage.sol.md | 2 +-
...a_report_RuleCommonInvariantStorage.sol.md | 2 +-
...eport_RuleConditionalTransferLight.sol.md} | 22 +-
...ionalTransferLightInvariantStorage.sol.md} | 4 +-
.../surya_report_RuleEngine.sol.md} | 6 +-
.../surya_report_RuleEngineBase.sol.md | 36 +
...a_report_RuleEngineInvariantStorage.sol.md | 2 +-
.../surya_report_RuleOperationRevert.sol.md} | 10 +-
.../surya_report_RuleWhitelist.sol.md | 7 +-
.../surya_report_RuleWhitelistCommon.sol.md | 4 +-
...eport_RuleWhitelistInvariantStorage.sol.md | 2 +-
.../surya_report_RulesManagementModule.sol.md | 39 +
...esManagementModuleInvariantStorage.sol.md} | 5 +-
.../surya_report_VersionModule.sol.md} | 5 +-
.../vscode-uml/ERC3643ComplianceModuleUML.png | Bin 0 -> 136700 bytes
doc/schema/vscode-uml/IERC1404ExtendUML.png | Bin 0 -> 46283 bytes
doc/schema/vscode-uml/IERC1404UML.png | Bin 0 -> 24573 bytes
.../vscode-uml/IERC3643ComplianceReadUML.png | Bin 0 -> 17029 bytes
.../IERC3643IComplianceContractUML.png | Bin 0 -> 17220 bytes
.../vscode-uml/IERC7551ComplianceUML.png | Bin 0 -> 37332 bytes
doc/schema/vscode-uml/IRuleEngineUML.png | Bin 0 -> 65716 bytes
doc/schema/vscode-uml/RuleEngineBaseUML.png | Bin 0 -> 134826 bytes
doc/schema/vscode-uml/RuleEngineUML.png | Bin 0 -> 66509 bytes
.../vscode-uml/RuleManagementModuleUML.png | Bin 0 -> 183204 bytes
doc/schema/vscode-uml/VersionModuleUML.png | Bin 0 -> 32198 bytes
.../access-control-RuleEngine.png | Bin 30462 -> 52379 bytes
...access-control-RuleSanctionList.drawio.png | Bin 24610 -> 0 bytes
.../access-control-RuleWhitelist.png | Bin 41965 -> 0 bytes
.../accessControl/access-control.drawio | 2 +-
doc/security/audits/tools/aderyn-report.md | 299 +
doc/security/audits/tools/slither-report.md | 630 +--
.../surya_graph_IRuleEngineOperation.sol.png | Bin 39826 -> 0 bytes
.../surya_graph_IRuleEngineValidation.sol.png | Bin 60403 -> 0 bytes
.../surya_graph_IRuleOperation.sol.png | Bin 20896 -> 0 bytes
.../surya_graph_IRuleValidation.sol.png | Bin 20715 -> 0 bytes
.../surya_graph_RuleBlacklist.sol.png | Bin 43182 -> 0 bytes
...urya_graph_RuleConditionalTransfer.sol.png | Bin 446424 -> 0 bytes
...ph_RuleConditionalTransferOperator.sol.png | Bin 360699 -> 0 bytes
.../surya_graph_RuleEngine.sol.png | Bin 193554 -> 0 bytes
.../surya_graph_RuleEngineOperation.sol.png | Bin 127575 -> 0 bytes
.../surya_graph_RuleEngineValidation.sol.png | Bin 29066 -> 0 bytes
...a_graph_RuleEngineValidationCommon.sol.png | Bin 132775 -> 0 bytes
.../surya_graph_RuleInternal.sol.png | Bin 87221 -> 0 bytes
.../surya_graph_RuleSanctionList.sol.png | Bin 203676 -> 0 bytes
.../surya_graph_RuleValidateTransfer.sol.png | Bin 22927 -> 0 bytes
.../surya_graph_RuleWhitelist.sol.png | Bin 27681 -> 0 bytes
.../surya_graph_RuleWhitelistWrapper.sol.png | Bin 132320 -> 0 bytes
...a_inheritance_IRuleEngineOperation.sol.png | Bin 6484 -> 0 bytes
..._inheritance_IRuleEngineValidation.sol.png | Bin 10994 -> 0 bytes
.../surya_inheritance_IRuleOperation.sol.png | Bin 5311 -> 0 bytes
.../surya_inheritance_IRuleValidation.sol.png | Bin 11676 -> 0 bytes
.../surya_inheritance_RuleBlacklist.sol.png | Bin 25450 -> 0 bytes
...nheritance_RuleConditionalTransfer.sol.png | Bin 32364 -> 0 bytes
...onditionalTransferInvariantStorage.sol.png | Bin 16328 -> 0 bytes
...ce_RuleConditionalTransferOperator.sol.png | Bin 21956 -> 0 bytes
.../surya_inheritance_RuleEngine.sol.png | Bin 29248 -> 0 bytes
...ya_inheritance_RuleEngineOperation.sol.png | Bin 23797 -> 0 bytes
...a_inheritance_RuleEngineValidation.sol.png | Bin 36633 -> 0 bytes
...ritance_RuleEngineValidationCommon.sol.png | Bin 25911 -> 0 bytes
.../surya_inheritance_RuleInternal.sol.png | Bin 12167 -> 0 bytes
...surya_inheritance_RuleSanctionList.sol.png | Bin 32931 -> 0 bytes
...e_RuleSanctionListInvariantStorage.sol.png | Bin 15225 -> 0 bytes
...a_inheritance_RuleValidateTransfer.sol.png | Bin 11664 -> 0 bytes
...ya_inheritance_RuleWhitelistCommon.sol.png | Bin 21618 -> 0 bytes
...a_inheritance_RuleWhitelistWrapper.sol.png | Bin 27537 -> 0 bytes
.../surya_report_IRuleEngineValidation.sol.md | 34 -
...urya_report_RuleConditionalTransfer.sol.md | 44 -
...ort_RuleConditionalTransferOperator.sol.md | 46 -
.../surya_report_RuleEngine.sol.md | 35 -
.../surya_report_RuleEngineOperation.sol.md | 37 -
.../surya_report_RuleEngineValidation.sol.md | 28 -
...a_report_RuleEngineValidationCommon.sol.md | 36 -
.../surya_report_RuleInternal.sol.md | 30 -
.../surya_report_RuleValidateTransfer.sol.md | 27 -
doc/technical/RuleBlacklist.md | 49 -
doc/technical/RuleConditionalTransfer.md | 191 -
doc/technical/RuleEngine.md | 58 -
doc/technical/RuleSanctionList.md | 38 -
doc/technical/RuleWhitelist.md | 50 -
doc/technical/RuleWhitelistWrapper.md | 32 -
lcov.info | 593 +-
lib/CMTAT | 2 +-
lib/forge-std | 2 +-
lib/openzeppelin-contracts | 2 +-
script/CMTATWithRuleEngineScript.s.sol | 5 +-
script/RuleEngineScript.s.sol | 5 +-
src/RuleEngineBase.sol | 181 +-
src/interfaces/IERC3643Compliance.sol | 69 +-
src/interfaces/IRule.sol | 16 +
src/interfaces/IRuleEngineOperation.sol | 74 -
src/interfaces/IRuleEngineValidation.sol | 96 -
src/interfaces/IRuleOperation.sol | 10 -
src/interfaces/IRuleValidation.sol | 23 -
src/interfaces/IRulesManagementModule.sol | 73 +
.../RuleConditionalTransferLight.sol | 41 +-
.../rules/operation/RuleOperationRevert.sol | 36 +-
src/mocks/rules/validation/RuleWhitelist.sol | 40 +
.../RuleSanctionListInvariantStorage.sol | 32 -
.../abstract/RuleValidateTransfer.sol | 35 -
.../abstract/RuleWhitelistCommon.sol | 6 +-
...liance.sol => ERC3643ComplianceModule.sol} | 17 +-
src/modules/RuleEngineOperation.sol | 188 -
src/modules/RuleEngineValidation.sol | 165 -
src/modules/RuleEngineValidationRead.sol | 105 -
src/modules/RulesManagementModule.sol | 204 +
...EngineBaseModule.sol => VersionModule.sol} | 2 +-
.../library/RuleEngineInvariantStorage.sol | 1 -
.../RuleEngineInvariantStorageCommon.sol | 16 -
.../RulesManagementModuleInvariantStorage.sol | 28 +
test/HelperContract.sol | 13 +-
.../AccessControl/RuleEngineAccessControl.sol | 36 +-
.../RuleEngineAccessControlOZ.t.sol | 38 +-
test/RuleEngine/ERC3643Compliance.t.sol | 8 +-
test/RuleEngine/RuleEngineDeployment.t.sol | 14 +-
.../CMTATIntegration.t.sol | 6 +-
.../RuleEngineOperation.t.sol | 256 +-
.../RuleEngineOperationRevert.t.sol | 4 +-
.../RuleEngineRestriction.t.sol | 8 +-
...iction.t.sol => RuleEngineRestriction.sol} | 34 +-
...idation.t.sol => RuleEngineValidation.sol} | 243 +-
test/RuleWhitelist/CMTATIntegration.t.sol | 59 +-
234 files changed, 10138 insertions(+), 9119 deletions(-)
create mode 100644 RuleEngine.sol
create mode 100644 classDiagram.svg
delete mode 100644 coverage/amber.png
delete mode 100644 coverage/emerald.png
delete mode 100644 coverage/gcov.css
delete mode 100644 coverage/glass.png
delete mode 100644 coverage/index-sort-b.html
delete mode 100644 coverage/index-sort-f.html
delete mode 100644 coverage/index-sort-l.html
delete mode 100644 coverage/index.html
delete mode 100644 coverage/ruby.png
delete mode 100644 coverage/snow.png
delete mode 100644 coverage/src/RuleEngine.sol.func-sort-c.html
delete mode 100644 coverage/src/RuleEngine.sol.func.html
delete mode 100644 coverage/src/RuleEngine.sol.gcov.html
delete mode 100644 coverage/src/index-sort-b.html
delete mode 100644 coverage/src/index-sort-f.html
delete mode 100644 coverage/src/index-sort-l.html
delete mode 100644 coverage/src/index.html
delete mode 100644 coverage/src/modules/ERC3643Compliance.sol.func-sort-c.html
delete mode 100644 coverage/src/modules/ERC3643Compliance.sol.func.html
delete mode 100644 coverage/src/modules/ERC3643Compliance.sol.gcov.html
delete mode 100644 coverage/src/modules/RuleEngineOperation.sol.func-sort-c.html
delete mode 100644 coverage/src/modules/RuleEngineOperation.sol.func.html
delete mode 100644 coverage/src/modules/RuleEngineOperation.sol.gcov.html
delete mode 100644 coverage/src/modules/RuleEngineValidation.sol.func-sort-c.html
delete mode 100644 coverage/src/modules/RuleEngineValidation.sol.func.html
delete mode 100644 coverage/src/modules/RuleEngineValidation.sol.gcov.html
delete mode 100644 coverage/src/modules/RuleEngineValidationRead.sol.func-sort-c.html
delete mode 100644 coverage/src/modules/RuleEngineValidationRead.sol.func.html
delete mode 100644 coverage/src/modules/RuleEngineValidationRead.sol.gcov.html
delete mode 100644 coverage/src/modules/index-sort-b.html
delete mode 100644 coverage/src/modules/index-sort-f.html
delete mode 100644 coverage/src/modules/index-sort-l.html
delete mode 100644 coverage/src/modules/index.html
delete mode 100644 coverage/updown.png
delete mode 100644 doc/codelist.md
delete mode 100644 doc/functionalities.odt
delete mode 100644 doc/functionalities.pdf
create mode 100644 doc/other/CMTAT/checkTransferred.png
create mode 100644 doc/other/CMTAT/transferred.png
delete mode 100644 doc/schema/Engine-RuleEngine.drawio.png
delete mode 100644 doc/schema/RuleEngine
create mode 100644 doc/schema/RuleEngine.drawio
create mode 100644 doc/schema/RuleEngine.drawio.png
delete mode 100644 doc/schema/RuleEngine.png
delete mode 100644 doc/schema/RuleEngine.svg
rename doc/schema/{surya_inheritance_IRuleEngine.sol.png => cmtat_surya_inheritance_IRuleEngine.sol.png} (100%)
delete mode 100644 doc/schema/rule/IncomeVault-claimDividend.drawio.png
delete mode 100644 doc/schema/rule/conditionalTransfer-Storage.drawio.png
delete mode 100644 doc/schema/rule/conditionalTransfer-automaticTransfer.drawio.png
delete mode 100644 doc/schema/rule/conditionalTransfer-state machine.drawio.png
delete mode 100644 doc/schema/rule/conditionalTransfer.drawio
delete mode 100644 doc/schema/rule/conditionalTransferCMTAT.drawio.png
delete mode 100644 doc/schema/rule/conditionalTransferTime.png
delete mode 100644 doc/schema/rule/ruleWhitelistWrapper.drawio
delete mode 100644 doc/schema/rule/ruleWhitelistWrapper.drawio.png
delete mode 100644 doc/schema/rule/ruleWhitelistWrapperV2.drawio.png
create mode 100644 doc/schema/surya/surya_graph/surya_graph_ERC3643ComplianceModule.sol.png
create mode 100644 doc/schema/surya/surya_graph/surya_graph_IERC3643Compliance.sol.png
create mode 100644 doc/schema/surya/surya_graph/surya_graph_IRule.sol.png
create mode 100644 doc/schema/surya/surya_graph/surya_graph_IRulesManagementModule.sol.png
rename doc/{ => schema}/surya/surya_graph/surya_graph_MetaTxModuleStandalone.sol.png (100%)
rename doc/{ => schema}/surya/surya_graph/surya_graph_RuleAddressList.sol.png (100%)
rename doc/{ => schema}/surya/surya_graph/surya_graph_RuleAddressListInternal.sol.png (100%)
rename doc/{ => schema}/surya/surya_graph/surya_graph_RuleAddressListInvariantStorage.sol.png (100%)
rename doc/{ => schema}/surya/surya_graph/surya_graph_RuleBlacklistInvariantStorage.sol.png (100%)
rename doc/{ => schema}/surya/surya_graph/surya_graph_RuleCommonInvariantStorage.sol.png (100%)
create mode 100644 doc/schema/surya/surya_graph/surya_graph_RuleConditionalTransferLight.sol.png
rename doc/{surya/surya_graph/surya_graph_RuleConditionalTransferInvariantStorage.sol.png => schema/surya/surya_graph/surya_graph_RuleConditionalTransferLightInvariantStorage.sol.png} (100%)
create mode 100644 doc/schema/surya/surya_graph/surya_graph_RuleEngine.sol.png
create mode 100644 doc/schema/surya/surya_graph/surya_graph_RuleEngineBase.sol.png
rename doc/{ => schema}/surya/surya_graph/surya_graph_RuleEngineInvariantStorage.sol.png (100%)
create mode 100644 doc/schema/surya/surya_graph/surya_graph_RuleOperationRevert.sol.png
create mode 100644 doc/schema/surya/surya_graph/surya_graph_RuleWhitelist.sol.png
rename doc/{ => schema}/surya/surya_graph/surya_graph_RuleWhitelistCommon.sol.png (100%)
rename doc/{ => schema}/surya/surya_graph/surya_graph_RuleWhitelistInvariantStorage.sol.png (100%)
create mode 100644 doc/schema/surya/surya_graph/surya_graph_RulesManagementModule.sol.png
rename doc/{surya/surya_graph/surya_graph_RuleSanctionListInvariantStorage.sol.png => schema/surya/surya_graph/surya_graph_RulesManagementModuleInvariantStorage.sol.png} (100%)
create mode 100644 doc/schema/surya/surya_graph/surya_graph_VersionModule.sol.png
create mode 100644 doc/schema/surya/surya_inheritance/surya_inheritance_ERC3643ComplianceModule.sol.png
create mode 100644 doc/schema/surya/surya_inheritance/surya_inheritance_IERC3643Compliance.sol.png
create mode 100644 doc/schema/surya/surya_inheritance/surya_inheritance_IRule.sol.png
create mode 100644 doc/schema/surya/surya_inheritance/surya_inheritance_IRulesManagementModule.sol.png
rename doc/{ => schema}/surya/surya_inheritance/surya_inheritance_MetaTxModuleStandalone.sol.png (100%)
rename doc/{ => schema}/surya/surya_inheritance/surya_inheritance_RuleAddressList.sol.png (100%)
rename doc/{ => schema}/surya/surya_inheritance/surya_inheritance_RuleAddressListInternal.sol.png (100%)
rename doc/{ => schema}/surya/surya_inheritance/surya_inheritance_RuleAddressListInvariantStorage.sol.png (100%)
rename doc/{ => schema}/surya/surya_inheritance/surya_inheritance_RuleBlacklistInvariantStorage.sol.png (100%)
rename doc/{ => schema}/surya/surya_inheritance/surya_inheritance_RuleCommonInvariantStorage.sol.png (100%)
create mode 100644 doc/schema/surya/surya_inheritance/surya_inheritance_RuleConditionalTransferLight.sol.png
create mode 100644 doc/schema/surya/surya_inheritance/surya_inheritance_RuleConditionalTransferLightInvariantStorage.sol.png
create mode 100644 doc/schema/surya/surya_inheritance/surya_inheritance_RuleEngine.sol.png
create mode 100644 doc/schema/surya/surya_inheritance/surya_inheritance_RuleEngineBase.sol.png
rename doc/{ => schema}/surya/surya_inheritance/surya_inheritance_RuleEngineInvariantStorage.sol.png (100%)
create mode 100644 doc/schema/surya/surya_inheritance/surya_inheritance_RuleOperationRevert.sol.png
rename doc/{ => schema}/surya/surya_inheritance/surya_inheritance_RuleWhitelist.sol.png (100%)
create mode 100644 doc/schema/surya/surya_inheritance/surya_inheritance_RuleWhitelistCommon.sol.png
rename doc/{ => schema}/surya/surya_inheritance/surya_inheritance_RuleWhitelistInvariantStorage.sol.png (100%)
create mode 100644 doc/schema/surya/surya_inheritance/surya_inheritance_RulesManagementModule.sol.png
create mode 100644 doc/schema/surya/surya_inheritance/surya_inheritance_RulesManagementModuleInvariantStorage.sol.png
create mode 100644 doc/schema/surya/surya_inheritance/surya_inheritance_VersionModule.sol.png
rename doc/{surya/surya_report/surya_report_IRuleEngineOperation.sol.md => schema/surya/surya_report/surya_report_ERC3643ComplianceModule.sol.md} (52%)
create mode 100644 doc/schema/surya/surya_report/surya_report_IERC3643Compliance.sol.md
rename doc/{surya/surya_report/surya_report_IRuleValidation.sol.md => schema/surya/surya_report/surya_report_IRule.sol.md} (83%)
create mode 100644 doc/schema/surya/surya_report/surya_report_IRulesManagementModule.sol.md
rename doc/{ => schema}/surya/surya_report/surya_report_MetaTxModuleStandalone.sol.md (89%)
rename doc/{ => schema}/surya/surya_report/surya_report_RuleAddressList.sol.md (92%)
rename doc/{ => schema}/surya/surya_report/surya_report_RuleAddressListInternal.sol.md (88%)
rename doc/{ => schema}/surya/surya_report/surya_report_RuleAddressListInvariantStorage.sol.md (81%)
rename doc/{ => schema}/surya/surya_report/surya_report_RuleBlacklistInvariantStorage.sol.md (82%)
rename doc/{ => schema}/surya/surya_report/surya_report_RuleCommonInvariantStorage.sol.md (85%)
rename doc/{surya/surya_report/surya_report_RuleSanctionList.sol.md => schema/surya/surya_report/surya_report_RuleConditionalTransferLight.sol.md} (53%)
rename doc/{surya/surya_report/surya_report_RuleConditionalTransferInvariantStorage.sol.md => schema/surya/surya_report/surya_report_RuleConditionalTransferLightInvariantStorage.sol.md} (72%)
rename doc/{surya/surya_report/surya_report_RuleWhitelistWrapper.sol.md => schema/surya/surya_report/surya_report_RuleEngine.sol.md} (71%)
create mode 100644 doc/schema/surya/surya_report/surya_report_RuleEngineBase.sol.md
rename doc/{ => schema}/surya/surya_report/surya_report_RuleEngineInvariantStorage.sol.md (87%)
rename doc/{surya/surya_report/surya_report_RuleBlacklist.sol.md => schema/surya/surya_report/surya_report_RuleOperationRevert.sol.md} (62%)
rename doc/{ => schema}/surya/surya_report/surya_report_RuleWhitelist.sol.md (68%)
rename doc/{ => schema}/surya/surya_report/surya_report_RuleWhitelistCommon.sol.md (78%)
rename doc/{ => schema}/surya/surya_report/surya_report_RuleWhitelistInvariantStorage.sol.md (82%)
create mode 100644 doc/schema/surya/surya_report/surya_report_RulesManagementModule.sol.md
rename doc/{surya/surya_report/surya_report_IRuleOperation.sol.md => schema/surya/surya_report/surya_report_RulesManagementModuleInvariantStorage.sol.md} (76%)
rename doc/{surya/surya_report/surya_report_RuleSanctionListInvariantStorage.sol.md => schema/surya/surya_report/surya_report_VersionModule.sol.md} (74%)
create mode 100644 doc/schema/vscode-uml/ERC3643ComplianceModuleUML.png
create mode 100644 doc/schema/vscode-uml/IERC1404ExtendUML.png
create mode 100644 doc/schema/vscode-uml/IERC1404UML.png
create mode 100644 doc/schema/vscode-uml/IERC3643ComplianceReadUML.png
create mode 100644 doc/schema/vscode-uml/IERC3643IComplianceContractUML.png
create mode 100644 doc/schema/vscode-uml/IERC7551ComplianceUML.png
create mode 100644 doc/schema/vscode-uml/IRuleEngineUML.png
create mode 100644 doc/schema/vscode-uml/RuleEngineBaseUML.png
create mode 100644 doc/schema/vscode-uml/RuleEngineUML.png
create mode 100644 doc/schema/vscode-uml/RuleManagementModuleUML.png
create mode 100644 doc/schema/vscode-uml/VersionModuleUML.png
delete mode 100644 doc/security/accessControl/access-control-RuleSanctionList.drawio.png
delete mode 100644 doc/security/accessControl/access-control-RuleWhitelist.png
create mode 100644 doc/security/audits/tools/aderyn-report.md
delete mode 100644 doc/surya/surya_graph/surya_graph_IRuleEngineOperation.sol.png
delete mode 100644 doc/surya/surya_graph/surya_graph_IRuleEngineValidation.sol.png
delete mode 100644 doc/surya/surya_graph/surya_graph_IRuleOperation.sol.png
delete mode 100644 doc/surya/surya_graph/surya_graph_IRuleValidation.sol.png
delete mode 100644 doc/surya/surya_graph/surya_graph_RuleBlacklist.sol.png
delete mode 100644 doc/surya/surya_graph/surya_graph_RuleConditionalTransfer.sol.png
delete mode 100644 doc/surya/surya_graph/surya_graph_RuleConditionalTransferOperator.sol.png
delete mode 100644 doc/surya/surya_graph/surya_graph_RuleEngine.sol.png
delete mode 100644 doc/surya/surya_graph/surya_graph_RuleEngineOperation.sol.png
delete mode 100644 doc/surya/surya_graph/surya_graph_RuleEngineValidation.sol.png
delete mode 100644 doc/surya/surya_graph/surya_graph_RuleEngineValidationCommon.sol.png
delete mode 100644 doc/surya/surya_graph/surya_graph_RuleInternal.sol.png
delete mode 100644 doc/surya/surya_graph/surya_graph_RuleSanctionList.sol.png
delete mode 100644 doc/surya/surya_graph/surya_graph_RuleValidateTransfer.sol.png
delete mode 100644 doc/surya/surya_graph/surya_graph_RuleWhitelist.sol.png
delete mode 100644 doc/surya/surya_graph/surya_graph_RuleWhitelistWrapper.sol.png
delete mode 100644 doc/surya/surya_inheritance/surya_inheritance_IRuleEngineOperation.sol.png
delete mode 100644 doc/surya/surya_inheritance/surya_inheritance_IRuleEngineValidation.sol.png
delete mode 100644 doc/surya/surya_inheritance/surya_inheritance_IRuleOperation.sol.png
delete mode 100644 doc/surya/surya_inheritance/surya_inheritance_IRuleValidation.sol.png
delete mode 100644 doc/surya/surya_inheritance/surya_inheritance_RuleBlacklist.sol.png
delete mode 100644 doc/surya/surya_inheritance/surya_inheritance_RuleConditionalTransfer.sol.png
delete mode 100644 doc/surya/surya_inheritance/surya_inheritance_RuleConditionalTransferInvariantStorage.sol.png
delete mode 100644 doc/surya/surya_inheritance/surya_inheritance_RuleConditionalTransferOperator.sol.png
delete mode 100644 doc/surya/surya_inheritance/surya_inheritance_RuleEngine.sol.png
delete mode 100644 doc/surya/surya_inheritance/surya_inheritance_RuleEngineOperation.sol.png
delete mode 100644 doc/surya/surya_inheritance/surya_inheritance_RuleEngineValidation.sol.png
delete mode 100644 doc/surya/surya_inheritance/surya_inheritance_RuleEngineValidationCommon.sol.png
delete mode 100644 doc/surya/surya_inheritance/surya_inheritance_RuleInternal.sol.png
delete mode 100644 doc/surya/surya_inheritance/surya_inheritance_RuleSanctionList.sol.png
delete mode 100644 doc/surya/surya_inheritance/surya_inheritance_RuleSanctionListInvariantStorage.sol.png
delete mode 100644 doc/surya/surya_inheritance/surya_inheritance_RuleValidateTransfer.sol.png
delete mode 100644 doc/surya/surya_inheritance/surya_inheritance_RuleWhitelistCommon.sol.png
delete mode 100644 doc/surya/surya_inheritance/surya_inheritance_RuleWhitelistWrapper.sol.png
delete mode 100644 doc/surya/surya_report/surya_report_IRuleEngineValidation.sol.md
delete mode 100644 doc/surya/surya_report/surya_report_RuleConditionalTransfer.sol.md
delete mode 100644 doc/surya/surya_report/surya_report_RuleConditionalTransferOperator.sol.md
delete mode 100644 doc/surya/surya_report/surya_report_RuleEngine.sol.md
delete mode 100644 doc/surya/surya_report/surya_report_RuleEngineOperation.sol.md
delete mode 100644 doc/surya/surya_report/surya_report_RuleEngineValidation.sol.md
delete mode 100644 doc/surya/surya_report/surya_report_RuleEngineValidationCommon.sol.md
delete mode 100644 doc/surya/surya_report/surya_report_RuleInternal.sol.md
delete mode 100644 doc/surya/surya_report/surya_report_RuleValidateTransfer.sol.md
delete mode 100644 doc/technical/RuleBlacklist.md
delete mode 100644 doc/technical/RuleConditionalTransfer.md
delete mode 100644 doc/technical/RuleEngine.md
delete mode 100644 doc/technical/RuleSanctionList.md
delete mode 100644 doc/technical/RuleWhitelist.md
delete mode 100644 doc/technical/RuleWhitelistWrapper.md
create mode 100644 src/interfaces/IRule.sol
delete mode 100644 src/interfaces/IRuleEngineOperation.sol
delete mode 100644 src/interfaces/IRuleEngineValidation.sol
delete mode 100644 src/interfaces/IRuleOperation.sol
delete mode 100644 src/interfaces/IRuleValidation.sol
create mode 100644 src/interfaces/IRulesManagementModule.sol
delete mode 100644 src/mocks/rules/validation/abstract/RuleSanctionListInvariantStorage.sol
delete mode 100644 src/mocks/rules/validation/abstract/RuleValidateTransfer.sol
rename src/modules/{ERC3643Compliance.sol => ERC3643ComplianceModule.sol} (79%)
delete mode 100644 src/modules/RuleEngineOperation.sol
delete mode 100644 src/modules/RuleEngineValidation.sol
delete mode 100644 src/modules/RuleEngineValidationRead.sol
create mode 100644 src/modules/RulesManagementModule.sol
rename src/modules/{RuleEngineBaseModule.sol => VersionModule.sol} (92%)
delete mode 100644 src/modules/library/RuleEngineInvariantStorageCommon.sol
create mode 100644 src/modules/library/RulesManagementModuleInvariantStorage.sol
rename test/RuleEngine/{ruleEngineOperation => RulesManagementModuleTest}/CMTATIntegration.t.sol (96%)
rename test/RuleEngine/{ruleEngineOperation => RulesManagementModuleTest}/RuleEngineOperation.t.sol (61%)
rename test/RuleEngine/{ruleEngineOperation => RulesManagementModuleTest}/RuleEngineOperationRevert.t.sol (91%)
rename test/RuleEngine/{ruleEngineOperation => RulesManagementModuleTest}/RuleEngineRestriction.t.sol (94%)
rename test/RuleEngine/ruleEngineValidation/{RuleEngineRestriction.t.sol => RuleEngineRestriction.sol} (87%)
rename test/RuleEngine/ruleEngineValidation/{RuleEngineValidation.t.sol => RuleEngineValidation.sol} (58%)
diff --git a/README.md b/README.md
index 496859c..4e8fef1 100644
--- a/README.md
+++ b/README.md
@@ -6,9 +6,13 @@ This repository includes the RuleEngine contract for [CMTAT](https://github.com/
The RuleEngine is an external contract used to apply transfer restrictions to another contract, such as CMTAT and ERC-3643 tokens. Acting as a controller, it can call different contract rules and apply these rules on each transfer.
+[TOC]
+
+
+
## Motivation
-Why use a dedicated contract with rules instead of implementing it directly in CMTAT or ERC-3643 tokens?
+- Why use a dedicated contract with rules instead of implementing it directly in CMTAT or [ERC-3643](https://eips.ethereum.org/EIPS/eip-3643) tokens?
1. Flexibility: These different features are not standard and common to all tokens. From an implementation perspective, using a rule engine with custom rules allows for each issuer or contract user to decide which rules to apply.
2. Code efficiency: The CMTAT token (and generally also all ERC-3643 tokens) is currently "heavy," meaning its contract code size is close to the maximum limit. This makes it challenging to add new features directly inside the CMTAT contract.
@@ -18,59 +22,96 @@ Why use a dedicated contract with rules instead of implementing it directly in C
## How it works
-This diagram illustrates how a transfer of CMTAT with a RuleEngine works:
+This diagram illustrates how a transfer with a CMTAT or ERC-3643 token with a RuleEngine works:
+
+
+
+
+
+1. The token holders initiate a transfer transaction on the token contract.
+2. The transfer function inside the token calls the ERC-3643 function `transferred` from the RuleEngine with the following parameters inside: `from, to, value`.
+3. The Rule Engine calls each rule separately. If the transfer is not authorized by the rule, the rule must directly revert (no return value).
+
+### How to set it
+
+#### CMTAT v3.0.0
+
+CMTAT provides the following function to set a RuleEngine inside a CMTAT token:
+
+```solidity
+ setRuleEngine(IRuleEngine ruleEngine_)
+```
+
+This function is defined in the extension module `ValidationModuleRuleEngine`
+
+### ERC-3643 token
+
+[ERC-3643](https://eips.ethereum.org/EIPS/eip-3643) defined the following function in the standard interface to set a compliance contract
+
+```solidity
+setCompliance(address _compliance)
+```
- 
-1. The token holders initiate a transfer transaction on CMTAT contract.
-2. The validation module inside the CMTAT calls the ERC-3643 function `transferred` from the RuleEngine if set with the following parameters inside: `from, to, value`.
-3. The Rule Engine calls each rule separately.
-4. If the rule returns the value 0, the RuleEngine considers the transfer authorized. If one rule returns a different value, the RuleEngine considers the transfer as not authorized and the transaction is directly reverted (no return value) stopping the transfer.
## How to include it
While the RuleEngine has been designed for CMTAT and ERC-3643 tokens, it can be used with other contracts to apply transfer restrictions.
-For that, the only thing to do is to import in your contract the interface `IRuleEngine`(CMTAT) or `IERC3643Compliance`(ERC-3643), which declares the corresponding functions to call by the token contract. This interface can be found [here](https://github.com/CMTA/CMTAT/blob/23a1e59f913d079d0c09d32fafbd95ab2d426093/contracts/interfaces/engine/IRuleEngine.sol).
+For that, the only thing to do is to import in your contract the interface `IRuleEngine`(CMTAT) or `IERC3643Compliance` (ERC-3643), which declares the corresponding functions to call by the token contract. This interface can be found [here](https://github.com/CMTA/CMTAT/blob/23a1e59f913d079d0c09d32fafbd95ab2d426093/contracts/interfaces/engine/IRuleEngine.sol).
-### CMTAT
+### Like CMTAT
-Before each transfer, the CMTAT calls the function `transferred` which is the entrypoint for the RuleEngine.
+Before each ERC-20 transfer, the CMTAT calls the function `transferred` which is the entrypoint for the RuleEngine.
+
+```solidity
+function transferred(address from,address to,uint256 value)
+```
+
+If you want to apply restriction on the spender address, you have to call the `transferred` function which takes the spender argument in your ERC-20 function `transferFrom`.
+
+```solidity
+function transferred(address spender,address from,address to,uint256 value)
+```
For example, CMTAT defines the interaction with the RuleEngine inside a specific module, [ValidationModuleRuleEngine](https://github.com/CMTA/CMTAT/blob/master/contracts/modules/wrapper/extensions/ValidationModule/ValidationModuleRuleEngine.sol) and [CMTATBaseRuleEngine](https://github.com/CMTA/CMTAT/blob/master/contracts/modules/1_CMTATBaseRuleEngine.sol).
- ValidationModuleRuleEngine
+
+
+
- CMTATBaseRuleEngine
-
+
This function `_transferred` is called before each transfer/burn/mint through the internal function `_checkTransferred` defined in [CMTAT_BASE](https://github.com/CMTA/CMTAT/blob/23a1e59f913d079d0c09d32fafbd95ab2d426093/contracts/modules/CMTAT_BASE.sol#L198).
-### ERC-3643
+### Like ERC-3643
The ERC-3643 defines several functions used as entrypoint for an ERC-3643 token.
-They are the following
+They are the following:
```solidity
- // compliance check and state update
- function canTransfer(address from, address to, uint256 value) external view returns (bool);
- function transferred(address from, address to, uint256 value) external;
- function created(address to, uint256 value) external;
- function destroyed(address from, uint256 value) external;
+// read-only function
+function canTransfer(address from, address to, uint256 value) external view returns (bool);
+// ERC-20 transfer
+function transferred(address from, address to, uint256 value) external;
+// mint
+function created(address to, uint256 value) external;
+// burn
+function destroyed(address from, uint256 value) external;
```
## Interface
### CMTAT
-The RuleEngine base interface is defined in CMTAT repository.
-
-
-
-It inherits from several others interace:
+The `RuleEngine` base interface is defined in CMTAT repository.
+
+It inherits from several others interface: `IERC1404Extend`, `IERC7551Compliance`, `IERC3643ComplianceContract`
```solidity
// IRuleEngine
@@ -121,13 +162,20 @@ The [ERC-3643](https://eips.ethereum.org/EIPS/eip-3643) compliance interface is
+A specific module implements this interface for the RuleEngine: [ERC3643Compliance.sol](src/modules/ERC3643Compliance.sol)
+
+## Technical
+### Dependencies
-A specific module implements this interface for the RuleEngine: [ERC3643Compliance.sol](src/modules/ERC3643Compliance.sol)
-
+The toolchain includes the following components, where the versions are the latest ones that we tested:
+- Foundry (forge-std) [v1.10.0](https://github.com/foundry-rs/forge-std/releases/tag/v1.10.0)
+- Solidity [0.8.30](https://docs.soliditylang.org/en/v0.8.30/) (via solc-js)
+- OpenZeppelin Contracts (submodule) [v5.4.0](https://github.com/OpenZeppelin/openzeppelin-contracts/releases/tag/v5.4.0)
+- CMTAT [v3.0.0-rc7](https://github.com/CMTA/CMTAT/releases/tag/v3.0.0-rc7)
@@ -147,12 +195,25 @@ See also [docs.openzeppelin.com - AccessControl](https://docs.openzeppelin.com/c
Here is the list of roles and their 32 bytes identifier.
-| | Defined in | 32 bytes identifier |
-| ------------------------- | -------------------------------- | ------------------------------------------------------------ |
-| DEFAULT_ADMIN_ROLE | OpenZeppelin
AccessControl | 0x0000000000000000000000000000000000000000000000000000000000000000 |
-| **Modules** | | |
-| COMPLIANCE_MANAGER_ROLE | ERC3643Compliance | |
-| RULE_ENGINE_OPERATOR_ROLE | RuleEngineInvariantStorageCommon | |
+The default admin is the address put in argument(`admin`) inside the constructor.
+
+It is set in the constructor when the contract is deployed.
+
+| | Defined in | 32 bytes identifier |
+| ----------------------- | -------------------------------- | ------------------------------------------------------------ |
+| DEFAULT_ADMIN_ROLE | OpenZeppelin
AccessControl | 0x0000000000000000000000000000000000000000000000000000000000000000 |
+| **Modules** | | |
+| COMPLIANCE_MANAGER_ROLE | ERC3643Compliance | e5c50d0927e06141e032cb9a67e1d7092dc85c0b0825191f7e1cede600028568 |
+| RULES_MANAGEMENT_ROLE | RuleEngineInvariantStorageCommon | ea5f4eb72290e50c32abd6c23e45de3d8300b3286e1cbc2e293114b92e034e5e |
+
+
+
+#### Schema
+
+Here a schema of the Access Control.
+
+
+
@@ -164,108 +225,628 @@ For function signatures, struct arguments are represented with their correspond
| | Function signature | Visibility [public/external] | Input variables (Function arguments) | Output variables
(return value) | Role Required |
| -------------------- | ------------------ | ---------------------------- | ------------------------------------ | ------------------------------------ | ------------- |
| **Modules** | | | | | |
-| RuleEngineOperation | | | | | |
-| | `` | public | `` | - | |
-| | `` | public | `` | - | |
-| RuleEngineValidation | | | | | |
-
-## Dependencies
+| RulesManagementModule | | | | | |
+| | `setRules(address[] rules_)` | public | `IRule[] rules_` | - | RULES_MANAGEMENT_ROLE |
+| | `clearRules()` | public | - |-|RULES_MANAGEMENT_ROLE|
+| | `addRule(address rule_)` | public | `IRule rule_` |-|RULES_MANAGEMENT_ROLE|
+| | `removeRule(address rule_)` | public | `IRule rule_` |-|RULES_MANAGEMENT_ROLE|
+| ERC3643ComplianceModule | | | | | |
+| | `bindToken(address token)` | public | `address token` | - | COMPLIANCE_MANAGER_ROLE |
+| | `unbindToken(address token)` | public | `address token` | - | COMPLIANCE_MANAGER_ROLE |
+| RuleEngineBase | | | | | |
+| | `transferred(address from,address to,uint256 value)` | public | `address from,address to, uint256 value` | - | onlyBoundToken (modifier) |
+| | `transferred(address spender,address from,address to,uint256 value)` | public | `address spender,address from,address to, uint256 value` | - | onlyBoundToken (modifier) |
-The toolchain includes the following components, where the versions are the latest ones that we tested:
-
-- Foundry [v1.9.4](https://github.com/foundry-rs/forge-std/releases/tag/v1.9.4)
-- Solidity 0.8.30 (via solc-js)
-- OpenZeppelin Contracts (submodule) [v5.3.0](https://github.com/OpenZeppelin/openzeppelin-contracts/releases/tag/v5.3.0)
-- CMTAT [v3.0.0](https://github.com/CMTA/CMTAT/releases/tag/v3.0.0)
-## How to include it
-While it has been designed for the CMTAT, the ruleEngine can be used with others contracts to apply restriction on transfer.
-
-For that, the only thing to do is to import in your contract the interface `IRuleEngine` which declares the function `operateOnTransfer`
+### UML
-This interface can be found in [CMTAT/[...]/IRuleEngine.sol](https://github.com/CMTA/CMTAT/blob/23a1e59f913d079d0c09d32fafbd95ab2d426093/contracts/interfaces/engine/IRuleEngine.sol)
+
-Before each transfer, your contract must call the function `operateOnTransfer` which is the entrypoint for the RuleEngine.
-## Schema
-
-### UML
-#### Global
+### Graph
-> npm run-script uml
->
-> No longer works, generate the following error: RangeError: Maximum call stack size exceeded
-
+
+## Functionality
-#### RuleEngine
+Several functionalities are not implemented because it makes more sense to directly implement them in the token smart contract
-> npm run-script uml:ruleEngine
->
-> No longer works, instead:
->
-> forge flatten src/RuleEngine.sol -o RuleEngine.sol
->
-> npx sol2uml class RuleEngine.sol
+The RuleEngine can be removed from the main token contract by calling these dedicated functions
-
+- CMTAT v3.0.0: `setRuleEngine(address ruleEngine)`
+- ERC-3643 token: `setCompliance(address _compliance)`
-## Available Rules
+### Available Rules
Rules have their own dedicated repository: [github.com/CMTA/Rules](https://github.com/CMTA/Rules)
The following rules are available:
-| Rule | Type
[Validation/Operation] | Audit planned | Description | Doc |
-| ------------------------------------------------------------ | -------------------------------- | --------------------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
-| [RuleWhitelist](src/rules/validation/RuleWhitelist.sol) | RuleValidation | ☑ | This rule can be used to restrict transfers from/to only addresses inside a whitelist. | [RuleWhitelist.md](./doc/technical/RuleWhitelist.md)
[surya-report](./doc/surya/surya_report/surya_report_RuleWhitelist.sol.md) |
-| [RuleWhitelistWrapper](src/rules/validation/RuleWhitelistWrapper.sol) | RuleValidation | ☑ | This rule can be used to restrict transfers from/to only addresses inside a group of whitelist rules managed by different operators. | [RuleWhitelistWrapper.md](./doc/technical/RuleWhitelistWrapper.md)
[surya-report](./doc/surya/surya_report/surya_report_RuleWhitelistWrapper.sol.md) |
-| [RuleBlacklist](src/rules/validation/RuleBlacklist.sol) | RuleValidation | ☑ | This rule can be used to forbid transfer from/to addresses in the blacklist | [RuleBlacklist.md](./doc/technical/RuleBlacklist.md)
[surya-report](./doc/surya/surya_report/surya_report_RuleBlacklist.sol.md) |
-| [RuleSanctionList](src/rules/validation/RuleSanctionList.sol) | RuleValidation | ☑ | The purpose of this contract is to use the oracle contract from Chainalysis to forbid transfer from/to an address included in a sanctions designation (US, EU, or UN). | [RuleSanctionList.md](./doc/technical/RuleSanctionList.md)
[surya-report](./doc/surya/surya_report/surya_report_RuleSanctionList.sol.md) |
-| [RuleConditionalTransfer](src/rules/operation/RuleConditionalTransfer.sol) | RuleOperation | ☒
(experimental rule) | This page describes a Conditional Transfer implementation. This rule requires that transfers have to be approved before being executed by the token holders. | [RuleConditionalTransfer.md](./doc/technical/RuleConditionalTransfer.md)
[surya-report](./doc/surya/surya_report/surya_report_RuleConditionalTransfer.sol.md) |
+| Rule | Type
[ready-only / read-write] | Audit planned | Description |
+| ----------------------- | ----------------------------------- | --------------------------------- | ------------------------------------------------------------ |
+| RuleWhitelist | Ready-only | ☑ | This rule can be used to restrict transfers from/to only addresses inside a whitelist. |
+| RuleWhitelistWrapper | Ready-only | ☑ | This rule can be used to restrict transfers from/to only addresses inside a group of whitelist rules managed by different operators. |
+| RuleBlacklist | Ready-only | ☑ | This rule can be used to forbid transfer from/to addresses in the blacklist |
+| RuleSanctionList | Ready-only | ☑ | The purpose of this contract is to use the oracle contract from Chainalysis to forbid transfer from/to an address included in a sanctions designation (US, EU, or UN). |
+| RuleConditionalTransfer | Ready-Write | ☒
(experimental rule) | This rule requires that transfers have to be approved before being executed by the token holders. |
+### Gasless support (ERC-2771)
+The RuleEngine contracts and the other rules support client-side gasless transactions using the [Gas Station Network](https://docs.opengsn.org/#the-problem) (GSN) pattern, the main open standard for transfering fee payment to another account than that of the transaction issuer. The contract uses the OpenZeppelin contract `ERC2771Context`, which allows a contract to get the original client with `_msgSender()` instead of the fee payer given by `msg.sender` .
-## Functionality
+At deployment, the parameter `forwarder` inside the contract constructor has to be set with the defined address of the forwarder. Please note that the forwarder can not be changed after deployment.
+
+Please see the OpenGSN [documentation](https://docs.opengsn.org/contracts/#receiving-a-relayed-call) for more details on what is done to support GSN in the contract.
### Upgradeable
-The Rule Engine and the other rules are not upgradeable. The reason is the following:
-If we need a new on, we just issue a new one, and set inside the CMTAT token (or the RuleEngine for the rules) to use the new.
+A proxy architecture (upgradeable) increases the code complexity as well as the runtime gas cost for each transaction. This is why the RuleEngine is not upgradeable.
-### Urgency mechanism
+Moreover, in a proxy architecture, each new implementation must be compatible (storage) with the precedent implementation, which can reduce the ability to improve the code.
-### Pause
+In case you use the same RuleEngine for several different tokens, unfortunately, you will have to update the address of the RuleEngine set in each token contract separately.
-There are no functionalities to put in pause the contracts.
+### Urgency mechanism
-The RuleEngine can be removed from the main token contract by calling the dedicated function
+#### Pause
-- CMTAT v3.0.0: `setRuleEngine(address ruleEngine)`
-- ERC-3643 token: `setCompliance(address _compliance)`
+There are no functionalities to put in pause the RuleEngine.
+
+The RuleEngine can be removed from the main token contract by calling the dedicated functions to manage the RuleEngine
-### Kill / Deactivate the contracts
+#### Kill / Deactivate the contracts
There are no functionalities to kill/deactivate the contracts.
-Similar to the pause functionality, the RuleEngine can be directly removed from the main token contract
+Similar to the pause functionality, the RuleEngine can be directly removed from the main token contract.
+## Ethereum API
-### Gasless support (ERC-2771)
+### RuleEngineBase
-The RuleEngine contracts and the other rules support client-side gasless transactions using the [Gas Station Network](https://docs.opengsn.org/#the-problem) (GSN) pattern, the main open standard for transfering fee payment to another account than that of the transaction issuer. The contract uses the OpenZeppelin contract `ERC2771Context`, which allows a contract to get the original client with `_msgSender()` instead of the fee payer given by `msg.sender` .
+
-At deployment, the parameter `forwarder` inside the contract constructor has to be set with the defined address of the forwarder. Please note that the forwarder can not be changed after deployment.
+#### IRuleEngine
+
+
+
+##### transferred(address spender, address from, address to, uint256 value)
+
+Function called whenever tokens are transferred from one wallet to another.
+
+Must revert if the transfer is invalid.
+ Same name as ERC-3643 but with an additional `spender` parameter.
+ This function can be used to update state variables of the RuleEngine contract.
+ Can only be called by the token contract bound to the RuleEngine.
+
+**Input Parameters:**
+
+| Name | Type | Description |
+| ------- | ------- | ---------------------------------------------- |
+| spender | address | The spender address initiating the transfer. |
+| from | address | The token holder address. |
+| to | address | The receiver address. |
+| value | uint256 | The amount of tokens involved in the transfer. |
+
+#### IERC7551Compliance
+
+
+
+##### canTransferFrom(address spender, address from, address to, uint256 value) -> bool
+
+Checks if `spender` can transfer `value` tokens from `from` to `to` under compliance rules.
+
+Does not check balances or access rights (Access Control).
+
+**Input Parameters:**
+
+| Name | Type | Description |
+| ------- | ------- | ------------------------------------ |
+| spender | address | The address performing the transfer. |
+| from | address | The source address. |
+| to | address | The destination address. |
+| value | uint256 | The number of tokens to transfer. |
+
+
+
+**Return Values:**
+
+| Type | Description |
+| ---- | ------------------------------------------ |
+| bool | True if the transfer complies with policy. |
+
+#### IERC3643ComplianceRead
+
+
+
+------
+
+##### canTransfer(address from, address to, uint256 value) -> bool
+
+Returns true if the transfer is valid, and false otherwise.
+
+Does not check balances or access rights (Access Control).
+
+**Input Parameters:**
+
+| Name | Type | Description |
+| ----- | ------- | --------------------------------- |
+| from | address | The source address. |
+| to | address | The destination address. |
+| value | uint256 | The number of tokens to transfer. |
+
+
+
+**Return Values:**
+
+| Type | Description |
+| ---- | ----------------------------------------------- |
+| bool | True if the transfer is valid, false otherwise. |
+
+#### IERC3643IComplianceContract
+
+
+
+------
+
+##### transferred(address from, address to, uint256 value)
+
+Updates the compliance contract state whenever tokens are transferred.
+
+Can only be called by the token contract bound to this compliance logic.
+ This function can be used to update internal state variables.
+
+**Input Parameters:**
+
+| Name | Type | Description |
+| ----- | ------- | ---------------------------------------------- |
+| from | address | The address of the sender. |
+| to | address | The address of the receiver. |
+| value | uint256 | The number of tokens involved in the transfer. |
+
+#### IERC1404
+
+
+
+------
+
+##### detectTransferRestriction(address from, address to, uint256 value) -> uint8
+
+Returns a uint8 code to indicate if a transfer is restricted or not.
+
+Implements the restriction logic of {ERC-1404}.
+ Examples of restriction logic include:
+
+- checking if the recipient is whitelisted,
+- checking if the sender’s tokens are frozen during a lock-up period, etc.
+
+**Input Parameters:**
+
+| Name | Type | Description |
+| ----- | ------- | --------------------------------- |
+| from | address | The source address. |
+| to | address | The destination address. |
+| value | uint256 | The number of tokens to transfer. |
+
+
+
+**Return Values:**
+
+| Type | Description |
+| ----- | ------------------------------------------------------ |
+| uint8 | Restriction code (0 means the transfer is authorized). |
+
+
+
+------
+
+##### messageForTransferRestriction(uint8 restrictionCode) -> string
+
+Returns a human-readable explanation for a transfer restriction code.
+
+Implements {ERC-1404} standard message accessor.
+
+**Input Parameters:**
+
+| Name | Type | Description |
+| --------------- | ----- | ---------------------------------- |
+| restrictionCode | uint8 | The restriction code to interpret. |
+
+
+
+**Return Values:**
+
+| Type | Description |
+| ------ | ---------------------------------------------------- |
+| string | A message describing why the transfer is restricted. |
+
+
+
+------
+
+#### IERC1404Extend
+
+
+
+##### enum REJECTED_CODE_BASE
+
+Error codes for transfer restrictions.
+ Codes `6–9` are reserved for future CMTAT ruleEngine extensions.
+
+| Name | Value | Description |
+| -------------------------------------------------- | ----- | ------------------------------------------------------------ |
+| TRANSFER_OK | 0 | Transfer authorized. |
+| TRANSFER_REJECTED_PAUSED | 1 | Transfer rejected because the token is paused. |
+| TRANSFER_REJECTED_FROM_FROZEN | 2 | Transfer rejected because the sender’s address is frozen. |
+| TRANSFER_REJECTED_TO_FROZEN | 3 | Transfer rejected because the recipient’s address is frozen. |
+| TRANSFER_REJECTED_SPENDER_FROZEN | 4 | Transfer rejected because the spender’s address is frozen. |
+| TRANSFER_REJECTED_FROM_INSUFFICIENT_ACTIVE_BALANCE | 5 | Transfer rejected because the sender does not have enough active (unfrozen) balance. |
+
+
+
+------
+
+##### detectTransferRestrictionFrom(address spender, address from, address to, uint256 value) -> uint8
+
+Returns a uint8 code to indicate if a transfer is restricted or not.
+
+This is an extension of {ERC-1404} with an additional `spender` parameter to enforce restriction logic on delegated transfers.
+ Examples of restriction logic include:
+
+- verifying if the recipient is whitelisted,
+- verifying if tokens are locked for either sender or spender, etc.
+
+**Input Parameters:**
+
+| Name | Type | Description |
+| ------- | ------- | ------------------------------------------------------------ |
+| spender | address | The address initiating the transfer (for delegated transfers). |
+| from | address | The source address. |
+| to | address | The destination address. |
+| value | uint256 | The number of tokens to transfer. |
+
+
+
+**Return Values:**
+
+| Type | Description |
+| ----- | ------------------------------------------------------ |
+| uint8 | Restriction code (0 means the transfer is authorized). |
+
+
+
+------
+
+### VersionModule
+
+
+
+#### version()
+
+```solidity
+function version() external view returns (string memory version_);
+```
+
+```solidity
+function version()
+public view virtual override(IERC3643Base)
+returns (string memory version_)
+```
+
+ **Description**
+
+Returns the current version of the token contract.
+Useful for identifying which version of the smart contract is deployed and in use.
+
+**Return**
+
+| Name | Type | Description |
+| ---------- | ------ | ------------------------------------------------------------ |
+| `version_` | string | The version string of the token implementation (e.g., "1.0.0"). |
-Please see the OpenGSN [documentation](https://docs.opengsn.org/contracts/#receiving-a-relayed-call) for more details on what is done to support GSN in the contract.
+
+
+### ERC3643ComplianceModule
+
+
+
+#### Events
+
+##### TokenBound(address token)
+
+Emitted when a token is successfully bound to the compliance contract.
+
+**Event Parameters:**
+
+| Name | Type | Description |
+| ----- | ------- | ---------------------------------------- |
+| token | address | The address of the token that was bound. |
+
+
+
+------
+
+##### TokenUnbound(address token)
+
+Emitted when a token is successfully unbound from the compliance contract.
+
+**Event Parameters:**
+
+| Name | Type | Description |
+| ----- | ------- | ------------------------------------------ |
+| token | address | The address of the token that was unbound. |
+
+
+
+------
+
+#### Functions
+
+##### bindToken(address token)
+
+Associates a token contract with this compliance contract.
+
+The compliance contract may restrict operations on the bound token according to its internal compliance logic.
+ Reverts if the token is already bound.
+
+**Input Parameters:**
+
+| Name | Type | Description |
+| ----- | ------- | --------------------------------- |
+| token | address | The address of the token to bind. |
+
+
+
+------
+
+##### unbindToken(address token)
+
+Removes the association of a token contract from this compliance contract.
+
+Reverts if the token is not currently bound.
+
+**Input Parameters:**
+
+| Name | Type | Description |
+| ----- | ------- | ----------------------------------- |
+| token | address | The address of the token to unbind. |
+
+
+
+------
+
+##### isTokenBound(address token) -> bool
+
+Checks whether a token is currently bound to this compliance contract.
+
+**Input Parameters:**
+
+| Name | Type | Description |
+| ----- | ------- | ---------------------------- |
+| token | address | The token address to verify. |
+
+
+
+**Return Values:**
+
+| Type | Description |
+| ---- | -------------------------------------------- |
+| bool | True if the token is bound, false otherwise. |
+
+
+
+------
+
+##### getTokenBound() -> address
+
+Returns the single token currently bound to this compliance contract.
+
+If multiple tokens are supported, consider using `getTokenBounds()`.
+
+**Return Values:**
+
+| Type | Description |
+| ------- | ----------------------------------------- |
+| address | The address of the currently bound token. |
+
+
+
+------
+
+##### getTokenBounds() -> address[]
+
+Returns all tokens currently bound to this compliance contract.
+
+This is a view-only function and does not modify state.
+ This function is not part of the original ERC-3643 specification.
+
+**Return Values:**
+
+| Type | Description |
+| --------- | ----------------------------------------------- |
+| address[] | An array of addresses of bound token contracts. |
+
+
+
+------
+
+##### created(address to, uint256 value)
+
+Updates the compliance contract state when tokens are created (minted).
+
+Called by the token contract when new tokens are issued to an account.
+ Reverts if the minting does not comply with the rules.
+
+**Input Parameters:**
+
+| Name | Type | Description |
+| ----- | ------- | ---------------------------------------- |
+| to | address | The address receiving the minted tokens. |
+| value | uint256 | The number of tokens created. |
+
+
+
+------
+
+##### destroyed(address from, uint256 value)
+
+Updates the compliance contract state when tokens are destroyed (burned).
+
+Called by the token contract when tokens are redeemed or burned.
+ Reverts if the burning does not comply with the rules.
+
+**Input Parameters:**
+
+| Name | Type | Description |
+| ----- | ------- | --------------------------------------------- |
+| from | address | The address whose tokens are being destroyed. |
+| value | uint256 | The number of tokens destroyed. |
+
+
+
+### RulesManagementModule
+
+
+
+#### setRules(IRule[] rules_)
+
+Defines the complete list of rules for the rule engine.
+
+Any previously configured rules are completely replaced.
+ Rules must be deployed contracts implementing the expected `IRule` interface.
+ Reverts if any rule address is zero or if duplicates are detected.
+
+**Input Parameters:**
+
+| Name | Type | Description |
+| ------ | ------- | ------------------------------------------------------------ |
+| rules_ | IRule[] | The array of IRule contracts to configure as the active rules. |
+
+
+
+------
+
+#### rulesCount() -> uint256
+
+Returns the total number of currently configured rules.
+
+Equivalent to the length of the internal rules array.
+
+**Return Values:**
+
+| Type | Description |
+| ------- | --------------------------- |
+| uint256 | The number of active rules. |
+
+
+
+------
+
+#### rule(uint256 ruleId) -> address
+
+Retrieves the rule address at a specific index.
+
+Reverts if `ruleId` is out of bounds.
+
+**Input Parameters:**
+
+| Name | Type | Description |
+| ------ | ------- | ------------------------------------------- |
+| ruleId | uint256 | The index of the desired rule in the array. |
+
+
+
+**Return Values:**
+
+| Type | Description |
+| ------- | ------------------------------------------------ |
+| address | The address of the corresponding IRule contract. |
+
+
+
+------
+
+#### rules() -> address[]
+
+Returns the full list of currently configured rules.
+
+This is a view-only function and does not modify state.
+
+**Return Values:**
+
+| Type | Description |
+| --------- | ------------------------------------------------------- |
+| address[] | An array containing all active rule contract addresses. |
+
+
+
+------
+
+#### clearRules()
+
+Removes all configured rules.
+
+After calling this function, no rules will remain set.
+
+------
+
+#### addRule(IRule rule_)
+
+Adds a new rule to the current rule set.
+
+Reverts if the rule address is zero or already exists in the set.
+
+**Input Parameters:**
+
+| Name | Type | Description |
+| ----- | ----- | -------------------------- |
+| rule_ | IRule | The IRule contract to add. |
+
+
+
+------
+
+#### removeRule(IRule rule_)
+
+Removes a specific rule from the current rule set.
+
+Reverts if the provided rule is not found or does not match the stored rule at its index.
+
+**Input Parameters:**
+
+| Name | Type | Description |
+| ----- | ----- | ----------------------------- |
+| rule_ | IRule | The IRule contract to remove. |
+
+
+
+------
+
+#### containsRule(IRule rule_) -> bool
+
+Checks whether a specific rule is currently configured.
+
+**Input Parameters:**
+
+| Name | Type | Description |
+| ----- | ----- | ------------------------------------------- |
+| rule_ | IRule | The IRule contract to check for membership. |
+
+
+
+**Return Values:**
+
+| Type | Description |
+| ---- | --------------------------------------------- |
+| bool | True if the rule is present, false otherwise. |
## Audit
@@ -285,26 +866,42 @@ The final report is available in [ABDK_CMTA_CMTATRuleEngine_v_1_0.pdf](https://g
### Tools
-You will find the report performed with [Slither](https://github.com/crytic/slither) in
+#### Slither
+
+Here is the list of report performed with [Slither](https://github.com/crytic/slither)
| Version | File |
| ------- | ------------------------------------------------------------ |
| latest | [slither-report.md](./doc/security/audits/tools/slither-report.md) |
+```bash
+slither . --checklist --filter-paths "openzeppelin-contracts|test|CMTAT|forge-std|mocks" > slither-report.md
+```
+
+#### Aderyn
+
+Here is the list of report performed with [Aderyn](https://github.com/Cyfrin/aderyn)
+
+```bash
+aderyn -x mocks --output aderyn-report.md
+```
+
+| Version | File |
+| ------- | ------------------------------------------------------------ |
+| latest | [aderyn-report.md](./doc/security/audits/tools/aderyn-report.md) |
+
## Documentation
Here a summary of the main documentation
-| Document | Link/Files |
-| ----------------------- | ---------------------------------------------------- |
-| Technical documentation | [doc/technical/](./doc/technical/) |
-| Toolchain | [doc/TOOLCHAIN.md](./doc/TOOLCHAIN.md) |
-| Functionalities | [doc/functionalities.pdf](./doc/functionalities.pdf) |
-| Surya report | [doc/surya](./doc/surya/) |
+| Document | Link/Files |
+| ------------ | --------------------------------------- |
+| Toolchain | [doc/TOOLCHAIN.md](./doc/TOOLCHAIN.md) |
+| Surya report | [doc/schema/surya](./doc/schema/surya/) |
-See also [Taurus - Token Transfer Management: How to Apply Restrictions with CMTAT and ERC-1404](https://www.taurushq.com/blog/token-transfer-management-how-to-apply-restrictions-with-cmtat-and-erc-1404/) (CMTAT v2.4.0)
+See also [Taurus - Token Transfer Management: How to Apply Restrictions with CMTAT and ERC-1404](https://www.taurushq.com/blog/token-transfer-management-how-to-apply-restrictions-with-cmtat-and-erc-1404/) (RuleEngine v2.02 and CMTAT v2.4.0)
## Usage
@@ -334,8 +931,6 @@ forge update
See also the command's [documentation](https://book.getfoundry.sh/reference/forge/forge-update).
-
-
### Compilation
The official documentation is available in the Foundry [website](https://book.getfoundry.sh/reference/forge/build-commands)
@@ -387,7 +982,7 @@ forge coverage --no-match-coverage "(script|mocks|test)" --report lcov && genhtm
See [Solidity Coverage in VS Code with Foundry](https://mirror.xyz/devanon.eth/RrDvKPnlD-pmpuW7hQeR5wWdVjklrpOgPCOA-PJkWFU) & [Foundry forge coverage](https://www.rareskills.io/post/foundry-forge-coverage)
### Deployment
-The official documentation is available in the Foundry [website](https://book.getfoundry.sh/reference/forge/deploy-commands)
+The official documentation is available in the Foundry [website](https://getfoundry.sh/forge/deploying)
#### Script
> This documentation has been written for the version v1.0.2
@@ -407,7 +1002,13 @@ CMTAT with RuleEngine
```bash
forge script script/CMTATWithRuleEngineScript.s.sol:CMTATWithRuleEngineScript --rpc-url=$RPC_URL --broadcast --verify -vvv
```
-Value of YOUR_RPC_URL with a local instance of anvil : [127.0.0.1:8545](http://127.0.0.1:8545)
+
+
+- Value of YOUR_RPC_URL with a local instance of anvil : [127.0.0.1:8545](http://127.0.0.1:8545)
+
+```bash
+forge script script/CMTATWithRuleEngineScript.s.sol:CMTATWithRuleEngineScript --rpc-url=127.0.0.1:8545 --broadcast --verify -vvv
+```
Only RuleEngine with a Whitelist contract
@@ -415,6 +1016,14 @@ Only RuleEngine with a Whitelist contract
forge script script/RuleEngineScript.s.sol:RuleEngineScript --rpc-url=$RPC_URL --broadcast --verify -vvv
```
+- With anvil
+
+```bash
+forge script script/RuleEngineScript.s.sol:RuleEngineScript --rpc-url=127.0.0.1:8545 --broadcast --verify -vvv
+```
+
+
+
## Intellectual property
The code is copyright (c) Capital Market and Technology Association, 2018-2024, and is released under [Mozilla Public License 2.0](https://github.com/CMTA/CMTAT/blob/master/LICENSE.md).
diff --git a/RuleEngine.sol b/RuleEngine.sol
new file mode 100644
index 0000000..96c86c2
--- /dev/null
+++ b/RuleEngine.sol
@@ -0,0 +1,4973 @@
+// SPDX-License-Identifier: MPL-2.0
+pragma solidity ^0.8.20;
+
+// lib/CMTAT/contracts/interfaces/tokenization/IERC3643Partial.sol
+
+/**
+* Note:
+* Parameter names may differ slightly from the original ERC3643 spec
+* to align with OpenZeppelin v5.3.0 naming conventions
+* (e.g., `amount` → `value`).
+*/
+
+/**
+ * @title IERC3643Pause
+ * @dev Interface for pausing and unpausing token transfers.
+ * Common interface shared between CMTAT and ERC3643 implementations.
+ *
+ */
+interface IERC3643Pause {
+ /**
+ * @notice Indicates whether the contract is currently paused.
+ * @dev When paused, token transfers are disabled.
+ * @return True if the contract is paused, false otherwise.
+ */
+ function paused() external view returns (bool);
+ /**
+ * @notice Pauses all token transfers.
+ * @dev Once paused, calls to transfer-related functions will revert.
+ * Can only be called by an account with the appropriate permission.
+ *
+ * Emits a {Paused} event.
+ */
+ function pause() external;
+
+ /**
+ * @notice Unpauses token transfers.
+ * @dev Restores normal token transfer behavior after a pause.
+ * Can only be called by an account with the appropriate permission.
+ *
+ * Emits an {Unpaused} event.
+ */
+ function unpause() external;
+}
+/**
+ * @title ERC-3643 Base Interface for ERC-20 Token Metadata
+ * @dev Provides functions to update token name and symbol.
+ */
+interface IERC3643ERC20Base {
+ /**
+ * @notice Updates the name of the token.
+ * @dev Can be used to rename the token post-deployment.
+ * @param name The new name to assign to the token.
+ */
+ function setName(string calldata name) external;
+
+ /**
+ * @notice Updates the symbol of the token.
+ * @dev Can be used to change the token's symbol (e.g. for branding or reissuance).
+ * @param symbol The new symbol to assign to the token.
+ */
+ function setSymbol(string calldata symbol) external;
+}
+
+/**
+ * @title IERC3643BatchTransfer
+ * @notice Interface for batch token transfers under the ERC-3643 standard.
+ */
+interface IERC3643BatchTransfer {
+ /**
+ * @notice Transfers tokens to multiple recipient addresses in a single transaction.
+ * @dev
+ * Batch version of `transfer`
+ * - Each recipient receives the number of tokens specified in the `values` array.
+ * Requirement:
+ * - The `tos` array must not be empty.
+ * - `tos.length` must equal `values.length`.
+ * - `tos`cannot contain a zero address
+ * - the caller must have a balance cooresponding to the total values
+ * Events:
+ * - Emits one `Transfer` event per recipient (i.e., `tos.length` total).
+ *
+ * Enforcement-specific behavior:
+ * - If `IERC3643Enforcement` is implemented:
+ * - The sender (`msg.sender`) and each recipient in `tos` MUST NOT be frozen.
+ * - If `IERC3643ERC20Enforcement` is implemented:
+ * - The total amount transferred MUST NOT exceed the sender's available (unfrozen) balance.
+ *
+ * Note: This implementation differs from the base ERC-3643 specification by returning a `bool`
+ * value for compatibility with the ERC-20 `transfer` function semantics.
+ *
+ * @param tos The list of recipient addresses.
+ * @param values The list of token amounts corresponding to each recipient.
+ * @return success_ A boolean indicating whether the batch transfer was successful.
+ */
+ function batchTransfer(address[] calldata tos,uint256[] calldata values) external returns (bool success_);
+}
+
+/**
+ * @title IERC3643Base
+ * @notice Interface to retrieve version
+ */
+interface IERC3643Base {
+ /**
+ * @notice Returns the current version of the token contract.
+ * @dev This value is useful to know which smart contract version has been used
+ * @return version_ A string representing the version of the token implementation (e.g., "1.0.0").
+ */
+ function version() external view returns (string memory version_);
+}
+
+/**
+ * @title IERC3643EnforcementEvent
+ * @notice Interface defining the event for account freezing and unfreezing.
+ */
+interface IERC3643EnforcementEvent {
+ /**
+ * @notice Emitted when an account's frozen status is changed.
+ * @dev
+ * - `account` is the address whose status changed.
+ * - `isFrozen` reflects the new status after the function execution:
+ * - `true`: account is frozen.
+ * - `false`: account is unfrozen.
+ * - `enforcer` is the address that executed the freezing/unfreezing.
+ * - `data` provides optional contextual information for auditing or documentation purposes.
+ * The event is emitted by `setAddressFrozen` and `batchSetAddressFrozen` functions
+ * Note: This event extends the ERC-3643 specification by including the `data` field.
+ *
+ * @param account The address that was frozen or unfrozen.
+ * @param isFrozen The resulting freeze status of the account.
+ * @param enforcer The address that initiated the change.
+ * @param data Additional data related to the freezing action.
+ */
+ event AddressFrozen(address indexed account, bool indexed isFrozen, address indexed enforcer, bytes data);
+}
+
+/**
+ * @title IERC3643Enforcement
+ * @notice Interface for account-level freezing logic.
+ * @dev Provides methods to check and update whether an address is frozen.
+ */
+interface IERC3643Enforcement {
+ /**
+ * @notice Checks whether a given account is currently frozen.
+ * @param account The address to query.
+ * @return isFrozen_ A boolean indicating if the account is frozen (`true`) or not (`false`).
+ */
+ function isFrozen(address account) external view returns (bool isFrozen_);
+ /**
+ * @notice Sets the frozen status of a specific address.
+ * @dev Emits an `AddressFrozen` event.
+ * @param account The address whose frozen status is being updated.
+ * @param freeze The new frozen status (`true` to freeze, `false` to unfreeze).
+ */
+ function setAddressFrozen(address account, bool freeze) external;
+ /**
+ * @notice Batch version of {setAddressFrozen}, allowing multiple addresses to be updated in one call.
+ * @param accounts An array of addresses to update.
+ * @param freeze An array of corresponding frozen statuses for each address.
+ * Requirements:
+ * - `accounts.length` must be equal to `freeze.length`.
+ */
+ function batchSetAddressFrozen(address[] calldata accounts, bool[] calldata freeze) external;
+}
+
+/**
+ * @title IERC3643ERC20Enforcement
+ * @notice Interface for enforcing partial token freezes and forced transfers, typically used in compliance-sensitive ERC-1400 scenarios.
+ * @dev For event definitions, see {IERC7551ERC20Enforcement}.
+ */
+interface IERC3643ERC20Enforcement {
+ /* ============ View Functions ============ */
+ /**
+ * @notice Returns the number of tokens that are currently frozen (i.e., non-transferable) for a given account.
+ * @dev The frozen amount is always less than or equal to the total balance of the account.
+ * @param account The address of the wallet being queried.
+ * @return frozenBalance_ The amount of frozen tokens held by the account.
+ */
+ function getFrozenTokens(address account) external view returns (uint256 frozenBalance_);
+
+ /* ============ State Functions ============ */
+
+ /**
+ * @notice Freezes a specific amount of tokens for a given account.
+ * @dev Emits a `TokensFrozen` event. Prevents the frozen amount from being transferred.
+ * @param account The wallet address whose tokens are to be frozen.
+ * @param value The amount of tokens to freeze.
+ */
+ function freezePartialTokens(address account, uint256 value) external;
+
+ /**
+ * @notice unfreezes token amount specified for given address
+ * @dev Emits a TokensUnfrozen event
+ * @param account The address for which to update frozen tokens
+ * @param value Amount of Tokens to be unfrozen
+ */
+ function unfreezePartialTokens(address account, uint256 value) external;
+ /**
+ *
+ * @notice Triggers a forced transfer.
+ * @dev
+* * Force a transfer of tokens between 2 token holders
+ * If IERC364320Enforcement is implemented:
+ * Require that the total value should not exceed available balance.
+ * In case the `from` address has not enough free tokens (unfrozen tokens)
+ * but has a total balance higher or equal to the `amount`
+ * the amount of frozen tokens is reduced in order to have enough free tokens
+ * to proceed the transfer, in such a case, the remaining balance on the `from`
+ * account is 100% composed of frozen tokens post-transfer.
+ * emits a `TokensUnfrozen` event if `value` is higher than the free balance of `from`
+ * Emits a `Transfer` event
+ * @param from The address of the token holder
+ * @param to The address of the receiver
+ * @param value amount of tokens to transfer
+ * @return success_ `true` if successful and revert if unsuccessful
+
+ */
+ function forcedTransfer(address from, address to, uint256 value) external returns (bool success_);
+
+}
+/**
+* @title IERC3643Mint — Token Minting Interface
+* @dev Interface for mintint ERC-20 compatible tokens under the ERC-3643 standard.
+* Implements both single and batch mint functionalities, with support for frozen address logic if enforced.
+*/
+interface IERC3643Mint{
+ /**
+ * @notice Creates (`mints`) a specified `value` of tokens and assigns them to the `account`.
+ * @dev Tokens are minted by transferring them from the zero address (`address(0)`).
+ * Emits a {Mint} event and a {Transfer} event with `from` set to `address(0)`.
+ * Requirement:
+ * Account must not be the zero address.
+ * @param account The address that will receive the newly minted tokens.
+ * @param value The amount of tokens to mint to `account`.
+ */
+ function mint(address account, uint256 value) external;
+ /**
+ * @notice Batch version of {mint}, allowing multiple mint operations in a single transaction.
+ * @dev
+ * For each mint action:
+ * - Emits a {Mint} event.
+ * - Emits a {Transfer} event with `from` set to the zero address.
+ * - Requires that `accounts` and `values` arrays have the same length.
+ * - None of the addresses in `accounts` can be the zero address.
+ * - Be cautious with large arrays as the transaction may run out of gas.
+ * @param accounts The list of recipient addresses for the minted tokens.
+ * @param values The respective amounts of tokens to mint for each recipient.
+ */
+ function batchMint( address[] calldata accounts,uint256[] calldata values) external;
+}
+
+/**
+* @title IERC3643Burn — Token Burning Interface
+* @dev Interface for burning ERC-20 compatible tokens under the ERC-3643 standard.
+* Implements both single and batch burn functionalities, with support for frozen token logic if enforced.
+*/
+interface IERC3643Burn{
+ /**
+ * @notice Burns a specified amount of tokens from a given account by transferring them to `address(0)`.
+ * @dev
+ * - Decreases the total token supply by the specified `value`.
+ * - Emits a `Transfer` event to indicate the burn (with `to` set to `address(0)`).
+ * - If `IERC364320Enforcement` is implemented:
+ * - If the account has insufficient free (unfrozen) tokens but a sufficient total balance,
+ * frozen tokens are reduced to complete the burn.
+ * - The remaining balance on the account will consist entirely of frozen tokens after the burn.
+ * - Emits a `TokensUnfrozen` event if frozen tokens are unfrozen to allow the burn.
+ *
+ * @param account The address from which tokens will be burned.
+ * @param value The amount of tokens to burn.
+ */
+ function burn(address account,uint256 value) external;
+ /**
+ * @notice Performs a batch burn operation, removing tokens from multiple accounts in a single transaction.
+ * @dev
+ * - Batch version of {burn}
+ * - Executes the burn operation for each account in the `accounts` array, using corresponding amounts in the `values` array.
+ * - Emits a `Transfer` event for each burn (with `to` set to `address(0)`).
+ * - This operation is gas-intensive and may fail if the number of accounts (`accounts.length`) is too large, causing an "out of gas" error.
+ * - Use with caution to avoid unnecessary transaction fees.
+ * Requirement:
+ * - `accounts` and `values` must have the same length
+ * @param accounts An array of addresses from which tokens will be burned.
+ * @param values An array of token amounts to burn, corresponding to each address in `accounts`.
+ */
+ function batchBurn(address[] calldata accounts,uint256[] calldata values) external;
+}
+
+interface IERC3643ComplianceRead {
+ /**
+ * @notice Returns true if the transfer is valid, and false otherwise.
+ * @dev Don't check the balance and the user's right (access control)
+ */
+ function canTransfer(
+ address from,
+ address to,
+ uint256 value
+ ) external view returns (bool isValid);
+}
+
+interface IERC3643IComplianceContract {
+ /**
+ * @notice
+ * Function called whenever tokens are transferred
+ * from one wallet to another
+ * @dev
+ * This function can be used to update state variables of the compliance contract
+ * This function can be called ONLY by the token contract bound to the compliance
+ * @param from The address of the sender
+ * @param to The address of the receiver
+ * @param value value of tokens involved in the transfer
+ */
+ function transferred(address from, address to, uint256 value) external;
+}
+
+// lib/CMTAT/contracts/interfaces/tokenization/draft-IERC1404.sol
+
+/*
+* @dev Contrary to the ERC-1404,
+* this interface does not inherit directly from the ERC20 interface
+*/
+interface IERC1404 {
+
+ /**
+ * @notice Returns a uint8 code to indicate if a transfer is restricted or not
+ * @dev
+ * See {ERC-1404}
+ * This function is where an issuer enforces the restriction logic of their token transfers.
+ * Some examples of this might include:
+ * - checking if the token recipient is whitelisted,
+ * - checking if a sender's tokens are frozen in a lock-up period, etc.
+ * @return uint8 restricted code, 0 means the transfer is authorized
+ *
+ */
+ function detectTransferRestriction(
+ address from,
+ address to,
+ uint256 value
+ ) external view returns (uint8);
+
+ /**
+ * @dev See {ERC-1404}
+ * This function is effectively an accessor for the "message",
+ * a human-readable explanation as to why a transaction is restricted.
+ *
+ */
+ function messageForTransferRestriction(
+ uint8 restrictionCode
+ ) external view returns (string memory);
+}
+
+/**
+* @title IERC1404 with custom related extensions
+*/
+interface IERC1404Extend is IERC1404{
+ /*
+ * @dev leave the code 6-9 free/unused for further CMTAT additions in your ruleEngine implementation
+ */
+ enum REJECTED_CODE_BASE {
+ TRANSFER_OK,
+ TRANSFER_REJECTED_PAUSED,
+ TRANSFER_REJECTED_FROM_FROZEN,
+ TRANSFER_REJECTED_TO_FROZEN,
+ TRANSFER_REJECTED_SPENDER_FROZEN,
+ TRANSFER_REJECTED_FROM_INSUFFICIENT_ACTIVE_BALANCE
+ }
+
+ /**
+ * @notice Returns a uint8 code to indicate if a transfer is restricted or not
+ * @dev
+ * See {ERC-1404}
+ * Add an additionnal argument `spender`
+ * This function is where an issuer enforces the restriction logic of their token transfers.
+ * Some examples of this might include:
+ * - checking if the token recipient is whitelisted,
+ * - checking if a sender's tokens are frozen in a lock-up period, etc.
+ * @return uint8 restricted code, 0 means the transfer is authorized
+ *
+ */
+ function detectTransferRestrictionFrom(
+ address spender,
+ address from,
+ address to,
+ uint256 value
+ ) external view returns (uint8);
+}
+
+// lib/openzeppelin-contracts/contracts/access/IAccessControl.sol
+
+// OpenZeppelin Contracts (last updated v5.3.0) (access/IAccessControl.sol)
+
+/**
+ * @dev External interface of AccessControl declared to support ERC-165 detection.
+ */
+interface IAccessControl {
+ /**
+ * @dev The `account` is missing a role.
+ */
+ error AccessControlUnauthorizedAccount(address account, bytes32 neededRole);
+
+ /**
+ * @dev The caller of a function is not the expected one.
+ *
+ * NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.
+ */
+ error AccessControlBadConfirmation();
+
+ /**
+ * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
+ *
+ * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
+ * {RoleAdminChanged} not being emitted to signal this.
+ */
+ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);
+
+ /**
+ * @dev Emitted when `account` is granted `role`.
+ *
+ * `sender` is the account that originated the contract call. This account bears the admin role (for the granted role).
+ * Expected in cases where the role was granted using the internal {AccessControl-_grantRole}.
+ */
+ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);
+
+ /**
+ * @dev Emitted when `account` is revoked `role`.
+ *
+ * `sender` is the account that originated the contract call:
+ * - if using `revokeRole`, it is the admin role bearer
+ * - if using `renounceRole`, it is the role bearer (i.e. `account`)
+ */
+ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);
+
+ /**
+ * @dev Returns `true` if `account` has been granted `role`.
+ */
+ function hasRole(bytes32 role, address account) external view returns (bool);
+
+ /**
+ * @dev Returns the admin role that controls `role`. See {grantRole} and
+ * {revokeRole}.
+ *
+ * To change a role's admin, use {AccessControl-_setRoleAdmin}.
+ */
+ function getRoleAdmin(bytes32 role) external view returns (bytes32);
+
+ /**
+ * @dev Grants `role` to `account`.
+ *
+ * If `account` had not been already granted `role`, emits a {RoleGranted}
+ * event.
+ *
+ * Requirements:
+ *
+ * - the caller must have ``role``'s admin role.
+ */
+ function grantRole(bytes32 role, address account) external;
+
+ /**
+ * @dev Revokes `role` from `account`.
+ *
+ * If `account` had been granted `role`, emits a {RoleRevoked} event.
+ *
+ * Requirements:
+ *
+ * - the caller must have ``role``'s admin role.
+ */
+ function revokeRole(bytes32 role, address account) external;
+
+ /**
+ * @dev Revokes `role` from the calling account.
+ *
+ * Roles are often managed via {grantRole} and {revokeRole}: this function's
+ * purpose is to provide a mechanism for accounts to lose their privileges
+ * if they are compromised (such as when a trusted device is misplaced).
+ *
+ * If the calling account had been granted `role`, emits a {RoleRevoked}
+ * event.
+ *
+ * Requirements:
+ *
+ * - the caller must be `callerConfirmation`.
+ */
+ function renounceRole(bytes32 role, address callerConfirmation) external;
+}
+
+// lib/openzeppelin-contracts/contracts/utils/Comparators.sol
+
+// OpenZeppelin Contracts (last updated v5.1.0) (utils/Comparators.sol)
+
+/**
+ * @dev Provides a set of functions to compare values.
+ *
+ * _Available since v5.1._
+ */
+library Comparators {
+ function lt(uint256 a, uint256 b) internal pure returns (bool) {
+ return a < b;
+ }
+
+ function gt(uint256 a, uint256 b) internal pure returns (bool) {
+ return a > b;
+ }
+}
+
+// lib/openzeppelin-contracts/contracts/utils/Context.sol
+
+// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
+
+/**
+ * @dev Provides information about the current execution context, including the
+ * sender of the transaction and its data. While these are generally available
+ * via msg.sender and msg.data, they should not be accessed in such a direct
+ * manner, since when dealing with meta-transactions the account sending and
+ * paying for execution may not be the actual sender (as far as an application
+ * is concerned).
+ *
+ * This contract is only required for intermediate, library-like contracts.
+ */
+abstract contract Context {
+ function _msgSender() internal view virtual returns (address) {
+ return msg.sender;
+ }
+
+ function _msgData() internal view virtual returns (bytes calldata) {
+ return msg.data;
+ }
+
+ function _contextSuffixLength() internal view virtual returns (uint256) {
+ return 0;
+ }
+}
+
+// lib/openzeppelin-contracts/contracts/utils/Panic.sol
+
+// OpenZeppelin Contracts (last updated v5.1.0) (utils/Panic.sol)
+
+/**
+ * @dev Helper library for emitting standardized panic codes.
+ *
+ * ```solidity
+ * contract Example {
+ * using Panic for uint256;
+ *
+ * // Use any of the declared internal constants
+ * function foo() { Panic.GENERIC.panic(); }
+ *
+ * // Alternatively
+ * function foo() { Panic.panic(Panic.GENERIC); }
+ * }
+ * ```
+ *
+ * Follows the list from https://github.com/ethereum/solidity/blob/v0.8.24/libsolutil/ErrorCodes.h[libsolutil].
+ *
+ * _Available since v5.1._
+ */
+// slither-disable-next-line unused-state
+library Panic {
+ /// @dev generic / unspecified error
+ uint256 internal constant GENERIC = 0x00;
+ /// @dev used by the assert() builtin
+ uint256 internal constant ASSERT = 0x01;
+ /// @dev arithmetic underflow or overflow
+ uint256 internal constant UNDER_OVERFLOW = 0x11;
+ /// @dev division or modulo by zero
+ uint256 internal constant DIVISION_BY_ZERO = 0x12;
+ /// @dev enum conversion error
+ uint256 internal constant ENUM_CONVERSION_ERROR = 0x21;
+ /// @dev invalid encoding in storage
+ uint256 internal constant STORAGE_ENCODING_ERROR = 0x22;
+ /// @dev empty array pop
+ uint256 internal constant EMPTY_ARRAY_POP = 0x31;
+ /// @dev array out of bounds access
+ uint256 internal constant ARRAY_OUT_OF_BOUNDS = 0x32;
+ /// @dev resource error (too large allocation or too large array)
+ uint256 internal constant RESOURCE_ERROR = 0x41;
+ /// @dev calling invalid internal function
+ uint256 internal constant INVALID_INTERNAL_FUNCTION = 0x51;
+
+ /// @dev Reverts with a panic code. Recommended to use with
+ /// the internal constants with predefined codes.
+ function panic(uint256 code) internal pure {
+ assembly ("memory-safe") {
+ mstore(0x00, 0x4e487b71)
+ mstore(0x20, code)
+ revert(0x1c, 0x24)
+ }
+ }
+}
+
+// lib/openzeppelin-contracts/contracts/utils/SlotDerivation.sol
+
+// OpenZeppelin Contracts (last updated v5.3.0) (utils/SlotDerivation.sol)
+// This file was procedurally generated from scripts/generate/templates/SlotDerivation.js.
+
+/**
+ * @dev Library for computing storage (and transient storage) locations from namespaces and deriving slots
+ * corresponding to standard patterns. The derivation method for array and mapping matches the storage layout used by
+ * the solidity language / compiler.
+ *
+ * See https://docs.soliditylang.org/en/v0.8.20/internals/layout_in_storage.html#mappings-and-dynamic-arrays[Solidity docs for mappings and dynamic arrays.].
+ *
+ * Example usage:
+ * ```solidity
+ * contract Example {
+ * // Add the library methods
+ * using StorageSlot for bytes32;
+ * using SlotDerivation for bytes32;
+ *
+ * // Declare a namespace
+ * string private constant _NAMESPACE = "
-
-
-
- LCOV - code coverage report
-
- ![]()
-
-
-
-
-
-
-
-
- Current view:
- top level
-
-
- Hit
- Total
- Coverage
-
-
- Test:
- lcov.info
-
- Lines:
- 187
- 191
- 97.9 %
-
-
- Date:
- 2025-08-08 14:05:19
-
- Functions:
- 46
- 49
- 93.9 %
-
-
-
-
-
- Branches:
- 34
- 37
- 91.9 %
-
- ![]()
- ![]()
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Directory
- ![]()
Line Coverage
- ![]()
Functions
- ![]()
Branches
- ![]()
-
- src/modules
-
-
-
- ![]()
![]()
98.4 %
- 121 / 123
- 94.3 %
- 33 / 35
- 87.0 %
- 20 / 23
-
-
- src
-
-
-
- ![]()
![]()
97.1 %
- 66 / 68
- 92.9 %
- 13 / 14
- 100.0 %
- 14 / 14
-
-
-
-
-
- ![]()
- Generated by: LCOV version 1.16
-
-
-
diff --git a/coverage/index-sort-f.html b/coverage/index-sort-f.html
deleted file mode 100644
index 127ecee..0000000
--- a/coverage/index-sort-f.html
+++ /dev/null
@@ -1,119 +0,0 @@
-
-
-
-
-
-
-
-
-
-
- LCOV - code coverage report
-
- ![]()
-
-
-
-
-
-
-
-
- Current view:
- top level
-
-
- Hit
- Total
- Coverage
-
-
- Test:
- lcov.info
-
- Lines:
- 187
- 191
- 97.9 %
-
-
- Date:
- 2025-08-08 14:05:19
-
- Functions:
- 46
- 49
- 93.9 %
-
-
-
-
-
- Branches:
- 34
- 37
- 91.9 %
-
- ![]()
- ![]()
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Directory
- ![]()
Line Coverage
- ![]()
Functions
- ![]()
Branches
- ![]()
-
- src
-
-
-
- ![]()
![]()
97.1 %
- 66 / 68
- 92.9 %
- 13 / 14
- 100.0 %
- 14 / 14
-
-
- src/modules
-
-
-
- ![]()
![]()
98.4 %
- 121 / 123
- 94.3 %
- 33 / 35
- 87.0 %
- 20 / 23
-
-
-
-
-
- ![]()
- Generated by: LCOV version 1.16
-
-
-
diff --git a/coverage/index-sort-l.html b/coverage/index-sort-l.html
deleted file mode 100644
index 912627e..0000000
--- a/coverage/index-sort-l.html
+++ /dev/null
@@ -1,119 +0,0 @@
-
-
-
-
-
-
-
-
-
-
- LCOV - code coverage report
-
- ![]()
-
-
-
-
-
-
-
-
- Current view:
- top level
-
-
- Hit
- Total
- Coverage
-
-
- Test:
- lcov.info
-
- Lines:
- 187
- 191
- 97.9 %
-
-
- Date:
- 2025-08-08 14:05:19
-
- Functions:
- 46
- 49
- 93.9 %
-
-
-
-
-
- Branches:
- 34
- 37
- 91.9 %
-
- ![]()
- ![]()
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Directory
- ![]()
Line Coverage
- ![]()
Functions
- ![]()
Branches
- ![]()
-
- src
-
-
-
- ![]()
![]()
97.1 %
- 66 / 68
- 92.9 %
- 13 / 14
- 100.0 %
- 14 / 14
-
-
- src/modules
-
-
-
- ![]()
![]()
98.4 %
- 121 / 123
- 94.3 %
- 33 / 35
- 87.0 %
- 20 / 23
-
-
-
-
-
- ![]()
- Generated by: LCOV version 1.16
-
-
-
diff --git a/coverage/index.html b/coverage/index.html
deleted file mode 100644
index 8e3f67c..0000000
--- a/coverage/index.html
+++ /dev/null
@@ -1,119 +0,0 @@
-
-
-
-
-
-
-
-
-
-
- LCOV - code coverage report
-
- ![]()
-
-
-
-
-
-
-
-
- Current view:
- top level
-
-
- Hit
- Total
- Coverage
-
-
- Test:
- lcov.info
-
- Lines:
- 187
- 191
- 97.9 %
-
-
- Date:
- 2025-08-08 14:05:19
-
- Functions:
- 46
- 49
- 93.9 %
-
-
-
-
-
- Branches:
- 34
- 37
- 91.9 %
-
- ![]()
- ![]()
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Directory
- ![]()
Line Coverage
- ![]()
Functions
- ![]()
Branches
- ![]()
-
- src
-
-
-
- ![]()
![]()
97.1 %
- 66 / 68
- 92.9 %
- 13 / 14
- 100.0 %
- 14 / 14
-
-
- src/modules
-
-
-
- ![]()
![]()
98.4 %
- 121 / 123
- 94.3 %
- 33 / 35
- 87.0 %
- 20 / 23
-
-
-
-
-
- ![]()
- Generated by: LCOV version 1.16
-
-
-
diff --git a/coverage/ruby.png b/coverage/ruby.png
deleted file mode 100644
index 991b6d4ec9e78be165e3ef757eed1aada287364d..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 141
zcmeAS@N?(olHy`uVBq!ia0vp^j3CU&3?x-=hn)ga>?NMQuI!iC1^FceV#7`HfI^%F
z9+AZi4BSE>%y{W;-5;PJOS+@4BLl<6e(pbstUx|nfKQ0)e^Y%R^MdiLxj>4`)5S5Q
b;#P73kj=!v_*DHKNFRfztDnm{r-UW|iOwIS
diff --git a/coverage/snow.png b/coverage/snow.png
deleted file mode 100644
index 2cdae107fceec6e7f02ac7acb4a34a82a540caa5..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 141
zcmeAS@N?(olHy`uVBq!ia0vp^j3CU&3?x-=hn)ga>?NMQuI!iC1^MM
-
-
-
- LCOV - code coverage report
-
- ![]()
-
-
-
-
-
-
-
-
- Current view:
- top level - src - RuleEngine.sol (source / functions)
-
-
- Hit
- Total
- Coverage
-
-
- Test:
- lcov.info
-
- Lines:
- 66
- 68
- 97.1 %
-
-
- Date:
- 2025-08-08 14:05:19
-
- Functions:
- 13
- 14
- 92.9 %
-
-
-
-
-
- Branches:
- 14
- 14
- 100.0 %
-
- ![]()
- ![]()
-
-
-
-
- Function Name
- ![]()
Hit count
- ![]()
-
- RuleEngine._msgData
- 0
-
-
- RuleEngine.created
- 2
-
-
- RuleEngine.destroyed
- 2
-
-
- RuleEngine.detectTransferRestrictionFrom
- 9
-
-
- RuleEngine._transferred
- 10
-
-
- RuleEngine.transferred
- 12
-
-
- RuleEngine.canTransferFrom
- 13
-
-
- RuleEngine.detectTransferRestriction
- 13
-
-
- RuleEngine.messageForTransferRestriction
- 13
-
-
- RuleEngine.canTransfer
- 17
-
-
- RuleEngine.constructor
- 85
-
-
- RuleEngine.hasRole
- 93
-
-
- RuleEngine._contextSuffixLength
- 285
-
-
- RuleEngine._msgSender
- 285
-
-
-
-
- ![]()
- Generated by: LCOV version 1.16
-
-
-
diff --git a/coverage/src/RuleEngine.sol.func.html b/coverage/src/RuleEngine.sol.func.html
deleted file mode 100644
index 5462974..0000000
--- a/coverage/src/RuleEngine.sol.func.html
+++ /dev/null
@@ -1,137 +0,0 @@
-
-
-
-
-
-
-
-
-
-
- LCOV - code coverage report
-
- ![]()
-
-
-
-
-
-
-
-
- Current view:
- top level - src - RuleEngine.sol (source / functions)
-
-
- Hit
- Total
- Coverage
-
-
- Test:
- lcov.info
-
- Lines:
- 66
- 68
- 97.1 %
-
-
- Date:
- 2025-08-08 14:05:19
-
- Functions:
- 13
- 14
- 92.9 %
-
-
-
-
-
- Branches:
- 14
- 14
- 100.0 %
-
- ![]()
- ![]()
-
-
-
-
- Function Name
- ![]()
Hit count
- ![]()
-
- RuleEngine._contextSuffixLength
- 285
-
-
- RuleEngine._msgData
- 0
-
-
- RuleEngine._msgSender
- 285
-
-
- RuleEngine._transferred
- 10
-
-
- RuleEngine.canTransfer
- 17
-
-
- RuleEngine.canTransferFrom
- 13
-
-
- RuleEngine.constructor
- 85
-
-
- RuleEngine.created
- 2
-
-
- RuleEngine.destroyed
- 2
-
-
- RuleEngine.detectTransferRestriction
- 13
-
-
- RuleEngine.detectTransferRestrictionFrom
- 9
-
-
- RuleEngine.hasRole
- 93
-
-
- RuleEngine.messageForTransferRestriction
- 13
-
-
- RuleEngine.transferred
- 12
-
-
-
-
- ![]()
- Generated by: LCOV version 1.16
-
-
-
diff --git a/coverage/src/RuleEngine.sol.gcov.html b/coverage/src/RuleEngine.sol.gcov.html
deleted file mode 100644
index 63d0041..0000000
--- a/coverage/src/RuleEngine.sol.gcov.html
+++ /dev/null
@@ -1,384 +0,0 @@
-
-
-
-
-
-
-
-
-
-
- LCOV - code coverage report
-
- ![]()
-
-
-
-
-
-
-
-
- Current view:
- top level - src - RuleEngine.sol (source / functions)
-
-
- Hit
- Total
- Coverage
-
-
- Test:
- lcov.info
-
- Lines:
- 66
- 68
- 97.1 %
-
-
- Date:
- 2025-08-08 14:05:19
-
- Functions:
- 13
- 14
- 92.9 %
-
-
-
-
-
- Branches:
- 14
- 14
- 100.0 %
-
- ![]()
- ![]()
-
-
-
-
- ![]()
- Generated by: LCOV version 1.16
-
-
-
diff --git a/coverage/src/index-sort-b.html b/coverage/src/index-sort-b.html
deleted file mode 100644
index e1e8715..0000000
--- a/coverage/src/index-sort-b.html
+++ /dev/null
@@ -1,107 +0,0 @@
-
-
-
-
-
-
-
-
-
-
- LCOV - code coverage report
-
- ![]()
-
-
-
-
-
-
-
-
- Current view:
- top level - src
-
-
- Hit
- Total
- Coverage
-
-
- Test:
- lcov.info
-
- Lines:
- 66
- 68
- 97.1 %
-
-
- Date:
- 2025-08-08 14:05:19
-
- Functions:
- 13
- 14
- 92.9 %
-
-
-
-
-
- Branches:
- 14
- 14
- 100.0 %
-
- ![]()
- ![]()
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Filename
- ![]()
Line Coverage
- ![]()
Functions
- ![]()
Branches
- ![]()
-
- RuleEngine.sol
-
-
-
- ![]()
![]()
97.1 %
- 66 / 68
- 92.9 %
- 13 / 14
- 100.0 %
- 14 / 14
-
-
-
-
-
- ![]()
- Generated by: LCOV version 1.16
-
-
-
diff --git a/coverage/src/index-sort-f.html b/coverage/src/index-sort-f.html
deleted file mode 100644
index b171fe3..0000000
--- a/coverage/src/index-sort-f.html
+++ /dev/null
@@ -1,107 +0,0 @@
-
-
-
-
-
-
-
-
-
-
- LCOV - code coverage report
-
- ![]()
-
-
-
-
-
-
-
-
- Current view:
- top level - src
-
-
- Hit
- Total
- Coverage
-
-
- Test:
- lcov.info
-
- Lines:
- 66
- 68
- 97.1 %
-
-
- Date:
- 2025-08-08 14:05:19
-
- Functions:
- 13
- 14
- 92.9 %
-
-
-
-
-
- Branches:
- 14
- 14
- 100.0 %
-
- ![]()
- ![]()
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Filename
- ![]()
Line Coverage
- ![]()
Functions
- ![]()
Branches
- ![]()
-
- RuleEngine.sol
-
-
-
- ![]()
![]()
97.1 %
- 66 / 68
- 92.9 %
- 13 / 14
- 100.0 %
- 14 / 14
-
-
-
-
-
- ![]()
- Generated by: LCOV version 1.16
-
-
-
diff --git a/coverage/src/index-sort-l.html b/coverage/src/index-sort-l.html
deleted file mode 100644
index 0b952df..0000000
--- a/coverage/src/index-sort-l.html
+++ /dev/null
@@ -1,107 +0,0 @@
-
-
-
-
-
-
-
-
-
-
- LCOV - code coverage report
-
- ![]()
-
-
-
-
-
-
-
-
- Current view:
- top level - src
-
-
- Hit
- Total
- Coverage
-
-
- Test:
- lcov.info
-
- Lines:
- 66
- 68
- 97.1 %
-
-
- Date:
- 2025-08-08 14:05:19
-
- Functions:
- 13
- 14
- 92.9 %
-
-
-
-
-
- Branches:
- 14
- 14
- 100.0 %
-
- ![]()
- ![]()
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Filename
- ![]()
Line Coverage
- ![]()
Functions
- ![]()
Branches
- ![]()
-
- RuleEngine.sol
-
-
-
- ![]()
![]()
97.1 %
- 66 / 68
- 92.9 %
- 13 / 14
- 100.0 %
- 14 / 14
-
-
-
-
-
- ![]()
- Generated by: LCOV version 1.16
-
-
-
diff --git a/coverage/src/index.html b/coverage/src/index.html
deleted file mode 100644
index 600c807..0000000
--- a/coverage/src/index.html
+++ /dev/null
@@ -1,107 +0,0 @@
-
-
-
-
-
-
-
-
-
-
- LCOV - code coverage report
-
- ![]()
-
-
-
-
-
-
-
-
- Current view:
- top level - src
-
-
- Hit
- Total
- Coverage
-
-
- Test:
- lcov.info
-
- Lines:
- 66
- 68
- 97.1 %
-
-
- Date:
- 2025-08-08 14:05:19
-
- Functions:
- 13
- 14
- 92.9 %
-
-
-
-
-
- Branches:
- 14
- 14
- 100.0 %
-
- ![]()
- ![]()
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Filename
- ![]()
Line Coverage
- ![]()
Functions
- ![]()
Branches
- ![]()
-
- RuleEngine.sol
-
-
-
- ![]()
![]()
97.1 %
- 66 / 68
- 92.9 %
- 13 / 14
- 100.0 %
- 14 / 14
-
-
-
-
-
- ![]()
- Generated by: LCOV version 1.16
-
-
-
diff --git a/coverage/src/modules/ERC3643Compliance.sol.func-sort-c.html b/coverage/src/modules/ERC3643Compliance.sol.func-sort-c.html
deleted file mode 100644
index 5b4f063..0000000
--- a/coverage/src/modules/ERC3643Compliance.sol.func-sort-c.html
+++ /dev/null
@@ -1,113 +0,0 @@
-
-
-
-
-
-
-
-
-
-
- LCOV - code coverage report
-
- ![]()
-
-
-
-
-
-
-
-
- Current view:
- top level - src/modules - ERC3643Compliance.sol (source / functions)
-
-
- Hit
- Total
- Coverage
-
-
- Test:
- lcov.info
-
- Lines:
- 24
- 24
- 100.0 %
-
-
- Date:
- 2025-08-08 14:05:19
-
- Functions:
- 8
- 8
- 100.0 %
-
-
-
-
-
- Branches:
- 6
- 9
- 66.7 %
-
- ![]()
- ![]()
-
-
-
-
- Function Name
- ![]()
Hit count
- ![]()
-
- ERC3643Compliance.getTokenBound
- 2
-
-
- ERC3643Compliance.getTokenBounds
- 2
-
-
- ERC3643Compliance._unbindToken
- 3
-
-
- ERC3643Compliance.onlyBoundToken
- 3
-
-
- ERC3643Compliance.unbindToken
- 3
-
-
- ERC3643Compliance.isTokenBound
- 6
-
-
- ERC3643Compliance.bindToken
- 8
-
-
- ERC3643Compliance._bindToken
- 23
-
-
-
-
- ![]()
- Generated by: LCOV version 1.16
-
-
-
diff --git a/coverage/src/modules/ERC3643Compliance.sol.func.html b/coverage/src/modules/ERC3643Compliance.sol.func.html
deleted file mode 100644
index 051e9b7..0000000
--- a/coverage/src/modules/ERC3643Compliance.sol.func.html
+++ /dev/null
@@ -1,113 +0,0 @@
-
-
-
-
-
-
-
-
-
-
- LCOV - code coverage report
-
- ![]()
-
-
-
-
-
-
-
-
- Current view:
- top level - src/modules - ERC3643Compliance.sol (source / functions)
-
-
- Hit
- Total
- Coverage
-
-
- Test:
- lcov.info
-
- Lines:
- 24
- 24
- 100.0 %
-
-
- Date:
- 2025-08-08 14:05:19
-
- Functions:
- 8
- 8
- 100.0 %
-
-
-
-
-
- Branches:
- 6
- 9
- 66.7 %
-
- ![]()
- ![]()
-
-
-
-
- Function Name
- ![]()
Hit count
- ![]()
-
- ERC3643Compliance._bindToken
- 23
-
-
- ERC3643Compliance._unbindToken
- 3
-
-
- ERC3643Compliance.bindToken
- 8
-
-
- ERC3643Compliance.getTokenBound
- 2
-
-
- ERC3643Compliance.getTokenBounds
- 2
-
-
- ERC3643Compliance.isTokenBound
- 6
-
-
- ERC3643Compliance.onlyBoundToken
- 3
-
-
- ERC3643Compliance.unbindToken
- 3
-
-
-
-
- ![]()
- Generated by: LCOV version 1.16
-
-
-
diff --git a/coverage/src/modules/ERC3643Compliance.sol.gcov.html b/coverage/src/modules/ERC3643Compliance.sol.gcov.html
deleted file mode 100644
index 955334e..0000000
--- a/coverage/src/modules/ERC3643Compliance.sol.gcov.html
+++ /dev/null
@@ -1,167 +0,0 @@
-
-
-
-
-
-
-
-
-
-
- LCOV - code coverage report
-
- ![]()
-
-
-
-
-
-
-
-
- Current view:
- top level - src/modules - ERC3643Compliance.sol (source / functions)
-
-
- Hit
- Total
- Coverage
-
-
- Test:
- lcov.info
-
- Lines:
- 24
- 24
- 100.0 %
-
-
- Date:
- 2025-08-08 14:05:19
-
- Functions:
- 8
- 8
- 100.0 %
-
-
-
-
-
- Branches:
- 6
- 9
- 66.7 %
-
- ![]()
- ![]()
-
-
-
-
- ![]()
- Generated by: LCOV version 1.16
-
-
-
diff --git a/coverage/src/modules/RuleEngineOperation.sol.func-sort-c.html b/coverage/src/modules/RuleEngineOperation.sol.func-sort-c.html
deleted file mode 100644
index 75fccb5..0000000
--- a/coverage/src/modules/RuleEngineOperation.sol.func-sort-c.html
+++ /dev/null
@@ -1,129 +0,0 @@
-
-
-
-
-
-
-
-
-
-
- LCOV - code coverage report
-
- ![]()
-
-
-
-
-
-
-
-
- Current view:
- top level - src/modules - RuleEngineOperation.sol (source / functions)
-
-
- Hit
- Total
- Coverage
-
-
- Test:
- lcov.info
-
- Lines:
- 40
- 41
- 97.6 %
-
-
- Date:
- 2025-08-08 14:05:19
-
- Functions:
- 11
- 12
- 91.7 %
-
-
-
-
-
- Branches:
- 6
- 6
- 100.0 %
-
- ![]()
- ![]()
-
-
-
-
- Function Name
- ![]()
Hit count
- ![]()
-
- RuleEngineOperation.rulesOperationIsPresent
- 0
-
-
- RuleEngineOperation.ruleOperation
- 1
-
-
- RuleEngineOperation._removeRuleOperation
- 4
-
-
- RuleEngineOperation.clearRulesOperation
- 4
-
-
- RuleEngineOperation.removeRuleOperation
- 5
-
-
- RuleEngineOperation.rulesOperation
- 5
-
-
- RuleEngineOperation._transferred
- 8
-
-
- RuleEngineOperation.setRulesOperation
- 11
-
-
- RuleEngineOperation._clearRulesOperation
- 13
-
-
- RuleEngineOperation.addRuleOperation
- 36
-
-
- RuleEngineOperation.rulesCountOperation
- 45
-
-
- RuleEngineOperation._checkRule
- 55
-
-
-
-
- ![]()
- Generated by: LCOV version 1.16
-
-
-
diff --git a/coverage/src/modules/RuleEngineOperation.sol.func.html b/coverage/src/modules/RuleEngineOperation.sol.func.html
deleted file mode 100644
index 57bafc0..0000000
--- a/coverage/src/modules/RuleEngineOperation.sol.func.html
+++ /dev/null
@@ -1,129 +0,0 @@
-
-
-
-
-
-
-
-
-
-
- LCOV - code coverage report
-
- ![]()
-
-
-
-
-
-
-
-
- Current view:
- top level - src/modules - RuleEngineOperation.sol (source / functions)
-
-
- Hit
- Total
- Coverage
-
-
- Test:
- lcov.info
-
- Lines:
- 40
- 41
- 97.6 %
-
-
- Date:
- 2025-08-08 14:05:19
-
- Functions:
- 11
- 12
- 91.7 %
-
-
-
-
-
- Branches:
- 6
- 6
- 100.0 %
-
- ![]()
- ![]()
-
-
-
-
- Function Name
- ![]()
Hit count
- ![]()
-
- RuleEngineOperation._checkRule
- 55
-
-
- RuleEngineOperation._clearRulesOperation
- 13
-
-
- RuleEngineOperation._removeRuleOperation
- 4
-
-
- RuleEngineOperation._transferred
- 8
-
-
- RuleEngineOperation.addRuleOperation
- 36
-
-
- RuleEngineOperation.clearRulesOperation
- 4
-
-
- RuleEngineOperation.removeRuleOperation
- 5
-
-
- RuleEngineOperation.ruleOperation
- 1
-
-
- RuleEngineOperation.rulesCountOperation
- 45
-
-
- RuleEngineOperation.rulesOperation
- 5
-
-
- RuleEngineOperation.rulesOperationIsPresent
- 0
-
-
- RuleEngineOperation.setRulesOperation
- 11
-
-
-
-
- ![]()
- Generated by: LCOV version 1.16
-
-
-
diff --git a/coverage/src/modules/RuleEngineOperation.sol.gcov.html b/coverage/src/modules/RuleEngineOperation.sol.gcov.html
deleted file mode 100644
index ac679d8..0000000
--- a/coverage/src/modules/RuleEngineOperation.sol.gcov.html
+++ /dev/null
@@ -1,275 +0,0 @@
-
-
-
-
-
-
-
-
-
-
- LCOV - code coverage report
-
- ![]()
-
-
-
-
-
-
-
-
- Current view:
- top level - src/modules - RuleEngineOperation.sol (source / functions)
-
-
- Hit
- Total
- Coverage
-
-
- Test:
- lcov.info
-
- Lines:
- 40
- 41
- 97.6 %
-
-
- Date:
- 2025-08-08 14:05:19
-
- Functions:
- 11
- 12
- 91.7 %
-
-
-
-
-
- Branches:
- 6
- 6
- 100.0 %
-
- ![]()
- ![]()
-
-
-
-
- ![]()
- Generated by: LCOV version 1.16
-
-
-
diff --git a/coverage/src/modules/RuleEngineValidation.sol.func-sort-c.html b/coverage/src/modules/RuleEngineValidation.sol.func-sort-c.html
deleted file mode 100644
index f6f9ce7..0000000
--- a/coverage/src/modules/RuleEngineValidation.sol.func-sort-c.html
+++ /dev/null
@@ -1,125 +0,0 @@
-
-
-
-
-
-
-
-
-
-
- LCOV - code coverage report
-
- ![]()
-
-
-
-
-
-
-
-
- Current view:
- top level - src/modules - RuleEngineValidation.sol (source / functions)
-
-
- Hit
- Total
- Coverage
-
-
- Test:
- lcov.info
-
- Lines:
- 37
- 38
- 97.4 %
-
-
- Date:
- 2025-08-08 14:05:19
-
- Functions:
- 10
- 11
- 90.9 %
-
-
-
-
-
- Branches:
- 6
- 6
- 100.0 %
-
- ![]()
- ![]()
-
-
-
-
- Function Name
- ![]()
Hit count
- ![]()
-
- RuleEngineValidation.rulesValidationIsPresent
- 0
-
-
- RuleEngineValidation.ruleValidation
- 1
-
-
- RuleEngineValidation._removeRuleValidation
- 4
-
-
- RuleEngineValidation.rulesValidation
- 5
-
-
- RuleEngineValidation.clearRulesValidation
- 6
-
-
- RuleEngineValidation.removeRuleValidation
- 6
-
-
- RuleEngineValidation.setRulesValidation
- 23
-
-
- RuleEngineValidation._clearRulesValidation
- 25
-
-
- RuleEngineValidation.addRuleValidation
- 59
-
-
- RuleEngineValidation.rulesCountValidation
- 70
-
-
- RuleEngineValidation._checkRuleValidation
- 88
-
-
-
-
- ![]()
- Generated by: LCOV version 1.16
-
-
-
diff --git a/coverage/src/modules/RuleEngineValidation.sol.func.html b/coverage/src/modules/RuleEngineValidation.sol.func.html
deleted file mode 100644
index 3e34d47..0000000
--- a/coverage/src/modules/RuleEngineValidation.sol.func.html
+++ /dev/null
@@ -1,125 +0,0 @@
-
-
-
-
-
-
-
-
-
-
- LCOV - code coverage report
-
- ![]()
-
-
-
-
-
-
-
-
- Current view:
- top level - src/modules - RuleEngineValidation.sol (source / functions)
-
-
- Hit
- Total
- Coverage
-
-
- Test:
- lcov.info
-
- Lines:
- 37
- 38
- 97.4 %
-
-
- Date:
- 2025-08-08 14:05:19
-
- Functions:
- 10
- 11
- 90.9 %
-
-
-
-
-
- Branches:
- 6
- 6
- 100.0 %
-
- ![]()
- ![]()
-
-
-
-
- Function Name
- ![]()
Hit count
- ![]()
-
- RuleEngineValidation._checkRuleValidation
- 88
-
-
- RuleEngineValidation._clearRulesValidation
- 25
-
-
- RuleEngineValidation._removeRuleValidation
- 4
-
-
- RuleEngineValidation.addRuleValidation
- 59
-
-
- RuleEngineValidation.clearRulesValidation
- 6
-
-
- RuleEngineValidation.removeRuleValidation
- 6
-
-
- RuleEngineValidation.ruleValidation
- 1
-
-
- RuleEngineValidation.rulesCountValidation
- 70
-
-
- RuleEngineValidation.rulesValidation
- 5
-
-
- RuleEngineValidation.rulesValidationIsPresent
- 0
-
-
- RuleEngineValidation.setRulesValidation
- 23
-
-
-
-
- ![]()
- Generated by: LCOV version 1.16
-
-
-
diff --git a/coverage/src/modules/RuleEngineValidation.sol.gcov.html b/coverage/src/modules/RuleEngineValidation.sol.gcov.html
deleted file mode 100644
index 090bbcf..0000000
--- a/coverage/src/modules/RuleEngineValidation.sol.gcov.html
+++ /dev/null
@@ -1,254 +0,0 @@
-
-
-
-
-
-
-
-
-
-
- LCOV - code coverage report
-
- ![]()
-
-
-
-
-
-
-
-
- Current view:
- top level - src/modules - RuleEngineValidation.sol (source / functions)
-
-
- Hit
- Total
- Coverage
-
-
- Test:
- lcov.info
-
- Lines:
- 37
- 38
- 97.4 %
-
-
- Date:
- 2025-08-08 14:05:19
-
- Functions:
- 10
- 11
- 90.9 %
-
-
-
-
-
- Branches:
- 6
- 6
- 100.0 %
-
- ![]()
- ![]()
-
-
-
-
- ![]()
- Generated by: LCOV version 1.16
-
-
-
diff --git a/coverage/src/modules/RuleEngineValidationRead.sol.func-sort-c.html b/coverage/src/modules/RuleEngineValidationRead.sol.func-sort-c.html
deleted file mode 100644
index 14237a4..0000000
--- a/coverage/src/modules/RuleEngineValidationRead.sol.func-sort-c.html
+++ /dev/null
@@ -1,97 +0,0 @@
-
-
-
-
-
-
-
-
-
-
- LCOV - code coverage report
-
- ![]()
-
-
-
-
-
-
-
-
- Current view:
- top level - src/modules - RuleEngineValidationRead.sol (source / functions)
-
-
- Hit
- Total
- Coverage
-
-
- Test:
- lcov.info
-
- Lines:
- 20
- 20
- 100.0 %
-
-
- Date:
- 2025-08-08 14:05:19
-
- Functions:
- 4
- 4
- 100.0 %
-
-
-
-
-
- Branches:
- 2
- 2
- 100.0 %
-
- ![]()
- ![]()
-
-
-
-
- Function Name
- ![]()
Hit count
- ![]()
-
- RuleEngineValidationRead.canTransferValidationFrom
- 1
-
-
- RuleEngineValidationRead.detectTransferRestrictionValidationFrom
- 1
-
-
- RuleEngineValidationRead.canTransferValidation
- 2
-
-
- RuleEngineValidationRead.detectTransferRestrictionValidation
- 5
-
-
-
-
- ![]()
- Generated by: LCOV version 1.16
-
-
-
diff --git a/coverage/src/modules/RuleEngineValidationRead.sol.func.html b/coverage/src/modules/RuleEngineValidationRead.sol.func.html
deleted file mode 100644
index 99e3c1c..0000000
--- a/coverage/src/modules/RuleEngineValidationRead.sol.func.html
+++ /dev/null
@@ -1,97 +0,0 @@
-
-
-
-
-
-
-
-
-
-
- LCOV - code coverage report
-
- ![]()
-
-
-
-
-
-
-
-
- Current view:
- top level - src/modules - RuleEngineValidationRead.sol (source / functions)
-
-
- Hit
- Total
- Coverage
-
-
- Test:
- lcov.info
-
- Lines:
- 20
- 20
- 100.0 %
-
-
- Date:
- 2025-08-08 14:05:19
-
- Functions:
- 4
- 4
- 100.0 %
-
-
-
-
-
- Branches:
- 2
- 2
- 100.0 %
-
- ![]()
- ![]()
-
-
-
-
- Function Name
- ![]()
Hit count
- ![]()
-
- RuleEngineValidationRead.canTransferValidation
- 2
-
-
- RuleEngineValidationRead.canTransferValidationFrom
- 1
-
-
- RuleEngineValidationRead.detectTransferRestrictionValidation
- 5
-
-
- RuleEngineValidationRead.detectTransferRestrictionValidationFrom
- 1
-
-
-
-
- ![]()
- Generated by: LCOV version 1.16
-
-
-
diff --git a/coverage/src/modules/RuleEngineValidationRead.sol.gcov.html b/coverage/src/modules/RuleEngineValidationRead.sol.gcov.html
deleted file mode 100644
index c2a59ca..0000000
--- a/coverage/src/modules/RuleEngineValidationRead.sol.gcov.html
+++ /dev/null
@@ -1,185 +0,0 @@
-
-
-
-
-
-
-
-
-
-
- LCOV - code coverage report
-
- ![]()
-
-
-
-
-
-
-
-
- Current view:
- top level - src/modules - RuleEngineValidationRead.sol (source / functions)
-
-
- Hit
- Total
- Coverage
-
-
- Test:
- lcov.info
-
- Lines:
- 20
- 20
- 100.0 %
-
-
- Date:
- 2025-08-08 14:05:19
-
- Functions:
- 4
- 4
- 100.0 %
-
-
-
-
-
- Branches:
- 2
- 2
- 100.0 %
-
- ![]()
- ![]()
-
-
-
-
- ![]()
- Generated by: LCOV version 1.16
-
-
-
diff --git a/coverage/src/modules/index-sort-b.html b/coverage/src/modules/index-sort-b.html
deleted file mode 100644
index 699a523..0000000
--- a/coverage/src/modules/index-sort-b.html
+++ /dev/null
@@ -1,143 +0,0 @@
-
-
-
-
-
-
-
-
-
-
- LCOV - code coverage report
-
- ![]()
-
-
-
-
-
-
-
-
- Current view:
- top level - src/modules
-
-
- Hit
- Total
- Coverage
-
-
- Test:
- lcov.info
-
- Lines:
- 121
- 123
- 98.4 %
-
-
- Date:
- 2025-08-08 14:05:19
-
- Functions:
- 33
- 35
- 94.3 %
-
-
-
-
-
- Branches:
- 20
- 23
- 87.0 %
-
- ![]()
- ![]()
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Filename
- ![]()
Line Coverage
- ![]()
Functions
- ![]()
Branches
- ![]()
-
- ERC3643Compliance.sol
-
-
-
- ![]()
100.0 %
- 24 / 24
- 100.0 %
- 8 / 8
- 66.7 %
- 6 / 9
-
-
- RuleEngineValidationRead.sol
-
-
-
- ![]()
100.0 %
- 20 / 20
- 100.0 %
- 4 / 4
- 100.0 %
- 2 / 2
-
-
- RuleEngineOperation.sol
-
-
-
- ![]()
![]()
97.6 %
- 40 / 41
- 91.7 %
- 11 / 12
- 100.0 %
- 6 / 6
-
-
- RuleEngineValidation.sol
-
-
-
- ![]()
![]()
97.4 %
- 37 / 38
- 90.9 %
- 10 / 11
- 100.0 %
- 6 / 6
-
-
-
-
-
- ![]()
- Generated by: LCOV version 1.16
-
-
-
diff --git a/coverage/src/modules/index-sort-f.html b/coverage/src/modules/index-sort-f.html
deleted file mode 100644
index 2cf357d..0000000
--- a/coverage/src/modules/index-sort-f.html
+++ /dev/null
@@ -1,143 +0,0 @@
-
-
-
-
-
-
-
-
-
-
- LCOV - code coverage report
-
- ![]()
-
-
-
-
-
-
-
-
- Current view:
- top level - src/modules
-
-
- Hit
- Total
- Coverage
-
-
- Test:
- lcov.info
-
- Lines:
- 121
- 123
- 98.4 %
-
-
- Date:
- 2025-08-08 14:05:19
-
- Functions:
- 33
- 35
- 94.3 %
-
-
-
-
-
- Branches:
- 20
- 23
- 87.0 %
-
- ![]()
- ![]()
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Filename
- ![]()
Line Coverage
- ![]()
Functions
- ![]()
Branches
- ![]()
-
- RuleEngineValidation.sol
-
-
-
- ![]()
![]()
97.4 %
- 37 / 38
- 90.9 %
- 10 / 11
- 100.0 %
- 6 / 6
-
-
- RuleEngineOperation.sol
-
-
-
- ![]()
![]()
97.6 %
- 40 / 41
- 91.7 %
- 11 / 12
- 100.0 %
- 6 / 6
-
-
- RuleEngineValidationRead.sol
-
-
-
- ![]()
100.0 %
- 20 / 20
- 100.0 %
- 4 / 4
- 100.0 %
- 2 / 2
-
-
- ERC3643Compliance.sol
-
-
-
- ![]()
100.0 %
- 24 / 24
- 100.0 %
- 8 / 8
- 66.7 %
- 6 / 9
-
-
-
-
-
- ![]()
- Generated by: LCOV version 1.16
-
-
-
diff --git a/coverage/src/modules/index-sort-l.html b/coverage/src/modules/index-sort-l.html
deleted file mode 100644
index d749143..0000000
--- a/coverage/src/modules/index-sort-l.html
+++ /dev/null
@@ -1,143 +0,0 @@
-
-
-
-
-
-
-
-
-
-
- LCOV - code coverage report
-
- ![]()
-
-
-
-
-
-
-
-
- Current view:
- top level - src/modules
-
-
- Hit
- Total
- Coverage
-
-
- Test:
- lcov.info
-
- Lines:
- 121
- 123
- 98.4 %
-
-
- Date:
- 2025-08-08 14:05:19
-
- Functions:
- 33
- 35
- 94.3 %
-
-
-
-
-
- Branches:
- 20
- 23
- 87.0 %
-
- ![]()
- ![]()
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Filename
- ![]()
Line Coverage
- ![]()
Functions
- ![]()
Branches
- ![]()
-
- RuleEngineValidation.sol
-
-
-
- ![]()
![]()
97.4 %
- 37 / 38
- 90.9 %
- 10 / 11
- 100.0 %
- 6 / 6
-
-
- RuleEngineOperation.sol
-
-
-
- ![]()
![]()
97.6 %
- 40 / 41
- 91.7 %
- 11 / 12
- 100.0 %
- 6 / 6
-
-
- RuleEngineValidationRead.sol
-
-
-
- ![]()
100.0 %
- 20 / 20
- 100.0 %
- 4 / 4
- 100.0 %
- 2 / 2
-
-
- ERC3643Compliance.sol
-
-
-
- ![]()
100.0 %
- 24 / 24
- 100.0 %
- 8 / 8
- 66.7 %
- 6 / 9
-
-
-
-
-
- ![]()
- Generated by: LCOV version 1.16
-
-
-
diff --git a/coverage/src/modules/index.html b/coverage/src/modules/index.html
deleted file mode 100644
index a079cda..0000000
--- a/coverage/src/modules/index.html
+++ /dev/null
@@ -1,143 +0,0 @@
-
-
-
-
-
-
-
-
-
-
- LCOV - code coverage report
-
- ![]()
-
-
-
-
-
-
-
-
- Current view:
- top level - src/modules
-
-
- Hit
- Total
- Coverage
-
-
- Test:
- lcov.info
-
- Lines:
- 121
- 123
- 98.4 %
-
-
- Date:
- 2025-08-08 14:05:19
-
- Functions:
- 33
- 35
- 94.3 %
-
-
-
-
-
- Branches:
- 20
- 23
- 87.0 %
-
- ![]()
- ![]()
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Filename
- ![]()
Line Coverage
- ![]()
Functions
- ![]()
Branches
- ![]()
-
- ERC3643Compliance.sol
-
-
-
- ![]()
100.0 %
- 24 / 24
- 100.0 %
- 8 / 8
- 66.7 %
- 6 / 9
-
-
- RuleEngineOperation.sol
-
-
-
- ![]()
![]()
97.6 %
- 40 / 41
- 91.7 %
- 11 / 12
- 100.0 %
- 6 / 6
-
-
- RuleEngineValidation.sol
-
-
-
- ![]()
![]()
97.4 %
- 37 / 38
- 90.9 %
- 10 / 11
- 100.0 %
- 6 / 6
-
-
- RuleEngineValidationRead.sol
-
-
-
- ![]()
100.0 %
- 20 / 20
- 100.0 %
- 4 / 4
- 100.0 %
- 2 / 2
-
-
-
-
-
- ![]()
- Generated by: LCOV version 1.16
-
-
-
diff --git a/coverage/updown.png b/coverage/updown.png
deleted file mode 100644
index aa56a238b3e6c435265250f9266cd1b8caba0f20..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 117
zcmeAS@N?(olHy`uVBq!ia0vp^AT}Qd8;}%R+`Ae`*?77*hG?8mPHM(QI`;TLgB~r4XOpMeUV$T}lo&u^&@@q%nlIm#3S{
zW&pN|e!}K~V=U9ftNh9R9i>qeBfHl+ugWs+O9;I%>r|g$_Ux)WO)hDaS^%_zkzI
z3td&Nu+EWk0WMLkNzOdgbQFnS5hKFzu-^)q`U-DdYA*ni^?EHvoJF+@meWaVPj0YX
zBsi}TTv<<6