6 Found Instances
-- Found in src/rules/validation/abstract/RuleAddressSet/RuleAddressSetInternal.sol [Line: 42](src/rules/validation/abstract/RuleAddressSet/RuleAddressSetInternal.sol#L42)
+- Found in src/rules/validation/abstract/RuleAddressSet/RuleAddressSetInternal.sol [Line: 39](src/rules/validation/abstract/RuleAddressSet/RuleAddressSetInternal.sol#L39)
```solidity
for (uint256 i = 0; i < addressesToAdd.length; ++i) {
```
-- Found in src/rules/validation/abstract/RuleAddressSet/RuleAddressSetInternal.sol [Line: 64](src/rules/validation/abstract/RuleAddressSet/RuleAddressSetInternal.sol#L64)
+- Found in src/rules/validation/abstract/RuleAddressSet/RuleAddressSetInternal.sol [Line: 61](src/rules/validation/abstract/RuleAddressSet/RuleAddressSetInternal.sol#L61)
```solidity
for (uint256 i = 0; i < addressesToRemove.length; ++i) {
@@ -1268,7 +1405,7 @@ Invoking `SSTORE` operations in loops may waste gas. Use a local variable to hol
-## L-9: Unchecked Return
+## L-10: Unchecked Return
Function returns a value but it is ignored. Consider checking the return value.
@@ -1293,13 +1430,13 @@ Function returns a value but it is ignored. Consider checking the return value.
_removeAddresses(targetAddresses);
```
-- Found in src/rules/validation/abstract/RuleAddressSet/RuleAddressSetInternal.sol [Line: 78](src/rules/validation/abstract/RuleAddressSet/RuleAddressSetInternal.sol#L78)
+- Found in src/rules/validation/abstract/RuleAddressSet/RuleAddressSetInternal.sol [Line: 75](src/rules/validation/abstract/RuleAddressSet/RuleAddressSetInternal.sol#L75)
```solidity
_listedAddresses.add(targetAddress);
```
-- Found in src/rules/validation/abstract/RuleAddressSet/RuleAddressSetInternal.sol [Line: 86](src/rules/validation/abstract/RuleAddressSet/RuleAddressSetInternal.sol#L86)
+- Found in src/rules/validation/abstract/RuleAddressSet/RuleAddressSetInternal.sol [Line: 83](src/rules/validation/abstract/RuleAddressSet/RuleAddressSetInternal.sol#L83)
```solidity
_listedAddresses.remove(targetAddress);
@@ -1329,25 +1466,25 @@ Function returns a value but it is ignored. Consider checking the return value.
_frozenlist.remove(targetAddress);
```
-- Found in src/rules/validation/abstract/base/RuleERC2980Base.sol [Line: 168](src/rules/validation/abstract/base/RuleERC2980Base.sol#L168)
+- Found in src/rules/validation/abstract/base/RuleERC2980Base.sol [Line: 166](src/rules/validation/abstract/base/RuleERC2980Base.sol#L166)
```solidity
_addWhitelistAddresses(targetAddresses);
```
-- Found in src/rules/validation/abstract/base/RuleERC2980Base.sol [Line: 177](src/rules/validation/abstract/base/RuleERC2980Base.sol#L177)
+- Found in src/rules/validation/abstract/base/RuleERC2980Base.sol [Line: 175](src/rules/validation/abstract/base/RuleERC2980Base.sol#L175)
```solidity
_removeWhitelistAddresses(targetAddresses);
```
-- Found in src/rules/validation/abstract/base/RuleERC2980Base.sol [Line: 264](src/rules/validation/abstract/base/RuleERC2980Base.sol#L264)
+- Found in src/rules/validation/abstract/base/RuleERC2980Base.sol [Line: 256](src/rules/validation/abstract/base/RuleERC2980Base.sol#L256)
```solidity
_addFrozenlistAddresses(targetAddresses);
```
-- Found in src/rules/validation/abstract/base/RuleERC2980Base.sol [Line: 273](src/rules/validation/abstract/base/RuleERC2980Base.sol#L273)
+- Found in src/rules/validation/abstract/base/RuleERC2980Base.sol [Line: 265](src/rules/validation/abstract/base/RuleERC2980Base.sol#L265)
```solidity
_removeFrozenlistAddresses(targetAddresses);
diff --git a/src/rules/operation/abstract/RuleConditionalTransferLightInvariantStorage.sol b/src/rules/operation/abstract/RuleConditionalTransferLightInvariantStorage.sol
index 5ac58c4..6c9cf92 100644
--- a/src/rules/operation/abstract/RuleConditionalTransferLightInvariantStorage.sol
+++ b/src/rules/operation/abstract/RuleConditionalTransferLightInvariantStorage.sol
@@ -1,9 +1,9 @@
// SPDX-License-Identifier: MPL-2.0
pragma solidity ^0.8.20;
-import {RuleCommonInvariantStorage} from "../../validation/abstract/invariant/RuleCommonInvariantStorage.sol";
+import {RuleSharedInvariantStorage} from "../../validation/abstract/invariant/RuleSharedInvariantStorage.sol";
-abstract contract RuleConditionalTransferLightInvariantStorage is RuleCommonInvariantStorage {
+abstract contract RuleConditionalTransferLightInvariantStorage is RuleSharedInvariantStorage {
/* ============ Role ============ */
bytes32 public constant OPERATOR_ROLE = keccak256("OPERATOR_ROLE");
diff --git a/src/rules/validation/abstract/RuleAddressSet/invariantStorage/RuleBlacklistInvariantStorage.sol b/src/rules/validation/abstract/RuleAddressSet/invariantStorage/RuleBlacklistInvariantStorage.sol
index 247470a..02fa84a 100644
--- a/src/rules/validation/abstract/RuleAddressSet/invariantStorage/RuleBlacklistInvariantStorage.sol
+++ b/src/rules/validation/abstract/RuleAddressSet/invariantStorage/RuleBlacklistInvariantStorage.sol
@@ -2,9 +2,9 @@
pragma solidity ^0.8.20;
-import {RuleCommonInvariantStorage} from "../../invariant/RuleCommonInvariantStorage.sol";
+import {RuleSharedInvariantStorage} from "../../invariant/RuleSharedInvariantStorage.sol";
-abstract contract RuleBlacklistInvariantStorage is RuleCommonInvariantStorage {
+abstract contract RuleBlacklistInvariantStorage is RuleSharedInvariantStorage {
error RuleBlacklist_InvalidTransfer(address rule, address from, address to, uint256 value, uint8 code);
error RuleBlacklist_InvalidTransferFrom(
address rule, address spender, address from, address to, uint256 value, uint8 code
diff --git a/src/rules/validation/abstract/RuleAddressSet/invariantStorage/RuleWhitelistInvariantStorage.sol b/src/rules/validation/abstract/RuleAddressSet/invariantStorage/RuleWhitelistInvariantStorage.sol
index 637dd4c..eed9da1 100644
--- a/src/rules/validation/abstract/RuleAddressSet/invariantStorage/RuleWhitelistInvariantStorage.sol
+++ b/src/rules/validation/abstract/RuleAddressSet/invariantStorage/RuleWhitelistInvariantStorage.sol
@@ -2,9 +2,9 @@
pragma solidity ^0.8.20;
-import {RuleCommonInvariantStorage} from "../../invariant/RuleCommonInvariantStorage.sol";
+import {RuleSharedInvariantStorage} from "../../invariant/RuleSharedInvariantStorage.sol";
-abstract contract RuleWhitelistInvariantStorage is RuleCommonInvariantStorage {
+abstract contract RuleWhitelistInvariantStorage is RuleSharedInvariantStorage {
error RuleWhitelist_InvalidTransfer(address rule, address from, address to, uint256 value, uint8 code);
error RuleWhitelist_InvalidTransferFrom(
address rule, address spender, address from, address to, uint256 value, uint8 code
diff --git a/src/rules/validation/abstract/RuleERC2980/invariantStorage/RuleERC2980InvariantStorage.sol b/src/rules/validation/abstract/RuleERC2980/invariantStorage/RuleERC2980InvariantStorage.sol
index ce5c4de..8160ff8 100644
--- a/src/rules/validation/abstract/RuleERC2980/invariantStorage/RuleERC2980InvariantStorage.sol
+++ b/src/rules/validation/abstract/RuleERC2980/invariantStorage/RuleERC2980InvariantStorage.sol
@@ -1,9 +1,9 @@
// SPDX-License-Identifier: MPL-2.0
pragma solidity ^0.8.20;
-import {RuleCommonInvariantStorage} from "../../invariant/RuleCommonInvariantStorage.sol";
+import {RuleSharedInvariantStorage} from "../../invariant/RuleSharedInvariantStorage.sol";
-abstract contract RuleERC2980InvariantStorage is RuleCommonInvariantStorage {
+abstract contract RuleERC2980InvariantStorage is RuleSharedInvariantStorage {
/* ============ Custom errors ============ */
error RuleERC2980_InvalidTransfer(address rule, address from, address to, uint256 value, uint8 code);
error RuleERC2980_InvalidTransferFrom(
diff --git a/src/rules/validation/abstract/invariant/RuleIdentityRegistryInvariantStorage.sol b/src/rules/validation/abstract/invariant/RuleIdentityRegistryInvariantStorage.sol
index 3a35f19..5b6833e 100644
--- a/src/rules/validation/abstract/invariant/RuleIdentityRegistryInvariantStorage.sol
+++ b/src/rules/validation/abstract/invariant/RuleIdentityRegistryInvariantStorage.sol
@@ -1,9 +1,9 @@
// SPDX-License-Identifier: MPL-2.0
pragma solidity ^0.8.20;
-import {RuleCommonInvariantStorage} from "./RuleCommonInvariantStorage.sol";
+import {RuleSharedInvariantStorage} from "./RuleSharedInvariantStorage.sol";
-abstract contract RuleIdentityRegistryInvariantStorage is RuleCommonInvariantStorage {
+abstract contract RuleIdentityRegistryInvariantStorage is RuleSharedInvariantStorage {
error RuleIdentityRegistry_InvalidTransfer(address rule, address from, address to, uint256 value, uint8 code);
error RuleIdentityRegistry_InvalidTransferFrom(
address rule, address spender, address from, address to, uint256 value, uint8 code
diff --git a/src/rules/validation/abstract/invariant/RuleMaxTotalSupplyInvariantStorage.sol b/src/rules/validation/abstract/invariant/RuleMaxTotalSupplyInvariantStorage.sol
index 0c6f8a3..ad3d3bd 100644
--- a/src/rules/validation/abstract/invariant/RuleMaxTotalSupplyInvariantStorage.sol
+++ b/src/rules/validation/abstract/invariant/RuleMaxTotalSupplyInvariantStorage.sol
@@ -1,9 +1,9 @@
// SPDX-License-Identifier: MPL-2.0
pragma solidity ^0.8.20;
-import {RuleCommonInvariantStorage} from "./RuleCommonInvariantStorage.sol";
+import {RuleSharedInvariantStorage} from "./RuleSharedInvariantStorage.sol";
-abstract contract RuleMaxTotalSupplyInvariantStorage is RuleCommonInvariantStorage {
+abstract contract RuleMaxTotalSupplyInvariantStorage is RuleSharedInvariantStorage {
error RuleMaxTotalSupply_InvalidTransfer(address rule, address from, address to, uint256 value, uint8 code);
error RuleMaxTotalSupply_InvalidTransferFrom(
address rule, address spender, address from, address to, uint256 value, uint8 code
diff --git a/src/rules/validation/abstract/invariant/RuleSanctionsListInvariantStorage.sol b/src/rules/validation/abstract/invariant/RuleSanctionsListInvariantStorage.sol
index 31ae3f0..27d3c95 100644
--- a/src/rules/validation/abstract/invariant/RuleSanctionsListInvariantStorage.sol
+++ b/src/rules/validation/abstract/invariant/RuleSanctionsListInvariantStorage.sol
@@ -2,10 +2,10 @@
pragma solidity ^0.8.20;
-import {RuleCommonInvariantStorage} from "./RuleCommonInvariantStorage.sol";
+import {RuleSharedInvariantStorage} from "./RuleSharedInvariantStorage.sol";
import {ISanctionsList} from "../../../interfaces/ISanctionsList.sol";
-abstract contract RuleSanctionsListInvariantStorage is RuleCommonInvariantStorage {
+abstract contract RuleSanctionsListInvariantStorage is RuleSharedInvariantStorage {
/* ============ Event ============ */
event SetSanctionListOracle(ISanctionsList newOracle);
/* ============ Custom errors ============ */
diff --git a/src/rules/validation/abstract/invariant/RuleCommonInvariantStorage.sol b/src/rules/validation/abstract/invariant/RuleSharedInvariantStorage.sol
similarity index 79%
rename from src/rules/validation/abstract/invariant/RuleCommonInvariantStorage.sol
rename to src/rules/validation/abstract/invariant/RuleSharedInvariantStorage.sol
index e4cd505..e04dabf 100644
--- a/src/rules/validation/abstract/invariant/RuleCommonInvariantStorage.sol
+++ b/src/rules/validation/abstract/invariant/RuleSharedInvariantStorage.sol
@@ -1,7 +1,7 @@
// SPDX-License-Identifier: MPL-2.0
pragma solidity ^0.8.20;
-abstract contract RuleCommonInvariantStorage {
+abstract contract RuleSharedInvariantStorage {
/* ============ String message ============ */
string constant TEXT_CODE_NOT_FOUND = "Unknown restriction code";
}
diff --git a/src/rules/validation/abstract/invariant/RuleSpenderWhitelistInvariantStorage.sol b/src/rules/validation/abstract/invariant/RuleSpenderWhitelistInvariantStorage.sol
index 97f77b1..dc8bd63 100644
--- a/src/rules/validation/abstract/invariant/RuleSpenderWhitelistInvariantStorage.sol
+++ b/src/rules/validation/abstract/invariant/RuleSpenderWhitelistInvariantStorage.sol
@@ -1,9 +1,9 @@
// SPDX-License-Identifier: MPL-2.0
pragma solidity ^0.8.20;
-import {RuleCommonInvariantStorage} from "./RuleCommonInvariantStorage.sol";
+import {RuleSharedInvariantStorage} from "./RuleSharedInvariantStorage.sol";
-abstract contract RuleSpenderWhitelistInvariantStorage is RuleCommonInvariantStorage {
+abstract contract RuleSpenderWhitelistInvariantStorage is RuleSharedInvariantStorage {
// It is very important that each rule uses an unique code
uint8 public constant CODE_ADDRESS_SPENDER_NOT_WHITELISTED = 66;
string constant TEXT_ADDRESS_SPENDER_NOT_WHITELISTED = "SpenderWhitelist: Spender is not whitelisted";
diff --git a/test/DeploymentScripts/DeployCMTATWithBlacklistAndSanctionsList.t.sol b/test/DeploymentScripts/DeployCMTATWithBlacklistAndSanctionsList.t.sol
index 24d8ea3..911fe97 100644
--- a/test/DeploymentScripts/DeployCMTATWithBlacklistAndSanctionsList.t.sol
+++ b/test/DeploymentScripts/DeployCMTATWithBlacklistAndSanctionsList.t.sol
@@ -117,7 +117,8 @@ contract DeployCMTATWithBlacklistAndSanctionsListTest is
CODE_ADDRESS_FROM_IS_BLACKLISTED
)
);
- assertTrue(token.transfer(ADDRESS2, amount));
+ // forge-lint: disable-next-line(erc20-unchecked-transfer)
+ token.transfer(ADDRESS2, amount);
}
function testDetectTransferRestrictionWhenSenderBlacklisted() public {
@@ -148,7 +149,8 @@ contract DeployCMTATWithBlacklistAndSanctionsListTest is
CODE_ADDRESS_TO_IS_BLACKLISTED
)
);
- assertTrue(token.transfer(ADDRESS2, amount));
+ // forge-lint: disable-next-line(erc20-unchecked-transfer)
+ token.transfer(ADDRESS2, amount);
}
function testDetectTransferRestrictionWhenRecipientBlacklisted() public {
@@ -178,7 +180,8 @@ contract DeployCMTATWithBlacklistAndSanctionsListTest is
CODE_ADDRESS_FROM_IS_SANCTIONED
)
);
- assertTrue(token.transfer(ADDRESS2, amount));
+ // forge-lint: disable-next-line(erc20-unchecked-transfer)
+ token.transfer(ADDRESS2, amount);
}
function testDetectTransferRestrictionWhenSenderSanctioned() public {
@@ -207,7 +210,8 @@ contract DeployCMTATWithBlacklistAndSanctionsListTest is
CODE_ADDRESS_TO_IS_SANCTIONED
)
);
- assertTrue(token.transfer(ADDRESS2, amount));
+ // forge-lint: disable-next-line(erc20-unchecked-transfer)
+ token.transfer(ADDRESS2, amount);
}
function testDetectTransferRestrictionWhenRecipientSanctioned() public {
diff --git a/test/RuleBlacklist/CMTATIntegration.t.sol b/test/RuleBlacklist/CMTATIntegration.t.sol
index 97bfe5a..0c0cdf6 100644
--- a/test/RuleBlacklist/CMTATIntegration.t.sol
+++ b/test/RuleBlacklist/CMTATIntegration.t.sol
@@ -67,7 +67,8 @@ contract CMTATIntegration is Test, HelperContract {
)
);
// Act
- assertTrue(cmtatContract.transfer(ADDRESS2, amount));
+ // forge-lint: disable-next-line(erc20-unchecked-transfer)
+ cmtatContract.transfer(ADDRESS2, amount);
}
function testCannotTransferIfAddressFronIsBlacklisted() public {
@@ -88,7 +89,8 @@ contract CMTATIntegration is Test, HelperContract {
)
);
// Act
- assertTrue(cmtatContract.transfer(ADDRESS2, amount));
+ // forge-lint: disable-next-line(erc20-unchecked-transfer)
+ cmtatContract.transfer(ADDRESS2, amount);
}
function testCannotTransferIfBothAddressesAreBlacklisted() public {
@@ -113,7 +115,8 @@ contract CMTATIntegration is Test, HelperContract {
CODE_ADDRESS_FROM_IS_BLACKLISTED
)
);
- assertTrue(cmtatContract.transfer(ADDRESS2, amount));
+ // forge-lint: disable-next-line(erc20-unchecked-transfer)
+ cmtatContract.transfer(ADDRESS2, amount);
}
/**
diff --git a/test/RuleBlacklist/CMTATIntegrationDirect.t.sol b/test/RuleBlacklist/CMTATIntegrationDirect.t.sol
index c5e1769..9e47b29 100644
--- a/test/RuleBlacklist/CMTATIntegrationDirect.t.sol
+++ b/test/RuleBlacklist/CMTATIntegrationDirect.t.sol
@@ -60,7 +60,8 @@ contract CMTATIntegrationDirectBlacklist is Test, HelperContract {
CODE_ADDRESS_TO_IS_BLACKLISTED
)
);
- assertTrue(cmtatContract.transfer(ADDRESS2, amount));
+ // forge-lint: disable-next-line(erc20-unchecked-transfer)
+ cmtatContract.transfer(ADDRESS2, amount);
}
function testCannotTransferIfAddressFromIsBlacklisted() public {
@@ -79,7 +80,8 @@ contract CMTATIntegrationDirectBlacklist is Test, HelperContract {
CODE_ADDRESS_FROM_IS_BLACKLISTED
)
);
- assertTrue(cmtatContract.transfer(ADDRESS2, amount));
+ // forge-lint: disable-next-line(erc20-unchecked-transfer)
+ cmtatContract.transfer(ADDRESS2, amount);
}
function testCannotTransferIfBothAddressesAreBlacklisted() public {
@@ -102,7 +104,8 @@ contract CMTATIntegrationDirectBlacklist is Test, HelperContract {
CODE_ADDRESS_FROM_IS_BLACKLISTED
)
);
- assertTrue(cmtatContract.transfer(ADDRESS2, amount));
+ // forge-lint: disable-next-line(erc20-unchecked-transfer)
+ cmtatContract.transfer(ADDRESS2, amount);
}
/* ---------------- Detect & Message Tests ---------------- */
diff --git a/test/RuleWhitelist/CMTATIntegration.t.sol b/test/RuleWhitelist/CMTATIntegration.t.sol
index 933304a..facee60 100644
--- a/test/RuleWhitelist/CMTATIntegration.t.sol
+++ b/test/RuleWhitelist/CMTATIntegration.t.sol
@@ -56,7 +56,8 @@ contract CMTATIntegration is Test, HelperContract {
)
);
// Act
- assertTrue(cmtatContract.transfer(ADDRESS2, 21));
+ // forge-lint: disable-next-line(erc20-unchecked-transfer)
+ cmtatContract.transfer(ADDRESS2, 21);
}
function testCannotTransferWithoutFromAddressWhitelisted() public {
@@ -77,7 +78,8 @@ contract CMTATIntegration is Test, HelperContract {
)
);
// Act
- assertTrue(cmtatContract.transfer(ADDRESS2, amount));
+ // forge-lint: disable-next-line(erc20-unchecked-transfer)
+ cmtatContract.transfer(ADDRESS2, amount);
}
function testCannotTransferWithoutToAddressWhitelisted() public {
@@ -98,7 +100,8 @@ contract CMTATIntegration is Test, HelperContract {
)
);
// Act
- assertTrue(cmtatContract.transfer(ADDRESS2, amount));
+ // forge-lint: disable-next-line(erc20-unchecked-transfer)
+ cmtatContract.transfer(ADDRESS2, amount);
}
function testCanMakeATransfer() public {
diff --git a/test/RuleWhitelist/CMTATIntegrationWhitelistWrapper.t.sol b/test/RuleWhitelist/CMTATIntegrationWhitelistWrapper.t.sol
index 6f036c4..cfd27a1 100644
--- a/test/RuleWhitelist/CMTATIntegrationWhitelistWrapper.t.sol
+++ b/test/RuleWhitelist/CMTATIntegrationWhitelistWrapper.t.sol
@@ -79,7 +79,8 @@ contract CMTATIntegrationWhitelistWrapper is Test, HelperContract {
)
);
// Act
- assertTrue(cmtatContract.transfer(ADDRESS2, 21));
+ // forge-lint: disable-next-line(erc20-unchecked-transfer)
+ cmtatContract.transfer(ADDRESS2, 21);
}
function testCannotTransferWithoutFromAddressWhitelisted() public {
@@ -100,7 +101,8 @@ contract CMTATIntegrationWhitelistWrapper is Test, HelperContract {
)
);
// Act
- assertTrue(cmtatContract.transfer(ADDRESS2, amount));
+ // forge-lint: disable-next-line(erc20-unchecked-transfer)
+ cmtatContract.transfer(ADDRESS2, amount);
}
function testCannotTransferWithoutToAddressWhitelisted() public {
@@ -121,7 +123,8 @@ contract CMTATIntegrationWhitelistWrapper is Test, HelperContract {
)
);
// Act
- assertTrue(cmtatContract.transfer(ADDRESS2, amount));
+ // forge-lint: disable-next-line(erc20-unchecked-transfer)
+ cmtatContract.transfer(ADDRESS2, amount);
}
function testCanMakeATransferIfWhitelistedInSeveralDifferentList() public {
diff --git a/test/TransferContext/TransferContextMocks.t.sol b/test/TransferContext/TransferContextMocks.t.sol
index dfc0bc1..7a6ba96 100644
--- a/test/TransferContext/TransferContextMocks.t.sol
+++ b/test/TransferContext/TransferContextMocks.t.sol
@@ -69,7 +69,8 @@ contract TransferContextMocksTest is Test, HelperContract {
vm.expectRevert();
vm.prank(ADDRESS3);
- assertTrue(erc20.transferFrom(ADDRESS1, ADDRESS2, 10));
+ // forge-lint: disable-next-line(erc20-unchecked-transfer)
+ erc20.transferFrom(ADDRESS1, ADDRESS2, 10);
vm.prank(DEFAULT_ADMIN_ADDRESS);
rule.addAddress(ADDRESS3);
From 8caf02e768a01783a43db6dd7825caf697947899 Mon Sep 17 00:00:00 2001
From: Ryan Sauge <71391932+rya-sge@users.noreply.github.com>
Date: Tue, 10 Mar 2026 16:13:24 +0100
Subject: [PATCH 6/8] Update audit report with Aderyn and Slither
---
README.md | 9 +-
doc/TOOLCHAIN.md | 15 +-
.../tools/v0.2.0/aderyn-report-feedback.md | 5 +-
.../audits/tools/v0.2.0/aderyn-report.md | 52 +--
.../tools/v0.2.0/slither-report-feedback.md | 45 +-
.../audits/tools/v0.2.0/slither-report.md | 431 +++++++++---------
6 files changed, 276 insertions(+), 281 deletions(-)
diff --git a/README.md b/README.md
index dd9bdb0..036f319 100644
--- a/README.md
+++ b/README.md
@@ -6,7 +6,7 @@ Each rule can be used **standalone**, directly plugged into a CMTAT token, **or*
**Status:** *Repository under active development*
-Latest update: transfer-context token mocks now use OpenZeppelin ERC-20/ERC-721; test utilities and harness contracts were moved from `test/` to `src/mocks` and `src/mocks/harness`; context spender handling remains `sender == from` => direct transfer.
+Latest update: transfer-context token mocks now use OpenZeppelin ERC-20/ERC-721; test utilities and harness contracts were moved from `test/` to `src/mocks` and `src/mocks/harness`; context spender handling remains `sender == from` => direct transfer; audit L-8 fixed by removing an unused conditional-transfer custom error.
## Schema
@@ -1645,11 +1645,12 @@ Static analysis was performed with [Slither](https://github.com/crytic/slither).
|---|---|---|---|
| arbitrary-send-erc20 | High | 1 | False positive — `from` is guarded by `onlyTransferApprover`, ERC-20 allowance check, and a pre-recorded approval |
| unused-return | Medium | 6 | False positive — existence pre-checked at public layer before calling internal helper |
-| calls-loop | Low | 15 | Acknowledged — by design; wrapper must query each child rule; child rules are read-only |
-| dead-code | Informational | 14 | False positive — `_msgData()` overrides required for ERC-2771 diamond resolution; `_transferred` override is reachable |
+| calls-loop | Low | 16 | Acknowledged — by design; wrapper must query each child rule; child rules are read-only |
+| assembly | Informational | 1 | Acknowledged — intentional gas optimisation in `_transferHash`; minimal and well-scoped |
+| missing-inheritance | Informational | 1 | Acknowledged — `TotalSupplyMock` is a test-only mock; strict interface declaration unnecessary |
| naming-convention | Informational | 2 | Acknowledged — parameter names match ERC-2980 spec |
| unindexed-event-address | Informational | 2 | Out of scope (both in `lib/RuleEngine`); `IAddressList` events previously fixed |
-| unused-state | Informational | 48 | False positive — `RuleNFTAdapter` constants used in base dispatch logic; Slither per-contract analysis limitation |
+| unused-state | Informational | 60 | False positive — `RuleNFTAdapter` constants used in base dispatch logic; Slither per-contract analysis limitation |
## Intellectual property
diff --git a/doc/TOOLCHAIN.md b/doc/TOOLCHAIN.md
index 740ae57..507bdce 100644
--- a/doc/TOOLCHAIN.md
+++ b/doc/TOOLCHAIN.md
@@ -2,8 +2,6 @@
[TOC]
-
-
## Node.JS package
This part describe the list of libraries present in the file `package.json`.
@@ -16,23 +14,12 @@ This section concerns the packages installed in the section `devDependencies` of
[Hardhat](https://hardhat.org/) plugin for integration with Foundry
-**[Ethlint](https://github.com/duaraghav8/Ethlint)**
-Solidity static analyzer.
-
-**[prettier-plugin-solidity](https://github.com/prettier-solidity/prettier-plugin-solidity)**
-
-A [Prettier plugin](https://prettier.io/docs/en/plugins.html) for automatically formatting your [Solidity](https://github.com/ethereum/solidity) code.
-
#### Documentation
**[sol2uml](https://github.com/naddison36/sol2uml)**
Generate UML for smart contracts
-**[solidity-docgen](https://github.com/OpenZeppelin/solidity-docgen)**
-
-Program that extracts documentation for a Solidity project.
-
**[Surya](https://github.com/ConsenSys/surya)**
Utility tool for smart contract systems.
@@ -116,7 +103,7 @@ npm run-script surya:report
>Slither is a Solidity static analysis framework written in Python3
```bash
-slither . --checklist --filter-paths "openzeppelin-contracts|test|mocksCMTAT|forge-std" > slither-report.md
+slither . --checklist --filter-paths "openzeppelin-contracts|test|mocks|CMTAT|forge-std" > slither-report.md
```
diff --git a/doc/security/audits/tools/v0.2.0/aderyn-report-feedback.md b/doc/security/audits/tools/v0.2.0/aderyn-report-feedback.md
index c6a6e41..7d7d7ae 100644
--- a/doc/security/audits/tools/v0.2.0/aderyn-report-feedback.md
+++ b/doc/security/audits/tools/v0.2.0/aderyn-report-feedback.md
@@ -2,7 +2,7 @@
Report version: `v0.2.0`
Aderyn report: [aderyn-report.md](./aderyn-report.md)
-Feedback date: 2026-03-09
+Feedback date: 2026-03-10
This document provides the project team's assessment of each finding reported by the Aderyn static analyser. For each issue the verdict is one of:
@@ -10,6 +10,7 @@ This document provides the project team's assessment of each finding reported by
|---|---|
| **Acknowledged** | Known, accepted by design; no change planned. |
| **Acknowledged — low impact** | Technically valid but the actual risk is negligible given context. |
+| **Fixed** | Resolved in the codebase. |
| **To fix** | Will be addressed in a future revision. |
| **False positive** | Tool mis-identification; no real issue exists. |
@@ -108,8 +109,6 @@ All flagged loops perform `EnumerableSet.add` / `EnumerableSet.remove` calls, ea
| `_whitelist.add/remove` and `_frozenlist.add/remove` in `RuleERC2980Internal` (single-item helpers) | **False positive** — same pattern as above; return is checked by the surrounding `require`. |
| `_addWhitelistAddresses` / `_removeWhitelistAddresses` / `_addFrozenlistAddresses` / `_removeFrozenlistAddresses` in `RuleERC2980Base` | **False positive** — batch helpers return `void`; nothing to check. |
-No code changes are required for L-10.
-
---
## Summary
diff --git a/doc/security/audits/tools/v0.2.0/aderyn-report.md b/doc/security/audits/tools/v0.2.0/aderyn-report.md
index 4a39ef3..5f2080a 100644
--- a/doc/security/audits/tools/v0.2.0/aderyn-report.md
+++ b/doc/security/audits/tools/v0.2.0/aderyn-report.md
@@ -15,9 +15,8 @@ This report was generated by [Aderyn](https://github.com/Cyfrin/aderyn), a stati
- [L-5: PUSH0 Opcode](#l-5-push0-opcode)
- [L-6: Modifier Invoked Only Once](#l-6-modifier-invoked-only-once)
- [L-7: Empty Block](#l-7-empty-block)
- - [L-8: Unused Error](#l-8-unused-error)
- - [L-9: Costly operations inside loop](#l-9-costly-operations-inside-loop)
- - [L-10: Unchecked Return](#l-10-unchecked-return)
+ - [L-8: Costly operations inside loop](#l-8-costly-operations-inside-loop)
+ - [L-9: Unchecked Return](#l-9-unchecked-return)
# Summary
@@ -27,7 +26,7 @@ This report was generated by [Aderyn](https://github.com/Cyfrin/aderyn), a stati
| Key | Value |
| --- | --- |
| .sol Files | 53 |
-| Total nSLOC | 2198 |
+| Total nSLOC | 2197 |
## Files Details
@@ -47,7 +46,7 @@ This report was generated by [Aderyn](https://github.com/Cyfrin/aderyn), a stati
| src/rules/operation/RuleConditionalTransferLight.sol | 36 |
| src/rules/operation/RuleConditionalTransferLightOwnable2Step.sol | 16 |
| src/rules/operation/abstract/RuleConditionalTransferLightBase.sol | 159 |
-| src/rules/operation/abstract/RuleConditionalTransferLightInvariantStorage.sol | 19 |
+| src/rules/operation/abstract/RuleConditionalTransferLightInvariantStorage.sol | 18 |
| src/rules/validation/abstract/RuleAddressSet/RuleAddressSet.sol | 66 |
| src/rules/validation/abstract/RuleAddressSet/RuleAddressSetInternal.sol | 39 |
| src/rules/validation/abstract/RuleAddressSet/invariantStorage/RuleAddressSetInvariantStorage.sol | 7 |
@@ -66,10 +65,10 @@ This report was generated by [Aderyn](https://github.com/Cyfrin/aderyn), a stati
| src/rules/validation/abstract/core/RuleNFTAdapter.sol | 111 |
| src/rules/validation/abstract/core/RuleTransferValidation.sol | 64 |
| src/rules/validation/abstract/core/RuleWhitelistShared.sol | 49 |
-| src/rules/validation/abstract/invariant/RuleCommonInvariantStorage.sol | 4 |
| src/rules/validation/abstract/invariant/RuleIdentityRegistryInvariantStorage.sol | 16 |
| src/rules/validation/abstract/invariant/RuleMaxTotalSupplyInvariantStorage.sol | 13 |
| src/rules/validation/abstract/invariant/RuleSanctionsListInvariantStorage.sol | 18 |
+| src/rules/validation/abstract/invariant/RuleSharedInvariantStorage.sol | 4 |
| src/rules/validation/abstract/invariant/RuleSpenderWhitelistInvariantStorage.sol | 9 |
| src/rules/validation/deployment/RuleBlacklist.sol | 33 |
| src/rules/validation/deployment/RuleBlacklistOwnable2Step.sol | 20 |
@@ -87,7 +86,7 @@ This report was generated by [Aderyn](https://github.com/Cyfrin/aderyn), a stati
| src/rules/validation/deployment/RuleWhitelistOwnable2Step.sol | 24 |
| src/rules/validation/deployment/RuleWhitelistWrapper.sol | 64 |
| src/rules/validation/deployment/RuleWhitelistWrapperOwnable2Step.sol | 28 |
-| **Total** | **2198** |
+| **Total** | **2197** |
## Issue Summary
@@ -95,7 +94,7 @@ This report was generated by [Aderyn](https://github.com/Cyfrin/aderyn), a stati
| Category | No. of Issues |
| --- | --- |
| High | 0 |
-| Low | 10 |
+| Low | 9 |
# Low Issues
@@ -603,25 +602,25 @@ Consider using a specific version of Solidity in your contracts instead of a wid
pragma solidity ^0.8.20;
```
-- Found in src/rules/validation/abstract/invariant/RuleCommonInvariantStorage.sol [Line: 2](src/rules/validation/abstract/invariant/RuleCommonInvariantStorage.sol#L2)
+- Found in src/rules/validation/abstract/invariant/RuleIdentityRegistryInvariantStorage.sol [Line: 2](src/rules/validation/abstract/invariant/RuleIdentityRegistryInvariantStorage.sol#L2)
```solidity
pragma solidity ^0.8.20;
```
-- Found in src/rules/validation/abstract/invariant/RuleIdentityRegistryInvariantStorage.sol [Line: 2](src/rules/validation/abstract/invariant/RuleIdentityRegistryInvariantStorage.sol#L2)
+- Found in src/rules/validation/abstract/invariant/RuleMaxTotalSupplyInvariantStorage.sol [Line: 2](src/rules/validation/abstract/invariant/RuleMaxTotalSupplyInvariantStorage.sol#L2)
```solidity
pragma solidity ^0.8.20;
```
-- Found in src/rules/validation/abstract/invariant/RuleMaxTotalSupplyInvariantStorage.sol [Line: 2](src/rules/validation/abstract/invariant/RuleMaxTotalSupplyInvariantStorage.sol#L2)
+- Found in src/rules/validation/abstract/invariant/RuleSanctionsListInvariantStorage.sol [Line: 3](src/rules/validation/abstract/invariant/RuleSanctionsListInvariantStorage.sol#L3)
```solidity
pragma solidity ^0.8.20;
```
-- Found in src/rules/validation/abstract/invariant/RuleSanctionsListInvariantStorage.sol [Line: 3](src/rules/validation/abstract/invariant/RuleSanctionsListInvariantStorage.sol#L3)
+- Found in src/rules/validation/abstract/invariant/RuleSharedInvariantStorage.sol [Line: 2](src/rules/validation/abstract/invariant/RuleSharedInvariantStorage.sol#L2)
```solidity
pragma solidity ^0.8.20;
@@ -949,25 +948,25 @@ Solc compiler version 0.8.20 switches the default target EVM version to Shanghai
pragma solidity ^0.8.20;
```
-- Found in src/rules/validation/abstract/invariant/RuleCommonInvariantStorage.sol [Line: 2](src/rules/validation/abstract/invariant/RuleCommonInvariantStorage.sol#L2)
+- Found in src/rules/validation/abstract/invariant/RuleIdentityRegistryInvariantStorage.sol [Line: 2](src/rules/validation/abstract/invariant/RuleIdentityRegistryInvariantStorage.sol#L2)
```solidity
pragma solidity ^0.8.20;
```
-- Found in src/rules/validation/abstract/invariant/RuleIdentityRegistryInvariantStorage.sol [Line: 2](src/rules/validation/abstract/invariant/RuleIdentityRegistryInvariantStorage.sol#L2)
+- Found in src/rules/validation/abstract/invariant/RuleMaxTotalSupplyInvariantStorage.sol [Line: 2](src/rules/validation/abstract/invariant/RuleMaxTotalSupplyInvariantStorage.sol#L2)
```solidity
pragma solidity ^0.8.20;
```
-- Found in src/rules/validation/abstract/invariant/RuleMaxTotalSupplyInvariantStorage.sol [Line: 2](src/rules/validation/abstract/invariant/RuleMaxTotalSupplyInvariantStorage.sol#L2)
+- Found in src/rules/validation/abstract/invariant/RuleSanctionsListInvariantStorage.sol [Line: 3](src/rules/validation/abstract/invariant/RuleSanctionsListInvariantStorage.sol#L3)
```solidity
pragma solidity ^0.8.20;
```
-- Found in src/rules/validation/abstract/invariant/RuleSanctionsListInvariantStorage.sol [Line: 3](src/rules/validation/abstract/invariant/RuleSanctionsListInvariantStorage.sol#L3)
+- Found in src/rules/validation/abstract/invariant/RuleSharedInvariantStorage.sol [Line: 2](src/rules/validation/abstract/invariant/RuleSharedInvariantStorage.sol#L2)
```solidity
pragma solidity ^0.8.20;
@@ -1341,24 +1340,7 @@ Consider removing empty blocks.
-## L-8: Unused Error
-
-Consider using or removing the unused error.
-
-1 Found Instances
-
-
-- Found in src/rules/operation/abstract/RuleConditionalTransferLightInvariantStorage.sol [Line: 16](src/rules/operation/abstract/RuleConditionalTransferLightInvariantStorage.sol#L16)
-
- ```solidity
- error RuleConditionalTransferLight_AdminAddressZeroNotAllowed();
- ```
-
-
-
-
-
-## L-9: Costly operations inside loop
+## L-8: Costly operations inside loop
Invoking `SSTORE` operations in loops may waste gas. Use a local variable to hold the loop computation result.
@@ -1405,7 +1387,7 @@ Invoking `SSTORE` operations in loops may waste gas. Use a local variable to hol
-## L-10: Unchecked Return
+## L-9: Unchecked Return
Function returns a value but it is ignored. Consider checking the return value.
diff --git a/doc/security/audits/tools/v0.2.0/slither-report-feedback.md b/doc/security/audits/tools/v0.2.0/slither-report-feedback.md
index adf094d..0b2fb8b 100644
--- a/doc/security/audits/tools/v0.2.0/slither-report-feedback.md
+++ b/doc/security/audits/tools/v0.2.0/slither-report-feedback.md
@@ -2,7 +2,7 @@
Report version: `v0.2.0`
Slither report: [slither-report.md](./slither-report.md)
-Feedback date: 2026-03-09
+Feedback date: 2026-03-10
Verdicts:
@@ -53,11 +53,11 @@ The same pattern is used in `RuleERC2980Base` for whitelist and frozenlist singl
---
-## calls-loop (Low) — ID-7 to ID-21
+## calls-loop (Low) — ID-7 to ID-22
**Verdict: Acknowledged — by design**
-All 15 instances trace to the same root location: `RuleWhitelistWrapperBase._detectTransferRestrictionForTargets` iterates over child rules and calls `IAddressList(rule(i)).areAddressesListed(...)` for each.
+All 16 instances trace to the same root location: `RuleWhitelistWrapperBase._detectTransferRestrictionForTargets` iterates over child rules and calls `IAddressList(rule(i)).areAddressesListed(...)` for each.
This is the fundamental purpose of the wrapper: aggregate multiple whitelist rules with OR logic. There is no way to avoid external calls per child rule. Mitigations already in place:
@@ -67,19 +67,27 @@ This is the fundamental purpose of the wrapper: aggregate multiple whitelist rul
---
-## dead-code (Informational) — ID-22 to ID-35
+## assembly (Informational) — ID-23
-**Verdict: False positive**
+**Verdict: Acknowledged — by design**
+
+Flagged location: `RuleConditionalTransferLightBase._transferHash(address,address,uint256)` uses inline assembly (lines 180–186).
+
+The assembly block computes a compact hash of the transfer parameters (`from`, `to`, `value`) using `mstore` and `keccak256`. This is an intentional micro-optimisation: it produces an `abi.encodePacked`-equivalent layout without allocating a new memory buffer, saving gas on every approval lookup. The assembly is minimal, well-scoped, and does not involve any control-flow or external calls. No safety concern.
+
+---
+
+## missing-inheritance (Informational) — ID-24
+
+**Verdict: Acknowledged — mock contract**
-**ID-22 to ID-30, ID-32 to ID-35 — `_msgData()` overrides:**
-These overrides are required to resolve Solidity's C3 linearisation diamond problem. Every contract that inherits both `Context` (transitively via `AccessControl` or `Ownable`) and `ERC2771Context` must override `_msgData()`, `_msgSender()`, and `_contextSuffixLength()` to disambiguate which parent's implementation to use. Without these overrides the contracts would not compile. Slither incorrectly classifies them as dead code because it does not detect the implicit Solidity MRO requirement.
+Flagged location: `TotalSupplyMock` should inherit from `ITotalSupply`.
-**ID-31 — `RuleWhitelistWrapperBase._transferred(address,address,address,uint256)`:**
-This internal function overrides `RulesManagementModule._transferred(address,address,address,uint256)` and delegates to `RuleWhitelistShared._transferredFrom`. It is called whenever a `transferFrom`-style transfer is validated through the wrapper. Slither does not trace the call chain through the abstract base correctly.
+`TotalSupplyMock` is a test-only mock located in `src/mocks/`. It implements the `totalSupply()` function to simulate a token for testing `RuleMaxTotalSupply` without deploying a full ERC-20. Declaring `ITotalSupply` inheritance would add no behaviour and is unnecessary for testing purposes. No change planned.
---
-## naming-convention (Informational) — ID-36, ID-37
+## naming-convention (Informational) — ID-25, ID-26
**Verdict: Acknowledged**
@@ -87,7 +95,7 @@ Parameters `_operator` in `RuleERC2980Base.frozenlist(address)` and `RuleERC2980
---
-## unindexed-event-address (Informational) — ID-38, ID-39
+## unindexed-event-address (Informational) — ID-27, ID-28
**Verdict: Out of scope**
@@ -97,11 +105,11 @@ Note: the previously reported `IAddressList.AddAddress` and `IAddressList.Remove
---
-## unused-state (Informational) — ID-40 to ID-87
+## unused-state (Informational) — ID-29 to ID-88
**Verdict: False positive**
-All 48 instances report `RuleNFTAdapter` selector constants (`TRANSFERRED_SELECTOR_ERC3643`, `TRANSFERRED_SELECTOR_RULE_ENGINE`, `TRANSFERRED_SELECTOR_ERC7943`, `TRANSFERRED_SELECTOR_ERC7943_FROM`) as unused in specific concrete contracts.
+All 60 instances report `RuleNFTAdapter` selector constants (`TRANSFERRED_SELECTOR_ERC3643`, `TRANSFERRED_SELECTOR_RULE_ENGINE`, `TRANSFERRED_SELECTOR_ERC7943`, `TRANSFERRED_SELECTOR_ERC7943_FROM`) as unused in specific concrete contracts.
These constants are defined in `RuleNFTAdapter` and used by its internal dispatch logic. Slither performs a per-concrete-contract analysis and flags constants not directly referenced in a given contract's own bytecode, even though they are active in the inherited base. This is a known limitation of Slither's inheritance analysis for `constant` values defined in base contracts.
@@ -113,8 +121,9 @@ These constants are defined in `RuleNFTAdapter` and used by its internal dispatc
|---|---|---|---|
| arbitrary-send-erc20 | High | ID-0 | False positive |
| unused-return | Medium | ID-1 to ID-6 | False positive |
-| calls-loop | Low | ID-7 to ID-21 | Acknowledged — by design |
-| dead-code | Informational | ID-22 to ID-35 | False positive |
-| naming-convention | Informational | ID-36 to ID-37 | Acknowledged |
-| unindexed-event-address | Informational | ID-38 to ID-39 | Out of scope (lib/) |
-| unused-state | Informational | ID-40 to ID-87 | False positive |
+| calls-loop | Low | ID-7 to ID-22 | Acknowledged — by design |
+| assembly | Informational | ID-23 | Acknowledged — by design |
+| missing-inheritance | Informational | ID-24 | Acknowledged — mock contract |
+| naming-convention | Informational | ID-25 to ID-26 | Acknowledged |
+| unindexed-event-address | Informational | ID-27 to ID-28 | Out of scope (lib/) |
+| unused-state | Informational | ID-29 to ID-88 | False positive |
diff --git a/doc/security/audits/tools/v0.2.0/slither-report.md b/doc/security/audits/tools/v0.2.0/slither-report.md
index 6a4a8f3..34fa48b 100644
--- a/doc/security/audits/tools/v0.2.0/slither-report.md
+++ b/doc/security/audits/tools/v0.2.0/slither-report.md
@@ -2,27 +2,28 @@
Summary
- [arbitrary-send-erc20](#arbitrary-send-erc20) (1 results) (High)
- [unused-return](#unused-return) (6 results) (Medium)
- - [calls-loop](#calls-loop) (15 results) (Low)
- - [dead-code](#dead-code) (14 results) (Informational)
+ - [calls-loop](#calls-loop) (16 results) (Low)
+ - [assembly](#assembly) (1 results) (Informational)
+ - [missing-inheritance](#missing-inheritance) (1 results) (Informational)
- [naming-convention](#naming-convention) (2 results) (Informational)
- [unindexed-event-address](#unindexed-event-address) (2 results) (Informational)
- - [unused-state](#unused-state) (48 results) (Informational)
+ - [unused-state](#unused-state) (60 results) (Informational)
## arbitrary-send-erc20
Impact: High
Confidence: High
- [ ] ID-0
-[RuleConditionalTransferLightBase.approveAndTransferIfAllowed(address,address,address,uint256)](src/rules/operation/abstract/RuleConditionalTransferLightBase.sol#L44-L62) uses arbitrary from in transferFrom: [success = IERC20(token).transferFrom(from,to,value)](src/rules/operation/abstract/RuleConditionalTransferLightBase.sol#L59)
+[RuleConditionalTransferLightBase.approveAndTransferIfAllowed(address,address,address,uint256)](src/rules/operation/abstract/RuleConditionalTransferLightBase.sol#L47-L62) uses arbitrary from in transferFrom: [success = IERC20(token).transferFrom(from,to,value)](src/rules/operation/abstract/RuleConditionalTransferLightBase.sol#L59)
-src/rules/operation/abstract/RuleConditionalTransferLightBase.sol#L44-L62
+src/rules/operation/abstract/RuleConditionalTransferLightBase.sol#L47-L62
## unused-return
Impact: Medium
Confidence: Medium
- [ ] ID-1
-[RuleAddressSetInternal._removeAddress(address)](src/rules/validation/abstract/RuleAddressSet/RuleAddressSetInternal.sol#L85-L87) ignores return value by [_listedAddresses.remove(targetAddress)](src/rules/validation/abstract/RuleAddressSet/RuleAddressSetInternal.sol#L86)
+[RuleAddressSetInternal._removeAddress(address)](src/rules/validation/abstract/RuleAddressSet/RuleAddressSetInternal.sol#L82-L84) ignores return value by [_listedAddresses.remove(targetAddress)](src/rules/validation/abstract/RuleAddressSet/RuleAddressSetInternal.sol#L83)
-src/rules/validation/abstract/RuleAddressSet/RuleAddressSetInternal.sol#L85-L87
+src/rules/validation/abstract/RuleAddressSet/RuleAddressSetInternal.sol#L82-L84
- [ ] ID-2
@@ -32,586 +33,602 @@ src/rules/validation/abstract/RuleERC2980/RuleERC2980Internal.sol#L59-L61
- [ ] ID-3
-[RuleERC2980Internal._removeWhitelistAddress(address)](src/rules/validation/abstract/RuleERC2980/RuleERC2980Internal.sol#L63-L65) ignores return value by [_whitelist.remove(targetAddress)](src/rules/validation/abstract/RuleERC2980/RuleERC2980Internal.sol#L64)
+[RuleAddressSetInternal._addAddress(address)](src/rules/validation/abstract/RuleAddressSet/RuleAddressSetInternal.sol#L74-L76) ignores return value by [_listedAddresses.add(targetAddress)](src/rules/validation/abstract/RuleAddressSet/RuleAddressSetInternal.sol#L75)
-src/rules/validation/abstract/RuleERC2980/RuleERC2980Internal.sol#L63-L65
+src/rules/validation/abstract/RuleAddressSet/RuleAddressSetInternal.sol#L74-L76
- [ ] ID-4
-[RuleERC2980Internal._addFrozenlistAddress(address)](src/rules/validation/abstract/RuleERC2980/RuleERC2980Internal.sol#L105-L107) ignores return value by [_frozenlist.add(targetAddress)](src/rules/validation/abstract/RuleERC2980/RuleERC2980Internal.sol#L106)
+[RuleERC2980Internal._removeWhitelistAddress(address)](src/rules/validation/abstract/RuleERC2980/RuleERC2980Internal.sol#L63-L65) ignores return value by [_whitelist.remove(targetAddress)](src/rules/validation/abstract/RuleERC2980/RuleERC2980Internal.sol#L64)
-src/rules/validation/abstract/RuleERC2980/RuleERC2980Internal.sol#L105-L107
+src/rules/validation/abstract/RuleERC2980/RuleERC2980Internal.sol#L63-L65
- [ ] ID-5
-[RuleERC2980Internal._removeFrozenlistAddress(address)](src/rules/validation/abstract/RuleERC2980/RuleERC2980Internal.sol#L109-L111) ignores return value by [_frozenlist.remove(targetAddress)](src/rules/validation/abstract/RuleERC2980/RuleERC2980Internal.sol#L110)
+[RuleERC2980Internal._addFrozenlistAddress(address)](src/rules/validation/abstract/RuleERC2980/RuleERC2980Internal.sol#L105-L107) ignores return value by [_frozenlist.add(targetAddress)](src/rules/validation/abstract/RuleERC2980/RuleERC2980Internal.sol#L106)
-src/rules/validation/abstract/RuleERC2980/RuleERC2980Internal.sol#L109-L111
+src/rules/validation/abstract/RuleERC2980/RuleERC2980Internal.sol#L105-L107
- [ ] ID-6
-[RuleAddressSetInternal._addAddress(address)](src/rules/validation/abstract/RuleAddressSet/RuleAddressSetInternal.sol#L77-L79) ignores return value by [_listedAddresses.add(targetAddress)](src/rules/validation/abstract/RuleAddressSet/RuleAddressSetInternal.sol#L78)
+[RuleERC2980Internal._removeFrozenlistAddress(address)](src/rules/validation/abstract/RuleERC2980/RuleERC2980Internal.sol#L109-L111) ignores return value by [_frozenlist.remove(targetAddress)](src/rules/validation/abstract/RuleERC2980/RuleERC2980Internal.sol#L110)
-src/rules/validation/abstract/RuleAddressSet/RuleAddressSetInternal.sol#L77-L79
+src/rules/validation/abstract/RuleERC2980/RuleERC2980Internal.sol#L109-L111
## calls-loop
Impact: Low
Confidence: Medium
- [ ] ID-7
-[RuleWhitelistWrapperBase._detectTransferRestrictionForTargets(address[])](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L171-L202) has external calls inside a loop: [isListed = IAddressList(rule(i)).areAddressesListed(targetAddress)](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L182)
+[RuleWhitelistWrapperBase._detectTransferRestrictionForTargets(address[])](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L165-L196) has external calls inside a loop: [isListed = IAddressList(rule(i)).areAddressesListed(targetAddress)](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L176)
Calls stack containing the loop:
- RuleNFTAdapter.transferred(ITransferContext.FungibleTransferContext)
- RuleWhitelistShared._transferredFrom(address,address,address,uint256)
- RuleWhitelistWrapperBase._detectTransferRestrictionFrom(address,address,address,uint256)
+ RuleNFTAdapter.detectTransferRestriction(address,address,uint256,uint256)
RuleWhitelistWrapperBase._detectTransferRestriction(address,address,uint256)
-src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L171-L202
+src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L165-L196
- [ ] ID-8
-[RuleWhitelistWrapperBase._detectTransferRestrictionForTargets(address[])](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L171-L202) has external calls inside a loop: [isListed = IAddressList(rule(i)).areAddressesListed(targetAddress)](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L182)
+[RuleWhitelistWrapperBase._detectTransferRestrictionForTargets(address[])](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L165-L196) has external calls inside a loop: [isListed = IAddressList(rule(i)).areAddressesListed(targetAddress)](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L176)
Calls stack containing the loop:
RuleTransferValidation.detectTransferRestrictionFrom(address,address,address,uint256)
RuleWhitelistWrapperBase._detectTransferRestrictionFrom(address,address,address,uint256)
RuleWhitelistWrapperBase._detectTransferRestriction(address,address,uint256)
-src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L171-L202
+src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L165-L196
- [ ] ID-9
-[RuleWhitelistWrapperBase._detectTransferRestrictionForTargets(address[])](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L171-L202) has external calls inside a loop: [isListed = IAddressList(rule(i)).areAddressesListed(targetAddress)](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L182)
+[RuleWhitelistWrapperBase._detectTransferRestrictionForTargets(address[])](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L165-L196) has external calls inside a loop: [isListed = IAddressList(rule(i)).areAddressesListed(targetAddress)](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L176)
Calls stack containing the loop:
RuleWhitelistShared.transferred(address,address,uint256)
RuleWhitelistWrapperBase._transferred(address,address,uint256)
RuleWhitelistShared._transferred(address,address,uint256)
RuleWhitelistWrapperBase._detectTransferRestriction(address,address,uint256)
-src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L171-L202
+src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L165-L196
- [ ] ID-10
-[RuleWhitelistWrapperBase._detectTransferRestrictionForTargets(address[])](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L171-L202) has external calls inside a loop: [isListed = IAddressList(rule(i)).areAddressesListed(targetAddress)](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L182)
+[RuleWhitelistWrapperBase._detectTransferRestrictionForTargets(address[])](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L165-L196) has external calls inside a loop: [isListed = IAddressList(rule(i)).areAddressesListed(targetAddress)](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L176)
Calls stack containing the loop:
- RuleTransferValidation.canTransferFrom(address,address,address,uint256)
- RuleWhitelistWrapperBase._detectTransferRestrictionFrom(address,address,address,uint256)
+ RuleTransferValidation.canTransfer(address,address,uint256)
RuleWhitelistWrapperBase._detectTransferRestriction(address,address,uint256)
-src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L171-L202
+src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L165-L196
- [ ] ID-11
-[RuleWhitelistWrapperBase._detectTransferRestrictionForTargets(address[])](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L171-L202) has external calls inside a loop: [isListed = IAddressList(rule(i)).areAddressesListed(targetAddress)](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L182)
+[RuleWhitelistWrapperBase._detectTransferRestrictionForTargets(address[])](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L165-L196) has external calls inside a loop: [isListed = IAddressList(rule(i)).areAddressesListed(targetAddress)](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L176)
Calls stack containing the loop:
- RuleWhitelistShared.transferred(address,address,address,uint256)
- RuleWhitelistShared._transferredFrom(address,address,address,uint256)
- RuleWhitelistWrapperBase._detectTransferRestrictionFrom(address,address,address,uint256)
+ RuleNFTAdapter.transferred(address,address,uint256,uint256)
+ RuleWhitelistWrapperBase._transferred(address,address,uint256)
+ RuleWhitelistShared._transferred(address,address,uint256)
RuleWhitelistWrapperBase._detectTransferRestriction(address,address,uint256)
-src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L171-L202
+src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L165-L196
- [ ] ID-12
-[RuleWhitelistWrapperBase._detectTransferRestrictionForTargets(address[])](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L171-L202) has external calls inside a loop: [isListed = IAddressList(rule(i)).areAddressesListed(targetAddress)](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L182)
+[RuleWhitelistWrapperBase._detectTransferRestrictionForTargets(address[])](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L165-L196) has external calls inside a loop: [isListed = IAddressList(rule(i)).areAddressesListed(targetAddress)](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L176)
Calls stack containing the loop:
RuleTransferValidation.detectTransferRestriction(address,address,uint256)
RuleWhitelistWrapperBase._detectTransferRestriction(address,address,uint256)
-src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L171-L202
+src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L165-L196
- [ ] ID-13
-[RuleWhitelistWrapperBase._detectTransferRestrictionForTargets(address[])](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L171-L202) has external calls inside a loop: [isListed = IAddressList(rule(i)).areAddressesListed(targetAddress)](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L182)
+[RuleWhitelistWrapperBase._detectTransferRestrictionForTargets(address[])](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L165-L196) has external calls inside a loop: [isListed = IAddressList(rule(i)).areAddressesListed(targetAddress)](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L176)
Calls stack containing the loop:
- RuleNFTAdapter.canTransferFrom(address,address,address,uint256,uint256)
+ RuleNFTAdapter.transferred(ITransferContext.MultiTokenTransferContext)
+ RuleWhitelistShared._transferredFrom(address,address,address,uint256)
RuleWhitelistWrapperBase._detectTransferRestrictionFrom(address,address,address,uint256)
RuleWhitelistWrapperBase._detectTransferRestriction(address,address,uint256)
-src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L171-L202
+src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L165-L196
- [ ] ID-14
-[RuleWhitelistWrapperBase._detectTransferRestrictionForTargets(address[])](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L171-L202) has external calls inside a loop: [isListed = IAddressList(rule(i)).areAddressesListed(targetAddress)](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L182)
+[RuleWhitelistWrapperBase._detectTransferRestrictionForTargets(address[])](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L165-L196) has external calls inside a loop: [isListed = IAddressList(rule(i)).areAddressesListed(targetAddress)](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L176)
Calls stack containing the loop:
- RuleNFTAdapter.transferred(ITransferContext.MultiTokenTransferContext)
- RuleWhitelistShared._transferredFrom(address,address,address,uint256)
- RuleWhitelistWrapperBase._detectTransferRestrictionFrom(address,address,address,uint256)
- RuleWhitelistWrapperBase._detectTransferRestriction(address,address,uint256)
+ RuleWhitelistWrapperBase.isVerified(address)
-src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L171-L202
+src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L165-L196
- [ ] ID-15
-[RuleWhitelistWrapperBase._detectTransferRestrictionForTargets(address[])](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L171-L202) has external calls inside a loop: [isListed = IAddressList(rule(i)).areAddressesListed(targetAddress)](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L182)
+[RuleWhitelistWrapperBase._detectTransferRestrictionForTargets(address[])](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L165-L196) has external calls inside a loop: [isListed = IAddressList(rule(i)).areAddressesListed(targetAddress)](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L176)
Calls stack containing the loop:
- RuleTransferValidation.canTransfer(address,address,uint256)
+ RuleNFTAdapter.canTransfer(address,address,uint256,uint256)
RuleWhitelistWrapperBase._detectTransferRestriction(address,address,uint256)
-src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L171-L202
+src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L165-L196
- [ ] ID-16
-[RuleWhitelistWrapperBase._detectTransferRestrictionForTargets(address[])](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L171-L202) has external calls inside a loop: [isListed = IAddressList(rule(i)).areAddressesListed(targetAddress)](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L182)
+[RuleWhitelistWrapperBase._detectTransferRestrictionForTargets(address[])](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L165-L196) has external calls inside a loop: [isListed = IAddressList(rule(i)).areAddressesListed(targetAddress)](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L176)
Calls stack containing the loop:
- RuleWhitelistWrapperBase.isVerified(address)
+ RuleNFTAdapter.transferred(address,address,address,uint256,uint256)
+ RuleWhitelistShared._transferredFrom(address,address,address,uint256)
+ RuleWhitelistWrapperBase._detectTransferRestrictionFrom(address,address,address,uint256)
+ RuleWhitelistWrapperBase._detectTransferRestriction(address,address,uint256)
-src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L171-L202
+src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L165-L196
- [ ] ID-17
-[RuleWhitelistWrapperBase._detectTransferRestrictionForTargets(address[])](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L171-L202) has external calls inside a loop: [isListed = IAddressList(rule(i)).areAddressesListed(targetAddress)](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L182)
+[RuleWhitelistWrapperBase._detectTransferRestrictionForTargets(address[])](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L165-L196) has external calls inside a loop: [isListed = IAddressList(rule(i)).areAddressesListed(targetAddress)](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L176)
Calls stack containing the loop:
- RuleNFTAdapter.detectTransferRestriction(address,address,uint256,uint256)
+ RuleNFTAdapter.detectTransferRestrictionFrom(address,address,address,uint256,uint256)
+ RuleWhitelistWrapperBase._detectTransferRestrictionFrom(address,address,address,uint256)
RuleWhitelistWrapperBase._detectTransferRestriction(address,address,uint256)
-src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L171-L202
+src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L165-L196
- [ ] ID-18
-[RuleWhitelistWrapperBase._detectTransferRestrictionForTargets(address[])](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L171-L202) has external calls inside a loop: [isListed = IAddressList(rule(i)).areAddressesListed(targetAddress)](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L182)
+[RuleWhitelistWrapperBase._detectTransferRestrictionForTargets(address[])](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L165-L196) has external calls inside a loop: [isListed = IAddressList(rule(i)).areAddressesListed(targetAddress)](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L176)
Calls stack containing the loop:
- RuleNFTAdapter.detectTransferRestrictionFrom(address,address,address,uint256,uint256)
+ RuleNFTAdapter.canTransferFrom(address,address,address,uint256,uint256)
RuleWhitelistWrapperBase._detectTransferRestrictionFrom(address,address,address,uint256)
RuleWhitelistWrapperBase._detectTransferRestriction(address,address,uint256)
-src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L171-L202
+src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L165-L196
- [ ] ID-19
-[RuleWhitelistWrapperBase._detectTransferRestrictionForTargets(address[])](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L171-L202) has external calls inside a loop: [isListed = IAddressList(rule(i)).areAddressesListed(targetAddress)](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L182)
+[RuleWhitelistWrapperBase._detectTransferRestrictionForTargets(address[])](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L165-L196) has external calls inside a loop: [isListed = IAddressList(rule(i)).areAddressesListed(targetAddress)](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L176)
Calls stack containing the loop:
- RuleNFTAdapter.canTransfer(address,address,uint256,uint256)
+ RuleNFTAdapter.transferred(ITransferContext.FungibleTransferContext)
+ RuleWhitelistShared._transferredFrom(address,address,address,uint256)
+ RuleWhitelistWrapperBase._detectTransferRestrictionFrom(address,address,address,uint256)
RuleWhitelistWrapperBase._detectTransferRestriction(address,address,uint256)
-src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L171-L202
+src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L165-L196
- [ ] ID-20
-[RuleWhitelistWrapperBase._detectTransferRestrictionForTargets(address[])](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L171-L202) has external calls inside a loop: [isListed = IAddressList(rule(i)).areAddressesListed(targetAddress)](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L182)
+[RuleWhitelistWrapperBase._detectTransferRestrictionForTargets(address[])](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L165-L196) has external calls inside a loop: [isListed = IAddressList(rule(i)).areAddressesListed(targetAddress)](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L176)
Calls stack containing the loop:
- RuleNFTAdapter.transferred(address,address,address,uint256,uint256)
+ RuleWhitelistShared.transferred(address,address,address,uint256)
RuleWhitelistShared._transferredFrom(address,address,address,uint256)
RuleWhitelistWrapperBase._detectTransferRestrictionFrom(address,address,address,uint256)
RuleWhitelistWrapperBase._detectTransferRestriction(address,address,uint256)
-src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L171-L202
+src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L165-L196
- [ ] ID-21
-[RuleWhitelistWrapperBase._detectTransferRestrictionForTargets(address[])](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L171-L202) has external calls inside a loop: [isListed = IAddressList(rule(i)).areAddressesListed(targetAddress)](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L182)
+[RuleWhitelistWrapperBase._detectTransferRestrictionForTargets(address[])](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L165-L196) has external calls inside a loop: [isListed = IAddressList(rule(i)).areAddressesListed(targetAddress)](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L176)
Calls stack containing the loop:
- RuleNFTAdapter.transferred(address,address,uint256,uint256)
- RuleWhitelistWrapperBase._transferred(address,address,uint256)
- RuleWhitelistShared._transferred(address,address,uint256)
+ RuleWhitelistWrapperHarnessInternal.exposedTransferredSpenderInternal(address,address,address,uint256)
+ RuleWhitelistWrapperBase._transferred(address,address,address,uint256)
+ RuleWhitelistShared._transferredFrom(address,address,address,uint256)
+ RuleWhitelistWrapperBase._detectTransferRestrictionFrom(address,address,address,uint256)
RuleWhitelistWrapperBase._detectTransferRestriction(address,address,uint256)
-src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L171-L202
+src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L165-L196
-## dead-code
-Impact: Informational
-Confidence: Medium
- [ ] ID-22
-[RuleAddressSet._msgData()](src/rules/validation/abstract/RuleAddressSet/RuleAddressSet.sol#L159-L161) is never used and should be removed
+[RuleWhitelistWrapperBase._detectTransferRestrictionForTargets(address[])](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L165-L196) has external calls inside a loop: [isListed = IAddressList(rule(i)).areAddressesListed(targetAddress)](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L176)
+ Calls stack containing the loop:
+ RuleTransferValidation.canTransferFrom(address,address,address,uint256)
+ RuleWhitelistWrapperBase._detectTransferRestrictionFrom(address,address,address,uint256)
+ RuleWhitelistWrapperBase._detectTransferRestriction(address,address,uint256)
-src/rules/validation/abstract/RuleAddressSet/RuleAddressSet.sol#L159-L161
+src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L165-L196
+## assembly
+Impact: Informational
+Confidence: High
- [ ] ID-23
-[RuleBlacklistOwnable2Step._msgData()](src/rules/validation/deployment/RuleBlacklistOwnable2Step.sol#L28-L30) is never used and should be removed
+[RuleConditionalTransferLightBase._transferHash(address,address,uint256)](src/rules/operation/abstract/RuleConditionalTransferLightBase.sol#L178-L187) uses assembly
+ - [INLINE ASM](src/rules/operation/abstract/RuleConditionalTransferLightBase.sol#L180-L186)
-src/rules/validation/deployment/RuleBlacklistOwnable2Step.sol#L28-L30
+src/rules/operation/abstract/RuleConditionalTransferLightBase.sol#L178-L187
+## missing-inheritance
+Impact: Informational
+Confidence: High
- [ ] ID-24
-[RuleERC2980._msgData()](src/rules/validation/deployment/RuleERC2980.sol#L76-L78) is never used and should be removed
+[TotalSupplyMock](src/mocks/TotalSupplyMock.sol#L4-L14) should inherit from [ITotalSupply](src/rules/interfaces/ITotalSupply.sol#L4-L6)
-src/rules/validation/deployment/RuleERC2980.sol#L76-L78
+src/mocks/TotalSupplyMock.sol#L4-L14
+## naming-convention
+Impact: Informational
+Confidence: High
- [ ] ID-25
-[RuleWhitelistWrapperBase._msgData()](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L237-L239) is never used and should be removed
+Parameter [RuleERC2980Base.frozenlist(address)._operator](src/rules/validation/abstract/base/RuleERC2980Base.sol#L314) is not in mixedCase
-src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L237-L239
+src/rules/validation/abstract/base/RuleERC2980Base.sol#L314
- [ ] ID-26
-[RuleERC2980Base._msgData()](src/rules/validation/abstract/base/RuleERC2980Base.sol#L381-L383) is never used and should be removed
+Parameter [RuleERC2980Base.whitelist(address)._operator](src/rules/validation/abstract/base/RuleERC2980Base.sol#L224) is not in mixedCase
-src/rules/validation/abstract/base/RuleERC2980Base.sol#L381-L383
+src/rules/validation/abstract/base/RuleERC2980Base.sol#L224
+## unindexed-event-address
+Impact: Informational
+Confidence: High
- [ ] ID-27
-[RuleWhitelistWrapperOwnable2Step._msgData()](src/rules/validation/deployment/RuleWhitelistWrapperOwnable2Step.sol#L43-L45) is never used and should be removed
+Event [IERC3643Compliance.TokenBound(address)](lib/RuleEngine/src/interfaces/IERC3643Compliance.sol#L14) has address parameters but no indexed parameters
-src/rules/validation/deployment/RuleWhitelistWrapperOwnable2Step.sol#L43-L45
+lib/RuleEngine/src/interfaces/IERC3643Compliance.sol#L14
- [ ] ID-28
-[RuleSanctionsListOwnable2Step._msgData()](src/rules/validation/deployment/RuleSanctionsListOwnable2Step.sol#L27-L29) is never used and should be removed
+Event [IERC3643Compliance.TokenUnbound(address)](lib/RuleEngine/src/interfaces/IERC3643Compliance.sol#L20) has address parameters but no indexed parameters
-src/rules/validation/deployment/RuleSanctionsListOwnable2Step.sol#L27-L29
+lib/RuleEngine/src/interfaces/IERC3643Compliance.sol#L20
+## unused-state
+Impact: Informational
+Confidence: High
- [ ] ID-29
-[RuleSanctionsList._msgData()](src/rules/validation/deployment/RuleSanctionsList.sol#L51-L53) is never used and should be removed
+[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC7943_FROM](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L24-L25) is never used in [RuleERC2980Ownable2StepHarness](src/mocks/harness/DeploymentCoverageHarnesses.sol#L89-L95)
-src/rules/validation/deployment/RuleSanctionsList.sol#L51-L53
+src/rules/validation/abstract/core/RuleNFTAdapter.sol#L24-L25
- [ ] ID-30
-[RuleWhitelistWrapper._msgData()](src/rules/validation/deployment/RuleWhitelistWrapper.sol#L62-L64) is never used and should be removed
+[RuleNFTAdapter.TRANSFERRED_SELECTOR_RULE_ENGINE](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L21) is never used in [RuleWhitelistOwnable2StepHarness](src/mocks/harness/DeploymentCoverageHarnesses.sol#L69-L77)
-src/rules/validation/deployment/RuleWhitelistWrapper.sol#L62-L64
+src/rules/validation/abstract/core/RuleNFTAdapter.sol#L21
- [ ] ID-31
-[RuleWhitelistWrapperBase._transferred(address,address,address,uint256)](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L153-L160) is never used and should be removed
+[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC7943](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L22-L23) is never used in [RuleBlacklistHarness](src/mocks/harness/DeploymentCoverageHarnesses.sol#L15-L21)
-src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L153-L160
+src/rules/validation/abstract/core/RuleNFTAdapter.sol#L22-L23
- [ ] ID-32
-[RuleBlacklist._msgData()](src/rules/validation/deployment/RuleBlacklist.sol#L46-L48) is never used and should be removed
+[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC7943](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L22-L23) is never used in [RuleERC2980Ownable2StepHarness](src/mocks/harness/DeploymentCoverageHarnesses.sol#L89-L95)
-src/rules/validation/deployment/RuleBlacklist.sol#L46-L48
+src/rules/validation/abstract/core/RuleNFTAdapter.sol#L22-L23
- [ ] ID-33
-[RuleERC2980Ownable2Step._msgData()](src/rules/validation/deployment/RuleERC2980Ownable2Step.sol#L32-L34) is never used and should be removed
+[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC3643](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L20) is never used in [RuleWhitelistWrapperHarnessInternal](src/mocks/harness/RuleWhitelistWrapperHarnessInternal.sol#L6-L14)
-src/rules/validation/deployment/RuleERC2980Ownable2Step.sol#L32-L34
+src/rules/validation/abstract/core/RuleNFTAdapter.sol#L20
- [ ] ID-34
-[RuleWhitelist._msgData()](src/rules/validation/deployment/RuleWhitelist.sol#L66-L68) is never used and should be removed
+[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC7943_FROM](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L24-L25) is never used in [RuleWhitelistHarness](src/mocks/harness/DeploymentCoverageHarnesses.sol#L23-L31)
-src/rules/validation/deployment/RuleWhitelist.sol#L66-L68
+src/rules/validation/abstract/core/RuleNFTAdapter.sol#L24-L25
- [ ] ID-35
-[RuleWhitelistOwnable2Step._msgData()](src/rules/validation/deployment/RuleWhitelistOwnable2Step.sol#L30-L32) is never used and should be removed
+[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC3643](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L20) is never used in [RuleSanctionsListHarness](src/mocks/harness/DeploymentCoverageHarnesses.sol#L51-L59)
-src/rules/validation/deployment/RuleWhitelistOwnable2Step.sol#L30-L32
+src/rules/validation/abstract/core/RuleNFTAdapter.sol#L20
-## naming-convention
-Impact: Informational
-Confidence: High
- [ ] ID-36
-Parameter [RuleERC2980Base.frozenlist(address)._operator](src/rules/validation/abstract/base/RuleERC2980Base.sol#L322) is not in mixedCase
+[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC7943_FROM](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L24-L25) is never used in [RuleSanctionsListOwnable2StepHarness](src/mocks/harness/RuleSanctionsListOwnable2StepHarness.sol#L7-L23)
-src/rules/validation/abstract/base/RuleERC2980Base.sol#L322
+src/rules/validation/abstract/core/RuleNFTAdapter.sol#L24-L25
- [ ] ID-37
-Parameter [RuleERC2980Base.whitelist(address)._operator](src/rules/validation/abstract/base/RuleERC2980Base.sol#L226) is not in mixedCase
+[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC3643](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L20) is never used in [RuleERC2980Harness](src/mocks/harness/DeploymentCoverageHarnesses.sol#L43-L49)
-src/rules/validation/abstract/base/RuleERC2980Base.sol#L226
+src/rules/validation/abstract/core/RuleNFTAdapter.sol#L20
-## unindexed-event-address
-Impact: Informational
-Confidence: High
- [ ] ID-38
-Event [IERC3643Compliance.TokenBound(address)](lib/RuleEngine/src/interfaces/IERC3643Compliance.sol#L14) has address parameters but no indexed parameters
+[RuleNFTAdapter.TRANSFERRED_SELECTOR_RULE_ENGINE](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L21) is never used in [RuleERC2980Harness](src/mocks/harness/DeploymentCoverageHarnesses.sol#L43-L49)
-lib/RuleEngine/src/interfaces/IERC3643Compliance.sol#L14
+src/rules/validation/abstract/core/RuleNFTAdapter.sol#L21
- [ ] ID-39
-Event [IERC3643Compliance.TokenUnbound(address)](lib/RuleEngine/src/interfaces/IERC3643Compliance.sol#L20) has address parameters but no indexed parameters
+[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC7943](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L22-L23) is never used in [RuleWhitelistWrapperOwnable2StepHarness](src/mocks/harness/DeploymentCoverageHarnesses.sol#L79-L87)
-lib/RuleEngine/src/interfaces/IERC3643Compliance.sol#L20
+src/rules/validation/abstract/core/RuleNFTAdapter.sol#L22-L23
-## unused-state
-Impact: Informational
-Confidence: High
- [ ] ID-40
-[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC7943_FROM](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L26-L27) is never used in [RuleERC2980Ownable2Step](src/rules/validation/deployment/RuleERC2980Ownable2Step.sol#L14-L39)
+[RuleNFTAdapter.TRANSFERRED_SELECTOR_RULE_ENGINE](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L21) is never used in [RuleWhitelistWrapperHarnessInternal](src/mocks/harness/RuleWhitelistWrapperHarnessInternal.sol#L6-L14)
-src/rules/validation/abstract/core/RuleNFTAdapter.sol#L26-L27
+src/rules/validation/abstract/core/RuleNFTAdapter.sol#L21
- [ ] ID-41
-[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC7943](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L24-L25) is never used in [RuleWhitelistWrapper](src/rules/validation/deployment/RuleWhitelistWrapper.sol#L16-L98)
+[RuleNFTAdapter.TRANSFERRED_SELECTOR_RULE_ENGINE](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L21) is never used in [RuleBlacklistHarness](src/mocks/harness/DeploymentCoverageHarnesses.sol#L15-L21)
-src/rules/validation/abstract/core/RuleNFTAdapter.sol#L24-L25
+src/rules/validation/abstract/core/RuleNFTAdapter.sol#L21
- [ ] ID-42
-[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC7943_FROM](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L26-L27) is never used in [RuleSanctionsList](src/rules/validation/deployment/RuleSanctionsList.sol#L16-L58)
+[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC7943_FROM](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L24-L25) is never used in [RuleWhitelistWrapperHarness](src/mocks/harness/DeploymentCoverageHarnesses.sol#L33-L41)
-src/rules/validation/abstract/core/RuleNFTAdapter.sol#L26-L27
+src/rules/validation/abstract/core/RuleNFTAdapter.sol#L24-L25
- [ ] ID-43
-[RuleNFTAdapter.TRANSFERRED_SELECTOR_RULE_ENGINE](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L22-L23) is never used in [RuleSanctionsListOwnable2Step](src/rules/validation/deployment/RuleSanctionsListOwnable2Step.sol#L15-L34)
+[RuleNFTAdapter.TRANSFERRED_SELECTOR_RULE_ENGINE](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L21) is never used in [RuleIdentityRegistryOwnable2Step](src/rules/validation/deployment/RuleIdentityRegistryOwnable2Step.sol#L12-L16)
-src/rules/validation/abstract/core/RuleNFTAdapter.sol#L22-L23
+src/rules/validation/abstract/core/RuleNFTAdapter.sol#L21
- [ ] ID-44
-[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC7943_FROM](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L26-L27) is never used in [RuleWhitelistWrapperOwnable2Step](src/rules/validation/deployment/RuleWhitelistWrapperOwnable2Step.sol#L15-L51)
+[RuleNFTAdapter.TRANSFERRED_SELECTOR_RULE_ENGINE](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L21) is never used in [RuleERC2980Ownable2StepHarness](src/mocks/harness/DeploymentCoverageHarnesses.sol#L89-L95)
-src/rules/validation/abstract/core/RuleNFTAdapter.sol#L26-L27
+src/rules/validation/abstract/core/RuleNFTAdapter.sol#L21
- [ ] ID-45
-[RuleNFTAdapter.TRANSFERRED_SELECTOR_RULE_ENGINE](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L22-L23) is never used in [RuleIdentityRegistryOwnable2Step](src/rules/validation/deployment/RuleIdentityRegistryOwnable2Step.sol#L12-L16)
+[RuleNFTAdapter.TRANSFERRED_SELECTOR_RULE_ENGINE](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L21) is never used in [RuleBlacklistOwnable2StepHarness](src/mocks/harness/DeploymentCoverageHarnesses.sol#L61-L67)
-src/rules/validation/abstract/core/RuleNFTAdapter.sol#L22-L23
+src/rules/validation/abstract/core/RuleNFTAdapter.sol#L21
- [ ] ID-46
-[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC3643](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L20-L21) is never used in [RuleBlacklistOwnable2Step](src/rules/validation/deployment/RuleBlacklistOwnable2Step.sol#L14-L35)
+[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC3643](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L20) is never used in [RuleBlacklistOwnable2StepHarness](src/mocks/harness/DeploymentCoverageHarnesses.sol#L61-L67)
-src/rules/validation/abstract/core/RuleNFTAdapter.sol#L20-L21
+src/rules/validation/abstract/core/RuleNFTAdapter.sol#L20
- [ ] ID-47
-[RuleNFTAdapter.TRANSFERRED_SELECTOR_RULE_ENGINE](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L22-L23) is never used in [RuleWhitelistWrapper](src/rules/validation/deployment/RuleWhitelistWrapper.sol#L16-L98)
+[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC3643](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L20) is never used in [RuleWhitelistWrapperHarness](src/mocks/harness/DeploymentCoverageHarnesses.sol#L33-L41)
-src/rules/validation/abstract/core/RuleNFTAdapter.sol#L22-L23
+src/rules/validation/abstract/core/RuleNFTAdapter.sol#L20
- [ ] ID-48
-[RuleNFTAdapter.TRANSFERRED_SELECTOR_RULE_ENGINE](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L22-L23) is never used in [RuleSanctionsList](src/rules/validation/deployment/RuleSanctionsList.sol#L16-L58)
+[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC3643](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L20) is never used in [RuleERC2980Ownable2StepHarness](src/mocks/harness/DeploymentCoverageHarnesses.sol#L89-L95)
-src/rules/validation/abstract/core/RuleNFTAdapter.sol#L22-L23
+src/rules/validation/abstract/core/RuleNFTAdapter.sol#L20
- [ ] ID-49
-[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC7943_FROM](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L26-L27) is never used in [RuleWhitelist](src/rules/validation/deployment/RuleWhitelist.sol#L20-L73)
+[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC7943](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L22-L23) is never used in [RuleERC2980Harness](src/mocks/harness/DeploymentCoverageHarnesses.sol#L43-L49)
-src/rules/validation/abstract/core/RuleNFTAdapter.sol#L26-L27
+src/rules/validation/abstract/core/RuleNFTAdapter.sol#L22-L23
- [ ] ID-50
-[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC3643](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L20-L21) is never used in [RuleERC2980](src/rules/validation/deployment/RuleERC2980.sol#L32-L83)
+[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC7943_FROM](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L24-L25) is never used in [RuleSpenderWhitelistHarness](src/mocks/harness/RuleSpenderWhitelistHarnesses.sol#L7-L21)
-src/rules/validation/abstract/core/RuleNFTAdapter.sol#L20-L21
+src/rules/validation/abstract/core/RuleNFTAdapter.sol#L24-L25
- [ ] ID-51
-[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC7943_FROM](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L26-L27) is never used in [RuleSanctionsListOwnable2Step](src/rules/validation/deployment/RuleSanctionsListOwnable2Step.sol#L15-L34)
+[RuleNFTAdapter.TRANSFERRED_SELECTOR_RULE_ENGINE](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L21) is never used in [RuleWhitelistWrapperOwnable2StepHarness](src/mocks/harness/DeploymentCoverageHarnesses.sol#L79-L87)
-src/rules/validation/abstract/core/RuleNFTAdapter.sol#L26-L27
+src/rules/validation/abstract/core/RuleNFTAdapter.sol#L21
- [ ] ID-52
-[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC7943](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L24-L25) is never used in [RuleIdentityRegistryOwnable2Step](src/rules/validation/deployment/RuleIdentityRegistryOwnable2Step.sol#L12-L16)
+[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC7943](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L22-L23) is never used in [RuleIdentityRegistryOwnable2Step](src/rules/validation/deployment/RuleIdentityRegistryOwnable2Step.sol#L12-L16)
-src/rules/validation/abstract/core/RuleNFTAdapter.sol#L24-L25
+src/rules/validation/abstract/core/RuleNFTAdapter.sol#L22-L23
- [ ] ID-53
-[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC7943_FROM](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L26-L27) is never used in [RuleWhitelistWrapper](src/rules/validation/deployment/RuleWhitelistWrapper.sol#L16-L98)
+[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC3643](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L20) is never used in [RuleSpenderWhitelistOwnable2StepHarness](src/mocks/harness/RuleSpenderWhitelistHarnesses.sol#L23-L39)
-src/rules/validation/abstract/core/RuleNFTAdapter.sol#L26-L27
+src/rules/validation/abstract/core/RuleNFTAdapter.sol#L20
- [ ] ID-54
-[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC7943_FROM](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L26-L27) is never used in [RuleERC2980](src/rules/validation/deployment/RuleERC2980.sol#L32-L83)
+[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC7943](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L22-L23) is never used in [RuleWhitelistWrapperHarness](src/mocks/harness/DeploymentCoverageHarnesses.sol#L33-L41)
-src/rules/validation/abstract/core/RuleNFTAdapter.sol#L26-L27
+src/rules/validation/abstract/core/RuleNFTAdapter.sol#L22-L23
- [ ] ID-55
-[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC7943_FROM](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L26-L27) is never used in [RuleIdentityRegistryOwnable2Step](src/rules/validation/deployment/RuleIdentityRegistryOwnable2Step.sol#L12-L16)
+[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC7943_FROM](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L24-L25) is never used in [RuleIdentityRegistryOwnable2Step](src/rules/validation/deployment/RuleIdentityRegistryOwnable2Step.sol#L12-L16)
-src/rules/validation/abstract/core/RuleNFTAdapter.sol#L26-L27
+src/rules/validation/abstract/core/RuleNFTAdapter.sol#L24-L25
- [ ] ID-56
-[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC3643](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L20-L21) is never used in [RuleIdentityRegistryOwnable2Step](src/rules/validation/deployment/RuleIdentityRegistryOwnable2Step.sol#L12-L16)
+[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC3643](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L20) is never used in [RuleWhitelistOwnable2StepHarness](src/mocks/harness/DeploymentCoverageHarnesses.sol#L69-L77)
-src/rules/validation/abstract/core/RuleNFTAdapter.sol#L20-L21
+src/rules/validation/abstract/core/RuleNFTAdapter.sol#L20
- [ ] ID-57
-[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC7943](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L24-L25) is never used in [RuleIdentityRegistry](src/rules/validation/deployment/RuleIdentityRegistry.sol#L14-L36)
+[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC3643](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L20) is never used in [RuleIdentityRegistryOwnable2Step](src/rules/validation/deployment/RuleIdentityRegistryOwnable2Step.sol#L12-L16)
-src/rules/validation/abstract/core/RuleNFTAdapter.sol#L24-L25
+src/rules/validation/abstract/core/RuleNFTAdapter.sol#L20
- [ ] ID-58
-[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC7943_FROM](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L26-L27) is never used in [RuleBlacklistOwnable2Step](src/rules/validation/deployment/RuleBlacklistOwnable2Step.sol#L14-L35)
+[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC7943](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L22-L23) is never used in [RuleIdentityRegistry](src/rules/validation/deployment/RuleIdentityRegistry.sol#L14-L36)
-src/rules/validation/abstract/core/RuleNFTAdapter.sol#L26-L27
+src/rules/validation/abstract/core/RuleNFTAdapter.sol#L22-L23
- [ ] ID-59
-[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC7943](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L24-L25) is never used in [RuleWhitelistWrapperOwnable2Step](src/rules/validation/deployment/RuleWhitelistWrapperOwnable2Step.sol#L15-L51)
+[RuleNFTAdapter.TRANSFERRED_SELECTOR_RULE_ENGINE](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L21) is never used in [RuleWhitelistWrapperHarness](src/mocks/harness/DeploymentCoverageHarnesses.sol#L33-L41)
-src/rules/validation/abstract/core/RuleNFTAdapter.sol#L24-L25
+src/rules/validation/abstract/core/RuleNFTAdapter.sol#L21
- [ ] ID-60
-[RuleNFTAdapter.TRANSFERRED_SELECTOR_RULE_ENGINE](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L22-L23) is never used in [RuleWhitelist](src/rules/validation/deployment/RuleWhitelist.sol#L20-L73)
+[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC7943_FROM](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L24-L25) is never used in [RuleERC2980Harness](src/mocks/harness/DeploymentCoverageHarnesses.sol#L43-L49)
-src/rules/validation/abstract/core/RuleNFTAdapter.sol#L22-L23
+src/rules/validation/abstract/core/RuleNFTAdapter.sol#L24-L25
- [ ] ID-61
-[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC7943](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L24-L25) is never used in [RuleSanctionsList](src/rules/validation/deployment/RuleSanctionsList.sol#L16-L58)
+[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC3643](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L20) is never used in [RuleBlacklistHarness](src/mocks/harness/DeploymentCoverageHarnesses.sol#L15-L21)
-src/rules/validation/abstract/core/RuleNFTAdapter.sol#L24-L25
+src/rules/validation/abstract/core/RuleNFTAdapter.sol#L20
- [ ] ID-62
-[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC7943](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L24-L25) is never used in [RuleERC2980Ownable2Step](src/rules/validation/deployment/RuleERC2980Ownable2Step.sol#L14-L39)
+[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC7943](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L22-L23) is never used in [RuleWhitelistWrapperHarnessInternal](src/mocks/harness/RuleWhitelistWrapperHarnessInternal.sol#L6-L14)
-src/rules/validation/abstract/core/RuleNFTAdapter.sol#L24-L25
+src/rules/validation/abstract/core/RuleNFTAdapter.sol#L22-L23
- [ ] ID-63
-[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC3643](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L20-L21) is never used in [RuleERC2980Ownable2Step](src/rules/validation/deployment/RuleERC2980Ownable2Step.sol#L14-L39)
+[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC7943_FROM](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L24-L25) is never used in [RuleBlacklistHarness](src/mocks/harness/DeploymentCoverageHarnesses.sol#L15-L21)
-src/rules/validation/abstract/core/RuleNFTAdapter.sol#L20-L21
+src/rules/validation/abstract/core/RuleNFTAdapter.sol#L24-L25
- [ ] ID-64
-[RuleNFTAdapter.TRANSFERRED_SELECTOR_RULE_ENGINE](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L22-L23) is never used in [RuleBlacklistOwnable2Step](src/rules/validation/deployment/RuleBlacklistOwnable2Step.sol#L14-L35)
+[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC7943_FROM](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L24-L25) is never used in [RuleWhitelistWrapperOwnable2StepHarness](src/mocks/harness/DeploymentCoverageHarnesses.sol#L79-L87)
-src/rules/validation/abstract/core/RuleNFTAdapter.sol#L22-L23
+src/rules/validation/abstract/core/RuleNFTAdapter.sol#L24-L25
- [ ] ID-65
-[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC3643](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L20-L21) is never used in [RuleSanctionsList](src/rules/validation/deployment/RuleSanctionsList.sol#L16-L58)
+[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC7943](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L22-L23) is never used in [RuleWhitelistHarness](src/mocks/harness/DeploymentCoverageHarnesses.sol#L23-L31)
-src/rules/validation/abstract/core/RuleNFTAdapter.sol#L20-L21
+src/rules/validation/abstract/core/RuleNFTAdapter.sol#L22-L23
- [ ] ID-66
-[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC7943](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L24-L25) is never used in [RuleSanctionsListOwnable2Step](src/rules/validation/deployment/RuleSanctionsListOwnable2Step.sol#L15-L34)
+[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC7943](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L22-L23) is never used in [RuleSpenderWhitelistHarness](src/mocks/harness/RuleSpenderWhitelistHarnesses.sol#L7-L21)
-src/rules/validation/abstract/core/RuleNFTAdapter.sol#L24-L25
+src/rules/validation/abstract/core/RuleNFTAdapter.sol#L22-L23
- [ ] ID-67
-[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC7943](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L24-L25) is never used in [RuleERC2980](src/rules/validation/deployment/RuleERC2980.sol#L32-L83)
+[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC3643](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L20) is never used in [RuleWhitelistHarness](src/mocks/harness/DeploymentCoverageHarnesses.sol#L23-L31)
-src/rules/validation/abstract/core/RuleNFTAdapter.sol#L24-L25
+src/rules/validation/abstract/core/RuleNFTAdapter.sol#L20
- [ ] ID-68
-[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC7943](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L24-L25) is never used in [RuleWhitelist](src/rules/validation/deployment/RuleWhitelist.sol#L20-L73)
+[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC3643](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L20) is never used in [RuleSpenderWhitelistHarness](src/mocks/harness/RuleSpenderWhitelistHarnesses.sol#L7-L21)
-src/rules/validation/abstract/core/RuleNFTAdapter.sol#L24-L25
+src/rules/validation/abstract/core/RuleNFTAdapter.sol#L20
- [ ] ID-69
-[RuleNFTAdapter.TRANSFERRED_SELECTOR_RULE_ENGINE](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L22-L23) is never used in [RuleIdentityRegistry](src/rules/validation/deployment/RuleIdentityRegistry.sol#L14-L36)
+[RuleNFTAdapter.TRANSFERRED_SELECTOR_RULE_ENGINE](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L21) is never used in [RuleIdentityRegistry](src/rules/validation/deployment/RuleIdentityRegistry.sol#L14-L36)
-src/rules/validation/abstract/core/RuleNFTAdapter.sol#L22-L23
+src/rules/validation/abstract/core/RuleNFTAdapter.sol#L21
- [ ] ID-70
-[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC3643](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L20-L21) is never used in [RuleWhitelist](src/rules/validation/deployment/RuleWhitelist.sol#L20-L73)
+[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC7943](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L22-L23) is never used in [RuleBlacklistOwnable2StepHarness](src/mocks/harness/DeploymentCoverageHarnesses.sol#L61-L67)
-src/rules/validation/abstract/core/RuleNFTAdapter.sol#L20-L21
+src/rules/validation/abstract/core/RuleNFTAdapter.sol#L22-L23
- [ ] ID-71
-[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC3643](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L20-L21) is never used in [RuleSanctionsListOwnable2Step](src/rules/validation/deployment/RuleSanctionsListOwnable2Step.sol#L15-L34)
+[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC3643](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L20) is never used in [RuleWhitelistWrapperOwnable2StepHarness](src/mocks/harness/DeploymentCoverageHarnesses.sol#L79-L87)
-src/rules/validation/abstract/core/RuleNFTAdapter.sol#L20-L21
+src/rules/validation/abstract/core/RuleNFTAdapter.sol#L20
- [ ] ID-72
-[RuleNFTAdapter.TRANSFERRED_SELECTOR_RULE_ENGINE](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L22-L23) is never used in [RuleBlacklist](src/rules/validation/deployment/RuleBlacklist.sol#L15-L53)
+[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC7943_FROM](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L24-L25) is never used in [RuleWhitelistWrapperHarnessInternal](src/mocks/harness/RuleWhitelistWrapperHarnessInternal.sol#L6-L14)
-src/rules/validation/abstract/core/RuleNFTAdapter.sol#L22-L23
+src/rules/validation/abstract/core/RuleNFTAdapter.sol#L24-L25
- [ ] ID-73
-[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC7943](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L24-L25) is never used in [RuleWhitelistOwnable2Step](src/rules/validation/deployment/RuleWhitelistOwnable2Step.sol#L14-L37)
+[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC7943_FROM](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L24-L25) is never used in [RuleIdentityRegistry](src/rules/validation/deployment/RuleIdentityRegistry.sol#L14-L36)
src/rules/validation/abstract/core/RuleNFTAdapter.sol#L24-L25
- [ ] ID-74
-[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC7943_FROM](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L26-L27) is never used in [RuleIdentityRegistry](src/rules/validation/deployment/RuleIdentityRegistry.sol#L14-L36)
+[RuleNFTAdapter.TRANSFERRED_SELECTOR_RULE_ENGINE](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L21) is never used in [RuleSpenderWhitelistOwnable2StepHarness](src/mocks/harness/RuleSpenderWhitelistHarnesses.sol#L23-L39)
-src/rules/validation/abstract/core/RuleNFTAdapter.sol#L26-L27
+src/rules/validation/abstract/core/RuleNFTAdapter.sol#L21
- [ ] ID-75
-[RuleNFTAdapter.TRANSFERRED_SELECTOR_RULE_ENGINE](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L22-L23) is never used in [RuleWhitelistOwnable2Step](src/rules/validation/deployment/RuleWhitelistOwnable2Step.sol#L14-L37)
+[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC7943](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L22-L23) is never used in [RuleSanctionsListHarness](src/mocks/harness/DeploymentCoverageHarnesses.sol#L51-L59)
src/rules/validation/abstract/core/RuleNFTAdapter.sol#L22-L23
- [ ] ID-76
-[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC7943_FROM](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L26-L27) is never used in [RuleWhitelistOwnable2Step](src/rules/validation/deployment/RuleWhitelistOwnable2Step.sol#L14-L37)
+[RuleNFTAdapter.TRANSFERRED_SELECTOR_RULE_ENGINE](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L21) is never used in [RuleWhitelistHarness](src/mocks/harness/DeploymentCoverageHarnesses.sol#L23-L31)
-src/rules/validation/abstract/core/RuleNFTAdapter.sol#L26-L27
+src/rules/validation/abstract/core/RuleNFTAdapter.sol#L21
- [ ] ID-77
-[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC3643](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L20-L21) is never used in [RuleWhitelistOwnable2Step](src/rules/validation/deployment/RuleWhitelistOwnable2Step.sol#L14-L37)
+[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC7943_FROM](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L24-L25) is never used in [RuleWhitelistOwnable2StepHarness](src/mocks/harness/DeploymentCoverageHarnesses.sol#L69-L77)
-src/rules/validation/abstract/core/RuleNFTAdapter.sol#L20-L21
+src/rules/validation/abstract/core/RuleNFTAdapter.sol#L24-L25
- [ ] ID-78
-[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC7943](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L24-L25) is never used in [RuleBlacklistOwnable2Step](src/rules/validation/deployment/RuleBlacklistOwnable2Step.sol#L14-L35)
+[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC3643](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L20) is never used in [RuleSanctionsListOwnable2StepHarness](src/mocks/harness/RuleSanctionsListOwnable2StepHarness.sol#L7-L23)
-src/rules/validation/abstract/core/RuleNFTAdapter.sol#L24-L25
+src/rules/validation/abstract/core/RuleNFTAdapter.sol#L20
- [ ] ID-79
-[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC7943_FROM](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L26-L27) is never used in [RuleBlacklist](src/rules/validation/deployment/RuleBlacklist.sol#L15-L53)
+[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC7943](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L22-L23) is never used in [RuleSpenderWhitelistOwnable2StepHarness](src/mocks/harness/RuleSpenderWhitelistHarnesses.sol#L23-L39)
-src/rules/validation/abstract/core/RuleNFTAdapter.sol#L26-L27
+src/rules/validation/abstract/core/RuleNFTAdapter.sol#L22-L23
- [ ] ID-80
-[RuleNFTAdapter.TRANSFERRED_SELECTOR_RULE_ENGINE](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L22-L23) is never used in [RuleERC2980](src/rules/validation/deployment/RuleERC2980.sol#L32-L83)
+[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC7943](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L22-L23) is never used in [RuleSanctionsListOwnable2StepHarness](src/mocks/harness/RuleSanctionsListOwnable2StepHarness.sol#L7-L23)
src/rules/validation/abstract/core/RuleNFTAdapter.sol#L22-L23
- [ ] ID-81
-[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC3643](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L20-L21) is never used in [RuleBlacklist](src/rules/validation/deployment/RuleBlacklist.sol#L15-L53)
+[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC7943_FROM](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L24-L25) is never used in [RuleSpenderWhitelistOwnable2StepHarness](src/mocks/harness/RuleSpenderWhitelistHarnesses.sol#L23-L39)
-src/rules/validation/abstract/core/RuleNFTAdapter.sol#L20-L21
+src/rules/validation/abstract/core/RuleNFTAdapter.sol#L24-L25
- [ ] ID-82
-[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC3643](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L20-L21) is never used in [RuleWhitelistWrapperOwnable2Step](src/rules/validation/deployment/RuleWhitelistWrapperOwnable2Step.sol#L15-L51)
+[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC7943_FROM](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L24-L25) is never used in [RuleSanctionsListHarness](src/mocks/harness/DeploymentCoverageHarnesses.sol#L51-L59)
-src/rules/validation/abstract/core/RuleNFTAdapter.sol#L20-L21
+src/rules/validation/abstract/core/RuleNFTAdapter.sol#L24-L25
- [ ] ID-83
-[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC3643](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L20-L21) is never used in [RuleIdentityRegistry](src/rules/validation/deployment/RuleIdentityRegistry.sol#L14-L36)
+[RuleNFTAdapter.TRANSFERRED_SELECTOR_RULE_ENGINE](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L21) is never used in [RuleSpenderWhitelistHarness](src/mocks/harness/RuleSpenderWhitelistHarnesses.sol#L7-L21)
-src/rules/validation/abstract/core/RuleNFTAdapter.sol#L20-L21
+src/rules/validation/abstract/core/RuleNFTAdapter.sol#L21
- [ ] ID-84
-[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC3643](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L20-L21) is never used in [RuleWhitelistWrapper](src/rules/validation/deployment/RuleWhitelistWrapper.sol#L16-L98)
+[RuleNFTAdapter.TRANSFERRED_SELECTOR_RULE_ENGINE](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L21) is never used in [RuleSanctionsListOwnable2StepHarness](src/mocks/harness/RuleSanctionsListOwnable2StepHarness.sol#L7-L23)
-src/rules/validation/abstract/core/RuleNFTAdapter.sol#L20-L21
+src/rules/validation/abstract/core/RuleNFTAdapter.sol#L21
- [ ] ID-85
-[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC7943](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L24-L25) is never used in [RuleBlacklist](src/rules/validation/deployment/RuleBlacklist.sol#L15-L53)
+[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC3643](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L20) is never used in [RuleIdentityRegistry](src/rules/validation/deployment/RuleIdentityRegistry.sol#L14-L36)
-src/rules/validation/abstract/core/RuleNFTAdapter.sol#L24-L25
+src/rules/validation/abstract/core/RuleNFTAdapter.sol#L20
- [ ] ID-86
-[RuleNFTAdapter.TRANSFERRED_SELECTOR_RULE_ENGINE](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L22-L23) is never used in [RuleERC2980Ownable2Step](src/rules/validation/deployment/RuleERC2980Ownable2Step.sol#L14-L39)
+[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC7943_FROM](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L24-L25) is never used in [RuleBlacklistOwnable2StepHarness](src/mocks/harness/DeploymentCoverageHarnesses.sol#L61-L67)
-src/rules/validation/abstract/core/RuleNFTAdapter.sol#L22-L23
+src/rules/validation/abstract/core/RuleNFTAdapter.sol#L24-L25
- [ ] ID-87
-[RuleNFTAdapter.TRANSFERRED_SELECTOR_RULE_ENGINE](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L22-L23) is never used in [RuleWhitelistWrapperOwnable2Step](src/rules/validation/deployment/RuleWhitelistWrapperOwnable2Step.sol#L15-L51)
+[RuleNFTAdapter.TRANSFERRED_SELECTOR_RULE_ENGINE](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L21) is never used in [RuleSanctionsListHarness](src/mocks/harness/DeploymentCoverageHarnesses.sol#L51-L59)
+
+src/rules/validation/abstract/core/RuleNFTAdapter.sol#L21
+
+
+ - [ ] ID-88
+[RuleNFTAdapter.TRANSFERRED_SELECTOR_ERC7943](src/rules/validation/abstract/core/RuleNFTAdapter.sol#L22-L23) is never used in [RuleWhitelistOwnable2StepHarness](src/mocks/harness/DeploymentCoverageHarnesses.sol#L69-L77)
src/rules/validation/abstract/core/RuleNFTAdapter.sol#L22-L23
From 11d238570dd97a6131aaaf4d34753b35c48a6a0d Mon Sep 17 00:00:00 2001
From: Ryan Sauge <71391932+rya-sge@users.noreply.github.com>
Date: Tue, 10 Mar 2026 16:16:53 +0100
Subject: [PATCH 7/8] Update code coverage
---
.../RuleAddressSet.sol.func-sort-c.html | 28 +-
.../RuleAddressSet.sol.func.html | 22 +-
.../RuleAddressSet.sol.gcov.html | 65 +-
...uleAddressSetInternal.sol.func-sort-c.html | 18 +-
.../RuleAddressSetInternal.sol.func.html | 18 +-
.../RuleAddressSetInternal.sol.gcov.html | 135 +-
.../abstract/RuleAddressSet/index-sort-b.html | 2 +-
.../abstract/RuleAddressSet/index-sort-f.html | 2 +-
.../abstract/RuleAddressSet/index-sort-l.html | 2 +-
.../abstract/RuleAddressSet/index.html | 2 +-
.../RuleERC2980Internal.sol.func-sort-c.html | 2 +-
.../RuleERC2980Internal.sol.func.html | 2 +-
.../RuleERC2980Internal.sol.gcov.html | 2 +-
.../abstract/RuleERC2980/index-sort-b.html | 2 +-
.../abstract/RuleERC2980/index-sort-f.html | 2 +-
.../abstract/RuleERC2980/index-sort-l.html | 2 +-
.../coverage/abstract/RuleERC2980/index.html | 2 +-
.../RuleBlacklistBase.sol.func-sort-c.html | 18 +-
.../base/RuleBlacklistBase.sol.func.html | 18 +-
.../base/RuleBlacklistBase.sol.gcov.html | 209 +-
.../base/RuleERC2980Base.sol.func-sort-c.html | 70 +-
.../base/RuleERC2980Base.sol.func.html | 70 +-
.../base/RuleERC2980Base.sol.gcov.html | 662 +++--
...eIdentityRegistryBase.sol.func-sort-c.html | 16 +-
.../RuleIdentityRegistryBase.sol.func.html | 16 +-
.../RuleIdentityRegistryBase.sol.gcov.html | 199 +-
...uleMaxTotalSupplyBase.sol.func-sort-c.html | 18 +-
.../base/RuleMaxTotalSupplyBase.sol.func.html | 18 +-
.../base/RuleMaxTotalSupplyBase.sol.gcov.html | 165 +-
...RuleSanctionsListBase.sol.func-sort-c.html | 22 +-
.../base/RuleSanctionsListBase.sol.func.html | 22 +-
.../base/RuleSanctionsListBase.sol.gcov.html | 207 +-
...eSpenderWhitelistBase.sol.func-sort-c.html | 113 +
.../RuleSpenderWhitelistBase.sol.func.html | 113 +
.../RuleSpenderWhitelistBase.sol.gcov.html | 157 ++
.../RuleWhitelistBase.sol.func-sort-c.html | 22 +-
.../base/RuleWhitelistBase.sol.func.html | 22 +-
.../base/RuleWhitelistBase.sol.gcov.html | 154 +-
...eWhitelistWrapperBase.sol.func-sort-c.html | 24 +-
.../RuleWhitelistWrapperBase.sol.func.html | 24 +-
.../RuleWhitelistWrapperBase.sol.gcov.html | 332 ++-
.../coverage/abstract/base/index-sort-b.html | 28 +-
.../coverage/abstract/base/index-sort-f.html | 40 +-
.../coverage/abstract/base/index-sort-l.html | 28 +-
.../coverage/abstract/base/index.html | 28 +-
.../core/RuleNFTAdapter.sol.func-sort-c.html | 34 +-
.../core/RuleNFTAdapter.sol.func.html | 34 +-
.../core/RuleNFTAdapter.sol.gcov.html | 256 +-
...uleTransferValidation.sol.func-sort-c.html | 22 +-
.../core/RuleTransferValidation.sol.func.html | 22 +-
.../core/RuleTransferValidation.sol.gcov.html | 186 +-
.../RuleWhitelistShared.sol.func-sort-c.html | 18 +-
.../core/RuleWhitelistShared.sol.func.html | 18 +-
.../core/RuleWhitelistShared.sol.gcov.html | 164 +-
.../coverage/abstract/core/index-sort-b.html | 8 +-
.../coverage/abstract/core/index-sort-f.html | 8 +-
.../coverage/abstract/core/index-sort-l.html | 8 +-
.../coverage/abstract/core/index.html | 8 +-
.../RuleBlacklist.sol.func-sort-c.html | 16 +-
.../deployment/RuleBlacklist.sol.func.html | 16 +-
.../deployment/RuleBlacklist.sol.gcov.html | 45 +-
...BlacklistOwnable2Step.sol.func-sort-c.html | 12 +-
.../RuleBlacklistOwnable2Step.sol.func.html | 12 +-
.../RuleBlacklistOwnable2Step.sol.gcov.html | 41 +-
.../RuleERC2980.sol.func-sort-c.html | 2 +-
.../deployment/RuleERC2980.sol.func.html | 2 +-
.../deployment/RuleERC2980.sol.gcov.html | 2 +-
...leERC2980Ownable2Step.sol.func-sort-c.html | 16 +-
.../RuleERC2980Ownable2Step.sol.func.html | 16 +-
.../RuleERC2980Ownable2Step.sol.gcov.html | 49 +-
.../RuleIdentityRegistry.sol.func-sort-c.html | 2 +-
.../RuleIdentityRegistry.sol.func.html | 2 +-
.../RuleIdentityRegistry.sol.gcov.html | 2 +-
...yRegistryOwnable2Step.sol.func-sort-c.html | 2 +-
...IdentityRegistryOwnable2Step.sol.func.html | 2 +-
...IdentityRegistryOwnable2Step.sol.gcov.html | 2 +-
.../RuleMaxTotalSupply.sol.func-sort-c.html | 2 +-
.../RuleMaxTotalSupply.sol.func.html | 2 +-
.../RuleMaxTotalSupply.sol.gcov.html | 2 +-
...talSupplyOwnable2Step.sol.func-sort-c.html | 2 +-
...leMaxTotalSupplyOwnable2Step.sol.func.html | 2 +-
...leMaxTotalSupplyOwnable2Step.sol.gcov.html | 2 +-
.../RuleSanctionsList.sol.func-sort-c.html | 2 +-
.../RuleSanctionsList.sol.func.html | 2 +-
.../RuleSanctionsList.sol.gcov.html | 4 +-
...tionsListOwnable2Step.sol.func-sort-c.html | 2 +-
...uleSanctionsListOwnable2Step.sol.func.html | 2 +-
...uleSanctionsListOwnable2Step.sol.gcov.html | 4 +-
.../RuleSpenderWhitelist.sol.func-sort-c.html | 105 +
.../RuleSpenderWhitelist.sol.func.html | 105 +
.../RuleSpenderWhitelist.sol.gcov.html | 132 +
...WhitelistOwnable2Step.sol.func-sort-c.html | 101 +
...SpenderWhitelistOwnable2Step.sol.func.html | 101 +
...SpenderWhitelistOwnable2Step.sol.gcov.html | 120 +
.../RuleWhitelist.sol.func-sort-c.html | 26 +-
.../deployment/RuleWhitelist.sol.func.html | 26 +-
.../deployment/RuleWhitelist.sol.gcov.html | 130 +-
...WhitelistOwnable2Step.sol.func-sort-c.html | 2 +-
.../RuleWhitelistOwnable2Step.sol.func.html | 2 +-
.../RuleWhitelistOwnable2Step.sol.gcov.html | 2 +-
.../RuleWhitelistWrapper.sol.func-sort-c.html | 20 +-
.../RuleWhitelistWrapper.sol.func.html | 20 +-
.../RuleWhitelistWrapper.sol.gcov.html | 171 +-
...stWrapperOwnable2Step.sol.func-sort-c.html | 2 +-
...WhitelistWrapperOwnable2Step.sol.func.html | 2 +-
...WhitelistWrapperOwnable2Step.sol.gcov.html | 17 +-
.../coverage/deployment/index-sort-b.html | 108 +-
.../coverage/deployment/index-sort-f.html | 50 +-
.../coverage/deployment/index-sort-l.html | 56 +-
doc/coverage/coverage/deployment/index.html | 38 +-
...ntrolModuleStandalone.sol.func-sort-c.html | 6 +-
...ccessControlModuleStandalone.sol.func.html | 6 +-
...ccessControlModuleStandalone.sol.gcov.html | 16 +-
.../VersionModule.sol.func-sort-c.html | 2 +-
.../src/modules/VersionModule.sol.func.html | 2 +-
.../src/modules/VersionModule.sol.gcov.html | 2 +-
.../dev/Rules/src/modules/index-sort-b.html | 2 +-
.../dev/Rules/src/modules/index-sort-f.html | 2 +-
.../dev/Rules/src/modules/index-sort-l.html | 2 +-
.../Pictures/dev/Rules/src/modules/index.html | 2 +-
...ditionalTransferLight.sol.func-sort-c.html | 8 +-
...RuleConditionalTransferLight.sol.func.html | 8 +-
...RuleConditionalTransferLight.sol.gcov.html | 19 +-
...sferLightOwnable2Step.sol.func-sort-c.html | 8 +-
...nalTransferLightOwnable2Step.sol.func.html | 8 +-
...nalTransferLightOwnable2Step.sol.gcov.html | 29 +-
...onalTransferLightBase.sol.func-sort-c.html | 52 +-
...ConditionalTransferLightBase.sol.func.html | 52 +-
...ConditionalTransferLightBase.sol.gcov.html | 376 +--
.../operation/abstract/index-sort-b.html | 8 +-
.../operation/abstract/index-sort-f.html | 8 +-
.../operation/abstract/index-sort-l.html | 8 +-
.../src/rules/operation/abstract/index.html | 8 +-
.../src/rules/operation/index-sort-b.html | 2 +-
.../src/rules/operation/index-sort-f.html | 2 +-
.../src/rules/operation/index-sort-l.html | 2 +-
.../dev/Rules/src/rules/operation/index.html | 2 +-
doc/coverage/coverage/index-sort-b.html | 28 +-
doc/coverage/coverage/index-sort-f.html | 28 +-
doc/coverage/coverage/index-sort-l.html | 28 +-
doc/coverage/coverage/index.html | 28 +-
doc/coverage/lcov.info | 2229 +++++++----------
142 files changed, 4594 insertions(+), 3903 deletions(-)
create mode 100644 doc/coverage/coverage/abstract/base/RuleSpenderWhitelistBase.sol.func-sort-c.html
create mode 100644 doc/coverage/coverage/abstract/base/RuleSpenderWhitelistBase.sol.func.html
create mode 100644 doc/coverage/coverage/abstract/base/RuleSpenderWhitelistBase.sol.gcov.html
create mode 100644 doc/coverage/coverage/deployment/RuleSpenderWhitelist.sol.func-sort-c.html
create mode 100644 doc/coverage/coverage/deployment/RuleSpenderWhitelist.sol.func.html
create mode 100644 doc/coverage/coverage/deployment/RuleSpenderWhitelist.sol.gcov.html
create mode 100644 doc/coverage/coverage/deployment/RuleSpenderWhitelistOwnable2Step.sol.func-sort-c.html
create mode 100644 doc/coverage/coverage/deployment/RuleSpenderWhitelistOwnable2Step.sol.func.html
create mode 100644 doc/coverage/coverage/deployment/RuleSpenderWhitelistOwnable2Step.sol.gcov.html
diff --git a/doc/coverage/coverage/abstract/RuleAddressSet/RuleAddressSet.sol.func-sort-c.html b/doc/coverage/coverage/abstract/RuleAddressSet/RuleAddressSet.sol.func-sort-c.html
index 65bc64a..42a7372 100644
--- a/doc/coverage/coverage/abstract/RuleAddressSet/RuleAddressSet.sol.func-sort-c.html
+++ b/doc/coverage/coverage/abstract/RuleAddressSet/RuleAddressSet.sol.func-sort-c.html
@@ -37,7 +37,7 @@
-
+
|
@@ -73,29 +73,29 @@
2 |
- | RuleAddressSet._msgData |
- 4 |
+ RuleAddressSet._msgData |
+ 6 |
| RuleAddressSet.onlyAddressListRemove |
- 8 |
+ 12 |
| RuleAddressSet.removeAddress |
- 8 |
+ 12 |
| RuleAddressSet.isAddressListed |
- 67 |
-
-
- | RuleAddressSet.addAddress |
- 105 |
+ 71 |
| RuleAddressSet.areAddressesListed |
108 |
+
+ | RuleAddressSet.addAddress |
+ 117 |
+
| RuleAddressSet.removeAddresses |
260 |
@@ -113,12 +113,12 @@
536 |
- | RuleAddressSet._msgSender |
- 882 |
+ RuleAddressSet._msgSender |
+ 929 |
- | RuleAddressSet._contextSuffixLength |
- 886 |
+ RuleAddressSet._contextSuffixLength |
+ 937 |
diff --git a/doc/coverage/coverage/abstract/RuleAddressSet/RuleAddressSet.sol.func.html b/doc/coverage/coverage/abstract/RuleAddressSet/RuleAddressSet.sol.func.html
index 5984b78..1d8147e 100644
--- a/doc/coverage/coverage/abstract/RuleAddressSet/RuleAddressSet.sol.func.html
+++ b/doc/coverage/coverage/abstract/RuleAddressSet/RuleAddressSet.sol.func.html
@@ -37,7 +37,7 @@
-
+
|
@@ -69,20 +69,20 @@
Hit count  |
- | RuleAddressSet._contextSuffixLength |
- 886 |
+ RuleAddressSet._contextSuffixLength |
+ 937 |
- | RuleAddressSet._msgData |
- 4 |
+ RuleAddressSet._msgData |
+ 6 |
- | RuleAddressSet._msgSender |
- 882 |
+ RuleAddressSet._msgSender |
+ 929 |
| RuleAddressSet.addAddress |
- 105 |
+ 117 |
| RuleAddressSet.addAddresses |
@@ -98,7 +98,7 @@
| RuleAddressSet.isAddressListed |
- 67 |
+ 71 |
| RuleAddressSet.listedAddressCount |
@@ -110,11 +110,11 @@
| RuleAddressSet.onlyAddressListRemove |
- 8 |
+ 12 |
| RuleAddressSet.removeAddress |
- 8 |
+ 12 |
| RuleAddressSet.removeAddresses |
diff --git a/doc/coverage/coverage/abstract/RuleAddressSet/RuleAddressSet.sol.gcov.html b/doc/coverage/coverage/abstract/RuleAddressSet/RuleAddressSet.sol.gcov.html
index cef3ac8..dbff4e5 100644
--- a/doc/coverage/coverage/abstract/RuleAddressSet/RuleAddressSet.sol.gcov.html
+++ b/doc/coverage/coverage/abstract/RuleAddressSet/RuleAddressSet.sol.gcov.html
@@ -37,7 +37,7 @@
-
+
|
@@ -143,10 +143,10 @@
72 : : * - Accessible only by accounts with the `ADDRESS_LIST_ADD_ROLE`.
73 : : * @param targetAddress The address to be added.
74 : : */
- 75 : 105 : function addAddress(address targetAddress) public onlyAddressListAdd {
- 76 [ + + ]: 102 : require(!_isAddressListed(targetAddress), RuleAddressSet_AddressAlreadyListed());
- 77 : 101 : _addAddress(targetAddress);
- 78 : 101 : emit AddAddress(targetAddress);
+ 75 : 117 : function addAddress(address targetAddress) public onlyAddressListAdd {
+ 76 [ + + ]: 112 : require(!_isAddressListed(targetAddress), RuleAddressSet_AddressAlreadyListed());
+ 77 : 111 : _addAddress(targetAddress);
+ 78 : 111 : emit AddAddress(targetAddress);
79 : : }
80 : :
81 : : /**
@@ -156,10 +156,10 @@
85 : : * - Accessible only by accounts with the `ADDRESS_LIST_REMOVE_ROLE`.
86 : : * @param targetAddress The address to be removed.
87 : : */
- 88 : 8 : function removeAddress(address targetAddress) public onlyAddressListRemove {
- 89 [ + + ]: 5 : require(_isAddressListed(targetAddress), RuleAddressSet_AddressNotFound());
- 90 : 4 : _removeAddress(targetAddress);
- 91 : 4 : emit RemoveAddress(targetAddress);
+ 88 : 12 : function removeAddress(address targetAddress) public onlyAddressListRemove {
+ 89 [ + + ]: 7 : require(_isAddressListed(targetAddress), RuleAddressSet_AddressNotFound());
+ 90 : 6 : _removeAddress(targetAddress);
+ 91 : 6 : emit RemoveAddress(targetAddress);
92 : : }
93 : :
94 : : /*//////////////////////////////////////////////////////////////
@@ -171,8 +171,8 @@
100 : : _;
101 : : }
102 : :
- 103 : 8 : modifier onlyAddressListRemove() {
- 104 : 8 : _authorizeAddressListRemove();
+ 103 : 12 : modifier onlyAddressListRemove() {
+ 104 : 12 : _authorizeAddressListRemove();
105 : : _;
106 : : }
107 : :
@@ -202,8 +202,8 @@
131 : : * @param targetAddress The address to check.
132 : : * @return isListed True if listed, false otherwise.
133 : : */
- 134 : 67 : function isAddressListed(address targetAddress) public view returns (bool isListed) {
- 135 : 383 : isListed = _isAddressListed(targetAddress);
+ 134 : 71 : function isAddressListed(address targetAddress) public view returns (bool isListed) {
+ 135 : 391 : isListed = _isAddressListed(targetAddress);
136 : : }
137 : :
138 : : /**
@@ -217,25 +217,26 @@
146 : 244 : results[i] = _isAddressListed(targetAddresses[i]);
147 : : }
148 : : }
- 149 : : /*//////////////////////////////////////////////////////////////
- 150 : : ERC-2771 META TX
- 151 : : //////////////////////////////////////////////////////////////*/
- 152 : :
- 153 : : /// @inheritdoc ERC2771Context
- 154 : 882 : function _msgSender() internal view virtual override(ERC2771Context) returns (address sender) {
- 155 : 882 : return ERC2771Context._msgSender();
- 156 : : }
- 157 : :
- 158 : : /// @inheritdoc ERC2771Context
- 159 : 4 : function _msgData() internal view virtual override(ERC2771Context) returns (bytes calldata) {
- 160 : 4 : return ERC2771Context._msgData();
- 161 : : }
- 162 : :
- 163 : : /// @inheritdoc ERC2771Context
- 164 : 886 : function _contextSuffixLength() internal view virtual override(ERC2771Context) returns (uint256) {
- 165 : 886 : return ERC2771Context._contextSuffixLength();
- 166 : : }
- 167 : : }
+ 149 : :
+ 150 : : /*//////////////////////////////////////////////////////////////
+ 151 : : ERC-2771 META TX
+ 152 : : //////////////////////////////////////////////////////////////*/
+ 153 : :
+ 154 : : /// @inheritdoc ERC2771Context
+ 155 : 929 : function _msgSender() internal view virtual override(ERC2771Context) returns (address sender) {
+ 156 : 929 : return ERC2771Context._msgSender();
+ 157 : : }
+ 158 : :
+ 159 : : /// @inheritdoc ERC2771Context
+ 160 : 6 : function _msgData() internal view virtual override(ERC2771Context) returns (bytes calldata) {
+ 161 : 6 : return ERC2771Context._msgData();
+ 162 : : }
+ 163 : :
+ 164 : : /// @inheritdoc ERC2771Context
+ 165 : 937 : function _contextSuffixLength() internal view virtual override(ERC2771Context) returns (uint256) {
+ 166 : 937 : return ERC2771Context._contextSuffixLength();
+ 167 : : }
+ 168 : : }
diff --git a/doc/coverage/coverage/abstract/RuleAddressSet/RuleAddressSetInternal.sol.func-sort-c.html b/doc/coverage/coverage/abstract/RuleAddressSet/RuleAddressSetInternal.sol.func-sort-c.html
index a58da58..01dc2e5 100644
--- a/doc/coverage/coverage/abstract/RuleAddressSet/RuleAddressSetInternal.sol.func-sort-c.html
+++ b/doc/coverage/coverage/abstract/RuleAddressSet/RuleAddressSetInternal.sol.func-sort-c.html
@@ -37,7 +37,7 @@
-
+
|
@@ -69,15 +69,15 @@
Hit count  |
- | RuleAddressSetInternal._removeAddress |
- 4 |
+ RuleAddressSetInternal._removeAddress |
+ 6 |
- | RuleAddressSetInternal._addAddress |
- 101 |
+ RuleAddressSetInternal._addAddress |
+ 111 |
- | RuleAddressSetInternal._removeAddresses |
+ RuleAddressSetInternal._removeAddresses |
259 |
@@ -85,12 +85,12 @@
| 274 |
- | RuleAddressSetInternal._listedAddressCount |
+ RuleAddressSetInternal._listedAddressCount |
536 |
- | RuleAddressSetInternal._isAddressListed |
- 738 |
+ RuleAddressSetInternal._isAddressListed |
+ 771 |
diff --git a/doc/coverage/coverage/abstract/RuleAddressSet/RuleAddressSetInternal.sol.func.html b/doc/coverage/coverage/abstract/RuleAddressSet/RuleAddressSetInternal.sol.func.html
index c1510d8..b7986b8 100644
--- a/doc/coverage/coverage/abstract/RuleAddressSet/RuleAddressSetInternal.sol.func.html
+++ b/doc/coverage/coverage/abstract/RuleAddressSet/RuleAddressSetInternal.sol.func.html
@@ -37,7 +37,7 @@
-
+
|
@@ -69,27 +69,27 @@
Hit count  |
- | RuleAddressSetInternal._addAddress |
- 101 |
+ RuleAddressSetInternal._addAddress |
+ 111 |
| RuleAddressSetInternal._addAddresses |
274 |
- | RuleAddressSetInternal._isAddressListed |
- 738 |
+ RuleAddressSetInternal._isAddressListed |
+ 771 |
- | RuleAddressSetInternal._listedAddressCount |
+ RuleAddressSetInternal._listedAddressCount |
536 |
- | RuleAddressSetInternal._removeAddress |
- 4 |
+ RuleAddressSetInternal._removeAddress |
+ 6 |
- | RuleAddressSetInternal._removeAddresses |
+ RuleAddressSetInternal._removeAddresses |
259 |
diff --git a/doc/coverage/coverage/abstract/RuleAddressSet/RuleAddressSetInternal.sol.gcov.html b/doc/coverage/coverage/abstract/RuleAddressSet/RuleAddressSetInternal.sol.gcov.html
index 9518c01..463505a 100644
--- a/doc/coverage/coverage/abstract/RuleAddressSet/RuleAddressSetInternal.sol.gcov.html
+++ b/doc/coverage/coverage/abstract/RuleAddressSet/RuleAddressSetInternal.sol.gcov.html
@@ -37,7 +37,7 @@
-
+
|
@@ -106,74 +106,71 @@
35 : : * @return added The number of newly added addresses.
36 : : * @return skipped The number of addresses that were already listed.
37 : : */
- 38 : 274 : function _addAddresses(address[] calldata addressesToAdd)
- 39 : : internal
- 40 : : returns (uint256 added, uint256 skipped)
- 41 : : {
- 42 : 274 : for (uint256 i = 0; i < addressesToAdd.length; ++i) {
- 43 [ + + ]: 806 : if (_listedAddresses.add(addressesToAdd[i])) {
- 44 : 548 : added += 1;
- 45 : : } else {
- 46 : 258 : skipped += 1;
- 47 : : }
- 48 : : }
- 49 : : }
- 50 : :
- 51 : : /**
- 52 : : * @notice Removes multiple addresses from the set.
- 53 : : * @dev
- 54 : : * - Does not revert if an address is not found.
- 55 : : * - Skips non-existing entries silently.
- 56 : : * @param addressesToRemove The array of addresses to remove.
- 57 : : * @return removed The number of addresses removed.
- 58 : : * @return skipped The number of addresses that were not listed.
- 59 : : */
- 60 : 259 : function _removeAddresses(address[] calldata addressesToRemove)
- 61 : : internal
- 62 : : returns (uint256 removed, uint256 skipped)
- 63 : : {
- 64 : 259 : for (uint256 i = 0; i < addressesToRemove.length; ++i) {
- 65 [ + + ]: 775 : if (_listedAddresses.remove(addressesToRemove[i])) {
- 66 : 518 : removed += 1;
- 67 : : } else {
- 68 : 257 : skipped += 1;
- 69 : : }
- 70 : : }
- 71 : : }
- 72 : :
- 73 : : /**
- 74 : : * @notice Adds a single address to the set.
- 75 : : * @param targetAddress The address to add.
- 76 : : */
- 77 : 101 : function _addAddress(address targetAddress) internal virtual {
- 78 : 101 : _listedAddresses.add(targetAddress);
- 79 : : }
- 80 : :
- 81 : : /**
- 82 : : * @notice Removes a single address from the set.
- 83 : : * @param targetAddress The address to remove.
- 84 : : */
- 85 : 4 : function _removeAddress(address targetAddress) internal virtual {
- 86 : 4 : _listedAddresses.remove(targetAddress);
- 87 : : }
- 88 : :
- 89 : : /**
- 90 : : * @notice Returns the total number of listed addresses.
- 91 : : * @return count The number of listed addresses.
- 92 : : */
- 93 : 536 : function _listedAddressCount() internal view virtual returns (uint256 count) {
- 94 : 536 : count = _listedAddresses.length();
- 95 : : }
- 96 : :
- 97 : : /**
- 98 : : * @notice Checks if an address is listed.
- 99 : : * @param targetAddress The address to check.
- 100 : : * @return isListed True if the address is listed, false otherwise.
- 101 : : */
- 102 : 738 : function _isAddressListed(address targetAddress) internal view virtual returns (bool isListed) {
- 103 : 738 : isListed = _listedAddresses.contains(targetAddress);
- 104 : : }
- 105 : : }
+ 38 : 274 : function _addAddresses(address[] calldata addressesToAdd) internal returns (uint256 added, uint256 skipped) {
+ 39 : 274 : for (uint256 i = 0; i < addressesToAdd.length; ++i) {
+ 40 [ + + ]: 806 : if (_listedAddresses.add(addressesToAdd[i])) {
+ 41 : 548 : added += 1;
+ 42 : : } else {
+ 43 : 258 : skipped += 1;
+ 44 : : }
+ 45 : : }
+ 46 : : }
+ 47 : :
+ 48 : : /**
+ 49 : : * @notice Removes multiple addresses from the set.
+ 50 : : * @dev
+ 51 : : * - Does not revert if an address is not found.
+ 52 : : * - Skips non-existing entries silently.
+ 53 : : * @param addressesToRemove The array of addresses to remove.
+ 54 : : * @return removed The number of addresses removed.
+ 55 : : * @return skipped The number of addresses that were not listed.
+ 56 : : */
+ 57 : 259 : function _removeAddresses(address[] calldata addressesToRemove)
+ 58 : : internal
+ 59 : : returns (uint256 removed, uint256 skipped)
+ 60 : : {
+ 61 : 259 : for (uint256 i = 0; i < addressesToRemove.length; ++i) {
+ 62 [ + + ]: 775 : if (_listedAddresses.remove(addressesToRemove[i])) {
+ 63 : 518 : removed += 1;
+ 64 : : } else {
+ 65 : 257 : skipped += 1;
+ 66 : : }
+ 67 : : }
+ 68 : : }
+ 69 : :
+ 70 : : /**
+ 71 : : * @notice Adds a single address to the set.
+ 72 : : * @param targetAddress The address to add.
+ 73 : : */
+ 74 : 111 : function _addAddress(address targetAddress) internal virtual {
+ 75 : 111 : _listedAddresses.add(targetAddress);
+ 76 : : }
+ 77 : :
+ 78 : : /**
+ 79 : : * @notice Removes a single address from the set.
+ 80 : : * @param targetAddress The address to remove.
+ 81 : : */
+ 82 : 6 : function _removeAddress(address targetAddress) internal virtual {
+ 83 : 6 : _listedAddresses.remove(targetAddress);
+ 84 : : }
+ 85 : :
+ 86 : : /**
+ 87 : : * @notice Returns the total number of listed addresses.
+ 88 : : * @return count The number of listed addresses.
+ 89 : : */
+ 90 : 536 : function _listedAddressCount() internal view virtual returns (uint256 count) {
+ 91 : 536 : count = _listedAddresses.length();
+ 92 : : }
+ 93 : :
+ 94 : : /**
+ 95 : : * @notice Checks if an address is listed.
+ 96 : : * @param targetAddress The address to check.
+ 97 : : * @return isListed True if the address is listed, false otherwise.
+ 98 : : */
+ 99 : 771 : function _isAddressListed(address targetAddress) internal view virtual returns (bool isListed) {
+ 100 : 771 : isListed = _listedAddresses.contains(targetAddress);
+ 101 : : }
+ 102 : : }
diff --git a/doc/coverage/coverage/abstract/RuleAddressSet/index-sort-b.html b/doc/coverage/coverage/abstract/RuleAddressSet/index-sort-b.html
index f299290..bb7e3fe 100644
--- a/doc/coverage/coverage/abstract/RuleAddressSet/index-sort-b.html
+++ b/doc/coverage/coverage/abstract/RuleAddressSet/index-sort-b.html
@@ -37,7 +37,7 @@
-
+
|
diff --git a/doc/coverage/coverage/abstract/RuleAddressSet/index-sort-f.html b/doc/coverage/coverage/abstract/RuleAddressSet/index-sort-f.html
index 3713f5e..a7bd900 100644
--- a/doc/coverage/coverage/abstract/RuleAddressSet/index-sort-f.html
+++ b/doc/coverage/coverage/abstract/RuleAddressSet/index-sort-f.html
@@ -37,7 +37,7 @@
-
+
|
diff --git a/doc/coverage/coverage/abstract/RuleAddressSet/index-sort-l.html b/doc/coverage/coverage/abstract/RuleAddressSet/index-sort-l.html
index 2a0de5c..5a6b041 100644
--- a/doc/coverage/coverage/abstract/RuleAddressSet/index-sort-l.html
+++ b/doc/coverage/coverage/abstract/RuleAddressSet/index-sort-l.html
@@ -37,7 +37,7 @@
-
+
|
diff --git a/doc/coverage/coverage/abstract/RuleAddressSet/index.html b/doc/coverage/coverage/abstract/RuleAddressSet/index.html
index 9eb35f0..c9aa742 100644
--- a/doc/coverage/coverage/abstract/RuleAddressSet/index.html
+++ b/doc/coverage/coverage/abstract/RuleAddressSet/index.html
@@ -37,7 +37,7 @@
-
+
|
diff --git a/doc/coverage/coverage/abstract/RuleERC2980/RuleERC2980Internal.sol.func-sort-c.html b/doc/coverage/coverage/abstract/RuleERC2980/RuleERC2980Internal.sol.func-sort-c.html
index d226506..51af6ae 100644
--- a/doc/coverage/coverage/abstract/RuleERC2980/RuleERC2980Internal.sol.func-sort-c.html
+++ b/doc/coverage/coverage/abstract/RuleERC2980/RuleERC2980Internal.sol.func-sort-c.html
@@ -37,7 +37,7 @@
-
+
|
diff --git a/doc/coverage/coverage/abstract/RuleERC2980/RuleERC2980Internal.sol.func.html b/doc/coverage/coverage/abstract/RuleERC2980/RuleERC2980Internal.sol.func.html
index 446e1ca..eb4b210 100644
--- a/doc/coverage/coverage/abstract/RuleERC2980/RuleERC2980Internal.sol.func.html
+++ b/doc/coverage/coverage/abstract/RuleERC2980/RuleERC2980Internal.sol.func.html
@@ -37,7 +37,7 @@
-
+
|
diff --git a/doc/coverage/coverage/abstract/RuleERC2980/RuleERC2980Internal.sol.gcov.html b/doc/coverage/coverage/abstract/RuleERC2980/RuleERC2980Internal.sol.gcov.html
index 324d892..753927f 100644
--- a/doc/coverage/coverage/abstract/RuleERC2980/RuleERC2980Internal.sol.gcov.html
+++ b/doc/coverage/coverage/abstract/RuleERC2980/RuleERC2980Internal.sol.gcov.html
@@ -37,7 +37,7 @@
-
+
|
diff --git a/doc/coverage/coverage/abstract/RuleERC2980/index-sort-b.html b/doc/coverage/coverage/abstract/RuleERC2980/index-sort-b.html
index 446dbb6..3a5069c 100644
--- a/doc/coverage/coverage/abstract/RuleERC2980/index-sort-b.html
+++ b/doc/coverage/coverage/abstract/RuleERC2980/index-sort-b.html
@@ -37,7 +37,7 @@
-
+
|
diff --git a/doc/coverage/coverage/abstract/RuleERC2980/index-sort-f.html b/doc/coverage/coverage/abstract/RuleERC2980/index-sort-f.html
index 774722e..cc487f0 100644
--- a/doc/coverage/coverage/abstract/RuleERC2980/index-sort-f.html
+++ b/doc/coverage/coverage/abstract/RuleERC2980/index-sort-f.html
@@ -37,7 +37,7 @@
-
+
|
diff --git a/doc/coverage/coverage/abstract/RuleERC2980/index-sort-l.html b/doc/coverage/coverage/abstract/RuleERC2980/index-sort-l.html
index c94493f..fa2906b 100644
--- a/doc/coverage/coverage/abstract/RuleERC2980/index-sort-l.html
+++ b/doc/coverage/coverage/abstract/RuleERC2980/index-sort-l.html
@@ -37,7 +37,7 @@
-
+
|
diff --git a/doc/coverage/coverage/abstract/RuleERC2980/index.html b/doc/coverage/coverage/abstract/RuleERC2980/index.html
index 07b52e2..b9213df 100644
--- a/doc/coverage/coverage/abstract/RuleERC2980/index.html
+++ b/doc/coverage/coverage/abstract/RuleERC2980/index.html
@@ -37,7 +37,7 @@
-
+
|
diff --git a/doc/coverage/coverage/abstract/base/RuleBlacklistBase.sol.func-sort-c.html b/doc/coverage/coverage/abstract/base/RuleBlacklistBase.sol.func-sort-c.html
index 72252b1..dbf2453 100644
--- a/doc/coverage/coverage/abstract/base/RuleBlacklistBase.sol.func-sort-c.html
+++ b/doc/coverage/coverage/abstract/base/RuleBlacklistBase.sol.func-sort-c.html
@@ -37,7 +37,7 @@
-
+
|
@@ -69,35 +69,35 @@
Hit count  |
- | RuleBlacklistBase.transferred.1 |
+ RuleBlacklistBase.transferred.1 |
2 |
- | RuleBlacklistBase._transferredFrom |
+ RuleBlacklistBase._transferredFrom |
4 |
- | RuleBlacklistBase.canReturnTransferRestrictionCode |
+ RuleBlacklistBase.canReturnTransferRestrictionCode |
4 |
- | RuleBlacklistBase.messageForTransferRestriction |
+ RuleBlacklistBase.messageForTransferRestriction |
12 |
- | RuleBlacklistBase._detectTransferRestrictionFrom |
+ RuleBlacklistBase._detectTransferRestrictionFrom |
22 |
- | RuleBlacklistBase.transferred.0 |
+ RuleBlacklistBase.transferred.0 |
58 |
- | RuleBlacklistBase._transferred |
+ RuleBlacklistBase._transferred |
61 |
- | RuleBlacklistBase.supportsInterface |
+ RuleBlacklistBase.supportsInterface |
61 |
diff --git a/doc/coverage/coverage/abstract/base/RuleBlacklistBase.sol.func.html b/doc/coverage/coverage/abstract/base/RuleBlacklistBase.sol.func.html
index 44a9b55..bae16a3 100644
--- a/doc/coverage/coverage/abstract/base/RuleBlacklistBase.sol.func.html
+++ b/doc/coverage/coverage/abstract/base/RuleBlacklistBase.sol.func.html
@@ -37,7 +37,7 @@
-
+
|
@@ -73,35 +73,35 @@
106 |
- | RuleBlacklistBase._detectTransferRestrictionFrom |
+ RuleBlacklistBase._detectTransferRestrictionFrom |
22 |
- | RuleBlacklistBase._transferred |
+ RuleBlacklistBase._transferred |
61 |
- | RuleBlacklistBase._transferredFrom |
+ RuleBlacklistBase._transferredFrom |
4 |
- | RuleBlacklistBase.canReturnTransferRestrictionCode |
+ RuleBlacklistBase.canReturnTransferRestrictionCode |
4 |
- | RuleBlacklistBase.messageForTransferRestriction |
+ RuleBlacklistBase.messageForTransferRestriction |
12 |
- | RuleBlacklistBase.supportsInterface |
+ RuleBlacklistBase.supportsInterface |
61 |
- | RuleBlacklistBase.transferred.0 |
+ RuleBlacklistBase.transferred.0 |
58 |
- | RuleBlacklistBase.transferred.1 |
+ RuleBlacklistBase.transferred.1 |
2 |
diff --git a/doc/coverage/coverage/abstract/base/RuleBlacklistBase.sol.gcov.html b/doc/coverage/coverage/abstract/base/RuleBlacklistBase.sol.gcov.html
index a3fe955..1bc30a8 100644
--- a/doc/coverage/coverage/abstract/base/RuleBlacklistBase.sol.gcov.html
+++ b/doc/coverage/coverage/abstract/base/RuleBlacklistBase.sol.gcov.html
@@ -37,7 +37,7 @@
-
+
|
@@ -88,112 +88,111 @@
17 : : abstract contract RuleBlacklistBase is RuleAddressSet, RuleNFTAdapter, RuleBlacklistInvariantStorage {
18 : : constructor(address forwarderIrrevocable) RuleAddressSet(forwarderIrrevocable) {}
19 : :
- 20 : 106 : function _detectTransferRestriction(address from, address to, uint256 /* value */ )
- 21 : : internal
- 22 : : view
- 23 : : override
- 24 : : returns (uint8)
- 25 : : {
- 26 [ + + ]: 106 : if (isAddressListed(from)) {
- 27 : 23 : return CODE_ADDRESS_FROM_IS_BLACKLISTED;
- 28 [ + ]: 83 : } else if (isAddressListed(to)) {
- 29 : 19 : return CODE_ADDRESS_TO_IS_BLACKLISTED;
- 30 : : }
- 31 : 64 : return uint8(IERC1404Extend.REJECTED_CODE_BASE.TRANSFER_OK);
- 32 : : }
- 33 : :
- 34 : 22 : function _detectTransferRestrictionFrom(address spender, address from, address to, uint256 value)
- 35 : : internal
- 36 : : view
- 37 : : override
- 38 : : returns (uint8)
- 39 : : {
- 40 [ + ]: 22 : if (isAddressListed(spender)) {
- 41 : 8 : return CODE_ADDRESS_SPENDER_IS_BLACKLISTED;
- 42 : : }
- 43 : 14 : return _detectTransferRestriction(from, to, value);
- 44 : : }
- 45 : :
- 46 : 4 : function canReturnTransferRestrictionCode(uint8 restrictionCode)
- 47 : : public
- 48 : : pure
- 49 : : virtual
- 50 : : override(IRule)
- 51 : : returns (bool)
- 52 : : {
- 53 : 4 : return restrictionCode == CODE_ADDRESS_FROM_IS_BLACKLISTED || restrictionCode == CODE_ADDRESS_TO_IS_BLACKLISTED
- 54 : 1 : || restrictionCode == CODE_ADDRESS_SPENDER_IS_BLACKLISTED;
- 55 : : }
- 56 : :
- 57 : 12 : function messageForTransferRestriction(uint8 restrictionCode)
- 58 : : public
- 59 : : pure
- 60 : : virtual
- 61 : : override(IERC1404)
- 62 : : returns (string memory)
- 63 : : {
- 64 [ + + ]: 12 : if (restrictionCode == CODE_ADDRESS_FROM_IS_BLACKLISTED) {
- 65 : 5 : return TEXT_ADDRESS_FROM_IS_BLACKLISTED;
- 66 [ + + ]: 7 : } else if (restrictionCode == CODE_ADDRESS_TO_IS_BLACKLISTED) {
- 67 : 3 : return TEXT_ADDRESS_TO_IS_BLACKLISTED;
- 68 [ + + ]: 4 : } else if (restrictionCode == CODE_ADDRESS_SPENDER_IS_BLACKLISTED) {
- 69 : 1 : return TEXT_ADDRESS_SPENDER_IS_BLACKLISTED;
- 70 : : } else {
- 71 : 3 : return TEXT_CODE_NOT_FOUND;
- 72 : : }
- 73 : : }
- 74 : :
- 75 : 61 : function supportsInterface(bytes4 interfaceId) public view virtual override(RuleTransferValidation) returns (bool) {
- 76 : 61 : return RuleTransferValidation.supportsInterface(interfaceId);
+ 20 : 106 : function _detectTransferRestriction(
+ 21 : : address from,
+ 22 : : address to,
+ 23 : : uint256 /* value */
+ 24 : : )
+ 25 : : internal
+ 26 : : view
+ 27 : : override
+ 28 : : returns (uint8)
+ 29 : : {
+ 30 [ + + ]: 106 : if (isAddressListed(from)) {
+ 31 : 23 : return CODE_ADDRESS_FROM_IS_BLACKLISTED;
+ 32 [ + ]: 83 : } else if (isAddressListed(to)) {
+ 33 : 19 : return CODE_ADDRESS_TO_IS_BLACKLISTED;
+ 34 : : }
+ 35 : 64 : return uint8(IERC1404Extend.REJECTED_CODE_BASE.TRANSFER_OK);
+ 36 : : }
+ 37 : :
+ 38 : 22 : function _detectTransferRestrictionFrom(address spender, address from, address to, uint256 value)
+ 39 : : internal
+ 40 : : view
+ 41 : : override
+ 42 : : returns (uint8)
+ 43 : : {
+ 44 [ + ]: 22 : if (isAddressListed(spender)) {
+ 45 : 8 : return CODE_ADDRESS_SPENDER_IS_BLACKLISTED;
+ 46 : : }
+ 47 : 14 : return _detectTransferRestriction(from, to, value);
+ 48 : : }
+ 49 : :
+ 50 : 4 : function canReturnTransferRestrictionCode(uint8 restrictionCode)
+ 51 : : public
+ 52 : : pure
+ 53 : : virtual
+ 54 : : override(IRule)
+ 55 : : returns (bool)
+ 56 : : {
+ 57 : 4 : return restrictionCode == CODE_ADDRESS_FROM_IS_BLACKLISTED || restrictionCode == CODE_ADDRESS_TO_IS_BLACKLISTED
+ 58 : 1 : || restrictionCode == CODE_ADDRESS_SPENDER_IS_BLACKLISTED;
+ 59 : : }
+ 60 : :
+ 61 : 12 : function messageForTransferRestriction(uint8 restrictionCode)
+ 62 : : public
+ 63 : : pure
+ 64 : : virtual
+ 65 : : override(IERC1404)
+ 66 : : returns (string memory)
+ 67 : : {
+ 68 [ + + ]: 12 : if (restrictionCode == CODE_ADDRESS_FROM_IS_BLACKLISTED) {
+ 69 : 5 : return TEXT_ADDRESS_FROM_IS_BLACKLISTED;
+ 70 [ + + ]: 7 : } else if (restrictionCode == CODE_ADDRESS_TO_IS_BLACKLISTED) {
+ 71 : 3 : return TEXT_ADDRESS_TO_IS_BLACKLISTED;
+ 72 [ + + ]: 4 : } else if (restrictionCode == CODE_ADDRESS_SPENDER_IS_BLACKLISTED) {
+ 73 : 1 : return TEXT_ADDRESS_SPENDER_IS_BLACKLISTED;
+ 74 : : } else {
+ 75 : 3 : return TEXT_CODE_NOT_FOUND;
+ 76 : : }
77 : : }
78 : :
- 79 : : /**
- 80 : : * @inheritdoc IERC3643IComplianceContract
- 81 : : * @dev Validation only; does not modify state.
- 82 : : */
- 83 : 58 : function transferred(address from, address to, uint256 value)
- 84 : : public
- 85 : : view
- 86 : : virtual
- 87 : : override(IERC3643IComplianceContract)
- 88 : : {
- 89 : 58 : _transferred(from, to, value);
- 90 : : }
- 91 : :
- 92 : : /**
- 93 : : * @inheritdoc IRuleEngine
- 94 : : * @dev Validation only; does not modify state.
- 95 : : */
- 96 : 2 : function transferred(address spender, address from, address to, uint256 value)
- 97 : : public
- 98 : : view
- 99 : : virtual
- 100 : : override(IRuleEngine)
- 101 : : {
- 102 : 2 : _transferredFrom(spender, from, to, value);
- 103 : : }
- 104 : :
- 105 : 61 : function _transferred(address from, address to, uint256 value) internal view virtual override {
- 106 : 61 : uint8 code = _detectTransferRestriction(from, to, value);
- 107 [ + + ]: 61 : require(
- 108 : : code == uint8(REJECTED_CODE_BASE.TRANSFER_OK),
- 109 : : RuleBlacklist_InvalidTransfer(address(this), from, to, value, code)
- 110 : : );
- 111 : : }
- 112 : :
- 113 : 4 : function _transferredFrom(address spender, address from, address to, uint256 value)
- 114 : : internal
- 115 : : view
- 116 : : virtual
- 117 : : override
- 118 : : {
- 119 : 4 : uint8 code = _detectTransferRestrictionFrom(spender, from, to, value);
- 120 [ + + ]: 4 : require(
- 121 : : code == uint8(REJECTED_CODE_BASE.TRANSFER_OK),
- 122 : : RuleBlacklist_InvalidTransferFrom(address(this), spender, from, to, value, code)
- 123 : : );
- 124 : : }
- 125 : : }
+ 79 : 61 : function supportsInterface(bytes4 interfaceId) public view virtual override(RuleTransferValidation) returns (bool) {
+ 80 : 61 : return RuleTransferValidation.supportsInterface(interfaceId);
+ 81 : : }
+ 82 : :
+ 83 : : /**
+ 84 : : * @inheritdoc IERC3643IComplianceContract
+ 85 : : * @dev Validation only; does not modify state.
+ 86 : : */
+ 87 : 58 : function transferred(address from, address to, uint256 value)
+ 88 : : public
+ 89 : : view
+ 90 : : virtual
+ 91 : : override(IERC3643IComplianceContract)
+ 92 : : {
+ 93 : 58 : _transferred(from, to, value);
+ 94 : : }
+ 95 : :
+ 96 : : /**
+ 97 : : * @inheritdoc IRuleEngine
+ 98 : : * @dev Validation only; does not modify state.
+ 99 : : */
+ 100 : 2 : function transferred(address spender, address from, address to, uint256 value)
+ 101 : : public
+ 102 : : view
+ 103 : : virtual
+ 104 : : override(IRuleEngine)
+ 105 : : {
+ 106 : 2 : _transferredFrom(spender, from, to, value);
+ 107 : : }
+ 108 : :
+ 109 : 61 : function _transferred(address from, address to, uint256 value) internal view virtual override {
+ 110 : 61 : uint8 code = _detectTransferRestriction(from, to, value);
+ 111 [ + + ]: 61 : require(
+ 112 : : code == uint8(REJECTED_CODE_BASE.TRANSFER_OK),
+ 113 : : RuleBlacklist_InvalidTransfer(address(this), from, to, value, code)
+ 114 : : );
+ 115 : : }
+ 116 : :
+ 117 : 4 : function _transferredFrom(address spender, address from, address to, uint256 value) internal view virtual override {
+ 118 : 4 : uint8 code = _detectTransferRestrictionFrom(spender, from, to, value);
+ 119 [ + + ]: 4 : require(
+ 120 : : code == uint8(REJECTED_CODE_BASE.TRANSFER_OK),
+ 121 : : RuleBlacklist_InvalidTransferFrom(address(this), spender, from, to, value, code)
+ 122 : : );
+ 123 : : }
+ 124 : : }
diff --git a/doc/coverage/coverage/abstract/base/RuleERC2980Base.sol.func-sort-c.html b/doc/coverage/coverage/abstract/base/RuleERC2980Base.sol.func-sort-c.html
index b58d1b5..8da2363 100644
--- a/doc/coverage/coverage/abstract/base/RuleERC2980Base.sol.func-sort-c.html
+++ b/doc/coverage/coverage/abstract/base/RuleERC2980Base.sol.func-sort-c.html
@@ -31,13 +31,13 @@
|
-
-
+
+
-
+
|
@@ -69,115 +69,115 @@
Hit count  |
- | RuleERC2980Base.areFrozen |
+ RuleERC2980Base.areFrozen |
1 |
- | RuleERC2980Base.areWhitelisted |
+ RuleERC2980Base.areWhitelisted |
1 |
- | RuleERC2980Base.supportsInterface |
+ RuleERC2980Base.supportsInterface |
1 |
- | RuleERC2980Base._msgData |
+ RuleERC2980Base._msgData |
2 |
- | RuleERC2980Base.onlyFrozenlistRemove |
+ RuleERC2980Base.onlyFrozenlistRemove |
2 |
- | RuleERC2980Base.removeFrozenlistAddresses |
+ RuleERC2980Base.removeFrozenlistAddresses |
2 |
- | RuleERC2980Base.transferred.1 |
+ RuleERC2980Base.transferred.1 |
2 |
- | RuleERC2980Base._transferredFrom |
+ RuleERC2980Base._transferredFrom |
3 |
- | RuleERC2980Base.isVerified |
+ RuleERC2980Base.isVerified |
3 |
- | RuleERC2980Base.frozenlist |
+ RuleERC2980Base.frozenlist |
4 |
- | RuleERC2980Base.frozenlistAddressCount |
+ RuleERC2980Base.frozenlistAddressCount |
4 |
- | RuleERC2980Base.removeWhitelistAddresses |
+ RuleERC2980Base.removeWhitelistAddresses |
4 |
- | RuleERC2980Base.transferred.0 |
+ RuleERC2980Base.transferred.0 |
4 |
- | RuleERC2980Base._transferred |
+ RuleERC2980Base._transferred |
5 |
- | RuleERC2980Base.canReturnTransferRestrictionCode |
+ RuleERC2980Base.canReturnTransferRestrictionCode |
5 |
- | RuleERC2980Base.messageForTransferRestriction |
+ RuleERC2980Base.messageForTransferRestriction |
5 |
- | RuleERC2980Base.whitelist |
+ RuleERC2980Base.whitelist |
5 |
- | RuleERC2980Base.whitelistAddressCount |
+ RuleERC2980Base.whitelistAddressCount |
5 |
- | RuleERC2980Base.addFrozenlistAddresses |
+ RuleERC2980Base.addFrozenlistAddresses |
6 |
- | RuleERC2980Base.addWhitelistAddresses |
+ RuleERC2980Base.addWhitelistAddresses |
6 |
- | RuleERC2980Base.onlyFrozenlistAdd |
+ RuleERC2980Base.onlyFrozenlistAdd |
6 |
- | RuleERC2980Base.onlyWhitelistAdd |
+ RuleERC2980Base.onlyWhitelistAdd |
6 |
- | RuleERC2980Base.onlyWhitelistRemove |
+ RuleERC2980Base.onlyWhitelistRemove |
7 |
- | RuleERC2980Base.removeFrozenlistAddress |
+ RuleERC2980Base.removeFrozenlistAddress |
7 |
- | RuleERC2980Base.removeWhitelistAddress |
+ RuleERC2980Base.removeWhitelistAddress |
7 |
- | RuleERC2980Base._detectTransferRestrictionFrom |
+ RuleERC2980Base._detectTransferRestrictionFrom |
8 |
- | RuleERC2980Base.isFrozen |
+ RuleERC2980Base.isFrozen |
12 |
- | RuleERC2980Base.isWhitelisted |
+ RuleERC2980Base.isWhitelisted |
13 |
@@ -185,19 +185,19 @@
| 22 |
- | RuleERC2980Base.addFrozenlistAddress |
+ RuleERC2980Base.addFrozenlistAddress |
22 |
- | RuleERC2980Base.addWhitelistAddress |
+ RuleERC2980Base.addWhitelistAddress |
43 |
- | RuleERC2980Base._msgSender |
+ RuleERC2980Base._msgSender |
267 |
- | RuleERC2980Base._contextSuffixLength |
+ RuleERC2980Base._contextSuffixLength |
269 |
diff --git a/doc/coverage/coverage/abstract/base/RuleERC2980Base.sol.func.html b/doc/coverage/coverage/abstract/base/RuleERC2980Base.sol.func.html
index fa4bcca..0d085a0 100644
--- a/doc/coverage/coverage/abstract/base/RuleERC2980Base.sol.func.html
+++ b/doc/coverage/coverage/abstract/base/RuleERC2980Base.sol.func.html
@@ -31,13 +31,13 @@
|
-
-
+
+
-
+
|
@@ -69,7 +69,7 @@
Hit count  |
- | RuleERC2980Base._contextSuffixLength |
+ RuleERC2980Base._contextSuffixLength |
269 |
@@ -77,127 +77,127 @@
| 22 |
- | RuleERC2980Base._detectTransferRestrictionFrom |
+ RuleERC2980Base._detectTransferRestrictionFrom |
8 |
- | RuleERC2980Base._msgData |
+ RuleERC2980Base._msgData |
2 |
- | RuleERC2980Base._msgSender |
+ RuleERC2980Base._msgSender |
267 |
- | RuleERC2980Base._transferred |
+ RuleERC2980Base._transferred |
5 |
- | RuleERC2980Base._transferredFrom |
+ RuleERC2980Base._transferredFrom |
3 |
- | RuleERC2980Base.addFrozenlistAddress |
+ RuleERC2980Base.addFrozenlistAddress |
22 |
- | RuleERC2980Base.addFrozenlistAddresses |
+ RuleERC2980Base.addFrozenlistAddresses |
6 |
- | RuleERC2980Base.addWhitelistAddress |
+ RuleERC2980Base.addWhitelistAddress |
43 |
- | RuleERC2980Base.addWhitelistAddresses |
+ RuleERC2980Base.addWhitelistAddresses |
6 |
- | RuleERC2980Base.areFrozen |
+ RuleERC2980Base.areFrozen |
1 |
- | RuleERC2980Base.areWhitelisted |
+ RuleERC2980Base.areWhitelisted |
1 |
- | RuleERC2980Base.canReturnTransferRestrictionCode |
+ RuleERC2980Base.canReturnTransferRestrictionCode |
5 |
- | RuleERC2980Base.frozenlist |
+ RuleERC2980Base.frozenlist |
4 |
- | RuleERC2980Base.frozenlistAddressCount |
+ RuleERC2980Base.frozenlistAddressCount |
4 |
- | RuleERC2980Base.isFrozen |
+ RuleERC2980Base.isFrozen |
12 |
- | RuleERC2980Base.isVerified |
+ RuleERC2980Base.isVerified |
3 |
- | RuleERC2980Base.isWhitelisted |
+ RuleERC2980Base.isWhitelisted |
13 |
- | RuleERC2980Base.messageForTransferRestriction |
+ RuleERC2980Base.messageForTransferRestriction |
5 |
- | RuleERC2980Base.onlyFrozenlistAdd |
+ RuleERC2980Base.onlyFrozenlistAdd |
6 |
- | RuleERC2980Base.onlyFrozenlistRemove |
+ RuleERC2980Base.onlyFrozenlistRemove |
2 |
- | RuleERC2980Base.onlyWhitelistAdd |
+ RuleERC2980Base.onlyWhitelistAdd |
6 |
- | RuleERC2980Base.onlyWhitelistRemove |
+ RuleERC2980Base.onlyWhitelistRemove |
7 |
- | RuleERC2980Base.removeFrozenlistAddress |
+ RuleERC2980Base.removeFrozenlistAddress |
7 |
- | RuleERC2980Base.removeFrozenlistAddresses |
+ RuleERC2980Base.removeFrozenlistAddresses |
2 |
- | RuleERC2980Base.removeWhitelistAddress |
+ RuleERC2980Base.removeWhitelistAddress |
7 |
- | RuleERC2980Base.removeWhitelistAddresses |
+ RuleERC2980Base.removeWhitelistAddresses |
4 |
- | RuleERC2980Base.supportsInterface |
+ RuleERC2980Base.supportsInterface |
1 |
- | RuleERC2980Base.transferred.0 |
+ RuleERC2980Base.transferred.0 |
4 |
- | RuleERC2980Base.transferred.1 |
+ RuleERC2980Base.transferred.1 |
2 |
- | RuleERC2980Base.whitelist |
+ RuleERC2980Base.whitelist |
5 |
- | RuleERC2980Base.whitelistAddressCount |
+ RuleERC2980Base.whitelistAddressCount |
5 |
diff --git a/doc/coverage/coverage/abstract/base/RuleERC2980Base.sol.gcov.html b/doc/coverage/coverage/abstract/base/RuleERC2980Base.sol.gcov.html
index 89784e8..62c8d68 100644
--- a/doc/coverage/coverage/abstract/base/RuleERC2980Base.sol.gcov.html
+++ b/doc/coverage/coverage/abstract/base/RuleERC2980Base.sol.gcov.html
@@ -31,13 +31,13 @@
|
-
-
+
+
-
+
|
@@ -115,348 +115,340 @@
44 : : TRANSFER RESTRICTION LOGIC
45 : : //////////////////////////////////////////////////////////////*/
46 : :
- 47 : 22 : function _detectTransferRestriction(address from, address to, uint256 /* value */ )
- 48 : : internal
- 49 : : view
- 50 : : virtual
- 51 : : override
- 52 : : returns (uint8)
- 53 : : {
- 54 : : // Frozenlist check has priority
- 55 [ + + ]: 22 : if (_isFrozen(from)) {
- 56 : 4 : return CODE_ADDRESS_FROM_IS_FROZEN;
- 57 [ + ]: 18 : } else if (_isFrozen(to)) {
- 58 : 4 : return CODE_ADDRESS_TO_IS_FROZEN;
- 59 : : }
- 60 : : // Whitelist check: only the recipient must be whitelisted
- 61 [ + ]: 14 : if (!_isWhitelisted(to)) {
- 62 : 4 : return CODE_ADDRESS_TO_NOT_WHITELISTED;
+ 47 : 22 : function _detectTransferRestriction(
+ 48 : : address from,
+ 49 : : address to,
+ 50 : : uint256 /* value */
+ 51 : : )
+ 52 : : internal
+ 53 : : view
+ 54 : : virtual
+ 55 : : override
+ 56 : : returns (uint8)
+ 57 : : {
+ 58 : : // Frozenlist check has priority
+ 59 [ + + ]: 22 : if (_isFrozen(from)) {
+ 60 : 4 : return CODE_ADDRESS_FROM_IS_FROZEN;
+ 61 [ + ]: 18 : } else if (_isFrozen(to)) {
+ 62 : 4 : return CODE_ADDRESS_TO_IS_FROZEN;
63 : : }
- 64 : 10 : return uint8(IERC1404Extend.REJECTED_CODE_BASE.TRANSFER_OK);
- 65 : : }
- 66 : :
- 67 : 8 : function _detectTransferRestrictionFrom(address spender, address from, address to, uint256 value)
- 68 : : internal
- 69 : : view
- 70 : : virtual
- 71 : : override
- 72 : : returns (uint8)
- 73 : : {
- 74 [ + ]: 8 : if (_isFrozen(spender)) {
- 75 : 4 : return CODE_ADDRESS_SPENDER_IS_FROZEN;
- 76 : : }
- 77 : 4 : return _detectTransferRestriction(from, to, value);
- 78 : : }
- 79 : :
- 80 : : /*//////////////////////////////////////////////////////////////
- 81 : : ERC-3643 / IRuleEngine HOOKS
- 82 : : //////////////////////////////////////////////////////////////*/
+ 64 : : // Whitelist check: only the recipient must be whitelisted
+ 65 [ + ]: 14 : if (!_isWhitelisted(to)) {
+ 66 : 4 : return CODE_ADDRESS_TO_NOT_WHITELISTED;
+ 67 : : }
+ 68 : 10 : return uint8(IERC1404Extend.REJECTED_CODE_BASE.TRANSFER_OK);
+ 69 : : }
+ 70 : :
+ 71 : 8 : function _detectTransferRestrictionFrom(address spender, address from, address to, uint256 value)
+ 72 : : internal
+ 73 : : view
+ 74 : : virtual
+ 75 : : override
+ 76 : : returns (uint8)
+ 77 : : {
+ 78 [ + ]: 8 : if (_isFrozen(spender)) {
+ 79 : 4 : return CODE_ADDRESS_SPENDER_IS_FROZEN;
+ 80 : : }
+ 81 : 4 : return _detectTransferRestriction(from, to, value);
+ 82 : : }
83 : :
- 84 : 4 : function transferred(address from, address to, uint256 value)
- 85 : : public
- 86 : : view
- 87 : : virtual
- 88 : : override(IERC3643IComplianceContract)
- 89 : : {
- 90 : 4 : _transferred(from, to, value);
- 91 : : }
- 92 : :
- 93 : 2 : function transferred(address spender, address from, address to, uint256 value)
- 94 : : public
- 95 : : view
- 96 : : virtual
- 97 : : override(IRuleEngine)
- 98 : : {
- 99 : 2 : _transferredFrom(spender, from, to, value);
- 100 : : }
- 101 : :
- 102 : 5 : function _transferred(address from, address to, uint256 value) internal view virtual override {
- 103 : 5 : uint8 code = _detectTransferRestriction(from, to, value);
- 104 [ + + ]: 5 : require(
- 105 : : code == uint8(IERC1404Extend.REJECTED_CODE_BASE.TRANSFER_OK),
- 106 : : RuleERC2980_InvalidTransfer(address(this), from, to, value, code)
- 107 : : );
- 108 : : }
- 109 : :
- 110 : 3 : function _transferredFrom(address spender, address from, address to, uint256 value)
- 111 : : internal
- 112 : : view
- 113 : : virtual
- 114 : : override
- 115 : : {
- 116 : 3 : uint8 code = _detectTransferRestrictionFrom(spender, from, to, value);
- 117 [ + + ]: 3 : require(
- 118 : : code == uint8(IERC1404Extend.REJECTED_CODE_BASE.TRANSFER_OK),
- 119 : : RuleERC2980_InvalidTransferFrom(address(this), spender, from, to, value, code)
- 120 : : );
- 121 : : }
- 122 : :
- 123 : : /*//////////////////////////////////////////////////////////////
- 124 : : RESTRICTION CODE HELPERS
- 125 : : //////////////////////////////////////////////////////////////*/
- 126 : :
- 127 : 5 : function canReturnTransferRestrictionCode(uint8 restrictionCode)
- 128 : : public
- 129 : : pure
- 130 : : virtual
- 131 : : override(IRule)
- 132 : : returns (bool)
- 133 : : {
- 134 : 5 : return restrictionCode == CODE_ADDRESS_FROM_IS_FROZEN || restrictionCode == CODE_ADDRESS_TO_IS_FROZEN
- 135 : 3 : || restrictionCode == CODE_ADDRESS_SPENDER_IS_FROZEN
- 136 : 2 : || restrictionCode == CODE_ADDRESS_TO_NOT_WHITELISTED;
- 137 : : }
- 138 : :
- 139 : 5 : function messageForTransferRestriction(uint8 restrictionCode)
- 140 : : public
- 141 : : pure
- 142 : : virtual
- 143 : : override(IERC1404)
- 144 : : returns (string memory)
- 145 : : {
- 146 [ + + ]: 5 : if (restrictionCode == CODE_ADDRESS_FROM_IS_FROZEN) {
- 147 : 1 : return TEXT_ADDRESS_FROM_IS_FROZEN;
- 148 [ + + ]: 4 : } else if (restrictionCode == CODE_ADDRESS_TO_IS_FROZEN) {
- 149 : 1 : return TEXT_ADDRESS_TO_IS_FROZEN;
- 150 [ + + ]: 3 : } else if (restrictionCode == CODE_ADDRESS_SPENDER_IS_FROZEN) {
- 151 : 1 : return TEXT_ADDRESS_SPENDER_IS_FROZEN;
- 152 [ + + ]: 2 : } else if (restrictionCode == CODE_ADDRESS_TO_NOT_WHITELISTED) {
- 153 : 1 : return TEXT_ADDRESS_TO_NOT_WHITELISTED;
- 154 : : } else {
- 155 : 1 : return TEXT_CODE_NOT_FOUND;
- 156 : : }
- 157 : : }
- 158 : :
- 159 : : /*//////////////////////////////////////////////////////////////
- 160 : : WHITELIST MANAGEMENT
- 161 : : //////////////////////////////////////////////////////////////*/
- 162 : :
- 163 : : /**
- 164 : : * @notice Adds multiple addresses to the whitelist.
- 165 : : * @dev Does not revert if an address is already listed.
- 166 : : */
- 167 : 6 : function addWhitelistAddresses(address[] calldata targetAddresses) public onlyWhitelistAdd {
- 168 : 4 : _addWhitelistAddresses(targetAddresses);
- 169 : 4 : emit AddWhitelistAddresses(targetAddresses);
- 170 : : }
- 171 : :
- 172 : : /**
- 173 : : * @notice Removes multiple addresses from the whitelist.
- 174 : : * @dev Does not revert if an address is not listed.
- 175 : : */
- 176 : 4 : function removeWhitelistAddresses(address[] calldata targetAddresses) public onlyWhitelistRemove {
- 177 : 3 : _removeWhitelistAddresses(targetAddresses);
- 178 : 3 : emit RemoveWhitelistAddresses(targetAddresses);
- 179 : : }
- 180 : :
- 181 : : /**
- 182 : : * @notice Adds a single address to the whitelist.
- 183 : : * @dev
- 184 : : * Reverts if the address is already listed.
- 185 : : * Deviation from ERC-2980 `Whitelistable` example interface: the spec's `addAddressToWhitelist`
- 186 : : * returns `false` on duplicates instead of reverting. This implementation follows the codebase
- 187 : : * convention of reverting on invalid single-item operations.
- 188 : : */
- 189 : 43 : function addWhitelistAddress(address targetAddress) public onlyWhitelistAdd {
- 190 [ + + ]: 40 : require(!_isWhitelisted(targetAddress), RuleERC2980_AddressAlreadyListed());
- 191 : 39 : _addWhitelistAddress(targetAddress);
- 192 : 39 : emit AddWhitelistAddress(targetAddress);
- 193 : : }
- 194 : :
- 195 : : /**
- 196 : : * @notice Removes a single address from the whitelist.
- 197 : : * @dev
- 198 : : * Reverts if the address is not listed.
- 199 : : * Deviation from ERC-2980 `Whitelistable` example interface: the spec's `removeAddressFromWhitelist`
- 200 : : * returns `false` when not found instead of reverting. This implementation follows the codebase
- 201 : : * convention of reverting on invalid single-item operations.
- 202 : : */
- 203 : 7 : function removeWhitelistAddress(address targetAddress) public onlyWhitelistRemove {
- 204 [ + + ]: 5 : require(_isWhitelisted(targetAddress), RuleERC2980_AddressNotFound());
- 205 : 4 : _removeWhitelistAddress(targetAddress);
- 206 : 4 : emit RemoveWhitelistAddress(targetAddress);
- 207 : : }
- 208 : :
- 209 : : /**
- 210 : : * @notice Returns the number of whitelisted addresses.
- 211 : : */
- 212 : 5 : function whitelistAddressCount() public view returns (uint256) {
- 213 : 5 : return _whitelistCount();
- 214 : : }
- 215 : :
- 216 : : /**
- 217 : : * @notice Returns true if the address is in the whitelist.
- 218 : : */
- 219 : 13 : function isWhitelisted(address targetAddress) public view returns (bool) {
- 220 : 13 : return _isWhitelisted(targetAddress);
- 221 : : }
- 222 : :
- 223 : : /**
- 224 : : * @notice ERC-2980 getter: returns true if the address is whitelisted.
- 225 : : */
- 226 : 5 : function whitelist(address _operator) public view virtual override(IERC2980) returns (bool) {
- 227 : 5 : return _isWhitelisted(_operator);
- 228 : : }
- 229 : :
- 230 : : /**
- 231 : : * @notice Returns true if the address is whitelisted (identity-verified).
- 232 : : * @dev Reflects whitelist membership only. Frozen status is intentionally excluded:
- 233 : : * freezing is a temporary enforcement action and does not revoke identity verification.
- 234 : : */
- 235 : 3 : function isVerified(address targetAddress)
- 236 : : public
- 237 : : view
- 238 : : virtual
- 239 : : override(IIdentityRegistryVerified)
- 240 : : returns (bool)
- 241 : : {
- 242 : 3 : return _isWhitelisted(targetAddress);
- 243 : : }
- 244 : :
- 245 : : /**
- 246 : : * @notice Checks multiple addresses for whitelist membership.
- 247 : : */
- 248 : 1 : function areWhitelisted(address[] memory targetAddresses) public view returns (bool[] memory results) {
- 249 : 1 : results = new bool[](targetAddresses.length);
- 250 : 1 : for (uint256 i = 0; i < targetAddresses.length; ++i) {
- 251 : 2 : results[i] = _isWhitelisted(targetAddresses[i]);
- 252 : : }
- 253 : : }
- 254 : :
- 255 : : /*//////////////////////////////////////////////////////////////
- 256 : : FROZENLIST MANAGEMENT
- 257 : : //////////////////////////////////////////////////////////////*/
- 258 : :
- 259 : : /**
- 260 : : * @notice Adds multiple addresses to the frozenlist.
- 261 : : * @dev Does not revert if an address is already listed.
- 262 : : */
- 263 : 6 : function addFrozenlistAddresses(address[] calldata targetAddresses) public onlyFrozenlistAdd {
- 264 : 4 : _addFrozenlistAddresses(targetAddresses);
- 265 : 4 : emit AddFrozenlistAddresses(targetAddresses);
- 266 : : }
- 267 : :
- 268 : : /**
- 269 : : * @notice Removes multiple addresses from the frozenlist.
- 270 : : * @dev Does not revert if an address is not listed.
- 271 : : */
- 272 : 2 : function removeFrozenlistAddresses(address[] calldata targetAddresses) public onlyFrozenlistRemove {
- 273 : 2 : _removeFrozenlistAddresses(targetAddresses);
- 274 : 2 : emit RemoveFrozenlistAddresses(targetAddresses);
- 275 : : }
- 276 : :
- 277 : : /**
- 278 : : * @notice Adds a single address to the frozenlist.
- 279 : : * @dev
- 280 : : * Reverts if the address is already listed.
- 281 : : * Deviation from ERC-2980 `Freezable` example interface: the spec's `addAddressToFrozenlist`
- 282 : : * returns `false` on duplicates instead of reverting. This implementation follows the codebase
- 283 : : * convention of reverting on invalid single-item operations.
- 284 : : */
- 285 : 22 : function addFrozenlistAddress(address targetAddress) public onlyFrozenlistAdd {
- 286 [ + + ]: 19 : require(!_isFrozen(targetAddress), RuleERC2980_AddressAlreadyListed());
- 287 : 18 : _addFrozenlistAddress(targetAddress);
- 288 : 18 : emit AddFrozenlistAddress(targetAddress);
- 289 : : }
- 290 : :
- 291 : : /**
- 292 : : * @notice Removes a single address from the frozenlist.
- 293 : : * @dev
- 294 : : * Reverts if the address is not listed.
- 295 : : * Deviation from ERC-2980 `Freezable` example interface: the spec's `removeAddressFromFrozenlist`
- 296 : : * returns `false` when not found instead of reverting. This implementation follows the codebase
- 297 : : * convention of reverting on invalid single-item operations.
- 298 : : */
- 299 : 7 : function removeFrozenlistAddress(address targetAddress) public onlyFrozenlistRemove {
- 300 [ + + ]: 5 : require(_isFrozen(targetAddress), RuleERC2980_AddressNotFound());
- 301 : 4 : _removeFrozenlistAddress(targetAddress);
- 302 : 4 : emit RemoveFrozenlistAddress(targetAddress);
- 303 : : }
- 304 : :
- 305 : : /**
- 306 : : * @notice Returns the number of frozen addresses.
- 307 : : */
- 308 : 4 : function frozenlistAddressCount() public view returns (uint256) {
- 309 : 4 : return _frozenlistCount();
- 310 : : }
- 311 : :
- 312 : : /**
- 313 : : * @notice Returns true if the address is in the frozenlist.
- 314 : : */
- 315 : 12 : function isFrozen(address targetAddress) public view returns (bool) {
- 316 : 12 : return _isFrozen(targetAddress);
- 317 : : }
- 318 : :
- 319 : : /**
- 320 : : * @notice ERC-2980 getter: returns true if the address is frozen.
- 321 : : */
- 322 : 4 : function frozenlist(address _operator) public view virtual override(IERC2980) returns (bool) {
- 323 : 4 : return _isFrozen(_operator);
- 324 : : }
- 325 : :
- 326 : : /**
- 327 : : * @notice Checks multiple addresses for frozenlist membership.
- 328 : : */
- 329 : 1 : function areFrozen(address[] memory targetAddresses) public view returns (bool[] memory results) {
- 330 : 1 : results = new bool[](targetAddresses.length);
- 331 : 1 : for (uint256 i = 0; i < targetAddresses.length; ++i) {
- 332 : 2 : results[i] = _isFrozen(targetAddresses[i]);
- 333 : : }
+ 84 : : /*//////////////////////////////////////////////////////////////
+ 85 : : ERC-3643 / IRuleEngine HOOKS
+ 86 : : //////////////////////////////////////////////////////////////*/
+ 87 : :
+ 88 : 4 : function transferred(address from, address to, uint256 value)
+ 89 : : public
+ 90 : : view
+ 91 : : virtual
+ 92 : : override(IERC3643IComplianceContract)
+ 93 : : {
+ 94 : 4 : _transferred(from, to, value);
+ 95 : : }
+ 96 : :
+ 97 : 2 : function transferred(address spender, address from, address to, uint256 value)
+ 98 : : public
+ 99 : : view
+ 100 : : virtual
+ 101 : : override(IRuleEngine)
+ 102 : : {
+ 103 : 2 : _transferredFrom(spender, from, to, value);
+ 104 : : }
+ 105 : :
+ 106 : 5 : function _transferred(address from, address to, uint256 value) internal view virtual override {
+ 107 : 5 : uint8 code = _detectTransferRestriction(from, to, value);
+ 108 [ + + ]: 5 : require(
+ 109 : : code == uint8(IERC1404Extend.REJECTED_CODE_BASE.TRANSFER_OK),
+ 110 : : RuleERC2980_InvalidTransfer(address(this), from, to, value, code)
+ 111 : : );
+ 112 : : }
+ 113 : :
+ 114 : 3 : function _transferredFrom(address spender, address from, address to, uint256 value) internal view virtual override {
+ 115 : 3 : uint8 code = _detectTransferRestrictionFrom(spender, from, to, value);
+ 116 [ + + ]: 3 : require(
+ 117 : : code == uint8(IERC1404Extend.REJECTED_CODE_BASE.TRANSFER_OK),
+ 118 : : RuleERC2980_InvalidTransferFrom(address(this), spender, from, to, value, code)
+ 119 : : );
+ 120 : : }
+ 121 : :
+ 122 : : /*//////////////////////////////////////////////////////////////
+ 123 : : RESTRICTION CODE HELPERS
+ 124 : : //////////////////////////////////////////////////////////////*/
+ 125 : :
+ 126 : 5 : function canReturnTransferRestrictionCode(uint8 restrictionCode)
+ 127 : : public
+ 128 : : pure
+ 129 : : virtual
+ 130 : : override(IRule)
+ 131 : : returns (bool)
+ 132 : : {
+ 133 : 5 : return restrictionCode == CODE_ADDRESS_FROM_IS_FROZEN || restrictionCode == CODE_ADDRESS_TO_IS_FROZEN
+ 134 : 3 : || restrictionCode == CODE_ADDRESS_SPENDER_IS_FROZEN || restrictionCode == CODE_ADDRESS_TO_NOT_WHITELISTED;
+ 135 : : }
+ 136 : :
+ 137 : 5 : function messageForTransferRestriction(uint8 restrictionCode)
+ 138 : : public
+ 139 : : pure
+ 140 : : virtual
+ 141 : : override(IERC1404)
+ 142 : : returns (string memory)
+ 143 : : {
+ 144 [ + + ]: 5 : if (restrictionCode == CODE_ADDRESS_FROM_IS_FROZEN) {
+ 145 : 1 : return TEXT_ADDRESS_FROM_IS_FROZEN;
+ 146 [ + + ]: 4 : } else if (restrictionCode == CODE_ADDRESS_TO_IS_FROZEN) {
+ 147 : 1 : return TEXT_ADDRESS_TO_IS_FROZEN;
+ 148 [ + + ]: 3 : } else if (restrictionCode == CODE_ADDRESS_SPENDER_IS_FROZEN) {
+ 149 : 1 : return TEXT_ADDRESS_SPENDER_IS_FROZEN;
+ 150 [ + + ]: 2 : } else if (restrictionCode == CODE_ADDRESS_TO_NOT_WHITELISTED) {
+ 151 : 1 : return TEXT_ADDRESS_TO_NOT_WHITELISTED;
+ 152 : : } else {
+ 153 : 1 : return TEXT_CODE_NOT_FOUND;
+ 154 : : }
+ 155 : : }
+ 156 : :
+ 157 : : /*//////////////////////////////////////////////////////////////
+ 158 : : WHITELIST MANAGEMENT
+ 159 : : //////////////////////////////////////////////////////////////*/
+ 160 : :
+ 161 : : /**
+ 162 : : * @notice Adds multiple addresses to the whitelist.
+ 163 : : * @dev Does not revert if an address is already listed.
+ 164 : : */
+ 165 : 6 : function addWhitelistAddresses(address[] calldata targetAddresses) public onlyWhitelistAdd {
+ 166 : 4 : _addWhitelistAddresses(targetAddresses);
+ 167 : 4 : emit AddWhitelistAddresses(targetAddresses);
+ 168 : : }
+ 169 : :
+ 170 : : /**
+ 171 : : * @notice Removes multiple addresses from the whitelist.
+ 172 : : * @dev Does not revert if an address is not listed.
+ 173 : : */
+ 174 : 4 : function removeWhitelistAddresses(address[] calldata targetAddresses) public onlyWhitelistRemove {
+ 175 : 3 : _removeWhitelistAddresses(targetAddresses);
+ 176 : 3 : emit RemoveWhitelistAddresses(targetAddresses);
+ 177 : : }
+ 178 : :
+ 179 : : /**
+ 180 : : * @notice Adds a single address to the whitelist.
+ 181 : : * @dev
+ 182 : : * Reverts if the address is already listed.
+ 183 : : * Deviation from ERC-2980 `Whitelistable` example interface: the spec's `addAddressToWhitelist`
+ 184 : : * returns `false` on duplicates instead of reverting. This implementation follows the codebase
+ 185 : : * convention of reverting on invalid single-item operations.
+ 186 : : */
+ 187 : 43 : function addWhitelistAddress(address targetAddress) public onlyWhitelistAdd {
+ 188 [ + + ]: 40 : require(!_isWhitelisted(targetAddress), RuleERC2980_AddressAlreadyListed());
+ 189 : 39 : _addWhitelistAddress(targetAddress);
+ 190 : 39 : emit AddWhitelistAddress(targetAddress);
+ 191 : : }
+ 192 : :
+ 193 : : /**
+ 194 : : * @notice Removes a single address from the whitelist.
+ 195 : : * @dev
+ 196 : : * Reverts if the address is not listed.
+ 197 : : * Deviation from ERC-2980 `Whitelistable` example interface: the spec's `removeAddressFromWhitelist`
+ 198 : : * returns `false` when not found instead of reverting. This implementation follows the codebase
+ 199 : : * convention of reverting on invalid single-item operations.
+ 200 : : */
+ 201 : 7 : function removeWhitelistAddress(address targetAddress) public onlyWhitelistRemove {
+ 202 [ + + ]: 5 : require(_isWhitelisted(targetAddress), RuleERC2980_AddressNotFound());
+ 203 : 4 : _removeWhitelistAddress(targetAddress);
+ 204 : 4 : emit RemoveWhitelistAddress(targetAddress);
+ 205 : : }
+ 206 : :
+ 207 : : /**
+ 208 : : * @notice Returns the number of whitelisted addresses.
+ 209 : : */
+ 210 : 5 : function whitelistAddressCount() public view returns (uint256) {
+ 211 : 5 : return _whitelistCount();
+ 212 : : }
+ 213 : :
+ 214 : : /**
+ 215 : : * @notice Returns true if the address is in the whitelist.
+ 216 : : */
+ 217 : 13 : function isWhitelisted(address targetAddress) public view returns (bool) {
+ 218 : 13 : return _isWhitelisted(targetAddress);
+ 219 : : }
+ 220 : :
+ 221 : : /**
+ 222 : : * @notice ERC-2980 getter: returns true if the address is whitelisted.
+ 223 : : */
+ 224 : 5 : function whitelist(address _operator) public view virtual override(IERC2980) returns (bool) {
+ 225 : 5 : return _isWhitelisted(_operator);
+ 226 : : }
+ 227 : :
+ 228 : : /**
+ 229 : : * @notice Returns true if the address is whitelisted (identity-verified).
+ 230 : : * @dev Reflects whitelist membership only. Frozen status is intentionally excluded:
+ 231 : : * freezing is a temporary enforcement action and does not revoke identity verification.
+ 232 : : */
+ 233 : 3 : function isVerified(address targetAddress) public view virtual override(IIdentityRegistryVerified) returns (bool) {
+ 234 : 3 : return _isWhitelisted(targetAddress);
+ 235 : : }
+ 236 : :
+ 237 : : /**
+ 238 : : * @notice Checks multiple addresses for whitelist membership.
+ 239 : : */
+ 240 : 1 : function areWhitelisted(address[] memory targetAddresses) public view returns (bool[] memory results) {
+ 241 : 1 : results = new bool[](targetAddresses.length);
+ 242 : 1 : for (uint256 i = 0; i < targetAddresses.length; ++i) {
+ 243 : 2 : results[i] = _isWhitelisted(targetAddresses[i]);
+ 244 : : }
+ 245 : : }
+ 246 : :
+ 247 : : /*//////////////////////////////////////////////////////////////
+ 248 : : FROZENLIST MANAGEMENT
+ 249 : : //////////////////////////////////////////////////////////////*/
+ 250 : :
+ 251 : : /**
+ 252 : : * @notice Adds multiple addresses to the frozenlist.
+ 253 : : * @dev Does not revert if an address is already listed.
+ 254 : : */
+ 255 : 6 : function addFrozenlistAddresses(address[] calldata targetAddresses) public onlyFrozenlistAdd {
+ 256 : 4 : _addFrozenlistAddresses(targetAddresses);
+ 257 : 4 : emit AddFrozenlistAddresses(targetAddresses);
+ 258 : : }
+ 259 : :
+ 260 : : /**
+ 261 : : * @notice Removes multiple addresses from the frozenlist.
+ 262 : : * @dev Does not revert if an address is not listed.
+ 263 : : */
+ 264 : 2 : function removeFrozenlistAddresses(address[] calldata targetAddresses) public onlyFrozenlistRemove {
+ 265 : 2 : _removeFrozenlistAddresses(targetAddresses);
+ 266 : 2 : emit RemoveFrozenlistAddresses(targetAddresses);
+ 267 : : }
+ 268 : :
+ 269 : : /**
+ 270 : : * @notice Adds a single address to the frozenlist.
+ 271 : : * @dev
+ 272 : : * Reverts if the address is already listed.
+ 273 : : * Deviation from ERC-2980 `Freezable` example interface: the spec's `addAddressToFrozenlist`
+ 274 : : * returns `false` on duplicates instead of reverting. This implementation follows the codebase
+ 275 : : * convention of reverting on invalid single-item operations.
+ 276 : : */
+ 277 : 22 : function addFrozenlistAddress(address targetAddress) public onlyFrozenlistAdd {
+ 278 [ + + ]: 19 : require(!_isFrozen(targetAddress), RuleERC2980_AddressAlreadyListed());
+ 279 : 18 : _addFrozenlistAddress(targetAddress);
+ 280 : 18 : emit AddFrozenlistAddress(targetAddress);
+ 281 : : }
+ 282 : :
+ 283 : : /**
+ 284 : : * @notice Removes a single address from the frozenlist.
+ 285 : : * @dev
+ 286 : : * Reverts if the address is not listed.
+ 287 : : * Deviation from ERC-2980 `Freezable` example interface: the spec's `removeAddressFromFrozenlist`
+ 288 : : * returns `false` when not found instead of reverting. This implementation follows the codebase
+ 289 : : * convention of reverting on invalid single-item operations.
+ 290 : : */
+ 291 : 7 : function removeFrozenlistAddress(address targetAddress) public onlyFrozenlistRemove {
+ 292 [ + + ]: 5 : require(_isFrozen(targetAddress), RuleERC2980_AddressNotFound());
+ 293 : 4 : _removeFrozenlistAddress(targetAddress);
+ 294 : 4 : emit RemoveFrozenlistAddress(targetAddress);
+ 295 : : }
+ 296 : :
+ 297 : : /**
+ 298 : : * @notice Returns the number of frozen addresses.
+ 299 : : */
+ 300 : 4 : function frozenlistAddressCount() public view returns (uint256) {
+ 301 : 4 : return _frozenlistCount();
+ 302 : : }
+ 303 : :
+ 304 : : /**
+ 305 : : * @notice Returns true if the address is in the frozenlist.
+ 306 : : */
+ 307 : 12 : function isFrozen(address targetAddress) public view returns (bool) {
+ 308 : 12 : return _isFrozen(targetAddress);
+ 309 : : }
+ 310 : :
+ 311 : : /**
+ 312 : : * @notice ERC-2980 getter: returns true if the address is frozen.
+ 313 : : */
+ 314 : 4 : function frozenlist(address _operator) public view virtual override(IERC2980) returns (bool) {
+ 315 : 4 : return _isFrozen(_operator);
+ 316 : : }
+ 317 : :
+ 318 : : /**
+ 319 : : * @notice Checks multiple addresses for frozenlist membership.
+ 320 : : */
+ 321 : 1 : function areFrozen(address[] memory targetAddresses) public view returns (bool[] memory results) {
+ 322 : 1 : results = new bool[](targetAddresses.length);
+ 323 : 1 : for (uint256 i = 0; i < targetAddresses.length; ++i) {
+ 324 : 2 : results[i] = _isFrozen(targetAddresses[i]);
+ 325 : : }
+ 326 : : }
+ 327 : :
+ 328 : : /*//////////////////////////////////////////////////////////////
+ 329 : : INTERFACE SUPPORT
+ 330 : : //////////////////////////////////////////////////////////////*/
+ 331 : :
+ 332 : 1 : function supportsInterface(bytes4 interfaceId) public view virtual override(RuleTransferValidation) returns (bool) {
+ 333 : 1 : return RuleTransferValidation.supportsInterface(interfaceId);
334 : : }
335 : :
336 : : /*//////////////////////////////////////////////////////////////
- 337 : : INTERFACE SUPPORT
+ 337 : : ACCESS CONTROL
338 : : //////////////////////////////////////////////////////////////*/
339 : :
- 340 : 1 : function supportsInterface(bytes4 interfaceId) public view virtual override(RuleTransferValidation) returns (bool) {
- 341 : 1 : return RuleTransferValidation.supportsInterface(interfaceId);
- 342 : : }
- 343 : :
- 344 : : /*//////////////////////////////////////////////////////////////
- 345 : : ACCESS CONTROL
- 346 : : //////////////////////////////////////////////////////////////*/
- 347 : :
- 348 : 6 : modifier onlyWhitelistAdd() {
- 349 : 6 : _authorizeWhitelistAdd();
- 350 : : _;
- 351 : : }
- 352 : :
- 353 : 7 : modifier onlyWhitelistRemove() {
- 354 : 7 : _authorizeWhitelistRemove();
- 355 : : _;
- 356 : : }
- 357 : :
- 358 : 6 : modifier onlyFrozenlistAdd() {
- 359 : 6 : _authorizeFrozenlistAdd();
- 360 : : _;
- 361 : : }
- 362 : :
- 363 : 2 : modifier onlyFrozenlistRemove() {
- 364 : 2 : _authorizeFrozenlistRemove();
- 365 : : _;
- 366 : : }
- 367 : :
- 368 : : function _authorizeWhitelistAdd() internal view virtual;
- 369 : : function _authorizeWhitelistRemove() internal view virtual;
- 370 : : function _authorizeFrozenlistAdd() internal view virtual;
- 371 : : function _authorizeFrozenlistRemove() internal view virtual;
+ 340 : 6 : modifier onlyWhitelistAdd() {
+ 341 : 6 : _authorizeWhitelistAdd();
+ 342 : : _;
+ 343 : : }
+ 344 : :
+ 345 : 7 : modifier onlyWhitelistRemove() {
+ 346 : 7 : _authorizeWhitelistRemove();
+ 347 : : _;
+ 348 : : }
+ 349 : :
+ 350 : 6 : modifier onlyFrozenlistAdd() {
+ 351 : 6 : _authorizeFrozenlistAdd();
+ 352 : : _;
+ 353 : : }
+ 354 : :
+ 355 : 2 : modifier onlyFrozenlistRemove() {
+ 356 : 2 : _authorizeFrozenlistRemove();
+ 357 : : _;
+ 358 : : }
+ 359 : :
+ 360 : : function _authorizeWhitelistAdd() internal view virtual;
+ 361 : : function _authorizeWhitelistRemove() internal view virtual;
+ 362 : : function _authorizeFrozenlistAdd() internal view virtual;
+ 363 : : function _authorizeFrozenlistRemove() internal view virtual;
+ 364 : :
+ 365 : : /*//////////////////////////////////////////////////////////////
+ 366 : : ERC-2771 META TX
+ 367 : : //////////////////////////////////////////////////////////////*/
+ 368 : :
+ 369 : 267 : function _msgSender() internal view virtual override(ERC2771Context) returns (address sender) {
+ 370 : 267 : return ERC2771Context._msgSender();
+ 371 : : }
372 : :
- 373 : : /*//////////////////////////////////////////////////////////////
- 374 : : ERC-2771 META TX
- 375 : : //////////////////////////////////////////////////////////////*/
+ 373 : 2 : function _msgData() internal view virtual override(ERC2771Context) returns (bytes calldata) {
+ 374 : 2 : return ERC2771Context._msgData();
+ 375 : : }
376 : :
- 377 : 267 : function _msgSender() internal view virtual override(ERC2771Context) returns (address sender) {
- 378 : 267 : return ERC2771Context._msgSender();
+ 377 : 269 : function _contextSuffixLength() internal view virtual override(ERC2771Context) returns (uint256) {
+ 378 : 269 : return ERC2771Context._contextSuffixLength();
379 : : }
- 380 : :
- 381 : 2 : function _msgData() internal view virtual override(ERC2771Context) returns (bytes calldata) {
- 382 : 2 : return ERC2771Context._msgData();
- 383 : : }
- 384 : :
- 385 : 269 : function _contextSuffixLength() internal view virtual override(ERC2771Context) returns (uint256) {
- 386 : 269 : return ERC2771Context._contextSuffixLength();
- 387 : : }
- 388 : : }
+ 380 : : }
diff --git a/doc/coverage/coverage/abstract/base/RuleIdentityRegistryBase.sol.func-sort-c.html b/doc/coverage/coverage/abstract/base/RuleIdentityRegistryBase.sol.func-sort-c.html
index 2aa4d9c..09d303a 100644
--- a/doc/coverage/coverage/abstract/base/RuleIdentityRegistryBase.sol.func-sort-c.html
+++ b/doc/coverage/coverage/abstract/base/RuleIdentityRegistryBase.sol.func-sort-c.html
@@ -37,7 +37,7 @@
-
+
|
@@ -69,15 +69,15 @@
Hit count  |
- | RuleIdentityRegistryBase._transferred |
+ RuleIdentityRegistryBase._transferred |
2 |
- | RuleIdentityRegistryBase._transferredFrom |
+ RuleIdentityRegistryBase._transferredFrom |
2 |
- | RuleIdentityRegistryBase.transferred.0 |
+ RuleIdentityRegistryBase.transferred.0 |
2 |
@@ -85,11 +85,11 @@
| 2 |
- | RuleIdentityRegistryBase.canReturnTransferRestrictionCode |
+ RuleIdentityRegistryBase.canReturnTransferRestrictionCode |
4 |
- | RuleIdentityRegistryBase.messageForTransferRestriction |
+ RuleIdentityRegistryBase.messageForTransferRestriction |
4 |
@@ -101,11 +101,11 @@
| 5 |
- | RuleIdentityRegistryBase.onlyIdentityRegistryManager |
+ RuleIdentityRegistryBase.onlyIdentityRegistryManager |
5 |
- | RuleIdentityRegistryBase._detectTransferRestrictionFrom |
+ RuleIdentityRegistryBase._detectTransferRestrictionFrom |
9 |
diff --git a/doc/coverage/coverage/abstract/base/RuleIdentityRegistryBase.sol.func.html b/doc/coverage/coverage/abstract/base/RuleIdentityRegistryBase.sol.func.html
index 9fdf83a..39a7d2d 100644
--- a/doc/coverage/coverage/abstract/base/RuleIdentityRegistryBase.sol.func.html
+++ b/doc/coverage/coverage/abstract/base/RuleIdentityRegistryBase.sol.func.html
@@ -37,7 +37,7 @@
-
+
|
@@ -73,19 +73,19 @@
16 |
- | RuleIdentityRegistryBase._detectTransferRestrictionFrom |
+ RuleIdentityRegistryBase._detectTransferRestrictionFrom |
9 |
- | RuleIdentityRegistryBase._transferred |
+ RuleIdentityRegistryBase._transferred |
2 |
- | RuleIdentityRegistryBase._transferredFrom |
+ RuleIdentityRegistryBase._transferredFrom |
2 |
- | RuleIdentityRegistryBase.canReturnTransferRestrictionCode |
+ RuleIdentityRegistryBase.canReturnTransferRestrictionCode |
4 |
@@ -97,11 +97,11 @@
| 26 |
- | RuleIdentityRegistryBase.messageForTransferRestriction |
+ RuleIdentityRegistryBase.messageForTransferRestriction |
4 |
- | RuleIdentityRegistryBase.onlyIdentityRegistryManager |
+ RuleIdentityRegistryBase.onlyIdentityRegistryManager |
5 |
@@ -109,7 +109,7 @@
| 4 |
- | RuleIdentityRegistryBase.transferred.0 |
+ RuleIdentityRegistryBase.transferred.0 |
2 |
diff --git a/doc/coverage/coverage/abstract/base/RuleIdentityRegistryBase.sol.gcov.html b/doc/coverage/coverage/abstract/base/RuleIdentityRegistryBase.sol.gcov.html
index a9ee475..6e8d3ac 100644
--- a/doc/coverage/coverage/abstract/base/RuleIdentityRegistryBase.sol.gcov.html
+++ b/doc/coverage/coverage/abstract/base/RuleIdentityRegistryBase.sol.gcov.html
@@ -37,7 +37,7 @@
-
+
|
@@ -104,115 +104,106 @@
33 : 3 : emit IdentityRegistryUpdated(address(0));
34 : : }
35 : :
- 36 : 16 : function _detectTransferRestriction(address from, address to, uint256 /* value */)
- 37 : : internal
- 38 : : view
- 39 : : override
- 40 : : returns (uint8)
- 41 : : {
- 42 [ + ]: 16 : if (address(identityRegistry) == address(0)) {
- 43 : 3 : return uint8(IERC1404Extend.REJECTED_CODE_BASE.TRANSFER_OK);
- 44 : : }
- 45 [ + ]: 13 : if (to == address(0)) {
- 46 : 2 : return uint8(IERC1404Extend.REJECTED_CODE_BASE.TRANSFER_OK);
- 47 : : }
- 48 : :
- 49 [ + ]: 11 : if (from != address(0) && !identityRegistry.isVerified(from)) {
- 50 : 4 : return CODE_ADDRESS_FROM_NOT_VERIFIED;
+ 36 : 16 : function _detectTransferRestriction(
+ 37 : : address from,
+ 38 : : address to,
+ 39 : : uint256 /* value */
+ 40 : : )
+ 41 : : internal
+ 42 : : view
+ 43 : : override
+ 44 : : returns (uint8)
+ 45 : : {
+ 46 [ + ]: 16 : if (address(identityRegistry) == address(0)) {
+ 47 : 3 : return uint8(IERC1404Extend.REJECTED_CODE_BASE.TRANSFER_OK);
+ 48 : : }
+ 49 [ + ]: 13 : if (to == address(0)) {
+ 50 : 2 : return uint8(IERC1404Extend.REJECTED_CODE_BASE.TRANSFER_OK);
51 : : }
- 52 [ + ]: 7 : if (to != address(0) && !identityRegistry.isVerified(to)) {
- 53 : 1 : return CODE_ADDRESS_TO_NOT_VERIFIED;
- 54 : : }
- 55 : 6 : return uint8(IERC1404Extend.REJECTED_CODE_BASE.TRANSFER_OK);
- 56 : : }
- 57 : :
- 58 : 9 : function _detectTransferRestrictionFrom(address spender, address from, address to, uint256 value)
- 59 : : internal
- 60 : : view
- 61 : : override
- 62 : : returns (uint8)
- 63 : : {
- 64 [ + ]: 9 : if (address(identityRegistry) == address(0)) {
- 65 : 1 : return uint8(IERC1404Extend.REJECTED_CODE_BASE.TRANSFER_OK);
- 66 : : }
- 67 [ + ]: 8 : if (to == address(0)) {
- 68 : 1 : return uint8(IERC1404Extend.REJECTED_CODE_BASE.TRANSFER_OK);
- 69 : : }
- 70 [ + ]: 7 : if (spender != address(0) && !identityRegistry.isVerified(spender)) {
- 71 : 4 : return CODE_ADDRESS_SPENDER_NOT_VERIFIED;
- 72 : : }
- 73 : 3 : return _detectTransferRestriction(from, to, value);
- 74 : : }
- 75 : :
- 76 : 2 : function transferred(address from, address to, uint256 value)
- 77 : : public
- 78 : : view
- 79 : : override(IERC3643IComplianceContract)
- 80 : : {
+ 52 : :
+ 53 [ + ]: 11 : if (from != address(0) && !identityRegistry.isVerified(from)) {
+ 54 : 4 : return CODE_ADDRESS_FROM_NOT_VERIFIED;
+ 55 : : }
+ 56 [ + ]: 7 : if (to != address(0) && !identityRegistry.isVerified(to)) {
+ 57 : 1 : return CODE_ADDRESS_TO_NOT_VERIFIED;
+ 58 : : }
+ 59 : 6 : return uint8(IERC1404Extend.REJECTED_CODE_BASE.TRANSFER_OK);
+ 60 : : }
+ 61 : :
+ 62 : 9 : function _detectTransferRestrictionFrom(address spender, address from, address to, uint256 value)
+ 63 : : internal
+ 64 : : view
+ 65 : : override
+ 66 : : returns (uint8)
+ 67 : : {
+ 68 [ + ]: 9 : if (address(identityRegistry) == address(0)) {
+ 69 : 1 : return uint8(IERC1404Extend.REJECTED_CODE_BASE.TRANSFER_OK);
+ 70 : : }
+ 71 [ + ]: 8 : if (to == address(0)) {
+ 72 : 1 : return uint8(IERC1404Extend.REJECTED_CODE_BASE.TRANSFER_OK);
+ 73 : : }
+ 74 [ + ]: 7 : if (spender != address(0) && !identityRegistry.isVerified(spender)) {
+ 75 : 4 : return CODE_ADDRESS_SPENDER_NOT_VERIFIED;
+ 76 : : }
+ 77 : 3 : return _detectTransferRestriction(from, to, value);
+ 78 : : }
+ 79 : :
+ 80 : 2 : function transferred(address from, address to, uint256 value) public view override(IERC3643IComplianceContract) {
81 : 2 : _transferred(from, to, value);
82 : : }
83 : :
- 84 : 2 : function transferred(address spender, address from, address to, uint256 value)
- 85 : : public
- 86 : : view
- 87 : : override(IRuleEngine)
- 88 : : {
- 89 : 2 : _transferredFrom(spender, from, to, value);
- 90 : : }
- 91 : :
- 92 : 2 : function _transferred(address from, address to, uint256 value) internal view virtual override {
- 93 : 2 : uint8 code = _detectTransferRestriction(from, to, value);
- 94 [ + + ]: 2 : require(
- 95 : : code == uint8(IERC1404Extend.REJECTED_CODE_BASE.TRANSFER_OK),
- 96 : : RuleIdentityRegistry_InvalidTransfer(address(this), from, to, value, code)
- 97 : : );
- 98 : : }
- 99 : :
- 100 : 2 : function _transferredFrom(address spender, address from, address to, uint256 value)
- 101 : : internal
- 102 : : view
- 103 : : virtual
- 104 : : override
- 105 : : {
- 106 : 2 : uint8 code = _detectTransferRestrictionFrom(spender, from, to, value);
- 107 [ + + ]: 2 : require(
- 108 : : code == uint8(IERC1404Extend.REJECTED_CODE_BASE.TRANSFER_OK),
- 109 : : RuleIdentityRegistry_InvalidTransferFrom(address(this), spender, from, to, value, code)
- 110 : : );
- 111 : : }
- 112 : :
- 113 : 4 : function canReturnTransferRestrictionCode(uint8 restrictionCode) external pure override returns (bool) {
- 114 : 4 : return restrictionCode == CODE_ADDRESS_FROM_NOT_VERIFIED || restrictionCode == CODE_ADDRESS_TO_NOT_VERIFIED
- 115 : 2 : || restrictionCode == CODE_ADDRESS_SPENDER_NOT_VERIFIED;
- 116 : : }
- 117 : :
- 118 : 4 : function messageForTransferRestriction(uint8 restrictionCode)
- 119 : : public
- 120 : : pure
- 121 : : override(IERC1404)
- 122 : : returns (string memory)
- 123 : : {
- 124 [ + + ]: 4 : if (restrictionCode == CODE_ADDRESS_FROM_NOT_VERIFIED) {
- 125 : 1 : return TEXT_ADDRESS_FROM_NOT_VERIFIED;
- 126 [ + + ]: 3 : } else if (restrictionCode == CODE_ADDRESS_TO_NOT_VERIFIED) {
- 127 : 1 : return TEXT_ADDRESS_TO_NOT_VERIFIED;
- 128 [ + ]: 2 : } else if (restrictionCode == CODE_ADDRESS_SPENDER_NOT_VERIFIED) {
- 129 : 1 : return TEXT_ADDRESS_SPENDER_NOT_VERIFIED;
- 130 : : }
- 131 : 1 : return TEXT_CODE_NOT_FOUND;
+ 84 : 2 : function transferred(address spender, address from, address to, uint256 value) public view override(IRuleEngine) {
+ 85 : 2 : _transferredFrom(spender, from, to, value);
+ 86 : : }
+ 87 : :
+ 88 : 2 : function _transferred(address from, address to, uint256 value) internal view virtual override {
+ 89 : 2 : uint8 code = _detectTransferRestriction(from, to, value);
+ 90 [ + + ]: 2 : require(
+ 91 : : code == uint8(IERC1404Extend.REJECTED_CODE_BASE.TRANSFER_OK),
+ 92 : : RuleIdentityRegistry_InvalidTransfer(address(this), from, to, value, code)
+ 93 : : );
+ 94 : : }
+ 95 : :
+ 96 : 2 : function _transferredFrom(address spender, address from, address to, uint256 value) internal view virtual override {
+ 97 : 2 : uint8 code = _detectTransferRestrictionFrom(spender, from, to, value);
+ 98 [ + + ]: 2 : require(
+ 99 : : code == uint8(IERC1404Extend.REJECTED_CODE_BASE.TRANSFER_OK),
+ 100 : : RuleIdentityRegistry_InvalidTransferFrom(address(this), spender, from, to, value, code)
+ 101 : : );
+ 102 : : }
+ 103 : :
+ 104 : 4 : function canReturnTransferRestrictionCode(uint8 restrictionCode) external pure override returns (bool) {
+ 105 : 4 : return restrictionCode == CODE_ADDRESS_FROM_NOT_VERIFIED || restrictionCode == CODE_ADDRESS_TO_NOT_VERIFIED
+ 106 : 2 : || restrictionCode == CODE_ADDRESS_SPENDER_NOT_VERIFIED;
+ 107 : : }
+ 108 : :
+ 109 : 4 : function messageForTransferRestriction(uint8 restrictionCode)
+ 110 : : public
+ 111 : : pure
+ 112 : : override(IERC1404)
+ 113 : : returns (string memory)
+ 114 : : {
+ 115 [ + + ]: 4 : if (restrictionCode == CODE_ADDRESS_FROM_NOT_VERIFIED) {
+ 116 : 1 : return TEXT_ADDRESS_FROM_NOT_VERIFIED;
+ 117 [ + + ]: 3 : } else if (restrictionCode == CODE_ADDRESS_TO_NOT_VERIFIED) {
+ 118 : 1 : return TEXT_ADDRESS_TO_NOT_VERIFIED;
+ 119 [ + ]: 2 : } else if (restrictionCode == CODE_ADDRESS_SPENDER_NOT_VERIFIED) {
+ 120 : 1 : return TEXT_ADDRESS_SPENDER_NOT_VERIFIED;
+ 121 : : }
+ 122 : 1 : return TEXT_CODE_NOT_FOUND;
+ 123 : : }
+ 124 : :
+ 125 : : /*//////////////////////////////////////////////////////////////
+ 126 : : ACCESS CONTROL
+ 127 : : //////////////////////////////////////////////////////////////*/
+ 128 : :
+ 129 : 5 : modifier onlyIdentityRegistryManager() {
+ 130 : 5 : _authorizeIdentityRegistryManager();
+ 131 : : _;
132 : : }
133 : :
- 134 : : /*//////////////////////////////////////////////////////////////
- 135 : : ACCESS CONTROL
- 136 : : //////////////////////////////////////////////////////////////*/
- 137 : :
- 138 : 5 : modifier onlyIdentityRegistryManager() {
- 139 : 5 : _authorizeIdentityRegistryManager();
- 140 : : _;
- 141 : : }
- 142 : :
- 143 : : function _authorizeIdentityRegistryManager() internal view virtual;
- 144 : : }
+ 134 : : function _authorizeIdentityRegistryManager() internal view virtual;
+ 135 : : }
diff --git a/doc/coverage/coverage/abstract/base/RuleMaxTotalSupplyBase.sol.func-sort-c.html b/doc/coverage/coverage/abstract/base/RuleMaxTotalSupplyBase.sol.func-sort-c.html
index b09fc06..f2efd55 100644
--- a/doc/coverage/coverage/abstract/base/RuleMaxTotalSupplyBase.sol.func-sort-c.html
+++ b/doc/coverage/coverage/abstract/base/RuleMaxTotalSupplyBase.sol.func-sort-c.html
@@ -37,7 +37,7 @@
-
+
|
@@ -69,31 +69,31 @@
Hit count  |
- | RuleMaxTotalSupplyBase._detectTransferRestrictionFrom |
+ RuleMaxTotalSupplyBase._detectTransferRestrictionFrom |
2 |
- | RuleMaxTotalSupplyBase._transferred |
+ RuleMaxTotalSupplyBase._transferred |
2 |
- | RuleMaxTotalSupplyBase._transferredFrom |
+ RuleMaxTotalSupplyBase._transferredFrom |
2 |
- | RuleMaxTotalSupplyBase.canReturnTransferRestrictionCode |
+ RuleMaxTotalSupplyBase.canReturnTransferRestrictionCode |
2 |
- | RuleMaxTotalSupplyBase.messageForTransferRestriction |
+ RuleMaxTotalSupplyBase.messageForTransferRestriction |
2 |
- | RuleMaxTotalSupplyBase.transferred.0 |
+ RuleMaxTotalSupplyBase.transferred.0 |
2 |
- | RuleMaxTotalSupplyBase.transferred.1 |
+ RuleMaxTotalSupplyBase.transferred.1 |
2 |
@@ -105,7 +105,7 @@
| 25 |
- | RuleMaxTotalSupplyBase.onlyMaxTotalSupplyManager |
+ RuleMaxTotalSupplyBase.onlyMaxTotalSupplyManager |
260 |
diff --git a/doc/coverage/coverage/abstract/base/RuleMaxTotalSupplyBase.sol.func.html b/doc/coverage/coverage/abstract/base/RuleMaxTotalSupplyBase.sol.func.html
index d697da8..3ca3e52 100644
--- a/doc/coverage/coverage/abstract/base/RuleMaxTotalSupplyBase.sol.func.html
+++ b/doc/coverage/coverage/abstract/base/RuleMaxTotalSupplyBase.sol.func.html
@@ -37,7 +37,7 @@
-
+
|
@@ -73,19 +73,19 @@
271 |
- | RuleMaxTotalSupplyBase._detectTransferRestrictionFrom |
+ RuleMaxTotalSupplyBase._detectTransferRestrictionFrom |
2 |
- | RuleMaxTotalSupplyBase._transferred |
+ RuleMaxTotalSupplyBase._transferred |
2 |
- | RuleMaxTotalSupplyBase._transferredFrom |
+ RuleMaxTotalSupplyBase._transferredFrom |
2 |
- | RuleMaxTotalSupplyBase.canReturnTransferRestrictionCode |
+ RuleMaxTotalSupplyBase.canReturnTransferRestrictionCode |
2 |
@@ -93,11 +93,11 @@
| 25 |
- | RuleMaxTotalSupplyBase.messageForTransferRestriction |
+ RuleMaxTotalSupplyBase.messageForTransferRestriction |
2 |
- | RuleMaxTotalSupplyBase.onlyMaxTotalSupplyManager |
+ RuleMaxTotalSupplyBase.onlyMaxTotalSupplyManager |
260 |
@@ -109,11 +109,11 @@
| 4 |
- | RuleMaxTotalSupplyBase.transferred.0 |
+ RuleMaxTotalSupplyBase.transferred.0 |
2 |
- | RuleMaxTotalSupplyBase.transferred.1 |
+ RuleMaxTotalSupplyBase.transferred.1 |
2 |
diff --git a/doc/coverage/coverage/abstract/base/RuleMaxTotalSupplyBase.sol.gcov.html b/doc/coverage/coverage/abstract/base/RuleMaxTotalSupplyBase.sol.gcov.html
index d9659ad..4654187 100644
--- a/doc/coverage/coverage/abstract/base/RuleMaxTotalSupplyBase.sol.gcov.html
+++ b/doc/coverage/coverage/abstract/base/RuleMaxTotalSupplyBase.sol.gcov.html
@@ -37,7 +37,7 @@
-
+
|
@@ -105,89 +105,86 @@
34 : 1 : emit TokenContractUpdated(newTokenContract);
35 : : }
36 : :
- 37 : 271 : function _detectTransferRestriction(address from, address /* to */, uint256 value)
- 38 : : internal
- 39 : : view
- 40 : : override
- 41 : : returns (uint8)
- 42 : : {
- 43 [ + ]: 271 : if (from == address(0)) {
- 44 : 268 : uint256 currentSupply = tokenContract.totalSupply();
- 45 [ + ]: 268 : if (currentSupply + value > maxTotalSupply) {
- 46 : 179 : return CODE_MAX_TOTAL_SUPPLY_EXCEEDED;
- 47 : : }
- 48 : : }
- 49 : 92 : return uint8(IERC1404Extend.REJECTED_CODE_BASE.TRANSFER_OK);
- 50 : : }
- 51 : :
- 52 : 2 : function _detectTransferRestrictionFrom(address, address from, address to, uint256 value)
- 53 : : internal
- 54 : : view
- 55 : : override
- 56 : : returns (uint8)
- 57 : : {
- 58 : 2 : return _detectTransferRestriction(from, to, value);
- 59 : : }
- 60 : :
- 61 : 2 : function transferred(address from, address to, uint256 value)
- 62 : : public
- 63 : : view
- 64 : : override(IERC3643IComplianceContract)
- 65 : : {
- 66 : 2 : _transferred(from, to, value);
- 67 : : }
- 68 : :
- 69 : 2 : function transferred(address spender, address from, address to, uint256 value)
- 70 : : public
- 71 : : view
- 72 : : override(IRuleEngine)
- 73 : : {
- 74 : 2 : _transferredFrom(spender, from, to, value);
- 75 : : }
- 76 : :
- 77 : 2 : function _transferred(address from, address to, uint256 value) internal view virtual {
- 78 : 2 : uint8 code = _detectTransferRestriction(from, to, value);
- 79 [ + + ]: 2 : require(
- 80 : : code == uint8(IERC1404Extend.REJECTED_CODE_BASE.TRANSFER_OK),
- 81 : : RuleMaxTotalSupply_InvalidTransfer(address(this), from, to, value, code)
- 82 : : );
- 83 : : }
- 84 : :
- 85 : 2 : function _transferredFrom(address spender, address from, address to, uint256 value) internal view virtual {
- 86 : 2 : uint8 code = _detectTransferRestrictionFrom(spender, from, to, value);
- 87 [ + + ]: 2 : require(
- 88 : : code == uint8(IERC1404Extend.REJECTED_CODE_BASE.TRANSFER_OK),
- 89 : : RuleMaxTotalSupply_InvalidTransferFrom(address(this), spender, from, to, value, code)
- 90 : : );
- 91 : : }
- 92 : :
- 93 : 2 : function canReturnTransferRestrictionCode(uint8 restrictionCode) external pure override returns (bool) {
- 94 : 2 : return restrictionCode == CODE_MAX_TOTAL_SUPPLY_EXCEEDED;
- 95 : : }
- 96 : :
- 97 : 2 : function messageForTransferRestriction(uint8 restrictionCode)
- 98 : : public
- 99 : : pure
- 100 : : override(IERC1404)
- 101 : : returns (string memory)
- 102 : : {
- 103 [ + ]: 2 : if (restrictionCode == CODE_MAX_TOTAL_SUPPLY_EXCEEDED) {
- 104 : 1 : return TEXT_MAX_TOTAL_SUPPLY_EXCEEDED;
- 105 : : }
- 106 : 1 : return TEXT_CODE_NOT_FOUND;
- 107 : : }
- 108 : :
- 109 : : /*//////////////////////////////////////////////////////////////
- 110 : : ACCESS CONTROL
- 111 : : //////////////////////////////////////////////////////////////*/
- 112 : :
- 113 : 260 : modifier onlyMaxTotalSupplyManager() {
- 114 : 260 : _authorizeMaxTotalSupplyManager();
- 115 : : _;
- 116 : : }
- 117 : :
- 118 : : function _authorizeMaxTotalSupplyManager() internal view virtual;
- 119 : : }
+ 37 : 271 : function _detectTransferRestriction(
+ 38 : : address from,
+ 39 : : address,
+ 40 : : /* to */
+ 41 : : uint256 value
+ 42 : : )
+ 43 : : internal
+ 44 : : view
+ 45 : : override
+ 46 : : returns (uint8)
+ 47 : : {
+ 48 [ + ]: 271 : if (from == address(0)) {
+ 49 : 268 : uint256 currentSupply = tokenContract.totalSupply();
+ 50 [ + ]: 268 : if (currentSupply + value > maxTotalSupply) {
+ 51 : 176 : return CODE_MAX_TOTAL_SUPPLY_EXCEEDED;
+ 52 : : }
+ 53 : : }
+ 54 : 95 : return uint8(IERC1404Extend.REJECTED_CODE_BASE.TRANSFER_OK);
+ 55 : : }
+ 56 : :
+ 57 : 2 : function _detectTransferRestrictionFrom(address, address from, address to, uint256 value)
+ 58 : : internal
+ 59 : : view
+ 60 : : override
+ 61 : : returns (uint8)
+ 62 : : {
+ 63 : 2 : return _detectTransferRestriction(from, to, value);
+ 64 : : }
+ 65 : :
+ 66 : 2 : function transferred(address from, address to, uint256 value) public view override(IERC3643IComplianceContract) {
+ 67 : 2 : _transferred(from, to, value);
+ 68 : : }
+ 69 : :
+ 70 : 2 : function transferred(address spender, address from, address to, uint256 value) public view override(IRuleEngine) {
+ 71 : 2 : _transferredFrom(spender, from, to, value);
+ 72 : : }
+ 73 : :
+ 74 : 2 : function _transferred(address from, address to, uint256 value) internal view virtual {
+ 75 : 2 : uint8 code = _detectTransferRestriction(from, to, value);
+ 76 [ + + ]: 2 : require(
+ 77 : : code == uint8(IERC1404Extend.REJECTED_CODE_BASE.TRANSFER_OK),
+ 78 : : RuleMaxTotalSupply_InvalidTransfer(address(this), from, to, value, code)
+ 79 : : );
+ 80 : : }
+ 81 : :
+ 82 : 2 : function _transferredFrom(address spender, address from, address to, uint256 value) internal view virtual {
+ 83 : 2 : uint8 code = _detectTransferRestrictionFrom(spender, from, to, value);
+ 84 [ + + ]: 2 : require(
+ 85 : : code == uint8(IERC1404Extend.REJECTED_CODE_BASE.TRANSFER_OK),
+ 86 : : RuleMaxTotalSupply_InvalidTransferFrom(address(this), spender, from, to, value, code)
+ 87 : : );
+ 88 : : }
+ 89 : :
+ 90 : 2 : function canReturnTransferRestrictionCode(uint8 restrictionCode) external pure override returns (bool) {
+ 91 : 2 : return restrictionCode == CODE_MAX_TOTAL_SUPPLY_EXCEEDED;
+ 92 : : }
+ 93 : :
+ 94 : 2 : function messageForTransferRestriction(uint8 restrictionCode)
+ 95 : : public
+ 96 : : pure
+ 97 : : override(IERC1404)
+ 98 : : returns (string memory)
+ 99 : : {
+ 100 [ + ]: 2 : if (restrictionCode == CODE_MAX_TOTAL_SUPPLY_EXCEEDED) {
+ 101 : 1 : return TEXT_MAX_TOTAL_SUPPLY_EXCEEDED;
+ 102 : : }
+ 103 : 1 : return TEXT_CODE_NOT_FOUND;
+ 104 : : }
+ 105 : :
+ 106 : : /*//////////////////////////////////////////////////////////////
+ 107 : : ACCESS CONTROL
+ 108 : : //////////////////////////////////////////////////////////////*/
+ 109 : :
+ 110 : 260 : modifier onlyMaxTotalSupplyManager() {
+ 111 : 260 : _authorizeMaxTotalSupplyManager();
+ 112 : : _;
+ 113 : : }
+ 114 : :
+ 115 : : function _authorizeMaxTotalSupplyManager() internal view virtual;
+ 116 : : }
diff --git a/doc/coverage/coverage/abstract/base/RuleSanctionsListBase.sol.func-sort-c.html b/doc/coverage/coverage/abstract/base/RuleSanctionsListBase.sol.func-sort-c.html
index 9280236..fa20f29 100644
--- a/doc/coverage/coverage/abstract/base/RuleSanctionsListBase.sol.func-sort-c.html
+++ b/doc/coverage/coverage/abstract/base/RuleSanctionsListBase.sol.func-sort-c.html
@@ -37,7 +37,7 @@
-
+
|
@@ -73,39 +73,39 @@
2 |
- | RuleSanctionsListBase._transferredFrom |
+ RuleSanctionsListBase._transferredFrom |
3 |
- | RuleSanctionsListBase.canReturnTransferRestrictionCode |
+ RuleSanctionsListBase.canReturnTransferRestrictionCode |
3 |
- | RuleSanctionsListBase.clearSanctionListOracle |
+ RuleSanctionsListBase.clearSanctionListOracle |
3 |
- | RuleSanctionsListBase.onlySanctionListManager |
+ RuleSanctionsListBase.onlySanctionListManager |
3 |
- | RuleSanctionsListBase.messageForTransferRestriction |
+ RuleSanctionsListBase.messageForTransferRestriction |
4 |
- | RuleSanctionsListBase._detectTransferRestrictionFrom |
+ RuleSanctionsListBase._detectTransferRestrictionFrom |
16 |
- | RuleSanctionsListBase.setSanctionListOracle |
+ RuleSanctionsListBase.setSanctionListOracle |
17 |
- | RuleSanctionsListBase._setSanctionListOracle |
+ RuleSanctionsListBase._setSanctionListOracle |
37 |
- | RuleSanctionsListBase.transferred.0 |
+ RuleSanctionsListBase.transferred.0 |
43 |
@@ -113,7 +113,7 @@
| 46 |
- | RuleSanctionsListBase._transferred |
+ RuleSanctionsListBase._transferred |
47 |
diff --git a/doc/coverage/coverage/abstract/base/RuleSanctionsListBase.sol.func.html b/doc/coverage/coverage/abstract/base/RuleSanctionsListBase.sol.func.html
index 7fac67d..142069e 100644
--- a/doc/coverage/coverage/abstract/base/RuleSanctionsListBase.sol.func.html
+++ b/doc/coverage/coverage/abstract/base/RuleSanctionsListBase.sol.func.html
@@ -37,7 +37,7 @@
-
+
|
@@ -73,27 +73,27 @@
84 |
- | RuleSanctionsListBase._detectTransferRestrictionFrom |
+ RuleSanctionsListBase._detectTransferRestrictionFrom |
16 |
- | RuleSanctionsListBase._setSanctionListOracle |
+ RuleSanctionsListBase._setSanctionListOracle |
37 |
- | RuleSanctionsListBase._transferred |
+ RuleSanctionsListBase._transferred |
47 |
- | RuleSanctionsListBase._transferredFrom |
+ RuleSanctionsListBase._transferredFrom |
3 |
- | RuleSanctionsListBase.canReturnTransferRestrictionCode |
+ RuleSanctionsListBase.canReturnTransferRestrictionCode |
3 |
- | RuleSanctionsListBase.clearSanctionListOracle |
+ RuleSanctionsListBase.clearSanctionListOracle |
3 |
@@ -101,19 +101,19 @@
| 46 |
- | RuleSanctionsListBase.messageForTransferRestriction |
+ RuleSanctionsListBase.messageForTransferRestriction |
4 |
- | RuleSanctionsListBase.onlySanctionListManager |
+ RuleSanctionsListBase.onlySanctionListManager |
3 |
- | RuleSanctionsListBase.setSanctionListOracle |
+ RuleSanctionsListBase.setSanctionListOracle |
17 |
- | RuleSanctionsListBase.transferred.0 |
+ RuleSanctionsListBase.transferred.0 |
43 |
diff --git a/doc/coverage/coverage/abstract/base/RuleSanctionsListBase.sol.gcov.html b/doc/coverage/coverage/abstract/base/RuleSanctionsListBase.sol.gcov.html
index aa0ff72..7ddbdd5 100644
--- a/doc/coverage/coverage/abstract/base/RuleSanctionsListBase.sol.gcov.html
+++ b/doc/coverage/coverage/abstract/base/RuleSanctionsListBase.sol.gcov.html
@@ -37,7 +37,7 @@
-
+
|
@@ -96,121 +96,112 @@
25 : : }
26 : : }
27 : :
- 28 : 84 : function _detectTransferRestriction(address from, address to, uint256 /* value */)
- 29 : : internal
- 30 : : view
- 31 : : override
- 32 : : returns (uint8)
- 33 : : {
- 34 [ + ]: 84 : if (address(sanctionsList) != address(0)) {
- 35 [ + + ]: 77 : if (sanctionsList.isSanctioned(from)) {
- 36 : 10 : return CODE_ADDRESS_FROM_IS_SANCTIONED;
- 37 [ + ]: 67 : } else if (sanctionsList.isSanctioned(to)) {
- 38 : 12 : return CODE_ADDRESS_TO_IS_SANCTIONED;
- 39 : : }
- 40 : : }
- 41 : 62 : return uint8(REJECTED_CODE_BASE.TRANSFER_OK);
- 42 : : }
- 43 : :
- 44 : 16 : function _detectTransferRestrictionFrom(address spender, address from, address to, uint256 value)
- 45 : : internal
- 46 : : view
- 47 : : virtual
- 48 : : override
- 49 : : returns (uint8)
- 50 : : {
- 51 [ + ]: 16 : if (address(sanctionsList) != address(0)) {
- 52 [ + ]: 15 : if (sanctionsList.isSanctioned(spender)) {
- 53 : 6 : return CODE_ADDRESS_SPENDER_IS_SANCTIONED;
- 54 : : }
- 55 : 9 : return _detectTransferRestriction(from, to, value);
- 56 : : }
- 57 : 1 : return uint8(REJECTED_CODE_BASE.TRANSFER_OK);
- 58 : : }
- 59 : :
- 60 : 3 : function canReturnTransferRestrictionCode(uint8 restrictionCode) external pure override(IRule) returns (bool) {
- 61 : 3 : return restrictionCode == CODE_ADDRESS_FROM_IS_SANCTIONED || restrictionCode == CODE_ADDRESS_TO_IS_SANCTIONED
- 62 : 1 : || restrictionCode == CODE_ADDRESS_SPENDER_IS_SANCTIONED;
- 63 : : }
- 64 : :
- 65 : 4 : function messageForTransferRestriction(uint8 restrictionCode)
- 66 : : public
- 67 : : pure
- 68 : : override(IERC1404)
- 69 : : returns (string memory)
- 70 : : {
- 71 [ + + ]: 4 : if (restrictionCode == CODE_ADDRESS_FROM_IS_SANCTIONED) {
- 72 : 1 : return TEXT_ADDRESS_FROM_IS_SANCTIONED;
- 73 [ + + ]: 3 : } else if (restrictionCode == CODE_ADDRESS_TO_IS_SANCTIONED) {
- 74 : 1 : return TEXT_ADDRESS_TO_IS_SANCTIONED;
- 75 [ + ]: 2 : } else if (restrictionCode == CODE_ADDRESS_SPENDER_IS_SANCTIONED) {
- 76 : 1 : return TEXT_ADDRESS_SPENDER_IS_SANCTIONED;
- 77 : : }
- 78 : 1 : return TEXT_CODE_NOT_FOUND;
- 79 : : }
- 80 : :
- 81 : 17 : function setSanctionListOracle(ISanctionsList sanctionContractOracle_) public virtual onlySanctionListManager {
- 82 [ + + ]: 15 : require(address(sanctionContractOracle_) != address(0), RuleSanctionsList_OracleAddressZeroNotAllowed());
- 83 : 14 : _setSanctionListOracle(sanctionContractOracle_);
- 84 : : }
- 85 : :
- 86 : 3 : function clearSanctionListOracle() public virtual onlySanctionListManager {
- 87 : 3 : _setSanctionListOracle(ISanctionsList(address(0)));
+ 28 : 84 : function _detectTransferRestriction(
+ 29 : : address from,
+ 30 : : address to,
+ 31 : : uint256 /* value */
+ 32 : : )
+ 33 : : internal
+ 34 : : view
+ 35 : : override
+ 36 : : returns (uint8)
+ 37 : : {
+ 38 [ + ]: 84 : if (address(sanctionsList) != address(0)) {
+ 39 [ + + ]: 77 : if (sanctionsList.isSanctioned(from)) {
+ 40 : 10 : return CODE_ADDRESS_FROM_IS_SANCTIONED;
+ 41 [ + ]: 67 : } else if (sanctionsList.isSanctioned(to)) {
+ 42 : 12 : return CODE_ADDRESS_TO_IS_SANCTIONED;
+ 43 : : }
+ 44 : : }
+ 45 : 62 : return uint8(REJECTED_CODE_BASE.TRANSFER_OK);
+ 46 : : }
+ 47 : :
+ 48 : 16 : function _detectTransferRestrictionFrom(address spender, address from, address to, uint256 value)
+ 49 : : internal
+ 50 : : view
+ 51 : : virtual
+ 52 : : override
+ 53 : : returns (uint8)
+ 54 : : {
+ 55 [ + ]: 16 : if (address(sanctionsList) != address(0)) {
+ 56 [ + ]: 15 : if (sanctionsList.isSanctioned(spender)) {
+ 57 : 6 : return CODE_ADDRESS_SPENDER_IS_SANCTIONED;
+ 58 : : }
+ 59 : 9 : return _detectTransferRestriction(from, to, value);
+ 60 : : }
+ 61 : 1 : return uint8(REJECTED_CODE_BASE.TRANSFER_OK);
+ 62 : : }
+ 63 : :
+ 64 : 3 : function canReturnTransferRestrictionCode(uint8 restrictionCode) external pure override(IRule) returns (bool) {
+ 65 : 3 : return restrictionCode == CODE_ADDRESS_FROM_IS_SANCTIONED || restrictionCode == CODE_ADDRESS_TO_IS_SANCTIONED
+ 66 : 1 : || restrictionCode == CODE_ADDRESS_SPENDER_IS_SANCTIONED;
+ 67 : : }
+ 68 : :
+ 69 : 4 : function messageForTransferRestriction(uint8 restrictionCode)
+ 70 : : public
+ 71 : : pure
+ 72 : : override(IERC1404)
+ 73 : : returns (string memory)
+ 74 : : {
+ 75 [ + + ]: 4 : if (restrictionCode == CODE_ADDRESS_FROM_IS_SANCTIONED) {
+ 76 : 1 : return TEXT_ADDRESS_FROM_IS_SANCTIONED;
+ 77 [ + + ]: 3 : } else if (restrictionCode == CODE_ADDRESS_TO_IS_SANCTIONED) {
+ 78 : 1 : return TEXT_ADDRESS_TO_IS_SANCTIONED;
+ 79 [ + ]: 2 : } else if (restrictionCode == CODE_ADDRESS_SPENDER_IS_SANCTIONED) {
+ 80 : 1 : return TEXT_ADDRESS_SPENDER_IS_SANCTIONED;
+ 81 : : }
+ 82 : 1 : return TEXT_CODE_NOT_FOUND;
+ 83 : : }
+ 84 : :
+ 85 : 17 : function setSanctionListOracle(ISanctionsList sanctionContractOracle_) public virtual onlySanctionListManager {
+ 86 [ + + ]: 15 : require(address(sanctionContractOracle_) != address(0), RuleSanctionsList_OracleAddressZeroNotAllowed());
+ 87 : 14 : _setSanctionListOracle(sanctionContractOracle_);
88 : : }
89 : :
- 90 : 43 : function transferred(address from, address to, uint256 value)
- 91 : : public
- 92 : : view
- 93 : : override(IERC3643IComplianceContract)
- 94 : : {
+ 90 : 3 : function clearSanctionListOracle() public virtual onlySanctionListManager {
+ 91 : 3 : _setSanctionListOracle(ISanctionsList(address(0)));
+ 92 : : }
+ 93 : :
+ 94 : 43 : function transferred(address from, address to, uint256 value) public view override(IERC3643IComplianceContract) {
95 : 43 : _transferred(from, to, value);
96 : : }
97 : :
- 98 : 2 : function transferred(address spender, address from, address to, uint256 value)
- 99 : : public
- 100 : : view
- 101 : : override(IRuleEngine)
- 102 : : {
- 103 : 2 : _transferredFrom(spender, from, to, value);
- 104 : : }
- 105 : :
- 106 : 47 : function _transferred(address from, address to, uint256 value) internal view virtual override {
- 107 : 47 : uint8 code = _detectTransferRestriction(from, to, value);
- 108 [ + + ]: 47 : require(
- 109 : : code == uint8(IERC1404Extend.REJECTED_CODE_BASE.TRANSFER_OK),
- 110 : : RuleSanctionsList_InvalidTransfer(address(this), from, to, value, code)
- 111 : : );
- 112 : : }
- 113 : :
- 114 : 3 : function _transferredFrom(address spender, address from, address to, uint256 value)
- 115 : : internal
- 116 : : view
- 117 : : virtual
- 118 : : override
- 119 : : {
- 120 : 3 : uint8 code = _detectTransferRestrictionFrom(spender, from, to, value);
- 121 [ + + ]: 3 : require(
- 122 : : code == uint8(IERC1404Extend.REJECTED_CODE_BASE.TRANSFER_OK),
- 123 : : RuleSanctionsList_InvalidTransferFrom(address(this), spender, from, to, value, code)
- 124 : : );
- 125 : : }
+ 98 : 2 : function transferred(address spender, address from, address to, uint256 value) public view override(IRuleEngine) {
+ 99 : 2 : _transferredFrom(spender, from, to, value);
+ 100 : : }
+ 101 : :
+ 102 : 47 : function _transferred(address from, address to, uint256 value) internal view virtual override {
+ 103 : 47 : uint8 code = _detectTransferRestriction(from, to, value);
+ 104 [ + + ]: 47 : require(
+ 105 : : code == uint8(IERC1404Extend.REJECTED_CODE_BASE.TRANSFER_OK),
+ 106 : : RuleSanctionsList_InvalidTransfer(address(this), from, to, value, code)
+ 107 : : );
+ 108 : : }
+ 109 : :
+ 110 : 3 : function _transferredFrom(address spender, address from, address to, uint256 value) internal view virtual override {
+ 111 : 3 : uint8 code = _detectTransferRestrictionFrom(spender, from, to, value);
+ 112 [ + + ]: 3 : require(
+ 113 : : code == uint8(IERC1404Extend.REJECTED_CODE_BASE.TRANSFER_OK),
+ 114 : : RuleSanctionsList_InvalidTransferFrom(address(this), spender, from, to, value, code)
+ 115 : : );
+ 116 : : }
+ 117 : :
+ 118 : 37 : function _setSanctionListOracle(ISanctionsList sanctionContractOracle_) internal virtual {
+ 119 : 37 : sanctionsList = sanctionContractOracle_;
+ 120 : 37 : emit SetSanctionListOracle(sanctionContractOracle_);
+ 121 : : }
+ 122 : :
+ 123 : : /*//////////////////////////////////////////////////////////////
+ 124 : : ACCESS CONTROL
+ 125 : : //////////////////////////////////////////////////////////////*/
126 : :
- 127 : 37 : function _setSanctionListOracle(ISanctionsList sanctionContractOracle_) internal virtual {
- 128 : 37 : sanctionsList = sanctionContractOracle_;
- 129 : 37 : emit SetSanctionListOracle(sanctionContractOracle_);
+ 127 : 3 : modifier onlySanctionListManager() {
+ 128 : 3 : _authorizeSanctionListManager();
+ 129 : : _;
130 : : }
131 : :
- 132 : : /*//////////////////////////////////////////////////////////////
- 133 : : ACCESS CONTROL
- 134 : : //////////////////////////////////////////////////////////////*/
- 135 : :
- 136 : 3 : modifier onlySanctionListManager() {
- 137 : 3 : _authorizeSanctionListManager();
- 138 : : _;
- 139 : : }
- 140 : :
- 141 : : function _authorizeSanctionListManager() internal view virtual;
- 142 : : }
+ 132 : : function _authorizeSanctionListManager() internal view virtual;
+ 133 : : }
diff --git a/doc/coverage/coverage/abstract/base/RuleSpenderWhitelistBase.sol.func-sort-c.html b/doc/coverage/coverage/abstract/base/RuleSpenderWhitelistBase.sol.func-sort-c.html
new file mode 100644
index 0000000..314e705
--- /dev/null
+++ b/doc/coverage/coverage/abstract/base/RuleSpenderWhitelistBase.sol.func-sort-c.html
@@ -0,0 +1,113 @@
+
+
+
+
+
+
+ LCOV - lcov.info - abstract/base/RuleSpenderWhitelistBase.sol - functions
+
+
+
+
+
+
+ | LCOV - code coverage report |
+  |
+
+
+
+
+
+
+
+ |
+ |
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+ |
+ |
+ |
+
+
+
+
+
+  |
+
+ |
+
+
+  |
+
+
+
+
+
+
+
+
+
+
+
diff --git a/doc/coverage/coverage/abstract/base/RuleSpenderWhitelistBase.sol.func.html b/doc/coverage/coverage/abstract/base/RuleSpenderWhitelistBase.sol.func.html
new file mode 100644
index 0000000..e20e522
--- /dev/null
+++ b/doc/coverage/coverage/abstract/base/RuleSpenderWhitelistBase.sol.func.html
@@ -0,0 +1,113 @@
+
+
+
+
+
+
+ LCOV - lcov.info - abstract/base/RuleSpenderWhitelistBase.sol - functions
+
+
+
+
+
+
+ | LCOV - code coverage report |
+  |
+
+
+
+
+
+
+
+ |
+ |
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+ |
+ |
+ |
+
+
+
+
+
+  |
+
+ |
+
+
+  |
+
+
+
+
+
+
+
+
+
+
+
diff --git a/doc/coverage/coverage/abstract/base/RuleSpenderWhitelistBase.sol.gcov.html b/doc/coverage/coverage/abstract/base/RuleSpenderWhitelistBase.sol.gcov.html
new file mode 100644
index 0000000..6f88cfd
--- /dev/null
+++ b/doc/coverage/coverage/abstract/base/RuleSpenderWhitelistBase.sol.gcov.html
@@ -0,0 +1,157 @@
+
+
+
+
+
+
+ LCOV - lcov.info - abstract/base/RuleSpenderWhitelistBase.sol
+
+
+
+
+
+
+ | LCOV - code coverage report |
+  |
+
+
+
+
+
+
+
+ |
+ |
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+ |
+ |
+ |
+
+
+
+
+
+  |
+
+ |
+
+
+  |
+
+
+
+
+
|
+
+
+
+ Branch data Line data Source code
+
+ 1 : : // SPDX-License-Identifier: MPL-2.0
+ 2 : : pragma solidity ^0.8.20;
+ 3 : :
+ 4 : : import {RuleAddressSet} from "../RuleAddressSet/RuleAddressSet.sol";
+ 5 : : import {RuleNFTAdapter} from "../core/RuleNFTAdapter.sol";
+ 6 : : import {RuleSpenderWhitelistInvariantStorage} from "../invariant/RuleSpenderWhitelistInvariantStorage.sol";
+ 7 : : import {IERC1404, IERC1404Extend} from "CMTAT/interfaces/tokenization/draft-IERC1404.sol";
+ 8 : : import {IERC3643IComplianceContract} from "CMTAT/interfaces/tokenization/IERC3643Partial.sol";
+ 9 : : import {IRuleEngine} from "CMTAT/interfaces/engine/IRuleEngine.sol";
+ 10 : :
+ 11 : : /**
+ 12 : : * @title RuleSpenderWhitelistBase
+ 13 : : * @notice Restricts `transferFrom`-style flows to whitelisted spenders only.
+ 14 : : * @dev Direct transfers (`transferred(from,to,value)`) are intentionally no-op.
+ 15 : : */
+ 16 : : abstract contract RuleSpenderWhitelistBase is RuleAddressSet, RuleNFTAdapter, RuleSpenderWhitelistInvariantStorage {
+ 17 : : constructor(address forwarderIrrevocable) RuleAddressSet(forwarderIrrevocable) {}
+ 18 : :
+ 19 : 4 : function _detectTransferRestriction(address, address, uint256) internal pure virtual override returns (uint8) {
+ 20 : 4 : return uint8(IERC1404Extend.REJECTED_CODE_BASE.TRANSFER_OK);
+ 21 : : }
+ 22 : :
+ 23 : 13 : function _detectTransferRestrictionFrom(address spender, address, address, uint256)
+ 24 : : internal
+ 25 : : view
+ 26 : : virtual
+ 27 : : override
+ 28 : : returns (uint8)
+ 29 : : {
+ 30 [ + ]: 13 : if (spender != address(0) && !_isAddressListed(spender)) {
+ 31 : 5 : return CODE_ADDRESS_SPENDER_NOT_WHITELISTED;
+ 32 : : }
+ 33 : 8 : return uint8(IERC1404Extend.REJECTED_CODE_BASE.TRANSFER_OK);
+ 34 : : }
+ 35 : :
+ 36 : 2 : function canReturnTransferRestrictionCode(uint8 restrictionCode) external pure override returns (bool) {
+ 37 : 2 : return restrictionCode == CODE_ADDRESS_SPENDER_NOT_WHITELISTED;
+ 38 : : }
+ 39 : :
+ 40 : 2 : function messageForTransferRestriction(uint8 restrictionCode)
+ 41 : : public
+ 42 : : pure
+ 43 : : override(IERC1404)
+ 44 : : returns (string memory)
+ 45 : : {
+ 46 [ + ]: 2 : if (restrictionCode == CODE_ADDRESS_SPENDER_NOT_WHITELISTED) {
+ 47 : 1 : return TEXT_ADDRESS_SPENDER_NOT_WHITELISTED;
+ 48 : : }
+ 49 : 1 : return TEXT_CODE_NOT_FOUND;
+ 50 : : }
+ 51 : :
+ 52 : : /**
+ 53 : : * @dev Regular transfers are always accepted by this rule.
+ 54 : : */
+ 55 : 1 : function transferred(address, address, uint256) public view override(IERC3643IComplianceContract) {}
+ 56 : :
+ 57 : 2 : function transferred(address spender, address from, address to, uint256 value) public view override(IRuleEngine) {
+ 58 : 2 : _transferredFrom(spender, from, to, value);
+ 59 : : }
+ 60 : :
+ 61 : 3 : function _transferred(address, address, uint256) internal view virtual override {
+ 62 : : // no-op: regular transfers are intentionally ignored by this rule
+ 63 : : }
+ 64 : :
+ 65 : 7 : function _transferredFrom(address spender, address from, address to, uint256 value) internal view virtual override {
+ 66 : 7 : uint8 code = _detectTransferRestrictionFrom(spender, from, to, value);
+ 67 [ + + ]: 7 : require(
+ 68 : : code == uint8(IERC1404Extend.REJECTED_CODE_BASE.TRANSFER_OK),
+ 69 : : RuleSpenderWhitelist_InvalidTransferFrom(address(this), spender, from, to, value, code)
+ 70 : : );
+ 71 : : }
+ 72 : : }
+
+ |
+
+
+
+
+
+
+
+
+
diff --git a/doc/coverage/coverage/abstract/base/RuleWhitelistBase.sol.func-sort-c.html b/doc/coverage/coverage/abstract/base/RuleWhitelistBase.sol.func-sort-c.html
index 33acb11..7c9168d 100644
--- a/doc/coverage/coverage/abstract/base/RuleWhitelistBase.sol.func-sort-c.html
+++ b/doc/coverage/coverage/abstract/base/RuleWhitelistBase.sol.func-sort-c.html
@@ -37,7 +37,7 @@
-
+
|
@@ -69,36 +69,36 @@
Hit count  |
- | RuleWhitelistBase._setCheckSpender |
+ RuleWhitelistBase._setCheckSpender |
2 |
- | RuleWhitelistBase.isVerified |
+ RuleWhitelistBase.isVerified |
2 |
- | RuleWhitelistBase.onlyCheckSpenderManager |
+ RuleWhitelistBase.onlyCheckSpenderManager |
3 |
- | RuleWhitelistBase.setCheckSpender |
+ RuleWhitelistBase.setCheckSpender |
3 |
- | RuleWhitelistBase._detectTransferRestrictionFrom |
+ RuleWhitelistBase._detectTransferRestrictionFrom |
18 |
- | RuleWhitelistBase.supportsInterface |
+ RuleWhitelistBase.supportsInterface |
27 |
- | RuleWhitelistBase._detectTransferRestriction |
- 51 |
+ RuleWhitelistBase._detectTransferRestriction |
+ 53 |
- | RuleWhitelistBase.constructor |
- 157 |
+ RuleWhitelistBase.constructor |
+ 159 |
diff --git a/doc/coverage/coverage/abstract/base/RuleWhitelistBase.sol.func.html b/doc/coverage/coverage/abstract/base/RuleWhitelistBase.sol.func.html
index d99a4bf..635f9f5 100644
--- a/doc/coverage/coverage/abstract/base/RuleWhitelistBase.sol.func.html
+++ b/doc/coverage/coverage/abstract/base/RuleWhitelistBase.sol.func.html
@@ -37,7 +37,7 @@
-
+
|
@@ -69,35 +69,35 @@
Hit count  |
- | RuleWhitelistBase._detectTransferRestriction |
- 51 |
+ RuleWhitelistBase._detectTransferRestriction |
+ 53 |
- | RuleWhitelistBase._detectTransferRestrictionFrom |
+ RuleWhitelistBase._detectTransferRestrictionFrom |
18 |
- | RuleWhitelistBase._setCheckSpender |
+ RuleWhitelistBase._setCheckSpender |
2 |
- | RuleWhitelistBase.constructor |
- 157 |
+ RuleWhitelistBase.constructor |
+ 159 |
- | RuleWhitelistBase.isVerified |
+ RuleWhitelistBase.isVerified |
2 |
- | RuleWhitelistBase.onlyCheckSpenderManager |
+ RuleWhitelistBase.onlyCheckSpenderManager |
3 |
- | RuleWhitelistBase.setCheckSpender |
+ RuleWhitelistBase.setCheckSpender |
3 |
- | RuleWhitelistBase.supportsInterface |
+ RuleWhitelistBase.supportsInterface |
27 |
diff --git a/doc/coverage/coverage/abstract/base/RuleWhitelistBase.sol.gcov.html b/doc/coverage/coverage/abstract/base/RuleWhitelistBase.sol.gcov.html
index cb753c6..d2383c6 100644
--- a/doc/coverage/coverage/abstract/base/RuleWhitelistBase.sol.gcov.html
+++ b/doc/coverage/coverage/abstract/base/RuleWhitelistBase.sol.gcov.html
@@ -37,7 +37,7 @@
-
+
|
@@ -75,81 +75,83 @@
4 : : import {RuleAddressSet} from "../RuleAddressSet/RuleAddressSet.sol";
5 : : import {RuleWhitelistShared} from "../core/RuleWhitelistShared.sol";
6 : : import {RuleTransferValidation} from "../core/RuleTransferValidation.sol";
- 7 : : import {IERC1404Extend} from "CMTAT/interfaces/tokenization/draft-IERC1404.sol";
- 8 : : import {IIdentityRegistryVerified} from "../../../interfaces/IIdentityRegistry.sol";
- 9 : :
- 10 : : /**
- 11 : : * @title RuleWhitelistBase
- 12 : : * @notice Core whitelist logic without access-control policy.
- 13 : : */
- 14 : : abstract contract RuleWhitelistBase is RuleAddressSet, RuleWhitelistShared, IIdentityRegistryVerified {
- 15 : 157 : constructor(address forwarderIrrevocable, bool checkSpender_) RuleAddressSet(forwarderIrrevocable) {
- 16 : 157 : checkSpender = checkSpender_;
- 17 : : }
- 18 : :
- 19 : 51 : function _detectTransferRestriction(address from, address to, uint256 /* value */ )
- 20 : : internal
- 21 : : view
- 22 : : virtual
- 23 : : override
- 24 : : returns (uint8)
- 25 : : {
- 26 [ + + ]: 51 : if (!isAddressListed(from)) {
- 27 : 13 : return CODE_ADDRESS_FROM_NOT_WHITELISTED;
- 28 [ + ]: 38 : } else if (!isAddressListed(to)) {
- 29 : 10 : return CODE_ADDRESS_TO_NOT_WHITELISTED;
- 30 : : }
- 31 : 28 : return uint8(REJECTED_CODE_BASE.TRANSFER_OK);
- 32 : : }
- 33 : :
- 34 : 18 : function _detectTransferRestrictionFrom(address spender, address from, address to, uint256 value)
- 35 : : internal
- 36 : : view
- 37 : : virtual
- 38 : : override
- 39 : : returns (uint8)
- 40 : : {
- 41 [ + ]: 18 : if (checkSpender && !isAddressListed(spender)) {
- 42 : 8 : return CODE_ADDRESS_SPENDER_NOT_WHITELISTED;
- 43 : : }
- 44 : 10 : return _detectTransferRestriction(from, to, value);
- 45 : : }
- 46 : :
- 47 : :
- 48 : 2 : function isVerified(address targetAddress)
- 49 : : public
- 50 : : view
- 51 : : virtual
- 52 : : override(IIdentityRegistryVerified)
- 53 : : returns (bool isListed)
- 54 : : {
- 55 : 2 : isListed = _isAddressListed(targetAddress);
- 56 : : }
- 57 : :
- 58 : 3 : function setCheckSpender(bool value) public virtual onlyCheckSpenderManager {
- 59 : 2 : _setCheckSpender(value);
- 60 : 2 : emit CheckSpenderUpdated(value);
- 61 : : }
- 62 : :
- 63 : 2 : function _setCheckSpender(bool value) internal virtual {
- 64 : 2 : checkSpender = value;
- 65 : : }
- 66 : :
- 67 : 27 : function supportsInterface(bytes4 interfaceId) public view virtual override(RuleTransferValidation) returns (bool) {
- 68 : 27 : return RuleTransferValidation.supportsInterface(interfaceId);
- 69 : : }
- 70 : :
- 71 : : /*//////////////////////////////////////////////////////////////
- 72 : : ACCESS CONTROL
- 73 : : //////////////////////////////////////////////////////////////*/
- 74 : :
- 75 : 3 : modifier onlyCheckSpenderManager() {
- 76 : 3 : _authorizeCheckSpenderManager();
- 77 : : _;
- 78 : : }
- 79 : :
- 80 : : function _authorizeCheckSpenderManager() internal view virtual;
- 81 : : }
+ 7 : : import {IIdentityRegistryVerified} from "../../../interfaces/IIdentityRegistry.sol";
+ 8 : :
+ 9 : : /**
+ 10 : : * @title RuleWhitelistBase
+ 11 : : * @notice Core whitelist logic without access-control policy.
+ 12 : : */
+ 13 : : abstract contract RuleWhitelistBase is RuleAddressSet, RuleWhitelistShared, IIdentityRegistryVerified {
+ 14 : 159 : constructor(address forwarderIrrevocable, bool checkSpender_) RuleAddressSet(forwarderIrrevocable) {
+ 15 : 159 : checkSpender = checkSpender_;
+ 16 : : }
+ 17 : :
+ 18 : 53 : function _detectTransferRestriction(
+ 19 : : address from,
+ 20 : : address to,
+ 21 : : uint256 /* value */
+ 22 : : )
+ 23 : : internal
+ 24 : : view
+ 25 : : virtual
+ 26 : : override
+ 27 : : returns (uint8)
+ 28 : : {
+ 29 [ + + ]: 53 : if (!isAddressListed(from)) {
+ 30 : 13 : return CODE_ADDRESS_FROM_NOT_WHITELISTED;
+ 31 [ + ]: 40 : } else if (!isAddressListed(to)) {
+ 32 : 10 : return CODE_ADDRESS_TO_NOT_WHITELISTED;
+ 33 : : }
+ 34 : 30 : return uint8(REJECTED_CODE_BASE.TRANSFER_OK);
+ 35 : : }
+ 36 : :
+ 37 : 18 : function _detectTransferRestrictionFrom(address spender, address from, address to, uint256 value)
+ 38 : : internal
+ 39 : : view
+ 40 : : virtual
+ 41 : : override
+ 42 : : returns (uint8)
+ 43 : : {
+ 44 [ + ]: 18 : if (checkSpender && !isAddressListed(spender)) {
+ 45 : 8 : return CODE_ADDRESS_SPENDER_NOT_WHITELISTED;
+ 46 : : }
+ 47 : 10 : return _detectTransferRestriction(from, to, value);
+ 48 : : }
+ 49 : :
+ 50 : 2 : function isVerified(address targetAddress)
+ 51 : : public
+ 52 : : view
+ 53 : : virtual
+ 54 : : override(IIdentityRegistryVerified)
+ 55 : : returns (bool isListed)
+ 56 : : {
+ 57 : 2 : isListed = _isAddressListed(targetAddress);
+ 58 : : }
+ 59 : :
+ 60 : 3 : function setCheckSpender(bool value) public virtual onlyCheckSpenderManager {
+ 61 : 2 : _setCheckSpender(value);
+ 62 : 2 : emit CheckSpenderUpdated(value);
+ 63 : : }
+ 64 : :
+ 65 : 2 : function _setCheckSpender(bool value) internal virtual {
+ 66 : 2 : checkSpender = value;
+ 67 : : }
+ 68 : :
+ 69 : 27 : function supportsInterface(bytes4 interfaceId) public view virtual override(RuleTransferValidation) returns (bool) {
+ 70 : 27 : return RuleTransferValidation.supportsInterface(interfaceId);
+ 71 : : }
+ 72 : :
+ 73 : : /*//////////////////////////////////////////////////////////////
+ 74 : : ACCESS CONTROL
+ 75 : : //////////////////////////////////////////////////////////////*/
+ 76 : :
+ 77 : 3 : modifier onlyCheckSpenderManager() {
+ 78 : 3 : _authorizeCheckSpenderManager();
+ 79 : : _;
+ 80 : : }
+ 81 : :
+ 82 : : function _authorizeCheckSpenderManager() internal view virtual;
+ 83 : : }
diff --git a/doc/coverage/coverage/abstract/base/RuleWhitelistWrapperBase.sol.func-sort-c.html b/doc/coverage/coverage/abstract/base/RuleWhitelistWrapperBase.sol.func-sort-c.html
index 62a206a..d3a41dc 100644
--- a/doc/coverage/coverage/abstract/base/RuleWhitelistWrapperBase.sol.func-sort-c.html
+++ b/doc/coverage/coverage/abstract/base/RuleWhitelistWrapperBase.sol.func-sort-c.html
@@ -37,7 +37,7 @@
-
+
|
@@ -69,15 +69,15 @@
Hit count  |
- | RuleWhitelistWrapperBase._transferred.1 |
+ RuleWhitelistWrapperBase._transferred.1 |
1 |
- | RuleWhitelistWrapperBase._msgData |
+ RuleWhitelistWrapperBase._msgData |
2 |
- | RuleWhitelistWrapperBase._setCheckSpender |
+ RuleWhitelistWrapperBase._setCheckSpender |
3 |
@@ -85,15 +85,15 @@
| 4 |
- | RuleWhitelistWrapperBase.onlyCheckSpenderManager |
+ RuleWhitelistWrapperBase.onlyCheckSpenderManager |
4 |
- | RuleWhitelistWrapperBase.setCheckSpender |
+ RuleWhitelistWrapperBase.setCheckSpender |
4 |
- | RuleWhitelistWrapperBase._transferred.0 |
+ RuleWhitelistWrapperBase._transferred.0 |
13 |
@@ -101,15 +101,15 @@
| 20 |
- | RuleWhitelistWrapperBase._detectTransferRestriction |
+ RuleWhitelistWrapperBase._detectTransferRestriction |
34 |
- | RuleWhitelistWrapperBase.constructor |
+ RuleWhitelistWrapperBase.constructor |
44 |
- | RuleWhitelistWrapperBase._detectTransferRestrictionForTargets |
+ RuleWhitelistWrapperBase._detectTransferRestrictionForTargets |
57 |
@@ -117,11 +117,11 @@
| 62 |
- | RuleWhitelistWrapperBase._msgSender |
+ RuleWhitelistWrapperBase._msgSender |
145 |
- | RuleWhitelistWrapperBase._contextSuffixLength |
+ RuleWhitelistWrapperBase._contextSuffixLength |
147 |
diff --git a/doc/coverage/coverage/abstract/base/RuleWhitelistWrapperBase.sol.func.html b/doc/coverage/coverage/abstract/base/RuleWhitelistWrapperBase.sol.func.html
index 643e123..31a047e 100644
--- a/doc/coverage/coverage/abstract/base/RuleWhitelistWrapperBase.sol.func.html
+++ b/doc/coverage/coverage/abstract/base/RuleWhitelistWrapperBase.sol.func.html
@@ -37,7 +37,7 @@
-
+
|
@@ -69,15 +69,15 @@
Hit count  |
- | RuleWhitelistWrapperBase._contextSuffixLength |
+ RuleWhitelistWrapperBase._contextSuffixLength |
147 |
- | RuleWhitelistWrapperBase._detectTransferRestriction |
+ RuleWhitelistWrapperBase._detectTransferRestriction |
34 |
- | RuleWhitelistWrapperBase._detectTransferRestrictionForTargets |
+ RuleWhitelistWrapperBase._detectTransferRestrictionForTargets |
57 |
@@ -85,27 +85,27 @@
| 20 |
- | RuleWhitelistWrapperBase._msgData |
+ RuleWhitelistWrapperBase._msgData |
2 |
- | RuleWhitelistWrapperBase._msgSender |
+ RuleWhitelistWrapperBase._msgSender |
145 |
- | RuleWhitelistWrapperBase._setCheckSpender |
+ RuleWhitelistWrapperBase._setCheckSpender |
3 |
- | RuleWhitelistWrapperBase._transferred.0 |
+ RuleWhitelistWrapperBase._transferred.0 |
13 |
- | RuleWhitelistWrapperBase._transferred.1 |
+ RuleWhitelistWrapperBase._transferred.1 |
1 |
- | RuleWhitelistWrapperBase.constructor |
+ RuleWhitelistWrapperBase.constructor |
44 |
@@ -113,11 +113,11 @@
| 4 |
- | RuleWhitelistWrapperBase.onlyCheckSpenderManager |
+ RuleWhitelistWrapperBase.onlyCheckSpenderManager |
4 |
- | RuleWhitelistWrapperBase.setCheckSpender |
+ RuleWhitelistWrapperBase.setCheckSpender |
4 |
diff --git a/doc/coverage/coverage/abstract/base/RuleWhitelistWrapperBase.sol.gcov.html b/doc/coverage/coverage/abstract/base/RuleWhitelistWrapperBase.sol.gcov.html
index 2a4e421..25e8229 100644
--- a/doc/coverage/coverage/abstract/base/RuleWhitelistWrapperBase.sol.gcov.html
+++ b/doc/coverage/coverage/abstract/base/RuleWhitelistWrapperBase.sol.gcov.html
@@ -37,7 +37,7 @@
-
+
|
@@ -82,43 +82,43 @@
11 : : import {RuleTransferValidation} from "../core/RuleTransferValidation.sol";
12 : : /* ==== RuleEngine === */
13 : : import {RulesManagementModule} from "RuleEngine/modules/RulesManagementModule.sol";
- 14 : : /* ==== CMTAT === */
- 15 : : import {IERC1404, IERC1404Extend} from "CMTAT/interfaces/tokenization/draft-IERC1404.sol";
- 16 : : /* ==== Interfaces === */
- 17 : : import {IAddressList} from "../../../interfaces/IAddressList.sol";
- 18 : : import {IIdentityRegistryVerified} from "../../../interfaces/IIdentityRegistry.sol";
- 19 : :
- 20 : : /**
- 21 : : * @title Wrapper to call several different whitelist rules (base)
- 22 : : * @dev Child rules must implement {IAddressList}.
- 23 : : */
- 24 : : abstract contract RuleWhitelistWrapperBase is
- 25 : : RulesManagementModule,
- 26 : : MetaTxModuleStandalone,
- 27 : : RuleWhitelistShared,
- 28 : : IIdentityRegistryVerified
- 29 : : {
- 30 : : /*//////////////////////////////////////////////////////////////
- 31 : : CONSTRUCTOR
- 32 : : //////////////////////////////////////////////////////////////*/
- 33 : : /**
- 34 : : * @param forwarderIrrevocable Address of the forwarder, required for the gasless support
- 35 : : */
- 36 : 44 : constructor(address forwarderIrrevocable, bool checkSpender_)
- 37 : : MetaTxModuleStandalone(forwarderIrrevocable)
- 38 : : {
- 39 : 44 : checkSpender = checkSpender_;
- 40 : : }
- 41 : :
- 42 : : /* ============ View Functions ============ */
- 43 : : /**
- 44 : : * @notice Go through all the whitelist rules to know if a restriction exists on the transfer
- 45 : : * @param from the origin address
- 46 : : * @param to the destination address
- 47 : : * @return The restricion code or REJECTED_CODE_BASE.TRANSFER_OK
- 48 : : *
- 49 : : */
- 50 : 34 : function _detectTransferRestriction(address from, address to, uint256 /* value */)
+ 14 : : /* ==== Interfaces === */
+ 15 : : import {IAddressList} from "../../../interfaces/IAddressList.sol";
+ 16 : : import {IIdentityRegistryVerified} from "../../../interfaces/IIdentityRegistry.sol";
+ 17 : :
+ 18 : : /**
+ 19 : : * @title Wrapper to call several different whitelist rules (base)
+ 20 : : * @dev Child rules must implement {IAddressList}.
+ 21 : : */
+ 22 : : abstract contract RuleWhitelistWrapperBase is
+ 23 : : RulesManagementModule,
+ 24 : : MetaTxModuleStandalone,
+ 25 : : RuleWhitelistShared,
+ 26 : : IIdentityRegistryVerified
+ 27 : : {
+ 28 : : /*//////////////////////////////////////////////////////////////
+ 29 : : CONSTRUCTOR
+ 30 : : //////////////////////////////////////////////////////////////*/
+ 31 : : /**
+ 32 : : * @param forwarderIrrevocable Address of the forwarder, required for the gasless support
+ 33 : : */
+ 34 : 44 : constructor(address forwarderIrrevocable, bool checkSpender_) MetaTxModuleStandalone(forwarderIrrevocable) {
+ 35 : 44 : checkSpender = checkSpender_;
+ 36 : : }
+ 37 : :
+ 38 : : /* ============ View Functions ============ */
+ 39 : : /**
+ 40 : : * @notice Go through all the whitelist rules to know if a restriction exists on the transfer
+ 41 : : * @param from the origin address
+ 42 : : * @param to the destination address
+ 43 : : * @return The restricion code or REJECTED_CODE_BASE.TRANSFER_OK
+ 44 : : *
+ 45 : : */
+ 46 : 34 : function _detectTransferRestriction(
+ 47 : : address from,
+ 48 : : address to,
+ 49 : : uint256 /* value */
+ 50 : : )
51 : : internal
52 : : view
53 : : virtual
@@ -184,138 +184,132 @@
113 : : * @notice Returns true if the address is listed in at least one child whitelist rule.
114 : : * @dev Delegates to the same child-rule scan used by transfer restriction checks.
115 : : */
- 116 : 4 : function isVerified(address targetAddress)
- 117 : : public
- 118 : : view
- 119 : : virtual
- 120 : : override(IIdentityRegistryVerified)
- 121 : : returns (bool)
- 122 : : {
- 123 : 4 : address[] memory targets = new address[](1);
- 124 : 4 : targets[0] = targetAddress;
- 125 : 4 : bool[] memory result = _detectTransferRestrictionForTargets(targets);
- 126 : 4 : return result[0];
- 127 : : }
- 128 : :
- 129 : : /* ============ Access control ============ */
- 130 : :
- 131 : : /**
- 132 : : * @notice Sets whether the rule should enforce spender-based checks.
- 133 : : * @dev
- 134 : : * - Restricted to holders of the manager role.
- 135 : : * - Updates the internal `checkSpender` flag.
- 136 : : * - Emits a {CheckSpenderUpdated} event.
- 137 : : * @param value The new state of the `checkSpender` flag.
- 138 : : */
- 139 : 4 : function setCheckSpender(bool value) public virtual onlyCheckSpenderManager {
- 140 : 3 : _setCheckSpender(value);
- 141 : 3 : emit CheckSpenderUpdated(value);
- 142 : : }
- 143 : :
- 144 : 13 : function _transferred(address from, address to, uint256 value)
- 145 : : internal
- 146 : : view
- 147 : : virtual
- 148 : : override(RulesManagementModule, RuleWhitelistShared)
- 149 : : {
- 150 : 13 : RuleWhitelistShared._transferred(from, to, value);
- 151 : : }
- 152 : :
- 153 : 1 : function _transferred(address spender, address from, address to, uint256 value)
- 154 : : internal
- 155 : : view
- 156 : : virtual
- 157 : : override(RulesManagementModule)
- 158 : : {
- 159 : 1 : RuleWhitelistShared._transferredFrom(spender, from, to, value);
- 160 : : }
- 161 : :
- 162 : : /*//////////////////////////////////////////////////////////////
- 163 : : INTERNAL/PRIVATE FUNCTIONS
- 164 : : //////////////////////////////////////////////////////////////*/
- 165 : :
- 166 : : /**
- 167 : : * @notice Evaluates target addresses across all child rules.
- 168 : : * @param targetAddress Addresses to validate (from/to[/spender]).
- 169 : : * @return result Boolean array aligned with targetAddress indicating if each address is listed.
- 170 : : */
- 171 : 57 : function _detectTransferRestrictionForTargets(address[] memory targetAddress)
- 172 : : internal
- 173 : : view
- 174 : : virtual
- 175 : : returns (bool[] memory)
- 176 : : {
- 177 : 57 : uint256 rulesLength = rulesCount();
- 178 : 57 : bool[] memory result = new bool[](targetAddress.length);
- 179 : 57 : for (uint256 i = 0; i < rulesLength; ++i) {
- 180 : : // Call the whitelist rules
- 181 : : // Gas cost grows with the number of rules. Keep the wrapper list bounded.
- 182 : 105 : bool[] memory isListed = IAddressList(rule(i)).areAddressesListed(targetAddress);
- 183 : 105 : for (uint256 j = 0; j < targetAddress.length; ++j) {
- 184 [ + ]: 85 : if (isListed[j]) {
- 185 : 85 : result[j] = true;
- 186 : : }
- 187 : : }
- 188 : :
- 189 : : // Break early if all listed
- 190 : 105 : bool allListed = true;
- 191 : 105 : for (uint256 k = 0; k < result.length; ++k) {
- 192 [ + ]: 201 : if (!result[k]) {
- 193 : 81 : allListed = false;
- 194 : 81 : break;
- 195 : : }
- 196 : : }
- 197 [ + ]: 24 : if (allListed) {
- 198 : 24 : break;
- 199 : : }
- 200 : : }
- 201 : 57 : return result;
- 202 : : }
- 203 : :
- 204 : : /**
- 205 : : * @notice Internal helper to update the `checkSpender` flag.
- 206 : : * @param value New flag value.
- 207 : : */
- 208 : 3 : function _setCheckSpender(bool value) internal virtual {
- 209 : 3 : checkSpender = value;
- 210 : : }
- 211 : :
- 212 : : /*//////////////////////////////////////////////////////////////
- 213 : : ACCESS CONTROL
- 214 : : //////////////////////////////////////////////////////////////*/
- 215 : :
- 216 : 4 : modifier onlyCheckSpenderManager() {
- 217 : 4 : _authorizeCheckSpenderManager();
- 218 : : _;
- 219 : : }
+ 116 : 4 : function isVerified(address targetAddress) public view virtual override(IIdentityRegistryVerified) returns (bool) {
+ 117 : 4 : address[] memory targets = new address[](1);
+ 118 : 4 : targets[0] = targetAddress;
+ 119 : 4 : bool[] memory result = _detectTransferRestrictionForTargets(targets);
+ 120 : 4 : return result[0];
+ 121 : : }
+ 122 : :
+ 123 : : /* ============ Access control ============ */
+ 124 : :
+ 125 : : /**
+ 126 : : * @notice Sets whether the rule should enforce spender-based checks.
+ 127 : : * @dev
+ 128 : : * - Restricted to holders of the manager role.
+ 129 : : * - Updates the internal `checkSpender` flag.
+ 130 : : * - Emits a {CheckSpenderUpdated} event.
+ 131 : : * @param value The new state of the `checkSpender` flag.
+ 132 : : */
+ 133 : 4 : function setCheckSpender(bool value) public virtual onlyCheckSpenderManager {
+ 134 : 3 : _setCheckSpender(value);
+ 135 : 3 : emit CheckSpenderUpdated(value);
+ 136 : : }
+ 137 : :
+ 138 : 13 : function _transferred(address from, address to, uint256 value)
+ 139 : : internal
+ 140 : : view
+ 141 : : virtual
+ 142 : : override(RulesManagementModule, RuleWhitelistShared)
+ 143 : : {
+ 144 : 13 : RuleWhitelistShared._transferred(from, to, value);
+ 145 : : }
+ 146 : :
+ 147 : 1 : function _transferred(address spender, address from, address to, uint256 value)
+ 148 : : internal
+ 149 : : view
+ 150 : : virtual
+ 151 : : override(RulesManagementModule)
+ 152 : : {
+ 153 : 1 : RuleWhitelistShared._transferredFrom(spender, from, to, value);
+ 154 : : }
+ 155 : :
+ 156 : : /*//////////////////////////////////////////////////////////////
+ 157 : : INTERNAL/PRIVATE FUNCTIONS
+ 158 : : //////////////////////////////////////////////////////////////*/
+ 159 : :
+ 160 : : /**
+ 161 : : * @notice Evaluates target addresses across all child rules.
+ 162 : : * @param targetAddress Addresses to validate (from/to[/spender]).
+ 163 : : * @return result Boolean array aligned with targetAddress indicating if each address is listed.
+ 164 : : */
+ 165 : 57 : function _detectTransferRestrictionForTargets(address[] memory targetAddress)
+ 166 : : internal
+ 167 : : view
+ 168 : : virtual
+ 169 : : returns (bool[] memory)
+ 170 : : {
+ 171 : 57 : uint256 rulesLength = rulesCount();
+ 172 : 57 : bool[] memory result = new bool[](targetAddress.length);
+ 173 : 57 : for (uint256 i = 0; i < rulesLength; ++i) {
+ 174 : : // Call the whitelist rules
+ 175 : : // Gas cost grows with the number of rules. Keep the wrapper list bounded.
+ 176 : 105 : bool[] memory isListed = IAddressList(rule(i)).areAddressesListed(targetAddress);
+ 177 : 105 : for (uint256 j = 0; j < targetAddress.length; ++j) {
+ 178 [ + ]: 85 : if (isListed[j]) {
+ 179 : 85 : result[j] = true;
+ 180 : : }
+ 181 : : }
+ 182 : :
+ 183 : : // Break early if all listed
+ 184 : 105 : bool allListed = true;
+ 185 : 105 : for (uint256 k = 0; k < result.length; ++k) {
+ 186 [ + ]: 201 : if (!result[k]) {
+ 187 : 81 : allListed = false;
+ 188 : 81 : break;
+ 189 : : }
+ 190 : : }
+ 191 [ + ]: 24 : if (allListed) {
+ 192 : 24 : break;
+ 193 : : }
+ 194 : : }
+ 195 : 57 : return result;
+ 196 : : }
+ 197 : :
+ 198 : : /**
+ 199 : : * @notice Internal helper to update the `checkSpender` flag.
+ 200 : : * @param value New flag value.
+ 201 : : */
+ 202 : 3 : function _setCheckSpender(bool value) internal virtual {
+ 203 : 3 : checkSpender = value;
+ 204 : : }
+ 205 : :
+ 206 : : /*//////////////////////////////////////////////////////////////
+ 207 : : ACCESS CONTROL
+ 208 : : //////////////////////////////////////////////////////////////*/
+ 209 : :
+ 210 : 4 : modifier onlyCheckSpenderManager() {
+ 211 : 4 : _authorizeCheckSpenderManager();
+ 212 : : _;
+ 213 : : }
+ 214 : :
+ 215 : : function _authorizeCheckSpenderManager() internal virtual;
+ 216 : :
+ 217 : : /*//////////////////////////////////////////////////////////////
+ 218 : : ERC-2771
+ 219 : : //////////////////////////////////////////////////////////////*/
220 : :
- 221 : : function _authorizeCheckSpenderManager() internal virtual;
- 222 : :
- 223 : : /*//////////////////////////////////////////////////////////////
- 224 : : ERC-2771
- 225 : : //////////////////////////////////////////////////////////////*/
- 226 : :
- 227 : : /**
- 228 : : * @dev This surcharge is not necessary if you do not use the MetaTxModule
- 229 : : */
- 230 : 145 : function _msgSender() internal view virtual override(ERC2771Context, Context) returns (address sender) {
- 231 : 145 : return ERC2771Context._msgSender();
- 232 : : }
- 233 : :
- 234 : : /**
- 235 : : * @dev This surcharge is not necessary if you do not use the MetaTxModule
- 236 : : */
- 237 : 2 : function _msgData() internal view virtual override(ERC2771Context, Context) returns (bytes calldata) {
- 238 : 2 : return ERC2771Context._msgData();
- 239 : : }
- 240 : :
- 241 : : /**
- 242 : : * @dev This surcharge is not necessary if you do not use the MetaTxModule
- 243 : : */
- 244 : 147 : function _contextSuffixLength() internal view virtual override(ERC2771Context, Context) returns (uint256) {
- 245 : 147 : return ERC2771Context._contextSuffixLength();
- 246 : : }
- 247 : : }
+ 221 : : /**
+ 222 : : * @dev This surcharge is not necessary if you do not use the MetaTxModule
+ 223 : : */
+ 224 : 145 : function _msgSender() internal view virtual override(ERC2771Context, Context) returns (address sender) {
+ 225 : 145 : return ERC2771Context._msgSender();
+ 226 : : }
+ 227 : :
+ 228 : : /**
+ 229 : : * @dev This surcharge is not necessary if you do not use the MetaTxModule
+ 230 : : */
+ 231 : 2 : function _msgData() internal view virtual override(ERC2771Context, Context) returns (bytes calldata) {
+ 232 : 2 : return ERC2771Context._msgData();
+ 233 : : }
+ 234 : :
+ 235 : : /**
+ 236 : : * @dev This surcharge is not necessary if you do not use the MetaTxModule
+ 237 : : */
+ 238 : 147 : function _contextSuffixLength() internal view virtual override(ERC2771Context, Context) returns (uint256) {
+ 239 : 147 : return ERC2771Context._contextSuffixLength();
+ 240 : : }
+ 241 : : }
diff --git a/doc/coverage/coverage/abstract/base/index-sort-b.html b/doc/coverage/coverage/abstract/base/index-sort-b.html
index c0dd6a1..52ef854 100644
--- a/doc/coverage/coverage/abstract/base/index-sort-b.html
+++ b/doc/coverage/coverage/abstract/base/index-sort-b.html
@@ -31,17 +31,17 @@
|
-
-
+
+
-
+
|
-
-
+
+
@@ -49,8 +49,8 @@
|
|
-
-
+
+
 |
@@ -81,6 +81,18 @@
Functions  |
Branches  |
+
+ | RuleSpenderWhitelistBase.sol |
+
+
+ |
+ 100.0 % |
+ 19 / 19 |
+ 100.0 % |
+ 8 / 8 |
+ 100.0 % |
+ 4 / 4 |
+
| RuleWhitelistBase.sol |
@@ -159,7 +171,7 @@
|
100.0 % |
- 102 / 102 |
+ 101 / 101 |
100.0 % |
33 / 33 |
100.0 % |
diff --git a/doc/coverage/coverage/abstract/base/index-sort-f.html b/doc/coverage/coverage/abstract/base/index-sort-f.html
index fd1f168..8838841 100644
--- a/doc/coverage/coverage/abstract/base/index-sort-f.html
+++ b/doc/coverage/coverage/abstract/base/index-sort-f.html
@@ -31,17 +31,17 @@
|
-
-
+
+
-
+
|
-
-
+
+
@@ -49,8 +49,8 @@
|
|
-
-
+
+
 |
@@ -81,6 +81,18 @@
Functions  |
Branches  |
+
+ | RuleSpenderWhitelistBase.sol |
+
+
+ |
+ 100.0 % |
+ 19 / 19 |
+ 100.0 % |
+ 8 / 8 |
+ 100.0 % |
+ 4 / 4 |
+
| RuleWhitelistBase.sol |
@@ -106,28 +118,28 @@
| 14 / 14 |
- | RuleIdentityRegistryBase.sol |
+ RuleMaxTotalSupplyBase.sol |
|
100.0 % |
- 51 / 51 |
+ 37 / 37 |
100.0 % |
12 / 12 |
100.0 % |
- 19 / 19 |
+ 11 / 11 |
- | RuleMaxTotalSupplyBase.sol |
+ RuleIdentityRegistryBase.sol |
|
100.0 % |
- 37 / 37 |
+ 51 / 51 |
100.0 % |
12 / 12 |
100.0 % |
- 11 / 11 |
+ 19 / 19 |
| RuleSanctionsListBase.sol |
@@ -159,7 +171,7 @@
100.0 % |
- 102 / 102 |
+ 101 / 101 |
100.0 % |
33 / 33 |
100.0 % |
diff --git a/doc/coverage/coverage/abstract/base/index-sort-l.html b/doc/coverage/coverage/abstract/base/index-sort-l.html
index 10250aa..30c4f5a 100644
--- a/doc/coverage/coverage/abstract/base/index-sort-l.html
+++ b/doc/coverage/coverage/abstract/base/index-sort-l.html
@@ -31,17 +31,17 @@
|
-
-
+
+
-
+
|
-
-
+
+
@@ -49,8 +49,8 @@
|
|
-
-
+
+
 |
@@ -81,6 +81,18 @@
Functions  |
Branches  |
+
+ | RuleSpenderWhitelistBase.sol |
+
+
+ |
+ 100.0 % |
+ 19 / 19 |
+ 100.0 % |
+ 8 / 8 |
+ 100.0 % |
+ 4 / 4 |
+
| RuleWhitelistBase.sol |
@@ -159,7 +171,7 @@
|
100.0 % |
- 102 / 102 |
+ 101 / 101 |
100.0 % |
33 / 33 |
100.0 % |
diff --git a/doc/coverage/coverage/abstract/base/index.html b/doc/coverage/coverage/abstract/base/index.html
index a56fb4a..85dc2b0 100644
--- a/doc/coverage/coverage/abstract/base/index.html
+++ b/doc/coverage/coverage/abstract/base/index.html
@@ -31,17 +31,17 @@
|
-
-
+
+
-
+
|
-
-
+
+
@@ -49,8 +49,8 @@
|
|
-
-
+
+
 |
@@ -99,7 +99,7 @@
100.0 % |
- 102 / 102 |
+ 101 / 101 |
100.0 % |
33 / 33 |
100.0 % |
@@ -141,6 +141,18 @@
100.0 % |
18 / 18 |
+
+ | RuleSpenderWhitelistBase.sol |
+
+
+ |
+ 100.0 % |
+ 19 / 19 |
+ 100.0 % |
+ 8 / 8 |
+ 100.0 % |
+ 4 / 4 |
+
| RuleWhitelistBase.sol |
diff --git a/doc/coverage/coverage/abstract/core/RuleNFTAdapter.sol.func-sort-c.html b/doc/coverage/coverage/abstract/core/RuleNFTAdapter.sol.func-sort-c.html
index 2a2a676..261668b 100644
--- a/doc/coverage/coverage/abstract/core/RuleNFTAdapter.sol.func-sort-c.html
+++ b/doc/coverage/coverage/abstract/core/RuleNFTAdapter.sol.func-sort-c.html
@@ -37,7 +37,7 @@
|
-
+
|
@@ -69,36 +69,36 @@
Hit count  |
- | RuleNFTAdapter.transferred.2 |
- 2 |
+ RuleNFTAdapter.transferred.2 |
+ 6 |
- | RuleNFTAdapter.transferred.3 |
- 2 |
+ RuleNFTAdapter.transferred.3 |
+ 6 |
- | RuleNFTAdapter.transferred.1 |
- 8 |
+ RuleNFTAdapter.transferred.1 |
+ 9 |
- | RuleNFTAdapter.canTransferFrom |
- 10 |
+ RuleNFTAdapter.canTransferFrom |
+ 11 |
- | RuleNFTAdapter.detectTransferRestrictionFrom |
- 12 |
-
-
- | RuleNFTAdapter.transferred.0 |
+ RuleNFTAdapter.detectTransferRestrictionFrom |
13 |
- | RuleNFTAdapter.canTransfer |
+ RuleNFTAdapter.transferred.0 |
14 |
- | RuleNFTAdapter.detectTransferRestriction |
- 16 |
+ RuleNFTAdapter.canTransfer |
+ 15 |
+
+
+ | RuleNFTAdapter.detectTransferRestriction |
+ 17 |
diff --git a/doc/coverage/coverage/abstract/core/RuleNFTAdapter.sol.func.html b/doc/coverage/coverage/abstract/core/RuleNFTAdapter.sol.func.html
index 0ee21a8..b4334cd 100644
--- a/doc/coverage/coverage/abstract/core/RuleNFTAdapter.sol.func.html
+++ b/doc/coverage/coverage/abstract/core/RuleNFTAdapter.sol.func.html
@@ -37,7 +37,7 @@
-
+
|
@@ -69,36 +69,36 @@
Hit count  |
- | RuleNFTAdapter.canTransfer |
- 14 |
+ RuleNFTAdapter.canTransfer |
+ 15 |
- | RuleNFTAdapter.canTransferFrom |
- 10 |
+ RuleNFTAdapter.canTransferFrom |
+ 11 |
- | RuleNFTAdapter.detectTransferRestriction |
- 16 |
+ RuleNFTAdapter.detectTransferRestriction |
+ 17 |
- | RuleNFTAdapter.detectTransferRestrictionFrom |
- 12 |
+ RuleNFTAdapter.detectTransferRestrictionFrom |
+ 13 |
- | RuleNFTAdapter.transferred.0 |
- 13 |
+ RuleNFTAdapter.transferred.0 |
+ 14 |
- | RuleNFTAdapter.transferred.1 |
- 8 |
+ RuleNFTAdapter.transferred.1 |
+ 9 |
- | RuleNFTAdapter.transferred.2 |
- 2 |
+ RuleNFTAdapter.transferred.2 |
+ 6 |
- | RuleNFTAdapter.transferred.3 |
- 2 |
+ RuleNFTAdapter.transferred.3 |
+ 6 |
diff --git a/doc/coverage/coverage/abstract/core/RuleNFTAdapter.sol.gcov.html b/doc/coverage/coverage/abstract/core/RuleNFTAdapter.sol.gcov.html
index ea62082..5934b99 100644
--- a/doc/coverage/coverage/abstract/core/RuleNFTAdapter.sol.gcov.html
+++ b/doc/coverage/coverage/abstract/core/RuleNFTAdapter.sol.gcov.html
@@ -37,7 +37,7 @@
-
+
|
@@ -88,119 +88,151 @@
17 : : * @dev Delegates tokenId overloads to RuleTransferValidation's internal hooks.
18 : : */
19 : : abstract contract RuleNFTAdapter is RuleTransferValidation, IERC7943NonFungibleComplianceExtend, ITransferContext {
- 20 : : bytes4 internal constant TRANSFERRED_SELECTOR_ERC3643 =
- 21 : : IERC3643IComplianceContract.transferred.selector;
- 22 : : bytes4 internal constant TRANSFERRED_SELECTOR_RULE_ENGINE =
- 23 : : IRuleEngine.transferred.selector;
- 24 : : bytes4 internal constant TRANSFERRED_SELECTOR_ERC7943 =
- 25 : : bytes4(keccak256("transferred(address,address,uint256,uint256)"));
- 26 : : bytes4 internal constant TRANSFERRED_SELECTOR_ERC7943_FROM =
- 27 : : bytes4(keccak256("transferred(address,address,address,uint256,uint256)"));
- 28 : : /**
- 29 : : * @notice Internal hook for post-transfer validation or state updates.
- 30 : : */
- 31 : : function _transferred(address from, address to, uint256 value) internal virtual;
- 32 : :
- 33 : : /**
- 34 : : * @notice Internal hook for post-transfer validation or state updates (spender-aware).
- 35 : : */
- 36 : : function _transferredFrom(address spender, address from, address to, uint256 value) internal virtual;
- 37 : : /**
- 38 : : * @inheritdoc IERC7943NonFungibleComplianceExtend
- 39 : : */
- 40 : 16 : function detectTransferRestriction(address from, address to, uint256 /* tokenId */, uint256 value)
- 41 : : public
- 42 : : view
- 43 : : virtual
- 44 : : override(IERC7943NonFungibleComplianceExtend)
- 45 : : returns (uint8)
- 46 : : {
- 47 : 16 : return _detectTransferRestriction(from, to, value);
- 48 : : }
- 49 : :
- 50 : : /**
- 51 : : * @inheritdoc IERC7943NonFungibleComplianceExtend
- 52 : : */
- 53 : 12 : function detectTransferRestrictionFrom(
- 54 : : address spender,
- 55 : : address from,
- 56 : : address to,
- 57 : : uint256 /* tokenId */,
- 58 : : uint256 value
- 59 : : ) public view virtual override(IERC7943NonFungibleComplianceExtend) returns (uint8) {
- 60 : 12 : return _detectTransferRestrictionFrom(spender, from, to, value);
- 61 : : }
- 62 : :
- 63 : : /**
- 64 : : * @inheritdoc IERC7943NonFungibleCompliance
- 65 : : */
- 66 : 14 : function canTransfer(address from, address to, uint256 /* tokenId */, uint256 amount)
- 67 : : public
- 68 : : view
- 69 : : override(IERC7943NonFungibleCompliance)
- 70 : : returns (bool)
- 71 : : {
- 72 : 14 : return _detectTransferRestriction(from, to, amount) == uint8(IERC1404Extend.REJECTED_CODE_BASE.TRANSFER_OK);
- 73 : : }
- 74 : :
- 75 : : /**
- 76 : : * @inheritdoc IERC7943NonFungibleComplianceExtend
- 77 : : */
- 78 : 10 : function canTransferFrom(address spender, address from, address to, uint256 /* tokenId */, uint256 value)
+ 20 : : bytes4 internal constant TRANSFERRED_SELECTOR_ERC3643 = IERC3643IComplianceContract.transferred.selector;
+ 21 : : bytes4 internal constant TRANSFERRED_SELECTOR_RULE_ENGINE = IRuleEngine.transferred.selector;
+ 22 : : bytes4 internal constant TRANSFERRED_SELECTOR_ERC7943 =
+ 23 : : bytes4(keccak256("transferred(address,address,uint256,uint256)"));
+ 24 : : bytes4 internal constant TRANSFERRED_SELECTOR_ERC7943_FROM =
+ 25 : : bytes4(keccak256("transferred(address,address,address,uint256,uint256)"));
+ 26 : : /**
+ 27 : : * @notice Internal hook for post-transfer validation or state updates.
+ 28 : : */
+ 29 : : function _transferred(address from, address to, uint256 value) internal virtual;
+ 30 : :
+ 31 : : /**
+ 32 : : * @notice Internal hook for post-transfer validation or state updates (spender-aware).
+ 33 : : */
+ 34 : : function _transferredFrom(address spender, address from, address to, uint256 value) internal virtual;
+ 35 : :
+ 36 : : /**
+ 37 : : * @inheritdoc IERC7943NonFungibleComplianceExtend
+ 38 : : */
+ 39 : 17 : function detectTransferRestriction(
+ 40 : : address from,
+ 41 : : address to,
+ 42 : : uint256,
+ 43 : : /* tokenId */
+ 44 : : uint256 value
+ 45 : : )
+ 46 : : public
+ 47 : : view
+ 48 : : virtual
+ 49 : : override(IERC7943NonFungibleComplianceExtend)
+ 50 : : returns (uint8)
+ 51 : : {
+ 52 : 17 : return _detectTransferRestriction(from, to, value);
+ 53 : : }
+ 54 : :
+ 55 : : /**
+ 56 : : * @inheritdoc IERC7943NonFungibleComplianceExtend
+ 57 : : */
+ 58 : 13 : function detectTransferRestrictionFrom(
+ 59 : : address spender,
+ 60 : : address from,
+ 61 : : address to,
+ 62 : : uint256,
+ 63 : : /* tokenId */
+ 64 : : uint256 value
+ 65 : : ) public view virtual override(IERC7943NonFungibleComplianceExtend) returns (uint8) {
+ 66 : 13 : return _detectTransferRestrictionFrom(spender, from, to, value);
+ 67 : : }
+ 68 : :
+ 69 : : /**
+ 70 : : * @inheritdoc IERC7943NonFungibleCompliance
+ 71 : : */
+ 72 : 15 : function canTransfer(
+ 73 : : address from,
+ 74 : : address to,
+ 75 : : uint256,
+ 76 : : /* tokenId */
+ 77 : : uint256 amount
+ 78 : : )
79 : : public
80 : : view
- 81 : : virtual
- 82 : : override(IERC7943NonFungibleComplianceExtend)
- 83 : : returns (bool)
- 84 : : {
- 85 : 10 : return _detectTransferRestrictionFrom(spender, from, to, value)
- 86 : : == uint8(IERC1404Extend.REJECTED_CODE_BASE.TRANSFER_OK);
- 87 : : }
- 88 : :
- 89 : : /**
- 90 : : * @inheritdoc IERC7943NonFungibleComplianceExtend
- 91 : : */
- 92 : 13 : function transferred(address from, address to, uint256 /* tokenId */, uint256 value)
- 93 : : public
- 94 : : virtual
- 95 : : override(IERC7943NonFungibleComplianceExtend)
- 96 : : {
- 97 : 13 : _transferred(from, to, value);
- 98 : : }
- 99 : :
- 100 : : /**
- 101 : : * @inheritdoc IERC7943NonFungibleComplianceExtend
- 102 : : */
- 103 : 8 : function transferred(address spender, address from, address to, uint256 /* tokenId */, uint256 value)
- 104 : : public
- 105 : : virtual
- 106 : : override(IERC7943NonFungibleComplianceExtend)
- 107 : : {
- 108 : 8 : _transferredFrom(spender, from, to, value);
- 109 : : }
- 110 : :
- 111 : : /**
- 112 : : * @inheritdoc ITransferContext
- 113 : : */
- 114 : 2 : function transferred(MultiTokenTransferContext calldata ctx) external virtual override {
- 115 [ + + ]: 2 : if (ctx.sender != address(0)) {
- 116 : 1 : _transferredFrom(ctx.sender, ctx.from, ctx.to, ctx.value);
- 117 : : } else {
- 118 : 1 : _transferred(ctx.from, ctx.to, ctx.value);
- 119 : : }
- 120 : : }
- 121 : :
- 122 : : /**
- 123 : : * @inheritdoc ITransferContext
- 124 : : */
- 125 : 2 : function transferred(FungibleTransferContext calldata ctx) external virtual override {
- 126 [ + + ]: 2 : if (ctx.sender != address(0)) {
- 127 : 1 : _transferredFrom(ctx.sender, ctx.from, ctx.to, ctx.value);
- 128 : : } else {
- 129 : 1 : _transferred(ctx.from, ctx.to, ctx.value);
- 130 : : }
- 131 : : }
- 132 : : }
+ 81 : : override(IERC7943NonFungibleCompliance)
+ 82 : : returns (bool)
+ 83 : : {
+ 84 : 15 : return _detectTransferRestriction(from, to, amount) == uint8(IERC1404Extend.REJECTED_CODE_BASE.TRANSFER_OK);
+ 85 : : }
+ 86 : :
+ 87 : : /**
+ 88 : : * @inheritdoc IERC7943NonFungibleComplianceExtend
+ 89 : : */
+ 90 : 11 : function canTransferFrom(
+ 91 : : address spender,
+ 92 : : address from,
+ 93 : : address to,
+ 94 : : uint256,
+ 95 : : /* tokenId */
+ 96 : : uint256 value
+ 97 : : )
+ 98 : : public
+ 99 : : view
+ 100 : : virtual
+ 101 : : override(IERC7943NonFungibleComplianceExtend)
+ 102 : : returns (bool)
+ 103 : : {
+ 104 : 11 : return _detectTransferRestrictionFrom(spender, from, to, value)
+ 105 : : == uint8(IERC1404Extend.REJECTED_CODE_BASE.TRANSFER_OK);
+ 106 : : }
+ 107 : :
+ 108 : : /**
+ 109 : : * @inheritdoc IERC7943NonFungibleComplianceExtend
+ 110 : : */
+ 111 : 14 : function transferred(
+ 112 : : address from,
+ 113 : : address to,
+ 114 : : uint256,
+ 115 : : /* tokenId */
+ 116 : : uint256 value
+ 117 : : )
+ 118 : : public
+ 119 : : virtual
+ 120 : : override(IERC7943NonFungibleComplianceExtend)
+ 121 : : {
+ 122 : 14 : _transferred(from, to, value);
+ 123 : : }
+ 124 : :
+ 125 : : /**
+ 126 : : * @inheritdoc IERC7943NonFungibleComplianceExtend
+ 127 : : */
+ 128 : 9 : function transferred(
+ 129 : : address spender,
+ 130 : : address from,
+ 131 : : address to,
+ 132 : : uint256,
+ 133 : : /* tokenId */
+ 134 : : uint256 value
+ 135 : : )
+ 136 : : public
+ 137 : : virtual
+ 138 : : override(IERC7943NonFungibleComplianceExtend)
+ 139 : : {
+ 140 : 9 : _transferredFrom(spender, from, to, value);
+ 141 : : }
+ 142 : :
+ 143 : : /**
+ 144 : : * @inheritdoc ITransferContext
+ 145 : : */
+ 146 : 6 : function transferred(MultiTokenTransferContext calldata ctx) external virtual override {
+ 147 [ + + ]: 6 : if (ctx.sender != address(0) && ctx.sender != ctx.from) {
+ 148 : 3 : _transferredFrom(ctx.sender, ctx.from, ctx.to, ctx.value);
+ 149 : : } else {
+ 150 : 3 : _transferred(ctx.from, ctx.to, ctx.value);
+ 151 : : }
+ 152 : : }
+ 153 : :
+ 154 : : /**
+ 155 : : * @inheritdoc ITransferContext
+ 156 : : */
+ 157 : 6 : function transferred(FungibleTransferContext calldata ctx) external virtual override {
+ 158 [ + + ]: 6 : if (ctx.sender != address(0) && ctx.sender != ctx.from) {
+ 159 : 3 : _transferredFrom(ctx.sender, ctx.from, ctx.to, ctx.value);
+ 160 : : } else {
+ 161 : 3 : _transferred(ctx.from, ctx.to, ctx.value);
+ 162 : : }
+ 163 : : }
+ 164 : : }
diff --git a/doc/coverage/coverage/abstract/core/RuleTransferValidation.sol.func-sort-c.html b/doc/coverage/coverage/abstract/core/RuleTransferValidation.sol.func-sort-c.html
index 13a68b1..ec2abb0 100644
--- a/doc/coverage/coverage/abstract/core/RuleTransferValidation.sol.func-sort-c.html
+++ b/doc/coverage/coverage/abstract/core/RuleTransferValidation.sol.func-sort-c.html
@@ -37,7 +37,7 @@
-
+
|
@@ -69,24 +69,24 @@
Hit count  |
- | RuleTransferValidation.canTransferFrom |
- 12 |
+ RuleTransferValidation.canTransferFrom |
+ 14 |
- | RuleTransferValidation.canTransfer |
- 20 |
+ RuleTransferValidation.canTransfer |
+ 21 |
- | RuleTransferValidation.detectTransferRestrictionFrom |
- 36 |
+ RuleTransferValidation.detectTransferRestrictionFrom |
+ 38 |
- | RuleTransferValidation.supportsInterface |
- 195 |
+ RuleTransferValidation.supportsInterface |
+ 196 |
- | RuleTransferValidation.detectTransferRestriction |
- 348 |
+ RuleTransferValidation.detectTransferRestriction |
+ 349 |
diff --git a/doc/coverage/coverage/abstract/core/RuleTransferValidation.sol.func.html b/doc/coverage/coverage/abstract/core/RuleTransferValidation.sol.func.html
index 91fe5a9..d272ef1 100644
--- a/doc/coverage/coverage/abstract/core/RuleTransferValidation.sol.func.html
+++ b/doc/coverage/coverage/abstract/core/RuleTransferValidation.sol.func.html
@@ -37,7 +37,7 @@
-
+
|
@@ -69,24 +69,24 @@
Hit count  |
- | RuleTransferValidation.canTransfer |
- 20 |
+ RuleTransferValidation.canTransfer |
+ 21 |
- | RuleTransferValidation.canTransferFrom |
- 12 |
+ RuleTransferValidation.canTransferFrom |
+ 14 |
- | RuleTransferValidation.detectTransferRestriction |
- 348 |
+ RuleTransferValidation.detectTransferRestriction |
+ 349 |
- | RuleTransferValidation.detectTransferRestrictionFrom |
- 36 |
+ RuleTransferValidation.detectTransferRestrictionFrom |
+ 38 |
- | RuleTransferValidation.supportsInterface |
- 195 |
+ RuleTransferValidation.supportsInterface |
+ 196 |
diff --git a/doc/coverage/coverage/abstract/core/RuleTransferValidation.sol.gcov.html b/doc/coverage/coverage/abstract/core/RuleTransferValidation.sol.gcov.html
index 67c4f57..7d4c05a 100644
--- a/doc/coverage/coverage/abstract/core/RuleTransferValidation.sol.gcov.html
+++ b/doc/coverage/coverage/abstract/core/RuleTransferValidation.sol.gcov.html
@@ -37,7 +37,7 @@
-
+
|
@@ -83,95 +83,101 @@
12 : : /* ==== Modules === */
13 : : import {VersionModule} from "../../../../modules/VersionModule.sol";
14 : :
- 15 : : abstract contract RuleTransferValidation is VersionModule, IERC1404Extend, IERC3643ComplianceRead, IERC7551Compliance, IRule {
- 16 : : /**
- 17 : : * @notice Internal transfer restriction check.
- 18 : : * @param from the origin address
- 19 : : * @param to the destination address
- 20 : : * @param value amount to transfer
- 21 : : * @return restrictionCode The restriction code for this rule.
- 22 : : */
- 23 : : function _detectTransferRestriction(address from, address to, uint256 value)
- 24 : : internal
- 25 : : view
- 26 : : virtual
- 27 : : returns (uint8 restrictionCode);
- 28 : :
- 29 : : /**
- 30 : : * @notice Internal transfer restriction check for spender-initiated transfers.
- 31 : : * @param spender the caller executing the transfer
- 32 : : * @param from the origin address
- 33 : : * @param to the destination address
- 34 : : * @param value amount to transfer
- 35 : : * @return restrictionCode The restriction code for this rule.
- 36 : : */
- 37 : : function _detectTransferRestrictionFrom(address spender, address from, address to, uint256 value)
- 38 : : internal
- 39 : : view
- 40 : : virtual
- 41 : : returns (uint8 restrictionCode);
- 42 : :
- 43 : : /**
- 44 : : * @inheritdoc IERC1404
- 45 : : */
- 46 : 348 : function detectTransferRestriction(address from, address to, uint256 value)
- 47 : : public
- 48 : : view
- 49 : : virtual
- 50 : : override(IERC1404)
- 51 : : returns (uint8)
- 52 : : {
- 53 : 348 : return _detectTransferRestriction(from, to, value);
- 54 : : }
- 55 : :
- 56 : : /**
- 57 : : * @inheritdoc IERC1404Extend
- 58 : : */
- 59 : 36 : function detectTransferRestrictionFrom(address spender, address from, address to, uint256 value)
- 60 : : public
- 61 : : view
- 62 : : virtual
- 63 : : override(IERC1404Extend)
- 64 : : returns (uint8)
- 65 : : {
- 66 : 36 : return _detectTransferRestrictionFrom(spender, from, to, value);
- 67 : : }
- 68 : :
- 69 : : /**
- 70 : : * @notice Validate a transfer
- 71 : : * @param from the origin address
- 72 : : * @param to the destination address
- 73 : : * @param amount to transfer
- 74 : : * @return isValid => true if the transfer is valid, false otherwise
- 75 : : *
- 76 : : */
- 77 : 20 : function canTransfer(address from, address to, uint256 amount)
- 78 : : public
- 79 : : view
- 80 : : override(IERC3643ComplianceRead)
- 81 : : returns (bool isValid)
- 82 : : {
- 83 : 20 : return _detectTransferRestriction(from, to, amount) == uint8(IERC1404Extend.REJECTED_CODE_BASE.TRANSFER_OK);
- 84 : : }
- 85 : :
- 86 : : /**
- 87 : : * @inheritdoc IERC7551Compliance
- 88 : : */
- 89 : 12 : function canTransferFrom(address spender, address from, address to, uint256 value)
- 90 : : public
- 91 : : view
- 92 : : virtual
- 93 : : override(IERC7551Compliance)
- 94 : : returns (bool)
- 95 : : {
- 96 : 12 : return _detectTransferRestrictionFrom(spender, from, to, value)
- 97 : : == uint8(IERC1404Extend.REJECTED_CODE_BASE.TRANSFER_OK);
- 98 : : }
- 99 : :
- 100 : 195 : function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
- 101 : 195 : return interfaceId == type(IRule).interfaceId || interfaceId == RuleInterfaceId.IRULE_INTERFACE_ID;
- 102 : : }
- 103 : : }
+ 15 : : abstract contract RuleTransferValidation is
+ 16 : : VersionModule,
+ 17 : : IERC1404Extend,
+ 18 : : IERC3643ComplianceRead,
+ 19 : : IERC7551Compliance,
+ 20 : : IRule
+ 21 : : {
+ 22 : : /**
+ 23 : : * @notice Internal transfer restriction check.
+ 24 : : * @param from the origin address
+ 25 : : * @param to the destination address
+ 26 : : * @param value amount to transfer
+ 27 : : * @return restrictionCode The restriction code for this rule.
+ 28 : : */
+ 29 : : function _detectTransferRestriction(address from, address to, uint256 value)
+ 30 : : internal
+ 31 : : view
+ 32 : : virtual
+ 33 : : returns (uint8 restrictionCode);
+ 34 : :
+ 35 : : /**
+ 36 : : * @notice Internal transfer restriction check for spender-initiated transfers.
+ 37 : : * @param spender the caller executing the transfer
+ 38 : : * @param from the origin address
+ 39 : : * @param to the destination address
+ 40 : : * @param value amount to transfer
+ 41 : : * @return restrictionCode The restriction code for this rule.
+ 42 : : */
+ 43 : : function _detectTransferRestrictionFrom(address spender, address from, address to, uint256 value)
+ 44 : : internal
+ 45 : : view
+ 46 : : virtual
+ 47 : : returns (uint8 restrictionCode);
+ 48 : :
+ 49 : : /**
+ 50 : : * @inheritdoc IERC1404
+ 51 : : */
+ 52 : 349 : function detectTransferRestriction(address from, address to, uint256 value)
+ 53 : : public
+ 54 : : view
+ 55 : : virtual
+ 56 : : override(IERC1404)
+ 57 : : returns (uint8)
+ 58 : : {
+ 59 : 349 : return _detectTransferRestriction(from, to, value);
+ 60 : : }
+ 61 : :
+ 62 : : /**
+ 63 : : * @inheritdoc IERC1404Extend
+ 64 : : */
+ 65 : 38 : function detectTransferRestrictionFrom(address spender, address from, address to, uint256 value)
+ 66 : : public
+ 67 : : view
+ 68 : : virtual
+ 69 : : override(IERC1404Extend)
+ 70 : : returns (uint8)
+ 71 : : {
+ 72 : 38 : return _detectTransferRestrictionFrom(spender, from, to, value);
+ 73 : : }
+ 74 : :
+ 75 : : /**
+ 76 : : * @notice Validate a transfer
+ 77 : : * @param from the origin address
+ 78 : : * @param to the destination address
+ 79 : : * @param amount to transfer
+ 80 : : * @return isValid => true if the transfer is valid, false otherwise
+ 81 : : *
+ 82 : : */
+ 83 : 21 : function canTransfer(address from, address to, uint256 amount)
+ 84 : : public
+ 85 : : view
+ 86 : : override(IERC3643ComplianceRead)
+ 87 : : returns (bool isValid)
+ 88 : : {
+ 89 : 21 : return _detectTransferRestriction(from, to, amount) == uint8(IERC1404Extend.REJECTED_CODE_BASE.TRANSFER_OK);
+ 90 : : }
+ 91 : :
+ 92 : : /**
+ 93 : : * @inheritdoc IERC7551Compliance
+ 94 : : */
+ 95 : 14 : function canTransferFrom(address spender, address from, address to, uint256 value)
+ 96 : : public
+ 97 : : view
+ 98 : : virtual
+ 99 : : override(IERC7551Compliance)
+ 100 : : returns (bool)
+ 101 : : {
+ 102 : 14 : return _detectTransferRestrictionFrom(spender, from, to, value)
+ 103 : : == uint8(IERC1404Extend.REJECTED_CODE_BASE.TRANSFER_OK);
+ 104 : : }
+ 105 : :
+ 106 : 196 : function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
+ 107 : 196 : return interfaceId == type(IRule).interfaceId || interfaceId == RuleInterfaceId.IRULE_INTERFACE_ID;
+ 108 : : }
+ 109 : : }
diff --git a/doc/coverage/coverage/abstract/core/RuleWhitelistShared.sol.func-sort-c.html b/doc/coverage/coverage/abstract/core/RuleWhitelistShared.sol.func-sort-c.html
index 588fc1b..90e0227 100644
--- a/doc/coverage/coverage/abstract/core/RuleWhitelistShared.sol.func-sort-c.html
+++ b/doc/coverage/coverage/abstract/core/RuleWhitelistShared.sol.func-sort-c.html
@@ -31,13 +31,13 @@
|
-
-
+
+
-
+
|
@@ -69,7 +69,7 @@
Hit count  |
- | RuleWhitelistShared.transferred.1 |
+ RuleWhitelistShared.transferred.1 |
4 |
@@ -77,20 +77,20 @@
| 10 |
- | RuleWhitelistShared._transferredFrom |
+ RuleWhitelistShared._transferredFrom |
11 |
- | RuleWhitelistShared.messageForTransferRestriction |
+ RuleWhitelistShared.messageForTransferRestriction |
14 |
- | RuleWhitelistShared.transferred.0 |
+ RuleWhitelistShared.transferred.0 |
19 |
- | RuleWhitelistShared._transferred |
- 26 |
+ RuleWhitelistShared._transferred |
+ 28 |
diff --git a/doc/coverage/coverage/abstract/core/RuleWhitelistShared.sol.func.html b/doc/coverage/coverage/abstract/core/RuleWhitelistShared.sol.func.html
index 956fe25..f0a8b05 100644
--- a/doc/coverage/coverage/abstract/core/RuleWhitelistShared.sol.func.html
+++ b/doc/coverage/coverage/abstract/core/RuleWhitelistShared.sol.func.html
@@ -31,13 +31,13 @@
|
-
-
+
+
-
+
|
@@ -69,11 +69,11 @@
Hit count  |
- | RuleWhitelistShared._transferred |
- 26 |
+ RuleWhitelistShared._transferred |
+ 28 |
- | RuleWhitelistShared._transferredFrom |
+ RuleWhitelistShared._transferredFrom |
11 |
@@ -81,15 +81,15 @@
| 10 |
- | RuleWhitelistShared.messageForTransferRestriction |
+ RuleWhitelistShared.messageForTransferRestriction |
14 |
- | RuleWhitelistShared.transferred.0 |
+ RuleWhitelistShared.transferred.0 |
19 |
- | RuleWhitelistShared.transferred.1 |
+ RuleWhitelistShared.transferred.1 |
4 |
diff --git a/doc/coverage/coverage/abstract/core/RuleWhitelistShared.sol.gcov.html b/doc/coverage/coverage/abstract/core/RuleWhitelistShared.sol.gcov.html
index e0552e4..d899353 100644
--- a/doc/coverage/coverage/abstract/core/RuleWhitelistShared.sol.gcov.html
+++ b/doc/coverage/coverage/abstract/core/RuleWhitelistShared.sol.gcov.html
@@ -31,13 +31,13 @@
|
-
-
+
+
-
+
|
@@ -103,88 +103,82 @@
32 : : */
33 : 10 : function canReturnTransferRestrictionCode(uint8 restrictionCode) external pure override returns (bool isKnown) {
34 : 10 : return restrictionCode == CODE_ADDRESS_FROM_NOT_WHITELISTED
- 35 : 5 : || restrictionCode == CODE_ADDRESS_TO_NOT_WHITELISTED || restrictionCode == CODE_ADDRESS_SPENDER_NOT_WHITELISTED;
- 36 : : }
- 37 : :
- 38 : : /**
- 39 : : * @notice Returns the human-readable message corresponding to a restriction code.
- 40 : : * @dev
- 41 : : * Returns a descriptive text that explains why a transfer was restricted.
- 42 : : * @param restrictionCode The restriction code to decode.
- 43 : : * @return message A human-readable explanation of the restriction.
- 44 : : */
- 45 : 14 : function messageForTransferRestriction(uint8 restrictionCode)
- 46 : : external
- 47 : : pure
- 48 : : override
- 49 : : returns (string memory message)
- 50 : : {
- 51 [ + + ]: 14 : if (restrictionCode == CODE_ADDRESS_FROM_NOT_WHITELISTED) {
- 52 : 6 : return TEXT_ADDRESS_FROM_NOT_WHITELISTED;
- 53 [ + + ]: 8 : } else if (restrictionCode == CODE_ADDRESS_TO_NOT_WHITELISTED) {
- 54 : 4 : return TEXT_ADDRESS_TO_NOT_WHITELISTED;
- 55 [ + + ]: 4 : } else if (restrictionCode == CODE_ADDRESS_SPENDER_NOT_WHITELISTED) {
- 56 : 2 : return TEXT_ADDRESS_SPENDER_NOT_WHITELISTED;
- 57 : : } else {
- 58 : 2 : return TEXT_CODE_NOT_FOUND;
- 59 : : }
- 60 : : }
- 61 : :
- 62 : : /* ============ State Functions ============ */
- 63 : :
- 64 : : /**
- 65 : : * @notice ERC-3643 hook called when a transfer occurs.
- 66 : : * @dev
- 67 : : * - Validates that both `from` and `to` addresses are whitelisted.
- 68 : : * - Reverts if any restriction code other than `TRANSFER_OK` is returned.
- 69 : : * - Validation only; does not modify state.
- 70 : : * - Should be called during token transfer logic to enforce whitelist compliance.
- 71 : : * @param from The address sending tokens.
- 72 : : * @param to The address receiving tokens.
- 73 : : * @param value The token amount being transferred.
- 74 : : */
- 75 : 19 : function transferred(address from, address to, uint256 value) public view override(IERC3643IComplianceContract) {
- 76 : 19 : _transferred(from, to, value);
- 77 : : }
- 78 : :
- 79 : : /**
- 80 : : * @notice hook called when a delegated transfer occurs (`transferFrom`).
- 81 : : * @dev
- 82 : : * - Validates that `spender`, `from`, and `to` are all whitelisted.
- 83 : : * - Reverts if any restriction code other than `TRANSFER_OK` is returned.
- 84 : : * - Validation only; does not modify state.
- 85 : : * @param spender The address performing the transfer on behalf of another.
- 86 : : * @param from The address from which tokens are transferred.
- 87 : : * @param to The recipient address.
- 88 : : * @param value The token amount being transferred.
- 89 : : */
- 90 : 4 : function transferred(address spender, address from, address to, uint256 value) public view override(IRuleEngine) {
- 91 : 4 : _transferredFrom(spender, from, to, value);
- 92 : : }
- 93 : :
- 94 : 26 : function _transferred(address from, address to, uint256 value) internal view virtual override {
- 95 : 26 : uint8 code = _detectTransferRestriction(from, to, value);
- 96 [ + + ]: 26 : require(
- 97 : : code == uint8(REJECTED_CODE_BASE.TRANSFER_OK),
- 98 : : RuleWhitelist_InvalidTransfer(address(this), from, to, value, code)
- 99 : : );
- 100 : : }
- 101 : :
- 102 : 11 : function _transferredFrom(address spender, address from, address to, uint256 value)
- 103 : : internal
- 104 : : view
- 105 : : virtual
- 106 : : override
- 107 : : {
- 108 : 11 : uint8 code = _detectTransferRestrictionFrom(spender, from, to, value);
- 109 [ + + ]: 11 : require(
- 110 : : code == uint8(REJECTED_CODE_BASE.TRANSFER_OK),
- 111 : : RuleWhitelist_InvalidTransferFrom(address(this), spender, from, to, value, code)
- 112 : : );
- 113 : : }
- 114 : :
- 115 : :
- 116 : : }
+ 35 : 5 : || restrictionCode == CODE_ADDRESS_TO_NOT_WHITELISTED
+ 36 : 2 : || restrictionCode == CODE_ADDRESS_SPENDER_NOT_WHITELISTED;
+ 37 : : }
+ 38 : :
+ 39 : : /**
+ 40 : : * @notice Returns the human-readable message corresponding to a restriction code.
+ 41 : : * @dev
+ 42 : : * Returns a descriptive text that explains why a transfer was restricted.
+ 43 : : * @param restrictionCode The restriction code to decode.
+ 44 : : * @return message A human-readable explanation of the restriction.
+ 45 : : */
+ 46 : 14 : function messageForTransferRestriction(uint8 restrictionCode)
+ 47 : : external
+ 48 : : pure
+ 49 : : override
+ 50 : : returns (string memory message)
+ 51 : : {
+ 52 [ + + ]: 14 : if (restrictionCode == CODE_ADDRESS_FROM_NOT_WHITELISTED) {
+ 53 : 6 : return TEXT_ADDRESS_FROM_NOT_WHITELISTED;
+ 54 [ + + ]: 8 : } else if (restrictionCode == CODE_ADDRESS_TO_NOT_WHITELISTED) {
+ 55 : 4 : return TEXT_ADDRESS_TO_NOT_WHITELISTED;
+ 56 [ + + ]: 4 : } else if (restrictionCode == CODE_ADDRESS_SPENDER_NOT_WHITELISTED) {
+ 57 : 2 : return TEXT_ADDRESS_SPENDER_NOT_WHITELISTED;
+ 58 : : } else {
+ 59 : 2 : return TEXT_CODE_NOT_FOUND;
+ 60 : : }
+ 61 : : }
+ 62 : :
+ 63 : : /* ============ State Functions ============ */
+ 64 : :
+ 65 : : /**
+ 66 : : * @notice ERC-3643 hook called when a transfer occurs.
+ 67 : : * @dev
+ 68 : : * - Validates that both `from` and `to` addresses are whitelisted.
+ 69 : : * - Reverts if any restriction code other than `TRANSFER_OK` is returned.
+ 70 : : * - Validation only; does not modify state.
+ 71 : : * - Should be called during token transfer logic to enforce whitelist compliance.
+ 72 : : * @param from The address sending tokens.
+ 73 : : * @param to The address receiving tokens.
+ 74 : : * @param value The token amount being transferred.
+ 75 : : */
+ 76 : 19 : function transferred(address from, address to, uint256 value) public view override(IERC3643IComplianceContract) {
+ 77 : 19 : _transferred(from, to, value);
+ 78 : : }
+ 79 : :
+ 80 : : /**
+ 81 : : * @notice hook called when a delegated transfer occurs (`transferFrom`).
+ 82 : : * @dev
+ 83 : : * - Validates that `spender`, `from`, and `to` are all whitelisted.
+ 84 : : * - Reverts if any restriction code other than `TRANSFER_OK` is returned.
+ 85 : : * - Validation only; does not modify state.
+ 86 : : * @param spender The address performing the transfer on behalf of another.
+ 87 : : * @param from The address from which tokens are transferred.
+ 88 : : * @param to The recipient address.
+ 89 : : * @param value The token amount being transferred.
+ 90 : : */
+ 91 : 4 : function transferred(address spender, address from, address to, uint256 value) public view override(IRuleEngine) {
+ 92 : 4 : _transferredFrom(spender, from, to, value);
+ 93 : : }
+ 94 : :
+ 95 : 28 : function _transferred(address from, address to, uint256 value) internal view virtual override {
+ 96 : 28 : uint8 code = _detectTransferRestriction(from, to, value);
+ 97 [ + + ]: 28 : require(
+ 98 : : code == uint8(REJECTED_CODE_BASE.TRANSFER_OK),
+ 99 : : RuleWhitelist_InvalidTransfer(address(this), from, to, value, code)
+ 100 : : );
+ 101 : : }
+ 102 : :
+ 103 : 11 : function _transferredFrom(address spender, address from, address to, uint256 value) internal view virtual override {
+ 104 : 11 : uint8 code = _detectTransferRestrictionFrom(spender, from, to, value);
+ 105 [ + + ]: 11 : require(
+ 106 : : code == uint8(REJECTED_CODE_BASE.TRANSFER_OK),
+ 107 : : RuleWhitelist_InvalidTransferFrom(address(this), spender, from, to, value, code)
+ 108 : : );
+ 109 : : }
+ 110 : : }
diff --git a/doc/coverage/coverage/abstract/core/index-sort-b.html b/doc/coverage/coverage/abstract/core/index-sort-b.html
index 226fe72..e6fef6b 100644
--- a/doc/coverage/coverage/abstract/core/index-sort-b.html
+++ b/doc/coverage/coverage/abstract/core/index-sort-b.html
@@ -31,13 +31,13 @@
|
-
-
+
+
-
+
|
@@ -111,7 +111,7 @@
100.0 % |
- 21 / 21 |
+ 22 / 22 |
100.0 % |
6 / 6 |
100.0 % |
diff --git a/doc/coverage/coverage/abstract/core/index-sort-f.html b/doc/coverage/coverage/abstract/core/index-sort-f.html
index e680dc9..89620b4 100644
--- a/doc/coverage/coverage/abstract/core/index-sort-f.html
+++ b/doc/coverage/coverage/abstract/core/index-sort-f.html
@@ -31,13 +31,13 @@
|
-
-
+
+
-
+
|
@@ -99,7 +99,7 @@
100.0 % |
- 21 / 21 |
+ 22 / 22 |
100.0 % |
6 / 6 |
100.0 % |
diff --git a/doc/coverage/coverage/abstract/core/index-sort-l.html b/doc/coverage/coverage/abstract/core/index-sort-l.html
index e557c1e..599a86c 100644
--- a/doc/coverage/coverage/abstract/core/index-sort-l.html
+++ b/doc/coverage/coverage/abstract/core/index-sort-l.html
@@ -31,13 +31,13 @@
|
-
-
+
+
-
+
|
@@ -111,7 +111,7 @@
100.0 % |
- 21 / 21 |
+ 22 / 22 |
100.0 % |
6 / 6 |
100.0 % |
diff --git a/doc/coverage/coverage/abstract/core/index.html b/doc/coverage/coverage/abstract/core/index.html
index be497f9..29a0739 100644
--- a/doc/coverage/coverage/abstract/core/index.html
+++ b/doc/coverage/coverage/abstract/core/index.html
@@ -31,13 +31,13 @@
|
-
-
+
+
-
+
|
@@ -111,7 +111,7 @@
100.0 % |
- 21 / 21 |
+ 22 / 22 |
100.0 % |
6 / 6 |
100.0 % |
diff --git a/doc/coverage/coverage/deployment/RuleBlacklist.sol.func-sort-c.html b/doc/coverage/coverage/deployment/RuleBlacklist.sol.func-sort-c.html
index 7a9f3cd..7133758 100644
--- a/doc/coverage/coverage/deployment/RuleBlacklist.sol.func-sort-c.html
+++ b/doc/coverage/coverage/deployment/RuleBlacklist.sol.func-sort-c.html
@@ -31,13 +31,13 @@
|
-
-
+
+
-
+
|
@@ -69,23 +69,23 @@
Hit count  |
- | RuleBlacklist._authorizeAddressListRemove |
+ RuleBlacklist._authorizeAddressListRemove |
1 |
- | RuleBlacklist._msgData |
+ RuleBlacklist._msgData |
1 |
- | RuleBlacklist._authorizeAddressListAdd |
+ RuleBlacklist._authorizeAddressListAdd |
28 |
- | RuleBlacklist._msgSender |
+ RuleBlacklist._msgSender |
83 |
- | RuleBlacklist._contextSuffixLength |
+ RuleBlacklist._contextSuffixLength |
84 |
diff --git a/doc/coverage/coverage/deployment/RuleBlacklist.sol.func.html b/doc/coverage/coverage/deployment/RuleBlacklist.sol.func.html
index a7a1b13..0e71043 100644
--- a/doc/coverage/coverage/deployment/RuleBlacklist.sol.func.html
+++ b/doc/coverage/coverage/deployment/RuleBlacklist.sol.func.html
@@ -31,13 +31,13 @@
|
-
-
+
+
-
+
|
@@ -69,23 +69,23 @@
Hit count  |
- | RuleBlacklist._authorizeAddressListAdd |
+ RuleBlacklist._authorizeAddressListAdd |
28 |
- | RuleBlacklist._authorizeAddressListRemove |
+ RuleBlacklist._authorizeAddressListRemove |
1 |
- | RuleBlacklist._contextSuffixLength |
+ RuleBlacklist._contextSuffixLength |
84 |
- | RuleBlacklist._msgData |
+ RuleBlacklist._msgData |
1 |
- | RuleBlacklist._msgSender |
+ RuleBlacklist._msgSender |
83 |
diff --git a/doc/coverage/coverage/deployment/RuleBlacklist.sol.gcov.html b/doc/coverage/coverage/deployment/RuleBlacklist.sol.gcov.html
index 1f3c2dd..a674ee2 100644
--- a/doc/coverage/coverage/deployment/RuleBlacklist.sol.gcov.html
+++ b/doc/coverage/coverage/deployment/RuleBlacklist.sol.gcov.html
@@ -31,13 +31,13 @@
|
-
-
+
+
-
+
|
@@ -103,25 +103,26 @@
32 : : override(AccessControlEnumerable, RuleBlacklistBase)
33 : : returns (bool)
34 : : {
- 35 : 91 : return AccessControlEnumerable.supportsInterface(interfaceId) || RuleBlacklistBase.supportsInterface(interfaceId);
- 36 : : }
- 37 : :
- 38 : 28 : function _authorizeAddressListAdd() internal view virtual override onlyRole(ADDRESS_LIST_ADD_ROLE) {}
- 39 : :
- 40 : 1 : function _authorizeAddressListRemove() internal view virtual override onlyRole(ADDRESS_LIST_REMOVE_ROLE) {}
- 41 : :
- 42 : 83 : function _msgSender() internal view virtual override(Context, RuleAddressSet) returns (address sender) {
- 43 : 83 : return super._msgSender();
- 44 : : }
- 45 : :
- 46 : 1 : function _msgData() internal view virtual override(Context, RuleAddressSet) returns (bytes calldata) {
- 47 : 1 : return super._msgData();
- 48 : : }
- 49 : :
- 50 : 84 : function _contextSuffixLength() internal view virtual override(Context, RuleAddressSet) returns (uint256) {
- 51 : 84 : return super._contextSuffixLength();
- 52 : : }
- 53 : : }
+ 35 : 91 : return AccessControlEnumerable.supportsInterface(interfaceId)
+ 36 : 61 : || RuleBlacklistBase.supportsInterface(interfaceId);
+ 37 : : }
+ 38 : :
+ 39 : 28 : function _authorizeAddressListAdd() internal view virtual override onlyRole(ADDRESS_LIST_ADD_ROLE) {}
+ 40 : :
+ 41 : 1 : function _authorizeAddressListRemove() internal view virtual override onlyRole(ADDRESS_LIST_REMOVE_ROLE) {}
+ 42 : :
+ 43 : 83 : function _msgSender() internal view virtual override(Context, RuleAddressSet) returns (address sender) {
+ 44 : 83 : return super._msgSender();
+ 45 : : }
+ 46 : :
+ 47 : 1 : function _msgData() internal view virtual override(Context, RuleAddressSet) returns (bytes calldata) {
+ 48 : 1 : return super._msgData();
+ 49 : : }
+ 50 : :
+ 51 : 84 : function _contextSuffixLength() internal view virtual override(Context, RuleAddressSet) returns (uint256) {
+ 52 : 84 : return super._contextSuffixLength();
+ 53 : : }
+ 54 : : }
diff --git a/doc/coverage/coverage/deployment/RuleBlacklistOwnable2Step.sol.func-sort-c.html b/doc/coverage/coverage/deployment/RuleBlacklistOwnable2Step.sol.func-sort-c.html
index 4f6c52b..8d61702 100644
--- a/doc/coverage/coverage/deployment/RuleBlacklistOwnable2Step.sol.func-sort-c.html
+++ b/doc/coverage/coverage/deployment/RuleBlacklistOwnable2Step.sol.func-sort-c.html
@@ -37,7 +37,7 @@
-
+
|
@@ -69,23 +69,23 @@
Hit count  |
- | RuleBlacklistOwnable2Step._msgData |
+ RuleBlacklistOwnable2Step._msgData |
1 |
- | RuleBlacklistOwnable2Step._authorizeAddressListAdd |
+ RuleBlacklistOwnable2Step._authorizeAddressListAdd |
2 |
- | RuleBlacklistOwnable2Step._authorizeAddressListRemove |
+ RuleBlacklistOwnable2Step._authorizeAddressListRemove |
2 |
- | RuleBlacklistOwnable2Step._msgSender |
+ RuleBlacklistOwnable2Step._msgSender |
12 |
- | RuleBlacklistOwnable2Step._contextSuffixLength |
+ RuleBlacklistOwnable2Step._contextSuffixLength |
13 |
diff --git a/doc/coverage/coverage/deployment/RuleBlacklistOwnable2Step.sol.func.html b/doc/coverage/coverage/deployment/RuleBlacklistOwnable2Step.sol.func.html
index 3adf440..ad84a28 100644
--- a/doc/coverage/coverage/deployment/RuleBlacklistOwnable2Step.sol.func.html
+++ b/doc/coverage/coverage/deployment/RuleBlacklistOwnable2Step.sol.func.html
@@ -37,7 +37,7 @@
-
+
|
@@ -69,23 +69,23 @@
Hit count  |
- | RuleBlacklistOwnable2Step._authorizeAddressListAdd |
+ RuleBlacklistOwnable2Step._authorizeAddressListAdd |
2 |
- | RuleBlacklistOwnable2Step._authorizeAddressListRemove |
+ RuleBlacklistOwnable2Step._authorizeAddressListRemove |
2 |
- | RuleBlacklistOwnable2Step._contextSuffixLength |
+ RuleBlacklistOwnable2Step._contextSuffixLength |
13 |
- | RuleBlacklistOwnable2Step._msgData |
+ RuleBlacklistOwnable2Step._msgData |
1 |
- | RuleBlacklistOwnable2Step._msgSender |
+ RuleBlacklistOwnable2Step._msgSender |
12 |
diff --git a/doc/coverage/coverage/deployment/RuleBlacklistOwnable2Step.sol.gcov.html b/doc/coverage/coverage/deployment/RuleBlacklistOwnable2Step.sol.gcov.html
index 1c015a0..64af672 100644
--- a/doc/coverage/coverage/deployment/RuleBlacklistOwnable2Step.sol.gcov.html
+++ b/doc/coverage/coverage/deployment/RuleBlacklistOwnable2Step.sol.gcov.html
@@ -37,7 +37,7 @@
-
+
|
@@ -83,27 +83,24 @@
12 : : * @notice Ownable2Step variant of RuleBlacklist with owner-based authorization hooks.
13 : : */
14 : : contract RuleBlacklistOwnable2Step is RuleBlacklistBase, Ownable2Step {
- 15 : : constructor(address owner, address forwarderIrrevocable)
- 16 : : RuleBlacklistBase(forwarderIrrevocable)
- 17 : : Ownable(owner)
- 18 : : {}
- 19 : :
- 20 : 2 : function _authorizeAddressListAdd() internal view virtual override onlyOwner {}
- 21 : :
- 22 : 2 : function _authorizeAddressListRemove() internal view virtual override onlyOwner {}
- 23 : :
- 24 : 12 : function _msgSender() internal view virtual override(Context, RuleAddressSet) returns (address sender) {
- 25 : 12 : return super._msgSender();
- 26 : : }
- 27 : :
- 28 : 1 : function _msgData() internal view virtual override(Context, RuleAddressSet) returns (bytes calldata) {
- 29 : 1 : return super._msgData();
- 30 : : }
- 31 : :
- 32 : 13 : function _contextSuffixLength() internal view virtual override(Context, RuleAddressSet) returns (uint256) {
- 33 : 13 : return super._contextSuffixLength();
- 34 : : }
- 35 : : }
+ 15 : : constructor(address owner, address forwarderIrrevocable) RuleBlacklistBase(forwarderIrrevocable) Ownable(owner) {}
+ 16 : :
+ 17 : 2 : function _authorizeAddressListAdd() internal view virtual override onlyOwner {}
+ 18 : :
+ 19 : 2 : function _authorizeAddressListRemove() internal view virtual override onlyOwner {}
+ 20 : :
+ 21 : 12 : function _msgSender() internal view virtual override(Context, RuleAddressSet) returns (address sender) {
+ 22 : 12 : return super._msgSender();
+ 23 : : }
+ 24 : :
+ 25 : 1 : function _msgData() internal view virtual override(Context, RuleAddressSet) returns (bytes calldata) {
+ 26 : 1 : return super._msgData();
+ 27 : : }
+ 28 : :
+ 29 : 13 : function _contextSuffixLength() internal view virtual override(Context, RuleAddressSet) returns (uint256) {
+ 30 : 13 : return super._contextSuffixLength();
+ 31 : : }
+ 32 : : }
diff --git a/doc/coverage/coverage/deployment/RuleERC2980.sol.func-sort-c.html b/doc/coverage/coverage/deployment/RuleERC2980.sol.func-sort-c.html
index 5982600..0271b40 100644
--- a/doc/coverage/coverage/deployment/RuleERC2980.sol.func-sort-c.html
+++ b/doc/coverage/coverage/deployment/RuleERC2980.sol.func-sort-c.html
@@ -37,7 +37,7 @@
-
+
|
diff --git a/doc/coverage/coverage/deployment/RuleERC2980.sol.func.html b/doc/coverage/coverage/deployment/RuleERC2980.sol.func.html
index 2fc8959..d1fa5b1 100644
--- a/doc/coverage/coverage/deployment/RuleERC2980.sol.func.html
+++ b/doc/coverage/coverage/deployment/RuleERC2980.sol.func.html
@@ -37,7 +37,7 @@
-
+
|
diff --git a/doc/coverage/coverage/deployment/RuleERC2980.sol.gcov.html b/doc/coverage/coverage/deployment/RuleERC2980.sol.gcov.html
index 44437e3..5863a7a 100644
--- a/doc/coverage/coverage/deployment/RuleERC2980.sol.gcov.html
+++ b/doc/coverage/coverage/deployment/RuleERC2980.sol.gcov.html
@@ -37,7 +37,7 @@
-
+
|
diff --git a/doc/coverage/coverage/deployment/RuleERC2980Ownable2Step.sol.func-sort-c.html b/doc/coverage/coverage/deployment/RuleERC2980Ownable2Step.sol.func-sort-c.html
index 6a57dc8..7c235e2 100644
--- a/doc/coverage/coverage/deployment/RuleERC2980Ownable2Step.sol.func-sort-c.html
+++ b/doc/coverage/coverage/deployment/RuleERC2980Ownable2Step.sol.func-sort-c.html
@@ -37,7 +37,7 @@
-
+
|
@@ -69,31 +69,31 @@
Hit count  |
- | RuleERC2980Ownable2Step._msgData |
+ RuleERC2980Ownable2Step._msgData |
1 |
- | RuleERC2980Ownable2Step._authorizeFrozenlistRemove |
+ RuleERC2980Ownable2Step._authorizeFrozenlistRemove |
2 |
- | RuleERC2980Ownable2Step._authorizeWhitelistRemove |
+ RuleERC2980Ownable2Step._authorizeWhitelistRemove |
3 |
- | RuleERC2980Ownable2Step._authorizeFrozenlistAdd |
+ RuleERC2980Ownable2Step._authorizeFrozenlistAdd |
6 |
- | RuleERC2980Ownable2Step._authorizeWhitelistAdd |
+ RuleERC2980Ownable2Step._authorizeWhitelistAdd |
7 |
- | RuleERC2980Ownable2Step._msgSender |
+ RuleERC2980Ownable2Step._msgSender |
30 |
- | RuleERC2980Ownable2Step._contextSuffixLength |
+ RuleERC2980Ownable2Step._contextSuffixLength |
31 |
diff --git a/doc/coverage/coverage/deployment/RuleERC2980Ownable2Step.sol.func.html b/doc/coverage/coverage/deployment/RuleERC2980Ownable2Step.sol.func.html
index 06ea5a4..b329d9c 100644
--- a/doc/coverage/coverage/deployment/RuleERC2980Ownable2Step.sol.func.html
+++ b/doc/coverage/coverage/deployment/RuleERC2980Ownable2Step.sol.func.html
@@ -37,7 +37,7 @@
-
+
|
@@ -69,31 +69,31 @@
Hit count  |
- | RuleERC2980Ownable2Step._authorizeFrozenlistAdd |
+ RuleERC2980Ownable2Step._authorizeFrozenlistAdd |
6 |
- | RuleERC2980Ownable2Step._authorizeFrozenlistRemove |
+ RuleERC2980Ownable2Step._authorizeFrozenlistRemove |
2 |
- | RuleERC2980Ownable2Step._authorizeWhitelistAdd |
+ RuleERC2980Ownable2Step._authorizeWhitelistAdd |
7 |
- | RuleERC2980Ownable2Step._authorizeWhitelistRemove |
+ RuleERC2980Ownable2Step._authorizeWhitelistRemove |
3 |
- | RuleERC2980Ownable2Step._contextSuffixLength |
+ RuleERC2980Ownable2Step._contextSuffixLength |
31 |
- | RuleERC2980Ownable2Step._msgData |
+ RuleERC2980Ownable2Step._msgData |
1 |
- | RuleERC2980Ownable2Step._msgSender |
+ RuleERC2980Ownable2Step._msgSender |
30 |
diff --git a/doc/coverage/coverage/deployment/RuleERC2980Ownable2Step.sol.gcov.html b/doc/coverage/coverage/deployment/RuleERC2980Ownable2Step.sol.gcov.html
index 58cf267..fdb8ffe 100644
--- a/doc/coverage/coverage/deployment/RuleERC2980Ownable2Step.sol.gcov.html
+++ b/doc/coverage/coverage/deployment/RuleERC2980Ownable2Step.sol.gcov.html
@@ -37,7 +37,7 @@
-
+
|
@@ -83,31 +83,28 @@
12 : : * @dev All whitelist and frozenlist management functions are restricted to the contract owner.
13 : : */
14 : : contract RuleERC2980Ownable2Step is RuleERC2980Base, Ownable2Step {
- 15 : : constructor(address owner, address forwarderIrrevocable)
- 16 : : RuleERC2980Base(forwarderIrrevocable)
- 17 : : Ownable(owner)
- 18 : : {}
- 19 : :
- 20 : 7 : function _authorizeWhitelistAdd() internal view virtual override onlyOwner {}
- 21 : :
- 22 : 3 : function _authorizeWhitelistRemove() internal view virtual override onlyOwner {}
- 23 : :
- 24 : 6 : function _authorizeFrozenlistAdd() internal view virtual override onlyOwner {}
- 25 : :
- 26 : 2 : function _authorizeFrozenlistRemove() internal view virtual override onlyOwner {}
- 27 : :
- 28 : 30 : function _msgSender() internal view virtual override(Context, RuleERC2980Base) returns (address sender) {
- 29 : 30 : return super._msgSender();
- 30 : : }
- 31 : :
- 32 : 1 : function _msgData() internal view virtual override(Context, RuleERC2980Base) returns (bytes calldata) {
- 33 : 1 : return super._msgData();
- 34 : : }
- 35 : :
- 36 : 31 : function _contextSuffixLength() internal view virtual override(Context, RuleERC2980Base) returns (uint256) {
- 37 : 31 : return super._contextSuffixLength();
- 38 : : }
- 39 : : }
+ 15 : : constructor(address owner, address forwarderIrrevocable) RuleERC2980Base(forwarderIrrevocable) Ownable(owner) {}
+ 16 : :
+ 17 : 7 : function _authorizeWhitelistAdd() internal view virtual override onlyOwner {}
+ 18 : :
+ 19 : 3 : function _authorizeWhitelistRemove() internal view virtual override onlyOwner {}
+ 20 : :
+ 21 : 6 : function _authorizeFrozenlistAdd() internal view virtual override onlyOwner {}
+ 22 : :
+ 23 : 2 : function _authorizeFrozenlistRemove() internal view virtual override onlyOwner {}
+ 24 : :
+ 25 : 30 : function _msgSender() internal view virtual override(Context, RuleERC2980Base) returns (address sender) {
+ 26 : 30 : return super._msgSender();
+ 27 : : }
+ 28 : :
+ 29 : 1 : function _msgData() internal view virtual override(Context, RuleERC2980Base) returns (bytes calldata) {
+ 30 : 1 : return super._msgData();
+ 31 : : }
+ 32 : :
+ 33 : 31 : function _contextSuffixLength() internal view virtual override(Context, RuleERC2980Base) returns (uint256) {
+ 34 : 31 : return super._contextSuffixLength();
+ 35 : : }
+ 36 : : }
diff --git a/doc/coverage/coverage/deployment/RuleIdentityRegistry.sol.func-sort-c.html b/doc/coverage/coverage/deployment/RuleIdentityRegistry.sol.func-sort-c.html
index c671fdf..f448ed3 100644
--- a/doc/coverage/coverage/deployment/RuleIdentityRegistry.sol.func-sort-c.html
+++ b/doc/coverage/coverage/deployment/RuleIdentityRegistry.sol.func-sort-c.html
@@ -37,7 +37,7 @@
-
+
|
diff --git a/doc/coverage/coverage/deployment/RuleIdentityRegistry.sol.func.html b/doc/coverage/coverage/deployment/RuleIdentityRegistry.sol.func.html
index 03a6311..1172c83 100644
--- a/doc/coverage/coverage/deployment/RuleIdentityRegistry.sol.func.html
+++ b/doc/coverage/coverage/deployment/RuleIdentityRegistry.sol.func.html
@@ -37,7 +37,7 @@
-
+
|
diff --git a/doc/coverage/coverage/deployment/RuleIdentityRegistry.sol.gcov.html b/doc/coverage/coverage/deployment/RuleIdentityRegistry.sol.gcov.html
index 29c87c5..e499690 100644
--- a/doc/coverage/coverage/deployment/RuleIdentityRegistry.sol.gcov.html
+++ b/doc/coverage/coverage/deployment/RuleIdentityRegistry.sol.gcov.html
@@ -37,7 +37,7 @@
-
+
|
diff --git a/doc/coverage/coverage/deployment/RuleIdentityRegistryOwnable2Step.sol.func-sort-c.html b/doc/coverage/coverage/deployment/RuleIdentityRegistryOwnable2Step.sol.func-sort-c.html
index f0edaeb..f40a018 100644
--- a/doc/coverage/coverage/deployment/RuleIdentityRegistryOwnable2Step.sol.func-sort-c.html
+++ b/doc/coverage/coverage/deployment/RuleIdentityRegistryOwnable2Step.sol.func-sort-c.html
@@ -37,7 +37,7 @@
-
+
|
diff --git a/doc/coverage/coverage/deployment/RuleIdentityRegistryOwnable2Step.sol.func.html b/doc/coverage/coverage/deployment/RuleIdentityRegistryOwnable2Step.sol.func.html
index f36b6a3..21fdc8e 100644
--- a/doc/coverage/coverage/deployment/RuleIdentityRegistryOwnable2Step.sol.func.html
+++ b/doc/coverage/coverage/deployment/RuleIdentityRegistryOwnable2Step.sol.func.html
@@ -37,7 +37,7 @@
-
+
|
diff --git a/doc/coverage/coverage/deployment/RuleIdentityRegistryOwnable2Step.sol.gcov.html b/doc/coverage/coverage/deployment/RuleIdentityRegistryOwnable2Step.sol.gcov.html
index c5464a5..b350cb4 100644
--- a/doc/coverage/coverage/deployment/RuleIdentityRegistryOwnable2Step.sol.gcov.html
+++ b/doc/coverage/coverage/deployment/RuleIdentityRegistryOwnable2Step.sol.gcov.html
@@ -37,7 +37,7 @@
-
+
|
diff --git a/doc/coverage/coverage/deployment/RuleMaxTotalSupply.sol.func-sort-c.html b/doc/coverage/coverage/deployment/RuleMaxTotalSupply.sol.func-sort-c.html
index 3d362ea..571c96e 100644
--- a/doc/coverage/coverage/deployment/RuleMaxTotalSupply.sol.func-sort-c.html
+++ b/doc/coverage/coverage/deployment/RuleMaxTotalSupply.sol.func-sort-c.html
@@ -37,7 +37,7 @@
-
+
|
diff --git a/doc/coverage/coverage/deployment/RuleMaxTotalSupply.sol.func.html b/doc/coverage/coverage/deployment/RuleMaxTotalSupply.sol.func.html
index 461eca6..90f36b1 100644
--- a/doc/coverage/coverage/deployment/RuleMaxTotalSupply.sol.func.html
+++ b/doc/coverage/coverage/deployment/RuleMaxTotalSupply.sol.func.html
@@ -37,7 +37,7 @@
-
+
|
diff --git a/doc/coverage/coverage/deployment/RuleMaxTotalSupply.sol.gcov.html b/doc/coverage/coverage/deployment/RuleMaxTotalSupply.sol.gcov.html
index 6933e67..5196e15 100644
--- a/doc/coverage/coverage/deployment/RuleMaxTotalSupply.sol.gcov.html
+++ b/doc/coverage/coverage/deployment/RuleMaxTotalSupply.sol.gcov.html
@@ -37,7 +37,7 @@
-
+
|
diff --git a/doc/coverage/coverage/deployment/RuleMaxTotalSupplyOwnable2Step.sol.func-sort-c.html b/doc/coverage/coverage/deployment/RuleMaxTotalSupplyOwnable2Step.sol.func-sort-c.html
index 8f2bc94..8fa5655 100644
--- a/doc/coverage/coverage/deployment/RuleMaxTotalSupplyOwnable2Step.sol.func-sort-c.html
+++ b/doc/coverage/coverage/deployment/RuleMaxTotalSupplyOwnable2Step.sol.func-sort-c.html
@@ -37,7 +37,7 @@
-
+
|
diff --git a/doc/coverage/coverage/deployment/RuleMaxTotalSupplyOwnable2Step.sol.func.html b/doc/coverage/coverage/deployment/RuleMaxTotalSupplyOwnable2Step.sol.func.html
index 9d21145..d7388aa 100644
--- a/doc/coverage/coverage/deployment/RuleMaxTotalSupplyOwnable2Step.sol.func.html
+++ b/doc/coverage/coverage/deployment/RuleMaxTotalSupplyOwnable2Step.sol.func.html
@@ -37,7 +37,7 @@
-
+
|
diff --git a/doc/coverage/coverage/deployment/RuleMaxTotalSupplyOwnable2Step.sol.gcov.html b/doc/coverage/coverage/deployment/RuleMaxTotalSupplyOwnable2Step.sol.gcov.html
index e3cdd2f..bedeb3e 100644
--- a/doc/coverage/coverage/deployment/RuleMaxTotalSupplyOwnable2Step.sol.gcov.html
+++ b/doc/coverage/coverage/deployment/RuleMaxTotalSupplyOwnable2Step.sol.gcov.html
@@ -37,7 +37,7 @@
-
+
|
diff --git a/doc/coverage/coverage/deployment/RuleSanctionsList.sol.func-sort-c.html b/doc/coverage/coverage/deployment/RuleSanctionsList.sol.func-sort-c.html
index 1594a91..24e6345 100644
--- a/doc/coverage/coverage/deployment/RuleSanctionsList.sol.func-sort-c.html
+++ b/doc/coverage/coverage/deployment/RuleSanctionsList.sol.func-sort-c.html
@@ -37,7 +37,7 @@
-
+
|
diff --git a/doc/coverage/coverage/deployment/RuleSanctionsList.sol.func.html b/doc/coverage/coverage/deployment/RuleSanctionsList.sol.func.html
index dcf5ed0..3312a7b 100644
--- a/doc/coverage/coverage/deployment/RuleSanctionsList.sol.func.html
+++ b/doc/coverage/coverage/deployment/RuleSanctionsList.sol.func.html
@@ -37,7 +37,7 @@
-
+
|
diff --git a/doc/coverage/coverage/deployment/RuleSanctionsList.sol.gcov.html b/doc/coverage/coverage/deployment/RuleSanctionsList.sol.gcov.html
index 5b789dd..3a79c33 100644
--- a/doc/coverage/coverage/deployment/RuleSanctionsList.sol.gcov.html
+++ b/doc/coverage/coverage/deployment/RuleSanctionsList.sol.gcov.html
@@ -37,7 +37,7 @@
-
+
|
@@ -75,7 +75,7 @@
4 : : import {AccessControlEnumerable} from "OZ/access/extensions/AccessControlEnumerable.sol";
5 : : import {Context} from "OZ/utils/Context.sol";
6 : : import {AccessControlModuleStandalone} from "../../../modules/AccessControlModuleStandalone.sol";
- 7 : : import {MetaTxModuleStandalone, ERC2771Context} from "../../../modules/MetaTxModuleStandalone.sol";
+ 7 : : import {ERC2771Context} from "../../../modules/MetaTxModuleStandalone.sol";
8 : : import {RuleSanctionsListBase} from "../abstract/base/RuleSanctionsListBase.sol";
9 : : import {RuleTransferValidation} from "../abstract/core/RuleTransferValidation.sol";
10 : : import {ISanctionsList} from "../../interfaces/ISanctionsList.sol";
diff --git a/doc/coverage/coverage/deployment/RuleSanctionsListOwnable2Step.sol.func-sort-c.html b/doc/coverage/coverage/deployment/RuleSanctionsListOwnable2Step.sol.func-sort-c.html
index d9f05d7..b5c05d7 100644
--- a/doc/coverage/coverage/deployment/RuleSanctionsListOwnable2Step.sol.func-sort-c.html
+++ b/doc/coverage/coverage/deployment/RuleSanctionsListOwnable2Step.sol.func-sort-c.html
@@ -37,7 +37,7 @@
-
+
|
diff --git a/doc/coverage/coverage/deployment/RuleSanctionsListOwnable2Step.sol.func.html b/doc/coverage/coverage/deployment/RuleSanctionsListOwnable2Step.sol.func.html
index 62bd796..58d44b3 100644
--- a/doc/coverage/coverage/deployment/RuleSanctionsListOwnable2Step.sol.func.html
+++ b/doc/coverage/coverage/deployment/RuleSanctionsListOwnable2Step.sol.func.html
@@ -37,7 +37,7 @@
-
+
|
diff --git a/doc/coverage/coverage/deployment/RuleSanctionsListOwnable2Step.sol.gcov.html b/doc/coverage/coverage/deployment/RuleSanctionsListOwnable2Step.sol.gcov.html
index 9cba0d5..be60669 100644
--- a/doc/coverage/coverage/deployment/RuleSanctionsListOwnable2Step.sol.gcov.html
+++ b/doc/coverage/coverage/deployment/RuleSanctionsListOwnable2Step.sol.gcov.html
@@ -37,7 +37,7 @@
-
+
|
@@ -75,7 +75,7 @@
4 : : import {Ownable} from "OZ/access/Ownable.sol";
5 : : import {Ownable2Step} from "OZ/access/Ownable2Step.sol";
6 : : import {Context} from "OZ/utils/Context.sol";
- 7 : : import {MetaTxModuleStandalone, ERC2771Context} from "../../../modules/MetaTxModuleStandalone.sol";
+ 7 : : import {ERC2771Context} from "../../../modules/MetaTxModuleStandalone.sol";
8 : : import {RuleSanctionsListBase} from "../abstract/base/RuleSanctionsListBase.sol";
9 : : import {ISanctionsList} from "../../interfaces/ISanctionsList.sol";
10 : :
diff --git a/doc/coverage/coverage/deployment/RuleSpenderWhitelist.sol.func-sort-c.html b/doc/coverage/coverage/deployment/RuleSpenderWhitelist.sol.func-sort-c.html
new file mode 100644
index 0000000..ae631c7
--- /dev/null
+++ b/doc/coverage/coverage/deployment/RuleSpenderWhitelist.sol.func-sort-c.html
@@ -0,0 +1,105 @@
+
+
+
+
+
+
+ LCOV - lcov.info - deployment/RuleSpenderWhitelist.sol - functions
+
+
+
+
+
+
+ | LCOV - code coverage report |
+  |
+
+
+
+
+
+
+
+ |
+ |
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+ |
+ |
+ |
+
+
+
+
+
+  |
+
+ |
+
+
+  |
+
+
+
+
+
+
+
+
+
+
+
diff --git a/doc/coverage/coverage/deployment/RuleSpenderWhitelist.sol.func.html b/doc/coverage/coverage/deployment/RuleSpenderWhitelist.sol.func.html
new file mode 100644
index 0000000..e4dd2af
--- /dev/null
+++ b/doc/coverage/coverage/deployment/RuleSpenderWhitelist.sol.func.html
@@ -0,0 +1,105 @@
+
+
+
+
+
+
+ LCOV - lcov.info - deployment/RuleSpenderWhitelist.sol - functions
+
+
+
+
+
+
+ | LCOV - code coverage report |
+  |
+
+
+
+
+
+
+
+ |
+ |
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+ |
+ |
+ |
+
+
+
+
+
+  |
+
+ |
+
+
+  |
+
+
+
+
+
+
+
+
+
+
+
diff --git a/doc/coverage/coverage/deployment/RuleSpenderWhitelist.sol.gcov.html b/doc/coverage/coverage/deployment/RuleSpenderWhitelist.sol.gcov.html
new file mode 100644
index 0000000..a008bd9
--- /dev/null
+++ b/doc/coverage/coverage/deployment/RuleSpenderWhitelist.sol.gcov.html
@@ -0,0 +1,132 @@
+
+
+
+
+
+
+ LCOV - lcov.info - deployment/RuleSpenderWhitelist.sol
+
+
+
+
+
+
+ | LCOV - code coverage report |
+  |
+
+
+
+
+
+
+
+ |
+ |
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+ |
+ |
+ |
+
+
+
+
+
+  |
+
+ |
+
+
+  |
+
+
+
+
+
+
+
+
+
+
diff --git a/doc/coverage/coverage/deployment/RuleSpenderWhitelistOwnable2Step.sol.func-sort-c.html b/doc/coverage/coverage/deployment/RuleSpenderWhitelistOwnable2Step.sol.func-sort-c.html
new file mode 100644
index 0000000..3b72524
--- /dev/null
+++ b/doc/coverage/coverage/deployment/RuleSpenderWhitelistOwnable2Step.sol.func-sort-c.html
@@ -0,0 +1,101 @@
+
+
+
+
+
+
+ LCOV - lcov.info - deployment/RuleSpenderWhitelistOwnable2Step.sol - functions
+
+
+
+
+
+
+ | LCOV - code coverage report |
+  |
+
+
+
+
+
+
+
+ |
+ |
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+ |
+ |
+ |
+
+
+
+
+
+  |
+
+ |
+
+
+  |
+
+
+
+
+
+
+
+
+
+
+
diff --git a/doc/coverage/coverage/deployment/RuleSpenderWhitelistOwnable2Step.sol.func.html b/doc/coverage/coverage/deployment/RuleSpenderWhitelistOwnable2Step.sol.func.html
new file mode 100644
index 0000000..1026412
--- /dev/null
+++ b/doc/coverage/coverage/deployment/RuleSpenderWhitelistOwnable2Step.sol.func.html
@@ -0,0 +1,101 @@
+
+
+
+
+
+
+ LCOV - lcov.info - deployment/RuleSpenderWhitelistOwnable2Step.sol - functions
+
+
+
+
+
+
+ | LCOV - code coverage report |
+  |
+
+
+
+
+
+
+
+ |
+ |
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+ |
+ |
+ |
+
+
+
+
+
+  |
+
+ |
+
+
+  |
+
+
+
+
+
+
+
+
+
+
+
diff --git a/doc/coverage/coverage/deployment/RuleSpenderWhitelistOwnable2Step.sol.gcov.html b/doc/coverage/coverage/deployment/RuleSpenderWhitelistOwnable2Step.sol.gcov.html
new file mode 100644
index 0000000..36b3a78
--- /dev/null
+++ b/doc/coverage/coverage/deployment/RuleSpenderWhitelistOwnable2Step.sol.gcov.html
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+ LCOV - lcov.info - deployment/RuleSpenderWhitelistOwnable2Step.sol
+
+
+
+
+
+
+ | LCOV - code coverage report |
+  |
+
+
+
+
+
+
+
+ |
+ |
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+ |
+ |
+ |
+
+
+
+
+
+  |
+
+ |
+
+
+  |
+
+
+
+
+
+
+
+
+
+
diff --git a/doc/coverage/coverage/deployment/RuleWhitelist.sol.func-sort-c.html b/doc/coverage/coverage/deployment/RuleWhitelist.sol.func-sort-c.html
index 86d6201..6422f45 100644
--- a/doc/coverage/coverage/deployment/RuleWhitelist.sol.func-sort-c.html
+++ b/doc/coverage/coverage/deployment/RuleWhitelist.sol.func-sort-c.html
@@ -31,13 +31,13 @@
|
-
-
+
+
-
+
|
@@ -69,32 +69,32 @@
Hit count  |
- | RuleWhitelist._authorizeCheckSpenderManager |
+ RuleWhitelist._authorizeCheckSpenderManager |
1 |
- | RuleWhitelist._msgData |
+ RuleWhitelist._msgData |
1 |
- | RuleWhitelist.supportsInterface |
+ RuleWhitelist.supportsInterface |
40 |
- | RuleWhitelist._authorizeAddressListRemove |
+ RuleWhitelist._authorizeAddressListRemove |
263 |
- | RuleWhitelist._authorizeAddressListAdd |
- 348 |
+ RuleWhitelist._authorizeAddressListAdd |
+ 352 |
- | RuleWhitelist._msgSender |
- 772 |
+ RuleWhitelist._msgSender |
+ 778 |
- | RuleWhitelist._contextSuffixLength |
- 773 |
+ RuleWhitelist._contextSuffixLength |
+ 779 |
diff --git a/doc/coverage/coverage/deployment/RuleWhitelist.sol.func.html b/doc/coverage/coverage/deployment/RuleWhitelist.sol.func.html
index b216e14..dca3a94 100644
--- a/doc/coverage/coverage/deployment/RuleWhitelist.sol.func.html
+++ b/doc/coverage/coverage/deployment/RuleWhitelist.sol.func.html
@@ -31,13 +31,13 @@
|
-
-
+
+
-
+
|
@@ -69,31 +69,31 @@
Hit count  |
- | RuleWhitelist._authorizeAddressListAdd |
- 348 |
+ RuleWhitelist._authorizeAddressListAdd |
+ 352 |
- | RuleWhitelist._authorizeAddressListRemove |
+ RuleWhitelist._authorizeAddressListRemove |
263 |
- | RuleWhitelist._authorizeCheckSpenderManager |
+ RuleWhitelist._authorizeCheckSpenderManager |
1 |
- | RuleWhitelist._contextSuffixLength |
- 773 |
+ RuleWhitelist._contextSuffixLength |
+ 779 |
- | RuleWhitelist._msgData |
+ RuleWhitelist._msgData |
1 |
- | RuleWhitelist._msgSender |
- 772 |
+ RuleWhitelist._msgSender |
+ 778 |
- | RuleWhitelist.supportsInterface |
+ RuleWhitelist.supportsInterface |
40 |
diff --git a/doc/coverage/coverage/deployment/RuleWhitelist.sol.gcov.html b/doc/coverage/coverage/deployment/RuleWhitelist.sol.gcov.html
index ca176dc..b6fe556 100644
--- a/doc/coverage/coverage/deployment/RuleWhitelist.sol.gcov.html
+++ b/doc/coverage/coverage/deployment/RuleWhitelist.sol.gcov.html
@@ -31,13 +31,13 @@
|
-
-
+
+
-
+
|
@@ -78,70 +78,72 @@
7 : : import {AccessControlModuleStandalone} from "../../../modules/AccessControlModuleStandalone.sol";
8 : : import {RuleWhitelistBase} from "../abstract/base/RuleWhitelistBase.sol";
9 : : import {RuleAddressSet} from "../abstract/RuleAddressSet/RuleAddressSet.sol";
- 10 : : /* ==== CMTAT === */
- 11 : :
- 12 : : /**
- 13 : : * @title Rule Whitelist
- 14 : : * @notice Manages a whitelist of authorized addresses and enforces whitelist-based transfer restrictions.
- 15 : : * @dev
- 16 : : * - Inherits core address management logic from {RuleAddressSet}.
- 17 : : * - Integrates restriction code logic from {RuleWhitelistShared}.
- 18 : : * - Implements {IERC1404} to return specific restriction codes for non-whitelisted transfers.
- 19 : : */
- 20 : : contract RuleWhitelist is RuleWhitelistBase, AccessControlModuleStandalone {
- 21 : : /*//////////////////////////////////////////////////////////////
- 22 : : CONSTRUCTOR
- 23 : : //////////////////////////////////////////////////////////////*/
- 24 : : /**
- 25 : : * @param admin Address of the contract (Access Control)
- 26 : : * @param forwarderIrrevocable Address of the forwarder, required for the gasless support
- 27 : : */
- 28 : : constructor(address admin, address forwarderIrrevocable, bool checkSpender_)
- 29 : : RuleWhitelistBase(forwarderIrrevocable, checkSpender_)
- 30 : : AccessControlModuleStandalone(admin)
- 31 : : {
- 32 : : // no-op
- 33 : : }
- 34 : :
- 35 : : /* ============ View Functions ============ */
- 36 : :
- 37 : : /**
- 38 : : * @notice Indicates whether this contract supports a given interface.
- 39 : : * @param interfaceId The interface identifier, as specified in ERC-165.
- 40 : : * @return supported True if the interface is supported.
- 41 : : */
- 42 : 40 : function supportsInterface(bytes4 interfaceId)
- 43 : : public
- 44 : : view
- 45 : : virtual
- 46 : : override(AccessControlEnumerable, RuleWhitelistBase)
- 47 : : returns (bool)
- 48 : : {
- 49 : 40 : return AccessControlEnumerable.supportsInterface(interfaceId) || RuleWhitelistBase.supportsInterface(interfaceId);
- 50 : : }
- 51 : :
- 52 : : /*//////////////////////////////////////////////////////////////
- 53 : : ACCESS CONTROL
- 54 : : //////////////////////////////////////////////////////////////*/
- 55 : :
- 56 : 1 : function _authorizeCheckSpenderManager() internal view virtual override onlyRole(DEFAULT_ADMIN_ROLE) {}
+ 10 : :
+ 11 : : /* ==== CMTAT === */
+ 12 : :
+ 13 : : /**
+ 14 : : * @title Rule Whitelist
+ 15 : : * @notice Manages a whitelist of authorized addresses and enforces whitelist-based transfer restrictions.
+ 16 : : * @dev
+ 17 : : * - Inherits core address management logic from {RuleAddressSet}.
+ 18 : : * - Integrates restriction code logic from {RuleWhitelistShared}.
+ 19 : : * - Implements {IERC1404} to return specific restriction codes for non-whitelisted transfers.
+ 20 : : */
+ 21 : : contract RuleWhitelist is RuleWhitelistBase, AccessControlModuleStandalone {
+ 22 : : /*//////////////////////////////////////////////////////////////
+ 23 : : CONSTRUCTOR
+ 24 : : //////////////////////////////////////////////////////////////*/
+ 25 : : /**
+ 26 : : * @param admin Address of the contract (Access Control)
+ 27 : : * @param forwarderIrrevocable Address of the forwarder, required for the gasless support
+ 28 : : */
+ 29 : : constructor(address admin, address forwarderIrrevocable, bool checkSpender_)
+ 30 : : RuleWhitelistBase(forwarderIrrevocable, checkSpender_)
+ 31 : : AccessControlModuleStandalone(admin)
+ 32 : : {
+ 33 : : // no-op
+ 34 : : }
+ 35 : :
+ 36 : : /* ============ View Functions ============ */
+ 37 : :
+ 38 : : /**
+ 39 : : * @notice Indicates whether this contract supports a given interface.
+ 40 : : * @param interfaceId The interface identifier, as specified in ERC-165.
+ 41 : : * @return supported True if the interface is supported.
+ 42 : : */
+ 43 : 40 : function supportsInterface(bytes4 interfaceId)
+ 44 : : public
+ 45 : : view
+ 46 : : virtual
+ 47 : : override(AccessControlEnumerable, RuleWhitelistBase)
+ 48 : : returns (bool)
+ 49 : : {
+ 50 : 40 : return AccessControlEnumerable.supportsInterface(interfaceId)
+ 51 : 27 : || RuleWhitelistBase.supportsInterface(interfaceId);
+ 52 : : }
+ 53 : :
+ 54 : : /*//////////////////////////////////////////////////////////////
+ 55 : : ACCESS CONTROL
+ 56 : : //////////////////////////////////////////////////////////////*/
57 : :
- 58 : 348 : function _authorizeAddressListAdd() internal view virtual override onlyRole(ADDRESS_LIST_ADD_ROLE) {}
+ 58 : 1 : function _authorizeCheckSpenderManager() internal view virtual override onlyRole(DEFAULT_ADMIN_ROLE) {}
59 : :
- 60 : 263 : function _authorizeAddressListRemove() internal view virtual override onlyRole(ADDRESS_LIST_REMOVE_ROLE) {}
+ 60 : 352 : function _authorizeAddressListAdd() internal view virtual override onlyRole(ADDRESS_LIST_ADD_ROLE) {}
61 : :
- 62 : 772 : function _msgSender() internal view virtual override(Context, RuleAddressSet) returns (address sender) {
- 63 : 772 : return super._msgSender();
- 64 : : }
- 65 : :
- 66 : 1 : function _msgData() internal view virtual override(Context, RuleAddressSet) returns (bytes calldata) {
- 67 : 1 : return super._msgData();
- 68 : : }
- 69 : :
- 70 : 773 : function _contextSuffixLength() internal view virtual override(Context, RuleAddressSet) returns (uint256) {
- 71 : 773 : return super._contextSuffixLength();
- 72 : : }
- 73 : : }
+ 62 : 263 : function _authorizeAddressListRemove() internal view virtual override onlyRole(ADDRESS_LIST_REMOVE_ROLE) {}
+ 63 : :
+ 64 : 778 : function _msgSender() internal view virtual override(Context, RuleAddressSet) returns (address sender) {
+ 65 : 778 : return super._msgSender();
+ 66 : : }
+ 67 : :
+ 68 : 1 : function _msgData() internal view virtual override(Context, RuleAddressSet) returns (bytes calldata) {
+ 69 : 1 : return super._msgData();
+ 70 : : }
+ 71 : :
+ 72 : 779 : function _contextSuffixLength() internal view virtual override(Context, RuleAddressSet) returns (uint256) {
+ 73 : 779 : return super._contextSuffixLength();
+ 74 : : }
+ 75 : : }
diff --git a/doc/coverage/coverage/deployment/RuleWhitelistOwnable2Step.sol.func-sort-c.html b/doc/coverage/coverage/deployment/RuleWhitelistOwnable2Step.sol.func-sort-c.html
index 1d0cde2..9117d9c 100644
--- a/doc/coverage/coverage/deployment/RuleWhitelistOwnable2Step.sol.func-sort-c.html
+++ b/doc/coverage/coverage/deployment/RuleWhitelistOwnable2Step.sol.func-sort-c.html
@@ -37,7 +37,7 @@
-
+
|
diff --git a/doc/coverage/coverage/deployment/RuleWhitelistOwnable2Step.sol.func.html b/doc/coverage/coverage/deployment/RuleWhitelistOwnable2Step.sol.func.html
index aaac14d..259fa0e 100644
--- a/doc/coverage/coverage/deployment/RuleWhitelistOwnable2Step.sol.func.html
+++ b/doc/coverage/coverage/deployment/RuleWhitelistOwnable2Step.sol.func.html
@@ -37,7 +37,7 @@
-
+
|
diff --git a/doc/coverage/coverage/deployment/RuleWhitelistOwnable2Step.sol.gcov.html b/doc/coverage/coverage/deployment/RuleWhitelistOwnable2Step.sol.gcov.html
index e0f2605..b258205 100644
--- a/doc/coverage/coverage/deployment/RuleWhitelistOwnable2Step.sol.gcov.html
+++ b/doc/coverage/coverage/deployment/RuleWhitelistOwnable2Step.sol.gcov.html
@@ -37,7 +37,7 @@
-
+
|
diff --git a/doc/coverage/coverage/deployment/RuleWhitelistWrapper.sol.func-sort-c.html b/doc/coverage/coverage/deployment/RuleWhitelistWrapper.sol.func-sort-c.html
index b118fa8..5594f68 100644
--- a/doc/coverage/coverage/deployment/RuleWhitelistWrapper.sol.func-sort-c.html
+++ b/doc/coverage/coverage/deployment/RuleWhitelistWrapper.sol.func-sort-c.html
@@ -37,7 +37,7 @@
-
+
|
@@ -69,39 +69,39 @@
Hit count  |
- | RuleWhitelistWrapper._msgData |
+ RuleWhitelistWrapper._msgData |
1 |
- | RuleWhitelistWrapper._revokeRole |
+ RuleWhitelistWrapper._revokeRole |
1 |
- | RuleWhitelistWrapper._authorizeCheckSpenderManager |
+ RuleWhitelistWrapper._authorizeCheckSpenderManager |
2 |
- | RuleWhitelistWrapper._grantRole |
+ RuleWhitelistWrapper._grantRole |
38 |
- | RuleWhitelistWrapper.hasRole |
+ RuleWhitelistWrapper.hasRole |
38 |
- | RuleWhitelistWrapper.supportsInterface |
+ RuleWhitelistWrapper.supportsInterface |
46 |
- | RuleWhitelistWrapper._onlyRulesManager |
+ RuleWhitelistWrapper._onlyRulesManager |
90 |
- | RuleWhitelistWrapper._msgSender |
+ RuleWhitelistWrapper._msgSender |
133 |
- | RuleWhitelistWrapper._contextSuffixLength |
+ RuleWhitelistWrapper._contextSuffixLength |
134 |
diff --git a/doc/coverage/coverage/deployment/RuleWhitelistWrapper.sol.func.html b/doc/coverage/coverage/deployment/RuleWhitelistWrapper.sol.func.html
index c7034ec..d5cf199 100644
--- a/doc/coverage/coverage/deployment/RuleWhitelistWrapper.sol.func.html
+++ b/doc/coverage/coverage/deployment/RuleWhitelistWrapper.sol.func.html
@@ -37,7 +37,7 @@
-
+
|
@@ -69,39 +69,39 @@
Hit count  |
- | RuleWhitelistWrapper._authorizeCheckSpenderManager |
+ RuleWhitelistWrapper._authorizeCheckSpenderManager |
2 |
- | RuleWhitelistWrapper._contextSuffixLength |
+ RuleWhitelistWrapper._contextSuffixLength |
134 |
- | RuleWhitelistWrapper._grantRole |
+ RuleWhitelistWrapper._grantRole |
38 |
- | RuleWhitelistWrapper._msgData |
+ RuleWhitelistWrapper._msgData |
1 |
- | RuleWhitelistWrapper._msgSender |
+ RuleWhitelistWrapper._msgSender |
133 |
- | RuleWhitelistWrapper._onlyRulesManager |
+ RuleWhitelistWrapper._onlyRulesManager |
90 |
- | RuleWhitelistWrapper._revokeRole |
+ RuleWhitelistWrapper._revokeRole |
1 |
- | RuleWhitelistWrapper.hasRole |
+ RuleWhitelistWrapper.hasRole |
38 |
- | RuleWhitelistWrapper.supportsInterface |
+ RuleWhitelistWrapper.supportsInterface |
46 |
diff --git a/doc/coverage/coverage/deployment/RuleWhitelistWrapper.sol.gcov.html b/doc/coverage/coverage/deployment/RuleWhitelistWrapper.sol.gcov.html
index fee07c5..a7b062c 100644
--- a/doc/coverage/coverage/deployment/RuleWhitelistWrapper.sol.gcov.html
+++ b/doc/coverage/coverage/deployment/RuleWhitelistWrapper.sol.gcov.html
@@ -37,7 +37,7 @@
-
+
|
@@ -84,89 +84,92 @@
13 : : /**
14 : : * @title Wrapper to call several different whitelist rules
15 : : */
- 16 : : contract RuleWhitelistWrapper is
- 17 : : RuleWhitelistWrapperBase,
- 18 : : AccessControlModuleStandalone
- 19 : : {
- 20 : : /*//////////////////////////////////////////////////////////////
- 21 : : CONSTRUCTOR
- 22 : : //////////////////////////////////////////////////////////////*/
- 23 : : /**
- 24 : : * @param admin Address of the contract (Access Control)
- 25 : : * @param forwarderIrrevocable Address of the forwarder, required for the gasless support
- 26 : : */
- 27 : : constructor(address admin, address forwarderIrrevocable, bool checkSpender_)
- 28 : : RuleWhitelistWrapperBase(forwarderIrrevocable, checkSpender_)
- 29 : : AccessControlModuleStandalone(admin)
- 30 : : {}
- 31 : :
- 32 : : /* ============ Access control ============ */
- 33 : :
- 34 : : /**
- 35 : : * @dev Returns `true` if `account` has been granted `role`.
- 36 : : */
- 37 : 38 : function hasRole(bytes32 role, address account)
- 38 : : public
- 39 : : view
- 40 : : virtual
- 41 : : override(AccessControl, AccessControlModuleStandalone)
- 42 : : returns (bool)
- 43 : : {
- 44 : 134 : return AccessControlModuleStandalone.hasRole(role, account);
- 45 : : }
- 46 : :
- 47 : 2 : function _authorizeCheckSpenderManager() internal virtual override onlyRole(DEFAULT_ADMIN_ROLE) {}
- 48 : :
- 49 : : /**
- 50 : : * @dev Restrict rules management to the dedicated role.
- 51 : : */
- 52 : 90 : function _onlyRulesManager() internal virtual override onlyRole(RULES_MANAGEMENT_ROLE) {}
- 53 : :
- 54 : : /*//////////////////////////////////////////////////////////////
- 55 : : ERC-2771
- 56 : : //////////////////////////////////////////////////////////////*/
- 57 : :
- 58 : 133 : function _msgSender() internal view virtual override(RuleWhitelistWrapperBase, Context) returns (address sender) {
- 59 : 133 : return RuleWhitelistWrapperBase._msgSender();
- 60 : : }
- 61 : :
- 62 : 1 : function _msgData() internal view virtual override(RuleWhitelistWrapperBase, Context) returns (bytes calldata) {
- 63 : 1 : return RuleWhitelistWrapperBase._msgData();
- 64 : : }
- 65 : :
- 66 : 134 : function _contextSuffixLength() internal view virtual override(RuleWhitelistWrapperBase, Context) returns (uint256) {
- 67 : 134 : return RuleWhitelistWrapperBase._contextSuffixLength();
- 68 : : }
- 69 : :
- 70 : 46 : function supportsInterface(bytes4 interfaceId)
- 71 : : public
- 72 : : view
- 73 : : virtual
- 74 : : override(AccessControlEnumerable, RuleWhitelistWrapperBase)
- 75 : : returns (bool)
- 76 : : {
- 77 : 46 : return RuleWhitelistWrapperBase.supportsInterface(interfaceId)
- 78 : 16 : || AccessControlEnumerable.supportsInterface(interfaceId);
- 79 : : }
- 80 : :
- 81 : 38 : function _grantRole(bytes32 role, address account)
- 82 : : internal
- 83 : : virtual
- 84 : : override(AccessControl, AccessControlEnumerable)
- 85 : : returns (bool)
- 86 : : {
- 87 : 38 : return AccessControlEnumerable._grantRole(role, account);
- 88 : : }
- 89 : :
- 90 : 1 : function _revokeRole(bytes32 role, address account)
- 91 : : internal
- 92 : : virtual
- 93 : : override(AccessControl, AccessControlEnumerable)
- 94 : : returns (bool)
- 95 : : {
- 96 : 1 : return AccessControlEnumerable._revokeRole(role, account);
- 97 : : }
- 98 : : }
+ 16 : : contract RuleWhitelistWrapper is RuleWhitelistWrapperBase, AccessControlModuleStandalone {
+ 17 : : /*//////////////////////////////////////////////////////////////
+ 18 : : CONSTRUCTOR
+ 19 : : //////////////////////////////////////////////////////////////*/
+ 20 : : /**
+ 21 : : * @param admin Address of the contract (Access Control)
+ 22 : : * @param forwarderIrrevocable Address of the forwarder, required for the gasless support
+ 23 : : */
+ 24 : : constructor(address admin, address forwarderIrrevocable, bool checkSpender_)
+ 25 : : RuleWhitelistWrapperBase(forwarderIrrevocable, checkSpender_)
+ 26 : : AccessControlModuleStandalone(admin)
+ 27 : : {}
+ 28 : :
+ 29 : : /* ============ Access control ============ */
+ 30 : :
+ 31 : : /**
+ 32 : : * @dev Returns `true` if `account` has been granted `role`.
+ 33 : : */
+ 34 : 38 : function hasRole(bytes32 role, address account)
+ 35 : : public
+ 36 : : view
+ 37 : : virtual
+ 38 : : override(AccessControl, AccessControlModuleStandalone)
+ 39 : : returns (bool)
+ 40 : : {
+ 41 : 134 : return AccessControlModuleStandalone.hasRole(role, account);
+ 42 : : }
+ 43 : :
+ 44 : 2 : function _authorizeCheckSpenderManager() internal virtual override onlyRole(DEFAULT_ADMIN_ROLE) {}
+ 45 : :
+ 46 : : /**
+ 47 : : * @dev Restrict rules management to the dedicated role.
+ 48 : : */
+ 49 : 90 : function _onlyRulesManager() internal virtual override onlyRole(RULES_MANAGEMENT_ROLE) {}
+ 50 : :
+ 51 : : /*//////////////////////////////////////////////////////////////
+ 52 : : ERC-2771
+ 53 : : //////////////////////////////////////////////////////////////*/
+ 54 : :
+ 55 : 133 : function _msgSender() internal view virtual override(RuleWhitelistWrapperBase, Context) returns (address sender) {
+ 56 : 133 : return RuleWhitelistWrapperBase._msgSender();
+ 57 : : }
+ 58 : :
+ 59 : 1 : function _msgData() internal view virtual override(RuleWhitelistWrapperBase, Context) returns (bytes calldata) {
+ 60 : 1 : return RuleWhitelistWrapperBase._msgData();
+ 61 : : }
+ 62 : :
+ 63 : 134 : function _contextSuffixLength()
+ 64 : : internal
+ 65 : : view
+ 66 : : virtual
+ 67 : : override(RuleWhitelistWrapperBase, Context)
+ 68 : : returns (uint256)
+ 69 : : {
+ 70 : 134 : return RuleWhitelistWrapperBase._contextSuffixLength();
+ 71 : : }
+ 72 : :
+ 73 : 46 : function supportsInterface(bytes4 interfaceId)
+ 74 : : public
+ 75 : : view
+ 76 : : virtual
+ 77 : : override(AccessControlEnumerable, RuleWhitelistWrapperBase)
+ 78 : : returns (bool)
+ 79 : : {
+ 80 : 46 : return RuleWhitelistWrapperBase.supportsInterface(interfaceId)
+ 81 : 16 : || AccessControlEnumerable.supportsInterface(interfaceId);
+ 82 : : }
+ 83 : :
+ 84 : 38 : function _grantRole(bytes32 role, address account)
+ 85 : : internal
+ 86 : : virtual
+ 87 : : override(AccessControl, AccessControlEnumerable)
+ 88 : : returns (bool)
+ 89 : : {
+ 90 : 38 : return AccessControlEnumerable._grantRole(role, account);
+ 91 : : }
+ 92 : :
+ 93 : 1 : function _revokeRole(bytes32 role, address account)
+ 94 : : internal
+ 95 : : virtual
+ 96 : : override(AccessControl, AccessControlEnumerable)
+ 97 : : returns (bool)
+ 98 : : {
+ 99 : 1 : return AccessControlEnumerable._revokeRole(role, account);
+ 100 : : }
+ 101 : : }
diff --git a/doc/coverage/coverage/deployment/RuleWhitelistWrapperOwnable2Step.sol.func-sort-c.html b/doc/coverage/coverage/deployment/RuleWhitelistWrapperOwnable2Step.sol.func-sort-c.html
index b67a8e6..a882b98 100644
--- a/doc/coverage/coverage/deployment/RuleWhitelistWrapperOwnable2Step.sol.func-sort-c.html
+++ b/doc/coverage/coverage/deployment/RuleWhitelistWrapperOwnable2Step.sol.func-sort-c.html
@@ -37,7 +37,7 @@
-
+
|
diff --git a/doc/coverage/coverage/deployment/RuleWhitelistWrapperOwnable2Step.sol.func.html b/doc/coverage/coverage/deployment/RuleWhitelistWrapperOwnable2Step.sol.func.html
index b704ccc..8a05ca5 100644
--- a/doc/coverage/coverage/deployment/RuleWhitelistWrapperOwnable2Step.sol.func.html
+++ b/doc/coverage/coverage/deployment/RuleWhitelistWrapperOwnable2Step.sol.func.html
@@ -37,7 +37,7 @@
-
+
|
diff --git a/doc/coverage/coverage/deployment/RuleWhitelistWrapperOwnable2Step.sol.gcov.html b/doc/coverage/coverage/deployment/RuleWhitelistWrapperOwnable2Step.sol.gcov.html
index 211abff..9fad630 100644
--- a/doc/coverage/coverage/deployment/RuleWhitelistWrapperOwnable2Step.sol.gcov.html
+++ b/doc/coverage/coverage/deployment/RuleWhitelistWrapperOwnable2Step.sol.gcov.html
@@ -37,7 +37,7 @@
-
+
|
@@ -115,11 +115,16 @@
44 : 1 : return RuleWhitelistWrapperBase._msgData();
45 : : }
46 : :
- 47 : 13 : function _contextSuffixLength() internal view virtual override(RuleWhitelistWrapperBase, Context) returns (uint256) {
- 48 : 13 : return RuleWhitelistWrapperBase._contextSuffixLength();
- 49 : : }
- 50 : :
- 51 : : }
+ 47 : 13 : function _contextSuffixLength()
+ 48 : : internal
+ 49 : : view
+ 50 : : virtual
+ 51 : : override(RuleWhitelistWrapperBase, Context)
+ 52 : : returns (uint256)
+ 53 : : {
+ 54 : 13 : return RuleWhitelistWrapperBase._contextSuffixLength();
+ 55 : : }
+ 56 : : }
diff --git a/doc/coverage/coverage/deployment/index-sort-b.html b/doc/coverage/coverage/deployment/index-sort-b.html
index ebfc836..746722a 100644
--- a/doc/coverage/coverage/deployment/index-sort-b.html
+++ b/doc/coverage/coverage/deployment/index-sort-b.html
@@ -31,17 +31,17 @@
|
-
-
+
+
-
+
|
-
-
+
+
@@ -82,31 +82,43 @@
Branches  |
- | RuleSanctionsListOwnable2Step.sol |
+ RuleWhitelistOwnable2Step.sol |
|
100.0 % |
- 7 / 7 |
+ 9 / 9 |
100.0 % |
- 4 / 4 |
+ 6 / 6 |
- |
0 / 0 |
- | RuleBlacklist.sol |
+ RuleMaxTotalSupplyOwnable2Step.sol |
|
100.0 % |
- 10 / 10 |
+ 1 / 1 |
100.0 % |
- 6 / 6 |
+ 1 / 1 |
- |
0 / 0 |
- | RuleMaxTotalSupply.sol |
+ RuleIdentityRegistryOwnable2Step.sol |
+
+
+ |
+ 100.0 % |
+ 1 / 1 |
+ 100.0 % |
+ 1 / 1 |
+ - |
+ 0 / 0 |
+
+
+ | RuleIdentityRegistry.sol |
|
@@ -118,67 +130,79 @@
0 / 0 |
- | RuleWhitelist.sol |
+ RuleWhitelistWrapperOwnable2Step.sol |
|
100.0 % |
- 11 / 11 |
+ 8 / 8 |
100.0 % |
- 7 / 7 |
+ 5 / 5 |
- |
0 / 0 |
- | RuleBlacklistOwnable2Step.sol |
+ RuleSanctionsList.sol |
|
100.0 % |
- 8 / 8 |
+ 10 / 10 |
100.0 % |
5 / 5 |
- |
0 / 0 |
- | RuleMaxTotalSupplyOwnable2Step.sol |
+ RuleERC2980.sol |
|
100.0 % |
- 1 / 1 |
+ 12 / 12 |
100.0 % |
- 1 / 1 |
+ 8 / 8 |
- |
0 / 0 |
- | RuleWhitelistWrapper.sol |
+ RuleMaxTotalSupply.sol |
|
100.0 % |
- 17 / 17 |
+ 4 / 4 |
100.0 % |
- 9 / 9 |
+ 2 / 2 |
- |
0 / 0 |
- | RuleSanctionsList.sol |
+ RuleWhitelist.sol |
|
100.0 % |
- 10 / 10 |
+ 12 / 12 |
100.0 % |
- 5 / 5 |
+ 7 / 7 |
- |
0 / 0 |
- | RuleWhitelistWrapperOwnable2Step.sol |
+ RuleWhitelistWrapper.sol |
+
+
+ |
+ 100.0 % |
+ 17 / 17 |
+ 100.0 % |
+ 9 / 9 |
+ - |
+ 0 / 0 |
+
+
+ | RuleSpenderWhitelistOwnable2Step.sol |
|
@@ -190,62 +214,62 @@
0 / 0 |
- | RuleERC2980Ownable2Step.sol |
+ RuleSanctionsListOwnable2Step.sol |
|
100.0 % |
- 10 / 10 |
- 100.0 % |
7 / 7 |
+ 100.0 % |
+ 4 / 4 |
- |
0 / 0 |
- | RuleERC2980.sol |
+ RuleSpenderWhitelist.sol |
|
100.0 % |
- 12 / 12 |
+ 11 / 11 |
100.0 % |
- 8 / 8 |
+ 6 / 6 |
- |
0 / 0 |
- | RuleIdentityRegistry.sol |
+ RuleBlacklistOwnable2Step.sol |
|
100.0 % |
- 4 / 4 |
+ 8 / 8 |
100.0 % |
- 2 / 2 |
+ 5 / 5 |
- |
0 / 0 |
- | RuleWhitelistOwnable2Step.sol |
+ RuleERC2980Ownable2Step.sol |
|
100.0 % |
- 9 / 9 |
+ 10 / 10 |
100.0 % |
- 6 / 6 |
+ 7 / 7 |
- |
0 / 0 |
- | RuleIdentityRegistryOwnable2Step.sol |
+ RuleBlacklist.sol |
|
100.0 % |
- 1 / 1 |
+ 11 / 11 |
100.0 % |
- 1 / 1 |
+ 6 / 6 |
- |
0 / 0 |
diff --git a/doc/coverage/coverage/deployment/index-sort-f.html b/doc/coverage/coverage/deployment/index-sort-f.html
index a3d26c0..966a0a0 100644
--- a/doc/coverage/coverage/deployment/index-sort-f.html
+++ b/doc/coverage/coverage/deployment/index-sort-f.html
@@ -31,17 +31,17 @@
|
-
-
+
+
-
+
|
-
-
+
+
@@ -106,7 +106,7 @@
| 0 / 0 |
- | RuleMaxTotalSupply.sol |
+ RuleIdentityRegistry.sol |
|
@@ -118,7 +118,7 @@
0 / 0 |
- | RuleIdentityRegistry.sol |
+ RuleMaxTotalSupply.sol |
|
@@ -142,7 +142,7 @@
0 / 0 |
- | RuleBlacklistOwnable2Step.sol |
+ RuleWhitelistWrapperOwnable2Step.sol |
|
@@ -166,7 +166,7 @@
0 / 0 |
- | RuleWhitelistWrapperOwnable2Step.sol |
+ RuleSpenderWhitelistOwnable2Step.sol |
|
@@ -178,14 +178,14 @@
0 / 0 |
- | RuleBlacklist.sol |
+ RuleBlacklistOwnable2Step.sol |
|
100.0 % |
- 10 / 10 |
+ 8 / 8 |
100.0 % |
- 6 / 6 |
+ 5 / 5 |
- |
0 / 0 |
@@ -202,13 +202,37 @@
0 / 0 |
- | RuleWhitelist.sol |
+ RuleSpenderWhitelist.sol |
+
+
+ |
+ 100.0 % |
+ 11 / 11 |
+ 100.0 % |
+ 6 / 6 |
+ - |
+ 0 / 0 |
+
+
+ | RuleBlacklist.sol |
|
100.0 % |
11 / 11 |
100.0 % |
+ 6 / 6 |
+ - |
+ 0 / 0 |
+
+
+ | RuleWhitelist.sol |
+
+
+ |
+ 100.0 % |
+ 12 / 12 |
+ 100.0 % |
7 / 7 |
- |
0 / 0 |
diff --git a/doc/coverage/coverage/deployment/index-sort-l.html b/doc/coverage/coverage/deployment/index-sort-l.html
index 6ace07a..af7dd25 100644
--- a/doc/coverage/coverage/deployment/index-sort-l.html
+++ b/doc/coverage/coverage/deployment/index-sort-l.html
@@ -31,17 +31,17 @@
|
-
-
+
+
-
+
|
-
-
+
+
@@ -106,7 +106,7 @@
| 0 / 0 |
- | RuleMaxTotalSupply.sol |
+ RuleIdentityRegistry.sol |
|
@@ -118,7 +118,7 @@
0 / 0 |
- | RuleIdentityRegistry.sol |
+ RuleMaxTotalSupply.sol |
|
@@ -142,7 +142,7 @@
0 / 0 |
- | RuleBlacklistOwnable2Step.sol |
+ RuleWhitelistWrapperOwnable2Step.sol |
|
@@ -154,7 +154,7 @@
0 / 0 |
- | RuleWhitelistWrapperOwnable2Step.sol |
+ RuleSpenderWhitelistOwnable2Step.sol |
|
@@ -166,24 +166,24 @@
0 / 0 |
- | RuleWhitelistOwnable2Step.sol |
+ RuleBlacklistOwnable2Step.sol |
|
100.0 % |
- 9 / 9 |
+ 8 / 8 |
100.0 % |
- 6 / 6 |
+ 5 / 5 |
- |
0 / 0 |
- | RuleBlacklist.sol |
+ RuleWhitelistOwnable2Step.sol |
|
100.0 % |
- 10 / 10 |
+ 9 / 9 |
100.0 % |
6 / 6 |
- |
@@ -214,14 +214,26 @@
0 / 0 |
- | RuleWhitelist.sol |
+ RuleSpenderWhitelist.sol |
|
100.0 % |
11 / 11 |
100.0 % |
- 7 / 7 |
+ 6 / 6 |
+ - |
+ 0 / 0 |
+
+
+ | RuleBlacklist.sol |
+
+
+ |
+ 100.0 % |
+ 11 / 11 |
+ 100.0 % |
+ 6 / 6 |
- |
0 / 0 |
@@ -237,6 +249,18 @@
- |
0 / 0 |
+
+ | RuleWhitelist.sol |
+
+
+ |
+ 100.0 % |
+ 12 / 12 |
+ 100.0 % |
+ 7 / 7 |
+ - |
+ 0 / 0 |
+
| RuleWhitelistWrapper.sol |
diff --git a/doc/coverage/coverage/deployment/index.html b/doc/coverage/coverage/deployment/index.html
index e2cc395..6516ec5 100644
--- a/doc/coverage/coverage/deployment/index.html
+++ b/doc/coverage/coverage/deployment/index.html
@@ -31,17 +31,17 @@
|
|
-
-
+
+
-
+
|
-
-
+
+
@@ -87,7 +87,7 @@
| 100.0 % |
- 10 / 10 |
+ 11 / 11 |
100.0 % |
6 / 6 |
- |
@@ -202,13 +202,37 @@
0 / 0 |
- | RuleWhitelist.sol |
+ RuleSpenderWhitelist.sol |
|
100.0 % |
11 / 11 |
100.0 % |
+ 6 / 6 |
+ - |
+ 0 / 0 |
+
+
+ | RuleSpenderWhitelistOwnable2Step.sol |
+
+
+ |
+ 100.0 % |
+ 8 / 8 |
+ 100.0 % |
+ 5 / 5 |
+ - |
+ 0 / 0 |
+
+
+ | RuleWhitelist.sol |
+
+
+ |
+ 100.0 % |
+ 12 / 12 |
+ 100.0 % |
7 / 7 |
- |
0 / 0 |
diff --git a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/AccessControlModuleStandalone.sol.func-sort-c.html b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/AccessControlModuleStandalone.sol.func-sort-c.html
index 6e237b7..2ec22a1 100644
--- a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/AccessControlModuleStandalone.sol.func-sort-c.html
+++ b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/AccessControlModuleStandalone.sol.func-sort-c.html
@@ -37,7 +37,7 @@
-
+
|
@@ -70,11 +70,11 @@
| AccessControlModuleStandalone.constructor |
- 396 |
+ 421 |
| AccessControlModuleStandalone.hasRole |
- 507 |
+ 531 |
diff --git a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/AccessControlModuleStandalone.sol.func.html b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/AccessControlModuleStandalone.sol.func.html
index ce374e8..14ea0ee 100644
--- a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/AccessControlModuleStandalone.sol.func.html
+++ b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/AccessControlModuleStandalone.sol.func.html
@@ -37,7 +37,7 @@
-
+
|
@@ -70,11 +70,11 @@
| AccessControlModuleStandalone.constructor |
- 396 |
+ 421 |
| AccessControlModuleStandalone.hasRole |
- 507 |
+ 531 |
diff --git a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/AccessControlModuleStandalone.sol.gcov.html b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/AccessControlModuleStandalone.sol.gcov.html
index 0ff4430..a786a91 100644
--- a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/AccessControlModuleStandalone.sol.gcov.html
+++ b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/AccessControlModuleStandalone.sol.gcov.html
@@ -37,7 +37,7 @@
-
+
|
@@ -92,12 +92,12 @@
21 : : * @param admin The address that will receive the `DEFAULT_ADMIN_ROLE`.
22 : : */
23 : :
- 24 : 396 : constructor(address admin) {
- 25 [ + + ]: 396 : require(admin != address(0), AccessControlModuleStandalone_AddressZeroNotAllowed());
+ 24 : 421 : constructor(address admin) {
+ 25 [ + + ]: 421 : require(admin != address(0), AccessControlModuleStandalone_AddressZeroNotAllowed());
26 : : // we don't check the return value
27 : : // _grantRole attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted.
28 : : // return false only if the admin has already the role
- 29 : 391 : _grantRole(DEFAULT_ADMIN_ROLE, admin);
+ 29 : 415 : _grantRole(DEFAULT_ADMIN_ROLE, admin);
30 : : }
31 : :
32 : : /*//////////////////////////////////////////////////////////////
@@ -106,7 +106,7 @@
35 : : /**
36 : : * @dev Returns `true` if `account` has been granted `role`.
37 : : */
- 38 : 507 : function hasRole(bytes32 role, address account)
+ 38 : 531 : function hasRole(bytes32 role, address account)
39 : : public
40 : : view
41 : : virtual
@@ -115,10 +115,10 @@
44 : : {
45 : : // Dev note: default admin is treated as having all roles but may not appear in enumerable role members.
46 : : // The Default Admin has all roles
- 47 [ + + ]: 3597 : if (AccessControl.hasRole(DEFAULT_ADMIN_ROLE, account)) {
- 48 : 3110 : return true;
+ 47 [ + + ]: 3534 : if (AccessControl.hasRole(DEFAULT_ADMIN_ROLE, account)) {
+ 48 : 3021 : return true;
49 : : } else {
- 50 : 487 : return AccessControl.hasRole(role, account);
+ 50 : 513 : return AccessControl.hasRole(role, account);
51 : : }
52 : : }
53 : : }
diff --git a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/VersionModule.sol.func-sort-c.html b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/VersionModule.sol.func-sort-c.html
index 9a3a841..8bceb58 100644
--- a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/VersionModule.sol.func-sort-c.html
+++ b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/VersionModule.sol.func-sort-c.html
@@ -37,7 +37,7 @@
-
+
|
diff --git a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/VersionModule.sol.func.html b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/VersionModule.sol.func.html
index ba069d3..8e9e823 100644
--- a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/VersionModule.sol.func.html
+++ b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/VersionModule.sol.func.html
@@ -37,7 +37,7 @@
-
+
|
diff --git a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/VersionModule.sol.gcov.html b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/VersionModule.sol.gcov.html
index 21cb955..50ad511 100644
--- a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/VersionModule.sol.gcov.html
+++ b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/VersionModule.sol.gcov.html
@@ -37,7 +37,7 @@
-
+
|
diff --git a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/index-sort-b.html b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/index-sort-b.html
index 1c2b511..6a86955 100644
--- a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/index-sort-b.html
+++ b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/index-sort-b.html
@@ -37,7 +37,7 @@
-
+
|
diff --git a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/index-sort-f.html b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/index-sort-f.html
index 250be9c..d2c4b7f 100644
--- a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/index-sort-f.html
+++ b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/index-sort-f.html
@@ -37,7 +37,7 @@
-
+
|
diff --git a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/index-sort-l.html b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/index-sort-l.html
index 38d71c7..8a6ec85 100644
--- a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/index-sort-l.html
+++ b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/index-sort-l.html
@@ -37,7 +37,7 @@
-
+
|
diff --git a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/index.html b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/index.html
index e1ab118..6117c79 100644
--- a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/index.html
+++ b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/index.html
@@ -37,7 +37,7 @@
-
+
|
diff --git a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/RuleConditionalTransferLight.sol.func-sort-c.html b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/RuleConditionalTransferLight.sol.func-sort-c.html
index 79562b0..67c7b18 100644
--- a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/RuleConditionalTransferLight.sol.func-sort-c.html
+++ b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/RuleConditionalTransferLight.sol.func-sort-c.html
@@ -37,7 +37,7 @@
-
+
|
@@ -81,16 +81,16 @@
18 |
- | RuleConditionalTransferLight._onlyComplianceManager |
+ RuleConditionalTransferLight._onlyComplianceManager |
19 |
| RuleConditionalTransferLight._authorizeTransferExecution |
- 857 |
+ 770 |
| RuleConditionalTransferLight._authorizeTransferApproval |
- 1947 |
+ 1848 |
diff --git a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/RuleConditionalTransferLight.sol.func.html b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/RuleConditionalTransferLight.sol.func.html
index a785d77..59fbabf 100644
--- a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/RuleConditionalTransferLight.sol.func.html
+++ b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/RuleConditionalTransferLight.sol.func.html
@@ -37,7 +37,7 @@
-
+
|
@@ -70,14 +70,14 @@
| RuleConditionalTransferLight._authorizeTransferApproval |
- 1947 |
+ 1848 |
| RuleConditionalTransferLight._authorizeTransferExecution |
- 857 |
+ 770 |
- | RuleConditionalTransferLight._onlyComplianceManager |
+ RuleConditionalTransferLight._onlyComplianceManager |
19 |
diff --git a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/RuleConditionalTransferLight.sol.gcov.html b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/RuleConditionalTransferLight.sol.gcov.html
index c7dd5c5..f49dbcf 100644
--- a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/RuleConditionalTransferLight.sol.gcov.html
+++ b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/RuleConditionalTransferLight.sol.gcov.html
@@ -37,7 +37,7 @@
-
+
|
@@ -114,17 +114,14 @@
43 : 1 : _transferred(from, address(0), value);
44 : : }
45 : :
- 46 : 1947 : function _authorizeTransferApproval() internal view virtual override onlyRole(OPERATOR_ROLE) {}
+ 46 : 1848 : function _authorizeTransferApproval() internal view virtual override onlyRole(OPERATOR_ROLE) {}
47 : :
- 48 : 857 : function _authorizeTransferExecution() internal view virtual override {
- 49 [ + + ]: 857 : require(
- 50 : : isTokenBound(_msgSender()),
- 51 : : RuleConditionalTransferLight_TransferExecutorUnauthorized(_msgSender())
- 52 : : );
- 53 : : }
- 54 : :
- 55 : 19 : function _onlyComplianceManager() internal virtual override onlyRole(COMPLIANCE_MANAGER_ROLE) {}
- 56 : : }
+ 48 : 770 : function _authorizeTransferExecution() internal view virtual override {
+ 49 [ + + ]: 770 : require(isTokenBound(_msgSender()), RuleConditionalTransferLight_TransferExecutorUnauthorized(_msgSender()));
+ 50 : : }
+ 51 : :
+ 52 : 19 : function _onlyComplianceManager() internal virtual override onlyRole(COMPLIANCE_MANAGER_ROLE) {}
+ 53 : : }
diff --git a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/RuleConditionalTransferLightOwnable2Step.sol.func-sort-c.html b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/RuleConditionalTransferLightOwnable2Step.sol.func-sort-c.html
index b181ee1..7a7c2bf 100644
--- a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/RuleConditionalTransferLightOwnable2Step.sol.func-sort-c.html
+++ b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/RuleConditionalTransferLightOwnable2Step.sol.func-sort-c.html
@@ -37,7 +37,7 @@
-
+
|
@@ -69,15 +69,15 @@
Hit count  |
- | RuleConditionalTransferLightOwnable2Step._authorizeTransferExecution |
+ RuleConditionalTransferLightOwnable2Step._authorizeTransferExecution |
3 |
- | RuleConditionalTransferLightOwnable2Step._authorizeTransferApproval |
+ RuleConditionalTransferLightOwnable2Step._authorizeTransferApproval |
4 |
- | RuleConditionalTransferLightOwnable2Step.supportsInterface |
+ RuleConditionalTransferLightOwnable2Step.supportsInterface |
4 |
diff --git a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/RuleConditionalTransferLightOwnable2Step.sol.func.html b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/RuleConditionalTransferLightOwnable2Step.sol.func.html
index 60b99de..bb0973f 100644
--- a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/RuleConditionalTransferLightOwnable2Step.sol.func.html
+++ b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/RuleConditionalTransferLightOwnable2Step.sol.func.html
@@ -37,7 +37,7 @@
-
+
|
@@ -69,15 +69,15 @@
Hit count  |
- | RuleConditionalTransferLightOwnable2Step._authorizeTransferApproval |
+ RuleConditionalTransferLightOwnable2Step._authorizeTransferApproval |
4 |
- | RuleConditionalTransferLightOwnable2Step._authorizeTransferExecution |
+ RuleConditionalTransferLightOwnable2Step._authorizeTransferExecution |
3 |
- | RuleConditionalTransferLightOwnable2Step.supportsInterface |
+ RuleConditionalTransferLightOwnable2Step.supportsInterface |
4 |
diff --git a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/RuleConditionalTransferLightOwnable2Step.sol.gcov.html b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/RuleConditionalTransferLightOwnable2Step.sol.gcov.html
index b0a0b09..de9032f 100644
--- a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/RuleConditionalTransferLightOwnable2Step.sol.gcov.html
+++ b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/RuleConditionalTransferLightOwnable2Step.sol.gcov.html
@@ -37,7 +37,7 @@
-
+
|
@@ -83,21 +83,18 @@
12 : : * @title RuleConditionalTransferLightOwnable2Step
13 : : * @notice Ownable2Step variant of RuleConditionalTransferLight.
14 : : */
- 15 : : contract RuleConditionalTransferLightOwnable2Step is
- 16 : : RuleConditionalTransferLightBase,
- 17 : : Ownable2Step
- 18 : : {
- 19 : : constructor(address owner) Ownable(owner) {}
- 20 : :
- 21 : 4 : function supportsInterface(bytes4 interfaceId) public view override returns (bool) {
- 22 : 4 : return interfaceId == type(IERC165).interfaceId || interfaceId == RuleInterfaceId.IRULE_INTERFACE_ID
- 23 : 2 : || interfaceId == type(IRule).interfaceId;
- 24 : : }
- 25 : :
- 26 : 4 : function _authorizeTransferApproval() internal view virtual override onlyOwner {}
- 27 : :
- 28 : 3 : function _authorizeTransferExecution() internal view virtual override onlyOwner {}
- 29 : : }
+ 15 : : contract RuleConditionalTransferLightOwnable2Step is RuleConditionalTransferLightBase, Ownable2Step {
+ 16 : : constructor(address owner) Ownable(owner) {}
+ 17 : :
+ 18 : 4 : function supportsInterface(bytes4 interfaceId) public view override returns (bool) {
+ 19 : 4 : return interfaceId == type(IERC165).interfaceId || interfaceId == RuleInterfaceId.IRULE_INTERFACE_ID
+ 20 : 2 : || interfaceId == type(IRule).interfaceId;
+ 21 : : }
+ 22 : :
+ 23 : 4 : function _authorizeTransferApproval() internal view virtual override onlyOwner {}
+ 24 : :
+ 25 : 3 : function _authorizeTransferExecution() internal view virtual override onlyOwner {}
+ 26 : : }
diff --git a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/abstract/RuleConditionalTransferLightBase.sol.func-sort-c.html b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/abstract/RuleConditionalTransferLightBase.sol.func-sort-c.html
index d8df2c5..d263bae 100644
--- a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/abstract/RuleConditionalTransferLightBase.sol.func-sort-c.html
+++ b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/abstract/RuleConditionalTransferLightBase.sol.func-sort-c.html
@@ -31,13 +31,13 @@
|
-
-
+
+
-
+
|
@@ -69,76 +69,76 @@
Hit count  |
- | RuleConditionalTransferLightBase.canReturnTransferRestrictionCode |
+ RuleConditionalTransferLightBase.canReturnTransferRestrictionCode |
1 |
- | RuleConditionalTransferLightBase.canTransferFrom |
+ RuleConditionalTransferLightBase.canTransferFrom |
1 |
- | RuleConditionalTransferLightBase.detectTransferRestrictionFrom |
+ RuleConditionalTransferLightBase.detectTransferRestrictionFrom |
1 |
- | RuleConditionalTransferLightBase.transferred.1 |
+ RuleConditionalTransferLightBase.transferred.1 |
1 |
- | RuleConditionalTransferLightBase.messageForTransferRestriction |
+ RuleConditionalTransferLightBase.messageForTransferRestriction |
2 |
- | RuleConditionalTransferLightBase._transferredFromContext |
+ RuleConditionalTransferLightBase._transferredFromContext |
3 |
- | RuleConditionalTransferLightBase.onlyTransferExecutor |
+ RuleConditionalTransferLightBase.onlyTransferExecutor |
3 |
- | RuleConditionalTransferLightBase.transferred.2 |
+ RuleConditionalTransferLightBase.transferred.2 |
3 |
- | RuleConditionalTransferLightBase.approveAndTransferIfAllowed |
+ RuleConditionalTransferLightBase.approveAndTransferIfAllowed |
4 |
- | RuleConditionalTransferLightBase.canTransfer |
+ RuleConditionalTransferLightBase.canTransfer |
4 |
- | RuleConditionalTransferLightBase.cancelTransferApproval |
+ RuleConditionalTransferLightBase.cancelTransferApproval |
4 |
- | RuleConditionalTransferLightBase.onlyTransferApprover |
+ RuleConditionalTransferLightBase.onlyTransferApprover |
4 |
- | RuleConditionalTransferLightBase.detectTransferRestriction |
+ RuleConditionalTransferLightBase.detectTransferRestriction |
7 |
- | RuleConditionalTransferLightBase.approvedCount |
- 264 |
+ RuleConditionalTransferLightBase.approvedCount |
+ 263 |
- | RuleConditionalTransferLightBase.transferred.0 |
- 856 |
+ RuleConditionalTransferLightBase.transferred.0 |
+ 769 |
- | RuleConditionalTransferLightBase._transferred |
- 860 |
+ RuleConditionalTransferLightBase._transferred |
+ 773 |
- | RuleConditionalTransferLightBase.approveTransfer |
- 1940 |
+ RuleConditionalTransferLightBase.approveTransfer |
+ 1841 |
- | RuleConditionalTransferLightBase._transferHash |
- 3063 |
+ RuleConditionalTransferLightBase._transferHash |
+ 2885 |
diff --git a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/abstract/RuleConditionalTransferLightBase.sol.func.html b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/abstract/RuleConditionalTransferLightBase.sol.func.html
index bd1a0a3..aa179f3 100644
--- a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/abstract/RuleConditionalTransferLightBase.sol.func.html
+++ b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/abstract/RuleConditionalTransferLightBase.sol.func.html
@@ -31,13 +31,13 @@
|
-
-
+
+
-
+
|
@@ -69,75 +69,75 @@
Hit count  |
- | RuleConditionalTransferLightBase._transferHash |
- 3063 |
+ RuleConditionalTransferLightBase._transferHash |
+ 2885 |
- | RuleConditionalTransferLightBase._transferred |
- 860 |
+ RuleConditionalTransferLightBase._transferred |
+ 773 |
- | RuleConditionalTransferLightBase._transferredFromContext |
+ RuleConditionalTransferLightBase._transferredFromContext |
3 |
- | RuleConditionalTransferLightBase.approveAndTransferIfAllowed |
+ RuleConditionalTransferLightBase.approveAndTransferIfAllowed |
4 |
- | RuleConditionalTransferLightBase.approveTransfer |
- 1940 |
+ RuleConditionalTransferLightBase.approveTransfer |
+ 1841 |
- | RuleConditionalTransferLightBase.approvedCount |
- 264 |
+ RuleConditionalTransferLightBase.approvedCount |
+ 263 |
- | RuleConditionalTransferLightBase.canReturnTransferRestrictionCode |
+ RuleConditionalTransferLightBase.canReturnTransferRestrictionCode |
1 |
- | RuleConditionalTransferLightBase.canTransfer |
+ RuleConditionalTransferLightBase.canTransfer |
4 |
- | RuleConditionalTransferLightBase.canTransferFrom |
+ RuleConditionalTransferLightBase.canTransferFrom |
1 |
- | RuleConditionalTransferLightBase.cancelTransferApproval |
+ RuleConditionalTransferLightBase.cancelTransferApproval |
4 |
- | RuleConditionalTransferLightBase.detectTransferRestriction |
+ RuleConditionalTransferLightBase.detectTransferRestriction |
7 |
- | RuleConditionalTransferLightBase.detectTransferRestrictionFrom |
+ RuleConditionalTransferLightBase.detectTransferRestrictionFrom |
1 |
- | RuleConditionalTransferLightBase.messageForTransferRestriction |
+ RuleConditionalTransferLightBase.messageForTransferRestriction |
2 |
- | RuleConditionalTransferLightBase.onlyTransferApprover |
+ RuleConditionalTransferLightBase.onlyTransferApprover |
4 |
- | RuleConditionalTransferLightBase.onlyTransferExecutor |
+ RuleConditionalTransferLightBase.onlyTransferExecutor |
3 |
- | RuleConditionalTransferLightBase.transferred.0 |
- 856 |
+ RuleConditionalTransferLightBase.transferred.0 |
+ 769 |
- | RuleConditionalTransferLightBase.transferred.1 |
+ RuleConditionalTransferLightBase.transferred.1 |
1 |
- | RuleConditionalTransferLightBase.transferred.2 |
+ RuleConditionalTransferLightBase.transferred.2 |
3 |
diff --git a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/abstract/RuleConditionalTransferLightBase.sol.gcov.html b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/abstract/RuleConditionalTransferLightBase.sol.gcov.html
index 4dc44fd..4855a0f 100644
--- a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/abstract/RuleConditionalTransferLightBase.sol.gcov.html
+++ b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/abstract/RuleConditionalTransferLightBase.sol.gcov.html
@@ -31,13 +31,13 @@
|
-
-
+
+
-
+
|
@@ -79,184 +79,202 @@
8 : : import {IRule} from "RuleEngine/interfaces/IRule.sol";
9 : : import {ITransferContext} from "../../interfaces/ITransferContext.sol";
10 : : import {IERC20} from "OZ/token/ERC20/IERC20.sol";
- 11 : : import {
- 12 : : RuleConditionalTransferLightInvariantStorage
- 13 : : } from "./RuleConditionalTransferLightInvariantStorage.sol";
- 14 : : import {VersionModule} from "../../../modules/VersionModule.sol";
- 15 : :
- 16 : : /**
- 17 : : * @title RuleConditionalTransferLightBase
- 18 : : * @dev Requires operator approval for each transfer. Same transfer (from, to, value)
- 19 : : * can be approved multiple times to allow repeated transfers.
- 20 : : */
- 21 : : abstract contract RuleConditionalTransferLightBase is VersionModule, RuleConditionalTransferLightInvariantStorage, IRule {
- 22 : : // Mapping from transfer hash to approval count
- 23 : : mapping(bytes32 => uint256) public approvalCounts;
- 24 : :
- 25 : 1940 : function approveTransfer(address from, address to, uint256 value) public onlyTransferApprover {
- 26 : 1941 : bytes32 transferHash = _transferHash(from, to, value);
- 27 : 1941 : approvalCounts[transferHash] += 1;
- 28 : 1941 : emit TransferApproved(from, to, value, approvalCounts[transferHash]);
- 29 : : }
- 30 : :
- 31 : 4 : function cancelTransferApproval(address from, address to, uint256 value) public onlyTransferApprover {
- 32 : 3 : bytes32 transferHash = _transferHash(from, to, value);
- 33 : 3 : uint256 count = approvalCounts[transferHash];
- 34 [ + + ]: 3 : require(count != 0, TransferApprovalNotFound());
- 35 : 2 : approvalCounts[transferHash] = count - 1;
- 36 : 2 : emit TransferApprovalCancelled(from, to, value, approvalCounts[transferHash]);
- 37 : : }
- 38 : :
- 39 : : /**
- 40 : : * @notice Approves and performs a transferFrom using this rule as spender.
- 41 : : * @dev Requires `from` to have approved this contract on the token.
- 42 : : * @dev This function is only safe for tokens that call back `transferred()` during transfer.
- 43 : : * @dev CEI is intentionally inverted so the approval exists for the callback.
- 44 : : */
- 45 : 4 : function approveAndTransferIfAllowed(address token, address from, address to, uint256 value)
- 46 : : public
- 47 : : onlyTransferApprover
- 48 : : returns (bool)
- 49 : : {
- 50 [ + + ]: 4 : require(token != address(0), RuleConditionalTransferLight_TokenAddressZeroNotAllowed());
- 51 : :
- 52 : 3 : approveTransfer(from, to, value);
+ 11 : : import {RuleConditionalTransferLightInvariantStorage} from "./RuleConditionalTransferLightInvariantStorage.sol";
+ 12 : : import {VersionModule} from "../../../modules/VersionModule.sol";
+ 13 : :
+ 14 : : /**
+ 15 : : * @title RuleConditionalTransferLightBase
+ 16 : : * @dev Requires operator approval for each transfer. Same transfer (from, to, value)
+ 17 : : * can be approved multiple times to allow repeated transfers.
+ 18 : : */
+ 19 : : abstract contract RuleConditionalTransferLightBase is
+ 20 : : VersionModule,
+ 21 : : RuleConditionalTransferLightInvariantStorage,
+ 22 : : IRule
+ 23 : : {
+ 24 : : // Mapping from transfer hash to approval count
+ 25 : : mapping(bytes32 => uint256) public approvalCounts;
+ 26 : :
+ 27 : 1841 : function approveTransfer(address from, address to, uint256 value) public onlyTransferApprover {
+ 28 : 1842 : bytes32 transferHash = _transferHash(from, to, value);
+ 29 : 1842 : approvalCounts[transferHash] += 1;
+ 30 : 1842 : emit TransferApproved(from, to, value, approvalCounts[transferHash]);
+ 31 : : }
+ 32 : :
+ 33 : 4 : function cancelTransferApproval(address from, address to, uint256 value) public onlyTransferApprover {
+ 34 : 3 : bytes32 transferHash = _transferHash(from, to, value);
+ 35 : 3 : uint256 count = approvalCounts[transferHash];
+ 36 [ + + ]: 3 : require(count != 0, TransferApprovalNotFound());
+ 37 : 2 : approvalCounts[transferHash] = count - 1;
+ 38 : 2 : emit TransferApprovalCancelled(from, to, value, approvalCounts[transferHash]);
+ 39 : : }
+ 40 : :
+ 41 : : /**
+ 42 : : * @notice Approves and performs a transferFrom using this rule as spender.
+ 43 : : * @dev Requires `from` to have approved this contract on the token.
+ 44 : : * @dev This function is only safe for tokens that call back `transferred()` during transfer.
+ 45 : : * @dev CEI is intentionally inverted so the approval exists for the callback.
+ 46 : : */
+ 47 : 4 : function approveAndTransferIfAllowed(address token, address from, address to, uint256 value)
+ 48 : : public
+ 49 : : onlyTransferApprover
+ 50 : : returns (bool)
+ 51 : : {
+ 52 [ + + ]: 4 : require(token != address(0), RuleConditionalTransferLight_TokenAddressZeroNotAllowed());
53 : :
- 54 : 3 : uint256 allowed = IERC20(token).allowance(from, address(this));
- 55 [ + + ]: 3 : require(
- 56 : : allowed >= value,
- 57 : : RuleConditionalTransferLight_InsufficientAllowance(token, from, allowed, value)
- 58 : : );
- 59 : :
- 60 : 2 : bool success = IERC20(token).transferFrom(from, to, value);
- 61 [ + + ]: 2 : require(success, RuleConditionalTransferLight_TransferFailed());
- 62 : 1 : return true;
- 63 : : }
- 64 : :
- 65 : 264 : function approvedCount(address from, address to, uint256 value) public view returns (uint256) {
- 66 : 264 : bytes32 transferHash = _transferHash(from, to, value);
- 67 : 264 : return approvalCounts[transferHash];
- 68 : : }
- 69 : :
- 70 : 856 : function transferred(address from, address to, uint256 value)
- 71 : : public
- 72 : : override(IERC3643IComplianceContract)
- 73 : : onlyTransferExecutor
- 74 : : {
- 75 : 854 : _transferred(from, to, value);
- 76 : : }
- 77 : :
- 78 : 1 : function transferred(address /* spender */, address from, address to, uint256 value)
- 79 : : public
- 80 : : override(IRuleEngine)
- 81 : : onlyTransferExecutor
- 82 : : {
- 83 : 1 : _transferred(from, to, value);
- 84 : : }
- 85 : :
- 86 : 7 : function detectTransferRestriction(address from, address to, uint256 value)
- 87 : : public
- 88 : : view
- 89 : : override(IERC1404)
- 90 : : returns (uint8)
- 91 : : {
- 92 [ + ]: 13 : if (from == address(0) || to == address(0)) {
- 93 : 4 : return uint8(IERC1404Extend.REJECTED_CODE_BASE.TRANSFER_OK);
- 94 : : }
- 95 : 9 : bytes32 transferHash = _transferHash(from, to, value);
- 96 [ + ]: 9 : if (approvalCounts[transferHash] == 0) {
- 97 : 6 : return CODE_TRANSFER_REQUEST_NOT_APPROVED;
- 98 : : }
- 99 : 3 : return uint8(IERC1404Extend.REJECTED_CODE_BASE.TRANSFER_OK);
- 100 : : }
- 101 : :
- 102 : 1 : function detectTransferRestrictionFrom(address /* spender */, address from, address to, uint256 value)
- 103 : : public
- 104 : : view
- 105 : : override(IERC1404Extend)
- 106 : : returns (uint8)
- 107 : : {
- 108 : 2 : return detectTransferRestriction(from, to, value);
- 109 : : }
- 110 : :
- 111 : 4 : function canTransfer(address from, address to, uint256 value)
- 112 : : public
- 113 : : view
- 114 : : override(IERC3643ComplianceRead)
- 115 : : returns (bool)
- 116 : : {
- 117 : 4 : return detectTransferRestriction(from, to, value) == uint8(IERC1404Extend.REJECTED_CODE_BASE.TRANSFER_OK);
- 118 : : }
- 119 : :
- 120 : 1 : function canTransferFrom(address spender, address from, address to, uint256 value)
- 121 : : public
- 122 : : view
- 123 : : override(IERC7551Compliance)
- 124 : : returns (bool)
- 125 : : {
- 126 : 1 : return detectTransferRestrictionFrom(spender, from, to, value)
- 127 : : == uint8(IERC1404Extend.REJECTED_CODE_BASE.TRANSFER_OK);
- 128 : : }
- 129 : :
- 130 : 1 : function canReturnTransferRestrictionCode(uint8 restrictionCode) external pure override(IRule) returns (bool) {
- 131 : 1 : return restrictionCode == CODE_TRANSFER_REQUEST_NOT_APPROVED;
- 132 : : }
- 133 : :
- 134 : 2 : function messageForTransferRestriction(uint8 restrictionCode)
- 135 : : external
- 136 : : pure
- 137 : : override(IERC1404)
- 138 : : returns (string memory)
- 139 : : {
- 140 [ + ]: 2 : if (restrictionCode == CODE_TRANSFER_REQUEST_NOT_APPROVED) {
- 141 : 1 : return TEXT_TRANSFER_REQUEST_NOT_APPROVED;
- 142 : : }
- 143 : 1 : return TEXT_CODE_NOT_FOUND;
- 144 : : }
- 145 : :
- 146 : 3 : function transferred(ITransferContext.FungibleTransferContext calldata ctx) external onlyTransferExecutor {
- 147 : 3 : _transferredFromContext(ctx);
- 148 : : }
- 149 : :
- 150 : 3 : function _transferredFromContext(ITransferContext.FungibleTransferContext calldata ctx) internal virtual {
- 151 : 3 : _transferred(ctx.from, ctx.to, ctx.value);
- 152 : : }
- 153 : :
- 154 : 860 : function _transferred(address from, address to, uint256 value) internal virtual {
- 155 [ + ]: 860 : if (from == address(0) || to == address(0)) {
- 156 : 860 : return;
- 157 : : }
- 158 : 846 : bytes32 transferHash = _transferHash(from, to, value);
- 159 : 846 : uint256 count = approvalCounts[transferHash];
+ 54 : 3 : approveTransfer(from, to, value);
+ 55 : :
+ 56 : 3 : uint256 allowed = IERC20(token).allowance(from, address(this));
+ 57 [ + + ]: 3 : require(allowed >= value, RuleConditionalTransferLight_InsufficientAllowance(token, from, allowed, value));
+ 58 : :
+ 59 : 2 : bool success = IERC20(token).transferFrom(from, to, value);
+ 60 [ + + ]: 2 : require(success, RuleConditionalTransferLight_TransferFailed());
+ 61 : 1 : return true;
+ 62 : : }
+ 63 : :
+ 64 : 263 : function approvedCount(address from, address to, uint256 value) public view returns (uint256) {
+ 65 : 263 : bytes32 transferHash = _transferHash(from, to, value);
+ 66 : 263 : return approvalCounts[transferHash];
+ 67 : : }
+ 68 : :
+ 69 : 769 : function transferred(address from, address to, uint256 value)
+ 70 : : public
+ 71 : : override(IERC3643IComplianceContract)
+ 72 : : onlyTransferExecutor
+ 73 : : {
+ 74 : 767 : _transferred(from, to, value);
+ 75 : : }
+ 76 : :
+ 77 : 1 : function transferred(
+ 78 : : address,
+ 79 : : /* spender */
+ 80 : : address from,
+ 81 : : address to,
+ 82 : : uint256 value
+ 83 : : )
+ 84 : : public
+ 85 : : override(IRuleEngine)
+ 86 : : onlyTransferExecutor
+ 87 : : {
+ 88 : 1 : _transferred(from, to, value);
+ 89 : : }
+ 90 : :
+ 91 : 7 : function detectTransferRestriction(address from, address to, uint256 value)
+ 92 : : public
+ 93 : : view
+ 94 : : override(IERC1404)
+ 95 : : returns (uint8)
+ 96 : : {
+ 97 [ + ]: 13 : if (from == address(0) || to == address(0)) {
+ 98 : 4 : return uint8(IERC1404Extend.REJECTED_CODE_BASE.TRANSFER_OK);
+ 99 : : }
+ 100 : 9 : bytes32 transferHash = _transferHash(from, to, value);
+ 101 [ + ]: 9 : if (approvalCounts[transferHash] == 0) {
+ 102 : 6 : return CODE_TRANSFER_REQUEST_NOT_APPROVED;
+ 103 : : }
+ 104 : 3 : return uint8(IERC1404Extend.REJECTED_CODE_BASE.TRANSFER_OK);
+ 105 : : }
+ 106 : :
+ 107 : 1 : function detectTransferRestrictionFrom(
+ 108 : : address,
+ 109 : : /* spender */
+ 110 : : address from,
+ 111 : : address to,
+ 112 : : uint256 value
+ 113 : : )
+ 114 : : public
+ 115 : : view
+ 116 : : override(IERC1404Extend)
+ 117 : : returns (uint8)
+ 118 : : {
+ 119 : 2 : return detectTransferRestriction(from, to, value);
+ 120 : : }
+ 121 : :
+ 122 : 4 : function canTransfer(address from, address to, uint256 value)
+ 123 : : public
+ 124 : : view
+ 125 : : override(IERC3643ComplianceRead)
+ 126 : : returns (bool)
+ 127 : : {
+ 128 : 4 : return detectTransferRestriction(from, to, value) == uint8(IERC1404Extend.REJECTED_CODE_BASE.TRANSFER_OK);
+ 129 : : }
+ 130 : :
+ 131 : 1 : function canTransferFrom(address spender, address from, address to, uint256 value)
+ 132 : : public
+ 133 : : view
+ 134 : : override(IERC7551Compliance)
+ 135 : : returns (bool)
+ 136 : : {
+ 137 : 1 : return detectTransferRestrictionFrom(spender, from, to, value)
+ 138 : : == uint8(IERC1404Extend.REJECTED_CODE_BASE.TRANSFER_OK);
+ 139 : : }
+ 140 : :
+ 141 : 1 : function canReturnTransferRestrictionCode(uint8 restrictionCode) external pure override(IRule) returns (bool) {
+ 142 : 1 : return restrictionCode == CODE_TRANSFER_REQUEST_NOT_APPROVED;
+ 143 : : }
+ 144 : :
+ 145 : 2 : function messageForTransferRestriction(uint8 restrictionCode)
+ 146 : : external
+ 147 : : pure
+ 148 : : override(IERC1404)
+ 149 : : returns (string memory)
+ 150 : : {
+ 151 [ + ]: 2 : if (restrictionCode == CODE_TRANSFER_REQUEST_NOT_APPROVED) {
+ 152 : 1 : return TEXT_TRANSFER_REQUEST_NOT_APPROVED;
+ 153 : : }
+ 154 : 1 : return TEXT_CODE_NOT_FOUND;
+ 155 : : }
+ 156 : :
+ 157 : 3 : function transferred(ITransferContext.FungibleTransferContext calldata ctx) external onlyTransferExecutor {
+ 158 : 3 : _transferredFromContext(ctx);
+ 159 : : }
160 : :
- 161 [ + + ]: 846 : require(count != 0, TransferNotApproved());
- 162 : :
- 163 : 843 : approvalCounts[transferHash] = count - 1;
- 164 : 843 : emit TransferExecuted(from, to, value, approvalCounts[transferHash]);
- 165 : : }
- 166 : :
- 167 : 3063 : function _transferHash(address from, address to, uint256 value) internal pure virtual returns (bytes32 hash) {
- 168 : 3063 : return keccak256(abi.encodePacked(from, to, value));
- 169 : : }
- 170 : :
- 171 : : /*//////////////////////////////////////////////////////////////
- 172 : : ACCESS CONTROL
- 173 : : //////////////////////////////////////////////////////////////*/
- 174 : :
- 175 : 4 : modifier onlyTransferApprover() {
- 176 : 4 : _authorizeTransferApproval();
- 177 : : _;
- 178 : : }
- 179 : :
- 180 : 3 : modifier onlyTransferExecutor() {
- 181 : 3 : _authorizeTransferExecution();
- 182 : : _;
- 183 : : }
- 184 : :
- 185 : : function _authorizeTransferApproval() internal view virtual;
- 186 : :
- 187 : : function _authorizeTransferExecution() internal view virtual;
- 188 : : }
+ 161 : 3 : function _transferredFromContext(ITransferContext.FungibleTransferContext calldata ctx) internal virtual {
+ 162 : 3 : _transferred(ctx.from, ctx.to, ctx.value);
+ 163 : : }
+ 164 : :
+ 165 : 773 : function _transferred(address from, address to, uint256 value) internal virtual {
+ 166 [ + ]: 773 : if (from == address(0) || to == address(0)) {
+ 167 : 773 : return;
+ 168 : : }
+ 169 : 768 : bytes32 transferHash = _transferHash(from, to, value);
+ 170 : 768 : uint256 count = approvalCounts[transferHash];
+ 171 : :
+ 172 [ + + ]: 768 : require(count != 0, TransferNotApproved());
+ 173 : :
+ 174 : 765 : approvalCounts[transferHash] = count - 1;
+ 175 : 765 : emit TransferExecuted(from, to, value, approvalCounts[transferHash]);
+ 176 : : }
+ 177 : :
+ 178 : 2885 : function _transferHash(address from, address to, uint256 value) internal pure virtual returns (bytes32 hash) {
+ 179 : : // Linter suggestion (`asm-keccak256`): hash packed values in assembly to avoid abi.encodePacked overhead.
+ 180 : : assembly ("memory-safe") {
+ 181 : 2885 : let ptr := mload(0x40)
+ 182 : 2885 : mstore(ptr, shl(96, from))
+ 183 : 2885 : mstore(add(ptr, 0x20), shl(96, to))
+ 184 : 2885 : mstore(add(ptr, 0x40), value)
+ 185 : 2885 : hash := keccak256(ptr, 0x60)
+ 186 : : }
+ 187 : : }
+ 188 : :
+ 189 : : /*//////////////////////////////////////////////////////////////
+ 190 : : ACCESS CONTROL
+ 191 : : //////////////////////////////////////////////////////////////*/
+ 192 : :
+ 193 : 4 : modifier onlyTransferApprover() {
+ 194 : 4 : _authorizeTransferApproval();
+ 195 : : _;
+ 196 : : }
+ 197 : :
+ 198 : 3 : modifier onlyTransferExecutor() {
+ 199 : 3 : _authorizeTransferExecution();
+ 200 : : _;
+ 201 : : }
+ 202 : :
+ 203 : : function _authorizeTransferApproval() internal view virtual;
+ 204 : :
+ 205 : : function _authorizeTransferExecution() internal view virtual;
+ 206 : : }
diff --git a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/abstract/index-sort-b.html b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/abstract/index-sort-b.html
index 1481813..cee77ef 100644
--- a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/abstract/index-sort-b.html
+++ b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/abstract/index-sort-b.html
@@ -31,13 +31,13 @@
|
-
-
+
+
-
+
|
@@ -87,7 +87,7 @@
100.0 % |
- 62 / 62 |
+ 66 / 66 |
100.0 % |
18 / 18 |
100.0 % |
diff --git a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/abstract/index-sort-f.html b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/abstract/index-sort-f.html
index 3d54907..3ca5529 100644
--- a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/abstract/index-sort-f.html
+++ b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/abstract/index-sort-f.html
@@ -31,13 +31,13 @@
|
-
-
+
+
-
+
|
@@ -87,7 +87,7 @@
100.0 % |
- 62 / 62 |
+ 66 / 66 |
100.0 % |
18 / 18 |
100.0 % |
diff --git a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/abstract/index-sort-l.html b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/abstract/index-sort-l.html
index 90e3217..ad74f6a 100644
--- a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/abstract/index-sort-l.html
+++ b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/abstract/index-sort-l.html
@@ -31,13 +31,13 @@
|
-
-
+
+
-
+
|
@@ -87,7 +87,7 @@
100.0 % |
- 62 / 62 |
+ 66 / 66 |
100.0 % |
18 / 18 |
100.0 % |
diff --git a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/abstract/index.html b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/abstract/index.html
index 1a454a5..075046f 100644
--- a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/abstract/index.html
+++ b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/abstract/index.html
@@ -31,13 +31,13 @@
|
-
-
+
+
-
+
|
@@ -87,7 +87,7 @@
100.0 % |
- 62 / 62 |
+ 66 / 66 |
100.0 % |
18 / 18 |
100.0 % |
diff --git a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/index-sort-b.html b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/index-sort-b.html
index 4c73cf0..0727bad 100644
--- a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/index-sort-b.html
+++ b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/index-sort-b.html
@@ -37,7 +37,7 @@
-
+
|
diff --git a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/index-sort-f.html b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/index-sort-f.html
index eba8d47..bba2e9c 100644
--- a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/index-sort-f.html
+++ b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/index-sort-f.html
@@ -37,7 +37,7 @@
-
+
|
diff --git a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/index-sort-l.html b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/index-sort-l.html
index 90bdb37..178c5f3 100644
--- a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/index-sort-l.html
+++ b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/index-sort-l.html
@@ -37,7 +37,7 @@
-
+
|
diff --git a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/index.html b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/index.html
index 8abcc29..71e0554 100644
--- a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/index.html
+++ b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/index.html
@@ -37,7 +37,7 @@
-
+
|
diff --git a/doc/coverage/coverage/index-sort-b.html b/doc/coverage/coverage/index-sort-b.html
index c0fea9e..3500b9e 100644
--- a/doc/coverage/coverage/index-sort-b.html
+++ b/doc/coverage/coverage/index-sort-b.html
@@ -31,17 +31,17 @@
|
-
-
+
+
-
+
|
-
-
+
+
@@ -49,8 +49,8 @@
|
|
-
-
+
+
 |
@@ -87,9 +87,9 @@
100.0 % |
- 112 / 112 |
+ 133 / 133 |
100.0 % |
- 68 / 68 |
+ 79 / 79 |
- |
0 / 0 |
@@ -147,7 +147,7 @@
100.0 % |
- 51 / 51 |
+ 52 / 52 |
100.0 % |
19 / 19 |
100.0 % |
@@ -159,7 +159,7 @@
100.0 % |
- 62 / 62 |
+ 66 / 66 |
100.0 % |
18 / 18 |
100.0 % |
@@ -171,11 +171,11 @@
100.0 % |
- 360 / 360 |
+ 378 / 378 |
100.0 % |
- 101 / 101 |
+ 109 / 109 |
100.0 % |
- 105 / 105 |
+ 109 / 109 |
diff --git a/doc/coverage/coverage/index-sort-f.html b/doc/coverage/coverage/index-sort-f.html
index 4733fa7..e9e4797 100644
--- a/doc/coverage/coverage/index-sort-f.html
+++ b/doc/coverage/coverage/index-sort-f.html
@@ -31,17 +31,17 @@
|
-
-
+
+
-
+
|
-
-
+
+
@@ -49,8 +49,8 @@
|
|
-
-
+
+
 |
@@ -123,7 +123,7 @@
100.0 % |
- 62 / 62 |
+ 66 / 66 |
100.0 % |
18 / 18 |
100.0 % |
@@ -135,7 +135,7 @@
100.0 % |
- 51 / 51 |
+ 52 / 52 |
100.0 % |
19 / 19 |
100.0 % |
@@ -159,9 +159,9 @@
100.0 % |
- 112 / 112 |
+ 133 / 133 |
100.0 % |
- 68 / 68 |
+ 79 / 79 |
- |
0 / 0 |
@@ -171,11 +171,11 @@
100.0 % |
- 360 / 360 |
+ 378 / 378 |
100.0 % |
- 101 / 101 |
+ 109 / 109 |
100.0 % |
- 105 / 105 |
+ 109 / 109 |
diff --git a/doc/coverage/coverage/index-sort-l.html b/doc/coverage/coverage/index-sort-l.html
index 73dd95c..4a38b39 100644
--- a/doc/coverage/coverage/index-sort-l.html
+++ b/doc/coverage/coverage/index-sort-l.html
@@ -31,17 +31,17 @@
|
-
-
+
+
-
+
|
-
-
+
+
@@ -49,8 +49,8 @@
|
|
-
-
+
+
 |
@@ -123,7 +123,7 @@
100.0 % |
- 51 / 51 |
+ 52 / 52 |
100.0 % |
19 / 19 |
100.0 % |
@@ -147,7 +147,7 @@
100.0 % |
- 62 / 62 |
+ 66 / 66 |
100.0 % |
18 / 18 |
100.0 % |
@@ -159,9 +159,9 @@
100.0 % |
- 112 / 112 |
+ 133 / 133 |
100.0 % |
- 68 / 68 |
+ 79 / 79 |
- |
0 / 0 |
@@ -171,11 +171,11 @@
100.0 % |
- 360 / 360 |
+ 378 / 378 |
100.0 % |
- 101 / 101 |
+ 109 / 109 |
100.0 % |
- 105 / 105 |
+ 109 / 109 |
diff --git a/doc/coverage/coverage/index.html b/doc/coverage/coverage/index.html
index 209f17b..ea97940 100644
--- a/doc/coverage/coverage/index.html
+++ b/doc/coverage/coverage/index.html
@@ -31,17 +31,17 @@
|
-
-
+
+
-
+
|
-
-
+
+
@@ -49,8 +49,8 @@
|
|
-
-
+
+
 |
@@ -111,7 +111,7 @@
100.0 % |
- 62 / 62 |
+ 66 / 66 |
100.0 % |
18 / 18 |
100.0 % |
@@ -147,11 +147,11 @@
100.0 % |
- 360 / 360 |
+ 378 / 378 |
100.0 % |
- 101 / 101 |
+ 109 / 109 |
100.0 % |
- 105 / 105 |
+ 109 / 109 |
| abstract/core |
@@ -159,7 +159,7 @@
100.0 % |
- 51 / 51 |
+ 52 / 52 |
100.0 % |
19 / 19 |
100.0 % |
@@ -171,9 +171,9 @@
100.0 % |
- 112 / 112 |
+ 133 / 133 |
100.0 % |
- 68 / 68 |
+ 79 / 79 |
- |
0 / 0 |
diff --git a/doc/coverage/lcov.info b/doc/coverage/lcov.info
index f2bc445..65fb8e6 100644
--- a/doc/coverage/lcov.info
+++ b/doc/coverage/lcov.info
@@ -1,116 +1,20 @@
TN:
-SF:script/DeployCMTATWithBlacklist.s.sol
-DA:11,1
-FN:11,DeployCMTATWithBlacklist.deploy
-FNDA:1,DeployCMTATWithBlacklist.deploy
-DA:15,1
-DA:16,1
-DA:17,1
-DA:18,1
-DA:25,1
-DA:27,1
-DA:28,1
-DA:30,1
-DA:32,1
-BRDA:32,0,0,1
-DA:33,1
-DA:34,1
-DA:38,0
-FN:38,DeployCMTATWithBlacklist.run
-FNDA:0,DeployCMTATWithBlacklist.run
-DA:39,0
-DA:40,0
-DA:41,0
-FNF:2
-FNH:1
-LF:16
-LH:12
-BRF:1
-BRH:1
-end_of_record
-TN:
-SF:script/DeployCMTATWithBlacklistAndSanctionsList.s.sol
-DA:27,18
-FN:27,DeployCMTATWithBlacklistAndSanctionsList.deploy
-FNDA:18,DeployCMTATWithBlacklistAndSanctionsList.deploy
-DA:36,18
-DA:37,18
-DA:38,18
-DA:39,18
-DA:46,18
-DA:49,18
-DA:52,18
-DA:53,18
-DA:57,18
-DA:60,18
-DA:61,18
-DA:64,18
-DA:67,18
-BRDA:67,0,0,18
-DA:68,18
-DA:69,18
-DA:70,18
-DA:71,18
-DA:75,0
-FN:75,DeployCMTATWithBlacklistAndSanctionsList.run
-FNDA:0,DeployCMTATWithBlacklistAndSanctionsList.run
-DA:84,0
-DA:87,0
-DA:89,0
-FNF:2
-FNH:1
-LF:22
-LH:18
-BRF:1
-BRH:1
-end_of_record
-TN:
-SF:script/DeployCMTATWithWhitelist.s.sol
-DA:11,1
-FN:11,DeployCMTATWithWhitelist.deploy
-FNDA:1,DeployCMTATWithWhitelist.deploy
-DA:15,1
-DA:16,1
-DA:17,1
-DA:18,1
-DA:25,1
-DA:27,1
-DA:28,1
-DA:30,1
-DA:32,1
-BRDA:32,0,0,1
-DA:33,1
-DA:34,1
-DA:38,0
-FN:38,DeployCMTATWithWhitelist.run
-FNDA:0,DeployCMTATWithWhitelist.run
-DA:39,0
-DA:40,0
-DA:41,0
-FNF:2
-FNH:1
-LF:16
-LH:12
-BRF:1
-BRH:1
-end_of_record
-TN:
SF:src/modules/AccessControlModuleStandalone.sol
-DA:24,415
+DA:24,421
FN:24,AccessControlModuleStandalone.constructor
-FNDA:415,AccessControlModuleStandalone.constructor
-DA:25,415
+FNDA:421,AccessControlModuleStandalone.constructor
+DA:25,421
BRDA:25,0,0,6
-BRDA:25,0,1,409
-DA:29,409
-DA:38,525
+BRDA:25,0,1,415
+DA:29,415
+DA:38,531
FN:38,AccessControlModuleStandalone.hasRole
-FNDA:525,AccessControlModuleStandalone.hasRole
-DA:47,3622
-BRDA:47,1,0,3115
-BRDA:47,1,1,507
-DA:48,3115
-DA:50,507
+FNDA:531,AccessControlModuleStandalone.hasRole
+DA:47,3534
+BRDA:47,1,0,3021
+BRDA:47,1,1,513
+DA:48,3021
+DA:50,513
FNF:2
FNH:2
LF:7
@@ -146,17 +50,17 @@ DA:42,1
FN:42,RuleConditionalTransferLight.destroyed
FNDA:1,RuleConditionalTransferLight.destroyed
DA:43,1
-DA:46,1948
+DA:46,1848
FN:46,RuleConditionalTransferLight._authorizeTransferApproval
-FNDA:1948,RuleConditionalTransferLight._authorizeTransferApproval
-DA:48,844
+FNDA:1848,RuleConditionalTransferLight._authorizeTransferApproval
+DA:48,770
FN:48,RuleConditionalTransferLight._authorizeTransferExecution
-FNDA:844,RuleConditionalTransferLight._authorizeTransferExecution
-DA:49,844
+FNDA:770,RuleConditionalTransferLight._authorizeTransferExecution
+DA:49,770
BRDA:49,0,0,1
-BRDA:49,0,1,843
-DA:55,19
-FN:55,RuleConditionalTransferLight._onlyComplianceManager
+BRDA:49,0,1,769
+DA:52,19
+FN:52,RuleConditionalTransferLight._onlyComplianceManager
FNDA:19,RuleConditionalTransferLight._onlyComplianceManager
FNF:6
FNH:6
@@ -167,16 +71,16 @@ BRH:2
end_of_record
TN:
SF:src/rules/operation/RuleConditionalTransferLightOwnable2Step.sol
-DA:21,4
-FN:21,RuleConditionalTransferLightOwnable2Step.supportsInterface
+DA:18,4
+FN:18,RuleConditionalTransferLightOwnable2Step.supportsInterface
FNDA:4,RuleConditionalTransferLightOwnable2Step.supportsInterface
-DA:22,4
-DA:23,2
-DA:26,4
-FN:26,RuleConditionalTransferLightOwnable2Step._authorizeTransferApproval
+DA:19,4
+DA:20,2
+DA:23,4
+FN:23,RuleConditionalTransferLightOwnable2Step._authorizeTransferApproval
FNDA:4,RuleConditionalTransferLightOwnable2Step._authorizeTransferApproval
-DA:28,3
-FN:28,RuleConditionalTransferLightOwnable2Step._authorizeTransferExecution
+DA:25,3
+FN:25,RuleConditionalTransferLightOwnable2Step._authorizeTransferExecution
FNDA:3,RuleConditionalTransferLightOwnable2Step._authorizeTransferExecution
FNF:3
FNH:3
@@ -187,122 +91,126 @@ BRH:0
end_of_record
TN:
SF:src/rules/operation/abstract/RuleConditionalTransferLightBase.sol
-DA:25,1941
-FN:25,RuleConditionalTransferLightBase.approveTransfer
-FNDA:1941,RuleConditionalTransferLightBase.approveTransfer
-DA:26,1942
-DA:27,1942
-DA:28,1942
-DA:31,4
-FN:31,RuleConditionalTransferLightBase.cancelTransferApproval
+DA:27,1841
+FN:27,RuleConditionalTransferLightBase.approveTransfer
+FNDA:1841,RuleConditionalTransferLightBase.approveTransfer
+DA:28,1842
+DA:29,1842
+DA:30,1842
+DA:33,4
+FN:33,RuleConditionalTransferLightBase.cancelTransferApproval
FNDA:4,RuleConditionalTransferLightBase.cancelTransferApproval
-DA:32,3
-DA:33,3
DA:34,3
-BRDA:34,0,0,1
-BRDA:34,0,1,2
-DA:35,2
-DA:36,2
-DA:45,4
-FN:45,RuleConditionalTransferLightBase.approveAndTransferIfAllowed
+DA:35,3
+DA:36,3
+BRDA:36,0,0,1
+BRDA:36,0,1,2
+DA:37,2
+DA:38,2
+DA:47,4
+FN:47,RuleConditionalTransferLightBase.approveAndTransferIfAllowed
FNDA:4,RuleConditionalTransferLightBase.approveAndTransferIfAllowed
-DA:50,4
-BRDA:50,1,0,1
-BRDA:50,1,1,3
-DA:52,3
+DA:52,4
+BRDA:52,1,0,1
+BRDA:52,1,1,3
DA:54,3
-DA:55,3
-BRDA:55,2,0,1
-BRDA:55,2,1,2
+DA:56,3
+DA:57,3
+BRDA:57,2,0,1
+BRDA:57,2,1,2
+DA:59,2
DA:60,2
-DA:61,2
-BRDA:61,3,0,1
-BRDA:61,3,1,1
-DA:62,1
-DA:65,264
-FN:65,RuleConditionalTransferLightBase.approvedCount
-FNDA:264,RuleConditionalTransferLightBase.approvedCount
-DA:66,264
-DA:67,264
-DA:70,843
-FN:70,RuleConditionalTransferLightBase.transferred.0
-FNDA:843,RuleConditionalTransferLightBase.transferred.0
-DA:75,841
-DA:78,1
-FN:78,RuleConditionalTransferLightBase.transferred.1
+BRDA:60,3,0,1
+BRDA:60,3,1,1
+DA:61,1
+DA:64,263
+FN:64,RuleConditionalTransferLightBase.approvedCount
+FNDA:263,RuleConditionalTransferLightBase.approvedCount
+DA:65,263
+DA:66,263
+DA:69,769
+FN:69,RuleConditionalTransferLightBase.transferred.0
+FNDA:769,RuleConditionalTransferLightBase.transferred.0
+DA:74,767
+DA:77,1
+FN:77,RuleConditionalTransferLightBase.transferred.1
FNDA:1,RuleConditionalTransferLightBase.transferred.1
-DA:83,1
-DA:86,7
-FN:86,RuleConditionalTransferLightBase.detectTransferRestriction
+DA:88,1
+DA:91,7
+FN:91,RuleConditionalTransferLightBase.detectTransferRestriction
FNDA:7,RuleConditionalTransferLightBase.detectTransferRestriction
-DA:92,13
-BRDA:92,4,0,4
-DA:93,4
-DA:95,9
-DA:96,9
-BRDA:96,5,0,6
-DA:97,6
-DA:99,3
-DA:102,1
-FN:102,RuleConditionalTransferLightBase.detectTransferRestrictionFrom
+DA:97,13
+BRDA:97,4,0,4
+DA:98,4
+DA:100,9
+DA:101,9
+BRDA:101,5,0,6
+DA:102,6
+DA:104,3
+DA:107,1
+FN:107,RuleConditionalTransferLightBase.detectTransferRestrictionFrom
FNDA:1,RuleConditionalTransferLightBase.detectTransferRestrictionFrom
-DA:108,2
-DA:111,4
-FN:111,RuleConditionalTransferLightBase.canTransfer
+DA:119,2
+DA:122,4
+FN:122,RuleConditionalTransferLightBase.canTransfer
FNDA:4,RuleConditionalTransferLightBase.canTransfer
-DA:117,4
-DA:120,1
-FN:120,RuleConditionalTransferLightBase.canTransferFrom
+DA:128,4
+DA:131,1
+FN:131,RuleConditionalTransferLightBase.canTransferFrom
FNDA:1,RuleConditionalTransferLightBase.canTransferFrom
-DA:126,1
-DA:130,1
-FN:130,RuleConditionalTransferLightBase.canReturnTransferRestrictionCode
+DA:137,1
+DA:141,1
+FN:141,RuleConditionalTransferLightBase.canReturnTransferRestrictionCode
FNDA:1,RuleConditionalTransferLightBase.canReturnTransferRestrictionCode
-DA:131,1
-DA:134,2
-FN:134,RuleConditionalTransferLightBase.messageForTransferRestriction
+DA:142,1
+DA:145,2
+FN:145,RuleConditionalTransferLightBase.messageForTransferRestriction
FNDA:2,RuleConditionalTransferLightBase.messageForTransferRestriction
-DA:140,2
-BRDA:140,6,0,1
-DA:141,1
-DA:143,1
-DA:146,3
-FN:146,RuleConditionalTransferLightBase.transferred.2
+DA:151,2
+BRDA:151,6,0,1
+DA:152,1
+DA:154,1
+DA:157,3
+FN:157,RuleConditionalTransferLightBase.transferred.2
FNDA:3,RuleConditionalTransferLightBase.transferred.2
-DA:147,3
-DA:150,3
-FN:150,RuleConditionalTransferLightBase._transferredFromContext
+DA:158,3
+DA:161,3
+FN:161,RuleConditionalTransferLightBase._transferredFromContext
FNDA:3,RuleConditionalTransferLightBase._transferredFromContext
-DA:151,3
-DA:154,847
-FN:154,RuleConditionalTransferLightBase._transferred
-FNDA:847,RuleConditionalTransferLightBase._transferred
-DA:155,847
-BRDA:155,7,0,847
-DA:156,847
-DA:158,833
-DA:159,833
-DA:161,833
-BRDA:161,8,0,3
-BRDA:161,8,1,830
-DA:163,830
-DA:164,830
-DA:167,3051
-FN:167,RuleConditionalTransferLightBase._transferHash
-FNDA:3051,RuleConditionalTransferLightBase._transferHash
-DA:168,3051
-DA:175,4
-FN:175,RuleConditionalTransferLightBase.onlyTransferApprover
+DA:162,3
+DA:165,773
+FN:165,RuleConditionalTransferLightBase._transferred
+FNDA:773,RuleConditionalTransferLightBase._transferred
+DA:166,773
+BRDA:166,7,0,773
+DA:167,773
+DA:169,768
+DA:170,768
+DA:172,768
+BRDA:172,8,0,3
+BRDA:172,8,1,765
+DA:174,765
+DA:175,765
+DA:178,2885
+FN:178,RuleConditionalTransferLightBase._transferHash
+FNDA:2885,RuleConditionalTransferLightBase._transferHash
+DA:181,2885
+DA:182,2885
+DA:183,2885
+DA:184,2885
+DA:185,2885
+DA:193,4
+FN:193,RuleConditionalTransferLightBase.onlyTransferApprover
FNDA:4,RuleConditionalTransferLightBase.onlyTransferApprover
-DA:176,4
-DA:180,3
-FN:180,RuleConditionalTransferLightBase.onlyTransferExecutor
+DA:194,4
+DA:198,3
+FN:198,RuleConditionalTransferLightBase.onlyTransferExecutor
FNDA:3,RuleConditionalTransferLightBase.onlyTransferExecutor
-DA:181,3
+DA:199,3
FNF:18
FNH:18
-LF:62
-LH:62
+LF:66
+LH:66
BRF:14
BRH:14
end_of_record
@@ -318,14 +226,14 @@ FN:63,RuleAddressSet.removeAddresses
FNDA:260,RuleAddressSet.removeAddresses
DA:64,259
DA:65,259
-DA:75,111
+DA:75,117
FN:75,RuleAddressSet.addAddress
-FNDA:111,RuleAddressSet.addAddress
-DA:76,106
+FNDA:117,RuleAddressSet.addAddress
+DA:76,112
BRDA:76,0,0,1
-BRDA:76,0,1,105
-DA:77,105
-DA:78,105
+BRDA:76,0,1,111
+DA:77,111
+DA:78,111
DA:88,12
FN:88,RuleAddressSet.removeAddress
FNDA:12,RuleAddressSet.removeAddress
@@ -353,25 +261,25 @@ DA:126,2
DA:134,71
FN:134,RuleAddressSet.isAddressListed
FNDA:71,RuleAddressSet.isAddressListed
-DA:135,387
+DA:135,391
DA:143,108
FN:143,RuleAddressSet.areAddressesListed
FNDA:108,RuleAddressSet.areAddressesListed
DA:144,108
DA:145,108
DA:146,244
-DA:154,917
-FN:154,RuleAddressSet._msgSender
-FNDA:917,RuleAddressSet._msgSender
-DA:155,917
-DA:159,6
-FN:159,RuleAddressSet._msgData
-FNDA:6,RuleAddressSet._msgData
+DA:155,929
+FN:155,RuleAddressSet._msgSender
+FNDA:929,RuleAddressSet._msgSender
+DA:156,929
DA:160,6
-DA:164,925
-FN:164,RuleAddressSet._contextSuffixLength
-FNDA:925,RuleAddressSet._contextSuffixLength
-DA:165,925
+FN:160,RuleAddressSet._msgData
+FNDA:6,RuleAddressSet._msgData
+DA:161,6
+DA:165,937
+FN:165,RuleAddressSet._contextSuffixLength
+FNDA:937,RuleAddressSet._contextSuffixLength
+DA:166,937
FNF:13
FNH:13
LF:34
@@ -384,37 +292,37 @@ SF:src/rules/validation/abstract/RuleAddressSet/RuleAddressSetInternal.sol
DA:38,274
FN:38,RuleAddressSetInternal._addAddresses
FNDA:274,RuleAddressSetInternal._addAddresses
-DA:42,274
-DA:43,806
-BRDA:43,0,0,548
-BRDA:43,0,1,258
-DA:44,548
-DA:46,258
-DA:60,259
-FN:60,RuleAddressSetInternal._removeAddresses
+DA:39,274
+DA:40,806
+BRDA:40,0,0,548
+BRDA:40,0,1,258
+DA:41,548
+DA:43,258
+DA:57,259
+FN:57,RuleAddressSetInternal._removeAddresses
FNDA:259,RuleAddressSetInternal._removeAddresses
-DA:64,259
-DA:65,775
-BRDA:65,1,0,518
-BRDA:65,1,1,257
-DA:66,518
-DA:68,257
-DA:77,105
-FN:77,RuleAddressSetInternal._addAddress
-FNDA:105,RuleAddressSetInternal._addAddress
-DA:78,105
-DA:85,6
-FN:85,RuleAddressSetInternal._removeAddress
+DA:61,259
+DA:62,775
+BRDA:62,1,0,518
+BRDA:62,1,1,257
+DA:63,518
+DA:65,257
+DA:74,111
+FN:74,RuleAddressSetInternal._addAddress
+FNDA:111,RuleAddressSetInternal._addAddress
+DA:75,111
+DA:82,6
+FN:82,RuleAddressSetInternal._removeAddress
FNDA:6,RuleAddressSetInternal._removeAddress
-DA:86,6
-DA:93,536
-FN:93,RuleAddressSetInternal._listedAddressCount
+DA:83,6
+DA:90,536
+FN:90,RuleAddressSetInternal._listedAddressCount
FNDA:536,RuleAddressSetInternal._listedAddressCount
-DA:94,536
-DA:102,757
-FN:102,RuleAddressSetInternal._isAddressListed
-FNDA:757,RuleAddressSetInternal._isAddressListed
-DA:103,757
+DA:91,536
+DA:99,771
+FN:99,RuleAddressSetInternal._isAddressListed
+FNDA:771,RuleAddressSetInternal._isAddressListed
+DA:100,771
FNF:6
FNH:6
LF:18
@@ -504,68 +412,68 @@ SF:src/rules/validation/abstract/base/RuleBlacklistBase.sol
DA:20,106
FN:20,RuleBlacklistBase._detectTransferRestriction
FNDA:106,RuleBlacklistBase._detectTransferRestriction
-DA:26,106
-BRDA:26,0,0,23
-BRDA:26,0,1,64
-DA:27,23
-DA:28,83
-BRDA:28,1,0,19
-DA:29,19
-DA:31,64
-DA:34,22
-FN:34,RuleBlacklistBase._detectTransferRestrictionFrom
+DA:30,106
+BRDA:30,0,0,23
+BRDA:30,0,1,64
+DA:31,23
+DA:32,83
+BRDA:32,1,0,19
+DA:33,19
+DA:35,64
+DA:38,22
+FN:38,RuleBlacklistBase._detectTransferRestrictionFrom
FNDA:22,RuleBlacklistBase._detectTransferRestrictionFrom
-DA:40,22
-BRDA:40,2,0,8
-DA:41,8
-DA:43,14
-DA:46,4
-FN:46,RuleBlacklistBase.canReturnTransferRestrictionCode
+DA:44,22
+BRDA:44,2,0,8
+DA:45,8
+DA:47,14
+DA:50,4
+FN:50,RuleBlacklistBase.canReturnTransferRestrictionCode
FNDA:4,RuleBlacklistBase.canReturnTransferRestrictionCode
-DA:53,4
-DA:54,1
-DA:57,12
-FN:57,RuleBlacklistBase.messageForTransferRestriction
+DA:57,4
+DA:58,1
+DA:61,12
+FN:61,RuleBlacklistBase.messageForTransferRestriction
FNDA:12,RuleBlacklistBase.messageForTransferRestriction
-DA:64,12
-BRDA:64,3,0,5
-BRDA:64,3,1,3
-DA:65,5
-DA:66,7
-BRDA:66,4,0,3
-BRDA:66,4,1,3
-DA:67,3
-DA:68,4
-BRDA:68,5,0,1
-BRDA:68,5,1,3
-DA:69,1
+DA:68,12
+BRDA:68,3,0,5
+BRDA:68,3,1,3
+DA:69,5
+DA:70,7
+BRDA:70,4,0,3
+BRDA:70,4,1,3
DA:71,3
-DA:75,61
-FN:75,RuleBlacklistBase.supportsInterface
+DA:72,4
+BRDA:72,5,0,1
+BRDA:72,5,1,3
+DA:73,1
+DA:75,3
+DA:79,61
+FN:79,RuleBlacklistBase.supportsInterface
FNDA:61,RuleBlacklistBase.supportsInterface
-DA:76,61
-DA:83,58
-FN:83,RuleBlacklistBase.transferred.0
+DA:80,61
+DA:87,58
+FN:87,RuleBlacklistBase.transferred.0
FNDA:58,RuleBlacklistBase.transferred.0
-DA:89,58
-DA:96,2
-FN:96,RuleBlacklistBase.transferred.1
+DA:93,58
+DA:100,2
+FN:100,RuleBlacklistBase.transferred.1
FNDA:2,RuleBlacklistBase.transferred.1
-DA:102,2
-DA:105,61
-FN:105,RuleBlacklistBase._transferred
+DA:106,2
+DA:109,61
+FN:109,RuleBlacklistBase._transferred
FNDA:61,RuleBlacklistBase._transferred
-DA:106,61
-DA:107,61
-BRDA:107,6,0,15
-BRDA:107,6,1,46
-DA:113,4
-FN:113,RuleBlacklistBase._transferredFrom
+DA:110,61
+DA:111,61
+BRDA:111,6,0,15
+BRDA:111,6,1,46
+DA:117,4
+FN:117,RuleBlacklistBase._transferredFrom
FNDA:4,RuleBlacklistBase._transferredFrom
+DA:118,4
DA:119,4
-DA:120,4
-BRDA:120,7,0,2
-BRDA:120,7,1,2
+BRDA:119,7,0,2
+BRDA:119,7,1,2
FNF:9
FNH:9
LF:33
@@ -578,200 +486,199 @@ SF:src/rules/validation/abstract/base/RuleERC2980Base.sol
DA:47,22
FN:47,RuleERC2980Base._detectTransferRestriction
FNDA:22,RuleERC2980Base._detectTransferRestriction
-DA:55,22
-BRDA:55,0,0,4
-BRDA:55,0,1,14
-DA:56,4
-DA:57,18
-BRDA:57,1,0,4
-DA:58,4
-DA:61,14
-BRDA:61,2,0,4
+DA:59,22
+BRDA:59,0,0,4
+BRDA:59,0,1,14
+DA:60,4
+DA:61,18
+BRDA:61,1,0,4
DA:62,4
-DA:64,10
-DA:67,8
-FN:67,RuleERC2980Base._detectTransferRestrictionFrom
+DA:65,14
+BRDA:65,2,0,4
+DA:66,4
+DA:68,10
+DA:71,8
+FN:71,RuleERC2980Base._detectTransferRestrictionFrom
FNDA:8,RuleERC2980Base._detectTransferRestrictionFrom
-DA:74,8
-BRDA:74,3,0,4
-DA:75,4
-DA:77,4
-DA:84,4
-FN:84,RuleERC2980Base.transferred.0
+DA:78,8
+BRDA:78,3,0,4
+DA:79,4
+DA:81,4
+DA:88,4
+FN:88,RuleERC2980Base.transferred.0
FNDA:4,RuleERC2980Base.transferred.0
-DA:90,4
-DA:93,2
-FN:93,RuleERC2980Base.transferred.1
+DA:94,4
+DA:97,2
+FN:97,RuleERC2980Base.transferred.1
FNDA:2,RuleERC2980Base.transferred.1
-DA:99,2
-DA:102,5
-FN:102,RuleERC2980Base._transferred
+DA:103,2
+DA:106,5
+FN:106,RuleERC2980Base._transferred
FNDA:5,RuleERC2980Base._transferred
-DA:103,5
-DA:104,5
-BRDA:104,4,0,3
-BRDA:104,4,1,2
-DA:110,3
-FN:110,RuleERC2980Base._transferredFrom
+DA:107,5
+DA:108,5
+BRDA:108,4,0,3
+BRDA:108,4,1,2
+DA:114,3
+FN:114,RuleERC2980Base._transferredFrom
FNDA:3,RuleERC2980Base._transferredFrom
+DA:115,3
DA:116,3
-DA:117,3
-BRDA:117,5,0,1
-BRDA:117,5,1,2
-DA:127,5
-FN:127,RuleERC2980Base.canReturnTransferRestrictionCode
+BRDA:116,5,0,1
+BRDA:116,5,1,2
+DA:126,5
+FN:126,RuleERC2980Base.canReturnTransferRestrictionCode
FNDA:5,RuleERC2980Base.canReturnTransferRestrictionCode
-DA:134,5
-DA:135,3
-DA:136,2
-DA:139,5
-FN:139,RuleERC2980Base.messageForTransferRestriction
+DA:133,5
+DA:134,3
+DA:137,5
+FN:137,RuleERC2980Base.messageForTransferRestriction
FNDA:5,RuleERC2980Base.messageForTransferRestriction
-DA:146,5
-BRDA:146,6,0,1
-BRDA:146,6,1,1
+DA:144,5
+BRDA:144,6,0,1
+BRDA:144,6,1,1
+DA:145,1
+DA:146,4
+BRDA:146,7,0,1
+BRDA:146,7,1,1
DA:147,1
-DA:148,4
-BRDA:148,7,0,1
-BRDA:148,7,1,1
+DA:148,3
+BRDA:148,8,0,1
+BRDA:148,8,1,1
DA:149,1
-DA:150,3
-BRDA:150,8,0,1
-BRDA:150,8,1,1
+DA:150,2
+BRDA:150,9,0,1
+BRDA:150,9,1,1
DA:151,1
-DA:152,2
-BRDA:152,9,0,1
-BRDA:152,9,1,1
DA:153,1
-DA:155,1
-DA:167,6
-FN:167,RuleERC2980Base.addWhitelistAddresses
+DA:165,6
+FN:165,RuleERC2980Base.addWhitelistAddresses
FNDA:6,RuleERC2980Base.addWhitelistAddresses
-DA:168,4
-DA:169,4
-DA:176,4
-FN:176,RuleERC2980Base.removeWhitelistAddresses
+DA:166,4
+DA:167,4
+DA:174,4
+FN:174,RuleERC2980Base.removeWhitelistAddresses
FNDA:4,RuleERC2980Base.removeWhitelistAddresses
-DA:177,3
-DA:178,3
-DA:189,43
-FN:189,RuleERC2980Base.addWhitelistAddress
+DA:175,3
+DA:176,3
+DA:187,43
+FN:187,RuleERC2980Base.addWhitelistAddress
FNDA:43,RuleERC2980Base.addWhitelistAddress
-DA:190,40
-BRDA:190,10,0,1
-BRDA:190,10,1,39
-DA:191,39
-DA:192,39
-DA:203,7
-FN:203,RuleERC2980Base.removeWhitelistAddress
+DA:188,40
+BRDA:188,10,0,1
+BRDA:188,10,1,39
+DA:189,39
+DA:190,39
+DA:201,7
+FN:201,RuleERC2980Base.removeWhitelistAddress
FNDA:7,RuleERC2980Base.removeWhitelistAddress
-DA:204,5
-BRDA:204,11,0,1
-BRDA:204,11,1,4
-DA:205,4
-DA:206,4
-DA:212,5
-FN:212,RuleERC2980Base.whitelistAddressCount
+DA:202,5
+BRDA:202,11,0,1
+BRDA:202,11,1,4
+DA:203,4
+DA:204,4
+DA:210,5
+FN:210,RuleERC2980Base.whitelistAddressCount
FNDA:5,RuleERC2980Base.whitelistAddressCount
-DA:213,5
-DA:219,13
-FN:219,RuleERC2980Base.isWhitelisted
+DA:211,5
+DA:217,13
+FN:217,RuleERC2980Base.isWhitelisted
FNDA:13,RuleERC2980Base.isWhitelisted
-DA:220,13
-DA:226,5
-FN:226,RuleERC2980Base.whitelist
+DA:218,13
+DA:224,5
+FN:224,RuleERC2980Base.whitelist
FNDA:5,RuleERC2980Base.whitelist
-DA:227,5
-DA:235,3
-FN:235,RuleERC2980Base.isVerified
+DA:225,5
+DA:233,3
+FN:233,RuleERC2980Base.isVerified
FNDA:3,RuleERC2980Base.isVerified
-DA:242,3
-DA:248,1
-FN:248,RuleERC2980Base.areWhitelisted
+DA:234,3
+DA:240,1
+FN:240,RuleERC2980Base.areWhitelisted
FNDA:1,RuleERC2980Base.areWhitelisted
-DA:249,1
-DA:250,1
-DA:251,2
-DA:263,6
-FN:263,RuleERC2980Base.addFrozenlistAddresses
+DA:241,1
+DA:242,1
+DA:243,2
+DA:255,6
+FN:255,RuleERC2980Base.addFrozenlistAddresses
FNDA:6,RuleERC2980Base.addFrozenlistAddresses
-DA:264,4
-DA:265,4
-DA:272,2
-FN:272,RuleERC2980Base.removeFrozenlistAddresses
+DA:256,4
+DA:257,4
+DA:264,2
+FN:264,RuleERC2980Base.removeFrozenlistAddresses
FNDA:2,RuleERC2980Base.removeFrozenlistAddresses
-DA:273,2
-DA:274,2
-DA:285,22
-FN:285,RuleERC2980Base.addFrozenlistAddress
+DA:265,2
+DA:266,2
+DA:277,22
+FN:277,RuleERC2980Base.addFrozenlistAddress
FNDA:22,RuleERC2980Base.addFrozenlistAddress
-DA:286,19
-BRDA:286,12,0,1
-BRDA:286,12,1,18
-DA:287,18
-DA:288,18
-DA:299,7
-FN:299,RuleERC2980Base.removeFrozenlistAddress
+DA:278,19
+BRDA:278,12,0,1
+BRDA:278,12,1,18
+DA:279,18
+DA:280,18
+DA:291,7
+FN:291,RuleERC2980Base.removeFrozenlistAddress
FNDA:7,RuleERC2980Base.removeFrozenlistAddress
-DA:300,5
-BRDA:300,13,0,1
-BRDA:300,13,1,4
-DA:301,4
-DA:302,4
-DA:308,4
-FN:308,RuleERC2980Base.frozenlistAddressCount
+DA:292,5
+BRDA:292,13,0,1
+BRDA:292,13,1,4
+DA:293,4
+DA:294,4
+DA:300,4
+FN:300,RuleERC2980Base.frozenlistAddressCount
FNDA:4,RuleERC2980Base.frozenlistAddressCount
-DA:309,4
-DA:315,12
-FN:315,RuleERC2980Base.isFrozen
+DA:301,4
+DA:307,12
+FN:307,RuleERC2980Base.isFrozen
FNDA:12,RuleERC2980Base.isFrozen
-DA:316,12
-DA:322,4
-FN:322,RuleERC2980Base.frozenlist
+DA:308,12
+DA:314,4
+FN:314,RuleERC2980Base.frozenlist
FNDA:4,RuleERC2980Base.frozenlist
-DA:323,4
-DA:329,1
-FN:329,RuleERC2980Base.areFrozen
+DA:315,4
+DA:321,1
+FN:321,RuleERC2980Base.areFrozen
FNDA:1,RuleERC2980Base.areFrozen
-DA:330,1
-DA:331,1
-DA:332,2
-DA:340,1
-FN:340,RuleERC2980Base.supportsInterface
+DA:322,1
+DA:323,1
+DA:324,2
+DA:332,1
+FN:332,RuleERC2980Base.supportsInterface
FNDA:1,RuleERC2980Base.supportsInterface
-DA:341,1
-DA:348,6
-FN:348,RuleERC2980Base.onlyWhitelistAdd
+DA:333,1
+DA:340,6
+FN:340,RuleERC2980Base.onlyWhitelistAdd
FNDA:6,RuleERC2980Base.onlyWhitelistAdd
-DA:349,6
-DA:353,7
-FN:353,RuleERC2980Base.onlyWhitelistRemove
+DA:341,6
+DA:345,7
+FN:345,RuleERC2980Base.onlyWhitelistRemove
FNDA:7,RuleERC2980Base.onlyWhitelistRemove
-DA:354,7
-DA:358,6
-FN:358,RuleERC2980Base.onlyFrozenlistAdd
+DA:346,7
+DA:350,6
+FN:350,RuleERC2980Base.onlyFrozenlistAdd
FNDA:6,RuleERC2980Base.onlyFrozenlistAdd
-DA:359,6
-DA:363,2
-FN:363,RuleERC2980Base.onlyFrozenlistRemove
+DA:351,6
+DA:355,2
+FN:355,RuleERC2980Base.onlyFrozenlistRemove
FNDA:2,RuleERC2980Base.onlyFrozenlistRemove
-DA:364,2
-DA:377,267
-FN:377,RuleERC2980Base._msgSender
+DA:356,2
+DA:369,267
+FN:369,RuleERC2980Base._msgSender
FNDA:267,RuleERC2980Base._msgSender
-DA:378,267
-DA:381,2
-FN:381,RuleERC2980Base._msgData
+DA:370,267
+DA:373,2
+FN:373,RuleERC2980Base._msgData
FNDA:2,RuleERC2980Base._msgData
-DA:382,2
-DA:385,269
-FN:385,RuleERC2980Base._contextSuffixLength
+DA:374,2
+DA:377,269
+FN:377,RuleERC2980Base._contextSuffixLength
FNDA:269,RuleERC2980Base._contextSuffixLength
-DA:386,269
+DA:378,269
FNF:33
FNH:33
-LF:102
-LH:102
+LF:101
+LH:101
BRF:25
BRH:25
end_of_record
@@ -799,78 +706,78 @@ DA:33,3
DA:36,16
FN:36,RuleIdentityRegistryBase._detectTransferRestriction
FNDA:16,RuleIdentityRegistryBase._detectTransferRestriction
-DA:42,16
-BRDA:42,2,0,3
-DA:43,3
-DA:45,13
-BRDA:45,3,0,2
-DA:46,2
-DA:49,11
-BRDA:49,4,0,4
-DA:50,4
-DA:52,7
-BRDA:52,5,0,1
-DA:53,1
-DA:55,6
-DA:58,9
-FN:58,RuleIdentityRegistryBase._detectTransferRestrictionFrom
+DA:46,16
+BRDA:46,2,0,3
+DA:47,3
+DA:49,13
+BRDA:49,3,0,2
+DA:50,2
+DA:53,11
+BRDA:53,4,0,4
+DA:54,4
+DA:56,7
+BRDA:56,5,0,1
+DA:57,1
+DA:59,6
+DA:62,9
+FN:62,RuleIdentityRegistryBase._detectTransferRestrictionFrom
FNDA:9,RuleIdentityRegistryBase._detectTransferRestrictionFrom
-DA:64,9
-BRDA:64,6,0,1
-DA:65,1
-DA:67,8
-BRDA:67,7,0,1
-DA:68,1
-DA:70,7
-BRDA:70,8,0,4
-DA:71,4
-DA:73,3
-DA:76,2
-FN:76,RuleIdentityRegistryBase.transferred.0
+DA:68,9
+BRDA:68,6,0,1
+DA:69,1
+DA:71,8
+BRDA:71,7,0,1
+DA:72,1
+DA:74,7
+BRDA:74,8,0,4
+DA:75,4
+DA:77,3
+DA:80,2
+FN:80,RuleIdentityRegistryBase.transferred.0
FNDA:2,RuleIdentityRegistryBase.transferred.0
DA:81,2
DA:84,2
FN:84,RuleIdentityRegistryBase.transferred.1
FNDA:2,RuleIdentityRegistryBase.transferred.1
-DA:89,2
-DA:92,2
-FN:92,RuleIdentityRegistryBase._transferred
+DA:85,2
+DA:88,2
+FN:88,RuleIdentityRegistryBase._transferred
FNDA:2,RuleIdentityRegistryBase._transferred
-DA:93,2
-DA:94,2
-BRDA:94,9,0,1
-BRDA:94,9,1,1
-DA:100,2
-FN:100,RuleIdentityRegistryBase._transferredFrom
+DA:89,2
+DA:90,2
+BRDA:90,9,0,1
+BRDA:90,9,1,1
+DA:96,2
+FN:96,RuleIdentityRegistryBase._transferredFrom
FNDA:2,RuleIdentityRegistryBase._transferredFrom
-DA:106,2
-DA:107,2
-BRDA:107,10,0,1
-BRDA:107,10,1,1
-DA:113,4
-FN:113,RuleIdentityRegistryBase.canReturnTransferRestrictionCode
+DA:97,2
+DA:98,2
+BRDA:98,10,0,1
+BRDA:98,10,1,1
+DA:104,4
+FN:104,RuleIdentityRegistryBase.canReturnTransferRestrictionCode
FNDA:4,RuleIdentityRegistryBase.canReturnTransferRestrictionCode
-DA:114,4
-DA:115,2
-DA:118,4
-FN:118,RuleIdentityRegistryBase.messageForTransferRestriction
+DA:105,4
+DA:106,2
+DA:109,4
+FN:109,RuleIdentityRegistryBase.messageForTransferRestriction
FNDA:4,RuleIdentityRegistryBase.messageForTransferRestriction
-DA:124,4
-BRDA:124,11,0,1
-BRDA:124,11,1,1
-DA:125,1
-DA:126,3
-BRDA:126,12,0,1
-BRDA:126,12,1,1
-DA:127,1
-DA:128,2
-BRDA:128,13,0,1
-DA:129,1
-DA:131,1
-DA:138,5
-FN:138,RuleIdentityRegistryBase.onlyIdentityRegistryManager
+DA:115,4
+BRDA:115,11,0,1
+BRDA:115,11,1,1
+DA:116,1
+DA:117,3
+BRDA:117,12,0,1
+BRDA:117,12,1,1
+DA:118,1
+DA:119,2
+BRDA:119,13,0,1
+DA:120,1
+DA:122,1
+DA:129,5
+FN:129,RuleIdentityRegistryBase.onlyIdentityRegistryManager
FNDA:5,RuleIdentityRegistryBase.onlyIdentityRegistryManager
-DA:139,5
+DA:130,5
FNF:12
FNH:12
LF:51
@@ -904,54 +811,54 @@ DA:34,1
DA:37,271
FN:37,RuleMaxTotalSupplyBase._detectTransferRestriction
FNDA:271,RuleMaxTotalSupplyBase._detectTransferRestriction
-DA:43,271
-BRDA:43,2,0,268
-DA:44,268
-DA:45,268
-BRDA:45,3,0,179
-DA:46,179
-DA:49,92
-DA:52,2
-FN:52,RuleMaxTotalSupplyBase._detectTransferRestrictionFrom
+DA:48,271
+BRDA:48,2,0,268
+DA:49,268
+DA:50,268
+BRDA:50,3,0,176
+DA:51,176
+DA:54,95
+DA:57,2
+FN:57,RuleMaxTotalSupplyBase._detectTransferRestrictionFrom
FNDA:2,RuleMaxTotalSupplyBase._detectTransferRestrictionFrom
-DA:58,2
-DA:61,2
-FN:61,RuleMaxTotalSupplyBase.transferred.0
-FNDA:2,RuleMaxTotalSupplyBase.transferred.0
+DA:63,2
DA:66,2
-DA:69,2
-FN:69,RuleMaxTotalSupplyBase.transferred.1
+FN:66,RuleMaxTotalSupplyBase.transferred.0
+FNDA:2,RuleMaxTotalSupplyBase.transferred.0
+DA:67,2
+DA:70,2
+FN:70,RuleMaxTotalSupplyBase.transferred.1
FNDA:2,RuleMaxTotalSupplyBase.transferred.1
+DA:71,2
DA:74,2
-DA:77,2
-FN:77,RuleMaxTotalSupplyBase._transferred
+FN:74,RuleMaxTotalSupplyBase._transferred
FNDA:2,RuleMaxTotalSupplyBase._transferred
-DA:78,2
-DA:79,2
-BRDA:79,4,0,1
-BRDA:79,4,1,1
-DA:85,2
-FN:85,RuleMaxTotalSupplyBase._transferredFrom
+DA:75,2
+DA:76,2
+BRDA:76,4,0,1
+BRDA:76,4,1,1
+DA:82,2
+FN:82,RuleMaxTotalSupplyBase._transferredFrom
FNDA:2,RuleMaxTotalSupplyBase._transferredFrom
-DA:86,2
-DA:87,2
-BRDA:87,5,0,1
-BRDA:87,5,1,1
-DA:93,2
-FN:93,RuleMaxTotalSupplyBase.canReturnTransferRestrictionCode
+DA:83,2
+DA:84,2
+BRDA:84,5,0,1
+BRDA:84,5,1,1
+DA:90,2
+FN:90,RuleMaxTotalSupplyBase.canReturnTransferRestrictionCode
FNDA:2,RuleMaxTotalSupplyBase.canReturnTransferRestrictionCode
+DA:91,2
DA:94,2
-DA:97,2
-FN:97,RuleMaxTotalSupplyBase.messageForTransferRestriction
+FN:94,RuleMaxTotalSupplyBase.messageForTransferRestriction
FNDA:2,RuleMaxTotalSupplyBase.messageForTransferRestriction
-DA:103,2
-BRDA:103,6,0,1
-DA:104,1
-DA:106,1
-DA:113,260
-FN:113,RuleMaxTotalSupplyBase.onlyMaxTotalSupplyManager
+DA:100,2
+BRDA:100,6,0,1
+DA:101,1
+DA:103,1
+DA:110,260
+FN:110,RuleMaxTotalSupplyBase.onlyMaxTotalSupplyManager
FNDA:260,RuleMaxTotalSupplyBase.onlyMaxTotalSupplyManager
-DA:114,260
+DA:111,260
FNF:12
FNH:12
LF:37
@@ -970,88 +877,88 @@ DA:24,20
DA:28,84
FN:28,RuleSanctionsListBase._detectTransferRestriction
FNDA:84,RuleSanctionsListBase._detectTransferRestriction
-DA:34,84
-BRDA:34,1,0,77
-DA:35,77
-BRDA:35,2,0,10
-BRDA:35,2,1,55
-DA:36,10
-DA:37,67
-BRDA:37,3,0,12
-DA:38,12
-DA:41,62
-DA:44,16
-FN:44,RuleSanctionsListBase._detectTransferRestrictionFrom
+DA:38,84
+BRDA:38,1,0,77
+DA:39,77
+BRDA:39,2,0,10
+BRDA:39,2,1,55
+DA:40,10
+DA:41,67
+BRDA:41,3,0,12
+DA:42,12
+DA:45,62
+DA:48,16
+FN:48,RuleSanctionsListBase._detectTransferRestrictionFrom
FNDA:16,RuleSanctionsListBase._detectTransferRestrictionFrom
-DA:51,16
-BRDA:51,4,0,15
-DA:52,15
-BRDA:52,5,0,6
-DA:53,6
-DA:55,9
-DA:57,1
-DA:60,3
-FN:60,RuleSanctionsListBase.canReturnTransferRestrictionCode
+DA:55,16
+BRDA:55,4,0,15
+DA:56,15
+BRDA:56,5,0,6
+DA:57,6
+DA:59,9
+DA:61,1
+DA:64,3
+FN:64,RuleSanctionsListBase.canReturnTransferRestrictionCode
FNDA:3,RuleSanctionsListBase.canReturnTransferRestrictionCode
-DA:61,3
-DA:62,1
-DA:65,4
-FN:65,RuleSanctionsListBase.messageForTransferRestriction
+DA:65,3
+DA:66,1
+DA:69,4
+FN:69,RuleSanctionsListBase.messageForTransferRestriction
FNDA:4,RuleSanctionsListBase.messageForTransferRestriction
-DA:71,4
-BRDA:71,6,0,1
-BRDA:71,6,1,1
-DA:72,1
-DA:73,3
-BRDA:73,7,0,1
-BRDA:73,7,1,1
-DA:74,1
-DA:75,2
-BRDA:75,8,0,1
+DA:75,4
+BRDA:75,6,0,1
+BRDA:75,6,1,1
DA:76,1
+DA:77,3
+BRDA:77,7,0,1
+BRDA:77,7,1,1
DA:78,1
-DA:81,17
-FN:81,RuleSanctionsListBase.setSanctionListOracle
+DA:79,2
+BRDA:79,8,0,1
+DA:80,1
+DA:82,1
+DA:85,17
+FN:85,RuleSanctionsListBase.setSanctionListOracle
FNDA:17,RuleSanctionsListBase.setSanctionListOracle
-DA:82,15
-BRDA:82,9,0,1
-BRDA:82,9,1,14
-DA:83,14
-DA:86,3
-FN:86,RuleSanctionsListBase.clearSanctionListOracle
+DA:86,15
+BRDA:86,9,0,1
+BRDA:86,9,1,14
+DA:87,14
+DA:90,3
+FN:90,RuleSanctionsListBase.clearSanctionListOracle
FNDA:3,RuleSanctionsListBase.clearSanctionListOracle
-DA:87,3
-DA:90,43
-FN:90,RuleSanctionsListBase.transferred.0
+DA:91,3
+DA:94,43
+FN:94,RuleSanctionsListBase.transferred.0
FNDA:43,RuleSanctionsListBase.transferred.0
DA:95,43
DA:98,2
FN:98,RuleSanctionsListBase.transferred.1
FNDA:2,RuleSanctionsListBase.transferred.1
-DA:103,2
-DA:106,47
-FN:106,RuleSanctionsListBase._transferred
+DA:99,2
+DA:102,47
+FN:102,RuleSanctionsListBase._transferred
FNDA:47,RuleSanctionsListBase._transferred
-DA:107,47
-DA:108,47
-BRDA:108,10,0,6
-BRDA:108,10,1,41
-DA:114,3
-FN:114,RuleSanctionsListBase._transferredFrom
+DA:103,47
+DA:104,47
+BRDA:104,10,0,6
+BRDA:104,10,1,41
+DA:110,3
+FN:110,RuleSanctionsListBase._transferredFrom
FNDA:3,RuleSanctionsListBase._transferredFrom
-DA:120,3
-DA:121,3
-BRDA:121,11,0,2
-BRDA:121,11,1,1
-DA:127,37
-FN:127,RuleSanctionsListBase._setSanctionListOracle
+DA:111,3
+DA:112,3
+BRDA:112,11,0,2
+BRDA:112,11,1,1
+DA:118,37
+FN:118,RuleSanctionsListBase._setSanctionListOracle
FNDA:37,RuleSanctionsListBase._setSanctionListOracle
-DA:128,37
-DA:129,37
-DA:136,3
-FN:136,RuleSanctionsListBase.onlySanctionListManager
+DA:119,37
+DA:120,37
+DA:127,3
+FN:127,RuleSanctionsListBase.onlySanctionListManager
FNDA:3,RuleSanctionsListBase.onlySanctionListManager
-DA:137,3
+DA:128,3
FNF:13
FNH:13
LF:47
@@ -1064,42 +971,42 @@ SF:src/rules/validation/abstract/base/RuleSpenderWhitelistBase.sol
DA:19,4
FN:19,RuleSpenderWhitelistBase._detectTransferRestriction
FNDA:4,RuleSpenderWhitelistBase._detectTransferRestriction
-DA:26,4
-DA:29,9
-FN:29,RuleSpenderWhitelistBase._detectTransferRestrictionFrom
-FNDA:9,RuleSpenderWhitelistBase._detectTransferRestrictionFrom
-DA:36,9
-BRDA:36,0,0,3
-DA:37,3
-DA:39,6
-DA:42,2
-FN:42,RuleSpenderWhitelistBase.canReturnTransferRestrictionCode
+DA:20,4
+DA:23,13
+FN:23,RuleSpenderWhitelistBase._detectTransferRestrictionFrom
+FNDA:13,RuleSpenderWhitelistBase._detectTransferRestrictionFrom
+DA:30,13
+BRDA:30,0,0,5
+DA:31,5
+DA:33,8
+DA:36,2
+FN:36,RuleSpenderWhitelistBase.canReturnTransferRestrictionCode
FNDA:2,RuleSpenderWhitelistBase.canReturnTransferRestrictionCode
-DA:43,2
-DA:46,2
-FN:46,RuleSpenderWhitelistBase.messageForTransferRestriction
+DA:37,2
+DA:40,2
+FN:40,RuleSpenderWhitelistBase.messageForTransferRestriction
FNDA:2,RuleSpenderWhitelistBase.messageForTransferRestriction
-DA:52,2
-BRDA:52,1,0,1
-DA:53,1
+DA:46,2
+BRDA:46,1,0,1
+DA:47,1
+DA:49,1
DA:55,1
-DA:61,1
-FN:61,RuleSpenderWhitelistBase.transferred.0
+FN:55,RuleSpenderWhitelistBase.transferred.0
FNDA:1,RuleSpenderWhitelistBase.transferred.0
-DA:63,2
-FN:63,RuleSpenderWhitelistBase.transferred.1
+DA:57,2
+FN:57,RuleSpenderWhitelistBase.transferred.1
FNDA:2,RuleSpenderWhitelistBase.transferred.1
-DA:68,2
-DA:71,1
-FN:71,RuleSpenderWhitelistBase._transferred
-FNDA:1,RuleSpenderWhitelistBase._transferred
-DA:75,3
-FN:75,RuleSpenderWhitelistBase._transferredFrom
-FNDA:3,RuleSpenderWhitelistBase._transferredFrom
-DA:81,3
-DA:82,3
-BRDA:82,2,0,1
-BRDA:82,2,1,2
+DA:58,2
+DA:61,3
+FN:61,RuleSpenderWhitelistBase._transferred
+FNDA:3,RuleSpenderWhitelistBase._transferred
+DA:65,7
+FN:65,RuleSpenderWhitelistBase._transferredFrom
+FNDA:7,RuleSpenderWhitelistBase._transferredFrom
+DA:66,7
+DA:67,7
+BRDA:67,2,0,3
+BRDA:67,2,1,4
FNF:8
FNH:8
LF:19
@@ -1109,49 +1016,49 @@ BRH:4
end_of_record
TN:
SF:src/rules/validation/abstract/base/RuleWhitelistBase.sol
-DA:15,157
-FN:15,RuleWhitelistBase.constructor
-FNDA:157,RuleWhitelistBase.constructor
-DA:16,157
-DA:19,51
-FN:19,RuleWhitelistBase._detectTransferRestriction
-FNDA:51,RuleWhitelistBase._detectTransferRestriction
-DA:26,51
-BRDA:26,0,0,13
-BRDA:26,0,1,28
-DA:27,13
-DA:28,38
-BRDA:28,1,0,10
-DA:29,10
-DA:31,28
-DA:34,18
-FN:34,RuleWhitelistBase._detectTransferRestrictionFrom
+DA:14,159
+FN:14,RuleWhitelistBase.constructor
+FNDA:159,RuleWhitelistBase.constructor
+DA:15,159
+DA:18,53
+FN:18,RuleWhitelistBase._detectTransferRestriction
+FNDA:53,RuleWhitelistBase._detectTransferRestriction
+DA:29,53
+BRDA:29,0,0,13
+BRDA:29,0,1,30
+DA:30,13
+DA:31,40
+BRDA:31,1,0,10
+DA:32,10
+DA:34,30
+DA:37,18
+FN:37,RuleWhitelistBase._detectTransferRestrictionFrom
FNDA:18,RuleWhitelistBase._detectTransferRestrictionFrom
-DA:41,18
-BRDA:41,2,0,8
-DA:42,8
-DA:44,10
-DA:48,2
-FN:48,RuleWhitelistBase.isVerified
+DA:44,18
+BRDA:44,2,0,8
+DA:45,8
+DA:47,10
+DA:50,2
+FN:50,RuleWhitelistBase.isVerified
FNDA:2,RuleWhitelistBase.isVerified
-DA:55,2
-DA:58,3
-FN:58,RuleWhitelistBase.setCheckSpender
+DA:57,2
+DA:60,3
+FN:60,RuleWhitelistBase.setCheckSpender
FNDA:3,RuleWhitelistBase.setCheckSpender
-DA:59,2
-DA:60,2
-DA:63,2
-FN:63,RuleWhitelistBase._setCheckSpender
+DA:61,2
+DA:62,2
+DA:65,2
+FN:65,RuleWhitelistBase._setCheckSpender
FNDA:2,RuleWhitelistBase._setCheckSpender
-DA:64,2
-DA:67,27
-FN:67,RuleWhitelistBase.supportsInterface
+DA:66,2
+DA:69,27
+FN:69,RuleWhitelistBase.supportsInterface
FNDA:27,RuleWhitelistBase.supportsInterface
-DA:68,27
-DA:75,3
-FN:75,RuleWhitelistBase.onlyCheckSpenderManager
+DA:70,27
+DA:77,3
+FN:77,RuleWhitelistBase.onlyCheckSpenderManager
FNDA:3,RuleWhitelistBase.onlyCheckSpenderManager
-DA:76,3
+DA:78,3
FNF:8
FNH:8
LF:23
@@ -1161,12 +1068,12 @@ BRH:4
end_of_record
TN:
SF:src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol
-DA:36,44
-FN:36,RuleWhitelistWrapperBase.constructor
+DA:34,44
+FN:34,RuleWhitelistWrapperBase.constructor
FNDA:44,RuleWhitelistWrapperBase.constructor
-DA:39,44
-DA:50,34
-FN:50,RuleWhitelistWrapperBase._detectTransferRestriction
+DA:35,44
+DA:46,34
+FN:46,RuleWhitelistWrapperBase._detectTransferRestriction
FNDA:34,RuleWhitelistWrapperBase._detectTransferRestriction
DA:57,34
DA:58,34
@@ -1212,64 +1119,64 @@ DA:109,62
DA:116,4
FN:116,RuleWhitelistWrapperBase.isVerified
FNDA:4,RuleWhitelistWrapperBase.isVerified
-DA:123,4
-DA:124,4
-DA:125,4
-DA:126,4
-DA:139,4
-FN:139,RuleWhitelistWrapperBase.setCheckSpender
+DA:117,4
+DA:118,4
+DA:119,4
+DA:120,4
+DA:133,4
+FN:133,RuleWhitelistWrapperBase.setCheckSpender
FNDA:4,RuleWhitelistWrapperBase.setCheckSpender
-DA:140,3
-DA:141,3
-DA:144,13
-FN:144,RuleWhitelistWrapperBase._transferred.0
+DA:134,3
+DA:135,3
+DA:138,13
+FN:138,RuleWhitelistWrapperBase._transferred.0
FNDA:13,RuleWhitelistWrapperBase._transferred.0
-DA:150,13
-DA:153,1
-FN:153,RuleWhitelistWrapperBase._transferred.1
+DA:144,13
+DA:147,1
+FN:147,RuleWhitelistWrapperBase._transferred.1
FNDA:1,RuleWhitelistWrapperBase._transferred.1
-DA:159,1
-DA:171,57
-FN:171,RuleWhitelistWrapperBase._detectTransferRestrictionForTargets
+DA:153,1
+DA:165,57
+FN:165,RuleWhitelistWrapperBase._detectTransferRestrictionForTargets
FNDA:57,RuleWhitelistWrapperBase._detectTransferRestrictionForTargets
-DA:177,57
-DA:178,57
-DA:179,57
-DA:182,105
-DA:183,105
-DA:184,85
-BRDA:184,6,0,85
-DA:185,85
-DA:190,105
-DA:191,105
-DA:192,201
-BRDA:192,7,0,81
-DA:193,81
-DA:194,81
-DA:197,24
-BRDA:197,8,0,24
-DA:198,24
-DA:201,57
-DA:208,3
-FN:208,RuleWhitelistWrapperBase._setCheckSpender
+DA:171,57
+DA:172,57
+DA:173,57
+DA:176,105
+DA:177,105
+DA:178,85
+BRDA:178,6,0,85
+DA:179,85
+DA:184,105
+DA:185,105
+DA:186,201
+BRDA:186,7,0,81
+DA:187,81
+DA:188,81
+DA:191,24
+BRDA:191,8,0,24
+DA:192,24
+DA:195,57
+DA:202,3
+FN:202,RuleWhitelistWrapperBase._setCheckSpender
FNDA:3,RuleWhitelistWrapperBase._setCheckSpender
-DA:209,3
-DA:216,4
-FN:216,RuleWhitelistWrapperBase.onlyCheckSpenderManager
+DA:203,3
+DA:210,4
+FN:210,RuleWhitelistWrapperBase.onlyCheckSpenderManager
FNDA:4,RuleWhitelistWrapperBase.onlyCheckSpenderManager
-DA:217,4
-DA:230,145
-FN:230,RuleWhitelistWrapperBase._msgSender
+DA:211,4
+DA:224,145
+FN:224,RuleWhitelistWrapperBase._msgSender
FNDA:145,RuleWhitelistWrapperBase._msgSender
-DA:231,145
-DA:237,2
-FN:237,RuleWhitelistWrapperBase._msgData
+DA:225,145
+DA:231,2
+FN:231,RuleWhitelistWrapperBase._msgData
FNDA:2,RuleWhitelistWrapperBase._msgData
-DA:238,2
-DA:244,147
-FN:244,RuleWhitelistWrapperBase._contextSuffixLength
+DA:232,2
+DA:238,147
+FN:238,RuleWhitelistWrapperBase._contextSuffixLength
FNDA:147,RuleWhitelistWrapperBase._contextSuffixLength
-DA:245,147
+DA:239,147
FNF:14
FNH:14
LF:67
@@ -1279,46 +1186,46 @@ BRH:14
end_of_record
TN:
SF:src/rules/validation/abstract/core/RuleNFTAdapter.sol
-DA:40,17
-FN:40,RuleNFTAdapter.detectTransferRestriction
+DA:39,17
+FN:39,RuleNFTAdapter.detectTransferRestriction
FNDA:17,RuleNFTAdapter.detectTransferRestriction
-DA:47,17
-DA:53,13
-FN:53,RuleNFTAdapter.detectTransferRestrictionFrom
+DA:52,17
+DA:58,13
+FN:58,RuleNFTAdapter.detectTransferRestrictionFrom
FNDA:13,RuleNFTAdapter.detectTransferRestrictionFrom
-DA:60,13
-DA:66,15
-FN:66,RuleNFTAdapter.canTransfer
-FNDA:15,RuleNFTAdapter.canTransfer
+DA:66,13
DA:72,15
-DA:78,11
-FN:78,RuleNFTAdapter.canTransferFrom
+FN:72,RuleNFTAdapter.canTransfer
+FNDA:15,RuleNFTAdapter.canTransfer
+DA:84,15
+DA:90,11
+FN:90,RuleNFTAdapter.canTransferFrom
FNDA:11,RuleNFTAdapter.canTransferFrom
-DA:85,11
-DA:92,14
-FN:92,RuleNFTAdapter.transferred.0
+DA:104,11
+DA:111,14
+FN:111,RuleNFTAdapter.transferred.0
FNDA:14,RuleNFTAdapter.transferred.0
-DA:97,14
-DA:103,9
-FN:103,RuleNFTAdapter.transferred.1
+DA:122,14
+DA:128,9
+FN:128,RuleNFTAdapter.transferred.1
FNDA:9,RuleNFTAdapter.transferred.1
-DA:108,9
-DA:114,2
-FN:114,RuleNFTAdapter.transferred.2
-FNDA:2,RuleNFTAdapter.transferred.2
-DA:115,2
-BRDA:115,0,0,1
-BRDA:115,0,1,1
-DA:116,1
-DA:118,1
-DA:125,2
-FN:125,RuleNFTAdapter.transferred.3
-FNDA:2,RuleNFTAdapter.transferred.3
-DA:126,2
-BRDA:126,1,0,1
-BRDA:126,1,1,1
-DA:127,1
-DA:129,1
+DA:140,9
+DA:146,6
+FN:146,RuleNFTAdapter.transferred.2
+FNDA:6,RuleNFTAdapter.transferred.2
+DA:147,6
+BRDA:147,0,0,3
+BRDA:147,0,1,3
+DA:148,3
+DA:150,3
+DA:157,6
+FN:157,RuleNFTAdapter.transferred.3
+FNDA:6,RuleNFTAdapter.transferred.3
+DA:158,6
+BRDA:158,1,0,3
+BRDA:158,1,1,3
+DA:159,3
+DA:161,3
FNF:8
FNH:8
LF:20
@@ -1328,26 +1235,26 @@ BRH:4
end_of_record
TN:
SF:src/rules/validation/abstract/core/RuleTransferValidation.sol
-DA:46,349
-FN:46,RuleTransferValidation.detectTransferRestriction
+DA:52,349
+FN:52,RuleTransferValidation.detectTransferRestriction
FNDA:349,RuleTransferValidation.detectTransferRestriction
-DA:53,349
-DA:59,38
-FN:59,RuleTransferValidation.detectTransferRestrictionFrom
+DA:59,349
+DA:65,38
+FN:65,RuleTransferValidation.detectTransferRestrictionFrom
FNDA:38,RuleTransferValidation.detectTransferRestrictionFrom
-DA:66,38
-DA:77,21
-FN:77,RuleTransferValidation.canTransfer
-FNDA:21,RuleTransferValidation.canTransfer
+DA:72,38
DA:83,21
-DA:89,14
-FN:89,RuleTransferValidation.canTransferFrom
+FN:83,RuleTransferValidation.canTransfer
+FNDA:21,RuleTransferValidation.canTransfer
+DA:89,21
+DA:95,14
+FN:95,RuleTransferValidation.canTransferFrom
FNDA:14,RuleTransferValidation.canTransferFrom
-DA:96,14
-DA:100,196
-FN:100,RuleTransferValidation.supportsInterface
+DA:102,14
+DA:106,196
+FN:106,RuleTransferValidation.supportsInterface
FNDA:196,RuleTransferValidation.supportsInterface
-DA:101,196
+DA:107,196
FNF:5
FNH:5
LF:10
@@ -1362,48 +1269,49 @@ FN:33,RuleWhitelistShared.canReturnTransferRestrictionCode
FNDA:10,RuleWhitelistShared.canReturnTransferRestrictionCode
DA:34,10
DA:35,5
-DA:45,14
-FN:45,RuleWhitelistShared.messageForTransferRestriction
+DA:36,2
+DA:46,14
+FN:46,RuleWhitelistShared.messageForTransferRestriction
FNDA:14,RuleWhitelistShared.messageForTransferRestriction
-DA:51,14
-BRDA:51,0,0,6
-BRDA:51,0,1,2
-DA:52,6
-DA:53,8
-BRDA:53,1,0,4
-BRDA:53,1,1,2
-DA:54,4
+DA:52,14
+BRDA:52,0,0,6
+BRDA:52,0,1,2
+DA:53,6
+DA:54,8
+BRDA:54,1,0,4
+BRDA:54,1,1,2
DA:55,4
-BRDA:55,2,0,2
-BRDA:55,2,1,2
-DA:56,2
-DA:58,2
-DA:75,19
-FN:75,RuleWhitelistShared.transferred.0
-FNDA:19,RuleWhitelistShared.transferred.0
+DA:56,4
+BRDA:56,2,0,2
+BRDA:56,2,1,2
+DA:57,2
+DA:59,2
DA:76,19
-DA:90,4
-FN:90,RuleWhitelistShared.transferred.1
-FNDA:4,RuleWhitelistShared.transferred.1
+FN:76,RuleWhitelistShared.transferred.0
+FNDA:19,RuleWhitelistShared.transferred.0
+DA:77,19
DA:91,4
-DA:94,26
-FN:94,RuleWhitelistShared._transferred
-FNDA:26,RuleWhitelistShared._transferred
-DA:95,26
-DA:96,26
-BRDA:96,3,0,14
-BRDA:96,3,1,12
-DA:102,11
-FN:102,RuleWhitelistShared._transferredFrom
+FN:91,RuleWhitelistShared.transferred.1
+FNDA:4,RuleWhitelistShared.transferred.1
+DA:92,4
+DA:95,28
+FN:95,RuleWhitelistShared._transferred
+FNDA:28,RuleWhitelistShared._transferred
+DA:96,28
+DA:97,28
+BRDA:97,3,0,14
+BRDA:97,3,1,14
+DA:103,11
+FN:103,RuleWhitelistShared._transferredFrom
FNDA:11,RuleWhitelistShared._transferredFrom
-DA:108,11
-DA:109,11
-BRDA:109,4,0,4
-BRDA:109,4,1,7
+DA:104,11
+DA:105,11
+BRDA:105,4,0,4
+BRDA:105,4,1,7
FNF:6
FNH:6
-LF:21
-LH:21
+LF:22
+LH:22
BRF:10
BRH:10
end_of_record
@@ -1413,51 +1321,52 @@ DA:28,91
FN:28,RuleBlacklist.supportsInterface
FNDA:91,RuleBlacklist.supportsInterface
DA:35,91
-DA:38,28
-FN:38,RuleBlacklist._authorizeAddressListAdd
+DA:36,61
+DA:39,28
+FN:39,RuleBlacklist._authorizeAddressListAdd
FNDA:28,RuleBlacklist._authorizeAddressListAdd
-DA:40,1
-FN:40,RuleBlacklist._authorizeAddressListRemove
+DA:41,1
+FN:41,RuleBlacklist._authorizeAddressListRemove
FNDA:1,RuleBlacklist._authorizeAddressListRemove
-DA:42,83
-FN:42,RuleBlacklist._msgSender
-FNDA:83,RuleBlacklist._msgSender
DA:43,83
-DA:46,1
-FN:46,RuleBlacklist._msgData
-FNDA:1,RuleBlacklist._msgData
+FN:43,RuleBlacklist._msgSender
+FNDA:83,RuleBlacklist._msgSender
+DA:44,83
DA:47,1
-DA:50,84
-FN:50,RuleBlacklist._contextSuffixLength
-FNDA:84,RuleBlacklist._contextSuffixLength
+FN:47,RuleBlacklist._msgData
+FNDA:1,RuleBlacklist._msgData
+DA:48,1
DA:51,84
+FN:51,RuleBlacklist._contextSuffixLength
+FNDA:84,RuleBlacklist._contextSuffixLength
+DA:52,84
FNF:6
FNH:6
-LF:10
-LH:10
+LF:11
+LH:11
BRF:0
BRH:0
end_of_record
TN:
SF:src/rules/validation/deployment/RuleBlacklistOwnable2Step.sol
-DA:20,2
-FN:20,RuleBlacklistOwnable2Step._authorizeAddressListAdd
+DA:17,2
+FN:17,RuleBlacklistOwnable2Step._authorizeAddressListAdd
FNDA:2,RuleBlacklistOwnable2Step._authorizeAddressListAdd
-DA:22,2
-FN:22,RuleBlacklistOwnable2Step._authorizeAddressListRemove
+DA:19,2
+FN:19,RuleBlacklistOwnable2Step._authorizeAddressListRemove
FNDA:2,RuleBlacklistOwnable2Step._authorizeAddressListRemove
-DA:24,12
-FN:24,RuleBlacklistOwnable2Step._msgSender
+DA:21,12
+FN:21,RuleBlacklistOwnable2Step._msgSender
FNDA:12,RuleBlacklistOwnable2Step._msgSender
-DA:25,12
-DA:28,1
-FN:28,RuleBlacklistOwnable2Step._msgData
+DA:22,12
+DA:25,1
+FN:25,RuleBlacklistOwnable2Step._msgData
FNDA:1,RuleBlacklistOwnable2Step._msgData
-DA:29,1
-DA:32,13
-FN:32,RuleBlacklistOwnable2Step._contextSuffixLength
+DA:26,1
+DA:29,13
+FN:29,RuleBlacklistOwnable2Step._contextSuffixLength
FNDA:13,RuleBlacklistOwnable2Step._contextSuffixLength
-DA:33,13
+DA:30,13
FNF:5
FNH:5
LF:8
@@ -1504,30 +1413,30 @@ BRH:0
end_of_record
TN:
SF:src/rules/validation/deployment/RuleERC2980Ownable2Step.sol
-DA:20,7
-FN:20,RuleERC2980Ownable2Step._authorizeWhitelistAdd
+DA:17,7
+FN:17,RuleERC2980Ownable2Step._authorizeWhitelistAdd
FNDA:7,RuleERC2980Ownable2Step._authorizeWhitelistAdd
-DA:22,3
-FN:22,RuleERC2980Ownable2Step._authorizeWhitelistRemove
+DA:19,3
+FN:19,RuleERC2980Ownable2Step._authorizeWhitelistRemove
FNDA:3,RuleERC2980Ownable2Step._authorizeWhitelistRemove
-DA:24,6
-FN:24,RuleERC2980Ownable2Step._authorizeFrozenlistAdd
+DA:21,6
+FN:21,RuleERC2980Ownable2Step._authorizeFrozenlistAdd
FNDA:6,RuleERC2980Ownable2Step._authorizeFrozenlistAdd
-DA:26,2
-FN:26,RuleERC2980Ownable2Step._authorizeFrozenlistRemove
+DA:23,2
+FN:23,RuleERC2980Ownable2Step._authorizeFrozenlistRemove
FNDA:2,RuleERC2980Ownable2Step._authorizeFrozenlistRemove
-DA:28,30
-FN:28,RuleERC2980Ownable2Step._msgSender
+DA:25,30
+FN:25,RuleERC2980Ownable2Step._msgSender
FNDA:30,RuleERC2980Ownable2Step._msgSender
-DA:29,30
-DA:32,1
-FN:32,RuleERC2980Ownable2Step._msgData
+DA:26,30
+DA:29,1
+FN:29,RuleERC2980Ownable2Step._msgData
FNDA:1,RuleERC2980Ownable2Step._msgData
-DA:33,1
-DA:36,31
-FN:36,RuleERC2980Ownable2Step._contextSuffixLength
+DA:30,1
+DA:33,31
+FN:33,RuleERC2980Ownable2Step._contextSuffixLength
FNDA:31,RuleERC2980Ownable2Step._contextSuffixLength
-DA:37,31
+DA:34,31
FNF:7
FNH:7
LF:10
@@ -1653,24 +1562,24 @@ FN:21,RuleSpenderWhitelist.supportsInterface
FNDA:2,RuleSpenderWhitelist.supportsInterface
DA:28,2
DA:29,1
-DA:32,4
+DA:32,6
FN:32,RuleSpenderWhitelist._authorizeAddressListAdd
-FNDA:4,RuleSpenderWhitelist._authorizeAddressListAdd
+FNDA:6,RuleSpenderWhitelist._authorizeAddressListAdd
DA:34,2
FN:34,RuleSpenderWhitelist._authorizeAddressListRemove
FNDA:2,RuleSpenderWhitelist._authorizeAddressListRemove
-DA:36,25
+DA:36,31
FN:36,RuleSpenderWhitelist._msgSender
-FNDA:25,RuleSpenderWhitelist._msgSender
-DA:37,25
+FNDA:31,RuleSpenderWhitelist._msgSender
+DA:37,31
DA:40,1
FN:40,RuleSpenderWhitelist._msgData
FNDA:1,RuleSpenderWhitelist._msgData
DA:41,1
-DA:44,27
+DA:44,33
FN:44,RuleSpenderWhitelist._contextSuffixLength
-FNDA:27,RuleSpenderWhitelist._contextSuffixLength
-DA:45,27
+FNDA:33,RuleSpenderWhitelist._contextSuffixLength
+DA:45,33
FNF:6
FNH:6
LF:11
@@ -1707,35 +1616,36 @@ BRH:0
end_of_record
TN:
SF:src/rules/validation/deployment/RuleWhitelist.sol
-DA:42,40
-FN:42,RuleWhitelist.supportsInterface
+DA:43,40
+FN:43,RuleWhitelist.supportsInterface
FNDA:40,RuleWhitelist.supportsInterface
-DA:49,40
-DA:56,1
-FN:56,RuleWhitelist._authorizeCheckSpenderManager
+DA:50,40
+DA:51,27
+DA:58,1
+FN:58,RuleWhitelist._authorizeCheckSpenderManager
FNDA:1,RuleWhitelist._authorizeCheckSpenderManager
-DA:58,348
-FN:58,RuleWhitelist._authorizeAddressListAdd
-FNDA:348,RuleWhitelist._authorizeAddressListAdd
-DA:60,263
-FN:60,RuleWhitelist._authorizeAddressListRemove
+DA:60,352
+FN:60,RuleWhitelist._authorizeAddressListAdd
+FNDA:352,RuleWhitelist._authorizeAddressListAdd
+DA:62,263
+FN:62,RuleWhitelist._authorizeAddressListRemove
FNDA:263,RuleWhitelist._authorizeAddressListRemove
-DA:62,772
-FN:62,RuleWhitelist._msgSender
-FNDA:772,RuleWhitelist._msgSender
-DA:63,772
-DA:66,1
-FN:66,RuleWhitelist._msgData
+DA:64,778
+FN:64,RuleWhitelist._msgSender
+FNDA:778,RuleWhitelist._msgSender
+DA:65,778
+DA:68,1
+FN:68,RuleWhitelist._msgData
FNDA:1,RuleWhitelist._msgData
-DA:67,1
-DA:70,773
-FN:70,RuleWhitelist._contextSuffixLength
-FNDA:773,RuleWhitelist._contextSuffixLength
-DA:71,773
+DA:69,1
+DA:72,779
+FN:72,RuleWhitelist._contextSuffixLength
+FNDA:779,RuleWhitelist._contextSuffixLength
+DA:73,779
FNF:7
FNH:7
-LF:11
-LH:11
+LF:12
+LH:12
BRF:0
BRH:0
end_of_record
@@ -1771,41 +1681,41 @@ BRH:0
end_of_record
TN:
SF:src/rules/validation/deployment/RuleWhitelistWrapper.sol
-DA:37,38
-FN:37,RuleWhitelistWrapper.hasRole
+DA:34,38
+FN:34,RuleWhitelistWrapper.hasRole
FNDA:38,RuleWhitelistWrapper.hasRole
-DA:44,134
-DA:47,2
-FN:47,RuleWhitelistWrapper._authorizeCheckSpenderManager
+DA:41,134
+DA:44,2
+FN:44,RuleWhitelistWrapper._authorizeCheckSpenderManager
FNDA:2,RuleWhitelistWrapper._authorizeCheckSpenderManager
-DA:52,90
-FN:52,RuleWhitelistWrapper._onlyRulesManager
+DA:49,90
+FN:49,RuleWhitelistWrapper._onlyRulesManager
FNDA:90,RuleWhitelistWrapper._onlyRulesManager
-DA:58,133
-FN:58,RuleWhitelistWrapper._msgSender
+DA:55,133
+FN:55,RuleWhitelistWrapper._msgSender
FNDA:133,RuleWhitelistWrapper._msgSender
-DA:59,133
-DA:62,1
-FN:62,RuleWhitelistWrapper._msgData
+DA:56,133
+DA:59,1
+FN:59,RuleWhitelistWrapper._msgData
FNDA:1,RuleWhitelistWrapper._msgData
-DA:63,1
-DA:66,134
-FN:66,RuleWhitelistWrapper._contextSuffixLength
+DA:60,1
+DA:63,134
+FN:63,RuleWhitelistWrapper._contextSuffixLength
FNDA:134,RuleWhitelistWrapper._contextSuffixLength
-DA:67,134
-DA:70,46
-FN:70,RuleWhitelistWrapper.supportsInterface
+DA:70,134
+DA:73,46
+FN:73,RuleWhitelistWrapper.supportsInterface
FNDA:46,RuleWhitelistWrapper.supportsInterface
-DA:77,46
-DA:78,16
-DA:81,38
-FN:81,RuleWhitelistWrapper._grantRole
+DA:80,46
+DA:81,16
+DA:84,38
+FN:84,RuleWhitelistWrapper._grantRole
FNDA:38,RuleWhitelistWrapper._grantRole
-DA:87,38
-DA:90,1
-FN:90,RuleWhitelistWrapper._revokeRole
+DA:90,38
+DA:93,1
+FN:93,RuleWhitelistWrapper._revokeRole
FNDA:1,RuleWhitelistWrapper._revokeRole
-DA:96,1
+DA:99,1
FNF:9
FNH:9
LF:17
@@ -1832,7 +1742,7 @@ DA:44,1
DA:47,13
FN:47,RuleWhitelistWrapperOwnable2Step._contextSuffixLength
FNDA:13,RuleWhitelistWrapperOwnable2Step._contextSuffixLength
-DA:48,13
+DA:54,13
FNF:5
FNH:5
LF:8
@@ -1840,426 +1750,3 @@ LH:8
BRF:0
BRH:0
end_of_record
-TN:
-SF:test/Coverage/DeploymentOperationCoverage.t.sol
-DA:25,1
-FN:25,RuleBlacklistHarness.exposedMsgDataLength.0
-FNDA:1,RuleBlacklistHarness.exposedMsgDataLength.0
-DA:26,1
-DA:35,1
-FN:35,RuleWhitelistHarness.exposedMsgDataLength.1
-FNDA:1,RuleWhitelistHarness.exposedMsgDataLength.1
-DA:36,1
-DA:45,1
-FN:45,RuleWhitelistWrapperHarness.exposedMsgDataLength.2
-FNDA:1,RuleWhitelistWrapperHarness.exposedMsgDataLength.2
-DA:46,1
-DA:53,1
-FN:53,RuleERC2980Harness.exposedMsgDataLength.3
-FNDA:1,RuleERC2980Harness.exposedMsgDataLength.3
-DA:54,1
-DA:63,1
-FN:63,RuleSanctionsListHarness.exposedMsgDataLength.4
-FNDA:1,RuleSanctionsListHarness.exposedMsgDataLength.4
-DA:64,1
-DA:71,1
-FN:71,RuleBlacklistOwnable2StepHarness.exposedMsgDataLength.5
-FNDA:1,RuleBlacklistOwnable2StepHarness.exposedMsgDataLength.5
-DA:72,1
-DA:81,1
-FN:81,RuleWhitelistOwnable2StepHarness.exposedMsgDataLength.6
-FNDA:1,RuleWhitelistOwnable2StepHarness.exposedMsgDataLength.6
-DA:82,1
-DA:91,1
-FN:91,RuleWhitelistWrapperOwnable2StepHarness.exposedMsgDataLength.7
-FNDA:1,RuleWhitelistWrapperOwnable2StepHarness.exposedMsgDataLength.7
-DA:92,1
-DA:99,1
-FN:99,RuleERC2980Ownable2StepHarness.exposedMsgDataLength.8
-FNDA:1,RuleERC2980Ownable2StepHarness.exposedMsgDataLength.8
-DA:100,1
-FNF:9
-FNH:9
-LF:18
-LH:18
-BRF:0
-BRH:0
-end_of_record
-TN:
-SF:test/RuleBlacklist/Ownable/RuleBlacklistOwnable2Step.t.sol
-DA:9,2
-FN:9,RuleBlacklistOwnable2StepTest._deployOwnable2Step
-FNDA:2,RuleBlacklistOwnable2StepTest._deployOwnable2Step
-DA:10,2
-DA:11,2
-DA:12,2
-FNF:1
-FNH:1
-LF:4
-LH:4
-BRF:0
-BRH:0
-end_of_record
-TN:
-SF:test/RuleBlacklist/Ownable/RuleBlacklistOwnableAccessControl.t.sol
-DA:9,2
-FN:9,RuleBlacklistOwnable2StepAccessControl._deployAddressList
-FNDA:2,RuleBlacklistOwnable2StepAccessControl._deployAddressList
-DA:10,2
-DA:11,2
-DA:12,2
-FNF:1
-FNH:1
-LF:4
-LH:4
-BRF:0
-BRH:0
-end_of_record
-TN:
-SF:test/RuleConditionalTransferLight/RuleConditionalTransferLightApproveAndTransfer.t.sol
-DA:12,1
-FN:12,MockERC20TransferFromFalse.setAllowance
-FNDA:1,MockERC20TransferFromFalse.setAllowance
-DA:13,1
-DA:16,1
-FN:16,MockERC20TransferFromFalse.allowance
-FNDA:1,MockERC20TransferFromFalse.allowance
-DA:17,1
-DA:20,1
-FN:20,MockERC20TransferFromFalse.transferFrom
-FNDA:1,MockERC20TransferFromFalse.transferFrom
-DA:21,1
-FNF:3
-FNH:3
-LF:6
-LH:6
-BRF:0
-BRH:0
-end_of_record
-TN:
-SF:test/RuleERC2980/Ownable/RuleERC2980Ownable2Step.t.sol
-DA:9,2
-FN:9,RuleERC2980Ownable2StepTest._deployOwnable2Step
-FNDA:2,RuleERC2980Ownable2StepTest._deployOwnable2Step
-DA:10,2
-DA:11,2
-DA:12,2
-FNF:1
-FNH:1
-LF:4
-LH:4
-BRF:0
-BRH:0
-end_of_record
-TN:
-SF:test/RuleIdentityRegistry/Ownable/RuleIdentityRegistryOwnable2Step.t.sol
-DA:12,2
-FN:12,RuleIdentityRegistryOwnable2StepTest._deployOwnable2Step
-FNDA:2,RuleIdentityRegistryOwnable2StepTest._deployOwnable2Step
-DA:13,2
-DA:14,2
-DA:15,2
-DA:16,2
-FNF:1
-FNH:1
-LF:5
-LH:5
-BRF:0
-BRH:0
-end_of_record
-TN:
-SF:test/RuleMaxTotalSupply/Ownable/RuleMaxTotalSupplyOwnable2Step.t.sol
-DA:11,2
-FN:11,RuleMaxTotalSupplyOwnable2StepTest._deployOwnable2Step
-FNDA:2,RuleMaxTotalSupplyOwnable2StepTest._deployOwnable2Step
-DA:12,2
-DA:13,2
-DA:14,2
-DA:15,2
-FNF:1
-FNH:1
-LF:5
-LH:5
-BRF:0
-BRH:0
-end_of_record
-TN:
-SF:test/RuleSanctionList/Ownable/RuleSanctionsListOwnable2Step.t.sol
-DA:16,1
-FN:16,RuleSanctionsListOwnable2StepHarness.exposedMsgSender
-FNDA:1,RuleSanctionsListOwnable2StepHarness.exposedMsgSender
-DA:17,1
-DA:20,1
-FN:20,RuleSanctionsListOwnable2StepHarness.exposedMsgData
-FNDA:1,RuleSanctionsListOwnable2StepHarness.exposedMsgData
-DA:21,1
-DA:24,1
-FN:24,RuleSanctionsListOwnable2StepHarness.exposedContextSuffixLength
-FNDA:1,RuleSanctionsListOwnable2StepHarness.exposedContextSuffixLength
-DA:25,1
-DA:30,2
-FN:30,RuleSanctionsListOwnable2StepTest._deployOwnable2Step
-FNDA:2,RuleSanctionsListOwnable2StepTest._deployOwnable2Step
-DA:31,2
-DA:32,2
-DA:33,2
-DA:34,2
-FNF:4
-FNH:4
-LF:11
-LH:11
-BRF:0
-BRH:0
-end_of_record
-TN:
-SF:test/RuleSpenderWhitelist/Ownable/RuleSpenderWhitelistOwnable2Step.t.sol
-DA:12,1
-FN:12,RuleSpenderWhitelistOwnable2StepHarness.exposedMsgSender
-FNDA:1,RuleSpenderWhitelistOwnable2StepHarness.exposedMsgSender
-DA:13,1
-DA:16,1
-FN:16,RuleSpenderWhitelistOwnable2StepHarness.exposedMsgData
-FNDA:1,RuleSpenderWhitelistOwnable2StepHarness.exposedMsgData
-DA:17,1
-DA:20,1
-FN:20,RuleSpenderWhitelistOwnable2StepHarness.exposedContextSuffixLength
-FNDA:1,RuleSpenderWhitelistOwnable2StepHarness.exposedContextSuffixLength
-DA:21,1
-FNF:3
-FNH:3
-LF:6
-LH:6
-BRF:0
-BRH:0
-end_of_record
-TN:
-SF:test/RuleSpenderWhitelist/RuleSpenderWhitelist.t.sol
-DA:14,1
-FN:14,RuleSpenderWhitelistHarness.exposedMsgSender
-FNDA:1,RuleSpenderWhitelistHarness.exposedMsgSender
-DA:15,1
-DA:18,1
-FN:18,RuleSpenderWhitelistHarness.exposedMsgData
-FNDA:1,RuleSpenderWhitelistHarness.exposedMsgData
-DA:19,1
-DA:22,1
-FN:22,RuleSpenderWhitelistHarness.exposedContextSuffixLength
-FNDA:1,RuleSpenderWhitelistHarness.exposedContextSuffixLength
-DA:23,1
-FNF:3
-FNH:3
-LF:6
-LH:6
-BRF:0
-BRH:0
-end_of_record
-TN:
-SF:test/RuleWhitelist/Ownable/RuleWhitelistOwnable2Step.t.sol
-DA:9,2
-FN:9,RuleWhitelistOwnable2StepTest._deployOwnable2Step
-FNDA:2,RuleWhitelistOwnable2StepTest._deployOwnable2Step
-DA:10,2
-DA:11,2
-DA:12,2
-FNF:1
-FNH:1
-LF:4
-LH:4
-BRF:0
-BRH:0
-end_of_record
-TN:
-SF:test/RuleWhitelist/Ownable/RuleWhitelistOwnableAccessControl.t.sol
-DA:9,2
-FN:9,RuleWhitelistOwnable2StepAccessControl._deployAddressList
-FNDA:2,RuleWhitelistOwnable2StepAccessControl._deployAddressList
-DA:10,2
-DA:11,2
-DA:12,2
-FNF:1
-FNH:1
-LF:4
-LH:4
-BRF:0
-BRH:0
-end_of_record
-TN:
-SF:test/RuleWhitelist/WhitelistWrapper.t.sol
-DA:18,1
-FN:18,RuleWhitelistWrapperHarnessInternal.exposedTransferredSpenderInternal
-FNDA:1,RuleWhitelistWrapperHarnessInternal.exposedTransferredSpenderInternal
-DA:19,1
-FNF:1
-FNH:1
-LF:2
-LH:2
-BRF:0
-BRH:0
-end_of_record
-TN:
-SF:test/utils/AccessControlEnumerableTestBase.sol
-DA:24,7
-FN:24,AccessControlEnumerableTestBase.setUp
-FNDA:7,AccessControlEnumerableTestBase.setUp
-DA:25,7
-DA:28,14
-FN:28,AccessControlEnumerableTestBase._assertRoleMembers
-FNDA:14,AccessControlEnumerableTestBase._assertRoleMembers
-DA:29,14
-DA:30,14
-DA:31,14
-BRDA:31,0,0,7
-DA:32,7
-DA:34,7
-DA:35,7
-DA:36,7
-FNF:2
-FNH:2
-LF:10
-LH:10
-BRF:1
-BRH:1
-end_of_record
-TN:
-SF:test/utils/IdentityRegistryMock.sol
-DA:9,17
-FN:9,IdentityRegistryMock.setVerified
-FNDA:17,IdentityRegistryMock.setVerified
-DA:10,17
-DA:13,25
-FN:13,IdentityRegistryMock.isVerified
-FNDA:25,IdentityRegistryMock.isVerified
-DA:14,25
-FNF:2
-FNH:2
-LF:4
-LH:4
-BRF:0
-BRH:0
-end_of_record
-TN:
-SF:test/utils/MockERC20WithTransferContext.sol
-DA:19,10
-FN:19,MockERC20WithTransferContext.constructor
-FNDA:10,MockERC20WithTransferContext.constructor
-DA:20,10
-DA:21,10
-DA:22,10
-DA:25,10
-FN:25,MockERC20WithTransferContext.setRule
-FNDA:10,MockERC20WithTransferContext.setRule
-DA:26,10
-DA:29,10
-FN:29,MockERC20WithTransferContext.mint
-FNDA:10,MockERC20WithTransferContext.mint
-DA:30,10
-DA:31,10
-DA:34,4
-FN:34,MockERC20WithTransferContext.approve
-FNDA:4,MockERC20WithTransferContext.approve
-DA:35,4
-DA:36,4
-DA:37,4
-DA:40,0
-FN:40,MockERC20WithTransferContext.transfer
-FNDA:0,MockERC20WithTransferContext.transfer
-DA:41,0
-DA:42,0
-DA:43,0
-DA:46,1
-FN:46,MockERC20WithTransferContext.transferFrom
-FNDA:1,MockERC20WithTransferContext.transferFrom
-DA:47,1
-DA:48,1
-BRDA:48,0,0,-
-BRDA:48,0,1,1
-DA:49,1
-DA:50,1
-DA:51,1
-DA:52,1
-DA:55,3
-FN:55,MockERC20WithTransferContext.transferWithContext
-FNDA:3,MockERC20WithTransferContext.transferWithContext
-DA:59,3
-DA:60,3
-DA:61,3
-DA:64,3
-FN:64,MockERC20WithTransferContext.transferFromWithContext
-FNDA:3,MockERC20WithTransferContext.transferFromWithContext
-DA:71,3
-DA:72,3
-BRDA:72,1,0,-
-BRDA:72,1,1,3
-DA:73,3
-DA:74,3
-DA:75,3
-DA:76,3
-DA:79,7
-FN:79,MockERC20WithTransferContext._transfer
-FNDA:7,MockERC20WithTransferContext._transfer
-DA:80,7
-BRDA:80,2,0,-
-BRDA:80,2,1,7
-DA:81,7
-DA:82,7
-DA:83,7
-DA:86,7
-FN:86,MockERC20WithTransferContext._callRuleContext
-FNDA:7,MockERC20WithTransferContext._callRuleContext
-DA:94,7
-BRDA:94,3,0,7
-DA:95,7
-DA:98,5
-BRDA:98,4,0,5
-BRDA:98,4,1,2
-DA:99,5
-DA:100,5
-DA:110,5
-DA:112,2
-DA:113,2
-DA:124,2
-FNF:10
-FNH:9
-LF:50
-LH:46
-BRF:9
-BRH:6
-end_of_record
-TN:
-SF:test/utils/SanctionListOracle.sol
-DA:15,22
-FN:15,SanctionListOracle.addToSanctionsList
-FNDA:22,SanctionListOracle.addToSanctionsList
-DA:16,22
-DA:19,0
-FN:19,SanctionListOracle.removeFromSanctionsList
-FNDA:0,SanctionListOracle.removeFromSanctionsList
-DA:20,0
-DA:23,159
-FN:23,SanctionListOracle.isSanctioned
-FNDA:159,SanctionListOracle.isSanctioned
-DA:24,159
-FNF:3
-FNH:2
-LF:6
-LH:4
-BRF:0
-BRH:0
-end_of_record
-TN:
-SF:test/utils/TotalSupplyMock.sol
-DA:7,268
-FN:7,TotalSupplyMock.totalSupply
-FNDA:268,TotalSupplyMock.totalSupply
-DA:8,268
-DA:11,267
-FN:11,TotalSupplyMock.setTotalSupply
-FNDA:267,TotalSupplyMock.setTotalSupply
-DA:12,267
-FNF:2
-FNH:2
-LF:4
-LH:4
-BRF:0
-BRH:0
-end_of_record
From bc57984b8879d20f37ce872a8e2ad5c44ba705ca Mon Sep 17 00:00:00 2001
From: Ryan Sauge <71391932+rya-sge@users.noreply.github.com>
Date: Tue, 10 Mar 2026 16:47:09 +0100
Subject: [PATCH 8/8] Update doc and remove useless error
---
README.md | 14 ++++
...ntrolModuleStandalone.sol.func-sort-c.html | 4 +-
...ccessControlModuleStandalone.sol.func.html | 4 +-
...ccessControlModuleStandalone.sol.gcov.html | 4 +-
.../VersionModule.sol.func-sort-c.html | 4 +-
.../src/modules/VersionModule.sol.func.html | 4 +-
.../src/modules/VersionModule.sol.gcov.html | 4 +-
.../dev/Rules/src/modules/index-sort-b.html | 4 +-
.../dev/Rules/src/modules/index-sort-f.html | 4 +-
.../dev/Rules/src/modules/index-sort-l.html | 4 +-
.../Pictures/dev/Rules/src/modules/index.html | 4 +-
...ditionalTransferLight.sol.func-sort-c.html | 4 +-
...RuleConditionalTransferLight.sol.func.html | 4 +-
...RuleConditionalTransferLight.sol.gcov.html | 4 +-
...sferLightOwnable2Step.sol.func-sort-c.html | 4 +-
...nalTransferLightOwnable2Step.sol.func.html | 4 +-
...nalTransferLightOwnable2Step.sol.gcov.html | 4 +-
...onalTransferLightBase.sol.func-sort-c.html | 4 +-
...ConditionalTransferLightBase.sol.func.html | 4 +-
...ConditionalTransferLightBase.sol.gcov.html | 4 +-
.../operation/abstract/index-sort-b.html | 4 +-
.../operation/abstract/index-sort-f.html | 4 +-
.../operation/abstract/index-sort-l.html | 4 +-
.../src/rules/operation/abstract/index.html | 4 +-
.../src/rules/operation/index-sort-b.html | 4 +-
.../src/rules/operation/index-sort-f.html | 4 +-
.../src/rules/operation/index-sort-l.html | 4 +-
.../dev/Rules/src/rules/operation/index.html | 4 +-
doc/coverage/coverage/index-sort-b.html | 6 +-
doc/coverage/coverage/index-sort-f.html | 6 +-
doc/coverage/coverage/index-sort-l.html | 6 +-
doc/coverage/coverage/index.html | 6 +-
..._graph_DeploymentCoverageHarnesses.sol.png | Bin 0 -> 193441 bytes
.../surya_graph_IdentityRegistryMock.sol.png | Bin 0 -> 18577 bytes
...a_graph_MockERC20TransferFromFalse.sol.png | Bin 0 -> 30806 bytes
...graph_MockERC20WithTransferContext.sol.png | Bin 0 -> 169153 bytes
...raph_MockERC721WithTransferContext.sol.png | Bin 0 -> 78821 bytes
...graph_RuleConditionalTransferLight.sol.png | Bin 109279 -> 113776 bytes
...h_RuleConditionalTransferLightBase.sol.png | Bin 231993 -> 249484 bytes
...leSanctionsListOwnable2StepHarness.sol.png | Bin 0 -> 49488 bytes
...a_graph_RuleSharedInvariantStorage.sol.png | Bin 0 -> 10721 bytes
.../surya_graph_RuleSpenderWhitelist.sol.png | Bin 0 -> 95087 bytes
...rya_graph_RuleSpenderWhitelistBase.sol.png | Bin 0 -> 87130 bytes
...raph_RuleSpenderWhitelistHarnesses.sol.png | Bin 0 -> 88491 bytes
...leSpenderWhitelistInvariantStorage.sol.png | Bin 0 -> 10721 bytes
...h_RuleSpenderWhitelistOwnable2Step.sol.png | Bin 0 -> 68938 bytes
...uleWhitelistWrapperHarnessInternal.sol.png | Bin 0 -> 29369 bytes
.../surya_graph_SanctionListOracle.sol.png | Bin 0 -> 30284 bytes
.../surya_graph_TotalSupplyMock.sol.png | Bin 0 -> 19142 bytes
...itance_DeploymentCoverageHarnesses.sol.png | Bin 0 -> 76928 bytes
...a_inheritance_IdentityRegistryMock.sol.png | Bin 0 -> 13606 bytes
...ritance_MockERC20TransferFromFalse.sol.png | Bin 0 -> 7945 bytes
...tance_MockERC20WithTransferContext.sol.png | Bin 0 -> 13055 bytes
...ance_MockERC721WithTransferContext.sol.png | Bin 0 -> 13168 bytes
...ance_RuleBlacklistInvariantStorage.sol.png | Bin 15321 -> 15187 bytes
...ionalTransferLightInvariantStorage.sol.png | Bin 16885 -> 16770 bytes
...itance_RuleERC2980InvariantStorage.sol.png | Bin 15701 -> 15723 bytes
...leIdentityRegistryInvariantStorage.sol.png | Bin 15977 -> 15698 bytes
...RuleMaxTotalSupplyInvariantStorage.sol.png | Bin 16185 -> 16113 bytes
..._RuleSanctionsListInvariantStorage.sol.png | Bin 15416 -> 15273 bytes
...leSanctionsListOwnable2StepHarness.sol.png | Bin 0 -> 17370 bytes
...ritance_RuleSharedInvariantStorage.sol.png | Bin 0 -> 7123 bytes
...a_inheritance_RuleSpenderWhitelist.sol.png | Bin 0 -> 22248 bytes
...heritance_RuleSpenderWhitelistBase.sol.png | Bin 0 -> 27390 bytes
...ance_RuleSpenderWhitelistHarnesses.sol.png | Bin 0 -> 25990 bytes
...leSpenderWhitelistInvariantStorage.sol.png | Bin 0 -> 16324 bytes
...e_RuleSpenderWhitelistOwnable2Step.sol.png | Bin 0 -> 22483 bytes
...ance_RuleWhitelistInvariantStorage.sol.png | Bin 15187 -> 15099 bytes
...uleWhitelistWrapperHarnessInternal.sol.png | Bin 0 -> 14610 bytes
...rya_inheritance_SanctionListOracle.sol.png | Bin 0 -> 11237 bytes
.../surya_inheritance_TotalSupplyMock.sol.png | Bin 0 -> 5881 bytes
..._report_DeploymentCoverageHarnesses.sol.md | 60 ++++++++++++++++++
.../surya_report_IAddressList.sol.md | 2 +-
...eport_IERC7943NonFungibleCompliance.sol.md | 2 +-
.../surya_report_IdentityRegistryMock.sol.md | 28 ++++++++
...a_report_MockERC20TransferFromFalse.sol.md | 29 +++++++++
...report_MockERC20WithTransferContext.sol.md | 35 ++++++++++
...eport_MockERC721WithTransferContext.sol.md | 31 +++++++++
.../surya_report_RuleAddressSet.sol.md | 2 +-
...surya_report_RuleAddressSetInternal.sol.md | 2 +-
.../surya_report_RuleBlacklist.sol.md | 2 +-
.../surya_report_RuleBlacklistBase.sol.md | 2 +-
...eport_RuleBlacklistInvariantStorage.sol.md | 4 +-
...ya_report_RuleBlacklistOwnable2Step.sol.md | 2 +-
...report_RuleConditionalTransferLight.sol.md | 2 +-
...rt_RuleConditionalTransferLightBase.sol.md | 2 +-
...tionalTransferLightInvariantStorage.sol.md | 4 +-
...onditionalTransferLightOwnable2Step.sol.md | 2 +-
.../surya_report_RuleERC2980Base.sol.md | 2 +-
..._report_RuleERC2980InvariantStorage.sol.md | 4 +-
...urya_report_RuleERC2980Ownable2Step.sol.md | 2 +-
...rya_report_RuleIdentityRegistryBase.sol.md | 2 +-
...uleIdentityRegistryInvariantStorage.sol.md | 4 +-
...surya_report_RuleMaxTotalSupplyBase.sol.md | 2 +-
..._RuleMaxTotalSupplyInvariantStorage.sol.md | 4 +-
.../surya_report_RuleNFTAdapter.sol.md | 2 +-
.../surya_report_RuleSanctionsList.sol.md | 2 +-
.../surya_report_RuleSanctionsListBase.sol.md | 2 +-
...t_RuleSanctionsListInvariantStorage.sol.md | 4 +-
...eport_RuleSanctionsListOwnable2Step.sol.md | 2 +-
...uleSanctionsListOwnable2StepHarness.sol.md | 30 +++++++++
...a_report_RuleSharedInvariantStorage.sol.md | 26 ++++++++
.../surya_report_RuleSpenderWhitelist.sol.md | 33 ++++++++++
...rya_report_RuleSpenderWhitelistBase.sol.md | 35 ++++++++++
...eport_RuleSpenderWhitelistHarnesses.sol.md | 36 +++++++++++
...uleSpenderWhitelistInvariantStorage.sol.md | 26 ++++++++
...rt_RuleSpenderWhitelistOwnable2Step.sol.md | 32 ++++++++++
...surya_report_RuleTransferValidation.sol.md | 2 +-
.../surya_report_RuleWhitelist.sol.md | 2 +-
.../surya_report_RuleWhitelistBase.sol.md | 2 +-
...eport_RuleWhitelistInvariantStorage.sol.md | 4 +-
.../surya_report_RuleWhitelistShared.sol.md | 2 +-
.../surya_report_RuleWhitelistWrapper.sol.md | 2 +-
...rya_report_RuleWhitelistWrapperBase.sol.md | 2 +-
...RuleWhitelistWrapperHarnessInternal.sol.md | 28 ++++++++
...rt_RuleWhitelistWrapperOwnable2Step.sol.md | 2 +-
.../surya_report_SanctionListOracle.sol.md | 29 +++++++++
.../surya_report_TotalSupplyMock.sol.md | 28 ++++++++
...nditionalTransferLightInvariantStorage.sol | 1 -
119 files changed, 605 insertions(+), 106 deletions(-)
create mode 100644 doc/surya/surya_graph/surya_graph_DeploymentCoverageHarnesses.sol.png
create mode 100644 doc/surya/surya_graph/surya_graph_IdentityRegistryMock.sol.png
create mode 100644 doc/surya/surya_graph/surya_graph_MockERC20TransferFromFalse.sol.png
create mode 100644 doc/surya/surya_graph/surya_graph_MockERC20WithTransferContext.sol.png
create mode 100644 doc/surya/surya_graph/surya_graph_MockERC721WithTransferContext.sol.png
create mode 100644 doc/surya/surya_graph/surya_graph_RuleSanctionsListOwnable2StepHarness.sol.png
create mode 100644 doc/surya/surya_graph/surya_graph_RuleSharedInvariantStorage.sol.png
create mode 100644 doc/surya/surya_graph/surya_graph_RuleSpenderWhitelist.sol.png
create mode 100644 doc/surya/surya_graph/surya_graph_RuleSpenderWhitelistBase.sol.png
create mode 100644 doc/surya/surya_graph/surya_graph_RuleSpenderWhitelistHarnesses.sol.png
create mode 100644 doc/surya/surya_graph/surya_graph_RuleSpenderWhitelistInvariantStorage.sol.png
create mode 100644 doc/surya/surya_graph/surya_graph_RuleSpenderWhitelistOwnable2Step.sol.png
create mode 100644 doc/surya/surya_graph/surya_graph_RuleWhitelistWrapperHarnessInternal.sol.png
create mode 100644 doc/surya/surya_graph/surya_graph_SanctionListOracle.sol.png
create mode 100644 doc/surya/surya_graph/surya_graph_TotalSupplyMock.sol.png
create mode 100644 doc/surya/surya_inheritance/surya_inheritance_DeploymentCoverageHarnesses.sol.png
create mode 100644 doc/surya/surya_inheritance/surya_inheritance_IdentityRegistryMock.sol.png
create mode 100644 doc/surya/surya_inheritance/surya_inheritance_MockERC20TransferFromFalse.sol.png
create mode 100644 doc/surya/surya_inheritance/surya_inheritance_MockERC20WithTransferContext.sol.png
create mode 100644 doc/surya/surya_inheritance/surya_inheritance_MockERC721WithTransferContext.sol.png
create mode 100644 doc/surya/surya_inheritance/surya_inheritance_RuleSanctionsListOwnable2StepHarness.sol.png
create mode 100644 doc/surya/surya_inheritance/surya_inheritance_RuleSharedInvariantStorage.sol.png
create mode 100644 doc/surya/surya_inheritance/surya_inheritance_RuleSpenderWhitelist.sol.png
create mode 100644 doc/surya/surya_inheritance/surya_inheritance_RuleSpenderWhitelistBase.sol.png
create mode 100644 doc/surya/surya_inheritance/surya_inheritance_RuleSpenderWhitelistHarnesses.sol.png
create mode 100644 doc/surya/surya_inheritance/surya_inheritance_RuleSpenderWhitelistInvariantStorage.sol.png
create mode 100644 doc/surya/surya_inheritance/surya_inheritance_RuleSpenderWhitelistOwnable2Step.sol.png
create mode 100644 doc/surya/surya_inheritance/surya_inheritance_RuleWhitelistWrapperHarnessInternal.sol.png
create mode 100644 doc/surya/surya_inheritance/surya_inheritance_SanctionListOracle.sol.png
create mode 100644 doc/surya/surya_inheritance/surya_inheritance_TotalSupplyMock.sol.png
create mode 100644 doc/surya/surya_report/surya_report_DeploymentCoverageHarnesses.sol.md
create mode 100644 doc/surya/surya_report/surya_report_IdentityRegistryMock.sol.md
create mode 100644 doc/surya/surya_report/surya_report_MockERC20TransferFromFalse.sol.md
create mode 100644 doc/surya/surya_report/surya_report_MockERC20WithTransferContext.sol.md
create mode 100644 doc/surya/surya_report/surya_report_MockERC721WithTransferContext.sol.md
create mode 100644 doc/surya/surya_report/surya_report_RuleSanctionsListOwnable2StepHarness.sol.md
create mode 100644 doc/surya/surya_report/surya_report_RuleSharedInvariantStorage.sol.md
create mode 100644 doc/surya/surya_report/surya_report_RuleSpenderWhitelist.sol.md
create mode 100644 doc/surya/surya_report/surya_report_RuleSpenderWhitelistBase.sol.md
create mode 100644 doc/surya/surya_report/surya_report_RuleSpenderWhitelistHarnesses.sol.md
create mode 100644 doc/surya/surya_report/surya_report_RuleSpenderWhitelistInvariantStorage.sol.md
create mode 100644 doc/surya/surya_report/surya_report_RuleSpenderWhitelistOwnable2Step.sol.md
create mode 100644 doc/surya/surya_report/surya_report_RuleWhitelistWrapperHarnessInternal.sol.md
create mode 100644 doc/surya/surya_report/surya_report_SanctionListOracle.sol.md
create mode 100644 doc/surya/surya_report/surya_report_TotalSupplyMock.sol.md
diff --git a/README.md b/README.md
index 036f319..9fc1d26 100644
--- a/README.md
+++ b/README.md
@@ -437,6 +437,20 @@ An operator configures CMTAT to use `RuleWhitelist`. The issuer tries to mint to

+#### Spender whitelist
+
+This rule only checks `transferFrom` spender authorization:
+
+- Direct transfers (`transfer`) are always allowed by this rule.
+- `transferFrom` is rejected when `spender` is not listed.
+- Restriction code: `66` (`CODE_ADDRESS_SPENDER_NOT_WHITELISTED`).
+
+**Usage scenario**
+
+The operator deploys `RuleSpenderWhitelist` and sets it in the token or `RuleEngine`. Alice calls `transfer` to Bob and it passes this rule. Bob then tries `transferFrom(Alice, Bob, amount)` and it is rejected until the operator calls `addAddress(Bob)` (or whichever spender account should be authorized).
+
+
+
#### Whitelist wrapper
Allows independent whitelist groups managed by different operators.
diff --git a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/AccessControlModuleStandalone.sol.func-sort-c.html b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/AccessControlModuleStandalone.sol.func-sort-c.html
index 2ec22a1..e3e217e 100644
--- a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/AccessControlModuleStandalone.sol.func-sort-c.html
+++ b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/AccessControlModuleStandalone.sol.func-sort-c.html
@@ -4,7 +4,7 @@
- LCOV - lcov.info - /home/ryan/Pictures/dev/Rules/src/modules/AccessControlModuleStandalone.sol - functions
+ LCOV - lcov.info - ../../../src/modules/AccessControlModuleStandalone.sol - functions
@@ -19,7 +19,7 @@
-
+
|
|
diff --git a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/AccessControlModuleStandalone.sol.func.html b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/AccessControlModuleStandalone.sol.func.html
index 14ea0ee..be2519d 100644
--- a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/AccessControlModuleStandalone.sol.func.html
+++ b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/AccessControlModuleStandalone.sol.func.html
@@ -4,7 +4,7 @@
- LCOV - lcov.info - /home/ryan/Pictures/dev/Rules/src/modules/AccessControlModuleStandalone.sol - functions
+ LCOV - lcov.info - ../../../src/modules/AccessControlModuleStandalone.sol - functions
@@ -19,7 +19,7 @@
-
+
|
|
diff --git a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/AccessControlModuleStandalone.sol.gcov.html b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/AccessControlModuleStandalone.sol.gcov.html
index a786a91..a435a7b 100644
--- a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/AccessControlModuleStandalone.sol.gcov.html
+++ b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/AccessControlModuleStandalone.sol.gcov.html
@@ -4,7 +4,7 @@
- LCOV - lcov.info - /home/ryan/Pictures/dev/Rules/src/modules/AccessControlModuleStandalone.sol
+ LCOV - lcov.info - ../../../src/modules/AccessControlModuleStandalone.sol
@@ -19,7 +19,7 @@
-
+
|
|
diff --git a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/VersionModule.sol.func-sort-c.html b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/VersionModule.sol.func-sort-c.html
index 8bceb58..80489dc 100644
--- a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/VersionModule.sol.func-sort-c.html
+++ b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/VersionModule.sol.func-sort-c.html
@@ -4,7 +4,7 @@
- LCOV - lcov.info - /home/ryan/Pictures/dev/Rules/src/modules/VersionModule.sol - functions
+ LCOV - lcov.info - ../../../src/modules/VersionModule.sol - functions
@@ -19,7 +19,7 @@
-
+
|
|
diff --git a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/VersionModule.sol.func.html b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/VersionModule.sol.func.html
index 8e9e823..f548b23 100644
--- a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/VersionModule.sol.func.html
+++ b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/VersionModule.sol.func.html
@@ -4,7 +4,7 @@
- LCOV - lcov.info - /home/ryan/Pictures/dev/Rules/src/modules/VersionModule.sol - functions
+ LCOV - lcov.info - ../../../src/modules/VersionModule.sol - functions
@@ -19,7 +19,7 @@
-
+
|
|
diff --git a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/VersionModule.sol.gcov.html b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/VersionModule.sol.gcov.html
index 50ad511..ebeafe9 100644
--- a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/VersionModule.sol.gcov.html
+++ b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/VersionModule.sol.gcov.html
@@ -4,7 +4,7 @@
- LCOV - lcov.info - /home/ryan/Pictures/dev/Rules/src/modules/VersionModule.sol
+ LCOV - lcov.info - ../../../src/modules/VersionModule.sol
@@ -19,7 +19,7 @@
-
+
|
|
diff --git a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/index-sort-b.html b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/index-sort-b.html
index 6a86955..c5cb892 100644
--- a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/index-sort-b.html
+++ b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/index-sort-b.html
@@ -4,7 +4,7 @@
- LCOV - lcov.info - /home/ryan/Pictures/dev/Rules/src/modules
+ LCOV - lcov.info - ../../../src/modules
@@ -19,7 +19,7 @@
-
+
|
|
diff --git a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/index-sort-f.html b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/index-sort-f.html
index d2c4b7f..f5b2551 100644
--- a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/index-sort-f.html
+++ b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/index-sort-f.html
@@ -4,7 +4,7 @@
- LCOV - lcov.info - /home/ryan/Pictures/dev/Rules/src/modules
+ LCOV - lcov.info - ../../../src/modules
@@ -19,7 +19,7 @@
-
+
|
|
diff --git a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/index-sort-l.html b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/index-sort-l.html
index 8a6ec85..cd1b8a4 100644
--- a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/index-sort-l.html
+++ b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/index-sort-l.html
@@ -4,7 +4,7 @@
- LCOV - lcov.info - /home/ryan/Pictures/dev/Rules/src/modules
+ LCOV - lcov.info - ../../../src/modules
@@ -19,7 +19,7 @@
-
+
|
|
diff --git a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/index.html b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/index.html
index 6117c79..469987d 100644
--- a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/index.html
+++ b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/modules/index.html
@@ -4,7 +4,7 @@
- LCOV - lcov.info - /home/ryan/Pictures/dev/Rules/src/modules
+ LCOV - lcov.info - ../../../src/modules
@@ -19,7 +19,7 @@
-
+
|
|
diff --git a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/RuleConditionalTransferLight.sol.func-sort-c.html b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/RuleConditionalTransferLight.sol.func-sort-c.html
index 67c7b18..92fa7b0 100644
--- a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/RuleConditionalTransferLight.sol.func-sort-c.html
+++ b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/RuleConditionalTransferLight.sol.func-sort-c.html
@@ -4,7 +4,7 @@
- LCOV - lcov.info - /home/ryan/Pictures/dev/Rules/src/rules/operation/RuleConditionalTransferLight.sol - functions
+ LCOV - lcov.info - ../../../src/rules/operation/RuleConditionalTransferLight.sol - functions
@@ -19,7 +19,7 @@
-
+
|
|
diff --git a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/RuleConditionalTransferLight.sol.func.html b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/RuleConditionalTransferLight.sol.func.html
index 59fbabf..0ccd4a1 100644
--- a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/RuleConditionalTransferLight.sol.func.html
+++ b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/RuleConditionalTransferLight.sol.func.html
@@ -4,7 +4,7 @@
- LCOV - lcov.info - /home/ryan/Pictures/dev/Rules/src/rules/operation/RuleConditionalTransferLight.sol - functions
+ LCOV - lcov.info - ../../../src/rules/operation/RuleConditionalTransferLight.sol - functions
@@ -19,7 +19,7 @@
-
+
|
|
diff --git a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/RuleConditionalTransferLight.sol.gcov.html b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/RuleConditionalTransferLight.sol.gcov.html
index f49dbcf..9320c13 100644
--- a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/RuleConditionalTransferLight.sol.gcov.html
+++ b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/RuleConditionalTransferLight.sol.gcov.html
@@ -4,7 +4,7 @@
- LCOV - lcov.info - /home/ryan/Pictures/dev/Rules/src/rules/operation/RuleConditionalTransferLight.sol
+ LCOV - lcov.info - ../../../src/rules/operation/RuleConditionalTransferLight.sol
@@ -19,7 +19,7 @@
-
+
|
|
diff --git a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/RuleConditionalTransferLightOwnable2Step.sol.func-sort-c.html b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/RuleConditionalTransferLightOwnable2Step.sol.func-sort-c.html
index 7a7c2bf..191f539 100644
--- a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/RuleConditionalTransferLightOwnable2Step.sol.func-sort-c.html
+++ b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/RuleConditionalTransferLightOwnable2Step.sol.func-sort-c.html
@@ -4,7 +4,7 @@
- LCOV - lcov.info - /home/ryan/Pictures/dev/Rules/src/rules/operation/RuleConditionalTransferLightOwnable2Step.sol - functions
+ LCOV - lcov.info - ../../../src/rules/operation/RuleConditionalTransferLightOwnable2Step.sol - functions
@@ -19,7 +19,7 @@
-
+
|
|
diff --git a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/RuleConditionalTransferLightOwnable2Step.sol.func.html b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/RuleConditionalTransferLightOwnable2Step.sol.func.html
index bb0973f..12bc2cf 100644
--- a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/RuleConditionalTransferLightOwnable2Step.sol.func.html
+++ b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/RuleConditionalTransferLightOwnable2Step.sol.func.html
@@ -4,7 +4,7 @@
- LCOV - lcov.info - /home/ryan/Pictures/dev/Rules/src/rules/operation/RuleConditionalTransferLightOwnable2Step.sol - functions
+ LCOV - lcov.info - ../../../src/rules/operation/RuleConditionalTransferLightOwnable2Step.sol - functions
@@ -19,7 +19,7 @@
-
+
|
|
diff --git a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/RuleConditionalTransferLightOwnable2Step.sol.gcov.html b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/RuleConditionalTransferLightOwnable2Step.sol.gcov.html
index de9032f..b05073e 100644
--- a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/RuleConditionalTransferLightOwnable2Step.sol.gcov.html
+++ b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/RuleConditionalTransferLightOwnable2Step.sol.gcov.html
@@ -4,7 +4,7 @@
- LCOV - lcov.info - /home/ryan/Pictures/dev/Rules/src/rules/operation/RuleConditionalTransferLightOwnable2Step.sol
+ LCOV - lcov.info - ../../../src/rules/operation/RuleConditionalTransferLightOwnable2Step.sol
@@ -19,7 +19,7 @@
-
+
|
|
diff --git a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/abstract/RuleConditionalTransferLightBase.sol.func-sort-c.html b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/abstract/RuleConditionalTransferLightBase.sol.func-sort-c.html
index d263bae..99f53d0 100644
--- a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/abstract/RuleConditionalTransferLightBase.sol.func-sort-c.html
+++ b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/abstract/RuleConditionalTransferLightBase.sol.func-sort-c.html
@@ -4,7 +4,7 @@
- LCOV - lcov.info - /home/ryan/Pictures/dev/Rules/src/rules/operation/abstract/RuleConditionalTransferLightBase.sol - functions
+ LCOV - lcov.info - ../../../src/rules/operation/abstract/RuleConditionalTransferLightBase.sol - functions
@@ -19,7 +19,7 @@
-
+
|
|
diff --git a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/abstract/RuleConditionalTransferLightBase.sol.func.html b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/abstract/RuleConditionalTransferLightBase.sol.func.html
index aa179f3..fdf58b9 100644
--- a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/abstract/RuleConditionalTransferLightBase.sol.func.html
+++ b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/abstract/RuleConditionalTransferLightBase.sol.func.html
@@ -4,7 +4,7 @@
- LCOV - lcov.info - /home/ryan/Pictures/dev/Rules/src/rules/operation/abstract/RuleConditionalTransferLightBase.sol - functions
+ LCOV - lcov.info - ../../../src/rules/operation/abstract/RuleConditionalTransferLightBase.sol - functions
@@ -19,7 +19,7 @@
-
+
|
|
diff --git a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/abstract/RuleConditionalTransferLightBase.sol.gcov.html b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/abstract/RuleConditionalTransferLightBase.sol.gcov.html
index 4855a0f..e80e06d 100644
--- a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/abstract/RuleConditionalTransferLightBase.sol.gcov.html
+++ b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/abstract/RuleConditionalTransferLightBase.sol.gcov.html
@@ -4,7 +4,7 @@
- LCOV - lcov.info - /home/ryan/Pictures/dev/Rules/src/rules/operation/abstract/RuleConditionalTransferLightBase.sol
+ LCOV - lcov.info - ../../../src/rules/operation/abstract/RuleConditionalTransferLightBase.sol
@@ -19,7 +19,7 @@
-
+
|
|
diff --git a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/abstract/index-sort-b.html b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/abstract/index-sort-b.html
index cee77ef..ae4276f 100644
--- a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/abstract/index-sort-b.html
+++ b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/abstract/index-sort-b.html
@@ -4,7 +4,7 @@
- LCOV - lcov.info - /home/ryan/Pictures/dev/Rules/src/rules/operation/abstract
+ LCOV - lcov.info - ../../../src/rules/operation/abstract
@@ -19,7 +19,7 @@
-
+
|
|
diff --git a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/abstract/index-sort-f.html b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/abstract/index-sort-f.html
index 3ca5529..461d0f6 100644
--- a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/abstract/index-sort-f.html
+++ b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/abstract/index-sort-f.html
@@ -4,7 +4,7 @@
- LCOV - lcov.info - /home/ryan/Pictures/dev/Rules/src/rules/operation/abstract
+ LCOV - lcov.info - ../../../src/rules/operation/abstract
@@ -19,7 +19,7 @@
-
+
|
|
diff --git a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/abstract/index-sort-l.html b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/abstract/index-sort-l.html
index ad74f6a..55bb533 100644
--- a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/abstract/index-sort-l.html
+++ b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/abstract/index-sort-l.html
@@ -4,7 +4,7 @@
- LCOV - lcov.info - /home/ryan/Pictures/dev/Rules/src/rules/operation/abstract
+ LCOV - lcov.info - ../../../src/rules/operation/abstract
@@ -19,7 +19,7 @@
-
+
|
|
diff --git a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/abstract/index.html b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/abstract/index.html
index 075046f..a47f107 100644
--- a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/abstract/index.html
+++ b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/abstract/index.html
@@ -4,7 +4,7 @@
- LCOV - lcov.info - /home/ryan/Pictures/dev/Rules/src/rules/operation/abstract
+ LCOV - lcov.info - ../../../src/rules/operation/abstract
@@ -19,7 +19,7 @@
-
+
|
|
diff --git a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/index-sort-b.html b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/index-sort-b.html
index 0727bad..156b486 100644
--- a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/index-sort-b.html
+++ b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/index-sort-b.html
@@ -4,7 +4,7 @@
- LCOV - lcov.info - /home/ryan/Pictures/dev/Rules/src/rules/operation
+ LCOV - lcov.info - ../../../src/rules/operation
@@ -19,7 +19,7 @@
-
+
|
|
diff --git a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/index-sort-f.html b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/index-sort-f.html
index bba2e9c..eae3f77 100644
--- a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/index-sort-f.html
+++ b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/index-sort-f.html
@@ -4,7 +4,7 @@
- LCOV - lcov.info - /home/ryan/Pictures/dev/Rules/src/rules/operation
+ LCOV - lcov.info - ../../../src/rules/operation
@@ -19,7 +19,7 @@
-
+
|
|
diff --git a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/index-sort-l.html b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/index-sort-l.html
index 178c5f3..ec44c2c 100644
--- a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/index-sort-l.html
+++ b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/index-sort-l.html
@@ -4,7 +4,7 @@
- LCOV - lcov.info - /home/ryan/Pictures/dev/Rules/src/rules/operation
+ LCOV - lcov.info - ../../../src/rules/operation
@@ -19,7 +19,7 @@
-
+
|
|
diff --git a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/index.html b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/index.html
index 71e0554..a2a41cf 100644
--- a/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/index.html
+++ b/doc/coverage/coverage/home/ryan/Pictures/dev/Rules/src/rules/operation/index.html
@@ -4,7 +4,7 @@
- LCOV - lcov.info - /home/ryan/Pictures/dev/Rules/src/rules/operation
+ LCOV - lcov.info - ../../../src/rules/operation
@@ -19,7 +19,7 @@