diff --git a/AGENTS.md b/AGENTS.md
index 2db4e2a..a4f9878 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -1,7 +1,7 @@
# Project Guide
## Purpose
-Modular compliance-rule library for CMTAT / ERC-3643 security tokens. Each rule enforces a transfer restriction (whitelist, blacklist, sanctions, max supply, identity, conditional approval) and can be used standalone or composed via a `RuleEngine`.
+Modular compliance-rule library for CMTAT / ERC-3643 security tokens. Each rule enforces a transfer restriction (whitelist, spender whitelist, blacklist, sanctions, max supply, identity, conditional approval) and can be used standalone or composed via a `RuleEngine`.
## Key Directories
| Path | Description |
@@ -23,6 +23,7 @@ Modular compliance-rule library for CMTAT / ERC-3643 security tokens. Each rule
| `RuleSanctionsList` | Block sanctioned addresses via Chainalysis oracle |
| `RuleMaxTotalSupply` | Cap minting so total supply never exceeds a maximum |
| `RuleIdentityRegistry` | Check ERC-3643 identity registry for participant verification |
+| `RuleSpenderWhitelist` / `RuleSpenderWhitelistOwnable2Step` | Allow `transferFrom` only when spender is whitelisted; direct transfers are always allowed |
| `RuleERC2980` | ERC-2980 Swiss Compliant rule: whitelist (recipient-only) + frozenlist (blocks sender and recipient); frozenlist takes priority |
| `RuleERC2980Ownable2Step` | Ownable2Step variant of RuleERC2980 |
| `RuleConditionalTransferLight` | Require operator approval before each transfer |
@@ -57,6 +58,7 @@ Foundry config: `foundry.toml` (solc 0.8.34, EVM prague, optimizer 200 runs).
| RuleMaxTotalSupply | 50 |
| RuleIdentityRegistry | 55–57 |
| RuleERC2980 | 60–63 |
+| RuleSpenderWhitelist | 66 |
## Conventions
- Each rule has an `InvariantStorage` abstract contract holding its constants, custom errors, and events.
@@ -67,7 +69,8 @@ Foundry config: `foundry.toml` (solc 0.8.34, EVM prague, optimizer 200 runs).
- Batch add/remove operations are non-reverting (skip duplicates); single-item operations revert on invalid input.
- All `internal` functions should be marked `virtual`.
- Do not create git commits; provide commit messages only when requested.
-- Always run tests after modifying contracts.
+- Always run full tests (`forge test`) after any code modification, including lint-driven or mechanical refactors, before reporting completion.
- Use `require(condition, CustomError(...))` for custom errors; avoid direct `revert CustomError(...)`.
- `AGENTS.md` and `CLAUDE.md` are identical — always update both together.
- Always update README.md with the latest change
+- New rule or features implemented: create/update technical documentation in `doc/technical`, update README, create/update test (target: 100% of code coverage), update CHANGELOG.md. Code coverage, run `forge coverage --report summary`
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4e33147..6a0eefa 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -49,6 +49,12 @@ Commit: `TBD`
### Added
+- `RuleSpenderWhitelist` — validation rule that blocks `transferFrom` when spender is not listed; direct transfers are always allowed. Restriction code 66.
+- `RuleSpenderWhitelistOwnable2Step` — Ownable2Step variant of `RuleSpenderWhitelist`.
+- Technical documentation file `doc/technical/RuleSpenderWhitelist.md`.
+- Transfer-context mocks in `src/mocks`: `MockERC20WithTransferContext` and `MockERC721WithTransferContext`.
+- Transfer-context mocks in `src/mocks` now inherit OpenZeppelin `ERC20` / `ERC721` and emit rule callbacks through `ITransferContext`.
+- Transfer-context tests for ERC-20/ERC-721 mock integration in `test/TransferContext/TransferContextMocks.t.sol`.
- `RuleERC2980` — ERC-2980 Swiss Compliant rule combining a whitelist (recipient-only) and a frozenlist (blocks sender, recipient, and spender); frozenlist takes priority. Restriction codes 60–63.
- `RuleERC2980Ownable2Step` — Ownable2Step variant of `RuleERC2980`.
- `IERC2980` interface with NatSpec documenting the deviation from the ERC example interfaces (single-item functions revert on invalid input rather than returning `bool`).
@@ -72,6 +78,8 @@ Commit: `TBD`
- `RuleConditionalTransferLight` and `RuleMaxTotalSupply` are ERC-20 only; ERC-721/1155 compliance interfaces are limited to validation rules.
- Address list batch updates emit only add/remove events (no summary events).
- Reorganized validation contracts into `abstract/base`, `abstract/core`, `abstract/invariant`, and `deployment` folders.
+- Rule transfer-context dispatch now treats `sender == from` as direct transfer (non-spender path) in `RuleNFTAdapter`.
+- Concrete utilities and harness contracts used by tests were moved from `test/` into `src/mocks` and `src/mocks/harness`.
### Dependencies
diff --git a/CLAUDE.md b/CLAUDE.md
index 77711c0..a4f9878 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -1,7 +1,7 @@
# Project Guide
## Purpose
-Modular compliance-rule library for CMTAT / ERC-3643 security tokens. Each rule enforces a transfer restriction (whitelist, blacklist, sanctions, max supply, identity, conditional approval) and can be used standalone or composed via a `RuleEngine`.
+Modular compliance-rule library for CMTAT / ERC-3643 security tokens. Each rule enforces a transfer restriction (whitelist, spender whitelist, blacklist, sanctions, max supply, identity, conditional approval) and can be used standalone or composed via a `RuleEngine`.
## Key Directories
| Path | Description |
@@ -23,6 +23,7 @@ Modular compliance-rule library for CMTAT / ERC-3643 security tokens. Each rule
| `RuleSanctionsList` | Block sanctioned addresses via Chainalysis oracle |
| `RuleMaxTotalSupply` | Cap minting so total supply never exceeds a maximum |
| `RuleIdentityRegistry` | Check ERC-3643 identity registry for participant verification |
+| `RuleSpenderWhitelist` / `RuleSpenderWhitelistOwnable2Step` | Allow `transferFrom` only when spender is whitelisted; direct transfers are always allowed |
| `RuleERC2980` | ERC-2980 Swiss Compliant rule: whitelist (recipient-only) + frozenlist (blocks sender and recipient); frozenlist takes priority |
| `RuleERC2980Ownable2Step` | Ownable2Step variant of RuleERC2980 |
| `RuleConditionalTransferLight` | Require operator approval before each transfer |
@@ -57,16 +58,19 @@ Foundry config: `foundry.toml` (solc 0.8.34, EVM prague, optimizer 200 runs).
| RuleMaxTotalSupply | 50 |
| RuleIdentityRegistry | 55–57 |
| RuleERC2980 | 60–63 |
+| RuleSpenderWhitelist | 66 |
## Conventions
- Each rule has an `InvariantStorage` abstract contract holding its constants, custom errors, and events.
- Access control is implemented via an abstract `_authorize*()` method overridden by concrete subclasses (template method pattern).
- AccessControl variants must use `onlyRole(ROLE)` in `_authorize*()` methods (avoid direct `_checkRole`).
+- AccessControl variants treat the default admin as having all roles via `hasRole`, but the admin may not appear in role member enumerations unless explicitly granted.
- All rules implement `IERC3643Version` via `VersionModule`; the current version string is `"0.2.0"`.
- Batch add/remove operations are non-reverting (skip duplicates); single-item operations revert on invalid input.
- All `internal` functions should be marked `virtual`.
- Do not create git commits; provide commit messages only when requested.
-- Always run tests after modifying contracts.
+- Always run full tests (`forge test`) after any code modification, including lint-driven or mechanical refactors, before reporting completion.
- Use `require(condition, CustomError(...))` for custom errors; avoid direct `revert CustomError(...)`.
- `AGENTS.md` and `CLAUDE.md` are identical — always update both together.
- Always update README.md with the latest change
+- New rule or features implemented: create/update technical documentation in `doc/technical`, update README, create/update test (target: 100% of code coverage), update CHANGELOG.md. Code coverage, run `forge coverage --report summary`
diff --git a/README.md b/README.md
index 5122c55..9fc1d26 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: completed 100% coverage across `src/` contracts, including direct coverage for `RuleAddressSet.contains(address)`, mint/burn-path coverage for `RuleConditionalTransferLightBase.detectTransferRestriction(...)`, and removal of an unreachable duplicate admin-zero check in `RuleConditionalTransferLight` constructor.
+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
@@ -169,7 +169,9 @@ Here the list of codes used by the different rules
| | CODE_ADDRESS_TO_IS_FROZEN | 61 |
| | CODE_ADDRESS_SPENDER_IS_FROZEN | 62 |
| | CODE_ADDRESS_TO_NOT_WHITELISTED | 63 |
-| | Reserved slot | 64-65 |
+| | Reserved slot | 64-65 |
+| RuleSpenderWhitelist | CODE_ADDRESS_SPENDER_NOT_WHITELISTED | 66 |
+| | Reserved slot | 67-70 |
Note:
@@ -304,7 +306,7 @@ Validation rules only read blockchain state — they never modify it during a tr
All validation rules implement `IRuleEngine` to be usable both standalone (plugged directly into CMTAT) and via the RuleEngine.
-Available validation rules: `RuleWhitelist`, `RuleWhitelistWrapper`, `RuleBlacklist`, `RuleSanctionsList`, `RuleMaxTotalSupply`, `RuleIdentityRegistry`, `RuleERC2980`.
+Available validation rules: `RuleWhitelist`, `RuleWhitelistWrapper`, `RuleSpenderWhitelist`, `RuleBlacklist`, `RuleSanctionsList`, `RuleMaxTotalSupply`, `RuleIdentityRegistry`, `RuleERC2980`.
A community made project, [RuleSelf](https://github.com/rya-sge/ruleself), which uses [Self](https://self.xyz), a zero-knowledge identity is also available but is not developed or maintained by CMTA.
@@ -342,6 +344,7 @@ Several rules are available in multiple access-control variants. Use the simples
- Examples:
- Whitelist
- Whitelist Wrapper
+ - Spender Whitelist
- Blacklist
- Sanction list (Chainalysis)
- ERC-2980 (whitelist + frozenlist)
@@ -364,6 +367,7 @@ Several rules are available in multiple access-control variants. Use the simples
| RuleSanctionList | Read-Only | ✔ | ✔ | ✔ | The purpose of this contract is to use the oracle contract from [Chainalysis](https://go.chainalysis.com/chainalysis-oracle-docs.html) to forbid transfer from/to an address included in a sanctions designation (US, EU, or UN). |
| RuleMaxTotalSupply | Read-Only | ✘ | ✔ | ✔ | This rule limits minting so that the total supply never exceeds a configured maximum. |
| RuleIdentityRegistry | Read-Only | ✔ | ✔ | ✔ | This rule checks the ERC-3643 Identity Registry for transfer participants when configured. |
+| RuleSpenderWhitelist | Read-Only | ✔ | ✔ | ✔ | This rule blocks `transferFrom` when the spender is not in the whitelist. Direct transfers are always allowed. |
| RuleERC2980 | Read-Only | ✔ | ✔ | ✔ | ERC-2980 Swiss Compliant rule combining a whitelist (recipient-only) and a frozenlist (blocks both sender and recipient). Frozenlist takes priority over whitelist. |
| RuleConditionalTransferLight | Read-Write | ✘ | ✔ | ✔ | This rule requires that transfers have to be approved by an operator before being executed. Each approval is consumed once and the same transfer can be approved multiple times. |
| [RuleConditionalTransfer](https://github.com/CMTA/RuleConditionalTransfer) (external) | Read-Write | ✘ | ✔ | ✘ (experimental rule) | Full-featured approval-based transfer rule implementing Swiss law *Vinkulierung*. Supports automatic approval after three months, automatic transfer execution, and a conditional whitelist for address pairs that bypass approval. Maintained in a separate repository. |
@@ -383,6 +387,7 @@ Detailed technical documentation for each rule is available in [`doc/technical/`
| RuleSanctionsList | [RuleSanctionList.md](./doc/technical/RuleSanctionList.md) |
| RuleMaxTotalSupply | [RuleMaxTotalSupply.md](./doc/technical/RuleMaxTotalSupply.md) |
| RuleIdentityRegistry | [RuleIdentityRegistry.md](./doc/technical/RuleIdentityRegistry.md) |
+| RuleSpenderWhitelist | [RuleSpenderWhitelist.md](./doc/technical/RuleSpenderWhitelist.md) |
| RuleERC2980 | [RuleERC2980.md](./doc/technical/RuleERC2980.md) |
| RuleConditionalTransferLight | [RuleConditionalTransferLight.md](./doc/technical/RuleConditionalTransferLight.md) |
@@ -395,6 +400,7 @@ Detailed technical documentation for each rule is available in [`doc/technical/`
- `RuleMaxTotalSupply` trusts the configured `tokenContract` to return an accurate `totalSupply()`.
- `RuleMaxTotalSupply` does not allow clearing the token contract; disable the rule by removing it from the RuleEngine or token.
- `RuleWhitelistWrapper` requires child rules that implement `IAddressList`. Gas cost grows with the number of rules, and a wrapper with zero rules will reject all transfers.
+- `RuleSpenderWhitelist` only checks the spender in `transferFrom`; direct transfers always pass this rule.
- Read-only rules still implement `transferred()` to comply with ERC-3643 and RuleEngine interfaces, but they do not change state.
- `RuleConditionalTransferLight` approvals are keyed by `(from, to, value)` and are not nonce-based.
- `RuleConditionalTransferLight` provides `approveAndTransferIfAllowed` to approve and immediately execute `transferFrom` when this rule has allowance; it assumes the token calls back `transferred()` during the transfer.
@@ -409,7 +415,7 @@ Detailed technical documentation for each rule is available in [`doc/technical/`
### Read-only (validation) rule
-Currently, there are seven validation rules: whitelist, whitelistWrapper, blacklist, sanctionlist, max total supply, identity registry, and ERC-2980.
+Currently, there are eight validation rules: whitelist, whitelistWrapper, spender whitelist, blacklist, sanctionlist, max total supply, identity registry, and ERC-2980.
#### Whitelist
@@ -431,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.
@@ -1639,11 +1659,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 fb8aec0..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|CMTAT|forge-std" > slither-report.md
+slither . --checklist --filter-paths "openzeppelin-contracts|test|mocks|CMTAT|forge-std" > slither-report.md
```
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..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 ce374e8..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 0ff4430..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 @@
-
+
@@ -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..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 @@
-
+
@@ -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..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 @@
-
+
@@ -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..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 @@
-
+
@@ -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..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 @@
-
+
@@ -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..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 @@
-
+
@@ -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..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 @@
-
+
@@ -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..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 @@
-
+
@@ -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..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 a785d77..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 @@
-
+
@@ -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..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 @@
-
+
@@ -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..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 60b99de..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 b0a0b09..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 @@
-
+
@@ -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..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 bd1a0a3..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 4dc44fd..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 @@
-
+
@@ -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..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 @@
-
+
@@ -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..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 @@
-
+
@@ -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..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 @@
-
+
@@ -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..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 @@
-
+
@@ -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..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 @@
-
+
@@ -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..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 @@
-
+
@@ -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..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 @@
-
+
@@ -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..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 @@
-
+
@@ -37,7 +37,7 @@
-
+
diff --git a/doc/coverage/coverage/index-sort-b.html b/doc/coverage/coverage/index-sort-b.html
index c0fea9e..1c4e1f3 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,14 +87,14 @@
100.0 %
- 112 / 112
+ 133 / 133
100.0 %
- 68 / 68
+ 79 / 79
-
0 / 0
- /home/ryan/Pictures/dev/Rules/src/rules/operation
+ ../../../src/rules/operation
@@ -106,7 +106,7 @@
2 / 2
- /home/ryan/Pictures/dev/Rules/src/modules
+ ../../../src/modules
@@ -147,19 +147,19 @@
100.0 %
- 51 / 51
+ 52 / 52
100.0 %
19 / 19
100.0 %
14 / 14
- /home/ryan/Pictures/dev/Rules/src/rules/operation/abstract
+ ../../../src/rules/operation/abstract
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..a5d5163 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 @@
-
-
+
+
@@ -82,7 +82,7 @@
Branches
- /home/ryan/Pictures/dev/Rules/src/modules
+ ../../../src/modules
@@ -94,7 +94,7 @@
4 / 4
- /home/ryan/Pictures/dev/Rules/src/rules/operation
+ ../../../src/rules/operation
@@ -118,12 +118,12 @@
8 / 8
- /home/ryan/Pictures/dev/Rules/src/rules/operation/abstract
+ ../../../src/rules/operation/abstract
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..c3bb25f 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 @@
-
-
+
+
@@ -82,7 +82,7 @@
Branches
- /home/ryan/Pictures/dev/Rules/src/modules
+ ../../../src/modules
@@ -94,7 +94,7 @@
4 / 4
- /home/ryan/Pictures/dev/Rules/src/rules/operation
+ ../../../src/rules/operation
@@ -123,7 +123,7 @@
100.0 %
- 51 / 51
+ 52 / 52
100.0 %
19 / 19
100.0 %
@@ -142,12 +142,12 @@
8 / 8
- /home/ryan/Pictures/dev/Rules/src/rules/operation/abstract
+ ../../../src/rules/operation/abstract
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..dde6e42 100644
--- a/doc/coverage/coverage/index.html
+++ b/doc/coverage/coverage/index.html
@@ -31,17 +31,17 @@
-
-
+
+
-
+
-
-
+
+
@@ -49,8 +49,8 @@
-
-
+
+
@@ -82,7 +82,7 @@
Branches
- /home/ryan/Pictures/dev/Rules/src/modules
+ ../../../src/modules
@@ -94,7 +94,7 @@
4 / 4
- /home/ryan/Pictures/dev/Rules/src/rules/operation
+ ../../../src/rules/operation
@@ -106,12 +106,12 @@
2 / 2
- /home/ryan/Pictures/dev/Rules/src/rules/operation/abstract
+ ../../../src/rules/operation/abstract
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 f8b64c2..65fb8e6 100644
--- a/doc/coverage/lcov.info
+++ b/doc/coverage/lcov.info
@@ -1,20 +1,20 @@
TN:
SF:src/modules/AccessControlModuleStandalone.sol
-DA:24,396
+DA:24,421
FN:24,AccessControlModuleStandalone.constructor
-FNDA:396,AccessControlModuleStandalone.constructor
-DA:25,396
-BRDA:25,0,0,5
-BRDA:25,0,1,391
-DA:29,391
-DA:38,507
+FNDA:421,AccessControlModuleStandalone.constructor
+DA:25,421
+BRDA:25,0,0,6
+BRDA:25,0,1,415
+DA:29,415
+DA:38,531
FN:38,AccessControlModuleStandalone.hasRole
-FNDA:507,AccessControlModuleStandalone.hasRole
-DA:47,3597
-BRDA:47,1,0,3110
-BRDA:47,1,1,487
-DA:48,3110
-DA:50,487
+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
@@ -50,17 +50,17 @@ DA:42,1
FN:42,RuleConditionalTransferLight.destroyed
FNDA:1,RuleConditionalTransferLight.destroyed
DA:43,1
-DA:46,1947
+DA:46,1848
FN:46,RuleConditionalTransferLight._authorizeTransferApproval
-FNDA:1947,RuleConditionalTransferLight._authorizeTransferApproval
-DA:48,857
+FNDA:1848,RuleConditionalTransferLight._authorizeTransferApproval
+DA:48,770
FN:48,RuleConditionalTransferLight._authorizeTransferExecution
-FNDA:857,RuleConditionalTransferLight._authorizeTransferExecution
-DA:49,857
+FNDA:770,RuleConditionalTransferLight._authorizeTransferExecution
+DA:49,770
BRDA:49,0,0,1
-BRDA:49,0,1,856
-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
@@ -71,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
@@ -91,122 +91,126 @@ BRH:0
end_of_record
TN:
SF:src/rules/operation/abstract/RuleConditionalTransferLightBase.sol
-DA:25,1940
-FN:25,RuleConditionalTransferLightBase.approveTransfer
-FNDA:1940,RuleConditionalTransferLightBase.approveTransfer
-DA:26,1941
-DA:27,1941
-DA:28,1941
-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,856
-FN:70,RuleConditionalTransferLightBase.transferred.0
-FNDA:856,RuleConditionalTransferLightBase.transferred.0
-DA:75,854
-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,860
-FN:154,RuleConditionalTransferLightBase._transferred
-FNDA:860,RuleConditionalTransferLightBase._transferred
-DA:155,860
-BRDA:155,7,0,860
-DA:156,860
-DA:158,846
-DA:159,846
-DA:161,846
-BRDA:161,8,0,3
-BRDA:161,8,1,843
-DA:163,843
-DA:164,843
-DA:167,3063
-FN:167,RuleConditionalTransferLightBase._transferHash
-FNDA:3063,RuleConditionalTransferLightBase._transferHash
-DA:168,3063
-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
@@ -222,30 +226,30 @@ FN:63,RuleAddressSet.removeAddresses
FNDA:260,RuleAddressSet.removeAddresses
DA:64,259
DA:65,259
-DA:75,105
+DA:75,117
FN:75,RuleAddressSet.addAddress
-FNDA:105,RuleAddressSet.addAddress
-DA:76,102
+FNDA:117,RuleAddressSet.addAddress
+DA:76,112
BRDA:76,0,0,1
-BRDA:76,0,1,101
-DA:77,101
-DA:78,101
-DA:88,8
+BRDA:76,0,1,111
+DA:77,111
+DA:78,111
+DA:88,12
FN:88,RuleAddressSet.removeAddress
-FNDA:8,RuleAddressSet.removeAddress
-DA:89,5
+FNDA:12,RuleAddressSet.removeAddress
+DA:89,7
BRDA:89,1,0,1
-BRDA:89,1,1,4
-DA:90,4
-DA:91,4
+BRDA:89,1,1,6
+DA:90,6
+DA:91,6
DA:98,275
FN:98,RuleAddressSet.onlyAddressListAdd
FNDA:275,RuleAddressSet.onlyAddressListAdd
DA:99,275
-DA:103,8
+DA:103,12
FN:103,RuleAddressSet.onlyAddressListRemove
-FNDA:8,RuleAddressSet.onlyAddressListRemove
-DA:104,8
+FNDA:12,RuleAddressSet.onlyAddressListRemove
+DA:104,12
DA:116,536
FN:116,RuleAddressSet.listedAddressCount
FNDA:536,RuleAddressSet.listedAddressCount
@@ -254,28 +258,28 @@ DA:125,2
FN:125,RuleAddressSet.contains
FNDA:2,RuleAddressSet.contains
DA:126,2
-DA:134,67
+DA:134,71
FN:134,RuleAddressSet.isAddressListed
-FNDA:67,RuleAddressSet.isAddressListed
-DA:135,383
+FNDA:71,RuleAddressSet.isAddressListed
+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,882
-FN:154,RuleAddressSet._msgSender
-FNDA:882,RuleAddressSet._msgSender
-DA:155,882
-DA:159,4
-FN:159,RuleAddressSet._msgData
-FNDA:4,RuleAddressSet._msgData
-DA:160,4
-DA:164,886
-FN:164,RuleAddressSet._contextSuffixLength
-FNDA:886,RuleAddressSet._contextSuffixLength
-DA:165,886
+DA:155,929
+FN:155,RuleAddressSet._msgSender
+FNDA:929,RuleAddressSet._msgSender
+DA:156,929
+DA:160,6
+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
@@ -288,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,101
-FN:77,RuleAddressSetInternal._addAddress
-FNDA:101,RuleAddressSetInternal._addAddress
-DA:78,101
-DA:85,4
-FN:85,RuleAddressSetInternal._removeAddress
-FNDA:4,RuleAddressSetInternal._removeAddress
-DA:86,4
-DA:93,536
-FN:93,RuleAddressSetInternal._listedAddressCount
+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:83,6
+DA:90,536
+FN:90,RuleAddressSetInternal._listedAddressCount
FNDA:536,RuleAddressSetInternal._listedAddressCount
-DA:94,536
-DA:102,738
-FN:102,RuleAddressSetInternal._isAddressListed
-FNDA:738,RuleAddressSetInternal._isAddressListed
-DA:103,738
+DA:91,536
+DA:99,771
+FN:99,RuleAddressSetInternal._isAddressListed
+FNDA:771,RuleAddressSetInternal._isAddressListed
+DA:100,771
FNF:6
FNH:6
LF:18
@@ -408,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
@@ -482,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
@@ -703,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
@@ -808,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
@@ -874,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
@@ -964,50 +967,98 @@ BRF:18
BRH:18
end_of_record
TN:
+SF:src/rules/validation/abstract/base/RuleSpenderWhitelistBase.sol
+DA:19,4
+FN:19,RuleSpenderWhitelistBase._detectTransferRestriction
+FNDA:4,RuleSpenderWhitelistBase._detectTransferRestriction
+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:37,2
+DA:40,2
+FN:40,RuleSpenderWhitelistBase.messageForTransferRestriction
+FNDA:2,RuleSpenderWhitelistBase.messageForTransferRestriction
+DA:46,2
+BRDA:46,1,0,1
+DA:47,1
+DA:49,1
+DA:55,1
+FN:55,RuleSpenderWhitelistBase.transferred.0
+FNDA:1,RuleSpenderWhitelistBase.transferred.0
+DA:57,2
+FN:57,RuleSpenderWhitelistBase.transferred.1
+FNDA:2,RuleSpenderWhitelistBase.transferred.1
+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
+LH:19
+BRF:4
+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
@@ -1017,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
@@ -1068,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
@@ -1135,46 +1186,46 @@ BRH:14
end_of_record
TN:
SF:src/rules/validation/abstract/core/RuleNFTAdapter.sol
-DA:40,16
-FN:40,RuleNFTAdapter.detectTransferRestriction
-FNDA:16,RuleNFTAdapter.detectTransferRestriction
-DA:47,16
-DA:53,12
-FN:53,RuleNFTAdapter.detectTransferRestrictionFrom
-FNDA:12,RuleNFTAdapter.detectTransferRestrictionFrom
-DA:60,12
-DA:66,14
-FN:66,RuleNFTAdapter.canTransfer
-FNDA:14,RuleNFTAdapter.canTransfer
-DA:72,14
-DA:78,10
-FN:78,RuleNFTAdapter.canTransferFrom
-FNDA:10,RuleNFTAdapter.canTransferFrom
-DA:85,10
-DA:92,13
-FN:92,RuleNFTAdapter.transferred.0
-FNDA:13,RuleNFTAdapter.transferred.0
-DA:97,13
-DA:103,8
-FN:103,RuleNFTAdapter.transferred.1
-FNDA:8,RuleNFTAdapter.transferred.1
-DA:108,8
-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:39,17
+FN:39,RuleNFTAdapter.detectTransferRestriction
+FNDA:17,RuleNFTAdapter.detectTransferRestriction
+DA:52,17
+DA:58,13
+FN:58,RuleNFTAdapter.detectTransferRestrictionFrom
+FNDA:13,RuleNFTAdapter.detectTransferRestrictionFrom
+DA:66,13
+DA:72,15
+FN:72,RuleNFTAdapter.canTransfer
+FNDA:15,RuleNFTAdapter.canTransfer
+DA:84,15
+DA:90,11
+FN:90,RuleNFTAdapter.canTransferFrom
+FNDA:11,RuleNFTAdapter.canTransferFrom
+DA:104,11
+DA:111,14
+FN:111,RuleNFTAdapter.transferred.0
+FNDA:14,RuleNFTAdapter.transferred.0
+DA:122,14
+DA:128,9
+FN:128,RuleNFTAdapter.transferred.1
+FNDA:9,RuleNFTAdapter.transferred.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
@@ -1184,26 +1235,26 @@ BRH:4
end_of_record
TN:
SF:src/rules/validation/abstract/core/RuleTransferValidation.sol
-DA:46,348
-FN:46,RuleTransferValidation.detectTransferRestriction
-FNDA:348,RuleTransferValidation.detectTransferRestriction
-DA:53,348
-DA:59,36
-FN:59,RuleTransferValidation.detectTransferRestrictionFrom
-FNDA:36,RuleTransferValidation.detectTransferRestrictionFrom
-DA:66,36
-DA:77,20
-FN:77,RuleTransferValidation.canTransfer
-FNDA:20,RuleTransferValidation.canTransfer
-DA:83,20
-DA:89,12
-FN:89,RuleTransferValidation.canTransferFrom
-FNDA:12,RuleTransferValidation.canTransferFrom
-DA:96,12
-DA:100,195
-FN:100,RuleTransferValidation.supportsInterface
-FNDA:195,RuleTransferValidation.supportsInterface
-DA:101,195
+DA:52,349
+FN:52,RuleTransferValidation.detectTransferRestriction
+FNDA:349,RuleTransferValidation.detectTransferRestriction
+DA:59,349
+DA:65,38
+FN:65,RuleTransferValidation.detectTransferRestrictionFrom
+FNDA:38,RuleTransferValidation.detectTransferRestrictionFrom
+DA:72,38
+DA:83,21
+FN:83,RuleTransferValidation.canTransfer
+FNDA:21,RuleTransferValidation.canTransfer
+DA:89,21
+DA:95,14
+FN:95,RuleTransferValidation.canTransferFrom
+FNDA:14,RuleTransferValidation.canTransferFrom
+DA:102,14
+DA:106,196
+FN:106,RuleTransferValidation.supportsInterface
+FNDA:196,RuleTransferValidation.supportsInterface
+DA:107,196
FNF:5
FNH:5
LF:10
@@ -1218,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
@@ -1269,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
@@ -1360,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
@@ -1503,36 +1556,96 @@ BRF:0
BRH:0
end_of_record
TN:
+SF:src/rules/validation/deployment/RuleSpenderWhitelist.sol
+DA:21,2
+FN:21,RuleSpenderWhitelist.supportsInterface
+FNDA:2,RuleSpenderWhitelist.supportsInterface
+DA:28,2
+DA:29,1
+DA:32,6
+FN:32,RuleSpenderWhitelist._authorizeAddressListAdd
+FNDA:6,RuleSpenderWhitelist._authorizeAddressListAdd
+DA:34,2
+FN:34,RuleSpenderWhitelist._authorizeAddressListRemove
+FNDA:2,RuleSpenderWhitelist._authorizeAddressListRemove
+DA:36,31
+FN:36,RuleSpenderWhitelist._msgSender
+FNDA:31,RuleSpenderWhitelist._msgSender
+DA:37,31
+DA:40,1
+FN:40,RuleSpenderWhitelist._msgData
+FNDA:1,RuleSpenderWhitelist._msgData
+DA:41,1
+DA:44,33
+FN:44,RuleSpenderWhitelist._contextSuffixLength
+FNDA:33,RuleSpenderWhitelist._contextSuffixLength
+DA:45,33
+FNF:6
+FNH:6
+LF:11
+LH:11
+BRF:0
+BRH:0
+end_of_record
+TN:
+SF:src/rules/validation/deployment/RuleSpenderWhitelistOwnable2Step.sol
+DA:20,2
+FN:20,RuleSpenderWhitelistOwnable2Step._authorizeAddressListAdd
+FNDA:2,RuleSpenderWhitelistOwnable2Step._authorizeAddressListAdd
+DA:22,2
+FN:22,RuleSpenderWhitelistOwnable2Step._authorizeAddressListRemove
+FNDA:2,RuleSpenderWhitelistOwnable2Step._authorizeAddressListRemove
+DA:24,10
+FN:24,RuleSpenderWhitelistOwnable2Step._msgSender
+FNDA:10,RuleSpenderWhitelistOwnable2Step._msgSender
+DA:25,10
+DA:28,1
+FN:28,RuleSpenderWhitelistOwnable2Step._msgData
+FNDA:1,RuleSpenderWhitelistOwnable2Step._msgData
+DA:29,1
+DA:32,12
+FN:32,RuleSpenderWhitelistOwnable2Step._contextSuffixLength
+FNDA:12,RuleSpenderWhitelistOwnable2Step._contextSuffixLength
+DA:33,12
+FNF:5
+FNH:5
+LF:8
+LH:8
+BRF:0
+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
@@ -1568,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
@@ -1629,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
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 af68938..5f2080a 100644
--- a/doc/security/audits/tools/v0.2.0/aderyn-report.md
+++ b/doc/security/audits/tools/v0.2.0/aderyn-report.md
@@ -25,8 +25,8 @@ This report was generated by [Aderyn](https://github.com/Cyfrin/aderyn), a stati
| Key | Value |
| --- | --- |
-| .sol Files | 48 |
-| Total nSLOC | 2064 |
+| .sol Files | 53 |
+| Total nSLOC | 2197 |
## Files Details
@@ -35,53 +35,58 @@ This report was generated by [Aderyn](https://github.com/Cyfrin/aderyn), a stati
| --- | --- |
| src/modules/AccessControlModuleStandalone.sol | 24 |
| src/modules/MetaTxModuleStandalone.sol | 6 |
+| src/modules/VersionModule.sol | 8 |
| src/rules/interfaces/IAddressList.sol | 15 |
| src/rules/interfaces/IERC2980.sol | 5 |
-| src/rules/interfaces/IERC7943NonFungibleCompliance.sol | 22 |
+| src/rules/interfaces/IERC7943NonFungibleCompliance.sol | 19 |
| src/rules/interfaces/IIdentityRegistry.sol | 7 |
| src/rules/interfaces/ISanctionsList.sol | 4 |
| src/rules/interfaces/ITotalSupply.sol | 4 |
-| src/rules/interfaces/ITransferContext.sol | 23 |
-| src/rules/operation/RuleConditionalTransferLight.sol | 37 |
-| src/rules/operation/RuleConditionalTransferLightOwnable2Step.sol | 19 |
-| src/rules/operation/abstract/RuleConditionalTransferLightBase.sol | 137 |
+| src/rules/interfaces/ITransferContext.sol | 22 |
+| 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 | 18 |
| src/rules/validation/abstract/RuleAddressSet/RuleAddressSet.sol | 66 |
-| src/rules/validation/abstract/RuleAddressSet/RuleAddressSetInternal.sol | 42 |
+| src/rules/validation/abstract/RuleAddressSet/RuleAddressSetInternal.sol | 39 |
| src/rules/validation/abstract/RuleAddressSet/invariantStorage/RuleAddressSetInvariantStorage.sol | 7 |
-| src/rules/validation/abstract/RuleAddressSet/invariantStorage/RuleBlacklistInvariantStorage.sol | 12 |
-| src/rules/validation/abstract/RuleAddressSet/invariantStorage/RuleWhitelistInvariantStorage.sol | 13 |
+| src/rules/validation/abstract/RuleAddressSet/invariantStorage/RuleBlacklistInvariantStorage.sol | 14 |
+| src/rules/validation/abstract/RuleAddressSet/invariantStorage/RuleWhitelistInvariantStorage.sol | 15 |
| src/rules/validation/abstract/RuleERC2980/RuleERC2980Internal.sol | 79 |
| src/rules/validation/abstract/RuleERC2980/invariantStorage/RuleERC2980InvariantStorage.sol | 30 |
-| src/rules/validation/abstract/base/RuleBlacklistBase.sol | 101 |
-| src/rules/validation/abstract/base/RuleERC2980Base.sol | 223 |
-| src/rules/validation/abstract/base/RuleIdentityRegistryBase.sol | 118 |
-| src/rules/validation/abstract/base/RuleMaxTotalSupplyBase.sol | 94 |
-| src/rules/validation/abstract/base/RuleSanctionsListBase.sol | 117 |
-| src/rules/validation/abstract/base/RuleWhitelistBase.sol | 61 |
-| src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol | 152 |
-| src/rules/validation/abstract/core/RuleNFTAdapter.sol | 86 |
-| src/rules/validation/abstract/core/RuleTransferValidation.sol | 57 |
-| src/rules/validation/abstract/core/RuleWhitelistShared.sol | 53 |
-| src/rules/validation/abstract/invariant/RuleCommonInvariantStorage.sol | 4 |
-| src/rules/validation/abstract/invariant/RuleIdentityRegistryInvariantStorage.sol | 21 |
-| src/rules/validation/abstract/invariant/RuleMaxTotalSupplyInvariantStorage.sol | 18 |
-| src/rules/validation/abstract/invariant/RuleSanctionsListInvariantStorage.sol | 16 |
-| src/rules/validation/deployment/RuleBlacklist.sol | 32 |
-| src/rules/validation/deployment/RuleBlacklistOwnable2Step.sol | 23 |
+| src/rules/validation/abstract/base/RuleBlacklistBase.sol | 100 |
+| src/rules/validation/abstract/base/RuleERC2980Base.sol | 215 |
+| src/rules/validation/abstract/base/RuleIdentityRegistryBase.sol | 109 |
+| src/rules/validation/abstract/base/RuleMaxTotalSupplyBase.sol | 90 |
+| src/rules/validation/abstract/base/RuleSanctionsListBase.sol | 108 |
+| src/rules/validation/abstract/base/RuleSpenderWhitelistBase.sol | 52 |
+| src/rules/validation/abstract/base/RuleWhitelistBase.sol | 64 |
+| src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol | 147 |
+| 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/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 |
| src/rules/validation/deployment/RuleERC2980.sol | 33 |
-| src/rules/validation/deployment/RuleERC2980Ownable2Step.sol | 24 |
+| src/rules/validation/deployment/RuleERC2980Ownable2Step.sol | 21 |
| src/rules/validation/deployment/RuleIdentityRegistry.sol | 22 |
| src/rules/validation/deployment/RuleIdentityRegistryOwnable2Step.sol | 8 |
| src/rules/validation/deployment/RuleMaxTotalSupply.sol | 22 |
| src/rules/validation/deployment/RuleMaxTotalSupplyOwnable2Step.sol | 11 |
| src/rules/validation/deployment/RuleSanctionsList.sol | 34 |
| src/rules/validation/deployment/RuleSanctionsListOwnable2Step.sol | 23 |
-| src/rules/validation/deployment/RuleWhitelist.sol | 34 |
+| src/rules/validation/deployment/RuleSpenderWhitelist.sol | 34 |
+| src/rules/validation/deployment/RuleSpenderWhitelistOwnable2Step.sol | 23 |
+| src/rules/validation/deployment/RuleWhitelist.sol | 35 |
| src/rules/validation/deployment/RuleWhitelistOwnable2Step.sol | 24 |
-| src/rules/validation/deployment/RuleWhitelistWrapper.sol | 61 |
-| src/rules/validation/deployment/RuleWhitelistWrapperOwnable2Step.sol | 22 |
-| **Total** | **2064** |
+| src/rules/validation/deployment/RuleWhitelistWrapper.sol | 64 |
+| src/rules/validation/deployment/RuleWhitelistWrapperOwnable2Step.sol | 28 |
+| **Total** | **2197** |
## Issue Summary
@@ -98,7 +103,7 @@ This report was generated by [Aderyn](https://github.com/Cyfrin/aderyn), a stati
Contracts have owners with privileged rights to perform admin tasks and need to be trusted to not perform malicious updates or drain funds.
-41 Found Instances
+46 Found Instances
- Found in src/modules/AccessControlModuleStandalone.sol [Line: 10](src/modules/AccessControlModuleStandalone.sol#L10)
@@ -107,43 +112,43 @@ Contracts have owners with privileged rights to perform admin tasks and need to
abstract contract AccessControlModuleStandalone is AccessControlEnumerable {
```
-- Found in src/rules/operation/RuleConditionalTransferLight.sol [Line: 45](src/rules/operation/RuleConditionalTransferLight.sol#L45)
+- Found in src/rules/operation/RuleConditionalTransferLight.sol [Line: 46](src/rules/operation/RuleConditionalTransferLight.sol#L46)
```solidity
function _authorizeTransferApproval() internal view virtual override onlyRole(OPERATOR_ROLE) {}
```
-- Found in src/rules/operation/RuleConditionalTransferLight.sol [Line: 54](src/rules/operation/RuleConditionalTransferLight.sol#L54)
+- Found in src/rules/operation/RuleConditionalTransferLight.sol [Line: 52](src/rules/operation/RuleConditionalTransferLight.sol#L52)
```solidity
function _onlyComplianceManager() internal virtual override onlyRole(COMPLIANCE_MANAGER_ROLE) {}
```
-- Found in src/rules/operation/RuleConditionalTransferLightOwnable2Step.sol [Line: 17](src/rules/operation/RuleConditionalTransferLightOwnable2Step.sol#L17)
+- Found in src/rules/operation/RuleConditionalTransferLightOwnable2Step.sol [Line: 15](src/rules/operation/RuleConditionalTransferLightOwnable2Step.sol#L15)
```solidity
- Ownable2Step
+ contract RuleConditionalTransferLightOwnable2Step is RuleConditionalTransferLightBase, Ownable2Step {
```
-- Found in src/rules/operation/RuleConditionalTransferLightOwnable2Step.sol [Line: 26](src/rules/operation/RuleConditionalTransferLightOwnable2Step.sol#L26)
+- Found in src/rules/operation/RuleConditionalTransferLightOwnable2Step.sol [Line: 23](src/rules/operation/RuleConditionalTransferLightOwnable2Step.sol#L23)
```solidity
function _authorizeTransferApproval() internal view virtual override onlyOwner {}
```
-- Found in src/rules/operation/RuleConditionalTransferLightOwnable2Step.sol [Line: 28](src/rules/operation/RuleConditionalTransferLightOwnable2Step.sol#L28)
+- Found in src/rules/operation/RuleConditionalTransferLightOwnable2Step.sol [Line: 25](src/rules/operation/RuleConditionalTransferLightOwnable2Step.sol#L25)
```solidity
function _authorizeTransferExecution() internal view virtual override onlyOwner {}
```
-- Found in src/rules/validation/deployment/RuleBlacklist.sol [Line: 38](src/rules/validation/deployment/RuleBlacklist.sol#L38)
+- Found in src/rules/validation/deployment/RuleBlacklist.sol [Line: 39](src/rules/validation/deployment/RuleBlacklist.sol#L39)
```solidity
function _authorizeAddressListAdd() internal view virtual override onlyRole(ADDRESS_LIST_ADD_ROLE) {}
```
-- Found in src/rules/validation/deployment/RuleBlacklist.sol [Line: 40](src/rules/validation/deployment/RuleBlacklist.sol#L40)
+- Found in src/rules/validation/deployment/RuleBlacklist.sol [Line: 41](src/rules/validation/deployment/RuleBlacklist.sol#L41)
```solidity
function _authorizeAddressListRemove() internal view virtual override onlyRole(ADDRESS_LIST_REMOVE_ROLE) {}
@@ -155,13 +160,13 @@ Contracts have owners with privileged rights to perform admin tasks and need to
contract RuleBlacklistOwnable2Step is RuleBlacklistBase, Ownable2Step {
```
-- Found in src/rules/validation/deployment/RuleBlacklistOwnable2Step.sol [Line: 20](src/rules/validation/deployment/RuleBlacklistOwnable2Step.sol#L20)
+- Found in src/rules/validation/deployment/RuleBlacklistOwnable2Step.sol [Line: 17](src/rules/validation/deployment/RuleBlacklistOwnable2Step.sol#L17)
```solidity
function _authorizeAddressListAdd() internal view virtual override onlyOwner {}
```
-- Found in src/rules/validation/deployment/RuleBlacklistOwnable2Step.sol [Line: 22](src/rules/validation/deployment/RuleBlacklistOwnable2Step.sol#L22)
+- Found in src/rules/validation/deployment/RuleBlacklistOwnable2Step.sol [Line: 19](src/rules/validation/deployment/RuleBlacklistOwnable2Step.sol#L19)
```solidity
function _authorizeAddressListRemove() internal view virtual override onlyOwner {}
@@ -197,25 +202,25 @@ Contracts have owners with privileged rights to perform admin tasks and need to
contract RuleERC2980Ownable2Step is RuleERC2980Base, Ownable2Step {
```
-- Found in src/rules/validation/deployment/RuleERC2980Ownable2Step.sol [Line: 20](src/rules/validation/deployment/RuleERC2980Ownable2Step.sol#L20)
+- Found in src/rules/validation/deployment/RuleERC2980Ownable2Step.sol [Line: 17](src/rules/validation/deployment/RuleERC2980Ownable2Step.sol#L17)
```solidity
function _authorizeWhitelistAdd() internal view virtual override onlyOwner {}
```
-- Found in src/rules/validation/deployment/RuleERC2980Ownable2Step.sol [Line: 22](src/rules/validation/deployment/RuleERC2980Ownable2Step.sol#L22)
+- Found in src/rules/validation/deployment/RuleERC2980Ownable2Step.sol [Line: 19](src/rules/validation/deployment/RuleERC2980Ownable2Step.sol#L19)
```solidity
function _authorizeWhitelistRemove() internal view virtual override onlyOwner {}
```
-- Found in src/rules/validation/deployment/RuleERC2980Ownable2Step.sol [Line: 24](src/rules/validation/deployment/RuleERC2980Ownable2Step.sol#L24)
+- Found in src/rules/validation/deployment/RuleERC2980Ownable2Step.sol [Line: 21](src/rules/validation/deployment/RuleERC2980Ownable2Step.sol#L21)
```solidity
function _authorizeFrozenlistAdd() internal view virtual override onlyOwner {}
```
-- Found in src/rules/validation/deployment/RuleERC2980Ownable2Step.sol [Line: 26](src/rules/validation/deployment/RuleERC2980Ownable2Step.sol#L26)
+- Found in src/rules/validation/deployment/RuleERC2980Ownable2Step.sol [Line: 23](src/rules/validation/deployment/RuleERC2980Ownable2Step.sol#L23)
```solidity
function _authorizeFrozenlistRemove() internal view virtual override onlyOwner {}
@@ -275,20 +280,50 @@ Contracts have owners with privileged rights to perform admin tasks and need to
function _authorizeSanctionListManager() internal view virtual override onlyOwner {}
```
-- Found in src/rules/validation/deployment/RuleWhitelist.sol [Line: 56](src/rules/validation/deployment/RuleWhitelist.sol#L56)
+- Found in src/rules/validation/deployment/RuleSpenderWhitelist.sol [Line: 32](src/rules/validation/deployment/RuleSpenderWhitelist.sol#L32)
```solidity
- function _authorizeCheckSpenderManager() internal view virtual override onlyRole(DEFAULT_ADMIN_ROLE) {}
+ function _authorizeAddressListAdd() internal view virtual override onlyRole(ADDRESS_LIST_ADD_ROLE) {}
+ ```
+
+- Found in src/rules/validation/deployment/RuleSpenderWhitelist.sol [Line: 34](src/rules/validation/deployment/RuleSpenderWhitelist.sol#L34)
+
+ ```solidity
+ function _authorizeAddressListRemove() internal view virtual override onlyRole(ADDRESS_LIST_REMOVE_ROLE) {}
+ ```
+
+- Found in src/rules/validation/deployment/RuleSpenderWhitelistOwnable2Step.sol [Line: 14](src/rules/validation/deployment/RuleSpenderWhitelistOwnable2Step.sol#L14)
+
+ ```solidity
+ contract RuleSpenderWhitelistOwnable2Step is RuleSpenderWhitelistBase, Ownable2Step {
+ ```
+
+- Found in src/rules/validation/deployment/RuleSpenderWhitelistOwnable2Step.sol [Line: 20](src/rules/validation/deployment/RuleSpenderWhitelistOwnable2Step.sol#L20)
+
+ ```solidity
+ function _authorizeAddressListAdd() internal view virtual override onlyOwner {}
+ ```
+
+- Found in src/rules/validation/deployment/RuleSpenderWhitelistOwnable2Step.sol [Line: 22](src/rules/validation/deployment/RuleSpenderWhitelistOwnable2Step.sol#L22)
+
+ ```solidity
+ function _authorizeAddressListRemove() internal view virtual override onlyOwner {}
```
- Found in src/rules/validation/deployment/RuleWhitelist.sol [Line: 58](src/rules/validation/deployment/RuleWhitelist.sol#L58)
```solidity
- function _authorizeAddressListAdd() internal view virtual override onlyRole(ADDRESS_LIST_ADD_ROLE) {}
+ function _authorizeCheckSpenderManager() internal view virtual override onlyRole(DEFAULT_ADMIN_ROLE) {}
```
- Found in src/rules/validation/deployment/RuleWhitelist.sol [Line: 60](src/rules/validation/deployment/RuleWhitelist.sol#L60)
+ ```solidity
+ function _authorizeAddressListAdd() internal view virtual override onlyRole(ADDRESS_LIST_ADD_ROLE) {}
+ ```
+
+- Found in src/rules/validation/deployment/RuleWhitelist.sol [Line: 62](src/rules/validation/deployment/RuleWhitelist.sol#L62)
+
```solidity
function _authorizeAddressListRemove() internal view virtual override onlyRole(ADDRESS_LIST_REMOVE_ROLE) {}
```
@@ -317,13 +352,13 @@ Contracts have owners with privileged rights to perform admin tasks and need to
function _authorizeCheckSpenderManager() internal view virtual override onlyOwner {}
```
-- Found in src/rules/validation/deployment/RuleWhitelistWrapper.sol [Line: 47](src/rules/validation/deployment/RuleWhitelistWrapper.sol#L47)
+- Found in src/rules/validation/deployment/RuleWhitelistWrapper.sol [Line: 44](src/rules/validation/deployment/RuleWhitelistWrapper.sol#L44)
```solidity
function _authorizeCheckSpenderManager() internal virtual override onlyRole(DEFAULT_ADMIN_ROLE) {}
```
-- Found in src/rules/validation/deployment/RuleWhitelistWrapper.sol [Line: 52](src/rules/validation/deployment/RuleWhitelistWrapper.sol#L52)
+- Found in src/rules/validation/deployment/RuleWhitelistWrapper.sol [Line: 49](src/rules/validation/deployment/RuleWhitelistWrapper.sol#L49)
```solidity
function _onlyRulesManager() internal virtual override onlyRole(RULES_MANAGEMENT_ROLE) {}
@@ -372,7 +407,7 @@ ERC20 functions may not behave as expected. For example: return values are not a
Consider using a specific version of Solidity in your contracts instead of a wide version. For example, instead of `pragma solidity ^0.8.0;`, use `pragma solidity 0.8.0;`
-48 Found Instances
+53 Found Instances
- Found in src/modules/AccessControlModuleStandalone.sol [Line: 3](src/modules/AccessControlModuleStandalone.sol#L3)
@@ -387,10 +422,16 @@ Consider using a specific version of Solidity in your contracts instead of a wid
pragma solidity ^0.8.20;
```
+- Found in src/modules/VersionModule.sol [Line: 2](src/modules/VersionModule.sol#L2)
+
+ ```solidity
+ pragma solidity ^0.8.20;
+ ```
+
- Found in src/rules/interfaces/IAddressList.sol [Line: 2](src/rules/interfaces/IAddressList.sol#L2)
```solidity
- pragma solidity ^0.8.0;
+ pragma solidity ^0.8.20;
```
- Found in src/rules/interfaces/IERC2980.sol [Line: 2](src/rules/interfaces/IERC2980.sol#L2)
@@ -525,6 +566,12 @@ 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/base/RuleSpenderWhitelistBase.sol [Line: 2](src/rules/validation/abstract/base/RuleSpenderWhitelistBase.sol#L2)
+
+ ```solidity
+ pragma solidity ^0.8.20;
+ ```
+
- Found in src/rules/validation/abstract/base/RuleWhitelistBase.sol [Line: 2](src/rules/validation/abstract/base/RuleWhitelistBase.sol#L2)
```solidity
@@ -555,25 +602,31 @@ 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;
+ ```
+
+- Found in src/rules/validation/abstract/invariant/RuleSpenderWhitelistInvariantStorage.sol [Line: 2](src/rules/validation/abstract/invariant/RuleSpenderWhitelistInvariantStorage.sol#L2)
```solidity
pragma solidity ^0.8.20;
@@ -639,6 +692,18 @@ Consider using a specific version of Solidity in your contracts instead of a wid
pragma solidity ^0.8.20;
```
+- Found in src/rules/validation/deployment/RuleSpenderWhitelist.sol [Line: 2](src/rules/validation/deployment/RuleSpenderWhitelist.sol#L2)
+
+ ```solidity
+ pragma solidity ^0.8.20;
+ ```
+
+- Found in src/rules/validation/deployment/RuleSpenderWhitelistOwnable2Step.sol [Line: 2](src/rules/validation/deployment/RuleSpenderWhitelistOwnable2Step.sol#L2)
+
+ ```solidity
+ pragma solidity ^0.8.20;
+ ```
+
- Found in src/rules/validation/deployment/RuleWhitelist.sol [Line: 2](src/rules/validation/deployment/RuleWhitelist.sol#L2)
```solidity
@@ -674,7 +739,7 @@ Check for `address(0)` when assigning values to address state variables.
1 Found Instances
-- Found in src/rules/validation/abstract/base/RuleSanctionsListBase.sol [Line: 128](src/rules/validation/abstract/base/RuleSanctionsListBase.sol#L128)
+- Found in src/rules/validation/abstract/base/RuleSanctionsListBase.sol [Line: 119](src/rules/validation/abstract/base/RuleSanctionsListBase.sol#L119)
```solidity
sanctionsList = sanctionContractOracle_;
@@ -688,7 +753,7 @@ Check for `address(0)` when assigning values to address state variables.
Solc compiler version 0.8.20 switches the default target EVM version to Shanghai, which means that the generated bytecode will include PUSH0 opcodes. Be sure to select the appropriate EVM version in case you intend to deploy on a chain other than mainnet like L2 chains that may not support PUSH0, otherwise deployment of your contracts will fail.
-48 Found Instances
+53 Found Instances
- Found in src/modules/AccessControlModuleStandalone.sol [Line: 3](src/modules/AccessControlModuleStandalone.sol#L3)
@@ -703,10 +768,16 @@ Solc compiler version 0.8.20 switches the default target EVM version to Shanghai
pragma solidity ^0.8.20;
```
+- Found in src/modules/VersionModule.sol [Line: 2](src/modules/VersionModule.sol#L2)
+
+ ```solidity
+ pragma solidity ^0.8.20;
+ ```
+
- Found in src/rules/interfaces/IAddressList.sol [Line: 2](src/rules/interfaces/IAddressList.sol#L2)
```solidity
- pragma solidity ^0.8.0;
+ pragma solidity ^0.8.20;
```
- Found in src/rules/interfaces/IERC2980.sol [Line: 2](src/rules/interfaces/IERC2980.sol#L2)
@@ -841,6 +912,12 @@ 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/base/RuleSpenderWhitelistBase.sol [Line: 2](src/rules/validation/abstract/base/RuleSpenderWhitelistBase.sol#L2)
+
+ ```solidity
+ pragma solidity ^0.8.20;
+ ```
+
- Found in src/rules/validation/abstract/base/RuleWhitelistBase.sol [Line: 2](src/rules/validation/abstract/base/RuleWhitelistBase.sol#L2)
```solidity
@@ -871,25 +948,31 @@ 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;
+ ```
+
+- Found in src/rules/validation/abstract/invariant/RuleSpenderWhitelistInvariantStorage.sol [Line: 2](src/rules/validation/abstract/invariant/RuleSpenderWhitelistInvariantStorage.sol#L2)
```solidity
pragma solidity ^0.8.20;
@@ -955,6 +1038,18 @@ Solc compiler version 0.8.20 switches the default target EVM version to Shanghai
pragma solidity ^0.8.20;
```
+- Found in src/rules/validation/deployment/RuleSpenderWhitelist.sol [Line: 2](src/rules/validation/deployment/RuleSpenderWhitelist.sol#L2)
+
+ ```solidity
+ pragma solidity ^0.8.20;
+ ```
+
+- Found in src/rules/validation/deployment/RuleSpenderWhitelistOwnable2Step.sol [Line: 2](src/rules/validation/deployment/RuleSpenderWhitelistOwnable2Step.sol#L2)
+
+ ```solidity
+ pragma solidity ^0.8.20;
+ ```
+
- Found in src/rules/validation/deployment/RuleWhitelist.sol [Line: 2](src/rules/validation/deployment/RuleWhitelist.sol#L2)
```solidity
@@ -990,13 +1085,13 @@ Consider removing the modifier or inlining the logic into the calling function.
2 Found Instances
-- Found in src/rules/validation/abstract/base/RuleWhitelistBase.sol [Line: 75](src/rules/validation/abstract/base/RuleWhitelistBase.sol#L75)
+- Found in src/rules/validation/abstract/base/RuleWhitelistBase.sol [Line: 77](src/rules/validation/abstract/base/RuleWhitelistBase.sol#L77)
```solidity
modifier onlyCheckSpenderManager() {
```
-- Found in src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol [Line: 216](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L216)
+- Found in src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol [Line: 210](src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol#L210)
```solidity
modifier onlyCheckSpenderManager() {
@@ -1010,64 +1105,64 @@ Consider removing the modifier or inlining the logic into the calling function.
Consider removing empty blocks.
-34 Found Instances
+38 Found Instances
-- Found in src/rules/operation/RuleConditionalTransferLight.sol [Line: 41](src/rules/operation/RuleConditionalTransferLight.sol#L41)
+- Found in src/rules/operation/RuleConditionalTransferLight.sol [Line: 46](src/rules/operation/RuleConditionalTransferLight.sol#L46)
```solidity
- function created(address /* to */, uint256 /* value */) external onlyBoundToken {}
+ function _authorizeTransferApproval() internal view virtual override onlyRole(OPERATOR_ROLE) {}
```
-- Found in src/rules/operation/RuleConditionalTransferLight.sol [Line: 43](src/rules/operation/RuleConditionalTransferLight.sol#L43)
+- Found in src/rules/operation/RuleConditionalTransferLight.sol [Line: 52](src/rules/operation/RuleConditionalTransferLight.sol#L52)
```solidity
- function destroyed(address /* from */, uint256 /* value */) external onlyBoundToken {}
+ function _onlyComplianceManager() internal virtual override onlyRole(COMPLIANCE_MANAGER_ROLE) {}
```
-- Found in src/rules/operation/RuleConditionalTransferLight.sol [Line: 45](src/rules/operation/RuleConditionalTransferLight.sol#L45)
+- Found in src/rules/operation/RuleConditionalTransferLightOwnable2Step.sol [Line: 23](src/rules/operation/RuleConditionalTransferLightOwnable2Step.sol#L23)
```solidity
- function _authorizeTransferApproval() internal view virtual override onlyRole(OPERATOR_ROLE) {}
+ function _authorizeTransferApproval() internal view virtual override onlyOwner {}
```
-- Found in src/rules/operation/RuleConditionalTransferLight.sol [Line: 54](src/rules/operation/RuleConditionalTransferLight.sol#L54)
+- Found in src/rules/operation/RuleConditionalTransferLightOwnable2Step.sol [Line: 25](src/rules/operation/RuleConditionalTransferLightOwnable2Step.sol#L25)
```solidity
- function _onlyComplianceManager() internal virtual override onlyRole(COMPLIANCE_MANAGER_ROLE) {}
+ function _authorizeTransferExecution() internal view virtual override onlyOwner {}
```
-- Found in src/rules/operation/RuleConditionalTransferLightOwnable2Step.sol [Line: 26](src/rules/operation/RuleConditionalTransferLightOwnable2Step.sol#L26)
+- Found in src/rules/validation/abstract/base/RuleSpenderWhitelistBase.sol [Line: 55](src/rules/validation/abstract/base/RuleSpenderWhitelistBase.sol#L55)
```solidity
- function _authorizeTransferApproval() internal view virtual override onlyOwner {}
+ function transferred(address, address, uint256) public view override(IERC3643IComplianceContract) {}
```
-- Found in src/rules/operation/RuleConditionalTransferLightOwnable2Step.sol [Line: 28](src/rules/operation/RuleConditionalTransferLightOwnable2Step.sol#L28)
+- Found in src/rules/validation/abstract/base/RuleSpenderWhitelistBase.sol [Line: 61](src/rules/validation/abstract/base/RuleSpenderWhitelistBase.sol#L61)
```solidity
- function _authorizeTransferExecution() internal view virtual override onlyOwner {}
+ function _transferred(address, address, uint256) internal view virtual override {
```
-- Found in src/rules/validation/deployment/RuleBlacklist.sol [Line: 38](src/rules/validation/deployment/RuleBlacklist.sol#L38)
+- Found in src/rules/validation/deployment/RuleBlacklist.sol [Line: 39](src/rules/validation/deployment/RuleBlacklist.sol#L39)
```solidity
function _authorizeAddressListAdd() internal view virtual override onlyRole(ADDRESS_LIST_ADD_ROLE) {}
```
-- Found in src/rules/validation/deployment/RuleBlacklist.sol [Line: 40](src/rules/validation/deployment/RuleBlacklist.sol#L40)
+- Found in src/rules/validation/deployment/RuleBlacklist.sol [Line: 41](src/rules/validation/deployment/RuleBlacklist.sol#L41)
```solidity
function _authorizeAddressListRemove() internal view virtual override onlyRole(ADDRESS_LIST_REMOVE_ROLE) {}
```
-- Found in src/rules/validation/deployment/RuleBlacklistOwnable2Step.sol [Line: 20](src/rules/validation/deployment/RuleBlacklistOwnable2Step.sol#L20)
+- Found in src/rules/validation/deployment/RuleBlacklistOwnable2Step.sol [Line: 17](src/rules/validation/deployment/RuleBlacklistOwnable2Step.sol#L17)
```solidity
function _authorizeAddressListAdd() internal view virtual override onlyOwner {}
```
-- Found in src/rules/validation/deployment/RuleBlacklistOwnable2Step.sol [Line: 22](src/rules/validation/deployment/RuleBlacklistOwnable2Step.sol#L22)
+- Found in src/rules/validation/deployment/RuleBlacklistOwnable2Step.sol [Line: 19](src/rules/validation/deployment/RuleBlacklistOwnable2Step.sol#L19)
```solidity
function _authorizeAddressListRemove() internal view virtual override onlyOwner {}
@@ -1097,25 +1192,25 @@ Consider removing empty blocks.
function _authorizeFrozenlistRemove() internal view virtual override onlyRole(FROZENLIST_REMOVE_ROLE) {}
```
-- Found in src/rules/validation/deployment/RuleERC2980Ownable2Step.sol [Line: 20](src/rules/validation/deployment/RuleERC2980Ownable2Step.sol#L20)
+- Found in src/rules/validation/deployment/RuleERC2980Ownable2Step.sol [Line: 17](src/rules/validation/deployment/RuleERC2980Ownable2Step.sol#L17)
```solidity
function _authorizeWhitelistAdd() internal view virtual override onlyOwner {}
```
-- Found in src/rules/validation/deployment/RuleERC2980Ownable2Step.sol [Line: 22](src/rules/validation/deployment/RuleERC2980Ownable2Step.sol#L22)
+- Found in src/rules/validation/deployment/RuleERC2980Ownable2Step.sol [Line: 19](src/rules/validation/deployment/RuleERC2980Ownable2Step.sol#L19)
```solidity
function _authorizeWhitelistRemove() internal view virtual override onlyOwner {}
```
-- Found in src/rules/validation/deployment/RuleERC2980Ownable2Step.sol [Line: 24](src/rules/validation/deployment/RuleERC2980Ownable2Step.sol#L24)
+- Found in src/rules/validation/deployment/RuleERC2980Ownable2Step.sol [Line: 21](src/rules/validation/deployment/RuleERC2980Ownable2Step.sol#L21)
```solidity
function _authorizeFrozenlistAdd() internal view virtual override onlyOwner {}
```
-- Found in src/rules/validation/deployment/RuleERC2980Ownable2Step.sol [Line: 26](src/rules/validation/deployment/RuleERC2980Ownable2Step.sol#L26)
+- Found in src/rules/validation/deployment/RuleERC2980Ownable2Step.sol [Line: 23](src/rules/validation/deployment/RuleERC2980Ownable2Step.sol#L23)
```solidity
function _authorizeFrozenlistRemove() internal view virtual override onlyOwner {}
@@ -1157,20 +1252,44 @@ Consider removing empty blocks.
function _authorizeSanctionListManager() internal view virtual override onlyOwner {}
```
-- Found in src/rules/validation/deployment/RuleWhitelist.sol [Line: 56](src/rules/validation/deployment/RuleWhitelist.sol#L56)
+- Found in src/rules/validation/deployment/RuleSpenderWhitelist.sol [Line: 32](src/rules/validation/deployment/RuleSpenderWhitelist.sol#L32)
```solidity
- function _authorizeCheckSpenderManager() internal view virtual override onlyRole(DEFAULT_ADMIN_ROLE) {}
+ function _authorizeAddressListAdd() internal view virtual override onlyRole(ADDRESS_LIST_ADD_ROLE) {}
+ ```
+
+- Found in src/rules/validation/deployment/RuleSpenderWhitelist.sol [Line: 34](src/rules/validation/deployment/RuleSpenderWhitelist.sol#L34)
+
+ ```solidity
+ function _authorizeAddressListRemove() internal view virtual override onlyRole(ADDRESS_LIST_REMOVE_ROLE) {}
+ ```
+
+- Found in src/rules/validation/deployment/RuleSpenderWhitelistOwnable2Step.sol [Line: 20](src/rules/validation/deployment/RuleSpenderWhitelistOwnable2Step.sol#L20)
+
+ ```solidity
+ function _authorizeAddressListAdd() internal view virtual override onlyOwner {}
+ ```
+
+- Found in src/rules/validation/deployment/RuleSpenderWhitelistOwnable2Step.sol [Line: 22](src/rules/validation/deployment/RuleSpenderWhitelistOwnable2Step.sol#L22)
+
+ ```solidity
+ function _authorizeAddressListRemove() internal view virtual override onlyOwner {}
```
- Found in src/rules/validation/deployment/RuleWhitelist.sol [Line: 58](src/rules/validation/deployment/RuleWhitelist.sol#L58)
```solidity
- function _authorizeAddressListAdd() internal view virtual override onlyRole(ADDRESS_LIST_ADD_ROLE) {}
+ function _authorizeCheckSpenderManager() internal view virtual override onlyRole(DEFAULT_ADMIN_ROLE) {}
```
- Found in src/rules/validation/deployment/RuleWhitelist.sol [Line: 60](src/rules/validation/deployment/RuleWhitelist.sol#L60)
+ ```solidity
+ function _authorizeAddressListAdd() internal view virtual override onlyRole(ADDRESS_LIST_ADD_ROLE) {}
+ ```
+
+- Found in src/rules/validation/deployment/RuleWhitelist.sol [Line: 62](src/rules/validation/deployment/RuleWhitelist.sol#L62)
+
```solidity
function _authorizeAddressListRemove() internal view virtual override onlyRole(ADDRESS_LIST_REMOVE_ROLE) {}
```
@@ -1193,13 +1312,13 @@ Consider removing empty blocks.
function _authorizeCheckSpenderManager() internal view virtual override onlyOwner {}
```
-- Found in src/rules/validation/deployment/RuleWhitelistWrapper.sol [Line: 47](src/rules/validation/deployment/RuleWhitelistWrapper.sol#L47)
+- Found in src/rules/validation/deployment/RuleWhitelistWrapper.sol [Line: 44](src/rules/validation/deployment/RuleWhitelistWrapper.sol#L44)
```solidity
function _authorizeCheckSpenderManager() internal virtual override onlyRole(DEFAULT_ADMIN_ROLE) {}
```
-- Found in src/rules/validation/deployment/RuleWhitelistWrapper.sol [Line: 52](src/rules/validation/deployment/RuleWhitelistWrapper.sol#L52)
+- Found in src/rules/validation/deployment/RuleWhitelistWrapper.sol [Line: 49](src/rules/validation/deployment/RuleWhitelistWrapper.sol#L49)
```solidity
function _onlyRulesManager() internal virtual override onlyRole(RULES_MANAGEMENT_ROLE) {}
@@ -1228,13 +1347,13 @@ Invoking `SSTORE` operations in loops may waste gas. Use a local variable to hol
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) {
@@ -1293,13 +1412,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 +1448,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/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
diff --git a/doc/surya/surya_graph/surya_graph_DeploymentCoverageHarnesses.sol.png b/doc/surya/surya_graph/surya_graph_DeploymentCoverageHarnesses.sol.png
new file mode 100644
index 0000000..fb91b43
Binary files /dev/null and b/doc/surya/surya_graph/surya_graph_DeploymentCoverageHarnesses.sol.png differ
diff --git a/doc/surya/surya_graph/surya_graph_IdentityRegistryMock.sol.png b/doc/surya/surya_graph/surya_graph_IdentityRegistryMock.sol.png
new file mode 100644
index 0000000..35781cc
Binary files /dev/null and b/doc/surya/surya_graph/surya_graph_IdentityRegistryMock.sol.png differ
diff --git a/doc/surya/surya_graph/surya_graph_MockERC20TransferFromFalse.sol.png b/doc/surya/surya_graph/surya_graph_MockERC20TransferFromFalse.sol.png
new file mode 100644
index 0000000..af13e5e
Binary files /dev/null and b/doc/surya/surya_graph/surya_graph_MockERC20TransferFromFalse.sol.png differ
diff --git a/doc/surya/surya_graph/surya_graph_MockERC20WithTransferContext.sol.png b/doc/surya/surya_graph/surya_graph_MockERC20WithTransferContext.sol.png
new file mode 100644
index 0000000..7ae1874
Binary files /dev/null and b/doc/surya/surya_graph/surya_graph_MockERC20WithTransferContext.sol.png differ
diff --git a/doc/surya/surya_graph/surya_graph_MockERC721WithTransferContext.sol.png b/doc/surya/surya_graph/surya_graph_MockERC721WithTransferContext.sol.png
new file mode 100644
index 0000000..74ab93c
Binary files /dev/null and b/doc/surya/surya_graph/surya_graph_MockERC721WithTransferContext.sol.png differ
diff --git a/doc/surya/surya_graph/surya_graph_RuleConditionalTransferLight.sol.png b/doc/surya/surya_graph/surya_graph_RuleConditionalTransferLight.sol.png
index 51147c2..2b5ab95 100644
Binary files a/doc/surya/surya_graph/surya_graph_RuleConditionalTransferLight.sol.png and b/doc/surya/surya_graph/surya_graph_RuleConditionalTransferLight.sol.png differ
diff --git a/doc/surya/surya_graph/surya_graph_RuleConditionalTransferLightBase.sol.png b/doc/surya/surya_graph/surya_graph_RuleConditionalTransferLightBase.sol.png
index 468a008..db7e97a 100644
Binary files a/doc/surya/surya_graph/surya_graph_RuleConditionalTransferLightBase.sol.png and b/doc/surya/surya_graph/surya_graph_RuleConditionalTransferLightBase.sol.png differ
diff --git a/doc/surya/surya_graph/surya_graph_RuleSanctionsListOwnable2StepHarness.sol.png b/doc/surya/surya_graph/surya_graph_RuleSanctionsListOwnable2StepHarness.sol.png
new file mode 100644
index 0000000..4e91ef8
Binary files /dev/null and b/doc/surya/surya_graph/surya_graph_RuleSanctionsListOwnable2StepHarness.sol.png differ
diff --git a/doc/surya/surya_graph/surya_graph_RuleSharedInvariantStorage.sol.png b/doc/surya/surya_graph/surya_graph_RuleSharedInvariantStorage.sol.png
new file mode 100644
index 0000000..e166f8f
Binary files /dev/null and b/doc/surya/surya_graph/surya_graph_RuleSharedInvariantStorage.sol.png differ
diff --git a/doc/surya/surya_graph/surya_graph_RuleSpenderWhitelist.sol.png b/doc/surya/surya_graph/surya_graph_RuleSpenderWhitelist.sol.png
new file mode 100644
index 0000000..5fc9eb1
Binary files /dev/null and b/doc/surya/surya_graph/surya_graph_RuleSpenderWhitelist.sol.png differ
diff --git a/doc/surya/surya_graph/surya_graph_RuleSpenderWhitelistBase.sol.png b/doc/surya/surya_graph/surya_graph_RuleSpenderWhitelistBase.sol.png
new file mode 100644
index 0000000..ad790f2
Binary files /dev/null and b/doc/surya/surya_graph/surya_graph_RuleSpenderWhitelistBase.sol.png differ
diff --git a/doc/surya/surya_graph/surya_graph_RuleSpenderWhitelistHarnesses.sol.png b/doc/surya/surya_graph/surya_graph_RuleSpenderWhitelistHarnesses.sol.png
new file mode 100644
index 0000000..886371e
Binary files /dev/null and b/doc/surya/surya_graph/surya_graph_RuleSpenderWhitelistHarnesses.sol.png differ
diff --git a/doc/surya/surya_graph/surya_graph_RuleSpenderWhitelistInvariantStorage.sol.png b/doc/surya/surya_graph/surya_graph_RuleSpenderWhitelistInvariantStorage.sol.png
new file mode 100644
index 0000000..e166f8f
Binary files /dev/null and b/doc/surya/surya_graph/surya_graph_RuleSpenderWhitelistInvariantStorage.sol.png differ
diff --git a/doc/surya/surya_graph/surya_graph_RuleSpenderWhitelistOwnable2Step.sol.png b/doc/surya/surya_graph/surya_graph_RuleSpenderWhitelistOwnable2Step.sol.png
new file mode 100644
index 0000000..a1ef461
Binary files /dev/null and b/doc/surya/surya_graph/surya_graph_RuleSpenderWhitelistOwnable2Step.sol.png differ
diff --git a/doc/surya/surya_graph/surya_graph_RuleWhitelistWrapperHarnessInternal.sol.png b/doc/surya/surya_graph/surya_graph_RuleWhitelistWrapperHarnessInternal.sol.png
new file mode 100644
index 0000000..ddc2deb
Binary files /dev/null and b/doc/surya/surya_graph/surya_graph_RuleWhitelistWrapperHarnessInternal.sol.png differ
diff --git a/doc/surya/surya_graph/surya_graph_SanctionListOracle.sol.png b/doc/surya/surya_graph/surya_graph_SanctionListOracle.sol.png
new file mode 100644
index 0000000..cea1cc0
Binary files /dev/null and b/doc/surya/surya_graph/surya_graph_SanctionListOracle.sol.png differ
diff --git a/doc/surya/surya_graph/surya_graph_TotalSupplyMock.sol.png b/doc/surya/surya_graph/surya_graph_TotalSupplyMock.sol.png
new file mode 100644
index 0000000..3cc02f5
Binary files /dev/null and b/doc/surya/surya_graph/surya_graph_TotalSupplyMock.sol.png differ
diff --git a/doc/surya/surya_inheritance/surya_inheritance_DeploymentCoverageHarnesses.sol.png b/doc/surya/surya_inheritance/surya_inheritance_DeploymentCoverageHarnesses.sol.png
new file mode 100644
index 0000000..f0a71e4
Binary files /dev/null and b/doc/surya/surya_inheritance/surya_inheritance_DeploymentCoverageHarnesses.sol.png differ
diff --git a/doc/surya/surya_inheritance/surya_inheritance_IdentityRegistryMock.sol.png b/doc/surya/surya_inheritance/surya_inheritance_IdentityRegistryMock.sol.png
new file mode 100644
index 0000000..20c2f58
Binary files /dev/null and b/doc/surya/surya_inheritance/surya_inheritance_IdentityRegistryMock.sol.png differ
diff --git a/doc/surya/surya_inheritance/surya_inheritance_MockERC20TransferFromFalse.sol.png b/doc/surya/surya_inheritance/surya_inheritance_MockERC20TransferFromFalse.sol.png
new file mode 100644
index 0000000..50e4bee
Binary files /dev/null and b/doc/surya/surya_inheritance/surya_inheritance_MockERC20TransferFromFalse.sol.png differ
diff --git a/doc/surya/surya_inheritance/surya_inheritance_MockERC20WithTransferContext.sol.png b/doc/surya/surya_inheritance/surya_inheritance_MockERC20WithTransferContext.sol.png
new file mode 100644
index 0000000..936a908
Binary files /dev/null and b/doc/surya/surya_inheritance/surya_inheritance_MockERC20WithTransferContext.sol.png differ
diff --git a/doc/surya/surya_inheritance/surya_inheritance_MockERC721WithTransferContext.sol.png b/doc/surya/surya_inheritance/surya_inheritance_MockERC721WithTransferContext.sol.png
new file mode 100644
index 0000000..e831b08
Binary files /dev/null and b/doc/surya/surya_inheritance/surya_inheritance_MockERC721WithTransferContext.sol.png differ
diff --git a/doc/surya/surya_inheritance/surya_inheritance_RuleBlacklistInvariantStorage.sol.png b/doc/surya/surya_inheritance/surya_inheritance_RuleBlacklistInvariantStorage.sol.png
index 813852a..d7c2e2c 100644
Binary files a/doc/surya/surya_inheritance/surya_inheritance_RuleBlacklistInvariantStorage.sol.png and b/doc/surya/surya_inheritance/surya_inheritance_RuleBlacklistInvariantStorage.sol.png differ
diff --git a/doc/surya/surya_inheritance/surya_inheritance_RuleConditionalTransferLightInvariantStorage.sol.png b/doc/surya/surya_inheritance/surya_inheritance_RuleConditionalTransferLightInvariantStorage.sol.png
index f54aa6c..83e14b6 100644
Binary files a/doc/surya/surya_inheritance/surya_inheritance_RuleConditionalTransferLightInvariantStorage.sol.png and b/doc/surya/surya_inheritance/surya_inheritance_RuleConditionalTransferLightInvariantStorage.sol.png differ
diff --git a/doc/surya/surya_inheritance/surya_inheritance_RuleERC2980InvariantStorage.sol.png b/doc/surya/surya_inheritance/surya_inheritance_RuleERC2980InvariantStorage.sol.png
index fabc10f..aff8a89 100644
Binary files a/doc/surya/surya_inheritance/surya_inheritance_RuleERC2980InvariantStorage.sol.png and b/doc/surya/surya_inheritance/surya_inheritance_RuleERC2980InvariantStorage.sol.png differ
diff --git a/doc/surya/surya_inheritance/surya_inheritance_RuleIdentityRegistryInvariantStorage.sol.png b/doc/surya/surya_inheritance/surya_inheritance_RuleIdentityRegistryInvariantStorage.sol.png
index 273070e..b43c369 100644
Binary files a/doc/surya/surya_inheritance/surya_inheritance_RuleIdentityRegistryInvariantStorage.sol.png and b/doc/surya/surya_inheritance/surya_inheritance_RuleIdentityRegistryInvariantStorage.sol.png differ
diff --git a/doc/surya/surya_inheritance/surya_inheritance_RuleMaxTotalSupplyInvariantStorage.sol.png b/doc/surya/surya_inheritance/surya_inheritance_RuleMaxTotalSupplyInvariantStorage.sol.png
index 6d7a992..73534b5 100644
Binary files a/doc/surya/surya_inheritance/surya_inheritance_RuleMaxTotalSupplyInvariantStorage.sol.png and b/doc/surya/surya_inheritance/surya_inheritance_RuleMaxTotalSupplyInvariantStorage.sol.png differ
diff --git a/doc/surya/surya_inheritance/surya_inheritance_RuleSanctionsListInvariantStorage.sol.png b/doc/surya/surya_inheritance/surya_inheritance_RuleSanctionsListInvariantStorage.sol.png
index 824eb65..27076d3 100644
Binary files a/doc/surya/surya_inheritance/surya_inheritance_RuleSanctionsListInvariantStorage.sol.png and b/doc/surya/surya_inheritance/surya_inheritance_RuleSanctionsListInvariantStorage.sol.png differ
diff --git a/doc/surya/surya_inheritance/surya_inheritance_RuleSanctionsListOwnable2StepHarness.sol.png b/doc/surya/surya_inheritance/surya_inheritance_RuleSanctionsListOwnable2StepHarness.sol.png
new file mode 100644
index 0000000..5ce6f90
Binary files /dev/null and b/doc/surya/surya_inheritance/surya_inheritance_RuleSanctionsListOwnable2StepHarness.sol.png differ
diff --git a/doc/surya/surya_inheritance/surya_inheritance_RuleSharedInvariantStorage.sol.png b/doc/surya/surya_inheritance/surya_inheritance_RuleSharedInvariantStorage.sol.png
new file mode 100644
index 0000000..7e7f001
Binary files /dev/null and b/doc/surya/surya_inheritance/surya_inheritance_RuleSharedInvariantStorage.sol.png differ
diff --git a/doc/surya/surya_inheritance/surya_inheritance_RuleSpenderWhitelist.sol.png b/doc/surya/surya_inheritance/surya_inheritance_RuleSpenderWhitelist.sol.png
new file mode 100644
index 0000000..e66e7b1
Binary files /dev/null and b/doc/surya/surya_inheritance/surya_inheritance_RuleSpenderWhitelist.sol.png differ
diff --git a/doc/surya/surya_inheritance/surya_inheritance_RuleSpenderWhitelistBase.sol.png b/doc/surya/surya_inheritance/surya_inheritance_RuleSpenderWhitelistBase.sol.png
new file mode 100644
index 0000000..064c905
Binary files /dev/null and b/doc/surya/surya_inheritance/surya_inheritance_RuleSpenderWhitelistBase.sol.png differ
diff --git a/doc/surya/surya_inheritance/surya_inheritance_RuleSpenderWhitelistHarnesses.sol.png b/doc/surya/surya_inheritance/surya_inheritance_RuleSpenderWhitelistHarnesses.sol.png
new file mode 100644
index 0000000..e386649
Binary files /dev/null and b/doc/surya/surya_inheritance/surya_inheritance_RuleSpenderWhitelistHarnesses.sol.png differ
diff --git a/doc/surya/surya_inheritance/surya_inheritance_RuleSpenderWhitelistInvariantStorage.sol.png b/doc/surya/surya_inheritance/surya_inheritance_RuleSpenderWhitelistInvariantStorage.sol.png
new file mode 100644
index 0000000..16567f8
Binary files /dev/null and b/doc/surya/surya_inheritance/surya_inheritance_RuleSpenderWhitelistInvariantStorage.sol.png differ
diff --git a/doc/surya/surya_inheritance/surya_inheritance_RuleSpenderWhitelistOwnable2Step.sol.png b/doc/surya/surya_inheritance/surya_inheritance_RuleSpenderWhitelistOwnable2Step.sol.png
new file mode 100644
index 0000000..7e43526
Binary files /dev/null and b/doc/surya/surya_inheritance/surya_inheritance_RuleSpenderWhitelistOwnable2Step.sol.png differ
diff --git a/doc/surya/surya_inheritance/surya_inheritance_RuleWhitelistInvariantStorage.sol.png b/doc/surya/surya_inheritance/surya_inheritance_RuleWhitelistInvariantStorage.sol.png
index 64630f8..8539360 100644
Binary files a/doc/surya/surya_inheritance/surya_inheritance_RuleWhitelistInvariantStorage.sol.png and b/doc/surya/surya_inheritance/surya_inheritance_RuleWhitelistInvariantStorage.sol.png differ
diff --git a/doc/surya/surya_inheritance/surya_inheritance_RuleWhitelistWrapperHarnessInternal.sol.png b/doc/surya/surya_inheritance/surya_inheritance_RuleWhitelistWrapperHarnessInternal.sol.png
new file mode 100644
index 0000000..259b1f3
Binary files /dev/null and b/doc/surya/surya_inheritance/surya_inheritance_RuleWhitelistWrapperHarnessInternal.sol.png differ
diff --git a/doc/surya/surya_inheritance/surya_inheritance_SanctionListOracle.sol.png b/doc/surya/surya_inheritance/surya_inheritance_SanctionListOracle.sol.png
new file mode 100644
index 0000000..f49b13b
Binary files /dev/null and b/doc/surya/surya_inheritance/surya_inheritance_SanctionListOracle.sol.png differ
diff --git a/doc/surya/surya_inheritance/surya_inheritance_TotalSupplyMock.sol.png b/doc/surya/surya_inheritance/surya_inheritance_TotalSupplyMock.sol.png
new file mode 100644
index 0000000..eceb609
Binary files /dev/null and b/doc/surya/surya_inheritance/surya_inheritance_TotalSupplyMock.sol.png differ
diff --git a/doc/surya/surya_report/surya_report_DeploymentCoverageHarnesses.sol.md b/doc/surya/surya_report/surya_report_DeploymentCoverageHarnesses.sol.md
new file mode 100644
index 0000000..3214d4b
--- /dev/null
+++ b/doc/surya/surya_report/surya_report_DeploymentCoverageHarnesses.sol.md
@@ -0,0 +1,60 @@
+## Sūrya's Description Report
+
+### Files Description Table
+
+
+| File Name | SHA-1 Hash |
+|-------------|--------------|
+| ./mocks/harness/DeploymentCoverageHarnesses.sol | efef241e157c319d20144f266ca0228a74ddb8b2 |
+
+
+### Contracts Description Table
+
+
+| Contract | Type | Bases | | |
+|:----------:|:-------------------:|:----------------:|:----------------:|:---------------:|
+| └ | **Function Name** | **Visibility** | **Mutability** | **Modifiers** |
+||||||
+| **RuleBlacklistHarness** | Implementation | RuleBlacklist |||
+| └ | | Public ❗️ | 🛑 | RuleBlacklist |
+| └ | exposedMsgDataLength | External ❗️ | |NO❗️ |
+||||||
+| **RuleWhitelistHarness** | Implementation | RuleWhitelist |||
+| └ | | Public ❗️ | 🛑 | RuleWhitelist |
+| └ | exposedMsgDataLength | External ❗️ | |NO❗️ |
+||||||
+| **RuleWhitelistWrapperHarness** | Implementation | RuleWhitelistWrapper |||
+| └ | | Public ❗️ | 🛑 | RuleWhitelistWrapper |
+| └ | exposedMsgDataLength | External ❗️ | |NO❗️ |
+||||||
+| **RuleERC2980Harness** | Implementation | RuleERC2980 |||
+| └ | | Public ❗️ | 🛑 | RuleERC2980 |
+| └ | exposedMsgDataLength | External ❗️ | |NO❗️ |
+||||||
+| **RuleSanctionsListHarness** | Implementation | RuleSanctionsList |||
+| └ | | Public ❗️ | 🛑 | RuleSanctionsList |
+| └ | exposedMsgDataLength | External ❗️ | |NO❗️ |
+||||||
+| **RuleBlacklistOwnable2StepHarness** | Implementation | RuleBlacklistOwnable2Step |||
+| └ | | Public ❗️ | 🛑 | RuleBlacklistOwnable2Step |
+| └ | exposedMsgDataLength | External ❗️ | |NO❗️ |
+||||||
+| **RuleWhitelistOwnable2StepHarness** | Implementation | RuleWhitelistOwnable2Step |||
+| └ | | Public ❗️ | 🛑 | RuleWhitelistOwnable2Step |
+| └ | exposedMsgDataLength | External ❗️ | |NO❗️ |
+||||||
+| **RuleWhitelistWrapperOwnable2StepHarness** | Implementation | RuleWhitelistWrapperOwnable2Step |||
+| └ | | Public ❗️ | 🛑 | RuleWhitelistWrapperOwnable2Step |
+| └ | exposedMsgDataLength | External ❗️ | |NO❗️ |
+||||||
+| **RuleERC2980Ownable2StepHarness** | Implementation | RuleERC2980Ownable2Step |||
+| └ | | Public ❗️ | 🛑 | RuleERC2980Ownable2Step |
+| └ | exposedMsgDataLength | External ❗️ | |NO❗️ |
+
+
+### Legend
+
+| Symbol | Meaning |
+|:--------:|-----------|
+| 🛑 | Function can modify state |
+| 💵 | Function is payable |
diff --git a/doc/surya/surya_report/surya_report_IAddressList.sol.md b/doc/surya/surya_report/surya_report_IAddressList.sol.md
index 9a19323..a055f5a 100644
--- a/doc/surya/surya_report/surya_report_IAddressList.sol.md
+++ b/doc/surya/surya_report/surya_report_IAddressList.sol.md
@@ -5,7 +5,7 @@
| File Name | SHA-1 Hash |
|-------------|--------------|
-| ./rules/interfaces/IAddressList.sol | 2b961381e42d46c2387a86eee244fb07f4043fbb |
+| ./rules/interfaces/IAddressList.sol | 6470e15510efea5ed2dbdfa826ce74e2b7aa91b8 |
### Contracts Description Table
diff --git a/doc/surya/surya_report/surya_report_IERC7943NonFungibleCompliance.sol.md b/doc/surya/surya_report/surya_report_IERC7943NonFungibleCompliance.sol.md
index d878eb3..d3117c2 100644
--- a/doc/surya/surya_report/surya_report_IERC7943NonFungibleCompliance.sol.md
+++ b/doc/surya/surya_report/surya_report_IERC7943NonFungibleCompliance.sol.md
@@ -5,7 +5,7 @@
| File Name | SHA-1 Hash |
|-------------|--------------|
-| ./rules/interfaces/IERC7943NonFungibleCompliance.sol | 3dcc5ac4a04723f3107fa7f2b288cc4374b678fa |
+| ./rules/interfaces/IERC7943NonFungibleCompliance.sol | 056034ef3844a682334b6a1d880e5144af4f6eb2 |
### Contracts Description Table
diff --git a/doc/surya/surya_report/surya_report_IdentityRegistryMock.sol.md b/doc/surya/surya_report/surya_report_IdentityRegistryMock.sol.md
new file mode 100644
index 0000000..a1695d1
--- /dev/null
+++ b/doc/surya/surya_report/surya_report_IdentityRegistryMock.sol.md
@@ -0,0 +1,28 @@
+## Sūrya's Description Report
+
+### Files Description Table
+
+
+| File Name | SHA-1 Hash |
+|-------------|--------------|
+| ./mocks/IdentityRegistryMock.sol | 81a48dbb5b0f632020ce23003bc49e31f79e2e37 |
+
+
+### Contracts Description Table
+
+
+| Contract | Type | Bases | | |
+|:----------:|:-------------------:|:----------------:|:----------------:|:---------------:|
+| └ | **Function Name** | **Visibility** | **Mutability** | **Modifiers** |
+||||||
+| **IdentityRegistryMock** | Implementation | IIdentityRegistryVerified |||
+| └ | setVerified | External ❗️ | 🛑 |NO❗️ |
+| └ | isVerified | External ❗️ | |NO❗️ |
+
+
+### Legend
+
+| Symbol | Meaning |
+|:--------:|-----------|
+| 🛑 | Function can modify state |
+| 💵 | Function is payable |
diff --git a/doc/surya/surya_report/surya_report_MockERC20TransferFromFalse.sol.md b/doc/surya/surya_report/surya_report_MockERC20TransferFromFalse.sol.md
new file mode 100644
index 0000000..919b4bf
--- /dev/null
+++ b/doc/surya/surya_report/surya_report_MockERC20TransferFromFalse.sol.md
@@ -0,0 +1,29 @@
+## Sūrya's Description Report
+
+### Files Description Table
+
+
+| File Name | SHA-1 Hash |
+|-------------|--------------|
+| ./mocks/MockERC20TransferFromFalse.sol | 126dbf9c338c740bfbdd73b9cbc930137e96e64d |
+
+
+### Contracts Description Table
+
+
+| Contract | Type | Bases | | |
+|:----------:|:-------------------:|:----------------:|:----------------:|:---------------:|
+| └ | **Function Name** | **Visibility** | **Mutability** | **Modifiers** |
+||||||
+| **MockERC20TransferFromFalse** | Implementation | |||
+| └ | setAllowance | External ❗️ | 🛑 |NO❗️ |
+| └ | allowance | External ❗️ | |NO❗️ |
+| └ | transferFrom | External ❗️ | |NO❗️ |
+
+
+### Legend
+
+| Symbol | Meaning |
+|:--------:|-----------|
+| 🛑 | Function can modify state |
+| 💵 | Function is payable |
diff --git a/doc/surya/surya_report/surya_report_MockERC20WithTransferContext.sol.md b/doc/surya/surya_report/surya_report_MockERC20WithTransferContext.sol.md
new file mode 100644
index 0000000..bc70198
--- /dev/null
+++ b/doc/surya/surya_report/surya_report_MockERC20WithTransferContext.sol.md
@@ -0,0 +1,35 @@
+## Sūrya's Description Report
+
+### Files Description Table
+
+
+| File Name | SHA-1 Hash |
+|-------------|--------------|
+| ./mocks/MockERC20WithTransferContext.sol | fa64b379e094097f646856ba2ea52463112c3555 |
+
+
+### Contracts Description Table
+
+
+| Contract | Type | Bases | | |
+|:----------:|:-------------------:|:----------------:|:----------------:|:---------------:|
+| └ | **Function Name** | **Visibility** | **Mutability** | **Modifiers** |
+||||||
+| **MockERC20WithTransferContext** | Implementation | ERC20 |||
+| └ | | Public ❗️ | 🛑 | ERC20 |
+| └ | setRule | External ❗️ | 🛑 |NO❗️ |
+| └ | mint | External ❗️ | 🛑 |NO❗️ |
+| └ | transfer | Public ❗️ | 🛑 |NO❗️ |
+| └ | transferFrom | Public ❗️ | 🛑 |NO❗️ |
+| └ | transferWithContext | External ❗️ | 🛑 |NO❗️ |
+| └ | transferFromWithContext | External ❗️ | 🛑 |NO❗️ |
+| └ | _notifyFungible | Internal 🔒 | 🛑 | |
+| └ | _notifyMultiToken | Internal 🔒 | 🛑 | |
+
+
+### Legend
+
+| Symbol | Meaning |
+|:--------:|-----------|
+| 🛑 | Function can modify state |
+| 💵 | Function is payable |
diff --git a/doc/surya/surya_report/surya_report_MockERC721WithTransferContext.sol.md b/doc/surya/surya_report/surya_report_MockERC721WithTransferContext.sol.md
new file mode 100644
index 0000000..8debf0e
--- /dev/null
+++ b/doc/surya/surya_report/surya_report_MockERC721WithTransferContext.sol.md
@@ -0,0 +1,31 @@
+## Sūrya's Description Report
+
+### Files Description Table
+
+
+| File Name | SHA-1 Hash |
+|-------------|--------------|
+| ./mocks/MockERC721WithTransferContext.sol | 93cbfe1335f8121dec4b4424973cf0a6e623fa59 |
+
+
+### Contracts Description Table
+
+
+| Contract | Type | Bases | | |
+|:----------:|:-------------------:|:----------------:|:----------------:|:---------------:|
+| └ | **Function Name** | **Visibility** | **Mutability** | **Modifiers** |
+||||||
+| **MockERC721WithTransferContext** | Implementation | ERC721 |||
+| └ | | Public ❗️ | 🛑 | ERC721 |
+| └ | setRule | External ❗️ | 🛑 |NO❗️ |
+| └ | mint | External ❗️ | 🛑 |NO❗️ |
+| └ | transferFrom | Public ❗️ | 🛑 |NO❗️ |
+| └ | _notifyRule | Internal 🔒 | 🛑 | |
+
+
+### Legend
+
+| Symbol | Meaning |
+|:--------:|-----------|
+| 🛑 | Function can modify state |
+| 💵 | Function is payable |
diff --git a/doc/surya/surya_report/surya_report_RuleAddressSet.sol.md b/doc/surya/surya_report/surya_report_RuleAddressSet.sol.md
index 1f4691c..d46c16c 100644
--- a/doc/surya/surya_report/surya_report_RuleAddressSet.sol.md
+++ b/doc/surya/surya_report/surya_report_RuleAddressSet.sol.md
@@ -5,7 +5,7 @@
| File Name | SHA-1 Hash |
|-------------|--------------|
-| ./rules/validation/abstract/RuleAddressSet/RuleAddressSet.sol | d3c0ae66393dfd096ab093154e58ff19b4c8f5db |
+| ./rules/validation/abstract/RuleAddressSet/RuleAddressSet.sol | a3c3be817c875ac39b08a0c7b06b97f1d3a4c440 |
### Contracts Description Table
diff --git a/doc/surya/surya_report/surya_report_RuleAddressSetInternal.sol.md b/doc/surya/surya_report/surya_report_RuleAddressSetInternal.sol.md
index 20d7e1f..ddfdb85 100644
--- a/doc/surya/surya_report/surya_report_RuleAddressSetInternal.sol.md
+++ b/doc/surya/surya_report/surya_report_RuleAddressSetInternal.sol.md
@@ -5,7 +5,7 @@
| File Name | SHA-1 Hash |
|-------------|--------------|
-| ./rules/validation/abstract/RuleAddressSet/RuleAddressSetInternal.sol | 14069f79818b8ba217e6472729be7931739239f3 |
+| ./rules/validation/abstract/RuleAddressSet/RuleAddressSetInternal.sol | 61850ffd777b0d2df65b50258100a0bfba79765c |
### Contracts Description Table
diff --git a/doc/surya/surya_report/surya_report_RuleBlacklist.sol.md b/doc/surya/surya_report/surya_report_RuleBlacklist.sol.md
index 68ef999..e1a6f8d 100644
--- a/doc/surya/surya_report/surya_report_RuleBlacklist.sol.md
+++ b/doc/surya/surya_report/surya_report_RuleBlacklist.sol.md
@@ -5,7 +5,7 @@
| File Name | SHA-1 Hash |
|-------------|--------------|
-| ./rules/validation/deployment/RuleBlacklist.sol | 8aed298894c40dd177b7b98e10b61d9e2ee7d9f7 |
+| ./rules/validation/deployment/RuleBlacklist.sol | 4bf9ad173243b77e6bc78a9c870509454437fd48 |
### Contracts Description Table
diff --git a/doc/surya/surya_report/surya_report_RuleBlacklistBase.sol.md b/doc/surya/surya_report/surya_report_RuleBlacklistBase.sol.md
index 88cba88..1d34304 100644
--- a/doc/surya/surya_report/surya_report_RuleBlacklistBase.sol.md
+++ b/doc/surya/surya_report/surya_report_RuleBlacklistBase.sol.md
@@ -5,7 +5,7 @@
| File Name | SHA-1 Hash |
|-------------|--------------|
-| ./rules/validation/abstract/base/RuleBlacklistBase.sol | 7ed6f787688c2ce046e4762d00c4f3479d7b3b80 |
+| ./rules/validation/abstract/base/RuleBlacklistBase.sol | ec66a18aa4908019e16c6d570202260524c44904 |
### Contracts Description Table
diff --git a/doc/surya/surya_report/surya_report_RuleBlacklistInvariantStorage.sol.md b/doc/surya/surya_report/surya_report_RuleBlacklistInvariantStorage.sol.md
index f280d23..961d7e2 100644
--- a/doc/surya/surya_report/surya_report_RuleBlacklistInvariantStorage.sol.md
+++ b/doc/surya/surya_report/surya_report_RuleBlacklistInvariantStorage.sol.md
@@ -5,7 +5,7 @@
| File Name | SHA-1 Hash |
|-------------|--------------|
-| ./rules/validation/abstract/RuleAddressSet/invariantStorage/RuleBlacklistInvariantStorage.sol | 64b452cdfbf764b87e9379f51fa3089b4b7d3543 |
+| ./rules/validation/abstract/RuleAddressSet/invariantStorage/RuleBlacklistInvariantStorage.sol | d3f1c084086821a5ec13825d4f8488c552947ac6 |
### Contracts Description Table
@@ -15,7 +15,7 @@
|:----------:|:-------------------:|:----------------:|:----------------:|:---------------:|
| └ | **Function Name** | **Visibility** | **Mutability** | **Modifiers** |
||||||
-| **RuleBlacklistInvariantStorage** | Implementation | RuleCommonInvariantStorage |||
+| **RuleBlacklistInvariantStorage** | Implementation | RuleSharedInvariantStorage |||
### Legend
diff --git a/doc/surya/surya_report/surya_report_RuleBlacklistOwnable2Step.sol.md b/doc/surya/surya_report/surya_report_RuleBlacklistOwnable2Step.sol.md
index 9d44947..e685d62 100644
--- a/doc/surya/surya_report/surya_report_RuleBlacklistOwnable2Step.sol.md
+++ b/doc/surya/surya_report/surya_report_RuleBlacklistOwnable2Step.sol.md
@@ -5,7 +5,7 @@
| File Name | SHA-1 Hash |
|-------------|--------------|
-| ./rules/validation/deployment/RuleBlacklistOwnable2Step.sol | 5f123378df5b9f27789b8a8c6513c4772d6e624a |
+| ./rules/validation/deployment/RuleBlacklistOwnable2Step.sol | 52a9b745423b9706c4c88fc8aee35f4d5020c176 |
### Contracts Description Table
diff --git a/doc/surya/surya_report/surya_report_RuleConditionalTransferLight.sol.md b/doc/surya/surya_report/surya_report_RuleConditionalTransferLight.sol.md
index 0d09699..f613b8f 100644
--- a/doc/surya/surya_report/surya_report_RuleConditionalTransferLight.sol.md
+++ b/doc/surya/surya_report/surya_report_RuleConditionalTransferLight.sol.md
@@ -5,7 +5,7 @@
| File Name | SHA-1 Hash |
|-------------|--------------|
-| ./rules/operation/RuleConditionalTransferLight.sol | e0162216172e500f983792bc25a3b76bae195279 |
+| ./rules/operation/RuleConditionalTransferLight.sol | 81491b418d569b10e02f08058beea7080fb943f6 |
### Contracts Description Table
diff --git a/doc/surya/surya_report/surya_report_RuleConditionalTransferLightBase.sol.md b/doc/surya/surya_report/surya_report_RuleConditionalTransferLightBase.sol.md
index 157d6d7..075c449 100644
--- a/doc/surya/surya_report/surya_report_RuleConditionalTransferLightBase.sol.md
+++ b/doc/surya/surya_report/surya_report_RuleConditionalTransferLightBase.sol.md
@@ -5,7 +5,7 @@
| File Name | SHA-1 Hash |
|-------------|--------------|
-| ./rules/operation/abstract/RuleConditionalTransferLightBase.sol | a5157a72d529a6270f365c36d9a6bb8f58fa17f8 |
+| ./rules/operation/abstract/RuleConditionalTransferLightBase.sol | 649f37246378014573f7368fa573f21c4b15d679 |
### Contracts Description Table
diff --git a/doc/surya/surya_report/surya_report_RuleConditionalTransferLightInvariantStorage.sol.md b/doc/surya/surya_report/surya_report_RuleConditionalTransferLightInvariantStorage.sol.md
index 09dd6e1..93c5fa4 100644
--- a/doc/surya/surya_report/surya_report_RuleConditionalTransferLightInvariantStorage.sol.md
+++ b/doc/surya/surya_report/surya_report_RuleConditionalTransferLightInvariantStorage.sol.md
@@ -5,7 +5,7 @@
| File Name | SHA-1 Hash |
|-------------|--------------|
-| ./rules/operation/abstract/RuleConditionalTransferLightInvariantStorage.sol | 9c92d2e986e00f880b5d54e03f6fbad475aba90d |
+| ./rules/operation/abstract/RuleConditionalTransferLightInvariantStorage.sol | db973443a192d9342f2d19b9909e00744e488439 |
### Contracts Description Table
@@ -15,7 +15,7 @@
|:----------:|:-------------------:|:----------------:|:----------------:|:---------------:|
| └ | **Function Name** | **Visibility** | **Mutability** | **Modifiers** |
||||||
-| **RuleConditionalTransferLightInvariantStorage** | Implementation | RuleCommonInvariantStorage |||
+| **RuleConditionalTransferLightInvariantStorage** | Implementation | RuleSharedInvariantStorage |||
### Legend
diff --git a/doc/surya/surya_report/surya_report_RuleConditionalTransferLightOwnable2Step.sol.md b/doc/surya/surya_report/surya_report_RuleConditionalTransferLightOwnable2Step.sol.md
index ed0bf88..6bcd7c1 100644
--- a/doc/surya/surya_report/surya_report_RuleConditionalTransferLightOwnable2Step.sol.md
+++ b/doc/surya/surya_report/surya_report_RuleConditionalTransferLightOwnable2Step.sol.md
@@ -5,7 +5,7 @@
| File Name | SHA-1 Hash |
|-------------|--------------|
-| ./rules/operation/RuleConditionalTransferLightOwnable2Step.sol | 1f1370e5855be0b612db99cf1b60fbbb0e0eb4f6 |
+| ./rules/operation/RuleConditionalTransferLightOwnable2Step.sol | 8687e3c3162af3f4863d713cf56b5895a724dc97 |
### Contracts Description Table
diff --git a/doc/surya/surya_report/surya_report_RuleERC2980Base.sol.md b/doc/surya/surya_report/surya_report_RuleERC2980Base.sol.md
index a6849f1..b57d274 100644
--- a/doc/surya/surya_report/surya_report_RuleERC2980Base.sol.md
+++ b/doc/surya/surya_report/surya_report_RuleERC2980Base.sol.md
@@ -5,7 +5,7 @@
| File Name | SHA-1 Hash |
|-------------|--------------|
-| ./rules/validation/abstract/base/RuleERC2980Base.sol | a48f4f0ab9e21d1da777c6000ef780c527ae0110 |
+| ./rules/validation/abstract/base/RuleERC2980Base.sol | d50ea84a4570130dffdd7940cd40004b6f6a2eb0 |
### Contracts Description Table
diff --git a/doc/surya/surya_report/surya_report_RuleERC2980InvariantStorage.sol.md b/doc/surya/surya_report/surya_report_RuleERC2980InvariantStorage.sol.md
index 78b6d6a..35100ff 100644
--- a/doc/surya/surya_report/surya_report_RuleERC2980InvariantStorage.sol.md
+++ b/doc/surya/surya_report/surya_report_RuleERC2980InvariantStorage.sol.md
@@ -5,7 +5,7 @@
| File Name | SHA-1 Hash |
|-------------|--------------|
-| ./rules/validation/abstract/RuleERC2980/invariantStorage/RuleERC2980InvariantStorage.sol | fade52ea9b2658ce1c5ddd11da5047a73c5539cd |
+| ./rules/validation/abstract/RuleERC2980/invariantStorage/RuleERC2980InvariantStorage.sol | e297f0edb2cf9641ee0277f1baef6b838a61729c |
### Contracts Description Table
@@ -15,7 +15,7 @@
|:----------:|:-------------------:|:----------------:|:----------------:|:---------------:|
| └ | **Function Name** | **Visibility** | **Mutability** | **Modifiers** |
||||||
-| **RuleERC2980InvariantStorage** | Implementation | RuleCommonInvariantStorage |||
+| **RuleERC2980InvariantStorage** | Implementation | RuleSharedInvariantStorage |||
### Legend
diff --git a/doc/surya/surya_report/surya_report_RuleERC2980Ownable2Step.sol.md b/doc/surya/surya_report/surya_report_RuleERC2980Ownable2Step.sol.md
index 4c878c8..1656cc1 100644
--- a/doc/surya/surya_report/surya_report_RuleERC2980Ownable2Step.sol.md
+++ b/doc/surya/surya_report/surya_report_RuleERC2980Ownable2Step.sol.md
@@ -5,7 +5,7 @@
| File Name | SHA-1 Hash |
|-------------|--------------|
-| ./rules/validation/deployment/RuleERC2980Ownable2Step.sol | 9aa2fe60b1c93ee6bbeee4f84642e0a7662bc6c5 |
+| ./rules/validation/deployment/RuleERC2980Ownable2Step.sol | b8d79b607fd79c889394e5aa708b36bc27f66af0 |
### Contracts Description Table
diff --git a/doc/surya/surya_report/surya_report_RuleIdentityRegistryBase.sol.md b/doc/surya/surya_report/surya_report_RuleIdentityRegistryBase.sol.md
index 8080cc9..d23f64e 100644
--- a/doc/surya/surya_report/surya_report_RuleIdentityRegistryBase.sol.md
+++ b/doc/surya/surya_report/surya_report_RuleIdentityRegistryBase.sol.md
@@ -5,7 +5,7 @@
| File Name | SHA-1 Hash |
|-------------|--------------|
-| ./rules/validation/abstract/base/RuleIdentityRegistryBase.sol | 47a89ca38792869c7affc9267934137198be36df |
+| ./rules/validation/abstract/base/RuleIdentityRegistryBase.sol | b45427318245e6f2c8a95e6703a841f5aa17b92e |
### Contracts Description Table
diff --git a/doc/surya/surya_report/surya_report_RuleIdentityRegistryInvariantStorage.sol.md b/doc/surya/surya_report/surya_report_RuleIdentityRegistryInvariantStorage.sol.md
index ff4e702..3045ea6 100644
--- a/doc/surya/surya_report/surya_report_RuleIdentityRegistryInvariantStorage.sol.md
+++ b/doc/surya/surya_report/surya_report_RuleIdentityRegistryInvariantStorage.sol.md
@@ -5,7 +5,7 @@
| File Name | SHA-1 Hash |
|-------------|--------------|
-| ./rules/validation/abstract/invariant/RuleIdentityRegistryInvariantStorage.sol | f48bd119a5ba7612d03d08faf053b20d5a3523b0 |
+| ./rules/validation/abstract/invariant/RuleIdentityRegistryInvariantStorage.sol | 663984fafa1c5e4989ba9e16187cec3fec5bf9b4 |
### Contracts Description Table
@@ -15,7 +15,7 @@
|:----------:|:-------------------:|:----------------:|:----------------:|:---------------:|
| └ | **Function Name** | **Visibility** | **Mutability** | **Modifiers** |
||||||
-| **RuleIdentityRegistryInvariantStorage** | Implementation | RuleCommonInvariantStorage |||
+| **RuleIdentityRegistryInvariantStorage** | Implementation | RuleSharedInvariantStorage |||
### Legend
diff --git a/doc/surya/surya_report/surya_report_RuleMaxTotalSupplyBase.sol.md b/doc/surya/surya_report/surya_report_RuleMaxTotalSupplyBase.sol.md
index db09856..6782ba4 100644
--- a/doc/surya/surya_report/surya_report_RuleMaxTotalSupplyBase.sol.md
+++ b/doc/surya/surya_report/surya_report_RuleMaxTotalSupplyBase.sol.md
@@ -5,7 +5,7 @@
| File Name | SHA-1 Hash |
|-------------|--------------|
-| ./rules/validation/abstract/base/RuleMaxTotalSupplyBase.sol | 0a81c8c5a5216d01bd0432e472aee26135ddb180 |
+| ./rules/validation/abstract/base/RuleMaxTotalSupplyBase.sol | d053ae9f319f818704986cd5e551422376088f75 |
### Contracts Description Table
diff --git a/doc/surya/surya_report/surya_report_RuleMaxTotalSupplyInvariantStorage.sol.md b/doc/surya/surya_report/surya_report_RuleMaxTotalSupplyInvariantStorage.sol.md
index e9718a0..c267fcf 100644
--- a/doc/surya/surya_report/surya_report_RuleMaxTotalSupplyInvariantStorage.sol.md
+++ b/doc/surya/surya_report/surya_report_RuleMaxTotalSupplyInvariantStorage.sol.md
@@ -5,7 +5,7 @@
| File Name | SHA-1 Hash |
|-------------|--------------|
-| ./rules/validation/abstract/invariant/RuleMaxTotalSupplyInvariantStorage.sol | 472d1b814581d38e0e0e68c9f5496875253235df |
+| ./rules/validation/abstract/invariant/RuleMaxTotalSupplyInvariantStorage.sol | 9c921b3736a3f7f28b6b0681c2cf995a55fa9cc6 |
### Contracts Description Table
@@ -15,7 +15,7 @@
|:----------:|:-------------------:|:----------------:|:----------------:|:---------------:|
| └ | **Function Name** | **Visibility** | **Mutability** | **Modifiers** |
||||||
-| **RuleMaxTotalSupplyInvariantStorage** | Implementation | RuleCommonInvariantStorage |||
+| **RuleMaxTotalSupplyInvariantStorage** | Implementation | RuleSharedInvariantStorage |||
### Legend
diff --git a/doc/surya/surya_report/surya_report_RuleNFTAdapter.sol.md b/doc/surya/surya_report/surya_report_RuleNFTAdapter.sol.md
index f66a528..08a6b2c 100644
--- a/doc/surya/surya_report/surya_report_RuleNFTAdapter.sol.md
+++ b/doc/surya/surya_report/surya_report_RuleNFTAdapter.sol.md
@@ -5,7 +5,7 @@
| File Name | SHA-1 Hash |
|-------------|--------------|
-| ./rules/validation/abstract/core/RuleNFTAdapter.sol | f30fee37868a3a64343d7ccb183c58df9fa485ba |
+| ./rules/validation/abstract/core/RuleNFTAdapter.sol | 3c6af34113014eb17564b992ee6af4b0f973b89a |
### Contracts Description Table
diff --git a/doc/surya/surya_report/surya_report_RuleSanctionsList.sol.md b/doc/surya/surya_report/surya_report_RuleSanctionsList.sol.md
index fd7c843..2fbdb7e 100644
--- a/doc/surya/surya_report/surya_report_RuleSanctionsList.sol.md
+++ b/doc/surya/surya_report/surya_report_RuleSanctionsList.sol.md
@@ -5,7 +5,7 @@
| File Name | SHA-1 Hash |
|-------------|--------------|
-| ./rules/validation/deployment/RuleSanctionsList.sol | 637091b2665ce493579a5a357e09814e56bdf864 |
+| ./rules/validation/deployment/RuleSanctionsList.sol | 6d463c0d660ea2517d9aa0f678d0d38bb0634a1b |
### Contracts Description Table
diff --git a/doc/surya/surya_report/surya_report_RuleSanctionsListBase.sol.md b/doc/surya/surya_report/surya_report_RuleSanctionsListBase.sol.md
index 9a517ad..cc2b1c7 100644
--- a/doc/surya/surya_report/surya_report_RuleSanctionsListBase.sol.md
+++ b/doc/surya/surya_report/surya_report_RuleSanctionsListBase.sol.md
@@ -5,7 +5,7 @@
| File Name | SHA-1 Hash |
|-------------|--------------|
-| ./rules/validation/abstract/base/RuleSanctionsListBase.sol | 4df9987f34a4451f42e019bd7016c6ba51d750b8 |
+| ./rules/validation/abstract/base/RuleSanctionsListBase.sol | bdaa898898ea6ba654f2b627b3dd0161b3c39d39 |
### Contracts Description Table
diff --git a/doc/surya/surya_report/surya_report_RuleSanctionsListInvariantStorage.sol.md b/doc/surya/surya_report/surya_report_RuleSanctionsListInvariantStorage.sol.md
index 7870d81..bd47a88 100644
--- a/doc/surya/surya_report/surya_report_RuleSanctionsListInvariantStorage.sol.md
+++ b/doc/surya/surya_report/surya_report_RuleSanctionsListInvariantStorage.sol.md
@@ -5,7 +5,7 @@
| File Name | SHA-1 Hash |
|-------------|--------------|
-| ./rules/validation/abstract/invariant/RuleSanctionsListInvariantStorage.sol | 898f1976a71788fd6aa39127e741988481f6082f |
+| ./rules/validation/abstract/invariant/RuleSanctionsListInvariantStorage.sol | 0b799d5753392482f00fea8d5a885847747d6360 |
### Contracts Description Table
@@ -15,7 +15,7 @@
|:----------:|:-------------------:|:----------------:|:----------------:|:---------------:|
| └ | **Function Name** | **Visibility** | **Mutability** | **Modifiers** |
||||||
-| **RuleSanctionsListInvariantStorage** | Implementation | RuleCommonInvariantStorage |||
+| **RuleSanctionsListInvariantStorage** | Implementation | RuleSharedInvariantStorage |||
### Legend
diff --git a/doc/surya/surya_report/surya_report_RuleSanctionsListOwnable2Step.sol.md b/doc/surya/surya_report/surya_report_RuleSanctionsListOwnable2Step.sol.md
index bbdbf0e..f491457 100644
--- a/doc/surya/surya_report/surya_report_RuleSanctionsListOwnable2Step.sol.md
+++ b/doc/surya/surya_report/surya_report_RuleSanctionsListOwnable2Step.sol.md
@@ -5,7 +5,7 @@
| File Name | SHA-1 Hash |
|-------------|--------------|
-| ./rules/validation/deployment/RuleSanctionsListOwnable2Step.sol | 83e1b5b8af6650b2ce7274b87b0ff92f99157e86 |
+| ./rules/validation/deployment/RuleSanctionsListOwnable2Step.sol | ab32806c8989f946fb487bb3db318b49c5c265d4 |
### Contracts Description Table
diff --git a/doc/surya/surya_report/surya_report_RuleSanctionsListOwnable2StepHarness.sol.md b/doc/surya/surya_report/surya_report_RuleSanctionsListOwnable2StepHarness.sol.md
new file mode 100644
index 0000000..1da0028
--- /dev/null
+++ b/doc/surya/surya_report/surya_report_RuleSanctionsListOwnable2StepHarness.sol.md
@@ -0,0 +1,30 @@
+## Sūrya's Description Report
+
+### Files Description Table
+
+
+| File Name | SHA-1 Hash |
+|-------------|--------------|
+| ./mocks/harness/RuleSanctionsListOwnable2StepHarness.sol | 44292571fdcfc1cd2bcaa78849bd355b11c0b391 |
+
+
+### Contracts Description Table
+
+
+| Contract | Type | Bases | | |
+|:----------:|:-------------------:|:----------------:|:----------------:|:---------------:|
+| └ | **Function Name** | **Visibility** | **Mutability** | **Modifiers** |
+||||||
+| **RuleSanctionsListOwnable2StepHarness** | Implementation | RuleSanctionsListOwnable2Step |||
+| └ | | Public ❗️ | 🛑 | RuleSanctionsListOwnable2Step |
+| └ | exposedMsgSender | External ❗️ | |NO❗️ |
+| └ | exposedMsgData | External ❗️ | |NO❗️ |
+| └ | exposedContextSuffixLength | External ❗️ | |NO❗️ |
+
+
+### Legend
+
+| Symbol | Meaning |
+|:--------:|-----------|
+| 🛑 | Function can modify state |
+| 💵 | Function is payable |
diff --git a/doc/surya/surya_report/surya_report_RuleSharedInvariantStorage.sol.md b/doc/surya/surya_report/surya_report_RuleSharedInvariantStorage.sol.md
new file mode 100644
index 0000000..e446e6c
--- /dev/null
+++ b/doc/surya/surya_report/surya_report_RuleSharedInvariantStorage.sol.md
@@ -0,0 +1,26 @@
+## Sūrya's Description Report
+
+### Files Description Table
+
+
+| File Name | SHA-1 Hash |
+|-------------|--------------|
+| ./rules/validation/abstract/invariant/RuleSharedInvariantStorage.sol | c64ab28b9789c1339609af1fde0cfd314976645d |
+
+
+### Contracts Description Table
+
+
+| Contract | Type | Bases | | |
+|:----------:|:-------------------:|:----------------:|:----------------:|:---------------:|
+| └ | **Function Name** | **Visibility** | **Mutability** | **Modifiers** |
+||||||
+| **RuleSharedInvariantStorage** | Implementation | |||
+
+
+### Legend
+
+| Symbol | Meaning |
+|:--------:|-----------|
+| 🛑 | Function can modify state |
+| 💵 | Function is payable |
diff --git a/doc/surya/surya_report/surya_report_RuleSpenderWhitelist.sol.md b/doc/surya/surya_report/surya_report_RuleSpenderWhitelist.sol.md
new file mode 100644
index 0000000..057a7f0
--- /dev/null
+++ b/doc/surya/surya_report/surya_report_RuleSpenderWhitelist.sol.md
@@ -0,0 +1,33 @@
+## Sūrya's Description Report
+
+### Files Description Table
+
+
+| File Name | SHA-1 Hash |
+|-------------|--------------|
+| ./rules/validation/deployment/RuleSpenderWhitelist.sol | a0be674edf4d466f3359f0d8b9cf5e928356d27b |
+
+
+### Contracts Description Table
+
+
+| Contract | Type | Bases | | |
+|:----------:|:-------------------:|:----------------:|:----------------:|:---------------:|
+| └ | **Function Name** | **Visibility** | **Mutability** | **Modifiers** |
+||||||
+| **RuleSpenderWhitelist** | Implementation | RuleSpenderWhitelistBase, AccessControlModuleStandalone |||
+| └ | | Public ❗️ | 🛑 | RuleSpenderWhitelistBase AccessControlModuleStandalone |
+| └ | supportsInterface | Public ❗️ | |NO❗️ |
+| └ | _authorizeAddressListAdd | Internal 🔒 | | onlyRole |
+| └ | _authorizeAddressListRemove | Internal 🔒 | | onlyRole |
+| └ | _msgSender | Internal 🔒 | | |
+| └ | _msgData | Internal 🔒 | | |
+| └ | _contextSuffixLength | Internal 🔒 | | |
+
+
+### Legend
+
+| Symbol | Meaning |
+|:--------:|-----------|
+| 🛑 | Function can modify state |
+| 💵 | Function is payable |
diff --git a/doc/surya/surya_report/surya_report_RuleSpenderWhitelistBase.sol.md b/doc/surya/surya_report/surya_report_RuleSpenderWhitelistBase.sol.md
new file mode 100644
index 0000000..692fb0b
--- /dev/null
+++ b/doc/surya/surya_report/surya_report_RuleSpenderWhitelistBase.sol.md
@@ -0,0 +1,35 @@
+## Sūrya's Description Report
+
+### Files Description Table
+
+
+| File Name | SHA-1 Hash |
+|-------------|--------------|
+| ./rules/validation/abstract/base/RuleSpenderWhitelistBase.sol | 5c98b6381ca5afb108537c1e8691793f622098ee |
+
+
+### Contracts Description Table
+
+
+| Contract | Type | Bases | | |
+|:----------:|:-------------------:|:----------------:|:----------------:|:---------------:|
+| └ | **Function Name** | **Visibility** | **Mutability** | **Modifiers** |
+||||||
+| **RuleSpenderWhitelistBase** | Implementation | RuleAddressSet, RuleNFTAdapter, RuleSpenderWhitelistInvariantStorage |||
+| └ | | Public ❗️ | 🛑 | RuleAddressSet |
+| └ | _detectTransferRestriction | Internal 🔒 | | |
+| └ | _detectTransferRestrictionFrom | Internal 🔒 | | |
+| └ | canReturnTransferRestrictionCode | External ❗️ | |NO❗️ |
+| └ | messageForTransferRestriction | Public ❗️ | |NO❗️ |
+| └ | transferred | Public ❗️ | |NO❗️ |
+| └ | transferred | Public ❗️ | |NO❗️ |
+| └ | _transferred | Internal 🔒 | | |
+| └ | _transferredFrom | Internal 🔒 | | |
+
+
+### Legend
+
+| Symbol | Meaning |
+|:--------:|-----------|
+| 🛑 | Function can modify state |
+| 💵 | Function is payable |
diff --git a/doc/surya/surya_report/surya_report_RuleSpenderWhitelistHarnesses.sol.md b/doc/surya/surya_report/surya_report_RuleSpenderWhitelistHarnesses.sol.md
new file mode 100644
index 0000000..7a787a4
--- /dev/null
+++ b/doc/surya/surya_report/surya_report_RuleSpenderWhitelistHarnesses.sol.md
@@ -0,0 +1,36 @@
+## Sūrya's Description Report
+
+### Files Description Table
+
+
+| File Name | SHA-1 Hash |
+|-------------|--------------|
+| ./mocks/harness/RuleSpenderWhitelistHarnesses.sol | 0ffebe781ed82e1a573c0b78dad7051f9c10cd69 |
+
+
+### Contracts Description Table
+
+
+| Contract | Type | Bases | | |
+|:----------:|:-------------------:|:----------------:|:----------------:|:---------------:|
+| └ | **Function Name** | **Visibility** | **Mutability** | **Modifiers** |
+||||||
+| **RuleSpenderWhitelistHarness** | Implementation | RuleSpenderWhitelist |||
+| └ | | Public ❗️ | 🛑 | RuleSpenderWhitelist |
+| └ | exposedMsgSender | External ❗️ | |NO❗️ |
+| └ | exposedMsgData | External ❗️ | |NO❗️ |
+| └ | exposedContextSuffixLength | External ❗️ | |NO❗️ |
+||||||
+| **RuleSpenderWhitelistOwnable2StepHarness** | Implementation | RuleSpenderWhitelistOwnable2Step |||
+| └ | | Public ❗️ | 🛑 | RuleSpenderWhitelistOwnable2Step |
+| └ | exposedMsgSender | External ❗️ | |NO❗️ |
+| └ | exposedMsgData | External ❗️ | |NO❗️ |
+| └ | exposedContextSuffixLength | External ❗️ | |NO❗️ |
+
+
+### Legend
+
+| Symbol | Meaning |
+|:--------:|-----------|
+| 🛑 | Function can modify state |
+| 💵 | Function is payable |
diff --git a/doc/surya/surya_report/surya_report_RuleSpenderWhitelistInvariantStorage.sol.md b/doc/surya/surya_report/surya_report_RuleSpenderWhitelistInvariantStorage.sol.md
new file mode 100644
index 0000000..baf1ff2
--- /dev/null
+++ b/doc/surya/surya_report/surya_report_RuleSpenderWhitelistInvariantStorage.sol.md
@@ -0,0 +1,26 @@
+## Sūrya's Description Report
+
+### Files Description Table
+
+
+| File Name | SHA-1 Hash |
+|-------------|--------------|
+| ./rules/validation/abstract/invariant/RuleSpenderWhitelistInvariantStorage.sol | 94c54ff0f3e4162cb50e082ea6a23df02cf0ddb5 |
+
+
+### Contracts Description Table
+
+
+| Contract | Type | Bases | | |
+|:----------:|:-------------------:|:----------------:|:----------------:|:---------------:|
+| └ | **Function Name** | **Visibility** | **Mutability** | **Modifiers** |
+||||||
+| **RuleSpenderWhitelistInvariantStorage** | Implementation | RuleSharedInvariantStorage |||
+
+
+### Legend
+
+| Symbol | Meaning |
+|:--------:|-----------|
+| 🛑 | Function can modify state |
+| 💵 | Function is payable |
diff --git a/doc/surya/surya_report/surya_report_RuleSpenderWhitelistOwnable2Step.sol.md b/doc/surya/surya_report/surya_report_RuleSpenderWhitelistOwnable2Step.sol.md
new file mode 100644
index 0000000..a0f1499
--- /dev/null
+++ b/doc/surya/surya_report/surya_report_RuleSpenderWhitelistOwnable2Step.sol.md
@@ -0,0 +1,32 @@
+## Sūrya's Description Report
+
+### Files Description Table
+
+
+| File Name | SHA-1 Hash |
+|-------------|--------------|
+| ./rules/validation/deployment/RuleSpenderWhitelistOwnable2Step.sol | ab6f45280b6ae2420fae79d04ee7092a6e22d2e6 |
+
+
+### Contracts Description Table
+
+
+| Contract | Type | Bases | | |
+|:----------:|:-------------------:|:----------------:|:----------------:|:---------------:|
+| └ | **Function Name** | **Visibility** | **Mutability** | **Modifiers** |
+||||||
+| **RuleSpenderWhitelistOwnable2Step** | Implementation | RuleSpenderWhitelistBase, Ownable2Step |||
+| └ | | Public ❗️ | 🛑 | RuleSpenderWhitelistBase Ownable |
+| └ | _authorizeAddressListAdd | Internal 🔒 | | onlyOwner |
+| └ | _authorizeAddressListRemove | Internal 🔒 | | onlyOwner |
+| └ | _msgSender | Internal 🔒 | | |
+| └ | _msgData | Internal 🔒 | | |
+| └ | _contextSuffixLength | Internal 🔒 | | |
+
+
+### Legend
+
+| Symbol | Meaning |
+|:--------:|-----------|
+| 🛑 | Function can modify state |
+| 💵 | Function is payable |
diff --git a/doc/surya/surya_report/surya_report_RuleTransferValidation.sol.md b/doc/surya/surya_report/surya_report_RuleTransferValidation.sol.md
index da0948b..39097a2 100644
--- a/doc/surya/surya_report/surya_report_RuleTransferValidation.sol.md
+++ b/doc/surya/surya_report/surya_report_RuleTransferValidation.sol.md
@@ -5,7 +5,7 @@
| File Name | SHA-1 Hash |
|-------------|--------------|
-| ./rules/validation/abstract/core/RuleTransferValidation.sol | df3a84d6c6a529f41063006f27b0ff52239d26d6 |
+| ./rules/validation/abstract/core/RuleTransferValidation.sol | 60cacb209f7dd69907e0319ecd359140eeb3a204 |
### Contracts Description Table
diff --git a/doc/surya/surya_report/surya_report_RuleWhitelist.sol.md b/doc/surya/surya_report/surya_report_RuleWhitelist.sol.md
index 47f1f48..1d32e17 100644
--- a/doc/surya/surya_report/surya_report_RuleWhitelist.sol.md
+++ b/doc/surya/surya_report/surya_report_RuleWhitelist.sol.md
@@ -5,7 +5,7 @@
| File Name | SHA-1 Hash |
|-------------|--------------|
-| ./rules/validation/deployment/RuleWhitelist.sol | 756120de4d3681f98814733f4cb4c49d2671571a |
+| ./rules/validation/deployment/RuleWhitelist.sol | 51776b16b0583a57947a6fb2e1f4f5862bf491d0 |
### Contracts Description Table
diff --git a/doc/surya/surya_report/surya_report_RuleWhitelistBase.sol.md b/doc/surya/surya_report/surya_report_RuleWhitelistBase.sol.md
index a5e5446..7caef73 100644
--- a/doc/surya/surya_report/surya_report_RuleWhitelistBase.sol.md
+++ b/doc/surya/surya_report/surya_report_RuleWhitelistBase.sol.md
@@ -5,7 +5,7 @@
| File Name | SHA-1 Hash |
|-------------|--------------|
-| ./rules/validation/abstract/base/RuleWhitelistBase.sol | 143951e9f858d05f9ad5d1c1e39879043dd82563 |
+| ./rules/validation/abstract/base/RuleWhitelistBase.sol | c294dd72e48d0a71699d3b54c560e1e5c23d52da |
### Contracts Description Table
diff --git a/doc/surya/surya_report/surya_report_RuleWhitelistInvariantStorage.sol.md b/doc/surya/surya_report/surya_report_RuleWhitelistInvariantStorage.sol.md
index 5ec38ef..f96edac 100644
--- a/doc/surya/surya_report/surya_report_RuleWhitelistInvariantStorage.sol.md
+++ b/doc/surya/surya_report/surya_report_RuleWhitelistInvariantStorage.sol.md
@@ -5,7 +5,7 @@
| File Name | SHA-1 Hash |
|-------------|--------------|
-| ./rules/validation/abstract/RuleAddressSet/invariantStorage/RuleWhitelistInvariantStorage.sol | 47459cd64d53f9b0596944655f6950b5b6fc3833 |
+| ./rules/validation/abstract/RuleAddressSet/invariantStorage/RuleWhitelistInvariantStorage.sol | 3f3d8473cd932de92f68cbbee4ce822d622719a3 |
### Contracts Description Table
@@ -15,7 +15,7 @@
|:----------:|:-------------------:|:----------------:|:----------------:|:---------------:|
| └ | **Function Name** | **Visibility** | **Mutability** | **Modifiers** |
||||||
-| **RuleWhitelistInvariantStorage** | Implementation | RuleCommonInvariantStorage |||
+| **RuleWhitelistInvariantStorage** | Implementation | RuleSharedInvariantStorage |||
### Legend
diff --git a/doc/surya/surya_report/surya_report_RuleWhitelistShared.sol.md b/doc/surya/surya_report/surya_report_RuleWhitelistShared.sol.md
index 649e63c..f0fc863 100644
--- a/doc/surya/surya_report/surya_report_RuleWhitelistShared.sol.md
+++ b/doc/surya/surya_report/surya_report_RuleWhitelistShared.sol.md
@@ -5,7 +5,7 @@
| File Name | SHA-1 Hash |
|-------------|--------------|
-| ./rules/validation/abstract/core/RuleWhitelistShared.sol | 068fbec610ae8b20c344210f9fcb6d52c5a7f088 |
+| ./rules/validation/abstract/core/RuleWhitelistShared.sol | 32ad86781e49207c99a45a2866f1bd76fff3c1f0 |
### Contracts Description Table
diff --git a/doc/surya/surya_report/surya_report_RuleWhitelistWrapper.sol.md b/doc/surya/surya_report/surya_report_RuleWhitelistWrapper.sol.md
index c535b69..1fa327b 100644
--- a/doc/surya/surya_report/surya_report_RuleWhitelistWrapper.sol.md
+++ b/doc/surya/surya_report/surya_report_RuleWhitelistWrapper.sol.md
@@ -5,7 +5,7 @@
| File Name | SHA-1 Hash |
|-------------|--------------|
-| ./rules/validation/deployment/RuleWhitelistWrapper.sol | 26f6fc8fe45b000d217b180687bf19434356cb51 |
+| ./rules/validation/deployment/RuleWhitelistWrapper.sol | b3a545c03fcd77815fe7ed2675827303ecc734d3 |
### Contracts Description Table
diff --git a/doc/surya/surya_report/surya_report_RuleWhitelistWrapperBase.sol.md b/doc/surya/surya_report/surya_report_RuleWhitelistWrapperBase.sol.md
index 0c76e98..a704d91 100644
--- a/doc/surya/surya_report/surya_report_RuleWhitelistWrapperBase.sol.md
+++ b/doc/surya/surya_report/surya_report_RuleWhitelistWrapperBase.sol.md
@@ -5,7 +5,7 @@
| File Name | SHA-1 Hash |
|-------------|--------------|
-| ./rules/validation/abstract/base/RuleWhitelistWrapperBase.sol | 97ce428d5969d44b79f0432f741c2fd188190cec |
+| ./rules/validation/abstract/base/RuleWhitelistWrapperBase.sol | b7d69ae4c5ff3d95b75a3c86e104a1deaf1fb834 |
### Contracts Description Table
diff --git a/doc/surya/surya_report/surya_report_RuleWhitelistWrapperHarnessInternal.sol.md b/doc/surya/surya_report/surya_report_RuleWhitelistWrapperHarnessInternal.sol.md
new file mode 100644
index 0000000..bb09dc6
--- /dev/null
+++ b/doc/surya/surya_report/surya_report_RuleWhitelistWrapperHarnessInternal.sol.md
@@ -0,0 +1,28 @@
+## Sūrya's Description Report
+
+### Files Description Table
+
+
+| File Name | SHA-1 Hash |
+|-------------|--------------|
+| ./mocks/harness/RuleWhitelistWrapperHarnessInternal.sol | 9b23d0a69ee6fd159072911d447c37fe54e42610 |
+
+
+### Contracts Description Table
+
+
+| Contract | Type | Bases | | |
+|:----------:|:-------------------:|:----------------:|:----------------:|:---------------:|
+| └ | **Function Name** | **Visibility** | **Mutability** | **Modifiers** |
+||||||
+| **RuleWhitelistWrapperHarnessInternal** | Implementation | RuleWhitelistWrapper |||
+| └ | | Public ❗️ | 🛑 | RuleWhitelistWrapper |
+| └ | exposedTransferredSpenderInternal | External ❗️ | |NO❗️ |
+
+
+### Legend
+
+| Symbol | Meaning |
+|:--------:|-----------|
+| 🛑 | Function can modify state |
+| 💵 | Function is payable |
diff --git a/doc/surya/surya_report/surya_report_RuleWhitelistWrapperOwnable2Step.sol.md b/doc/surya/surya_report/surya_report_RuleWhitelistWrapperOwnable2Step.sol.md
index 3efef57..c4d00e7 100644
--- a/doc/surya/surya_report/surya_report_RuleWhitelistWrapperOwnable2Step.sol.md
+++ b/doc/surya/surya_report/surya_report_RuleWhitelistWrapperOwnable2Step.sol.md
@@ -5,7 +5,7 @@
| File Name | SHA-1 Hash |
|-------------|--------------|
-| ./rules/validation/deployment/RuleWhitelistWrapperOwnable2Step.sol | 4a0c970391c25af7e865ff070db90e93590e1862 |
+| ./rules/validation/deployment/RuleWhitelistWrapperOwnable2Step.sol | ddd7eb760481cd54f2fad6b3665c93e460ba61e6 |
### Contracts Description Table
diff --git a/doc/surya/surya_report/surya_report_SanctionListOracle.sol.md b/doc/surya/surya_report/surya_report_SanctionListOracle.sol.md
new file mode 100644
index 0000000..a167801
--- /dev/null
+++ b/doc/surya/surya_report/surya_report_SanctionListOracle.sol.md
@@ -0,0 +1,29 @@
+## Sūrya's Description Report
+
+### Files Description Table
+
+
+| File Name | SHA-1 Hash |
+|-------------|--------------|
+| ./mocks/SanctionListOracle.sol | c3ba0148abb353bd935ec7c914c7e3c28e245a2f |
+
+
+### Contracts Description Table
+
+
+| Contract | Type | Bases | | |
+|:----------:|:-------------------:|:----------------:|:----------------:|:---------------:|
+| └ | **Function Name** | **Visibility** | **Mutability** | **Modifiers** |
+||||||
+| **SanctionListOracle** | Implementation | ISanctionsList |||
+| └ | addToSanctionsList | Public ❗️ | 🛑 |NO❗️ |
+| └ | removeFromSanctionsList | Public ❗️ | 🛑 |NO❗️ |
+| └ | isSanctioned | Public ❗️ | |NO❗️ |
+
+
+### Legend
+
+| Symbol | Meaning |
+|:--------:|-----------|
+| 🛑 | Function can modify state |
+| 💵 | Function is payable |
diff --git a/doc/surya/surya_report/surya_report_TotalSupplyMock.sol.md b/doc/surya/surya_report/surya_report_TotalSupplyMock.sol.md
new file mode 100644
index 0000000..678f202
--- /dev/null
+++ b/doc/surya/surya_report/surya_report_TotalSupplyMock.sol.md
@@ -0,0 +1,28 @@
+## Sūrya's Description Report
+
+### Files Description Table
+
+
+| File Name | SHA-1 Hash |
+|-------------|--------------|
+| ./mocks/TotalSupplyMock.sol | 200ea8b14c36b646b38d1487be97223685750a0f |
+
+
+### Contracts Description Table
+
+
+| Contract | Type | Bases | | |
+|:----------:|:-------------------:|:----------------:|:----------------:|:---------------:|
+| └ | **Function Name** | **Visibility** | **Mutability** | **Modifiers** |
+||||||
+| **TotalSupplyMock** | Implementation | |||
+| └ | totalSupply | External ❗️ | |NO❗️ |
+| └ | setTotalSupply | External ❗️ | 🛑 |NO❗️ |
+
+
+### Legend
+
+| Symbol | Meaning |
+|:--------:|-----------|
+| 🛑 | Function can modify state |
+| 💵 | Function is payable |
diff --git a/doc/technical/RuleSpenderWhitelist.md b/doc/technical/RuleSpenderWhitelist.md
new file mode 100644
index 0000000..bf3281f
--- /dev/null
+++ b/doc/technical/RuleSpenderWhitelist.md
@@ -0,0 +1,65 @@
+# Rule SpenderWhitelist
+
+[TOC]
+
+This rule restricts only spender-initiated transfers (`transferFrom`): the spender must be listed in an internal whitelist. Regular transfers (`transfer`) are always accepted by this rule.
+
+## Configuration
+
+### Constructor parameters
+
+| Parameter | Description |
+| --- | --- |
+| `admin` / `owner` | Access-control authority (`AccessControlEnumerable` or `Ownable2Step` variant) |
+| `forwarderIrrevocable` | ERC-2771 trusted forwarder address for meta-transactions (use `address(0)` to disable) |
+
+## Schema
+
+### Graph
+
+
+
+### Inheritance
+
+
+
+## Restriction codes
+
+| Constant | Code | Meaning |
+| --- | --- | --- |
+| `CODE_ADDRESS_SPENDER_NOT_WHITELISTED` | 66 | `transferFrom` spender is not in the whitelist |
+
+## Access control
+
+### AccessControlEnumerable variant (`RuleSpenderWhitelist`)
+
+| Role | Description |
+| --- | --- |
+| `DEFAULT_ADMIN_ROLE` | Manages all roles |
+| `ADDRESS_LIST_ADD_ROLE` | May add spenders (`addAddress`, `addAddresses`) |
+| `ADDRESS_LIST_REMOVE_ROLE` | May remove spenders (`removeAddress`, `removeAddresses`) |
+
+### Ownable2Step variant (`RuleSpenderWhitelistOwnable2Step`)
+
+Owner can manage the spender list and transfer ownership with two-step acceptance.
+
+## Behavior
+
+### Direct transfer path
+
+`detectTransferRestriction(from, to, value)` always returns `TRANSFER_OK`.
+`transferred(from, to, value)` is a no-op and never reverts.
+
+### Spender path (`transferFrom`)
+
+`detectTransferRestrictionFrom(spender, from, to, value)` returns:
+- `66` if `spender` is not listed
+- `0` otherwise
+
+`transferred(spender, from, to, value)` reverts with `RuleSpenderWhitelist_InvalidTransferFrom` when the spender is not listed.
+
+## Notes
+
+- The rule does not validate `from` or `to` addresses.
+- The rule also supports ERC-7943 tokenId/context overloads through `RuleNFTAdapter`.
+- Batch add/remove follows the project convention: skips duplicates/missing entries without reverting.
diff --git a/script/DeployCMTATWithBlacklist.s.sol b/script/DeployCMTATWithBlacklist.s.sol
index 0e9a517..67b819a 100644
--- a/script/DeployCMTATWithBlacklist.s.sol
+++ b/script/DeployCMTATWithBlacklist.s.sol
@@ -8,10 +8,7 @@ import {IRuleEngine} from "CMTAT/interfaces/engine/IRuleEngine.sol";
import {RuleBlacklist} from "src/rules/validation/deployment/RuleBlacklist.sol";
contract DeployCMTATWithBlacklist is Script {
- function deploy(address admin, address forwarder)
- public
- returns (CMTATStandalone token, RuleBlacklist rule)
- {
+ function deploy(address admin, address forwarder) public returns (CMTATStandalone token, RuleBlacklist rule) {
ICMTATConstructor.ERC20Attributes memory erc20Attributes =
ICMTATConstructor.ERC20Attributes("CMTA Token", "CMTAT", 0);
ICMTATConstructor.ExtraInformationAttributes memory extraInformationAttributes =
diff --git a/test/utils/IdentityRegistryMock.sol b/src/mocks/IdentityRegistryMock.sol
similarity index 100%
rename from test/utils/IdentityRegistryMock.sol
rename to src/mocks/IdentityRegistryMock.sol
diff --git a/src/mocks/MockERC20TransferFromFalse.sol b/src/mocks/MockERC20TransferFromFalse.sol
new file mode 100644
index 0000000..9148545
--- /dev/null
+++ b/src/mocks/MockERC20TransferFromFalse.sol
@@ -0,0 +1,18 @@
+// SPDX-License-Identifier: MPL-2.0
+pragma solidity ^0.8.20;
+
+contract MockERC20TransferFromFalse {
+ mapping(address => mapping(address => uint256)) private _allowances;
+
+ function setAllowance(address owner, address spender, uint256 value) external {
+ _allowances[owner][spender] = value;
+ }
+
+ function allowance(address owner, address spender) external view returns (uint256) {
+ return _allowances[owner][spender];
+ }
+
+ function transferFrom(address, address, uint256) external pure returns (bool) {
+ return false;
+ }
+}
diff --git a/src/mocks/MockERC20WithTransferContext.sol b/src/mocks/MockERC20WithTransferContext.sol
new file mode 100644
index 0000000..aac490d
--- /dev/null
+++ b/src/mocks/MockERC20WithTransferContext.sol
@@ -0,0 +1,94 @@
+// SPDX-License-Identifier: MPL-2.0
+pragma solidity ^0.8.20;
+
+import {ERC20} from "OZ/token/ERC20/ERC20.sol";
+import {ITransferContext} from "src/rules/interfaces/ITransferContext.sol";
+
+contract MockERC20WithTransferContext is ERC20 {
+ ITransferContext public rule;
+
+ constructor(string memory name_, string memory symbol_) ERC20(name_, symbol_) {}
+
+ function setRule(address rule_) external {
+ rule = ITransferContext(rule_);
+ }
+
+ function mint(address to, uint256 value) external {
+ _mint(to, value);
+ }
+
+ function transfer(address to, uint256 value) public virtual override returns (bool) {
+ bool success = super.transfer(to, value);
+ _notifyFungible(_msgSender(), _msgSender(), to, value);
+ return success;
+ }
+
+ function transferFrom(address from, address to, uint256 value) public virtual override returns (bool) {
+ address sender = _msgSender();
+ bool success = super.transferFrom(from, to, value);
+ _notifyFungible(sender, from, to, value);
+ return success;
+ }
+
+ function transferWithContext(address to, uint256 value, bool useFungibleContext, uint256 tokenId)
+ external
+ returns (bool)
+ {
+ _transfer(_msgSender(), to, value);
+ if (useFungibleContext) {
+ _notifyFungible(_msgSender(), _msgSender(), to, value);
+ } else {
+ _notifyMultiToken(_msgSender(), _msgSender(), to, value, tokenId);
+ }
+ return true;
+ }
+
+ function transferFromWithContext(address from, address to, uint256 value, bool useFungibleContext, uint256 tokenId)
+ external
+ returns (bool)
+ {
+ address sender = _msgSender();
+ _spendAllowance(from, sender, value);
+ _transfer(from, to, value);
+
+ if (useFungibleContext) {
+ _notifyFungible(sender, from, to, value);
+ } else {
+ _notifyMultiToken(sender, from, to, value, tokenId);
+ }
+ return true;
+ }
+
+ function _notifyFungible(address sender, address from, address to, uint256 value) internal {
+ if (address(rule) == address(0)) {
+ return;
+ }
+
+ ITransferContext.FungibleTransferContext memory ctx = ITransferContext.FungibleTransferContext({
+ selector: sender == from ? this.transfer.selector : this.transferFrom.selector,
+ sender: sender,
+ from: from,
+ to: to,
+ value: value,
+ data: ""
+ });
+ rule.transferred(ctx);
+ }
+
+ function _notifyMultiToken(address sender, address from, address to, uint256 value, uint256 tokenId) internal {
+ if (address(rule) == address(0)) {
+ return;
+ }
+
+ ITransferContext.MultiTokenTransferContext memory ctx = ITransferContext.MultiTokenTransferContext({
+ selector: sender == from ? this.transfer.selector : this.transferFrom.selector,
+ sender: sender,
+ from: from,
+ to: to,
+ value: value,
+ tokenId: tokenId,
+ data: ""
+ });
+ rule.transferred(ctx);
+ }
+}
diff --git a/src/mocks/MockERC721WithTransferContext.sol b/src/mocks/MockERC721WithTransferContext.sol
new file mode 100644
index 0000000..38b0977
--- /dev/null
+++ b/src/mocks/MockERC721WithTransferContext.sol
@@ -0,0 +1,42 @@
+// SPDX-License-Identifier: MPL-2.0
+pragma solidity ^0.8.20;
+
+import {ERC721} from "OZ/token/ERC721/ERC721.sol";
+import {ITransferContext} from "src/rules/interfaces/ITransferContext.sol";
+
+contract MockERC721WithTransferContext is ERC721 {
+ ITransferContext public rule;
+
+ constructor(string memory name_, string memory symbol_) ERC721(name_, symbol_) {}
+
+ function setRule(address rule_) external {
+ rule = ITransferContext(rule_);
+ }
+
+ function mint(address to, uint256 tokenId) external {
+ _mint(to, tokenId);
+ }
+
+ function transferFrom(address from, address to, uint256 tokenId) public virtual override {
+ address sender = _msgSender();
+ super.transferFrom(from, to, tokenId);
+ _notifyRule(sender, from, to, tokenId);
+ }
+
+ function _notifyRule(address sender, address from, address to, uint256 tokenId) internal {
+ if (address(rule) == address(0)) {
+ return;
+ }
+
+ ITransferContext.MultiTokenTransferContext memory ctx = ITransferContext.MultiTokenTransferContext({
+ selector: this.transferFrom.selector,
+ sender: sender,
+ from: from,
+ to: to,
+ value: 1,
+ tokenId: tokenId,
+ data: ""
+ });
+ rule.transferred(ctx);
+ }
+}
diff --git a/test/utils/SanctionListOracle.sol b/src/mocks/SanctionListOracle.sol
similarity index 64%
rename from test/utils/SanctionListOracle.sol
rename to src/mocks/SanctionListOracle.sol
index 1eab28a..b81a377 100644
--- a/test/utils/SanctionListOracle.sol
+++ b/src/mocks/SanctionListOracle.sol
@@ -1,15 +1,9 @@
// SPDX-License-Identifier: MPL-2.0
pragma solidity ^0.8.20;
-import {ISanctionsList} from "../../src/rules/interfaces/ISanctionsList.sol";
-/**
- * @notice Test contract from
- * https://etherscan.io/address/0x40c57923924b5c5c5455c48d93317139addac8fb#code
- */
+import {ISanctionsList} from "src/rules/interfaces/ISanctionsList.sol";
contract SanctionListOracle is ISanctionsList {
- constructor() {}
-
mapping(address => bool) private sanctionedAddresses;
function addToSanctionsList(address newSanction) public {
@@ -21,6 +15,6 @@ contract SanctionListOracle is ISanctionsList {
}
function isSanctioned(address addr) public view returns (bool) {
- return sanctionedAddresses[addr] == true;
+ return sanctionedAddresses[addr];
}
}
diff --git a/test/utils/TotalSupplyMock.sol b/src/mocks/TotalSupplyMock.sol
similarity index 100%
rename from test/utils/TotalSupplyMock.sol
rename to src/mocks/TotalSupplyMock.sol
diff --git a/src/mocks/harness/DeploymentCoverageHarnesses.sol b/src/mocks/harness/DeploymentCoverageHarnesses.sol
new file mode 100644
index 0000000..d3e3d17
--- /dev/null
+++ b/src/mocks/harness/DeploymentCoverageHarnesses.sol
@@ -0,0 +1,95 @@
+// SPDX-License-Identifier: MPL-2.0
+pragma solidity ^0.8.20;
+
+import {ISanctionsList} from "src/rules/interfaces/ISanctionsList.sol";
+import {RuleBlacklist} from "src/rules/validation/deployment/RuleBlacklist.sol";
+import {RuleWhitelist} from "src/rules/validation/deployment/RuleWhitelist.sol";
+import {RuleWhitelistWrapper} from "src/rules/validation/deployment/RuleWhitelistWrapper.sol";
+import {RuleERC2980} from "src/rules/validation/deployment/RuleERC2980.sol";
+import {RuleSanctionsList} from "src/rules/validation/deployment/RuleSanctionsList.sol";
+import {RuleBlacklistOwnable2Step} from "src/rules/validation/deployment/RuleBlacklistOwnable2Step.sol";
+import {RuleWhitelistOwnable2Step} from "src/rules/validation/deployment/RuleWhitelistOwnable2Step.sol";
+import {RuleWhitelistWrapperOwnable2Step} from "src/rules/validation/deployment/RuleWhitelistWrapperOwnable2Step.sol";
+import {RuleERC2980Ownable2Step} from "src/rules/validation/deployment/RuleERC2980Ownable2Step.sol";
+
+contract RuleBlacklistHarness is RuleBlacklist {
+ constructor(address admin, address forwarderIrrevocable) RuleBlacklist(admin, forwarderIrrevocable) {}
+
+ function exposedMsgDataLength() external view returns (uint256) {
+ return _msgData().length;
+ }
+}
+
+contract RuleWhitelistHarness is RuleWhitelist {
+ constructor(address admin, address forwarderIrrevocable, bool checkSpender_)
+ RuleWhitelist(admin, forwarderIrrevocable, checkSpender_)
+ {}
+
+ function exposedMsgDataLength() external view returns (uint256) {
+ return _msgData().length;
+ }
+}
+
+contract RuleWhitelistWrapperHarness is RuleWhitelistWrapper {
+ constructor(address admin, address forwarderIrrevocable, bool checkSpender_)
+ RuleWhitelistWrapper(admin, forwarderIrrevocable, checkSpender_)
+ {}
+
+ function exposedMsgDataLength() external view returns (uint256) {
+ return _msgData().length;
+ }
+}
+
+contract RuleERC2980Harness is RuleERC2980 {
+ constructor(address admin, address forwarderIrrevocable) RuleERC2980(admin, forwarderIrrevocable) {}
+
+ function exposedMsgDataLength() external view returns (uint256) {
+ return _msgData().length;
+ }
+}
+
+contract RuleSanctionsListHarness is RuleSanctionsList {
+ constructor(address admin, address forwarderIrrevocable, ISanctionsList sanctionContractOracle_)
+ RuleSanctionsList(admin, forwarderIrrevocable, sanctionContractOracle_)
+ {}
+
+ function exposedMsgDataLength() external view returns (uint256) {
+ return _msgData().length;
+ }
+}
+
+contract RuleBlacklistOwnable2StepHarness is RuleBlacklistOwnable2Step {
+ constructor(address owner, address forwarderIrrevocable) RuleBlacklistOwnable2Step(owner, forwarderIrrevocable) {}
+
+ function exposedMsgDataLength() external view returns (uint256) {
+ return _msgData().length;
+ }
+}
+
+contract RuleWhitelistOwnable2StepHarness is RuleWhitelistOwnable2Step {
+ constructor(address owner, address forwarderIrrevocable, bool checkSpender_)
+ RuleWhitelistOwnable2Step(owner, forwarderIrrevocable, checkSpender_)
+ {}
+
+ function exposedMsgDataLength() external view returns (uint256) {
+ return _msgData().length;
+ }
+}
+
+contract RuleWhitelistWrapperOwnable2StepHarness is RuleWhitelistWrapperOwnable2Step {
+ constructor(address owner, address forwarderIrrevocable, bool checkSpender_)
+ RuleWhitelistWrapperOwnable2Step(owner, forwarderIrrevocable, checkSpender_)
+ {}
+
+ function exposedMsgDataLength() external view returns (uint256) {
+ return _msgData().length;
+ }
+}
+
+contract RuleERC2980Ownable2StepHarness is RuleERC2980Ownable2Step {
+ constructor(address owner, address forwarderIrrevocable) RuleERC2980Ownable2Step(owner, forwarderIrrevocable) {}
+
+ function exposedMsgDataLength() external view returns (uint256) {
+ return _msgData().length;
+ }
+}
diff --git a/src/mocks/harness/RuleSanctionsListOwnable2StepHarness.sol b/src/mocks/harness/RuleSanctionsListOwnable2StepHarness.sol
new file mode 100644
index 0000000..8584253
--- /dev/null
+++ b/src/mocks/harness/RuleSanctionsListOwnable2StepHarness.sol
@@ -0,0 +1,23 @@
+// SPDX-License-Identifier: MPL-2.0
+pragma solidity ^0.8.20;
+
+import {ISanctionsList} from "src/rules/interfaces/ISanctionsList.sol";
+import {RuleSanctionsListOwnable2Step} from "src/rules/validation/deployment/RuleSanctionsListOwnable2Step.sol";
+
+contract RuleSanctionsListOwnable2StepHarness is RuleSanctionsListOwnable2Step {
+ constructor(address owner, address forwarderIrrevocable, ISanctionsList sanctionContractOracle_)
+ RuleSanctionsListOwnable2Step(owner, forwarderIrrevocable, sanctionContractOracle_)
+ {}
+
+ function exposedMsgSender() external view returns (address) {
+ return _msgSender();
+ }
+
+ function exposedMsgData() external view returns (bytes memory) {
+ return _msgData();
+ }
+
+ function exposedContextSuffixLength() external view returns (uint256) {
+ return _contextSuffixLength();
+ }
+}
diff --git a/src/mocks/harness/RuleSpenderWhitelistHarnesses.sol b/src/mocks/harness/RuleSpenderWhitelistHarnesses.sol
new file mode 100644
index 0000000..a6095d9
--- /dev/null
+++ b/src/mocks/harness/RuleSpenderWhitelistHarnesses.sol
@@ -0,0 +1,39 @@
+// SPDX-License-Identifier: MPL-2.0
+pragma solidity ^0.8.20;
+
+import {RuleSpenderWhitelist} from "src/rules/validation/deployment/RuleSpenderWhitelist.sol";
+import {RuleSpenderWhitelistOwnable2Step} from "src/rules/validation/deployment/RuleSpenderWhitelistOwnable2Step.sol";
+
+contract RuleSpenderWhitelistHarness is RuleSpenderWhitelist {
+ constructor(address admin, address forwarderIrrevocable) RuleSpenderWhitelist(admin, forwarderIrrevocable) {}
+
+ function exposedMsgSender() external view returns (address) {
+ return _msgSender();
+ }
+
+ function exposedMsgData() external view returns (bytes memory) {
+ return _msgData();
+ }
+
+ function exposedContextSuffixLength() external view returns (uint256) {
+ return _contextSuffixLength();
+ }
+}
+
+contract RuleSpenderWhitelistOwnable2StepHarness is RuleSpenderWhitelistOwnable2Step {
+ constructor(address owner, address forwarderIrrevocable)
+ RuleSpenderWhitelistOwnable2Step(owner, forwarderIrrevocable)
+ {}
+
+ function exposedMsgSender() external view returns (address) {
+ return _msgSender();
+ }
+
+ function exposedMsgData() external view returns (bytes memory) {
+ return _msgData();
+ }
+
+ function exposedContextSuffixLength() external view returns (uint256) {
+ return _contextSuffixLength();
+ }
+}
diff --git a/src/mocks/harness/RuleWhitelistWrapperHarnessInternal.sol b/src/mocks/harness/RuleWhitelistWrapperHarnessInternal.sol
new file mode 100644
index 0000000..36a74ab
--- /dev/null
+++ b/src/mocks/harness/RuleWhitelistWrapperHarnessInternal.sol
@@ -0,0 +1,14 @@
+// SPDX-License-Identifier: MPL-2.0
+pragma solidity ^0.8.20;
+
+import {RuleWhitelistWrapper} from "src/rules/validation/deployment/RuleWhitelistWrapper.sol";
+
+contract RuleWhitelistWrapperHarnessInternal is RuleWhitelistWrapper {
+ constructor(address admin, address forwarderIrrevocable, bool checkSpender_)
+ RuleWhitelistWrapper(admin, forwarderIrrevocable, checkSpender_)
+ {}
+
+ function exposedTransferredSpenderInternal(address spender, address from, address to, uint256 value) external view {
+ _transferred(spender, from, to, value);
+ }
+}
diff --git a/src/rules/interfaces/IAddressList.sol b/src/rules/interfaces/IAddressList.sol
index 135c468..a2e7173 100644
--- a/src/rules/interfaces/IAddressList.sol
+++ b/src/rules/interfaces/IAddressList.sol
@@ -9,12 +9,10 @@ interface IAddressList is IIdentityRegistryContains {
/// @param targetAddresses The array of added addresses.
event AddAddresses(address[] targetAddresses);
-
/// @notice Emitted when multiple addresses are removed.
/// @param targetAddresses The array of removed addresses.
event RemoveAddresses(address[] targetAddresses);
-
/// @notice Emitted when a single address is added.
/// @param targetAddress The added address.
event AddAddress(address indexed targetAddress);
diff --git a/src/rules/interfaces/IERC7943NonFungibleCompliance.sol b/src/rules/interfaces/IERC7943NonFungibleCompliance.sol
index 5807cb7..05cd3f9 100644
--- a/src/rules/interfaces/IERC7943NonFungibleCompliance.sol
+++ b/src/rules/interfaces/IERC7943NonFungibleCompliance.sol
@@ -28,10 +28,7 @@ interface IERC7943NonFungibleCompliance {
* @param amount The amount being transferred (always `1` for ERC-721).
* @return allowed `true` if the transfer is permitted, otherwise `false`.
*/
- function canTransfer(address from, address to, uint256 tokenId, uint256 amount)
- external
- view
- returns (bool allowed);
+ function canTransfer(address from, address to, uint256 tokenId, uint256 amount) external view returns (bool allowed);
}
/**
diff --git a/src/rules/operation/RuleConditionalTransferLight.sol b/src/rules/operation/RuleConditionalTransferLight.sol
index e58a736..1d16d00 100644
--- a/src/rules/operation/RuleConditionalTransferLight.sol
+++ b/src/rules/operation/RuleConditionalTransferLight.sol
@@ -46,10 +46,7 @@ contract RuleConditionalTransferLight is
function _authorizeTransferApproval() internal view virtual override onlyRole(OPERATOR_ROLE) {}
function _authorizeTransferExecution() internal view virtual override {
- require(
- isTokenBound(_msgSender()),
- RuleConditionalTransferLight_TransferExecutorUnauthorized(_msgSender())
- );
+ require(isTokenBound(_msgSender()), RuleConditionalTransferLight_TransferExecutorUnauthorized(_msgSender()));
}
function _onlyComplianceManager() internal virtual override onlyRole(COMPLIANCE_MANAGER_ROLE) {}
diff --git a/src/rules/operation/RuleConditionalTransferLightOwnable2Step.sol b/src/rules/operation/RuleConditionalTransferLightOwnable2Step.sol
index 926d660..6fcf88f 100644
--- a/src/rules/operation/RuleConditionalTransferLightOwnable2Step.sol
+++ b/src/rules/operation/RuleConditionalTransferLightOwnable2Step.sol
@@ -12,10 +12,7 @@ import {RuleConditionalTransferLightBase} from "./abstract/RuleConditionalTransf
* @title RuleConditionalTransferLightOwnable2Step
* @notice Ownable2Step variant of RuleConditionalTransferLight.
*/
-contract RuleConditionalTransferLightOwnable2Step is
- RuleConditionalTransferLightBase,
- Ownable2Step
-{
+contract RuleConditionalTransferLightOwnable2Step is RuleConditionalTransferLightBase, Ownable2Step {
constructor(address owner) Ownable(owner) {}
function supportsInterface(bytes4 interfaceId) public view override returns (bool) {
diff --git a/src/rules/operation/abstract/RuleConditionalTransferLightBase.sol b/src/rules/operation/abstract/RuleConditionalTransferLightBase.sol
index 209356a..3b0a9cb 100644
--- a/src/rules/operation/abstract/RuleConditionalTransferLightBase.sol
+++ b/src/rules/operation/abstract/RuleConditionalTransferLightBase.sol
@@ -8,9 +8,7 @@ import {IERC7551Compliance} from "CMTAT/interfaces/tokenization/draft-IERC7551.s
import {IRule} from "RuleEngine/interfaces/IRule.sol";
import {ITransferContext} from "../../interfaces/ITransferContext.sol";
import {IERC20} from "OZ/token/ERC20/IERC20.sol";
-import {
- RuleConditionalTransferLightInvariantStorage
-} from "./RuleConditionalTransferLightInvariantStorage.sol";
+import {RuleConditionalTransferLightInvariantStorage} from "./RuleConditionalTransferLightInvariantStorage.sol";
import {VersionModule} from "../../../modules/VersionModule.sol";
/**
@@ -18,7 +16,11 @@ import {VersionModule} from "../../../modules/VersionModule.sol";
* @dev Requires operator approval for each transfer. Same transfer (from, to, value)
* can be approved multiple times to allow repeated transfers.
*/
-abstract contract RuleConditionalTransferLightBase is VersionModule, RuleConditionalTransferLightInvariantStorage, IRule {
+abstract contract RuleConditionalTransferLightBase is
+ VersionModule,
+ RuleConditionalTransferLightInvariantStorage,
+ IRule
+{
// Mapping from transfer hash to approval count
mapping(bytes32 => uint256) public approvalCounts;
@@ -52,10 +54,7 @@ abstract contract RuleConditionalTransferLightBase is VersionModule, RuleConditi
approveTransfer(from, to, value);
uint256 allowed = IERC20(token).allowance(from, address(this));
- require(
- allowed >= value,
- RuleConditionalTransferLight_InsufficientAllowance(token, from, allowed, value)
- );
+ require(allowed >= value, RuleConditionalTransferLight_InsufficientAllowance(token, from, allowed, value));
bool success = IERC20(token).transferFrom(from, to, value);
require(success, RuleConditionalTransferLight_TransferFailed());
@@ -75,7 +74,13 @@ abstract contract RuleConditionalTransferLightBase is VersionModule, RuleConditi
_transferred(from, to, value);
}
- function transferred(address /* spender */, address from, address to, uint256 value)
+ function transferred(
+ address,
+ /* spender */
+ address from,
+ address to,
+ uint256 value
+ )
public
override(IRuleEngine)
onlyTransferExecutor
@@ -99,7 +104,13 @@ abstract contract RuleConditionalTransferLightBase is VersionModule, RuleConditi
return uint8(IERC1404Extend.REJECTED_CODE_BASE.TRANSFER_OK);
}
- function detectTransferRestrictionFrom(address /* spender */, address from, address to, uint256 value)
+ function detectTransferRestrictionFrom(
+ address,
+ /* spender */
+ address from,
+ address to,
+ uint256 value
+ )
public
view
override(IERC1404Extend)
@@ -165,7 +176,14 @@ abstract contract RuleConditionalTransferLightBase is VersionModule, RuleConditi
}
function _transferHash(address from, address to, uint256 value) internal pure virtual returns (bytes32 hash) {
- return keccak256(abi.encodePacked(from, to, value));
+ // Linter suggestion (`asm-keccak256`): hash packed values in assembly to avoid abi.encodePacked overhead.
+ assembly ("memory-safe") {
+ let ptr := mload(0x40)
+ mstore(ptr, shl(96, from))
+ mstore(add(ptr, 0x20), shl(96, to))
+ mstore(add(ptr, 0x40), value)
+ hash := keccak256(ptr, 0x60)
+ }
}
/*//////////////////////////////////////////////////////////////
diff --git a/src/rules/operation/abstract/RuleConditionalTransferLightInvariantStorage.sol b/src/rules/operation/abstract/RuleConditionalTransferLightInvariantStorage.sol
index 98eda28..83639b2 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");
@@ -13,10 +13,11 @@ abstract contract RuleConditionalTransferLightInvariantStorage is RuleCommonInva
uint8 public constant CODE_TRANSFER_REQUEST_NOT_APPROVED = 46;
/* ============ Custom error ============ */
- error RuleConditionalTransferLight_AdminAddressZeroNotAllowed();
error RuleConditionalTransferLight_TransferExecutorUnauthorized(address account);
error RuleConditionalTransferLight_TokenAddressZeroNotAllowed();
- error RuleConditionalTransferLight_InsufficientAllowance(address token, address owner, uint256 allowance, uint256 required);
+ error RuleConditionalTransferLight_InsufficientAllowance(
+ address token, address owner, uint256 allowance, uint256 required
+ );
error RuleConditionalTransferLight_TransferFailed();
error TransferNotApproved();
error TransferApprovalNotFound();
diff --git a/src/rules/validation/abstract/RuleAddressSet/RuleAddressSet.sol b/src/rules/validation/abstract/RuleAddressSet/RuleAddressSet.sol
index 2dd5b70..40e6e71 100644
--- a/src/rules/validation/abstract/RuleAddressSet/RuleAddressSet.sol
+++ b/src/rules/validation/abstract/RuleAddressSet/RuleAddressSet.sol
@@ -146,6 +146,7 @@ abstract contract RuleAddressSet is
results[i] = _isAddressListed(targetAddresses[i]);
}
}
+
/*//////////////////////////////////////////////////////////////
ERC-2771 META TX
//////////////////////////////////////////////////////////////*/
diff --git a/src/rules/validation/abstract/RuleAddressSet/RuleAddressSetInternal.sol b/src/rules/validation/abstract/RuleAddressSet/RuleAddressSetInternal.sol
index 92f600b..7ff5ae9 100644
--- a/src/rules/validation/abstract/RuleAddressSet/RuleAddressSetInternal.sol
+++ b/src/rules/validation/abstract/RuleAddressSet/RuleAddressSetInternal.sol
@@ -35,10 +35,7 @@ abstract contract RuleAddressSetInternal {
* @return added The number of newly added addresses.
* @return skipped The number of addresses that were already listed.
*/
- function _addAddresses(address[] calldata addressesToAdd)
- internal
- returns (uint256 added, uint256 skipped)
- {
+ function _addAddresses(address[] calldata addressesToAdd) internal returns (uint256 added, uint256 skipped) {
for (uint256 i = 0; i < addressesToAdd.length; ++i) {
if (_listedAddresses.add(addressesToAdd[i])) {
added += 1;
diff --git a/src/rules/validation/abstract/RuleAddressSet/invariantStorage/RuleBlacklistInvariantStorage.sol b/src/rules/validation/abstract/RuleAddressSet/invariantStorage/RuleBlacklistInvariantStorage.sol
index ff04735..02fa84a 100644
--- a/src/rules/validation/abstract/RuleAddressSet/invariantStorage/RuleBlacklistInvariantStorage.sol
+++ b/src/rules/validation/abstract/RuleAddressSet/invariantStorage/RuleBlacklistInvariantStorage.sol
@@ -2,11 +2,13 @@
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);
+ error RuleBlacklist_InvalidTransferFrom(
+ address rule, address spender, address from, address to, uint256 value, uint8 code
+ );
/* ============ String message ============ */
string constant TEXT_ADDRESS_FROM_IS_BLACKLISTED = "The sender is blacklisted";
diff --git a/src/rules/validation/abstract/RuleAddressSet/invariantStorage/RuleWhitelistInvariantStorage.sol b/src/rules/validation/abstract/RuleAddressSet/invariantStorage/RuleWhitelistInvariantStorage.sol
index be08159..eed9da1 100644
--- a/src/rules/validation/abstract/RuleAddressSet/invariantStorage/RuleWhitelistInvariantStorage.sol
+++ b/src/rules/validation/abstract/RuleAddressSet/invariantStorage/RuleWhitelistInvariantStorage.sol
@@ -2,11 +2,13 @@
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);
+ error RuleWhitelist_InvalidTransferFrom(
+ address rule, address spender, address from, address to, uint256 value, uint8 code
+ );
/* ============ String message ============ */
string constant TEXT_ADDRESS_FROM_NOT_WHITELISTED = "The sender is not in the whitelist";
@@ -19,9 +21,7 @@ abstract contract RuleWhitelistInvariantStorage is RuleCommonInvariantStorage {
uint8 public constant CODE_ADDRESS_TO_NOT_WHITELISTED = 22;
uint8 public constant CODE_ADDRESS_SPENDER_NOT_WHITELISTED = 23;
-
/* ============ Events ============ */
/// @dev Emitted when the `checkSpender` flag is updated.
event CheckSpenderUpdated(bool newValue);
-
}
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/base/RuleBlacklistBase.sol b/src/rules/validation/abstract/base/RuleBlacklistBase.sol
index 9b4dfca..9e6d32c 100644
--- a/src/rules/validation/abstract/base/RuleBlacklistBase.sol
+++ b/src/rules/validation/abstract/base/RuleBlacklistBase.sol
@@ -17,7 +17,11 @@ import {IRule} from "RuleEngine/interfaces/IRule.sol";
abstract contract RuleBlacklistBase is RuleAddressSet, RuleNFTAdapter, RuleBlacklistInvariantStorage {
constructor(address forwarderIrrevocable) RuleAddressSet(forwarderIrrevocable) {}
- function _detectTransferRestriction(address from, address to, uint256 /* value */ )
+ function _detectTransferRestriction(
+ address from,
+ address to,
+ uint256 /* value */
+ )
internal
view
override
@@ -110,12 +114,7 @@ abstract contract RuleBlacklistBase is RuleAddressSet, RuleNFTAdapter, RuleBlack
);
}
- function _transferredFrom(address spender, address from, address to, uint256 value)
- internal
- view
- virtual
- override
- {
+ function _transferredFrom(address spender, address from, address to, uint256 value) internal view virtual override {
uint8 code = _detectTransferRestrictionFrom(spender, from, to, value);
require(
code == uint8(REJECTED_CODE_BASE.TRANSFER_OK),
diff --git a/src/rules/validation/abstract/base/RuleERC2980Base.sol b/src/rules/validation/abstract/base/RuleERC2980Base.sol
index 3fe975f..247e64f 100644
--- a/src/rules/validation/abstract/base/RuleERC2980Base.sol
+++ b/src/rules/validation/abstract/base/RuleERC2980Base.sol
@@ -44,7 +44,11 @@ abstract contract RuleERC2980Base is
TRANSFER RESTRICTION LOGIC
//////////////////////////////////////////////////////////////*/
- function _detectTransferRestriction(address from, address to, uint256 /* value */ )
+ function _detectTransferRestriction(
+ address from,
+ address to,
+ uint256 /* value */
+ )
internal
view
virtual
@@ -107,12 +111,7 @@ abstract contract RuleERC2980Base is
);
}
- function _transferredFrom(address spender, address from, address to, uint256 value)
- internal
- view
- virtual
- override
- {
+ function _transferredFrom(address spender, address from, address to, uint256 value) internal view virtual override {
uint8 code = _detectTransferRestrictionFrom(spender, from, to, value);
require(
code == uint8(IERC1404Extend.REJECTED_CODE_BASE.TRANSFER_OK),
@@ -132,8 +131,7 @@ abstract contract RuleERC2980Base is
returns (bool)
{
return restrictionCode == CODE_ADDRESS_FROM_IS_FROZEN || restrictionCode == CODE_ADDRESS_TO_IS_FROZEN
- || restrictionCode == CODE_ADDRESS_SPENDER_IS_FROZEN
- || restrictionCode == CODE_ADDRESS_TO_NOT_WHITELISTED;
+ || restrictionCode == CODE_ADDRESS_SPENDER_IS_FROZEN || restrictionCode == CODE_ADDRESS_TO_NOT_WHITELISTED;
}
function messageForTransferRestriction(uint8 restrictionCode)
@@ -232,13 +230,7 @@ abstract contract RuleERC2980Base is
* @dev Reflects whitelist membership only. Frozen status is intentionally excluded:
* freezing is a temporary enforcement action and does not revoke identity verification.
*/
- function isVerified(address targetAddress)
- public
- view
- virtual
- override(IIdentityRegistryVerified)
- returns (bool)
- {
+ function isVerified(address targetAddress) public view virtual override(IIdentityRegistryVerified) returns (bool) {
return _isWhitelisted(targetAddress);
}
diff --git a/src/rules/validation/abstract/base/RuleIdentityRegistryBase.sol b/src/rules/validation/abstract/base/RuleIdentityRegistryBase.sol
index e99b776..31d400d 100644
--- a/src/rules/validation/abstract/base/RuleIdentityRegistryBase.sol
+++ b/src/rules/validation/abstract/base/RuleIdentityRegistryBase.sol
@@ -33,7 +33,11 @@ abstract contract RuleIdentityRegistryBase is RuleNFTAdapter, RuleIdentityRegist
emit IdentityRegistryUpdated(address(0));
}
- function _detectTransferRestriction(address from, address to, uint256 /* value */)
+ function _detectTransferRestriction(
+ address from,
+ address to,
+ uint256 /* value */
+ )
internal
view
override
@@ -73,19 +77,11 @@ abstract contract RuleIdentityRegistryBase is RuleNFTAdapter, RuleIdentityRegist
return _detectTransferRestriction(from, to, value);
}
- function transferred(address from, address to, uint256 value)
- public
- view
- override(IERC3643IComplianceContract)
- {
+ function transferred(address from, address to, uint256 value) public view override(IERC3643IComplianceContract) {
_transferred(from, to, value);
}
- function transferred(address spender, address from, address to, uint256 value)
- public
- view
- override(IRuleEngine)
- {
+ function transferred(address spender, address from, address to, uint256 value) public view override(IRuleEngine) {
_transferredFrom(spender, from, to, value);
}
@@ -97,12 +93,7 @@ abstract contract RuleIdentityRegistryBase is RuleNFTAdapter, RuleIdentityRegist
);
}
- function _transferredFrom(address spender, address from, address to, uint256 value)
- internal
- view
- virtual
- override
- {
+ function _transferredFrom(address spender, address from, address to, uint256 value) internal view virtual override {
uint8 code = _detectTransferRestrictionFrom(spender, from, to, value);
require(
code == uint8(IERC1404Extend.REJECTED_CODE_BASE.TRANSFER_OK),
diff --git a/src/rules/validation/abstract/base/RuleMaxTotalSupplyBase.sol b/src/rules/validation/abstract/base/RuleMaxTotalSupplyBase.sol
index 5ac6b80..55e07cd 100644
--- a/src/rules/validation/abstract/base/RuleMaxTotalSupplyBase.sol
+++ b/src/rules/validation/abstract/base/RuleMaxTotalSupplyBase.sol
@@ -34,7 +34,12 @@ abstract contract RuleMaxTotalSupplyBase is RuleTransferValidation, RuleMaxTotal
emit TokenContractUpdated(newTokenContract);
}
- function _detectTransferRestriction(address from, address /* to */, uint256 value)
+ function _detectTransferRestriction(
+ address from,
+ address,
+ /* to */
+ uint256 value
+ )
internal
view
override
@@ -58,19 +63,11 @@ abstract contract RuleMaxTotalSupplyBase is RuleTransferValidation, RuleMaxTotal
return _detectTransferRestriction(from, to, value);
}
- function transferred(address from, address to, uint256 value)
- public
- view
- override(IERC3643IComplianceContract)
- {
+ function transferred(address from, address to, uint256 value) public view override(IERC3643IComplianceContract) {
_transferred(from, to, value);
}
- function transferred(address spender, address from, address to, uint256 value)
- public
- view
- override(IRuleEngine)
- {
+ function transferred(address spender, address from, address to, uint256 value) public view override(IRuleEngine) {
_transferredFrom(spender, from, to, value);
}
diff --git a/src/rules/validation/abstract/base/RuleSanctionsListBase.sol b/src/rules/validation/abstract/base/RuleSanctionsListBase.sol
index 5685b7b..66ddb78 100644
--- a/src/rules/validation/abstract/base/RuleSanctionsListBase.sol
+++ b/src/rules/validation/abstract/base/RuleSanctionsListBase.sol
@@ -25,7 +25,11 @@ abstract contract RuleSanctionsListBase is MetaTxModuleStandalone, RuleNFTAdapte
}
}
- function _detectTransferRestriction(address from, address to, uint256 /* value */)
+ function _detectTransferRestriction(
+ address from,
+ address to,
+ uint256 /* value */
+ )
internal
view
override
@@ -87,19 +91,11 @@ abstract contract RuleSanctionsListBase is MetaTxModuleStandalone, RuleNFTAdapte
_setSanctionListOracle(ISanctionsList(address(0)));
}
- function transferred(address from, address to, uint256 value)
- public
- view
- override(IERC3643IComplianceContract)
- {
+ function transferred(address from, address to, uint256 value) public view override(IERC3643IComplianceContract) {
_transferred(from, to, value);
}
- function transferred(address spender, address from, address to, uint256 value)
- public
- view
- override(IRuleEngine)
- {
+ function transferred(address spender, address from, address to, uint256 value) public view override(IRuleEngine) {
_transferredFrom(spender, from, to, value);
}
@@ -111,12 +107,7 @@ abstract contract RuleSanctionsListBase is MetaTxModuleStandalone, RuleNFTAdapte
);
}
- function _transferredFrom(address spender, address from, address to, uint256 value)
- internal
- view
- virtual
- override
- {
+ function _transferredFrom(address spender, address from, address to, uint256 value) internal view virtual override {
uint8 code = _detectTransferRestrictionFrom(spender, from, to, value);
require(
code == uint8(IERC1404Extend.REJECTED_CODE_BASE.TRANSFER_OK),
diff --git a/src/rules/validation/abstract/base/RuleSpenderWhitelistBase.sol b/src/rules/validation/abstract/base/RuleSpenderWhitelistBase.sol
new file mode 100644
index 0000000..578e946
--- /dev/null
+++ b/src/rules/validation/abstract/base/RuleSpenderWhitelistBase.sol
@@ -0,0 +1,72 @@
+// SPDX-License-Identifier: MPL-2.0
+pragma solidity ^0.8.20;
+
+import {RuleAddressSet} from "../RuleAddressSet/RuleAddressSet.sol";
+import {RuleNFTAdapter} from "../core/RuleNFTAdapter.sol";
+import {RuleSpenderWhitelistInvariantStorage} from "../invariant/RuleSpenderWhitelistInvariantStorage.sol";
+import {IERC1404, IERC1404Extend} from "CMTAT/interfaces/tokenization/draft-IERC1404.sol";
+import {IERC3643IComplianceContract} from "CMTAT/interfaces/tokenization/IERC3643Partial.sol";
+import {IRuleEngine} from "CMTAT/interfaces/engine/IRuleEngine.sol";
+
+/**
+ * @title RuleSpenderWhitelistBase
+ * @notice Restricts `transferFrom`-style flows to whitelisted spenders only.
+ * @dev Direct transfers (`transferred(from,to,value)`) are intentionally no-op.
+ */
+abstract contract RuleSpenderWhitelistBase is RuleAddressSet, RuleNFTAdapter, RuleSpenderWhitelistInvariantStorage {
+ constructor(address forwarderIrrevocable) RuleAddressSet(forwarderIrrevocable) {}
+
+ function _detectTransferRestriction(address, address, uint256) internal pure virtual override returns (uint8) {
+ return uint8(IERC1404Extend.REJECTED_CODE_BASE.TRANSFER_OK);
+ }
+
+ function _detectTransferRestrictionFrom(address spender, address, address, uint256)
+ internal
+ view
+ virtual
+ override
+ returns (uint8)
+ {
+ if (spender != address(0) && !_isAddressListed(spender)) {
+ return CODE_ADDRESS_SPENDER_NOT_WHITELISTED;
+ }
+ return uint8(IERC1404Extend.REJECTED_CODE_BASE.TRANSFER_OK);
+ }
+
+ function canReturnTransferRestrictionCode(uint8 restrictionCode) external pure override returns (bool) {
+ return restrictionCode == CODE_ADDRESS_SPENDER_NOT_WHITELISTED;
+ }
+
+ function messageForTransferRestriction(uint8 restrictionCode)
+ public
+ pure
+ override(IERC1404)
+ returns (string memory)
+ {
+ if (restrictionCode == CODE_ADDRESS_SPENDER_NOT_WHITELISTED) {
+ return TEXT_ADDRESS_SPENDER_NOT_WHITELISTED;
+ }
+ return TEXT_CODE_NOT_FOUND;
+ }
+
+ /**
+ * @dev Regular transfers are always accepted by this rule.
+ */
+ function transferred(address, address, uint256) public view override(IERC3643IComplianceContract) {}
+
+ function transferred(address spender, address from, address to, uint256 value) public view override(IRuleEngine) {
+ _transferredFrom(spender, from, to, value);
+ }
+
+ function _transferred(address, address, uint256) internal view virtual override {
+ // no-op: regular transfers are intentionally ignored by this rule
+ }
+
+ function _transferredFrom(address spender, address from, address to, uint256 value) internal view virtual override {
+ uint8 code = _detectTransferRestrictionFrom(spender, from, to, value);
+ require(
+ code == uint8(IERC1404Extend.REJECTED_CODE_BASE.TRANSFER_OK),
+ RuleSpenderWhitelist_InvalidTransferFrom(address(this), spender, from, to, value, code)
+ );
+ }
+}
diff --git a/src/rules/validation/abstract/base/RuleWhitelistBase.sol b/src/rules/validation/abstract/base/RuleWhitelistBase.sol
index 7e19c4c..570f6a9 100644
--- a/src/rules/validation/abstract/base/RuleWhitelistBase.sol
+++ b/src/rules/validation/abstract/base/RuleWhitelistBase.sol
@@ -4,7 +4,6 @@ pragma solidity ^0.8.20;
import {RuleAddressSet} from "../RuleAddressSet/RuleAddressSet.sol";
import {RuleWhitelistShared} from "../core/RuleWhitelistShared.sol";
import {RuleTransferValidation} from "../core/RuleTransferValidation.sol";
-import {IERC1404Extend} from "CMTAT/interfaces/tokenization/draft-IERC1404.sol";
import {IIdentityRegistryVerified} from "../../../interfaces/IIdentityRegistry.sol";
/**
@@ -16,7 +15,11 @@ abstract contract RuleWhitelistBase is RuleAddressSet, RuleWhitelistShared, IIde
checkSpender = checkSpender_;
}
- function _detectTransferRestriction(address from, address to, uint256 /* value */ )
+ function _detectTransferRestriction(
+ address from,
+ address to,
+ uint256 /* value */
+ )
internal
view
virtual
@@ -44,7 +47,6 @@ abstract contract RuleWhitelistBase is RuleAddressSet, RuleWhitelistShared, IIde
return _detectTransferRestriction(from, to, value);
}
-
function isVerified(address targetAddress)
public
view
diff --git a/src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol b/src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol
index 852ca08..f522e3a 100644
--- a/src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol
+++ b/src/rules/validation/abstract/base/RuleWhitelistWrapperBase.sol
@@ -11,8 +11,6 @@ import {RuleWhitelistShared} from "../core/RuleWhitelistShared.sol";
import {RuleTransferValidation} from "../core/RuleTransferValidation.sol";
/* ==== RuleEngine === */
import {RulesManagementModule} from "RuleEngine/modules/RulesManagementModule.sol";
-/* ==== CMTAT === */
-import {IERC1404, IERC1404Extend} from "CMTAT/interfaces/tokenization/draft-IERC1404.sol";
/* ==== Interfaces === */
import {IAddressList} from "../../../interfaces/IAddressList.sol";
import {IIdentityRegistryVerified} from "../../../interfaces/IIdentityRegistry.sol";
@@ -33,9 +31,7 @@ abstract contract RuleWhitelistWrapperBase is
/**
* @param forwarderIrrevocable Address of the forwarder, required for the gasless support
*/
- constructor(address forwarderIrrevocable, bool checkSpender_)
- MetaTxModuleStandalone(forwarderIrrevocable)
- {
+ constructor(address forwarderIrrevocable, bool checkSpender_) MetaTxModuleStandalone(forwarderIrrevocable) {
checkSpender = checkSpender_;
}
@@ -47,7 +43,11 @@ abstract contract RuleWhitelistWrapperBase is
* @return The restricion code or REJECTED_CODE_BASE.TRANSFER_OK
*
*/
- function _detectTransferRestriction(address from, address to, uint256 /* value */)
+ function _detectTransferRestriction(
+ address from,
+ address to,
+ uint256 /* value */
+ )
internal
view
virtual
@@ -113,13 +113,7 @@ abstract contract RuleWhitelistWrapperBase is
* @notice Returns true if the address is listed in at least one child whitelist rule.
* @dev Delegates to the same child-rule scan used by transfer restriction checks.
*/
- function isVerified(address targetAddress)
- public
- view
- virtual
- override(IIdentityRegistryVerified)
- returns (bool)
- {
+ function isVerified(address targetAddress) public view virtual override(IIdentityRegistryVerified) returns (bool) {
address[] memory targets = new address[](1);
targets[0] = targetAddress;
bool[] memory result = _detectTransferRestrictionForTargets(targets);
diff --git a/src/rules/validation/abstract/core/RuleNFTAdapter.sol b/src/rules/validation/abstract/core/RuleNFTAdapter.sol
index 0be7ddb..c9f50a8 100644
--- a/src/rules/validation/abstract/core/RuleNFTAdapter.sol
+++ b/src/rules/validation/abstract/core/RuleNFTAdapter.sol
@@ -17,10 +17,8 @@ import {ITransferContext} from "../../../interfaces/ITransferContext.sol";
* @dev Delegates tokenId overloads to RuleTransferValidation's internal hooks.
*/
abstract contract RuleNFTAdapter is RuleTransferValidation, IERC7943NonFungibleComplianceExtend, ITransferContext {
- bytes4 internal constant TRANSFERRED_SELECTOR_ERC3643 =
- IERC3643IComplianceContract.transferred.selector;
- bytes4 internal constant TRANSFERRED_SELECTOR_RULE_ENGINE =
- IRuleEngine.transferred.selector;
+ bytes4 internal constant TRANSFERRED_SELECTOR_ERC3643 = IERC3643IComplianceContract.transferred.selector;
+ bytes4 internal constant TRANSFERRED_SELECTOR_RULE_ENGINE = IRuleEngine.transferred.selector;
bytes4 internal constant TRANSFERRED_SELECTOR_ERC7943 =
bytes4(keccak256("transferred(address,address,uint256,uint256)"));
bytes4 internal constant TRANSFERRED_SELECTOR_ERC7943_FROM =
@@ -34,10 +32,17 @@ abstract contract RuleNFTAdapter is RuleTransferValidation, IERC7943NonFungibleC
* @notice Internal hook for post-transfer validation or state updates (spender-aware).
*/
function _transferredFrom(address spender, address from, address to, uint256 value) internal virtual;
+
/**
* @inheritdoc IERC7943NonFungibleComplianceExtend
*/
- function detectTransferRestriction(address from, address to, uint256 /* tokenId */, uint256 value)
+ function detectTransferRestriction(
+ address from,
+ address to,
+ uint256,
+ /* tokenId */
+ uint256 value
+ )
public
view
virtual
@@ -54,7 +59,8 @@ abstract contract RuleNFTAdapter is RuleTransferValidation, IERC7943NonFungibleC
address spender,
address from,
address to,
- uint256 /* tokenId */,
+ uint256,
+ /* tokenId */
uint256 value
) public view virtual override(IERC7943NonFungibleComplianceExtend) returns (uint8) {
return _detectTransferRestrictionFrom(spender, from, to, value);
@@ -63,7 +69,13 @@ abstract contract RuleNFTAdapter is RuleTransferValidation, IERC7943NonFungibleC
/**
* @inheritdoc IERC7943NonFungibleCompliance
*/
- function canTransfer(address from, address to, uint256 /* tokenId */, uint256 amount)
+ function canTransfer(
+ address from,
+ address to,
+ uint256,
+ /* tokenId */
+ uint256 amount
+ )
public
view
override(IERC7943NonFungibleCompliance)
@@ -75,7 +87,14 @@ abstract contract RuleNFTAdapter is RuleTransferValidation, IERC7943NonFungibleC
/**
* @inheritdoc IERC7943NonFungibleComplianceExtend
*/
- function canTransferFrom(address spender, address from, address to, uint256 /* tokenId */, uint256 value)
+ function canTransferFrom(
+ address spender,
+ address from,
+ address to,
+ uint256,
+ /* tokenId */
+ uint256 value
+ )
public
view
virtual
@@ -89,7 +108,13 @@ abstract contract RuleNFTAdapter is RuleTransferValidation, IERC7943NonFungibleC
/**
* @inheritdoc IERC7943NonFungibleComplianceExtend
*/
- function transferred(address from, address to, uint256 /* tokenId */, uint256 value)
+ function transferred(
+ address from,
+ address to,
+ uint256,
+ /* tokenId */
+ uint256 value
+ )
public
virtual
override(IERC7943NonFungibleComplianceExtend)
@@ -100,7 +125,14 @@ abstract contract RuleNFTAdapter is RuleTransferValidation, IERC7943NonFungibleC
/**
* @inheritdoc IERC7943NonFungibleComplianceExtend
*/
- function transferred(address spender, address from, address to, uint256 /* tokenId */, uint256 value)
+ function transferred(
+ address spender,
+ address from,
+ address to,
+ uint256,
+ /* tokenId */
+ uint256 value
+ )
public
virtual
override(IERC7943NonFungibleComplianceExtend)
@@ -112,7 +144,7 @@ abstract contract RuleNFTAdapter is RuleTransferValidation, IERC7943NonFungibleC
* @inheritdoc ITransferContext
*/
function transferred(MultiTokenTransferContext calldata ctx) external virtual override {
- if (ctx.sender != address(0)) {
+ if (ctx.sender != address(0) && ctx.sender != ctx.from) {
_transferredFrom(ctx.sender, ctx.from, ctx.to, ctx.value);
} else {
_transferred(ctx.from, ctx.to, ctx.value);
@@ -123,7 +155,7 @@ abstract contract RuleNFTAdapter is RuleTransferValidation, IERC7943NonFungibleC
* @inheritdoc ITransferContext
*/
function transferred(FungibleTransferContext calldata ctx) external virtual override {
- if (ctx.sender != address(0)) {
+ if (ctx.sender != address(0) && ctx.sender != ctx.from) {
_transferredFrom(ctx.sender, ctx.from, ctx.to, ctx.value);
} else {
_transferred(ctx.from, ctx.to, ctx.value);
diff --git a/src/rules/validation/abstract/core/RuleTransferValidation.sol b/src/rules/validation/abstract/core/RuleTransferValidation.sol
index 4472231..d120135 100644
--- a/src/rules/validation/abstract/core/RuleTransferValidation.sol
+++ b/src/rules/validation/abstract/core/RuleTransferValidation.sol
@@ -12,7 +12,13 @@ import {RuleInterfaceId} from "RuleEngine/modules/library/RuleInterfaceId.sol";
/* ==== Modules === */
import {VersionModule} from "../../../../modules/VersionModule.sol";
-abstract contract RuleTransferValidation is VersionModule, IERC1404Extend, IERC3643ComplianceRead, IERC7551Compliance, IRule {
+abstract contract RuleTransferValidation is
+ VersionModule,
+ IERC1404Extend,
+ IERC3643ComplianceRead,
+ IERC7551Compliance,
+ IRule
+{
/**
* @notice Internal transfer restriction check.
* @param from the origin address
diff --git a/src/rules/validation/abstract/core/RuleWhitelistShared.sol b/src/rules/validation/abstract/core/RuleWhitelistShared.sol
index e38440a..73d819a 100644
--- a/src/rules/validation/abstract/core/RuleWhitelistShared.sol
+++ b/src/rules/validation/abstract/core/RuleWhitelistShared.sol
@@ -32,7 +32,8 @@ abstract contract RuleWhitelistShared is RuleNFTAdapter, RuleWhitelistInvariantS
*/
function canReturnTransferRestrictionCode(uint8 restrictionCode) external pure override returns (bool isKnown) {
return restrictionCode == CODE_ADDRESS_FROM_NOT_WHITELISTED
- || restrictionCode == CODE_ADDRESS_TO_NOT_WHITELISTED || restrictionCode == CODE_ADDRESS_SPENDER_NOT_WHITELISTED;
+ || restrictionCode == CODE_ADDRESS_TO_NOT_WHITELISTED
+ || restrictionCode == CODE_ADDRESS_SPENDER_NOT_WHITELISTED;
}
/**
@@ -99,18 +100,11 @@ abstract contract RuleWhitelistShared is RuleNFTAdapter, RuleWhitelistInvariantS
);
}
- function _transferredFrom(address spender, address from, address to, uint256 value)
- internal
- view
- virtual
- override
- {
+ function _transferredFrom(address spender, address from, address to, uint256 value) internal view virtual override {
uint8 code = _detectTransferRestrictionFrom(spender, from, to, value);
require(
code == uint8(REJECTED_CODE_BASE.TRANSFER_OK),
RuleWhitelist_InvalidTransferFrom(address(this), spender, from, to, value, code)
);
}
-
-
}
diff --git a/src/rules/validation/abstract/invariant/RuleIdentityRegistryInvariantStorage.sol b/src/rules/validation/abstract/invariant/RuleIdentityRegistryInvariantStorage.sol
index eef8251..5b6833e 100644
--- a/src/rules/validation/abstract/invariant/RuleIdentityRegistryInvariantStorage.sol
+++ b/src/rules/validation/abstract/invariant/RuleIdentityRegistryInvariantStorage.sol
@@ -1,17 +1,12 @@
// 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
+ address rule, address spender, address from, address to, uint256 value, uint8 code
);
error RuleIdentityRegistry_RegistryAddressZeroNotAllowed();
diff --git a/src/rules/validation/abstract/invariant/RuleMaxTotalSupplyInvariantStorage.sol b/src/rules/validation/abstract/invariant/RuleMaxTotalSupplyInvariantStorage.sol
index 84e911c..ad3d3bd 100644
--- a/src/rules/validation/abstract/invariant/RuleMaxTotalSupplyInvariantStorage.sol
+++ b/src/rules/validation/abstract/invariant/RuleMaxTotalSupplyInvariantStorage.sol
@@ -1,17 +1,12 @@
// 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
+ address rule, address spender, address from, address to, uint256 value, uint8 code
);
error RuleMaxTotalSupply_TokenAddressZeroNotAllowed();
diff --git a/src/rules/validation/abstract/invariant/RuleSanctionsListInvariantStorage.sol b/src/rules/validation/abstract/invariant/RuleSanctionsListInvariantStorage.sol
index 5d48263..27d3c95 100644
--- a/src/rules/validation/abstract/invariant/RuleSanctionsListInvariantStorage.sol
+++ b/src/rules/validation/abstract/invariant/RuleSanctionsListInvariantStorage.sol
@@ -2,16 +2,18 @@
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 ============ */
error RuleSanctionsList_OracleAddressZeroNotAllowed();
error RuleSanctionsList_InvalidTransfer(address rule, address from, address to, uint256 value, uint8 code);
- error RuleSanctionsList_InvalidTransferFrom(address rule, address spender, address from, address to, uint256 value, uint8 code);
+ error RuleSanctionsList_InvalidTransferFrom(
+ address rule, address spender, address from, address to, uint256 value, uint8 code
+ );
/* ============ Role ============ */
bytes32 public constant SANCTIONLIST_ROLE = keccak256("SANCTIONLIST_ROLE");
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
new file mode 100644
index 0000000..dc8bd63
--- /dev/null
+++ b/src/rules/validation/abstract/invariant/RuleSpenderWhitelistInvariantStorage.sol
@@ -0,0 +1,14 @@
+// SPDX-License-Identifier: MPL-2.0
+pragma solidity ^0.8.20;
+
+import {RuleSharedInvariantStorage} from "./RuleSharedInvariantStorage.sol";
+
+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";
+
+ error RuleSpenderWhitelist_InvalidTransferFrom(
+ address ruleEngine, address spender, address from, address to, uint256 value, uint8 restrictionCode
+ );
+}
diff --git a/src/rules/validation/deployment/RuleBlacklist.sol b/src/rules/validation/deployment/RuleBlacklist.sol
index 4f1b9d5..6c4d20d 100644
--- a/src/rules/validation/deployment/RuleBlacklist.sol
+++ b/src/rules/validation/deployment/RuleBlacklist.sol
@@ -32,7 +32,8 @@ contract RuleBlacklist is RuleBlacklistBase, AccessControlModuleStandalone {
override(AccessControlEnumerable, RuleBlacklistBase)
returns (bool)
{
- return AccessControlEnumerable.supportsInterface(interfaceId) || RuleBlacklistBase.supportsInterface(interfaceId);
+ return AccessControlEnumerable.supportsInterface(interfaceId)
+ || RuleBlacklistBase.supportsInterface(interfaceId);
}
function _authorizeAddressListAdd() internal view virtual override onlyRole(ADDRESS_LIST_ADD_ROLE) {}
diff --git a/src/rules/validation/deployment/RuleBlacklistOwnable2Step.sol b/src/rules/validation/deployment/RuleBlacklistOwnable2Step.sol
index 742339e..ac2cea9 100644
--- a/src/rules/validation/deployment/RuleBlacklistOwnable2Step.sol
+++ b/src/rules/validation/deployment/RuleBlacklistOwnable2Step.sol
@@ -12,10 +12,7 @@ import {RuleAddressSet} from "../abstract/RuleAddressSet/RuleAddressSet.sol";
* @notice Ownable2Step variant of RuleBlacklist with owner-based authorization hooks.
*/
contract RuleBlacklistOwnable2Step is RuleBlacklistBase, Ownable2Step {
- constructor(address owner, address forwarderIrrevocable)
- RuleBlacklistBase(forwarderIrrevocable)
- Ownable(owner)
- {}
+ constructor(address owner, address forwarderIrrevocable) RuleBlacklistBase(forwarderIrrevocable) Ownable(owner) {}
function _authorizeAddressListAdd() internal view virtual override onlyOwner {}
diff --git a/src/rules/validation/deployment/RuleERC2980Ownable2Step.sol b/src/rules/validation/deployment/RuleERC2980Ownable2Step.sol
index 493f2f0..0764662 100644
--- a/src/rules/validation/deployment/RuleERC2980Ownable2Step.sol
+++ b/src/rules/validation/deployment/RuleERC2980Ownable2Step.sol
@@ -12,10 +12,7 @@ import {RuleERC2980Base} from "../abstract/base/RuleERC2980Base.sol";
* @dev All whitelist and frozenlist management functions are restricted to the contract owner.
*/
contract RuleERC2980Ownable2Step is RuleERC2980Base, Ownable2Step {
- constructor(address owner, address forwarderIrrevocable)
- RuleERC2980Base(forwarderIrrevocable)
- Ownable(owner)
- {}
+ constructor(address owner, address forwarderIrrevocable) RuleERC2980Base(forwarderIrrevocable) Ownable(owner) {}
function _authorizeWhitelistAdd() internal view virtual override onlyOwner {}
diff --git a/src/rules/validation/deployment/RuleSanctionsList.sol b/src/rules/validation/deployment/RuleSanctionsList.sol
index bd00b0a..165600f 100644
--- a/src/rules/validation/deployment/RuleSanctionsList.sol
+++ b/src/rules/validation/deployment/RuleSanctionsList.sol
@@ -4,7 +4,7 @@ pragma solidity ^0.8.20;
import {AccessControlEnumerable} from "OZ/access/extensions/AccessControlEnumerable.sol";
import {Context} from "OZ/utils/Context.sol";
import {AccessControlModuleStandalone} from "../../../modules/AccessControlModuleStandalone.sol";
-import {MetaTxModuleStandalone, ERC2771Context} from "../../../modules/MetaTxModuleStandalone.sol";
+import {ERC2771Context} from "../../../modules/MetaTxModuleStandalone.sol";
import {RuleSanctionsListBase} from "../abstract/base/RuleSanctionsListBase.sol";
import {RuleTransferValidation} from "../abstract/core/RuleTransferValidation.sol";
import {ISanctionsList} from "../../interfaces/ISanctionsList.sol";
diff --git a/src/rules/validation/deployment/RuleSanctionsListOwnable2Step.sol b/src/rules/validation/deployment/RuleSanctionsListOwnable2Step.sol
index 23cd213..2f8018d 100644
--- a/src/rules/validation/deployment/RuleSanctionsListOwnable2Step.sol
+++ b/src/rules/validation/deployment/RuleSanctionsListOwnable2Step.sol
@@ -4,7 +4,7 @@ pragma solidity ^0.8.20;
import {Ownable} from "OZ/access/Ownable.sol";
import {Ownable2Step} from "OZ/access/Ownable2Step.sol";
import {Context} from "OZ/utils/Context.sol";
-import {MetaTxModuleStandalone, ERC2771Context} from "../../../modules/MetaTxModuleStandalone.sol";
+import {ERC2771Context} from "../../../modules/MetaTxModuleStandalone.sol";
import {RuleSanctionsListBase} from "../abstract/base/RuleSanctionsListBase.sol";
import {ISanctionsList} from "../../interfaces/ISanctionsList.sol";
diff --git a/src/rules/validation/deployment/RuleSpenderWhitelist.sol b/src/rules/validation/deployment/RuleSpenderWhitelist.sol
new file mode 100644
index 0000000..ee1bb70
--- /dev/null
+++ b/src/rules/validation/deployment/RuleSpenderWhitelist.sol
@@ -0,0 +1,47 @@
+// SPDX-License-Identifier: MPL-2.0
+pragma solidity ^0.8.20;
+
+import {AccessControlEnumerable} from "OZ/access/extensions/AccessControlEnumerable.sol";
+import {Context} from "OZ/utils/Context.sol";
+import {AccessControlModuleStandalone} from "../../../modules/AccessControlModuleStandalone.sol";
+import {RuleSpenderWhitelistBase} from "../abstract/base/RuleSpenderWhitelistBase.sol";
+import {RuleAddressSet} from "../abstract/RuleAddressSet/RuleAddressSet.sol";
+import {RuleTransferValidation} from "../abstract/core/RuleTransferValidation.sol";
+
+/**
+ * @title RuleSpenderWhitelist
+ * @notice AccessControlEnumerable deployment variant of spender whitelist rule.
+ */
+contract RuleSpenderWhitelist is RuleSpenderWhitelistBase, AccessControlModuleStandalone {
+ constructor(address admin, address forwarderIrrevocable)
+ RuleSpenderWhitelistBase(forwarderIrrevocable)
+ AccessControlModuleStandalone(admin)
+ {}
+
+ function supportsInterface(bytes4 interfaceId)
+ public
+ view
+ virtual
+ override(AccessControlEnumerable, RuleTransferValidation)
+ returns (bool)
+ {
+ return AccessControlEnumerable.supportsInterface(interfaceId)
+ || RuleTransferValidation.supportsInterface(interfaceId);
+ }
+
+ function _authorizeAddressListAdd() internal view virtual override onlyRole(ADDRESS_LIST_ADD_ROLE) {}
+
+ function _authorizeAddressListRemove() internal view virtual override onlyRole(ADDRESS_LIST_REMOVE_ROLE) {}
+
+ function _msgSender() internal view virtual override(Context, RuleAddressSet) returns (address sender) {
+ return super._msgSender();
+ }
+
+ function _msgData() internal view virtual override(Context, RuleAddressSet) returns (bytes calldata) {
+ return super._msgData();
+ }
+
+ function _contextSuffixLength() internal view virtual override(Context, RuleAddressSet) returns (uint256) {
+ return super._contextSuffixLength();
+ }
+}
diff --git a/src/rules/validation/deployment/RuleSpenderWhitelistOwnable2Step.sol b/src/rules/validation/deployment/RuleSpenderWhitelistOwnable2Step.sol
new file mode 100644
index 0000000..18ab65e
--- /dev/null
+++ b/src/rules/validation/deployment/RuleSpenderWhitelistOwnable2Step.sol
@@ -0,0 +1,35 @@
+// SPDX-License-Identifier: MPL-2.0
+pragma solidity ^0.8.20;
+
+import {Ownable} from "OZ/access/Ownable.sol";
+import {Ownable2Step} from "OZ/access/Ownable2Step.sol";
+import {Context} from "OZ/utils/Context.sol";
+import {RuleSpenderWhitelistBase} from "../abstract/base/RuleSpenderWhitelistBase.sol";
+import {RuleAddressSet} from "../abstract/RuleAddressSet/RuleAddressSet.sol";
+
+/**
+ * @title RuleSpenderWhitelistOwnable2Step
+ * @notice Ownable2Step deployment variant of spender whitelist rule.
+ */
+contract RuleSpenderWhitelistOwnable2Step is RuleSpenderWhitelistBase, Ownable2Step {
+ constructor(address owner, address forwarderIrrevocable)
+ RuleSpenderWhitelistBase(forwarderIrrevocable)
+ Ownable(owner)
+ {}
+
+ function _authorizeAddressListAdd() internal view virtual override onlyOwner {}
+
+ function _authorizeAddressListRemove() internal view virtual override onlyOwner {}
+
+ function _msgSender() internal view virtual override(Context, RuleAddressSet) returns (address sender) {
+ return super._msgSender();
+ }
+
+ function _msgData() internal view virtual override(Context, RuleAddressSet) returns (bytes calldata) {
+ return super._msgData();
+ }
+
+ function _contextSuffixLength() internal view virtual override(Context, RuleAddressSet) returns (uint256) {
+ return super._contextSuffixLength();
+ }
+}
diff --git a/src/rules/validation/deployment/RuleWhitelist.sol b/src/rules/validation/deployment/RuleWhitelist.sol
index d154ef0..dc4c75e 100644
--- a/src/rules/validation/deployment/RuleWhitelist.sol
+++ b/src/rules/validation/deployment/RuleWhitelist.sol
@@ -7,6 +7,7 @@ import {Context} from "OZ/utils/Context.sol";
import {AccessControlModuleStandalone} from "../../../modules/AccessControlModuleStandalone.sol";
import {RuleWhitelistBase} from "../abstract/base/RuleWhitelistBase.sol";
import {RuleAddressSet} from "../abstract/RuleAddressSet/RuleAddressSet.sol";
+
/* ==== CMTAT === */
/**
@@ -46,7 +47,8 @@ contract RuleWhitelist is RuleWhitelistBase, AccessControlModuleStandalone {
override(AccessControlEnumerable, RuleWhitelistBase)
returns (bool)
{
- return AccessControlEnumerable.supportsInterface(interfaceId) || RuleWhitelistBase.supportsInterface(interfaceId);
+ return AccessControlEnumerable.supportsInterface(interfaceId)
+ || RuleWhitelistBase.supportsInterface(interfaceId);
}
/*//////////////////////////////////////////////////////////////
diff --git a/src/rules/validation/deployment/RuleWhitelistWrapper.sol b/src/rules/validation/deployment/RuleWhitelistWrapper.sol
index 079d343..7c4b750 100644
--- a/src/rules/validation/deployment/RuleWhitelistWrapper.sol
+++ b/src/rules/validation/deployment/RuleWhitelistWrapper.sol
@@ -13,10 +13,7 @@ import {RuleWhitelistWrapperBase} from "../abstract/base/RuleWhitelistWrapperBas
/**
* @title Wrapper to call several different whitelist rules
*/
-contract RuleWhitelistWrapper is
- RuleWhitelistWrapperBase,
- AccessControlModuleStandalone
-{
+contract RuleWhitelistWrapper is RuleWhitelistWrapperBase, AccessControlModuleStandalone {
/*//////////////////////////////////////////////////////////////
CONSTRUCTOR
//////////////////////////////////////////////////////////////*/
@@ -63,7 +60,13 @@ contract RuleWhitelistWrapper is
return RuleWhitelistWrapperBase._msgData();
}
- function _contextSuffixLength() internal view virtual override(RuleWhitelistWrapperBase, Context) returns (uint256) {
+ function _contextSuffixLength()
+ internal
+ view
+ virtual
+ override(RuleWhitelistWrapperBase, Context)
+ returns (uint256)
+ {
return RuleWhitelistWrapperBase._contextSuffixLength();
}
diff --git a/src/rules/validation/deployment/RuleWhitelistWrapperOwnable2Step.sol b/src/rules/validation/deployment/RuleWhitelistWrapperOwnable2Step.sol
index b8156b4..9db5af3 100644
--- a/src/rules/validation/deployment/RuleWhitelistWrapperOwnable2Step.sol
+++ b/src/rules/validation/deployment/RuleWhitelistWrapperOwnable2Step.sol
@@ -44,8 +44,13 @@ contract RuleWhitelistWrapperOwnable2Step is RuleWhitelistWrapperBase, Ownable2S
return RuleWhitelistWrapperBase._msgData();
}
- function _contextSuffixLength() internal view virtual override(RuleWhitelistWrapperBase, Context) returns (uint256) {
+ function _contextSuffixLength()
+ internal
+ view
+ virtual
+ override(RuleWhitelistWrapperBase, Context)
+ returns (uint256)
+ {
return RuleWhitelistWrapperBase._contextSuffixLength();
}
-
}
diff --git a/test/Coverage/DeploymentOperationCoverage.t.sol b/test/Coverage/DeploymentOperationCoverage.t.sol
index f71291a..b4e692d 100644
--- a/test/Coverage/DeploymentOperationCoverage.t.sol
+++ b/test/Coverage/DeploymentOperationCoverage.t.sol
@@ -8,98 +8,20 @@ import {IRule} from "RuleEngine/interfaces/IRule.sol";
import {RuleInterfaceId} from "RuleEngine/modules/library/RuleInterfaceId.sol";
import {ISanctionsList} from "src/rules/interfaces/ISanctionsList.sol";
import {RuleConditionalTransferLight} from "src/rules/operation/RuleConditionalTransferLight.sol";
-import {RuleConditionalTransferLightOwnable2Step} from "src/rules/operation/RuleConditionalTransferLightOwnable2Step.sol";
-import {RuleBlacklist} from "src/rules/validation/deployment/RuleBlacklist.sol";
-import {RuleWhitelist} from "src/rules/validation/deployment/RuleWhitelist.sol";
-import {RuleWhitelistWrapper} from "src/rules/validation/deployment/RuleWhitelistWrapper.sol";
-import {RuleERC2980} from "src/rules/validation/deployment/RuleERC2980.sol";
-import {RuleSanctionsList} from "src/rules/validation/deployment/RuleSanctionsList.sol";
-import {RuleBlacklistOwnable2Step} from "src/rules/validation/deployment/RuleBlacklistOwnable2Step.sol";
-import {RuleWhitelistOwnable2Step} from "src/rules/validation/deployment/RuleWhitelistOwnable2Step.sol";
-import {RuleWhitelistWrapperOwnable2Step} from "src/rules/validation/deployment/RuleWhitelistWrapperOwnable2Step.sol";
-import {RuleERC2980Ownable2Step} from "src/rules/validation/deployment/RuleERC2980Ownable2Step.sol";
-
-contract RuleBlacklistHarness is RuleBlacklist {
- constructor(address admin, address forwarderIrrevocable) RuleBlacklist(admin, forwarderIrrevocable) {}
-
- function exposedMsgDataLength() external view returns (uint256) {
- return _msgData().length;
- }
-}
-
-contract RuleWhitelistHarness is RuleWhitelist {
- constructor(address admin, address forwarderIrrevocable, bool checkSpender_)
- RuleWhitelist(admin, forwarderIrrevocable, checkSpender_)
- {}
-
- function exposedMsgDataLength() external view returns (uint256) {
- return _msgData().length;
- }
-}
-
-contract RuleWhitelistWrapperHarness is RuleWhitelistWrapper {
- constructor(address admin, address forwarderIrrevocable, bool checkSpender_)
- RuleWhitelistWrapper(admin, forwarderIrrevocable, checkSpender_)
- {}
-
- function exposedMsgDataLength() external view returns (uint256) {
- return _msgData().length;
- }
-}
-
-contract RuleERC2980Harness is RuleERC2980 {
- constructor(address admin, address forwarderIrrevocable) RuleERC2980(admin, forwarderIrrevocable) {}
-
- function exposedMsgDataLength() external view returns (uint256) {
- return _msgData().length;
- }
-}
-
-contract RuleSanctionsListHarness is RuleSanctionsList {
- constructor(address admin, address forwarderIrrevocable, ISanctionsList sanctionContractOracle_)
- RuleSanctionsList(admin, forwarderIrrevocable, sanctionContractOracle_)
- {}
-
- function exposedMsgDataLength() external view returns (uint256) {
- return _msgData().length;
- }
-}
-
-contract RuleBlacklistOwnable2StepHarness is RuleBlacklistOwnable2Step {
- constructor(address owner, address forwarderIrrevocable) RuleBlacklistOwnable2Step(owner, forwarderIrrevocable) {}
-
- function exposedMsgDataLength() external view returns (uint256) {
- return _msgData().length;
- }
-}
-
-contract RuleWhitelistOwnable2StepHarness is RuleWhitelistOwnable2Step {
- constructor(address owner, address forwarderIrrevocable, bool checkSpender_)
- RuleWhitelistOwnable2Step(owner, forwarderIrrevocable, checkSpender_)
- {}
-
- function exposedMsgDataLength() external view returns (uint256) {
- return _msgData().length;
- }
-}
-
-contract RuleWhitelistWrapperOwnable2StepHarness is RuleWhitelistWrapperOwnable2Step {
- constructor(address owner, address forwarderIrrevocable, bool checkSpender_)
- RuleWhitelistWrapperOwnable2Step(owner, forwarderIrrevocable, checkSpender_)
- {}
-
- function exposedMsgDataLength() external view returns (uint256) {
- return _msgData().length;
- }
-}
-
-contract RuleERC2980Ownable2StepHarness is RuleERC2980Ownable2Step {
- constructor(address owner, address forwarderIrrevocable) RuleERC2980Ownable2Step(owner, forwarderIrrevocable) {}
-
- function exposedMsgDataLength() external view returns (uint256) {
- return _msgData().length;
- }
-}
+import {
+ RuleConditionalTransferLightOwnable2Step
+} from "src/rules/operation/RuleConditionalTransferLightOwnable2Step.sol";
+import {
+ RuleBlacklistHarness,
+ RuleWhitelistHarness,
+ RuleWhitelistWrapperHarness,
+ RuleERC2980Harness,
+ RuleSanctionsListHarness,
+ RuleBlacklistOwnable2StepHarness,
+ RuleWhitelistOwnable2StepHarness,
+ RuleWhitelistWrapperOwnable2StepHarness,
+ RuleERC2980Ownable2StepHarness
+} from "src/mocks/harness/DeploymentCoverageHarnesses.sol";
contract DeploymentCoverageExtraTest is Test, HelperContract {
function testDeploymentWrappersAndHooksCoverage() public {
@@ -180,11 +102,15 @@ contract OperationCoverageExtraTest is Test, HelperContract {
rule.transferred(ADDRESS3, ADDRESS1, ADDRESS2, 77);
assertEq(rule.approvedCount(ADDRESS1, ADDRESS2, 77), 0);
- assertEq(rule.detectTransferRestrictionFrom(ADDRESS3, ADDRESS1, ADDRESS2, 77), CODE_TRANSFER_REQUEST_NOT_APPROVED);
+ assertEq(
+ rule.detectTransferRestrictionFrom(ADDRESS3, ADDRESS1, ADDRESS2, 77), CODE_TRANSFER_REQUEST_NOT_APPROVED
+ );
assertFalse(rule.canTransfer(ADDRESS1, ADDRESS2, 77));
assertFalse(rule.canTransferFrom(ADDRESS3, ADDRESS1, ADDRESS2, 77));
assertTrue(rule.canReturnTransferRestrictionCode(CODE_TRANSFER_REQUEST_NOT_APPROVED));
- assertEq(rule.messageForTransferRestriction(CODE_TRANSFER_REQUEST_NOT_APPROVED), TEXT_TRANSFER_REQUEST_NOT_APPROVED);
+ assertEq(
+ rule.messageForTransferRestriction(CODE_TRANSFER_REQUEST_NOT_APPROVED), TEXT_TRANSFER_REQUEST_NOT_APPROVED
+ );
assertEq(rule.messageForTransferRestriction(CODE_NONEXISTENT), TEXT_CODE_NOT_FOUND);
assertTrue(rule.supportsInterface(type(IERC165).interfaceId));
diff --git a/test/DeploymentScripts/DeployCMTATWithBlacklist.t.sol b/test/DeploymentScripts/DeployCMTATWithBlacklist.t.sol
index a907765..30a0cb5 100644
--- a/test/DeploymentScripts/DeployCMTATWithBlacklist.t.sol
+++ b/test/DeploymentScripts/DeployCMTATWithBlacklist.t.sol
@@ -2,7 +2,6 @@
pragma solidity ^0.8.20;
import {Test} from "forge-std/Test.sol";
-import {IRuleEngine} from "CMTAT/interfaces/engine/IRuleEngine.sol";
import {CMTATStandalone} from "CMTAT/deployment/CMTATStandalone.sol";
import {RuleBlacklist} from "src/rules/validation/deployment/RuleBlacklist.sol";
import {DeployCMTATWithBlacklist} from "script/DeployCMTATWithBlacklist.s.sol";
@@ -15,10 +14,7 @@ contract DeployCMTATWithBlacklistTest is Test {
assertEq(address(token.ruleEngine()), address(rule));
}
- function _deploy(DeployCMTATWithBlacklist script)
- internal
- returns (CMTATStandalone token, RuleBlacklist rule)
- {
+ function _deploy(DeployCMTATWithBlacklist script) internal returns (CMTATStandalone token, RuleBlacklist rule) {
(token, rule) = script.deploy(address(1), address(0));
}
}
diff --git a/test/DeploymentScripts/DeployCMTATWithBlacklistAndSanctionsList.t.sol b/test/DeploymentScripts/DeployCMTATWithBlacklistAndSanctionsList.t.sol
index b04008b..911fe97 100644
--- a/test/DeploymentScripts/DeployCMTATWithBlacklistAndSanctionsList.t.sol
+++ b/test/DeploymentScripts/DeployCMTATWithBlacklistAndSanctionsList.t.sol
@@ -2,19 +2,19 @@
pragma solidity ^0.8.20;
import {Test} from "forge-std/Test.sol";
-import {IRuleEngine} from "CMTAT/interfaces/engine/IRuleEngine.sol";
import {CMTATStandalone} from "CMTAT/deployment/CMTATStandalone.sol";
import {RuleEngine} from "RuleEngine/RuleEngine.sol";
import {RuleBlacklist} from "src/rules/validation/deployment/RuleBlacklist.sol";
import {RuleSanctionsList} from "src/rules/validation/deployment/RuleSanctionsList.sol";
import {ISanctionsList} from "src/rules/interfaces/ISanctionsList.sol";
-import {RuleBlacklistInvariantStorage} from
- "src/rules/validation/abstract/RuleAddressSet/invariantStorage/RuleBlacklistInvariantStorage.sol";
-import {RuleSanctionsListInvariantStorage} from
- "src/rules/validation/abstract/invariant/RuleSanctionsListInvariantStorage.sol";
-import {SanctionListOracle} from "../utils/SanctionListOracle.sol";
-import {DeployCMTATWithBlacklistAndSanctionsList} from
- "script/DeployCMTATWithBlacklistAndSanctionsList.s.sol";
+import {
+ RuleBlacklistInvariantStorage
+} from "src/rules/validation/abstract/RuleAddressSet/invariantStorage/RuleBlacklistInvariantStorage.sol";
+import {
+ RuleSanctionsListInvariantStorage
+} from "src/rules/validation/abstract/invariant/RuleSanctionsListInvariantStorage.sol";
+import {SanctionListOracle} from "src/mocks/SanctionListOracle.sol";
+import {DeployCMTATWithBlacklistAndSanctionsList} from "script/DeployCMTATWithBlacklistAndSanctionsList.s.sol";
/**
* @title DeployCMTATWithBlacklistAndSanctionsListTest
@@ -117,6 +117,7 @@ contract DeployCMTATWithBlacklistAndSanctionsListTest is
CODE_ADDRESS_FROM_IS_BLACKLISTED
)
);
+ // forge-lint: disable-next-line(erc20-unchecked-transfer)
token.transfer(ADDRESS2, amount);
}
@@ -148,6 +149,7 @@ contract DeployCMTATWithBlacklistAndSanctionsListTest is
CODE_ADDRESS_TO_IS_BLACKLISTED
)
);
+ // forge-lint: disable-next-line(erc20-unchecked-transfer)
token.transfer(ADDRESS2, amount);
}
@@ -178,6 +180,7 @@ contract DeployCMTATWithBlacklistAndSanctionsListTest is
CODE_ADDRESS_FROM_IS_SANCTIONED
)
);
+ // forge-lint: disable-next-line(erc20-unchecked-transfer)
token.transfer(ADDRESS2, amount);
}
@@ -207,6 +210,7 @@ contract DeployCMTATWithBlacklistAndSanctionsListTest is
CODE_ADDRESS_TO_IS_SANCTIONED
)
);
+ // forge-lint: disable-next-line(erc20-unchecked-transfer)
token.transfer(ADDRESS2, amount);
}
diff --git a/test/DeploymentScripts/DeployCMTATWithWhitelist.t.sol b/test/DeploymentScripts/DeployCMTATWithWhitelist.t.sol
index 944707a..ded0513 100644
--- a/test/DeploymentScripts/DeployCMTATWithWhitelist.t.sol
+++ b/test/DeploymentScripts/DeployCMTATWithWhitelist.t.sol
@@ -2,7 +2,6 @@
pragma solidity ^0.8.20;
import {Test} from "forge-std/Test.sol";
-import {IRuleEngine} from "CMTAT/interfaces/engine/IRuleEngine.sol";
import {CMTATStandalone} from "CMTAT/deployment/CMTATStandalone.sol";
import {RuleWhitelist} from "src/rules/validation/deployment/RuleWhitelist.sol";
import {DeployCMTATWithWhitelist} from "script/DeployCMTATWithWhitelist.s.sol";
@@ -14,10 +13,7 @@ contract DeployCMTATWithWhitelistTest is Test {
assertEq(address(token.ruleEngine()), address(rule));
}
- function _deploy(DeployCMTATWithWhitelist script)
- internal
- returns (CMTATStandalone token, RuleWhitelist rule)
- {
+ function _deploy(DeployCMTATWithWhitelist script) internal returns (CMTATStandalone token, RuleWhitelist rule) {
(token, rule) = script.deploy(address(1), address(0), false);
}
}
diff --git a/test/HelperContract.sol b/test/HelperContract.sol
index e89eb8d..21cc0d7 100644
--- a/test/HelperContract.sol
+++ b/test/HelperContract.sol
@@ -9,8 +9,9 @@ import {RuleEngine} from "RuleEngine/RuleEngine.sol";
// RUleBlackList
import {RuleBlacklist} from "src/rules/validation/deployment/RuleBlacklist.sol";
-import {RuleBlacklistInvariantStorage} from
- "src/rules/validation/abstract/RuleAddressSet/invariantStorage/RuleBlacklistInvariantStorage.sol";
+import {
+ RuleBlacklistInvariantStorage
+} from "src/rules/validation/abstract/RuleAddressSet/invariantStorage/RuleBlacklistInvariantStorage.sol";
// RuleWhitelist
import {RuleWhitelist} from "src/rules/validation/deployment/RuleWhitelist.sol";
import {RuleMaxTotalSupply} from "src/rules/validation/deployment/RuleMaxTotalSupply.sol";
@@ -20,16 +21,22 @@ import {RuleConditionalTransferLight} from "src/rules/operation/RuleConditionalT
import {
RuleConditionalTransferLightInvariantStorage
} from "src/rules/operation/abstract/RuleConditionalTransferLightInvariantStorage.sol";
-import {RuleWhitelistInvariantStorage} from
- "src/rules/validation/abstract/RuleAddressSet/invariantStorage/RuleWhitelistInvariantStorage.sol";
-import {RuleAddressSetInvariantStorage} from
- "src/rules/validation/abstract/RuleAddressSet/invariantStorage/RuleAddressSetInvariantStorage.sol";
-import {RuleMaxTotalSupplyInvariantStorage} from
- "src/rules/validation/abstract/invariant/RuleMaxTotalSupplyInvariantStorage.sol";
-import {RuleIdentityRegistryInvariantStorage} from
- "src/rules/validation/abstract/invariant/RuleIdentityRegistryInvariantStorage.sol";
+import {
+ RuleWhitelistInvariantStorage
+} from "src/rules/validation/abstract/RuleAddressSet/invariantStorage/RuleWhitelistInvariantStorage.sol";
+import {
+ RuleAddressSetInvariantStorage
+} from "src/rules/validation/abstract/RuleAddressSet/invariantStorage/RuleAddressSetInvariantStorage.sol";
+import {
+ RuleMaxTotalSupplyInvariantStorage
+} from "src/rules/validation/abstract/invariant/RuleMaxTotalSupplyInvariantStorage.sol";
+import {
+ RuleIdentityRegistryInvariantStorage
+} from "src/rules/validation/abstract/invariant/RuleIdentityRegistryInvariantStorage.sol";
-import {RuleSanctionsListInvariantStorage} from "src/rules/validation/abstract/invariant/RuleSanctionsListInvariantStorage.sol";
+import {
+ RuleSanctionsListInvariantStorage
+} from "src/rules/validation/abstract/invariant/RuleSanctionsListInvariantStorage.sol";
// utils
import {CMTATDeployment} from "RuleEngine/../test/utils/CMTATDeployment.sol";
diff --git a/test/RuleBlacklist/AccessControl/RuleBlacklistAccessControlRoleMembers.t.sol b/test/RuleBlacklist/AccessControl/RuleBlacklistAccessControlRoleMembers.t.sol
index c2357ec..97ed68e 100644
--- a/test/RuleBlacklist/AccessControl/RuleBlacklistAccessControlRoleMembers.t.sol
+++ b/test/RuleBlacklist/AccessControl/RuleBlacklistAccessControlRoleMembers.t.sol
@@ -1,7 +1,10 @@
// SPDX-License-Identifier: MPL-2.0
pragma solidity ^0.8.20;
-import {AccessControlEnumerableTestBase, IAccessControlEnumerableLike} from "../../utils/AccessControlEnumerableTestBase.sol";
+import {
+ AccessControlEnumerableTestBase,
+ IAccessControlEnumerableLike
+} from "../../utils/AccessControlEnumerableTestBase.sol";
import {RuleBlacklist} from "src/rules/validation/deployment/RuleBlacklist.sol";
contract RuleBlacklistAccessControlRoleMembers is AccessControlEnumerableTestBase {
diff --git a/test/RuleBlacklist/CMTATIntegration.t.sol b/test/RuleBlacklist/CMTATIntegration.t.sol
index 7b1d79b..0c0cdf6 100644
--- a/test/RuleBlacklist/CMTATIntegration.t.sol
+++ b/test/RuleBlacklist/CMTATIntegration.t.sol
@@ -14,6 +14,7 @@ contract CMTATIntegration is Test, HelperContract {
uint256 constant ADDRESS1_BALANCE_INIT = 31;
uint256 constant ADDRESS2_BALANCE_INIT = 32;
uint256 constant ADDRESS3_BALANCE_INIT = 33;
+
// Arrange
function setUp() public {
// CMTAT
@@ -66,6 +67,7 @@ contract CMTATIntegration is Test, HelperContract {
)
);
// Act
+ // forge-lint: disable-next-line(erc20-unchecked-transfer)
cmtatContract.transfer(ADDRESS2, amount);
}
@@ -87,6 +89,7 @@ contract CMTATIntegration is Test, HelperContract {
)
);
// Act
+ // forge-lint: disable-next-line(erc20-unchecked-transfer)
cmtatContract.transfer(ADDRESS2, amount);
}
@@ -112,6 +115,7 @@ contract CMTATIntegration is Test, HelperContract {
CODE_ADDRESS_FROM_IS_BLACKLISTED
)
);
+ // 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 f01a078..9e47b29 100644
--- a/test/RuleBlacklist/CMTATIntegrationDirect.t.sol
+++ b/test/RuleBlacklist/CMTATIntegrationDirect.t.sol
@@ -7,7 +7,6 @@ import {CMTATDeployment} from "RuleEngine/../test/utils/CMTATDeployment.sol";
import {RuleBlacklist} from "src/rules/validation/deployment/RuleBlacklist.sol";
import {IRuleEngine} from "CMTAT/interfaces/engine/IRuleEngine.sol";
-
/**
* @title Integration test with the CMTAT using direct RuleBlacklist
*/
@@ -61,6 +60,7 @@ contract CMTATIntegrationDirectBlacklist is Test, HelperContract {
CODE_ADDRESS_TO_IS_BLACKLISTED
)
);
+ // forge-lint: disable-next-line(erc20-unchecked-transfer)
cmtatContract.transfer(ADDRESS2, amount);
}
@@ -80,6 +80,7 @@ contract CMTATIntegrationDirectBlacklist is Test, HelperContract {
CODE_ADDRESS_FROM_IS_BLACKLISTED
)
);
+ // forge-lint: disable-next-line(erc20-unchecked-transfer)
cmtatContract.transfer(ADDRESS2, amount);
}
@@ -103,6 +104,7 @@ contract CMTATIntegrationDirectBlacklist is Test, HelperContract {
CODE_ADDRESS_FROM_IS_BLACKLISTED
)
);
+ // forge-lint: disable-next-line(erc20-unchecked-transfer)
cmtatContract.transfer(ADDRESS2, amount);
}
diff --git a/test/RuleBlacklist/Ownable/RuleBlacklistOwnable2Step.t.sol b/test/RuleBlacklist/Ownable/RuleBlacklistOwnable2Step.t.sol
index 7ca9561..3145cdb 100644
--- a/test/RuleBlacklist/Ownable/RuleBlacklistOwnable2Step.t.sol
+++ b/test/RuleBlacklist/Ownable/RuleBlacklistOwnable2Step.t.sol
@@ -2,8 +2,9 @@
pragma solidity ^0.8.20;
import {Ownable2StepTestBase, IOwnable2StepLike} from "../../utils/Ownable2StepTestBase.sol";
-import {RuleBlacklistOwnable2Step as RuleBlacklistOwnable2StepContract} from
- "src/rules/validation/deployment/RuleBlacklistOwnable2Step.sol";
+import {
+ RuleBlacklistOwnable2Step as RuleBlacklistOwnable2StepContract
+} from "src/rules/validation/deployment/RuleBlacklistOwnable2Step.sol";
contract RuleBlacklistOwnable2StepTest is Ownable2StepTestBase {
function _deployOwnable2Step() internal override returns (IOwnable2StepLike, address) {
diff --git a/test/RuleBlacklist/RuleBlacklist.t.sol b/test/RuleBlacklist/RuleBlacklist.t.sol
index 1cb711d..30a1cbc 100644
--- a/test/RuleBlacklist/RuleBlacklist.t.sol
+++ b/test/RuleBlacklist/RuleBlacklist.t.sol
@@ -20,7 +20,7 @@ contract RuleBlacklistTest is Test, HelperContract {
resString = ruleBlacklist.messageForTransferRestriction(CODE_ADDRESS_FROM_IS_BLACKLISTED);
// Assert
assertEq(resString, TEXT_ADDRESS_FROM_IS_BLACKLISTED);
-
+
// Act
resString = ruleBlacklist.messageForTransferRestriction(CODE_ADDRESS_TO_IS_BLACKLISTED);
// Assert
@@ -202,7 +202,6 @@ contract RuleBlacklistTest is Test, HelperContract {
// Assert
assertFalse(resBool);
-
vm.prank(ADDRESS1);
vm.expectRevert(
abi.encodeWithSelector(
@@ -304,5 +303,4 @@ contract RuleBlacklistTest is Test, HelperContract {
ruleBlacklist.transferred(ADDRESS3, ADDRESS1, ADDRESS2, 20);
ruleBlacklist.transferred(ADDRESS3, ADDRESS1, ADDRESS2, 0, 20);
}
-
}
diff --git a/test/RuleBlacklist/RuleEngineIntegration.t.sol b/test/RuleBlacklist/RuleEngineIntegration.t.sol
index 68c0c0b..d876e59 100644
--- a/test/RuleBlacklist/RuleEngineIntegration.t.sol
+++ b/test/RuleBlacklist/RuleEngineIntegration.t.sol
@@ -10,7 +10,6 @@ import {RuleEngine} from "RuleEngine/RuleEngine.sol";
* @title Integration test between RuleEngine and RuleBlacklist
*/
contract RuleBlacklistRuleEngineIntegration is Test, HelperContract {
-
function setUp() public {
vm.prank(DEFAULT_ADMIN_ADDRESS);
ruleBlacklist = new RuleBlacklist(DEFAULT_ADMIN_ADDRESS, ZERO_ADDRESS);
diff --git a/test/RuleConditionalTransferLight/Ownable/RuleConditionalTransferLightOwnable2StepAccessControl.t.sol b/test/RuleConditionalTransferLight/Ownable/RuleConditionalTransferLightOwnable2StepAccessControl.t.sol
index ec6463f..f44cd09 100644
--- a/test/RuleConditionalTransferLight/Ownable/RuleConditionalTransferLightOwnable2StepAccessControl.t.sol
+++ b/test/RuleConditionalTransferLight/Ownable/RuleConditionalTransferLightOwnable2StepAccessControl.t.sol
@@ -3,8 +3,9 @@ pragma solidity ^0.8.20;
import {Test} from "forge-std/Test.sol";
import {HelperContract} from "../../HelperContract.sol";
-import {RuleConditionalTransferLightOwnable2Step} from
- "src/rules/operation/RuleConditionalTransferLightOwnable2Step.sol";
+import {
+ RuleConditionalTransferLightOwnable2Step
+} from "src/rules/operation/RuleConditionalTransferLightOwnable2Step.sol";
contract RuleConditionalTransferLightOwnable2StepAccessControl is Test, HelperContract {
// OpenZeppelin Ownable error
diff --git a/test/RuleConditionalTransferLight/RuleConditionalTransferLightAccessControlRoleMembers.t.sol b/test/RuleConditionalTransferLight/RuleConditionalTransferLightAccessControlRoleMembers.t.sol
index 626245f..31a7e55 100644
--- a/test/RuleConditionalTransferLight/RuleConditionalTransferLightAccessControlRoleMembers.t.sol
+++ b/test/RuleConditionalTransferLight/RuleConditionalTransferLightAccessControlRoleMembers.t.sol
@@ -1,7 +1,10 @@
// SPDX-License-Identifier: MPL-2.0
pragma solidity ^0.8.20;
-import {AccessControlEnumerableTestBase, IAccessControlEnumerableLike} from "../utils/AccessControlEnumerableTestBase.sol";
+import {
+ AccessControlEnumerableTestBase,
+ IAccessControlEnumerableLike
+} from "../utils/AccessControlEnumerableTestBase.sol";
import {RuleConditionalTransferLight} from "src/rules/operation/RuleConditionalTransferLight.sol";
contract RuleConditionalTransferLightAccessControlRoleMembers is AccessControlEnumerableTestBase {
diff --git a/test/RuleConditionalTransferLight/RuleConditionalTransferLightApproveAndTransfer.t.sol b/test/RuleConditionalTransferLight/RuleConditionalTransferLightApproveAndTransfer.t.sol
index 24a2891..2449845 100644
--- a/test/RuleConditionalTransferLight/RuleConditionalTransferLightApproveAndTransfer.t.sol
+++ b/test/RuleConditionalTransferLight/RuleConditionalTransferLightApproveAndTransfer.t.sol
@@ -4,23 +4,8 @@ pragma solidity ^0.8.20;
import {Test} from "forge-std/Test.sol";
import {HelperContract} from "../HelperContract.sol";
import {RuleConditionalTransferLight} from "src/rules/operation/RuleConditionalTransferLight.sol";
-import {MockERC20WithTransferContext} from "../utils/MockERC20WithTransferContext.sol";
-
-contract MockERC20TransferFromFalse {
- mapping(address => mapping(address => uint256)) private _allowances;
-
- function setAllowance(address owner, address spender, uint256 value) external {
- _allowances[owner][spender] = value;
- }
-
- function allowance(address owner, address spender) external view returns (uint256) {
- return _allowances[owner][spender];
- }
-
- function transferFrom(address, address, uint256) external pure returns (bool) {
- return false;
- }
-}
+import {MockERC20WithTransferContext} from "src/mocks/MockERC20WithTransferContext.sol";
+import {MockERC20TransferFromFalse} from "src/mocks/MockERC20TransferFromFalse.sol";
contract RuleConditionalTransferLightApproveAndTransfer is Test, HelperContract {
RuleConditionalTransferLight private rule;
diff --git a/test/RuleConditionalTransferLight/RuleConditionalTransferLightRuleEngineIntegration.t.sol b/test/RuleConditionalTransferLight/RuleConditionalTransferLightRuleEngineIntegration.t.sol
index b93b76c..c7f96bc 100644
--- a/test/RuleConditionalTransferLight/RuleConditionalTransferLightRuleEngineIntegration.t.sol
+++ b/test/RuleConditionalTransferLight/RuleConditionalTransferLightRuleEngineIntegration.t.sol
@@ -15,8 +15,7 @@ contract RuleConditionalTransferLightRuleEngineIntegration is Test, HelperContra
ruleEngineMock = new RuleEngine(DEFAULT_ADMIN_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS);
vm.prank(DEFAULT_ADMIN_ADDRESS);
- ruleConditionalTransferLight =
- new RuleConditionalTransferLight(CONDITIONAL_TRANSFER_OPERATOR_ADDRESS);
+ ruleConditionalTransferLight = new RuleConditionalTransferLight(CONDITIONAL_TRANSFER_OPERATOR_ADDRESS);
vm.prank(CONDITIONAL_TRANSFER_OPERATOR_ADDRESS);
ruleConditionalTransferLight.bindToken(address(ruleEngineMock));
@@ -87,7 +86,9 @@ contract RuleConditionalTransferLightRuleEngineIntegration is Test, HelperContra
ruleConditionalTransferLight.cancelTransferApproval(ADDRESS1, ADDRESS2, amount);
}
- function testFuzz_ApproveAndConsume(address from, address to, uint96 value, uint8 approvals, uint8 consumes) public {
+ function testFuzz_ApproveAndConsume(address from, address to, uint96 value, uint8 approvals, uint8 consumes)
+ public
+ {
approvals = uint8(bound(approvals, 0, 20));
consumes = uint8(bound(consumes, 0, approvals));
bool isMintOrBurnPath = from == address(0) || to == address(0);
diff --git a/test/RuleERC2980/AccessControl/RuleERC2980AccessControl.t.sol b/test/RuleERC2980/AccessControl/RuleERC2980AccessControl.t.sol
index d0ad22a..5bc5bff 100644
--- a/test/RuleERC2980/AccessControl/RuleERC2980AccessControl.t.sol
+++ b/test/RuleERC2980/AccessControl/RuleERC2980AccessControl.t.sol
@@ -5,8 +5,6 @@ import {Test} from "forge-std/Test.sol";
import {IAccessControl} from "OZ/access/IAccessControl.sol";
import {HelperContract} from "../../HelperContract.sol";
import {RuleERC2980} from "src/rules/validation/deployment/RuleERC2980.sol";
-import {RuleERC2980InvariantStorage} from
- "src/rules/validation/abstract/RuleERC2980/invariantStorage/RuleERC2980InvariantStorage.sol";
contract RuleERC2980AccessControlTest is Test, HelperContract {
RuleERC2980 public ruleERC2980;
diff --git a/test/RuleERC2980/Ownable/RuleERC2980Ownable2Step.t.sol b/test/RuleERC2980/Ownable/RuleERC2980Ownable2Step.t.sol
index 919b37e..2e5b677 100644
--- a/test/RuleERC2980/Ownable/RuleERC2980Ownable2Step.t.sol
+++ b/test/RuleERC2980/Ownable/RuleERC2980Ownable2Step.t.sol
@@ -2,8 +2,9 @@
pragma solidity ^0.8.20;
import {Ownable2StepTestBase, IOwnable2StepLike} from "../../utils/Ownable2StepTestBase.sol";
-import {RuleERC2980Ownable2Step as RuleERC2980Ownable2StepContract} from
- "src/rules/validation/deployment/RuleERC2980Ownable2Step.sol";
+import {
+ RuleERC2980Ownable2Step as RuleERC2980Ownable2StepContract
+} from "src/rules/validation/deployment/RuleERC2980Ownable2Step.sol";
contract RuleERC2980Ownable2StepTest is Ownable2StepTestBase {
function _deployOwnable2Step() internal override returns (IOwnable2StepLike, address) {
diff --git a/test/RuleERC2980/Ownable/RuleERC2980OwnableAccessControl.t.sol b/test/RuleERC2980/Ownable/RuleERC2980OwnableAccessControl.t.sol
index 1c77b48..c465705 100644
--- a/test/RuleERC2980/Ownable/RuleERC2980OwnableAccessControl.t.sol
+++ b/test/RuleERC2980/Ownable/RuleERC2980OwnableAccessControl.t.sol
@@ -4,8 +4,6 @@ pragma solidity ^0.8.20;
import {Test} from "forge-std/Test.sol";
import {HelperContract} from "../../HelperContract.sol";
import {RuleERC2980Ownable2Step} from "src/rules/validation/deployment/RuleERC2980Ownable2Step.sol";
-import {RuleERC2980InvariantStorage} from
- "src/rules/validation/abstract/RuleERC2980/invariantStorage/RuleERC2980InvariantStorage.sol";
contract RuleERC2980OwnableAccessControl is Test, HelperContract {
error OwnableUnauthorizedAccount(address account);
diff --git a/test/RuleERC2980/RuleERC2980.t.sol b/test/RuleERC2980/RuleERC2980.t.sol
index bfebdfb..f189de2 100644
--- a/test/RuleERC2980/RuleERC2980.t.sol
+++ b/test/RuleERC2980/RuleERC2980.t.sol
@@ -4,8 +4,9 @@ pragma solidity ^0.8.20;
import {Test} from "forge-std/Test.sol";
import {HelperContract} from "../HelperContract.sol";
import {RuleERC2980} from "src/rules/validation/deployment/RuleERC2980.sol";
-import {RuleERC2980InvariantStorage} from
- "src/rules/validation/abstract/RuleERC2980/invariantStorage/RuleERC2980InvariantStorage.sol";
+import {
+ RuleERC2980InvariantStorage
+} from "src/rules/validation/abstract/RuleERC2980/invariantStorage/RuleERC2980InvariantStorage.sol";
contract RuleERC2980Test is Test, HelperContract {
RuleERC2980 public ruleERC2980;
@@ -30,21 +31,11 @@ contract RuleERC2980Test is Test, HelperContract {
//////////////////////////////////////////////////////////////*/
function testReturnTheRightMessageForAGivenCode() public view {
+ assertEq(ruleERC2980.messageForTransferRestriction(CODE_FROM_FROZEN), "The sender address is frozen");
+ assertEq(ruleERC2980.messageForTransferRestriction(CODE_TO_FROZEN), "The recipient address is frozen");
+ assertEq(ruleERC2980.messageForTransferRestriction(CODE_SPENDER_FROZEN), "The spender address is frozen");
assertEq(
- ruleERC2980.messageForTransferRestriction(CODE_FROM_FROZEN),
- "The sender address is frozen"
- );
- assertEq(
- ruleERC2980.messageForTransferRestriction(CODE_TO_FROZEN),
- "The recipient address is frozen"
- );
- assertEq(
- ruleERC2980.messageForTransferRestriction(CODE_SPENDER_FROZEN),
- "The spender address is frozen"
- );
- assertEq(
- ruleERC2980.messageForTransferRestriction(CODE_TO_NOT_WHITELISTED),
- "The recipient is not in the whitelist"
+ ruleERC2980.messageForTransferRestriction(CODE_TO_NOT_WHITELISTED), "The recipient is not in the whitelist"
);
assertEq(ruleERC2980.messageForTransferRestriction(CODE_NONEXISTENT), TEXT_CODE_NOT_FOUND);
}
diff --git a/test/RuleIdentityRegistry/Ownable/RuleIdentityRegistryOwnable2Step.t.sol b/test/RuleIdentityRegistry/Ownable/RuleIdentityRegistryOwnable2Step.t.sol
index 4f8b069..8c347ce 100644
--- a/test/RuleIdentityRegistry/Ownable/RuleIdentityRegistryOwnable2Step.t.sol
+++ b/test/RuleIdentityRegistry/Ownable/RuleIdentityRegistryOwnable2Step.t.sol
@@ -4,9 +4,8 @@ pragma solidity ^0.8.20;
import {Test} from "forge-std/Test.sol";
import {HelperContract} from "../../HelperContract.sol";
import {Ownable2StepTestBase, IOwnable2StepLike} from "../../utils/Ownable2StepTestBase.sol";
-import {IdentityRegistryMock} from "../../utils/IdentityRegistryMock.sol";
-import {RuleIdentityRegistryOwnable2Step} from
- "src/rules/validation/deployment/RuleIdentityRegistryOwnable2Step.sol";
+import {IdentityRegistryMock} from "src/mocks/IdentityRegistryMock.sol";
+import {RuleIdentityRegistryOwnable2Step} from "src/rules/validation/deployment/RuleIdentityRegistryOwnable2Step.sol";
contract RuleIdentityRegistryOwnable2StepTest is Ownable2StepTestBase {
function _deployOwnable2Step() internal override returns (IOwnable2StepLike, address) {
diff --git a/test/RuleIdentityRegistry/RuleIdentityRegistryAccessControlRoleMembers.t.sol b/test/RuleIdentityRegistry/RuleIdentityRegistryAccessControlRoleMembers.t.sol
index aa33faf..1792bd1 100644
--- a/test/RuleIdentityRegistry/RuleIdentityRegistryAccessControlRoleMembers.t.sol
+++ b/test/RuleIdentityRegistry/RuleIdentityRegistryAccessControlRoleMembers.t.sol
@@ -1,7 +1,10 @@
// SPDX-License-Identifier: MPL-2.0
pragma solidity ^0.8.20;
-import {AccessControlEnumerableTestBase, IAccessControlEnumerableLike} from "../utils/AccessControlEnumerableTestBase.sol";
+import {
+ AccessControlEnumerableTestBase,
+ IAccessControlEnumerableLike
+} from "../utils/AccessControlEnumerableTestBase.sol";
import {RuleIdentityRegistry} from "src/rules/validation/deployment/RuleIdentityRegistry.sol";
contract RuleIdentityRegistryAccessControlRoleMembers is AccessControlEnumerableTestBase {
diff --git a/test/RuleIdentityRegistry/RuleIdentityRegistryRuleEngineIntegration.t.sol b/test/RuleIdentityRegistry/RuleIdentityRegistryRuleEngineIntegration.t.sol
index 7f29962..0d3446b 100644
--- a/test/RuleIdentityRegistry/RuleIdentityRegistryRuleEngineIntegration.t.sol
+++ b/test/RuleIdentityRegistry/RuleIdentityRegistryRuleEngineIntegration.t.sol
@@ -3,7 +3,7 @@ pragma solidity ^0.8.20;
import {Test} from "forge-std/Test.sol";
import {HelperContract} from "../HelperContract.sol";
-import {IdentityRegistryMock} from "../utils/IdentityRegistryMock.sol";
+import {IdentityRegistryMock} from "src/mocks/IdentityRegistryMock.sol";
import {RuleEngine} from "RuleEngine/RuleEngine.sol";
import {RuleIdentityRegistry} from "src/rules/validation/deployment/RuleIdentityRegistry.sol";
diff --git a/test/RuleIdentityRegistry/RuleIdentityRegistryUnit.t.sol b/test/RuleIdentityRegistry/RuleIdentityRegistryUnit.t.sol
index f59db86..81789ae 100644
--- a/test/RuleIdentityRegistry/RuleIdentityRegistryUnit.t.sol
+++ b/test/RuleIdentityRegistry/RuleIdentityRegistryUnit.t.sol
@@ -4,7 +4,7 @@ pragma solidity ^0.8.20;
import {Test} from "forge-std/Test.sol";
import {HelperContract} from "../HelperContract.sol";
import {RuleIdentityRegistry} from "src/rules/validation/deployment/RuleIdentityRegistry.sol";
-import {IdentityRegistryMock} from "../utils/IdentityRegistryMock.sol";
+import {IdentityRegistryMock} from "src/mocks/IdentityRegistryMock.sol";
contract RuleIdentityRegistryUnit is Test, HelperContract {
IdentityRegistryMock private registry;
diff --git a/test/RuleMaxTotalSupply/Ownable/RuleMaxTotalSupplyOwnable2Step.t.sol b/test/RuleMaxTotalSupply/Ownable/RuleMaxTotalSupplyOwnable2Step.t.sol
index b1028df..4a44346 100644
--- a/test/RuleMaxTotalSupply/Ownable/RuleMaxTotalSupplyOwnable2Step.t.sol
+++ b/test/RuleMaxTotalSupply/Ownable/RuleMaxTotalSupplyOwnable2Step.t.sol
@@ -4,7 +4,7 @@ pragma solidity ^0.8.20;
import {Test} from "forge-std/Test.sol";
import {HelperContract} from "../../HelperContract.sol";
import {Ownable2StepTestBase, IOwnable2StepLike} from "../../utils/Ownable2StepTestBase.sol";
-import {TotalSupplyMock} from "../../utils/TotalSupplyMock.sol";
+import {TotalSupplyMock} from "src/mocks/TotalSupplyMock.sol";
import {RuleMaxTotalSupplyOwnable2Step} from "src/rules/validation/deployment/RuleMaxTotalSupplyOwnable2Step.sol";
contract RuleMaxTotalSupplyOwnable2StepTest is Ownable2StepTestBase {
diff --git a/test/RuleMaxTotalSupply/RuleMaxTotalSupplyAccessControlRoleMembers.t.sol b/test/RuleMaxTotalSupply/RuleMaxTotalSupplyAccessControlRoleMembers.t.sol
index 0020dab..0be1891 100644
--- a/test/RuleMaxTotalSupply/RuleMaxTotalSupplyAccessControlRoleMembers.t.sol
+++ b/test/RuleMaxTotalSupply/RuleMaxTotalSupplyAccessControlRoleMembers.t.sol
@@ -1,7 +1,10 @@
// SPDX-License-Identifier: MPL-2.0
pragma solidity ^0.8.20;
-import {AccessControlEnumerableTestBase, IAccessControlEnumerableLike} from "../utils/AccessControlEnumerableTestBase.sol";
+import {
+ AccessControlEnumerableTestBase,
+ IAccessControlEnumerableLike
+} from "../utils/AccessControlEnumerableTestBase.sol";
import {RuleMaxTotalSupply} from "src/rules/validation/deployment/RuleMaxTotalSupply.sol";
contract RuleMaxTotalSupplyAccessControlRoleMembers is AccessControlEnumerableTestBase {
diff --git a/test/RuleMaxTotalSupply/RuleMaxTotalSupplyRuleEngineIntegration.t.sol b/test/RuleMaxTotalSupply/RuleMaxTotalSupplyRuleEngineIntegration.t.sol
index 3ac3846..8307b59 100644
--- a/test/RuleMaxTotalSupply/RuleMaxTotalSupplyRuleEngineIntegration.t.sol
+++ b/test/RuleMaxTotalSupply/RuleMaxTotalSupplyRuleEngineIntegration.t.sol
@@ -3,7 +3,7 @@ pragma solidity ^0.8.20;
import {Test} from "forge-std/Test.sol";
import {HelperContract} from "../HelperContract.sol";
-import {TotalSupplyMock} from "../utils/TotalSupplyMock.sol";
+import {TotalSupplyMock} from "src/mocks/TotalSupplyMock.sol";
import {RuleEngine} from "RuleEngine/RuleEngine.sol";
import {RuleMaxTotalSupply} from "src/rules/validation/deployment/RuleMaxTotalSupply.sol";
diff --git a/test/RuleMaxTotalSupply/RuleMaxTotalSupplyUnit.t.sol b/test/RuleMaxTotalSupply/RuleMaxTotalSupplyUnit.t.sol
index d4de2cc..a27d2d3 100644
--- a/test/RuleMaxTotalSupply/RuleMaxTotalSupplyUnit.t.sol
+++ b/test/RuleMaxTotalSupply/RuleMaxTotalSupplyUnit.t.sol
@@ -4,7 +4,7 @@ pragma solidity ^0.8.20;
import {Test} from "forge-std/Test.sol";
import {HelperContract} from "../HelperContract.sol";
import {RuleMaxTotalSupply} from "src/rules/validation/deployment/RuleMaxTotalSupply.sol";
-import {TotalSupplyMock} from "../utils/TotalSupplyMock.sol";
+import {TotalSupplyMock} from "src/mocks/TotalSupplyMock.sol";
contract RuleMaxTotalSupplyUnit is Test, HelperContract {
TotalSupplyMock private token;
diff --git a/test/RuleSanctionList/Ownable/RuleSanctionsListOwnable2Step.t.sol b/test/RuleSanctionList/Ownable/RuleSanctionsListOwnable2Step.t.sol
index 090f0f3..709379f 100644
--- a/test/RuleSanctionList/Ownable/RuleSanctionsListOwnable2Step.t.sol
+++ b/test/RuleSanctionList/Ownable/RuleSanctionsListOwnable2Step.t.sol
@@ -4,27 +4,10 @@ pragma solidity ^0.8.20;
import {Test} from "forge-std/Test.sol";
import {HelperContract} from "../../HelperContract.sol";
import {Ownable2StepTestBase, IOwnable2StepLike} from "../../utils/Ownable2StepTestBase.sol";
-import {SanctionListOracle} from "../../utils/SanctionListOracle.sol";
+import {SanctionListOracle} from "src/mocks/SanctionListOracle.sol";
import {ISanctionsList} from "src/rules/interfaces/ISanctionsList.sol";
import {RuleSanctionsListOwnable2Step} from "src/rules/validation/deployment/RuleSanctionsListOwnable2Step.sol";
-
-contract RuleSanctionsListOwnable2StepHarness is RuleSanctionsListOwnable2Step {
- constructor(address owner, address forwarderIrrevocable, ISanctionsList sanctionContractOracle_)
- RuleSanctionsListOwnable2Step(owner, forwarderIrrevocable, sanctionContractOracle_)
- {}
-
- function exposedMsgSender() external view returns (address) {
- return _msgSender();
- }
-
- function exposedMsgData() external view returns (bytes memory) {
- return _msgData();
- }
-
- function exposedContextSuffixLength() external view returns (uint256) {
- return _contextSuffixLength();
- }
-}
+import {RuleSanctionsListOwnable2StepHarness} from "src/mocks/harness/RuleSanctionsListOwnable2StepHarness.sol";
contract RuleSanctionsListOwnable2StepTest is Ownable2StepTestBase {
function _deployOwnable2Step() internal override returns (IOwnable2StepLike, address) {
diff --git a/test/RuleSanctionList/RuleEngineIntegration.t.sol b/test/RuleSanctionList/RuleEngineIntegration.t.sol
index 1af0a96..62e7a19 100644
--- a/test/RuleSanctionList/RuleEngineIntegration.t.sol
+++ b/test/RuleSanctionList/RuleEngineIntegration.t.sol
@@ -3,7 +3,7 @@ pragma solidity ^0.8.20;
import {Test} from "forge-std/Test.sol";
import {HelperContract} from "../HelperContract.sol";
-import {SanctionListOracle} from "../utils/SanctionListOracle.sol";
+import {SanctionListOracle} from "src/mocks/SanctionListOracle.sol";
import {RuleEngine} from "RuleEngine/RuleEngine.sol";
import {RuleSanctionsList} from "src/rules/validation/deployment/RuleSanctionsList.sol";
diff --git a/test/RuleSanctionList/RuleSanctionListAddTest.t.sol b/test/RuleSanctionList/RuleSanctionListAddTest.t.sol
index 1de70c6..7e8e040 100644
--- a/test/RuleSanctionList/RuleSanctionListAddTest.t.sol
+++ b/test/RuleSanctionList/RuleSanctionListAddTest.t.sol
@@ -3,7 +3,7 @@ pragma solidity ^0.8.20;
import {Test} from "forge-std/Test.sol";
import {HelperContract} from "../HelperContract.sol";
-import {SanctionListOracle} from "../utils/SanctionListOracle.sol";
+import {SanctionListOracle} from "src/mocks/SanctionListOracle.sol";
import {RuleSanctionsList, ISanctionsList} from "src/rules/validation/deployment/RuleSanctionsList.sol";
/**
* @title General functions of the ruleSanctionList
diff --git a/test/RuleSanctionList/RuleSanctionListDeploymentTest.t.sol b/test/RuleSanctionList/RuleSanctionListDeploymentTest.t.sol
index 4fbe45d..133d653 100644
--- a/test/RuleSanctionList/RuleSanctionListDeploymentTest.t.sol
+++ b/test/RuleSanctionList/RuleSanctionListDeploymentTest.t.sol
@@ -4,7 +4,7 @@ pragma solidity ^0.8.20;
import {Test} from "forge-std/Test.sol";
import {HelperContract} from "../HelperContract.sol";
import {MinimalForwarderMock} from "CMTAT/mocks/MinimalForwarderMock.sol";
-import {SanctionListOracle} from "../utils/SanctionListOracle.sol";
+import {SanctionListOracle} from "src/mocks/SanctionListOracle.sol";
import {RuleSanctionsList, ISanctionsList} from "src/rules/validation/deployment/RuleSanctionsList.sol";
import {AccessControlModuleStandalone} from "../../src/modules/AccessControlModuleStandalone.sol";
/**
@@ -57,20 +57,20 @@ contract RuleSanctionListDeploymentTest is Test, HelperContract {
}
function testcanTransferIfNoOracleSet() public {
- ruleSanctionList =
+ ruleSanctionList =
new RuleSanctionsList(SANCTIONLIST_OPERATOR_ADDRESS, address(ZERO_ADDRESS), ISanctionsList(ZERO_ADDRESS));
// Act
// ADDRESS1 -> ADDRESS2
resBool = ruleSanctionList.canTransfer(ADDRESS1, ADDRESS2, 20);
assertEq(resBool, true);
-
+
resBool = ruleSanctionList.canTransfer(ADDRESS1, ADDRESS2, 0, 20);
assertEq(resBool, true);
-
+
// ADDRESS2 -> ADDRESS1
resBool = ruleSanctionList.canTransfer(ADDRESS2, ADDRESS1, 20);
assertEq(resBool, true);
-
+
resBool = ruleSanctionList.canTransfer(ADDRESS2, ADDRESS1, 0, 20);
assertEq(resBool, true);
diff --git a/test/RuleSanctionList/RuleSanctionListTest.t.sol b/test/RuleSanctionList/RuleSanctionListTest.t.sol
index 29d16b1..aeacda7 100644
--- a/test/RuleSanctionList/RuleSanctionListTest.t.sol
+++ b/test/RuleSanctionList/RuleSanctionListTest.t.sol
@@ -3,7 +3,7 @@ pragma solidity ^0.8.20;
import {Test} from "forge-std/Test.sol";
import {HelperContract} from "../HelperContract.sol";
-import {SanctionListOracle} from "../utils/SanctionListOracle.sol";
+import {SanctionListOracle} from "src/mocks/SanctionListOracle.sol";
import {RuleSanctionsList, ISanctionsList} from "src/rules/validation/deployment/RuleSanctionsList.sol";
/**
* @title General functions of the ruleSanctionList
@@ -44,7 +44,7 @@ contract RuleSanctionlistTest is Test, HelperContract {
resString = ruleSanctionList.messageForTransferRestriction(CODE_ADDRESS_FROM_IS_SANCTIONED);
// Assert
assertEq(resString, TEXT_ADDRESS_FROM_IS_SANCTIONED);
-
+
// Act
resString = ruleSanctionList.messageForTransferRestriction(CODE_ADDRESS_TO_IS_SANCTIONED);
// Assert
@@ -75,7 +75,6 @@ contract RuleSanctionlistTest is Test, HelperContract {
assertEq(resBool, true);
}
-
function testTransferFromDetectedAsInvalid() public {
// Act
resBool = ruleSanctionList.canTransfer(ATTACKER, ADDRESS2, 20);
@@ -205,7 +204,6 @@ contract RuleSanctionlistTest is Test, HelperContract {
// Assert
assertEq(resUint8, NO_ERROR);
-
resBool = ruleSanctionList.canTransferFrom(ADDRESS3, ADDRESS1, ADDRESS2, 20);
assertEq(resBool, true);
diff --git a/test/RuleSanctionList/RuleSanctionsListAccessControlRoleMembers.t.sol b/test/RuleSanctionList/RuleSanctionsListAccessControlRoleMembers.t.sol
index d893961..ee0ac94 100644
--- a/test/RuleSanctionList/RuleSanctionsListAccessControlRoleMembers.t.sol
+++ b/test/RuleSanctionList/RuleSanctionsListAccessControlRoleMembers.t.sol
@@ -1,7 +1,10 @@
// SPDX-License-Identifier: MPL-2.0
pragma solidity ^0.8.20;
-import {AccessControlEnumerableTestBase, IAccessControlEnumerableLike} from "../utils/AccessControlEnumerableTestBase.sol";
+import {
+ AccessControlEnumerableTestBase,
+ IAccessControlEnumerableLike
+} from "../utils/AccessControlEnumerableTestBase.sol";
import {RuleSanctionsList} from "src/rules/validation/deployment/RuleSanctionsList.sol";
import {ISanctionsList} from "src/rules/interfaces/ISanctionsList.sol";
diff --git a/test/RuleSpenderWhitelist/Ownable/RuleSpenderWhitelistOwnable2Step.t.sol b/test/RuleSpenderWhitelist/Ownable/RuleSpenderWhitelistOwnable2Step.t.sol
new file mode 100644
index 0000000..3785f1e
--- /dev/null
+++ b/test/RuleSpenderWhitelist/Ownable/RuleSpenderWhitelistOwnable2Step.t.sol
@@ -0,0 +1,55 @@
+// SPDX-License-Identifier: MPL-2.0
+pragma solidity ^0.8.20;
+
+import {Test} from "forge-std/Test.sol";
+import {HelperContract} from "../../HelperContract.sol";
+import {Ownable} from "OZ/access/Ownable.sol";
+import {RuleSpenderWhitelistOwnable2Step} from "src/rules/validation/deployment/RuleSpenderWhitelistOwnable2Step.sol";
+import {RuleSpenderWhitelistOwnable2StepHarness} from "src/mocks/harness/RuleSpenderWhitelistHarnesses.sol";
+
+contract RuleSpenderWhitelistOwnable2StepTest is Test, HelperContract {
+ RuleSpenderWhitelistOwnable2StepHarness private rule;
+
+ function setUp() public {
+ rule = new RuleSpenderWhitelistOwnable2StepHarness(DEFAULT_ADMIN_ADDRESS, ZERO_ADDRESS);
+ }
+
+ function testOnlyOwnerCanManageList() public {
+ vm.expectRevert();
+ vm.prank(ADDRESS1);
+ rule.addAddress(ADDRESS3);
+
+ vm.expectRevert();
+ vm.prank(ADDRESS1);
+ rule.removeAddress(ADDRESS3);
+
+ vm.prank(DEFAULT_ADMIN_ADDRESS);
+ rule.addAddress(ADDRESS3);
+ assertTrue(rule.isAddressListed(ADDRESS3));
+
+ vm.prank(DEFAULT_ADMIN_ADDRESS);
+ rule.removeAddress(ADDRESS3);
+ assertFalse(rule.isAddressListed(ADDRESS3));
+ }
+
+ function testOnlyOwnerCanTransferOwnership() public {
+ vm.prank(ADDRESS1);
+ vm.expectRevert();
+ rule.transferOwnership(ADDRESS2);
+
+ vm.prank(DEFAULT_ADMIN_ADDRESS);
+ rule.transferOwnership(ADDRESS2);
+ assertEq(rule.pendingOwner(), ADDRESS2);
+ }
+
+ function testMetaTxOverridesAreReachable() public view {
+ assertEq(rule.exposedMsgSender(), address(this));
+ assertEq(rule.exposedContextSuffixLength(), 20);
+ assertGe(rule.exposedMsgData().length, 4);
+ }
+
+ function testCannotDeployWithZeroOwner() public {
+ vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableInvalidOwner.selector, ZERO_ADDRESS));
+ new RuleSpenderWhitelistOwnable2Step(ZERO_ADDRESS, ZERO_ADDRESS);
+ }
+}
diff --git a/test/RuleSpenderWhitelist/RuleSpenderWhitelist.t.sol b/test/RuleSpenderWhitelist/RuleSpenderWhitelist.t.sol
new file mode 100644
index 0000000..5bd1f2c
--- /dev/null
+++ b/test/RuleSpenderWhitelist/RuleSpenderWhitelist.t.sol
@@ -0,0 +1,104 @@
+// SPDX-License-Identifier: MPL-2.0
+pragma solidity ^0.8.20;
+
+import {Test} from "forge-std/Test.sol";
+import {HelperContract} from "../HelperContract.sol";
+import {RuleSpenderWhitelist} from "src/rules/validation/deployment/RuleSpenderWhitelist.sol";
+import {AccessControlModuleStandalone} from "src/modules/AccessControlModuleStandalone.sol";
+import {IAccessControl} from "OZ/access/IAccessControl.sol";
+import {IRule} from "RuleEngine/interfaces/IRule.sol";
+import {RuleSpenderWhitelistHarness} from "src/mocks/harness/RuleSpenderWhitelistHarnesses.sol";
+
+contract RuleSpenderWhitelistTest is Test, HelperContract {
+ uint8 internal constant CODE_SPENDER_NOT_WHITELISTED = 66;
+ string internal constant TEXT_SPENDER_NOT_WHITELISTED = "SpenderWhitelist: Spender is not whitelisted";
+
+ RuleSpenderWhitelist private rule;
+ RuleSpenderWhitelistHarness private harness;
+
+ function setUp() public {
+ vm.prank(DEFAULT_ADMIN_ADDRESS);
+ rule = new RuleSpenderWhitelist(DEFAULT_ADMIN_ADDRESS, ZERO_ADDRESS);
+ vm.prank(DEFAULT_ADMIN_ADDRESS);
+ harness = new RuleSpenderWhitelistHarness(DEFAULT_ADMIN_ADDRESS, ZERO_ADDRESS);
+ }
+
+ function testRegularTransfersAlwaysAllowed() public {
+ assertEq(rule.detectTransferRestriction(ADDRESS1, ADDRESS2, 10), TRANSFER_OK);
+ assertTrue(rule.canTransfer(ADDRESS1, ADDRESS2, 10));
+
+ rule.transferred(ADDRESS1, ADDRESS2, 10);
+ }
+
+ function testTransferFromRejectedWhenSpenderNotWhitelisted() public {
+ assertEq(rule.detectTransferRestrictionFrom(ADDRESS3, ADDRESS1, ADDRESS2, 10), CODE_SPENDER_NOT_WHITELISTED);
+ assertFalse(rule.canTransferFrom(ADDRESS3, ADDRESS1, ADDRESS2, 10));
+
+ vm.expectRevert();
+ rule.transferred(ADDRESS3, ADDRESS1, ADDRESS2, 10);
+ }
+
+ function testTransferFromAllowedWhenSpenderWhitelisted() public {
+ vm.prank(DEFAULT_ADMIN_ADDRESS);
+ rule.addAddress(ADDRESS3);
+
+ assertEq(rule.detectTransferRestrictionFrom(ADDRESS3, ADDRESS1, ADDRESS2, 10), TRANSFER_OK);
+ assertTrue(rule.canTransferFrom(ADDRESS3, ADDRESS1, ADDRESS2, 10));
+
+ rule.transferred(ADDRESS3, ADDRESS1, ADDRESS2, 10);
+ }
+
+ function testTokenIdAndContextOverloads() public {
+ vm.prank(DEFAULT_ADMIN_ADDRESS);
+ rule.addAddress(ADDRESS3);
+
+ assertEq(rule.detectTransferRestriction(ADDRESS1, ADDRESS2, 1, 10), TRANSFER_OK);
+ assertEq(rule.detectTransferRestrictionFrom(ADDRESS3, ADDRESS1, ADDRESS2, 1, 10), TRANSFER_OK);
+ assertTrue(rule.canTransfer(ADDRESS1, ADDRESS2, 1, 10));
+ assertTrue(rule.canTransferFrom(ADDRESS3, ADDRESS1, ADDRESS2, 1, 10));
+ rule.transferred(ADDRESS1, ADDRESS2, 1, 10);
+ rule.transferred(ADDRESS3, ADDRESS1, ADDRESS2, 1, 10);
+ }
+
+ function testCanReturnRestrictionCodeAndMessage() public view {
+ assertTrue(rule.canReturnTransferRestrictionCode(CODE_SPENDER_NOT_WHITELISTED));
+ assertFalse(rule.canReturnTransferRestrictionCode(CODE_NONEXISTENT));
+
+ assertEq(rule.messageForTransferRestriction(CODE_SPENDER_NOT_WHITELISTED), TEXT_SPENDER_NOT_WHITELISTED);
+ assertEq(rule.messageForTransferRestriction(CODE_NONEXISTENT), TEXT_CODE_NOT_FOUND);
+ }
+
+ function testOnlyAdminCanManageSpenderWhitelist() public {
+ vm.expectRevert();
+ vm.prank(ADDRESS1);
+ rule.addAddress(ADDRESS3);
+
+ vm.expectRevert();
+ vm.prank(ADDRESS1);
+ rule.removeAddress(ADDRESS3);
+
+ vm.prank(DEFAULT_ADMIN_ADDRESS);
+ rule.addAddress(ADDRESS3);
+ assertTrue(rule.isAddressListed(ADDRESS3));
+
+ vm.prank(DEFAULT_ADMIN_ADDRESS);
+ rule.removeAddress(ADDRESS3);
+ assertFalse(rule.isAddressListed(ADDRESS3));
+ }
+
+ function testSupportsInterface() public view {
+ assertTrue(rule.supportsInterface(type(IAccessControl).interfaceId));
+ assertTrue(rule.supportsInterface(type(IRule).interfaceId));
+ }
+
+ function testMetaTxOverridesAreReachable() public view {
+ assertEq(harness.exposedMsgSender(), address(this));
+ assertEq(harness.exposedContextSuffixLength(), 20);
+ assertGe(harness.exposedMsgData().length, 4);
+ }
+
+ function testCannotDeployWithZeroAdmin() public {
+ vm.expectRevert(AccessControlModuleStandalone.AccessControlModuleStandalone_AddressZeroNotAllowed.selector);
+ new RuleSpenderWhitelist(ZERO_ADDRESS, ZERO_ADDRESS);
+ }
+}
diff --git a/test/RuleWhitelist/AccessControl/RuleWhitelistAccessControlRoleMembers.t.sol b/test/RuleWhitelist/AccessControl/RuleWhitelistAccessControlRoleMembers.t.sol
index df656c6..0a7e4a8 100644
--- a/test/RuleWhitelist/AccessControl/RuleWhitelistAccessControlRoleMembers.t.sol
+++ b/test/RuleWhitelist/AccessControl/RuleWhitelistAccessControlRoleMembers.t.sol
@@ -1,7 +1,10 @@
// SPDX-License-Identifier: MPL-2.0
pragma solidity ^0.8.20;
-import {AccessControlEnumerableTestBase, IAccessControlEnumerableLike} from "../../utils/AccessControlEnumerableTestBase.sol";
+import {
+ AccessControlEnumerableTestBase,
+ IAccessControlEnumerableLike
+} from "../../utils/AccessControlEnumerableTestBase.sol";
import {RuleWhitelist} from "src/rules/validation/deployment/RuleWhitelist.sol";
contract RuleWhitelistAccessControlRoleMembers is AccessControlEnumerableTestBase {
diff --git a/test/RuleWhitelist/AccessControl/RuleWhitelistWrapperAccessControlRoleMembers.t.sol b/test/RuleWhitelist/AccessControl/RuleWhitelistWrapperAccessControlRoleMembers.t.sol
index 9aa07cc..7103698 100644
--- a/test/RuleWhitelist/AccessControl/RuleWhitelistWrapperAccessControlRoleMembers.t.sol
+++ b/test/RuleWhitelist/AccessControl/RuleWhitelistWrapperAccessControlRoleMembers.t.sol
@@ -1,7 +1,10 @@
// SPDX-License-Identifier: MPL-2.0
pragma solidity ^0.8.20;
-import {AccessControlEnumerableTestBase, IAccessControlEnumerableLike} from "../../utils/AccessControlEnumerableTestBase.sol";
+import {
+ AccessControlEnumerableTestBase,
+ IAccessControlEnumerableLike
+} from "../../utils/AccessControlEnumerableTestBase.sol";
import {RuleWhitelistWrapper} from "src/rules/validation/deployment/RuleWhitelistWrapper.sol";
contract RuleWhitelistWrapperAccessControlRoleMembers is AccessControlEnumerableTestBase {
diff --git a/test/RuleWhitelist/CMTATIntegration.t.sol b/test/RuleWhitelist/CMTATIntegration.t.sol
index b65bb0b..facee60 100644
--- a/test/RuleWhitelist/CMTATIntegration.t.sol
+++ b/test/RuleWhitelist/CMTATIntegration.t.sol
@@ -56,6 +56,7 @@ contract CMTATIntegration is Test, HelperContract {
)
);
// Act
+ // forge-lint: disable-next-line(erc20-unchecked-transfer)
cmtatContract.transfer(ADDRESS2, 21);
}
@@ -77,6 +78,7 @@ contract CMTATIntegration is Test, HelperContract {
)
);
// Act
+ // forge-lint: disable-next-line(erc20-unchecked-transfer)
cmtatContract.transfer(ADDRESS2, amount);
}
@@ -98,6 +100,7 @@ contract CMTATIntegration is Test, HelperContract {
)
);
// Act
+ // forge-lint: disable-next-line(erc20-unchecked-transfer)
cmtatContract.transfer(ADDRESS2, amount);
}
diff --git a/test/RuleWhitelist/CMTATIntegrationWhitelistWrapper.t.sol b/test/RuleWhitelist/CMTATIntegrationWhitelistWrapper.t.sol
index 33226ae..cfd27a1 100644
--- a/test/RuleWhitelist/CMTATIntegrationWhitelistWrapper.t.sol
+++ b/test/RuleWhitelist/CMTATIntegrationWhitelistWrapper.t.sol
@@ -16,7 +16,7 @@ contract CMTATIntegrationWhitelistWrapper is Test, HelperContract {
uint256 constant ADDRESS1_BALANCE_INIT = 31;
uint256 constant ADDRESS2_BALANCE_INIT = 32;
uint256 constant ADDRESS3_BALANCE_INIT = 33;
-
+
RuleWhitelist ruleWhitelist2;
RuleWhitelist ruleWhitelist3;
RuleWhitelistWrapper ruleWhitelistWrapper;
@@ -79,6 +79,7 @@ contract CMTATIntegrationWhitelistWrapper is Test, HelperContract {
)
);
// Act
+ // forge-lint: disable-next-line(erc20-unchecked-transfer)
cmtatContract.transfer(ADDRESS2, 21);
}
@@ -100,6 +101,7 @@ contract CMTATIntegrationWhitelistWrapper is Test, HelperContract {
)
);
// Act
+ // forge-lint: disable-next-line(erc20-unchecked-transfer)
cmtatContract.transfer(ADDRESS2, amount);
}
@@ -121,6 +123,7 @@ contract CMTATIntegrationWhitelistWrapper is Test, HelperContract {
)
);
// Act
+ // forge-lint: disable-next-line(erc20-unchecked-transfer)
cmtatContract.transfer(ADDRESS2, amount);
}
diff --git a/test/RuleWhitelist/Ownable/RuleWhitelistOwnable2Step.t.sol b/test/RuleWhitelist/Ownable/RuleWhitelistOwnable2Step.t.sol
index 117d8d8..713e3e6 100644
--- a/test/RuleWhitelist/Ownable/RuleWhitelistOwnable2Step.t.sol
+++ b/test/RuleWhitelist/Ownable/RuleWhitelistOwnable2Step.t.sol
@@ -2,8 +2,9 @@
pragma solidity ^0.8.20;
import {Ownable2StepTestBase, IOwnable2StepLike} from "../../utils/Ownable2StepTestBase.sol";
-import {RuleWhitelistOwnable2Step as RuleWhitelistOwnable2StepContract} from
- "src/rules/validation/deployment/RuleWhitelistOwnable2Step.sol";
+import {
+ RuleWhitelistOwnable2Step as RuleWhitelistOwnable2StepContract
+} from "src/rules/validation/deployment/RuleWhitelistOwnable2Step.sol";
contract RuleWhitelistOwnable2StepTest is Ownable2StepTestBase {
function _deployOwnable2Step() internal override returns (IOwnable2StepLike, address) {
diff --git a/test/RuleWhitelist/RuleEngineIntegration.t.sol b/test/RuleWhitelist/RuleEngineIntegration.t.sol
index b9a5445..b88bd76 100644
--- a/test/RuleWhitelist/RuleEngineIntegration.t.sol
+++ b/test/RuleWhitelist/RuleEngineIntegration.t.sol
@@ -24,9 +24,7 @@ contract RuleEngineIntegration is Test, HelperContract {
bytes32 rulesManagerRole = ruleEngineMock.RULES_MANAGEMENT_ROLE();
// Non-authorized account cannot add a rule.
- vm.expectRevert(
- abi.encodeWithSelector(AccessControlUnauthorizedAccount.selector, ATTACKER, rulesManagerRole)
- );
+ vm.expectRevert(abi.encodeWithSelector(AccessControlUnauthorizedAccount.selector, ATTACKER, rulesManagerRole));
vm.prank(ATTACKER);
ruleEngineMock.addRule(ruleWhitelist);
diff --git a/test/RuleWhitelist/RuleWhitelist.t.sol b/test/RuleWhitelist/RuleWhitelist.t.sol
index 7ac30a0..a33f457 100644
--- a/test/RuleWhitelist/RuleWhitelist.t.sol
+++ b/test/RuleWhitelist/RuleWhitelist.t.sol
@@ -132,7 +132,6 @@ contract RuleWhitelistTest is Test, HelperContract {
// Assert
assertEq(resString, TEXT_ADDRESS_SPENDER_NOT_WHITELISTED);
-
// Act
resString = ruleWhitelist.messageForTransferRestriction(CODE_NONEXISTENT);
// Assert
@@ -309,7 +308,6 @@ contract RuleWhitelistTest is Test, HelperContract {
// Assert
assertEq(resBool, false);
-
vm.prank(ADDRESS1);
vm.expectRevert(
abi.encodeWithSelector(
diff --git a/test/RuleWhitelist/WhitelistWrapper.t.sol b/test/RuleWhitelist/WhitelistWrapper.t.sol
index cfc1f4a..430b649 100644
--- a/test/RuleWhitelist/WhitelistWrapper.t.sol
+++ b/test/RuleWhitelist/WhitelistWrapper.t.sol
@@ -6,20 +6,11 @@ import {HelperContract} from "../HelperContract.sol";
import {AccessControlModuleStandalone} from "../../src/modules/AccessControlModuleStandalone.sol";
import {RuleWhitelist} from "src/rules/validation/deployment/RuleWhitelist.sol";
import {RuleWhitelistWrapper} from "src/rules/validation/deployment/RuleWhitelistWrapper.sol";
+import {RuleWhitelistWrapperHarnessInternal} from "src/mocks/harness/RuleWhitelistWrapperHarnessInternal.sol";
/**
* @title Integration test with the CMTAT
*/
-contract RuleWhitelistWrapperHarnessInternal is RuleWhitelistWrapper {
- constructor(address admin, address forwarderIrrevocable, bool checkSpender_)
- RuleWhitelistWrapper(admin, forwarderIrrevocable, checkSpender_)
- {}
-
- function exposedTransferredSpenderInternal(address spender, address from, address to, uint256 value) external view {
- _transferred(spender, from, to, value);
- }
-}
-
contract CMTATIntegrationWhitelistWrapper is Test, HelperContract {
uint256 constant ADDRESS1_BALANCE_INIT = 31;
uint256 constant ADDRESS2_BALANCE_INIT = 32;
@@ -76,8 +67,7 @@ contract CMTATIntegrationWhitelistWrapper is Test, HelperContract {
}
function testWrapperWithZeroRulesRejectsTransfers() public {
- RuleWhitelistWrapper emptyWrapper =
- new RuleWhitelistWrapper(WHITELIST_OPERATOR_ADDRESS, ZERO_ADDRESS, true);
+ RuleWhitelistWrapper emptyWrapper = new RuleWhitelistWrapper(WHITELIST_OPERATOR_ADDRESS, ZERO_ADDRESS, true);
resUint8 = emptyWrapper.detectTransferRestriction(ADDRESS1, ADDRESS2, 20);
assertEq(resUint8, CODE_ADDRESS_FROM_NOT_WHITELISTED);
@@ -101,7 +91,6 @@ contract CMTATIntegrationWhitelistWrapper is Test, HelperContract {
// Assert
assertEq(resBool, false);
-
vm.prank(ADDRESS1);
vm.expectRevert(
abi.encodeWithSelector(
@@ -144,7 +133,6 @@ contract CMTATIntegrationWhitelistWrapper is Test, HelperContract {
// Assert
assertEq(resUint8, CODE_ADDRESS_TO_NOT_WHITELISTED);
-
vm.prank(ADDRESS1);
vm.expectRevert(
abi.encodeWithSelector(
@@ -171,7 +159,6 @@ contract CMTATIntegrationWhitelistWrapper is Test, HelperContract {
)
);
ruleWhitelistWrapper.transferred(ADDRESS1, ADDRESS2, 0, 20);
-
}
function testDetectTransferRestrictionWithSpender() public {
@@ -348,8 +335,7 @@ contract CMTATIntegrationWhitelistWrapper is Test, HelperContract {
}
function testIsVerifiedWithNoChildRules() public {
- RuleWhitelistWrapper emptyWrapper =
- new RuleWhitelistWrapper(WHITELIST_OPERATOR_ADDRESS, ZERO_ADDRESS, true);
+ RuleWhitelistWrapper emptyWrapper = new RuleWhitelistWrapper(WHITELIST_OPERATOR_ADDRESS, ZERO_ADDRESS, true);
assertFalse(emptyWrapper.isVerified(ADDRESS1));
}
diff --git a/test/TransferContext/TransferContext.t.sol b/test/TransferContext/TransferContext.t.sol
index e05510b..203eb4e 100644
--- a/test/TransferContext/TransferContext.t.sol
+++ b/test/TransferContext/TransferContext.t.sol
@@ -5,7 +5,7 @@ import {Test} from "forge-std/Test.sol";
import {HelperContract} from "../HelperContract.sol";
import {RuleWhitelist} from "src/rules/validation/deployment/RuleWhitelist.sol";
import {RuleConditionalTransferLight} from "src/rules/operation/RuleConditionalTransferLight.sol";
-import {MockERC20WithTransferContext} from "../utils/MockERC20WithTransferContext.sol";
+import {MockERC20WithTransferContext} from "src/mocks/MockERC20WithTransferContext.sol";
contract TransferContextTest is Test, HelperContract {
MockERC20WithTransferContext private token;
diff --git a/test/TransferContext/TransferContextMocks.t.sol b/test/TransferContext/TransferContextMocks.t.sol
new file mode 100644
index 0000000..7a6ba96
--- /dev/null
+++ b/test/TransferContext/TransferContextMocks.t.sol
@@ -0,0 +1,128 @@
+// SPDX-License-Identifier: MPL-2.0
+pragma solidity ^0.8.20;
+
+import {Test} from "forge-std/Test.sol";
+import {HelperContract} from "../HelperContract.sol";
+import {MockERC20WithTransferContext} from "src/mocks/MockERC20WithTransferContext.sol";
+import {MockERC721WithTransferContext} from "src/mocks/MockERC721WithTransferContext.sol";
+import {RuleWhitelist} from "src/rules/validation/deployment/RuleWhitelist.sol";
+import {RuleSpenderWhitelist} from "src/rules/validation/deployment/RuleSpenderWhitelist.sol";
+
+contract TransferContextMocksTest is Test, HelperContract {
+ MockERC20WithTransferContext private erc20;
+ MockERC721WithTransferContext private erc721;
+
+ function setUp() public {
+ erc20 = new MockERC20WithTransferContext("Mock20", "M20");
+ erc721 = new MockERC721WithTransferContext("Mock721", "M721");
+ }
+
+ function _deployWhitelistRule() internal returns (RuleWhitelist) {
+ vm.prank(DEFAULT_ADMIN_ADDRESS);
+ RuleWhitelist rule = new RuleWhitelist(DEFAULT_ADMIN_ADDRESS, ZERO_ADDRESS, false);
+ vm.startPrank(DEFAULT_ADMIN_ADDRESS);
+ rule.addAddress(ADDRESS1);
+ rule.addAddress(ADDRESS2);
+ vm.stopPrank();
+ return rule;
+ }
+
+ function _deploySpenderWhitelistRule() internal returns (RuleSpenderWhitelist) {
+ vm.prank(DEFAULT_ADMIN_ADDRESS);
+ return new RuleSpenderWhitelist(DEFAULT_ADMIN_ADDRESS, ZERO_ADDRESS);
+ }
+
+ function testERC20TransferWithContextWhitelist() public {
+ RuleWhitelist rule = _deployWhitelistRule();
+ erc20.setRule(address(rule));
+ erc20.mint(ADDRESS1, 100);
+
+ vm.prank(ADDRESS1);
+ assertTrue(erc20.transfer(ADDRESS2, 10));
+
+ assertEq(erc20.balanceOf(ADDRESS1), 90);
+ assertEq(erc20.balanceOf(ADDRESS2), 10);
+ }
+
+ function testERC20TransferFromOwnerPathNotTreatedAsSpender() public {
+ RuleSpenderWhitelist rule = _deploySpenderWhitelistRule();
+ erc20.setRule(address(rule));
+ erc20.mint(ADDRESS1, 100);
+
+ vm.prank(ADDRESS1);
+ erc20.approve(ADDRESS1, 10);
+
+ vm.prank(ADDRESS1);
+ assertTrue(erc20.transferFrom(ADDRESS1, ADDRESS2, 10));
+
+ assertEq(erc20.balanceOf(ADDRESS1), 90);
+ assertEq(erc20.balanceOf(ADDRESS2), 10);
+ }
+
+ function testERC20TransferFromRequiresSpenderWhitelist() public {
+ RuleSpenderWhitelist rule = _deploySpenderWhitelistRule();
+ erc20.setRule(address(rule));
+ erc20.mint(ADDRESS1, 100);
+
+ vm.prank(ADDRESS1);
+ erc20.approve(ADDRESS3, 20);
+
+ vm.expectRevert();
+ vm.prank(ADDRESS3);
+ // forge-lint: disable-next-line(erc20-unchecked-transfer)
+ erc20.transferFrom(ADDRESS1, ADDRESS2, 10);
+
+ vm.prank(DEFAULT_ADMIN_ADDRESS);
+ rule.addAddress(ADDRESS3);
+
+ vm.prank(ADDRESS3);
+ assertTrue(erc20.transferFrom(ADDRESS1, ADDRESS2, 10));
+
+ assertEq(erc20.balanceOf(ADDRESS1), 90);
+ assertEq(erc20.balanceOf(ADDRESS2), 10);
+ }
+
+ function testERC721TransferWithContextWhitelist() public {
+ RuleWhitelist rule = _deployWhitelistRule();
+ erc721.setRule(address(rule));
+ erc721.mint(ADDRESS1, 1);
+
+ vm.prank(ADDRESS1);
+ erc721.transferFrom(ADDRESS1, ADDRESS2, 1);
+
+ assertEq(erc721.ownerOf(1), ADDRESS2);
+ assertEq(erc721.balanceOf(ADDRESS1), 0);
+ assertEq(erc721.balanceOf(ADDRESS2), 1);
+ }
+
+ function testERC721TransferFromOwnerPathNotTreatedAsSpender() public {
+ RuleSpenderWhitelist rule = _deploySpenderWhitelistRule();
+ erc721.setRule(address(rule));
+ erc721.mint(ADDRESS1, 1);
+
+ vm.prank(ADDRESS1);
+ erc721.transferFrom(ADDRESS1, ADDRESS2, 1);
+ assertEq(erc721.ownerOf(1), ADDRESS2);
+ }
+
+ function testERC721TransferFromRequiresSpenderWhitelist() public {
+ RuleSpenderWhitelist rule = _deploySpenderWhitelistRule();
+ erc721.setRule(address(rule));
+ erc721.mint(ADDRESS1, 1);
+
+ vm.prank(ADDRESS1);
+ erc721.approve(ADDRESS3, 1);
+
+ vm.expectRevert();
+ vm.prank(ADDRESS3);
+ erc721.transferFrom(ADDRESS1, ADDRESS2, 1);
+
+ vm.prank(DEFAULT_ADMIN_ADDRESS);
+ rule.addAddress(ADDRESS3);
+
+ vm.prank(ADDRESS3);
+ erc721.transferFrom(ADDRESS1, ADDRESS2, 1);
+
+ assertEq(erc721.ownerOf(1), ADDRESS2);
+ }
+}
diff --git a/test/Version.t.sol b/test/Version.t.sol
index a34fd92..10e5b0e 100644
--- a/test/Version.t.sol
+++ b/test/Version.t.sol
@@ -26,7 +26,8 @@ contract VersionTest is Test, HelperContract {
}
function testVersionRuleSanctionsList() public {
- RuleSanctionsList rule = new RuleSanctionsList(DEFAULT_ADMIN_ADDRESS, ZERO_ADDRESS, ISanctionsList(ZERO_ADDRESS));
+ RuleSanctionsList rule =
+ new RuleSanctionsList(DEFAULT_ADMIN_ADDRESS, ZERO_ADDRESS, ISanctionsList(ZERO_ADDRESS));
assertEq(rule.version(), EXPECTED_VERSION);
}
diff --git a/test/utils/MockERC20WithTransferContext.sol b/test/utils/MockERC20WithTransferContext.sol
deleted file mode 100644
index e14094f..0000000
--- a/test/utils/MockERC20WithTransferContext.sol
+++ /dev/null
@@ -1,127 +0,0 @@
-// SPDX-License-Identifier: MPL-2.0
-pragma solidity ^0.8.20;
-
-import {ITransferContext} from "src/rules/interfaces/ITransferContext.sol";
-
-contract MockERC20WithTransferContext {
- string public name;
- string public symbol;
- uint8 public immutable decimals;
-
- mapping(address => uint256) public balanceOf;
- mapping(address => mapping(address => uint256)) public allowance;
-
- ITransferContext public rule;
-
- event Transfer(address indexed from, address indexed to, uint256 value);
- event Approval(address indexed owner, address indexed spender, uint256 value);
-
- constructor(string memory name_, string memory symbol_) {
- name = name_;
- symbol = symbol_;
- decimals = 18;
- }
-
- function setRule(address rule_) external {
- rule = ITransferContext(rule_);
- }
-
- function mint(address to, uint256 value) external {
- balanceOf[to] += value;
- emit Transfer(address(0), to, value);
- }
-
- function approve(address spender, uint256 value) external returns (bool) {
- allowance[msg.sender][spender] = value;
- emit Approval(msg.sender, spender, value);
- return true;
- }
-
- function transfer(address to, uint256 value) external returns (bool) {
- _transfer(msg.sender, to, value);
- _callRuleContext(msg.sender, to, value, address(0), true, 0);
- return true;
- }
-
- function transferFrom(address from, address to, uint256 value) external returns (bool) {
- uint256 allowed = allowance[from][msg.sender];
- require(allowed >= value, "ALLOWANCE");
- allowance[from][msg.sender] = allowed - value;
- _transfer(from, to, value);
- _callRuleContext(from, to, value, msg.sender, true, 0);
- return true;
- }
-
- function transferWithContext(address to, uint256 value, bool useFungibleContext, uint256 tokenId)
- external
- returns (bool)
- {
- _transfer(msg.sender, to, value);
- _callRuleContext(msg.sender, to, value, address(0), useFungibleContext, tokenId);
- return true;
- }
-
- function transferFromWithContext(
- address from,
- address to,
- uint256 value,
- bool useFungibleContext,
- uint256 tokenId
- ) external returns (bool) {
- uint256 allowed = allowance[from][msg.sender];
- require(allowed >= value, "ALLOWANCE");
- allowance[from][msg.sender] = allowed - value;
- _transfer(from, to, value);
- _callRuleContext(from, to, value, msg.sender, useFungibleContext, tokenId);
- return true;
- }
-
- function _transfer(address from, address to, uint256 value) internal {
- require(balanceOf[from] >= value, "BALANCE");
- balanceOf[from] -= value;
- balanceOf[to] += value;
- emit Transfer(from, to, value);
- }
-
- function _callRuleContext(
- address from,
- address to,
- uint256 value,
- address sender,
- bool useFungibleContext,
- uint256 tokenId
- ) internal {
- if (address(rule) == address(0)) {
- return;
- }
-
- if (useFungibleContext) {
- ITransferContext.FungibleTransferContext memory ctx =
- ITransferContext.FungibleTransferContext({
- selector: sender == address(0)
- ? bytes4(keccak256("transferred(address,address,uint256)"))
- : bytes4(keccak256("transferred(address,address,address,uint256)")),
- sender: sender,
- from: from,
- to: to,
- value: value,
- data: ""
- });
- rule.transferred(ctx);
- } else {
- ITransferContext.MultiTokenTransferContext memory ctx =
- ITransferContext.MultiTokenTransferContext({
- selector: sender == address(0)
- ? bytes4(keccak256("transferred(address,address,uint256)"))
- : bytes4(keccak256("transferred(address,address,address,uint256)")),
- sender: sender,
- from: from,
- to: to,
- value: value,
- tokenId: tokenId,
- data: ""
- });
- rule.transferred(ctx);
- }
- }
-}